@teeras/afterhours 0.2.0 → 0.4.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/README.md +7 -0
- package/dist/activity.d.ts +21 -1
- package/dist/activity.d.ts.map +1 -1
- package/dist/activity.js +72 -0
- package/dist/activity.js.map +1 -1
- package/dist/apprun.d.ts +8 -0
- package/dist/apprun.d.ts.map +1 -0
- package/dist/apprun.js +67 -0
- package/dist/apprun.js.map +1 -0
- package/dist/cli.js +38 -3
- package/dist/cli.js.map +1 -1
- package/dist/cloud.d.ts +43 -0
- package/dist/cloud.d.ts.map +1 -1
- package/dist/cloud.js +127 -0
- package/dist/cloud.js.map +1 -1
- package/dist/collect.d.ts.map +1 -1
- package/dist/collect.js +13 -1
- package/dist/collect.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/macos/spool.d.ts +19 -0
- package/dist/macos/spool.d.ts.map +1 -0
- package/dist/macos/spool.js +117 -0
- package/dist/macos/spool.js.map +1 -0
- package/dist/macos/status.d.ts +32 -0
- package/dist/macos/status.d.ts.map +1 -0
- package/dist/macos/status.js +55 -0
- package/dist/macos/status.js.map +1 -0
- package/dist/privacy.d.ts.map +1 -1
- package/dist/privacy.js +1 -0
- package/dist/privacy.js.map +1 -1
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +23 -0
- package/dist/render.js.map +1 -1
- package/dist/report.d.ts.map +1 -1
- package/dist/report.js +33 -0
- package/dist/report.js.map +1 -1
- package/dist/sources/claude.d.ts.map +1 -1
- package/dist/sources/claude.js +27 -6
- package/dist/sources/claude.js.map +1 -1
- package/dist/sources/codex.d.ts.map +1 -1
- package/dist/sources/codex.js +36 -8
- package/dist/sources/codex.js.map +1 -1
- package/dist/sources/gemini.d.ts.map +1 -1
- package/dist/sources/gemini.js +18 -6
- package/dist/sources/gemini.js.map +1 -1
- package/dist/sources/macosApps.d.ts +7 -0
- package/dist/sources/macosApps.d.ts.map +1 -0
- package/dist/sources/macosApps.js +122 -0
- package/dist/sources/macosApps.js.map +1 -0
- package/dist/types.d.ts +49 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -24,6 +24,7 @@ trs week
|
|
|
24
24
|
trs connect
|
|
25
25
|
trs login
|
|
26
26
|
trs sync
|
|
27
|
+
trs report
|
|
27
28
|
trs sources
|
|
28
29
|
trs privacy
|
|
29
30
|
trs hook-config codex
|
|
@@ -77,6 +78,12 @@ report, or `trs logout` to remove this computer's token. Nothing runs as a
|
|
|
77
78
|
background daemon, the hook itself makes no network call, and there is no
|
|
78
79
|
automatic LLM call.
|
|
79
80
|
|
|
81
|
+
`trs report` opens your web report in the browser, already signed in: this
|
|
82
|
+
computer's device token buys a single-use link that lasts sixty seconds, and
|
|
83
|
+
opening it is what signs the browser in. No password, no second sign-in. On a
|
|
84
|
+
computer that has never connected — or if the link cannot be fetched — it opens
|
|
85
|
+
the plain site instead and you sign in there as usual.
|
|
86
|
+
|
|
80
87
|
The default command (and `trs week`) prints a calm seven-day report. Use
|
|
81
88
|
`--json` to inspect the privacy-safe snapshot consumed by the dashboard and
|
|
82
89
|
optional MCP adapter. The cloud keeps one replaceable snapshot per device per
|
package/dist/activity.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import type { ActivityBucket, DelegationEpisode, EpisodeConfidence, SourceId, SourceSnapshot, TokenCounts } from "./types.js";
|
|
1
|
+
import type { ActivityBucket, DelegationEpisode, EpisodeConfidence, EpisodeLatency, LatencyStats, ModelActivity, SourceId, SourceSnapshot, TokenCounts } from "./types.js";
|
|
2
2
|
export interface LocalEvent {
|
|
3
3
|
at: number;
|
|
4
4
|
kind: "agent" | "human";
|
|
5
|
+
/** Model that produced an agent event; absent when the source names none. */
|
|
6
|
+
model?: string;
|
|
5
7
|
}
|
|
6
8
|
export declare const EMPTY_TOKENS: TokenCounts;
|
|
7
9
|
export declare function finiteNumber(value: unknown): number;
|
|
@@ -11,8 +13,25 @@ export declare function timestamp(value: unknown): number | null;
|
|
|
11
13
|
export declare function inWindow(at: number, sinceMs: number, untilMs: number): boolean;
|
|
12
14
|
/** Local calendar date in the same format buckets and episodes use. */
|
|
13
15
|
export declare function localDateOf(at: number): string;
|
|
16
|
+
export declare const NO_LATENCY: EpisodeLatency;
|
|
17
|
+
export declare function latencyStats(samples: number[]): LatencyStats | null;
|
|
18
|
+
/**
|
|
19
|
+
* Gap from each human message to the first agent activity that follows it.
|
|
20
|
+
* A second human message before any agent activity restarts the clock — the
|
|
21
|
+
* person re-prompted, so the first wait was abandoned, not answered.
|
|
22
|
+
*/
|
|
23
|
+
export declare function humanWaitSamples(events: LocalEvent[]): number[];
|
|
14
24
|
export declare function opaqueEpisodeId(secret: string, sourceId: string, sourceSession: string): string;
|
|
15
25
|
export declare function bucketsFrom(events: LocalEvent[]): ActivityBucket[];
|
|
26
|
+
/**
|
|
27
|
+
* Per-model rollup of a source's work. Minutes use the same gap-to-next rule
|
|
28
|
+
* as the activity buckets, computed over ALL agent events so a model's share
|
|
29
|
+
* is its slice of the real timeline — a per-model subset would misread the
|
|
30
|
+
* gaps between models as one model's idle time. Events that never named a
|
|
31
|
+
* model shape the gaps but credit no entry, so the rollup can honestly sum
|
|
32
|
+
* to less than the source total.
|
|
33
|
+
*/
|
|
34
|
+
export declare function modelActivityFrom(activityEvents: LocalEvent[], turnEvents: LocalEvent[]): ModelActivity[];
|
|
16
35
|
export declare function emptySource(id: SourceId, name: string, configured: boolean): SourceSnapshot;
|
|
17
36
|
export declare function delegationEpisode(input: {
|
|
18
37
|
id: string;
|
|
@@ -22,6 +41,7 @@ export declare function delegationEpisode(input: {
|
|
|
22
41
|
untilMs: number;
|
|
23
42
|
confidence?: EpisodeConfidence;
|
|
24
43
|
modelFamily?: string | null;
|
|
44
|
+
latency?: EpisodeLatency;
|
|
25
45
|
}): DelegationEpisode | null;
|
|
26
46
|
export declare function finishSource(source: SourceSnapshot, events: LocalEvent[], fidelity?: SourceSnapshot["fidelity"]): SourceSnapshot;
|
|
27
47
|
//# sourceMappingURL=activity.d.ts.map
|
package/dist/activity.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../src/activity.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,QAAQ,EACR,cAAc,EACd,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../src/activity.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,cAAc,EACd,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACxB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,YAAY,EAAE,WAA0E,CAAC;AAEtG,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEnD;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAElE;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAElF;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAIvD;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAE9E;AAED,uEAAuE;AACvE,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE9C;AAUD,eAAO,MAAM,UAAU,EAAE,cAAgF,CAAC;AAK1G,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,YAAY,GAAG,IAAI,CAKnE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,EAAE,CAe/D;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAQ/F;AAgBD,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,cAAc,EAAE,CAyBlE;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,cAAc,EAAE,UAAU,EAAE,EAC5B,UAAU,EAAE,UAAU,EAAE,GACvB,aAAa,EAAE,CA2BjB;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,cAAc,CAc3F;AA2BD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B,GAAG,iBAAiB,GAAG,IAAI,CA+B3B;AAED,wBAAgB,YAAY,CAC1B,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,UAAU,EAAE,EACpB,QAAQ,GAAE,cAAc,CAAC,UAAU,CAAc,GAChD,cAAc,CAMhB"}
|
package/dist/activity.js
CHANGED
|
@@ -29,6 +29,39 @@ function localClock(at) {
|
|
|
29
29
|
d.setMinutes(0, 0, 0);
|
|
30
30
|
return { hour: d.toISOString(), localDate, localHour: hourOfDay };
|
|
31
31
|
}
|
|
32
|
+
export const NO_LATENCY = { timeToFirstToken: null, turnDuration: null, humanWait: null };
|
|
33
|
+
/** Waits longer than this read as the person walking away, not the model. */
|
|
34
|
+
const MAX_HUMAN_WAIT_MS = 30 * 60_000;
|
|
35
|
+
export function latencyStats(samples) {
|
|
36
|
+
const clean = samples.filter((value) => Number.isFinite(value) && value >= 0).sort((a, b) => a - b);
|
|
37
|
+
if (clean.length === 0)
|
|
38
|
+
return null;
|
|
39
|
+
const rank = (q) => clean[Math.min(clean.length - 1, Math.ceil(q * clean.length) - 1)];
|
|
40
|
+
return { samples: clean.length, p50Ms: Math.round(rank(0.5)), p90Ms: Math.round(rank(0.9)) };
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Gap from each human message to the first agent activity that follows it.
|
|
44
|
+
* A second human message before any agent activity restarts the clock — the
|
|
45
|
+
* person re-prompted, so the first wait was abandoned, not answered.
|
|
46
|
+
*/
|
|
47
|
+
export function humanWaitSamples(events) {
|
|
48
|
+
const sorted = [...events].sort((a, b) => a.at - b.at);
|
|
49
|
+
const waits = [];
|
|
50
|
+
let pendingHumanAt = null;
|
|
51
|
+
for (const event of sorted) {
|
|
52
|
+
if (event.kind === "human") {
|
|
53
|
+
pendingHumanAt = event.at;
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (pendingHumanAt == null)
|
|
57
|
+
continue;
|
|
58
|
+
const wait = event.at - pendingHumanAt;
|
|
59
|
+
if (wait >= 0 && wait <= MAX_HUMAN_WAIT_MS)
|
|
60
|
+
waits.push(wait);
|
|
61
|
+
pendingHumanAt = null;
|
|
62
|
+
}
|
|
63
|
+
return waits;
|
|
64
|
+
}
|
|
32
65
|
export function opaqueEpisodeId(secret, sourceId, sourceSession) {
|
|
33
66
|
return createHmac("sha256", secret)
|
|
34
67
|
.update("afterhours/delegation-episode/v1\0")
|
|
@@ -78,6 +111,43 @@ export function bucketsFrom(events) {
|
|
|
78
111
|
}
|
|
79
112
|
return [...rows.values()].sort((a, b) => a.hour.localeCompare(b.hour));
|
|
80
113
|
}
|
|
114
|
+
/**
|
|
115
|
+
* Per-model rollup of a source's work. Minutes use the same gap-to-next rule
|
|
116
|
+
* as the activity buckets, computed over ALL agent events so a model's share
|
|
117
|
+
* is its slice of the real timeline — a per-model subset would misread the
|
|
118
|
+
* gaps between models as one model's idle time. Events that never named a
|
|
119
|
+
* model shape the gaps but credit no entry, so the rollup can honestly sum
|
|
120
|
+
* to less than the source total.
|
|
121
|
+
*/
|
|
122
|
+
export function modelActivityFrom(activityEvents, turnEvents) {
|
|
123
|
+
const modelAt = new Map();
|
|
124
|
+
for (const event of activityEvents) {
|
|
125
|
+
if (event.kind === "agent" && event.model)
|
|
126
|
+
modelAt.set(event.at, event.model);
|
|
127
|
+
}
|
|
128
|
+
const times = [...new Set(activityEvents.filter((event) => event.kind === "agent").map((event) => event.at))].sort((a, b) => a - b);
|
|
129
|
+
const rollup = new Map();
|
|
130
|
+
const entry = (model) => {
|
|
131
|
+
const existing = rollup.get(model) ?? { model, agentTurns: 0, agentActiveMinutes: 0 };
|
|
132
|
+
rollup.set(model, existing);
|
|
133
|
+
return existing;
|
|
134
|
+
};
|
|
135
|
+
for (let index = 0; index < times.length; index += 1) {
|
|
136
|
+
const at = times[index];
|
|
137
|
+
const model = modelAt.get(at);
|
|
138
|
+
if (!model)
|
|
139
|
+
continue;
|
|
140
|
+
const next = times[index + 1];
|
|
141
|
+
entry(model).agentActiveMinutes += next == null ? 1 : Math.max(1, Math.min(5, (next - at) / 60_000));
|
|
142
|
+
}
|
|
143
|
+
for (const event of turnEvents) {
|
|
144
|
+
if (event.model)
|
|
145
|
+
entry(event.model).agentTurns += 1;
|
|
146
|
+
}
|
|
147
|
+
return [...rollup.values()]
|
|
148
|
+
.map((item) => ({ ...item, agentActiveMinutes: Math.round(item.agentActiveMinutes * 100) / 100 }))
|
|
149
|
+
.sort((a, b) => b.agentActiveMinutes - a.agentActiveMinutes || a.model.localeCompare(b.model));
|
|
150
|
+
}
|
|
81
151
|
export function emptySource(id, name, configured) {
|
|
82
152
|
return {
|
|
83
153
|
id,
|
|
@@ -88,6 +158,7 @@ export function emptySource(id, name, configured) {
|
|
|
88
158
|
agentTurns: 0,
|
|
89
159
|
humanCheckIns: 0,
|
|
90
160
|
tokens: { ...EMPTY_TOKENS },
|
|
161
|
+
models: [],
|
|
91
162
|
buckets: [],
|
|
92
163
|
episodes: [],
|
|
93
164
|
};
|
|
@@ -143,6 +214,7 @@ export function delegationEpisode(input) {
|
|
|
143
214
|
approvalRequests: null,
|
|
144
215
|
failureEvents: null,
|
|
145
216
|
reworkEvents: null,
|
|
217
|
+
latency: input.latency ?? { ...NO_LATENCY },
|
|
146
218
|
tokens: { ...input.tokens },
|
|
147
219
|
};
|
|
148
220
|
}
|
package/dist/activity.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activity.js","sourceRoot":"","sources":["../src/activity.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"activity.js","sourceRoot":"","sources":["../src/activity.ts"],"names":[],"mappings":"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"}
|
package/dist/apprun.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type AppStatus } from "./macos/status.js";
|
|
2
|
+
export interface AppRunDeps {
|
|
3
|
+
fetcher?: typeof fetch;
|
|
4
|
+
now?: () => Date;
|
|
5
|
+
}
|
|
6
|
+
/** One hub cycle. Never throws: every failure is a visible status, not a crash. */
|
|
7
|
+
export declare function runAppRun(home?: string, deps?: AppRunDeps): Promise<AppStatus>;
|
|
8
|
+
//# sourceMappingURL=apprun.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apprun.d.ts","sourceRoot":"","sources":["../src/apprun.ts"],"names":[],"mappings":"AAIA,OAAO,EAA4B,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE7E,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAgBD,mFAAmF;AACnF,wBAAsB,SAAS,CAAC,IAAI,GAAE,MAAkB,EAAE,IAAI,GAAE,UAAe,GAAG,OAAO,CAAC,SAAS,CAAC,CA6CnG"}
|
package/dist/apprun.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import { collectAfterhours } from "./collect.js";
|
|
3
|
+
import { ConnectionExpiredError, readCredentials, syncSnapshot } from "./cloud.js";
|
|
4
|
+
import { compactSpool, readSpool, spoolDir } from "./macos/spool.js";
|
|
5
|
+
import { buildStatus, writeStatus } from "./macos/status.js";
|
|
6
|
+
/** A minimal, always-constructible status for when the hub cycle itself faults
|
|
7
|
+
* (disk full, permissions, the Application Support path occupied by a file, …) —
|
|
8
|
+
* before `buildStatus`/`writeStatus` can be trusted to run at all. */
|
|
9
|
+
function fallbackStatus(now) {
|
|
10
|
+
return {
|
|
11
|
+
v: 1,
|
|
12
|
+
generatedAt: now().toISOString(),
|
|
13
|
+
sources: [],
|
|
14
|
+
sync: { state: "error", lastAckAt: null, pendingSessions: 0 },
|
|
15
|
+
line: { lastActivityAt: null, resolution: "hour", eveningsKept7d: 0 },
|
|
16
|
+
spool: { quarantinedLines: 0 },
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/** One hub cycle. Never throws: every failure is a visible status, not a crash. */
|
|
20
|
+
export async function runAppRun(home = homedir(), deps = {}) {
|
|
21
|
+
const now = deps.now ?? (() => new Date());
|
|
22
|
+
try {
|
|
23
|
+
const until = now();
|
|
24
|
+
const dir = spoolDir(home);
|
|
25
|
+
// Read the spool BEFORE collectAfterhours runs: collectAfterhours's macos-apps
|
|
26
|
+
// source calls readSpool too, and readSpool quarantines by MOVING bad lines to
|
|
27
|
+
// `.bad` and rewriting the source file — a second read finds nothing left to
|
|
28
|
+
// quarantine (that's the idempotency macos-spool.test.ts pins). Capturing the
|
|
29
|
+
// read here, first, is the only way status.spool.quarantinedLines sees them.
|
|
30
|
+
const spoolInfo = readSpool(dir);
|
|
31
|
+
const snapshot = collectAfterhours({ home, until });
|
|
32
|
+
let sync = { state: "signed_out", lastAckAt: null, pendingSessions: spoolInfo.records.length };
|
|
33
|
+
const credentials = readCredentials(home);
|
|
34
|
+
if (credentials) {
|
|
35
|
+
try {
|
|
36
|
+
await syncSnapshot(snapshot, credentials, deps.fetcher);
|
|
37
|
+
const dropped = compactSpool(dir, snapshot.until);
|
|
38
|
+
sync = { state: "ok", lastAckAt: until.toISOString(), pendingSessions: spoolInfo.records.length - dropped };
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
// Design spec (error-handling section): expired/revoked credentials get the
|
|
42
|
+
// calm signed-out state, not "offline" — the fix is re-pairing, not retrying.
|
|
43
|
+
sync = error instanceof ConnectionExpiredError
|
|
44
|
+
? { state: "signed_out", lastAckAt: null, pendingSessions: spoolInfo.records.length }
|
|
45
|
+
: { state: "offline", lastAckAt: null, pendingSessions: spoolInfo.records.length };
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const status = buildStatus(snapshot, sync, { quarantinedLines: spoolInfo.quarantinedLines });
|
|
49
|
+
writeStatus(home, status);
|
|
50
|
+
return status;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// Never throws, never logs: an ordinary I/O fault (disk full, permissions, a
|
|
54
|
+
// file occupying the Application Support path) must not leak a Node fs error
|
|
55
|
+
// (which embeds local paths) to stderr, and must not flip the exit code.
|
|
56
|
+
const status = fallbackStatus(now);
|
|
57
|
+
try {
|
|
58
|
+
writeStatus(home, status);
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// Best-effort only — if even this fails, the fallback status is still
|
|
62
|
+
// returned in-memory so the caller (and the hidden CLI command) stay quiet.
|
|
63
|
+
}
|
|
64
|
+
return status;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=apprun.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apprun.js","sourceRoot":"","sources":["../src/apprun.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { readFileSync } from "node:fs";
|
|
3
|
+
import { homedir } from "node:os";
|
|
3
4
|
import { fileURLToPath } from "node:url";
|
|
4
5
|
import { collectAfterhours } from "./collect.js";
|
|
5
|
-
import { openVerificationUri, pollDeviceLogin, readCredentials, removeCredentials, revokeDevice, startDeviceLogin, syncSnapshot, teerasBaseUrl, writeCredentials, } from "./cloud.js";
|
|
6
|
+
import { connectMachine, openVerificationUri, pollDeviceLogin, readCredentials, removeCredentials, REPORT_FALLBACK_URL, reportMachine, reportUrl, revokeDevice, startDeviceLogin, syncSnapshot, teerasBaseUrl, writeCredentials, } from "./cloud.js";
|
|
6
7
|
import { detectCodingAgents } from "./detect.js";
|
|
7
8
|
import { runOff } from "./off.js";
|
|
8
9
|
import { DATA_BOUNDARY } from "./privacy.js";
|
|
@@ -77,6 +78,13 @@ async function main() {
|
|
|
77
78
|
return;
|
|
78
79
|
}
|
|
79
80
|
if (command === "connect") {
|
|
81
|
+
if (process.argv.includes("--json")) {
|
|
82
|
+
// Teeras.app spawns this and parses stdout line-by-line — only the
|
|
83
|
+
// event lines belong here, no banner/QR/prose (see connectMachine).
|
|
84
|
+
const ok = await connectMachine(homedir(), (line) => process.stdout.write(`${line}\n`));
|
|
85
|
+
process.exitCode = ok ? 0 : 1;
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
80
88
|
const credentials = await requireAccount();
|
|
81
89
|
const installed = detectCodingAgents().filter((agent) => agent.installed);
|
|
82
90
|
const lines = installed.length === 0
|
|
@@ -108,6 +116,21 @@ async function main() {
|
|
|
108
116
|
process.stdout.write("\n ✓ connected · your first counts-only week is in Teeras.\n\n");
|
|
109
117
|
return;
|
|
110
118
|
}
|
|
119
|
+
if (command === "report") {
|
|
120
|
+
if (process.argv.includes("--json")) {
|
|
121
|
+
// Teeras.app spawns this and opens the URL itself — one line, no
|
|
122
|
+
// browser launch, no prose (see reportMachine).
|
|
123
|
+
await reportMachine(homedir(), (line) => process.stdout.write(`${line}\n`));
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const credentials = readCredentials();
|
|
127
|
+
const url = credentials ? await reportUrl(credentials) : null;
|
|
128
|
+
openVerificationUri(url ?? REPORT_FALLBACK_URL);
|
|
129
|
+
process.stdout.write(url
|
|
130
|
+
? "\n Opening your report — you're signed in.\n\n"
|
|
131
|
+
: "\n Opening your report — sign in to see it.\n\n");
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
111
134
|
if (command === "logout") {
|
|
112
135
|
const credentials = readCredentials();
|
|
113
136
|
const revoked = credentials ? await revokeDevice(credentials) : false;
|
|
@@ -130,8 +153,20 @@ async function main() {
|
|
|
130
153
|
await runSetup({ json: process.argv.includes("--json") });
|
|
131
154
|
return;
|
|
132
155
|
}
|
|
133
|
-
if (command
|
|
134
|
-
|
|
156
|
+
if (command === "app-run") {
|
|
157
|
+
// Hidden command run by Teeras.app; failures land in status.json, never stdout.
|
|
158
|
+
try {
|
|
159
|
+
const { runAppRun } = await import("./apprun.js");
|
|
160
|
+
await runAppRun();
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
// status.json is the only reporting surface — even an unexpected escape
|
|
164
|
+
// from runAppRun (which itself should never throw) must stay silent.
|
|
165
|
+
}
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
if (command != null && !["week", "sources", "json", "--json", "autosync", "app-run"].includes(command)) {
|
|
169
|
+
process.stdout.write("usage: trs <setup|week|connect|login|sync|report|logout|off|sources|privacy|json|hook-config>\n");
|
|
135
170
|
return;
|
|
136
171
|
}
|
|
137
172
|
const credentials = readCredentials();
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/cloud.d.ts
CHANGED
|
@@ -31,6 +31,49 @@ export declare function pollDeviceLogin(baseUrl: string, grant: DeviceGrant, opt
|
|
|
31
31
|
fetcher?: Fetcher;
|
|
32
32
|
sleep?: (ms: number) => Promise<void>;
|
|
33
33
|
}): Promise<DeviceToken>;
|
|
34
|
+
/**
|
|
35
|
+
* Machine-readable pairing for Teeras.app: one JSON line per event on
|
|
36
|
+
* `emit`, never prose. Swift spawns `afterhours connect --json` and parses
|
|
37
|
+
* stdout line-by-line, so this line protocol is a cross-language contract —
|
|
38
|
+
* event names and field names must stay exact. The HTTP mechanics are the
|
|
39
|
+
* same `startDeviceLogin` → `pollDeviceLogin` → `writeCredentials` flow the
|
|
40
|
+
* interactive `connect` command uses; only the output format differs.
|
|
41
|
+
*/
|
|
42
|
+
export declare function connectMachine(home: string, emit: (line: string) => void, fetcher?: Fetcher): Promise<boolean>;
|
|
43
|
+
/**
|
|
44
|
+
* Where "open my report" goes when there is no signed-in link to open: the
|
|
45
|
+
* plain dashboard, which will ask for a sign-in like any other visit. Never
|
|
46
|
+
* an error, never nothing.
|
|
47
|
+
*/
|
|
48
|
+
export declare const REPORT_FALLBACK_URL = "https://www.teeras.com/app";
|
|
49
|
+
/**
|
|
50
|
+
* How long the login link is worth waiting for. A wedged network — a captive
|
|
51
|
+
* portal, a black-holed route — otherwise leaves this request hanging for
|
|
52
|
+
* the OS's own TCP timeout (minutes), and this process is what Teeras.app
|
|
53
|
+
* spawns behind a button. Four seconds sits inside the app's own five-second
|
|
54
|
+
* deadline, so the binary gives up first and the app gets a `fallback` line
|
|
55
|
+
* rather than having to kill a child that is still waiting.
|
|
56
|
+
*/
|
|
57
|
+
export declare const REPORT_TIMEOUT_MS = 4000;
|
|
58
|
+
/**
|
|
59
|
+
* Trades this device's token for a single-use, ~60-second link that opens
|
|
60
|
+
* the web report already signed in.
|
|
61
|
+
*
|
|
62
|
+
* Returns `null` — never throws — on every failure: offline, a network that
|
|
63
|
+
* hangs past `REPORT_TIMEOUT_MS`, 401 (the device connection expired or was
|
|
64
|
+
* revoked), a throttle, a malformed response, a link pointing somewhere
|
|
65
|
+
* else. "Open your report" must always open something, so the caller's job
|
|
66
|
+
* on `null` is simply to open `REPORT_FALLBACK_URL`.
|
|
67
|
+
*/
|
|
68
|
+
export declare function reportUrl(credentials: CloudCredentials, fetcher?: Fetcher): Promise<string | null>;
|
|
69
|
+
/**
|
|
70
|
+
* Machine-readable half of `trs report`, for Teeras.app: exactly one JSON
|
|
71
|
+
* line, then nothing. `url` carries a signed-in link; `fallback` carries the
|
|
72
|
+
* plain site. The caller opens whichever arrives — this function never opens
|
|
73
|
+
* a browser itself. Same cross-language line contract as `connectMachine`:
|
|
74
|
+
* event and field names are frozen.
|
|
75
|
+
*/
|
|
76
|
+
export declare function reportMachine(home: string, emit: (line: string) => void, fetcher?: Fetcher): Promise<boolean>;
|
|
34
77
|
export declare function revokeDevice(credentials: CloudCredentials, fetcher?: Fetcher): Promise<boolean>;
|
|
35
78
|
/** The server rejected a token that still looks valid locally. `trs setup` self-heals this. */
|
|
36
79
|
export declare class ConnectionExpiredError extends Error {
|
package/dist/cloud.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud.d.ts","sourceRoot":"","sources":["../src/cloud.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,WAAW;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,QAAQ,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,KAAK,OAAO,GAAG,OAAO,KAAK,CAAC;AAI5B,wBAAgB,aAAa,CAAC,KAAK,qBAAyB,GAAG,MAAM,CASpE;AAED,wBAAgB,eAAe,CAAC,IAAI,SAAY,GAAG,MAAM,CAExD;AAED,wBAAgB,eAAe,CAAC,IAAI,SAAY,GAAG,gBAAgB,GAAG,IAAI,CAqBzE;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,gBAAgB,EAAE,IAAI,SAAY,GAAG,IAAI,CAMtF;AAED,wBAAgB,iBAAiB,CAAC,IAAI,SAAY,GAAG,OAAO,CAO3D;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAQrD;AAMD,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,OAAe,GAAG,OAAO,CAAC,WAAW,CAAC,CActG;AAED,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,WAAW,EAClB,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAAO,GACzE,OAAO,CAAC,WAAW,CAAC,CA0BtB;AAED,wBAAsB,YAAY,CAChC,WAAW,EAAE,gBAAgB,EAC7B,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC,OAAO,CAAC,CAUlB;AAED,+FAA+F;AAC/F,qBAAa,sBAAuB,SAAQ,KAAK;;CAKhD;AAED,wBAAsB,YAAY,CAChC,QAAQ,EAAE,kBAAkB,EAC5B,WAAW,EAAE,gBAAgB,EAC7B,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,OAAO,CAAA;CAAE,CAAC,CAkBvD"}
|
|
1
|
+
{"version":3,"file":"cloud.d.ts","sourceRoot":"","sources":["../src/cloud.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,WAAW;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,QAAQ,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,KAAK,OAAO,GAAG,OAAO,KAAK,CAAC;AAI5B,wBAAgB,aAAa,CAAC,KAAK,qBAAyB,GAAG,MAAM,CASpE;AAED,wBAAgB,eAAe,CAAC,IAAI,SAAY,GAAG,MAAM,CAExD;AAED,wBAAgB,eAAe,CAAC,IAAI,SAAY,GAAG,gBAAgB,GAAG,IAAI,CAqBzE;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,gBAAgB,EAAE,IAAI,SAAY,GAAG,IAAI,CAMtF;AAED,wBAAgB,iBAAiB,CAAC,IAAI,SAAY,GAAG,OAAO,CAO3D;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAQrD;AAMD,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,OAAe,GAAG,OAAO,CAAC,WAAW,CAAC,CActG;AAED,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,WAAW,EAClB,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAAO,GACzE,OAAO,CAAC,WAAW,CAAC,CA0BtB;AAuBD;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAC5B,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC,OAAO,CAAC,CAmBlB;AAED;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,+BAA+B,CAAC;AAsBhE;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,OAAQ,CAAC;AAEvC;;;;;;;;;GASG;AACH,wBAAsB,SAAS,CAC7B,WAAW,EAAE,gBAAgB,EAC7B,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAcxB;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAC5B,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC,OAAO,CAAC,CAKlB;AAED,wBAAsB,YAAY,CAChC,WAAW,EAAE,gBAAgB,EAC7B,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC,OAAO,CAAC,CAUlB;AAED,+FAA+F;AAC/F,qBAAa,sBAAuB,SAAQ,KAAK;;CAKhD;AAED,wBAAsB,YAAY,CAChC,QAAQ,EAAE,kBAAkB,EAC5B,WAAW,EAAE,gBAAgB,EAC7B,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,OAAO,CAAA;CAAE,CAAC,CAkBvD"}
|
package/dist/cloud.js
CHANGED
|
@@ -109,6 +109,133 @@ export async function pollDeviceLogin(baseUrl, grant, options = {}) {
|
|
|
109
109
|
}
|
|
110
110
|
throw new Error("The connection code expired");
|
|
111
111
|
}
|
|
112
|
+
/**
|
|
113
|
+
* Slugs are stable across releases: Teeras.app pattern-matches on `reason`
|
|
114
|
+
* rather than the human-readable Error message, which is free to change.
|
|
115
|
+
*/
|
|
116
|
+
function machineFailureReason(error) {
|
|
117
|
+
const message = error instanceof Error ? error.message : "";
|
|
118
|
+
switch (message) {
|
|
119
|
+
case "The connection code expired":
|
|
120
|
+
return "expired";
|
|
121
|
+
case "Teeras rejected the connection":
|
|
122
|
+
return "rejected";
|
|
123
|
+
case "Teeras returned an invalid device token":
|
|
124
|
+
case "Teeras returned an invalid connection response":
|
|
125
|
+
return "invalid_response";
|
|
126
|
+
case "Teeras could not start the connection":
|
|
127
|
+
return "start_failed";
|
|
128
|
+
default:
|
|
129
|
+
return "error";
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Machine-readable pairing for Teeras.app: one JSON line per event on
|
|
134
|
+
* `emit`, never prose. Swift spawns `afterhours connect --json` and parses
|
|
135
|
+
* stdout line-by-line, so this line protocol is a cross-language contract —
|
|
136
|
+
* event names and field names must stay exact. The HTTP mechanics are the
|
|
137
|
+
* same `startDeviceLogin` → `pollDeviceLogin` → `writeCredentials` flow the
|
|
138
|
+
* interactive `connect` command uses; only the output format differs.
|
|
139
|
+
*/
|
|
140
|
+
export async function connectMachine(home, emit, fetcher = fetch) {
|
|
141
|
+
const baseUrl = teerasBaseUrl();
|
|
142
|
+
try {
|
|
143
|
+
const grant = await startDeviceLogin(baseUrl, fetcher);
|
|
144
|
+
emit(JSON.stringify({ event: "code", url: grant.verificationUri, code: grant.userCode }));
|
|
145
|
+
const token = await pollDeviceLogin(baseUrl, grant, { fetcher });
|
|
146
|
+
writeCredentials({
|
|
147
|
+
baseUrl,
|
|
148
|
+
accessToken: token.accessToken,
|
|
149
|
+
deviceId: token.deviceId,
|
|
150
|
+
connectedAt: new Date().toISOString(),
|
|
151
|
+
expiresAt: token.expiresAt,
|
|
152
|
+
}, home);
|
|
153
|
+
emit(JSON.stringify({ event: "connected" }));
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
emit(JSON.stringify({ event: "failed", reason: machineFailureReason(error) }));
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Where "open my report" goes when there is no signed-in link to open: the
|
|
163
|
+
* plain dashboard, which will ask for a sign-in like any other visit. Never
|
|
164
|
+
* an error, never nothing.
|
|
165
|
+
*/
|
|
166
|
+
export const REPORT_FALLBACK_URL = "https://www.teeras.com/app";
|
|
167
|
+
/**
|
|
168
|
+
* Same site as the credentials this token came from — the apex and its `www`
|
|
169
|
+
* twin count as the same site (the apex 308-redirects to www, and the server
|
|
170
|
+
* pins minted links to www). Anything else, or anything not HTTPS, is not a
|
|
171
|
+
* link this device asked for, so `reportUrl` discards it and the caller
|
|
172
|
+
* falls back to the plain site.
|
|
173
|
+
*/
|
|
174
|
+
function sameSiteReportUrl(candidate, baseUrl) {
|
|
175
|
+
try {
|
|
176
|
+
const url = new URL(candidate);
|
|
177
|
+
const base = new URL(baseUrl);
|
|
178
|
+
if (url.protocol !== base.protocol)
|
|
179
|
+
return null;
|
|
180
|
+
const strip = (host) => (host.startsWith("www.") ? host.slice(4) : host);
|
|
181
|
+
if (strip(url.host) !== strip(base.host))
|
|
182
|
+
return null;
|
|
183
|
+
return url.toString();
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* How long the login link is worth waiting for. A wedged network — a captive
|
|
191
|
+
* portal, a black-holed route — otherwise leaves this request hanging for
|
|
192
|
+
* the OS's own TCP timeout (minutes), and this process is what Teeras.app
|
|
193
|
+
* spawns behind a button. Four seconds sits inside the app's own five-second
|
|
194
|
+
* deadline, so the binary gives up first and the app gets a `fallback` line
|
|
195
|
+
* rather than having to kill a child that is still waiting.
|
|
196
|
+
*/
|
|
197
|
+
export const REPORT_TIMEOUT_MS = 4_000;
|
|
198
|
+
/**
|
|
199
|
+
* Trades this device's token for a single-use, ~60-second link that opens
|
|
200
|
+
* the web report already signed in.
|
|
201
|
+
*
|
|
202
|
+
* Returns `null` — never throws — on every failure: offline, a network that
|
|
203
|
+
* hangs past `REPORT_TIMEOUT_MS`, 401 (the device connection expired or was
|
|
204
|
+
* revoked), a throttle, a malformed response, a link pointing somewhere
|
|
205
|
+
* else. "Open your report" must always open something, so the caller's job
|
|
206
|
+
* on `null` is simply to open `REPORT_FALLBACK_URL`.
|
|
207
|
+
*/
|
|
208
|
+
export async function reportUrl(credentials, fetcher = fetch) {
|
|
209
|
+
try {
|
|
210
|
+
const response = await fetcher(`${credentials.baseUrl}/api/afterhours/device/web-login`, {
|
|
211
|
+
method: "POST",
|
|
212
|
+
headers: { authorization: `Bearer ${credentials.accessToken}` },
|
|
213
|
+
signal: AbortSignal.timeout(REPORT_TIMEOUT_MS),
|
|
214
|
+
});
|
|
215
|
+
if (!response.ok)
|
|
216
|
+
return null;
|
|
217
|
+
const value = object(await response.json().catch(() => null));
|
|
218
|
+
if (typeof value?.url !== "string")
|
|
219
|
+
return null;
|
|
220
|
+
return sameSiteReportUrl(value.url, credentials.baseUrl);
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
return null;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Machine-readable half of `trs report`, for Teeras.app: exactly one JSON
|
|
228
|
+
* line, then nothing. `url` carries a signed-in link; `fallback` carries the
|
|
229
|
+
* plain site. The caller opens whichever arrives — this function never opens
|
|
230
|
+
* a browser itself. Same cross-language line contract as `connectMachine`:
|
|
231
|
+
* event and field names are frozen.
|
|
232
|
+
*/
|
|
233
|
+
export async function reportMachine(home, emit, fetcher = fetch) {
|
|
234
|
+
const credentials = readCredentials(home);
|
|
235
|
+
const url = credentials ? await reportUrl(credentials, fetcher) : null;
|
|
236
|
+
emit(JSON.stringify(url ? { event: "url", url } : { event: "fallback", url: REPORT_FALLBACK_URL }));
|
|
237
|
+
return url !== null;
|
|
238
|
+
}
|
|
112
239
|
export async function revokeDevice(credentials, fetcher = fetch) {
|
|
113
240
|
try {
|
|
114
241
|
const response = await fetcher(`${credentials.baseUrl}/api/afterhours/device/revoke`, {
|