flanders 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,222 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SEPARATOR_GLYPH = exports.RESET = exports.DIM = exports.BLUE = exports.GREEN = exports.MAGENTA = exports.YELLOW = exports.CYAN = void 0;
4
+ exports.colorize = colorize;
5
+ exports.renderSegments = renderSegments;
6
+ exports.renderSegmentsToWidth = renderSegmentsToWidth;
7
+ exports.formatCountdown = formatCountdown;
8
+ exports.formatDateTime = formatDateTime;
9
+ exports.truncateToWidth = truncateToWidth;
10
+ exports.formatTokens = formatTokens;
11
+ exports.formatActiveTime = formatActiveTime;
12
+ exports.formatHeaderLine = formatHeaderLine;
13
+ exports.formatMetricsLine = formatMetricsLine;
14
+ exports.formatSnapshotHeader = formatSnapshotHeader;
15
+ exports.formatSnapshotMetrics = formatSnapshotMetrics;
16
+ exports.formatSnapshotBlock = formatSnapshotBlock;
17
+ exports.CYAN = "\x1b[36m";
18
+ exports.YELLOW = "\x1b[33m";
19
+ exports.MAGENTA = "\x1b[35m";
20
+ exports.GREEN = "\x1b[32m";
21
+ exports.BLUE = "\x1b[34m";
22
+ exports.DIM = "\x1b[2m";
23
+ exports.RESET = "\x1b[0m";
24
+ exports.SEPARATOR_GLYPH = "─";
25
+ function colorize(text, code) {
26
+ return code + text + exports.RESET;
27
+ }
28
+ function renderSegments(segments) {
29
+ let result = "";
30
+ for (const seg of segments) {
31
+ if (seg.color) {
32
+ result += seg.color + seg.text + exports.RESET;
33
+ }
34
+ else {
35
+ result += seg.text;
36
+ }
37
+ }
38
+ return result;
39
+ }
40
+ function renderSegmentsToWidth(segments, cols) {
41
+ let plainLen = 0;
42
+ for (const seg of segments)
43
+ plainLen += seg.text.length;
44
+ if (plainLen <= cols)
45
+ return renderSegments(segments);
46
+ let result = "";
47
+ let remaining = Math.max(0, cols - 1);
48
+ for (const seg of segments) {
49
+ if (remaining <= 0)
50
+ break;
51
+ const chunk = seg.text.slice(0, remaining);
52
+ if (seg.color) {
53
+ result += seg.color + chunk + exports.RESET;
54
+ }
55
+ else {
56
+ result += chunk;
57
+ }
58
+ remaining -= chunk.length;
59
+ }
60
+ result += "…";
61
+ return result;
62
+ }
63
+ function formatCountdown(remainingMs) {
64
+ const totalMinutes = Math.max(1, Math.ceil(remainingMs / 60000));
65
+ if (totalMinutes >= 24 * 60) {
66
+ const days = Math.floor(totalMinutes / (24 * 60));
67
+ const remainder = totalMinutes - days * 24 * 60;
68
+ const hours = Math.floor(remainder / 60);
69
+ const minutes = remainder % 60;
70
+ return `${days} days, ${hours} hours, ${minutes} minutes`;
71
+ }
72
+ if (totalMinutes >= 60) {
73
+ const hours = Math.floor(totalMinutes / 60);
74
+ const minutes = totalMinutes % 60;
75
+ return `${hours} hours ${minutes} minutes`;
76
+ }
77
+ return `${totalMinutes} minutes`;
78
+ }
79
+ function formatDateTime(date) {
80
+ const pad = (n) => String(n).padStart(2, "0");
81
+ return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ${pad(date.getHours())}:${pad(date.getMinutes())}`;
82
+ }
83
+ function truncateToWidth(text, cols) {
84
+ if (text.length <= cols)
85
+ return text;
86
+ return text.slice(0, Math.max(0, cols - 1)) + "…";
87
+ }
88
+ function formatTokens(n) {
89
+ if (n >= 1_000_000)
90
+ return (n / 1_000_000).toFixed(1) + "M";
91
+ if (n >= 1000)
92
+ return (n / 1000).toFixed(1) + "k";
93
+ return String(Math.floor(n));
94
+ }
95
+ function formatActiveTime(seconds) {
96
+ const s = Math.max(0, Math.floor(seconds));
97
+ if (s < 60)
98
+ return `${s}s`;
99
+ const pad2 = (n) => String(n).padStart(2, "0");
100
+ if (s < 3600) {
101
+ const m = Math.floor(s / 60);
102
+ return `${m}m${pad2(s % 60)}s`;
103
+ }
104
+ const h = Math.floor(s / 3600);
105
+ const m = Math.floor((s % 3600) / 60);
106
+ return `${h}h${pad2(m)}m${pad2(s % 60)}s`;
107
+ }
108
+ const LIVE_ACTIVITIES = new Set(["implementing", "reviewing", "building", "testing"]);
109
+ function formatHeaderLine(indexLabel, iteration, activity, taskNumber, title, cols) {
110
+ const segments = [];
111
+ if (indexLabel != null) {
112
+ segments.push({ text: indexLabel, color: exports.CYAN });
113
+ }
114
+ if (iteration != null) {
115
+ if (segments.length > 0)
116
+ segments.push({ text: " " });
117
+ segments.push({ text: `iter ${iteration}`, color: exports.YELLOW });
118
+ }
119
+ if (activity != null) {
120
+ const activityColor = activity === "done" ? exports.GREEN : LIVE_ACTIVITIES.has(activity) ? exports.MAGENTA : undefined;
121
+ if (segments.length > 0)
122
+ segments.push({ text: " " });
123
+ segments.push({ text: activity, color: activityColor });
124
+ }
125
+ if (taskNumber) {
126
+ if (segments.length > 0)
127
+ segments.push({ text: " " });
128
+ segments.push({ text: taskNumber, color: exports.GREEN });
129
+ }
130
+ if (title != null) {
131
+ if (segments.length > 0)
132
+ segments.push({ text: " " });
133
+ segments.push({ text: title });
134
+ }
135
+ if (segments.length === 0)
136
+ return "";
137
+ return renderSegmentsToWidth(segments, cols);
138
+ }
139
+ function buildFullMetricsSegments(tTok, tTime, pTok, pTime) {
140
+ return [
141
+ { text: "task", color: exports.DIM },
142
+ { text: " " },
143
+ { text: tTok, color: exports.GREEN },
144
+ { text: " " },
145
+ { text: tTime, color: exports.BLUE },
146
+ { text: " " },
147
+ { text: "│", color: exports.DIM },
148
+ { text: " " },
149
+ { text: "plan", color: exports.DIM },
150
+ { text: " " },
151
+ { text: pTok, color: exports.GREEN },
152
+ { text: " " },
153
+ { text: pTime, color: exports.BLUE },
154
+ ];
155
+ }
156
+ function buildPairFullSegments(label, tok, time) {
157
+ return [
158
+ { text: label, color: exports.DIM },
159
+ { text: " " },
160
+ { text: tok, color: exports.GREEN },
161
+ { text: " " },
162
+ { text: time, color: exports.BLUE },
163
+ ];
164
+ }
165
+ function buildPairCompactSegments(label, tok, time) {
166
+ return [
167
+ { text: label, color: exports.DIM },
168
+ { text: tok, color: exports.GREEN },
169
+ { text: " " },
170
+ { text: time, color: exports.BLUE },
171
+ ];
172
+ }
173
+ function formatMetricsLine(task, plan, cols) {
174
+ if (!task && !plan)
175
+ return "";
176
+ const tTok = task ? formatTokens(task.tokens) : undefined;
177
+ const tTime = task ? formatActiveTime(task.seconds) : undefined;
178
+ const pTok = plan ? formatTokens(plan.tokens) : undefined;
179
+ const pTime = plan ? formatActiveTime(plan.seconds) : undefined;
180
+ const fullSegments = [];
181
+ if (task)
182
+ fullSegments.push(...buildPairFullSegments("task", tTok, tTime));
183
+ if (task && plan)
184
+ fullSegments.push({ text: " " }, { text: "│", color: exports.DIM }, { text: " " });
185
+ if (plan)
186
+ fullSegments.push(...buildPairFullSegments("plan", pTok, pTime));
187
+ let fullPlainLen = 0;
188
+ for (const seg of fullSegments)
189
+ fullPlainLen += seg.text.length;
190
+ if (fullPlainLen <= cols)
191
+ return renderSegments(fullSegments);
192
+ const compactSegments = [];
193
+ if (task)
194
+ compactSegments.push(...buildPairCompactSegments("t:", tTok, tTime));
195
+ if (task && plan)
196
+ compactSegments.push({ text: "│", color: exports.DIM });
197
+ if (plan)
198
+ compactSegments.push(...buildPairCompactSegments("p:", pTok, pTime));
199
+ let compactPlainLen = 0;
200
+ for (const seg of compactSegments)
201
+ compactPlainLen += seg.text.length;
202
+ if (compactPlainLen <= cols)
203
+ return renderSegments(compactSegments);
204
+ return renderSegmentsToWidth(compactSegments, cols);
205
+ }
206
+ function formatSnapshotHeader(indexLabel, iteration, taskNumber, title) {
207
+ return formatHeaderLine(indexLabel, iteration, "done", taskNumber, title, Number.MAX_SAFE_INTEGER);
208
+ }
209
+ function formatSnapshotMetrics(taskTokens, taskSeconds, planTokens, planSeconds) {
210
+ const tTok = formatTokens(taskTokens);
211
+ const tTime = formatActiveTime(taskSeconds);
212
+ const pTok = formatTokens(planTokens);
213
+ const pTime = formatActiveTime(planSeconds);
214
+ return renderSegments(buildFullMetricsSegments(tTok, tTime, pTok, pTime));
215
+ }
216
+ function formatSnapshotBlock(indexLabel, iteration, taskNumber, title, taskTokens, taskSeconds, planTokens, planSeconds, cols) {
217
+ const sep = exports.SEPARATOR_GLYPH.repeat(cols);
218
+ const header = formatSnapshotHeader(indexLabel, iteration, taskNumber, title);
219
+ const metrics = formatSnapshotMetrics(taskTokens, taskSeconds, planTokens, planSeconds);
220
+ return sep + "\n" + header + "\n" + metrics + "\n" + sep + "\n";
221
+ }
222
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0dGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91aS9mb3JtYXR0ZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVVBLDRCQUVDO0FBT0Qsd0NBVUM7QUFFRCxzREFtQkM7QUFFRCwwQ0FlQztBQUVELHdDQUdDO0FBRUQsMENBR0M7QUFFRCxvQ0FJQztBQUVELDRDQVdDO0FBSUQsNENBd0JDO0FBeUNELDhDQTJCQztBQUVELG9EQUVDO0FBRUQsc0RBTUM7QUFFRCxrREFLQztBQW5OWSxRQUFBLElBQUksR0FBRyxVQUFVLENBQUM7QUFDbEIsUUFBQSxNQUFNLEdBQUcsVUFBVSxDQUFDO0FBQ3BCLFFBQUEsT0FBTyxHQUFHLFVBQVUsQ0FBQztBQUNyQixRQUFBLEtBQUssR0FBRyxVQUFVLENBQUM7QUFDbkIsUUFBQSxJQUFJLEdBQUcsVUFBVSxDQUFDO0FBQ2xCLFFBQUEsR0FBRyxHQUFHLFNBQVMsQ0FBQztBQUNoQixRQUFBLEtBQUssR0FBRyxTQUFTLENBQUM7QUFFbEIsUUFBQSxlQUFlLEdBQUcsR0FBRyxDQUFDO0FBRW5DLFNBQWdCLFFBQVEsQ0FBQyxJQUFXLEVBQUUsSUFBVztJQUM3QyxPQUFPLElBQUksR0FBRyxJQUFJLEdBQUcsYUFBSyxDQUFDO0FBQy9CLENBQUM7QUFPRCxTQUFnQixjQUFjLENBQUMsUUFBa0I7SUFDN0MsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLEtBQUssTUFBTSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7UUFDekIsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWixNQUFNLElBQUksR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLGFBQUssQ0FBQztRQUMzQyxDQUFDO2FBQU0sQ0FBQztZQUNKLE1BQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLENBQUM7SUFDTCxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7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QztBQUlELFNBQVMsd0JBQXdCLENBQUMsSUFBVyxFQUFFLEtBQVksRUFBRSxJQUFXLEVBQUUsS0FBWTtJQUNsRixPQUFPO1FBQ0gsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFHLEVBQUU7UUFDNUIsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFO1FBQ2IsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxhQUFLLEVBQUU7UUFDNUIsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFO1FBQ2IsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxZQUFJLEVBQUU7UUFDNUIsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO1FBQ2QsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxXQUFHLEVBQUU7UUFDekIsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO1FBQ2QsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFHLEVBQUU7UUFDNUIsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFO1FBQ2IsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxhQUFLLEVBQUU7UUFDNUIsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFO1FBQ2IsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxZQUFJLEVBQUU7S0FDL0IsQ0FBQztBQUNOLENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUFDLEtBQVksRUFBRSxHQUFVLEVBQUUsSUFBVztJQUNoRSxPQUFPO1FBQ0gsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxXQUFHLEVBQUU7UUFDM0IsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFO1FBQ2IsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxhQUFLLEVBQUU7UUFDM0IsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFO1FBQ2IsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxZQUFJLEVBQUU7S0FDOUIsQ0FBQztBQUNOLENBQUM7QUFFRCxTQUFTLHdCQUF3QixDQUFDLEtBQVksRUFBRSxHQUFVLEVBQUUsSUFBVztJQUNuRSxPQUFPO1FBQ0gsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxXQUFHLEVBQUU7UUFDM0IsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxhQUFLLEVBQUU7UUFDM0IsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFO1FBQ2IsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxZQUFJLEVBQUU7S0FDOUIsQ0FBQztBQUNOLENBQUM7QUFFRCxTQUFnQixpQkFBaUIsQ0FBQyxJQUEwQixFQUFFLElBQTBCLEVBQUUsSUFBVztJQUNqRyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sRUFBRSxDQUFDO0lBRTlCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzFELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDaEUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDMUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUVoRSxNQUFNLFlBQVksR0FBYSxFQUFFLENBQUM7SUFDbEMsSUFBSSxJQUFJO1FBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxJQUFLLEVBQUUsS0FBTSxDQUFDLENBQUMsQ0FBQztJQUM3RSxJQUFJLElBQUksSUFBSSxJQUFJO1FBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDL0YsSUFBSSxJQUFJO1FBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxJQUFLLEVBQUUsS0FBTSxDQUFDLENBQUMsQ0FBQztJQUU3RSxJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7SUFDckIsS0FBSyxNQUFNLEdBQUcsSUFBSSxZQUFZO1FBQUUsWUFBWSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ2hFLElBQUksWUFBWSxJQUFJLElBQUk7UUFBRSxPQUFPLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUU5RCxNQUFNLGVBQWUsR0FBYSxFQUFFLENBQUM7SUFDckMsSUFBSSxJQUFJO1FBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLHdCQUF3QixDQUFDLElBQUksRUFBRSxJQUFLLEVBQUUsS0FBTSxDQUFDLENBQUMsQ0FBQztJQUNqRixJQUFJLElBQUksSUFBSSxJQUFJO1FBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFdBQUcsRUFBRSxDQUFDLENBQUM7SUFDbEUsSUFBSSxJQUFJO1FBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLHdCQUF3QixDQUFDLElBQUksRUFBRSxJQUFLLEVBQUUsS0FBTSxDQUFDLENBQUMsQ0FBQztJQUVqRixJQUFJLGVBQWUsR0FBRyxDQUFDLENBQUM7SUFDeEIsS0FBSyxNQUFNLEdBQUcsSUFBSSxlQUFlO1FBQUUsZUFBZSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3RFLElBQUksZUFBZSxJQUFJLElBQUk7UUFBRSxPQUFPLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUVwRSxPQUFPLHFCQUFxQixDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBRUQsU0FBZ0Isb0JBQW9CLENBQUMsVUFBaUIsRUFBRSxTQUFnQixFQUFFLFVBQTJCLEVBQUUsS0FBWTtJQUMvRyxPQUFPLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDdkcsQ0FBQztBQUVELFNBQWdCLHFCQUFxQixDQUFDLFVBQWlCLEVBQUUsV0FBa0IsRUFBRSxVQUFpQixFQUFFLFdBQWtCO0lBQzlHLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN0QyxNQUFNLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM1QyxNQUFNLElBQUksR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdEMsTUFBTSxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDNUMsT0FBTyxjQUFjLENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUM5RSxDQUFDO0FBRUQsU0FBZ0IsbUJBQW1CLENBQUMsVUFBaUIsRUFBRSxTQUFnQixFQUFFLFVBQTJCLEVBQUUsS0FBWSxFQUFFLFVBQWlCLEVBQUUsV0FBa0IsRUFBRSxVQUFpQixFQUFFLFdBQWtCLEVBQUUsSUFBVztJQUN6TSxNQUFNLEdBQUcsR0FBRyx1QkFBZSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6QyxNQUFNLE1BQU0sR0FBRyxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM5RSxNQUFNLE9BQU8sR0FBRyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN4RixPQUFPLEdBQUcsR0FBRyxJQUFJLEdBQUcsTUFBTSxHQUFHLElBQUksR0FBRyxPQUFPLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM7QUFDcEUsQ0FBQyJ9
package/lib/wait.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ import type { TimeContext } from "./contexts";
2
+ export declare function wait(durationMs: number, chunkMs: number, time: TimeContext, signal: AbortSignal): Promise<void>;
package/lib/wait.js ADDED
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.wait = wait;
4
+ function wait(durationMs, chunkMs, time, signal) {
5
+ return new Promise(resolve => {
6
+ if (signal.aborted) {
7
+ return resolve();
8
+ }
9
+ const start = time.now();
10
+ let currentHandle = null;
11
+ const done = () => {
12
+ signal.removeEventListener("abort", onAbort);
13
+ currentHandle = null;
14
+ resolve();
15
+ };
16
+ const onAbort = () => {
17
+ currentHandle?.cancel();
18
+ done();
19
+ };
20
+ const tick = () => {
21
+ if (signal.aborted) {
22
+ return done();
23
+ }
24
+ const elapsed = time.now() - start;
25
+ const remaining = durationMs - elapsed;
26
+ if (remaining <= 0) {
27
+ return done();
28
+ }
29
+ const chunk = Math.min(remaining, chunkMs);
30
+ currentHandle = time.setTimeout(tick, chunk);
31
+ };
32
+ signal.addEventListener("abort", onAbort, { once: true });
33
+ tick();
34
+ });
35
+ }
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FpdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy93YWl0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsb0JBZ0NDO0FBaENELFNBQWdCLElBQUksQ0FBQyxVQUFpQixFQUFFLE9BQWMsRUFBRSxJQUFnQixFQUFFLE1BQWtCO0lBQ3hGLE9BQU8sSUFBSSxPQUFPLENBQU8sT0FBTyxDQUFDLEVBQUU7UUFDL0IsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsT0FBTyxPQUFPLEVBQUUsQ0FBQztRQUNyQixDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksYUFBYSxHQUE4QyxJQUFJLENBQUM7UUFDcEUsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFO1lBQ2QsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM3QyxhQUFhLEdBQUcsSUFBSSxDQUFDO1lBQ3JCLE9BQU8sRUFBRSxDQUFDO1FBQ2QsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxPQUFPLEdBQUcsR0FBRyxFQUFFO1lBQ2pCLGFBQWEsRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUN4QixJQUFJLEVBQUUsQ0FBQztRQUNYLENBQUMsQ0FBQztRQUNGLE1BQU0sSUFBSSxHQUFHLEdBQUcsRUFBRTtZQUVkLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNqQixPQUFPLElBQUksRUFBRSxDQUFDO1lBQ2xCLENBQUM7WUFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDO1lBQ25DLE1BQU0sU0FBUyxHQUFHLFVBQVUsR0FBRyxPQUFPLENBQUM7WUFDdkMsSUFBSSxTQUFTLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ2pCLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDbEIsQ0FBQztZQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzNDLGFBQWEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqRCxDQUFDLENBQUM7UUFDRixNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzFELElBQUksRUFBRSxDQUFDO0lBQ1gsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDIn0=
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "flanders",
3
+ "version": "0.0.1",
4
+ "description": "Stubborn and smart plan implementation looper using AI",
5
+ "main": "lib/",
6
+ "types": "lib/types",
7
+ "files": [
8
+ "lib/",
9
+ "!lib/**/*.test.*",
10
+ "LICENSE"
11
+ ],
12
+ "bin": {
13
+ "flanders": "lib/cli.js"
14
+ },
15
+ "private": false,
16
+ "publishConfig": {
17
+ "access": "public"
18
+ },
19
+ "scripts": {
20
+ "clean": "node -e \"require('fs').rm('lib', { recursive: true, force: true }, () => {})\"",
21
+ "watch": "npm run clean && npx tsc -p tsconfig.json -watch",
22
+ "build": "npm run clean && npx tsc -p tsconfig.build.json",
23
+ "build-debug": "npm run clean && npx tsc -p tsconfig.json",
24
+ "test": "npm run build-debug && npx aaa"
25
+ },
26
+ "author": "Llorx",
27
+ "license": "MIT",
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "git+https://github.com/Llorx/flanders.git"
31
+ },
32
+ "bugs": {
33
+ "url": "https://github.com/Llorx/flanders/issues"
34
+ },
35
+ "homepage": "https://github.com/Llorx/flanders#readme",
36
+ "devDependencies": {
37
+ "@types/node": "^22.7.8",
38
+ "arrange-act-assert": "^2.11.1",
39
+ "typescript": "^6.0.3"
40
+ }
41
+ }