@openreef/cli 0.1.1 → 0.3.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 +14 -7
- package/dist/commands/install.d.ts +14 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +612 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/list.d.ts +5 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +81 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/logs.d.ts +8 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +118 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/repair.d.ts +10 -0
- package/dist/commands/repair.d.ts.map +1 -0
- package/dist/commands/repair.js +328 -0
- package/dist/commands/repair.js.map +1 -0
- package/dist/commands/status.d.ts +8 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +181 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/uninstall.d.ts +9 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +166 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.d.ts +12 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +518 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/core/agents-md-generator.d.ts +3 -0
- package/dist/core/agents-md-generator.d.ts.map +1 -0
- package/dist/core/agents-md-generator.js +24 -0
- package/dist/core/agents-md-generator.js.map +1 -0
- package/dist/core/config-patcher.d.ts +32 -0
- package/dist/core/config-patcher.d.ts.map +1 -0
- package/dist/core/config-patcher.js +156 -0
- package/dist/core/config-patcher.js.map +1 -0
- package/dist/core/device-identity.d.ts +37 -0
- package/dist/core/device-identity.d.ts.map +1 -0
- package/dist/core/device-identity.js +135 -0
- package/dist/core/device-identity.js.map +1 -0
- package/dist/core/gateway-client.d.ts +98 -0
- package/dist/core/gateway-client.d.ts.map +1 -0
- package/dist/core/gateway-client.js +238 -0
- package/dist/core/gateway-client.js.map +1 -0
- package/dist/core/log-reader.d.ts +28 -0
- package/dist/core/log-reader.d.ts.map +1 -0
- package/dist/core/log-reader.js +69 -0
- package/dist/core/log-reader.js.map +1 -0
- package/dist/core/migration-planner.d.ts +37 -0
- package/dist/core/migration-planner.d.ts.map +1 -0
- package/dist/core/migration-planner.js +160 -0
- package/dist/core/migration-planner.js.map +1 -0
- package/dist/core/openclaw-paths.d.ts +23 -0
- package/dist/core/openclaw-paths.d.ts.map +1 -0
- package/dist/core/openclaw-paths.js +189 -0
- package/dist/core/openclaw-paths.js.map +1 -0
- package/dist/core/state-differ.d.ts +15 -0
- package/dist/core/state-differ.d.ts.map +1 -0
- package/dist/core/state-differ.js +135 -0
- package/dist/core/state-differ.js.map +1 -0
- package/dist/core/state-manager.d.ts +7 -0
- package/dist/core/state-manager.d.ts.map +1 -0
- package/dist/core/state-manager.js +61 -0
- package/dist/core/state-manager.js.map +1 -0
- package/dist/core/variable-resolver.d.ts +1 -0
- package/dist/core/variable-resolver.d.ts.map +1 -1
- package/dist/core/variable-resolver.js +21 -10
- package/dist/core/variable-resolver.js.map +1 -1
- package/dist/index.js +133 -1
- package/dist/index.js.map +1 -1
- package/dist/types/state.d.ts +55 -0
- package/dist/types/state.d.ts.map +1 -0
- package/dist/types/state.js +2 -0
- package/dist/types/state.js.map +1 -0
- package/dist/utils/identifiers.d.ts +18 -0
- package/dist/utils/identifiers.d.ts.map +1 -0
- package/dist/utils/identifiers.js +50 -0
- package/dist/utils/identifiers.js.map +1 -0
- package/package.json +6 -3
- package/template/reef.json +6 -6
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { readFile, writeFile, rename } from 'node:fs/promises';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import JSON5 from 'json5';
|
|
4
|
+
import { resolveConfigPath, resolveWorkspacePath } from './openclaw-paths.js';
|
|
5
|
+
export async function readConfig(configPath, env) {
|
|
6
|
+
const path = configPath ?? resolveConfigPath(env);
|
|
7
|
+
let raw;
|
|
8
|
+
try {
|
|
9
|
+
raw = await readFile(path, 'utf-8');
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
// Config doesn't exist yet — start with empty
|
|
13
|
+
return { config: { agents: { list: [] }, bindings: [] }, raw: '', path };
|
|
14
|
+
}
|
|
15
|
+
// Warn about $include and ${VAR} references
|
|
16
|
+
if (raw.includes('$include') || /\$\{[^}]+\}/.test(raw)) {
|
|
17
|
+
console.warn('Config uses $include or ${VAR}. OpenReef patches raw config, which may differ from effective runtime config. Proceeding.');
|
|
18
|
+
}
|
|
19
|
+
const config = JSON5.parse(raw);
|
|
20
|
+
return { config, raw, path };
|
|
21
|
+
}
|
|
22
|
+
export async function writeConfig(configPath, config, options) {
|
|
23
|
+
const tmpPath = configPath + '.tmp';
|
|
24
|
+
const bakPath = configPath + '.bak';
|
|
25
|
+
const json = JSON.stringify(config, null, 2) + '\n';
|
|
26
|
+
await writeFile(tmpPath, json, 'utf-8');
|
|
27
|
+
// Backup original if exists
|
|
28
|
+
if (existsSync(configPath)) {
|
|
29
|
+
const existing = await readFile(configPath, 'utf-8');
|
|
30
|
+
let isAlreadyJson = false;
|
|
31
|
+
try {
|
|
32
|
+
JSON.parse(existing);
|
|
33
|
+
isAlreadyJson = true;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// Not valid JSON — was JSON5 with comments/trailing commas
|
|
37
|
+
}
|
|
38
|
+
await rename(configPath, bakPath);
|
|
39
|
+
if (!options?.silent && !isAlreadyJson) {
|
|
40
|
+
console.log(`Config rewritten as JSON — comments from original JSON5 removed. Backup: ${bakPath}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
await rename(tmpPath, configPath);
|
|
44
|
+
}
|
|
45
|
+
function ensureAgentsList(config) {
|
|
46
|
+
if (!config.agents)
|
|
47
|
+
config.agents = {};
|
|
48
|
+
const agents = config.agents;
|
|
49
|
+
if (!Array.isArray(agents.list))
|
|
50
|
+
agents.list = [];
|
|
51
|
+
return agents.list;
|
|
52
|
+
}
|
|
53
|
+
function ensureBindings(config) {
|
|
54
|
+
if (!Array.isArray(config.bindings))
|
|
55
|
+
config.bindings = [];
|
|
56
|
+
return config.bindings;
|
|
57
|
+
}
|
|
58
|
+
export function addAgentEntry(config, agent, env) {
|
|
59
|
+
const list = ensureAgentsList(config);
|
|
60
|
+
// Idempotent: skip if agent with same id exists
|
|
61
|
+
if (list.some((a) => a.id === agent.id)) {
|
|
62
|
+
return config;
|
|
63
|
+
}
|
|
64
|
+
const entry = {
|
|
65
|
+
id: agent.id,
|
|
66
|
+
};
|
|
67
|
+
if (agent.name)
|
|
68
|
+
entry.name = agent.name;
|
|
69
|
+
entry.workspace = agent.workspace ?? resolveWorkspacePath(agent.id, env);
|
|
70
|
+
if (agent.model)
|
|
71
|
+
entry.model = agent.model;
|
|
72
|
+
if (agent.skills)
|
|
73
|
+
entry.skills = agent.skills;
|
|
74
|
+
if (agent.identity)
|
|
75
|
+
entry.identity = agent.identity;
|
|
76
|
+
if (agent.sandbox)
|
|
77
|
+
entry.sandbox = agent.sandbox;
|
|
78
|
+
if (agent.tools)
|
|
79
|
+
entry.tools = agent.tools;
|
|
80
|
+
list.push(entry);
|
|
81
|
+
return config;
|
|
82
|
+
}
|
|
83
|
+
export function removeAgentEntry(config, agentId) {
|
|
84
|
+
const agents = config.agents;
|
|
85
|
+
if (!agents || !Array.isArray(agents.list))
|
|
86
|
+
return config;
|
|
87
|
+
agents.list = agents.list.filter((a) => a.id !== agentId);
|
|
88
|
+
return config;
|
|
89
|
+
}
|
|
90
|
+
export function addBinding(config, binding) {
|
|
91
|
+
const bindings = ensureBindings(config);
|
|
92
|
+
if (bindings.some((b) => bindingsEqual(b, binding))) {
|
|
93
|
+
return config;
|
|
94
|
+
}
|
|
95
|
+
bindings.push(binding);
|
|
96
|
+
return config;
|
|
97
|
+
}
|
|
98
|
+
export function removeBinding(config, binding) {
|
|
99
|
+
if (!Array.isArray(config.bindings))
|
|
100
|
+
return config;
|
|
101
|
+
config.bindings = config.bindings.filter((b) => !bindingsEqual(b, binding));
|
|
102
|
+
return config;
|
|
103
|
+
}
|
|
104
|
+
export function setAgentToAgent(config, namespace) {
|
|
105
|
+
if (!config.tools)
|
|
106
|
+
config.tools = {};
|
|
107
|
+
const tools = config.tools;
|
|
108
|
+
if (!tools.agentToAgent)
|
|
109
|
+
tools.agentToAgent = {};
|
|
110
|
+
const a2a = tools.agentToAgent;
|
|
111
|
+
a2a.enabled = true;
|
|
112
|
+
if (!Array.isArray(a2a.allow))
|
|
113
|
+
a2a.allow = [];
|
|
114
|
+
const allow = a2a.allow;
|
|
115
|
+
const pattern = `${namespace}-*`;
|
|
116
|
+
if (!allow.includes(pattern)) {
|
|
117
|
+
allow.push(pattern);
|
|
118
|
+
}
|
|
119
|
+
return config;
|
|
120
|
+
}
|
|
121
|
+
export function removeAgentToAgent(config, namespace, otherFormationsInNamespace, wasEnabled) {
|
|
122
|
+
const tools = config.tools;
|
|
123
|
+
if (!tools?.agentToAgent)
|
|
124
|
+
return config;
|
|
125
|
+
const a2a = tools.agentToAgent;
|
|
126
|
+
if (!otherFormationsInNamespace) {
|
|
127
|
+
const pattern = `${namespace}-*`;
|
|
128
|
+
if (Array.isArray(a2a.allow)) {
|
|
129
|
+
a2a.allow = a2a.allow.filter((p) => p !== pattern);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// Only disable if we originally enabled it
|
|
133
|
+
if (wasEnabled === false && !otherFormationsInNamespace) {
|
|
134
|
+
a2a.enabled = false;
|
|
135
|
+
}
|
|
136
|
+
return config;
|
|
137
|
+
}
|
|
138
|
+
export function bindingsEqual(a, b) {
|
|
139
|
+
return canonicalJson(a) === canonicalJson(b);
|
|
140
|
+
}
|
|
141
|
+
function canonicalJson(obj) {
|
|
142
|
+
if (obj === null || obj === undefined)
|
|
143
|
+
return JSON.stringify(obj);
|
|
144
|
+
if (typeof obj !== 'object')
|
|
145
|
+
return JSON.stringify(obj);
|
|
146
|
+
if (Array.isArray(obj)) {
|
|
147
|
+
return '[' + obj.map(canonicalJson).join(',') + ']';
|
|
148
|
+
}
|
|
149
|
+
const sorted = Object.keys(obj)
|
|
150
|
+
.sort()
|
|
151
|
+
.map((k) => JSON.stringify(k) +
|
|
152
|
+
':' +
|
|
153
|
+
canonicalJson(obj[k]));
|
|
154
|
+
return '{' + sorted.join(',') + '}';
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=config-patcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-patcher.js","sourceRoot":"","sources":["../../src/core/config-patcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export interface DeviceIdentity {
|
|
2
|
+
deviceId: string;
|
|
3
|
+
publicKeyPem: string;
|
|
4
|
+
privateKeyPem: string;
|
|
5
|
+
}
|
|
6
|
+
export interface DeviceAuthEntry {
|
|
7
|
+
token: string;
|
|
8
|
+
role: string;
|
|
9
|
+
scopes: string[];
|
|
10
|
+
updatedAtMs: number;
|
|
11
|
+
}
|
|
12
|
+
export declare function loadOrCreateDeviceIdentity(env?: NodeJS.ProcessEnv): DeviceIdentity;
|
|
13
|
+
export declare function signDevicePayload(privateKeyPem: string, payload: string): string;
|
|
14
|
+
export declare function publicKeyRawBase64Url(publicKeyPem: string): string;
|
|
15
|
+
export declare function buildDeviceAuthPayload(params: {
|
|
16
|
+
deviceId: string;
|
|
17
|
+
clientId: string;
|
|
18
|
+
clientMode: string;
|
|
19
|
+
role: string;
|
|
20
|
+
scopes: string[];
|
|
21
|
+
signedAtMs: number;
|
|
22
|
+
token: string | null;
|
|
23
|
+
nonce?: string;
|
|
24
|
+
}): string;
|
|
25
|
+
export declare function loadDeviceAuthToken(params: {
|
|
26
|
+
deviceId: string;
|
|
27
|
+
role: string;
|
|
28
|
+
env?: NodeJS.ProcessEnv;
|
|
29
|
+
}): DeviceAuthEntry | null;
|
|
30
|
+
export declare function storeDeviceAuthToken(params: {
|
|
31
|
+
deviceId: string;
|
|
32
|
+
role: string;
|
|
33
|
+
token: string;
|
|
34
|
+
scopes: string[];
|
|
35
|
+
env?: NodeJS.ProcessEnv;
|
|
36
|
+
}): void;
|
|
37
|
+
//# sourceMappingURL=device-identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-identity.d.ts","sourceRoot":"","sources":["../../src/core/device-identity.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAcD,wBAAgB,0BAA0B,CACxC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GACtB,cAAc,CAkDhB;AAED,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,GACd,MAAM,CAGR;AAED,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAOlE;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,MAAM,CAST;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB,GAAG,eAAe,GAAG,IAAI,CAgBzB;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB,GAAG,IAAI,CAqCP"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import * as crypto from 'node:crypto';
|
|
2
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync, chmodSync, } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { resolveStateDir } from './openclaw-paths.js';
|
|
5
|
+
/**
|
|
6
|
+
* Derive deviceId as SHA-256 hex of the raw 32-byte Ed25519 public key.
|
|
7
|
+
*/
|
|
8
|
+
function deriveDeviceId(publicKeyPem) {
|
|
9
|
+
const pubDer = crypto.createPublicKey(publicKeyPem).export({
|
|
10
|
+
type: 'spki',
|
|
11
|
+
format: 'der',
|
|
12
|
+
});
|
|
13
|
+
const rawPubKey = pubDer.subarray(pubDer.length - 32);
|
|
14
|
+
return crypto.createHash('sha256').update(rawPubKey).digest('hex');
|
|
15
|
+
}
|
|
16
|
+
export function loadOrCreateDeviceIdentity(env) {
|
|
17
|
+
const stateDir = resolveStateDir(env);
|
|
18
|
+
const identityDir = join(stateDir, 'identity');
|
|
19
|
+
const filePath = join(identityDir, 'device.json');
|
|
20
|
+
if (existsSync(filePath)) {
|
|
21
|
+
const data = JSON.parse(readFileSync(filePath, 'utf-8'));
|
|
22
|
+
// Revalidate deviceId: recompute from stored public key to detect
|
|
23
|
+
// stale entries written with old derivation (e.g., full SPKI DER hash)
|
|
24
|
+
const correctId = deriveDeviceId(data.publicKeyPem);
|
|
25
|
+
if (data.deviceId !== correctId) {
|
|
26
|
+
data.deviceId = correctId;
|
|
27
|
+
writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');
|
|
28
|
+
chmodSync(filePath, 0o600);
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
deviceId: correctId,
|
|
32
|
+
publicKeyPem: data.publicKeyPem,
|
|
33
|
+
privateKeyPem: data.privateKeyPem,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
// Generate new Ed25519 keypair
|
|
37
|
+
const { publicKey, privateKey } = crypto.generateKeyPairSync('ed25519', {
|
|
38
|
+
publicKeyEncoding: { type: 'spki', format: 'pem' },
|
|
39
|
+
privateKeyEncoding: { type: 'pkcs8', format: 'pem' },
|
|
40
|
+
});
|
|
41
|
+
const deviceId = deriveDeviceId(publicKey);
|
|
42
|
+
const identity = {
|
|
43
|
+
deviceId,
|
|
44
|
+
publicKeyPem: publicKey,
|
|
45
|
+
privateKeyPem: privateKey,
|
|
46
|
+
};
|
|
47
|
+
mkdirSync(identityDir, { recursive: true });
|
|
48
|
+
const fileData = {
|
|
49
|
+
version: 1,
|
|
50
|
+
deviceId,
|
|
51
|
+
publicKeyPem: publicKey,
|
|
52
|
+
privateKeyPem: privateKey,
|
|
53
|
+
createdAtMs: Date.now(),
|
|
54
|
+
};
|
|
55
|
+
writeFileSync(filePath, JSON.stringify(fileData, null, 2), 'utf-8');
|
|
56
|
+
chmodSync(filePath, 0o600);
|
|
57
|
+
return identity;
|
|
58
|
+
}
|
|
59
|
+
export function signDevicePayload(privateKeyPem, payload) {
|
|
60
|
+
const sig = crypto.sign(null, Buffer.from(payload), privateKeyPem);
|
|
61
|
+
return sig.toString('base64url');
|
|
62
|
+
}
|
|
63
|
+
export function publicKeyRawBase64Url(publicKeyPem) {
|
|
64
|
+
const pubDer = crypto
|
|
65
|
+
.createPublicKey(publicKeyPem)
|
|
66
|
+
.export({ type: 'spki', format: 'der' });
|
|
67
|
+
// Ed25519 SPKI DER has 12-byte prefix before the 32-byte raw key
|
|
68
|
+
const raw = pubDer.subarray(pubDer.length - 32);
|
|
69
|
+
return Buffer.from(raw).toString('base64url');
|
|
70
|
+
}
|
|
71
|
+
export function buildDeviceAuthPayload(params) {
|
|
72
|
+
const scopeStr = params.scopes.join(',');
|
|
73
|
+
const tokenStr = params.token ?? '';
|
|
74
|
+
if (params.nonce) {
|
|
75
|
+
return `v2|${params.deviceId}|${params.clientId}|${params.clientMode}|${params.role}|${scopeStr}|${params.signedAtMs}|${tokenStr}|${params.nonce}`;
|
|
76
|
+
}
|
|
77
|
+
return `v1|${params.deviceId}|${params.clientId}|${params.clientMode}|${params.role}|${scopeStr}|${params.signedAtMs}|${tokenStr}`;
|
|
78
|
+
}
|
|
79
|
+
export function loadDeviceAuthToken(params) {
|
|
80
|
+
const stateDir = resolveStateDir(params.env);
|
|
81
|
+
const filePath = join(stateDir, 'identity', 'device-auth.json');
|
|
82
|
+
if (!existsSync(filePath))
|
|
83
|
+
return null;
|
|
84
|
+
try {
|
|
85
|
+
const data = JSON.parse(readFileSync(filePath, 'utf-8'));
|
|
86
|
+
// Verify deviceId matches — tokens issued for a different device are invalid
|
|
87
|
+
if (data.deviceId && data.deviceId !== params.deviceId)
|
|
88
|
+
return null;
|
|
89
|
+
const entry = data?.tokens?.[params.role];
|
|
90
|
+
if (!entry)
|
|
91
|
+
return null;
|
|
92
|
+
return entry;
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
export function storeDeviceAuthToken(params) {
|
|
99
|
+
const stateDir = resolveStateDir(params.env);
|
|
100
|
+
const identityDir = join(stateDir, 'identity');
|
|
101
|
+
const filePath = join(identityDir, 'device-auth.json');
|
|
102
|
+
let data = {
|
|
103
|
+
version: 1,
|
|
104
|
+
deviceId: params.deviceId,
|
|
105
|
+
tokens: {},
|
|
106
|
+
};
|
|
107
|
+
if (existsSync(filePath)) {
|
|
108
|
+
try {
|
|
109
|
+
const existing = JSON.parse(readFileSync(filePath, 'utf-8'));
|
|
110
|
+
// If deviceId changed, reset tokens (old tokens are invalid)
|
|
111
|
+
if (existing.deviceId === params.deviceId) {
|
|
112
|
+
data = existing;
|
|
113
|
+
// Ensure top-level fields are present
|
|
114
|
+
data.version = data.version ?? 1;
|
|
115
|
+
data.deviceId = params.deviceId;
|
|
116
|
+
if (!data.tokens)
|
|
117
|
+
data.tokens = {};
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
// Corrupt file — overwrite with fresh structure
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const tokens = data.tokens;
|
|
125
|
+
tokens[params.role] = {
|
|
126
|
+
token: params.token,
|
|
127
|
+
role: params.role,
|
|
128
|
+
scopes: params.scopes,
|
|
129
|
+
updatedAtMs: Date.now(),
|
|
130
|
+
};
|
|
131
|
+
mkdirSync(identityDir, { recursive: true });
|
|
132
|
+
writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');
|
|
133
|
+
chmodSync(filePath, 0o600);
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=device-identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-identity.js","sourceRoot":"","sources":["../../src/core/device-identity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
export interface CronSchedule {
|
|
2
|
+
kind: 'cron' | 'every' | 'at';
|
|
3
|
+
expr?: string;
|
|
4
|
+
tz?: string;
|
|
5
|
+
everyMs?: number;
|
|
6
|
+
at?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface CronPayload {
|
|
9
|
+
kind: 'agentTurn' | 'systemEvent';
|
|
10
|
+
message?: string;
|
|
11
|
+
text?: string;
|
|
12
|
+
model?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface CronDelivery {
|
|
15
|
+
channel?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface CronAddParams {
|
|
18
|
+
name: string;
|
|
19
|
+
schedule: CronSchedule;
|
|
20
|
+
sessionTarget: 'main' | 'isolated';
|
|
21
|
+
wakeMode: 'next-heartbeat' | 'now';
|
|
22
|
+
payload: CronPayload;
|
|
23
|
+
agentId?: string;
|
|
24
|
+
description?: string;
|
|
25
|
+
enabled?: boolean;
|
|
26
|
+
deleteAfterRun?: boolean;
|
|
27
|
+
delivery?: CronDelivery;
|
|
28
|
+
}
|
|
29
|
+
export interface CronJobPatch {
|
|
30
|
+
name?: string;
|
|
31
|
+
schedule?: CronSchedule;
|
|
32
|
+
sessionTarget?: 'main' | 'isolated';
|
|
33
|
+
wakeMode?: 'next-heartbeat' | 'now';
|
|
34
|
+
payload?: CronPayload;
|
|
35
|
+
agentId?: string;
|
|
36
|
+
description?: string;
|
|
37
|
+
enabled?: boolean;
|
|
38
|
+
delivery?: CronDelivery;
|
|
39
|
+
}
|
|
40
|
+
export interface CronJob {
|
|
41
|
+
id: string;
|
|
42
|
+
name: string;
|
|
43
|
+
schedule: CronSchedule;
|
|
44
|
+
sessionTarget: string;
|
|
45
|
+
wakeMode: string;
|
|
46
|
+
payload: CronPayload;
|
|
47
|
+
agentId?: string;
|
|
48
|
+
enabled: boolean;
|
|
49
|
+
state: string;
|
|
50
|
+
createdAtMs: number;
|
|
51
|
+
updatedAtMs: number;
|
|
52
|
+
}
|
|
53
|
+
export interface GatewayClientOptions {
|
|
54
|
+
url: string;
|
|
55
|
+
token?: string;
|
|
56
|
+
password?: string;
|
|
57
|
+
timeoutMs?: number;
|
|
58
|
+
env?: NodeJS.ProcessEnv;
|
|
59
|
+
/** Skip loading stored device auth token. Set true for remote URL overrides. */
|
|
60
|
+
skipStoredAuth?: boolean;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Resolve Gateway auth credentials from multiple sources.
|
|
64
|
+
* If gatewayUrl is explicitly provided (override), ONLY explicit --gateway-token
|
|
65
|
+
* or --gateway-password satisfy auth — env/config fallbacks are NOT accepted.
|
|
66
|
+
* For local (non-overridden) URLs: explicit CLI → env vars → config file values.
|
|
67
|
+
*/
|
|
68
|
+
export declare function resolveGatewayAuth(opts: {
|
|
69
|
+
gatewayUrl?: string;
|
|
70
|
+
gatewayToken?: string;
|
|
71
|
+
gatewayPassword?: string;
|
|
72
|
+
config?: Record<string, unknown>;
|
|
73
|
+
env?: NodeJS.ProcessEnv;
|
|
74
|
+
}): {
|
|
75
|
+
token?: string;
|
|
76
|
+
password?: string;
|
|
77
|
+
skipStoredAuth?: boolean;
|
|
78
|
+
};
|
|
79
|
+
export declare class GatewayClient {
|
|
80
|
+
private ws;
|
|
81
|
+
private pending;
|
|
82
|
+
private connected;
|
|
83
|
+
private options;
|
|
84
|
+
private timeoutMs;
|
|
85
|
+
constructor(options: GatewayClientOptions);
|
|
86
|
+
connect(): Promise<void>;
|
|
87
|
+
call<T>(method: string, params?: unknown): Promise<T>;
|
|
88
|
+
close(): void;
|
|
89
|
+
cronAdd(params: CronAddParams): Promise<{
|
|
90
|
+
id: string;
|
|
91
|
+
}>;
|
|
92
|
+
cronRemove(id: string): Promise<void>;
|
|
93
|
+
cronUpdate(id: string, patch: CronJobPatch): Promise<void>;
|
|
94
|
+
cronList(options?: {
|
|
95
|
+
includeDisabled?: boolean;
|
|
96
|
+
}): Promise<CronJob[]>;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=gateway-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-client.d.ts","sourceRoot":"","sources":["../../src/core/gateway-client.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,WAAW,GAAG,aAAa,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,YAAY,CAAC;IACvB,aAAa,EAAE,MAAM,GAAG,UAAU,CAAC;IACnC,QAAQ,EAAE,gBAAgB,GAAG,KAAK,CAAC;IACnC,OAAO,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IACpC,QAAQ,CAAC,EAAE,gBAAgB,GAAG,KAAK,CAAC;IACpC,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,YAAY,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,gFAAgF;IAChF,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAA;CAAE,CAkClE;AAQD,qBAAa,aAAa;IACxB,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE,oBAAoB;IAKnC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA8KxB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAwB3D,KAAK,IAAI,IAAI;IAQP,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAIvD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrC,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1D,QAAQ,CAAC,OAAO,CAAC,EAAE;QACvB,eAAe,CAAC,EAAE,OAAO,CAAC;KAC3B,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CAOvB"}
|