@synap-core/cli 1.2.0 → 1.5.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 +26 -0
- package/dist/commands/agents.d.ts +31 -0
- package/dist/commands/agents.js +478 -0
- package/dist/commands/agents.js.map +1 -0
- package/dist/commands/connect.d.ts +18 -1
- package/dist/commands/connect.js +154 -74
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/connections.d.ts +9 -0
- package/dist/commands/connections.js +161 -0
- package/dist/commands/connections.js.map +1 -0
- package/dist/commands/data.d.ts +43 -0
- package/dist/commands/data.js +387 -0
- package/dist/commands/data.js.map +1 -0
- package/dist/commands/finish.js +41 -8
- package/dist/commands/finish.js.map +1 -1
- package/dist/commands/infra.d.ts +21 -0
- package/dist/commands/infra.js +262 -0
- package/dist/commands/infra.js.map +1 -0
- package/dist/commands/init.js +188 -10
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/knowledge.d.ts +36 -0
- package/dist/commands/knowledge.js +123 -0
- package/dist/commands/knowledge.js.map +1 -0
- package/dist/commands/openclaw.d.ts +2 -0
- package/dist/commands/openclaw.js +300 -23
- package/dist/commands/openclaw.js.map +1 -1
- package/dist/commands/pods.d.ts +17 -0
- package/dist/commands/pods.js +371 -0
- package/dist/commands/pods.js.map +1 -0
- package/dist/commands/status.d.ts +14 -1
- package/dist/commands/status.js +78 -220
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/update.d.ts +11 -2
- package/dist/commands/update.js +116 -5
- package/dist/commands/update.js.map +1 -1
- package/dist/index.js +370 -3
- package/dist/index.js.map +1 -1
- package/dist/lib/agents-config.d.ts +20 -0
- package/dist/lib/agents-config.js +45 -0
- package/dist/lib/agents-config.js.map +1 -0
- package/dist/lib/auth.d.ts +4 -0
- package/dist/lib/auth.js +4 -0
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/browser-auth.d.ts +35 -0
- package/dist/lib/browser-auth.js +170 -0
- package/dist/lib/browser-auth.js.map +1 -0
- package/dist/lib/hub-client.d.ts +17 -0
- package/dist/lib/hub-client.js +115 -0
- package/dist/lib/hub-client.js.map +1 -0
- package/dist/lib/openclaw.js +30 -19
- package/dist/lib/openclaw.js.map +1 -1
- package/dist/lib/pod.d.ts +32 -1
- package/dist/lib/pod.js +121 -9
- package/dist/lib/pod.js.map +1 -1
- package/dist/lib/skills-installer.d.ts +18 -0
- package/dist/lib/skills-installer.js +97 -0
- package/dist/lib/skills-installer.js.map +1 -0
- package/dist/lib/targets.d.ts +65 -0
- package/dist/lib/targets.js +673 -0
- package/dist/lib/targets.js.map +1 -0
- package/package.json +5 -3
- package/skills/README.md +91 -0
- package/skills/synap/README.md +76 -0
- package/skills/synap/SKILL.md +882 -0
- package/skills/synap/capture.md +170 -0
- package/skills/synap/governance.md +206 -0
- package/skills/synap/linking.md +128 -0
- package/skills/synap/scripts/orient.sh +28 -0
- package/skills/synap-schema/SKILL.md +231 -0
- package/skills/synap-schema/property-types.md +228 -0
- package/skills/synap-ui/SKILL.md +295 -0
- package/skills/synap-ui/bento-recipes.md +608 -0
- package/skills/synap-ui/view-types.md +259 -0
- package/skills/synap-ui/widget-catalog.md +305 -0
package/README.md
CHANGED
|
@@ -76,6 +76,32 @@ Wraps the things you actually need after install.
|
|
|
76
76
|
|
|
77
77
|
Overview: gateway status, AI provider, skill, dashboard URL, next steps.
|
|
78
78
|
|
|
79
|
+
### `synap openclaw connections`
|
|
80
|
+
|
|
81
|
+
Single-screen summary of what's wired up: AI providers (Anthropic/OpenAI/Google/Synap IS), installed skills, connected channels (Telegram/Discord/WhatsApp/Slack/Signal/iMessage/Matrix), MCP client commands, and the dashboard URL.
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
synap openclaw connections
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Everything marked `○` is something you'd manage from the OpenClaw dashboard — the command shows you exactly how to get there.
|
|
88
|
+
|
|
89
|
+
### `synap openclaw open [section]`
|
|
90
|
+
|
|
91
|
+
Deep-link to a specific dashboard section.
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
synap openclaw open # Main dashboard
|
|
95
|
+
synap openclaw open channels # Channels tab
|
|
96
|
+
synap openclaw open skills # Skills tab
|
|
97
|
+
synap openclaw open config # Config editor
|
|
98
|
+
synap openclaw open chat # Chat
|
|
99
|
+
synap openclaw open sessions # Sessions
|
|
100
|
+
synap openclaw open logs # Logs
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Uses the public URL if `setup-domain` has been run, otherwise localhost.
|
|
104
|
+
|
|
79
105
|
### `synap openclaw dashboard`
|
|
80
106
|
|
|
81
107
|
Opens the OpenClaw web UI. If a public domain is configured, opens it directly. Otherwise opens `http://localhost:18789` or — on a remote Linux server — prints an SSH tunnel command.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* synap agents — manage named agent identities
|
|
3
|
+
*
|
|
4
|
+
* synap agents list list all configured agent identities
|
|
5
|
+
* synap agents add add a named agent identity (legacy — use create for new agents)
|
|
6
|
+
* synap agents create create a new agent on the pod with template support
|
|
7
|
+
* synap agents remove <name> remove an agent identity
|
|
8
|
+
* synap agents info <name> show details for an agent identity
|
|
9
|
+
* synap agents rotate-key <n> rotate the API key for an agent
|
|
10
|
+
*/
|
|
11
|
+
export declare function agentsList(opts?: {
|
|
12
|
+
json?: boolean;
|
|
13
|
+
}): void;
|
|
14
|
+
export declare function agentsAdd(opts?: {
|
|
15
|
+
name?: string;
|
|
16
|
+
apiKey?: string;
|
|
17
|
+
pod?: string;
|
|
18
|
+
workspace?: string;
|
|
19
|
+
label?: string;
|
|
20
|
+
}): Promise<void>;
|
|
21
|
+
export declare function agentsRemove(name: string): void;
|
|
22
|
+
export declare function agentsInfo(name: string): void;
|
|
23
|
+
export declare function agentsCreate(opts?: {
|
|
24
|
+
template?: string;
|
|
25
|
+
name?: string;
|
|
26
|
+
type?: string;
|
|
27
|
+
role?: string;
|
|
28
|
+
workspace?: string;
|
|
29
|
+
pod?: string;
|
|
30
|
+
}): Promise<void>;
|
|
31
|
+
export declare function agentsRotateKey(nameOrId: string): Promise<void>;
|
|
@@ -0,0 +1,478 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* synap agents — manage named agent identities
|
|
3
|
+
*
|
|
4
|
+
* synap agents list list all configured agent identities
|
|
5
|
+
* synap agents add add a named agent identity (legacy — use create for new agents)
|
|
6
|
+
* synap agents create create a new agent on the pod with template support
|
|
7
|
+
* synap agents remove <name> remove an agent identity
|
|
8
|
+
* synap agents info <name> show details for an agent identity
|
|
9
|
+
* synap agents rotate-key <n> rotate the API key for an agent
|
|
10
|
+
*/
|
|
11
|
+
import chalk from "chalk";
|
|
12
|
+
import ora from "ora";
|
|
13
|
+
import prompts from "prompts";
|
|
14
|
+
import { log } from "../utils/logger.js";
|
|
15
|
+
import { listAgents, getAgent, addAgent, removeAgent, } from "../lib/agents-config.js";
|
|
16
|
+
import { listPodProfiles } from "../lib/pod.js";
|
|
17
|
+
import { resolveHubConfig, hubGet } from "../lib/hub-client.js";
|
|
18
|
+
function maskKey(key) {
|
|
19
|
+
if (key.length <= 12)
|
|
20
|
+
return key.slice(0, 4) + "...";
|
|
21
|
+
return key.slice(0, 12) + "...";
|
|
22
|
+
}
|
|
23
|
+
function resolveGovernance(profile) {
|
|
24
|
+
const template = profile.template;
|
|
25
|
+
if (template === "twin")
|
|
26
|
+
return "inherited";
|
|
27
|
+
if (template === "assistant")
|
|
28
|
+
return "strict";
|
|
29
|
+
return "standard";
|
|
30
|
+
}
|
|
31
|
+
// ─── list ─────────────────────────────────────────────────────────────────────
|
|
32
|
+
export function agentsList(opts = {}) {
|
|
33
|
+
const agents = listAgents();
|
|
34
|
+
if (opts.json) {
|
|
35
|
+
console.log(JSON.stringify(agents.map(({ name, profile }) => ({
|
|
36
|
+
name,
|
|
37
|
+
pod: profile.podName,
|
|
38
|
+
workspaceId: profile.workspaceId ?? null,
|
|
39
|
+
label: profile.label ?? null,
|
|
40
|
+
template: profile.template ?? null,
|
|
41
|
+
governance: resolveGovernance(profile),
|
|
42
|
+
createdAt: profile.createdAt,
|
|
43
|
+
})), null, 2));
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (agents.length === 0) {
|
|
47
|
+
log.info("No agent identities configured. Use: synap agents create --template=assistant --name <n>");
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
log.heading("Configured agent identities");
|
|
51
|
+
for (const { name, profile } of agents) {
|
|
52
|
+
const workspace = profile.workspaceId ? chalk.dim(` ws:${profile.workspaceId.slice(0, 8)}…`) : "";
|
|
53
|
+
const label = profile.label ? chalk.dim(` (${profile.label})`) : "";
|
|
54
|
+
const template = chalk.dim((profile.template ?? "—").padEnd(10));
|
|
55
|
+
const governance = chalk.dim(resolveGovernance(profile).padEnd(10));
|
|
56
|
+
console.log(` ${chalk.bold(name.padEnd(16))}` +
|
|
57
|
+
` pod:${chalk.cyan(profile.podName.padEnd(12))}` +
|
|
58
|
+
` key:${chalk.dim(maskKey(profile.apiKey))}` +
|
|
59
|
+
` tmpl:${template}` +
|
|
60
|
+
` gov:${governance}` +
|
|
61
|
+
workspace +
|
|
62
|
+
label);
|
|
63
|
+
}
|
|
64
|
+
log.blank();
|
|
65
|
+
log.dim("synap agents create — create a new agent on the pod");
|
|
66
|
+
log.dim("synap agents info <n> — show full details");
|
|
67
|
+
}
|
|
68
|
+
// ─── add (legacy) ─────────────────────────────────────────────────────────────
|
|
69
|
+
// Deprecated: Use `synap agents create` for new agents.
|
|
70
|
+
// `add` is for registering pre-existing agent credentials.
|
|
71
|
+
export async function agentsAdd(opts = {}) {
|
|
72
|
+
const isTTY = process.stdin.isTTY;
|
|
73
|
+
// ── name ──────────────────────────────────────────────────────────────────
|
|
74
|
+
let agentName = opts.name;
|
|
75
|
+
if (!agentName) {
|
|
76
|
+
if (!isTTY) {
|
|
77
|
+
log.error("--name is required in non-interactive mode");
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const { inputName } = await prompts({
|
|
81
|
+
type: "text",
|
|
82
|
+
name: "inputName",
|
|
83
|
+
message: "Identifier for this agent (e.g. researcher, builder):",
|
|
84
|
+
validate: (v) => v.trim().length > 0 || "Name is required",
|
|
85
|
+
});
|
|
86
|
+
if (!inputName)
|
|
87
|
+
return;
|
|
88
|
+
agentName = inputName.trim().toLowerCase().replace(/\s+/g, "-");
|
|
89
|
+
}
|
|
90
|
+
// ── apiKey ────────────────────────────────────────────────────────────────
|
|
91
|
+
let apiKey = opts.apiKey;
|
|
92
|
+
if (!apiKey) {
|
|
93
|
+
if (!isTTY) {
|
|
94
|
+
log.error("--api-key is required in non-interactive mode");
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const { key } = await prompts({
|
|
98
|
+
type: "password",
|
|
99
|
+
name: "key",
|
|
100
|
+
message: "Hub Protocol API key for this agent:",
|
|
101
|
+
validate: (v) => v.trim().length > 0 || "API key is required",
|
|
102
|
+
});
|
|
103
|
+
if (!key)
|
|
104
|
+
return;
|
|
105
|
+
apiKey = key.trim();
|
|
106
|
+
}
|
|
107
|
+
// ── pod ───────────────────────────────────────────────────────────────────
|
|
108
|
+
let podName = opts.pod;
|
|
109
|
+
if (!podName) {
|
|
110
|
+
const profiles = listPodProfiles();
|
|
111
|
+
if (profiles.length === 0) {
|
|
112
|
+
log.error("No pod profiles configured. Run: synap pods add");
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const activePod = profiles.find((p) => p.active);
|
|
116
|
+
const defaultPod = activePod?.name ?? profiles[0].name;
|
|
117
|
+
if (!isTTY) {
|
|
118
|
+
podName = defaultPod;
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
const { picked } = await prompts({
|
|
122
|
+
type: "select",
|
|
123
|
+
name: "picked",
|
|
124
|
+
message: "Which pod profile should this agent use?",
|
|
125
|
+
choices: profiles.map((p) => ({
|
|
126
|
+
title: `${chalk.bold(p.name)}${p.active ? chalk.green(" ← active") : ""} ${chalk.dim(p.config.podUrl)}`,
|
|
127
|
+
value: p.name,
|
|
128
|
+
})),
|
|
129
|
+
initial: profiles.indexOf(activePod ?? profiles[0]),
|
|
130
|
+
});
|
|
131
|
+
if (!picked)
|
|
132
|
+
return;
|
|
133
|
+
podName = picked;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Validate pod profile exists
|
|
137
|
+
const allProfiles = listPodProfiles();
|
|
138
|
+
if (!allProfiles.find((p) => p.name === podName)) {
|
|
139
|
+
log.error(`Pod profile '${podName}' not found.`);
|
|
140
|
+
if (allProfiles.length > 0)
|
|
141
|
+
log.dim("Available: " + allProfiles.map((p) => p.name).join(", "));
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
// Validate the key works before storing
|
|
145
|
+
const spinner = ora("Validating API key...").start();
|
|
146
|
+
try {
|
|
147
|
+
const podProfile = listPodProfiles().find(p => p.name === podName);
|
|
148
|
+
const podUrl = podProfile?.config.podUrl ?? "";
|
|
149
|
+
if (podUrl) {
|
|
150
|
+
const res = await fetch(`${podUrl}/api/hub/users/me`, {
|
|
151
|
+
headers: { Authorization: `Bearer ${apiKey}` },
|
|
152
|
+
signal: AbortSignal.timeout(8000),
|
|
153
|
+
});
|
|
154
|
+
if (!res.ok) {
|
|
155
|
+
spinner.fail(`Key validation failed (HTTP ${res.status}) — key not stored.`);
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
const me = await res.json();
|
|
159
|
+
spinner.succeed(`Key valid — identity: ${me.id?.slice(0, 8) ?? "unknown"}...`);
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
spinner.warn("No pod URL to validate against — storing anyway.");
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
spinner.warn("Could not validate key (pod unreachable) — storing anyway.");
|
|
167
|
+
}
|
|
168
|
+
const profile = {
|
|
169
|
+
podName,
|
|
170
|
+
apiKey,
|
|
171
|
+
createdAt: new Date().toISOString(),
|
|
172
|
+
};
|
|
173
|
+
if (opts.workspace)
|
|
174
|
+
profile.workspaceId = opts.workspace;
|
|
175
|
+
if (opts.label)
|
|
176
|
+
profile.label = opts.label;
|
|
177
|
+
addAgent(agentName, profile);
|
|
178
|
+
log.blank();
|
|
179
|
+
log.success(`Agent '${agentName}' saved.`);
|
|
180
|
+
log.dim(`Use SYNAP_AGENT=${agentName} to activate this identity.`);
|
|
181
|
+
}
|
|
182
|
+
// ─── remove ───────────────────────────────────────────────────────────────────
|
|
183
|
+
export function agentsRemove(name) {
|
|
184
|
+
try {
|
|
185
|
+
removeAgent(name);
|
|
186
|
+
log.success(`Removed agent '${name}'.`);
|
|
187
|
+
}
|
|
188
|
+
catch (err) {
|
|
189
|
+
log.error(err instanceof Error ? err.message : String(err));
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// ─── info ─────────────────────────────────────────────────────────────────────
|
|
193
|
+
export function agentsInfo(name) {
|
|
194
|
+
const profile = getAgent(name);
|
|
195
|
+
if (!profile) {
|
|
196
|
+
log.error(`Agent '${name}' not found.`);
|
|
197
|
+
const all = listAgents();
|
|
198
|
+
if (all.length > 0)
|
|
199
|
+
log.dim("Available: " + all.map((a) => a.name).join(", "));
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
log.heading(`Agent: ${name}`);
|
|
203
|
+
console.log(` ${"Pod".padEnd(12)} ${chalk.cyan(profile.podName)}`);
|
|
204
|
+
console.log(` ${"API key".padEnd(12)} ${chalk.dim(maskKey(profile.apiKey))}`);
|
|
205
|
+
if (profile.workspaceId)
|
|
206
|
+
console.log(` ${"Workspace".padEnd(12)} ${profile.workspaceId}`);
|
|
207
|
+
if (profile.label)
|
|
208
|
+
console.log(` ${"Label".padEnd(12)} ${profile.label}`);
|
|
209
|
+
if (profile.template)
|
|
210
|
+
console.log(` ${"Template".padEnd(12)} ${profile.template}`);
|
|
211
|
+
if (profile.template)
|
|
212
|
+
console.log(` ${"Governance".padEnd(12)} ${resolveGovernance(profile)}`);
|
|
213
|
+
if (profile.agentUserId)
|
|
214
|
+
console.log(` ${"Agent ID".padEnd(12)} ${profile.agentUserId}`);
|
|
215
|
+
console.log(` ${"Created".padEnd(12)} ${chalk.dim(profile.createdAt)}`);
|
|
216
|
+
log.blank();
|
|
217
|
+
log.dim(`Usage: SYNAP_AGENT=${name} synap <command>`);
|
|
218
|
+
}
|
|
219
|
+
async function trpcMutation(podUrl, apiKey, procedure, input) {
|
|
220
|
+
const url = `${podUrl}/trpc/${procedure}`;
|
|
221
|
+
const res = await fetch(url, {
|
|
222
|
+
method: "POST",
|
|
223
|
+
headers: {
|
|
224
|
+
Authorization: `Bearer ${apiKey}`,
|
|
225
|
+
"Content-Type": "application/json",
|
|
226
|
+
},
|
|
227
|
+
body: JSON.stringify({ json: input }),
|
|
228
|
+
signal: AbortSignal.timeout(15_000),
|
|
229
|
+
});
|
|
230
|
+
const body = (await res.json());
|
|
231
|
+
if (!res.ok || body.error) {
|
|
232
|
+
throw new Error(body.error?.message ?? `HTTP ${res.status}`);
|
|
233
|
+
}
|
|
234
|
+
if (!body.result?.data)
|
|
235
|
+
throw new Error("Unexpected empty response from tRPC");
|
|
236
|
+
return body.result.data;
|
|
237
|
+
}
|
|
238
|
+
async function resolveWorkspace(cfg, preferredWorkspaceId) {
|
|
239
|
+
if (preferredWorkspaceId)
|
|
240
|
+
return preferredWorkspaceId;
|
|
241
|
+
const result = await hubGet("/workspaces", {}, cfg);
|
|
242
|
+
const workspaceList = result.workspaces ?? result;
|
|
243
|
+
const list = Array.isArray(workspaceList) ? workspaceList : [];
|
|
244
|
+
if (list.length === 0)
|
|
245
|
+
throw new Error("No workspaces found on this pod.");
|
|
246
|
+
if (list.length === 1)
|
|
247
|
+
return list[0].id;
|
|
248
|
+
if (!process.stdin.isTTY)
|
|
249
|
+
return list[0].id;
|
|
250
|
+
const { picked } = await prompts({
|
|
251
|
+
type: "select",
|
|
252
|
+
name: "picked",
|
|
253
|
+
message: "Which workspace should this agent belong to?",
|
|
254
|
+
choices: list.map((ws) => ({ title: `${ws.name} (${ws.id.slice(0, 8)}…)`, value: ws.id })),
|
|
255
|
+
});
|
|
256
|
+
if (!picked)
|
|
257
|
+
throw new Error("Workspace selection cancelled.");
|
|
258
|
+
return picked;
|
|
259
|
+
}
|
|
260
|
+
export async function agentsCreate(opts = {}) {
|
|
261
|
+
const template = (opts.template ?? "custom");
|
|
262
|
+
if (!["twin", "assistant", "custom"].includes(template)) {
|
|
263
|
+
log.error(`Unknown template '${template}'. Use: twin | assistant | custom`);
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
// Resolve pod profile
|
|
267
|
+
const allProfiles = listPodProfiles();
|
|
268
|
+
if (allProfiles.length === 0) {
|
|
269
|
+
log.error("No pod profiles configured. Run: synap pods add");
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
const activePod = opts.pod
|
|
273
|
+
? allProfiles.find((p) => p.name === opts.pod)
|
|
274
|
+
: allProfiles.find((p) => p.active) ?? allProfiles[0];
|
|
275
|
+
if (!activePod) {
|
|
276
|
+
log.error(`Pod profile '${opts.pod}' not found.`);
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
const cfg = await resolveHubConfig();
|
|
280
|
+
// Resolve workspace
|
|
281
|
+
let workspaceId;
|
|
282
|
+
try {
|
|
283
|
+
workspaceId = await resolveWorkspace(cfg, opts.workspace);
|
|
284
|
+
}
|
|
285
|
+
catch (err) {
|
|
286
|
+
log.error(err instanceof Error ? err.message : String(err));
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
// Resolve name
|
|
290
|
+
let agentName = opts.name;
|
|
291
|
+
if (template === "twin") {
|
|
292
|
+
// Fetch the caller's display name for a generated twin name
|
|
293
|
+
try {
|
|
294
|
+
const me = await hubGet("/users/me", {}, cfg);
|
|
295
|
+
agentName = agentName ?? `${me.name ?? me.email ?? "User"}'s Twin`;
|
|
296
|
+
}
|
|
297
|
+
catch {
|
|
298
|
+
agentName = agentName ?? "My Twin";
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
else if (!agentName) {
|
|
302
|
+
if (!process.stdin.isTTY) {
|
|
303
|
+
log.error("--name is required for assistant/custom templates in non-interactive mode");
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
const { inputName } = await prompts({
|
|
307
|
+
type: "text",
|
|
308
|
+
name: "inputName",
|
|
309
|
+
message: `Agent name (template: ${template}):`,
|
|
310
|
+
validate: (v) => v.trim().length > 0 || "Name is required",
|
|
311
|
+
});
|
|
312
|
+
if (!inputName)
|
|
313
|
+
return;
|
|
314
|
+
agentName = inputName.trim();
|
|
315
|
+
}
|
|
316
|
+
// Resolve agentType
|
|
317
|
+
let agentType = opts.type;
|
|
318
|
+
if (!agentType) {
|
|
319
|
+
agentType = template === "twin" ? "twin" : template === "assistant" ? "assistant" : "custom";
|
|
320
|
+
}
|
|
321
|
+
// Resolve role — twin inherits, others default to editor
|
|
322
|
+
const role = template === "twin"
|
|
323
|
+
? "editor"
|
|
324
|
+
: (opts.role ?? "editor");
|
|
325
|
+
const spinner = ora(`Creating ${template} agent on pod...`).start();
|
|
326
|
+
try {
|
|
327
|
+
// Step 1: create agent user on the pod via tRPC
|
|
328
|
+
const created = await trpcMutation(activePod.config.podUrl, cfg.apiKey, "agentUsers.create", {
|
|
329
|
+
workspaceId,
|
|
330
|
+
agentType,
|
|
331
|
+
name: agentName,
|
|
332
|
+
role,
|
|
333
|
+
description: `Created via synap CLI (template: ${template})`,
|
|
334
|
+
capabilities: [template],
|
|
335
|
+
});
|
|
336
|
+
// Step 2: mint a Hub Protocol API key for the new agent
|
|
337
|
+
const keyResult = await trpcMutation(activePod.config.podUrl, cfg.apiKey, "apiKeys.create", {
|
|
338
|
+
keyName: `${agentName} — CLI (${template})`,
|
|
339
|
+
scope: ["hub-protocol.read", "hub-protocol.write"],
|
|
340
|
+
workspaceId,
|
|
341
|
+
});
|
|
342
|
+
spinner.succeed(`Agent created: ${chalk.bold(agentName)}`);
|
|
343
|
+
log.blank();
|
|
344
|
+
console.log(` ${"ID".padEnd(12)} ${chalk.dim(created.id)}`);
|
|
345
|
+
console.log(` ${"Name".padEnd(12)} ${chalk.bold(created.name)}`);
|
|
346
|
+
console.log(` ${"Template".padEnd(12)} ${template}`);
|
|
347
|
+
console.log(` ${"Role".padEnd(12)} ${role}`);
|
|
348
|
+
console.log(` ${"Workspace".padEnd(12)} ${workspaceId.slice(0, 8)}…`);
|
|
349
|
+
log.blank();
|
|
350
|
+
if (keyResult.key) {
|
|
351
|
+
console.log(chalk.yellow(" *** Save this API key — it will not be shown again ***"));
|
|
352
|
+
console.log();
|
|
353
|
+
console.log(` ${chalk.bold("API key:")} ${chalk.green(keyResult.key)}`);
|
|
354
|
+
console.log();
|
|
355
|
+
console.log(chalk.yellow(" *** End of key — store it securely now ***"));
|
|
356
|
+
log.blank();
|
|
357
|
+
}
|
|
358
|
+
// Determine a safe local name for this agent identity
|
|
359
|
+
const localName = agentName
|
|
360
|
+
.toLowerCase()
|
|
361
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
362
|
+
.replace(/^-|-$/g, "");
|
|
363
|
+
// Store locally in agents config
|
|
364
|
+
const profile = {
|
|
365
|
+
podName: activePod.name,
|
|
366
|
+
apiKey: keyResult.key,
|
|
367
|
+
workspaceId,
|
|
368
|
+
label: agentName,
|
|
369
|
+
createdAt: new Date().toISOString(),
|
|
370
|
+
template,
|
|
371
|
+
agentUserId: created.id,
|
|
372
|
+
};
|
|
373
|
+
addAgent(localName, profile);
|
|
374
|
+
log.success(`Agent identity '${localName}' saved locally.`);
|
|
375
|
+
log.dim(`Use SYNAP_AGENT=${localName} to activate this identity.`);
|
|
376
|
+
}
|
|
377
|
+
catch (err) {
|
|
378
|
+
spinner.fail("Agent creation failed.");
|
|
379
|
+
log.error(err instanceof Error ? err.message : String(err));
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
// ─── rotate-key ───────────────────────────────────────────────────────────────
|
|
383
|
+
export async function agentsRotateKey(nameOrId) {
|
|
384
|
+
// Look up agent locally by name or agentUserId
|
|
385
|
+
const all = listAgents();
|
|
386
|
+
const match = all.find((a) => a.name === nameOrId || a.profile.agentUserId === nameOrId);
|
|
387
|
+
if (!match) {
|
|
388
|
+
log.error(`Agent '${nameOrId}' not found in local config.`);
|
|
389
|
+
if (all.length > 0)
|
|
390
|
+
log.dim("Available: " + all.map((a) => a.name).join(", "));
|
|
391
|
+
return;
|
|
392
|
+
}
|
|
393
|
+
const { name, profile } = match;
|
|
394
|
+
log.heading(`Rotate key for agent: ${name}`);
|
|
395
|
+
console.log(` ${"Pod".padEnd(12)} ${chalk.cyan(profile.podName)}`);
|
|
396
|
+
console.log(` ${"Template".padEnd(12)} ${profile.template ?? "—"}`);
|
|
397
|
+
console.log(` ${"Role".padEnd(12)} ${profile.template ? resolveGovernance(profile) : "—"}`);
|
|
398
|
+
console.log(` ${"Current key".padEnd(12)} ${chalk.dim(maskKey(profile.apiKey))}`);
|
|
399
|
+
log.blank();
|
|
400
|
+
if (!process.stdin.isTTY) {
|
|
401
|
+
log.error("rotate-key requires interactive mode (stdin must be a TTY).");
|
|
402
|
+
return;
|
|
403
|
+
}
|
|
404
|
+
const { confirmed } = await prompts({
|
|
405
|
+
type: "confirm",
|
|
406
|
+
name: "confirmed",
|
|
407
|
+
message: "This will invalidate the current API key. Continue?",
|
|
408
|
+
initial: false,
|
|
409
|
+
});
|
|
410
|
+
if (!confirmed) {
|
|
411
|
+
log.info("Cancelled.");
|
|
412
|
+
return;
|
|
413
|
+
}
|
|
414
|
+
const cfg = await resolveHubConfig();
|
|
415
|
+
const allProfiles = listPodProfiles();
|
|
416
|
+
const podProfile = allProfiles.find((p) => p.name === profile.podName);
|
|
417
|
+
if (!podProfile) {
|
|
418
|
+
log.error(`Pod profile '${profile.podName}' not found.`);
|
|
419
|
+
return;
|
|
420
|
+
}
|
|
421
|
+
const spinner = ora("Finding active key and rotating...").start();
|
|
422
|
+
try {
|
|
423
|
+
// Find the active API key for this agent user
|
|
424
|
+
// We list keys owned by the caller and find one matching the agent
|
|
425
|
+
// The key was created with the agent's userId — but we minted it as the
|
|
426
|
+
// caller, so it's under the caller's keys. We look up by prefix match.
|
|
427
|
+
const keysResult = await fetch(`${podProfile.config.podUrl}/trpc/apiKeys.list`, {
|
|
428
|
+
method: "GET",
|
|
429
|
+
headers: { Authorization: `Bearer ${cfg.apiKey}` },
|
|
430
|
+
signal: AbortSignal.timeout(10_000),
|
|
431
|
+
});
|
|
432
|
+
let activeKeyId;
|
|
433
|
+
if (keysResult.ok) {
|
|
434
|
+
const keysBody = (await keysResult.json());
|
|
435
|
+
const keys = keysBody.result?.data ?? [];
|
|
436
|
+
// Match by keyName pattern used in agentsCreate
|
|
437
|
+
const agentKeyName = profile.label ?? name;
|
|
438
|
+
const match = keys.find((k) => k.isActive && k.keyName.startsWith(agentKeyName));
|
|
439
|
+
activeKeyId = match?.id;
|
|
440
|
+
}
|
|
441
|
+
if (!activeKeyId) {
|
|
442
|
+
spinner.warn("Could not find an active key record — will create a fresh key instead.");
|
|
443
|
+
// Create a new key directly
|
|
444
|
+
const newKeyResult = await trpcMutation(podProfile.config.podUrl, cfg.apiKey, "apiKeys.create", {
|
|
445
|
+
keyName: `${profile.label ?? name} — CLI (rotated ${new Date().toISOString().slice(0, 10)})`,
|
|
446
|
+
scope: ["hub-protocol.read", "hub-protocol.write"],
|
|
447
|
+
workspaceId: profile.workspaceId,
|
|
448
|
+
});
|
|
449
|
+
spinner.succeed("New key minted.");
|
|
450
|
+
displayNewKey(newKeyResult.key);
|
|
451
|
+
updateLocalKey(name, profile, newKeyResult.key);
|
|
452
|
+
return;
|
|
453
|
+
}
|
|
454
|
+
// Rotate the found key
|
|
455
|
+
const rotated = await trpcMutation(podProfile.config.podUrl, cfg.apiKey, "apiKeys.rotate", { keyId: activeKeyId });
|
|
456
|
+
spinner.succeed("Key rotated successfully.");
|
|
457
|
+
displayNewKey(rotated.key);
|
|
458
|
+
updateLocalKey(name, profile, rotated.key);
|
|
459
|
+
}
|
|
460
|
+
catch (err) {
|
|
461
|
+
spinner.fail("Key rotation failed.");
|
|
462
|
+
log.error(err instanceof Error ? err.message : String(err));
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
function displayNewKey(key) {
|
|
466
|
+
log.blank();
|
|
467
|
+
console.log(chalk.yellow(" *** Save this new API key — it will not be shown again ***"));
|
|
468
|
+
console.log();
|
|
469
|
+
console.log(` ${chalk.bold("New API key:")} ${chalk.green(key)}`);
|
|
470
|
+
console.log();
|
|
471
|
+
console.log(chalk.yellow(" *** End of key — store it securely now ***"));
|
|
472
|
+
log.blank();
|
|
473
|
+
}
|
|
474
|
+
function updateLocalKey(name, profile, newKey) {
|
|
475
|
+
addAgent(name, { ...profile, apiKey: newKey });
|
|
476
|
+
log.success(`Local agent config updated with new key.`);
|
|
477
|
+
}
|
|
478
|
+
//# sourceMappingURL=agents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/commands/agents.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,28 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* synap connect
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Wire an AI surface to a configured Synap pod. Credentials come from stored
|
|
5
|
+
* pod profiles (synap pods add) — no re-authentication needed.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* synap connect (interactive: pick surface + pod)
|
|
9
|
+
* synap connect --target=claude-code
|
|
10
|
+
* synap connect --target=claude-desktop
|
|
11
|
+
* synap connect --target=cursor
|
|
12
|
+
* synap connect --target=raycast
|
|
13
|
+
* synap connect --target=openclaw
|
|
14
|
+
* synap connect --target=claude-code --name=team (use specific pod profile)
|
|
15
|
+
*
|
|
16
|
+
* Escape hatch for scripting:
|
|
17
|
+
* synap connect --pod-url <url> --api-key <key> (bypass stored profiles)
|
|
5
18
|
*/
|
|
6
19
|
interface ConnectOptions {
|
|
7
20
|
podUrl?: string;
|
|
8
21
|
apiKey?: string;
|
|
22
|
+
target?: string;
|
|
23
|
+
list?: boolean;
|
|
24
|
+
name?: string;
|
|
25
|
+
manualKey?: boolean;
|
|
9
26
|
}
|
|
10
27
|
export declare function connect(opts: ConnectOptions): Promise<void>;
|
|
11
28
|
export {};
|