@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.
Files changed (84) hide show
  1. package/README.md +101 -15
  2. package/dist/activity.d.ts +35 -1
  3. package/dist/activity.d.ts.map +1 -1
  4. package/dist/activity.js +148 -1
  5. package/dist/activity.js.map +1 -1
  6. package/dist/autosync.d.ts +22 -0
  7. package/dist/autosync.d.ts.map +1 -0
  8. package/dist/autosync.js +85 -0
  9. package/dist/autosync.js.map +1 -0
  10. package/dist/cli.js +112 -9
  11. package/dist/cli.js.map +1 -1
  12. package/dist/cloud.d.ts +5 -0
  13. package/dist/cloud.d.ts.map +1 -1
  14. package/dist/cloud.js +10 -2
  15. package/dist/cloud.js.map +1 -1
  16. package/dist/collect.d.ts +3 -1
  17. package/dist/collect.d.ts.map +1 -1
  18. package/dist/collect.js +19 -7
  19. package/dist/collect.js.map +1 -1
  20. package/dist/detect.d.ts.map +1 -1
  21. package/dist/detect.js +35 -6
  22. package/dist/detect.js.map +1 -1
  23. package/dist/hooks.d.ts +29 -0
  24. package/dist/hooks.d.ts.map +1 -0
  25. package/dist/hooks.js +196 -0
  26. package/dist/hooks.js.map +1 -0
  27. package/dist/index.d.ts +9 -2
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +8 -1
  30. package/dist/index.js.map +1 -1
  31. package/dist/install.d.ts +25 -0
  32. package/dist/install.d.ts.map +1 -0
  33. package/dist/install.js +155 -0
  34. package/dist/install.js.map +1 -0
  35. package/dist/moments.d.ts +21 -0
  36. package/dist/moments.d.ts.map +1 -0
  37. package/dist/moments.js +52 -0
  38. package/dist/moments.js.map +1 -0
  39. package/dist/off.d.ts +24 -0
  40. package/dist/off.d.ts.map +1 -0
  41. package/dist/off.js +36 -0
  42. package/dist/off.js.map +1 -0
  43. package/dist/privacy.d.ts +8 -0
  44. package/dist/privacy.d.ts.map +1 -1
  45. package/dist/privacy.js +27 -1
  46. package/dist/privacy.js.map +1 -1
  47. package/dist/qr.d.ts +29 -0
  48. package/dist/qr.d.ts.map +1 -0
  49. package/dist/qr.js +92 -0
  50. package/dist/qr.js.map +1 -0
  51. package/dist/render.d.ts.map +1 -1
  52. package/dist/render.js +61 -1
  53. package/dist/render.js.map +1 -1
  54. package/dist/report.d.ts.map +1 -1
  55. package/dist/report.js +115 -1
  56. package/dist/report.js.map +1 -1
  57. package/dist/runtime.d.ts +18 -0
  58. package/dist/runtime.d.ts.map +1 -0
  59. package/dist/runtime.js +70 -0
  60. package/dist/runtime.js.map +1 -0
  61. package/dist/secret.d.ts +9 -0
  62. package/dist/secret.d.ts.map +1 -0
  63. package/dist/secret.js +32 -0
  64. package/dist/secret.js.map +1 -0
  65. package/dist/setup.d.ts +18 -0
  66. package/dist/setup.d.ts.map +1 -0
  67. package/dist/setup.js +155 -0
  68. package/dist/setup.js.map +1 -0
  69. package/dist/sources/claude.d.ts.map +1 -1
  70. package/dist/sources/claude.js +162 -18
  71. package/dist/sources/claude.js.map +1 -1
  72. package/dist/sources/codex.d.ts.map +1 -1
  73. package/dist/sources/codex.js +240 -21
  74. package/dist/sources/codex.js.map +1 -1
  75. package/dist/sources/cursor.d.ts.map +1 -1
  76. package/dist/sources/cursor.js +1 -0
  77. package/dist/sources/cursor.js.map +1 -1
  78. package/dist/sources/gemini.d.ts.map +1 -1
  79. package/dist/sources/gemini.js +85 -8
  80. package/dist/sources/gemini.js.map +1 -1
  81. package/dist/types.d.ts +109 -6
  82. package/dist/types.d.ts.map +1 -1
  83. package/llms-install.md +29 -0
  84. 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
- input: number;
6
- cached: number;
7
- output: number;
8
- reasoning: number;
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: 2;
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 {
@@ -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;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,QAAQ,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,cAAc,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,yBAAyB,CAAC;IAChC,QAAQ,EAAE,SAAS;QACjB,mBAAmB;QACnB,qBAAqB;QACrB,aAAa;QACb,gBAAgB;QAChB,gBAAgB;KACjB,CAAC;IACF,aAAa,EAAE,SAAS;QACtB,aAAa;QACb,aAAa;QACb,cAAc;QACd,kBAAkB;QAClB,qBAAqB;QACrB,YAAY;KACb,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,CAAC,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,QAAQ,EAAE,YAAY,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,QAAQ,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,cAAc,CAAC;CAC9C;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,QAAQ,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,WAAW,GAAG,kBAAkB,CAAC;IAC7C,MAAM,EAAE,MAAM,CAAC;CAChB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -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.1.1",
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"