relaycast 0.1.2 → 0.1.3

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.
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerOpenClawCommands(program: Command): void;
3
+ //# sourceMappingURL=openclaw.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw.d.ts","sourceRoot":"","sources":["../../src/commands/openclaw.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyD/D"}
@@ -0,0 +1,51 @@
1
+ import { detectOpenClaw, setupSkill } from '@relaycast/openclaw';
2
+ import { loadConfig } from '../config.js';
3
+ function printJson(value) {
4
+ console.log(JSON.stringify(value, null, 2));
5
+ }
6
+ export function registerOpenClawCommands(program) {
7
+ const oc = program
8
+ .command('openclaw')
9
+ .description('OpenClaw integration — add Relaycast to your claw');
10
+ oc.command('status')
11
+ .description('Check OpenClaw installation and Relaycast skill status')
12
+ .action(async () => {
13
+ const detection = await detectOpenClaw();
14
+ printJson({
15
+ openclaw_installed: detection.installed,
16
+ config_dir: detection.configDir,
17
+ config_file: detection.configFile,
18
+ workspace_dir: detection.workspaceDir,
19
+ has_config: detection.config !== null,
20
+ });
21
+ });
22
+ oc.command('setup')
23
+ .description('Install Relaycast skill into OpenClaw workspace')
24
+ .option('-n, --name <name>', 'Name for this claw in Relaycast', 'my-claw')
25
+ .option('-k, --api-key <key>', 'Relaycast workspace API key')
26
+ .action(async (opts) => {
27
+ const cfg = loadConfig();
28
+ const apiKey = opts.apiKey ?? cfg.apiKey;
29
+ if (!apiKey) {
30
+ console.error('Missing API key. Provide --api-key or run: relaycast config set api-key <value>');
31
+ process.exit(1);
32
+ }
33
+ const detection = await detectOpenClaw();
34
+ if (!detection.installed) {
35
+ console.error('OpenClaw not detected at ~/.openclaw/\n' +
36
+ 'Install OpenClaw first: https://github.com/openclaw/openclaw');
37
+ process.exit(1);
38
+ }
39
+ const result = await setupSkill({
40
+ apiKey,
41
+ clawName: opts.name,
42
+ baseUrl: cfg.endpoint,
43
+ });
44
+ console.log(result.message);
45
+ console.log('\nNext steps:');
46
+ console.log(' 1. Restart your OpenClaw daemon to pick up the new skill');
47
+ console.log(' 2. Your claw can now use Relaycast tools (send, read, search, etc.)');
48
+ console.log(' 3. Other claws in the same workspace will see this claw online');
49
+ });
50
+ }
51
+ //# sourceMappingURL=openclaw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw.js","sourceRoot":"","sources":["../../src/commands/openclaw.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAAgB;IACvD,MAAM,EAAE,GAAG,OAAO;SACf,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,mDAAmD,CAAC,CAAC;IAEpE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,wDAAwD,CAAC;SACrE,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,SAAS,GAAG,MAAM,cAAc,EAAE,CAAC;QACzC,SAAS,CAAC;YACR,kBAAkB,EAAE,SAAS,CAAC,SAAS;YACvC,UAAU,EAAE,SAAS,CAAC,SAAS;YAC/B,WAAW,EAAE,SAAS,CAAC,UAAU;YACjC,aAAa,EAAE,SAAS,CAAC,YAAY;YACrC,UAAU,EAAE,SAAS,CAAC,MAAM,KAAK,IAAI;SACtC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,iDAAiD,CAAC;SAC9D,MAAM,CAAC,mBAAmB,EAAE,iCAAiC,EAAE,SAAS,CAAC;SACzE,MAAM,CAAC,qBAAqB,EAAE,6BAA6B,CAAC;SAC5D,MAAM,CAAC,KAAK,EAAE,IAAuC,EAAE,EAAE;QACxD,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC;QACzC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CACX,iFAAiF,CAClF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,cAAc,EAAE,CAAC;QACzC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CACX,yCAAyC;gBACvC,8DAA8D,CACjE,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC;YAC9B,MAAM;YACN,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,OAAO,EAAE,GAAG,CAAC,QAAQ;SACtB,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CACT,uEAAuE,CACxE,CAAC;QACF,OAAO,CAAC,GAAG,CACT,kEAAkE,CACnE,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Command } from 'commander';
2
+ import type { CliTelemetry } from '../telemetry.js';
3
+ export declare function registerTelemetryCommands(program: Command, telemetryInstance: CliTelemetry): void;
4
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/commands/telemetry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,YAAY,EAAmB,MAAM,iBAAiB,CAAC;AA0BrE,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,YAAY,GAAG,IAAI,CA2BjG"}
@@ -0,0 +1,43 @@
1
+ function reasonMessage(status) {
2
+ if (status.reason === 'enabled')
3
+ return 'Telemetry is enabled.';
4
+ if (status.reason === 'env_opt_out') {
5
+ return 'Telemetry disabled by environment variable (DO_NOT_TRACK or RELAYCAST_TELEMETRY_DISABLED).';
6
+ }
7
+ return 'Telemetry disabled by user preference.';
8
+ }
9
+ function printStatus(status) {
10
+ console.log(JSON.stringify({
11
+ enabled: status.enabled,
12
+ reason: status.reason,
13
+ env_opt_out: status.envOptOut,
14
+ user_opt_out: status.userOptOut,
15
+ message: reasonMessage(status),
16
+ }, null, 2));
17
+ }
18
+ export function registerTelemetryCommands(program, telemetryInstance) {
19
+ const telemetry = program
20
+ .command('telemetry')
21
+ .description('Anonymous usage telemetry settings (opt-out)');
22
+ telemetry
23
+ .command('status')
24
+ .description('Show telemetry status and opt-out source')
25
+ .action(() => {
26
+ printStatus(telemetryInstance.status());
27
+ });
28
+ telemetry
29
+ .command('enable')
30
+ .description('Enable telemetry')
31
+ .action(() => {
32
+ const status = telemetryInstance.setEnabled(true);
33
+ printStatus(status);
34
+ });
35
+ telemetry
36
+ .command('disable')
37
+ .description('Disable telemetry')
38
+ .action(() => {
39
+ const status = telemetryInstance.setEnabled(false);
40
+ printStatus(status);
41
+ });
42
+ }
43
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/commands/telemetry.ts"],"names":[],"mappings":"AAGA,SAAS,aAAa,CAAC,MAAuB;IAC5C,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,uBAAuB,CAAC;IAChE,IAAI,MAAM,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;QACpC,OAAO,4FAA4F,CAAC;IACtG,CAAC;IACD,OAAO,wCAAwC,CAAC;AAClD,CAAC;AAED,SAAS,WAAW,CAAC,MAAuB;IAC1C,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CACZ;QACE,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,WAAW,EAAE,MAAM,CAAC,SAAS;QAC7B,YAAY,EAAE,MAAM,CAAC,UAAU;QAC/B,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC;KAC/B,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,OAAgB,EAAE,iBAA+B;IACzF,MAAM,SAAS,GAAG,OAAO;SACtB,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,8CAA8C,CAAC,CAAC;IAE/D,SAAS;SACN,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,0CAA0C,CAAC;SACvD,MAAM,CAAC,GAAG,EAAE;QACX,WAAW,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEL,SAAS;SACN,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,kBAAkB,CAAC;SAC/B,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,MAAM,GAAG,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAClD,WAAW,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;IAEL,SAAS;SACN,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,mBAAmB,CAAC;SAChC,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,MAAM,GAAG,iBAAiB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACnD,WAAW,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;AACP,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- export declare const CLI_VERSION: "0.1.0";
2
+ export declare const CLI_VERSION: "0.1.2";
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAcA,eAAO,MAAM,WAAW,EAAG,OAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAiBA,eAAO,MAAM,WAAW,EAAG,OAAgB,CAAC"}
package/dist/index.js CHANGED
@@ -10,11 +10,68 @@ import { registerSearchCommands } from './commands/search.js';
10
10
  import { registerReactionCommands } from './commands/reactions.js';
