@reticlehq/server 2.2.0 → 2.2.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/dist/cli-parse.d.ts +19 -1
- package/dist/cli-parse.d.ts.map +1 -1
- package/dist/cli-parse.js +40 -2
- package/dist/cli-parse.js.map +1 -1
- package/dist/cli-verify.d.ts +2 -0
- package/dist/cli-verify.d.ts.map +1 -1
- package/dist/cli-verify.js +24 -2
- package/dist/cli-verify.js.map +1 -1
- package/dist/cli.d.ts +2 -3
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +94 -7
- package/dist/cli.js.map +1 -1
- package/dist/cloud/cloud-config.d.ts +37 -0
- package/dist/cloud/cloud-config.d.ts.map +1 -0
- package/dist/cloud/cloud-config.js +87 -0
- package/dist/cloud/cloud-config.js.map +1 -0
- package/dist/cloud/cloud-sync.d.ts +96 -3
- package/dist/cloud/cloud-sync.d.ts.map +1 -1
- package/dist/cloud/cloud-sync.js +131 -2
- package/dist/cloud/cloud-sync.js.map +1 -1
- package/dist/cloud-cli.d.ts +4 -0
- package/dist/cloud-cli.d.ts.map +1 -0
- package/dist/cloud-cli.js +507 -0
- package/dist/cloud-cli.js.map +1 -0
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +52 -7
- package/dist/daemon.js.map +1 -1
- package/dist/flows/flow-replay-run.d.ts.map +1 -1
- package/dist/flows/flow-replay-run.js +22 -5
- package/dist/flows/flow-replay-run.js.map +1 -1
- package/dist/flows/flow-tools.d.ts.map +1 -1
- package/dist/flows/flow-tools.js +24 -8
- package/dist/flows/flow-tools.js.map +1 -1
- package/dist/flows/server-verify.d.ts +16 -0
- package/dist/flows/server-verify.d.ts.map +1 -0
- package/dist/flows/server-verify.js +43 -0
- package/dist/flows/server-verify.js.map +1 -0
- package/dist/pool/playwright-launcher.d.ts +2 -0
- package/dist/pool/playwright-launcher.d.ts.map +1 -1
- package/dist/pool/playwright-launcher.js +13 -1
- package/dist/pool/playwright-launcher.js.map +1 -1
- package/dist/project/baselines.d.ts.map +1 -1
- package/dist/project/baselines.js +5 -3
- package/dist/project/baselines.js.map +1 -1
- package/dist/project/project-store.js +20 -8
- package/dist/project/project-store.js.map +1 -1
- package/dist/project/project-tools.d.ts.map +1 -1
- package/dist/project/project-tools.js +29 -6
- package/dist/project/project-tools.js.map +1 -1
- package/dist/runs/verification-sync.d.ts +24 -0
- package/dist/runs/verification-sync.d.ts.map +1 -0
- package/dist/runs/verification-sync.js +67 -0
- package/dist/runs/verification-sync.js.map +1 -0
- package/dist/telemetry/telemetry.d.ts +41 -0
- package/dist/telemetry/telemetry.d.ts.map +1 -0
- package/dist/telemetry/telemetry.js +220 -0
- package/dist/telemetry/telemetry.js.map +1 -0
- package/dist/tools/dynamic-tools.js +1 -1
- package/dist/tools/dynamic-tools.js.map +1 -1
- package/dist/tools/invoke-tool.d.ts.map +1 -1
- package/dist/tools/invoke-tool.js +4 -0
- package/dist/tools/invoke-tool.js.map +1 -1
- package/dist/update/update-checker.d.ts.map +1 -1
- package/dist/update/update-checker.js +26 -1
- package/dist/update/update-checker.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-tools.js","sourceRoot":"","sources":["../../src/project/project-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,SAAS,EAAkB,MAAM,iBAAiB,CAAC;AACvF,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"project-tools.js","sourceRoot":"","sources":["../../src/project/project-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Turn an MCP verification (a `reticle_flow_verify` suite run) into a first-class ReticleVerificationRun:
|
|
3
|
+
* assemble the artifact from the already-computed replays, persist it to .reticle/runs/ (so
|
|
4
|
+
* `reticle_run_export` and CI can read it), and — when logged in (cloud creds set) — best-effort push it
|
|
5
|
+
* to the cloud's `POST /v1/runs` so the team's dashboard Runs tab shows what the agent just verified.
|
|
6
|
+
*
|
|
7
|
+
* This is the artifact tier that maps to the dashboard's "Runs" (the OEM/CI-consumable verdict); the
|
|
8
|
+
* lighter per-flow RunRecord that feeds regression memory is synced separately in flow-replay-run.ts.
|
|
9
|
+
* Both are best-effort + opt-in: no creds → the artifact still lands on disk, nothing leaves the machine.
|
|
10
|
+
*/
|
|
11
|
+
import { type FlowReplayResult } from '@reticlehq/core';
|
|
12
|
+
import type { ToolDeps } from '../tools/tools.js';
|
|
13
|
+
/** A replay plus the wall-clock time it took — the shape the verify handler already collects. */
|
|
14
|
+
export interface TimedReplay {
|
|
15
|
+
replay: FlowReplayResult;
|
|
16
|
+
durationMs: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Persist the suite's run artifact and best-effort mirror it to the cloud. Never throws into the verify
|
|
20
|
+
* tool — a disk or network failure is logged and swallowed so the verdict the agent asked for is
|
|
21
|
+
* unaffected. Returns the runId (for logging/tests); undefined if nothing was produced (empty suite).
|
|
22
|
+
*/
|
|
23
|
+
export declare function persistAndSyncVerificationRun(deps: ToolDeps, timed: TimedReplay[], projectId: string | undefined): Promise<string | undefined>;
|
|
24
|
+
//# sourceMappingURL=verification-sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verification-sync.d.ts","sourceRoot":"","sources":["../../src/runs/verification-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAKL,KAAK,gBAAgB,EAEtB,MAAM,iBAAiB,CAAC;AASzB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,iGAAiG;AACjG,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,gBAAgB,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;CACpB;AAyBD;;;;GAIG;AACH,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,WAAW,EAAE,EACpB,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAoB7B"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Turn an MCP verification (a `reticle_flow_verify` suite run) into a first-class ReticleVerificationRun:
|
|
3
|
+
* assemble the artifact from the already-computed replays, persist it to .reticle/runs/ (so
|
|
4
|
+
* `reticle_run_export` and CI can read it), and — when logged in (cloud creds set) — best-effort push it
|
|
5
|
+
* to the cloud's `POST /v1/runs` so the team's dashboard Runs tab shows what the agent just verified.
|
|
6
|
+
*
|
|
7
|
+
* This is the artifact tier that maps to the dashboard's "Runs" (the OEM/CI-consumable verdict); the
|
|
8
|
+
* lighter per-flow RunRecord that feeds regression memory is synced separately in flow-replay-run.ts.
|
|
9
|
+
* Both are best-effort + opt-in: no creds → the artifact still lands on disk, nothing leaves the machine.
|
|
10
|
+
*/
|
|
11
|
+
import { RunAgentKind, RunFramework, RunProfile, RunTrigger, } from '@reticlehq/core';
|
|
12
|
+
import { homedir } from 'node:os';
|
|
13
|
+
import { buildVerificationRun } from './build-verification-run.js';
|
|
14
|
+
import { mapReplayToFlowResult } from './replay-mapping.js';
|
|
15
|
+
import { defaultRunId } from './runner-port.js';
|
|
16
|
+
import { RunStore } from './run-store.js';
|
|
17
|
+
import { syncRunToCloud, SyncOutcome } from '../cloud/cloud-sync.js';
|
|
18
|
+
import { resolveProjectCloud } from '../cloud/cloud-config.js';
|
|
19
|
+
import { log } from '../log.js';
|
|
20
|
+
/** Assemble the ReticleVerificationRun artifact for a verify suite (pure — no IO). */
|
|
21
|
+
function assembleRun(deps, timed, projectId) {
|
|
22
|
+
const flows = timed.map((t) => mapReplayToFlowResult(t.replay, t.durationMs));
|
|
23
|
+
const input = {
|
|
24
|
+
runId: defaultRunId(),
|
|
25
|
+
durationMs: flows.reduce((sum, f) => sum + f.durationMs, 0),
|
|
26
|
+
profile: RunProfile.DEV,
|
|
27
|
+
project: { name: projectId ?? 'reticle', framework: RunFramework.OTHER },
|
|
28
|
+
agent: { id: 'reticle-mcp', kind: RunAgentKind.CODING_AGENT },
|
|
29
|
+
trigger: { kind: RunTrigger.MANUAL },
|
|
30
|
+
changedFiles: [],
|
|
31
|
+
flows,
|
|
32
|
+
checks: [],
|
|
33
|
+
risks: [],
|
|
34
|
+
evidence: { consoleErrors: [], networkAnomalies: [], stateAssertions: [], timeline: [] },
|
|
35
|
+
};
|
|
36
|
+
return buildVerificationRun(input, () => deps.now());
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Persist the suite's run artifact and best-effort mirror it to the cloud. Never throws into the verify
|
|
40
|
+
* tool — a disk or network failure is logged and swallowed so the verdict the agent asked for is
|
|
41
|
+
* unaffected. Returns the runId (for logging/tests); undefined if nothing was produced (empty suite).
|
|
42
|
+
*/
|
|
43
|
+
export async function persistAndSyncVerificationRun(deps, timed, projectId) {
|
|
44
|
+
if (timed.length === 0)
|
|
45
|
+
return undefined;
|
|
46
|
+
let run;
|
|
47
|
+
try {
|
|
48
|
+
run = assembleRun(deps, timed, projectId);
|
|
49
|
+
await new RunStore(deps.fs, deps.reticleRoot).write(run);
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
log('verification-run-persist-failed', {
|
|
53
|
+
error: error instanceof Error ? error.message : String(error),
|
|
54
|
+
});
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
// Per-project cloud: only push when THIS project has cloud attached AND its policy allows runs.
|
|
58
|
+
const cloud = await resolveProjectCloud(deps.fs, deps.reticleRoot, homedir(), process.env);
|
|
59
|
+
if (cloud.config === null || !cloud.policy.runs)
|
|
60
|
+
return run.runId; // not attached / runs disabled → local only
|
|
61
|
+
const result = await syncRunToCloud(run, cloud.config, (url, init) => fetch(url, init));
|
|
62
|
+
if (result.outcome !== SyncOutcome.SYNCED) {
|
|
63
|
+
log('cloud-run-sync-failed', { runId: run.runId, status: result.status, error: result.error });
|
|
64
|
+
}
|
|
65
|
+
return run.runId;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=verification-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verification-sync.js","sourceRoot":"","sources":["../../src/runs/verification-sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { TelemetryEventKind } from '@reticlehq/core';
|
|
2
|
+
/** The current telemetry state and which control set it — what `reticle telemetry status` prints. */
|
|
3
|
+
export declare const describeTelemetry: (env?: NodeJS.ProcessEnv, dir?: string) => {
|
|
4
|
+
enabled: boolean;
|
|
5
|
+
reason: string;
|
|
6
|
+
policyUrl: string;
|
|
7
|
+
};
|
|
8
|
+
/** Persist (or lift) the machine-wide opt-out — `reticle telemetry disable` / `enable`. */
|
|
9
|
+
export declare const setTelemetryEnabled: (enabled: boolean, dir?: string) => void;
|
|
10
|
+
export interface Telemetry {
|
|
11
|
+
/**
|
|
12
|
+
* Fire one event, non-blocking. `detach: true` hands the send to a disowned child so a short-lived
|
|
13
|
+
* CLI process can exit immediately instead of waiting out the POST (use it from command entry
|
|
14
|
+
* points; daemon-side events send in-process).
|
|
15
|
+
*/
|
|
16
|
+
emit(kind: TelemetryEventKind, extra?: {
|
|
17
|
+
sessionMs?: number;
|
|
18
|
+
tool?: string;
|
|
19
|
+
detach?: boolean;
|
|
20
|
+
}): Promise<void>;
|
|
21
|
+
readonly enabled: boolean;
|
|
22
|
+
/** True the very first run on this machine — the CLI emits INSTALL alongside the first INVOKE. */
|
|
23
|
+
readonly firstRun: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Build the telemetry emitter for this process. Resolves identity + opt-out ONCE; each `emit` builds a
|
|
27
|
+
* fully-validated core event, maps it into PostHog capture shape, and fires a best-effort POST.
|
|
28
|
+
* `version` is the running reticle version (for the `version` dimension); `now`/`fetchImpl` are
|
|
29
|
+
* injected so this is testable without a clock or network.
|
|
30
|
+
*/
|
|
31
|
+
export declare const createTelemetry: (opts: {
|
|
32
|
+
version: string;
|
|
33
|
+
env?: NodeJS.ProcessEnv;
|
|
34
|
+
cwd?: string;
|
|
35
|
+
now?: () => number;
|
|
36
|
+
fetchImpl?: typeof fetch;
|
|
37
|
+
spawnImpl?: (command: string, args: string[]) => void;
|
|
38
|
+
}) => Telemetry;
|
|
39
|
+
export declare const getTelemetry: () => Telemetry;
|
|
40
|
+
export { TelemetryEventKind };
|
|
41
|
+
//# sourceMappingURL=telemetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/telemetry/telemetry.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,kBAAkB,EAAgD,MAAM,iBAAiB,CAAC;AA4FnG,qGAAqG;AACrG,eAAO,MAAM,iBAAiB,GAC5B,MAAK,MAAM,CAAC,UAAwB,EACpC,MAAK,MAAoB,KACxB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAgBvD,CAAC;AAEF,2FAA2F;AAC3F,eAAO,MAAM,mBAAmB,GAAI,SAAS,OAAO,EAAE,MAAK,MAAoB,KAAG,IAQjF,CAAC;AAEF,MAAM,WAAW,SAAS;IACxB;;;;OAIG;IACH,IAAI,CACF,IAAI,EAAE,kBAAkB,EACxB,KAAK,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAC9D,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,kGAAkG;IAClG,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAID;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAAI,MAAM;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CACvD,KAAG,SAwEH,CAAC;AAOF,eAAO,MAAM,YAAY,QAAO,SAC8B,CAAC;AAE/D,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anonymous adoption telemetry — the OSS runtime's ONLY phone-home for product metrics (DAU/WAU/MAU,
|
|
3
|
+
* invocations, sessions, installs, tool usage). It answers the "npm downloads don't count, show me
|
|
4
|
+
* platform usage" question without collecting anything personal:
|
|
5
|
+
*
|
|
6
|
+
* - identity is a random UUID minted locally at `~/.reticle/telemetry-id` (never derived from you),
|
|
7
|
+
* - the project is a one-way HASH of the cwd (counts DISTINCT projects, reveals none),
|
|
8
|
+
* - it is strictly opt-OUT: `RETICLE_TELEMETRY=0` or the `DO_NOT_TRACK` convention disables it,
|
|
9
|
+
* - it is best-effort and non-blocking: a send failure NEVER changes what the tool does.
|
|
10
|
+
*
|
|
11
|
+
* Events are `@reticlehq/core`'s `TelemetryEventSchema`, mapped at the wire into PostHog's capture
|
|
12
|
+
* format (https://posthog.com/docs/api/capture) — PostHog is the analytics backend until Reticle Cloud
|
|
13
|
+
* grows its own; a project API key is WRITE-ONLY by design, so embedding it in an OSS client is safe.
|
|
14
|
+
* Everything here is wrapped so a telemetry bug can never surface to a user — a broken metric must not
|
|
15
|
+
* break a verification.
|
|
16
|
+
*/
|
|
17
|
+
import { spawn } from 'node:child_process';
|
|
18
|
+
import { randomUUID, createHash } from 'node:crypto';
|
|
19
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync, rmSync } from 'node:fs';
|
|
20
|
+
import { homedir, platform } from 'node:os';
|
|
21
|
+
import { join } from 'node:path';
|
|
22
|
+
import { TelemetryEventKind, TELEMETRY_EVENT_VERSION } from '@reticlehq/core';
|
|
23
|
+
import { SERVER_VERSION } from '../server-version.js';
|
|
24
|
+
const RETICLE_DIR = join(homedir(), '.reticle');
|
|
25
|
+
const ID_FILE = join(RETICLE_DIR, 'telemetry-id');
|
|
26
|
+
const NOTICE_FILE = join(RETICLE_DIR, 'telemetry-notice-shown');
|
|
27
|
+
/** Presence of this file = a persistent, machine-wide opt-out (`reticle telemetry disable`). */
|
|
28
|
+
const OPT_OUT_FILE = join(RETICLE_DIR, 'telemetry-opt-out');
|
|
29
|
+
/** Where the full disclosure lives — printed in the first-run notice and `reticle telemetry status`. */
|
|
30
|
+
const POLICY_URL = 'https://github.com/reticlehq/reticle/blob/main/docs/telemetry.md';
|
|
31
|
+
/** PostHog batch-capture endpoint (US cloud). `RETICLE_TELEMETRY_URL` overrides the host (EU/self-host). */
|
|
32
|
+
const DEFAULT_URL = 'https://us.i.posthog.com';
|
|
33
|
+
const TELEMETRY_PATH = '/batch/';
|
|
34
|
+
/**
|
|
35
|
+
* The write-only PostHog project key (safe to embed: it can only WRITE events, never read anything —
|
|
36
|
+
* PostHog's own docs ship it in client-side JS). `RETICLE_TELEMETRY_KEY` overrides it; empty disables.
|
|
37
|
+
*/
|
|
38
|
+
const POSTHOG_KEY = 'phc_q4yCxKMXHfWQ43VAz4HxJXZFLqFi4nBbg5v3avemggYo';
|
|
39
|
+
/**
|
|
40
|
+
* Skip PostHog person-profile processing: our users are anonymous by construction (never $identify'd),
|
|
41
|
+
* so profiles buy nothing — and personless events are up to 4x cheaper while unique counts/retention
|
|
42
|
+
* still key on distinct_id.
|
|
43
|
+
*/
|
|
44
|
+
const POSTHOG_PERSONLESS = { $process_person_profile: false };
|
|
45
|
+
const SEND_TIMEOUT_MS = 2000;
|
|
46
|
+
/**
|
|
47
|
+
* The sender a `detach: true` emit runs in a disowned child (argv: [url, body]) — an in-process fetch
|
|
48
|
+
* keeps Node's event loop alive until the POST finishes, which taxed every short-lived CLI command
|
|
49
|
+
* (`reticle version`/`gate`) ~800ms. Long-lived daemon events still send in-process: a spawn per tool
|
|
50
|
+
* call would be far heavier than a fetch inside an already-running server.
|
|
51
|
+
*/
|
|
52
|
+
const DETACHED_SEND_SCRIPT = "fetch(process.argv[1],{method:'POST',headers:{'content-type':'application/json'}," +
|
|
53
|
+
`body:process.argv[2],signal:AbortSignal.timeout(${SEND_TIMEOUT_MS})})` +
|
|
54
|
+
'.catch(()=>{}).finally(()=>process.exit(0))';
|
|
55
|
+
/** Env var names — mirror cloud-sync's `RETICLE_*` convention. */
|
|
56
|
+
const Env = {
|
|
57
|
+
DISABLE: 'RETICLE_TELEMETRY', // "0" / "false" / "off" → disabled
|
|
58
|
+
DO_NOT_TRACK: 'DO_NOT_TRACK', // the cross-tool opt-out convention (any truthy value)
|
|
59
|
+
URL: 'RETICLE_TELEMETRY_URL', // override the PostHog host (EU cloud / self-hosted)
|
|
60
|
+
KEY: 'RETICLE_TELEMETRY_KEY', // override the PostHog project key
|
|
61
|
+
CI: 'CI', // presence marks a CI environment
|
|
62
|
+
VITEST: 'VITEST', // set by vitest — unit tests must never phone home
|
|
63
|
+
};
|
|
64
|
+
const isDisabled = (env) => {
|
|
65
|
+
const off = new Set(['0', 'false', 'off', 'no']);
|
|
66
|
+
if (off.has((env[Env.DISABLE] ?? '').toLowerCase()))
|
|
67
|
+
return true;
|
|
68
|
+
if (env[Env.VITEST] !== undefined)
|
|
69
|
+
return true; // a test run is not a user
|
|
70
|
+
const dnt = env[Env.DO_NOT_TRACK];
|
|
71
|
+
return typeof dnt === 'string' && dnt !== '' && dnt !== '0';
|
|
72
|
+
};
|
|
73
|
+
/** Read (or mint-and-persist) the anonymous machine id. `firstRun` is true the run that created it. */
|
|
74
|
+
const resolveIdentity = () => {
|
|
75
|
+
try {
|
|
76
|
+
if (existsSync(ID_FILE)) {
|
|
77
|
+
const id = readFileSync(ID_FILE, 'utf8').trim();
|
|
78
|
+
if (id.length > 0)
|
|
79
|
+
return { anonymousId: id, firstRun: false };
|
|
80
|
+
}
|
|
81
|
+
const id = randomUUID();
|
|
82
|
+
mkdirSync(RETICLE_DIR, { recursive: true });
|
|
83
|
+
writeFileSync(ID_FILE, id, 'utf8');
|
|
84
|
+
return { anonymousId: id, firstRun: true };
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
// Can't persist (read-only home, sandbox): still report, just as a fresh ephemeral id each time.
|
|
88
|
+
return { anonymousId: randomUUID(), firstRun: false };
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
/** One-way project fingerprint: distinct-count of this = "projects Reticle is used in", reveals nothing. */
|
|
92
|
+
const projectFingerprint = (cwd) => createHash('sha256').update(cwd).digest('hex').slice(0, 32);
|
|
93
|
+
/** Print the opt-out notice exactly once per machine (honest disclosure, the OSS-trust bar). */
|
|
94
|
+
const showNoticeOnce = () => {
|
|
95
|
+
try {
|
|
96
|
+
if (existsSync(NOTICE_FILE))
|
|
97
|
+
return;
|
|
98
|
+
mkdirSync(RETICLE_DIR, { recursive: true });
|
|
99
|
+
writeFileSync(NOTICE_FILE, '1', 'utf8');
|
|
100
|
+
process.stderr.write('reticle: anonymous usage telemetry helps improve reticle — no code, no PII, ' +
|
|
101
|
+
`and your app's data never leaves your machine (${POLICY_URL}). ` +
|
|
102
|
+
'Opt out any time: reticle telemetry disable\n');
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
/* notice is a courtesy; never fail on it */
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
/** The current telemetry state and which control set it — what `reticle telemetry status` prints. */
|
|
109
|
+
export const describeTelemetry = (env = process.env, dir = RETICLE_DIR) => {
|
|
110
|
+
if (isDisabled(env)) {
|
|
111
|
+
return { enabled: false, reason: 'disabled by environment variable', policyUrl: POLICY_URL };
|
|
112
|
+
}
|
|
113
|
+
if (existsSync(join(dir, 'telemetry-opt-out'))) {
|
|
114
|
+
return {
|
|
115
|
+
enabled: false,
|
|
116
|
+
reason: 'disabled via `reticle telemetry disable`',
|
|
117
|
+
policyUrl: POLICY_URL,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
enabled: true,
|
|
122
|
+
reason: 'anonymous usage metrics only — no code, no PII',
|
|
123
|
+
policyUrl: POLICY_URL,
|
|
124
|
+
};
|
|
125
|
+
};
|
|
126
|
+
/** Persist (or lift) the machine-wide opt-out — `reticle telemetry disable` / `enable`. */
|
|
127
|
+
export const setTelemetryEnabled = (enabled, dir = RETICLE_DIR) => {
|
|
128
|
+
const optOutFile = join(dir, 'telemetry-opt-out');
|
|
129
|
+
if (enabled) {
|
|
130
|
+
rmSync(optOutFile, { force: true });
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
mkdirSync(dir, { recursive: true });
|
|
134
|
+
writeFileSync(optOutFile, '1', 'utf8');
|
|
135
|
+
};
|
|
136
|
+
const NOOP = { emit: async () => { }, enabled: false, firstRun: false };
|
|
137
|
+
/**
|
|
138
|
+
* Build the telemetry emitter for this process. Resolves identity + opt-out ONCE; each `emit` builds a
|
|
139
|
+
* fully-validated core event, maps it into PostHog capture shape, and fires a best-effort POST.
|
|
140
|
+
* `version` is the running reticle version (for the `version` dimension); `now`/`fetchImpl` are
|
|
141
|
+
* injected so this is testable without a clock or network.
|
|
142
|
+
*/
|
|
143
|
+
export const createTelemetry = (opts) => {
|
|
144
|
+
const env = opts.env ?? process.env;
|
|
145
|
+
if (isDisabled(env))
|
|
146
|
+
return NOOP;
|
|
147
|
+
try {
|
|
148
|
+
if (existsSync(OPT_OUT_FILE))
|
|
149
|
+
return NOOP; // the persistent `reticle telemetry disable` opt-out
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
/* unreadable home dir — fall through; the env-var opt-outs above still apply */
|
|
153
|
+
}
|
|
154
|
+
const apiKey = env[Env.KEY] ?? POSTHOG_KEY;
|
|
155
|
+
if (apiKey === '')
|
|
156
|
+
return NOOP; // no key baked in (dev/test build) — nowhere to send, stay silent
|
|
157
|
+
const now = opts.now ?? (() => Date.now());
|
|
158
|
+
const doFetch = opts.fetchImpl ?? fetch;
|
|
159
|
+
const url = `${(env[Env.URL] ?? DEFAULT_URL).replace(/\/+$/, '')}${TELEMETRY_PATH}`;
|
|
160
|
+
const ci = env[Env.CI] !== undefined && env[Env.CI] !== '';
|
|
161
|
+
const os = platform();
|
|
162
|
+
const { anonymousId, firstRun } = resolveIdentity();
|
|
163
|
+
const projectId = projectFingerprint(opts.cwd ?? process.cwd());
|
|
164
|
+
showNoticeOnce();
|
|
165
|
+
const spawnDetached = opts.spawnImpl ??
|
|
166
|
+
((command, args) => {
|
|
167
|
+
spawn(command, args, { detached: true, stdio: 'ignore' }).unref();
|
|
168
|
+
});
|
|
169
|
+
const emit = async (kind, extra) => {
|
|
170
|
+
const event = {
|
|
171
|
+
v: TELEMETRY_EVENT_VERSION,
|
|
172
|
+
anonymousId,
|
|
173
|
+
projectId,
|
|
174
|
+
event: kind,
|
|
175
|
+
ts: now(),
|
|
176
|
+
version: opts.version,
|
|
177
|
+
ci,
|
|
178
|
+
os,
|
|
179
|
+
...(extra?.sessionMs !== undefined ? { sessionMs: extra.sessionMs } : {}),
|
|
180
|
+
...(extra?.tool !== undefined ? { tool: extra.tool } : {}),
|
|
181
|
+
};
|
|
182
|
+
// Map the core contract onto PostHog's capture shape: id/name/time move up, the rest are properties.
|
|
183
|
+
const { anonymousId: distinctId, event: name, ts, ...properties } = event;
|
|
184
|
+
const body = JSON.stringify({
|
|
185
|
+
api_key: apiKey,
|
|
186
|
+
batch: [
|
|
187
|
+
{
|
|
188
|
+
event: name,
|
|
189
|
+
distinct_id: distinctId,
|
|
190
|
+
timestamp: new Date(ts).toISOString(),
|
|
191
|
+
properties: { ...properties, ...POSTHOG_PERSONLESS },
|
|
192
|
+
},
|
|
193
|
+
],
|
|
194
|
+
});
|
|
195
|
+
try {
|
|
196
|
+
if (extra?.detach === true && opts.fetchImpl === undefined) {
|
|
197
|
+
spawnDetached(process.execPath, ['-e', DETACHED_SEND_SCRIPT, url, body]);
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
await doFetch(url, {
|
|
201
|
+
method: 'POST',
|
|
202
|
+
headers: { 'content-type': 'application/json' },
|
|
203
|
+
body,
|
|
204
|
+
signal: AbortSignal.timeout(SEND_TIMEOUT_MS),
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
/* best-effort: a lost metric must never surface to the user */
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
return { emit, enabled: true, firstRun };
|
|
212
|
+
};
|
|
213
|
+
/**
|
|
214
|
+
* The process-wide emitter. One identity resolution + one opt-out check per process; both the CLI
|
|
215
|
+
* lifecycle (install/invoke/session) and the per-tool hook in `runTool` share it.
|
|
216
|
+
*/
|
|
217
|
+
let singleton;
|
|
218
|
+
export const getTelemetry = () => (singleton ??= createTelemetry({ version: SERVER_VERSION }));
|
|
219
|
+
export { TelemetryEventKind };
|
|
220
|
+
//# sourceMappingURL=telemetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/telemetry/telemetry.ts"],"names":[],"mappings":"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"}
|
|
@@ -43,7 +43,7 @@ export function buildDynamicTools(allTools) {
|
|
|
43
43
|
const byName = new Map(allTools.map((t) => [t.name, t]));
|
|
44
44
|
const reticleTools = {
|
|
45
45
|
name: ReticleTool.TOOLS,
|
|
46
|
-
description: 'Discover Reticle tools on demand. Call with no arguments to list every tool (name + one-line summary); call with names:["reticle_network", …] to load full descriptions and parameters for specific tools. Then invoke them with reticle_run. This avoids paying for every tool definition on every turn.',
|
|
46
|
+
description: 'Discover Reticle tools on demand. Call with no arguments to list every tool (name + one-line summary); call with names:["reticle_network", …] to load full descriptions and parameters for specific tools. Then invoke them with reticle_run. This avoids paying for every tool definition on every turn. To make a verification REUSABLE (record once, replay free forever), the flow workflow lives here: reticle_record_start → act → reticle_flow_save → reticle_flow_verify (and reticle_flow_heal on drift). Load those names when you want to save or re-run a flow.',
|
|
47
47
|
inputSchema: {
|
|
48
48
|
names: z
|
|
49
49
|
.array(z.string())
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamic-tools.js","sourceRoot":"","sources":["../../src/tools/dynamic-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C;;;;;;;;;;;;;;;;GAgBG;AAEH,uFAAuF;AACvF,SAAS,aAAa,CAAC,WAAmB;IACxC,MAAM,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;IAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1D,OAAO,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;AACzE,CAAC;AAQD;kFACkF;AAClF,SAAS,SAAS,CAAC,KAAoB;IACrC,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QACpD,IAAI;QACJ,QAAQ,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE;QAC9B,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE;KACtC,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAmB;IACnD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEzD,MAAM,YAAY,GAAY;QAC5B,IAAI,EAAE,WAAW,CAAC,KAAK;QACvB,WAAW,EACT,
|
|
1
|
+
{"version":3,"file":"dynamic-tools.js","sourceRoot":"","sources":["../../src/tools/dynamic-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invoke-tool.d.ts","sourceRoot":"","sources":["../../src/tools/invoke-tool.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"invoke-tool.d.ts","sourceRoot":"","sources":["../../src/tools/invoke-tool.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEpD;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAuBlD,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,EAAE,WAAW,CAAC,MAAM,CAkBnD,CAAC;AAMH;;;;;GAKG;AACH,wBAAsB,OAAO,CAC3B,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,OAAO,CAAC,CAyClB"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { healthEnvelope } from '../session/session-health.js';
|
|
2
|
+
import { getTelemetry, TelemetryEventKind } from '../telemetry/telemetry.js';
|
|
2
3
|
import { asString } from './tools-helpers.js';
|
|
3
4
|
import { ReticleTool } from './tool-names.js';
|
|
4
5
|
/**
|
|
@@ -66,6 +67,9 @@ function isPlainObject(value) {
|
|
|
66
67
|
* (handlers that already add health are left untouched) and never alters non-object results.
|
|
67
68
|
*/
|
|
68
69
|
export async function runTool(tool, deps, args) {
|
|
70
|
+
// Both dispatch paths (MCP + programmatic) pass through here — the one place "which tool is mostly
|
|
71
|
+
// used" can be counted. Fire-and-forget: telemetry never delays or fails a tool call.
|
|
72
|
+
void getTelemetry().emit(TelemetryEventKind.TOOL, { tool: tool.name });
|
|
69
73
|
const rawSessionId = asString(args['sessionId']);
|
|
70
74
|
const bound = SESSION_BOUND_TOOLS.has(tool.name);
|
|
71
75
|
// Resolve the session identity ONCE, up front, for a live-session tool. The lease heartbeat must
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invoke-tool.js","sourceRoot":"","sources":["../../src/tools/invoke-tool.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"invoke-tool.js","sourceRoot":"","sources":["../../src/tools/invoke-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-checker.d.ts","sourceRoot":"","sources":["../../src/update/update-checker.ts"],"names":[],"mappings":"AAcA,UAAU,cAAc;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,+EAA+E;IAC/E,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,UAAU,cAAc;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;KAC5B,CAAC;CACH;
|
|
1
|
+
{"version":3,"file":"update-checker.d.ts","sourceRoot":"","sources":["../../src/update/update-checker.ts"],"names":[],"mappings":"AAcA,UAAU,cAAc;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,+EAA+E;IAC/E,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,UAAU,cAAc;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;KAC5B,CAAC;CACH;AA8BD,wBAAgB,YAAY,IAAI,cAAc,GAAG,IAAI,CAQpD;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAG3D;AAgCD,sGAAsG;AACtG,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC;IACzC,YAAY,EAAE,MAAM,cAAc,GAAG,IAAI,CAAC;IAC1C,YAAY,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI,CAAC;CAClD;AAID;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,cAAc,EAAE,MAAM,EACtB,GAAG,EAAE,MAAM,MAAM,EACjB,KAAK,GAAE,gBAA+B,GACrC,OAAO,CAAC,cAAc,CAAC,CAiCzB"}
|
|
@@ -10,6 +10,31 @@ const MANIFEST_PATH = join(RETICLE_HOME, 'update-manifest.json');
|
|
|
10
10
|
// Poll the package that carries the bin (@reticlehq/server), so the version we compare against and
|
|
11
11
|
// the version we install are the same package — not @reticlehq/core, which only tracks it by luck.
|
|
12
12
|
const NPM_REGISTRY = `https://registry.npmjs.org/${RETICLE_NPM_PACKAGE}/latest`;
|
|
13
|
+
// npm's registry is trusted, but this response is persisted to disk AND echoed into the agent's
|
|
14
|
+
// context, so validate its shape before it flows anywhere: a plausible semver, bounded free-text.
|
|
15
|
+
const VERSION_RE = /^[0-9]+\.[0-9]+\.[0-9]+(?:[-+][0-9A-Za-z.-]+)?$/;
|
|
16
|
+
const MAX_MANIFEST_TEXT = 20_000;
|
|
17
|
+
/** Reject an implausible version (throws → caller falls back to cache) and bound the free-text
|
|
18
|
+
* fields, so a malformed or oversized registry response can neither corrupt nor bloat the manifest. */
|
|
19
|
+
function validateNpmInfo(info) {
|
|
20
|
+
if (typeof info.version !== 'string' || !VERSION_RE.test(info.version)) {
|
|
21
|
+
throw new Error('npm registry returned an implausible version');
|
|
22
|
+
}
|
|
23
|
+
const changelog = typeof info.reticle?.changelog === 'string'
|
|
24
|
+
? info.reticle.changelog.slice(0, MAX_MANIFEST_TEXT)
|
|
25
|
+
: undefined;
|
|
26
|
+
const breakingChanges = Array.isArray(info.reticle?.breakingChanges)
|
|
27
|
+
? info.reticle.breakingChanges
|
|
28
|
+
.filter((x) => typeof x === 'string')
|
|
29
|
+
.slice(0, 100)
|
|
30
|
+
.map((s) => s.slice(0, MAX_MANIFEST_TEXT))
|
|
31
|
+
: undefined;
|
|
32
|
+
const reticle = {
|
|
33
|
+
...(changelog !== undefined ? { changelog } : {}),
|
|
34
|
+
...(breakingChanges !== undefined ? { breakingChanges } : {}),
|
|
35
|
+
};
|
|
36
|
+
return { version: info.version, reticle };
|
|
37
|
+
}
|
|
13
38
|
export function loadManifest() {
|
|
14
39
|
if (!fs.existsSync(MANIFEST_PATH))
|
|
15
40
|
return null;
|
|
@@ -66,7 +91,7 @@ export async function checkForUpdate(currentVersion, now, ports = defaultPorts)
|
|
|
66
91
|
return cached;
|
|
67
92
|
}
|
|
68
93
|
try {
|
|
69
|
-
const info = await ports.fetchInfo();
|
|
94
|
+
const info = validateNpmInfo(await ports.fetchInfo());
|
|
70
95
|
const updateAvailable = info.version !== currentVersion;
|
|
71
96
|
const manifest = {
|
|
72
97
|
currentVersion,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-checker.js","sourceRoot":"","sources":["../../src/update/update-checker.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"update-checker.js","sourceRoot":"","sources":["../../src/update/update-checker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEhC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AACjD,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,EAAE,sBAAsB,CAAC,CAAC;AACjE,mGAAmG;AACnG,mGAAmG;AACnG,MAAM,YAAY,GAAG,8BAA8B,mBAAmB,SAAS,CAAC;AAqBhF,gGAAgG;AAChG,kGAAkG;AAClG,MAAM,UAAU,GAAG,iDAAiD,CAAC;AACrE,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAEjC;uGACuG;AACvG,SAAS,eAAe,CAAC,IAAoB;IAC3C,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,SAAS,GACb,OAAO,IAAI,CAAC,OAAO,EAAE,SAAS,KAAK,QAAQ;QACzC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC;QACpD,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC;QAClE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe;aACzB,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;aACjD,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;aACb,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC;QAC9C,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,OAAO,GAA8B;QACzC,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,GAAG,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9D,CAAC;IACF,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAwB;IACnD,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,YAAY,CAAC,QAAwB,EAAE,GAAiB;IAC/D,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,CAAC;IACzD,OAAO,GAAG,EAAE,GAAG,OAAO,GAAG,qBAAqB,CAAC;AACjD,CAAC;AAED,SAAS,YAAY;IACnB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,GAAG,EAAE,EAAE;YAC1C,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACxB,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBAC/B,IAAI,IAAI,KAAK,CAAC;YAChB,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,IAAI,CAAC;oBACH,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAmB,CAAC,CAAC;gBAC9C,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC9D,CAAC;YACH,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE;YACxB,GAAG,CAAC,OAAO,EAAE,CAAC;YACd,MAAM,CAAC,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC;AASD,MAAM,YAAY,GAAqB,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;AAE/F;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,cAAsB,EACtB,GAAiB,EACjB,QAA0B,YAAY;IAEtC,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;IACpC,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,cAAc,KAAK,cAAc,IAAI,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;QAC7F,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QACtD,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,KAAK,cAAc,CAAC;QACxD,MAAM,QAAQ,GAAmB;YAC/B,cAAc;YACd,aAAa,EAAE,IAAI,CAAC,OAAO;YAC3B,eAAe;YACf,WAAW,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,EAAE;YAC1C,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvF,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,KAAK,SAAS;gBAC7C,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE;gBACnD,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,MAAM,EAAE,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9F,CAAC;QACF,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,6BAA6B,EAAE;YACjC,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAC,CAAC;QACH,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,EAAE,GAAG,MAAM,EAAE,cAAc,EAAE,CAAC;QAC1D,OAAO;YACL,cAAc;YACd,eAAe,EAAE,KAAK;YACtB,WAAW,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,EAAE;SAC3C,CAAC;IACJ,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reticlehq/server",
|
|
3
|
-
"version": "2.2.
|
|
3
|
+
"version": "2.2.1",
|
|
4
4
|
"description": "Reticle bridge + MCP server. Hosts the browser WS endpoint and exposes MCP tools to the coding agent.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"@modelcontextprotocol/sdk": "^1.13.0",
|
|
23
23
|
"ws": "^8.18.0",
|
|
24
24
|
"zod": "^3.24.1",
|
|
25
|
-
"@reticlehq/core": "2.2.
|
|
25
|
+
"@reticlehq/core": "2.2.1"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@types/pngjs": "^6.0.5",
|