agent-relay 12.2.2 → 12.2.4
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/bootstrap.d.ts.map +1 -1
- package/dist/cli/bootstrap.js +12 -5
- package/dist/cli/bootstrap.js.map +1 -1
- package/dist/cli/commands/cloud-v1-deprecations.d.ts +44 -0
- package/dist/cli/commands/cloud-v1-deprecations.d.ts.map +1 -0
- package/dist/cli/commands/cloud-v1-deprecations.js +108 -0
- package/dist/cli/commands/cloud-v1-deprecations.js.map +1 -0
- package/dist/cli/commands/cloud.d.ts.map +1 -1
- package/dist/cli/commands/cloud.js +3 -0
- package/dist/cli/commands/cloud.js.map +1 -1
- package/dist/cli/commands/local-agent.d.ts.map +1 -1
- package/dist/cli/commands/local-agent.js +61 -5
- package/dist/cli/commands/local-agent.js.map +1 -1
- package/dist/cli/commands/local-workflow.d.ts.map +1 -1
- package/dist/cli/commands/local-workflow.js +3 -0
- package/dist/cli/commands/local-workflow.js.map +1 -1
- package/dist/cli/commands/product-surfaces.d.ts +67 -0
- package/dist/cli/commands/product-surfaces.d.ts.map +1 -0
- package/dist/cli/commands/product-surfaces.js +165 -0
- package/dist/cli/commands/product-surfaces.js.map +1 -0
- package/dist/cli/commands/session.d.ts +17 -0
- package/dist/cli/commands/session.d.ts.map +1 -1
- package/dist/cli/commands/session.js +65 -1
- package/dist/cli/commands/session.js.map +1 -1
- package/dist/cli/lib/deprecate-command.d.ts +74 -0
- package/dist/cli/lib/deprecate-command.d.ts.map +1 -0
- package/dist/cli/lib/deprecate-command.js +107 -0
- package/dist/cli/lib/deprecate-command.js.map +1 -0
- package/dist/cli/lib/relay-cli-surface.d.ts +93 -0
- package/dist/cli/lib/relay-cli-surface.d.ts.map +1 -0
- package/dist/cli/lib/relay-cli-surface.js +237 -0
- package/dist/cli/lib/relay-cli-surface.js.map +1 -0
- package/dist/index.cjs +60 -7
- package/package.json +13 -9
- package/dist/cli/commands/reflex.d.ts +0 -18
- package/dist/cli/commands/reflex.d.ts.map +0 -1
- package/dist/cli/commands/reflex.js +0 -181
- package/dist/cli/commands/reflex.js.map +0 -1
package/dist/index.cjs
CHANGED
|
@@ -303,7 +303,7 @@ __export(index_exports, {
|
|
|
303
303
|
module.exports = __toCommonJS(index_exports);
|
|
304
304
|
|
|
305
305
|
// ../../node_modules/@relaycast/sdk/dist/version.js
|
|
306
|
-
var SDK_VERSION = "8.
|
|
306
|
+
var SDK_VERSION = "8.11.1";
|
|
307
307
|
|
|
308
308
|
// ../../node_modules/zod/v4/classic/external.js
|
|
309
309
|
var external_exports = {};
|
|
@@ -21288,6 +21288,8 @@ var FleetCapabilitySchema = external_exports.object({
|
|
|
21288
21288
|
global: external_exports.boolean().optional(),
|
|
21289
21289
|
/** `action` capability opts into the offline queue when its provider is down. */
|
|
21290
21290
|
queue: external_exports.boolean().optional(),
|
|
21291
|
+
/** Task handlers must accept an execution fence before starting work. */
|
|
21292
|
+
execution_mode: external_exports.enum(["short", "task"]).optional(),
|
|
21291
21293
|
metadata: external_exports.record(external_exports.string(), FleetWireJsonValueSchema).optional()
|
|
21292
21294
|
}).strict();
|
|
21293
21295
|
var FleetProviderIdentitySchema = external_exports.object({
|
|
@@ -21424,20 +21426,58 @@ var FleetDeliveryAckMessageSchema = external_exports.object({
|
|
|
21424
21426
|
agent: external_exports.string(),
|
|
21425
21427
|
up_to_seq: external_exports.number().int().nonnegative()
|
|
21426
21428
|
}).strict();
|
|
21429
|
+
var FleetTaskContextSchema = external_exports.object({
|
|
21430
|
+
run_id: external_exports.string().min(1).max(512).refine((value) => value.trim() === value),
|
|
21431
|
+
step_id: external_exports.string().min(1).max(512).refine((value) => value.trim() === value),
|
|
21432
|
+
dispatch_id: external_exports.string().min(1).max(512).refine((value) => value.trim() === value),
|
|
21433
|
+
timeout_ms: external_exports.number().int().min(1).max(864e5)
|
|
21434
|
+
}).strict();
|
|
21435
|
+
var FleetTaskExecutionSchema = external_exports.object({
|
|
21436
|
+
execution_id: external_exports.string().min(1),
|
|
21437
|
+
run_id: external_exports.string(),
|
|
21438
|
+
step_id: external_exports.string(),
|
|
21439
|
+
dispatch_id: external_exports.string(),
|
|
21440
|
+
deadline: external_exports.string().datetime()
|
|
21441
|
+
}).strict();
|
|
21442
|
+
var FleetActionAcceptMessageSchema = external_exports.object({
|
|
21443
|
+
...FleetRequestEnvelopeFields,
|
|
21444
|
+
id: external_exports.string().min(1),
|
|
21445
|
+
type: external_exports.literal("action.accept"),
|
|
21446
|
+
invocation_id: external_exports.string().min(1),
|
|
21447
|
+
execution_id: external_exports.string().min(1),
|
|
21448
|
+
worker_generation: external_exports.string().min(1).max(512)
|
|
21449
|
+
}).strict();
|
|
21450
|
+
var taskResultFields = {
|
|
21451
|
+
final: external_exports.boolean().optional(),
|
|
21452
|
+
execution_id: external_exports.string().min(1).optional(),
|
|
21453
|
+
worker_generation: external_exports.string().min(1).max(512).optional(),
|
|
21454
|
+
accounting: external_exports.record(external_exports.string(), external_exports.number().finite().nonnegative()).optional()
|
|
21455
|
+
};
|
|
21456
|
+
function requireTaskResultFence(message, context) {
|
|
21457
|
+
if (message.final === void 0 && message.execution_id === void 0 && message.worker_generation === void 0 && message.accounting === void 0)
|
|
21458
|
+
return;
|
|
21459
|
+
for (const field of ["id", "final", "execution_id", "worker_generation"]) {
|
|
21460
|
+
if (message[field] === void 0 || message[field] === "") {
|
|
21461
|
+
context.addIssue({ code: "custom", path: [field], message: "Task results require a correlated execution fence and explicit final flag" });
|
|
21462
|
+
}
|
|
21463
|
+
}
|
|
21464
|
+
}
|
|
21427
21465
|
var FleetActionResultOutputMessageSchema = external_exports.object({
|
|
21428
21466
|
...FleetRequestEnvelopeFields,
|
|
21467
|
+
...taskResultFields,
|
|
21429
21468
|
type: external_exports.literal("action.result"),
|
|
21430
21469
|
invocation_id: external_exports.string(),
|
|
21431
21470
|
output: FleetWireJsonValueSchema,
|
|
21432
21471
|
error: external_exports.never().optional()
|
|
21433
|
-
}).strict().superRefine(forbidOwnProperty("error"));
|
|
21472
|
+
}).strict().superRefine(forbidOwnProperty("error")).superRefine(requireTaskResultFence);
|
|
21434
21473
|
var FleetActionResultErrorMessageSchema = external_exports.object({
|
|
21435
21474
|
...FleetRequestEnvelopeFields,
|
|
21475
|
+
...taskResultFields,
|
|
21436
21476
|
type: external_exports.literal("action.result"),
|
|
21437
21477
|
invocation_id: external_exports.string(),
|
|
21438
21478
|
error: external_exports.string(),
|
|
21439
21479
|
output: external_exports.never().optional()
|
|
21440
|
-
}).strict().superRefine(forbidOwnProperty("output"));
|
|
21480
|
+
}).strict().superRefine(forbidOwnProperty("output")).superRefine(requireTaskResultFence);
|
|
21441
21481
|
var FleetActionResultMessageSchema = external_exports.union([
|
|
21442
21482
|
FleetActionResultOutputMessageSchema,
|
|
21443
21483
|
FleetActionResultErrorMessageSchema
|
|
@@ -21497,7 +21537,8 @@ var FleetActionInvokeMessageSchema = external_exports.object({
|
|
|
21497
21537
|
action: external_exports.string(),
|
|
21498
21538
|
agent_id: external_exports.string().optional(),
|
|
21499
21539
|
agent_name: external_exports.string().optional(),
|
|
21500
|
-
input: FleetWireJsonValueSchema
|
|
21540
|
+
input: FleetWireJsonValueSchema,
|
|
21541
|
+
task_execution: FleetTaskExecutionSchema.optional()
|
|
21501
21542
|
}).strict();
|
|
21502
21543
|
var FleetContextUpdateMessageSchema = external_exports.object({
|
|
21503
21544
|
...FleetWireEnvelopeFields,
|
|
@@ -21527,6 +21568,7 @@ var FleetPingMessageSchema = external_exports.object({
|
|
|
21527
21568
|
type: external_exports.literal("ping")
|
|
21528
21569
|
}).strict();
|
|
21529
21570
|
var FleetBrokerToRelaycastNonActionResultMessageSchema = external_exports.discriminatedUnion("type", [
|
|
21571
|
+
FleetActionAcceptMessageSchema,
|
|
21530
21572
|
FleetNodeRegisterMessageSchema,
|
|
21531
21573
|
FleetNodeHeartbeatMessageSchema,
|
|
21532
21574
|
FleetNodeDeregisterMessageSchema,
|
|
@@ -22326,6 +22368,7 @@ function idempotencyHeaders(opts) {
|
|
|
22326
22368
|
}
|
|
22327
22369
|
};
|
|
22328
22370
|
}
|
|
22371
|
+
var DIRECT_NODE_TOKEN_MAX_USES = 3;
|
|
22329
22372
|
function normalizeSubscriptionChannel(channel) {
|
|
22330
22373
|
const trimmed = channel.trim();
|
|
22331
22374
|
if (trimmed === "@self")
|
|
@@ -22349,6 +22392,7 @@ var AgentClient = class {
|
|
|
22349
22392
|
pendingHeartbeat = null;
|
|
22350
22393
|
wsOptions;
|
|
22351
22394
|
directNodeToken = null;
|
|
22395
|
+
directNodeTokenUses = 0;
|
|
22352
22396
|
manualSubscriptions = /* @__PURE__ */ new Set();
|
|
22353
22397
|
managedSubscriptions = /* @__PURE__ */ new Map();
|
|
22354
22398
|
activeWsChannels = /* @__PURE__ */ new Set();
|
|
@@ -22408,8 +22452,13 @@ var AgentClient = class {
|
|
|
22408
22452
|
}
|
|
22409
22453
|
}
|
|
22410
22454
|
async fetchDirectNodeToken() {
|
|
22455
|
+
if (this.directNodeToken && this.directNodeTokenUses < DIRECT_NODE_TOKEN_MAX_USES) {
|
|
22456
|
+
this.directNodeTokenUses += 1;
|
|
22457
|
+
return this.directNodeToken.token;
|
|
22458
|
+
}
|
|
22411
22459
|
const token = await this.client.post("/v1/agent/node-token", {});
|
|
22412
22460
|
this.directNodeToken = token;
|
|
22461
|
+
this.directNodeTokenUses = 1;
|
|
22413
22462
|
return token.token;
|
|
22414
22463
|
}
|
|
22415
22464
|
directNodeRegistration() {
|
|
@@ -22441,6 +22490,7 @@ var AgentClient = class {
|
|
|
22441
22490
|
autoAckDeliveries: true
|
|
22442
22491
|
}, this.client.internalOrigin));
|
|
22443
22492
|
this.ws.on("open", () => {
|
|
22493
|
+
this.directNodeTokenUses = 0;
|
|
22444
22494
|
void this.presence.markOnline().catch(() => {
|
|
22445
22495
|
});
|
|
22446
22496
|
this.startAutoHeartbeat();
|
|
@@ -25754,16 +25804,19 @@ function toRelayCapability(raw) {
|
|
|
25754
25804
|
function toRelayNode(raw) {
|
|
25755
25805
|
const node2 = raw ?? {};
|
|
25756
25806
|
const rawStatus = readStr(node2, "status");
|
|
25807
|
+
const status = rawStatus === "online" || rawStatus === "offline" ? rawStatus : "unknown";
|
|
25808
|
+
const live = readBoolean(node2, "live");
|
|
25809
|
+
const activeAgents = live !== true || status === "offline" ? void 0 : readNumber(node2, "activeAgents", "active_agents");
|
|
25757
25810
|
return {
|
|
25758
25811
|
id: readStr(node2, "id", "node_id"),
|
|
25759
25812
|
nodeId: readStr(node2, "nodeId", "node_id"),
|
|
25760
25813
|
name: readStr(node2, "name") ?? "",
|
|
25761
|
-
status
|
|
25762
|
-
live
|
|
25814
|
+
status,
|
|
25815
|
+
live,
|
|
25763
25816
|
capabilities: Array.isArray(node2.capabilities) ? node2.capabilities.map(toRelayNodeCapability) : [],
|
|
25764
25817
|
repoKeys: readRepoKeys(node2),
|
|
25765
25818
|
maxAgents: readNumber(node2, "maxAgents", "max_agents"),
|
|
25766
|
-
activeAgents
|
|
25819
|
+
activeAgents,
|
|
25767
25820
|
handlersLive: readBoolean(node2, "handlersLive", "handlers_live"),
|
|
25768
25821
|
load: readNumber(node2, "load"),
|
|
25769
25822
|
lastHeartbeatAt: readStr(node2, "lastHeartbeatAt", "last_heartbeat_at"),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-relay",
|
|
3
|
-
"version": "12.2.
|
|
3
|
+
"version": "12.2.4",
|
|
4
4
|
"description": "Real-time agent-to-agent communication system",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.cjs",
|
|
@@ -43,18 +43,22 @@
|
|
|
43
43
|
"pack:validate": "npm pack --dry-run"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@agent-relay/
|
|
47
|
-
"@agent-relay/
|
|
48
|
-
"@agent-relay/
|
|
49
|
-
"@agent-relay/
|
|
50
|
-
"@agent-relay/
|
|
51
|
-
"@agent-relay/
|
|
52
|
-
"@agent-relay/
|
|
53
|
-
"@agent-relay/
|
|
46
|
+
"@agent-relay/cli-surface": "12.2.4",
|
|
47
|
+
"@agent-relay/cloud": "12.2.4",
|
|
48
|
+
"@agent-relay/config": "12.2.4",
|
|
49
|
+
"@agent-relay/fleet": "12.2.4",
|
|
50
|
+
"@agent-relay/harness-driver": "12.2.4",
|
|
51
|
+
"@agent-relay/harnesses": "12.2.4",
|
|
52
|
+
"@agent-relay/sdk": "12.2.4",
|
|
53
|
+
"@agent-relay/session": "12.2.4",
|
|
54
|
+
"@agent-relay/utils": "12.2.4",
|
|
54
55
|
"@modelcontextprotocol/sdk": "^1.23.0",
|
|
55
56
|
"@relayfile/client": "^0.10.27",
|
|
57
|
+
"@relayfile/sdk": "^0.10.63",
|
|
56
58
|
"@relayflows/cli": "1.0.1",
|
|
59
|
+
"@relayflows/sdk": "^2.0.16",
|
|
57
60
|
"@xterm/headless": "^6.0.0",
|
|
61
|
+
"ai-hist": "^0.18.0",
|
|
58
62
|
"commander": "^12.1.0",
|
|
59
63
|
"dotenv": "^17.2.3",
|
|
60
64
|
"jiti": "^2.6.1",
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { Command } from 'commander';
|
|
2
|
-
export type LoginCloudResult = {
|
|
3
|
-
ok: true;
|
|
4
|
-
} | {
|
|
5
|
-
ok: false;
|
|
6
|
-
error: string;
|
|
7
|
-
};
|
|
8
|
-
export interface ReflexDependencies {
|
|
9
|
-
homedir: () => string;
|
|
10
|
-
readRelayAuth: () => Promise<{
|
|
11
|
-
accessToken: string;
|
|
12
|
-
} | null>;
|
|
13
|
-
loginToCloud: (relayAccessToken: string) => Promise<LoginCloudResult>;
|
|
14
|
-
prompt: (question: string) => Promise<boolean>;
|
|
15
|
-
log: (...args: unknown[]) => void;
|
|
16
|
-
}
|
|
17
|
-
export declare function registerReflexCommands(program: Command, overrides?: Partial<ReflexDependencies>): void;
|
|
18
|
-
//# sourceMappingURL=reflex.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reflex.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/reflex.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,MAAM,gBAAgB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3E,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IAC7D,YAAY,EAAE,CAAC,gBAAgB,EAAE,MAAM,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACtE,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACnC;AAyHD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,GAAE,OAAO,CAAC,kBAAkB,CAAM,GAAG,IAAI,CA+E1G"}
|
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
import { chmod, mkdir, writeFile } from 'node:fs/promises';
|
|
2
|
-
import os from 'node:os';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
import readline from 'node:readline';
|
|
5
|
-
import { readReflexState, writeReflexState } from '@agent-relay/config';
|
|
6
|
-
const ALLOWED_RELAYHISTORY_HOSTS = new Set(['history.agentrelay.com']);
|
|
7
|
-
function validateRelayhistoryBaseUrl(raw) {
|
|
8
|
-
let parsed;
|
|
9
|
-
try {
|
|
10
|
-
parsed = new URL(raw);
|
|
11
|
-
}
|
|
12
|
-
catch {
|
|
13
|
-
return { ok: false, error: `AI_HIST_BASE_URL is not a valid URL: ${raw}` };
|
|
14
|
-
}
|
|
15
|
-
const isLocalDev = parsed.hostname === 'localhost' || parsed.hostname === '127.0.0.1' || parsed.hostname === '::1';
|
|
16
|
-
if (!isLocalDev && !ALLOWED_RELAYHISTORY_HOSTS.has(parsed.hostname)) {
|
|
17
|
-
return {
|
|
18
|
-
ok: false,
|
|
19
|
-
error: `AI_HIST_BASE_URL hostname "${parsed.hostname}" is not an allowed relayhistory host`,
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
return { ok: true, url: parsed };
|
|
23
|
-
}
|
|
24
|
-
function promptYesNo(question) {
|
|
25
|
-
if (!process.stdin.isTTY) {
|
|
26
|
-
return Promise.resolve(false);
|
|
27
|
-
}
|
|
28
|
-
const rl = readline.createInterface({
|
|
29
|
-
input: process.stdin,
|
|
30
|
-
output: process.stdout,
|
|
31
|
-
});
|
|
32
|
-
return new Promise((resolve) => {
|
|
33
|
-
rl.question(question, (answer) => {
|
|
34
|
-
rl.close();
|
|
35
|
-
const normalized = answer.trim().toLowerCase();
|
|
36
|
-
resolve(normalized === 'y' || normalized === 'yes');
|
|
37
|
-
});
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
async function defaultReadRelayAuth() {
|
|
41
|
-
const { readStoredAuth } = await import('@agent-relay/cloud');
|
|
42
|
-
return readStoredAuth();
|
|
43
|
-
}
|
|
44
|
-
async function defaultLoginToCloud(relayAccessToken) {
|
|
45
|
-
const rawBase = process.env.AI_HIST_BASE_URL ?? 'https://history.agentrelay.com';
|
|
46
|
-
const validated = validateRelayhistoryBaseUrl(rawBase);
|
|
47
|
-
if (!validated.ok) {
|
|
48
|
-
return { ok: false, error: validated.error };
|
|
49
|
-
}
|
|
50
|
-
const url = `${rawBase.replace(/\/$/, '')}/v1/cli/login`;
|
|
51
|
-
let resp;
|
|
52
|
-
try {
|
|
53
|
-
resp = await fetch(url, {
|
|
54
|
-
method: 'POST',
|
|
55
|
-
headers: { 'Content-Type': 'application/json' },
|
|
56
|
-
body: JSON.stringify({ agentRelayToken: relayAccessToken }),
|
|
57
|
-
signal: AbortSignal.timeout(15_000),
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
catch (err) {
|
|
61
|
-
return { ok: false, error: `Network error: ${err instanceof Error ? err.message : String(err)}` };
|
|
62
|
-
}
|
|
63
|
-
if (!resp.ok) {
|
|
64
|
-
const text = await resp.text().catch(() => '');
|
|
65
|
-
return { ok: false, error: `Login failed (HTTP ${resp.status}): ${text.slice(0, 200)}` };
|
|
66
|
-
}
|
|
67
|
-
let payload;
|
|
68
|
-
try {
|
|
69
|
-
const raw = await resp.json();
|
|
70
|
-
if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
|
|
71
|
-
return { ok: false, error: 'Login response has unexpected shape' };
|
|
72
|
-
}
|
|
73
|
-
payload = raw;
|
|
74
|
-
}
|
|
75
|
-
catch {
|
|
76
|
-
return { ok: false, error: 'Login response was not valid JSON' };
|
|
77
|
-
}
|
|
78
|
-
if (typeof payload.accessToken !== 'string') {
|
|
79
|
-
return { ok: false, error: 'Login response missing accessToken' };
|
|
80
|
-
}
|
|
81
|
-
// Persist the rth_at_ session where the `ai-hist` Rust binary reads it, so the
|
|
82
|
-
// in-process cloud push (which drives `ai-hist push`) authenticates on later
|
|
83
|
-
// runs. The binary reads $RELAYHISTORY_HOME/auth.json (default
|
|
84
|
-
// ~/.agentworkforce/relayhistory/auth.json) in snake_case.
|
|
85
|
-
try {
|
|
86
|
-
const authDir = process.env.RELAYHISTORY_HOME ?? path.join(os.homedir(), '.agentworkforce', 'relayhistory');
|
|
87
|
-
const authPath = path.join(authDir, 'auth.json');
|
|
88
|
-
const auth = {
|
|
89
|
-
base_url: rawBase.replace(/\/$/, ''),
|
|
90
|
-
access_token: payload.accessToken,
|
|
91
|
-
...(typeof payload.refreshToken === 'string' ? { refresh_token: payload.refreshToken } : {}),
|
|
92
|
-
};
|
|
93
|
-
await mkdir(authDir, { recursive: true });
|
|
94
|
-
await writeFile(authPath, JSON.stringify(auth, null, 2));
|
|
95
|
-
// Explicitly tighten perms — writeFile mode only applies to newly created files.
|
|
96
|
-
await chmod(authPath, 0o600);
|
|
97
|
-
}
|
|
98
|
-
catch {
|
|
99
|
-
// Non-fatal: local state is written; cloud sync may prompt again next run.
|
|
100
|
-
}
|
|
101
|
-
return { ok: true };
|
|
102
|
-
}
|
|
103
|
-
function withDefaults(overrides = {}) {
|
|
104
|
-
return {
|
|
105
|
-
homedir: os.homedir,
|
|
106
|
-
readRelayAuth: defaultReadRelayAuth,
|
|
107
|
-
loginToCloud: defaultLoginToCloud,
|
|
108
|
-
prompt: promptYesNo,
|
|
109
|
-
log: (...args) => console.log(...args),
|
|
110
|
-
...overrides,
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
export function registerReflexCommands(program, overrides = {}) {
|
|
114
|
-
const deps = withDefaults(overrides);
|
|
115
|
-
const reflex = program.command('reflex').description('Manage Reflex history sync');
|
|
116
|
-
reflex
|
|
117
|
-
.command('on')
|
|
118
|
-
.description('Enable Reflex history sync')
|
|
119
|
-
.action(async () => {
|
|
120
|
-
deps.log('Reflex will capture your agent sessions and sync to history.agentrelay.com');
|
|
121
|
-
const accepted = await deps.prompt('Enable Reflex? (y/N) ');
|
|
122
|
-
if (!accepted) {
|
|
123
|
-
deps.log('Reflex was not enabled.');
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
writeReflexState({
|
|
127
|
-
enabled: true,
|
|
128
|
-
enabledAt: new Date().toISOString(),
|
|
129
|
-
}, deps.homedir());
|
|
130
|
-
const relayAuth = await deps.readRelayAuth();
|
|
131
|
-
let cloudSyncActive = false;
|
|
132
|
-
if (!relayAuth) {
|
|
133
|
-
deps.log('Not logged in to Agent Relay. Run `agent-relay login` first to sync Reflex history to the cloud.');
|
|
134
|
-
}
|
|
135
|
-
else {
|
|
136
|
-
const result = await deps.loginToCloud(relayAuth.accessToken);
|
|
137
|
-
if (result.ok) {
|
|
138
|
-
cloudSyncActive = true;
|
|
139
|
-
}
|
|
140
|
-
else {
|
|
141
|
-
deps.log(`Reflex is enabled locally, but cloud login did not complete: ${result.error}`);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
deps.log('Reflex is on.');
|
|
145
|
-
// Only promise automatic cloud sync when cloud auth actually succeeded —
|
|
146
|
-
// otherwise the message would contradict the login warning above.
|
|
147
|
-
if (cloudSyncActive) {
|
|
148
|
-
deps.log('History syncs to relayhistory-cloud automatically while `agent-relay up` is running.');
|
|
149
|
-
}
|
|
150
|
-
deps.log('State file: ~/.agentworkforce/reflex.json');
|
|
151
|
-
});
|
|
152
|
-
reflex
|
|
153
|
-
.command('off')
|
|
154
|
-
.description('Disable Reflex history sync')
|
|
155
|
-
.action(() => {
|
|
156
|
-
writeReflexState({ enabled: false }, deps.homedir());
|
|
157
|
-
deps.log('Reflex is off.');
|
|
158
|
-
});
|
|
159
|
-
reflex
|
|
160
|
-
.command('status')
|
|
161
|
-
.description('Show Reflex status')
|
|
162
|
-
.action(() => {
|
|
163
|
-
const state = readReflexState(deps.homedir());
|
|
164
|
-
if (!state) {
|
|
165
|
-
deps.log('Reflex is off (never enabled).');
|
|
166
|
-
return;
|
|
167
|
-
}
|
|
168
|
-
if (state.enabled) {
|
|
169
|
-
deps.log('Reflex is on.');
|
|
170
|
-
if (state.enabledAt) {
|
|
171
|
-
deps.log(`Enabled at: ${state.enabledAt}`);
|
|
172
|
-
}
|
|
173
|
-
return;
|
|
174
|
-
}
|
|
175
|
-
deps.log('Reflex is off.');
|
|
176
|
-
if (state.enabledAt) {
|
|
177
|
-
deps.log(`Enabled at: ${state.enabledAt}`);
|
|
178
|
-
}
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
//# sourceMappingURL=reflex.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reflex.js","sourceRoot":"","sources":["../../../src/cli/commands/reflex.ts"],"names":[],"mappings":"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"}
|