11
11
  import { registerFileCommands } from './commands/files.js';
12
12
  import { registerBillingCommands } from './commands/billing.js';
13
- export const CLI_VERSION = '0.1.0';
13
+ import { registerOpenClawCommands } from './commands/openclaw.js';
14
+ import { registerTelemetryCommands } from './commands/telemetry.js';
15
+ import { createCliTelemetry } from './telemetry.js';
16
+ export const CLI_VERSION = '0.1.2';
14
17
  const program = new Command();
18
+ const telemetry = createCliTelemetry(CLI_VERSION);
19
+ let activeCommandPath = null;
20
+ let activeCommandStartedAt = 0;
21
+ function getCommandPath(command) {
22
+ const names = [];
23
+ let current = command;
24
+ while (current && current.parent) {
25
+ const name = current.name();
26
+ if (name)
27
+ names.unshift(name);
28
+ current = current.parent;
29
+ }
30
+ return names.join(' ');
31
+ }
32
+ function captureDerivedEvents(commandPath, args) {
33
+ if (commandPath === 'workspace create') {
34
+ telemetry.capture('relaycast_workspace_created', { source_surface: 'cli' });
35
+ return;
36
+ }
37
+ if (commandPath === 'send') {
38
+ const target = typeof args[0] === 'string' ? args[0] : '';
39
+ telemetry.capture('relaycast_message_sent', {
40
+ source_surface: 'cli',
41
+ message_kind: target.startsWith('@') ? 'dm' : 'channel',
42
+ command: commandPath,
43
+ });
44
+ return;
45
+ }
46
+ if (commandPath === 'reply') {
47
+ telemetry.capture('relaycast_message_sent', {
48
+ source_surface: 'cli',
49
+ message_kind: 'thread_reply',
50
+ command: commandPath,
51
+ });
52
+ return;
53
+ }
54
+ if (commandPath === 'group-dm') {
55
+ const participants = Array.isArray(args[0]) ? args[0].length : undefined;
56
+ telemetry.capture('relaycast_message_sent', {
57
+ source_surface: 'cli',
58
+ message_kind: 'group_dm',
59
+ participants_count: participants,
60
+ command: commandPath,
61
+ });
62
+ return;
63
+ }
64
+ if (commandPath === 'inbox') {
65
+ telemetry.capture('relaycast_inbox_checked', { source_surface: 'cli' });
66
+ return;
67
+ }
68
+ if (commandPath === 'agent register') {
69
+ telemetry.capture('relaycast_agent_registered', { source_surface: 'cli' });
70
+ }
71
+ }
15
72
  program
