humanish 0.60.0 → 0.62.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 +22 -0
- package/dist/e2b-desktop-launch.js +21 -1
- package/dist/e2b-desktop-launch.js.map +1 -1
- package/dist/first-run-path.d.ts +6 -0
- package/dist/first-run-path.js +5 -1
- package/dist/first-run-path.js.map +1 -1
- package/dist/init.js +3 -0
- package/dist/init.js.map +1 -1
- package/dist/program.js +145 -1
- package/dist/program.js.map +1 -1
- package/dist/telemetry.d.ts +64 -0
- package/dist/telemetry.js +147 -0
- package/dist/telemetry.js.map +1 -0
- package/docs/contracts/schemas.md +1 -1
- package/docs/goals/current.md +1 -1
- package/docs/ramp/README.md +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/** The ONLY event names. */
|
|
2
|
+
export type TelemetryEvent = "cli_command" | "project_initialized" | "study_finished";
|
|
3
|
+
export interface TelemetryProperties {
|
|
4
|
+
command?: string;
|
|
5
|
+
/** A starter lab id, or "custom" — never an adopter's own lab id. */
|
|
6
|
+
lab?: string;
|
|
7
|
+
mode?: "dry-run" | "live";
|
|
8
|
+
outcome?: string;
|
|
9
|
+
/** Bucketed, not exact: a duration is a fingerprint at full precision. */
|
|
10
|
+
durationBucket?: string;
|
|
11
|
+
/** Which brain ran it, as a route name — never a model id the adopter configured. */
|
|
12
|
+
brain?: "provider-key" | "local-agent" | "none";
|
|
13
|
+
ok?: boolean;
|
|
14
|
+
exitCode?: number;
|
|
15
|
+
}
|
|
16
|
+
export interface TelemetryState {
|
|
17
|
+
enabled: boolean;
|
|
18
|
+
/** Random, generated locally, tied to nothing. */
|
|
19
|
+
anonymousId: string;
|
|
20
|
+
/** Whether the first-run notice has been shown. */
|
|
21
|
+
noticed: boolean;
|
|
22
|
+
}
|
|
23
|
+
export declare function telemetryStatePath(env?: NodeJS.ProcessEnv, home?: string): string;
|
|
24
|
+
/**
|
|
25
|
+
* Off means off, from any of the three switches people already expect: the cross-tool
|
|
26
|
+
* `DO_NOT_TRACK` standard, our own env var, and the persisted opt-out.
|
|
27
|
+
*/
|
|
28
|
+
export declare function disabledByEnvironment(env: NodeJS.ProcessEnv): boolean;
|
|
29
|
+
export declare function readTelemetryState(env?: NodeJS.ProcessEnv, home?: string): Promise<TelemetryState>;
|
|
30
|
+
export declare function writeTelemetryState(state: TelemetryState, env?: NodeJS.ProcessEnv, home?: string): Promise<void>;
|
|
31
|
+
/** Coarse enough that a duration cannot fingerprint a session. */
|
|
32
|
+
export declare function durationBucket(ms: number): string;
|
|
33
|
+
/** A lab id only if it is one of ours. An adopter's lab id can name an unannounced product. */
|
|
34
|
+
export declare function safeLabId(lab: string | undefined): string | undefined;
|
|
35
|
+
export interface TelemetryPayload {
|
|
36
|
+
event: TelemetryEvent;
|
|
37
|
+
distinct_id: string;
|
|
38
|
+
properties: Record<string, string | number | boolean>;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* The exact document that would be sent. Built separately from sending so that
|
|
42
|
+
* `HUMANISH_TELEMETRY_DEBUG=1` can show it and so tests can assert on it — "you can read exactly
|
|
43
|
+
* what we collect" is the part of this convention that makes it honest rather than merely legal.
|
|
44
|
+
*/
|
|
45
|
+
export declare function buildPayload(args: {
|
|
46
|
+
event: TelemetryEvent;
|
|
47
|
+
anonymousId: string;
|
|
48
|
+
version: string;
|
|
49
|
+
properties?: TelemetryProperties;
|
|
50
|
+
env?: NodeJS.ProcessEnv;
|
|
51
|
+
platform?: string;
|
|
52
|
+
nodeVersion?: string;
|
|
53
|
+
}): TelemetryPayload;
|
|
54
|
+
/** The notice, shown once, before anything is sent. */
|
|
55
|
+
export declare const TELEMETRY_NOTICE: string;
|
|
56
|
+
export interface SendDeps {
|
|
57
|
+
fetchFn?: typeof fetch;
|
|
58
|
+
now?: () => number;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Fire and forget, bounded, and incapable of affecting the command that triggered it. A tool whose
|
|
62
|
+
* telemetry can slow down or fail a run has made its users pay for its metrics.
|
|
63
|
+
*/
|
|
64
|
+
export declare function sendTelemetry(payload: TelemetryPayload, deps?: SendDeps): Promise<void>;
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
// Anonymous usage telemetry, on the convention Next.js and the Vercel CLI established: collected by
|
|
2
|
+
// default, disclosed the first time it happens, trivially switched off, and inspectable.
|
|
3
|
+
//
|
|
4
|
+
// WHY IT EXISTS: humanish shipped 61 releases without being able to answer "does anyone get to a
|
|
5
|
+
// working first run". The funnel was broken at the first live run for months and we learned it from
|
|
6
|
+
// an adoption post-mortem, not from data. A tool that cannot see its own activation is guessing.
|
|
7
|
+
//
|
|
8
|
+
// WHAT IT WILL NEVER SEND, and this is stricter than the convention because of what humanish is:
|
|
9
|
+
// no paths, no cwd, no repo names, no URLs, no lab titles or ids that are not our own starter labs,
|
|
10
|
+
// no persona or mission text, no run ids, no evidence, no key values, no key names. A study's
|
|
11
|
+
// subject is the adopter's product and often unannounced; leaking a lab id would leak a roadmap.
|
|
12
|
+
// The allowlist below is the whole vocabulary — anything not on it cannot be sent by construction.
|
|
13
|
+
import { randomUUID } from "node:crypto";
|
|
14
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
15
|
+
import { homedir } from "node:os";
|
|
16
|
+
import path from "node:path";
|
|
17
|
+
/** Write-only PostHog project key. Public by design — it can ingest, and can read nothing. */
|
|
18
|
+
const INGEST_KEY = "phc_oeMeBqxDZhZ9tCHMSnuDFimLqHpU5Myc847WD33hAh4C";
|
|
19
|
+
const INGEST_HOST = "https://us.i.posthog.com";
|
|
20
|
+
/** The ONLY lab ids that may be named. Ours, shipped by `init`; everything else is "custom". */
|
|
21
|
+
const STARTER_LABS = new Set(["first-run", "try-live", "cua-browser", "lobby-trivia-3player", "oss"]);
|
|
22
|
+
export function telemetryStatePath(env = process.env, home = homedir()) {
|
|
23
|
+
const declared = env.XDG_CONFIG_HOME?.trim();
|
|
24
|
+
// Same XDG rule the key store uses: a relative value MUST be ignored, or state becomes
|
|
25
|
+
// cwd-relative and follows people between projects.
|
|
26
|
+
const configHome = declared !== undefined && declared !== "" && path.isAbsolute(declared)
|
|
27
|
+
? declared
|
|
28
|
+
: path.join(home, ".config");
|
|
29
|
+
return path.join(configHome, "humanish", "telemetry.json");
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Off means off, from any of the three switches people already expect: the cross-tool
|
|
33
|
+
* `DO_NOT_TRACK` standard, our own env var, and the persisted opt-out.
|
|
34
|
+
*/
|
|
35
|
+
export function disabledByEnvironment(env) {
|
|
36
|
+
const truthy = (value) => value !== undefined && value.trim() !== "" && value.trim() !== "0" && value.trim().toLowerCase() !== "false";
|
|
37
|
+
return truthy(env.DO_NOT_TRACK) || truthy(env.HUMANISH_TELEMETRY_DISABLED);
|
|
38
|
+
}
|
|
39
|
+
export async function readTelemetryState(env = process.env, home = homedir()) {
|
|
40
|
+
try {
|
|
41
|
+
const raw = await readFile(telemetryStatePath(env, home), "utf8");
|
|
42
|
+
const parsed = JSON.parse(raw);
|
|
43
|
+
return {
|
|
44
|
+
enabled: parsed.enabled !== false,
|
|
45
|
+
anonymousId: typeof parsed.anonymousId === "string" ? parsed.anonymousId : randomUUID(),
|
|
46
|
+
noticed: parsed.noticed === true
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return { enabled: true, anonymousId: randomUUID(), noticed: false };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export async function writeTelemetryState(state, env = process.env, home = homedir()) {
|
|
54
|
+
const file = telemetryStatePath(env, home);
|
|
55
|
+
await mkdir(path.dirname(file), { recursive: true });
|
|
56
|
+
await writeFile(file, `${JSON.stringify(state, null, 2)}\n`, "utf8");
|
|
57
|
+
}
|
|
58
|
+
/** Coarse enough that a duration cannot fingerprint a session. */
|
|
59
|
+
export function durationBucket(ms) {
|
|
60
|
+
if (ms < 1_000)
|
|
61
|
+
return "<1s";
|
|
62
|
+
if (ms < 10_000)
|
|
63
|
+
return "1-10s";
|
|
64
|
+
if (ms < 60_000)
|
|
65
|
+
return "10-60s";
|
|
66
|
+
if (ms < 300_000)
|
|
67
|
+
return "1-5m";
|
|
68
|
+
if (ms < 900_000)
|
|
69
|
+
return "5-15m";
|
|
70
|
+
return ">15m";
|
|
71
|
+
}
|
|
72
|
+
/** A lab id only if it is one of ours. An adopter's lab id can name an unannounced product. */
|
|
73
|
+
export function safeLabId(lab) {
|
|
74
|
+
if (lab === undefined)
|
|
75
|
+
return undefined;
|
|
76
|
+
return STARTER_LABS.has(lab) ? lab : "custom";
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* The exact document that would be sent. Built separately from sending so that
|
|
80
|
+
* `HUMANISH_TELEMETRY_DEBUG=1` can show it and so tests can assert on it — "you can read exactly
|
|
81
|
+
* what we collect" is the part of this convention that makes it honest rather than merely legal.
|
|
82
|
+
*/
|
|
83
|
+
export function buildPayload(args) {
|
|
84
|
+
const env = args.env ?? process.env;
|
|
85
|
+
const properties = {
|
|
86
|
+
version: args.version,
|
|
87
|
+
os: args.platform ?? process.platform,
|
|
88
|
+
node: (args.nodeVersion ?? process.version).split(".")[0].replace("v", ""),
|
|
89
|
+
ci: env.CI !== undefined && env.CI !== "" && env.CI !== "0"
|
|
90
|
+
};
|
|
91
|
+
const given = args.properties ?? {};
|
|
92
|
+
if (given.command !== undefined)
|
|
93
|
+
properties.command = given.command;
|
|
94
|
+
if (given.lab !== undefined)
|
|
95
|
+
properties.lab = given.lab;
|
|
96
|
+
if (given.mode !== undefined)
|
|
97
|
+
properties.mode = given.mode;
|
|
98
|
+
if (given.outcome !== undefined)
|
|
99
|
+
properties.outcome = given.outcome;
|
|
100
|
+
if (given.durationBucket !== undefined)
|
|
101
|
+
properties.duration = given.durationBucket;
|
|
102
|
+
if (given.brain !== undefined)
|
|
103
|
+
properties.brain = given.brain;
|
|
104
|
+
if (given.ok !== undefined)
|
|
105
|
+
properties.ok = given.ok;
|
|
106
|
+
if (given.exitCode !== undefined)
|
|
107
|
+
properties.exit_code = given.exitCode;
|
|
108
|
+
return { event: args.event, distinct_id: args.anonymousId, properties };
|
|
109
|
+
}
|
|
110
|
+
/** The notice, shown once, before anything is sent. */
|
|
111
|
+
export const TELEMETRY_NOTICE = [
|
|
112
|
+
"humanish collects anonymous usage data (which command ran, whether it worked, how long it took).",
|
|
113
|
+
"It never sends your labs, subjects, personas, paths, or evidence. Opt out any time:",
|
|
114
|
+
" humanish telemetry disable (or set DO_NOT_TRACK=1)",
|
|
115
|
+
" humanish telemetry status shows exactly what is collected"
|
|
116
|
+
].join("\n");
|
|
117
|
+
/**
|
|
118
|
+
* Fire and forget, bounded, and incapable of affecting the command that triggered it. A tool whose
|
|
119
|
+
* telemetry can slow down or fail a run has made its users pay for its metrics.
|
|
120
|
+
*/
|
|
121
|
+
export async function sendTelemetry(payload, deps = {}) {
|
|
122
|
+
const fetchFn = deps.fetchFn ?? globalThis.fetch;
|
|
123
|
+
if (typeof fetchFn !== "function" || INGEST_KEY.length === 0)
|
|
124
|
+
return;
|
|
125
|
+
const controller = new AbortController();
|
|
126
|
+
const timer = setTimeout(() => controller.abort(), 2_000);
|
|
127
|
+
try {
|
|
128
|
+
await fetchFn(`${INGEST_HOST}/i/v0/e/`, {
|
|
129
|
+
method: "POST",
|
|
130
|
+
headers: { "content-type": "application/json" },
|
|
131
|
+
body: JSON.stringify({
|
|
132
|
+
api_key: INGEST_KEY,
|
|
133
|
+
event: payload.event,
|
|
134
|
+
distinct_id: payload.distinct_id,
|
|
135
|
+
properties: payload.properties
|
|
136
|
+
}),
|
|
137
|
+
signal: controller.signal
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
// Never surfaces. Metrics are our problem, not the operator's.
|
|
142
|
+
}
|
|
143
|
+
finally {
|
|
144
|
+
clearTimeout(timer);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=telemetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Date: 2026-06-02 (current-state note updated 2026-07-14)
|
|
4
4
|
|
|
5
5
|
Status: reference map for the major contracts shipped through source version
|
|
6
|
-
`0.
|
|
6
|
+
`0.62.0`; it is not an exhaustive inventory of command/result envelopes. Exported types,
|
|
7
7
|
schema constants, parsers, and validators in `src/` are authoritative. Rows
|
|
8
8
|
marked "reserved" name layering intent only — no code emits or validates them
|
|
9
9
|
yet. Do not emit a reserved schema.
|
package/docs/goals/current.md
CHANGED
|
@@ -29,7 +29,7 @@ study completed, reproduced, and produced a real accessibility finding via a
|
|
|
29
29
|
keyboard-first participant
|
|
30
30
|
([docs/goals/email-gated-signup/receipts/](email-gated-signup/receipts/)).
|
|
31
31
|
|
|
32
|
-
## Current Program Truth (source `0.
|
|
32
|
+
## Current Program Truth (source `0.62.0`)
|
|
33
33
|
|
|
34
34
|
The package source and repository implementation in this tree agree on these
|
|
35
35
|
points:
|
package/docs/ramp/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Status: public-safe contributor and agent ramp.
|
|
4
4
|
|
|
5
|
-
Package/source version in this tree: `0.
|
|
5
|
+
Package/source version in this tree: `0.62.0` (2026-08-31). The Observer is phone-usable as a stated requirement (observer/AGENTS.md); interactive primitives start from Base UI. The Observer renderer is the observer/ workspace artifact only; the legacy string-concat renderer was deleted at cutover (#426), and rollback is a version pin to 0.42.0. The containment boundary introduced in
|
|
6
6
|
`0.15.1` remains in force: managed run and output paths bind to validated
|
|
7
7
|
physical filesystem identities, and stored provider IDs are evidence, not
|
|
8
8
|
cleanup authority. The bundled OSS meta-lab is dry-run only until
|
package/package.json
CHANGED