@teeras/afterhours 0.1.1 → 0.3.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.
- package/README.md +101 -15
- package/dist/activity.d.ts +35 -1
- package/dist/activity.d.ts.map +1 -1
- package/dist/activity.js +148 -1
- package/dist/activity.js.map +1 -1
- package/dist/autosync.d.ts +22 -0
- package/dist/autosync.d.ts.map +1 -0
- package/dist/autosync.js +85 -0
- package/dist/autosync.js.map +1 -0
- package/dist/cli.js +112 -9
- package/dist/cli.js.map +1 -1
- package/dist/cloud.d.ts +5 -0
- package/dist/cloud.d.ts.map +1 -1
- package/dist/cloud.js +10 -2
- package/dist/cloud.js.map +1 -1
- package/dist/collect.d.ts +3 -1
- package/dist/collect.d.ts.map +1 -1
- package/dist/collect.js +19 -7
- package/dist/collect.js.map +1 -1
- package/dist/detect.d.ts.map +1 -1
- package/dist/detect.js +35 -6
- package/dist/detect.js.map +1 -1
- package/dist/hooks.d.ts +29 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +196 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +9 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/install.d.ts +25 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +155 -0
- package/dist/install.js.map +1 -0
- package/dist/moments.d.ts +21 -0
- package/dist/moments.d.ts.map +1 -0
- package/dist/moments.js +52 -0
- package/dist/moments.js.map +1 -0
- package/dist/off.d.ts +24 -0
- package/dist/off.d.ts.map +1 -0
- package/dist/off.js +36 -0
- package/dist/off.js.map +1 -0
- package/dist/privacy.d.ts +8 -0
- package/dist/privacy.d.ts.map +1 -1
- package/dist/privacy.js +27 -1
- package/dist/privacy.js.map +1 -1
- package/dist/qr.d.ts +29 -0
- package/dist/qr.d.ts.map +1 -0
- package/dist/qr.js +92 -0
- package/dist/qr.js.map +1 -0
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +61 -1
- package/dist/render.js.map +1 -1
- package/dist/report.d.ts.map +1 -1
- package/dist/report.js +115 -1
- package/dist/report.js.map +1 -1
- package/dist/runtime.d.ts +18 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +70 -0
- package/dist/runtime.js.map +1 -0
- package/dist/secret.d.ts +9 -0
- package/dist/secret.d.ts.map +1 -0
- package/dist/secret.js +32 -0
- package/dist/secret.js.map +1 -0
- package/dist/setup.d.ts +18 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +155 -0
- package/dist/setup.js.map +1 -0
- package/dist/sources/claude.d.ts.map +1 -1
- package/dist/sources/claude.js +162 -18
- package/dist/sources/claude.js.map +1 -1
- package/dist/sources/codex.d.ts.map +1 -1
- package/dist/sources/codex.js +240 -21
- package/dist/sources/codex.js.map +1 -1
- package/dist/sources/cursor.d.ts.map +1 -1
- package/dist/sources/cursor.js +1 -0
- package/dist/sources/cursor.js.map +1 -1
- package/dist/sources/gemini.d.ts.map +1 -1
- package/dist/sources/gemini.js +85 -8
- package/dist/sources/gemini.js.map +1 -1
- package/dist/types.d.ts +109 -6
- package/dist/types.d.ts.map +1 -1
- package/llms-install.md +29 -0
- package/package.json +3 -2
package/dist/setup.js
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import { ConnectionExpiredError, openVerificationUri, pollDeviceLogin, readCredentials, removeCredentials, startDeviceLogin, syncSnapshot, teerasBaseUrl, writeCredentials, } from "./cloud.js";
|
|
3
|
+
import { collectAfterhours } from "./collect.js";
|
|
4
|
+
import { installHooks } from "./install.js";
|
|
5
|
+
import { tildePath } from "./privacy.js";
|
|
6
|
+
import { qrBlock } from "./qr.js";
|
|
7
|
+
import { renderReport } from "./render.js";
|
|
8
|
+
import { reportFrom } from "./report.js";
|
|
9
|
+
import { hookCommand, installRuntime } from "./runtime.js";
|
|
10
|
+
import { markSyncSuccess } from "./autosync.js";
|
|
11
|
+
/**
|
|
12
|
+
* "Connected" used to mean three different things at once here — account
|
|
13
|
+
* signed in, hooks installed, an agent detected — which made the screen
|
|
14
|
+
* unreadable at a glance. The account gets its own word ("signed in"); an
|
|
15
|
+
* agent is `measuring` once its hooks are in place, or `not found` if the
|
|
16
|
+
* agent itself never showed up. One agent per line: a separator between
|
|
17
|
+
* agents reads as another state when a state is two words.
|
|
18
|
+
*
|
|
19
|
+
* The `agents` label is printed once and the rest of the block indented under
|
|
20
|
+
* it, so the column reads like the single `hooks`/`sync` rows around it
|
|
21
|
+
* rather than like a repeated key.
|
|
22
|
+
*/
|
|
23
|
+
function hookLine(results) {
|
|
24
|
+
const label = (result) => result.agent === "claude-code" ? "Claude Code" : "Codex";
|
|
25
|
+
const state = (result) => {
|
|
26
|
+
switch (result.action) {
|
|
27
|
+
case "skipped":
|
|
28
|
+
return "not found";
|
|
29
|
+
case "installed":
|
|
30
|
+
case "already-installed":
|
|
31
|
+
return "measuring";
|
|
32
|
+
case "unreadable":
|
|
33
|
+
return "settings file unreadable, left untouched";
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
return results.map((result, index) => ` ${index === 0 ? "agents" : " "} ${label(result).padEnd(12)}${state(result)}`);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* The text output is written to be quoted verbatim by a coding agent to its
|
|
40
|
+
* user. Keep every line meaningful when read on a phone, out of context.
|
|
41
|
+
*/
|
|
42
|
+
export async function runSetup(options = {}) {
|
|
43
|
+
const home = options.home ?? homedir();
|
|
44
|
+
const json = options.json === true;
|
|
45
|
+
const out = options.out ?? ((text) => process.stdout.write(text));
|
|
46
|
+
const openUri = options.openUri ?? openVerificationUri;
|
|
47
|
+
const isTty = options.isTty ?? process.stdout.isTTY === true;
|
|
48
|
+
// Hooks must survive the npx temp directory, so the runtime is copied into
|
|
49
|
+
// the home first and the fragments point at that absolute path. A hook we
|
|
50
|
+
// cannot run is silent, missing measurement — refuse rather than report it.
|
|
51
|
+
let cliPath;
|
|
52
|
+
try {
|
|
53
|
+
cliPath = installRuntime(home, options.runtimeSourceDir);
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
// The reason has to survive — "check that your home directory is
|
|
57
|
+
// writable" is wrong guidance for a full disk, and a bare failure with no
|
|
58
|
+
// reason at all is unfixable. `error.code` (EACCES/ENOSPC/EROFS) is both
|
|
59
|
+
// the most diagnostic part and the part that carries no path; when there
|
|
60
|
+
// is no code, the message goes through `tildePath` so a home prefix
|
|
61
|
+
// cannot ride along into a transcript.
|
|
62
|
+
const code = error?.code;
|
|
63
|
+
const reason = typeof code === "string" && code.length > 0
|
|
64
|
+
? code
|
|
65
|
+
: tildePath(error instanceof Error ? error.message : String(error), home);
|
|
66
|
+
throw new Error(`could not install the local hook command (${reason}). Nothing was changed. EACCES or EROFS means ~/.teeras is not writable; ENOSPC means the disk is full. Clear that, then run \`npx @teeras/afterhours@latest setup\` again.`);
|
|
67
|
+
}
|
|
68
|
+
const hooks = installHooks(home, {
|
|
69
|
+
claude: hookCommand(cliPath),
|
|
70
|
+
codex: hookCommand(cliPath, true),
|
|
71
|
+
});
|
|
72
|
+
if (json) {
|
|
73
|
+
const redacted = hooks.map((result) => ({ ...result, path: tildePath(result.path, home) }));
|
|
74
|
+
out(`${JSON.stringify({ event: "hooks", results: redacted })}\n`);
|
|
75
|
+
}
|
|
76
|
+
// Collected once and reused for both the sync payload and the closing
|
|
77
|
+
// report — the same counts back the ask and the payoff in one breath.
|
|
78
|
+
const snapshot = collectAfterhours({ home });
|
|
79
|
+
let credentials = readCredentials(home);
|
|
80
|
+
let alreadyConnected = false;
|
|
81
|
+
if (credentials) {
|
|
82
|
+
try {
|
|
83
|
+
await syncSnapshot(snapshot, credentials, options.fetcher);
|
|
84
|
+
alreadyConnected = true;
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
if (!(error instanceof ConnectionExpiredError))
|
|
88
|
+
throw error;
|
|
89
|
+
// The server rejected a token that still looks valid locally. Clear it
|
|
90
|
+
// and reconnect in this same run — setup must never dead-end on stale
|
|
91
|
+
// state or bounce the user to another command.
|
|
92
|
+
removeCredentials(home);
|
|
93
|
+
credentials = null;
|
|
94
|
+
if (json)
|
|
95
|
+
out(`${JSON.stringify({ event: "reconnect", reason: "connection expired" })}\n`);
|
|
96
|
+
else
|
|
97
|
+
out("\n your previous connection expired — reconnecting…\n");
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (!credentials) {
|
|
101
|
+
const baseUrl = teerasBaseUrl();
|
|
102
|
+
const grant = await startDeviceLogin(baseUrl, options.fetcher);
|
|
103
|
+
if (json) {
|
|
104
|
+
out(`${JSON.stringify({ event: "code", userCode: grant.userCode, verificationUri: grant.verificationUri, expiresIn: grant.expiresIn })}\n`);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
const host = new URL(grant.verificationUri).host;
|
|
108
|
+
out([
|
|
109
|
+
"",
|
|
110
|
+
" teeras · one tap to connect",
|
|
111
|
+
"",
|
|
112
|
+
" On this computer: open",
|
|
113
|
+
` ${grant.verificationUri}`,
|
|
114
|
+
" then approve. (Sign in with Google if asked.)",
|
|
115
|
+
"",
|
|
116
|
+
` On your phone instead: go to ${host}/connect and enter ${grant.userCode}`,
|
|
117
|
+
"",
|
|
118
|
+
" While you work, agent activity counts (never content) sync to your Teeras account.",
|
|
119
|
+
" Waiting here while you continue…",
|
|
120
|
+
"",
|
|
121
|
+
].join("\n"));
|
|
122
|
+
openUri(grant.verificationUri);
|
|
123
|
+
}
|
|
124
|
+
const token = await pollDeviceLogin(baseUrl, grant, { fetcher: options.fetcher, sleep: options.sleep });
|
|
125
|
+
credentials = {
|
|
126
|
+
baseUrl,
|
|
127
|
+
accessToken: token.accessToken,
|
|
128
|
+
deviceId: token.deviceId,
|
|
129
|
+
connectedAt: new Date().toISOString(),
|
|
130
|
+
expiresAt: token.expiresAt,
|
|
131
|
+
};
|
|
132
|
+
writeCredentials(credentials, home);
|
|
133
|
+
await syncSnapshot(snapshot, credentials, options.fetcher);
|
|
134
|
+
}
|
|
135
|
+
markSyncSuccess(home);
|
|
136
|
+
if (json) {
|
|
137
|
+
out(`${JSON.stringify({ event: "connected", alreadyConnected, deviceId: credentials.deviceId, firstSync: !alreadyConnected })}\n`);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
// The payoff, not just a status line: the same week report `trs week`
|
|
141
|
+
// prints, so the value lands in the same breath as the ask.
|
|
142
|
+
out(renderReport(snapshot, reportFrom(snapshot)));
|
|
143
|
+
out([
|
|
144
|
+
"",
|
|
145
|
+
alreadyConnected ? " ✓ signed in — refreshed your setup" : " ✓ signed in",
|
|
146
|
+
"",
|
|
147
|
+
...hookLine(hooks),
|
|
148
|
+
" hooks load when an agent starts, so measuring begins with your next session — not this one.",
|
|
149
|
+
" sync your counts-only week is on web and mobile · updates while you work",
|
|
150
|
+
"",
|
|
151
|
+
...qrBlock(isTty),
|
|
152
|
+
"",
|
|
153
|
+
].join("\n"));
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/sources/claude.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/sources/claude.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,aAAa,CAAC;AAiB9D,eAAO,MAAM,YAAY,EAAE,aAkL1B,CAAC"}
|
package/dist/sources/claude.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { readFileSync } from "node:fs";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { basename, isAbsolute, join, resolve, sep } from "node:path";
|
|
4
|
+
import { addToken, delegationEpisode, emptySource, finishSource, humanWaitSamples, inWindow, latencyStats, modelActivityFrom, opaqueEpisodeId, optionalFiniteNumber, timestamp, } from "../activity.js";
|
|
4
5
|
import { isDirectory, recentFiles } from "../files.js";
|
|
6
|
+
import { readContentFreeHookEvents } from "../hooks.js";
|
|
5
7
|
import { parseLines, record } from "./shared.js";
|
|
6
8
|
function isHumanMessage(message) {
|
|
7
9
|
const content = message.content;
|
|
@@ -11,16 +13,27 @@ function isHumanMessage(message) {
|
|
|
11
13
|
return false;
|
|
12
14
|
return content.some((part) => record(part)?.type !== "tool_result");
|
|
13
15
|
}
|
|
16
|
+
function claudeRoots(home) {
|
|
17
|
+
const roots = [join(home, ".claude")];
|
|
18
|
+
const configured = process.env.CLAUDE_CONFIG_DIR?.trim();
|
|
19
|
+
if (home === homedir() && configured && isAbsolute(configured))
|
|
20
|
+
roots.push(configured);
|
|
21
|
+
return [...new Set(roots.map((root) => resolve(root)))];
|
|
22
|
+
}
|
|
14
23
|
export const claudeSource = {
|
|
15
24
|
id: "claude-code",
|
|
16
25
|
name: "Claude Code",
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const
|
|
26
|
+
version: "claude-code-v3",
|
|
27
|
+
collect({ home, sinceMs, untilMs, episodeKeySecret }) {
|
|
28
|
+
const roots = claudeRoots(home);
|
|
29
|
+
const source = emptySource("claude-code", "Claude Code", roots.some(isDirectory));
|
|
20
30
|
if (!source.configured)
|
|
21
31
|
return source;
|
|
22
32
|
const events = [];
|
|
23
|
-
|
|
33
|
+
const modelTurnEvents = [];
|
|
34
|
+
const episodeIds = new Set();
|
|
35
|
+
for (const path of roots.flatMap((root) => recentFiles(join(root, "projects"), sinceMs, (name) => name.endsWith(".jsonl")))
|
|
36
|
+
.filter((path) => !path.includes(`${sep}subagents${sep}`))) {
|
|
24
37
|
let rows;
|
|
25
38
|
try {
|
|
26
39
|
rows = parseLines(readFileSync(path, "utf8"));
|
|
@@ -28,34 +41,165 @@ export const claudeSource = {
|
|
|
28
41
|
catch {
|
|
29
42
|
continue;
|
|
30
43
|
}
|
|
31
|
-
|
|
44
|
+
const humanEvents = [];
|
|
45
|
+
const completedEvents = [];
|
|
46
|
+
const assistantEvents = [];
|
|
47
|
+
const turnDurationSamples = [];
|
|
48
|
+
const sessionTokens = { input: null, cached: null, output: null, reasoning: null };
|
|
49
|
+
let modelFamily = null;
|
|
32
50
|
for (const row of rows) {
|
|
33
51
|
const at = timestamp(row.timestamp);
|
|
34
52
|
if (at == null || !inWindow(at, sinceMs, untilMs))
|
|
35
53
|
continue;
|
|
54
|
+
// Claude Code times its own turns; the duration is a measurement, not
|
|
55
|
+
// content, and the only value read off the system row.
|
|
56
|
+
if (row.type === "system" && row.subtype === "turn_duration") {
|
|
57
|
+
const duration = optionalFiniteNumber(row.durationMs);
|
|
58
|
+
if (duration != null)
|
|
59
|
+
turnDurationSamples.push(duration);
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
36
62
|
const message = record(row.message);
|
|
37
63
|
if (!message)
|
|
38
64
|
continue;
|
|
39
|
-
if (row.type === "user" &&
|
|
40
|
-
|
|
41
|
-
|
|
65
|
+
if (row.type === "user" &&
|
|
66
|
+
row.isMeta !== true &&
|
|
67
|
+
row.isSidechain !== true &&
|
|
68
|
+
isHumanMessage(message)) {
|
|
69
|
+
humanEvents.push({ at, kind: "human" });
|
|
42
70
|
}
|
|
43
71
|
if (row.type === "assistant") {
|
|
44
72
|
const usage = record(message.usage);
|
|
45
73
|
if (!usage)
|
|
46
74
|
continue;
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
75
|
+
const input = optionalFiniteNumber(usage.input_tokens);
|
|
76
|
+
const cacheRead = optionalFiniteNumber(usage.cache_read_input_tokens);
|
|
77
|
+
const cacheCreation = optionalFiniteNumber(usage.cache_creation_input_tokens);
|
|
78
|
+
const cached = cacheRead == null && cacheCreation == null
|
|
79
|
+
? null
|
|
80
|
+
: (cacheRead ?? 0) + (cacheCreation ?? 0);
|
|
81
|
+
const output = optionalFiniteNumber(usage.output_tokens);
|
|
82
|
+
source.tokens.input = addToken(source.tokens.input, input);
|
|
83
|
+
source.tokens.cached = addToken(source.tokens.cached, cached);
|
|
84
|
+
source.tokens.output = addToken(source.tokens.output, output);
|
|
85
|
+
sessionTokens.input = addToken(sessionTokens.input, input);
|
|
86
|
+
sessionTokens.cached = addToken(sessionTokens.cached, cached);
|
|
87
|
+
sessionTokens.output = addToken(sessionTokens.output, output);
|
|
88
|
+
const model = typeof message.model === "string" && /^[a-z0-9][a-z0-9._:-]{0,79}$/i.test(message.model)
|
|
89
|
+
? message.model
|
|
90
|
+
: null;
|
|
91
|
+
if (model)
|
|
92
|
+
modelFamily = model;
|
|
93
|
+
assistantEvents.push({ at, kind: "agent", model: model ?? undefined });
|
|
94
|
+
if (message.stop_reason === "end_turn")
|
|
95
|
+
completedEvents.push({ at, kind: "agent", model: model ?? undefined });
|
|
53
96
|
}
|
|
54
97
|
}
|
|
55
|
-
|
|
98
|
+
// Every assistant API response is observable agent ACTIVITY (it drives
|
|
99
|
+
// active-minute and runway estimates); `end_turn` responses additionally
|
|
100
|
+
// mark completed user-visible TURNS (they drive turn counts and status).
|
|
101
|
+
const sessionEvents = [...humanEvents, ...assistantEvents];
|
|
102
|
+
if (sessionEvents.length > 0) {
|
|
103
|
+
const id = opaqueEpisodeId(episodeKeySecret, "claude-code", basename(path, ".jsonl"));
|
|
104
|
+
if (episodeIds.has(id))
|
|
105
|
+
continue;
|
|
106
|
+
episodeIds.add(id);
|
|
107
|
+
events.push(...sessionEvents);
|
|
108
|
+
// Turn semantics mirror the episode's: completed turns when the session
|
|
109
|
+
// observed any, otherwise every assistant response.
|
|
110
|
+
modelTurnEvents.push(...(completedEvents.length > 0 ? completedEvents : assistantEvents));
|
|
56
111
|
source.sessions += 1;
|
|
112
|
+
const episode = delegationEpisode({
|
|
113
|
+
id,
|
|
114
|
+
adapterVersion: "claude-code-v3",
|
|
115
|
+
events: sessionEvents,
|
|
116
|
+
tokens: sessionTokens,
|
|
117
|
+
untilMs,
|
|
118
|
+
confidence: completedEvents.length > 0 ? "high" : "medium",
|
|
119
|
+
modelFamily,
|
|
120
|
+
latency: {
|
|
121
|
+
timeToFirstToken: null,
|
|
122
|
+
turnDuration: latencyStats(turnDurationSamples),
|
|
123
|
+
humanWait: latencyStats(humanWaitSamples(sessionEvents)),
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
if (episode) {
|
|
127
|
+
if (completedEvents.length > 0) {
|
|
128
|
+
episode.status = "observed_end";
|
|
129
|
+
episode.agentTurns = completedEvents.length;
|
|
130
|
+
}
|
|
131
|
+
source.episodes.push(episode);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
const hookGroups = new Map();
|
|
136
|
+
for (const event of readContentFreeHookEvents(home, sinceMs, untilMs)) {
|
|
137
|
+
if (event.sourceId !== "claude-code")
|
|
138
|
+
continue;
|
|
139
|
+
const group = hookGroups.get(event.episodeId) ?? [];
|
|
140
|
+
group.push(event);
|
|
141
|
+
hookGroups.set(event.episodeId, group);
|
|
142
|
+
}
|
|
143
|
+
const episodeById = new Map(source.episodes.map((episode) => [episode.id, episode]));
|
|
144
|
+
for (const [id, hookEvents] of hookGroups) {
|
|
145
|
+
const existing = episodeById.get(id);
|
|
146
|
+
const approvalRequests = hookEvents.filter((event) => event.signal === "permission_requested").length;
|
|
147
|
+
const failureEvents = hookEvents.filter((event) => event.signal === "agent_failed").length;
|
|
148
|
+
const modelFamily = hookEvents.find((event) => event.modelFamily)?.modelFamily ?? null;
|
|
149
|
+
const lastSignal = hookEvents.at(-1)?.signal;
|
|
150
|
+
if (existing) {
|
|
151
|
+
existing.approvalRequests = approvalRequests;
|
|
152
|
+
existing.failureEvents = failureEvents;
|
|
153
|
+
existing.modelFamily ??= modelFamily;
|
|
154
|
+
const finalHook = hookEvents.at(-1);
|
|
155
|
+
if (finalHook && finalHook.at > Date.parse(existing.endedAt)) {
|
|
156
|
+
existing.endedAt = new Date(finalHook.at).toISOString();
|
|
157
|
+
}
|
|
158
|
+
if (lastSignal === "human_prompt")
|
|
159
|
+
existing.status = "open";
|
|
160
|
+
if (lastSignal === "agent_stopped" ||
|
|
161
|
+
lastSignal === "agent_failed" ||
|
|
162
|
+
lastSignal === "session_ended")
|
|
163
|
+
existing.status = "observed_end";
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
const hookActivity = [];
|
|
167
|
+
for (const event of hookEvents) {
|
|
168
|
+
if (event.signal === "human_prompt")
|
|
169
|
+
hookActivity.push({ at: event.at, kind: "human" });
|
|
170
|
+
if (event.signal === "agent_stopped" || event.signal === "agent_failed") {
|
|
171
|
+
hookActivity.push({ at: event.at, kind: "agent" });
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
const episode = delegationEpisode({
|
|
175
|
+
id,
|
|
176
|
+
adapterVersion: "claude-hook-v1",
|
|
177
|
+
events: hookActivity,
|
|
178
|
+
tokens: { input: null, cached: null, output: null, reasoning: null },
|
|
179
|
+
untilMs,
|
|
180
|
+
confidence: "medium",
|
|
181
|
+
modelFamily,
|
|
182
|
+
});
|
|
183
|
+
if (!episode)
|
|
184
|
+
continue;
|
|
185
|
+
episode.approvalRequests = approvalRequests;
|
|
186
|
+
episode.failureEvents = failureEvents;
|
|
187
|
+
if (lastSignal === "agent_stopped" ||
|
|
188
|
+
lastSignal === "agent_failed" ||
|
|
189
|
+
lastSignal === "session_ended")
|
|
190
|
+
episode.status = "observed_end";
|
|
191
|
+
source.episodes.push(episode);
|
|
192
|
+
source.sessions += 1;
|
|
193
|
+
events.push(...hookActivity);
|
|
194
|
+
}
|
|
195
|
+
const finished = finishSource(source, events);
|
|
196
|
+
// Buckets and minutes come from dense activity events; the source-level
|
|
197
|
+
// turn count keeps user-visible turn semantics from the episodes.
|
|
198
|
+
if (finished.episodes.length > 0) {
|
|
199
|
+
finished.agentTurns = finished.episodes.reduce((sum, episode) => sum + episode.agentTurns, 0);
|
|
57
200
|
}
|
|
58
|
-
|
|
201
|
+
finished.models = modelActivityFrom(events, modelTurnEvents);
|
|
202
|
+
return finished;
|
|
59
203
|
},
|
|
60
204
|
};
|
|
61
205
|
//# sourceMappingURL=claude.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/sources/claude.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/sources/claude.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/sources/codex.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/sources/codex.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,aAAa,CAAC;AAsF9D,eAAO,MAAM,WAAW,EAAE,aA0LzB,CAAC"}
|