16
- .name('relay')
17
- .description('Relay — agent-to-agent messaging CLI')
73
+ .name('relaycast')
74
+ .description('Relaycast — agent-to-agent messaging CLI')
18
75
  .version(CLI_VERSION);
19
76
  registerWorkspaceCommands(program);
20
77
  registerAgentCommands(program);
@@ -26,5 +83,55 @@ registerSearchCommands(program);
26
83
  registerReactionCommands(program);
27
84
  registerFileCommands(program);
28
85
  registerBillingCommands(program);
29
- program.parse();
86
+ registerOpenClawCommands(program);
87
+ registerTelemetryCommands(program, telemetry);
88
+ program.hook('preAction', (_thisCommand, actionCommand) => {
89
+ const commandPath = getCommandPath(actionCommand);
90
+ if (!commandPath)
91
+ return;
92
+ activeCommandPath = commandPath;
93
+ activeCommandStartedAt = Date.now();
94
+ });
95
+ program.hook('postAction', async (_thisCommand, actionCommand) => {
96
+ const commandPath = getCommandPath(actionCommand);
97
+ if (!commandPath)
98
+ return;
99
+ const durationMs = Math.max(Date.now() - activeCommandStartedAt, 0);
100
+ telemetry.capture('relaycast_cli_command_completed', {
101
+ command: commandPath,
102
+ duration_ms: durationMs,
103
+ source_surface: 'cli',
104
+ });
105
+ captureDerivedEvents(commandPath, actionCommand.processedArgs);
106
+ activeCommandPath = null;
107
+ activeCommandStartedAt = 0;
108
+ await telemetry.flush();
109
+ });
110
+ telemetry.capture('relaycast_cli_started', {
111
+ source_surface: 'cli',
112
+ command_count: Math.max(process.argv.length - 2, 0),
113
+ });
114
+ telemetry.captureFirstRunIfNeeded();
115
+ process.on('beforeExit', () => {
116
+ void telemetry.flush();
117
+ });
118
+ void program.parseAsync().catch(async (error) => {
119
+ if (activeCommandPath) {
120
+ const durationMs = Math.max(Date.now() - activeCommandStartedAt, 0);
121
+ telemetry.capture('relaycast_cli_command_failed', {
122
+ command: activeCommandPath,
123
+ duration_ms: durationMs,
124
+ source_surface: 'cli',
125
+ error_name: error instanceof Error ? error.name : 'UnknownError',
126
+ });
127
+ }
128
+ await telemetry.flush();
129
+ if (error instanceof Error) {
130
+ console.error(error.message);
131
+ }
132
+ else {
133
+ console.error(String(error));
134
+ }
135
+ process.exit(1);
136
+ });
30
137
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,MAAM,CAAC,MAAM,WAAW,GAAG,OAAgB,CAAC;AAE5C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,sCAAsC,CAAC;KACnD,OAAO,CAAC,WAAW,CAAC,CAAC;AAExB,yBAAyB,CAAC,OAAO,CAAC,CAAC;AACnC,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACjC,yBAAyB,CAAC,OAAO,CAAC,CAAC;AACnC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,wBAAwB,CAAC,OAAO,CAAC,CAAC;AAClC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,uBAAuB,CAAC,OAAO,CAAC,CAAC;AAEjC,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export interface TelemetryStatus {
2
+ enabled: boolean;
3
+ reason: 'enabled' | 'env_opt_out' | 'user_opt_out';
4
+ envOptOut: boolean;
5
+ userOptOut: boolean;
6
+ }
7
+ export interface CliTelemetry {
8
+ capture: (event: string, properties?: Record<string, unknown>) => void;
9
+ captureFirstRunIfNeeded: () => void;
10
+ flush: (timeoutMs?: number) => Promise<void>;
11
+ status: () => TelemetryStatus;
12
+ setEnabled: (enabled: boolean) => TelemetryStatus;
13
+ getAnonymousId: () => string;
14
+ }
15
+ export declare function createCliTelemetry(cliVersion?: string): CliTelemetry;
16
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,cAAc,CAAC;IACnD,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACvE,uBAAuB,EAAE,MAAM,IAAI,CAAC;IACpC,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,EAAE,MAAM,eAAe,CAAC;IAC9B,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,eAAe,CAAC;IAClD,cAAc,EAAE,MAAM,MAAM,CAAC;CAC9B;AAwID,wBAAgB,kBAAkB,CAAC,UAAU,SAAY,GAAG,YAAY,CA6EvE"}
@@ -0,0 +1,197 @@
1
+ import fs from 'node:fs';
2
+ import http from 'node:http';
3
+ import https from 'node:https';
4
+ import os from 'node:os';
5
+ import path from 'node:path';
6
+ import { randomUUID } from 'node:crypto';
7
+ const TELEMETRY_PATH = path.join(os.homedir(), '.relay', 'telemetry.json');
8
+ const DEFAULT_POSTHOG_HOST = 'https://us.i.posthog.com';
9
+ const DEFAULT_POSTHOG_KEY = 'phc_OAqBdey9pESZCcwaen9Fpyz6Ez8QKiMmLOnvFknXzg4';
10
+ function isTruthy(value) {
11
+ if (!value)
12
+ return false;
13
+ const normalized = value.trim().toLowerCase();
14
+ return normalized === '1' || normalized === 'true' || normalized === 'yes' || normalized === 'on';
15
+ }
16
+ function getPostHogKey() {
17
+ return process.env.POSTHOG_API_KEY ??
18
+ process.env.RELAYCAST_POSTHOG_KEY ??
19
+ process.env.POSTHOG_KEY ??
20
+ DEFAULT_POSTHOG_KEY;
21
+ }
22
+ function getPostHogHost() {
23
+ const configured = process.env.POSTHOG_HOST ??
24
+ process.env.RELAYCAST_POSTHOG_HOST ??
25
+ DEFAULT_POSTHOG_HOST;
26
+ return configured.endsWith('/') ? configured.slice(0, -1) : configured;
27
+ }
28
+ function loadState() {
29
+ try {
30
+ const raw = fs.readFileSync(TELEMETRY_PATH, 'utf8');
31
+ const parsed = JSON.parse(raw);
32
+ if (parsed &&
33
+ typeof parsed === 'object' &&
34
+ 'anonymousId' in parsed &&
35
+ typeof parsed.anonymousId === 'string') {
36
+ return parsed;
37
+ }
38
+ }
39
+ catch (err) {
40
+ const e = err;
41
+ if (e.code !== 'ENOENT') {
42
+ // Ignore malformed telemetry files and overwrite with fresh state.
43
+ }
44
+ }
45
+ const state = { anonymousId: randomUUID() };
46
+ saveState(state);
47
+ return state;
48
+ }
49
+ function saveState(state) {
50
+ try {
51
+ const dir = path.dirname(TELEMETRY_PATH);
52
+ fs.mkdirSync(dir, { recursive: true });
53
+ fs.writeFileSync(TELEMETRY_PATH, JSON.stringify(state, null, 2) + '\n', 'utf8');
54
+ }
55
+ catch {
56
+ // Best-effort persistence: if filesystem is read-only or unavailable,
57
+ // telemetry will still work with in-memory state
58
+ }
59
+ }
60
+ function getStatus(state) {
61
+ const envOptOut = isTruthy(process.env.DO_NOT_TRACK) || isTruthy(process.env.RELAYCAST_TELEMETRY_DISABLED);
62
+ const userOptOut = state.telemetryDisabled === true;
63
+ if (envOptOut) {
64
+ return {
65
+ enabled: false,
66
+ reason: 'env_opt_out',
67
+ envOptOut,
68
+ userOptOut,
69
+ };
70
+ }
71
+ if (userOptOut) {
72
+ return {
73
+ enabled: false,
74
+ reason: 'user_opt_out',
75
+ envOptOut,
76
+ userOptOut,
77
+ };
78
+ }
79
+ return {
80
+ enabled: true,
81
+ reason: 'enabled',
82
+ envOptOut,
83
+ userOptOut,
84
+ };
85
+ }
86
+ function postJson(urlString, payload) {
87
+ return new Promise((resolve) => {
88
+ let resolved = false;
89
+ const finish = () => {
90
+ if (resolved)
91
+ return;
92
+ resolved = true;
93
+ resolve();
94
+ };
95
+ try {
96
+ const url = new URL(urlString);
97
+ const body = JSON.stringify(payload);
98
+ const client = url.protocol === 'http:' ? http : https;
99
+ const req = client.request({
100
+ hostname: url.hostname,
101
+ port: url.port ? parseInt(url.port, 10) : undefined,
102
+ path: `${url.pathname}${url.search}`,
103
+ method: 'POST',
104
+ headers: {
105
+ 'content-type': 'application/json',
106
+ 'content-length': Buffer.byteLength(body),
107
+ },
108
+ }, (res) => {
109
+ res.resume();
110
+ res.on('end', finish);
111
+ res.on('error', finish);
112
+ });
113
+ req.on('error', finish);
114
+ req.setTimeout(1000, () => {
115
+ req.destroy();
116
+ finish();
117
+ });
118
+ req.write(body);
119
+ req.end();
120
+ }
121
+ catch {
122
+ finish();
123
+ }
124
+ });
125
+ }
126
+ export function createCliTelemetry(cliVersion = 'unknown') {
127
+ const state = loadState();
128
+ const sessionId = randomUUID();
129
+ const pending = new Set();
130
+ const distinctId = process.env.RELAYCAST_TELEMETRY_DISTINCT_ID || state.anonymousId;
131
+ const distinctIdSource = process.env.RELAYCAST_TELEMETRY_DISTINCT_ID
132
+ ? 'env'
133
+ : 'generated';
134
+ const capture = (event, properties = {}) => {
135
+ const status = getStatus(state);
136
+ if (!status.enabled)
137
+ return;
138
+ const payload = {
139
+ api_key: getPostHogKey(),
140
+ event,
141
+ distinct_id: distinctId,
142
+ properties: {
143
+ surface: 'cli',
144
+ cli_version: cliVersion,
145
+ session_id: sessionId,
146
+ node_version: process.version,
147
+ platform: process.platform,
148
+ arch: process.arch,
149
+ distinct_id_source: distinctIdSource,
150
+ ...properties,
151
+ },
152
+ };
153
+ const promise = postJson(`${getPostHogHost()}/capture/`, payload);
154
+ pending.add(promise);
155
+ void promise.finally(() => pending.delete(promise));
156
+ };
157
+ const captureFirstRunIfNeeded = () => {
158
+ if (state.firstRunCaptured)
159
+ return;
160
+ const status = getStatus(state);
161
+ if (!status.enabled)
162
+ return;
163
+ state.firstRunCaptured = true;
164
+ saveState(state);
165
+ capture('relaycast_cli_first_run', {
166
+ install_source: process.env.RELAYCAST_INSTALL_SOURCE ?? 'unknown',
167
+ install_ref: process.env.RELAYCAST_INSTALL_REF ?? null,
168
+ command_count: Math.max(process.argv.length - 2, 0),
169
+ });
170
+ };
171
+ const flush = async (timeoutMs = 300) => {
172
+ const tasks = Array.from(pending);
173
+ if (tasks.length === 0)
174
+ return;
175
+ await Promise.race([
176
+ Promise.allSettled(tasks).then(() => undefined),
177
+ new Promise((resolve) => {
178
+ const timer = setTimeout(resolve, timeoutMs);
179
+ timer.unref?.();
180
+ }),
181
+ ]);
182
+ };
183
+ const setEnabled = (enabled) => {
184
+ state.telemetryDisabled = !enabled;
185
+ saveState(state);
186
+ return getStatus(state);
187
+ };
188
+ return {
189
+ capture,
190
+ captureFirstRunIfNeeded,
191
+ flush,
192
+ status: () => getStatus(state),
193
+ setEnabled,
194
+ getAnonymousId: () => state.anonymousId,
195
+ };
196
+ }
197
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "relaycast",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "Headless Slack for AI agents. Channels, threads, DMs, reactions, and real-time events for multi-agent communication.",
5
5
  "keywords": [
6
6
  "ai",
@@ -33,8 +33,9 @@
33
33
  "lint": "eslint src/"
34
34
  },
35
35
  "dependencies": {
36
- "@relaycast/sdk": "0.1.2",
37
- "@relaycast/types": "0.1.2",
36
+ "@relaycast/openclaw": "0.1.3",
37
+ "@relaycast/sdk": "0.1.3",
38
+ "@relaycast/types": "0.1.3",
38
39
  "commander": "^14.0.3"
39
40
  },
40
41
  "files": [