pi-agent-flow 2.2.14 → 2.2.15
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/README.md +12 -0
- package/dist/batch/apply-patch.d.ts +2 -1
- package/dist/batch/apply-patch.d.ts.map +1 -1
- package/dist/batch/batch-bash.d.ts.map +1 -1
- package/dist/batch/batch-bash.js +9 -43
- package/dist/batch/batch-bash.js.map +1 -1
- package/dist/batch/constants.d.ts +9 -1
- package/dist/batch/constants.d.ts.map +1 -1
- package/dist/batch/constants.js +7 -0
- package/dist/batch/constants.js.map +1 -1
- package/dist/batch/execute.d.ts +1 -13
- package/dist/batch/execute.d.ts.map +1 -1
- package/dist/batch/execute.js +87 -28
- package/dist/batch/execute.js.map +1 -1
- package/dist/batch/index.d.ts.map +1 -1
- package/dist/batch/index.js +16 -14
- package/dist/batch/index.js.map +1 -1
- package/dist/batch/render.d.ts.map +1 -1
- package/dist/batch/render.js.map +1 -1
- package/dist/batch/summary.d.ts +0 -6
- package/dist/batch/summary.d.ts.map +1 -1
- package/dist/batch/summary.js +3 -3
- package/dist/batch/summary.js.map +1 -1
- package/dist/batch/symbols.d.ts.map +1 -1
- package/dist/batch/symbols.js +3 -1
- package/dist/batch/symbols.js.map +1 -1
- package/dist/batch/truncate-output.d.ts +31 -0
- package/dist/batch/truncate-output.d.ts.map +1 -0
- package/dist/batch/truncate-output.js +120 -0
- package/dist/batch/truncate-output.js.map +1 -0
- package/dist/config/config.d.ts +2 -1
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +10 -24
- package/dist/config/config.js.map +1 -1
- package/dist/config/models.d.ts.map +1 -1
- package/dist/config/models.js +7 -5
- package/dist/config/models.js.map +1 -1
- package/dist/config/paths.d.ts +3 -0
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +9 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/resolver-helpers.d.ts +44 -0
- package/dist/config/resolver-helpers.d.ts.map +1 -0
- package/dist/config/resolver-helpers.js +135 -0
- package/dist/config/resolver-helpers.js.map +1 -0
- package/dist/config/settings-resolver.d.ts +0 -6
- package/dist/config/settings-resolver.d.ts.map +1 -1
- package/dist/config/settings-resolver.js +27 -256
- package/dist/config/settings-resolver.js.map +1 -1
- package/dist/core2/snapshot.d.ts +0 -2
- package/dist/core2/snapshot.d.ts.map +1 -1
- package/dist/core2/snapshot.js +91 -24
- package/dist/core2/snapshot.js.map +1 -1
- package/dist/flow/agents.d.ts +1 -1
- package/dist/flow/agents.d.ts.map +1 -1
- package/dist/flow/agents.js +18 -9
- package/dist/flow/agents.js.map +1 -1
- package/dist/flow/audit-formatters.d.ts +20 -0
- package/dist/flow/audit-formatters.d.ts.map +1 -0
- package/dist/flow/audit-formatters.js +123 -0
- package/dist/flow/audit-formatters.js.map +1 -0
- package/dist/flow/complexity.d.ts +3 -2
- package/dist/flow/complexity.d.ts.map +1 -1
- package/dist/flow/complexity.js +1 -1
- package/dist/flow/complexity.js.map +1 -1
- package/dist/flow/continuation.d.ts.map +1 -1
- package/dist/flow/continuation.js +6 -4
- package/dist/flow/continuation.js.map +1 -1
- package/dist/flow/cycle-guard.d.ts +20 -0
- package/dist/flow/cycle-guard.d.ts.map +1 -0
- package/dist/flow/cycle-guard.js +56 -0
- package/dist/flow/cycle-guard.js.map +1 -0
- package/dist/flow/depth.d.ts +0 -1
- package/dist/flow/depth.d.ts.map +1 -1
- package/dist/flow/depth.js +3 -2
- package/dist/flow/depth.js.map +1 -1
- package/dist/flow/dump-io.d.ts +15 -0
- package/dist/flow/dump-io.d.ts.map +1 -0
- package/dist/flow/dump-io.js +169 -0
- package/dist/flow/dump-io.js.map +1 -0
- package/dist/flow/execute-single.d.ts +8 -0
- package/dist/flow/execute-single.d.ts.map +1 -0
- package/dist/flow/execute-single.js +132 -0
- package/dist/flow/execute-single.js.map +1 -0
- package/dist/flow/executor.d.ts +3 -62
- package/dist/flow/executor.d.ts.map +1 -1
- package/dist/flow/executor.js +36 -342
- package/dist/flow/executor.js.map +1 -1
- package/dist/flow/flow-args.d.ts +14 -0
- package/dist/flow/flow-args.d.ts.map +1 -0
- package/dist/flow/flow-args.js +119 -0
- package/dist/flow/flow-args.js.map +1 -0
- package/dist/flow/flow-live.d.ts +18 -0
- package/dist/flow/flow-live.d.ts.map +1 -0
- package/dist/flow/flow-live.js +46 -0
- package/dist/flow/flow-live.js.map +1 -0
- package/dist/flow/process-lifecycle.d.ts +28 -0
- package/dist/flow/process-lifecycle.d.ts.map +1 -0
- package/dist/flow/process-lifecycle.js +114 -0
- package/dist/flow/process-lifecycle.js.map +1 -0
- package/dist/flow/runner.d.ts +4 -54
- package/dist/flow/runner.d.ts.map +1 -1
- package/dist/flow/runner.js +55 -517
- package/dist/flow/runner.js.map +1 -1
- package/dist/flow/settings-command.d.ts +2 -24
- package/dist/flow/settings-command.d.ts.map +1 -1
- package/dist/flow/settings-command.js +14 -716
- package/dist/flow/settings-command.js.map +1 -1
- package/dist/flow/settings-handler.d.ts +9 -0
- package/dist/flow/settings-handler.d.ts.map +1 -0
- package/dist/flow/settings-handler.js +377 -0
- package/dist/flow/settings-handler.js.map +1 -0
- package/dist/flow/settings-items.d.ts +42 -0
- package/dist/flow/settings-items.d.ts.map +1 -0
- package/dist/flow/settings-items.js +380 -0
- package/dist/flow/settings-items.js.map +1 -0
- package/dist/flow/spawn-utils.d.ts +17 -0
- package/dist/flow/spawn-utils.d.ts.map +1 -0
- package/dist/flow/spawn-utils.js +40 -0
- package/dist/flow/spawn-utils.js.map +1 -0
- package/dist/flow/store.d.ts.map +1 -1
- package/dist/flow/store.js +2 -8
- package/dist/flow/store.js.map +1 -1
- package/dist/flow/transition.d.ts +0 -1
- package/dist/flow/transition.d.ts.map +1 -1
- package/dist/flow/transition.js +0 -3
- package/dist/flow/transition.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +94 -57
- package/dist/index.js.map +1 -1
- package/dist/io/atomic-write.d.ts +10 -0
- package/dist/io/atomic-write.d.ts.map +1 -0
- package/dist/io/atomic-write.js +30 -0
- package/dist/io/atomic-write.js.map +1 -0
- package/dist/notify/notify.d.ts.map +1 -1
- package/dist/notify/notify.js +1 -4
- package/dist/notify/notify.js.map +1 -1
- package/dist/snapshot/cli-args.d.ts +1 -2
- package/dist/snapshot/cli-args.d.ts.map +1 -1
- package/dist/snapshot/runner-events.d.ts +10 -0
- package/dist/snapshot/runner-events.d.ts.map +1 -1
- package/dist/snapshot/runner-events.js +112 -30
- package/dist/snapshot/runner-events.js.map +1 -1
- package/dist/snapshot/structured-output.d.ts.map +1 -1
- package/dist/snapshot/structured-output.js +3 -1
- package/dist/snapshot/structured-output.js.map +1 -1
- package/dist/snapshot/trace-output.d.ts.map +1 -1
- package/dist/snapshot/trace-output.js +8 -4
- package/dist/snapshot/trace-output.js.map +1 -1
- package/dist/steering/sliding-prompt.d.ts.map +1 -1
- package/dist/steering/sliding-prompt.js +12 -15
- package/dist/steering/sliding-prompt.js.map +1 -1
- package/dist/steering/tool-utils.d.ts +3 -3
- package/dist/steering/tool-utils.d.ts.map +1 -1
- package/dist/steering/tool-utils.js +3 -3
- package/dist/steering/tool-utils.js.map +1 -1
- package/dist/tools/ask-user.js.map +1 -1
- package/dist/tools/timed-bash.d.ts.map +1 -1
- package/dist/tools/timed-bash.js +8 -3
- package/dist/tools/timed-bash.js.map +1 -1
- package/dist/tools/trace.d.ts +0 -1
- package/dist/tools/trace.d.ts.map +1 -1
- package/dist/tools/trace.js +79 -62
- package/dist/tools/trace.js.map +1 -1
- package/dist/tools/web-ops.d.ts +0 -49
- package/dist/tools/web-ops.d.ts.map +1 -1
- package/dist/tools/web-ops.js +9 -9
- package/dist/tools/web-ops.js.map +1 -1
- package/dist/tui/body-render.d.ts +31 -0
- package/dist/tui/body-render.d.ts.map +1 -0
- package/dist/tui/body-render.js +589 -0
- package/dist/tui/body-render.js.map +1 -0
- package/dist/tui/context-display.d.ts +18 -0
- package/dist/tui/context-display.d.ts.map +1 -0
- package/dist/tui/context-display.js +29 -0
- package/dist/tui/context-display.js.map +1 -0
- package/dist/tui/flow-colors.d.ts +6 -1
- package/dist/tui/flow-colors.d.ts.map +1 -1
- package/dist/tui/flow-colors.js +1 -0
- package/dist/tui/flow-colors.js.map +1 -1
- package/dist/tui/flow-live-state.d.ts +36 -0
- package/dist/tui/flow-live-state.d.ts.map +1 -0
- package/dist/tui/flow-live-state.js +53 -0
- package/dist/tui/flow-live-state.js.map +1 -0
- package/dist/tui/grouping.d.ts +27 -0
- package/dist/tui/grouping.d.ts.map +1 -0
- package/dist/tui/grouping.js +191 -0
- package/dist/tui/grouping.js.map +1 -0
- package/dist/tui/header.d.ts +25 -0
- package/dist/tui/header.d.ts.map +1 -0
- package/dist/tui/header.js +95 -0
- package/dist/tui/header.js.map +1 -0
- package/dist/tui/render-utils.d.ts +1 -0
- package/dist/tui/render-utils.d.ts.map +1 -1
- package/dist/tui/render-utils.js +4 -5
- package/dist/tui/render-utils.js.map +1 -1
- package/dist/tui/render.d.ts +19 -33
- package/dist/tui/render.d.ts.map +1 -1
- package/dist/tui/render.js +112 -1014
- package/dist/tui/render.js.map +1 -1
- package/dist/tui/scramble/animation-status.d.ts +5 -0
- package/dist/tui/scramble/animation-status.d.ts.map +1 -0
- package/dist/tui/scramble/animation-status.js +93 -0
- package/dist/tui/scramble/animation-status.js.map +1 -0
- package/dist/tui/scramble/constants.d.ts +0 -4
- package/dist/tui/scramble/constants.d.ts.map +1 -1
- package/dist/tui/scramble/constants.js +3 -3
- package/dist/tui/scramble/constants.js.map +1 -1
- package/dist/tui/scramble/dynamic-text.d.ts +10 -0
- package/dist/tui/scramble/dynamic-text.d.ts.map +1 -0
- package/dist/tui/scramble/dynamic-text.js +19 -0
- package/dist/tui/scramble/dynamic-text.js.map +1 -0
- package/dist/tui/scramble/index.d.ts +8 -2
- package/dist/tui/scramble/index.d.ts.map +1 -1
- package/dist/tui/scramble/index.js +8 -1
- package/dist/tui/scramble/index.js.map +1 -1
- package/dist/tui/scramble/lifecycle.d.ts +4 -0
- package/dist/tui/scramble/lifecycle.d.ts.map +1 -0
- package/dist/tui/scramble/lifecycle.js +75 -0
- package/dist/tui/scramble/lifecycle.js.map +1 -0
- package/dist/tui/scramble/line-state.d.ts +5 -0
- package/dist/tui/scramble/line-state.d.ts.map +1 -0
- package/dist/tui/scramble/line-state.js +99 -0
- package/dist/tui/scramble/line-state.js.map +1 -0
- package/dist/tui/scramble/manager.d.ts +3 -14
- package/dist/tui/scramble/manager.d.ts.map +1 -1
- package/dist/tui/scramble/manager.js +22 -405
- package/dist/tui/scramble/manager.js.map +1 -1
- package/dist/tui/scramble/singleton.d.ts +3 -0
- package/dist/tui/scramble/singleton.d.ts.map +1 -0
- package/dist/tui/scramble/singleton.js +3 -0
- package/dist/tui/scramble/singleton.js.map +1 -0
- package/dist/tui/scramble/timer.d.ts +6 -0
- package/dist/tui/scramble/timer.d.ts.map +1 -0
- package/dist/tui/scramble/timer.js +28 -0
- package/dist/tui/scramble/timer.js.map +1 -0
- package/dist/tui/scramble/utils.d.ts +0 -2
- package/dist/tui/scramble/utils.d.ts.map +1 -1
- package/dist/tui/scramble/utils.js +0 -9
- package/dist/tui/scramble/utils.js.map +1 -1
- package/dist/tui/scramble/value-flash.d.ts +6 -0
- package/dist/tui/scramble/value-flash.d.ts.map +1 -0
- package/dist/tui/scramble/value-flash.js +141 -0
- package/dist/tui/scramble/value-flash.js.map +1 -0
- package/dist/tui/traces.d.ts +13 -0
- package/dist/tui/traces.d.ts.map +1 -0
- package/dist/tui/traces.js +97 -0
- package/dist/tui/traces.js.map +1 -0
- package/dist/types/ui.d.ts +0 -4
- package/dist/types/ui.d.ts.map +1 -1
- package/dist/types/ui.js +1 -30
- package/dist/types/ui.js.map +1 -1
- package/package.json +5 -1
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { GLITCH_FRAME_MS, GLITCH_MAX_START, GLITCH_MAX_LENGTH, GLITCH_COOLDOWN_MS, MIN_GLITCH_INTERVAL, } from './constants.js';
|
|
2
|
+
import { computeOverlapLen, } from './utils.js';
|
|
3
|
+
import { buildGlitchQueue, buildMsgGlitchQueue, isGlitchComplete, detectDirection, } from './algorithm.js';
|
|
4
|
+
export function createLineState() {
|
|
5
|
+
return {
|
|
6
|
+
lastText: '',
|
|
7
|
+
displayedText: '',
|
|
8
|
+
targetText: '',
|
|
9
|
+
startTime: 0,
|
|
10
|
+
lastAnimTime: 0,
|
|
11
|
+
initialized: false,
|
|
12
|
+
completed: false,
|
|
13
|
+
lastAccessTime: Date.now(),
|
|
14
|
+
glitchQueue: [],
|
|
15
|
+
glitchFrame: 0,
|
|
16
|
+
lastGlitchTime: Number.NEGATIVE_INFINITY,
|
|
17
|
+
pendingGlitch: null,
|
|
18
|
+
pendingOldDisplayed: '',
|
|
19
|
+
pendingNewDisplayed: '',
|
|
20
|
+
pendingStartTime: 0,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export function createValueFlashState() {
|
|
24
|
+
return {
|
|
25
|
+
prev: '',
|
|
26
|
+
startTime: 0,
|
|
27
|
+
lastValueChangeTime: 0,
|
|
28
|
+
lastFlashTime: 0,
|
|
29
|
+
completed: false,
|
|
30
|
+
glitchQueue: [],
|
|
31
|
+
glitchFrame: 0,
|
|
32
|
+
lastGlitchTime: 0,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export function processLine(state, newText, now, lineKey, glitchEnabled = true) {
|
|
36
|
+
if (state.completed)
|
|
37
|
+
return;
|
|
38
|
+
if (!state.initialized) {
|
|
39
|
+
state.lastText = newText;
|
|
40
|
+
state.displayedText = newText;
|
|
41
|
+
state.initialized = true;
|
|
42
|
+
state.lastAnimTime = now;
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const textChanged = state.lastText !== newText;
|
|
46
|
+
if (!textChanged)
|
|
47
|
+
return;
|
|
48
|
+
const oldText = state.lastText;
|
|
49
|
+
state.lastText = newText;
|
|
50
|
+
const overlap = computeOverlapLen(oldText, newText);
|
|
51
|
+
const minLen = Math.min(oldText.length, newText.length);
|
|
52
|
+
const isExtension = newText.startsWith(oldText);
|
|
53
|
+
if (!isExtension && overlap > 0 && overlap >= minLen * 0.5) {
|
|
54
|
+
state.displayedText = newText;
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const cooldownMs = lineKey === 'msg' ? GLITCH_COOLDOWN_MS : MIN_GLITCH_INTERVAL;
|
|
58
|
+
const cooledDown = now - state.lastGlitchTime >= cooldownMs;
|
|
59
|
+
if (!cooledDown) {
|
|
60
|
+
if (lineKey !== 'msg') {
|
|
61
|
+
state.displayedText = newText;
|
|
62
|
+
}
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const oldDisplayed = state.displayedText || oldText;
|
|
66
|
+
const direction = detectDirection(oldDisplayed, newText);
|
|
67
|
+
if (lineKey === 'msg') {
|
|
68
|
+
state.targetText = newText;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
state.displayedText = newText;
|
|
72
|
+
}
|
|
73
|
+
state.lastAnimTime = now;
|
|
74
|
+
if (glitchEnabled) {
|
|
75
|
+
if (state.glitchQueue.length > 0) {
|
|
76
|
+
const frame = Math.floor((now - state.startTime) / GLITCH_FRAME_MS);
|
|
77
|
+
if (!isGlitchComplete(state.glitchQueue, frame)) {
|
|
78
|
+
state.pendingGlitch = lineKey === 'msg'
|
|
79
|
+
? buildMsgGlitchQueue(oldDisplayed, newText, direction)
|
|
80
|
+
: buildGlitchQueue(oldDisplayed, newText, GLITCH_MAX_START, GLITCH_MAX_LENGTH, direction);
|
|
81
|
+
state.pendingOldDisplayed = oldDisplayed;
|
|
82
|
+
state.pendingNewDisplayed = newText;
|
|
83
|
+
state.pendingStartTime = now;
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
state.glitchQueue = lineKey === 'msg'
|
|
88
|
+
? buildMsgGlitchQueue(oldDisplayed, newText, direction)
|
|
89
|
+
: buildGlitchQueue(oldDisplayed, newText, GLITCH_MAX_START, GLITCH_MAX_LENGTH, direction);
|
|
90
|
+
state.targetText = newText;
|
|
91
|
+
state.startTime = now;
|
|
92
|
+
state.glitchFrame = 0;
|
|
93
|
+
state.lastGlitchTime = now;
|
|
94
|
+
}
|
|
95
|
+
else if (lineKey === 'msg') {
|
|
96
|
+
state.displayedText = newText;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=line-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"line-state.js","sourceRoot":"","sources":["../../../src/tui/scramble/line-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { Component } from '@earendil-works/pi-tui';
|
|
2
1
|
import { AnimationConfig, ScrambleResult } from './constants.js';
|
|
3
2
|
export declare class ScrambleStateManager {
|
|
4
3
|
private cache;
|
|
5
4
|
private tpsState;
|
|
5
|
+
private ctxState;
|
|
6
6
|
private genericCache;
|
|
7
7
|
private randomPool;
|
|
8
8
|
private randomPoolIndex;
|
|
@@ -19,7 +19,9 @@ export declare class ScrambleStateManager {
|
|
|
19
19
|
private _setupValueFlash;
|
|
20
20
|
private _renderValueFlash;
|
|
21
21
|
private _updateValueKpi;
|
|
22
|
+
updateHeaderMetric(id: string, kind: "tps" | "ctx", value: string, now: number, isComplete?: boolean, staticLine?: boolean): string;
|
|
22
23
|
updateTps(id: string, tpsText: string, now: number, isComplete?: boolean, staticLine?: boolean): string;
|
|
24
|
+
updateCtx(id: string, ctxText: string, now: number, isComplete?: boolean, staticLine?: boolean): string;
|
|
23
25
|
private isLineAnimating;
|
|
24
26
|
hasActiveAnimations(id: string, now: number): boolean;
|
|
25
27
|
hasAnyActiveAnimations(now: number): boolean;
|
|
@@ -28,17 +30,4 @@ export declare class ScrambleStateManager {
|
|
|
28
30
|
completeFlow(id: string): void;
|
|
29
31
|
renderStatic(text: string): string;
|
|
30
32
|
}
|
|
31
|
-
export declare function runScrambleTimer(args: Record<string, any> | undefined, id?: string): void;
|
|
32
|
-
export declare class DynamicScrambleText implements Component {
|
|
33
|
-
private getScrambleContent;
|
|
34
|
-
private truncated;
|
|
35
|
-
private base;
|
|
36
|
-
constructor(initialContent: string, getScrambleContent: () => string, truncated?: boolean);
|
|
37
|
-
invalidate(): void;
|
|
38
|
-
render(width: number): string[];
|
|
39
|
-
}
|
|
40
|
-
/** Standalone setter that transitions to the singleton manager. */
|
|
41
|
-
export declare function setAnimationConfig(config: AnimationConfig): void;
|
|
42
|
-
/** Module-level singleton for use across render calls. */
|
|
43
|
-
export declare const scrambleManager: ScrambleStateManager;
|
|
44
33
|
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/tui/scramble/manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/tui/scramble/manager.ts"],"names":[],"mappings":"AACA,OAAO,EACN,eAAe,EACf,cAAc,EAmBd,MAAM,gBAAgB,CAAC;AAmCxB,qBAAa,oBAAoB;IAChC,OAAO,CAAC,KAAK,CAAiD;IAC9D,OAAO,CAAC,QAAQ,CAAsC;IACtD,OAAO,CAAC,QAAQ,CAAsC;IACtD,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,eAAe,CAAoD;IAE3E,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,cAAc;IAOtB,kBAAkB,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAIjD,OAAO,CAAC,QAAQ;IAShB,OAAO,CAAC,eAAe;IAWvB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,GAAE,OAAe,EAAE,UAAU,GAAE,OAAe,GAAG,cAAc;IAoGxI,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,GAAE,OAAe,EAAE,UAAU,GAAE,OAAe,GAAG,cAAc;IAmG1H,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,GAAE,OAAe,EAAE,UAAU,GAAE,OAAe,GAAG,cAAc;IAmG1H,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,GAAE,OAAe,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,GAAE,OAAe,GAAG,cAAc;IAwH3I,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,eAAe;IAWvB,kBAAkB,CACjB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,KAAK,GAAG,KAAK,EACnB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,UAAU,GAAE,OAAe,EAC3B,UAAU,GAAE,OAAe,GACzB,MAAM;IAIT,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,UAAQ,EAAE,UAAU,UAAQ,GAAG,MAAM;IAInG,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,UAAQ,EAAE,UAAU,UAAQ,GAAG,MAAM;IAInG,OAAO,CAAC,eAAe;IAIvB,mBAAmB,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO;IAIrD,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI5C,KAAK,IAAI,IAAI;IAOb,OAAO,CAAC,qBAAqB;IAI7B,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAK9B,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAGlC"}
|
|
@@ -1,113 +1,15 @@
|
|
|
1
|
-
// Auto-generated from src/tui/scramble.ts split
|
|
2
1
|
import { tailText } from '../render-utils.js';
|
|
3
|
-
import {
|
|
4
|
-
import { GLITCH_FRAME_MS, GLITCH_MAX_START, GLITCH_MAX_LENGTH, GLITCH_SHORT_MAX_START, GLITCH_SHORT_MAX_LENGTH, GLITCH_COOLDOWN_MS, MIN_GLITCH_INTERVAL, TPS_HYSTERESIS_PCT, TPS_HYSTERESIS_MS, TPS_FLASH_COOLDOWN_MS, clearLiveText, MAX_FLOW_ENTRIES, MAX_CACHE_AGE_MS, RANDOM_POOL_SIZE, SCRAMBLE_CHARS, POOL_REFILL_THRESHOLD, } from './constants.js';
|
|
2
|
+
import { GLITCH_FRAME_MS, GLITCH_MAX_START, GLITCH_MAX_LENGTH, MIN_GLITCH_INTERVAL, RANDOM_POOL_SIZE, SCRAMBLE_CHARS, POOL_REFILL_THRESHOLD, } from './constants.js';
|
|
5
3
|
import { computeOverlapLen, isMinorStaticMutation, } from './utils.js';
|
|
6
4
|
import { buildGlitchQueue, buildMsgGlitchQueue, computeGlitchFrame, applyScramble, isGlitchComplete, detectDirection, } from './algorithm.js';
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
if (state.completed)
|
|
12
|
-
return;
|
|
13
|
-
if (!state.initialized) {
|
|
14
|
-
state.lastText = newText;
|
|
15
|
-
state.displayedText = newText;
|
|
16
|
-
state.initialized = true;
|
|
17
|
-
state.lastAnimTime = now;
|
|
18
|
-
return;
|
|
19
|
-
}
|
|
20
|
-
const textChanged = state.lastText !== newText;
|
|
21
|
-
if (!textChanged)
|
|
22
|
-
return;
|
|
23
|
-
const oldText = state.lastText;
|
|
24
|
-
state.lastText = newText;
|
|
25
|
-
const overlap = computeOverlapLen(oldText, newText);
|
|
26
|
-
const minLen = Math.min(oldText.length, newText.length);
|
|
27
|
-
const isExtension = newText.startsWith(oldText);
|
|
28
|
-
if (!isExtension && overlap > 0 && overlap >= minLen * 0.5) {
|
|
29
|
-
state.displayedText = newText;
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
const cooldownMs = lineKey === 'msg' ? GLITCH_COOLDOWN_MS : MIN_GLITCH_INTERVAL;
|
|
33
|
-
const cooledDown = now - state.lastGlitchTime >= cooldownMs;
|
|
34
|
-
if (!cooledDown) {
|
|
35
|
-
if (lineKey !== 'msg') {
|
|
36
|
-
state.displayedText = newText;
|
|
37
|
-
}
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
const oldDisplayed = state.displayedText || oldText;
|
|
41
|
-
const direction = detectDirection(oldDisplayed, newText);
|
|
42
|
-
if (lineKey === 'msg') {
|
|
43
|
-
state.targetText = newText;
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
46
|
-
state.displayedText = newText;
|
|
47
|
-
}
|
|
48
|
-
state.lastAnimTime = now;
|
|
49
|
-
if (glitchEnabled) {
|
|
50
|
-
if (state.glitchQueue.length > 0) {
|
|
51
|
-
const frame = Math.floor((now - state.startTime) / GLITCH_FRAME_MS);
|
|
52
|
-
if (!isGlitchComplete(state.glitchQueue, frame)) {
|
|
53
|
-
state.pendingGlitch = lineKey === 'msg'
|
|
54
|
-
? buildMsgGlitchQueue(oldDisplayed, newText, direction)
|
|
55
|
-
: buildGlitchQueue(oldDisplayed, newText, GLITCH_MAX_START, GLITCH_MAX_LENGTH, direction);
|
|
56
|
-
state.pendingOldDisplayed = oldDisplayed;
|
|
57
|
-
state.pendingNewDisplayed = newText;
|
|
58
|
-
state.pendingStartTime = now;
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
state.glitchQueue = lineKey === 'msg'
|
|
63
|
-
? buildMsgGlitchQueue(oldDisplayed, newText, direction)
|
|
64
|
-
: buildGlitchQueue(oldDisplayed, newText, GLITCH_MAX_START, GLITCH_MAX_LENGTH, direction);
|
|
65
|
-
state.targetText = newText;
|
|
66
|
-
state.startTime = now;
|
|
67
|
-
state.glitchFrame = 0;
|
|
68
|
-
state.lastGlitchTime = now;
|
|
69
|
-
}
|
|
70
|
-
else if (lineKey === 'msg') {
|
|
71
|
-
state.displayedText = newText;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
// ---------------------------------------------------------------------------
|
|
75
|
-
// ScrambleStateManager
|
|
76
|
-
// ---------------------------------------------------------------------------
|
|
77
|
-
function createLineState() {
|
|
78
|
-
return {
|
|
79
|
-
lastText: '',
|
|
80
|
-
displayedText: '',
|
|
81
|
-
targetText: '',
|
|
82
|
-
startTime: 0,
|
|
83
|
-
lastAnimTime: 0,
|
|
84
|
-
initialized: false,
|
|
85
|
-
completed: false,
|
|
86
|
-
lastAccessTime: Date.now(),
|
|
87
|
-
glitchQueue: [],
|
|
88
|
-
glitchFrame: 0,
|
|
89
|
-
lastGlitchTime: Number.NEGATIVE_INFINITY,
|
|
90
|
-
pendingGlitch: null,
|
|
91
|
-
pendingOldDisplayed: '',
|
|
92
|
-
pendingNewDisplayed: '',
|
|
93
|
-
pendingStartTime: 0,
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
function createValueFlashState() {
|
|
97
|
-
return {
|
|
98
|
-
prev: '',
|
|
99
|
-
startTime: 0,
|
|
100
|
-
lastValueChangeTime: 0,
|
|
101
|
-
lastFlashTime: 0,
|
|
102
|
-
completed: false,
|
|
103
|
-
glitchQueue: [],
|
|
104
|
-
glitchFrame: 0,
|
|
105
|
-
lastGlitchTime: 0,
|
|
106
|
-
};
|
|
107
|
-
}
|
|
5
|
+
import { createLineState, processLine, } from './line-state.js';
|
|
6
|
+
import { isLineAnimating, hasActiveAnimations, hasAnyActiveAnimations, } from './animation-status.js';
|
|
7
|
+
import { setupValueFlash, renderValueFlash, updateValueKpi, updateHeaderMetricImpl, } from './value-flash.js';
|
|
8
|
+
import { sweepCompletedEntries, completeFlowImpl, } from './lifecycle.js';
|
|
108
9
|
export class ScrambleStateManager {
|
|
109
10
|
cache = new Map();
|
|
110
11
|
tpsState = new Map();
|
|
12
|
+
ctxState = new Map();
|
|
111
13
|
genericCache = new Map();
|
|
112
14
|
randomPool = [];
|
|
113
15
|
randomPoolIndex = 0;
|
|
@@ -584,333 +486,48 @@ export class ScrambleStateManager {
|
|
|
584
486
|
const isAnimating = this.isLineAnimating(state, now);
|
|
585
487
|
return { label: 'msg:', content, isAnimating };
|
|
586
488
|
}
|
|
587
|
-
// -----------------------------------------------------------------------
|
|
588
|
-
// Value flash helpers (shared by TPS, act KPI, msg KPI)
|
|
589
|
-
// -----------------------------------------------------------------------
|
|
590
489
|
_setupValueFlash(state, value, now) {
|
|
591
|
-
|
|
592
|
-
state.startTime = now;
|
|
593
|
-
state.lastGlitchTime = now;
|
|
594
|
-
state.glitchFrame = 0;
|
|
490
|
+
setupValueFlash(state, value, now);
|
|
595
491
|
}
|
|
596
492
|
_renderValueFlash(state, value, now) {
|
|
597
|
-
|
|
598
|
-
const frame = Math.floor((now - state.startTime) / GLITCH_FRAME_MS);
|
|
599
|
-
if (isGlitchComplete(state.glitchQueue, frame)) {
|
|
600
|
-
state.glitchQueue = [];
|
|
601
|
-
state.prev = value;
|
|
602
|
-
return value;
|
|
603
|
-
}
|
|
604
|
-
return computeGlitchFrame(state.glitchQueue, frame, () => this.poolRandomChar(), value);
|
|
605
|
-
}
|
|
606
|
-
state.prev = value;
|
|
607
|
-
return value;
|
|
493
|
+
return renderValueFlash(state, value, now, () => this.poolRandomChar());
|
|
608
494
|
}
|
|
609
495
|
_updateValueKpi(map, id, value, now, isComplete, staticLine) {
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
newState.completed = true;
|
|
615
|
-
map.set(id, newState);
|
|
616
|
-
return newState;
|
|
617
|
-
}
|
|
618
|
-
s.completed = true;
|
|
619
|
-
s.glitchQueue = [];
|
|
620
|
-
return s;
|
|
621
|
-
}
|
|
622
|
-
let state = map.get(id);
|
|
623
|
-
const isFirstCall = !state;
|
|
624
|
-
if (!state) {
|
|
625
|
-
state = createValueFlashState();
|
|
626
|
-
state.prev = value;
|
|
627
|
-
state.lastValueChangeTime = now;
|
|
628
|
-
map.set(id, state);
|
|
629
|
-
}
|
|
630
|
-
if (!isComplete && state.completed) {
|
|
631
|
-
state.completed = false;
|
|
632
|
-
state.prev = '';
|
|
633
|
-
state.glitchQueue = [];
|
|
634
|
-
state.startTime = 0;
|
|
635
|
-
state.lastGlitchTime = 0;
|
|
636
|
-
state.lastFlashTime = 0;
|
|
637
|
-
state.glitchFrame = 0;
|
|
638
|
-
}
|
|
639
|
-
if (state.completed)
|
|
640
|
-
return state;
|
|
641
|
-
const cooldownElapsed = now - state.lastFlashTime >= TPS_FLASH_COOLDOWN_MS;
|
|
642
|
-
if (state.prev !== value) {
|
|
643
|
-
let shouldFlash = staticLine ? state.startTime === 0 : true;
|
|
644
|
-
state.lastValueChangeTime = now;
|
|
645
|
-
if (shouldFlash && cooldownElapsed) {
|
|
646
|
-
this._setupValueFlash(state, value, now);
|
|
647
|
-
state.lastFlashTime = now;
|
|
648
|
-
}
|
|
649
|
-
state.prev = value;
|
|
650
|
-
}
|
|
651
|
-
if (isFirstCall && staticLine && state.startTime === 0 && cooldownElapsed) {
|
|
652
|
-
this._setupValueFlash(state, value, now);
|
|
653
|
-
state.lastFlashTime = now;
|
|
654
|
-
}
|
|
655
|
-
return state;
|
|
496
|
+
return updateValueKpi(map, id, value, now, isComplete, staticLine);
|
|
497
|
+
}
|
|
498
|
+
updateHeaderMetric(id, kind, value, now, isComplete = false, staticLine = false) {
|
|
499
|
+
return updateHeaderMetricImpl(id, kind, value, now, isComplete, staticLine, this.animationConfig.enabled, this.tpsState, this.ctxState, () => this.poolRandomChar());
|
|
656
500
|
}
|
|
657
|
-
// -----------------------------------------------------------------------
|
|
658
|
-
// TPS flash
|
|
659
|
-
// -----------------------------------------------------------------------
|
|
660
501
|
updateTps(id, tpsText, now, isComplete = false, staticLine = false) {
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
if (isComplete) {
|
|
666
|
-
const s = this.tpsState.get(id);
|
|
667
|
-
if (!s)
|
|
668
|
-
return tpsText;
|
|
669
|
-
}
|
|
670
|
-
let state = this.tpsState.get(id);
|
|
671
|
-
const isFirstCall = !state;
|
|
672
|
-
if (!state) {
|
|
673
|
-
state = createValueFlashState();
|
|
674
|
-
state.prev = tpsText;
|
|
675
|
-
state.lastValueChangeTime = now;
|
|
676
|
-
this.tpsState.set(id, state);
|
|
677
|
-
}
|
|
678
|
-
if (!isComplete && state.completed) {
|
|
679
|
-
state.completed = false;
|
|
680
|
-
state.prev = '';
|
|
681
|
-
state.glitchQueue = [];
|
|
682
|
-
state.startTime = 0;
|
|
683
|
-
state.lastGlitchTime = 0;
|
|
684
|
-
state.lastFlashTime = 0;
|
|
685
|
-
}
|
|
686
|
-
if (isComplete) {
|
|
687
|
-
state.completed = true;
|
|
688
|
-
state.glitchQueue = [];
|
|
689
|
-
}
|
|
690
|
-
if (state.completed)
|
|
691
|
-
return tpsText;
|
|
692
|
-
const cooldownElapsed = now - state.lastFlashTime >= TPS_FLASH_COOLDOWN_MS;
|
|
693
|
-
if (state.prev !== tpsText) {
|
|
694
|
-
let shouldFlash = staticLine ? state.startTime === 0 : true;
|
|
695
|
-
const prevVal = parseFloat(state.prev);
|
|
696
|
-
const newVal = parseFloat(tpsText);
|
|
697
|
-
if (!isNaN(prevVal) && !isNaN(newVal) && prevVal !== 0) {
|
|
698
|
-
const deltaPct = Math.abs(newVal - prevVal) / prevVal;
|
|
699
|
-
const timeSinceLastChange = state.lastValueChangeTime > 0 ? now - state.lastValueChangeTime : 0;
|
|
700
|
-
shouldFlash = deltaPct > TPS_HYSTERESIS_PCT || timeSinceLastChange > TPS_HYSTERESIS_MS;
|
|
701
|
-
}
|
|
702
|
-
state.lastValueChangeTime = now;
|
|
703
|
-
if (shouldFlash && cooldownElapsed) {
|
|
704
|
-
this._setupValueFlash(state, tpsText, now);
|
|
705
|
-
state.lastFlashTime = now;
|
|
706
|
-
}
|
|
707
|
-
state.prev = tpsText;
|
|
708
|
-
}
|
|
709
|
-
if (isFirstCall && staticLine && state.startTime === 0 && cooldownElapsed) {
|
|
710
|
-
this._setupValueFlash(state, tpsText, now);
|
|
711
|
-
state.lastFlashTime = now;
|
|
712
|
-
}
|
|
713
|
-
return this._renderValueFlash(state, tpsText, now);
|
|
502
|
+
return this.updateHeaderMetric(id, "tps", tpsText, now, isComplete, staticLine);
|
|
503
|
+
}
|
|
504
|
+
updateCtx(id, ctxText, now, isComplete = false, staticLine = false) {
|
|
505
|
+
return this.updateHeaderMetric(id, "ctx", ctxText, now, isComplete, staticLine);
|
|
714
506
|
}
|
|
715
|
-
// -----------------------------------------------------------------------
|
|
716
|
-
// Animation status helpers
|
|
717
|
-
// -----------------------------------------------------------------------
|
|
718
507
|
isLineAnimating(state, now) {
|
|
719
|
-
|
|
720
|
-
return false;
|
|
721
|
-
if (state.glitchQueue.length > 0) {
|
|
722
|
-
const frame = Math.floor((now - state.startTime) / GLITCH_FRAME_MS);
|
|
723
|
-
if (!isGlitchComplete(state.glitchQueue, frame))
|
|
724
|
-
return true;
|
|
725
|
-
}
|
|
726
|
-
if (state.pendingGlitch && state.pendingGlitch.length > 0)
|
|
727
|
-
return true;
|
|
728
|
-
return false;
|
|
508
|
+
return isLineAnimating(state, now);
|
|
729
509
|
}
|
|
730
510
|
hasActiveAnimations(id, now) {
|
|
731
|
-
|
|
732
|
-
const record = this.cache.get(id);
|
|
733
|
-
if (record) {
|
|
734
|
-
for (const key of ['aim', 'act', 'msg']) {
|
|
735
|
-
if (this.isLineAnimating(record[key], now))
|
|
736
|
-
return true;
|
|
737
|
-
}
|
|
738
|
-
}
|
|
739
|
-
for (const [key, rec] of this.cache) {
|
|
740
|
-
if (key.startsWith(prefix)) {
|
|
741
|
-
for (const lineKey of ['aim', 'act', 'msg']) {
|
|
742
|
-
if (this.isLineAnimating(rec[lineKey], now))
|
|
743
|
-
return true;
|
|
744
|
-
}
|
|
745
|
-
}
|
|
746
|
-
}
|
|
747
|
-
for (const [key, state] of this.genericCache) {
|
|
748
|
-
if (key.startsWith(prefix) && this.isLineAnimating(state, now))
|
|
749
|
-
return true;
|
|
750
|
-
}
|
|
751
|
-
const checkValueState = (map) => {
|
|
752
|
-
const exact = map.get(id);
|
|
753
|
-
if (exact && !exact.completed) {
|
|
754
|
-
if (exact.glitchQueue.length > 0) {
|
|
755
|
-
const frame = Math.floor((now - exact.startTime) / GLITCH_FRAME_MS);
|
|
756
|
-
if (!isGlitchComplete(exact.glitchQueue, frame))
|
|
757
|
-
return true;
|
|
758
|
-
}
|
|
759
|
-
}
|
|
760
|
-
for (const [key, state] of map) {
|
|
761
|
-
if (key.startsWith(prefix) && !state.completed) {
|
|
762
|
-
if (state.glitchQueue.length > 0) {
|
|
763
|
-
const frame = Math.floor((now - state.startTime) / GLITCH_FRAME_MS);
|
|
764
|
-
if (!isGlitchComplete(state.glitchQueue, frame))
|
|
765
|
-
return true;
|
|
766
|
-
}
|
|
767
|
-
}
|
|
768
|
-
}
|
|
769
|
-
return false;
|
|
770
|
-
};
|
|
771
|
-
if (checkValueState(this.tpsState))
|
|
772
|
-
return true;
|
|
773
|
-
return false;
|
|
511
|
+
return hasActiveAnimations(id, now, this.cache, this.genericCache, this.tpsState, this.ctxState);
|
|
774
512
|
}
|
|
775
513
|
hasAnyActiveAnimations(now) {
|
|
776
|
-
|
|
777
|
-
for (const key of ['aim', 'act', 'msg']) {
|
|
778
|
-
if (this.isLineAnimating(record[key], now))
|
|
779
|
-
return true;
|
|
780
|
-
}
|
|
781
|
-
}
|
|
782
|
-
for (const state of this.tpsState.values()) {
|
|
783
|
-
if (state.completed)
|
|
784
|
-
continue;
|
|
785
|
-
if (state.glitchQueue.length > 0) {
|
|
786
|
-
const frame = Math.floor((now - state.startTime) / GLITCH_FRAME_MS);
|
|
787
|
-
if (!isGlitchComplete(state.glitchQueue, frame))
|
|
788
|
-
return true;
|
|
789
|
-
}
|
|
790
|
-
}
|
|
791
|
-
for (const state of this.genericCache.values()) {
|
|
792
|
-
if (this.isLineAnimating(state, now))
|
|
793
|
-
return true;
|
|
794
|
-
}
|
|
795
|
-
return false;
|
|
514
|
+
return hasAnyActiveAnimations(now, this.cache, this.genericCache, this.tpsState, this.ctxState);
|
|
796
515
|
}
|
|
797
516
|
clear() {
|
|
798
517
|
this.cache.clear();
|
|
799
518
|
this.tpsState.clear();
|
|
519
|
+
this.ctxState.clear();
|
|
800
520
|
this.genericCache.clear();
|
|
801
521
|
}
|
|
802
522
|
sweepCompletedEntries() {
|
|
803
|
-
|
|
804
|
-
return;
|
|
805
|
-
}
|
|
806
|
-
for (const [id, record] of this.cache) {
|
|
807
|
-
if (record.aim.completed && record.act.completed && record.msg.completed) {
|
|
808
|
-
this.cache.delete(id);
|
|
809
|
-
}
|
|
810
|
-
}
|
|
811
|
-
for (const [id, state] of this.tpsState) {
|
|
812
|
-
if (state.completed) {
|
|
813
|
-
this.tpsState.delete(id);
|
|
814
|
-
}
|
|
815
|
-
}
|
|
816
|
-
for (const [key, state] of this.genericCache) {
|
|
817
|
-
if (state.completed) {
|
|
818
|
-
this.genericCache.delete(key);
|
|
819
|
-
}
|
|
820
|
-
}
|
|
821
|
-
const now = Date.now();
|
|
822
|
-
for (const [key, state] of this.genericCache) {
|
|
823
|
-
if (now - state.lastAccessTime > MAX_CACHE_AGE_MS) {
|
|
824
|
-
this.genericCache.delete(key);
|
|
825
|
-
}
|
|
826
|
-
}
|
|
523
|
+
sweepCompletedEntries(this.cache, this.tpsState, this.ctxState, this.genericCache);
|
|
827
524
|
}
|
|
828
525
|
completeFlow(id) {
|
|
829
|
-
|
|
830
|
-
const record = this.cache.get(id);
|
|
831
|
-
if (record) {
|
|
832
|
-
for (const key of ['aim', 'act', 'msg']) {
|
|
833
|
-
record[key].completed = true;
|
|
834
|
-
record[key].glitchQueue = [];
|
|
835
|
-
record[key].glitchFrame = 0;
|
|
836
|
-
record[key].pendingGlitch = null;
|
|
837
|
-
record[key].pendingOldDisplayed = '';
|
|
838
|
-
record[key].pendingNewDisplayed = '';
|
|
839
|
-
record[key].pendingStartTime = 0;
|
|
840
|
-
record[key].targetText = '';
|
|
841
|
-
}
|
|
842
|
-
}
|
|
843
|
-
const tpsState = this.tpsState.get(id);
|
|
844
|
-
if (tpsState) {
|
|
845
|
-
tpsState.completed = true;
|
|
846
|
-
tpsState.glitchQueue = [];
|
|
847
|
-
tpsState.glitchFrame = 0;
|
|
848
|
-
}
|
|
849
|
-
const prefix = `${id}#`;
|
|
850
|
-
for (const [key, state] of this.genericCache) {
|
|
851
|
-
if (key.startsWith(prefix)) {
|
|
852
|
-
state.completed = true;
|
|
853
|
-
state.glitchQueue = [];
|
|
854
|
-
state.glitchFrame = 0;
|
|
855
|
-
state.pendingGlitch = null;
|
|
856
|
-
state.pendingOldDisplayed = '';
|
|
857
|
-
state.pendingNewDisplayed = '';
|
|
858
|
-
state.pendingStartTime = 0;
|
|
859
|
-
state.targetText = '';
|
|
860
|
-
}
|
|
861
|
-
}
|
|
526
|
+
completeFlowImpl(id, this.cache, this.tpsState, this.ctxState, this.genericCache);
|
|
862
527
|
this.sweepCompletedEntries();
|
|
863
528
|
}
|
|
864
529
|
renderStatic(text) {
|
|
865
530
|
return text;
|
|
866
531
|
}
|
|
867
532
|
}
|
|
868
|
-
// ---------------------------------------------------------------------------
|
|
869
|
-
// Shared animation timer
|
|
870
|
-
// ---------------------------------------------------------------------------
|
|
871
|
-
export function runScrambleTimer(args, id) {
|
|
872
|
-
if (args?.invalidate && args?.state) {
|
|
873
|
-
const s = args.state.__scramble = args.state.__scramble || {};
|
|
874
|
-
const now = Date.now();
|
|
875
|
-
const hasActive = id ? scrambleManager.hasActiveAnimations(id, now) : scrambleManager.hasAnyActiveAnimations(now);
|
|
876
|
-
if (hasActive) {
|
|
877
|
-
if (!s.animTimer) {
|
|
878
|
-
s.animTimer = setTimeout(() => {
|
|
879
|
-
s.animTimer = undefined;
|
|
880
|
-
args.invalidate();
|
|
881
|
-
}, GLITCH_FRAME_MS);
|
|
882
|
-
}
|
|
883
|
-
}
|
|
884
|
-
else if (s.animTimer) {
|
|
885
|
-
clearTimeout(s.animTimer);
|
|
886
|
-
s.animTimer = undefined;
|
|
887
|
-
}
|
|
888
|
-
}
|
|
889
|
-
}
|
|
890
|
-
// ---------------------------------------------------------------------------
|
|
891
|
-
// DynamicScrambleText — TUI component that recomputes scramble on re-render
|
|
892
|
-
// ---------------------------------------------------------------------------
|
|
893
|
-
export class DynamicScrambleText {
|
|
894
|
-
getScrambleContent;
|
|
895
|
-
truncated;
|
|
896
|
-
base;
|
|
897
|
-
constructor(initialContent, getScrambleContent, truncated = false) {
|
|
898
|
-
this.getScrambleContent = getScrambleContent;
|
|
899
|
-
this.truncated = truncated;
|
|
900
|
-
this.base = new Text(initialContent, 0, 0);
|
|
901
|
-
}
|
|
902
|
-
invalidate() { this.base.invalidate(); }
|
|
903
|
-
render(width) {
|
|
904
|
-
const content = this.getScrambleContent();
|
|
905
|
-
const safeContent = content.replace(/[\r\n\t]+/g, ' ');
|
|
906
|
-
this.base.setText(this.truncated ? truncateToWidth(safeContent, width) : safeContent);
|
|
907
|
-
return this.base.render(width);
|
|
908
|
-
}
|
|
909
|
-
}
|
|
910
|
-
/** Standalone setter that transitions to the singleton manager. */
|
|
911
|
-
export function setAnimationConfig(config) {
|
|
912
|
-
scrambleManager.setAnimationConfig(config);
|
|
913
|
-
}
|
|
914
|
-
/** Module-level singleton for use across render calls. */
|
|
915
|
-
export const scrambleManager = new ScrambleStateManager();
|
|
916
533
|
//# sourceMappingURL=manager.js.map
|