koneck 2.46.0 → 2.47.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/router-failure.d.ts +27 -4
- package/dist/router-failure.d.ts.map +1 -1
- package/dist/router-failure.js +83 -14
- package/dist/router-failure.js.map +1 -1
- package/dist/web/history.d.ts +10 -0
- package/dist/web/history.d.ts.map +1 -1
- package/dist/web/history.js +20 -2
- package/dist/web/history.js.map +1 -1
- package/dist/web/ui-client.d.ts.map +1 -1
- package/dist/web/ui-client.js +9 -1
- package/dist/web/ui-client.js.map +1 -1
- package/package.json +1 -1
package/dist/router-failure.d.ts
CHANGED
|
@@ -42,10 +42,33 @@ export interface RouterFailure {
|
|
|
42
42
|
* inventing failures that never happened.
|
|
43
43
|
*/
|
|
44
44
|
export declare function parseRouterAttempts(message: string): RouterAttempt[];
|
|
45
|
-
/**
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
45
|
+
/**
|
|
46
|
+
* Whether one upstream could plausibly go differently next time.
|
|
47
|
+
*
|
|
48
|
+
* The reason matters as much as the number. A 400 saying the prompt was too long will say it again
|
|
49
|
+
* to the identical request, so retrying is time spent to reach the same answer. A 400 saying the
|
|
50
|
+
* model was unavailable is a different claim entirely — the router may pick a different upstream, or
|
|
51
|
+
* the same one may come back — and treating those two as one thing meant a recoverable failure was
|
|
52
|
+
* reported as final.
|
|
53
|
+
*/
|
|
54
|
+
export declare function statusWorthRetrying(status: number, reason?: string | null): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* The reason the gateway actually gave, if it gave one.
|
|
57
|
+
*
|
|
58
|
+
* Everything before the bracketed list of attempts, with the wrapper noise stripped. Worth having
|
|
59
|
+
* because a status alone is nearly always ambiguous and the sentence beside it usually is not.
|
|
60
|
+
*/
|
|
61
|
+
export declare function statedReason(message: string): string | null;
|
|
62
|
+
/**
|
|
63
|
+
* What a status means, in words a person can act on.
|
|
64
|
+
*
|
|
65
|
+
* The reason the gateway gave outranks anything inferred from the number, and getting this wrong
|
|
66
|
+
* cost somebody real time: every 400 was described as "usually the prompt exceeding its context
|
|
67
|
+
* window", so a gateway plainly saying "Model is unavailable" was reported as a context problem and
|
|
68
|
+
* sent them looking at the length of their conversation. A status is a category; the sentence beside
|
|
69
|
+
* it is the fact.
|
|
70
|
+
*/
|
|
71
|
+
export declare function describeStatus(status: number, reason?: string | null): string;
|
|
49
72
|
/**
|
|
50
73
|
* Reads a router failure, if that is what this is.
|
|
51
74
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router-failure.d.ts","sourceRoot":"","sources":["../src/router-failure.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,sFAAsF;IACtF,aAAa,EAAE,OAAO,CAAC;IACvB,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,EAAE,CAapE;AAED
|
|
1
|
+
{"version":3,"file":"router-failure.d.ts","sourceRoot":"","sources":["../src/router-failure.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,sFAAsF;IACtF,aAAa,EAAE,OAAO,CAAC;IACvB,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,EAAE,CAapE;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAOnF;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiB3D;AAcD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAc7E;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CA+CvE;AAGD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,eAAe;IAC9B,4EAA4E;IAC5E,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAsB3E"}
|
package/dist/router-failure.js
CHANGED
|
@@ -46,18 +46,79 @@ export function parseRouterAttempts(message) {
|
|
|
46
46
|
}
|
|
47
47
|
return out;
|
|
48
48
|
}
|
|
49
|
-
/**
|
|
50
|
-
|
|
49
|
+
/**
|
|
50
|
+
* Whether one upstream could plausibly go differently next time.
|
|
51
|
+
*
|
|
52
|
+
* The reason matters as much as the number. A 400 saying the prompt was too long will say it again
|
|
53
|
+
* to the identical request, so retrying is time spent to reach the same answer. A 400 saying the
|
|
54
|
+
* model was unavailable is a different claim entirely — the router may pick a different upstream, or
|
|
55
|
+
* the same one may come back — and treating those two as one thing meant a recoverable failure was
|
|
56
|
+
* reported as final.
|
|
57
|
+
*/
|
|
58
|
+
export function statusWorthRetrying(status, reason) {
|
|
51
59
|
if (status === 429)
|
|
52
60
|
return true; // a quota, which resets
|
|
53
61
|
if (status >= 500)
|
|
54
62
|
return true; // the upstream being unwell
|
|
63
|
+
if (reason && reasonIsAboutAvailability(reason) && !reasonIsAboutTheRequest(reason)) {
|
|
64
|
+
return true; // not there now; possibly there in a moment
|
|
65
|
+
}
|
|
55
66
|
return false; // a refused request stays refused
|
|
56
67
|
}
|
|
57
|
-
/**
|
|
58
|
-
|
|
68
|
+
/**
|
|
69
|
+
* The reason the gateway actually gave, if it gave one.
|
|
70
|
+
*
|
|
71
|
+
* Everything before the bracketed list of attempts, with the wrapper noise stripped. Worth having
|
|
72
|
+
* because a status alone is nearly always ambiguous and the sentence beside it usually is not.
|
|
73
|
+
*/
|
|
74
|
+
export function statedReason(message) {
|
|
75
|
+
/*
|
|
76
|
+
* The leading status marker goes first, then the attempts list.
|
|
77
|
+
*
|
|
78
|
+
* Splitting on the first bracket looked right and threw the whole message away, because a gateway
|
|
79
|
+
* that opens with "[400]: ..." puts that bracket before the sentence rather than after it. So the
|
|
80
|
+
* one message this was written for came back as "without saying why".
|
|
81
|
+
*/
|
|
82
|
+
const withoutMarker = String(message).replace(/^\s*\[\s*\d{3}\s*\]\s*:?\s*/, '');
|
|
83
|
+
const head = withoutMarker.split('[')[0] ?? '';
|
|
84
|
+
const cleaned = head
|
|
85
|
+
.replace(/^\s*\[?\d{3}\]?\s*:?\s*/, '')
|
|
86
|
+
.replace(/^Error from provider[^:]*:\s*/i, '')
|
|
87
|
+
.replace(/^Upstream request failed:\s*/i, '')
|
|
88
|
+
.replace(/^Stream ended before producing a non-ping SSE event\s*/i, '')
|
|
89
|
+
.trim();
|
|
90
|
+
return cleaned.length > 3 ? cleaned.replace(/\s+/g, ' ').slice(0, 200) : null;
|
|
91
|
+
}
|
|
92
|
+
/** Whether a reason says the request itself was the problem, which no retry will change. */
|
|
93
|
+
function reasonIsAboutTheRequest(reason) {
|
|
94
|
+
return /context length|context window|too long|too large|maximum context|token limit|reduce the length|unsupported parameter|invalid|malformed/i
|
|
95
|
+
.test(reason);
|
|
96
|
+
}
|
|
97
|
+
/** Whether a reason says the model was not there, which another attempt might route around. */
|
|
98
|
+
function reasonIsAboutAvailability(reason) {
|
|
99
|
+
return /unavailable|not available|no such model|does not exist|not found|overloaded|capacity|busy|temporarily/i
|
|
100
|
+
.test(reason);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* What a status means, in words a person can act on.
|
|
104
|
+
*
|
|
105
|
+
* The reason the gateway gave outranks anything inferred from the number, and getting this wrong
|
|
106
|
+
* cost somebody real time: every 400 was described as "usually the prompt exceeding its context
|
|
107
|
+
* window", so a gateway plainly saying "Model is unavailable" was reported as a context problem and
|
|
108
|
+
* sent them looking at the length of their conversation. A status is a category; the sentence beside
|
|
109
|
+
* it is the fact.
|
|
110
|
+
*/
|
|
111
|
+
export function describeStatus(status, reason) {
|
|
112
|
+
if (reason) {
|
|
113
|
+
if (reasonIsAboutTheRequest(reason))
|
|
114
|
+
return `refused the request: ${reason}`;
|
|
115
|
+
if (reasonIsAboutAvailability(reason))
|
|
116
|
+
return `was not available: ${reason}`;
|
|
117
|
+
return `answered ${status}: ${reason}`;
|
|
118
|
+
}
|
|
119
|
+
// Nothing said, so this is inference and is worded as inference.
|
|
59
120
|
if (status === 400)
|
|
60
|
-
return 'refused the request
|
|
121
|
+
return 'refused the request, without saying why';
|
|
61
122
|
if (status === 401 || status === 403)
|
|
62
123
|
return 'refused the credential';
|
|
63
124
|
if (status === 404)
|
|
@@ -80,9 +141,11 @@ export function readRouterFailure(message) {
|
|
|
80
141
|
const attempts = parseRouterAttempts(message);
|
|
81
142
|
if (attempts.length === 0)
|
|
82
143
|
return null;
|
|
83
|
-
|
|
84
|
-
const
|
|
85
|
-
const
|
|
144
|
+
// What the gateway said, which outranks anything the status number implies.
|
|
145
|
+
const reason = statedReason(message);
|
|
146
|
+
const retryable = attempts.filter(a => statusWorthRetrying(a.status, reason));
|
|
147
|
+
const refused = attempts.filter(a => !statusWorthRetrying(a.status, reason));
|
|
148
|
+
const lines = attempts.map(a => ` ${a.model} ${describeStatus(a.status, reason)}`);
|
|
86
149
|
if (retryable.length === 0) {
|
|
87
150
|
return {
|
|
88
151
|
attempts,
|
|
@@ -92,12 +155,18 @@ export function readRouterFailure(message) {
|
|
|
92
155
|
+ `one refused the request, so trying again will reach the same answer:`,
|
|
93
156
|
...lines,
|
|
94
157
|
'',
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
+
|
|
158
|
+
// Advice that follows from what was said, rather than from the commonest cause of a 400.
|
|
159
|
+
// Telling somebody to shorten their conversation because a model was unavailable is worse
|
|
160
|
+
// than saying nothing: they go and do it, and it does not help.
|
|
161
|
+
reason && reasonIsAboutTheRequest(reason)
|
|
162
|
+
? 'That is about the request rather than the model. On a free model it is nearly always '
|
|
163
|
+
+ 'the context window, which is usually far smaller than the alias suggests — pin a '
|
|
164
|
+
+ 'model with a window you know, or shorten the conversation.'
|
|
165
|
+
: reason && reasonIsAboutAvailability(reason)
|
|
166
|
+
? 'That is about the model, not your request. Nothing needs shortening. Pin a model that '
|
|
167
|
+
+ 'is actually available, or wait and try again.'
|
|
168
|
+
: 'Pin a specific model rather than an alias, so the choice is yours rather than the '
|
|
169
|
+
+ "router's.",
|
|
101
170
|
].join('\n'),
|
|
102
171
|
};
|
|
103
172
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router-failure.js","sourceRoot":"","sources":["../src/router-failure.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAeH;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,MAAM,SAAS,GAAG,mCAAmC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpE,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAC1B,MAAM,GAAG,GAAoB,EAAE,CAAC;IAChC,0DAA0D;IAC1D,MAAM,OAAO,GAAG,yCAAyC,CAAC;IAC1D,IAAI,KAA6B,CAAC;IAClC,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACtD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,KAAK;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"router-failure.js","sourceRoot":"","sources":["../src/router-failure.ts"],"names":[],"mappings":"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"}
|
package/dist/web/history.d.ts
CHANGED
|
@@ -19,7 +19,17 @@ export interface PastSessionMeta {
|
|
|
19
19
|
provider: string;
|
|
20
20
|
turns: number;
|
|
21
21
|
totalTokens: number;
|
|
22
|
+
/** When the session began. The id carries this too. */
|
|
22
23
|
at: number;
|
|
24
|
+
/**
|
|
25
|
+
* When it was last worked in.
|
|
26
|
+
*
|
|
27
|
+
* A different question from when it started, and the one anybody actually asks of a list. A
|
|
28
|
+
* session opened three hours ago and worked in five minutes ago read as "3h ago", because the
|
|
29
|
+
* listing showed its start time — so the thing you were just doing looked like the oldest thing
|
|
30
|
+
* there.
|
|
31
|
+
*/
|
|
32
|
+
lastAt: number;
|
|
23
33
|
bytes: number;
|
|
24
34
|
}
|
|
25
35
|
/** One entry in a rendered transcript. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/web/history.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,EAAa,KAAK,eAAe,EAAE,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE3F,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED,0CAA0C;AAC1C,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,OAAO,CAAA;CAAE,GACzE;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAClC,0EAA0E;IAC1E,SAAS,EAAE,OAAO,CAAC;CACpB;AAID,sFAAsF;AACtF,eAAO,MAAM,WAAW,MAAM,CAAC;AA4B/B,uEAAuE;AACvE,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/web/history.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,EAAa,KAAK,eAAe,EAAE,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE3F,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,EAAE,EAAE,MAAM,CAAC;IACX;;;;;;;OAOG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,0CAA0C;AAC1C,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,OAAO,CAAA;CAAE,GACzE;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAClC,0EAA0E;IAC1E,SAAS,EAAE,OAAO,CAAC;CACpB;AAID,sFAAsF;AACtF,eAAO,MAAM,WAAW,MAAM,CAAC;AA4B/B,uEAAuE;AACvE,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAqDlF;AAmBD;;;;;GAKG;AACH,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAwGrF"}
|
package/dist/web/history.js
CHANGED
|
@@ -51,7 +51,7 @@ export async function listPast(cwd, limit = 60) {
|
|
|
51
51
|
return [];
|
|
52
52
|
let files;
|
|
53
53
|
try {
|
|
54
|
-
files = (await readdir(dir)).filter(f => f.endsWith('.jsonl'))
|
|
54
|
+
files = (await readdir(dir)).filter(f => f.endsWith('.jsonl'));
|
|
55
55
|
}
|
|
56
56
|
catch {
|
|
57
57
|
return [];
|
|
@@ -73,6 +73,10 @@ export async function listPast(cwd, limit = 60) {
|
|
|
73
73
|
const task = PLACEHOLDER.test(recorded.trim()) || recorded.trim() === ''
|
|
74
74
|
? (firstUserLine(raw) ?? '(nothing was asked)')
|
|
75
75
|
: redactSecrets(recorded).slice(0, 160);
|
|
76
|
+
// Last worked in: what the session wrote down, or failing that when the file was written.
|
|
77
|
+
// The file's own mtime is the honest fallback — a session KONECK saved is a file KONECK
|
|
78
|
+
// touched.
|
|
79
|
+
const written = Date.parse(String(meta['updatedAt'] ?? ''));
|
|
76
80
|
out.push({
|
|
77
81
|
file,
|
|
78
82
|
id: String(meta['id'] ?? file.replace(/\.jsonl$/, '')),
|
|
@@ -82,12 +86,22 @@ export async function listPast(cwd, limit = 60) {
|
|
|
82
86
|
turns: Number(meta['turns'] ?? 0),
|
|
83
87
|
totalTokens: Number(meta['totalTokens'] ?? 0),
|
|
84
88
|
at: Number(meta['at'] ?? info.mtimeMs),
|
|
89
|
+
lastAt: Number.isFinite(written) ? written : info.mtimeMs,
|
|
85
90
|
bytes: info.size,
|
|
86
91
|
});
|
|
87
92
|
}
|
|
88
93
|
catch { /* a half-written or foreign file is skipped, never fatal */ }
|
|
89
94
|
}
|
|
90
|
-
|
|
95
|
+
/*
|
|
96
|
+
* Newest activity first, not newest start.
|
|
97
|
+
*
|
|
98
|
+
* The listing sorted on the filename, which carries the start time — so a session resumed and
|
|
99
|
+
* worked in for an hour sat below one abandoned after a minute, and picking the top entry gave
|
|
100
|
+
* you the wrong piece of work. The same reasoning listSessions already documents for the
|
|
101
|
+
* terminal; the browser was doing it the other way.
|
|
102
|
+
*/
|
|
103
|
+
out.sort((a, b) => b.lastAt - a.lastAt);
|
|
104
|
+
return out.slice(0, limit);
|
|
91
105
|
}
|
|
92
106
|
/** Tool arguments as a short line, which is all a transcript row has room for. */
|
|
93
107
|
function argsLine(raw) {
|
|
@@ -221,6 +235,10 @@ export async function readPast(cwd, file) {
|
|
|
221
235
|
turns: Number(meta['turns'] ?? 0),
|
|
222
236
|
totalTokens: Number(meta['totalTokens'] ?? 0),
|
|
223
237
|
at: Number(meta['at'] ?? info?.mtimeMs ?? 0),
|
|
238
|
+
lastAt: (() => {
|
|
239
|
+
const written = Date.parse(String(meta['updatedAt'] ?? ''));
|
|
240
|
+
return Number.isFinite(written) ? written : (info?.mtimeMs ?? 0);
|
|
241
|
+
})(),
|
|
224
242
|
bytes: info?.size ?? raw.length,
|
|
225
243
|
},
|
|
226
244
|
entries,
|
package/dist/web/history.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/web/history.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAgD,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/web/history.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAgD,MAAM,kBAAkB,CAAC;AAwC3F,MAAM,WAAW,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AAEnF,sFAAsF;AACtF,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC;AAE/B,kFAAkF;AAClF,MAAM,WAAW,GAAG,iDAAiD,CAAC;AAEtE;;;;;GAKG;AACH,SAAS,aAAa,CAAC,GAAW;IAChC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,SAAS;QACvC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;YAC3D,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAClC,CAAC;YACtC,IAAI,OAAO,EAAE,CAAC,MAAM,CAAC,KAAK,MAAM;gBAAE,SAAS;YAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;YAChC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC5C,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,uCAAuC,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,uEAAuE;AACvE,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAW,EAAE,KAAK,GAAG,EAAE;IACpD,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;IAEtB,MAAM,GAAG,GAAsB,EAAE,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9B,0FAA0F;YAC1F,gFAAgF;YAChF,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACzC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAsD,CAAC;YACtF,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAA4B,CAAC;YAChE,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YAC5C,yFAAyF;YACzF,+CAA+C;YAC/C,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE;gBACtE,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,qBAAqB,CAAC;gBAC/C,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAC1C,0FAA0F;YAC1F,wFAAwF;YACxF,WAAW;YACX,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAC5D,GAAG,CAAC,IAAI,CAAC;gBACP,IAAI;gBACJ,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;gBACtD,IAAI;gBACJ,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC;gBACzC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,SAAS,CAAC;gBAC/C,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACjC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBAC7C,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC;gBACtC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO;gBACzD,KAAK,EAAE,IAAI,CAAC,IAAI;aACjB,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC,CAAC,4DAA4D,CAAC,CAAC;IAC1E,CAAC;IACD;;;;;;;OAOG;IACH,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IACxC,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,kFAAkF;AAClF,SAAS,QAAQ,CAAC,GAAY;IAC5B,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;QAC1D,yEAAyE;QACzE,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;YAClF,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,MAAM,CAAC,GAAG,CAAe,CAAC,IAAI,CAAC,IAAI,CAAC;oBAC9E,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;gBACxB,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QACD,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAAC,CAAC;AACtD,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAW,EAAE,IAAY;IACtD,gGAAgG;IAChG,qDAAqD;IACrD,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACxD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;IAC/C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnC,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QAAC,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;IAClE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAEhD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAgB,EAAE,CAAC;IAChC,MAAM,UAAU,GAAsB,EAAE,CAAC;IACzC,IAAI,IAAI,GAA4B,EAAE,CAAC;IACvC,2EAA2E;IAC3E,MAAM,OAAO,GAAG,IAAI,GAAG,EAA0C,CAAC;IAClE,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,MAA+B,CAAC;QACpC,IAAI,CAAC;YAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,SAAS;QAAC,CAAC;QAEjF,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,MAAM,EAAE,CAAC;YAAC,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAA4B,CAAC;YAAC,SAAS;QAAC,CAAC;QACtG,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,YAAY,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YACrE,UAAU,CAAC,IAAI,CAAC,GAAI,MAAM,CAAC,MAAM,CAAuB,CAAC,CAAC;YAC1D,SAAS;QACX,CAAC;QACD,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YAC5D,UAAU,CAAC,IAAI,CAAC,MAAoC,CAAC,CAAC,CAAG,eAAe;YACxE,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAA4B,CAAC;QACpG,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,SAAS;QAEvC,IAAI,OAAO,CAAC,MAAM,IAAI,WAAW,EAAE,CAAC;YAAC,SAAS,GAAG,IAAI,CAAC;YAAC,SAAS;QAAC,CAAC;QAElE,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,MAAM,IAAI,GAAG,OAAO,OAAO,CAAC,SAAS,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;gBACtE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC1D,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;YACpC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,KAAK,MAAM,IAAI,IAAI,KAAuC,EAAE,CAAC;oBAC3D,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAA4B,CAAC;oBAC/D,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE;wBACpC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC;wBAClC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;qBAChC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,MAAM,IAAI,GAAG,OAAO,OAAO,CAAC,SAAS,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9E,IAAI,IAAI,CAAC,IAAI,EAAE;gBAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChF,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;YACjD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7B,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACnB,MAAM,MAAM,GAAG,OAAO,OAAO,CAAC,SAAS,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAChF,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,MAAM;gBAC1B,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE;gBACtB,sFAAsF;gBACtF,0CAA0C;gBAC1C,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;gBAC7C,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;aAC9C,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,QAAQ;YAAE,SAAS,CAAG,4CAA4C;IACjF,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5C,OAAO;QACL,IAAI,EAAE;YACJ,IAAI;YACJ,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACtD,yFAAyF;YACzF,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE;gBAC/D,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,qBAAqB,CAAC;gBAC/C,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;YACzC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC;YACzC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,SAAS,CAAC;YAC/C,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACjC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAC7C,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,OAAO,IAAI,CAAC,CAAC;YAC5C,MAAM,EAAE,CAAC,GAAG,EAAE;gBACZ,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBAC5D,OAAO,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC;YACnE,CAAC,CAAC,EAAE;YACJ,KAAK,EAAE,IAAI,EAAE,IAAI,IAAI,GAAG,CAAC,MAAM;SAChC;QACD,OAAO;QACP,UAAU;QACV,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI;QACzD,SAAS;KACV,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-client.d.ts","sourceRoot":"","sources":["../../src/web/ui-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"ui-client.d.ts","sourceRoot":"","sources":["../../src/web/ui-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAk5GrC"}
|
package/dist/web/ui-client.js
CHANGED
|
@@ -2185,7 +2185,15 @@ async function refreshSessions() {
|
|
|
2185
2185
|
m.appendChild(el('span', 'dot past'));
|
|
2186
2186
|
m.appendChild(el('span', null, p.model));
|
|
2187
2187
|
m.appendChild(el('span', null, num(p.totalTokens) + ' tok'));
|
|
2188
|
-
|
|
2188
|
+
// When it was last worked in, not when it began. A session opened three hours ago and
|
|
2189
|
+
// worked in five minutes ago read as "3h ago", so the thing you were just doing looked like
|
|
2190
|
+
// the oldest thing in the list.
|
|
2191
|
+
const when = el('span', null, ago(p.lastAt || p.at));
|
|
2192
|
+
// Both, on hover, since "started then, still going now" is worth being able to see.
|
|
2193
|
+
if (p.at && p.lastAt && p.lastAt - p.at > 60000) {
|
|
2194
|
+
when.title = 'started ' + ago(p.at) + ', last worked ' + ago(p.lastAt);
|
|
2195
|
+
}
|
|
2196
|
+
m.appendChild(when);
|
|
2189
2197
|
row.appendChild(m);
|
|
2190
2198
|
row.onclick = () => openPast(p.file);
|
|
2191
2199
|
list.appendChild(row);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-client.js","sourceRoot":"","sources":["../../src/web/ui-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,MAAM,CAAC,GAAG,CAAA
|
|
1
|
+
{"version":3,"file":"ui-client.js","sourceRoot":"","sources":["../../src/web/ui-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAg5GlB,CAAC;AACF,CAAC"}
|