@reticlehq/browser 2.13.1 → 2.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/actions/actions-dom.d.ts +0 -20
- package/dist/actions/actions-dom.js +0 -66
- package/dist/actions/actions-press.d.ts +10 -0
- package/dist/actions/actions-press.js +77 -0
- package/dist/actions/actions.d.ts +0 -89
- package/dist/actions/actions.js +24 -358
- package/dist/actions/appeared-text.d.ts +0 -20
- package/dist/actions/appeared-text.js +0 -36
- package/dist/actions/danger-context.d.ts +3 -0
- package/dist/actions/danger-context.js +39 -0
- package/dist/actions/scroll.d.ts +0 -9
- package/dist/actions/scroll.js +0 -7
- package/dist/actions/synthetic-input.d.ts +0 -7
- package/dist/actions/synthetic-input.js +0 -27
- package/dist/actions/value-input.d.ts +0 -30
- package/dist/actions/value-input.js +0 -33
- package/dist/commands/commands.d.ts +0 -2
- package/dist/commands/commands.js +0 -67
- package/dist/connect-options.d.ts +2 -96
- package/dist/dom/a11y.d.ts +0 -29
- package/dist/dom/a11y.js +1 -88
- package/dist/dom/auto-anchor.d.ts +0 -40
- package/dist/dom/auto-anchor.js +0 -33
- package/dist/dom/chart.d.ts +0 -61
- package/dist/dom/chart.js +0 -60
- package/dist/dom/desktop-capture.d.ts +0 -30
- package/dist/dom/desktop-capture.js +0 -72
- package/dist/dom/dom-ignore.d.ts +0 -30
- package/dist/dom/dom-ignore.js +0 -47
- package/dist/dom/occlusion.d.ts +0 -7
- package/dist/dom/occlusion.js +0 -7
- package/dist/dom/query.d.ts +0 -14
- package/dist/dom/query.js +48 -214
- package/dist/dom/realm.d.ts +0 -20
- package/dist/dom/realm.js +0 -28
- package/dist/dom/refs.d.ts +0 -76
- package/dist/dom/refs.js +2 -133
- package/dist/dom/shadow-registry.d.ts +0 -33
- package/dist/dom/shadow-registry.js +2 -72
- package/dist/dom/snapshot.d.ts +2 -43
- package/dist/dom/snapshot.js +26 -151
- package/dist/dom/source.d.ts +0 -44
- package/dist/dom/source.js +0 -45
- package/dist/dom/theme.d.ts +0 -37
- package/dist/dom/theme.js +2 -52
- package/dist/dom/virtualized.d.ts +0 -17
- package/dist/dom/virtualized.js +0 -27
- package/dist/edit-epoch.d.ts +0 -22
- package/dist/edit-epoch.js +0 -52
- package/dist/index.js +1 -23
- package/dist/observers/animation.d.ts +0 -1
- package/dist/observers/animation.js +0 -3
- package/dist/observers/blind-spots.d.ts +0 -26
- package/dist/observers/blind-spots.js +2 -61
- package/dist/observers/console.d.ts +1 -2
- package/dist/observers/console.js +41 -30
- package/dist/observers/context-open.d.ts +1 -11
- package/dist/observers/context-open.js +10 -14
- package/dist/observers/departure.d.ts +3 -0
- package/dist/observers/departure.js +52 -0
- package/dist/observers/dialogs.d.ts +2 -0
- package/dist/observers/dialogs.js +39 -0
- package/dist/observers/dom.js +0 -44
- package/dist/observers/download.d.ts +1 -2
- package/dist/observers/download.js +38 -55
- package/dist/observers/focus.d.ts +0 -6
- package/dist/observers/focus.js +0 -7
- package/dist/observers/frames.d.ts +0 -9
- package/dist/observers/frames.js +1 -28
- package/dist/observers/health.d.ts +0 -5
- package/dist/observers/health.js +1 -33
- package/dist/observers/install-all.d.ts +2 -0
- package/dist/observers/install-all.js +26 -27
- package/dist/observers/ipc.d.ts +0 -25
- package/dist/observers/ipc.js +0 -65
- package/dist/observers/navigation.d.ts +2 -0
- package/dist/observers/navigation.js +33 -0
- package/dist/observers/network-body.d.ts +5 -28
- package/dist/observers/network-body.js +11 -108
- package/dist/observers/network-redact.d.ts +1 -20
- package/dist/observers/network-redact.js +1 -80
- package/dist/observers/network-stream.d.ts +0 -21
- package/dist/observers/network-stream.js +1 -44
- package/dist/observers/network.d.ts +2 -26
- package/dist/observers/network.js +177 -294
- package/dist/observers/perf.d.ts +0 -10
- package/dist/observers/perf.js +0 -16
- package/dist/observers/route.d.ts +1 -2
- package/dist/observers/route.js +13 -19
- package/dist/observers/scroll.d.ts +0 -1
- package/dist/observers/scroll.js +0 -9
- package/dist/observers/sdk-failure.d.ts +1 -9
- package/dist/observers/sdk-failure.js +1 -30
- package/dist/observers/state.d.ts +1 -11
- package/dist/observers/state.js +13 -41
- package/dist/observers/storage.d.ts +0 -14
- package/dist/observers/storage.js +10 -34
- package/dist/observers/types.d.ts +0 -15
- package/dist/observers/types.js +0 -14
- package/dist/patching/capture-method.d.ts +0 -24
- package/dist/patching/capture-method.js +0 -26
- package/dist/presenter/overlay.d.ts +0 -1
- package/dist/presenter/overlay.js +0 -1
- package/dist/presenter/presenter-brand.d.ts +0 -19
- package/dist/presenter/presenter-brand.js +0 -21
- package/dist/presenter/presenter-config.d.ts +1 -105
- package/dist/presenter/presenter-config.js +2 -91
- package/dist/presenter/presenter-controls.d.ts +0 -29
- package/dist/presenter/presenter-controls.js +3 -131
- package/dist/presenter/presenter-dock-layout.d.ts +0 -3
- package/dist/presenter/presenter-dock-layout.js +0 -4
- package/dist/presenter/presenter-drag.d.ts +2 -24
- package/dist/presenter/presenter-drag.js +0 -26
- package/dist/presenter/presenter-effects.d.ts +0 -9
- package/dist/presenter/presenter-effects.js +0 -9
- package/dist/presenter/presenter-glow.d.ts +0 -21
- package/dist/presenter/presenter-glow.js +1 -27
- package/dist/presenter/presenter-heroicons-data.d.ts +0 -8
- package/dist/presenter/presenter-heroicons-data.js +0 -8
- package/dist/presenter/presenter-hud-chrome.d.ts +0 -10
- package/dist/presenter/presenter-hud-chrome.js +0 -10
- package/dist/presenter/presenter-icons.d.ts +0 -6
- package/dist/presenter/presenter-icons.js +0 -6
- package/dist/presenter/presenter-log.d.ts +0 -38
- package/dist/presenter/presenter-log.js +1 -45
- package/dist/presenter/presenter-report-copy.d.ts +5 -66
- package/dist/presenter/presenter-report-copy.js +5 -66
- package/dist/presenter/presenter-report-styles.d.ts +0 -6
- package/dist/presenter/presenter-report-styles.js +6 -6
- package/dist/presenter/presenter-report.d.ts +4 -7
- package/dist/presenter/presenter-report.js +18 -76
- package/dist/presenter/presenter-run-state.d.ts +0 -7
- package/dist/presenter/presenter-run-state.js +0 -5
- package/dist/presenter/presenter-settings-styles.d.ts +0 -1
- package/dist/presenter/presenter-settings-styles.js +0 -1
- package/dist/presenter/presenter-settings.d.ts +1 -23
- package/dist/presenter/presenter-settings.js +1 -31
- package/dist/presenter/presenter-shell-styles.js +2 -5
- package/dist/presenter/presenter-shell.d.ts +2 -18
- package/dist/presenter/presenter-shell.js +1 -73
- package/dist/presenter/presenter-styles.d.ts +0 -9
- package/dist/presenter/presenter-styles.js +0 -9
- package/dist/presenter/presenter-tally.d.ts +0 -5
- package/dist/presenter/presenter-tally.js +0 -4
- package/dist/presenter/presenter-test-helpers.d.ts +0 -2
- package/dist/presenter/presenter-test-helpers.js +0 -2
- package/dist/presenter/presenter-verbs.js +0 -7
- package/dist/presenter/presenter-workspace.d.ts +0 -4
- package/dist/presenter/presenter-workspace.js +1 -8
- package/dist/presenter/presenter.d.ts +0 -60
- package/dist/presenter/presenter.js +4 -118
- package/dist/recorder/recorder-styles.d.ts +0 -6
- package/dist/recorder/recorder-styles.js +0 -6
- package/dist/recorder/recorder.d.ts +0 -34
- package/dist/recorder/recorder.js +0 -49
- package/dist/registry/adapters.d.ts +0 -10
- package/dist/registry/adapters.js +0 -10
- package/dist/registry/auto-testids.d.ts +0 -19
- package/dist/registry/auto-testids.js +1 -21
- package/dist/registry/capabilities.d.ts +0 -31
- package/dist/registry/capabilities.js +1 -46
- package/dist/registry/commit-and-signal.d.ts +0 -6
- package/dist/registry/commit-and-signal.js +1 -7
- package/dist/registry/domains.d.ts +0 -8
- package/dist/registry/domains.js +0 -7
- package/dist/registry/emitter.d.ts +0 -14
- package/dist/registry/emitter.js +0 -10
- package/dist/registry/store-adapters.d.ts +0 -186
- package/dist/registry/store-adapters.js +0 -163
- package/dist/registry/stores.d.ts +0 -33
- package/dist/registry/stores.js +0 -59
- package/dist/reticle-presenter-helpers.d.ts +0 -13
- package/dist/reticle-presenter-helpers.js +0 -14
- package/dist/reticle.d.ts +1 -52
- package/dist/reticle.js +20 -145
- package/dist/review/annotator-styles.js +0 -7
- package/dist/review/annotator.d.ts +2 -13
- package/dist/review/annotator.js +0 -40
- package/dist/review/mark-anchor.d.ts +0 -11
- package/dist/review/mark-anchor.js +0 -8
- package/dist/security/serialization.d.ts +0 -20
- package/dist/security/serialization.js +1 -66
- package/dist/session-continuity.d.ts +0 -16
- package/dist/session-continuity.js +1 -20
- package/dist/timers/clock.d.ts +1 -14
- package/dist/timers/clock.js +59 -60
- package/dist/timers/native-console.js +0 -4
- package/dist/timers/native-timers.d.ts +0 -25
- package/dist/timers/native-timers.js +3 -33
- package/dist/transport/transport.d.ts +0 -51
- package/dist/transport/transport.js +3 -129
- package/dist/transport/unreachable-message.d.ts +0 -17
- package/dist/transport/unreachable-message.js +0 -17
- package/dist/util/captured-method.d.ts +0 -35
- package/dist/util/captured-method.js +0 -35
- package/package.json +2 -2
|
@@ -1,15 +1,6 @@
|
|
|
1
1
|
import { PresenterMode } from '@reticlehq/core';
|
|
2
2
|
import { nativeSetTimeout, nativeClearTimeout } from '../timers/native-timers.js';
|
|
3
3
|
import { GlowPhase, BorderMode, DATA_BUSY, BUSY_ON, BUSY_OFF, GLOW_ON, GLOW_OFF, DATA_ON, } from './presenter-config.js';
|
|
4
|
-
/**
|
|
5
|
-
* The glow / activity state machine - drives the border shimmer + synthetic-cursor visibility from
|
|
6
|
-
* agent-activity timing. Extracted from presenter.ts so the controller file stays under the size cap;
|
|
7
|
-
* behavior is byte-for-byte the same. It holds references to the same `#glow`/`#cursor` nodes the
|
|
8
|
-
* Presenter does (both call setAttribute on those elements - the Presenter owns the SESSION border via
|
|
9
|
-
* data-on; this owns the BUSY shimmer via data-busy). A burst flips the glow IN once, holds it (the
|
|
10
|
-
* slow reticle-pulse keeps breathing - no per-action restart/strobe), then fades it OUT once after a quiet
|
|
11
|
-
* window.
|
|
12
|
-
*/
|
|
13
4
|
export class GlowController {
|
|
14
5
|
#phase = GlowPhase.IDLE;
|
|
15
6
|
#lastActivityMs = 0;
|
|
@@ -29,38 +20,28 @@ export class GlowController {
|
|
|
29
20
|
this.#borderMode = deps.borderMode;
|
|
30
21
|
this.#setMode = deps.setMode;
|
|
31
22
|
}
|
|
32
|
-
/** Wire the glow + cursor elements after the Presenter mounts the DOM. */
|
|
33
23
|
setElements(glow, cursor) {
|
|
34
24
|
this.#glow = glow;
|
|
35
25
|
this.#cursor = cursor;
|
|
36
26
|
}
|
|
37
|
-
/** Current glow phase (test/diagnostic accessor). */
|
|
38
27
|
phase() {
|
|
39
28
|
return this.#phase;
|
|
40
29
|
}
|
|
41
|
-
/** Last activity timestamp - read by the Presenter's liveness heartbeat. */
|
|
42
30
|
lastActivityMs() {
|
|
43
31
|
return this.#lastActivityMs;
|
|
44
32
|
}
|
|
45
|
-
/** Set the activity baseline WITHOUT entering busy (sessionStart / revive). */
|
|
46
33
|
resetActivity(ms) {
|
|
47
34
|
this.#lastActivityMs = ms;
|
|
48
35
|
}
|
|
49
|
-
/**
|
|
50
|
-
* Record agent activity. Idempotent while busy - only the first activity from idle/fading flips the
|
|
51
|
-
* glow on (no strobe). `ms` lets log read the clock exactly once per row.
|
|
52
|
-
*/
|
|
53
36
|
markActivity(ms = this.#now()) {
|
|
54
37
|
this.#lastActivityMs = ms;
|
|
55
38
|
if (this.#phase === GlowPhase.IDLE || this.#phase === GlowPhase.FADING)
|
|
56
39
|
this.#enterBusy();
|
|
57
40
|
this.#armIdleCheck();
|
|
58
41
|
}
|
|
59
|
-
/** Re-arm the quiet-window idle check (kept for reticle.ts's finally block). */
|
|
60
42
|
scheduleIdle() {
|
|
61
43
|
this.#armIdleCheck();
|
|
62
44
|
}
|
|
63
|
-
/** Clear both timers (called from Presenter.destroy). */
|
|
64
45
|
teardown() {
|
|
65
46
|
if (this.#idleCheckTimer !== undefined)
|
|
66
47
|
nativeClearTimeout(this.#idleCheckTimer);
|
|
@@ -76,14 +57,11 @@ export class GlowController {
|
|
|
76
57
|
}
|
|
77
58
|
this.#phase = GlowPhase.BUSY;
|
|
78
59
|
if (this.#borderMode === BorderMode.SESSION) {
|
|
79
|
-
// Session mode: modulate only the shimmer; the base border (data-on) stays session-owned.
|
|
80
60
|
this.#glow?.setAttribute(DATA_BUSY, BUSY_ON);
|
|
81
61
|
}
|
|
82
62
|
else {
|
|
83
|
-
// back-compat: the busy machine owns the base border.
|
|
84
63
|
this.#glow?.setAttribute(DATA_ON, GLOW_ON);
|
|
85
64
|
}
|
|
86
|
-
// The HUD/log is session-owned (sessionStart/End), NOT toggled here - it stays put on idle.
|
|
87
65
|
this.#cursor?.setAttribute(DATA_ON, GLOW_ON);
|
|
88
66
|
}
|
|
89
67
|
#armIdleCheck() {
|
|
@@ -97,7 +75,6 @@ export class GlowController {
|
|
|
97
75
|
return;
|
|
98
76
|
const quietFor = this.#now() - this.#lastActivityMs;
|
|
99
77
|
if (quietFor < this.#idleAfterMs) {
|
|
100
|
-
// Activity landed during the wait; re-arm for only the remaining quiet time.
|
|
101
78
|
this.#idleCheckTimer = nativeSetTimeout(() => this.#checkIdle(), this.#idleAfterMs - quietFor);
|
|
102
79
|
return;
|
|
103
80
|
}
|
|
@@ -106,16 +83,13 @@ export class GlowController {
|
|
|
106
83
|
#beginFade() {
|
|
107
84
|
this.#phase = GlowPhase.FADING;
|
|
108
85
|
if (this.#borderMode === BorderMode.SESSION) {
|
|
109
|
-
// Session mode: relax the shimmer only; the base border stays on.
|
|
110
86
|
this.#glow?.setAttribute(DATA_BUSY, BUSY_OFF);
|
|
111
87
|
}
|
|
112
88
|
else {
|
|
113
|
-
// back-compat: fade the base border out.
|
|
114
89
|
this.#glow?.setAttribute(DATA_ON, GLOW_OFF);
|
|
115
90
|
}
|
|
116
|
-
// Do NOT hide the HUD/log on idle - it persists for the whole session (sessionStart/End).
|
|
117
91
|
this.#cursor?.setAttribute(DATA_ON, GLOW_OFF);
|
|
118
|
-
this.#setMode(PresenterMode.IDLE);
|
|
92
|
+
this.#setMode(PresenterMode.IDLE);
|
|
119
93
|
this.#fadeTimer = nativeSetTimeout(() => {
|
|
120
94
|
this.#fadeTimer = undefined;
|
|
121
95
|
if (this.#phase === GlowPhase.FADING)
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
/** Generated by scripts/embed-heroicons.mjs - do not edit by hand. */
|
|
2
|
-
/** Heroicons outline - MIT, https://heroicons.com */
|
|
3
1
|
declare const BODIES: {
|
|
4
2
|
view: string;
|
|
5
3
|
pointer: string;
|
|
@@ -21,14 +19,8 @@ declare const BODIES: {
|
|
|
21
19
|
'caret-right': string;
|
|
22
20
|
annotate: string;
|
|
23
21
|
};
|
|
24
|
-
/**
|
|
25
|
-
* No `as const` on the values: it would inline every icon's path data into the emitted `.d.ts` as a
|
|
26
|
-
* literal type, publishing the whole icon set twice for type information no caller can use. The KEYS
|
|
27
|
-
* are still literal, which is the part `HeroIconBodyKey` needs.
|
|
28
|
-
*/
|
|
29
22
|
export declare const HERO_ICON_BODIES: Record<keyof typeof BODIES, string>;
|
|
30
23
|
export type HeroIconBodyKey = keyof typeof BODIES;
|
|
31
|
-
/** Solid variants for toolbar toggles - shown when data-active="1". */
|
|
32
24
|
declare const SOLID_BODIES: {
|
|
33
25
|
chart: string;
|
|
34
26
|
annotate: string;
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
/** Generated by scripts/embed-heroicons.mjs - do not edit by hand. */
|
|
2
|
-
/** Heroicons outline - MIT, https://heroicons.com */
|
|
3
1
|
const BODIES = {
|
|
4
2
|
view: '<g><path d="M15 12a3 3 0 1 1-6 0a3 3 0 0 1 6 0"/><path d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7c-1.274 4.057-5.064 7-9.542 7s-8.268-2.943-9.542-7"/></g>',
|
|
5
3
|
pointer: '<path d="M15.042 21.672L13.684 16.6m0 0l-2.51 2.225l.569-9.47l5.227 7.917l-3.286-.672ZM12 2.25V4.5m5.834.166l-1.591 1.591M20.25 10.5H18M7.757 14.743l-1.59 1.59M6 10.5H3.75m4.007-4.243l-1.59-1.59"/>',
|
|
@@ -21,13 +19,7 @@ const BODIES = {
|
|
|
21
19
|
'caret-right': '<path d="m9 5l7 7l-7 7"/>',
|
|
22
20
|
annotate: '<path d="m16.862 4.487l1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L10.582 16.07a4.5 4.5 0 0 1-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 0 1 1.13-1.897l8.932-8.931Zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0 1 15.75 21H5.25A2.25 2.25 0 0 1 3 18.75V8.25A2.25 2.25 0 0 1 5.25 6H10"/>',
|
|
23
21
|
};
|
|
24
|
-
/**
|
|
25
|
-
* No `as const` on the values: it would inline every icon's path data into the emitted `.d.ts` as a
|
|
26
|
-
* literal type, publishing the whole icon set twice for type information no caller can use. The KEYS
|
|
27
|
-
* are still literal, which is the part `HeroIconBodyKey` needs.
|
|
28
|
-
*/
|
|
29
22
|
export const HERO_ICON_BODIES = BODIES;
|
|
30
|
-
/** Solid variants for toolbar toggles - shown when data-active="1". */
|
|
31
23
|
const SOLID_BODIES = {
|
|
32
24
|
chart: '<path fill="currentColor" d="M2 11a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1zm6-4a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v9a1 1 0 0 1-1 1H9a1 1 0 0 1-1-1zm6-3a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1z"/>',
|
|
33
25
|
annotate: '<path fill="currentColor" fill-rule="evenodd" d="m5.433 13.916l1.262-3.154a4 4 0 0 1 .885-1.343L14.5 2.5a2.121 2.121 0 1 1 3 3l-6.92 6.919c-.383.383-.84.684-1.343.885l-3.154 1.262a.5.5 0 0 1-.65-.65ZM2.5 5.75c0-.69.56-1.25 1.25-1.25H10A.75.75 0 0 0 10 3H3.75A2.75 2.75 0 0 0 1 5.75v10.5A2.75 2.75 0 0 0 3.75 19h10.5A2.75 2.75 0 0 0 17 16.25V10a.75.75 0 0 0-1.5 0v6.25c0 .69-.56 1.25-1.25 1.25H3.75c-.69 0-1.25-.56-1.25-1.25V5.75Z" clip-rule="evenodd"/>',
|
|
@@ -1,17 +1,7 @@
|
|
|
1
|
-
/** Shared polished-black surfaces used across HUD chrome panels. */
|
|
2
1
|
export declare const HUD_SURFACE_CLASS = "reticle-hud-surface";
|
|
3
|
-
/** Layered near-black base — no embedded image assets. */
|
|
4
2
|
export declare const HUD_SURFACE_FILL: string;
|
|
5
3
|
export declare const HUD_SURFACE_PAINT: string;
|
|
6
4
|
export declare const HUD_DROP_SHADOW: string;
|
|
7
5
|
export declare const HUD_CHROME_CSS: string;
|
|
8
|
-
/** Inset well for the activity log — sits inside the chat card. */
|
|
9
6
|
export declare const HUD_LOG_WELL_CLASS = "reticle-hud-log-well";
|
|
10
|
-
/**
|
|
11
|
-
* The activity feed sits ON the panel, not in a black box cut out of it.
|
|
12
|
-
*
|
|
13
|
-
* The inset well was a second surface inside a surface - two borders, two backgrounds - and it made
|
|
14
|
-
* the panel read as a container rather than as one card. It also grew and shrank with its content,
|
|
15
|
-
* so the panel resized on every row; the height is fixed now and the feed scrolls inside it.
|
|
16
|
-
*/
|
|
17
7
|
export declare const HUD_LOG_WELL_CSS: string;
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
/** Shared polished-black surfaces used across HUD chrome panels. */
|
|
2
1
|
export const HUD_SURFACE_CLASS = 'reticle-hud-surface';
|
|
3
|
-
/** Layered near-black base — no embedded image assets. */
|
|
4
2
|
export const HUD_SURFACE_FILL = `linear-gradient(165deg,#121218 0%,#09090c 42%,#000 100%)`;
|
|
5
3
|
export const HUD_SURFACE_PAINT = `background:${HUD_SURFACE_FILL};box-shadow:inset 0 1px 0 rgba(255,255,255,.09),0 0 0 1px rgba(255,255,255,.09);`;
|
|
6
4
|
export const HUD_DROP_SHADOW = '0 16px 40px rgba(0,0,0,.58),0 0 0 1px rgba(255,255,255,.08)';
|
|
@@ -18,15 +16,7 @@ export const HUD_CHROME_CSS = `
|
|
|
18
16
|
linear-gradient(180deg,rgba(255,255,255,.035) 0%,transparent 36%,rgba(0,0,0,.12) 100%);
|
|
19
17
|
}
|
|
20
18
|
.${HUD_SURFACE_CLASS} > *{position:relative;z-index:2;}`;
|
|
21
|
-
/** Inset well for the activity log — sits inside the chat card. */
|
|
22
19
|
export const HUD_LOG_WELL_CLASS = 'reticle-hud-log-well';
|
|
23
|
-
/**
|
|
24
|
-
* The activity feed sits ON the panel, not in a black box cut out of it.
|
|
25
|
-
*
|
|
26
|
-
* The inset well was a second surface inside a surface - two borders, two backgrounds - and it made
|
|
27
|
-
* the panel read as a container rather than as one card. It also grew and shrank with its content,
|
|
28
|
-
* so the panel resized on every row; the height is fixed now and the feed scrolls inside it.
|
|
29
|
-
*/
|
|
30
20
|
export const HUD_LOG_WELL_CSS = `
|
|
31
21
|
.${HUD_LOG_WELL_CLASS}{
|
|
32
22
|
/* A settled height, but still allowed to shrink: pinned with flex:none it pushed the composer
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { type HeroIconBodyKey, type HeroIconSolidBodyKey } from './presenter-heroicons-data.js';
|
|
2
|
-
/** Presenter icon keys used by the HUD. */
|
|
3
2
|
export declare const PresenterIcon: {
|
|
4
3
|
readonly VIEW: "view";
|
|
5
4
|
readonly POINTER: "pointer";
|
|
@@ -22,7 +21,6 @@ export declare const PresenterIcon: {
|
|
|
22
21
|
readonly ANNOTATE: "annotate";
|
|
23
22
|
};
|
|
24
23
|
export type PresenterIconName = (typeof PresenterIcon)[keyof typeof PresenterIcon];
|
|
25
|
-
/** Shared HUD icon sizes (px) - one knob for visual density. */
|
|
26
24
|
export declare const PRESENTER_ICON_SIZE: {
|
|
27
25
|
readonly CHIP: 11;
|
|
28
26
|
readonly LOG: 11;
|
|
@@ -34,11 +32,7 @@ export declare const PRESENTER_ICON_SIZE: {
|
|
|
34
32
|
readonly TOOLBAR: 18;
|
|
35
33
|
readonly FAB: 22;
|
|
36
34
|
};
|
|
37
|
-
/** Create an inline Heroicons outline SVG (24px grid, currentColor stroke). */
|
|
38
35
|
export declare function hiIcon(name: HeroIconBodyKey, sizePx?: number): HTMLSpanElement;
|
|
39
|
-
/** Replace a parent's children with a Heroicon. */
|
|
40
36
|
export declare function setHiIcon(parent: HTMLElement, name: HeroIconBodyKey, sizePx?: number): void;
|
|
41
|
-
/** Inline SVG markup for static HUD templates - survives mount order and dep-cache staleness. */
|
|
42
37
|
export declare function hiIconHtml(name: HeroIconBodyKey, sizePx?: number): string;
|
|
43
|
-
/** Outline + solid pair for toolbar toggles - solid layer shows when the button is active. */
|
|
44
38
|
export declare function hiToggleIconHtml(name: HeroIconSolidBodyKey, sizePx?: number): string;
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { HERO_ICON_BODIES, HERO_ICON_SOLID_BODIES, } from './presenter-heroicons-data.js';
|
|
2
|
-
/** Presenter icon keys used by the HUD. */
|
|
3
2
|
export const PresenterIcon = {
|
|
4
3
|
VIEW: 'view',
|
|
5
4
|
POINTER: 'pointer',
|
|
@@ -21,7 +20,6 @@ export const PresenterIcon = {
|
|
|
21
20
|
CARET_RIGHT: 'caret-right',
|
|
22
21
|
ANNOTATE: 'annotate',
|
|
23
22
|
};
|
|
24
|
-
/** Shared HUD icon sizes (px) - one knob for visual density. */
|
|
25
23
|
export const PRESENTER_ICON_SIZE = {
|
|
26
24
|
CHIP: 11,
|
|
27
25
|
LOG: 11,
|
|
@@ -61,7 +59,6 @@ function buildSvg(name, sizePx) {
|
|
|
61
59
|
svgCache.set(cacheKey, svg);
|
|
62
60
|
return document.importNode(svg, true);
|
|
63
61
|
}
|
|
64
|
-
/** Create an inline Heroicons outline SVG (24px grid, currentColor stroke). */
|
|
65
62
|
export function hiIcon(name, sizePx = 16) {
|
|
66
63
|
const wrap = document.createElement('span');
|
|
67
64
|
wrap.className = 'reticle-hi-icon';
|
|
@@ -71,11 +68,9 @@ export function hiIcon(name, sizePx = 16) {
|
|
|
71
68
|
wrap.appendChild(buildSvg(name, sizePx));
|
|
72
69
|
return wrap;
|
|
73
70
|
}
|
|
74
|
-
/** Replace a parent's children with a Heroicon. */
|
|
75
71
|
export function setHiIcon(parent, name, sizePx = 16) {
|
|
76
72
|
parent.replaceChildren(hiIcon(name, sizePx));
|
|
77
73
|
}
|
|
78
|
-
/** Inline SVG markup for static HUD templates - survives mount order and dep-cache staleness. */
|
|
79
74
|
export function hiIconHtml(name, sizePx = 16) {
|
|
80
75
|
const body = HERO_ICON_BODIES[name];
|
|
81
76
|
if (body === undefined) {
|
|
@@ -83,7 +78,6 @@ export function hiIconHtml(name, sizePx = 16) {
|
|
|
83
78
|
}
|
|
84
79
|
return `<span class="reticle-hi-icon" aria-hidden="true" style="width:${String(sizePx)}px;height:${String(sizePx)}px"><svg xmlns="${SVG_NS}" viewBox="${HERO_VIEWBOX}" width="${String(sizePx)}" height="${String(sizePx)}" fill="none">${body}</svg></span>`;
|
|
85
80
|
}
|
|
86
|
-
/** Outline + solid pair for toolbar toggles - solid layer shows when the button is active. */
|
|
87
81
|
export function hiToggleIconHtml(name, sizePx = 16) {
|
|
88
82
|
const outline = HERO_ICON_BODIES[name];
|
|
89
83
|
const solid = HERO_ICON_SOLID_BODIES[name];
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { PresenterMode } from '@reticlehq/core';
|
|
2
|
-
/** Activity-log entry kinds (presenter-only UI; never a wire string). */
|
|
3
2
|
export declare const LOG_KIND: {
|
|
4
3
|
readonly READ: "read";
|
|
5
4
|
readonly ACT: "act";
|
|
@@ -7,58 +6,21 @@ export declare const LOG_KIND: {
|
|
|
7
6
|
readonly HUMAN: "human";
|
|
8
7
|
};
|
|
9
8
|
export type LogKind = (typeof LOG_KIND)[keyof typeof LOG_KIND];
|
|
10
|
-
/** Act-row outcome glyph keys (presenter-only UI). */
|
|
11
9
|
export declare const LOG_RESULT: {
|
|
12
10
|
readonly PASS: "pass";
|
|
13
11
|
readonly FAIL: "fail";
|
|
14
12
|
};
|
|
15
13
|
export type LogResult = (typeof LOG_RESULT)[keyof typeof LOG_RESULT];
|
|
16
|
-
/** HUD chip copy keyed by presenter mode (UI text, browser-local - not a wire string). */
|
|
17
14
|
export declare const CHIP_LABEL: Record<PresenterMode, string>;
|
|
18
15
|
export declare const DATA_RETICLE_LOG = "data-reticle-log";
|
|
19
|
-
/**
|
|
20
|
-
* The attribute on ONE log line's timestamp. Deliberately not `data-reticle-log-ts`: that name is
|
|
21
|
-
* the overlay-level SETTING (show timestamps y/n) and the overlay root carries it, so a bare
|
|
22
|
-
* `[data-reticle-log-ts]{opacity:.85}` here matched the overlay itself and made the entire HUD -
|
|
23
|
-
* chat panel included - 85% transparent, with the page legible straight through it.
|
|
24
|
-
*/
|
|
25
16
|
export declare const LOG_TIME_ATTR = "data-reticle-log-time";
|
|
26
|
-
/** CSS for the log feed (injected with the rest of the presenter stylesheet; vars inherit from the card). */
|
|
27
17
|
export declare const LOG_CSS: string;
|
|
28
|
-
/**
|
|
29
|
-
* Pin the feed to its newest row.
|
|
30
|
-
*
|
|
31
|
-
* Called on append AND when the chat is opened, because a hidden panel has no layout: rows added
|
|
32
|
-
* while it was minimised could not scroll it, so opening it showed the OLDEST row and the latest
|
|
33
|
-
* activity - the reason to open it - was somewhere below the fold.
|
|
34
|
-
*/
|
|
35
18
|
export declare function scrollLogToLatest(container: HTMLElement): void;
|
|
36
|
-
/**
|
|
37
|
-
* Pin the feed to its newest row once the panel has actually laid out.
|
|
38
|
-
*
|
|
39
|
-
* A single frame is not enough on open: the rows carry `content-visibility:auto`, so their real
|
|
40
|
-
* heights arrive after the first paint and `scrollHeight` keeps growing under a scroll that has
|
|
41
|
-
* already happened - the feed landed a third of the way down instead of at the end. Two frames
|
|
42
|
-
* plus one settle pass costs nothing and lands on the last row.
|
|
43
|
-
*/
|
|
44
19
|
export declare function settleLogAtLatest(container: HTMLElement): void;
|
|
45
|
-
/** Handle returned from logRow/Presenter.log so the caller can stamp the outcome glyph later. */
|
|
46
20
|
export interface LogHandle {
|
|
47
21
|
result(r: LogResult): void;
|
|
48
22
|
}
|
|
49
|
-
/** Clamp a logMax option to a sane positive integer, falling back to the default. */
|
|
50
23
|
export declare function clampLogMax(n: number | undefined): number;
|
|
51
|
-
/**
|
|
52
|
-
* Pure, human-readable duration ("3s", "47s", "2m", "1h 4m") - no clock read, so it stays
|
|
53
|
-
* deterministic in tests. Used for both the per-row timestamp (time since session start) and the
|
|
54
|
-
* live "idle · {duration} since last action" heartbeat. Sub-second reads as "0s".
|
|
55
|
-
*/
|
|
56
24
|
export declare function humanDuration(ms: number): string;
|
|
57
|
-
/** Per-row timestamp: time since the session's first row, human-readable (e.g. "2m", not "+132.4s"). */
|
|
58
25
|
export declare function formatElapsed(ms: number): string;
|
|
59
|
-
/**
|
|
60
|
-
* Build a log row from text (already trimmed) + a +elapsed timestamp, append it to the container,
|
|
61
|
-
* prune to logMax, auto-scroll to newest, and return a handle to stamp the outcome glyph later.
|
|
62
|
-
* Uses createElement/textContent (never innerHTML) so arbitrary narration text can't inject markup.
|
|
63
|
-
*/
|
|
64
26
|
export declare function appendLogRow(container: HTMLElement, kind: LogKind, text: string, ts: string, logMax: number): LogHandle;
|
|
@@ -1,33 +1,24 @@
|
|
|
1
1
|
import { PresenterMode } from '@reticlehq/core';
|
|
2
2
|
import { nativeSetTimeout } from '../timers/native-timers.js';
|
|
3
3
|
import { PresenterIcon, PRESENTER_ICON_SIZE, hiIcon, } from './presenter-icons.js';
|
|
4
|
-
// Activity-log UI for the presenter HUD: a persistent, timestamped, scrollable transcript of
|
|
5
|
-
// every read/act/narration. All strings here are presenter-only UI (chips, glyphs, attrs) - they
|
|
6
|
-
// never cross the browser↔bridge↔agent wire, so they stay as named consts (not protocol consts).
|
|
7
|
-
// All nodes carry data-reticle-* attrs so they're excluded from snapshots (see dom-ignore.ts).
|
|
8
|
-
/** Default cap on accumulated activity-log rows (bounds DOM). Presenter-local UI tunable. */
|
|
9
4
|
const DEFAULT_LOG_MAX = 50;
|
|
10
|
-
/** Activity-log entry kinds (presenter-only UI; never a wire string). */
|
|
11
5
|
export const LOG_KIND = {
|
|
12
6
|
READ: 'read',
|
|
13
7
|
ACT: 'act',
|
|
14
8
|
NARRATION: 'narration',
|
|
15
9
|
HUMAN: 'human',
|
|
16
10
|
};
|
|
17
|
-
/** Act-row outcome glyph keys (presenter-only UI). */
|
|
18
11
|
export const LOG_RESULT = { PASS: 'pass', FAIL: 'fail' };
|
|
19
12
|
const LOG_CHIP = { read: 'READ', act: 'ACT', narration: '', human: '' };
|
|
20
13
|
const LOG_CHIP_ICON = {
|
|
21
14
|
read: PresenterIcon.VIEW,
|
|
22
15
|
act: PresenterIcon.POINTER,
|
|
23
16
|
};
|
|
24
|
-
/** HUD chip copy keyed by presenter mode (UI text, browser-local - not a wire string). */
|
|
25
17
|
export const CHIP_LABEL = {
|
|
26
18
|
[PresenterMode.IDLE]: '',
|
|
27
19
|
[PresenterMode.READING]: 'READING',
|
|
28
20
|
[PresenterMode.ACTING]: 'ACTING',
|
|
29
21
|
};
|
|
30
|
-
/** Map a log kind to the data-mode that styles its chip (narration/human show no chip). */
|
|
31
22
|
const LOG_CHIP_MODE = {
|
|
32
23
|
read: PresenterMode.READING,
|
|
33
24
|
act: PresenterMode.ACTING,
|
|
@@ -38,21 +29,13 @@ const RESULT_GLYPH = { pass: '', fail: 'Fail' };
|
|
|
38
29
|
const RESULT_CLASS = { pass: 'reticle-pass', fail: 'reticle-fail' };
|
|
39
30
|
export const DATA_RETICLE_LOG = 'data-reticle-log';
|
|
40
31
|
const DATA_RETICLE_LOG_ROW = 'data-reticle-log-row';
|
|
41
|
-
/**
|
|
42
|
-
* The attribute on ONE log line's timestamp. Deliberately not `data-reticle-log-ts`: that name is
|
|
43
|
-
* the overlay-level SETTING (show timestamps y/n) and the overlay root carries it, so a bare
|
|
44
|
-
* `[data-reticle-log-ts]{opacity:.85}` here matched the overlay itself and made the entire HUD -
|
|
45
|
-
* chat panel included - 85% transparent, with the page legible straight through it.
|
|
46
|
-
*/
|
|
47
32
|
export const LOG_TIME_ATTR = 'data-reticle-log-time';
|
|
48
33
|
const DATA_KIND = 'data-kind';
|
|
49
34
|
const LOG_TEXT_CLASS = 'reticle-log-text';
|
|
50
35
|
const LOG_RES_CLASS = 'reticle-res';
|
|
51
36
|
const LOG_CHIP_CLASS = 'reticle-chip';
|
|
52
37
|
const LOG_EMPTY_HINT = 'Agent activity will appear here';
|
|
53
|
-
/** How long to keep re-pinning the feed after the panel opens, while rows render their real size. */
|
|
54
38
|
const LOG_SETTLE_MS = 160;
|
|
55
|
-
/** CSS for the log feed (injected with the rest of the presenter stylesheet; vars inherit from the card). */
|
|
56
39
|
export const LOG_CSS = `
|
|
57
40
|
[data-reticle-log]{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;pointer-events:auto;touch-action:pan-y;
|
|
58
41
|
display:flex;flex-direction:column;
|
|
@@ -92,24 +75,9 @@ export const LOG_CSS = `
|
|
|
92
75
|
border-radius:16px 16px 4px 16px;box-shadow:inset 0 1px 0 rgba(255,255,255,.08);}
|
|
93
76
|
[data-reticle-log-row][data-kind="human"] .reticle-log-text{color:var(--reticle-fg);font-size:12px;line-height:1.45;}
|
|
94
77
|
`;
|
|
95
|
-
/**
|
|
96
|
-
* Pin the feed to its newest row.
|
|
97
|
-
*
|
|
98
|
-
* Called on append AND when the chat is opened, because a hidden panel has no layout: rows added
|
|
99
|
-
* while it was minimised could not scroll it, so opening it showed the OLDEST row and the latest
|
|
100
|
-
* activity - the reason to open it - was somewhere below the fold.
|
|
101
|
-
*/
|
|
102
78
|
export function scrollLogToLatest(container) {
|
|
103
79
|
container.scrollTop = container.scrollHeight;
|
|
104
80
|
}
|
|
105
|
-
/**
|
|
106
|
-
* Pin the feed to its newest row once the panel has actually laid out.
|
|
107
|
-
*
|
|
108
|
-
* A single frame is not enough on open: the rows carry `content-visibility:auto`, so their real
|
|
109
|
-
* heights arrive after the first paint and `scrollHeight` keeps growing under a scroll that has
|
|
110
|
-
* already happened - the feed landed a third of the way down instead of at the end. Two frames
|
|
111
|
-
* plus one settle pass costs nothing and lands on the last row.
|
|
112
|
-
*/
|
|
113
81
|
export function settleLogAtLatest(container) {
|
|
114
82
|
scrollLogToLatest(container);
|
|
115
83
|
requestAnimationFrame(() => {
|
|
@@ -118,17 +86,11 @@ export function settleLogAtLatest(container) {
|
|
|
118
86
|
});
|
|
119
87
|
nativeSetTimeout(() => scrollLogToLatest(container), LOG_SETTLE_MS);
|
|
120
88
|
}
|
|
121
|
-
/** Clamp a logMax option to a sane positive integer, falling back to the default. */
|
|
122
89
|
export function clampLogMax(n) {
|
|
123
90
|
if (n === undefined || !Number.isFinite(n) || n <= 0)
|
|
124
91
|
return DEFAULT_LOG_MAX;
|
|
125
92
|
return Math.floor(n);
|
|
126
93
|
}
|
|
127
|
-
/**
|
|
128
|
-
* Pure, human-readable duration ("3s", "47s", "2m", "1h 4m") - no clock read, so it stays
|
|
129
|
-
* deterministic in tests. Used for both the per-row timestamp (time since session start) and the
|
|
130
|
-
* live "idle · {duration} since last action" heartbeat. Sub-second reads as "0s".
|
|
131
|
-
*/
|
|
132
94
|
export function humanDuration(ms) {
|
|
133
95
|
const s = Math.max(0, Math.floor(ms / 1000));
|
|
134
96
|
if (s < 60)
|
|
@@ -139,19 +101,13 @@ export function humanDuration(ms) {
|
|
|
139
101
|
const h = Math.floor(m / 60);
|
|
140
102
|
return 0 === m % 60 ? `${h}h` : `${h}h ${m % 60}m`;
|
|
141
103
|
}
|
|
142
|
-
/** Per-row timestamp: time since the session's first row, human-readable (e.g. "2m", not "+132.4s"). */
|
|
143
104
|
export function formatElapsed(ms) {
|
|
144
105
|
return humanDuration(ms);
|
|
145
106
|
}
|
|
146
|
-
/**
|
|
147
|
-
* Build a log row from text (already trimmed) + a +elapsed timestamp, append it to the container,
|
|
148
|
-
* prune to logMax, auto-scroll to newest, and return a handle to stamp the outcome glyph later.
|
|
149
|
-
* Uses createElement/textContent (never innerHTML) so arbitrary narration text can't inject markup.
|
|
150
|
-
*/
|
|
151
107
|
export function appendLogRow(container, kind, text, ts, logMax) {
|
|
152
108
|
const row = document.createElement('div');
|
|
153
109
|
row.setAttribute(DATA_RETICLE_LOG_ROW, '');
|
|
154
|
-
row.setAttribute(DATA_KIND, kind);
|
|
110
|
+
row.setAttribute(DATA_KIND, kind);
|
|
155
111
|
const tsEl = document.createElement('span');
|
|
156
112
|
tsEl.setAttribute(LOG_TIME_ATTR, '');
|
|
157
113
|
tsEl.textContent = ts;
|
|
@@ -1,49 +1,15 @@
|
|
|
1
1
|
import { type ImpactScope, type ImpactSnapshot } from '@reticlehq/core';
|
|
2
|
-
/**
|
|
3
|
-
* What the report SAYS, kept away from how it looks.
|
|
4
|
-
*
|
|
5
|
-
* The wording here is the product's only claim about its own worth, so it is written once, in one
|
|
6
|
-
* place, and tested. Two audiences, two registers:
|
|
7
|
-
*
|
|
8
|
-
* - The REPORT is private. It is the user's own data, so it can carry everything, estimates
|
|
9
|
-
* included, as long as each estimate shows what it is measured against.
|
|
10
|
-
* - The SHARE card is public, and the research on developer stat-cards is blunt about what happens
|
|
11
|
-
* to a public card that leads with vendor savings: estimated token/time savings are the most
|
|
12
|
-
* mocked class of number in AI tooling (JetBrains measured ~10% against a viral 65% claim), and
|
|
13
|
-
* percentiles without a denominator get called misleading. So the card leads with what the
|
|
14
|
-
* user's own setup CAUGHT, and publishes its unknowns - the credibility move, and the thing a
|
|
15
|
-
* scoreboard would never do.
|
|
16
|
-
*/
|
|
17
|
-
/** Reticle's own links, as they appear in the report footer. */
|
|
18
2
|
export declare const REPORT_LINKS: {
|
|
19
3
|
readonly DOCS: "https://docs.reticle.sh";
|
|
20
4
|
readonly SITE: "https://reticle.sh";
|
|
21
5
|
readonly GITHUB: "https://github.com/reticlehq/reticle";
|
|
22
6
|
readonly DISCORD: "https://discord.gg/BwAbzv9ZRz";
|
|
23
7
|
};
|
|
24
|
-
/**
|
|
25
|
-
* The X handle used for `via=` on a share.
|
|
26
|
-
*
|
|
27
|
-
* Empty until somebody who owns the account fills it in, and the share URL omits the parameter
|
|
28
|
-
* while it is - a guessed handle credits a stranger, and there is no way for code to know.
|
|
29
|
-
*/
|
|
30
8
|
export declare const SHARE_VIA_HANDLE = "";
|
|
31
9
|
export declare const REPORT_TEXT: {
|
|
32
10
|
readonly TITLE: "Impact";
|
|
33
11
|
readonly PROJECT: "This project";
|
|
34
12
|
readonly GLOBAL: "Everything on this machine";
|
|
35
|
-
/**
|
|
36
|
-
* What `counts.failed` actually is: a verdict whose declared consequence did not hold.
|
|
37
|
-
*
|
|
38
|
-
* It used to read "defects caught before you saw them", which overclaims in the one direction a
|
|
39
|
-
* verification tool must never overclaim. A failed verdict is not proof of a defect in the app —
|
|
40
|
-
* it is equally the shape of an assertion that was wrong. Measured in the field: an agent
|
|
41
|
-
* asserted a clean console on an app with ordinary dev-mode logging, the verdict went red, and
|
|
42
|
-
* the panel reported a defect nobody had found.
|
|
43
|
-
*
|
|
44
|
-
* The honest word is what Reticle DID: it refused to pass them. That is true of the assertion
|
|
45
|
-
* error and the real bug alike, and it still reads as the tool having done its job.
|
|
46
|
-
*/
|
|
47
13
|
readonly HERO_DEFECTS: "checks Reticle refused to pass";
|
|
48
14
|
readonly VERDICTS: "Verdicts";
|
|
49
15
|
readonly PASSED: "passed";
|
|
@@ -61,21 +27,14 @@ export declare const REPORT_TEXT: {
|
|
|
61
27
|
readonly ESTIMATE_TAG: "estimate";
|
|
62
28
|
readonly CHART: "Verdicts, last 30 days";
|
|
63
29
|
readonly DEFECTS: "What broke";
|
|
64
|
-
readonly DEFECTS_MORE: "Manage all of them on the dashboard";
|
|
65
|
-
|
|
66
|
-
* What an UNLINKED user is told, and the only place the product tells them.
|
|
67
|
-
*
|
|
68
|
-
* The dashboard link renders only when `dashboardUrl` exists, which means only once a repo is
|
|
69
|
-
* already linked — so the person most likely to want one, watching this record climb on their own
|
|
70
|
-
* machine, was never told it existed. The single mention anywhere else is a daemon log line.
|
|
71
|
-
*
|
|
72
|
-
* Stated as a FACT about where the record lives, not as a pitch. It sits at the foot of a panel
|
|
73
|
-
* somebody opened on purpose, so it informs rather than interrupts, and it appears only once
|
|
74
|
-
* there is a verdict worth keeping — an offer to preserve nothing is just an advert.
|
|
75
|
-
*/
|
|
30
|
+
readonly DEFECTS_MORE: "Manage all of them on the dashboard — triage, assign, and push to GitHub";
|
|
31
|
+
readonly DEFECT_LINK_TITLE: "Open on the dashboard to triage or push to GitHub";
|
|
76
32
|
readonly LOCAL_ONLY: "This record stops at this machine.";
|
|
77
33
|
readonly LOCAL_ONLY_ACTION: "reticle login";
|
|
78
34
|
readonly LOCAL_ONLY_TAIL: "keeps it, and lets a team see it.";
|
|
35
|
+
readonly UNLINKED: "Signed in, but this repo is not linked.";
|
|
36
|
+
readonly UNLINKED_ACTION: "reticle link";
|
|
37
|
+
readonly UNLINKED_TAIL: "sends this record to your workspace.";
|
|
79
38
|
readonly DEFECTS_NONE: "Nothing has failed a declared consequence yet.";
|
|
80
39
|
readonly EMPTY: "Nothing recorded yet. Drive the app once and this fills in.";
|
|
81
40
|
readonly SHARE: "Share";
|
|
@@ -83,30 +42,10 @@ export declare const REPORT_TEXT: {
|
|
|
83
42
|
readonly COPIED: "Copied";
|
|
84
43
|
readonly REFER: "Send to a friend";
|
|
85
44
|
};
|
|
86
|
-
/** "4.2k", "1.3M" - a number a person reads at a glance rather than counts digits in. */
|
|
87
45
|
export declare function compactNumber(n: number): string;
|
|
88
|
-
/** "2h 14m", "47m", "38s" - the same duration vocabulary the activity strip uses. */
|
|
89
46
|
export declare function compactDuration(ms: number): string;
|
|
90
|
-
/**
|
|
91
|
-
* The post itself.
|
|
92
|
-
*
|
|
93
|
-
* Leads with defects caught, then the verdict split INCLUDING unknowns, then the superlative. No
|
|
94
|
-
* estimated savings, no percentile, no leaderboard: those are the four things the evidence says get
|
|
95
|
-
* a dev-tool card mocked rather than shared.
|
|
96
|
-
*/
|
|
97
47
|
export declare function buildShareText(scope: ImpactScope, projectName?: string): string;
|
|
98
|
-
/** X share intent. `via` is omitted while no handle is configured. */
|
|
99
48
|
export declare function buildXShareUrl(text: string): string;
|
|
100
|
-
/**
|
|
101
|
-
* LinkedIn share.
|
|
102
|
-
*
|
|
103
|
-
* `share-offsite` takes a url and NOTHING else - the title/summary parameters were deprecated in
|
|
104
|
-
* 2018 and are ignored, so the caption has to reach the composer some other way. The report copies
|
|
105
|
-
* it to the clipboard before opening this, which is the only path that works without asking the
|
|
106
|
-
* user for posting permissions.
|
|
107
|
-
*/
|
|
108
49
|
export declare function buildLinkedInShareUrl(): string;
|
|
109
|
-
/** What a referral says: the tool, not the sender's numbers. */
|
|
110
50
|
export declare function buildReferralText(): string;
|
|
111
|
-
/** Narrow an unknown push payload to a snapshot. Invalid shapes are ignored, never rendered. */
|
|
112
51
|
export declare function parseImpactSnapshot(value: unknown): ImpactSnapshot | undefined;
|