@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/types.d.ts
CHANGED
|
@@ -2,10 +2,57 @@
|
|
|
2
2
|
export type SourceId = string;
|
|
3
3
|
export type Fidelity = "activity" | "sessions" | "detected" | "none";
|
|
4
4
|
export interface TokenCounts {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
/** Null means the source did not expose this counter. Zero means observed none. */
|
|
6
|
+
input: number | null;
|
|
7
|
+
cached: number | null;
|
|
8
|
+
output: number | null;
|
|
9
|
+
reasoning: number | null;
|
|
10
|
+
}
|
|
11
|
+
export type EpisodeConfidence = "high" | "medium" | "low";
|
|
12
|
+
export type EpisodeStatus = "open" | "observed_end";
|
|
13
|
+
/** Nearest-rank percentiles over one episode's measured turns. */
|
|
14
|
+
export interface LatencyStats {
|
|
15
|
+
samples: number;
|
|
16
|
+
p50Ms: number;
|
|
17
|
+
p90Ms: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Content-free speed measurements. Every field is null when the source does
|
|
21
|
+
* not measure it — explicit missingness, never a guessed zero. `humanWait` is
|
|
22
|
+
* the estimated gap between a human message and the first observed agent
|
|
23
|
+
* activity that answers it.
|
|
24
|
+
*/
|
|
25
|
+
export interface EpisodeLatency {
|
|
26
|
+
timeToFirstToken: LatencyStats | null;
|
|
27
|
+
turnDuration: LatencyStats | null;
|
|
28
|
+
humanWait: LatencyStats | null;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* A content-free unit of human supervision. The opaque id is HMAC-derived
|
|
32
|
+
* locally from the source session and cannot be reversed into a path.
|
|
33
|
+
*/
|
|
34
|
+
export interface DelegationEpisode {
|
|
35
|
+
id: string;
|
|
36
|
+
startedAt: string;
|
|
37
|
+
endedAt: string;
|
|
38
|
+
localDate: string;
|
|
39
|
+
localStartHour: number;
|
|
40
|
+
status: EpisodeStatus;
|
|
41
|
+
confidence: EpisodeConfidence;
|
|
42
|
+
metricVersion: "delegation-episode-v1";
|
|
43
|
+
adapterVersion: string;
|
|
44
|
+
modelFamily: string | null;
|
|
45
|
+
agentTurns: number;
|
|
46
|
+
humanCheckIns: number;
|
|
47
|
+
humanReEntries: number;
|
|
48
|
+
agentActiveMinutes: number;
|
|
49
|
+
humanAttentionMinutes: number;
|
|
50
|
+
longestAutonomousRunMinutes: number;
|
|
51
|
+
approvalRequests: number | null;
|
|
52
|
+
failureEvents: number | null;
|
|
53
|
+
reworkEvents: number | null;
|
|
54
|
+
latency: EpisodeLatency;
|
|
55
|
+
tokens: TokenCounts;
|
|
9
56
|
}
|
|
10
57
|
export interface ActivityBucket {
|
|
11
58
|
/** ISO timestamp at the beginning of a local clock hour. */
|
|
@@ -18,6 +65,16 @@ export interface ActivityBucket {
|
|
|
18
65
|
agentActiveMinutes: number;
|
|
19
66
|
humanAttentionMinutes: number;
|
|
20
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* One model's share of a source's observed work. Turns are attributed to the
|
|
70
|
+
* model that produced them, so a session that switched models mid-way splits
|
|
71
|
+
* across entries instead of being credited entirely to the last model seen.
|
|
72
|
+
*/
|
|
73
|
+
export interface ModelActivity {
|
|
74
|
+
model: string;
|
|
75
|
+
agentTurns: number;
|
|
76
|
+
agentActiveMinutes: number;
|
|
77
|
+
}
|
|
21
78
|
export interface SourceSnapshot {
|
|
22
79
|
id: SourceId;
|
|
23
80
|
name: string;
|
|
@@ -27,7 +84,9 @@ export interface SourceSnapshot {
|
|
|
27
84
|
agentTurns: number;
|
|
28
85
|
humanCheckIns: number;
|
|
29
86
|
tokens: TokenCounts;
|
|
87
|
+
models: ModelActivity[];
|
|
30
88
|
buckets: ActivityBucket[];
|
|
89
|
+
episodes: DelegationEpisode[];
|
|
31
90
|
}
|
|
32
91
|
export interface DataBoundary {
|
|
33
92
|
mode: "local-first";
|
|
@@ -37,7 +96,12 @@ export interface DataBoundary {
|
|
|
37
96
|
"local date and hour",
|
|
38
97
|
"event kinds",
|
|
39
98
|
"session counts",
|
|
40
|
-
"token counters"
|
|
99
|
+
"token counters",
|
|
100
|
+
"content-free delegation episodes",
|
|
101
|
+
"measurement provenance and missingness",
|
|
102
|
+
"agent and model family",
|
|
103
|
+
"approval and lifecycle signals",
|
|
104
|
+
"reporting timezone"
|
|
41
105
|
];
|
|
42
106
|
neverRetained: readonly [
|
|
43
107
|
"prompt text",
|
|
@@ -49,32 +113,71 @@ export interface DataBoundary {
|
|
|
49
113
|
];
|
|
50
114
|
}
|
|
51
115
|
export interface AfterhoursSnapshot {
|
|
52
|
-
schemaVersion:
|
|
116
|
+
schemaVersion: 3;
|
|
53
117
|
generatedAt: string;
|
|
54
118
|
since: string;
|
|
55
119
|
until: string;
|
|
120
|
+
/**
|
|
121
|
+
* IANA timezone of the collecting machine (e.g. "Asia/Jerusalem"), or null
|
|
122
|
+
* when the runtime cannot name one. Buckets are already reduced to the local
|
|
123
|
+
* clock; this names which clock, so the server can keep day boundaries
|
|
124
|
+
* honest when the person travels or reads their dashboard elsewhere.
|
|
125
|
+
*/
|
|
126
|
+
tz: string | null;
|
|
56
127
|
sources: SourceSnapshot[];
|
|
57
128
|
boundary: DataBoundary;
|
|
58
129
|
}
|
|
59
130
|
export interface SourceAdapter {
|
|
60
131
|
id: SourceId;
|
|
61
132
|
name: string;
|
|
133
|
+
version: string;
|
|
62
134
|
collect(input: CollectInput): SourceSnapshot;
|
|
63
135
|
}
|
|
64
136
|
export interface CollectInput {
|
|
65
137
|
home: string;
|
|
66
138
|
sinceMs: number;
|
|
67
139
|
untilMs: number;
|
|
140
|
+
/** Secret material used only to make source session identifiers opaque. */
|
|
141
|
+
episodeKeySecret: string;
|
|
142
|
+
}
|
|
143
|
+
/** The daily payoff: today's numbers against the person's own typical day. */
|
|
144
|
+
export interface AfterhoursToday {
|
|
145
|
+
localDate: string;
|
|
146
|
+
lifeReturnedMinutes: number;
|
|
147
|
+
agentActiveMinutes: number;
|
|
148
|
+
humanAttentionMinutes: number;
|
|
149
|
+
longestRunMinutes: number;
|
|
150
|
+
longestRunSource: string | null;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Today's model responsiveness against the person's own window. Values are
|
|
154
|
+
* sample-weighted medians of episode medians — an estimate, labeled as one.
|
|
155
|
+
*/
|
|
156
|
+
export interface ModelSpeed {
|
|
157
|
+
todayHumanWaitP50Ms: number | null;
|
|
158
|
+
todayTurnDurationP50Ms: number | null;
|
|
159
|
+
baselineHumanWaitP50Ms: number | null;
|
|
160
|
+
baselineTurnDurationP50Ms: number | null;
|
|
68
161
|
}
|
|
69
162
|
export interface AfterhoursReport {
|
|
163
|
+
/** Clock time returned: agent wall-clock coverage minus supervised time. */
|
|
70
164
|
lifeReturnedMinutes: number;
|
|
165
|
+
/** Total agent work observed. Exceeds the clock when sessions run in parallel. */
|
|
71
166
|
agentActiveMinutes: number;
|
|
167
|
+
/** Hours of the day that had agent activity, counting each hour once. */
|
|
168
|
+
agentWallClockMinutes: number;
|
|
169
|
+
/** Agent work divided by clock time — how many ran at once. Null with no activity. */
|
|
170
|
+
parallelRatio: number | null;
|
|
72
171
|
humanAttentionMinutes: number;
|
|
73
172
|
afterHoursCheckIns: number;
|
|
74
173
|
protectedNights: number;
|
|
75
174
|
observedNights: number;
|
|
76
175
|
agentTurns: number;
|
|
77
176
|
humanCheckIns: number;
|
|
177
|
+
today: AfterhoursToday;
|
|
178
|
+
/** Median of other observed days in the window; null on the first measured day. */
|
|
179
|
+
baselineLifeReturnedMinutes: number | null;
|
|
180
|
+
modelSpeed: ModelSpeed;
|
|
78
181
|
nextMove: string;
|
|
79
182
|
}
|
|
80
183
|
export interface DetectedAgent {
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAE9B,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;AAErE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/llms-install.md
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Installing Teeras Afterhours (instructions for AI agents)
|
|
2
|
+
|
|
3
|
+
You are likely a coding agent (Claude Code, Codex, Gemini CLI, or similar)
|
|
4
|
+
installing this package for your user. Follow these steps:
|
|
5
|
+
|
|
6
|
+
1. Run: `npx @teeras/afterhours setup`
|
|
7
|
+
2. The command prints a short code and a `teeras.com` link. **Relay both to
|
|
8
|
+
your user verbatim** — they open the link on any device (their phone is
|
|
9
|
+
ideal), enter the code, and sign in with Google. The command waits and
|
|
10
|
+
finishes on its own.
|
|
11
|
+
3. If your harness needs structured output, run `npx @teeras/afterhours setup --json`
|
|
12
|
+
and relay the `userCode` and `verificationUri` fields from the `code` event.
|
|
13
|
+
4. After it completes, tell your user: their AI-life balance report is on
|
|
14
|
+
https://teeras.com and the Teeras iOS app, and it updates automatically
|
|
15
|
+
while they work — no further commands needed.
|
|
16
|
+
|
|
17
|
+
Privacy, for you and your user: this tool retains counts only. Prompts, code,
|
|
18
|
+
model output, repository names, working directories, and file paths are never
|
|
19
|
+
read into the sync payload, never uploaded, and never logged. `npx
|
|
20
|
+
@teeras/afterhours privacy` prints the machine-readable boundary.
|
|
21
|
+
|
|
22
|
+
Setup is idempotent — re-running it repairs hooks and refreshes the
|
|
23
|
+
connection. It installs lifecycle hooks for Claude Code and Codex when found,
|
|
24
|
+
which record content-free session signals locally.
|
|
25
|
+
|
|
26
|
+
To undo the install, tell your user to run `npx @teeras/afterhours off` — it
|
|
27
|
+
removes the Teeras hook entries and the local runtime, leaving every other
|
|
28
|
+
hook and their account untouched (`trs logout` separately disconnects the
|
|
29
|
+
account).
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@teeras/afterhours",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "Private AI-life balance and usage analytics for Codex, Claude Code, Gemini CLI, Cursor, and other coding agents.",
|
|
5
5
|
"homepage": "https://teeras.com",
|
|
6
6
|
"keywords": [
|
|
@@ -30,7 +30,8 @@
|
|
|
30
30
|
},
|
|
31
31
|
"files": [
|
|
32
32
|
"dist",
|
|
33
|
-
"README.md"
|
|
33
|
+
"README.md",
|
|
34
|
+
"llms-install.md"
|
|
34
35
|
],
|
|
35
36
|
"publishConfig": {
|
|
36
37
|
"access": "public"
|