@synap-core/cli
Advanced tools
| /** | ||
| * synap agents — manage named agent identities | ||
| * | ||
| * synap agents list list all configured agent identities | ||
| * synap agents add add a named agent identity (legacy — use create for new agents) | ||
| * synap agents create create a new agent on the pod with template support | ||
| * synap agents remove <name> remove an agent identity | ||
| * synap agents info <name> show details for an agent identity | ||
| * synap agents rotate-key <n> rotate the API key for an agent | ||
| */ | ||
| export declare function agentsList(opts?: { | ||
| json?: boolean; | ||
| }): void; | ||
| export declare function agentsAdd(opts?: { | ||
| name?: string; | ||
| apiKey?: string; | ||
| pod?: string; | ||
| workspace?: string; | ||
| label?: string; | ||
| }): Promise<void>; | ||
| export declare function agentsRemove(name: string): void; | ||
| export declare function agentsInfo(name: string): void; | ||
| export declare function agentsCreate(opts?: { | ||
| template?: string; | ||
| name?: string; | ||
| type?: string; | ||
| role?: string; | ||
| workspace?: string; | ||
| pod?: string; | ||
| }): Promise<void>; | ||
| export declare function agentsRotateKey(nameOrId: string): Promise<void>; |
| /** | ||
| * synap agents — manage named agent identities | ||
| * | ||
| * synap agents list list all configured agent identities | ||
| * synap agents add add a named agent identity (legacy — use create for new agents) | ||
| * synap agents create create a new agent on the pod with template support | ||
| * synap agents remove <name> remove an agent identity | ||
| * synap agents info <name> show details for an agent identity | ||
| * synap agents rotate-key <n> rotate the API key for an agent | ||
| */ | ||
| import chalk from "chalk"; | ||
| import ora from "ora"; | ||
| import prompts from "prompts"; | ||
| import { log } from "../utils/logger.js"; | ||
| import { listAgents, getAgent, addAgent, removeAgent, } from "../lib/agents-config.js"; | ||
| import { listPodProfiles } from "../lib/pod.js"; | ||
| import { resolveHubConfig, hubGet } from "../lib/hub-client.js"; | ||
| function maskKey(key) { | ||
| if (key.length <= 12) | ||
| return key.slice(0, 4) + "..."; | ||
| return key.slice(0, 12) + "..."; | ||
| } | ||
| function resolveGovernance(profile) { | ||
| const template = profile.template; | ||
| if (template === "twin") | ||
| return "inherited"; | ||
| if (template === "assistant") | ||
| return "strict"; | ||
| return "standard"; | ||
| } | ||
| // ─── list ───────────────────────────────────────────────────────────────────── | ||
| export function agentsList(opts = {}) { | ||
| const agents = listAgents(); | ||
| if (opts.json) { | ||
| console.log(JSON.stringify(agents.map(({ name, profile }) => ({ | ||
| name, | ||
| pod: profile.podName, | ||
| workspaceId: profile.workspaceId ?? null, | ||
| label: profile.label ?? null, | ||
| template: profile.template ?? null, | ||
| governance: resolveGovernance(profile), | ||
| createdAt: profile.createdAt, | ||
| })), null, 2)); | ||
| return; | ||
| } | ||
| if (agents.length === 0) { | ||
| log.info("No agent identities configured. Use: synap agents create --template=assistant --name <n>"); | ||
| return; | ||
| } | ||
| log.heading("Configured agent identities"); | ||
| for (const { name, profile } of agents) { | ||
| const workspace = profile.workspaceId ? chalk.dim(` ws:${profile.workspaceId.slice(0, 8)}…`) : ""; | ||
| const label = profile.label ? chalk.dim(` (${profile.label})`) : ""; | ||
| const template = chalk.dim((profile.template ?? "—").padEnd(10)); | ||
| const governance = chalk.dim(resolveGovernance(profile).padEnd(10)); | ||
| console.log(` ${chalk.bold(name.padEnd(16))}` + | ||
| ` pod:${chalk.cyan(profile.podName.padEnd(12))}` + | ||
| ` key:${chalk.dim(maskKey(profile.apiKey))}` + | ||
| ` tmpl:${template}` + | ||
| ` gov:${governance}` + | ||
| workspace + | ||
| label); | ||
| } | ||
| log.blank(); | ||
| log.dim("synap agents create — create a new agent on the pod"); | ||
| log.dim("synap agents info <n> — show full details"); | ||
| } | ||
| // ─── add (legacy) ───────────────────────────────────────────────────────────── | ||
| // Deprecated: Use `synap agents create` for new agents. | ||
| // `add` is for registering pre-existing agent credentials. | ||
| export async function agentsAdd(opts = {}) { | ||
| const isTTY = process.stdin.isTTY; | ||
| // ── name ────────────────────────────────────────────────────────────────── | ||
| let agentName = opts.name; | ||
| if (!agentName) { | ||
| if (!isTTY) { | ||
| log.error("--name is required in non-interactive mode"); | ||
| return; | ||
| } | ||
| const { inputName } = await prompts({ | ||
| type: "text", | ||
| name: "inputName", | ||
| message: "Identifier for this agent (e.g. researcher, builder):", | ||
| validate: (v) => v.trim().length > 0 || "Name is required", | ||
| }); | ||
| if (!inputName) | ||
| return; | ||
| agentName = inputName.trim().toLowerCase().replace(/\s+/g, "-"); | ||
| } | ||
| // ── apiKey ──────────────────────────────────────────────────────────────── | ||
| let apiKey = opts.apiKey; | ||
| if (!apiKey) { | ||
| if (!isTTY) { | ||
| log.error("--api-key is required in non-interactive mode"); | ||
| return; | ||
| } | ||
| const { key } = await prompts({ | ||
| type: "password", | ||
| name: "key", | ||
| message: "Hub Protocol API key for this agent:", | ||
| validate: (v) => v.trim().length > 0 || "API key is required", | ||
| }); | ||
| if (!key) | ||
| return; | ||
| apiKey = key.trim(); | ||
| } | ||
| // ── pod ─────────────────────────────────────────────────────────────────── | ||
| let podName = opts.pod; | ||
| if (!podName) { | ||
| const profiles = listPodProfiles(); | ||
| if (profiles.length === 0) { | ||
| log.error("No pod profiles configured. Run: synap pods add"); | ||
| return; | ||
| } | ||
| const activePod = profiles.find((p) => p.active); | ||
| const defaultPod = activePod?.name ?? profiles[0].name; | ||
| if (!isTTY) { | ||
| podName = defaultPod; | ||
| } | ||
| else { | ||
| const { picked } = await prompts({ | ||
| type: "select", | ||
| name: "picked", | ||
| message: "Which pod profile should this agent use?", | ||
| choices: profiles.map((p) => ({ | ||
| title: `${chalk.bold(p.name)}${p.active ? chalk.green(" ← active") : ""} ${chalk.dim(p.config.podUrl)}`, | ||
| value: p.name, | ||
| })), | ||
| initial: profiles.indexOf(activePod ?? profiles[0]), | ||
| }); | ||
| if (!picked) | ||
| return; | ||
| podName = picked; | ||
| } | ||
| } | ||
| // Validate pod profile exists | ||
| const allProfiles = listPodProfiles(); | ||
| if (!allProfiles.find((p) => p.name === podName)) { | ||
| log.error(`Pod profile '${podName}' not found.`); | ||
| if (allProfiles.length > 0) | ||
| log.dim("Available: " + allProfiles.map((p) => p.name).join(", ")); | ||
| return; | ||
| } | ||
| // Validate the key works before storing | ||
| const spinner = ora("Validating API key...").start(); | ||
| try { | ||
| const podProfile = listPodProfiles().find(p => p.name === podName); | ||
| const podUrl = podProfile?.config.podUrl ?? ""; | ||
| if (podUrl) { | ||
| const res = await fetch(`${podUrl}/api/hub/users/me`, { | ||
| headers: { Authorization: `Bearer ${apiKey}` }, | ||
| signal: AbortSignal.timeout(8000), | ||
| }); | ||
| if (!res.ok) { | ||
| spinner.fail(`Key validation failed (HTTP ${res.status}) — key not stored.`); | ||
| return; | ||
| } | ||
| const me = await res.json(); | ||
| spinner.succeed(`Key valid — identity: ${me.id?.slice(0, 8) ?? "unknown"}...`); | ||
| } | ||
| else { | ||
| spinner.warn("No pod URL to validate against — storing anyway."); | ||
| } | ||
| } | ||
| catch { | ||
| spinner.warn("Could not validate key (pod unreachable) — storing anyway."); | ||
| } | ||
| const profile = { | ||
| podName, | ||
| apiKey, | ||
| createdAt: new Date().toISOString(), | ||
| }; | ||
| if (opts.workspace) | ||
| profile.workspaceId = opts.workspace; | ||
| if (opts.label) | ||
| profile.label = opts.label; | ||
| addAgent(agentName, profile); | ||
| log.blank(); | ||
| log.success(`Agent '${agentName}' saved.`); | ||
| log.dim(`Use SYNAP_AGENT=${agentName} to activate this identity.`); | ||
| } | ||
| // ─── remove ─────────────────────────────────────────────────────────────────── | ||
| export function agentsRemove(name) { | ||
| try { | ||
| removeAgent(name); | ||
| log.success(`Removed agent '${name}'.`); | ||
| } | ||
| catch (err) { | ||
| log.error(err instanceof Error ? err.message : String(err)); | ||
| } | ||
| } | ||
| // ─── info ───────────────────────────────────────────────────────────────────── | ||
| export function agentsInfo(name) { | ||
| const profile = getAgent(name); | ||
| if (!profile) { | ||
| log.error(`Agent '${name}' not found.`); | ||
| const all = listAgents(); | ||
| if (all.length > 0) | ||
| log.dim("Available: " + all.map((a) => a.name).join(", ")); | ||
| return; | ||
| } | ||
| log.heading(`Agent: ${name}`); | ||
| console.log(` ${"Pod".padEnd(12)} ${chalk.cyan(profile.podName)}`); | ||
| console.log(` ${"API key".padEnd(12)} ${chalk.dim(maskKey(profile.apiKey))}`); | ||
| if (profile.workspaceId) | ||
| console.log(` ${"Workspace".padEnd(12)} ${profile.workspaceId}`); | ||
| if (profile.label) | ||
| console.log(` ${"Label".padEnd(12)} ${profile.label}`); | ||
| if (profile.template) | ||
| console.log(` ${"Template".padEnd(12)} ${profile.template}`); | ||
| if (profile.template) | ||
| console.log(` ${"Governance".padEnd(12)} ${resolveGovernance(profile)}`); | ||
| if (profile.agentUserId) | ||
| console.log(` ${"Agent ID".padEnd(12)} ${profile.agentUserId}`); | ||
| console.log(` ${"Created".padEnd(12)} ${chalk.dim(profile.createdAt)}`); | ||
| log.blank(); | ||
| log.dim(`Usage: SYNAP_AGENT=${name} synap <command>`); | ||
| } | ||
| async function trpcMutation(podUrl, apiKey, procedure, input) { | ||
| const url = `${podUrl}/trpc/${procedure}`; | ||
| const res = await fetch(url, { | ||
| method: "POST", | ||
| headers: { | ||
| Authorization: `Bearer ${apiKey}`, | ||
| "Content-Type": "application/json", | ||
| }, | ||
| body: JSON.stringify({ json: input }), | ||
| signal: AbortSignal.timeout(15_000), | ||
| }); | ||
| const body = (await res.json()); | ||
| if (!res.ok || body.error) { | ||
| throw new Error(body.error?.message ?? `HTTP ${res.status}`); | ||
| } | ||
| if (!body.result?.data) | ||
| throw new Error("Unexpected empty response from tRPC"); | ||
| return body.result.data; | ||
| } | ||
| async function resolveWorkspace(cfg, preferredWorkspaceId) { | ||
| if (preferredWorkspaceId) | ||
| return preferredWorkspaceId; | ||
| const result = await hubGet("/workspaces", {}, cfg); | ||
| const workspaceList = result.workspaces ?? result; | ||
| const list = Array.isArray(workspaceList) ? workspaceList : []; | ||
| if (list.length === 0) | ||
| throw new Error("No workspaces found on this pod."); | ||
| if (list.length === 1) | ||
| return list[0].id; | ||
| if (!process.stdin.isTTY) | ||
| return list[0].id; | ||
| const { picked } = await prompts({ | ||
| type: "select", | ||
| name: "picked", | ||
| message: "Which workspace should this agent belong to?", | ||
| choices: list.map((ws) => ({ title: `${ws.name} (${ws.id.slice(0, 8)}…)`, value: ws.id })), | ||
| }); | ||
| if (!picked) | ||
| throw new Error("Workspace selection cancelled."); | ||
| return picked; | ||
| } | ||
| export async function agentsCreate(opts = {}) { | ||
| const template = (opts.template ?? "custom"); | ||
| if (!["twin", "assistant", "custom"].includes(template)) { | ||
| log.error(`Unknown template '${template}'. Use: twin | assistant | custom`); | ||
| return; | ||
| } | ||
| // Resolve pod profile | ||
| const allProfiles = listPodProfiles(); | ||
| if (allProfiles.length === 0) { | ||
| log.error("No pod profiles configured. Run: synap pods add"); | ||
| return; | ||
| } | ||
| const activePod = opts.pod | ||
| ? allProfiles.find((p) => p.name === opts.pod) | ||
| : allProfiles.find((p) => p.active) ?? allProfiles[0]; | ||
| if (!activePod) { | ||
| log.error(`Pod profile '${opts.pod}' not found.`); | ||
| return; | ||
| } | ||
| const cfg = await resolveHubConfig(); | ||
| // Resolve workspace | ||
| let workspaceId; | ||
| try { | ||
| workspaceId = await resolveWorkspace(cfg, opts.workspace); | ||
| } | ||
| catch (err) { | ||
| log.error(err instanceof Error ? err.message : String(err)); | ||
| return; | ||
| } | ||
| // Resolve name | ||
| let agentName = opts.name; | ||
| if (template === "twin") { | ||
| // Fetch the caller's display name for a generated twin name | ||
| try { | ||
| const me = await hubGet("/users/me", {}, cfg); | ||
| agentName = agentName ?? `${me.name ?? me.email ?? "User"}'s Twin`; | ||
| } | ||
| catch { | ||
| agentName = agentName ?? "My Twin"; | ||
| } | ||
| } | ||
| else if (!agentName) { | ||
| if (!process.stdin.isTTY) { | ||
| log.error("--name is required for assistant/custom templates in non-interactive mode"); | ||
| return; | ||
| } | ||
| const { inputName } = await prompts({ | ||
| type: "text", | ||
| name: "inputName", | ||
| message: `Agent name (template: ${template}):`, | ||
| validate: (v) => v.trim().length > 0 || "Name is required", | ||
| }); | ||
| if (!inputName) | ||
| return; | ||
| agentName = inputName.trim(); | ||
| } | ||
| // Resolve agentType | ||
| let agentType = opts.type; | ||
| if (!agentType) { | ||
| agentType = template === "twin" ? "twin" : template === "assistant" ? "assistant" : "custom"; | ||
| } | ||
| // Resolve role — twin inherits, others default to editor | ||
| const role = template === "twin" | ||
| ? "editor" | ||
| : (opts.role ?? "editor"); | ||
| const spinner = ora(`Creating ${template} agent on pod...`).start(); | ||
| try { | ||
| // Step 1: create agent user on the pod via tRPC | ||
| const created = await trpcMutation(activePod.config.podUrl, cfg.apiKey, "agentUsers.create", { | ||
| workspaceId, | ||
| agentType, | ||
| name: agentName, | ||
| role, | ||
| description: `Created via synap CLI (template: ${template})`, | ||
| capabilities: [template], | ||
| }); | ||
| // Step 2: mint a Hub Protocol API key for the new agent | ||
| const keyResult = await trpcMutation(activePod.config.podUrl, cfg.apiKey, "apiKeys.create", { | ||
| keyName: `${agentName} — CLI (${template})`, | ||
| scope: ["hub-protocol.read", "hub-protocol.write"], | ||
| workspaceId, | ||
| }); | ||
| spinner.succeed(`Agent created: ${chalk.bold(agentName)}`); | ||
| log.blank(); | ||
| console.log(` ${"ID".padEnd(12)} ${chalk.dim(created.id)}`); | ||
| console.log(` ${"Name".padEnd(12)} ${chalk.bold(created.name)}`); | ||
| console.log(` ${"Template".padEnd(12)} ${template}`); | ||
| console.log(` ${"Role".padEnd(12)} ${role}`); | ||
| console.log(` ${"Workspace".padEnd(12)} ${workspaceId.slice(0, 8)}…`); | ||
| log.blank(); | ||
| if (keyResult.key) { | ||
| console.log(chalk.yellow(" *** Save this API key — it will not be shown again ***")); | ||
| console.log(); | ||
| console.log(` ${chalk.bold("API key:")} ${chalk.green(keyResult.key)}`); | ||
| console.log(); | ||
| console.log(chalk.yellow(" *** End of key — store it securely now ***")); | ||
| log.blank(); | ||
| } | ||
| // Determine a safe local name for this agent identity | ||
| const localName = agentName | ||
| .toLowerCase() | ||
| .replace(/[^a-z0-9]+/g, "-") | ||
| .replace(/^-|-$/g, ""); | ||
| // Store locally in agents config | ||
| const profile = { | ||
| podName: activePod.name, | ||
| apiKey: keyResult.key, | ||
| workspaceId, | ||
| label: agentName, | ||
| createdAt: new Date().toISOString(), | ||
| template, | ||
| agentUserId: created.id, | ||
| }; | ||
| addAgent(localName, profile); | ||
| log.success(`Agent identity '${localName}' saved locally.`); | ||
| log.dim(`Use SYNAP_AGENT=${localName} to activate this identity.`); | ||
| } | ||
| catch (err) { | ||
| spinner.fail("Agent creation failed."); | ||
| log.error(err instanceof Error ? err.message : String(err)); | ||
| } | ||
| } | ||
| // ─── rotate-key ─────────────────────────────────────────────────────────────── | ||
| export async function agentsRotateKey(nameOrId) { | ||
| // Look up agent locally by name or agentUserId | ||
| const all = listAgents(); | ||
| const match = all.find((a) => a.name === nameOrId || a.profile.agentUserId === nameOrId); | ||
| if (!match) { | ||
| log.error(`Agent '${nameOrId}' not found in local config.`); | ||
| if (all.length > 0) | ||
| log.dim("Available: " + all.map((a) => a.name).join(", ")); | ||
| return; | ||
| } | ||
| const { name, profile } = match; | ||
| log.heading(`Rotate key for agent: ${name}`); | ||
| console.log(` ${"Pod".padEnd(12)} ${chalk.cyan(profile.podName)}`); | ||
| console.log(` ${"Template".padEnd(12)} ${profile.template ?? "—"}`); | ||
| console.log(` ${"Role".padEnd(12)} ${profile.template ? resolveGovernance(profile) : "—"}`); | ||
| console.log(` ${"Current key".padEnd(12)} ${chalk.dim(maskKey(profile.apiKey))}`); | ||
| log.blank(); | ||
| if (!process.stdin.isTTY) { | ||
| log.error("rotate-key requires interactive mode (stdin must be a TTY)."); | ||
| return; | ||
| } | ||
| const { confirmed } = await prompts({ | ||
| type: "confirm", | ||
| name: "confirmed", | ||
| message: "This will invalidate the current API key. Continue?", | ||
| initial: false, | ||
| }); | ||
| if (!confirmed) { | ||
| log.info("Cancelled."); | ||
| return; | ||
| } | ||
| const cfg = await resolveHubConfig(); | ||
| const allProfiles = listPodProfiles(); | ||
| const podProfile = allProfiles.find((p) => p.name === profile.podName); | ||
| if (!podProfile) { | ||
| log.error(`Pod profile '${profile.podName}' not found.`); | ||
| return; | ||
| } | ||
| const spinner = ora("Finding active key and rotating...").start(); | ||
| try { | ||
| // Find the active API key for this agent user | ||
| // We list keys owned by the caller and find one matching the agent | ||
| // The key was created with the agent's userId — but we minted it as the | ||
| // caller, so it's under the caller's keys. We look up by prefix match. | ||
| const keysResult = await fetch(`${podProfile.config.podUrl}/trpc/apiKeys.list`, { | ||
| method: "GET", | ||
| headers: { Authorization: `Bearer ${cfg.apiKey}` }, | ||
| signal: AbortSignal.timeout(10_000), | ||
| }); | ||
| let activeKeyId; | ||
| if (keysResult.ok) { | ||
| const keysBody = (await keysResult.json()); | ||
| const keys = keysBody.result?.data ?? []; | ||
| // Match by keyName pattern used in agentsCreate | ||
| const agentKeyName = profile.label ?? name; | ||
| const match = keys.find((k) => k.isActive && k.keyName.startsWith(agentKeyName)); | ||
| activeKeyId = match?.id; | ||
| } | ||
| if (!activeKeyId) { | ||
| spinner.warn("Could not find an active key record — will create a fresh key instead."); | ||
| // Create a new key directly | ||
| const newKeyResult = await trpcMutation(podProfile.config.podUrl, cfg.apiKey, "apiKeys.create", { | ||
| keyName: `${profile.label ?? name} — CLI (rotated ${new Date().toISOString().slice(0, 10)})`, | ||
| scope: ["hub-protocol.read", "hub-protocol.write"], | ||
| workspaceId: profile.workspaceId, | ||
| }); | ||
| spinner.succeed("New key minted."); | ||
| displayNewKey(newKeyResult.key); | ||
| updateLocalKey(name, profile, newKeyResult.key); | ||
| return; | ||
| } | ||
| // Rotate the found key | ||
| const rotated = await trpcMutation(podProfile.config.podUrl, cfg.apiKey, "apiKeys.rotate", { keyId: activeKeyId }); | ||
| spinner.succeed("Key rotated successfully."); | ||
| displayNewKey(rotated.key); | ||
| updateLocalKey(name, profile, rotated.key); | ||
| } | ||
| catch (err) { | ||
| spinner.fail("Key rotation failed."); | ||
| log.error(err instanceof Error ? err.message : String(err)); | ||
| } | ||
| } | ||
| function displayNewKey(key) { | ||
| log.blank(); | ||
| console.log(chalk.yellow(" *** Save this new API key — it will not be shown again ***")); | ||
| console.log(); | ||
| console.log(` ${chalk.bold("New API key:")} ${chalk.green(key)}`); | ||
| console.log(); | ||
| console.log(chalk.yellow(" *** End of key — store it securely now ***")); | ||
| log.blank(); | ||
| } | ||
| function updateLocalKey(name, profile, newKey) { | ||
| addAgent(name, { ...profile, apiKey: newKey }); | ||
| log.success(`Local agent config updated with new key.`); | ||
| } | ||
| //# sourceMappingURL=agents.js.map |
| {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/commands/agents.ts"],"names":[],"mappings":"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"} |
| /** | ||
| * synap connections | ||
| * | ||
| * Show which Synap pod each agent surface is currently pointing at, | ||
| * and which stored profile it matches. | ||
| * | ||
| * synap connections | ||
| */ | ||
| export declare function connections(): Promise<void>; |
| /** | ||
| * synap connections | ||
| * | ||
| * Show which Synap pod each agent surface is currently pointing at, | ||
| * and which stored profile it matches. | ||
| * | ||
| * synap connections | ||
| */ | ||
| import chalk from "chalk"; | ||
| import fs from "node:fs"; | ||
| import path from "node:path"; | ||
| import os from "node:os"; | ||
| import { log } from "../utils/logger.js"; | ||
| import { listPodProfiles } from "../lib/pod.js"; | ||
| import { TARGETS } from "../lib/targets.js"; | ||
| import { readOpenClawConfig } from "../lib/openclaw.js"; | ||
| export async function connections() { | ||
| const profiles = listPodProfiles(); | ||
| // URL → profile name lookup (normalise trailing slash) | ||
| const urlToProfile = {}; | ||
| for (const p of profiles) { | ||
| urlToProfile[p.config.podUrl.replace(/\/$/, "")] = p.name; | ||
| } | ||
| const surfaces = [ | ||
| detectClaudeCode(urlToProfile), | ||
| detectClaudeDesktop(urlToProfile), | ||
| detectCursor(urlToProfile), | ||
| detectOpenClaw(urlToProfile), | ||
| detectRaycast(urlToProfile), | ||
| ]; | ||
| const configured = surfaces.filter((s) => s.configured); | ||
| const unconfigured = surfaces.filter((s) => !s.configured); | ||
| log.heading("Agent surface connections"); | ||
| if (configured.length === 0 && unconfigured.length === surfaces.length) { | ||
| log.dim("No surfaces connected yet."); | ||
| log.blank(); | ||
| log.info("Connect a surface: synap connect"); | ||
| return; | ||
| } | ||
| // Widths for alignment | ||
| const labelW = Math.max(...surfaces.map((s) => s.label.length)) + 2; | ||
| const profileW = Math.max(10, ...configured.map((s) => (s.profile ?? "(unknown)").length)) + 2; | ||
| for (const s of configured) { | ||
| const icon = s.profile ? chalk.green("●") : chalk.yellow("●"); | ||
| const label = s.label.padEnd(labelW); | ||
| const profileStr = s.profile | ||
| ? chalk.bold(s.profile.padEnd(profileW)) | ||
| : chalk.yellow("(unknown pod)".padEnd(profileW)); | ||
| const url = chalk.dim(s.podUrl ?? ""); | ||
| console.log(` ${icon} ${label} ${profileStr} ${url}`); | ||
| } | ||
| for (const s of unconfigured) { | ||
| console.log(` ${chalk.dim("○")} ${chalk.dim(s.label.padEnd(labelW))} ${chalk.dim("not configured")}`); | ||
| } | ||
| log.blank(); | ||
| if (profiles.length > 1) { | ||
| log.dim("synap pods use <name> — switch ALL surfaces to a pod"); | ||
| } | ||
| log.dim("synap connect — wire a surface to a specific pod"); | ||
| log.dim("synap pods list — show configured pods"); | ||
| } | ||
| // ─── Surface detectors ──────────────────────────────────────────────────────── | ||
| function detectClaudeCode(urlToProfile) { | ||
| const settingsPath = path.join(os.homedir(), ".claude", "settings.json"); | ||
| try { | ||
| if (!fs.existsSync(settingsPath)) | ||
| return { label: "Claude Code", configured: false, configPath: settingsPath }; | ||
| const settings = JSON.parse(fs.readFileSync(settingsPath, "utf-8")); | ||
| const podUrl = settings.env?.SYNAP_POD_URL; | ||
| if (!podUrl) | ||
| return { label: "Claude Code", configured: false, configPath: settingsPath }; | ||
| const profile = urlToProfile[podUrl.replace(/\/$/, "")]; | ||
| return { label: "Claude Code", configured: true, podUrl, profile, configPath: settingsPath }; | ||
| } | ||
| catch { | ||
| return { label: "Claude Code", configured: false, configPath: settingsPath }; | ||
| } | ||
| } | ||
| function detectClaudeDesktop(urlToProfile) { | ||
| const configPath = TARGETS["claude-desktop"].mcpConfigPath?.(); | ||
| if (!configPath) | ||
| return { label: "Claude Desktop", configured: false }; | ||
| try { | ||
| if (!fs.existsSync(configPath)) | ||
| return { label: "Claude Desktop", configured: false, configPath }; | ||
| const config = JSON.parse(fs.readFileSync(configPath, "utf-8")); | ||
| const synap = config.mcpServers?.["synap"]; | ||
| if (!synap) | ||
| return { label: "Claude Desktop", configured: false, configPath }; | ||
| // stdio bridge: args = ["-y", "mcp-remote", "<podUrl>/mcp", "--header", "..."] | ||
| const rawUrl = synap.args?.[2] ?? synap.url; | ||
| const podUrl = rawUrl?.replace(/\/mcp$/, ""); | ||
| if (!podUrl) | ||
| return { label: "Claude Desktop", configured: false, configPath }; | ||
| const profile = urlToProfile[podUrl.replace(/\/$/, "")]; | ||
| return { label: "Claude Desktop", configured: true, podUrl, profile, configPath }; | ||
| } | ||
| catch { | ||
| return { label: "Claude Desktop", configured: false, configPath }; | ||
| } | ||
| } | ||
| function detectCursor(urlToProfile) { | ||
| const configPath = TARGETS["cursor"].mcpConfigPath?.(); | ||
| if (!configPath) | ||
| return { label: "Cursor", configured: false }; | ||
| try { | ||
| if (!fs.existsSync(configPath)) | ||
| return { label: "Cursor", configured: false, configPath }; | ||
| const config = JSON.parse(fs.readFileSync(configPath, "utf-8")); | ||
| const synap = config.mcpServers?.["synap"]; | ||
| const rawUrl = synap?.url; | ||
| const podUrl = rawUrl?.replace(/\/mcp$/, ""); | ||
| if (!podUrl) | ||
| return { label: "Cursor", configured: false, configPath }; | ||
| const profile = urlToProfile[podUrl.replace(/\/$/, "")]; | ||
| return { label: "Cursor", configured: true, podUrl, profile, configPath }; | ||
| } | ||
| catch { | ||
| return { label: "Cursor", configured: false, configPath }; | ||
| } | ||
| } | ||
| function detectOpenClaw(urlToProfile) { | ||
| try { | ||
| const ocConfig = readOpenClawConfig(); | ||
| const podUrl = ocConfig?.["synap"]; | ||
| const url = podUrl?.["podUrl"]; | ||
| if (!url) | ||
| return { label: "OpenClaw", configured: false }; | ||
| const profile = urlToProfile[url.replace(/\/$/, "")]; | ||
| return { label: "OpenClaw", configured: true, podUrl: url, profile }; | ||
| } | ||
| catch { | ||
| return { label: "OpenClaw", configured: false }; | ||
| } | ||
| } | ||
| // Raycast reads ~/.synap/config.json directly. It can have a per-surface pod | ||
| // override (surfaces.raycast); falls back to activePod if not set. | ||
| function detectRaycast(urlToProfile) { | ||
| try { | ||
| const configPath = path.join(os.homedir(), ".synap", "config.json"); | ||
| if (!fs.existsSync(configPath)) | ||
| return { label: "Raycast", configured: false }; | ||
| const raw = JSON.parse(fs.readFileSync(configPath, "utf-8")); | ||
| const podName = raw.surfaces?.["raycast"] ?? raw.activePod; | ||
| const podUrl = podName && raw.pods?.[podName]?.podUrl; | ||
| if (!podUrl || !podName) | ||
| return { label: "Raycast", configured: false }; | ||
| const profile = urlToProfile[podUrl.replace(/\/$/, "")] ?? podName; | ||
| const hasOverride = Boolean(raw.surfaces?.["raycast"]); | ||
| return { | ||
| label: hasOverride ? "Raycast (own pod)" : "Raycast", | ||
| configured: true, | ||
| podUrl, | ||
| profile, | ||
| }; | ||
| } | ||
| catch { | ||
| return { label: "Raycast", configured: false }; | ||
| } | ||
| } | ||
| //# sourceMappingURL=connections.js.map |
| {"version":3,"file":"connections.js","sourceRoot":"","sources":["../../src/commands/connections.ts"],"names":[],"mappings":"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"} |
| interface BaseOpts { | ||
| json?: boolean; | ||
| podUrl?: string; | ||
| apiKey?: string; | ||
| } | ||
| export declare function orient(opts: BaseOpts): Promise<void>; | ||
| export declare function useWorkspace(workspaceId: string, opts: BaseOpts): Promise<void>; | ||
| export declare function listWorkspaces(opts: BaseOpts): Promise<void>; | ||
| export declare function listEntities(opts: BaseOpts & { | ||
| workspace?: string; | ||
| profile?: string; | ||
| limit?: string; | ||
| }): Promise<void>; | ||
| export declare function getEntity(id: string, opts: BaseOpts & { | ||
| workspace?: string; | ||
| }): Promise<void>; | ||
| export declare function searchData(query: string, opts: BaseOpts & { | ||
| workspace?: string; | ||
| type?: string; | ||
| limit?: string; | ||
| }): Promise<void>; | ||
| export declare function rememberData(text: string, opts: BaseOpts & { | ||
| context?: string; | ||
| }): Promise<void>; | ||
| export declare function recallData(query: string, opts: BaseOpts & { | ||
| limit?: string; | ||
| }): Promise<void>; | ||
| export declare function createEntity(opts: BaseOpts & { | ||
| profile: string; | ||
| name: string; | ||
| workspace?: string; | ||
| props?: string; | ||
| }): Promise<void>; | ||
| export declare function createRelation(opts: BaseOpts & { | ||
| source: string; | ||
| target: string; | ||
| type: string; | ||
| workspace?: string; | ||
| }): Promise<void>; | ||
| export declare function updateEntity(id: string, opts: BaseOpts & { | ||
| props: string; | ||
| }): Promise<void>; | ||
| export {}; |
| import chalk from "chalk"; | ||
| import { log } from "../utils/logger.js"; | ||
| import { resolveHubConfig, resolveUserId, hubGet, hubPost, hubPatch } from "../lib/hub-client.js"; | ||
| // ─── orient ─────────────────────────────────────────────────────────────────── | ||
| export async function orient(opts) { | ||
| try { | ||
| const cfg = await resolveHubConfig(opts); | ||
| const [workspacesRes, meRes] = await Promise.all([ | ||
| hubGet("/workspaces", {}, cfg), | ||
| hubGet("/users/me", {}, cfg), | ||
| ]); | ||
| const workspaces = workspacesRes.workspaces ?? workspacesRes; | ||
| const me = meRes; | ||
| const userId = String(me.id ?? cfg.userId); | ||
| const wsList = Array.isArray(workspaces) ? workspaces : []; | ||
| // For each workspace, fetch profiles + entity count in parallel | ||
| const wsDetails = await Promise.all(wsList.map(async (ws) => { | ||
| const wsId = String(ws.id ?? ""); | ||
| const [profilesRes, entitiesRes] = await Promise.allSettled([ | ||
| hubGet("/profiles", { userId, workspaceId: wsId }, cfg), | ||
| hubGet("/entities", { userId, workspaceId: wsId, limit: 1 }, cfg), | ||
| ]); | ||
| const profiles = profilesRes.status === "fulfilled" | ||
| ? (profilesRes.value.profiles ?? profilesRes.value) | ||
| : []; | ||
| const profileList = Array.isArray(profiles) ? profiles : []; | ||
| const entityTotal = entitiesRes.status === "fulfilled" | ||
| ? Number(entitiesRes.value.total ?? 0) | ||
| : 0; | ||
| return { ws, profileList, entityTotal }; | ||
| })); | ||
| if (opts.json) { | ||
| console.log(JSON.stringify({ userId, podUrl: cfg.podUrl, workspaceId: cfg.workspaceId, workspaces: wsDetails, me }, null, 2)); | ||
| return; | ||
| } | ||
| log.heading("Pod Orientation"); | ||
| log.info(`User : ${String(me.email ?? me.name ?? userId)}`); | ||
| log.info(`Pod URL : ${cfg.podUrl}`); | ||
| if (cfg.workspaceId) | ||
| log.info(`Workspace: ${cfg.workspaceId} ${chalk.dim("(active — use 'synap use <id>' to change)")}`); | ||
| log.blank(); | ||
| log.heading("Workspaces"); | ||
| if (wsDetails.length === 0) { | ||
| log.dim("No workspaces found."); | ||
| } | ||
| else { | ||
| for (const { ws, profileList, entityTotal } of wsDetails) { | ||
| const isActive = ws.id === cfg.workspaceId; | ||
| const marker = isActive ? chalk.green("▶ ") : " "; | ||
| const name = chalk.bold(String(ws.name ?? ws.id)); | ||
| const id = chalk.dim(String(ws.id ?? "").slice(0, 8) + "…"); | ||
| const count = entityTotal > 0 ? chalk.dim(`${entityTotal} entities`) : chalk.dim("empty"); | ||
| log.info(`${marker}${name} ${id} ${count}`); | ||
| if (ws.description) | ||
| log.dim(` ${String(ws.description)}`); | ||
| if (profileList.length > 0) { | ||
| const slugs = profileList | ||
| .map((p) => String(p.slug ?? p.name ?? "")) | ||
| .filter(Boolean) | ||
| .slice(0, 8) | ||
| .join(chalk.dim(", ")); | ||
| log.dim(` profiles: ${slugs}${profileList.length > 8 ? chalk.dim(" …") : ""}`); | ||
| } | ||
| } | ||
| if (!cfg.workspaceId) { | ||
| log.blank(); | ||
| log.dim("Tip: run 'synap use <workspaceId>' to set a default workspace."); | ||
| } | ||
| } | ||
| } | ||
| catch (e) { | ||
| console.error(chalk.red("Error: " + e.message)); | ||
| process.exit(1); | ||
| } | ||
| } | ||
| // ─── useWorkspace ───────────────────────────────────────────────────────────── | ||
| export async function useWorkspace(workspaceId, opts) { | ||
| try { | ||
| const cfg = await resolveHubConfig(opts); | ||
| const userId = await resolveUserId(cfg); | ||
| // Verify the workspace exists and is accessible | ||
| const res = await hubGet("/workspaces", {}, cfg); | ||
| const workspaces = res.workspaces ?? res; | ||
| const list = Array.isArray(workspaces) ? workspaces : []; | ||
| const match = list.find((w) => w.id === workspaceId || String(w.name).toLowerCase() === workspaceId.toLowerCase()); | ||
| if (!match) { | ||
| const names = list.map((w) => `${String(w.name ?? w.id)}`).join(", "); | ||
| console.error(chalk.red(`Workspace '${workspaceId}' not found.`)); | ||
| if (names) | ||
| log.dim(`Available: ${names}`); | ||
| process.exit(1); | ||
| } | ||
| const { setActiveWorkspaceId } = await import("../lib/pod.js"); | ||
| setActiveWorkspaceId(String(match.id)); | ||
| if (opts.json) { | ||
| console.log(JSON.stringify({ workspaceId: match.id, name: match.name }, null, 2)); | ||
| return; | ||
| } | ||
| log.success(`Now in workspace: ${chalk.bold(String(match.name ?? match.id))} ${chalk.dim(String(match.id ?? ""))}`); | ||
| void userId; // consumed by resolveUserId side-effect | ||
| } | ||
| catch (e) { | ||
| console.error(chalk.red("Error: " + e.message)); | ||
| process.exit(1); | ||
| } | ||
| } | ||
| // ─── listWorkspaces ─────────────────────────────────────────────────────────── | ||
| export async function listWorkspaces(opts) { | ||
| try { | ||
| const cfg = await resolveHubConfig(opts); | ||
| const res = await hubGet("/workspaces", {}, cfg); | ||
| const workspaces = res.workspaces ?? res; | ||
| const list = Array.isArray(workspaces) ? workspaces : []; | ||
| if (opts.json) { | ||
| console.log(JSON.stringify({ workspaces: list }, null, 2)); | ||
| return; | ||
| } | ||
| if (list.length === 0) { | ||
| log.dim("No workspaces found."); | ||
| return; | ||
| } | ||
| for (const ws of list) { | ||
| const w = ws; | ||
| log.info(`${String(w.name ?? w.id)} ${chalk.dim(String(w.id ?? ""))}`); | ||
| } | ||
| } | ||
| catch (e) { | ||
| console.error(chalk.red("Error: " + e.message)); | ||
| process.exit(1); | ||
| } | ||
| } | ||
| // ─── listEntities ───────────────────────────────────────────────────────────── | ||
| export async function listEntities(opts) { | ||
| try { | ||
| const cfg = await resolveHubConfig(opts); | ||
| const userId = await resolveUserId(cfg); | ||
| const limit = parseInt(opts.limit ?? "20", 10); | ||
| const res = await hubGet("/entities", { | ||
| userId, | ||
| workspaceId: opts.workspace ?? cfg.workspaceId, | ||
| profileSlug: opts.profile, | ||
| limit, | ||
| }, cfg); | ||
| const entities = res.entities ?? res; | ||
| const list = Array.isArray(entities) ? entities : []; | ||
| if (opts.json) { | ||
| console.log(JSON.stringify({ entities: list }, null, 2)); | ||
| return; | ||
| } | ||
| if (list.length === 0) { | ||
| log.dim("No entities found."); | ||
| return; | ||
| } | ||
| for (const entity of list) { | ||
| const e = entity; | ||
| const name = String(e.name ?? e.id ?? ""); | ||
| const profile = e.profileSlug ?? e.profile ?? e.type ?? ""; | ||
| const id = String(e.id ?? "").slice(0, 8); | ||
| log.info(`${name} ${chalk.dim(`(${profile})`)} — ${chalk.dim(id)}`); | ||
| } | ||
| } | ||
| catch (e) { | ||
| console.error(chalk.red("Error: " + e.message)); | ||
| process.exit(1); | ||
| } | ||
| } | ||
| // ─── getEntity ──────────────────────────────────────────────────────────────── | ||
| export async function getEntity(id, opts) { | ||
| try { | ||
| const cfg = await resolveHubConfig(opts); | ||
| const userId = await resolveUserId(cfg); | ||
| const res = await hubGet(`/entities/${id}`, { userId }, cfg); | ||
| const entity = res; | ||
| if (opts.json) { | ||
| console.log(JSON.stringify(entity, null, 2)); | ||
| return; | ||
| } | ||
| log.heading(String(entity.name ?? id)); | ||
| log.info(`Profile : ${String(entity.profileSlug ?? entity.profile ?? entity.type ?? "")}`); | ||
| log.info(`ID : ${String(entity.id ?? id)}`); | ||
| const props = entity.properties; | ||
| if (props && Object.keys(props).length > 0) { | ||
| log.blank(); | ||
| log.heading("Properties"); | ||
| for (const [k, v] of Object.entries(props)) { | ||
| log.info(`${k}: ${String(v)}`); | ||
| } | ||
| } | ||
| } | ||
| catch (e) { | ||
| console.error(chalk.red("Error: " + e.message)); | ||
| process.exit(1); | ||
| } | ||
| } | ||
| // ─── searchData ─────────────────────────────────────────────────────────────── | ||
| export async function searchData(query, opts) { | ||
| try { | ||
| const cfg = await resolveHubConfig(opts); | ||
| const userId = await resolveUserId(cfg); | ||
| const limit = parseInt(opts.limit ?? "20", 10); | ||
| let collections; | ||
| if (opts.type === "entity") | ||
| collections = "entities"; | ||
| else if (opts.type === "doc") | ||
| collections = "documents"; | ||
| const res = await hubGet("/search", { | ||
| userId, | ||
| query, | ||
| workspaceId: opts.workspace ?? cfg.workspaceId, | ||
| limit, | ||
| collections, | ||
| }, cfg); | ||
| if (opts.json) { | ||
| console.log(JSON.stringify(res, null, 2)); | ||
| return; | ||
| } | ||
| const data = res; | ||
| // hits may live at .hits, .results, or top-level array | ||
| const rawHits = data.hits ?? | ||
| data.results ?? | ||
| (Array.isArray(res) ? res : []); | ||
| if (rawHits.length === 0) { | ||
| const workspaceId = opts.workspace ?? cfg.workspaceId; | ||
| log.dim(`No results for "${query}".`); | ||
| if (workspaceId) { | ||
| // Show what IS in the workspace so the user isn't left with a blank wall | ||
| const [profilesRes, entitiesRes] = await Promise.allSettled([ | ||
| hubGet("/profiles", { userId, workspaceId }, cfg), | ||
| hubGet("/entities", { userId, workspaceId, limit: 5 }, cfg), | ||
| ]); | ||
| if (profilesRes.status === "fulfilled") { | ||
| const profiles = profilesRes.value.profiles ?? profilesRes.value; | ||
| const pList = Array.isArray(profiles) ? profiles : []; | ||
| if (pList.length > 0) { | ||
| const total = (entitiesRes.status === "fulfilled") | ||
| ? Number(entitiesRes.value.total ?? 0) | ||
| : 0; | ||
| log.blank(); | ||
| log.dim(`This workspace has ${total > 0 ? `${total} entities` : "no entities yet"} across ${pList.length} profile${pList.length !== 1 ? "s" : ""}:`); | ||
| for (const p of pList.slice(0, 6)) { | ||
| log.dim(` · ${String(p.name ?? p.slug ?? "")} ${chalk.dim(`--profile=${String(p.slug ?? "")}`)}`); | ||
| } | ||
| log.blank(); | ||
| log.dim(`Try: synap search <term> --workspace ${workspaceId}`); | ||
| log.dim(` or synap list --workspace ${workspaceId} --profile <slug>`); | ||
| } | ||
| } | ||
| } | ||
| return; | ||
| } | ||
| for (const hit of rawHits) { | ||
| const h = hit; | ||
| const name = String(h.name ?? h.title ?? h.id ?? ""); | ||
| const type = String(h.profileSlug ?? h.type ?? h.collection ?? ""); | ||
| const id = String(h.id ?? "").slice(0, 8); | ||
| log.info(`${name} ${chalk.dim(`[${type}]`)} ${chalk.dim(id)}`); | ||
| } | ||
| } | ||
| catch (e) { | ||
| console.error(chalk.red("Error: " + e.message)); | ||
| process.exit(1); | ||
| } | ||
| } | ||
| // ─── rememberData ───────────────────────────────────────────────────────────── | ||
| export async function rememberData(text, opts) { | ||
| try { | ||
| const cfg = await resolveHubConfig(opts); | ||
| const userId = await resolveUserId(cfg); | ||
| const res = await hubPost("/memory", { | ||
| userId, | ||
| fact: text, | ||
| sourceEntityId: opts.context, | ||
| }, cfg); | ||
| const data = res; | ||
| const id = String(data.id ?? ""); | ||
| if (opts.json) { | ||
| console.log(JSON.stringify({ id, stored: true }, null, 2)); | ||
| return; | ||
| } | ||
| log.success(`Stored: "${text.slice(0, 80)}"`); | ||
| } | ||
| catch (e) { | ||
| console.error(chalk.red("Error: " + e.message)); | ||
| process.exit(1); | ||
| } | ||
| } | ||
| // ─── recallData ─────────────────────────────────────────────────────────────── | ||
| export async function recallData(query, opts) { | ||
| try { | ||
| const cfg = await resolveHubConfig(opts); | ||
| const userId = await resolveUserId(cfg); | ||
| const limit = parseInt(opts.limit ?? "20", 10); | ||
| const res = await hubGet("/memory", { userId, q: query, limit }, cfg); | ||
| const memories = res.memories ?? res; | ||
| const list = Array.isArray(memories) ? memories : []; | ||
| if (opts.json) { | ||
| console.log(JSON.stringify({ memories: list }, null, 2)); | ||
| return; | ||
| } | ||
| if (list.length === 0) { | ||
| log.dim("No memories found."); | ||
| return; | ||
| } | ||
| list.forEach((mem, i) => { | ||
| const m = mem; | ||
| const content = String(m.content ?? m.text ?? "").slice(0, 120); | ||
| log.info(`${i + 1}. ${content}`); | ||
| }); | ||
| } | ||
| catch (e) { | ||
| console.error(chalk.red("Error: " + e.message)); | ||
| process.exit(1); | ||
| } | ||
| } | ||
| // ─── createEntity ───────────────────────────────────────────────────────────── | ||
| export async function createEntity(opts) { | ||
| try { | ||
| const cfg = await resolveHubConfig(opts); | ||
| const userId = await resolveUserId(cfg); | ||
| // parse props as unknown then cast — user-supplied JSON | ||
| const properties = JSON.parse(opts.props ?? "{}"); | ||
| const res = await hubPost("/entities", { | ||
| userId, | ||
| profileSlug: opts.profile, | ||
| title: opts.name, | ||
| workspaceId: opts.workspace, | ||
| properties, | ||
| }, cfg); | ||
| const entity = res; | ||
| if (opts.json) { | ||
| console.log(JSON.stringify(entity, null, 2)); | ||
| return; | ||
| } | ||
| log.success(`Created: ${String(entity.name ?? opts.name)} (${String(entity.id ?? "")})`); | ||
| } | ||
| catch (e) { | ||
| console.error(chalk.red("Error: " + e.message)); | ||
| process.exit(1); | ||
| } | ||
| } | ||
| // ─── createRelation ─────────────────────────────────────────────────────────── | ||
| export async function createRelation(opts) { | ||
| try { | ||
| const cfg = await resolveHubConfig(opts); | ||
| const userId = await resolveUserId(cfg); | ||
| const res = await hubPost("/relations", { | ||
| userId, | ||
| workspaceId: opts.workspace, | ||
| sourceEntityId: opts.source, | ||
| targetEntityId: opts.target, | ||
| type: opts.type, | ||
| }, cfg); | ||
| const relation = res; | ||
| if (opts.json) { | ||
| console.log(JSON.stringify(relation, null, 2)); | ||
| return; | ||
| } | ||
| log.success(`Created relation: ${opts.type} (${opts.source} → ${opts.target})`); | ||
| } | ||
| catch (e) { | ||
| console.error(chalk.red("Error: " + e.message)); | ||
| process.exit(1); | ||
| } | ||
| } | ||
| // ─── updateEntity ───────────────────────────────────────────────────────────── | ||
| export async function updateEntity(id, opts) { | ||
| try { | ||
| const cfg = await resolveHubConfig(opts); | ||
| // parse props as unknown then cast — user-supplied JSON | ||
| const properties = JSON.parse(opts.props); | ||
| const res = await hubPatch(`/entities/${id}`, { | ||
| userId: cfg.userId, | ||
| properties, | ||
| }, cfg); | ||
| const entity = res; | ||
| if (opts.json) { | ||
| console.log(JSON.stringify(entity, null, 2)); | ||
| return; | ||
| } | ||
| log.success(`Updated: ${id}`); | ||
| } | ||
| catch (e) { | ||
| console.error(chalk.red("Error: " + e.message)); | ||
| process.exit(1); | ||
| } | ||
| } | ||
| //# sourceMappingURL=data.js.map |
| {"version":3,"file":"data.js","sourceRoot":"","sources":["../../src/commands/data.ts"],"names":[],"mappings":"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"} |
| /** | ||
| * synap infra | ||
| * | ||
| * Infrastructure management via Dokploy — view servers, trigger deploys, | ||
| * tail logs, and sync server state into Synap entities. | ||
| * | ||
| * synap infra — overview: servers + services status | ||
| * synap infra status — same as above | ||
| * synap infra deploy <app> — trigger a redeploy for a named app | ||
| * synap infra logs <app> — tail logs for a service | ||
| * synap infra sync — pull Dokploy state into Synap entities | ||
| * synap infra open — open Dokploy dashboard in browser | ||
| */ | ||
| export declare function infraStatus(): Promise<void>; | ||
| export declare function infraDeploy(appName: string): Promise<void>; | ||
| export declare function infraLogs(appName: string, opts: { | ||
| lines?: number; | ||
| follow?: boolean; | ||
| }): Promise<void>; | ||
| export declare function infraSync(podUrl: string, apiKey: string): Promise<void>; | ||
| export declare function infraOpen(): void; |
| /** | ||
| * synap infra | ||
| * | ||
| * Infrastructure management via Dokploy — view servers, trigger deploys, | ||
| * tail logs, and sync server state into Synap entities. | ||
| * | ||
| * synap infra — overview: servers + services status | ||
| * synap infra status — same as above | ||
| * synap infra deploy <app> — trigger a redeploy for a named app | ||
| * synap infra logs <app> — tail logs for a service | ||
| * synap infra sync — pull Dokploy state into Synap entities | ||
| * synap infra open — open Dokploy dashboard in browser | ||
| */ | ||
| import chalk from "chalk"; | ||
| import ora from "ora"; | ||
| import { execSync } from "child_process"; | ||
| import { log, banner } from "../utils/logger.js"; | ||
| function getDokployConfig() { | ||
| const url = process.env.DOKPLOY_URL ?? process.env.DEPLOY_DOMAIN | ||
| ? `https://${process.env.DEPLOY_DOMAIN}` | ||
| : "https://deploy.synap.live"; | ||
| const apiKey = process.env.DOKPLOY_API_KEY ?? ""; | ||
| if (!apiKey) | ||
| return null; | ||
| return { url, apiKey }; | ||
| } | ||
| async function dokployFetch(path, options = {}) { | ||
| const config = getDokployConfig(); | ||
| if (!config) { | ||
| throw new Error("DOKPLOY_API_KEY not set. Get it from the Dokploy dashboard → Settings → API Keys,\n" + | ||
| " then add it to your .env or export DOKPLOY_API_KEY=<key>"); | ||
| } | ||
| const res = await fetch(`${config.url}${path}`, { | ||
| ...options, | ||
| headers: { | ||
| "Content-Type": "application/json", | ||
| "x-api-key": config.apiKey, | ||
| ...options.headers, | ||
| }, | ||
| }); | ||
| if (!res.ok) { | ||
| const text = await res.text().catch(() => res.statusText); | ||
| throw new Error(`Dokploy ${path}: ${res.status} ${text}`); | ||
| } | ||
| return res.json(); | ||
| } | ||
| // ─── Status overview ───────────────────────────────────────────────────────── | ||
| export async function infraStatus() { | ||
| banner(); | ||
| const config = getDokployConfig(); | ||
| if (!config) { | ||
| log.warn("Dokploy API key not configured."); | ||
| log.blank(); | ||
| log.dim("1. Open https://deploy.synap.live → Settings → API Keys → Create key"); | ||
| log.dim("2. Add to your shell: export DOKPLOY_API_KEY=<key>"); | ||
| log.dim("3. Or add to .env: DOKPLOY_API_KEY=<key>"); | ||
| log.blank(); | ||
| log.info(`Dashboard: ${chalk.cyan("https://deploy.synap.live")}`); | ||
| return; | ||
| } | ||
| const spinner = ora("Fetching infrastructure status...").start(); | ||
| try { | ||
| // Dokploy API: GET /api/servers and GET /api/applications | ||
| const [servers, apps] = await Promise.all([ | ||
| dokployFetch("/api/server.all").catch(() => []), | ||
| dokployFetch("/api/application.all").catch(() => []), | ||
| ]); | ||
| spinner.stop(); | ||
| // ── Servers ── | ||
| log.heading("Servers"); | ||
| if (servers.length === 0) { | ||
| log.dim(" No servers connected. Add one in the Dokploy dashboard."); | ||
| } | ||
| else { | ||
| for (const s of servers) { | ||
| const dot = s.status === "active" | ||
| ? chalk.green("●") | ||
| : s.status === "inactive" | ||
| ? chalk.red("●") | ||
| : chalk.yellow("●"); | ||
| console.log(` ${dot} ${chalk.bold(s.name)} ${chalk.dim(s.ip)}`); | ||
| } | ||
| } | ||
| log.blank(); | ||
| // ── Services ── | ||
| log.heading("Services"); | ||
| if (apps.length === 0) { | ||
| log.dim(" No services deployed yet."); | ||
| } | ||
| else { | ||
| const byServer = new Map(); | ||
| for (const app of apps) { | ||
| const key = app.serverId ?? "local"; | ||
| if (!byServer.has(key)) | ||
| byServer.set(key, []); | ||
| byServer.get(key).push(app); | ||
| } | ||
| for (const [serverId, list] of byServer) { | ||
| const server = servers.find((s) => s.id === serverId); | ||
| if (server) | ||
| log.dim(` ── ${server.name} ──`); | ||
| for (const app of list) { | ||
| const status = app.status === "running" | ||
| ? chalk.green(app.status) | ||
| : app.status === "error" | ||
| ? chalk.red(app.status) | ||
| : chalk.yellow(app.status); | ||
| console.log(` ${chalk.bold(app.name)} ${status} ${chalk.dim(app.env ?? "")}`); | ||
| } | ||
| } | ||
| } | ||
| log.blank(); | ||
| log.dim(`Dashboard: ${chalk.cyan(config.url)}`); | ||
| log.dim("To deploy: synap infra deploy <app-name>"); | ||
| log.dim("To tail logs: synap infra logs <app-name>"); | ||
| } | ||
| catch (err) { | ||
| spinner.fail("Failed to reach Dokploy"); | ||
| const msg = err instanceof Error ? err.message : String(err); | ||
| log.error(msg); | ||
| } | ||
| } | ||
| // ─── Deploy ────────────────────────────────────────────────────────────────── | ||
| export async function infraDeploy(appName) { | ||
| const spinner = ora(`Triggering deploy for ${chalk.bold(appName)}...`).start(); | ||
| try { | ||
| // List apps, find by name | ||
| const apps = await dokployFetch("/api/application.all"); | ||
| const match = apps.find((a) => a.name.toLowerCase() === appName.toLowerCase() || | ||
| a.appName?.toLowerCase() === appName.toLowerCase()); | ||
| if (!match) { | ||
| spinner.fail(`App not found: ${appName}`); | ||
| log.blank(); | ||
| log.dim("Available apps:"); | ||
| for (const a of apps) | ||
| log.dim(` • ${a.name}`); | ||
| return; | ||
| } | ||
| await dokployFetch(`/api/application.deploy`, { | ||
| method: "POST", | ||
| body: JSON.stringify({ applicationId: match.id }), | ||
| }); | ||
| spinner.succeed(`Deploy triggered for ${chalk.bold(match.name)}`); | ||
| log.dim(`Watch progress: synap infra logs ${appName}`); | ||
| } | ||
| catch (err) { | ||
| spinner.fail("Deploy failed"); | ||
| log.error(err instanceof Error ? err.message : String(err)); | ||
| } | ||
| } | ||
| // ─── Logs ──────────────────────────────────────────────────────────────────── | ||
| export async function infraLogs(appName, opts) { | ||
| try { | ||
| const apps = await dokployFetch("/api/application.all"); | ||
| const match = apps.find((a) => a.name.toLowerCase() === appName.toLowerCase() || | ||
| a.appName?.toLowerCase() === appName.toLowerCase()); | ||
| if (!match) { | ||
| log.error(`App not found: ${appName}`); | ||
| log.blank(); | ||
| log.dim("Available apps:"); | ||
| for (const a of apps) | ||
| log.dim(` • ${a.name}`); | ||
| return; | ||
| } | ||
| // Use docker logs via container name (Dokploy uses appName as container name) | ||
| const containerName = match.appName ?? match.name; | ||
| const tail = opts.lines ?? 100; | ||
| const followFlag = opts.follow ? "-f" : ""; | ||
| const cmd = `docker logs --tail ${tail} ${followFlag} ${containerName}`; | ||
| log.dim(`> ${cmd}`); | ||
| log.blank(); | ||
| execSync(cmd, { stdio: "inherit" }); | ||
| } | ||
| catch (err) { | ||
| log.error(err instanceof Error ? err.message : String(err)); | ||
| } | ||
| } | ||
| // ─── Sync ───────────────────────────────────────────────────────────────────── | ||
| export async function infraSync(podUrl, apiKey) { | ||
| const spinner = ora("Syncing Dokploy state into Synap entities...").start(); | ||
| try { | ||
| const [servers, apps] = await Promise.all([ | ||
| dokployFetch("/api/server.all"), | ||
| dokployFetch("/api/application.all"), | ||
| ]); | ||
| spinner.text = `Upserting ${servers.length} servers + ${apps.length} deployments...`; | ||
| // Push to Synap Hub Protocol | ||
| const headers = { | ||
| "Content-Type": "application/json", | ||
| Authorization: `Bearer ${apiKey}`, | ||
| }; | ||
| let created = 0; | ||
| let updated = 0; | ||
| for (const s of servers) { | ||
| const res = await fetch(`${podUrl}/api/hub/entities/upsert`, { | ||
| method: "POST", | ||
| headers, | ||
| body: JSON.stringify({ | ||
| profileSlug: "server", | ||
| dedupeKey: `dokploy:server:${s.id}`, | ||
| title: s.name, | ||
| properties: { | ||
| ip: s.ip, | ||
| status: s.status === "active" ? "online" : "offline", | ||
| region: s.region ?? "", | ||
| dokployServerId: s.id, | ||
| }, | ||
| }), | ||
| }); | ||
| if (res.ok) { | ||
| const { created: c } = await res.json(); | ||
| c ? created++ : updated++; | ||
| } | ||
| } | ||
| for (const app of apps) { | ||
| const res = await fetch(`${podUrl}/api/hub/entities/upsert`, { | ||
| method: "POST", | ||
| headers, | ||
| body: JSON.stringify({ | ||
| profileSlug: "deployment", | ||
| dedupeKey: `dokploy:app:${app.id}`, | ||
| title: app.name, | ||
| properties: { | ||
| deployStatus: app.status, | ||
| env: app.env ?? "production", | ||
| url: app.domain ? `https://${app.domain}` : "", | ||
| image: app.image ?? "", | ||
| dokployAppId: app.id, | ||
| }, | ||
| }), | ||
| }); | ||
| if (res.ok) { | ||
| const { created: c } = await res.json(); | ||
| c ? created++ : updated++; | ||
| } | ||
| } | ||
| spinner.succeed(`Sync complete — ${chalk.green(created)} created, ${chalk.blue(updated)} updated`); | ||
| } | ||
| catch (err) { | ||
| spinner.fail("Sync failed"); | ||
| log.error(err instanceof Error ? err.message : String(err)); | ||
| } | ||
| } | ||
| // ─── Open dashboard ────────────────────────────────────────────────────────── | ||
| export function infraOpen() { | ||
| const config = getDokployConfig(); | ||
| const url = config?.url ?? "https://deploy.synap.live"; | ||
| try { | ||
| const platform = process.platform; | ||
| const cmd = platform === "darwin" | ||
| ? "open" | ||
| : platform === "win32" | ||
| ? "start" | ||
| : "xdg-open"; | ||
| execSync(`${cmd} ${url}`); | ||
| log.success(`Opening ${url}`); | ||
| } | ||
| catch { | ||
| log.info(`Dashboard: ${chalk.cyan(url)}`); | ||
| } | ||
| } | ||
| //# sourceMappingURL=infra.js.map |
| {"version":3,"file":"infra.js","sourceRoot":"","sources":["../../src/commands/infra.ts"],"names":[],"mappings":"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"} |
| /** | ||
| * synap capture / synap recall --structured | ||
| * | ||
| * Structured knowledge capture and retrieval using the engineering_knowledge | ||
| * entity profile. Backed by Hub Protocol entity endpoints — separate from the | ||
| * episodic /memory endpoints used by `synap remember` / `synap recall`. | ||
| */ | ||
| interface BaseOpts { | ||
| podUrl?: string; | ||
| apiKey?: string; | ||
| } | ||
| export type KnowledgeType = "gotcha" | "lesson" | "decision" | "reference"; | ||
| export interface CaptureOpts { | ||
| type: KnowledgeType; | ||
| claim: string; | ||
| why?: string; | ||
| evidence?: string; | ||
| tags?: string; | ||
| json?: boolean; | ||
| } | ||
| export interface RecallStructuredOpts extends BaseOpts { | ||
| type?: KnowledgeType; | ||
| tags?: string; | ||
| limit?: string; | ||
| workspace?: string; | ||
| json?: boolean; | ||
| } | ||
| export declare function captureKnowledge(opts: CaptureOpts): Promise<void>; | ||
| export declare function recallStructured(query: string, opts: RecallStructuredOpts): Promise<void>; | ||
| export declare function provisionAgentWorkspace(opts: { | ||
| agentUserId?: string; | ||
| name?: string; | ||
| use?: boolean; | ||
| json?: boolean; | ||
| }): Promise<void>; | ||
| export {}; |
| /** | ||
| * synap capture / synap recall --structured | ||
| * | ||
| * Structured knowledge capture and retrieval using the engineering_knowledge | ||
| * entity profile. Backed by Hub Protocol entity endpoints — separate from the | ||
| * episodic /memory endpoints used by `synap remember` / `synap recall`. | ||
| */ | ||
| import chalk from "chalk"; | ||
| import { log } from "../utils/logger.js"; | ||
| import { resolveHubConfig, resolveUserId, hubPost, hubGet, } from "../lib/hub-client.js"; | ||
| export async function captureKnowledge(opts) { | ||
| try { | ||
| const cfg = await resolveHubConfig(); | ||
| const userId = await resolveUserId(cfg); | ||
| const workspaceId = cfg.workspaceId; | ||
| if (!workspaceId) { | ||
| console.error(chalk.red("No workspace set. Run:\n" + | ||
| " synap workspace provision-agent (create your agent workspace)\n" + | ||
| " synap use <workspace-id> (set it as active)")); | ||
| process.exit(1); | ||
| } | ||
| const tags = opts.tags | ||
| ? opts.tags.split(",").map((t) => t.trim()).filter(Boolean) | ||
| : []; | ||
| const name = opts.claim.slice(0, 120); | ||
| const res = await hubPost("/entities", { | ||
| userId, | ||
| workspaceId, | ||
| profileSlug: "engineering_knowledge", | ||
| name, | ||
| properties: { | ||
| ek_type: opts.type, | ||
| ek_claim: opts.claim, | ||
| ...(opts.why ? { ek_why: opts.why } : {}), | ||
| ...(opts.evidence ? { ek_evidence: opts.evidence } : {}), | ||
| ...(tags.length > 0 ? { ek_tags: tags } : {}), | ||
| }, | ||
| }, cfg); | ||
| if (opts.json) { | ||
| console.log(JSON.stringify({ id: res.id, stored: true }, null, 2)); | ||
| return; | ||
| } | ||
| log.success(`[${opts.type}] ${opts.claim.slice(0, 80)}`); | ||
| if (res.id) | ||
| log.dim(` id: ${res.id}`); | ||
| } | ||
| catch (e) { | ||
| console.error(chalk.red("Error: " + e.message)); | ||
| process.exit(1); | ||
| } | ||
| } | ||
| export async function recallStructured(query, opts) { | ||
| try { | ||
| const cfg = await resolveHubConfig(opts); | ||
| const limit = parseInt(opts.limit ?? "10", 10); | ||
| const params = { | ||
| profileSlug: "engineering_knowledge", | ||
| q: query, | ||
| limit, | ||
| }; | ||
| const workspaceId = opts.workspace ?? cfg.workspaceId; | ||
| if (workspaceId) | ||
| params.workspaceId = workspaceId; | ||
| if (opts.type) | ||
| params.type = opts.type; | ||
| const res = await hubGet("/entities", params, cfg); | ||
| const entities = (res.entities ?? res.items ?? res); | ||
| const list = Array.isArray(entities) ? entities : []; | ||
| if (opts.json) { | ||
| console.log(JSON.stringify(list, null, 2)); | ||
| return; | ||
| } | ||
| if (list.length === 0) { | ||
| log.dim(`No knowledge entries found for "${query}"`); | ||
| return; | ||
| } | ||
| for (const item of list) { | ||
| const props = (item.properties ?? {}); | ||
| const type = String(props.ek_type ?? "–"); | ||
| const claim = String(props.ek_claim ?? item.name ?? "–"); | ||
| const why = props.ek_why ? `\n why: ${props.ek_why}` : ""; | ||
| const tags = Array.isArray(props.ek_tags) && props.ek_tags.length > 0 | ||
| ? chalk.dim(` [${props.ek_tags.join(", ")}]`) | ||
| : ""; | ||
| console.log(` ${chalk.cyan(type.padEnd(10))} ${claim}${tags}${chalk.dim(why)}`); | ||
| } | ||
| } | ||
| catch (e) { | ||
| console.error(chalk.red("Error: " + e.message)); | ||
| process.exit(1); | ||
| } | ||
| } | ||
| export async function provisionAgentWorkspace(opts) { | ||
| try { | ||
| const cfg = await resolveHubConfig(); | ||
| const userId = await resolveUserId(cfg); | ||
| const agentUserId = opts.agentUserId ?? userId; | ||
| const res = await hubPost("/workspaces/provision-agent", { | ||
| agentUserId, | ||
| ...(opts.name ? { workspaceName: opts.name } : {}), | ||
| }, cfg); | ||
| if (opts.json) { | ||
| console.log(JSON.stringify(res, null, 2)); | ||
| return; | ||
| } | ||
| if (res.created) { | ||
| log.success(`Agent workspace created: ${res.workspaceId}`); | ||
| } | ||
| else { | ||
| log.info(`Agent workspace already exists: ${res.workspaceId}`); | ||
| } | ||
| if (opts.use ?? res.created) { | ||
| const { setActiveWorkspaceId } = await import("../lib/pod.js"); | ||
| setActiveWorkspaceId(res.workspaceId); | ||
| log.dim(` Set as active workspace (synap use ${res.workspaceId})`); | ||
| } | ||
| } | ||
| catch (e) { | ||
| console.error(chalk.red("Error: " + e.message)); | ||
| process.exit(1); | ||
| } | ||
| } | ||
| //# sourceMappingURL=knowledge.js.map |
| {"version":3,"file":"knowledge.js","sourceRoot":"","sources":["../../src/commands/knowledge.ts"],"names":[],"mappings":"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"} |
| /** | ||
| * synap pods — manage multiple pod profiles and switch between them | ||
| * | ||
| * synap pods list list all configured pods | ||
| * synap pods add [name] connect a new pod and save as a named profile | ||
| * synap pods use <name> switch active pod and propagate to all surfaces | ||
| * synap pods remove <name> remove a pod profile | ||
| */ | ||
| import { type SurfaceName } from "../lib/pod.js"; | ||
| export declare function podsList(): Promise<void>; | ||
| export declare function podsAdd(name?: string, podUrlArg?: string): Promise<void>; | ||
| export type { SurfaceName }; | ||
| export declare function podsUse(name: string, opts?: { | ||
| surface?: SurfaceName; | ||
| }): Promise<void>; | ||
| export declare function podsSwitch(name?: string): Promise<void>; | ||
| export declare function podsRemove(name: string): Promise<void>; |
| /** | ||
| * synap pods — manage multiple pod profiles and switch between them | ||
| * | ||
| * synap pods list list all configured pods | ||
| * synap pods add [name] connect a new pod and save as a named profile | ||
| * synap pods use <name> switch active pod and propagate to all surfaces | ||
| * synap pods remove <name> remove a pod profile | ||
| */ | ||
| import prompts from "prompts"; | ||
| import ora from "ora"; | ||
| import chalk from "chalk"; | ||
| import fs from "node:fs"; | ||
| import path from "node:path"; | ||
| import os from "node:os"; | ||
| import { log } from "../utils/logger.js"; | ||
| import { checkPodHealth, setupAgent, addPodProfile, setActivePod, setSurfacePod, removePodProfile, listPodProfiles, } from "../lib/pod.js"; | ||
| import { TARGETS, writeMcpServerEntry, writeClaudeCodeEnv, } from "../lib/targets.js"; | ||
| import { runBrowserAuth } from "../lib/browser-auth.js"; | ||
| import { readOpenClawConfig, writeOpenClawConfig, setConfigValue } from "../lib/openclaw.js"; | ||
| // ─── list ───────────────────────────────────────────────────────────────────── | ||
| export async function podsList() { | ||
| const profiles = listPodProfiles(); | ||
| if (profiles.length === 0) { | ||
| log.info("No pods configured. Run: synap pods add"); | ||
| return; | ||
| } | ||
| log.heading("Configured pods"); | ||
| const checks = await Promise.all(profiles.map(async (p) => { | ||
| const health = await checkPodHealth(p.config.podUrl).catch(() => ({ healthy: false })); | ||
| return { ...p, healthy: health.healthy }; | ||
| })); | ||
| for (const p of checks) { | ||
| const active = p.active ? chalk.green(" ● active") : chalk.dim(" ○"); | ||
| const health = p.healthy ? chalk.green("healthy") : chalk.red("unreachable"); | ||
| const label = p.config.label ? chalk.dim(` (${p.config.label})`) : ""; | ||
| console.log(` ${chalk.bold(p.name.padEnd(14))}${active} ${health} ${chalk.dim(p.config.podUrl)}${label}`); | ||
| } | ||
| log.blank(); | ||
| log.dim("synap pods use <name> — switch active pod"); | ||
| log.dim("synap pods add [name] — connect another pod"); | ||
| } | ||
| // ─── add ────────────────────────────────────────────────────────────────────── | ||
| export async function podsAdd(name, podUrlArg) { | ||
| // Resolve profile name | ||
| let profileName = name; | ||
| if (!profileName) { | ||
| const existing = listPodProfiles().map((p) => p.name); | ||
| const { inputName } = await prompts({ | ||
| type: "text", | ||
| name: "inputName", | ||
| message: "Profile name for this pod:", | ||
| initial: existing.includes("personal") ? "team" : existing.includes("default") ? "personal" : "default", | ||
| validate: (v) => v.trim().length > 0 || "Name is required", | ||
| }); | ||
| if (!inputName) | ||
| return; | ||
| profileName = inputName.trim().toLowerCase().replace(/\s+/g, "-"); | ||
| } | ||
| // Pod URL — pre-filled if passed as positional arg | ||
| const { url } = await prompts({ | ||
| type: "text", | ||
| name: "url", | ||
| message: "Pod URL:", | ||
| initial: podUrlArg ?? "https://", | ||
| validate: (v) => v.startsWith("http") || "Must be a valid URL", | ||
| }); | ||
| if (!url) | ||
| return; | ||
| const spinner = ora("Checking pod health...").start(); | ||
| const health = await checkPodHealth(url); | ||
| if (!health.healthy) { | ||
| spinner.fail(`Pod not reachable at ${url}`); | ||
| return; | ||
| } | ||
| spinner.succeed(`Pod healthy at ${url}`); | ||
| // Optional label | ||
| const { label } = await prompts({ | ||
| type: "text", | ||
| name: "label", | ||
| message: "Label (optional, e.g. 'Personal' or 'Team'):", | ||
| }); | ||
| // API key | ||
| const { method } = await prompts({ | ||
| type: "select", | ||
| name: "method", | ||
| message: "Authentication:", | ||
| choices: [ | ||
| { title: "Open browser to approve (recommended)", value: "browser" }, | ||
| { title: "Paste existing API key", value: "paste" }, | ||
| { title: "Generate via PROVISIONING_TOKEN (self-hosted admin)", value: "provisioning" }, | ||
| ], | ||
| }); | ||
| if (!method) | ||
| return; | ||
| let apiKey; | ||
| let workspaceId; | ||
| let agentUserId; | ||
| const podUrl = url; | ||
| if (method === "browser") { | ||
| const browserSpinner = ora("Opening browser to approve...").start(); | ||
| try { | ||
| const result = await runBrowserAuth({ | ||
| podUrl, | ||
| integration: "cli", | ||
| onUrlReady: (authUrl) => { | ||
| browserSpinner.stop(); | ||
| log.info(`Opening ${chalk.cyan(authUrl)}`); | ||
| log.dim("Sign in and click Generate & connect."); | ||
| }, | ||
| }); | ||
| apiKey = result.apiKey; | ||
| workspaceId = result.workspaceId; | ||
| } | ||
| catch (err) { | ||
| browserSpinner.stop(); | ||
| log.error(err instanceof Error ? err.message : "Browser flow failed"); | ||
| return; | ||
| } | ||
| } | ||
| else if (method === "paste") { | ||
| const { key } = await prompts({ type: "password", name: "key", message: "Hub Protocol API key:" }); | ||
| apiKey = key; | ||
| } | ||
| else if (method === "provisioning") { | ||
| const { token } = await prompts({ type: "password", name: "token", message: "PROVISIONING_TOKEN:" }); | ||
| if (!token) | ||
| return; | ||
| const genSpinner = ora("Creating agent credentials...").start(); | ||
| try { | ||
| const result = await setupAgent(podUrl, token, "cli"); | ||
| apiKey = result.hubApiKey; | ||
| workspaceId = result.workspaceId; | ||
| agentUserId = result.agentUserId; | ||
| genSpinner.succeed("Credentials created"); | ||
| } | ||
| catch (err) { | ||
| genSpinner.fail(err instanceof Error ? err.message : "Failed"); | ||
| return; | ||
| } | ||
| } | ||
| if (!apiKey) | ||
| return; | ||
| addPodProfile(profileName, { | ||
| podUrl, | ||
| workspaceId: workspaceId ?? "", | ||
| agentUserId: agentUserId ?? "", | ||
| hubApiKey: apiKey, | ||
| label: label || undefined, | ||
| savedAt: new Date().toISOString(), | ||
| }); | ||
| log.blank(); | ||
| log.success(`Pod '${profileName}' saved.`); | ||
| log.dim(`Run: synap pods use ${profileName} — to make it active`); | ||
| } | ||
| const SURFACE_LABELS = { | ||
| raycast: "Raycast", | ||
| "claude-code": "Claude Code", | ||
| "claude-desktop": "Claude Desktop", | ||
| cursor: "Cursor", | ||
| openclaw: "OpenClaw", | ||
| }; | ||
| export async function podsUse(name, opts = {}) { | ||
| const profiles = listPodProfiles(); | ||
| const profile = profiles.find((p) => p.name === name); | ||
| if (!profile) { | ||
| log.error(`Pod profile '${name}' not found.`); | ||
| if (profiles.length > 0) | ||
| log.dim("Available: " + profiles.map((p) => p.name).join(", ")); | ||
| return; | ||
| } | ||
| const podConfig = profile.config; | ||
| if (opts.surface) { | ||
| // Per-surface switch — only update that surface's config | ||
| try { | ||
| setSurfacePod(opts.surface, name); | ||
| } | ||
| catch (err) { | ||
| log.error(err instanceof Error ? err.message : String(err)); | ||
| return; | ||
| } | ||
| log.info(`${SURFACE_LABELS[opts.surface]} → pod '${name}' (${podConfig.podUrl})`); | ||
| await applySurfaceConfig(opts.surface, podConfig); | ||
| log.blank(); | ||
| log.dim("Other surfaces are unchanged. Run without --surface to switch all."); | ||
| return; | ||
| } | ||
| // Global switch — update activePod + propagate to all surfaces | ||
| setActivePod(name); | ||
| log.info(`Switching all surfaces to pod '${name}' (${podConfig.podUrl})`); | ||
| log.blank(); | ||
| const updated = []; | ||
| // Claude Desktop | ||
| const desktopPath = TARGETS["claude-desktop"].mcpConfigPath?.(); | ||
| if (desktopPath && fs.existsSync(desktopPath)) { | ||
| writeMcpServerEntry(desktopPath, "synap", { | ||
| command: "npx", | ||
| args: ["-y", "mcp-remote", `${podConfig.podUrl.replace(/\/$/, "")}/mcp`, "--header", `Authorization: Bearer ${podConfig.hubApiKey}`], | ||
| }); | ||
| updated.push("Claude Desktop"); | ||
| } | ||
| // Cursor | ||
| const cursorPath = TARGETS["cursor"].mcpConfigPath?.(); | ||
| if (cursorPath && fs.existsSync(cursorPath)) { | ||
| writeMcpServerEntry(cursorPath, "synap", { | ||
| url: `${podConfig.podUrl}/mcp`, | ||
| headers: { Authorization: `Bearer ${podConfig.hubApiKey}` }, | ||
| }); | ||
| updated.push("Cursor"); | ||
| } | ||
| // Claude Code | ||
| const claudeSettings = path.join(os.homedir(), ".claude", "settings.json"); | ||
| if (fs.existsSync(claudeSettings)) { | ||
| await writeClaudeCodeEnv({ podUrl: podConfig.podUrl, apiKey: podConfig.hubApiKey, workspaceId: podConfig.workspaceId, agentUserId: podConfig.agentUserId }); | ||
| updated.push("Claude Code"); | ||
| } | ||
| // OpenClaw | ||
| try { | ||
| const ocConfig = readOpenClawConfig(); | ||
| if (ocConfig) { | ||
| setConfigValue(ocConfig, "synap.podUrl", podConfig.podUrl); | ||
| setConfigValue(ocConfig, "synap.hubApiKey", podConfig.hubApiKey); | ||
| if (podConfig.workspaceId) | ||
| setConfigValue(ocConfig, "synap.workspaceId", podConfig.workspaceId); | ||
| if (podConfig.agentUserId) | ||
| setConfigValue(ocConfig, "synap.agentUserId", podConfig.agentUserId); | ||
| writeOpenClawConfig(ocConfig); | ||
| updated.push("OpenClaw"); | ||
| } | ||
| } | ||
| catch { /* OpenClaw not installed — skip */ } | ||
| // Raycast reads ~/.synap/config.json directly — activePod update is sufficient. | ||
| updated.push("Raycast"); | ||
| log.success(`Updated: ${updated.join(", ")}`); | ||
| log.dim("Restart any open agents to apply the new pod."); | ||
| log.blank(); | ||
| log.dim("Tip: synap pods use <name> --surface <surface> — switch only one surface"); | ||
| } | ||
| /** Apply a pod config to a single surface's external config file. */ | ||
| async function applySurfaceConfig(surface, podConfig) { | ||
| switch (surface) { | ||
| case "claude-desktop": { | ||
| const p = TARGETS["claude-desktop"].mcpConfigPath?.(); | ||
| if (p && fs.existsSync(p)) { | ||
| writeMcpServerEntry(p, "synap", { | ||
| command: "npx", | ||
| args: ["-y", "mcp-remote", `${podConfig.podUrl.replace(/\/$/, "")}/mcp`, "--header", `Authorization: Bearer ${podConfig.hubApiKey}`], | ||
| }); | ||
| log.success("Claude Desktop MCP config updated."); | ||
| log.dim("Quit + relaunch Claude Desktop to apply."); | ||
| } | ||
| else { | ||
| log.dim("Claude Desktop config not found — run `synap connect --target=claude-desktop` first."); | ||
| } | ||
| break; | ||
| } | ||
| case "cursor": { | ||
| const p = TARGETS["cursor"].mcpConfigPath?.(); | ||
| if (p && fs.existsSync(p)) { | ||
| writeMcpServerEntry(p, "synap", { | ||
| url: `${podConfig.podUrl}/mcp`, | ||
| headers: { Authorization: `Bearer ${podConfig.hubApiKey}` }, | ||
| }); | ||
| log.success("Cursor MCP config updated."); | ||
| } | ||
| else { | ||
| log.dim("Cursor config not found — run `synap connect --target=cursor` first."); | ||
| } | ||
| break; | ||
| } | ||
| case "claude-code": { | ||
| const p = path.join(os.homedir(), ".claude", "settings.json"); | ||
| if (fs.existsSync(p)) { | ||
| await writeClaudeCodeEnv({ podUrl: podConfig.podUrl, apiKey: podConfig.hubApiKey, workspaceId: podConfig.workspaceId, agentUserId: podConfig.agentUserId }); | ||
| log.success("Claude Code env updated (~/.claude/settings.json)."); | ||
| } | ||
| else { | ||
| log.dim("Claude Code settings not found — run `synap connect --target=claude-code` first."); | ||
| } | ||
| break; | ||
| } | ||
| case "openclaw": { | ||
| try { | ||
| const ocConfig = readOpenClawConfig(); | ||
| if (ocConfig) { | ||
| setConfigValue(ocConfig, "synap.podUrl", podConfig.podUrl); | ||
| setConfigValue(ocConfig, "synap.hubApiKey", podConfig.hubApiKey); | ||
| if (podConfig.workspaceId) | ||
| setConfigValue(ocConfig, "synap.workspaceId", podConfig.workspaceId); | ||
| writeOpenClawConfig(ocConfig); | ||
| log.success("OpenClaw config updated."); | ||
| } | ||
| else { | ||
| log.dim("OpenClaw config not found."); | ||
| } | ||
| } | ||
| catch { | ||
| log.dim("OpenClaw not installed."); | ||
| } | ||
| break; | ||
| } | ||
| case "raycast": | ||
| // Raycast reads ~/.synap/config.json directly — surfaces entry is enough. | ||
| log.success("Raycast surface preference saved."); | ||
| break; | ||
| } | ||
| } | ||
| // ─── switch (interactive) ───────────────────────────────────────────────────── | ||
| export async function podsSwitch(name) { | ||
| const profiles = listPodProfiles(); | ||
| if (profiles.length === 0) { | ||
| log.info("No pods configured. Run: synap pods add"); | ||
| return; | ||
| } | ||
| let targetName = name; | ||
| if (!targetName) { | ||
| if (profiles.length === 1) { | ||
| log.info(`Only one pod configured: ${chalk.bold(profiles[0].name)}`); | ||
| targetName = profiles[0].name; | ||
| } | ||
| else { | ||
| const active = profiles.find((p) => p.active); | ||
| const { picked } = await prompts({ | ||
| type: "select", | ||
| name: "picked", | ||
| message: "Switch to which pod?", | ||
| choices: profiles.map((p) => ({ | ||
| title: `${chalk.bold(p.name)}${p.active ? chalk.green(" ← active") : ""} ${chalk.dim(p.config.podUrl)}`, | ||
| value: p.name, | ||
| })), | ||
| initial: active ? profiles.indexOf(active) : 0, | ||
| }); | ||
| if (!picked) | ||
| return; | ||
| targetName = picked; | ||
| } | ||
| } | ||
| await podsUse(targetName); | ||
| } | ||
| // ─── remove ─────────────────────────────────────────────────────────────────── | ||
| export async function podsRemove(name) { | ||
| const profiles = listPodProfiles(); | ||
| const profile = profiles.find((p) => p.name === name); | ||
| if (!profile) { | ||
| log.error(`Pod profile '${name}' not found.`); | ||
| if (profiles.length > 0) | ||
| log.dim("Available: " + profiles.map((p) => p.name).join(", ")); | ||
| return; | ||
| } | ||
| if (profile.active) { | ||
| log.warn(`'${name}' is the active pod.`); | ||
| const remaining = profiles.filter((p) => p.name !== name); | ||
| if (remaining.length > 0) { | ||
| log.dim(`Will switch to '${remaining[0].name}' after removal.`); | ||
| } | ||
| } | ||
| const { confirm } = await prompts({ | ||
| type: "confirm", | ||
| name: "confirm", | ||
| message: `Remove pod profile '${name}' (${profile.config.podUrl})?`, | ||
| initial: false, | ||
| }); | ||
| if (!confirm) | ||
| return; | ||
| removePodProfile(name); | ||
| log.success(`Removed '${name}'.`); | ||
| const after = listPodProfiles(); | ||
| if (after.length > 0 && profile.active) { | ||
| log.dim(`Active pod is now '${after[0].name}'.`); | ||
| } | ||
| } | ||
| //# sourceMappingURL=pods.js.map |
| {"version":3,"file":"pods.js","sourceRoot":"","sources":["../../src/commands/pods.ts"],"names":[],"mappings":"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"} |
| export interface AgentProfile { | ||
| podName: string; | ||
| apiKey: string; | ||
| workspaceId?: string; | ||
| label?: string; | ||
| createdAt: string; | ||
| /** Template used to create this agent: twin | assistant | custom */ | ||
| template?: "twin" | "assistant" | "custom"; | ||
| /** The agent user ID on the pod (from agentUsers.create) */ | ||
| agentUserId?: string; | ||
| } | ||
| export declare function listAgents(): Array<{ | ||
| name: string; | ||
| profile: AgentProfile; | ||
| }>; | ||
| export declare function getAgent(name: string): AgentProfile | null; | ||
| export declare function addAgent(name: string, profile: AgentProfile): void; | ||
| export declare function removeAgent(name: string): void; | ||
| /** Resolve agent config from SYNAP_AGENT env var. Returns null if not set. */ | ||
| export declare function resolveAgentOverride(): AgentProfile | null; |
| import fs from "node:fs"; | ||
| import path from "node:path"; | ||
| import os from "node:os"; | ||
| const CONFIG_FILE = path.join(os.homedir(), ".synap", "config.json"); | ||
| function readConfig() { | ||
| try { | ||
| if (fs.existsSync(CONFIG_FILE)) { | ||
| return JSON.parse(fs.readFileSync(CONFIG_FILE, "utf-8")); | ||
| } | ||
| } | ||
| catch { /* ignore */ } | ||
| return {}; | ||
| } | ||
| function writeConfig(cfg) { | ||
| fs.writeFileSync(CONFIG_FILE, JSON.stringify(cfg, null, 2), { mode: 0o600 }); | ||
| } | ||
| export function listAgents() { | ||
| const cfg = readConfig(); | ||
| return Object.entries(cfg.agents ?? {}).map(([name, profile]) => ({ name, profile })); | ||
| } | ||
| export function getAgent(name) { | ||
| const cfg = readConfig(); | ||
| return cfg.agents?.[name] ?? null; | ||
| } | ||
| export function addAgent(name, profile) { | ||
| const cfg = readConfig(); | ||
| cfg.agents = cfg.agents ?? {}; | ||
| cfg.agents[name] = profile; | ||
| writeConfig(cfg); | ||
| } | ||
| export function removeAgent(name) { | ||
| const cfg = readConfig(); | ||
| if (!cfg.agents?.[name]) | ||
| throw new Error(`Agent '${name}' not found`); | ||
| delete cfg.agents[name]; | ||
| writeConfig(cfg); | ||
| } | ||
| /** Resolve agent config from SYNAP_AGENT env var. Returns null if not set. */ | ||
| export function resolveAgentOverride() { | ||
| const name = process.env.SYNAP_AGENT; | ||
| if (!name) | ||
| return null; | ||
| return getAgent(name); | ||
| } | ||
| //# sourceMappingURL=agents-config.js.map |
| {"version":3,"file":"agents-config.js","sourceRoot":"","sources":["../../src/lib/agents-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;AAqBrE,SAAS,UAAU;IACjB,IAAI,CAAC;QACH,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAqB,CAAC;QAC/E,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACxB,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,WAAW,CAAC,GAAqB;IACxC,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;AACxF,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,OAAO,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,OAAqB;IAC1D,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;IAC9B,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;IAC3B,WAAW,CAAC,GAAG,CAAC,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,aAAa,CAAC,CAAC;IACtE,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACxB,WAAW,CAAC,GAAG,CAAC,CAAC;AACnB,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,oBAAoB;IAClC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IACrC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC"} |
| /** | ||
| * Browser-based connect flow — the recommended provisioning path. | ||
| * | ||
| * 1. Start a local HTTP server on an ephemeral port. | ||
| * 2. Build `{podUrl}/admin/connect?integration=cli&redirect_uri=http://127.0.0.1:<port>/callback`. | ||
| * 3. Open the user's default browser at that URL. | ||
| * 4. Admin UI authenticates the user (Kratos session), mints a scoped Hub | ||
| * Protocol API key via `trpc.apiKeys.connectIntegration`, and redirects | ||
| * to `http://127.0.0.1:<port>/callback?context={apiKey,podUrl,workspaceId}`. | ||
| * 5. Local server receives the callback, extracts credentials, shuts down. | ||
| * | ||
| * This is the same flow Raycast uses (via a `raycast://` deeplink) — for CLI | ||
| * we just swap the deeplink for a loopback HTTP URL. The admin UI's redirect | ||
| * whitelist accepts both. | ||
| * | ||
| * Security notes: | ||
| * - Loopback only (127.0.0.1) — no external network can intercept. | ||
| * - One-shot: server only handles the first /callback, then exits. | ||
| * - 5-minute timeout. | ||
| * - No CSRF token: single-use, host-local, bound to the process. | ||
| */ | ||
| export interface BrowserAuthResult { | ||
| apiKey: string; | ||
| podUrl: string; | ||
| workspaceId?: string; | ||
| } | ||
| export interface BrowserAuthOptions { | ||
| podUrl: string; | ||
| integration: "cli" | "raycast" | "openclaw" | "custom"; | ||
| /** Milliseconds to wait for the callback. Default 5min. */ | ||
| timeoutMs?: number; | ||
| /** Hook invoked with the admin-panel URL right before opening the browser. */ | ||
| onUrlReady?: (url: string) => void; | ||
| } | ||
| export declare function runBrowserAuth(opts: BrowserAuthOptions): Promise<BrowserAuthResult>; |
| /** | ||
| * Browser-based connect flow — the recommended provisioning path. | ||
| * | ||
| * 1. Start a local HTTP server on an ephemeral port. | ||
| * 2. Build `{podUrl}/admin/connect?integration=cli&redirect_uri=http://127.0.0.1:<port>/callback`. | ||
| * 3. Open the user's default browser at that URL. | ||
| * 4. Admin UI authenticates the user (Kratos session), mints a scoped Hub | ||
| * Protocol API key via `trpc.apiKeys.connectIntegration`, and redirects | ||
| * to `http://127.0.0.1:<port>/callback?context={apiKey,podUrl,workspaceId}`. | ||
| * 5. Local server receives the callback, extracts credentials, shuts down. | ||
| * | ||
| * This is the same flow Raycast uses (via a `raycast://` deeplink) — for CLI | ||
| * we just swap the deeplink for a loopback HTTP URL. The admin UI's redirect | ||
| * whitelist accepts both. | ||
| * | ||
| * Security notes: | ||
| * - Loopback only (127.0.0.1) — no external network can intercept. | ||
| * - One-shot: server only handles the first /callback, then exits. | ||
| * - 5-minute timeout. | ||
| * - No CSRF token: single-use, host-local, bound to the process. | ||
| */ | ||
| import http from "node:http"; | ||
| import { URL } from "node:url"; | ||
| import { spawn } from "node:child_process"; | ||
| export async function runBrowserAuth(opts) { | ||
| const podUrl = opts.podUrl.replace(/\/$/, ""); | ||
| const timeoutMs = opts.timeoutMs ?? 5 * 60_000; | ||
| return new Promise((resolve, reject) => { | ||
| const server = http.createServer(); | ||
| let settled = false; | ||
| const settle = (fn) => { | ||
| if (settled) | ||
| return; | ||
| settled = true; | ||
| fn(); | ||
| server.close(); | ||
| clearTimeout(timeout); | ||
| }; | ||
| const timeout = setTimeout(() => { | ||
| settle(() => reject(new Error("Timed out waiting for browser approval. Run again, or use --manual-key."))); | ||
| }, timeoutMs); | ||
| server.on("request", (req, res) => { | ||
| // Only accept GET /callback — reject anything else. | ||
| const reqUrl = new URL(req.url ?? "/", `http://127.0.0.1`); | ||
| if (reqUrl.pathname !== "/callback") { | ||
| res.writeHead(404).end("Not found"); | ||
| return; | ||
| } | ||
| const raw = reqUrl.searchParams.get("context"); | ||
| if (!raw) { | ||
| res.writeHead(400, { "Content-Type": "text/html; charset=utf-8" }); | ||
| res.end(errorHtml("No context received — try again.")); | ||
| settle(() => reject(new Error("Callback missing `context` parameter"))); | ||
| return; | ||
| } | ||
| try { | ||
| const parsed = JSON.parse(raw); | ||
| if (!parsed.apiKey || !parsed.podUrl) { | ||
| throw new Error("Callback missing apiKey or podUrl"); | ||
| } | ||
| res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" }); | ||
| res.end(successHtml(opts.integration)); | ||
| settle(() => resolve({ | ||
| apiKey: parsed.apiKey, | ||
| podUrl: parsed.podUrl, | ||
| workspaceId: parsed.workspaceId ?? undefined, | ||
| })); | ||
| } | ||
| catch (err) { | ||
| res.writeHead(400, { "Content-Type": "text/html; charset=utf-8" }); | ||
| res.end(errorHtml("Invalid callback payload.")); | ||
| settle(() => reject(err instanceof Error ? err : new Error(String(err)))); | ||
| } | ||
| }); | ||
| server.on("error", (err) => { | ||
| settle(() => reject(err)); | ||
| }); | ||
| server.listen(0, "127.0.0.1", () => { | ||
| const port = server.address().port; | ||
| const redirectUri = `http://127.0.0.1:${port}/callback`; | ||
| const adminUrl = new URL(`${podUrl}/admin/connect`); | ||
| adminUrl.searchParams.set("integration", opts.integration); | ||
| adminUrl.searchParams.set("redirect_uri", redirectUri); | ||
| const fullUrl = adminUrl.toString(); | ||
| opts.onUrlReady?.(fullUrl); | ||
| openBrowser(fullUrl).catch(() => { | ||
| // Browser open failure is non-fatal — user can paste the URL themselves. | ||
| }); | ||
| }); | ||
| }); | ||
| } | ||
| /** | ||
| * Cross-platform browser open. Returns when the launcher has been kicked off, | ||
| * not when the user has actually seen the page. | ||
| */ | ||
| async function openBrowser(url) { | ||
| const platform = process.platform; | ||
| const [command, args] = platform === "darwin" | ||
| ? ["open", [url]] | ||
| : platform === "win32" | ||
| ? ["cmd", ["/c", "start", "", url]] | ||
| : ["xdg-open", [url]]; | ||
| return new Promise((resolve, reject) => { | ||
| const child = spawn(command, args, { | ||
| stdio: "ignore", | ||
| detached: true, | ||
| }); | ||
| child.once("error", reject); | ||
| child.once("spawn", () => { | ||
| child.unref(); | ||
| resolve(); | ||
| }); | ||
| }); | ||
| } | ||
| // ─── Page HTML ────────────────────────────────────────────────────────────── | ||
| // Short, no external deps, CLI-tool vibe. Shown once per connect. | ||
| function successHtml(integration) { | ||
| const label = integration.charAt(0).toUpperCase() + integration.slice(1); | ||
| return `<!doctype html> | ||
| <html lang="en"> | ||
| <head><meta charset="utf-8"><title>Synap connected</title> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
| <style> | ||
| :root { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif; } | ||
| body { margin: 0; background: #0A0A0A; color: #FAFAFA; display: grid; place-items: center; min-height: 100vh; } | ||
| .card { max-width: 420px; padding: 32px; text-align: center; } | ||
| .check { width: 48px; height: 48px; margin: 0 auto 16px; border-radius: 9999px; background: rgba(16, 185, 129, 0.12); display: grid; place-items: center; color: #10B981; } | ||
| h1 { font-size: 20px; margin: 0 0 8px; font-weight: 600; letter-spacing: -0.01em; } | ||
| p { margin: 0; color: rgba(250, 250, 250, 0.6); font-size: 14px; line-height: 1.5; } | ||
| code { background: rgba(250, 250, 250, 0.08); padding: 2px 6px; border-radius: 4px; font-size: 12px; } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class="card"> | ||
| <div class="check"> | ||
| <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg> | ||
| </div> | ||
| <h1>${label} connected</h1> | ||
| <p>You can close this tab and return to your terminal.</p> | ||
| </div> | ||
| <script>setTimeout(() => window.close(), 3000);</script> | ||
| </body> | ||
| </html>`; | ||
| } | ||
| function errorHtml(reason) { | ||
| return `<!doctype html> | ||
| <html lang="en"> | ||
| <head><meta charset="utf-8"><title>Synap connect failed</title> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
| <style> | ||
| :root { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif; } | ||
| body { margin: 0; background: #0A0A0A; color: #FAFAFA; display: grid; place-items: center; min-height: 100vh; } | ||
| .card { max-width: 420px; padding: 32px; text-align: center; } | ||
| .x { width: 48px; height: 48px; margin: 0 auto 16px; border-radius: 9999px; background: rgba(239, 68, 68, 0.12); display: grid; place-items: center; color: #EF4444; } | ||
| h1 { font-size: 20px; margin: 0 0 8px; font-weight: 600; } | ||
| p { margin: 0; color: rgba(250, 250, 250, 0.6); font-size: 14px; line-height: 1.5; } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class="card"> | ||
| <div class="x"> | ||
| <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg> | ||
| </div> | ||
| <h1>Connect failed</h1> | ||
| <p>${reason}</p> | ||
| </div> | ||
| </body> | ||
| </html>`; | ||
| } | ||
| //# sourceMappingURL=browser-auth.js.map |
| {"version":3,"file":"browser-auth.js","sourceRoot":"","sources":["../../src/lib/browser-auth.ts"],"names":[],"mappings":"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"} |
| export interface HubConfig { | ||
| podUrl: string; | ||
| apiKey: string; | ||
| userId: string; | ||
| /** Active workspace — from `synap use`, pod default, or env var. Undefined if none configured. */ | ||
| workspaceId?: string; | ||
| scopes?: string[]; | ||
| } | ||
| export declare function resolveUserId(cfg: HubConfig): Promise<string>; | ||
| export declare function assertScope(cfg: HubConfig, required: string): void; | ||
| export declare function resolveHubConfig(opts?: { | ||
| podUrl?: string; | ||
| apiKey?: string; | ||
| }): Promise<HubConfig>; | ||
| export declare function hubGet(path: string, params: Record<string, string | number | undefined>, cfg: HubConfig): Promise<unknown>; | ||
| export declare function hubPost(path: string, body: unknown, cfg: HubConfig): Promise<unknown>; | ||
| export declare function hubPatch(path: string, body: unknown, cfg: HubConfig): Promise<unknown>; |
| import { getActivePodConfig, getActiveWorkspaceId, listPodProfiles } from "./pod.js"; | ||
| import { resolveAgentOverride } from "./agents-config.js"; | ||
| const userIdCache = new Map(); | ||
| export async function resolveUserId(cfg) { | ||
| if (cfg.userId && cfg.userId !== "cli") | ||
| return cfg.userId; | ||
| const cached = userIdCache.get(cfg.apiKey); | ||
| if (cached) | ||
| return cached; | ||
| const me = await hubGet("/users/me", {}, cfg); | ||
| const id = String(me.id ?? cfg.userId); | ||
| userIdCache.set(cfg.apiKey, id); | ||
| return id; | ||
| } | ||
| export function assertScope(cfg, required) { | ||
| // scopes are on the HubConfig only if we fetched them; skip check if unknown | ||
| if (!cfg.scopes) | ||
| return; | ||
| if (!cfg.scopes.includes(required)) { | ||
| throw new Error(`API key is missing required scope: ${required}\n` + | ||
| `Re-run: synap connect --target=<surface> to get a key with the right scopes.`); | ||
| } | ||
| } | ||
| export async function resolveHubConfig(opts) { | ||
| // 1. Explicit flags (escape hatch) | ||
| if (opts?.podUrl && opts?.apiKey) { | ||
| return { | ||
| podUrl: opts.podUrl, | ||
| apiKey: opts.apiKey, | ||
| userId: process.env.SYNAP_USER_ID ?? "cli", | ||
| }; | ||
| } | ||
| // 2. Agent override: SYNAP_AGENT env var selects a named identity | ||
| const agentOverride = resolveAgentOverride(); | ||
| if (agentOverride) { | ||
| const profiles = listPodProfiles(); | ||
| const podProfile = profiles.find(p => p.name === agentOverride.podName); | ||
| const podUrl = podProfile?.config.podUrl ?? getActivePodConfig()?.podUrl ?? ""; | ||
| const envScopes = process.env.SYNAP_KEY_SCOPES; | ||
| return { | ||
| podUrl, | ||
| apiKey: agentOverride.apiKey, | ||
| userId: agentOverride.podName ?? "agent", | ||
| scopes: envScopes ? envScopes.split(",") : undefined, | ||
| }; | ||
| } | ||
| // 3. Env vars — set by `synap connect --target=claude-code` | ||
| const envPod = process.env.SYNAP_POD_URL; | ||
| const envKey = process.env.SYNAP_HUB_API_KEY; | ||
| const envUser = process.env.SYNAP_USER_ID; | ||
| const envScopes = process.env.SYNAP_KEY_SCOPES; | ||
| const envWorkspace = process.env.SYNAP_WORKSPACE_ID; | ||
| if (envPod && envKey && envUser) { | ||
| return { | ||
| podUrl: envPod, | ||
| apiKey: envKey, | ||
| userId: envUser, | ||
| workspaceId: envWorkspace || getActiveWorkspaceId(), | ||
| scopes: envScopes ? envScopes.split(",") : undefined, | ||
| }; | ||
| } | ||
| // 4. Active CLI pod profile | ||
| const config = getActivePodConfig(); | ||
| if (!config) | ||
| throw new Error("No pod configured. Run: synap pods add"); | ||
| return { | ||
| podUrl: config.podUrl, | ||
| apiKey: config.hubApiKey, | ||
| userId: config.agentUserId, | ||
| workspaceId: getActiveWorkspaceId(), | ||
| }; | ||
| } | ||
| export async function hubGet(path, params, cfg) { | ||
| const url = new URL(`${cfg.podUrl}/api/hub${path}`); | ||
| for (const [k, v] of Object.entries(params)) { | ||
| if (v !== undefined) | ||
| url.searchParams.set(k, String(v)); | ||
| } | ||
| const res = await fetch(url.toString(), { | ||
| headers: { Authorization: `Bearer ${cfg.apiKey}` }, | ||
| signal: AbortSignal.timeout(15_000), | ||
| }); | ||
| if (!res.ok) { | ||
| const body = await res.text().catch(() => ""); | ||
| throw new Error(`Hub API error (HTTP ${res.status}): ${body.slice(0, 300)}`); | ||
| } | ||
| return res.json(); | ||
| } | ||
| export async function hubPost(path, body, cfg) { | ||
| const res = await fetch(`${cfg.podUrl}/api/hub${path}`, { | ||
| method: "POST", | ||
| headers: { Authorization: `Bearer ${cfg.apiKey}`, "Content-Type": "application/json" }, | ||
| body: JSON.stringify(body), | ||
| signal: AbortSignal.timeout(15_000), | ||
| }); | ||
| if (!res.ok) { | ||
| const bodyText = await res.text().catch(() => ""); | ||
| throw new Error(`Hub API error (HTTP ${res.status}): ${bodyText.slice(0, 300)}`); | ||
| } | ||
| return res.json(); | ||
| } | ||
| export async function hubPatch(path, body, cfg) { | ||
| const res = await fetch(`${cfg.podUrl}/api/hub${path}`, { | ||
| method: "PATCH", | ||
| headers: { Authorization: `Bearer ${cfg.apiKey}`, "Content-Type": "application/json" }, | ||
| body: JSON.stringify(body), | ||
| signal: AbortSignal.timeout(15_000), | ||
| }); | ||
| if (!res.ok) { | ||
| const bodyText = await res.text().catch(() => ""); | ||
| throw new Error(`Hub API error (HTTP ${res.status}): ${bodyText.slice(0, 300)}`); | ||
| } | ||
| return res.json(); | ||
| } | ||
| //# sourceMappingURL=hub-client.js.map |
| {"version":3,"file":"hub-client.js","sourceRoot":"","sources":["../../src/lib/hub-client.ts"],"names":[],"mappings":"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"} |
| /** | ||
| * Skill installer — copies the synap skill tree into a target's skills directory. | ||
| * | ||
| * Source resolution order: | ||
| * 1. $SYNAP_SKILLS_DIR (explicit override) | ||
| * 2. adjacent ../synap-backend/skills/ (monorepo dev mode) | ||
| * 3. bundled skills/ inside this package (production / published npm) | ||
| * 4. fetch from a published tarball (fallback — not yet implemented) | ||
| * | ||
| * If none resolve, prints a manual install command and returns false. | ||
| */ | ||
| export declare const SKILL_NAMES: readonly ["synap", "synap-schema", "synap-ui"]; | ||
| export type SkillName = (typeof SKILL_NAMES)[number]; | ||
| export interface InstallOpts { | ||
| destDir: string; | ||
| skills: readonly string[]; | ||
| } | ||
| export declare function installSkills(opts: InstallOpts): Promise<boolean>; |
| /** | ||
| * Skill installer — copies the synap skill tree into a target's skills directory. | ||
| * | ||
| * Source resolution order: | ||
| * 1. $SYNAP_SKILLS_DIR (explicit override) | ||
| * 2. adjacent ../synap-backend/skills/ (monorepo dev mode) | ||
| * 3. bundled skills/ inside this package (production / published npm) | ||
| * 4. fetch from a published tarball (fallback — not yet implemented) | ||
| * | ||
| * If none resolve, prints a manual install command and returns false. | ||
| */ | ||
| import fs from "node:fs"; | ||
| import path from "node:path"; | ||
| import { fileURLToPath } from "node:url"; | ||
| import { log } from "../utils/logger.js"; | ||
| export const SKILL_NAMES = ["synap", "synap-schema", "synap-ui"]; | ||
| const __filename = fileURLToPath(import.meta.url); | ||
| const __dirname = path.dirname(__filename); | ||
| export async function installSkills(opts) { | ||
| const srcDir = resolveSkillsSource(); | ||
| if (!srcDir) { | ||
| log.warn("Could not locate skills source."); | ||
| log.dim("Set SYNAP_SKILLS_DIR to the folder containing synap/, synap-schema/, synap-ui/"); | ||
| log.dim("Or clone: git clone https://github.com/Synap-core/synap.git"); | ||
| log.dim(`Then copy synap/synap-backend/skills/* → ${opts.destDir}/`); | ||
| return false; | ||
| } | ||
| let installed = 0; | ||
| for (const name of opts.skills) { | ||
| const src = path.join(srcDir, name); | ||
| if (!fs.existsSync(src)) { | ||
| log.warn(`Skill '${name}' not found in source (skipping)`); | ||
| continue; | ||
| } | ||
| const dst = path.join(opts.destDir, name); | ||
| copyDir(src, dst); | ||
| installed++; | ||
| log.success(`Installed ${name} → ${shortenHome(dst)}`); | ||
| } | ||
| if (installed === 0) { | ||
| log.error("No skills were installed."); | ||
| return false; | ||
| } | ||
| return true; | ||
| } | ||
| function resolveSkillsSource() { | ||
| // 1. Explicit override | ||
| const override = process.env.SYNAP_SKILLS_DIR; | ||
| if (override && fs.existsSync(override)) { | ||
| return override; | ||
| } | ||
| // 2. Monorepo dev mode — ../synap-backend/skills/ relative to CLI source | ||
| // __dirname is .../synap-cli/dist/lib OR .../synap-cli/src/lib | ||
| const candidates = [ | ||
| path.resolve(__dirname, "..", "..", "..", "synap-backend", "skills"), | ||
| path.resolve(__dirname, "..", "..", "..", "..", "synap-backend", "skills"), | ||
| ]; | ||
| for (const c of candidates) { | ||
| if (fs.existsSync(path.join(c, "synap", "SKILL.md"))) { | ||
| return c; | ||
| } | ||
| } | ||
| // 3. Bundled inside the package — synap-cli/skills/ | ||
| const bundled = path.resolve(__dirname, "..", "..", "skills"); | ||
| if (fs.existsSync(path.join(bundled, "synap", "SKILL.md"))) { | ||
| return bundled; | ||
| } | ||
| // 4. TODO: remote fetch fallback | ||
| return null; | ||
| } | ||
| function copyDir(src, dst) { | ||
| fs.mkdirSync(dst, { recursive: true }); | ||
| for (const entry of fs.readdirSync(src, { withFileTypes: true })) { | ||
| const s = path.join(src, entry.name); | ||
| const d = path.join(dst, entry.name); | ||
| if (entry.isDirectory()) { | ||
| copyDir(s, d); | ||
| } | ||
| else if (entry.isFile()) { | ||
| fs.copyFileSync(s, d); | ||
| // preserve executable bit for .sh | ||
| if (entry.name.endsWith(".sh")) { | ||
| try { | ||
| fs.chmodSync(d, 0o755); | ||
| } | ||
| catch { | ||
| // best effort | ||
| } | ||
| } | ||
| } | ||
| } | ||
| } | ||
| function shortenHome(p) { | ||
| const home = process.env.HOME ?? ""; | ||
| return home && p.startsWith(home) ? p.replace(home, "~") : p; | ||
| } | ||
| //# sourceMappingURL=skills-installer.js.map |
| {"version":3,"file":"skills-installer.js","sourceRoot":"","sources":["../../src/lib/skills-installer.ts"],"names":[],"mappings":"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"} |
| /** | ||
| * Connect targets — where `synap connect --target=X` can drop credentials, | ||
| * skills, and MCP configs for each supported AI surface. | ||
| * | ||
| * Each target knows: | ||
| * - how to describe itself to the user | ||
| * - where its skills directory lives (if it reads Agent Skills) | ||
| * - where its MCP config lives (if it supports MCP) | ||
| * - how to render a one-shot install for the given pod + API key | ||
| */ | ||
| export type TargetName = "claude-code" | "claude-desktop" | "cursor" | "raycast" | "openclaw" | "openwebui" | "codex" | "generic"; | ||
| export interface TargetConnectionConfig { | ||
| podUrl: string; | ||
| apiKey: string; | ||
| workspaceId?: string; | ||
| agentUserId?: string; | ||
| skills?: string[]; | ||
| } | ||
| export interface TargetInfo { | ||
| name: TargetName; | ||
| label: string; | ||
| description?: string; | ||
| supports: { | ||
| skills: boolean; | ||
| mcp: boolean; | ||
| }; | ||
| skillsDir?: () => string; | ||
| mcpConfigPath?: () => string; | ||
| } | ||
| export declare const TARGETS: Record<TargetName, TargetInfo>; | ||
| export declare function isTargetName(value: string): value is TargetName; | ||
| export declare function listTargets(): void; | ||
| /** | ||
| * Run the install flow for a target. Returns true on success. | ||
| * Throws only on unexpected errors — recoverable failures are logged + return false. | ||
| */ | ||
| export declare function installForTarget(target: TargetName, cfg: TargetConnectionConfig): Promise<boolean>; | ||
| /** | ||
| * Fetch the pod's accessible workspaces and prompt the user to pick one for | ||
| * MCP URL scoping. Falls back silently to the workspaceId already in cfg | ||
| * if the fetch fails or the user skips. | ||
| */ | ||
| export declare function resolveWorkspaceId(cfg: TargetConnectionConfig): Promise<string | undefined>; | ||
| /** | ||
| * Write (or update) Synap env vars AND optionally the MCP server entry in ~/.claude/settings.json. | ||
| * Called both by installClaudeCode and by `synap pods use` to propagate switches. | ||
| * | ||
| * Claude Code reads mcpServers natively from settings.json using the HTTP transport | ||
| * format: { url, headers }. The URL optionally carries ?workspaceId= so all tool | ||
| * calls are pre-scoped to one workspace without the model having to pass it. | ||
| * | ||
| * @param writeMcp — set false to skip the mcpServers entry (skills-only installs) | ||
| */ | ||
| export declare function writeClaudeCodeEnv(cfg: Pick<TargetConnectionConfig, "podUrl" | "apiKey" | "workspaceId" | "agentUserId">, { writeMcp }?: { | ||
| writeMcp?: boolean; | ||
| }): Promise<void>; | ||
| interface McpServerConfig { | ||
| url?: string; | ||
| command?: string; | ||
| args?: string[]; | ||
| headers?: Record<string, string>; | ||
| env?: Record<string, string>; | ||
| } | ||
| export declare function writeMcpServerEntry(configPath: string, serverName: string, server: McpServerConfig): void; | ||
| export {}; |
| /** | ||
| * Connect targets — where `synap connect --target=X` can drop credentials, | ||
| * skills, and MCP configs for each supported AI surface. | ||
| * | ||
| * Each target knows: | ||
| * - how to describe itself to the user | ||
| * - where its skills directory lives (if it reads Agent Skills) | ||
| * - where its MCP config lives (if it supports MCP) | ||
| * - how to render a one-shot install for the given pod + API key | ||
| */ | ||
| import fs from "node:fs"; | ||
| import os from "node:os"; | ||
| import path from "node:path"; | ||
| import chalk from "chalk"; | ||
| import prompts from "prompts"; | ||
| import { log } from "../utils/logger.js"; | ||
| import { installSkills, SKILL_NAMES } from "./skills-installer.js"; | ||
| const CLAUDE_DESKTOP_MACOS = path.join(os.homedir(), "Library", "Application Support", "Claude"); | ||
| const CLAUDE_DESKTOP_WINDOWS = path.join(process.env.APPDATA ?? path.join(os.homedir(), "AppData", "Roaming"), "Claude"); | ||
| const CLAUDE_DESKTOP_LINUX = path.join(os.homedir(), ".config", "Claude"); | ||
| function claudeDesktopBaseDir() { | ||
| switch (process.platform) { | ||
| case "darwin": | ||
| return CLAUDE_DESKTOP_MACOS; | ||
| case "win32": | ||
| return CLAUDE_DESKTOP_WINDOWS; | ||
| default: | ||
| return CLAUDE_DESKTOP_LINUX; | ||
| } | ||
| } | ||
| export const TARGETS = { | ||
| "claude-code": { | ||
| name: "claude-code", | ||
| label: "Claude Code", | ||
| supports: { skills: true, mcp: true }, | ||
| skillsDir: () => path.join(os.homedir(), ".claude", "skills"), | ||
| mcpConfigPath: () => path.join(os.homedir(), ".claude", "settings.json"), | ||
| }, | ||
| "claude-desktop": { | ||
| name: "claude-desktop", | ||
| label: "Claude Desktop", | ||
| // Claude Desktop reads Agent Skills from its app-support skills/ dir | ||
| // (alongside claude_desktop_config.json). The "upload via claude.ai" path | ||
| // is still valid for cross-device sync, but local drop-in works and is | ||
| // what `synap connect` automates here. Path layout matches Claude Code's | ||
| // `~/.claude/skills/<skill>/SKILL.md` — same `installSkills` helper. | ||
| supports: { skills: true, mcp: true }, | ||
| mcpConfigPath: () => path.join(claudeDesktopBaseDir(), "claude_desktop_config.json"), | ||
| skillsDir: () => path.join(claudeDesktopBaseDir(), "skills"), | ||
| }, | ||
| cursor: { | ||
| name: "cursor", | ||
| label: "Cursor", | ||
| supports: { skills: false, mcp: true }, | ||
| mcpConfigPath: () => path.join(os.homedir(), ".cursor", "mcp.json"), | ||
| }, | ||
| raycast: { | ||
| name: "raycast", | ||
| label: "Raycast", | ||
| description: "Native extension with 9 AI tools + commands (credentials auto-read from CLI config)", | ||
| supports: { skills: false, mcp: false }, | ||
| }, | ||
| openclaw: { | ||
| name: "openclaw", | ||
| label: "OpenClaw", | ||
| supports: { skills: true, mcp: false }, | ||
| }, | ||
| openwebui: { | ||
| name: "openwebui", | ||
| label: "Open WebUI", | ||
| description: "Register Synap as a model source and tool server in Open WebUI", | ||
| supports: { skills: false, mcp: true }, | ||
| }, | ||
| codex: { | ||
| name: "codex", | ||
| label: "OpenAI Codex", | ||
| description: "OpenAI Codex CLI — MCP server + instructions", | ||
| supports: { skills: true, mcp: true }, | ||
| mcpConfigPath: () => path.join(os.homedir(), ".codex", "config.yaml"), | ||
| skillsDir: () => path.join(os.homedir(), ".codex"), | ||
| }, | ||
| generic: { | ||
| name: "generic", | ||
| label: "Generic MCP Client", | ||
| description: "Output MCP connection config for any MCP-compatible client", | ||
| supports: { skills: false, mcp: true }, | ||
| }, | ||
| }; | ||
| export function isTargetName(value) { | ||
| return value in TARGETS; | ||
| } | ||
| export function listTargets() { | ||
| log.heading("Supported targets"); | ||
| for (const t of Object.values(TARGETS)) { | ||
| const caps = []; | ||
| if (t.supports.skills) | ||
| caps.push("skills"); | ||
| if (t.supports.mcp) | ||
| caps.push("mcp"); | ||
| log.info(`${chalk.bold(t.name.padEnd(16))} ${t.label} ${chalk.dim(`(${caps.join(", ") || "—"})`)}`); | ||
| } | ||
| } | ||
| /** | ||
| * Run the install flow for a target. Returns true on success. | ||
| * Throws only on unexpected errors — recoverable failures are logged + return false. | ||
| */ | ||
| export async function installForTarget(target, cfg) { | ||
| const info = TARGETS[target]; | ||
| if (!info) { | ||
| log.error(`Unknown target: ${target}`); | ||
| return false; | ||
| } | ||
| log.heading(`Installing for ${info.label}`); | ||
| switch (target) { | ||
| case "claude-code": | ||
| return installClaudeCode(info, cfg); | ||
| case "claude-desktop": | ||
| return installClaudeDesktop(info, cfg); | ||
| case "cursor": | ||
| return installCursor(info, cfg); | ||
| case "raycast": | ||
| return installRaycast(cfg); | ||
| case "openclaw": | ||
| return installOpenclaw(cfg); | ||
| case "openwebui": | ||
| return installOpenWebUI(cfg); | ||
| case "codex": | ||
| return installCodex(info, cfg); | ||
| case "generic": | ||
| return installGeneric(cfg); | ||
| } | ||
| } | ||
| // ─── Claude Code ───────────────────────────────────────────────────────────── | ||
| async function installClaudeCode(info, cfg) { | ||
| // ── What to install? ──────────────────────────────────────────────────── | ||
| // Skills = CLAUDE.md context files (instructions, schema, UI patterns) | ||
| // MCP = live tool server (read/write entities, search, memory, etc.) | ||
| // Both is the recommended default — skills give the model Synap knowledge, | ||
| // MCP gives it the actual tools to act on data. | ||
| const { mode } = await prompts({ | ||
| type: "select", | ||
| name: "mode", | ||
| message: "What do you want to install?", | ||
| choices: [ | ||
| { | ||
| title: "Both — Skills + MCP tools (recommended)", | ||
| description: "Skills give Claude context about Synap; MCP tools let it read & write data", | ||
| value: "both", | ||
| }, | ||
| { | ||
| title: "MCP tools only", | ||
| description: "Live tool server — search, create, update entities, memory, channels", | ||
| value: "mcp", | ||
| }, | ||
| { | ||
| title: "Skills only", | ||
| description: "Context files (CLAUDE.md) — no live data access", | ||
| value: "skills", | ||
| }, | ||
| ], | ||
| initial: 0, | ||
| }); | ||
| if (!mode) | ||
| return false; | ||
| // ── Skills ────────────────────────────────────────────────────────────── | ||
| if (mode === "both" || mode === "skills") { | ||
| const dir = info.skillsDir?.(); | ||
| if (dir) { | ||
| const installed = await installSkills({ | ||
| destDir: dir, | ||
| skills: cfg.skills ?? SKILL_NAMES, | ||
| }); | ||
| if (installed) { | ||
| log.success(`Skills installed to ~/.claude/skills/`); | ||
| } | ||
| } | ||
| } | ||
| // ── MCP ───────────────────────────────────────────────────────────────── | ||
| if (mode === "both" || mode === "mcp") { | ||
| await writeClaudeCodeEnv(cfg); | ||
| log.success("MCP server 'synap' added to ~/.claude/settings.json"); | ||
| if (cfg.workspaceId) { | ||
| log.dim(`Scoped to workspace: ${cfg.workspaceId}`); | ||
| } | ||
| else { | ||
| log.dim("Not scoped — all workspaces accessible."); | ||
| } | ||
| } | ||
| else { | ||
| // Skills-only: still write env vars (pod URL useful for skills referencing | ||
| // SYNAP_POD_URL) but don't add the mcpServers entry | ||
| await writeClaudeCodeEnv({ ...cfg, workspaceId: cfg.workspaceId }, { writeMcp: false }); | ||
| } | ||
| log.blank(); | ||
| log.success("Claude Code config updated."); | ||
| log.dim("Restart Claude Code (or open a new window) to pick up the MCP server and env vars."); | ||
| return true; | ||
| } | ||
| /** | ||
| * Fetch the pod's accessible workspaces and prompt the user to pick one for | ||
| * MCP URL scoping. Falls back silently to the workspaceId already in cfg | ||
| * if the fetch fails or the user skips. | ||
| */ | ||
| export async function resolveWorkspaceId(cfg) { | ||
| let workspaceList = []; | ||
| try { | ||
| const res = await fetch(`${cfg.podUrl.replace(/\/$/, "")}/api/hub/workspaces`, { | ||
| headers: { Authorization: `Bearer ${cfg.apiKey}` }, | ||
| }); | ||
| if (res.ok) { | ||
| const body = await res.json(); | ||
| workspaceList = body.workspaces ?? []; | ||
| } | ||
| } | ||
| catch { /* pod unreachable — fall through */ } | ||
| // Single workspace or no workspaces — no need to prompt | ||
| if (workspaceList.length <= 1) { | ||
| return workspaceList[0]?.id ?? cfg.workspaceId; | ||
| } | ||
| log.blank(); | ||
| log.info(`Found ${workspaceList.length} workspaces on this pod.`); | ||
| log.dim("Pinning a workspace scopes the MCP so Claude Code sees only that workspace."); | ||
| const defaultIdx = cfg.workspaceId | ||
| ? workspaceList.findIndex((w) => w.id === cfg.workspaceId) | ||
| : -1; | ||
| const { selected } = await prompts({ | ||
| type: "select", | ||
| name: "selected", | ||
| message: "Scope MCP to one workspace?", | ||
| choices: [ | ||
| { title: chalk.dim("All workspaces (no scoping)"), value: "" }, | ||
| ...workspaceList.map((w) => ({ | ||
| title: `${chalk.bold(w.name)} ${chalk.dim(w.id)}`, | ||
| value: w.id, | ||
| })), | ||
| ], | ||
| initial: defaultIdx >= 0 ? defaultIdx + 1 : 0, // +1 because "All" is first | ||
| }); | ||
| return selected || undefined; | ||
| } | ||
| /** | ||
| * Write (or update) Synap env vars AND optionally the MCP server entry in ~/.claude/settings.json. | ||
| * Called both by installClaudeCode and by `synap pods use` to propagate switches. | ||
| * | ||
| * Claude Code reads mcpServers natively from settings.json using the HTTP transport | ||
| * format: { url, headers }. The URL optionally carries ?workspaceId= so all tool | ||
| * calls are pre-scoped to one workspace without the model having to pass it. | ||
| * | ||
| * @param writeMcp — set false to skip the mcpServers entry (skills-only installs) | ||
| */ | ||
| export async function writeClaudeCodeEnv(cfg, { writeMcp = true } = {}) { | ||
| const settingsPath = path.join(os.homedir(), ".claude", "settings.json"); | ||
| const settingsDir = path.dirname(settingsPath); | ||
| let settings = {}; | ||
| if (fs.existsSync(settingsPath)) { | ||
| try { | ||
| settings = JSON.parse(fs.readFileSync(settingsPath, "utf-8")); | ||
| } | ||
| catch { /* start fresh */ } | ||
| } | ||
| // ── Resolve human user ID and provision an agent-owned API key ────────── | ||
| // SYNAP_USER_ID = human user (for entity attribution) | ||
| // SYNAP_HUB_API_KEY = agent-owned key (identity encoded in the key itself) | ||
| const podBase = cfg.podUrl.replace(/\/$/, ""); | ||
| let effectiveApiKey = cfg.apiKey; | ||
| // Resolve human user ID, then provision an agent-owned key. | ||
| // Both steps are required — fail loudly if either is unreachable. | ||
| const meRes = await fetch(`${podBase}/api/hub/users/me`, { | ||
| headers: { Authorization: `Bearer ${cfg.apiKey}` }, | ||
| signal: AbortSignal.timeout(5000), | ||
| }); | ||
| if (!meRes.ok) { | ||
| throw new Error(`Could not reach pod at ${cfg.podUrl} (HTTP ${meRes.status}). Check your pod URL and API key.`); | ||
| } | ||
| const me = await meRes.json(); | ||
| if (!me.id) | ||
| throw new Error("/api/hub/users/me returned no user ID — is the pod running?"); | ||
| const agentSetupRes = await fetch(`${podBase}/api/hub/setup/agent`, { | ||
| method: "POST", | ||
| headers: { "Content-Type": "application/json", Authorization: `Bearer ${cfg.apiKey}` }, | ||
| body: JSON.stringify({ agentType: "claude-code", idempotent: false }), | ||
| signal: AbortSignal.timeout(10000), | ||
| }); | ||
| if (!agentSetupRes.ok) { | ||
| const text = await agentSetupRes.text().catch(() => agentSetupRes.statusText); | ||
| throw new Error(`Failed to provision agent key for claude-code (HTTP ${agentSetupRes.status}): ${text}\nEnsure your API key has hub-protocol.write scope.`); | ||
| } | ||
| const agentSetup = await agentSetupRes.json(); | ||
| if (!agentSetup.hubApiKey) | ||
| throw new Error("setup/agent succeeded but returned no hubApiKey — check pod logs."); | ||
| effectiveApiKey = agentSetup.hubApiKey; | ||
| // Enroll the agent user into the human user's workspaces using the HUMAN key | ||
| // (agent key is not yet active). When no workspace is scoped, this gives the | ||
| // agent access to all workspaces the human belongs to. | ||
| if (agentSetup.agentUserId) { | ||
| const enrollRes = await fetch(`${podBase}/api/hub/workspaces/enroll-agent`, { | ||
| method: "POST", | ||
| headers: { "Content-Type": "application/json", Authorization: `Bearer ${cfg.apiKey}` }, | ||
| body: JSON.stringify({ | ||
| agentUserId: agentSetup.agentUserId, | ||
| ...(cfg.workspaceId ? { workspaceId: cfg.workspaceId } : {}), | ||
| role: "editor", | ||
| }), | ||
| signal: AbortSignal.timeout(10000), | ||
| }); | ||
| if (enrollRes.ok) { | ||
| const enrolled = await enrollRes.json(); | ||
| if (enrolled.enrolled?.length) { | ||
| log.dim(` Agent enrolled in ${enrolled.enrolled.length} workspace(s).`); | ||
| } | ||
| } | ||
| // Non-fatal — enrollment failure doesn't block the connect flow | ||
| } | ||
| const env = (settings.env ?? {}); | ||
| env["SYNAP_POD_URL"] = cfg.podUrl; | ||
| env["SYNAP_HUB_API_KEY"] = effectiveApiKey; | ||
| env["SYNAP_USER_ID"] = me.id; | ||
| delete env["SYNAP_AGENT_USER_ID"]; | ||
| if (cfg.workspaceId) | ||
| env["SYNAP_WORKSPACE_ID"] = cfg.workspaceId; | ||
| else | ||
| delete env["SYNAP_WORKSPACE_ID"]; | ||
| if (me.scopes?.length) | ||
| env["SYNAP_KEY_SCOPES"] = me.scopes.join(","); | ||
| settings.env = env; | ||
| // ── MCP server entry (HTTP transport, native Claude Code format) ───────── | ||
| if (writeMcp) { | ||
| // Append ?workspaceId= when one is set so every tool call is pre-scoped. | ||
| const mcpUrl = cfg.workspaceId | ||
| ? `${podBase}/mcp?workspaceId=${encodeURIComponent(cfg.workspaceId)}` | ||
| : `${podBase}/mcp`; | ||
| const mcpServers = (settings.mcpServers ?? {}); | ||
| mcpServers["synap"] = { | ||
| url: mcpUrl, | ||
| headers: { Authorization: `Bearer ${effectiveApiKey}` }, | ||
| }; | ||
| settings.mcpServers = mcpServers; | ||
| } | ||
| if (!fs.existsSync(settingsDir)) { | ||
| fs.mkdirSync(settingsDir, { recursive: true }); | ||
| } | ||
| fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + "\n", { mode: 0o600 }); | ||
| } | ||
| // ─── Agent key provisioning helper ────────────────────────────────────────── | ||
| /** | ||
| * Provision an agent-owned API key for the given surface via POST /api/hub/setup/agent. | ||
| * Throws on failure — callers must not silently fall back to a human key. | ||
| */ | ||
| async function provisionAgentKey(podUrl, humanApiKey, agentType) { | ||
| const podBase = podUrl.replace(/\/$/, ""); | ||
| let res; | ||
| try { | ||
| res = await fetch(`${podBase}/api/hub/setup/agent`, { | ||
| method: "POST", | ||
| headers: { | ||
| "Content-Type": "application/json", | ||
| Authorization: `Bearer ${humanApiKey}`, | ||
| }, | ||
| body: JSON.stringify({ agentType, idempotent: false }), | ||
| signal: AbortSignal.timeout(10000), | ||
| }); | ||
| } | ||
| catch (err) { | ||
| throw new Error(`Could not reach pod to provision agent key for ${agentType}: ${err.message}\n` + | ||
| `Ensure the pod is reachable and try again.`); | ||
| } | ||
| if (!res.ok) { | ||
| const text = await res.text().catch(() => res.statusText); | ||
| throw new Error(`Failed to provision agent key for ${agentType} (HTTP ${res.status}): ${text}\n` + | ||
| `Ensure your API key has hub-protocol.write scope.`); | ||
| } | ||
| const body = await res.json(); | ||
| if (!body.hubApiKey) { | ||
| throw new Error(`setup/agent succeeded but returned no hubApiKey for ${agentType}. ` + | ||
| `This is a server-side bug — check the pod logs.`); | ||
| } | ||
| return body.hubApiKey; | ||
| } | ||
| // ─── Claude Desktop ────────────────────────────────────────────────────────── | ||
| async function installClaudeDesktop(info, cfg) { | ||
| const mcpPath = info.mcpConfigPath?.(); | ||
| if (!mcpPath) | ||
| return false; | ||
| // Claude Desktop's claude_desktop_config.json is STDIO-ONLY — the HTTP | ||
| // `{ url, headers }` format is silently ignored. We write a stdio bridge | ||
| // via the community-maintained `mcp-remote` npm package, which translates | ||
| // stdio MCP messages into HTTPS calls against the pod's /mcp endpoint. | ||
| // | ||
| // Reference: https://www.npmjs.com/package/mcp-remote | ||
| const effectiveApiKey = await provisionAgentKey(cfg.podUrl, cfg.apiKey, "claude-desktop"); | ||
| const desktopMcpUrl = cfg.workspaceId | ||
| ? `${cfg.podUrl.replace(/\/$/, "")}/mcp?workspaceId=${encodeURIComponent(cfg.workspaceId)}` | ||
| : `${cfg.podUrl.replace(/\/$/, "")}/mcp`; | ||
| writeMcpServerEntry(mcpPath, "synap", { | ||
| command: "npx", | ||
| args: ["-y", "mcp-remote", desktopMcpUrl, "--header", `Authorization: Bearer ${effectiveApiKey}`], | ||
| }); | ||
| log.blank(); | ||
| log.success(`MCP server 'synap' added to ${path.relative(os.homedir(), mcpPath)}`); | ||
| log.dim("The entry uses 'npx mcp-remote' as a stdio bridge — Claude Desktop spawns it."); | ||
| // Drop the three synap skill packages directly into Claude Desktop's | ||
| // app-support skills/ dir. Same on-disk layout as Claude Code | ||
| // (skills/<name>/SKILL.md), discovered on app launch. | ||
| const skillsDir = info.skillsDir?.(); | ||
| if (skillsDir) { | ||
| const installed = await installSkills({ | ||
| destDir: skillsDir, | ||
| skills: cfg.skills ?? SKILL_NAMES, | ||
| }); | ||
| if (installed) { | ||
| log.success(`Synap skills installed to ${path.relative(os.homedir(), skillsDir)}/ (${(cfg.skills ?? SKILL_NAMES).join(", ")})`); | ||
| } | ||
| else { | ||
| log.warn("Skill install reported no files written — verify ~/Library/Application Support/Claude/skills/ exists after relaunch."); | ||
| } | ||
| } | ||
| log.blank(); | ||
| log.info("Next steps:"); | ||
| log.dim(" 1. Fully quit Claude Desktop (Cmd+Q), then relaunch."); | ||
| log.dim(" 2. Look for the MCP tools icon under the input box — 'synap' should appear."); | ||
| log.dim(" 3. Skills auto-load on launch from the app-support skills/ dir."); | ||
| log.dim(" 4. If tools don't load, check ~/Library/Logs/Claude/mcp*.log"); | ||
| log.blank(); | ||
| log.dim("Tip: to sync skills across devices via your Claude account, also upload them at https://claude.ai → Settings → Skills."); | ||
| return true; | ||
| } | ||
| // ─── Cursor ────────────────────────────────────────────────────────────────── | ||
| async function installCursor(info, cfg) { | ||
| const mcpPath = info.mcpConfigPath?.(); | ||
| if (!mcpPath) | ||
| return false; | ||
| const effectiveApiKey = await provisionAgentKey(cfg.podUrl, cfg.apiKey, "cursor"); | ||
| const cursorMcpUrl = cfg.workspaceId | ||
| ? `${cfg.podUrl.replace(/\/$/, "")}/mcp?workspaceId=${encodeURIComponent(cfg.workspaceId)}` | ||
| : `${cfg.podUrl.replace(/\/$/, "")}/mcp`; | ||
| writeMcpServerEntry(mcpPath, "synap", { | ||
| url: cursorMcpUrl, | ||
| headers: { Authorization: `Bearer ${effectiveApiKey}` }, | ||
| }); | ||
| log.blank(); | ||
| log.success(`MCP server 'synap' added to ${path.relative(os.homedir(), mcpPath)}`); | ||
| if (cfg.workspaceId) | ||
| log.dim(`Scoped to workspace: ${cfg.workspaceId}`); | ||
| log.dim("Restart Cursor. The synap tool set will appear in agent mode."); | ||
| log.blank(); | ||
| log.info("Cursor reads Claude-format skills from ~/.claude/skills/ too."); | ||
| log.dim("Run `synap connect --target=claude-code` additionally to install skills."); | ||
| return true; | ||
| } | ||
| // ─── Raycast ───────────────────────────────────────────────────────────────── | ||
| async function installRaycast(cfg) { | ||
| // Raycast reads credentials from ~/.synap/config.json (Tier 0 — highest priority). | ||
| // The pod setup step already wrote them there. No manual pasting needed. | ||
| // Behavioral guidance is built into the extension via ai.instructions in its package.json — | ||
| // Raycast AI automatically uses it when the extension's tools are active. | ||
| log.success("Credentials already in ~/.synap/config.json — Raycast picks them up automatically."); | ||
| log.blank(); | ||
| log.info("1. Install the Synap extension from the Raycast Store:"); | ||
| log.dim(" Open Raycast → search 'Raycast Store' → search 'Synap' → Install"); | ||
| log.blank(); | ||
| log.info("2. Commands available immediately after install:"); | ||
| log.dim(" Search Synap — search your knowledge graph"); | ||
| log.dim(" Quick Capture — capture selected text or clipboard as an entity"); | ||
| log.dim(" Capture Browser Tab — save current browser tab"); | ||
| log.dim(" Create Task — create a task directly"); | ||
| log.dim(" Synap Status — menu bar: pending tasks + proposals"); | ||
| log.blank(); | ||
| log.info("3. Raycast AI has 9 native Synap tools (no MCP, no extra setup):"); | ||
| log.dim(" search-entities · get-tasks · create-entity · update-entity · get-entity"); | ||
| log.dim(" store-memory · recall-memory · send-to-channel · get-recent"); | ||
| log.blank(); | ||
| log.info("4. Behavioral guidance is built into the extension."); | ||
| log.dim(" Raycast AI knows how to use Synap — search before answering,"); | ||
| log.dim(" save proactively, link entities, persist facts to memory."); | ||
| log.dim(" No system prompt to paste."); | ||
| log.blank(); | ||
| log.dim(` Pod: ${cfg.podUrl}`); | ||
| if (cfg.workspaceId) | ||
| log.dim(` Workspace: ${cfg.workspaceId}`); | ||
| log.dim(" To switch pods later: synap switch — Raycast picks it up immediately."); | ||
| return true; | ||
| } | ||
| // ─── OpenClaw (wraps existing flow with saved pod config) ─────────────────── | ||
| async function installOpenclaw(cfg) { | ||
| const { detectOpenClaw, readOpenClawConfig, writeOpenClawConfig, setConfigValue } = await import("./openclaw.js"); | ||
| const oc = detectOpenClaw(); | ||
| if (!oc.found) { | ||
| log.warn("OpenClaw not detected on this machine."); | ||
| log.dim(" Install it first: https://openclaw.dev"); | ||
| log.dim(" Or run `synap init` to set up from scratch."); | ||
| return false; | ||
| } | ||
| const ocConfig = readOpenClawConfig() ?? {}; | ||
| setConfigValue(ocConfig, "synap.podUrl", cfg.podUrl); | ||
| setConfigValue(ocConfig, "synap.hubApiKey", cfg.apiKey); | ||
| if (cfg.workspaceId) | ||
| setConfigValue(ocConfig, "synap.workspaceId", cfg.workspaceId); | ||
| if (cfg.agentUserId) | ||
| setConfigValue(ocConfig, "synap.agentUserId", cfg.agentUserId); | ||
| writeOpenClawConfig(ocConfig); | ||
| log.success("Wrote OpenClaw config"); | ||
| log.blank(); | ||
| log.info("Install the skills:"); | ||
| for (const name of cfg.skills ?? SKILL_NAMES) { | ||
| log.dim(` openclaw skills install ${name}`); | ||
| } | ||
| return true; | ||
| } | ||
| // ─── Open WebUI ────────────────────────────────────────────────────────────── | ||
| async function installOpenWebUI(cfg) { | ||
| const podBase = cfg.podUrl.replace(/\/$/, ""); | ||
| const mcpUrl = cfg.workspaceId | ||
| ? `${podBase}/mcp?workspaceId=${encodeURIComponent(cfg.workspaceId)}` | ||
| : `${podBase}/mcp`; | ||
| const podHost = new URL(cfg.podUrl).host; | ||
| log.info("Open WebUI connects to Synap in two ways:"); | ||
| log.blank(); | ||
| log.info("1. Model source (configured by Eve at install time):"); | ||
| log.dim(` Base URL: http://${podHost}/v1`); | ||
| log.blank(); | ||
| log.info("2. MCP tool server:"); | ||
| log.dim(" Admin → Tools → Add Tool Server"); | ||
| log.dim(` URL: ${mcpUrl}`); | ||
| log.dim(` Header: Authorization: Bearer ${cfg.apiKey}`); | ||
| log.blank(); | ||
| const synapDir = path.join(os.homedir(), ".synap"); | ||
| if (!fs.existsSync(synapDir)) { | ||
| fs.mkdirSync(synapDir, { recursive: true }); | ||
| } | ||
| const refFile = path.join(synapDir, "openwebui-mcp.json"); | ||
| const refData = { | ||
| modelSource: { baseUrl: `http://${podHost}/v1` }, | ||
| mcpToolServer: { | ||
| url: mcpUrl, | ||
| headers: { Authorization: `Bearer ${cfg.apiKey}` }, | ||
| }, | ||
| }; | ||
| fs.writeFileSync(refFile, JSON.stringify(refData, null, 2) + "\n", { mode: 0o600 }); | ||
| log.success(`Connection details saved to ~/.synap/openwebui-mcp.json`); | ||
| return true; | ||
| } | ||
| // ─── Generic MCP client ─────────────────────────────────────────────────────── | ||
| async function installGeneric(cfg) { | ||
| const podBase = cfg.podUrl.replace(/\/$/, ""); | ||
| const mcpUrl = cfg.workspaceId | ||
| ? `${podBase}/mcp?workspaceId=${encodeURIComponent(cfg.workspaceId)}` | ||
| : `${podBase}/mcp`; | ||
| const httpConfig = { | ||
| synap: { | ||
| url: mcpUrl, | ||
| transport: "http", | ||
| headers: { Authorization: `Bearer ${cfg.apiKey}` }, | ||
| }, | ||
| }; | ||
| log.info("Universal MCP connection config:"); | ||
| log.blank(); | ||
| log.info("HTTP direct:"); | ||
| log.dim(JSON.stringify(httpConfig, null, 2)); | ||
| log.blank(); | ||
| log.info("stdio bridge (mcp-remote):"); | ||
| log.dim(` command: npx -y mcp-remote ${mcpUrl} --header "Authorization: Bearer ${cfg.apiKey}"`); | ||
| log.blank(); | ||
| log.info("Environment variable form:"); | ||
| log.dim(` MCP_SERVER_URL=${mcpUrl}`); | ||
| log.dim(` MCP_API_KEY=${cfg.apiKey}`); | ||
| log.blank(); | ||
| const synapDir = path.join(os.homedir(), ".synap"); | ||
| if (!fs.existsSync(synapDir)) { | ||
| fs.mkdirSync(synapDir, { recursive: true }); | ||
| } | ||
| const configFile = path.join(synapDir, "mcp-config.json"); | ||
| fs.writeFileSync(configFile, JSON.stringify(httpConfig, null, 2) + "\n", { mode: 0o600 }); | ||
| log.success(`MCP config written to ~/.synap/mcp-config.json`); | ||
| return true; | ||
| } | ||
| // ─── Codex ─────────────────────────────────────────────────────────────────── | ||
| async function installCodex(info, cfg) { | ||
| const configPath = info.mcpConfigPath?.() ?? path.join(os.homedir(), ".codex", "config.yaml"); | ||
| const configDir = path.dirname(configPath); | ||
| if (!fs.existsSync(configDir)) { | ||
| fs.mkdirSync(configDir, { recursive: true, mode: 0o700 }); | ||
| } | ||
| // Read existing config or start fresh | ||
| let existing = ""; | ||
| if (fs.existsSync(configPath)) { | ||
| try { | ||
| existing = fs.readFileSync(configPath, "utf-8"); | ||
| } | ||
| catch { /* ignore */ } | ||
| } | ||
| // Build MCP server entry | ||
| const effectiveApiKey = await provisionAgentKey(cfg.podUrl, cfg.apiKey, "codex"); | ||
| const podBase = cfg.podUrl.replace(/\/$/, ""); | ||
| const mcpUrl = cfg.workspaceId | ||
| ? `${podBase}/mcp?workspaceId=${encodeURIComponent(cfg.workspaceId)}` | ||
| : `${podBase}/mcp`; | ||
| // Inject/replace the synap mcpServers block using simple string manipulation | ||
| // (avoid requiring a YAML parser dependency) | ||
| const mcpBlock = [ | ||
| "mcpServers:", | ||
| ` - name: synap`, | ||
| ` url: "${mcpUrl}"`, | ||
| ` headers:`, | ||
| ` Authorization: "Bearer ${effectiveApiKey}"`, | ||
| ].join("\n"); | ||
| let updated; | ||
| if (/^mcpServers:/m.test(existing)) { | ||
| // Replace existing mcpServers block (everything from mcpServers: to the next top-level key or EOF) | ||
| updated = existing.replace(/^mcpServers:[\s\S]*?(?=\n[a-zA-Z]|\s*$)/m, mcpBlock); | ||
| } | ||
| else { | ||
| updated = existing ? `${existing.trimEnd()}\n\n${mcpBlock}\n` : `${mcpBlock}\n`; | ||
| } | ||
| fs.writeFileSync(configPath, updated, { mode: 0o600 }); | ||
| // Skills → append synap context to ~/.codex/instructions.md | ||
| const instructionsPath = path.join(configDir, "instructions.md"); | ||
| const marker = "<!-- synap-skill -->"; | ||
| let instructions = ""; | ||
| if (fs.existsSync(instructionsPath)) { | ||
| try { | ||
| instructions = fs.readFileSync(instructionsPath, "utf-8"); | ||
| } | ||
| catch { /* ignore */ } | ||
| } | ||
| if (!instructions.includes(marker)) { | ||
| const snippet = [ | ||
| "", | ||
| marker, | ||
| "## Synap pod access", | ||
| `You have access to a Synap data pod via MCP tools (server: synap).`, | ||
| `Pod: ${cfg.podUrl}`, | ||
| cfg.workspaceId ? `Default workspace: ${cfg.workspaceId}` : "Access: pod-wide", | ||
| "Use the synap MCP tools to search, read, and write entities, memory, and documents.", | ||
| "Always call orient (or list workspaces) first to discover workspace IDs.", | ||
| "", | ||
| ].join("\n"); | ||
| fs.writeFileSync(instructionsPath, (instructions.trimEnd() + snippet).trimStart() + "\n", { mode: 0o600 }); | ||
| } | ||
| log.success(`Codex config updated: ${configPath}`); | ||
| if (cfg.workspaceId) { | ||
| log.dim(`Scoped to workspace: ${cfg.workspaceId}`); | ||
| } | ||
| else { | ||
| log.dim("Not scoped — all workspaces accessible."); | ||
| } | ||
| log.blank(); | ||
| log.dim("Restart Codex CLI to pick up the new MCP server."); | ||
| return true; | ||
| } | ||
| export function writeMcpServerEntry(configPath, serverName, server) { | ||
| const dir = path.dirname(configPath); | ||
| if (!fs.existsSync(dir)) { | ||
| fs.mkdirSync(dir, { recursive: true }); | ||
| } | ||
| let config = {}; | ||
| if (fs.existsSync(configPath)) { | ||
| try { | ||
| config = JSON.parse(fs.readFileSync(configPath, "utf-8")); | ||
| } | ||
| catch { | ||
| // corrupt or unreadable — back up and start fresh | ||
| const backup = `${configPath}.bak-${Date.now()}`; | ||
| fs.copyFileSync(configPath, backup); | ||
| log.warn(`Existing config unreadable; backed up to ${path.basename(backup)}`); | ||
| } | ||
| } | ||
| config.mcpServers = config.mcpServers ?? {}; | ||
| config.mcpServers[serverName] = server; | ||
| fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n", { | ||
| mode: 0o600, | ||
| }); | ||
| } | ||
| //# sourceMappingURL=targets.js.map |
| {"version":3,"file":"targets.js","sourceRoot":"","sources":["../../src/lib/targets.ts"],"names":[],"mappings":"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"} |
| # Synap Skills | ||
| Three skills make up the Synap agent surface. Install all three for the full experience; they are designed to be used together. | ||
| ## The three skills | ||
| | Skill | Purpose | Trigger | | ||
| | -------------- | ---------------------------------------------------------- | ----------------------------------------------------------------- | | ||
| | `synap` | Core data operations — read, write, link, search, remember | "Save this", "Find my X", "Who is Y", "Remind me to Z" | | ||
| | `synap-schema` | Extend the data model — new profiles, new properties | "I need a type for X", "Add a field to tasks" | | ||
| | `synap-ui` | Build views, dashboards, workspaces, bento layouts | "Make me a dashboard", "Build a kanban", "Create a CRM workspace" | | ||
| Each skill has its own SKILL.md with a trigger-first description. The harness loads only the skills whose descriptions match the user's intent — so a data-fetch turn doesn't load the UI skill, and vice versa. | ||
| ## File layout | ||
| ``` | ||
| skills/ | ||
| ├── synap/ ← core data operations | ||
| │ ├── SKILL.md | ||
| │ ├── linking.md ← auto-sync + explicit relations reference | ||
| │ ├── governance.md ← proposal semantics + whitelist | ||
| │ ├── capture.md ← multi-entity capture pipeline | ||
| │ └── scripts/ | ||
| │ └── orient.sh ← deterministic startup: users/me + workspaces + profiles | ||
| │ | ||
| ├── synap-schema/ ← extend the data model | ||
| │ ├── SKILL.md | ||
| │ └── property-types.md ← valueType reference + constraints + uiHints + scope | ||
| │ | ||
| ├── synap-ui/ ← build interface over data | ||
| │ ├── SKILL.md | ||
| │ ├── view-types.md ← the 12 implemented view types + configs | ||
| │ ├── widget-catalog.md ← cells/widgets reference | ||
| │ └── bento-recipes.md ← ready-to-adapt dashboard layouts | ||
| │ | ||
| └── README.md ← this file | ||
| ``` | ||
| ## How progressive disclosure works | ||
| Per Anthropic's Agent Skills spec, each skill has three loading levels: | ||
| 1. **Metadata (always loaded, ~100 tokens/skill).** The frontmatter `name` + `description`. Determines whether the harness surfaces this skill to the model at all. | ||
| 2. **SKILL.md body (loaded when skill triggers, ≤5k tokens).** The authoritative instructions. Kept concise and action-oriented. | ||
| 3. **References + scripts (loaded on demand).** Deeper docs the model reads only when the current task calls for them. Scripts run via bash — their source never enters context. | ||
| So the total always-on cost of all three Synap skills is ≈300 tokens. The full content (≈15k tokens across all files) only enters context when genuinely needed. | ||
| ## Authentication (shared by all three) | ||
| All skills talk to a Synap Data Pod over HTTP: | ||
| ``` | ||
| Authorization: Bearer {SYNAP_HUB_API_KEY} | ||
| X-Workspace-Id: {SYNAP_WORKSPACE_ID} (optional; can pass in body/query) | ||
| Required scopes: | ||
| hub-protocol.read → GET endpoints | ||
| hub-protocol.write → writes + GET /channels/personal (get-or-create) | ||
| ``` | ||
| Provision a key via `npx @synap-core/cli connect --target=<client>` or directly at `POST /api/hub/setup/agent`. | ||
| ## Supported clients | ||
| Each skill is portable and works unchanged in: | ||
| - **OpenClaw** — drop into the standard skill directory, env vars pick up the pod URL and key | ||
| - **Claude Code** — install to `~/.claude/skills/synap/` (strip `metadata.openclaw` block if desired) | ||
| - **Claude Desktop** — does NOT read local skill folders. Skills in Claude Desktop sync from claude.ai — upload the three skill directories there (Settings → Skills → Upload). Claude Desktop CAN still use the pod via an MCP bridge — see `synap-cli/src/lib/targets.ts` `installClaudeDesktop` for the stdio-bridge config. | ||
| - **Raycast** — the Raycast extension is a separate package with its own tool bindings; it reads these skills as context | ||
| The OpenClaw-specific metadata block is namespaced under `metadata.openclaw` so consumers that don't recognize it will ignore it cleanly. | ||
| ## When to install which | ||
| - **Read-only memory agent** (just wants to recall facts) → `synap` | ||
| - **General-purpose assistant** (reads + writes + captures) → `synap` | ||
| - **Data model architect** (user asked to design a new schema) → `synap` + `synap-schema` | ||
| - **Interface builder** (user wants dashboards and views) → `synap` + `synap-ui` | ||
| - **Full co-founder agent** → all three | ||
| Installing a skill the user doesn't need costs ~100 tokens of always-on metadata. Installing all three by default is fine; being selective is an optimization. | ||
| ## Reference | ||
| - Anthropic's Agent Skills overview: https://docs.anthropic.com/en/docs/agents-and-tools/agent-skills/overview | ||
| - Best practices: https://docs.anthropic.com/en/docs/agents-and-tools/agent-skills/best-practices | ||
| - Open spec: https://agentskills.io | ||
| - Synap Hub Protocol reference: see `synap-backend/packages/api/src/routers/hub-protocol-rest.ts` |
| # Property types — reference | ||
| Every property on a profile has a `valueType`. This is the authoritative list, what each type stores, and how to configure it. | ||
| ## Value types | ||
| ### `string` | ||
| Plain text. | ||
| ```json | ||
| { | ||
| "slug": "email", | ||
| "valueType": "string", | ||
| "constraints": { "maxLength": 200, "pattern": "^.+@.+\\..+$" }, | ||
| "uiHints": { "inputType": "email" } | ||
| } | ||
| ``` | ||
| **uiHints.inputType variants:** `email`, `phone`, `url`, `person`, `richtext`, `select`, `datetime`, `datetime-local`. | ||
| **uiHints.displayAs variants:** `status`, `priority`, `progress`, `person` — used by list/table views for special badges. | ||
| ### `number` | ||
| Integer or float. | ||
| ```json | ||
| { | ||
| "slug": "price", | ||
| "valueType": "number", | ||
| "constraints": { "min": 0, "max": 1000000 }, | ||
| "uiHints": { "format": "currency", "displayName": "Price" } | ||
| } | ||
| ``` | ||
| **uiHints.format:** `locale`, `currency`, `percent`, `compact`. | ||
| ### `boolean` | ||
| True/false. | ||
| ```json | ||
| { | ||
| "slug": "isArchived", | ||
| "valueType": "boolean", | ||
| "uiHints": { "displayName": "Archived" } | ||
| } | ||
| ``` | ||
| ### `date` | ||
| ISO 8601 date or datetime. | ||
| ```json | ||
| { | ||
| "slug": "dueDate", | ||
| "valueType": "date", | ||
| "uiHints": { "includeTime": false, "displayName": "Due" } | ||
| } | ||
| ``` | ||
| Set `includeTime: true` for datetime; false for date-only. Don't store durations as dates — use `number` in seconds/minutes. | ||
| ### `entity_id` | ||
| **The important one.** A reference to another entity by UUID. Triggers the auto-sync behaviour (see `../synap/linking.md`). | ||
| ```json | ||
| { | ||
| "slug": "projectId", | ||
| "valueType": "entity_id", | ||
| "constraints": { "targetProfileSlug": "project" }, | ||
| "uiHints": { "linkedProfileSlug": "project", "displayName": "Project" } | ||
| } | ||
| ``` | ||
| **Always set `targetProfileSlug`** (or `targetProfileSlugs: [...]` for multi-target). Without it, UI can't render a picker and auto-sync defaults to `related_to`. | ||
| For linking to users (workspace members), use: | ||
| ```json | ||
| { | ||
| "slug": "assignee", | ||
| "valueType": "entity_id", | ||
| "constraints": { "targetProfileSlug": "person" }, | ||
| "uiHints": { "inputType": "person", "linkedTable": "workspace_members" } | ||
| } | ||
| ``` | ||
| ### `array` | ||
| List of primitives OR list of entity references. | ||
| For tags / free-text lists: | ||
| ```json | ||
| { | ||
| "slug": "tags", | ||
| "valueType": "array", | ||
| "uiHints": { "itemValueType": "string" } | ||
| } | ||
| ``` | ||
| For multi-entity lists (e.g., event attendees): | ||
| ```json | ||
| { | ||
| "slug": "attendees", | ||
| "valueType": "array", | ||
| "uiHints": { "itemValueType": "entity_id", "linkedProfileSlug": "person" } | ||
| } | ||
| ``` | ||
| Arrays of entity IDs **don't auto-sync** — if you want bidirectional linking for each item, create explicit relations. | ||
| ### `object` | ||
| Arbitrary JSON. Only for data that genuinely has no fixed schema. | ||
| ```json | ||
| { "slug": "metadata", "valueType": "object" } | ||
| ``` | ||
| Avoid when possible. Objects don't index well and can't be filtered in views. Prefer breaking out properties. | ||
| ### `secret` | ||
| Like `string` but masked in UI, encrypted at rest, never returned in list responses. | ||
| ```json | ||
| { "slug": "apiToken", "valueType": "secret" } | ||
| ``` | ||
| Use for credentials stored on an entity (e.g., a connector's OAuth refresh token). Never put actual user data here — use `string`. | ||
| ## Constraints | ||
| The `constraints` object is value-type specific: | ||
| | valueType | Supported constraints | | ||
| | ----------- | ------------------------------------------------------------- | | ||
| | `string` | `minLength`, `maxLength`, `pattern` (regex), `enum: string[]` | | ||
| | `number` | `min`, `max`, `integer: true`, `enum: number[]` | | ||
| | `date` | `min` (ISO), `max` (ISO) | | ||
| | `entity_id` | `targetProfileSlug`, `targetProfileSlugs` (multi) | | ||
| | `array` | `minItems`, `maxItems`, `uniqueItems: true` | | ||
| | `object` | (none — prefer breaking into typed properties) | | ||
| Violations return a 400 from `POST /entities` with `{ error: "validation", field: "slug", issue: "..." }`. | ||
| ## uiHints reference | ||
| ```ts | ||
| { | ||
| displayName?: string // Label in UI forms and views | ||
| placeholder?: string // Input placeholder | ||
| inputType?: "email" | "phone" | "url" | "person" | "richtext" | ||
| | "datetime" | "datetime-local" | "select" | ||
| displayAs?: "status" | "priority" | "progress" | "person" | ||
| format?: "locale" | "currency" | "percent" | "compact" | ||
| includeTime?: boolean // date only | ||
| linkedProfileSlug?: string // entity_id rendering | ||
| linkedTable?: "workspace_members" | "free_text" | ||
| itemValueType?: "string" | "number" | "boolean" | "date" | "entity_id" | "url" | ||
| pluginHints?: Record<string, unknown> // freeform for custom cells | ||
| } | ||
| ``` | ||
| uiHints are cosmetic — they change rendering, not validation. If you need enforcement, use `constraints`. | ||
| ## Scope — three layers | ||
| Every property def has two scope dimensions: | ||
| | `profileId` | `workspaceId` | Layer | Who sees it | | ||
| | ----------- | ------------- | ----------------- | -------------------------------------- | | ||
| | null | null | Global | Every workspace, every profile | | ||
| | set | null | Profile-base | Every workspace that uses this profile | | ||
| | set | set | Workspace overlay | Only that workspace | | ||
| The rendering rule for a given `(profile, workspace)`: | ||
| ``` | ||
| visible = global ∪ profile-base ∪ this-workspace's overlays on this profile | ||
| ``` | ||
| Other workspaces' overlays are filtered out at SQL level. | ||
| ### When to use each | ||
| - **Global** (rare): properties that apply to all entity types (e.g., `createdBy`, `tags`). System only. | ||
| - **Profile-base** (default): the property should appear for everyone using this profile. Creating a property for a workspace-owned profile → profile-base. | ||
| - **Overlay**: the property is specific to one workspace extending a shared profile. Pass `overlay: true` in `POST /property-defs`. | ||
| If you're extending a pod-wide profile (like `task` or `contact`) with a workspace-specific field, you **must** use overlay — otherwise you'd pollute every workspace. | ||
| Entities can carry overlay property values even in workspaces that don't see the overlay — the values are preserved but invisible. This is by design. | ||
| ## Inheritance | ||
| If a profile has `parentProfileSlug`, it inherits the parent's property defs. Own properties override parent properties by slug. | ||
| Example: `contact` has `parentProfileSlug: "person"`. A contact entity has both `person.email` and `contact.role`. Set `email` on a contact and you satisfy the parent schema. | ||
| When creating a child profile, don't re-declare the parent's properties. Only add what's new. | ||
| ## Validation semantics | ||
| On `POST /entities` and `PATCH /entities`: | ||
| 1. Compute effective properties = profile-base ∪ global ∪ workspace overlays. | ||
| 2. For each property in the request body, check the def exists and the value passes `valueType` + `constraints`. | ||
| 3. Unknown properties (not in any layer) are stored in JSONB but never rendered. Avoid — they rot. | ||
| Properties not in the request body are not cleared. Use `PATCH` with `{ "properties": { "x": null } }` to explicitly unset. | ||
| ## Performance note | ||
| Every entity_id property is indexed via `entity_property_index.value_entity_id` for fast reverse-lookup ("find all entities whose `projectId` is X"). This is what makes Way 1 cheap at scale. Inventing a string property with UUIDs inside will work but won't be indexed — use `entity_id`. | ||
| ## Common mistakes | ||
| - Using `string` for what should be `entity_id` (loses auto-sync + reverse-lookup). | ||
| - Omitting `constraints.targetProfileSlug` on `entity_id` props (breaks pickers, breaks auto-sync routing). | ||
| - Creating an `array` of entity_ids and expecting bidirectional linking (it doesn't — use explicit relations). | ||
| - Using `object` when two `string` properties would suffice. | ||
| - Reusing `tags` as an entity_id list (tags is free-text by convention; make a new `relatedProjects` property instead). | ||
| - Overriding parent profile properties with weaker types (child `email` as `object` when parent is `string`) — creates validation drift. |
| --- | ||
| name: synap-schema | ||
| description: > | ||
| Use this skill when the user needs to extend Synap's data model — defining a | ||
| new type of thing (entity profile) or adding/modifying fields (property defs) | ||
| on existing types. Triggers: "I need a new type for podcasts/recipes/workouts/ | ||
| clients/books/plants/investments", "add a priority field to tasks", "create a | ||
| property for tracking budget", "I want to track Y and it's not in my current | ||
| schema", defining custom relations, setting up a profile for a specific domain | ||
| (real estate, music production, research, fitness, cooking). Also triggers on: | ||
| "do I already have a profile for X?", "what fields does <profile> have?", | ||
| extending an existing profile with workspace-specific overlay properties. | ||
| Do NOT use this skill for creating instances of existing types — the core | ||
| `synap` skill handles that. This skill changes the SCHEMA, not the data. | ||
| metadata: | ||
| openclaw: | ||
| requires: | ||
| env: [SYNAP_HUB_API_KEY, SYNAP_POD_URL] | ||
| primaryEnv: SYNAP_HUB_API_KEY | ||
| homepage: https://synap.live | ||
| capabilities: [schema, profiles, properties] | ||
| os: [macos, linux, windows] | ||
| userInvocable: false | ||
| --- | ||
| # Synap — schema extension | ||
| You extend a user's Synap pod schema: new entity profiles, new properties on existing profiles, overlay properties scoped to one workspace. The core rule: **reuse before extending.** Creating duplicate profiles fractures the graph. | ||
| ## Before you touch anything | ||
| Always inventory first. Never assume the schema is empty. | ||
| ``` | ||
| GET /api/hub/profiles?userId={userId}&workspaceId={workspaceId} | ||
| → [{ slug, displayName, entityScope, parentProfileSlug, | ||
| properties: [{ slug, valueType, constraints, uiHints, targetProfileSlug? }] }] | ||
| GET /api/hub/property-defs?userId={userId}&workspaceId={workspaceId}&profileId={profileId} | ||
| → [{ slug, valueType, constraints, uiHints, workspaceId /* null=base, uuid=overlay */ }] | ||
| ``` | ||
| The `synap` skill's `scripts/orient.sh` already fetches profiles — reuse its output. | ||
| ## Discover profiles — never assume | ||
| **Always call `GET /api/hub/profiles?workspaceId={workspaceId}` first.** Profiles are dynamic — every pod and workspace has a different set depending on what was seeded and what the user created. Never assume a profile slug exists without verifying. | ||
| ``` | ||
| GET /api/hub/profiles?workspaceId={workspaceId} | ||
| → [{ slug, displayName, entityScope, parentSlug, | ||
| properties: [{ slug, valueType, required, ... }] }] | ||
| ``` | ||
| Read the response: | ||
| - `entityScope: "pod"` — visible across all workspaces | ||
| - `entityScope: "workspace"` — scoped to this workspace only (custom types, CRM profiles, template-seeded types) | ||
| - `parentSlug` — inheritance chain (e.g. `contact` extends `person`) | ||
| ### Commonly seeded profiles (verify before using) | ||
| Standard pods typically include: `note`, `task`, `project`, `event`, `person`, `contact`, `company`, `bookmark`, `website`, `article`, `capture`, `file`, `anchor`, `decision`, `question`, `research` | ||
| CRM workspaces additionally have: `deal`, `client` — but **only** when a CRM workspace was created. | ||
| Custom workspace templates (devplane, content, etc.) add their own profiles entirely. | ||
| Before creating a new profile: **does one of these already fit?** A podcast episode is arguably an `article`. A meeting is an `event`. A book to read is an `article` or `bookmark`. Err on the side of reuse + extension, not creation. | ||
| ## When to extend an existing profile vs. create a new one | ||
| Extend when: | ||
| - The thing fits an existing category (a "client" is a kind of `contact` — consider inheritance) | ||
| - The user needs 1–3 extra fields on an existing type | ||
| - The new fields are workspace-specific (use an overlay, see below) | ||
| Create new when: | ||
| - None of the system profiles fits | ||
| - The thing has a clearly distinct set of properties (10+ fields) | ||
| - The domain model genuinely calls for a new first-class type (recipe, workout, podcast episode, investment, plant, medication, vehicle, property listing…) | ||
| Prefer **inheritance** over new profiles when a system parent fits. `contact extends person` is the pattern — a new `client` profile can `parentProfileSlug: "contact"` and only add the fields that differ. | ||
| ## Creating a new profile | ||
| ```json | ||
| POST /api/hub/profiles | ||
| { | ||
| "userId": "{userId}", | ||
| "workspaceId": "{workspaceId}", | ||
| "slug": "podcast_episode", // snake_case, unique | ||
| "displayName": "Podcast Episode", | ||
| "description": "An episode of a podcast the user listens to", | ||
| "parentProfileId": "<id of article or null>", // optional, enables inheritance | ||
| "defaultValues": { "status": "queued" }, | ||
| "uiHints": { "icon": "mic", "color": "purple" } | ||
| } | ||
| ``` | ||
| Then add properties one by one (see below). You do NOT declare properties inline on the profile — they're separate rows. | ||
| ## Creating properties | ||
| ```json | ||
| POST /api/hub/property-defs | ||
| { | ||
| "userId": "{userId}", | ||
| "workspaceId": "{workspaceId}", | ||
| "profileId": "{profileId}", // the profile this property belongs to | ||
| "slug": "durationMinutes", | ||
| "valueType": "number", | ||
| "constraints": { "min": 0, "max": 600 }, | ||
| "uiHints": { "format": "compact", "displayName": "Duration" } | ||
| } | ||
| ``` | ||
| Value types: `string`, `number`, `boolean`, `date`, `entity_id`, `array`, `object`, `secret`. Full reference in **`property-types.md`**. | ||
| For linking properties, always use `entity_id` with `targetProfileSlug` in constraints: | ||
| ```json | ||
| { | ||
| "slug": "hostId", | ||
| "valueType": "entity_id", | ||
| "constraints": { "targetProfileSlug": "person" }, | ||
| "uiHints": { "displayName": "Host" } | ||
| } | ||
| ``` | ||
| This enables auto-sync (see `../synap/linking.md`) — the property becomes a typed link that shows up in graph traversals automatically. | ||
| ## Workspace overlay properties | ||
| New concept (2026-04-10+). A single profile (say `task`) can have **different fields in different workspaces** without copying the profile. Set `overlay: true` on `POST /property-defs`: | ||
| ```json | ||
| POST /api/hub/property-defs | ||
| { | ||
| "userId": "{userId}", | ||
| "workspaceId": "{workspaceId}", | ||
| "profileId": "{taskProfileId}", | ||
| "slug": "billableHours", | ||
| "valueType": "number", | ||
| "overlay": true // this property only appears in this workspace | ||
| } | ||
| ``` | ||
| Use cases: | ||
| - "My consulting workspace needs `billableHours` on tasks; my personal workspace doesn't." | ||
| - "Our sales workspace wants a `dealSize` on contacts; engineering doesn't." | ||
| Overlays don't leak: workspace A can't see workspace B's overlay properties even though both share the profile. For the full scope model, read **`property-types.md`** §Overlay. | ||
| ## Entity scope (pod-wide vs. workspace-scoped) | ||
| Profiles have an `entityScope` that determines where entities of that type live: | ||
| - `entityScope: "pod"` — entities are pod-wide, visible in every workspace the user can access. Good for people, companies, notes, articles — things that cross contexts. | ||
| - `entityScope: "workspace"` — entities live in the workspace they were created in. Good for deals, files, workspace-specific artifacts. | ||
| Defaults to `workspace` if not set on the profile. The user can toggle this per profile in ProfileEditor Settings. If you're creating a profile for something clearly pod-wide (a person, a podcast the user follows, a book in their library), set `entityScope: "pod"` explicitly. | ||
| ## Custom relations | ||
| If the user wants a typed edge that isn't in the convention list (see `../synap/linking.md`), you can define it: | ||
| ```json | ||
| POST /api/hub/relation-defs | ||
| { | ||
| "userId": "{userId}", | ||
| "workspaceId": "{workspaceId}", | ||
| "slug": "mentored_by", | ||
| "displayName": "Mentored by", | ||
| "sourceProfileSlug": "person", | ||
| "targetProfileSlug": "person", | ||
| "bidirectional": false | ||
| } | ||
| ``` | ||
| Defining a relation def is rarely worth it — `related_to` + a property usually suffices. Only create one when the relationship is semantic enough that UI should treat it specially (e.g., show "mentored by Jane" on a person's profile card). | ||
| ## Worked example — "I want to track podcasts I listen to" | ||
| 1. Inventory. `GET /profiles` → no `podcast` profile, no `podcast_episode`. | ||
| 2. Decide scope. Podcasts/episodes are pod-wide (same podcast across workspaces). | ||
| 3. Create two profiles (podcast + episode) or one (episode only, with the show as a string property)? Decide based on the user's intent. If they want to group episodes by show → two profiles. If one-level is enough → one. | ||
| 4. For two profiles: | ||
| ``` | ||
| POST /profiles { slug: "podcast", displayName: "Podcast", entityScope: "pod", uiHints: { icon: "radio" } } | ||
| POST /profiles { slug: "podcast_episode", displayName: "Podcast Episode", parentProfileId: <articleId>, entityScope: "pod" } | ||
| ``` | ||
| 5. Add properties on `podcast`: | ||
| ``` | ||
| POST /property-defs { slug: "host", valueType: "string" } | ||
| POST /property-defs { slug: "rssUrl", valueType: "string", uiHints: { inputType: "url" } } | ||
| POST /property-defs { slug: "category", valueType: "string" } | ||
| ``` | ||
| 6. Add properties on `podcast_episode`: | ||
| ``` | ||
| POST /property-defs { slug: "podcastId", valueType: "entity_id", constraints: { targetProfileSlug: "podcast" } } | ||
| POST /property-defs { slug: "durationMinutes", valueType: "number" } | ||
| POST /property-defs { slug: "listenedAt", valueType: "date" } | ||
| POST /property-defs { slug: "rating", valueType: "number", constraints: { min: 1, max: 5 } } | ||
| ``` | ||
| 7. Tell the user. "I added `podcast` and `podcast_episode` to your pod with linking between them. You can create your first episode now, or want me to also add a view for it?" (Hand off to the `synap-ui` skill if they say yes.) | ||
| ## Common mistakes | ||
| 1. **Creating a profile that already exists (e.g., `meeting` when `event` fits).** Always inventory first. | ||
| 2. **Declaring properties inline on the profile object.** Properties are separate rows; use `POST /property-defs`. | ||
| 3. **Using `string` for what should be `entity_id`.** If the field refers to another entity (host of a podcast), use `entity_id` + `targetProfileSlug` — enables auto-sync and link UX. | ||
| 4. **Using `array` of strings for tags.** Tags are a built-in concept; reuse the `tags` property on `note`/`project` instead of creating a parallel field. | ||
| 5. **Forgetting `entityScope`.** Defaults to `workspace`. If the thing is pod-wide (people, books, podcasts), set it explicitly. | ||
| 6. **Creating an overlay when a base property is wanted.** Overlays only appear in one workspace. If the user wants the field everywhere, don't set `overlay: true`. | ||
| 7. **Creating a custom profile when extension would work.** `client extends contact` is cleaner than a parallel `client` profile. | ||
| ## When you need more | ||
| - Full `valueType` reference + constraints + uiHints → **`property-types.md`** | ||
| - Inheritance, overlay scope semantics, pod-wide caveats → **`property-types.md`** §Scope | ||
| - Creating views over the new profile → install the **`synap-ui`** skill | ||
| - Creating instances of the new profile → use the core **`synap`** skill |
| # Bento recipes — reference | ||
| Ready-to-adapt layouts for the most common user asks. Each recipe is a starting point — verify widget kinds against `/widget-definitions` and swap in real IDs before committing. | ||
| All coordinates use the 12-column grid. `layout: { x, y, w, h }`. | ||
| --- | ||
| ## Recipe: Personal home dashboard | ||
| _User asks: "Give me a home dashboard."_ | ||
| The canonical landing page. What matters today + quick access + recent activity. | ||
| ```json | ||
| { | ||
| "name": "Home", | ||
| "type": "bento", | ||
| "config": { | ||
| "blocks": [ | ||
| { | ||
| "id": "h1", | ||
| "kind": "widget", | ||
| "widgetKind": "section-header", | ||
| "layout": { "x": 0, "y": 0, "w": 12, "h": 1 }, | ||
| "config": { "title": "Today", "subtitle": "{{date}}" } | ||
| }, | ||
| { | ||
| "id": "h2", | ||
| "kind": "widget", | ||
| "widgetKind": "stat-card", | ||
| "layout": { "x": 0, "y": 1, "w": 3, "h": 2 }, | ||
| "config": { | ||
| "label": "Due today", | ||
| "metric": "count", | ||
| "filter": { | ||
| "profileSlug": "task", | ||
| "properties.dueDate": "today", | ||
| "properties.status": ["todo", "in-progress"] | ||
| }, | ||
| "icon": "calendar" | ||
| } | ||
| }, | ||
| { | ||
| "id": "h3", | ||
| "kind": "widget", | ||
| "widgetKind": "stat-card", | ||
| "layout": { "x": 3, "y": 1, "w": 3, "h": 2 }, | ||
| "config": { | ||
| "label": "This week", | ||
| "metric": "count", | ||
| "filter": { | ||
| "profileSlug": "event", | ||
| "properties.startDate": "this-week" | ||
| }, | ||
| "icon": "calendar-days" | ||
| } | ||
| }, | ||
| { | ||
| "id": "h4", | ||
| "kind": "widget", | ||
| "widgetKind": "stat-card", | ||
| "layout": { "x": 6, "y": 1, "w": 3, "h": 2 }, | ||
| "config": { | ||
| "label": "Pending review", | ||
| "metric": "count", | ||
| "filter": { "type": "proposal", "status": "pending" }, | ||
| "icon": "inbox" | ||
| } | ||
| }, | ||
| { | ||
| "id": "h5", | ||
| "kind": "widget", | ||
| "widgetKind": "stat-card", | ||
| "layout": { "x": 9, "y": 1, "w": 3, "h": 2 }, | ||
| "config": { | ||
| "label": "Captured this week", | ||
| "metric": "count", | ||
| "filter": { "createdAt": "this-week" }, | ||
| "icon": "zap" | ||
| } | ||
| }, | ||
| { | ||
| "id": "h6", | ||
| "kind": "widget", | ||
| "widgetKind": "view-list", | ||
| "layout": { "x": 0, "y": 3, "w": 6, "h": 5 }, | ||
| "config": { | ||
| "profileSlug": "task", | ||
| "primaryField": "title", | ||
| "secondaryFields": ["priority", "dueDate", "projectId"], | ||
| "filters": [ | ||
| { | ||
| "property": "status", | ||
| "op": "in", | ||
| "value": ["todo", "in-progress"] | ||
| } | ||
| ], | ||
| "sort": [{ "property": "priority", "direction": "desc" }], | ||
| "limit": 10 | ||
| } | ||
| }, | ||
| { | ||
| "id": "h7", | ||
| "kind": "widget", | ||
| "widgetKind": "proactive-feed", | ||
| "layout": { "x": 6, "y": 3, "w": 6, "h": 5 }, | ||
| "config": { "limit": 8 } | ||
| }, | ||
| { | ||
| "id": "h8", | ||
| "kind": "widget", | ||
| "widgetKind": "feed", | ||
| "layout": { "x": 0, "y": 8, "w": 12, "h": 4 }, | ||
| "config": { "sources": ["entity.create", "entity.update"], "limit": 20 } | ||
| } | ||
| ] | ||
| } | ||
| } | ||
| ``` | ||
| --- | ||
| ## Recipe: Project overview | ||
| _User asks: "Make me a page for Project X."_ | ||
| Built around one entity. Shows context + child tasks + documents + activity. | ||
| ```json | ||
| { | ||
| "name": "{{projectName}}", | ||
| "type": "bento", | ||
| "config": { | ||
| "blocks": [ | ||
| { | ||
| "id": "p1", | ||
| "kind": "entity", | ||
| "entityId": "{{projectId}}", | ||
| "layout": { "x": 0, "y": 0, "w": 12, "h": 3 } | ||
| }, | ||
| { | ||
| "id": "p2", | ||
| "kind": "widget", | ||
| "widgetKind": "view-kanban", | ||
| "layout": { "x": 0, "y": 3, "w": 8, "h": 6 }, | ||
| "config": { | ||
| "profileSlug": "task", | ||
| "groupBy": { "property": "status" }, | ||
| "filters": [ | ||
| { "property": "projectId", "op": "eq", "value": "{{projectId}}" } | ||
| ] | ||
| } | ||
| }, | ||
| { | ||
| "id": "p3", | ||
| "kind": "widget", | ||
| "widgetKind": "entity-gallery", | ||
| "layout": { "x": 8, "y": 3, "w": 4, "h": 3 }, | ||
| "config": { | ||
| "profileSlug": "file", | ||
| "filters": [ | ||
| { "property": "projectId", "op": "eq", "value": "{{projectId}}" } | ||
| ], | ||
| "limit": 6 | ||
| } | ||
| }, | ||
| { | ||
| "id": "p4", | ||
| "kind": "widget", | ||
| "widgetKind": "feed", | ||
| "layout": { "x": 8, "y": 6, "w": 4, "h": 3 }, | ||
| "config": { "entityId": "{{projectId}}", "limit": 10 } | ||
| } | ||
| ] | ||
| } | ||
| } | ||
| ``` | ||
| --- | ||
| ## Recipe: CRM home | ||
| _User asks: "Make me a CRM."_ | ||
| Pipeline-forward. Deals, contacts, upcoming meetings. | ||
| ```json | ||
| { | ||
| "name": "CRM", | ||
| "type": "bento", | ||
| "config": { | ||
| "blocks": [ | ||
| { | ||
| "id": "c1", | ||
| "kind": "widget", | ||
| "widgetKind": "section-header", | ||
| "layout": { "x": 0, "y": 0, "w": 12, "h": 1 }, | ||
| "config": { "title": "Pipeline" } | ||
| }, | ||
| { | ||
| "id": "c2", | ||
| "kind": "widget", | ||
| "widgetKind": "view-kanban", | ||
| "layout": { "x": 0, "y": 1, "w": 12, "h": 6 }, | ||
| "config": { | ||
| "profileSlug": "deal", | ||
| "groupBy": { "property": "stage" }, | ||
| "cardFields": ["title", "value", "closeDate", "contactId"] | ||
| } | ||
| }, | ||
| { | ||
| "id": "c3", | ||
| "kind": "widget", | ||
| "widgetKind": "stat-card", | ||
| "layout": { "x": 0, "y": 7, "w": 4, "h": 2 }, | ||
| "config": { | ||
| "label": "Open pipeline", | ||
| "metric": "sum", | ||
| "metricField": "value", | ||
| "filter": { | ||
| "profileSlug": "deal", | ||
| "properties.stage": ["lead", "qualified", "proposal"] | ||
| }, | ||
| "format": "currency", | ||
| "icon": "trending-up" | ||
| } | ||
| }, | ||
| { | ||
| "id": "c4", | ||
| "kind": "widget", | ||
| "widgetKind": "stat-card", | ||
| "layout": { "x": 4, "y": 7, "w": 4, "h": 2 }, | ||
| "config": { | ||
| "label": "Closing this month", | ||
| "metric": "count", | ||
| "filter": { | ||
| "profileSlug": "deal", | ||
| "properties.closeDate": "this-month" | ||
| }, | ||
| "icon": "clock" | ||
| } | ||
| }, | ||
| { | ||
| "id": "c5", | ||
| "kind": "widget", | ||
| "widgetKind": "stat-card", | ||
| "layout": { "x": 8, "y": 7, "w": 4, "h": 2 }, | ||
| "config": { | ||
| "label": "New contacts (30d)", | ||
| "metric": "count", | ||
| "filter": { "profileSlug": "contact", "createdAt": "last-30-days" }, | ||
| "icon": "user-plus" | ||
| } | ||
| }, | ||
| { | ||
| "id": "c6", | ||
| "kind": "widget", | ||
| "widgetKind": "view-calendar", | ||
| "layout": { "x": 0, "y": 9, "w": 8, "h": 5 }, | ||
| "config": { | ||
| "profileSlug": "event", | ||
| "dateProperty": "startDate", | ||
| "endDateProperty": "endDate", | ||
| "view": "week", | ||
| "filters": [{ "property": "relatedToContact", "op": "exists" }] | ||
| } | ||
| }, | ||
| { | ||
| "id": "c7", | ||
| "kind": "widget", | ||
| "widgetKind": "view-list", | ||
| "layout": { "x": 8, "y": 9, "w": 4, "h": 5 }, | ||
| "config": { | ||
| "profileSlug": "contact", | ||
| "primaryField": "title", | ||
| "secondaryFields": ["role", "companyId"], | ||
| "sort": [{ "property": "lastInteractionAt", "direction": "desc" }], | ||
| "limit": 12 | ||
| } | ||
| } | ||
| ] | ||
| } | ||
| } | ||
| ``` | ||
| --- | ||
| ## Recipe: Content pipeline | ||
| _User asks: "Make me a content creation workspace / dashboard."_ | ||
| Assumes a `draft` profile exists (extend `article` via `synap-schema`). | ||
| ```json | ||
| { | ||
| "name": "Content Pipeline", | ||
| "type": "bento", | ||
| "config": { | ||
| "blocks": [ | ||
| { | ||
| "id": "ct1", | ||
| "kind": "widget", | ||
| "widgetKind": "view-kanban", | ||
| "layout": { "x": 0, "y": 0, "w": 12, "h": 6 }, | ||
| "config": { | ||
| "profileSlug": "draft", | ||
| "groupBy": { "property": "status" }, | ||
| "columnOrder": ["idea", "writing", "review", "published"], | ||
| "cardFields": ["title", "wordCount", "publishDate"] | ||
| } | ||
| }, | ||
| { | ||
| "id": "ct2", | ||
| "kind": "widget", | ||
| "widgetKind": "stat-card", | ||
| "layout": { "x": 0, "y": 6, "w": 4, "h": 2 }, | ||
| "config": { | ||
| "label": "Published this month", | ||
| "metric": "count", | ||
| "filter": { | ||
| "profileSlug": "draft", | ||
| "properties.status": "published", | ||
| "properties.publishDate": "this-month" | ||
| } | ||
| } | ||
| }, | ||
| { | ||
| "id": "ct3", | ||
| "kind": "widget", | ||
| "widgetKind": "stat-card", | ||
| "layout": { "x": 4, "y": 6, "w": 4, "h": 2 }, | ||
| "config": { | ||
| "label": "Words written this week", | ||
| "metric": "sum", | ||
| "metricField": "wordCount", | ||
| "filter": { "updatedAt": "this-week" } | ||
| } | ||
| }, | ||
| { | ||
| "id": "ct4", | ||
| "kind": "widget", | ||
| "widgetKind": "stat-card", | ||
| "layout": { "x": 8, "y": 6, "w": 4, "h": 2 }, | ||
| "config": { | ||
| "label": "In review", | ||
| "metric": "count", | ||
| "filter": { "profileSlug": "draft", "properties.status": "review" } | ||
| } | ||
| }, | ||
| { | ||
| "id": "ct5", | ||
| "kind": "widget", | ||
| "widgetKind": "entity-gallery", | ||
| "layout": { "x": 0, "y": 8, "w": 12, "h": 4 }, | ||
| "config": { | ||
| "profileSlug": "article", | ||
| "filters": [ | ||
| { "property": "source", "op": "eq", "value": "research" } | ||
| ], | ||
| "imageProperty": "thumbnail", | ||
| "limit": 12 | ||
| } | ||
| } | ||
| ] | ||
| } | ||
| } | ||
| ``` | ||
| --- | ||
| ## Recipe: Reading list | ||
| _User asks: "Show me my reading list."_ | ||
| Simple masonry/gallery + stats. | ||
| ```json | ||
| { | ||
| "name": "Reading", | ||
| "type": "bento", | ||
| "config": { | ||
| "blocks": [ | ||
| { | ||
| "id": "r1", | ||
| "kind": "widget", | ||
| "widgetKind": "section-header", | ||
| "layout": { "x": 0, "y": 0, "w": 12, "h": 1 }, | ||
| "config": { "title": "To read" } | ||
| }, | ||
| { | ||
| "id": "r2", | ||
| "kind": "widget", | ||
| "widgetKind": "entity-gallery", | ||
| "layout": { "x": 0, "y": 1, "w": 8, "h": 8 }, | ||
| "config": { | ||
| "profileSlug": "article", | ||
| "filters": [{ "property": "status", "op": "neq", "value": "read" }], | ||
| "sort": [{ "property": "createdAt", "direction": "desc" }], | ||
| "imageProperty": "thumbnail", | ||
| "captionProperty": "domain", | ||
| "limit": 24 | ||
| } | ||
| }, | ||
| { | ||
| "id": "r3", | ||
| "kind": "widget", | ||
| "widgetKind": "stat-card", | ||
| "layout": { "x": 8, "y": 1, "w": 4, "h": 2 }, | ||
| "config": { | ||
| "label": "Saved this week", | ||
| "metric": "count", | ||
| "filter": { "profileSlug": "article", "createdAt": "this-week" } | ||
| } | ||
| }, | ||
| { | ||
| "id": "r4", | ||
| "kind": "widget", | ||
| "widgetKind": "view-list", | ||
| "layout": { "x": 8, "y": 3, "w": 4, "h": 6 }, | ||
| "config": { | ||
| "profileSlug": "article", | ||
| "primaryField": "title", | ||
| "secondaryFields": ["readAt"], | ||
| "filters": [{ "property": "status", "op": "eq", "value": "read" }], | ||
| "sort": [{ "property": "readAt", "direction": "desc" }], | ||
| "limit": 10 | ||
| } | ||
| } | ||
| ] | ||
| } | ||
| } | ||
| ``` | ||
| --- | ||
| ## Recipe: Daily briefing | ||
| _User asks: "Every morning show me what matters."_ | ||
| Minimal. AI-driven. Designed to be scannable in 30 seconds. | ||
| ```json | ||
| { | ||
| "name": "Morning Briefing", | ||
| "type": "bento", | ||
| "config": { | ||
| "blocks": [ | ||
| { | ||
| "id": "m1", | ||
| "kind": "widget", | ||
| "widgetKind": "morning-briefing", | ||
| "layout": { "x": 0, "y": 0, "w": 12, "h": 4 } | ||
| }, | ||
| { | ||
| "id": "m2", | ||
| "kind": "widget", | ||
| "widgetKind": "view-list", | ||
| "layout": { "x": 0, "y": 4, "w": 6, "h": 5 }, | ||
| "config": { | ||
| "profileSlug": "task", | ||
| "primaryField": "title", | ||
| "secondaryFields": ["dueDate"], | ||
| "filters": [ | ||
| { "property": "dueDate", "op": "lte", "value": "today" }, | ||
| { | ||
| "property": "status", | ||
| "op": "in", | ||
| "value": ["todo", "in-progress"] | ||
| } | ||
| ], | ||
| "limit": 8 | ||
| } | ||
| }, | ||
| { | ||
| "id": "m3", | ||
| "kind": "widget", | ||
| "widgetKind": "view-calendar", | ||
| "layout": { "x": 6, "y": 4, "w": 6, "h": 5 }, | ||
| "config": { | ||
| "profileSlug": "event", | ||
| "dateProperty": "startDate", | ||
| "view": "day" | ||
| } | ||
| } | ||
| ] | ||
| } | ||
| } | ||
| ``` | ||
| --- | ||
| ## Recipe: Governance dashboard | ||
| _User asks: "Show me what my AI has been doing."_ | ||
| ```json | ||
| { | ||
| "name": "AI Activity", | ||
| "type": "bento", | ||
| "config": { | ||
| "blocks": [ | ||
| { | ||
| "id": "g1", | ||
| "kind": "widget", | ||
| "widgetKind": "stat-card", | ||
| "layout": { "x": 0, "y": 0, "w": 3, "h": 2 }, | ||
| "config": { | ||
| "label": "Pending proposals", | ||
| "metric": "count", | ||
| "filter": { "type": "proposal", "status": "pending" } | ||
| } | ||
| }, | ||
| { | ||
| "id": "g2", | ||
| "kind": "widget", | ||
| "widgetKind": "stat-card", | ||
| "layout": { "x": 3, "y": 0, "w": 3, "h": 2 }, | ||
| "config": { | ||
| "label": "Auto-approved (24h)", | ||
| "metric": "count", | ||
| "filter": { | ||
| "type": "action", | ||
| "source": "agent", | ||
| "status": "approved", | ||
| "createdAt": "last-24h" | ||
| } | ||
| } | ||
| }, | ||
| { | ||
| "id": "g3", | ||
| "kind": "widget", | ||
| "widgetKind": "stat-card", | ||
| "layout": { "x": 6, "y": 0, "w": 3, "h": 2 }, | ||
| "config": { | ||
| "label": "Agents connected", | ||
| "metric": "count", | ||
| "filter": { "type": "agent", "status": "active" } | ||
| } | ||
| }, | ||
| { | ||
| "id": "g4", | ||
| "kind": "widget", | ||
| "widgetKind": "stat-card", | ||
| "layout": { "x": 9, "y": 0, "w": 3, "h": 2 }, | ||
| "config": { | ||
| "label": "Entities created (7d)", | ||
| "metric": "count", | ||
| "filter": { "source": "agent", "createdAt": "this-week" } | ||
| } | ||
| }, | ||
| { | ||
| "id": "g5", | ||
| "kind": "widget", | ||
| "widgetKind": "proposals-list", | ||
| "layout": { "x": 0, "y": 2, "w": 6, "h": 6 }, | ||
| "config": { "status": "pending", "limit": 15 } | ||
| }, | ||
| { | ||
| "id": "g6", | ||
| "kind": "widget", | ||
| "widgetKind": "agent-activity", | ||
| "layout": { "x": 6, "y": 2, "w": 6, "h": 6 }, | ||
| "config": { "limit": 20 } | ||
| } | ||
| ] | ||
| } | ||
| } | ||
| ``` | ||
| --- | ||
| ## Composition tips | ||
| - **Row-by-row thinking.** Each row is one visual theme. Mixing themes in the same row confuses the eye. | ||
| - **Start tall, shrink later.** It's easier to shrink an oversized block than to realize a tight block feels cramped. | ||
| - **Use `section-header` between themes.** Readers parse visual separators faster than mental ones. | ||
| - **Keep stat-cards together in a strip.** Four stats at 3×2 each = one clean row. Four stats scattered = noise. | ||
| - **End with the feed.** Activity feeds work best as the last row — they're where the eye lands for recency. | ||
| - **One primary view per bento.** The user should know what the bento is "about" at a glance. If you have two headline views, split into two bentos. | ||
| - **Show, don't hide.** Putting the most important info behind a widget that needs interaction is a trap. Top-left gets the most attention — put the answer there. |
| --- | ||
| name: synap-ui | ||
| description: > | ||
| Use this skill when the user wants to BUILD interface in Synap — creating views, | ||
| dashboards, bento layouts, or whole workspaces over their data. Triggers: | ||
| "build me a dashboard for tracking X", "create a kanban for my projects", | ||
| "make a CRM workspace", "I want a feed view of my articles", "design a home | ||
| dashboard", "show my reading list as a gallery", "turn this into a | ||
| timeline/calendar/matrix", "generate a workspace for content creation / | ||
| sales / research / project management / fitness tracking", "arrange widgets | ||
| on my bento", "create a command / automation trigger". This skill PRESENTS | ||
| data — the underlying entities must already exist (use core `synap`) and | ||
| schema extensions happen via `synap-schema`. Always propose workspace creation | ||
| to the user before committing — workspaces are lenses on data, not silos, | ||
| and the user decides when a new lens is warranted. | ||
| metadata: | ||
| openclaw: | ||
| requires: | ||
| env: [SYNAP_HUB_API_KEY, SYNAP_POD_URL] | ||
| primaryEnv: SYNAP_HUB_API_KEY | ||
| homepage: https://synap.live | ||
| capabilities: [views, bento, workspaces, widgets] | ||
| os: [macos, linux, windows] | ||
| userInvocable: false | ||
| --- | ||
| # Synap — UI generation | ||
| You build the surfaces the user sees: views over their data, bento dashboards, full workspaces tuned for a domain. The core rule: **emergent complexity.** A workspace is a lens; a view is a lens; a bento is a composition of lenses. Everything renders through the cell system, nothing is hardcoded. | ||
| ## Before you build anything | ||
| Always inventory. Never hallucinate view types, widget kinds, or profiles. | ||
| ``` | ||
| GET /api/hub/manifest | ||
| → static capability map: view types, bento block kinds, inline patterns, browser-native cells | ||
| (call once per session — no DB queries, safe to cache) | ||
| GET /api/hub/profiles?userId={userId}&workspaceId={workspaceId} | ||
| → what data exists | ||
| GET /api/hub/widget-definitions?workspaceId={workspaceId} | ||
| → [{ kind, category, label, description, configSchema, supportedContexts }] | ||
| GET /api/hub/views?userId={userId}&workspaceId={workspaceId} | ||
| → [{ id, name, type, profileSlug, config }] | ||
| ``` | ||
| Widget definitions are the source of truth for which cells are installed and how to configure them. **Never guess cell kinds.** If a cell doesn't appear in the registry, don't reference it (unless it's a browser-native cell from the manifest). | ||
| ## Four things you can build | ||
| 1. **Views** — named queries + rendering config over entities of a given profile. Kanban of tasks, gallery of articles, calendar of events. | ||
| 2. **Bento dashboards** — 12-col grid compositions of cells (view-cards, entity-cards, widgets). The Home dashboard is a bento. Workspace landing pages are bentos. | ||
| 3. **Workspaces** — full lenses with profiles, views, a bento, and seed entities. The biggest building block. | ||
| 4. **New cell types** (Capability B) — AI can define entirely new rendering cells when no existing widget covers the need. Cells run in an iframe sandbox and are always proposal-gated — the user reviews before they appear in the registry. | ||
| ```json | ||
| POST /api/hub/cells/define | ||
| { | ||
| "userId": "{userId}", | ||
| "workspaceId": "{workspaceId}", | ||
| "kind": "burndown-chart", | ||
| "displayName": "Burndown Chart", | ||
| "description": "Sprint burndown over task completions", | ||
| "configSchema": { "sprintId": { "type": "string" } }, | ||
| "sandboxCode": "<!-- self-contained HTML/JS -->" | ||
| } | ||
| ``` | ||
| Always `GET /api/hub/widget-definitions` first — if a cell already covers the need, use it. New cell definitions are permanent; only create when genuinely novel. | ||
| ## View types (16 total, 12 implemented) | ||
| Pick one that matches the data's shape AND the user's intent: | ||
| | Type | Implemented | When it fits | | ||
| | ---------------- | ----------- | ---------------------------------------------------------- | | ||
| | `table` | yes | Dense data, many columns, sort/filter heavy | | ||
| | `list` | yes | Scan-friendly, compact rows (tasks, notes) | | ||
| | `grid` | yes | Card grid, medium density | | ||
| | `gallery` | yes | Image-forward cards (articles, bookmarks, products) | | ||
| | `kanban` | yes | Status pipelines (tasks by status, deals by stage) | | ||
| | `matrix` | yes | 2-axis grid (priority × urgency, effort × impact) | | ||
| | `masonry`/`feed` | yes | Pinterest-style, mixed-size cards; default for Library | | ||
| | `calendar` | yes | Date-indexed data (events, tasks by dueDate) | | ||
| | `flow` | yes | Node-edge diagrams (automations, mind maps) | | ||
| | `bento` | yes | Mixed composition (a dashboard-in-view) | | ||
| | `branch_tree` | yes | Hierarchical data (project → subtasks, threads → branches) | | ||
| | `whiteboard` | yes | Free-form canvas | | ||
| | `timeline` | no | (Defer) | | ||
| | `graph` | no | (Defer) | | ||
| | `gantt` | no | (Defer) | | ||
| | `mindmap` | no | (Defer) | | ||
| Decision: the data has statuses → `kanban`. Dates → `calendar`. Many columns → `table`. Mixed types → `masonry` or `bento`. Full reference in **`view-types.md`**. | ||
| ## Creating a view | ||
| ```json | ||
| POST /api/hub/views | ||
| { | ||
| "userId": "{userId}", | ||
| "workspaceId": "{workspaceId}", | ||
| "name": "Active Tasks by Project", | ||
| "type": "kanban", | ||
| "profileSlug": "task", | ||
| "config": { | ||
| "groupBy": { "property": "projectId" }, | ||
| "columns": [ | ||
| { "slug": "title" }, | ||
| { "slug": "priority" }, | ||
| { "slug": "dueDate" } | ||
| ], | ||
| "filters": [ | ||
| { "property": "status", "op": "in", "value": ["todo", "in-progress"] } | ||
| ], | ||
| "sort": [{ "property": "priority", "direction": "desc" }] | ||
| } | ||
| } | ||
| ``` | ||
| The `config` shape varies by view type — kanban needs `groupBy`, calendar needs a date property, gallery needs an image property. When in doubt, fetch an existing view of the same type first and mirror its structure. | ||
| ## Bento layouts | ||
| A bento is a 12-column react-grid-layout. Blocks reference **cells** by kind. | ||
| ```json | ||
| POST /api/hub/views // a bento is just a view with type="bento" | ||
| { | ||
| "userId": "{userId}", | ||
| "workspaceId": "{workspaceId}", | ||
| "name": "Content Creation Home", | ||
| "type": "bento", | ||
| "config": { | ||
| "blocks": [ | ||
| { "id": "b1", "kind": "view", "viewId": "<kanbanId>", | ||
| "layout": { "x": 0, "y": 0, "w": 8, "h": 4 } }, | ||
| { "id": "b2", "kind": "entity", "entityId": "ent_current_project", | ||
| "layout": { "x": 8, "y": 0, "w": 4, "h": 4 } }, | ||
| { "id": "b3", "kind": "widget", "widgetKind": "quick-access", | ||
| "layout": { "x": 0, "y": 4, "w": 6, "h": 2 }, | ||
| "config": { "items": [ … ] } }, | ||
| { "id": "b4", "kind": "widget", "widgetKind": "stat-card", | ||
| "layout": { "x": 6, "y": 4, "w": 6, "h": 2 }, | ||
| "config": { "metric": "entities_created_this_week" } } | ||
| ] | ||
| } | ||
| } | ||
| ``` | ||
| Block kinds: | ||
| - `view` — embeds a saved view by `viewId` | ||
| - `entity` — renders an entity card for a specific `entityId` | ||
| - `widget` — renders a registered cell by `widgetKind` with `config` | ||
| Full widget catalog in **`widget-catalog.md`**. Layout patterns in **`bento-recipes.md`**. | ||
| ## Creating or proposing a workspace | ||
| **Always ask before creating.** Workspaces are big objects with profiles, views, members, bento, and seed data. Commit only after user confirms. | ||
| The canonical flow: | ||
| 1. **Assemble a proposal** (no API call yet): | ||
| ```js | ||
| const proposal = { | ||
| name: "Content Creation", | ||
| description: "Draft, review, and publish articles", | ||
| icon: "pen-tool", | ||
| color: "purple", | ||
| profiles: [ // reuse system profiles by slug OR include custom ones | ||
| { slug: "article", reuse: true }, | ||
| { slug: "draft", displayName: "Draft", parentSlug: "article", | ||
| properties: [ | ||
| { slug: "status", valueType: "string", constraints: { enum: ["idea","writing","review","published"] }, uiHints: { displayAs: "status" } }, | ||
| { slug: "wordCount", valueType: "number" }, | ||
| { slug: "publishDate", valueType: "date" } | ||
| ] | ||
| } | ||
| ], | ||
| views: [ | ||
| { name: "Pipeline", type: "kanban", profileSlug: "draft", | ||
| config: { groupBy: { property: "status" } } }, | ||
| { name: "Published", type: "gallery", profileSlug: "article", | ||
| config: { filters: [{ property: "status", op: "eq", value: "published" }] } } | ||
| ], | ||
| bento: { blocks: [ … ] }, | ||
| seedEntities: [] // optional | ||
| } | ||
| ``` | ||
| 2. **Show it to the user**. Compact, readable. "Here's what I'd create — 2 profiles, 2 views, a bento. Ship it?" | ||
| 3. **On yes**, commit through `/api/hub/workspaces`: | ||
| ```json | ||
| POST /api/hub/workspaces | ||
| { "userId": "{userId}", "proposal": { /* the object above */ } } | ||
| ``` | ||
| This goes through governance — `workspace.create` is **always** proposal-gated even for agents (see `../synap/governance.md`). Expect `status: "proposed"` and tell the user they'll see it in Proposals. | ||
| 4. **On no**, don't commit. Offer to adjust. | ||
| ## Proposing vs. extending | ||
| Before proposing a new workspace, ask: does one of the user's existing workspaces fit? A "Content" workspace and a "Writing" workspace are the same lens. Adding a view to the existing workspace is almost always better than creating a new one. | ||
| Create new when: | ||
| - The user explicitly asks for it ("new workspace for…") | ||
| - The data and access patterns are genuinely orthogonal to existing workspaces | ||
| - A different team/collaborator set makes sense | ||
| Otherwise: add a view, add a bento block, add properties — don't multiply workspaces. | ||
| ## Worked example — "Make me a CRM" | ||
| 1. Inventory. User already has `person`, `contact`, `company`, `deal`, `event` profiles (all system). | ||
| 2. No new profiles needed. The CRM is a **lens**, not new data. | ||
| 3. Propose (before committing): | ||
| - Workspace name: "CRM" | ||
| - Views: | ||
| - `Deals Pipeline` — kanban on `deal`, groupBy `stage` | ||
| - `Contacts` — table on `contact`, columns: name, role, company, lastInteraction | ||
| - `Companies` — gallery on `company` (logo-forward) | ||
| - `Upcoming Meetings` — calendar on `event`, filter `relatedToContact` | ||
| - Bento: | ||
| - Top: `deals pipeline` view (8 cols × 4 rows) | ||
| - Side: `stat-card` — "Deals in pipeline: $X" (4 cols × 2 rows) | ||
| - Side: `stat-card` — "Meetings this week: N" (4 cols × 2 rows) | ||
| - Bottom: `recent-activity` widget (12 cols × 3 rows) | ||
| 4. Show to user. Confirm. | ||
| 5. Commit via `POST /workspaces`. | ||
| ## Arranging a bento after creation | ||
| ```json | ||
| POST /api/hub/views/{bentoViewId}/arrange | ||
| { "userId": "{userId}", "blocks": [ /* full new blocks array */ ] } | ||
| ``` | ||
| `bento.arrange` is auto-approved by default. Safe to run without hesitation when the user rearranges or adds widgets. | ||
| ## Common mistakes | ||
| 1. **Creating a workspace without asking.** Always propose + confirm. Workspaces are too big to auto-commit. | ||
| 2. **Guessing widget kinds.** Always `GET /widget-definitions` first. A `kind` that isn't in the registry won't render. | ||
| 3. **Reinventing views.** Check existing views first — a kanban for tasks probably exists. | ||
| 4. **Creating a new profile when UI is the real need.** Don't create `client` profile for a "contacts who are clients" view — just create a filtered view on `contact`. | ||
| 5. **Putting unrelated data in one bento.** A bento tells a story ("my week", "this project", "content pipeline"). Kitchen-sink bentos overwhelm the user. | ||
| 6. **Ignoring color/icon.** Profiles and workspaces both take `uiHints.icon` and `uiHints.color` — set them. Untitled gray workspaces feel like a bug. | ||
| 7. **Hardcoding config for view types you haven't checked.** Each view type's `config` shape is different. Get an example from `/views` first. | ||
| 8. **Forgetting entityScope implications.** A view on a pod-scope profile (`note`) will show entities from every workspace the user can access — filter appropriately if you want workspace-local results. | ||
| ## AI Companion integration | ||
| When you create views or entities for the user inside the AI Companion, **always emit inline pattern chips** at the end of your reply so the user can jump directly to what you built. | ||
| ``` | ||
| // After creating a kanban view with ID "abc123": | ||
| "Created your tasks pipeline → [[view:abc123|Active Tasks]] · [[open:side|view:abc123]]" | ||
| // After creating a workspace (home bento view ID "def456"): | ||
| "Workspace ready — [[open:main|view:def456|Home Dashboard]]" | ||
| // After creating an entity (e.g. a new project): | ||
| "Project created → [[entity:proj_789|Q3 Launch]]" | ||
| ``` | ||
| ### Special cell keys (browser-native) | ||
| These cell keys are registered in the browser app but may not appear in `GET /api/hub/widget-definitions` (they are Electron-native, not server-seeded): | ||
| | Cell key | Where | Notes | | ||
| | --------------- | ------------------ | ------------------------------------------------------------ | | ||
| | `ai-companion` | Browser sidebar | The Companion chat panel itself — don't embed in bentos | | ||
| | `iframe-widget` | Bento blocks | Sandboxed iframe for custom embeds; requires `src` in config | | ||
| | `entity-detail` | Side panel / modal | Generic entity detail renderer — always available | | ||
| | `entity-list` | Bento / views | List of entities for a given profile | | ||
| **Rule:** If a cell key is not in `GET /api/hub/widget-definitions`, do NOT reference it in bento config unless it is one of the four browser-native keys above. Unknown keys will silently fail to render. | ||
| ## When you need more | ||
| - Full per-view-type `config` shapes → **`view-types.md`** | ||
| - Complete widget/cell catalog + configSchemas → **`widget-catalog.md`** | ||
| - Ready-to-reuse bento layouts for common use cases → **`bento-recipes.md`** | ||
| - Creating the underlying data → use core **`synap`** skill | ||
| - Extending profiles with new fields before building views → use **`synap-schema`** skill |
| # View types — reference | ||
| Each view type has its own `config` shape. This file covers the 12 implemented types with their required/optional fields. | ||
| All views share a base shape: | ||
| ```ts | ||
| { | ||
| name: string, | ||
| type: ViewType, | ||
| profileSlug?: string, // which entity profile to query (required for entity views) | ||
| description?: string, | ||
| config: ViewTypeConfig // type-specific, see below | ||
| } | ||
| ``` | ||
| Common sub-objects: | ||
| ```ts | ||
| // Filter — combine in arrays for AND; use { or: [...] } for OR | ||
| type Filter = { | ||
| property: string; | ||
| op: | ||
| | "eq" | ||
| | "neq" | ||
| | "gt" | ||
| | "gte" | ||
| | "lt" | ||
| | "lte" | ||
| | "in" | ||
| | "nin" | ||
| | "contains" | ||
| | "exists"; | ||
| value: unknown; | ||
| }; | ||
| // Sort | ||
| type Sort = { property: string; direction: "asc" | "desc" }; | ||
| // Column (for tabular views) | ||
| type Column = { slug: string; width?: number; label?: string }; | ||
| ``` | ||
| --- | ||
| ## `table` | ||
| Dense data. Sort, filter, resize columns. | ||
| ```ts | ||
| config: { | ||
| columns: Column[], | ||
| filters?: Filter[], | ||
| sort?: Sort[], | ||
| pageSize?: number, // default 50 | ||
| groupBy?: { property: string } // optional row grouping | ||
| } | ||
| ``` | ||
| Best for: tasks with many fields, deals with pipeline data, contacts with CRM attributes. | ||
| ## `list` | ||
| Scan-friendly rows. Shows title + 2–3 properties per row. | ||
| ```ts | ||
| config: { | ||
| primaryField: string, // usually "title" | ||
| secondaryFields: string[], // 2–3 properties shown as meta | ||
| filters?: Filter[], | ||
| sort?: Sort[] | ||
| } | ||
| ``` | ||
| Best for: tasks, notes, messages, action items. | ||
| ## `grid` | ||
| Uniform card grid. | ||
| ```ts | ||
| config: { | ||
| cardFields: string[], // properties shown on each card | ||
| filters?: Filter[], | ||
| sort?: Sort[], | ||
| density?: "compact" | "comfortable" | "spacious" | ||
| } | ||
| ``` | ||
| Best for: mixed content where title + 2 properties is enough. | ||
| ## `gallery` | ||
| Image-forward cards. Requires a property that holds an image URL. | ||
| ```ts | ||
| config: { | ||
| imageProperty: string, // e.g., "thumbnail", "favicon", "cover" | ||
| titleProperty?: string, // default "title" | ||
| captionProperty?: string, | ||
| filters?: Filter[], | ||
| sort?: Sort[] | ||
| } | ||
| ``` | ||
| Best for: articles, bookmarks, products, books, photos. | ||
| ## `kanban` | ||
| Status pipeline. Requires `groupBy` on an enum/status property. | ||
| ```ts | ||
| config: { | ||
| groupBy: { property: string }, // MUST be set — column grouping | ||
| cardFields: string[], | ||
| filters?: Filter[], | ||
| sort?: Sort[], | ||
| columnOrder?: string[] // force column order | ||
| } | ||
| ``` | ||
| Best for: tasks by status, deals by stage, drafts by workflow step. | ||
| ## `matrix` | ||
| 2-axis grid. Requires two `groupBy` properties. | ||
| ```ts | ||
| config: { | ||
| xAxis: { property: string, buckets?: string[] | number[] }, | ||
| yAxis: { property: string, buckets?: string[] | number[] }, | ||
| cardFields?: string[], | ||
| filters?: Filter[] | ||
| } | ||
| ``` | ||
| Best for: priority × urgency (Eisenhower), effort × impact, stage × owner. | ||
| ## `masonry` / `feed` | ||
| Pinterest-style, variable-size cards. Default for Library. | ||
| ```ts | ||
| config: { | ||
| cardFields: string[], | ||
| filters?: Filter[], | ||
| sort?: Sort[], | ||
| variableHeight: true // cards size themselves to content | ||
| } | ||
| ``` | ||
| Best for: mixed content types, inspiration boards, library browsing. | ||
| ## `calendar` | ||
| Date-indexed. Requires a date property. | ||
| ```ts | ||
| config: { | ||
| dateProperty: string, // e.g., "dueDate", "startDate" | ||
| endDateProperty?: string, // for events with duration | ||
| view?: "month" | "week" | "day" | "agenda", | ||
| titleProperty?: string, | ||
| colorBy?: { property: string }, | ||
| filters?: Filter[] | ||
| } | ||
| ``` | ||
| Best for: events, tasks with dueDate, drafts with publishDate. | ||
| ## `flow` | ||
| Node-edge graph. Fully custom — mostly used for automations and mindmaps. | ||
| ```ts | ||
| config: { | ||
| nodes: { id, type, position: {x,y}, data }[], | ||
| edges: { id, source, target, type? }[], | ||
| fitView?: boolean | ||
| } | ||
| ``` | ||
| Best for: automations, workflow diagrams, mind maps, decision trees. Usually populated programmatically by the automation builder, not hand-authored. | ||
| ## `bento` | ||
| A mixed composition of cells. See `widget-catalog.md` and `bento-recipes.md` for block kinds and ready-to-use layouts. | ||
| ```ts | ||
| config: { | ||
| blocks: BentoBlock[], // see bento section | ||
| gridColumns?: 12, // default 12 | ||
| rowHeight?: number // px per grid row | ||
| } | ||
| ``` | ||
| Best for: dashboards, workspace home pages, project overview pages. | ||
| ## `branch_tree` | ||
| Hierarchical data with parent-child relationships. | ||
| ```ts | ||
| config: { | ||
| parentProperty: string, // e.g., "parentTaskId", "parentProjectId" | ||
| titleProperty?: string, | ||
| cardFields?: string[], | ||
| expandDepth?: number // default 2 | ||
| } | ||
| ``` | ||
| Best for: projects with subtasks, topic hierarchies, org charts, file trees. | ||
| ## `whiteboard` | ||
| Free-form canvas. Sparse config — most state is in the canvas itself. | ||
| ```ts | ||
| config: { | ||
| canvasId: string, // links to the yjs doc | ||
| defaultTool?: "pen" | "rect" | "arrow" | "text" | ||
| } | ||
| ``` | ||
| Best for: brainstorming, sketches, visual thinking. Rarely generated by AI — user-authored. | ||
| --- | ||
| ## Picking a view type | ||
| Work from the data, not from the request: | ||
| | User says | Look at data | Pick | | ||
| | ------------------------------- | ------------------------------------ | ------------------------------------------------------ | | ||
| | "track tasks" | has `status` (enum) | `kanban` | | ||
| | "what's due this week" | has `dueDate` | `calendar` | | ||
| | "my reading list" | articles / bookmarks with thumbnails | `gallery` | | ||
| | "dashboard for X" | mixed data, 4+ types of info | `bento` | | ||
| | "pipeline", "stages" | has ordered enum property | `kanban` | | ||
| | "roadmap", "timeline" | has start + end dates | defer (unsupported) — use `calendar` or `list` grouped | | ||
| | "team directory" | people with photos | `gallery` | | ||
| | "urgent vs. important" | has 2 enum dimensions | `matrix` | | ||
| | "project hierarchy" | has parent-child relation | `branch_tree` | | ||
| | "everything", "library" | mixed profiles | `masonry`/`feed` or `bento` | | ||
| | "data", "database", "inventory" | dense, many columns | `table` | | ||
| If in doubt: `list` is the safe default for any entity type. Always better than guessing wrong. | ||
| ## Updating vs. creating | ||
| - `POST /views` — create new view (auto-approved for agents) | ||
| - `PATCH /views/:viewId` — update config (proposal-gated by default; the user owns their views) | ||
| - `POST /views/:viewId/arrange` — bento-specific, rearrange blocks (auto-approved) | ||
| When the user says "change my kanban to group by priority instead of status," that's a PATCH — expect a proposal. Explain this to the user. | ||
| ## Multiple views over the same data | ||
| Views are cheap. A single `task` profile can have 10 views: kanban by status, kanban by project, calendar by dueDate, list of overdue, matrix priority × urgency, gallery of completed. Each view is one `POST /views` call. Don't try to make one mega-view that satisfies every need. |
| # Widget catalog — reference | ||
| Widgets (cells) are the universal rendering unit. A bento is composed of cells. Views embed cells. Side panels host cells. | ||
| **Never guess a widget kind.** Always call `GET /api/hub/widget-definitions?workspaceId={workspaceId}` first — the response is the authoritative registry for what's installed. | ||
| This file is a categorized snapshot of what typically exists in a Synap pod. Use it for planning ("can I build X?") — but verify against the registry before committing. | ||
| ## How widget references work in bentos | ||
| ```json | ||
| { | ||
| "id": "block-123", | ||
| "kind": "widget", | ||
| "widgetKind": "stat-card", | ||
| "config": { | ||
| /* widget-specific, see configSchema in registry */ | ||
| }, | ||
| "layout": { "x": 0, "y": 0, "w": 4, "h": 2 } | ||
| } | ||
| ``` | ||
| `widgetKind` is a string matching a registered cell. `config` must validate against the cell's `configSchema` (returned by `/widget-definitions`). | ||
| ## Categories | ||
| The registry tags each widget with a category: | ||
| - `core` — universal layout primitives (stat, section-header, quick-access) | ||
| - `data` — entity-driven (entity-card, entity-gallery, view embeds) | ||
| - `ai` — AI outputs (proactive cards, proposals, chat) | ||
| - `entity` — entity-detail views and editors | ||
| - `communication` — channels, threads, messages | ||
| - `governance` — proposals, approvals | ||
| - `content` — documents, articles, rich media | ||
| ## Core widgets (layout primitives — always available) | ||
| ### `stat-card` | ||
| Single metric on a card. Best for top-of-dashboard KPIs. | ||
| ```json | ||
| { | ||
| "widgetKind": "stat-card", | ||
| "config": { | ||
| "label": "Tasks completed this week", | ||
| "metric": "count", | ||
| "filter": { | ||
| "profileSlug": "task", | ||
| "properties.status": "done", | ||
| "updatedAt.gte": "this-week" | ||
| }, | ||
| "trend": true, // show vs. last period | ||
| "icon": "check-circle" | ||
| } | ||
| } | ||
| ``` | ||
| ### `section-header` | ||
| Title + optional subtitle. Separator for bento rows. | ||
| ```json | ||
| { | ||
| "widgetKind": "section-header", | ||
| "config": { "title": "This week", "subtitle": "Updated just now" } | ||
| } | ||
| ``` | ||
| ### `quick-access` | ||
| Shortcut grid — a row of entity or view pins. | ||
| ```json | ||
| { | ||
| "widgetKind": "quick-access", | ||
| "config": { | ||
| "items": [ | ||
| { "kind": "view", "viewId": "...", "label": "Inbox" }, | ||
| { | ||
| "kind": "entity", | ||
| "entityId": "ent_project_...", | ||
| "label": "Current project" | ||
| }, | ||
| { "kind": "url", "url": "https://...", "label": "Calendar" } | ||
| ] | ||
| } | ||
| } | ||
| ``` | ||
| ### `feed` | ||
| Activity feed — recent entity mutations, AI actions, proposals. | ||
| ```json | ||
| { | ||
| "widgetKind": "feed", | ||
| "config": { | ||
| "sources": ["entity.create", "entity.update", "proposal.approved"], | ||
| "limit": 20, | ||
| "filter": { "profileSlug": ["task", "note"] } // optional | ||
| } | ||
| } | ||
| ``` | ||
| ### `inbox` | ||
| Unread + actionable items. Proposals, mentions, due tasks. | ||
| ```json | ||
| { | ||
| "widgetKind": "inbox", | ||
| "config": { "categories": ["proposals", "mentions", "due_today"] } | ||
| } | ||
| ``` | ||
| ## Data widgets | ||
| ### `entity-card` | ||
| One entity, rich rendering. | ||
| ```json | ||
| { | ||
| "widgetKind": "entity-card", | ||
| "config": { | ||
| "entityId": "ent_...", | ||
| "fields": ["title", "status", "dueDate", "assignee"], | ||
| "showRelations": true | ||
| } | ||
| } | ||
| ``` | ||
| ### `entity-gallery` | ||
| Gallery of entities filtered by a query. | ||
| ```json | ||
| { | ||
| "widgetKind": "entity-gallery", | ||
| "config": { | ||
| "profileSlug": "article", | ||
| "filters": [{ "property": "status", "op": "eq", "value": "unread" }], | ||
| "sort": [{ "property": "createdAt", "direction": "desc" }], | ||
| "limit": 12, | ||
| "imageProperty": "thumbnail" | ||
| } | ||
| } | ||
| ``` | ||
| ### `entity-spotlight` | ||
| One featured entity, large format. Often the "current project" or "today's focus." | ||
| ```json | ||
| { | ||
| "widgetKind": "entity-spotlight", | ||
| "config": { "entityId": "ent_...", "showDocument": true } | ||
| } | ||
| ``` | ||
| ### `view` (generic view embed) | ||
| Any saved view rendered inside a bento. Usually easier than configuring widgets individually. | ||
| ```json | ||
| { | ||
| "kind": "view", | ||
| "viewId": "<savedViewId>", | ||
| "layout": { "x": 0, "y": 0, "w": 12, "h": 6 } | ||
| } | ||
| ``` | ||
| Note: `{ "kind": "view", "viewId": … }` is a bento block type, not a widget. Use it when you have a saved view and just want to embed it. | ||
| ### `view-kanban` / `view-table` / `view-calendar` / `view-grid` / `view-list` | ||
| Inline view configs — no saved view required. Good for one-off dashboard pieces. | ||
| ```json | ||
| { | ||
| "widgetKind": "view-kanban", | ||
| "config": { | ||
| "profileSlug": "task", | ||
| "groupBy": { "property": "status" }, | ||
| "filters": [{ "property": "projectId", "op": "eq", "value": "ent_current" }] | ||
| } | ||
| } | ||
| ``` | ||
| ## Entity widgets (for entity-detail pages / side panels) | ||
| - `entity-detail` — the full entity view (fields, properties, related) | ||
| - `document-editor` — rich markdown editor for a document | ||
| - `entity-relationships` — graph/list of connected entities | ||
| - `entity-properties` — the properties panel (forms) | ||
| Mostly used inside entity pages, not bentos. | ||
| ## AI widgets | ||
| ### `proactive-feed` | ||
| AI nudges and insights the user's agents posted proactively. | ||
| ```json | ||
| { | ||
| "widgetKind": "proactive-feed", | ||
| "config": { "limit": 10, "categories": ["insight", "nudge", "digest"] } | ||
| } | ||
| ``` | ||
| ### `morning-briefing` / `weekly-digest` / `health-check` / `insight` | ||
| Proactive cards rendered individually. Usually only appear after the Proactive Intelligence Layer has posted — not manually composed by an agent. | ||
| ### `ai-chat` | ||
| Embedded chat surface targeting a specific channel. | ||
| ```json | ||
| { | ||
| "widgetKind": "ai-chat", | ||
| "config": { "channelId": "ch_...", "mode": "compact" } | ||
| } | ||
| ``` | ||
| ### `recent-chats` | ||
| List of recent AI conversations. | ||
| ### `agent-activity` | ||
| What the user's agents have been doing (actions, proposals, writes). Good for governance bentos. | ||
| ## Governance widgets | ||
| - `proposals-list` — pending proposals needing review | ||
| - `proposal-detail` — single proposal card | ||
| - `proposal-timeline` — history of proposal approvals/rejections | ||
| ```json | ||
| { | ||
| "widgetKind": "proposals-list", | ||
| "config": { "status": "pending", "limit": 10 } | ||
| } | ||
| ``` | ||
| ## Communication widgets | ||
| - `channel` — full channel (messages + composer) | ||
| - `channel-navigator` — sidebar-style channel list | ||
| - `channel-view` — read-only channel embed | ||
| - `channel-feed` — activity-style feed of messages | ||
| ## Intelligence widgets (Intelligence Service specific) | ||
| - `service-status` — IS health | ||
| - `usage` — token consumption, model usage | ||
| - `agents` — registered agents list | ||
| - `agent-detail` — one agent's config | ||
| - `skills` — installed skills | ||
| - `tasks` — IS-managed tasks (not entities) | ||
| ## Workflow widgets | ||
| - `workflow-list` — all automations | ||
| - `automation-detail` / `automation-flow` / `automation-status` | ||
| - `command-detail` — one command config | ||
| - `trigger-button` — a button that runs a command | ||
| - `run-history` — past automation runs | ||
| ## Layout guidelines | ||
| The bento grid is 12 columns. Typical widget sizes: | ||
| | Widget | Typical `w`, `h` | | ||
| | ------------------ | ---------------- | | ||
| | `stat-card` | 3×2 | | ||
| | `section-header` | 12×1 | | ||
| | `quick-access` | 6×2 or 12×2 | | ||
| | `view-kanban` | 8×4 or 12×6 | | ||
| | `view-calendar` | 8×4 or 12×6 | | ||
| | `entity-spotlight` | 4×4 | | ||
| | `entity-gallery` | 6×4 or 12×4 | | ||
| | `feed` / `inbox` | 4×6 or 6×6 | | ||
| | `proactive-feed` | 4×6 | | ||
| | `proposals-list` | 6×4 | | ||
| | `agent-activity` | 6×4 | | ||
| Rules of thumb: | ||
| - Don't make anything shorter than 2 rows (too cramped). | ||
| - Tall narrow feeds (4×6) work better than short wide ones. | ||
| - Put `section-header` (12×1) as the first row of a visual group. | ||
| - Limit a bento to 8–12 blocks. Past that, split into a second bento or a dedicated view. | ||
| ## Common mistakes | ||
| 1. **Referencing a `widgetKind` that doesn't exist in the registry.** The bento will render an error block. Always fetch the registry first. | ||
| 2. **Passing a `config` that doesn't match the widget's `configSchema`.** Returns a validation error; the widget shows "invalid config" in UI. | ||
| 3. **Using a widget that depends on a missing profile.** If you use `entity-gallery` with `profileSlug: "podcast"` and `podcast` doesn't exist, the widget shows an empty state. Verify first. | ||
| 4. **Overlapping layout rectangles.** react-grid-layout will resolve it by shifting blocks, but the output won't match your intent. Double-check `x + w <= 12` and no two blocks share the same cells. | ||
| 5. **Putting an `ai-chat` widget on a dashboard.** It works but rarely what the user wants — the chat app is already one tab away. Reserve for edge cases like project-specific chat pinned to a project home. |
| # Capture pipeline — reference | ||
| Use the capture pipeline when the user pastes a block of unstructured text (email, meeting transcript, LinkedIn bio, article, screenshot of a whiteboard) and you need to extract multiple entities with their relations. | ||
| Chaining manual `POST /entities` + `POST /relations` for this is wasteful — the pipeline extracts everything in one server-side LLM call and returns proposals you can review before committing. | ||
| ## Two-step flow | ||
| ### 1. Structure the text | ||
| ```json | ||
| POST /api/hub/capture/structure | ||
| { | ||
| "userId": "{userId}", | ||
| "workspaceId": "{workspaceId}", | ||
| "text": "Had lunch with Sarah Chen from Acme Corp today. \ | ||
| She's leading their Series B and asked me to send \ | ||
| our sales deck by Friday. Mentioned her VP Engineering \ | ||
| Tom Walker also wants a demo.", | ||
| "context": { "source": "chat", "channelId": "ch_…" }, // optional | ||
| "profileSlugs": ["person", "company", "task", "event"] // optional filter | ||
| } | ||
| ``` | ||
| Response: | ||
| ```json | ||
| { | ||
| "proposals": [ | ||
| { | ||
| "tempId": "t1", | ||
| "profileSlug": "person", | ||
| "title": "Sarah Chen", | ||
| "properties": { "companyId": "t2" }, | ||
| "action": "create" | ||
| }, | ||
| { | ||
| "tempId": "t2", | ||
| "profileSlug": "company", | ||
| "title": "Acme Corp", | ||
| "properties": {}, | ||
| "action": "create" | ||
| }, | ||
| { | ||
| "tempId": "t3", | ||
| "profileSlug": "person", | ||
| "title": "Tom Walker", | ||
| "properties": { "role": "VP Engineering", "companyId": "t2" }, | ||
| "action": "create" | ||
| }, | ||
| { | ||
| "tempId": "t4", | ||
| "profileSlug": "task", | ||
| "title": "Send sales deck to Sarah", | ||
| "properties": { | ||
| "status": "todo", | ||
| "dueDate": "2026-04-24", | ||
| "assignee": null | ||
| }, | ||
| "action": "create" | ||
| }, | ||
| { | ||
| "tempId": "t5", | ||
| "profileSlug": "event", | ||
| "title": "Lunch with Sarah", | ||
| "properties": { "startDate": "2026-04-20", "attendees": ["t1"] }, | ||
| "action": "create" | ||
| } | ||
| ], | ||
| "relations": [ | ||
| { | ||
| "sourceTempId": "t4", | ||
| "targetTempId": "t1", | ||
| "relationType": "for_person" | ||
| }, | ||
| { | ||
| "sourceTempId": "t4", | ||
| "targetTempId": "t5", | ||
| "relationType": "from_meeting" | ||
| } | ||
| ], | ||
| "followUp": "Should I also schedule a reminder to follow up with Tom?" | ||
| } | ||
| ``` | ||
| **`tempId` is only valid within this response.** It's used to link proposals together before they have real entity IDs. | ||
| **`action` can be:** | ||
| - `"create"` — new entity | ||
| - `"update"` — existing entity found by title match; `existingEntityId` will be set | ||
| - `"skip"` — duplicate already exists, nothing to do | ||
| ### 2. Execute (commit) after user confirmation | ||
| Present the proposals to the user. Let them edit, remove, or add items. Then: | ||
| ```json | ||
| POST /api/hub/capture/execute | ||
| { | ||
| "userId": "{userId}", | ||
| "workspaceId": "{workspaceId}", | ||
| "entities": [ /* edited proposals array */ ], | ||
| "relations": [ /* edited relations array */ ] | ||
| } | ||
| ``` | ||
| Response: | ||
| ```json | ||
| { | ||
| "created": [{ "tempId": "t1", "entityId": "ent_real_1" }, …], | ||
| "updated": [{ "tempId": "t2", "entityId": "ent_existing" }, …], | ||
| "skipped": [{ "tempId": "t5", "reason": "duplicate" }], | ||
| "relations": { "created": 2, "failed": 0 }, | ||
| "status": "approved" | ||
| } | ||
| ``` | ||
| The executor goes through governance (see `governance.md`). Expect the same three `status` values. | ||
| ## When to use the pipeline vs. manual CRUD | ||
| | Situation | Use | | ||
| | ---------------------------------------------------------------- | --------------------------------------------------- | | ||
| | User pastes a chunk of text with multiple people/companies/tasks | Pipeline | | ||
| | User says "create a task to call Sarah at 3pm" | Manual create (1 entity) | | ||
| | User forwards an email | Pipeline | | ||
| | User asks "remind me to X" | Manual create | | ||
| | OCR'd screenshot, meeting transcript, article body | Pipeline | | ||
| | User edits an existing entity | Manual PATCH | | ||
| | User wants to save a webpage they're on | Manual create (article) + optional capture for body | | ||
| Rule of thumb: **one intent, one call.** Multi-entity content, use the pipeline. | ||
| ## Dedup within the pipeline | ||
| The pipeline does its own duplicate check per entity (by title + profileSlug within workspace). When it finds a match, `action` becomes `"update"` with `existingEntityId` set, so the real entity is updated in place, not duplicated. | ||
| You can still prefix with a manual search if you want to show the user "I found 3 existing people that might match" before running capture. But the pipeline alone is usually good enough. | ||
| ## Presenting proposals to the user | ||
| A good UX turn: | ||
| > I picked up **5 things** from that paste: | ||
| > | ||
| > - **Sarah Chen** — person at Acme Corp (new) | ||
| > - **Acme Corp** — company (new) | ||
| > - **Tom Walker** — person at Acme (new) | ||
| > - **Task**: Send sales deck to Sarah, due Friday | ||
| > - **Event**: Lunch with Sarah today | ||
| > | ||
| > Plus 2 connections: task → Sarah, task → lunch. | ||
| > | ||
| > Ship it? | ||
| Keep the user in control. Don't auto-execute without confirmation unless the user explicitly told you to. | ||
| ## Edge cases | ||
| - **Empty text → empty proposals.** Don't call execute with zero entities. | ||
| - **Ambiguous references ("he", "they").** The pipeline will often return null properties. Prompt the user to clarify before executing. | ||
| - **Dates.** Always absolute in responses (ISO 8601). If the input says "Friday," the pipeline resolves it against today. | ||
| - **Custom profiles.** If you want the pipeline to consider custom profiles, pass `profileSlugs` in the request. Otherwise it defaults to system profiles only. | ||
| - **Rate limits.** 20 captures/hour per user. If you hit the limit, fall back to manual CRUD. | ||
| ## Followup question | ||
| The response includes a `followUp` field — a single sentence question the pipeline thinks is worth asking next. Surface it to the user verbatim. It's a cheap way to deepen capture without extra prompts. |
| # Governance — reference | ||
| Synap queues some agent writes for human approval. This file covers what triggers a proposal, the auto-approve whitelist, how to handle each response status, and agent-user semantics. | ||
| ## Response statuses | ||
| Every write endpoint returns a `status` field. Handle all three. | ||
| ```json | ||
| { "status": "approved", "id": "ent_…", "message": "…" } | ||
| → The write committed. Use { id } normally. | ||
| { | ||
| "status": "proposed", | ||
| "proposalId": "prp_…", | ||
| "summary": "Delete task \"Q2 plan review\"", | ||
| "reasoning": "Destructive actions require your approval", | ||
| "reviewPath": "/proposals/prp_…", | ||
| "reviewUrl": "https://studio.synap.live/proposals/prp_…", | ||
| "message": "…" | ||
| } | ||
| → Queued for user review. Surface `summary` + `reviewUrl` to the user; do not retry. | ||
| { "status": "denied", "reason": "…" } | ||
| → Policy blocked the write. Explain the reason. Do not retry. | ||
| ``` | ||
| **`"proposed"` is not an error.** If your retry logic treats it as one, the system will create duplicate proposals. | ||
| ## What triggers a proposal | ||
| Two independent factors: | ||
| ### 1. Agent identity | ||
| Agent identity is determined by the API key. An agent-owned Hub API key (created via `POST /api/hub/setup/agent`) automatically attributes all requests to the agent user — no `agentUserId` field is needed in request bodies. The middleware resolves the agent from the key and tags writes with `source: "agent"`. | ||
| If the key belongs to a human user (personal API key), writes go through unless the workspace has `aiGovernance.forceProposals = true`. | ||
| ### 2. Action type | ||
| The auto-approve whitelist is a list of `subjectType.action` pairs. For example `entity.create`, `document.read`, `view.create`. | ||
| ## Default auto-approve whitelist | ||
| Agents can perform these actions directly without a proposal: | ||
| **Reads** (always, no gating): | ||
| - `search.*` | ||
| - `entity.read`, `document.read`, `relation.read` | ||
| - `memory.recall` | ||
| - `context.*` | ||
| - `filesystem.read` | ||
| **Writes** (auto-approved by default): | ||
| - `entity.create`, `entity.update` | ||
| - `relation.create` | ||
| - `document.create` | ||
| - `memory.store` (always auto-approved, never proposed) | ||
| - `view.create` | ||
| - `profile.create`, `profile.update` | ||
| - `property_def.create`, `property_def.update` | ||
| - `channel.create` | ||
| - `bento.arrange` | ||
| - `filesystem.write_workspace` (OpenClaw sandbox only) | ||
| **Proposal-gated** (always require approval when done by agents): | ||
| - `entity.delete`, `entity.archive`, `entity.purge` | ||
| - `view.update`, `view.delete` | ||
| - `profile.delete` | ||
| - `property_def.delete` | ||
| - `workspace.create`, `workspace.update`, `workspace.delete` | ||
| ## Destructive action override | ||
| In **agent-owned workspaces** (workspaces where the owner is an agent user, not a human), destructive actions (`delete`, `archive`, `purge`) **always propose** even if they appear in the whitelist. This prevents an agent from wiping its own workspace without human sign-off. | ||
| ## Workspace overrides | ||
| Each workspace has an `aiGovernance` settings object that can: | ||
| - **Replace the whitelist entirely** (`aiGovernance.autoApproveFor = ["entity.read", "search.*"]`) — this becomes the full allowed list; defaults no longer apply | ||
| - **Switch to agent-owned mode** (`settings.governanceMode = "agent-owned"`) — destructive actions (delete/archive/purge) always propose regardless of whitelist | ||
| - **Change who approves** (`aiGovernance.proposalApprovalPolicy = "admins_only" | "any_editor" | "owner_and_admins"`) | ||
| Don't try to infer the workspace's policy — either check explicitly (see "Runtime introspection" below) or just write and handle whatever `status` comes back. | ||
| ## Don't set `source` manually | ||
| `source` is set by the backend based on the auth context. Setting it manually in the request body is ignored. If your API key has an agentUserId, writes are tagged `source: "agent"` automatically. | ||
| ## The proposal lifecycle | ||
| When a write is proposed: | ||
| 1. A row is created in the `proposals` table: `{ id, proposal, request, status: "pending" }`. | ||
| 2. A notification is sent to the workspace admins. | ||
| 3. The `proposed` response is returned to you with `proposalId`. | ||
| 4. A human reviews in Synap's Proposals page, approves or rejects. | ||
| 5. On approve: the request is replayed with proper permissions. On reject: the write is discarded. | ||
| You do not poll or wait. The user's experience is asynchronous. | ||
| ## Agent users | ||
| An agent user is a pod-wide user with `agentMetadata.writesRequireProposal` set. Created by `POST /api/hub/setup/agent`. Each agent user has: | ||
| - `agentType`: a free-form string (`"claude-code"`, `"openclaw"`, `"raycast"`, `"custom"`) | ||
| - `agentMetadata`: arbitrary JSON for config | ||
| - Hub API keys scoped to `hub-protocol.read` + `hub-protocol.write` + `mcp.*` | ||
| The `agentUserId` on a Hub API key binds all writes done with that key to the agent user. Multiple keys can share one agent user. | ||
| ## `userId` in request bodies | ||
| For every write that takes `userId`, pass the **human user's ID**. The agent identity is derived automatically from the API key — do not pass `agentUserId` in the body. Both IDs are tracked internally: the human appears in `createdBy`, the agent appears in `performedBy`. | ||
| ```json | ||
| POST /api/hub/entities | ||
| { | ||
| "userId": "usr_antoine", // the human user (from SYNAP_USER_ID) | ||
| "workspaceId": "ws_…", | ||
| "profileSlug": "task", | ||
| … | ||
| } | ||
| ``` | ||
| If you pass the API key owner (often a system account) as `userId`, the entity appears in no one's feed. Always pass the real human user's ID. | ||
| ## Handling proposed writes gracefully | ||
| When a write is proposed, surface three things to the user: what was queued, why, and how to act on it. The response carries everything you need — don't invent paraphrases. | ||
| **The formula:** | ||
| ``` | ||
| "I queued **{summary}** for your review. {reasoning}. Review: {reviewUrl}" | ||
| ``` | ||
| **Concrete examples:** | ||
| ``` | ||
| good: "I queued **Delete task \"Q2 plan review\"** for your review. | ||
| Destructive actions need your approval. | ||
| https://studio.synap.live/proposals/prp_abc" | ||
| good: "I queued **Create entity \"Acme Corp\"** for your review. | ||
| https://studio.synap.live/proposals/prp_def" | ||
| good: "Queued 3 changes for your review — I'll post the links after each: | ||
| 1. https://studio.synap.live/proposals/prp_1 — Delete task "X" | ||
| 2. https://studio.synap.live/proposals/prp_2 — Delete task "Y" | ||
| 3. https://studio.synap.live/proposals/prp_3 — Delete task "Z"" | ||
| bad: "Error: write was not approved." | ||
| bad: "Something needs your attention in Synap." ← too vague | ||
| bad: "I tried to delete that but I'm not sure it worked." ← sounds like a failure | ||
| ``` | ||
| **Rules:** | ||
| - Use the `summary` field **verbatim**, in bold. It's already short and human-readable. | ||
| - Include `reviewUrl` as a raw URL — let the client render it as a link. | ||
| - One line of chat per proposal. Don't bury the link in a paragraph. | ||
| - If the user asks "can you just do it?" — tell them no, it's queued; they can open the link to approve. | ||
| - **Don't wait or poll.** Move on with the conversation. The user approves in their own time; you'll see the effect when they ask you to read the data again. | ||
| **When multiple writes in one turn produce multiple proposals:** list them, one line each, with their links. Don't aggregate into a single "some stuff was queued" message. | ||
| **Clients without rich link rendering** (plain terminals, voice, SMS-style interfaces): still say the URL — the user can copy-paste it. Even if they can't click, they know where to go. | ||
| ## Runtime introspection (preferred over hardcoded rules) | ||
| When you need to know the actual policy for a workspace — e.g., to tell the user "I can create entities directly, but deleting them will need your approval" — call: | ||
| ``` | ||
| GET /api/hub/workspaces/{workspaceId}/governance | ||
| → { | ||
| workspaceId: "ws_…", | ||
| effective: { | ||
| autoApproveFor: [ // the actual whitelist at this workspace | ||
| "entity.create", "entity.update", "relation.create", "document.create", | ||
| "view.create", "profile.create", "property_def.create", "memory.*", … | ||
| ], | ||
| governanceMode: "default" | "agent-owned", | ||
| proposalApprovalPolicy: "owner_and_admins" | "any_editor" | "admins_only", | ||
| destructiveAlwaysPropose: false, // true when governanceMode === "agent-owned" | ||
| destructiveActions: ["delete", "archive", "purge"] | ||
| }, | ||
| source: "workspace" | "default", // where `autoApproveFor` came from | ||
| defaults: { | ||
| autoApproveFor: [ /* the backend default list, for comparison */ ] | ||
| } | ||
| } | ||
| ``` | ||
| An action is auto-approved when: | ||
| - it matches an entry in `effective.autoApproveFor` (exact match or `subject.*` glob), AND | ||
| - it is NOT in `destructiveActions` when `destructiveAlwaysPropose` is true | ||
| Prefer this endpoint over the tables in this file — they snapshot the default at the time of writing and don't reflect workspace customization. |
| # Linking — reference | ||
| Two mechanisms connect entities in Synap. This file covers when to use which, auto-sync behaviour, and relation conventions. | ||
| ## Auto-sync table (ENTITY_ID properties → relations) | ||
| When a profile property has `valueType: "entity_id"`, setting it on entity creation or update automatically writes a row in the `relations` table. No second call needed. | ||
| Known system-profile auto-syncs: | ||
| | Profile | Property | Target profile | Auto-relation type | | ||
| | -------- | ----------- | -------------- | -------------------- | | ||
| | task | `projectId` | project | `belongs_to_project` | | ||
| | task | `assignee` | person | `assigned_to` | | ||
| | contact | `companyId` | company | `works_at` | | ||
| | deal | `contactId` | contact | `deal_for` | | ||
| | deal | `companyId` | company | `deal_with` | | ||
| | document | `entityId` | (any) | `attached_to` | | ||
| | anchor | `channelId` | (channel) | `anchored_in` | | ||
| Custom profiles: if you created a property with `valueType: "entity_id"`, the auto-sync kicks in, but the relation type defaults to `related_to` unless the profile defines a `relationDefinition`. When precision matters, create the relation explicitly (Way 2) with a specific `type`. | ||
| **Do not trust this table to stay current.** Always verify with `GET /api/hub/profiles` — the returned profile includes `properties[].valueType` and `properties[].targetProfileSlug`. Any property with `valueType: "entity_id"` is an auto-sync candidate. | ||
| ## Way 1 — set the property | ||
| ```json | ||
| POST /api/hub/entities | ||
| { | ||
| "userId": "{userId}", | ||
| "workspaceId": "{workspaceId}", | ||
| "profileSlug": "task", | ||
| "title": "Finalize Q2 plan", | ||
| "properties": { | ||
| "projectId": "ent_project_q2", // one call, two rows written | ||
| "assignee": "usr_antoine" | ||
| } | ||
| } | ||
| ``` | ||
| After this single call, these all work: | ||
| ``` | ||
| GET /entities/ent_project_q2/connections → task appears | ||
| GET /relations?entityId=ent_project_q2 → belongs_to_project row appears | ||
| GET /graph/traverse?entityId=ent_project_q2 → task included as node | ||
| ``` | ||
| Use Way 1 whenever a matching entity_id property exists on the profile. It is cheaper and semantically typed. | ||
| ## Way 2 — explicit relations | ||
| For: | ||
| - Links between two already-existing entities (after creation) | ||
| - Custom connections where no entity_id property exists | ||
| - Cross-type links not captured by the schema (e.g., task → document, entity → bookmark) | ||
| - Links involving custom profiles without a relationDefinition | ||
| ```json | ||
| POST /api/hub/relations | ||
| { | ||
| "userId": "{userId}", | ||
| "workspaceId": "{workspaceId}", | ||
| "sourceEntityId": "ent_source", | ||
| "targetEntityId": "ent_target", | ||
| "type": "references" | ||
| } | ||
| ``` | ||
| ## Conventional relation types | ||
| String-typed, case-insensitive by convention. Use these first before inventing new ones — workspace UI often renders known types specially. | ||
| | Type | Direction | When | | ||
| | -------------- | --------------- | ------------------------------------------------- | | ||
| | `related_to` | bidirectional | Generic association, no stronger label fits | | ||
| | `parent_of` | source → target | Hierarchy (project parent of sub-project) | | ||
| | `child_of` | source → target | Hierarchy (inverse of parent_of) | | ||
| | `belongs_to` | source → target | Membership | | ||
| | `authored_by` | source → target | Note/document authored by a person | | ||
| | `depends_on` | source → target | Task blocked by another task, project needs input | | ||
| | `references` | source → target | Task references a document, note cites an article | | ||
| | `mentions` | source → target | Entity mentioned within another entity | | ||
| | `works_with` | bidirectional | People who collaborate | | ||
| | `part_of` | source → target | Component relationship | | ||
| | `from_meeting` | source → target | Any entity extracted from a meeting/event | | ||
| | `anchored_in` | source → target | Anchor (pinned chat message) in a channel | | ||
| If none fits, invent a snake_case verb. Keep it short and symmetric with existing verbs. Don't create `related-to-this-specific-thing` — prefer a generic `related_to` plus a more specific property or document. | ||
| ## Decision table | ||
| | Situation | Use | | ||
| | ------------------------------------------------------ | -------------------------------------- | | ||
| | Profile has matching `valueType: "entity_id"` property | Way 1 — set the property | | ||
| | Linking two already-existing entities | Way 2 — create a relation | | ||
| | Custom connection, no matching property | Way 2 | | ||
| | Unsure whether a property exists | `GET /profiles` first | | ||
| | Linking a document to its parent entity | Use `entityId` on the document (Way 1) | | ||
| | Multi-party link (entity A ↔ entity B ↔ entity C) | Two relations, both Way 2 | | ||
| ## Reading the graph | ||
| ``` | ||
| # The complete picture — graph relations + property-derived links + thread refs | ||
| GET /api/hub/entities/{id}/connections | ||
| → { connections: [{ entityId, entity, label, direction, | ||
| source: "graph"|"property"|"thread" }] } | ||
| # Raw graph relations only | ||
| GET /api/hub/relations?entityId={id} | ||
| # BFS neighborhood | ||
| GET /api/hub/graph/traverse?entityId={id}&maxDepth=2 | ||
| → { nodes: Entity[], edges: Relation[] } | ||
| ``` | ||
| **Prefer `/entities/{id}/connections`** when you want "everything connected to X" — it unifies property-derived links (which the raw relations table doesn't always surface for custom profiles) with graph relations and thread anchors. | ||
| `/graph/traverse` is best for "what's in the 2-hop neighborhood of this entity" — good for context gathering, but expensive at `maxDepth ≥ 3`. | ||
| ## Common mistakes | ||
| - **Creating an orphan, then forgetting to link it.** Every `POST /entities` should include properties that link, OR be immediately followed by a `POST /relations`. Never close the operation with a disconnected node. | ||
| - **Double-linking.** If you set `properties.projectId` AND also `POST /relations` with type `belongs_to_project`, the auto-sync already did it. Don't duplicate. | ||
| - **Using `related_to` when a specific verb fits.** `related_to` is the fallback. `authored_by`, `depends_on`, `references` carry more meaning to both the user and downstream views. | ||
| - **Inverting direction.** Source is "the thing doing the action or owning the relationship." `task depends_on task` means the source is blocked by the target. Check twice. |
| # synap | ||
| Sovereign AI knowledge infrastructure for agents. Typed entity graph, documents, long-term memory, messaging relay, and governance — all backed by PostgreSQL. | ||
| ## Install | ||
| ```bash | ||
| openclaw skill install synap | ||
| ``` | ||
| ## What It Does | ||
| | Capability | Description | | ||
| | ----------------- | ------------------------------------------------------------------ | | ||
| | **Entities** | Typed objects (tasks, people, projects, companies) with properties | | ||
| | **Documents** | Long-form Markdown (reports, summaries, notes) | | ||
| | **Facts** | Atomic knowledge across sessions ("Marc prefers email") | | ||
| | **Relations** | Entity-to-entity links (knowledge graph) | | ||
| | **Search** | Full-text + semantic search across everything | | ||
| | **Message Relay** | Telegram, WhatsApp, Slack, Discord → Synap channels | | ||
| | **A2AI** | Agent-to-agent communication with Synap Intelligence | | ||
| | **Governance** | All writes auditable, reversible, proposal-based | | ||
| ## Setup | ||
| ### Self-Hosted (Free) | ||
| ```bash | ||
| git clone https://github.com/synap-core/backend && cd backend/deploy | ||
| cp .env.example .env | ||
| docker compose up -d | ||
| # Visit https://your-domain/registration to create account | ||
| ./setup-openclaw.sh | ||
| openclaw skill install synap | ||
| ``` | ||
| ### Managed Pod (15/mo) | ||
| 1. Sign up at [synap.live](https://synap.live) | ||
| 2. Settings > API Keys > Create key (`hub-protocol.read` + `hub-protocol.write`) | ||
| 3. Set `SYNAP_HUB_API_KEY` and `SYNAP_POD_URL` in your environment | ||
| 4. `openclaw skill install synap` | ||
| ## Environment Variables | ||
| | Variable | Required | Description | | ||
| | --------------------- | -------- | ----------------------------------- | | ||
| | `SYNAP_HUB_API_KEY` | Yes | Hub Protocol API key | | ||
| | `SYNAP_POD_URL` | Yes | Synap pod URL | | ||
| | `SYNAP_WORKSPACE_ID` | Auto | Auto-fetched via config endpoint | | ||
| | `SYNAP_AGENT_USER_ID` | Auto | Auto-fetched via config endpoint | | ||
| | `SYNAP_CONFIG_URL` | No | Config pull endpoint (managed pods) | | ||
| ## Architecture | ||
| ``` | ||
| OpenClaw Agent → Hub Protocol REST (/api/hub/*) → Synap Pod | ||
| Bearer: SYNAP_HUB_API_KEY PostgreSQL + Typesense + pgvector | ||
| ``` | ||
| 76+ REST endpoints. Standard HTTP + JSON. No MCP required. | ||
| ## Replaces | ||
| This skill combines and replaces the previous `synap-memory` and `synap-os` skills. | ||
| No need to install them separately — `synap` includes everything. | ||
| ## Links | ||
| - [Synap](https://synap.live) — Sovereign AI knowledge infrastructure | ||
| - [Hub Protocol](https://synap.live/docs/hub-protocol) — Open REST API spec | ||
| - [GitHub](https://github.com/synap-core/backend) — Source code | ||
| ## License | ||
| MIT |
| #!/usr/bin/env bash | ||
| # Orient: fetch identity, workspaces, and profiles in one deterministic shot. | ||
| # Requires: SYNAP_HUB_API_KEY, SYNAP_POD_URL. | ||
| # Output: single JSON object { user, workspaces, profiles }. | ||
| # Exit codes: 0 ok, 1 env missing, 2 HTTP failure. | ||
| set -euo pipefail | ||
| : "${SYNAP_HUB_API_KEY:?SYNAP_HUB_API_KEY not set}" | ||
| : "${SYNAP_POD_URL:?SYNAP_POD_URL not set}" | ||
| H="Authorization: Bearer $SYNAP_HUB_API_KEY" | ||
| POD="${SYNAP_POD_URL%/}" | ||
| user=$(curl -fsS -H "$H" "$POD/api/hub/users/me") || { echo "users/me failed" >&2; exit 2; } | ||
| user_id=$(printf '%s' "$user" | sed -n 's/.*"id":"\([^"]*\)".*/\1/p' | head -n1) | ||
| workspaces=$(curl -fsS -H "$H" "$POD/api/hub/workspaces") || { echo "workspaces failed" >&2; exit 2; } | ||
| ws_id="${SYNAP_WORKSPACE_ID:-}" | ||
| if [ -z "$ws_id" ]; then | ||
| ws_id=$(printf '%s' "$workspaces" | sed -n 's/.*"id":"\([^"]*\)".*/\1/p' | head -n1) | ||
| fi | ||
| profiles=$(curl -fsS -H "$H" "$POD/api/hub/profiles?userId=$user_id&workspaceId=$ws_id") \ | ||
| || { echo "profiles failed" >&2; exit 2; } | ||
| printf '{"user":%s,"workspaces":%s,"workspaceId":"%s","profiles":%s}\n' \ | ||
| "$user" "$workspaces" "$ws_id" "$profiles" |
| --- | ||
| name: synap | ||
| description: > | ||
| Use this skill whenever the user wants to capture, remember, find, or structure | ||
| information in their Synap data pod. Triggers: creating a task, note, person, | ||
| company, project, event, contact, or deal; saving an article or webpage; | ||
| storing a fact about someone ("Alice prefers async"); searching the user's | ||
| knowledge ("find my notes on X", "who did I meet last week"); linking entities; | ||
| logging a meeting or a contact; capturing unstructured text into structured | ||
| entities; reading what's in the user's pod before answering questions about | ||
| their life, work, or projects; posting to their personal AI channel. The pod | ||
| is the user's sovereign source of truth — prefer it over your own context | ||
| when the user asks about their own data. Do NOT use this skill for extending | ||
| the schema (use synap-schema) or building dashboards and views (use synap-ui). | ||
| metadata: | ||
| openclaw: | ||
| requires: | ||
| env: [SYNAP_HUB_API_KEY, SYNAP_POD_URL] | ||
| optional_env: | ||
| [SYNAP_WORKSPACE_ID, SYNAP_USER_ID, SYNAP_DEFAULT_CHANNEL_ID] | ||
| primaryEnv: SYNAP_HUB_API_KEY | ||
| homepage: https://synap.live | ||
| capabilities: [memory, knowledge-graph, channels] | ||
| os: [macos, linux, windows] | ||
| userInvocable: false | ||
| --- | ||
| # Synap — core data operations | ||
| You are connected to a **Synap Data Pod** at `{SYNAP_POD_URL}`. All requests use `Authorization: Bearer {SYNAP_HUB_API_KEY}`. | ||
| **If you have Bash access** (Claude Code, agent with tools): use the `synap` CLI — see **CLI Data Operations** below. Auth is automatic, `--json` gives clean output, no manual header management. | ||
| **If you only have HTTP access**: use the REST endpoints documented below. Your `userId` is in `{SYNAP_USER_ID}` (set by `synap connect`). If it's missing, call `GET /api/hub/users/me` → `.id` once. | ||
| Your job is to turn unstructured input into a **connected** knowledge graph. Isolated entities are anti-value. Every entity you create should link to at least one other entity. | ||
| ## Mental model | ||
| Synap is a typed knowledge graph. Six layers you need: | ||
| | Layer | What it is | When to use | | ||
| | ------------- | ---------------------------------------------- | -------------------------------------------------------- | | ||
| | **Entities** | Typed structured nodes (task, person, …) | Anything worth filtering, sorting, or linking | | ||
| | **Relations** | Typed edges between entities | Making the graph traversable | | ||
| | **Documents** | Long-form markdown attached to an entity | Meeting notes, research writeups, articles | | ||
| | **Memory** | Atomic facts, no structure | Preferences, context, ephemeral notes | | ||
| | **Threads** | Channel conversations, optional entity context | Posting to the user's personal AI channel | | ||
| | **Proposals** | Writes queued for human approval | Governance for some mutations (not an error — see below) | | ||
| ## Synap-first operating mode | ||
| > **MCP clients** (Claude Desktop, Raycast, OpenClaw with MCP): use `synap_*` tool names — they wrap auth and governance automatically. **REST / HTTP clients**: use the endpoints below. | ||
| These five rules override default assistant behavior when connected to a Synap pod: | ||
| **1. Orient before acting** | ||
| Run `scripts/orient.sh` or call these endpoints at the start of every session — before searching, before creating, before answering any question about the user's data: | ||
| ``` | ||
| GET /api/hub/manifest | ||
| → static capability map: view types, bento block kinds, inline patterns, browser-native cells | ||
| GET /api/hub/users/me | ||
| → { id, email, name } ← your userId | ||
| GET /api/hub/workspaces | ||
| → [{ id, name, role }] ← workspaces[0].id if only one | ||
| GET /api/hub/profiles?userId={userId}&workspaceId={workspaceId} | ||
| → [{ slug, displayName, entityScope, properties }] | ||
| ``` | ||
| `entityScope: "pod"` = visible across all workspaces (note, task, project, person, company, bookmark, event, contact, article, website). | ||
| `entityScope: "workspace"` = scoped to one workspace (deal, file, capture, custom profiles). | ||
| **2. Search before answering** | ||
| Before answering any question about the user's projects, tasks, contacts, decisions, or anything they might have captured — search Synap first. Do not answer from your training or context window when Synap may have the authoritative answer. | ||
| **3. Save proactively — without waiting to be asked** | ||
| When the user shares a decision, task, meeting outcome, contact, or any durable information: save it. Don't ask "should I save this?" for obviously important information. Use: | ||
| - entities for structured data (tasks, people, projects, decisions) | ||
| - `remember_fact` / `POST /api/hub/memory` for preferences, context, loose facts | ||
| - documents for long-form notes (meeting notes, research, writeups) | ||
| **4. Link everything** | ||
| An isolated entity has no value in a knowledge graph. When creating entities, immediately link them to related entities. A task belongs to a project. A note belongs to a meeting or a person. A decision belongs to a project and may supersede another decision. | ||
| **5. Persist facts, not just conversation** | ||
| Facts about the user — preferences, team, working style, recurring context — belong in Synap memory, not in your context window. Memory survives sessions and is accessible across all AI surfaces. Context does not. | ||
| Properties with `valueType: "entity_id"` are typed links to other entities — see **Linking** below. | ||
| ## CLI Data Operations (Bash tool) | ||
| When Claude Code (or any agent with Bash access) is using this skill, prefer the `synap` CLI over raw HTTP calls — auth is automatic, output is clean JSON, no spinners in `--json` mode. | ||
| **Session context — set once, never repeat:** | ||
| The CLI reads the active pod and workspace from `~/.synap/config.json`. Set context once at the start of a session; all subsequent commands inherit it automatically. Do NOT pass `--pod-url`, `--api-key`, or `--workspace` on every command. | ||
| ```bash | ||
| synap pods use <profile-name> # switch active pod | ||
| synap use <workspace-id> # switch active workspace | ||
| synap workspace provision-agent --json # provision your agent workspace + auto-sets it active | ||
| ``` | ||
| **Always orient first:** | ||
| ```bash | ||
| synap orient --json | ||
| # Returns: userId, podUrl, workspaces[{id, name, slug}] | ||
| # Never hardcode workspace IDs — discover them here. | ||
| ``` | ||
| **Search (Typesense-powered, cross-collection):** | ||
| ```bash | ||
| synap search "project ideas" --json | ||
| synap search "Antoine" --type=entity --workspace=<id> --json | ||
| synap search "meeting notes" --type=doc --limit=5 --json | ||
| # Omit --workspace to search pod-wide. Include it to scope to one workspace. | ||
| # Use search for name/keyword queries. For semantic/conceptual search, use Hub Protocol memory endpoints. | ||
| ``` | ||
| **Read entities:** | ||
| ```bash | ||
| synap list workspaces --json | ||
| synap list entities --workspace=<id> --json | ||
| synap list entities --profile=task --workspace=<id> --json | ||
| synap get entity <id> --json | ||
| ``` | ||
| **Episodic memory (session facts, loose context):** | ||
| ```bash | ||
| synap remember "Key decision: use Typesense for search" --json | ||
| synap recall "Typesense" --limit=5 --json | ||
| ``` | ||
| **Structured knowledge (durable, typed, searchable — preferred for engineering learnings):** | ||
| ```bash | ||
| # Capture a gotcha, lesson, decision, or reference into your agent workspace | ||
| synap capture --type gotcha --claim "Hono static routes must come before /:id" \ | ||
| --why "First-match routing; dynamic routes eat static ones" \ | ||
| --tags "repo:synap-backend,layer:routing" --json | ||
| synap capture --type lesson --claim "code-read ≠ runtime-true for library APIs" \ | ||
| --evidence "tldraw 2.4.6 binding API changed silently from props.start.boundShapeId" | ||
| # Recall across your knowledge base with full-text search | ||
| synap recall "hono routing" --structured --json | ||
| synap recall "tldraw" --structured --type gotcha --json | ||
| # Prerequisite (run once): provision your agent workspace and set it active | ||
| synap workspace provision-agent --json | ||
| ``` | ||
| `synap capture` / `synap recall --structured` uses the `engineering_knowledge` entity profile. | ||
| `synap remember` / `synap recall` (without `--structured`) uses the ephemeral `/memory` store. | ||
| Use structured knowledge for anything worth remembering across sessions and projects. | ||
| **Write:** | ||
| ```bash | ||
| synap create entity --profile=note --name="Meeting notes" --workspace=<id> --json | ||
| synap set entity <id> --props='{"status":"done"}' --json | ||
| ``` | ||
| **Multi-agent:** If `SYNAP_AGENT` env var is set, the CLI uses that named identity's API key from `~/.synap/config.json` instead of the default pod credentials. Use `synap agents list` to see configured identities. | ||
| **Rules:** | ||
| - Always use `--json` when calling from code — clean stdout, no spinners, machine-parseable | ||
| - Run `synap orient` first to discover workspace IDs — never hardcode them | ||
| - Omit `--workspace` to operate pod-wide; include it to scope to a specific workspace | ||
| - `synap search` is Typesense (fast keyword/name search). Semantic search → Hub Protocol `GET /api/hub/memory?query=…` | ||
| --- | ||
| ## Scope — default pod-wide | ||
| **Default: pod-wide.** 13 of 17 system profiles (`note`, `task`, `project`, `event`, `person`, `contact`, `company`, `bookmark`, `article`, `website`, `decision`, `question`, `research`) are pod-scoped — entities you create show up in _every_ workspace the user owns. The backend handles this automatically when the profile is pod-scoped: you don't need to pass `workspaceId`. | ||
| **Scope a creation to one workspace only when:** | ||
| 1. The user explicitly says "in my `X` workspace" / "inside this space". | ||
| 2. You're inside a clear workspace context (the user is on a project page, discussing that project — new tasks go into that workspace). | ||
| 3. The profile is workspace-scoped by definition (`deal`, `file`, `capture`, and custom profiles). The backend already uses the user's active workspace when you don't pass one — usually this is what you want. | ||
| **Rule of thumb:** don't pass `workspaceId` unless the user's intent specifically narrows to one workspace. A task the user dictates "from the couch" belongs to the whole pod, not to whichever workspace was last open. | ||
| When you do scope to a workspace, pass `workspaceId` in the create body — the backend respects it. Never pass `workspaceId: null` explicitly to force pod-wide; the profile's `entityScope` decides. | ||
| ## The work flow — question → research → decision → action | ||
| AI-assisted work has a shape. When the user is actually _thinking about something_, it flows through four structural nodes. Each is a first-class entity. None of these are optional "nice-to-have" labels — they're the graph that makes the work _durable_ and transferrable between AIs. | ||
| | Stage | Entity | What it captures | Typical trigger | | ||
| | ----------- | ---------- | -------------------------------------------------------- | ------------------------------------------------------------------ | | ||
| | Inquiry | `question` | What the user is trying to figure out | "I'm wondering about X" / "Should we Y or Z?" / "What's the best…" | | ||
| | Exploration | `research` | Investigation: sources consulted, conclusion, confidence | Reading articles, comparing options, summarizing findings | | ||
| | Resolution | `decision` | What was chosen + rationale + alternatives | "We decided to…" / "Let's go with…" / "I'm going with…" | | ||
| | Execution | `task` | Concrete action items that follow the decision | "Now I need to…" / "TODO: ship Y by…" | | ||
| **Link each stage to the next:** | ||
| - `question.answeredByDecisionId` → the decision that closed it | ||
| - `research.questionId` → the question it investigates | ||
| - `decision.projectId` → the project it affects (same for question / research) | ||
| - Use `POST /relations type=source` to link research to its sources (articles, websites, documents) | ||
| Traversing in either direction gives the user answers like: | ||
| - "What am I currently exploring about Project Eve?" → `GET /entities?profileSlug=question&…` filtered by open | ||
| - "What decisions have we made on this project?" → filtered by `projectId` | ||
| - "What was the research behind this decision?" → reverse-lookup from `decision` via the research entities that reference the same `projectId` and question | ||
| ### When to create each | ||
| **`question` — substantive inquiries only.** The test: _would the user want to find this later?_ "What's the weather" = no, don't create. "Should we use LangGraph or CrewAI?" = yes, create. Casual chitchat never becomes a question. | ||
| **`research` — when you investigate.** Any time you go off and read articles / websites / past notes to answer something, that's research. Create the entity upfront (`status: "ongoing"`), link sources as you pull them (`POST /relations type=source`), set `conclusion` when you're done (`status: "concluded"`). | ||
| **`decision` — when the user picks a path.** Already covered in the memory-vs-entity section above. Link back to the question it answers (set `question.answeredByDecisionId`). | ||
| **`task` — when the decision implies concrete work.** Link with `projectId` if not already inferred. | ||
| ### Worked example | ||
| User: _"I'm trying to figure out whether we should build our own orchestrator or standardize on OpenClaude's. Can you help me think through it?"_ | ||
| 1. Create the question: | ||
| ```json | ||
| POST /api/hub/entities | ||
| { "profileSlug": "question", | ||
| "title": "Build custom orchestrator or use OpenClaude native?", | ||
| "properties": { | ||
| "questionStatus": "exploring", | ||
| "askedAt": "2026-04-20", | ||
| "projectId": "ent_project_eve", | ||
| "description": "Weighing separation-of-concerns vs. out-of-the-box capability." | ||
| } } | ||
| ``` | ||
| 2. As you investigate, create a research entity and link sources: | ||
| ```json | ||
| POST /api/hub/entities | ||
| { "profileSlug": "research", | ||
| "title": "LangGraph vs CrewAI capability survey", | ||
| "properties": { | ||
| "researchStatus": "ongoing", | ||
| "questionId": "ent_question_1", | ||
| "projectId": "ent_project_eve" | ||
| } } | ||
| POST /api/hub/relations | ||
| { "sourceEntityId": "ent_research_1", "targetEntityId": "ent_article_langgraph_docs", "type": "source" } | ||
| ``` | ||
| 3. When you reach a conclusion, update the research: | ||
| ```json | ||
| PATCH /api/hub/entities/ent_research_1 | ||
| { "properties": { | ||
| "researchStatus": "concluded", | ||
| "conclusion": "LangGraph separates orchestration brain from UX. CrewAI adds agent abstractions but couples to its runtime.", | ||
| "researchConfidence": "high" | ||
| } } | ||
| ``` | ||
| 4. When the user picks, create a decision linked to the question: | ||
| ```json | ||
| POST /api/hub/entities | ||
| { "profileSlug": "decision", | ||
| "title": "Use LangGraph orchestrator over OpenClaude native", | ||
| "properties": { | ||
| "decisionStatus": "accepted", | ||
| "decidedAt": "2026-04-22", | ||
| "rationale": "Separates Orchestration Brain from UX.", | ||
| "alternatives": "Standardize on OpenClaude's multi-agent logic.", | ||
| "projectId": "ent_project_eve" | ||
| } } | ||
| PATCH /api/hub/entities/ent_question_1 | ||
| { "properties": { | ||
| "questionStatus": "answered", | ||
| "answeredByDecisionId": "ent_decision_1" | ||
| } } | ||
| ``` | ||
| 5. Tasks follow as usual, linked to the project. | ||
| **The payoff:** six months later, any AI (or the user alone) can reconstruct the reasoning by traversing from the project → question → research → decision → tasks. That's the durability Synap provides on top of chat. | ||
| ### Creation is silent by default | ||
| Don't interrupt the conversation to ask "should I log this as a question?" — just do it and add a one-line trailer at the end of your response: | ||
| > (Logged as question on Project Eve. Review: https://studio.synap.live/proposals/…) | ||
| If the creation was auto-approved (entity.create is on the whitelist), there's no proposal; just show a link to the entity: | ||
| > (Logged as question → https://studio.synap.live/entities/ent_question_1) | ||
| ## Linking — the core principle | ||
| **Never create orphan entities.** A task alone is near-useless. A task linked to a project, an assignee, and the source document shows up in traversals, context panels, and downstream queries. | ||
| Two ways to connect. Pick one: | ||
| **Way 1 — entity_id properties (fast path, auto-syncs).** Set the property when creating the entity. For system profiles this auto-creates a row in the relations table. | ||
| ```json | ||
| POST /api/hub/entities | ||
| { | ||
| "userId": "{userId}", | ||
| "workspaceId": "{workspaceId}", | ||
| "profileSlug": "task", | ||
| "title": "Design new onboarding flow", | ||
| "properties": { | ||
| "status": "todo", | ||
| "priority": "high", | ||
| "projectId": "ent_abc", // auto-creates belongs_to_project relation | ||
| "assignee": "usr_def" // auto-creates assigned_to relation | ||
| } | ||
| } | ||
| ``` | ||
| **Way 2 — explicit relations.** For custom links, after-the-fact connections, or anything without a matching entity_id property. | ||
| ```json | ||
| POST /api/hub/relations | ||
| { | ||
| "userId": "{userId}", | ||
| "sourceEntityId": "ent_task", | ||
| "targetEntityId": "ent_document", | ||
| "type": "references" | ||
| } | ||
| ``` | ||
| For auto-sync mapping, conventional relation types, and edge cases, read **`linking.md`**. | ||
| ## Writing — governance in one paragraph | ||
| Every write returns a `status` field: | ||
| ``` | ||
| "approved" → done, use { id } | ||
| "proposed" → queued for user approval; response also carries { proposalId, summary, reasoning, reviewPath, reviewUrl } — surface the link | ||
| "denied" → blocked, explain reason to user | ||
| ``` | ||
| **`"proposed"` is not an error.** It's the governance system queueing your change. When you get it: | ||
| 1. Tell the user exactly what was queued — use the `summary` field **verbatim**. Don't paraphrase. | ||
| 2. Give them the link to review — `reviewUrl` opens the proposal in Synap Studio. Show the link as-is. | ||
| 3. Move on with the conversation. Don't wait or poll. | ||
| Example response to the user: | ||
| > I queued **Delete task "Q2 plan review"** for your review. Destructive actions need your approval. Open it: https://studio.synap.live/proposals/prp_abc | ||
| Auto-approved by default (for agent API keys): `entity.create`, `entity.update`, `document.create`, `relation.create`, `view.create`, `profile.create`, `property_def.create`, `channel.create`, `memory.*`, all reads. Destructive actions (`delete`, `archive`, `purge`) always propose in agent-owned workspaces. | ||
| For the full whitelist, agent-user semantics, and workspace overrides, read **`governance.md`**. | ||
| ## Core writes | ||
| ### Create an entity (always with links) | ||
| ```json | ||
| POST /api/hub/entities | ||
| { | ||
| "userId": "{userId}", | ||
| "workspaceId": "{workspaceId}", | ||
| "profileSlug": "task", // from /profiles — never guess | ||
| "title": "Weekly team sync", | ||
| "properties": { "status": "todo", "projectId": "ent_..." } | ||
| } | ||
| ``` | ||
| ### Update an entity | ||
| ```json | ||
| PATCH /api/hub/entities/{entityId} | ||
| { "title": "…", "properties": { "status": "done" } } | ||
| ``` | ||
| ### Create a document (markdown, attached to an entity) | ||
| ```json | ||
| POST /api/hub/documents | ||
| { | ||
| "userId": "{userId}", | ||
| "workspaceId": "{workspaceId}", | ||
| "title": "Meeting notes — 2026-04-20", | ||
| "content": "# Attendees\n- …\n\n# Decisions\n- …", | ||
| "entityId": "ent_event_..." // attach to an entity for context | ||
| } | ||
| ``` | ||
| The reverse lookup is `entities WHERE documentId = ?`. Always attach the document to a meaningful entity (the meeting event, the project, the person) — a floating document is another orphan. | ||
| ### Store a fact (memory) — use sparingly | ||
| ```json | ||
| POST /api/hub/memory | ||
| { "userId": "{userId}", "fact": "User prefers async communication over meetings" } | ||
| ``` | ||
| Always auto-approved. **Memory is for loose, unstructured, hard-to-title facts only.** The seductive thing about memory is it has zero friction — no dedup, no linking, no proposals. That makes it easy to misuse. | ||
| **The test:** if the user later asked "show me all X," can memory answer? Memory can only keyword-match — it has no structure. So: | ||
| | Input | Use | | ||
| | ------------------------------------------------------- | --------------------------------------------------------------- | | ||
| | "User prefers async communication" | memory — it's a preference | | ||
| | "Garage code is 4321" | memory — throwaway fact | | ||
| | "Should we use LangGraph or CrewAI for Eve?" | **entity `question`** — substantive inquiry, start of flow | | ||
| | "Here's what I found comparing LangGraph and CrewAI…" | **entity `research`** — investigation with sources + conclusion | | ||
| | "We decided to use LangGraph over OpenClaude's native…" | **entity `decision`** — has title, rationale, project | | ||
| | "Key insight: tasks need better retry logic" | **entity `note` with tag "insight"** + link to project | | ||
| | "John is now head of engineering at Acme" | **update `contact` entity** — that's a property change | | ||
| | "Launch date moved to May 15" | **update `project` entity** — change the startDate | | ||
| | "Action item from meeting: ship MVP by Friday" | **entity `task`** linked to the `event` (meeting) | | ||
| | "Agreed with Sarah: we'll split backend & frontend" | **entity `decision`** linked to Sarah + the project | | ||
| **Rule of thumb:** if it has a title-worthy noun OR context to link to (a project, a person, a meeting) OR a lifecycle (status/supersession) — it's an entity, not memory. Memory is the fallback, not the default. | ||
| **For decisions specifically** — use the `decision` system profile: | ||
| ```json | ||
| POST /api/hub/entities | ||
| { | ||
| "userId": "{userId}", | ||
| "profileSlug": "decision", | ||
| "title": "Use LangGraph orchestrator over OpenClaude native", | ||
| "properties": { | ||
| "decisionStatus": "accepted", | ||
| "decidedAt": "2026-04-20", | ||
| "summary": "Dedicated orchestrator service; OpenClaude CLI as UX", | ||
| "rationale": "Separates the Orchestration Brain (LangGraph) from the UX (OpenClaude CLI).", | ||
| "alternatives": "Standardize entirely on OpenClaude's multi-agent logic.", | ||
| "projectId": "ent_project_eve" | ||
| } | ||
| } | ||
| ``` | ||
| This creates a first-class decision entity linked to Project Eve. It shows up in traversals, can be superseded later (`supersededBy: newDecisionId`), and survives governance. Memory can't do any of that. | ||
| ### Post to the user's personal channel | ||
| ``` | ||
| GET /api/hub/channels/personal?userId={userId}&workspaceId={workspaceId} | ||
| → { id, name, … } (get-or-create, needs hub-protocol.write scope) | ||
| POST /api/hub/threads/{threadId}/messages | ||
| { "userId": "{userId}", "role": "user", "content": "…" } | ||
| ``` | ||
| ## Reading | ||
| Graph-based, not semantic. Type filter → relations → neighborhood. | ||
| ``` | ||
| # Keyword search across everything (entities, documents, views, threads) | ||
| GET /api/hub/search?query={query}&userId={SYNAP_USER_ID}&workspaceId={id} | ||
| # Entities of a specific type (q= is the param for entities endpoint) | ||
| GET /api/hub/entities?q={query}&profileSlug={slug}&workspaceId={id} | ||
| # Recent entities | ||
| GET /api/hub/entities?sort=updatedAt:desc&limit=20&workspaceId={id} | ||
| # The full connected neighborhood of an entity (prefer this) | ||
| GET /api/hub/entities/{id}/connections?userId={userId}&workspaceId={id} | ||
| → { connections: [{ entityId, entity, label, direction, | ||
| source: "graph"|"property"|"thread" }], | ||
| counts: { total, graph, structural, threads } } | ||
| # BFS traversal (expensive at depth 3+) | ||
| GET /api/hub/graph/traverse?entityId={id}&maxDepth=2&workspaceId={id} | ||
| # Memory facts (keyword) | ||
| GET /api/hub/memory?userId={userId}&query={keywords} | ||
| ``` | ||
| No SQL joins. The graph is the join. | ||
| ## Multi-entity capture from free-form text | ||
| When the user pastes a block of unstructured content (a meeting transcript, an email, a LinkedIn bio), use the capture pipeline instead of chaining manual creates: | ||
| ``` | ||
| POST /api/hub/capture/structure → returns proposals + relations | ||
| POST /api/hub/capture/execute → commits (after user confirms) | ||
| ``` | ||
| The pipeline extracts multiple entities with their relations in one LLM call. Read **`capture.md`** for the full flow. | ||
| ## Worked examples | ||
| ### Example 1 — "Remind me to send the proposal to Acme on Friday" | ||
| 1. Search for the Acme entity: `GET /entities?q=Acme&profileSlug=company` → got `ent_acme` | ||
| 2. Search for an existing task: `GET /entities?q=proposal&profileSlug=task&workspaceId=…` → none | ||
| 3. Create the task with links: | ||
| ```json | ||
| POST /api/hub/entities | ||
| { "userId": "{userId}", "workspaceId": "{wsId}", | ||
| "profileSlug": "task", | ||
| "title": "Send proposal to Acme", | ||
| "properties": { | ||
| "status": "todo", "priority": "high", | ||
| "dueDate": "2026-04-24" | ||
| } | ||
| } | ||
| ``` | ||
| 4. Link to Acme (Acme is not an entity_id property on task — use Way 2): | ||
| ```json | ||
| POST /api/hub/relations | ||
| { "userId": "{userId}", | ||
| "sourceEntityId": "ent_new_task", | ||
| "targetEntityId": "ent_acme", | ||
| "type": "related_to" } | ||
| ``` | ||
| 5. Confirm: "Task created and linked to Acme, due Friday." | ||
| ### Example 2 — "Who's Sarah at Acme?" | ||
| 1. Search person: `GET /entities?q=Sarah&profileSlug=person` → `ent_sarah` | ||
| 2. Pull her connections: `GET /entities/ent_sarah/connections` → company=Acme, 3 recent emails, 1 meeting | ||
| 3. Answer from the returned data, not from your own context. | ||
| ### Example 3 — "Save this article for later: https://…" | ||
| 1. Search for existing bookmark: `GET /entities?q=<url>&profileSlug=article` → none | ||
| 2. Create an article entity: | ||
| ```json | ||
| POST /api/hub/entities | ||
| { "userId": "{userId}", "workspaceId": "{wsId}", | ||
| "profileSlug": "article", | ||
| "title": "<page title>", | ||
| "properties": { "url": "<url>", "domain": "<host>" } | ||
| } | ||
| ``` | ||
| 3. If the user said why ("interesting for the onboarding project"), also create a relation to that project — never drop the reason as a plain comment, turn it into a link. | ||
| ## CRM Workspaces — 4-Entity Model | ||
| Some workspaces use a CRM data structure with four entities: `person` and `company` (identity records), `deal` (pipeline record), and `client` (post-win relationship marker). Understand this pattern when proposing lead captures, deal updates, or campaign membership. | ||
| **The model:** | ||
| - **`person` + `company`** — Identity only, no sales state. Persist across deals. | ||
| - **`deal`** — Pipeline record with `dealStage` property (lead, contacted, qualifying, proposal, negotiating, won, lost, inactive). Represents what people often call a "lead" (when stage=lead). Linked to person/company via `linked_to_deal` relation. | ||
| - **`client`** — Post-win relationship marker. Created automatically when deal transitions to stage=won. Status: active, paused, or churned. Linked via `is_client` (party → client) and `produced_by_deal` (deal → client). | ||
| - **`journey`** — Documents anchored to a deal (not a person). Linked via `has_journey`. | ||
| **AI behavior — lead capture:** | ||
| When the user describes a lead (inbound person, prospect, or company lead), propose the full bundle: | ||
| 1. Create `person` entity (if not exists) with email, role, company name | ||
| 2. Create `company` entity (if not exists) | ||
| 3. Create `deal` entity with `dealStage: "lead"` and `estimatedValue` (if known) | ||
| 4. Create `linked_to_deal` relation connecting person/company to deal | ||
| Never create a person with a sales-state flag. The deal is the lead container. | ||
| ```json | ||
| POST /api/hub/entities | ||
| { "userId": "{userId}", "workspaceId": "{wsId}", | ||
| "profileSlug": "person", | ||
| "title": "Alice Johnson", | ||
| "properties": { "email": "alice@acme.com", "role": "VP Engineering" } | ||
| } | ||
| POST /api/hub/entities | ||
| { "userId": "{userId}", "workspaceId": "{wsId}", | ||
| "profileSlug": "deal", | ||
| "title": "Acme prospect", | ||
| "properties": { "dealStage": "lead", "estimatedValue": 50000 } | ||
| } | ||
| POST /api/hub/relations | ||
| { "userId": "{userId}", | ||
| "sourceEntityId": "ent_person_alice", | ||
| "targetEntityId": "ent_deal_acme", | ||
| "type": "linked_to_deal" | ||
| } | ||
| ``` | ||
| **AI behavior — moving deals to won:** | ||
| When a deal transitions to `dealStage: "won"`, also propose client creation if not yet linked: | ||
| ```json | ||
| PATCH /api/hub/entities/ent_deal_acme | ||
| { "properties": { "dealStage": "won" } } | ||
| POST /api/hub/entities | ||
| { "userId": "{userId}", "workspaceId": "{wsId}", | ||
| "profileSlug": "client", | ||
| "title": "Acme (active)", | ||
| "properties": { "clientStatus": "active" } | ||
| } | ||
| POST /api/hub/relations | ||
| { "userId": "{userId}", | ||
| "sourceEntityId": "ent_person_alice", | ||
| "targetEntityId": "ent_client_acme", | ||
| "type": "is_client" | ||
| } | ||
| POST /api/hub/relations | ||
| { "userId": "{userId}", | ||
| "sourceEntityId": "ent_deal_acme", | ||
| "targetEntityId": "ent_client_acme", | ||
| "type": "produced_by_deal" | ||
| } | ||
| ``` | ||
| **AI behavior — campaign membership:** | ||
| When the user describes campaign members (segment for outreach, tracking, or automation), use polymorphic `member_of` relations. Members can be persons, companies, or deals: | ||
| ```json | ||
| POST /api/hub/relations | ||
| { "userId": "{userId}", | ||
| "sourceEntityId": "ent_person_alice", | ||
| "targetEntityId": "ent_campaign_enterprise", | ||
| "type": "member_of" | ||
| } | ||
| // Same relation type, different entity type | ||
| POST /api/hub/relations | ||
| { "userId": "{userId}", | ||
| "sourceEntityId": "ent_deal_acme", | ||
| "targetEntityId": "ent_campaign_enterprise", | ||
| "type": "member_of" | ||
| } | ||
| ``` | ||
| **Property names:** | ||
| - `dealStage` (not `crmStatus` or `status`) — values: lead, contacted, qualifying, proposal, negotiating, won, lost, inactive | ||
| - `clientStatus` (post-win only) — values: active, paused, churned | ||
| - Identities (person, company) carry no sales state | ||
| **Why separate identity from state:** | ||
| This model enables renewals (new deal linking to existing client), multi-stakeholder deals (multiple `linked_to_deal` relations per deal), campaigns with mixed entity types (persons + companies + deals as members), and clean churn tracking. It matches Synap's core pattern: entities + relations = graph. | ||
| ## Common mistakes | ||
| 1. **Creating orphan entities.** Always connect to at least one other entity on creation. Search first; if nothing links, reconsider whether this should be memory. | ||
| 2. **Guessing profile slugs.** Always `GET /profiles` first. `deal`, `capture`, and custom profiles may not exist in this workspace. | ||
| 3. **Using the deprecated `type` field.** Always `profileSlug`. | ||
| 4. **Treating `"proposed"` as an error.** It's a governance queue. | ||
| 5. **Forcing `source` to bypass governance.** Governance is determined by the agent user + whitelist, not by `source`. Don't set it. | ||
| 6. **Not knowing your userId.** Use `{SYNAP_USER_ID}` from the env (set by `synap connect`). Or call `GET /api/hub/users/me` → `.id` once and cache it. Never hardcode or guess. | ||
| 7. **Skipping the search step.** Duplicates degrade the graph more than missing data. | ||
| 8. **Forgetting that `GET /channels/personal` needs `hub-protocol.write`** scope — it's get-or-create, not a pure read. | ||
| ## AI Inline Patterns — reference entities in your replies | ||
| When the user is interacting with Synap's AI Companion (the in-browser chat panel), you can embed **inline chips** directly in your reply text. These render as clickable buttons the user can tap to open entities, views, or documents without leaving the conversation. | ||
| ### Syntax | ||
| | Pattern | Renders as | Effect | | ||
| | ---------------------------- | --------------------------- | --------------------------------- | | ||
| | `[[entity:UUID\|Name]]` | Purple entity chip | Opens entity detail in side panel | | ||
| | `[[view:UUID\|Name]]` | Blue view chip | Opens view | | ||
| | `[[open:side\|view:UUID]]` | Amber "Open in side" button | Opens view in side panel | | ||
| | `[[open:main\|view:UUID]]` | Amber "Open" button | Opens view in main panel | | ||
| | `[[open:side\|entity:UUID]]` | Amber "Open in side" button | Opens entity in side panel | | ||
| | `[[run:UUID\|Label]]` | Green "Run" button | Navigates to automation entity | | ||
| | `[[doc:UUID\|Name]]` | Gray doc chip | Opens document | | ||
| ### Rules | ||
| - **Always use real IDs.** Never hallucinate UUIDs. Only emit patterns for entities/views you just created or retrieved via Hub Protocol. | ||
| - **Emit after creation.** When you create a view or entity, immediately reference it: `"Created your pipeline → [[view:abc123|Active Tasks]]"` | ||
| - **Prefer side panel.** Use `[[open:side|view:UUID]]` so the user keeps their current context. | ||
| - **Only in Companion replies.** These patterns are silently ignored in non-companion channels, documents, and memory. Do not use them there. | ||
| - **Combine with prose.** Don't lead with a chip — embed it naturally: `"Here are your open deals → [[view:xyz|Deals Pipeline]] · [[open:side|view:xyz]]"` | ||
| ## When you need more | ||
| - Linking conventions, auto-sync table, relation types → **`linking.md`** | ||
| - Full governance whitelist, proposal lifecycle, agent users → **`governance.md`** | ||
| - Unstructured capture pipeline → **`capture.md`** | ||
| - Extending the data model (new profiles, new properties) → install the **`synap-schema`** skill | ||
| - Building views, dashboards, and bento layouts → install the **`synap-ui`** skill | ||
| ## ViewFrame Cells — Custom View Generation | ||
| ViewFrame is the standard way to create custom data visualizations in Synap. Use it whenever an existing cell (table, kanban, list, chart) does not cover the needed chart type, 3D layout, map, or bespoke AI-generated UI. | ||
| ### When to Use ViewFrame | ||
| | Situation | Action | | ||
| | ---------------------------------------------------------------------- | ----------------------------- | | ||
| | An existing cell or view type covers the need | Use the existing cell or view | | ||
| | User asks for a specific chart type, map, 3D scene, or custom layout | Generate a ViewFrame widget | | ||
| | User says "show X as a [funnel / heatmap / treemap / scatter / globe]" | Generate a ViewFrame widget | | ||
| ### What ViewFrame Is | ||
| - A sandboxed iframe that renders any ES module (React component or plain JS module) | ||
| - Dependencies resolved at runtime via **esm.sh import maps** — no build step | ||
| - The host injects a `SynapWidget` bridge for data access (same postMessage protocol as iframe widgets) | ||
| - Security: `sandbox="allow-scripts allow-modals allow-popups"`, no `allow-same-origin`, no cookies, no pod token | ||
| ### Register a Widget via the Hub Protocol | ||
| List installed widgets: | ||
| ``` | ||
| GET /api/hub/widget-definitions?workspaceId={workspaceId} | ||
| Authorization: Bearer {SYNAP_HUB_API_KEY} | ||
| ``` | ||
| Install a new ViewFrame widget (creates a proposal for user review): | ||
| ``` | ||
| POST /api/hub/widget-definitions | ||
| Authorization: Bearer {SYNAP_HUB_API_KEY} | ||
| Content-Type: application/json | ||
| { | ||
| "userId": "{SYNAP_USER_ID}", | ||
| "workspaceId": "{workspaceId}", | ||
| "typeKey": "deal-stage-funnel", | ||
| "name": "Deal Stage Funnel", | ||
| "description": "Funnel chart of deal pipeline stages", | ||
| "rendererType": "iframe", | ||
| "rendererSource": "<full HTML document — see template below>", | ||
| "defaultSize": { "w": 8, "h": 6 }, | ||
| "category": "visualization" | ||
| } | ||
| ``` | ||
| `typeKey` must be kebab-case matching `/^[a-z][a-z0-9-]+$/`. Use a descriptive name specific to the widget's content. | ||
| The response carries `status: "ok"` (installed immediately) or `status: "proposed"` (queued for user review — surface `reviewUrl` to the user). | ||
| ### The SynapWidget Bridge (inside the iframe) | ||
| `window.SynapWidget` is injected automatically — do NOT import or `<script>` it. | ||
| ```js | ||
| SynapWidget.onInit(async ({ config, context }) => { | ||
| // context: { workspaceId, viewId?, entityId?, sdkVersion } | ||
| const items = await SynapWidget.query("list_entities", { | ||
| profileSlug: "deal", // or 'task', 'person', 'company', any custom slug | ||
| limit: 200, | ||
| }); | ||
| render(items ?? []); | ||
| SynapWidget.resize(document.body.scrollHeight); | ||
| }); | ||
| ``` | ||
| All `query()` calls return a Promise. Entity shape: `{ id, title, profileSlug, properties, createdAt, … }`. | ||
| Navigation and notifications: | ||
| ```js | ||
| SynapWidget.navigate({ entityId: "entity-uuid" }); // opens entity detail | ||
| SynapWidget.toast("Done!", "success"); // 'success' | 'error' | 'info' | ||
| ``` | ||
| ### Common Dependency Patterns (esm.sh import map) | ||
| ```html | ||
| <script type="importmap"> | ||
| { | ||
| "imports": { | ||
| "react": "https://esm.sh/react@19", | ||
| "react-dom/client": "https://esm.sh/react-dom@19/client", | ||
| "react/jsx-runtime": "https://esm.sh/react@19/jsx-runtime", | ||
| "recharts": "https://esm.sh/recharts@2.12.0" | ||
| } | ||
| } | ||
| </script> | ||
| ``` | ||
| Common library choices: | ||
| | Category | Packages | | ||
| | -------- | -------------------------------------------------------------- | | ||
| | Data viz | `recharts@2.12.0`, `d3@7`, `chart.js@4`, `observable-plot@0.6` | | ||
| | Tables | `@tanstack/react-table@8` | | ||
| | 3D | `three@0.165.0`, `@react-three/fiber@8`, `@react-three/drei@9` | | ||
| | Maps | `leaflet@1.9.4`, `react-leaflet@4` | | ||
| ### Minimal Widget Template | ||
| ```html | ||
| <!DOCTYPE html> | ||
| <html> | ||
| <head> | ||
| <meta charset="utf-8" /> | ||
| <style> | ||
| * { | ||
| box-sizing: border-box; | ||
| margin: 0; | ||
| } | ||
| body { | ||
| font-family: -apple-system, sans-serif; | ||
| padding: 16px; | ||
| background: transparent; | ||
| } | ||
| </style> | ||
| <script type="importmap"> | ||
| { | ||
| "imports": { | ||
| "react": "https://esm.sh/react@19", | ||
| "react-dom/client": "https://esm.sh/react-dom@19/client", | ||
| "react/jsx-runtime": "https://esm.sh/react@19/jsx-runtime" | ||
| } | ||
| } | ||
| </script> | ||
| </head> | ||
| <body> | ||
| <div id="root"></div> | ||
| <script type="module"> | ||
| import { createRoot } from "react-dom/client"; | ||
| SynapWidget.onInit(async ({ context }) => { | ||
| const items = await SynapWidget.query("list_entities", { | ||
| profileSlug: "deal", | ||
| limit: 200, | ||
| }).catch(() => []); | ||
| // Build your UI here. Plain DOM or React both work. | ||
| document.getElementById("root").textContent = | ||
| `Loaded ${(items ?? []).length} deals`; | ||
| SynapWidget.resize(document.body.scrollHeight); | ||
| }); | ||
| </script> | ||
| </body> | ||
| </html> | ||
| ``` | ||
| ### Rules | ||
| - **Always call `SynapWidget.onInit()`** — the host will not send data until you register this handler. | ||
| - **Call `SynapWidget.resize()`** after rendering to prevent clipping. | ||
| - **Handle errors** — `query()` can fail; always `.catch()`. | ||
| - **Transparent background** — `background: transparent` on `body` inherits the host surface color. | ||
| - **No external fetch** — the sandbox has no cross-origin access; all data must go through `SynapWidget`. | ||
| - **Inline all styles** — no external CSS imports; CDN JS via import map is fine. | ||
| --- | ||
| ## Authentication | ||
| ``` | ||
| Authorization: Bearer {SYNAP_HUB_API_KEY} | ||
| X-Workspace-Id: {workspaceId} (optional; also pass in body/query) | ||
| Scopes: | ||
| hub-protocol.read → most GET endpoints | ||
| hub-protocol.write → all writes AND GET /channels/personal | ||
| ``` |
| /** | ||
| * synap connect | ||
| * | ||
| * Quick connection: link existing OpenClaw to existing Synap pod. | ||
| * Wire an AI surface to a configured Synap pod. Credentials come from stored | ||
| * pod profiles (synap pods add) — no re-authentication needed. | ||
| * | ||
| * Usage: | ||
| * synap connect (interactive: pick surface + pod) | ||
| * synap connect --target=claude-code | ||
| * synap connect --target=claude-desktop | ||
| * synap connect --target=cursor | ||
| * synap connect --target=raycast | ||
| * synap connect --target=openclaw | ||
| * synap connect --target=claude-code --name=team (use specific pod profile) | ||
| * | ||
| * Escape hatch for scripting: | ||
| * synap connect --pod-url <url> --api-key <key> (bypass stored profiles) | ||
| */ | ||
@@ -9,4 +22,8 @@ interface ConnectOptions { | ||
| apiKey?: string; | ||
| target?: string; | ||
| list?: boolean; | ||
| name?: string; | ||
| manualKey?: boolean; | ||
| } | ||
| export declare function connect(opts: ConnectOptions): Promise<void>; | ||
| export {}; |
+154
-74
| /** | ||
| * synap connect | ||
| * | ||
| * Quick connection: link existing OpenClaw to existing Synap pod. | ||
| * Wire an AI surface to a configured Synap pod. Credentials come from stored | ||
| * pod profiles (synap pods add) — no re-authentication needed. | ||
| * | ||
| * Usage: | ||
| * synap connect (interactive: pick surface + pod) | ||
| * synap connect --target=claude-code | ||
| * synap connect --target=claude-desktop | ||
| * synap connect --target=cursor | ||
| * synap connect --target=raycast | ||
| * synap connect --target=openclaw | ||
| * synap connect --target=claude-code --name=team (use specific pod profile) | ||
| * | ||
| * Escape hatch for scripting: | ||
| * synap connect --pod-url <url> --api-key <key> (bypass stored profiles) | ||
| */ | ||
| import prompts from "prompts"; | ||
| import ora from "ora"; | ||
| import chalk from "chalk"; | ||
| import { log, banner } from "../utils/logger.js"; | ||
| import { detectOpenClaw, readOpenClawConfig, writeOpenClawConfig, setConfigValue } from "../lib/openclaw.js"; | ||
| import { checkPodHealth, setupAgent } from "../lib/pod.js"; | ||
| import { checkPodHealth, listPodProfiles } from "../lib/pod.js"; | ||
| import { installForTarget, isTargetName, listTargets, resolveWorkspaceId, TARGETS, } from "../lib/targets.js"; | ||
| import { podsAdd } from "./pods.js"; | ||
| export async function connect(opts) { | ||
| banner(); | ||
| log.heading("Connect to Synap Pod"); | ||
| // Get pod URL | ||
| if (opts.list) { | ||
| listTargets(); | ||
| return; | ||
| } | ||
| // ── Step 1: Pod (data source) ─────────────────────────────────────────── | ||
| // Resolve pod first — the surface config depends on which pod to point at. | ||
| let podUrl = opts.podUrl; | ||
| if (!podUrl) { | ||
| const { url } = await prompts({ | ||
| type: "text", | ||
| name: "url", | ||
| message: "Synap pod URL:", | ||
| initial: "http://localhost:4000", | ||
| }); | ||
| podUrl = url; | ||
| let apiKey = opts.apiKey; | ||
| let workspaceId; | ||
| let agentUserId; | ||
| if (!podUrl || !apiKey) { | ||
| const resolved = await resolvePodFromProfiles(opts.name); | ||
| if (!resolved) | ||
| return; | ||
| podUrl = resolved.podUrl; | ||
| apiKey = resolved.hubApiKey; | ||
| workspaceId = resolved.workspaceId || undefined; | ||
| agentUserId = resolved.agentUserId || undefined; | ||
| } | ||
| if (!podUrl) | ||
| return; | ||
| // Health check | ||
| // ── Step 2: Health check ──────────────────────────────────────────────── | ||
| const spinner = ora("Checking pod health...").start(); | ||
| const status = await checkPodHealth(podUrl); | ||
| if (!status.healthy) { | ||
| const health = await checkPodHealth(podUrl); | ||
| if (!health.healthy) { | ||
| spinner.fail(`Pod not reachable at ${podUrl}`); | ||
@@ -35,63 +55,123 @@ return; | ||
| spinner.succeed(`Pod healthy at ${podUrl}`); | ||
| // Get or generate API key | ||
| let apiKey = opts.apiKey; | ||
| if (!apiKey) { | ||
| const { method } = await prompts({ | ||
| type: "select", | ||
| name: "method", | ||
| message: "Authentication:", | ||
| choices: [ | ||
| { title: "Paste existing API key", value: "paste" }, | ||
| { title: "Generate new key (needs PROVISIONING_TOKEN)", value: "generate" }, | ||
| ], | ||
| // ── Step 3: Target (AI surface) ───────────────────────────────────────── | ||
| const target = await resolveTarget(opts.target); | ||
| if (!target) | ||
| return; | ||
| // ── Step 4: Workspace scope ───────────────────────────────────────────── | ||
| // Ask once and inject into MCP URLs. Skipped for Raycast — it reads | ||
| // workspaceId directly from ~/.synap/config.json (the pod profile). | ||
| if (target !== "raycast") { | ||
| workspaceId = await resolveWorkspaceId({ podUrl, apiKey, workspaceId }); | ||
| } | ||
| // ── Step 5: Install ───────────────────────────────────────────────────── | ||
| log.heading(`Connecting ${TARGETS[target].label} → ${podUrl}`); | ||
| const ok = await installForTarget(target, { podUrl, apiKey, workspaceId, agentUserId }); | ||
| log.blank(); | ||
| if (ok) { | ||
| log.success(`${TARGETS[target].label} connected to ${podUrl}`); | ||
| log.dim("Run 'synap connections' to see all surface connections."); | ||
| } | ||
| else { | ||
| log.warn(`${TARGETS[target].label} install did not complete — see above.`); | ||
| } | ||
| } | ||
| // ─── Helpers ───────────────────────────────────────────────────────────────── | ||
| async function resolvePodFromProfiles(preferredName) { | ||
| let profiles = listPodProfiles(); | ||
| // No pods yet — offer to add one inline instead of dead-ending | ||
| if (profiles.length === 0) { | ||
| log.blank(); | ||
| log.info("No pods configured yet."); | ||
| const { shouldAdd } = await prompts({ | ||
| type: "confirm", | ||
| name: "shouldAdd", | ||
| message: "Add a pod now?", | ||
| initial: true, | ||
| }); | ||
| if (method === "paste") { | ||
| const { key } = await prompts({ | ||
| type: "password", | ||
| name: "key", | ||
| message: "Hub Protocol API key:", | ||
| }); | ||
| apiKey = key; | ||
| if (!shouldAdd) | ||
| return null; | ||
| log.blank(); | ||
| await podsAdd(); | ||
| profiles = listPodProfiles(); | ||
| if (profiles.length === 0) | ||
| return null; // user bailed out of add flow | ||
| } | ||
| // --name flag: use that profile directly | ||
| if (preferredName) { | ||
| const match = profiles.find((p) => p.name === preferredName); | ||
| if (!match) { | ||
| log.error(`Pod profile '${preferredName}' not found.`); | ||
| log.dim("Available: " + profiles.map((p) => p.name).join(", ")); | ||
| return null; | ||
| } | ||
| else { | ||
| const { token } = await prompts({ | ||
| type: "password", | ||
| name: "token", | ||
| message: "PROVISIONING_TOKEN:", | ||
| }); | ||
| if (token) { | ||
| const genSpinner = ora("Creating agent credentials...").start(); | ||
| try { | ||
| const result = await setupAgent(podUrl, token); | ||
| apiKey = result.hubApiKey; | ||
| genSpinner.succeed("Credentials created"); | ||
| // Save to OpenClaw config | ||
| const oc = detectOpenClaw(); | ||
| if (oc.found) { | ||
| const config = readOpenClawConfig() ?? {}; | ||
| setConfigValue(config, "synap.podUrl", podUrl); | ||
| setConfigValue(config, "synap.workspaceId", result.workspaceId); | ||
| setConfigValue(config, "synap.agentUserId", result.agentUserId); | ||
| writeOpenClawConfig(config); | ||
| } | ||
| } | ||
| catch (err) { | ||
| genSpinner.fail(err instanceof Error ? err.message : "Failed"); | ||
| return; | ||
| } | ||
| } | ||
| log.info(`Using pod: ${chalk.bold(match.name)} ${chalk.dim(match.config.podUrl)}`); | ||
| return match.config; | ||
| } | ||
| // Single profile: show it so the user knows what they're connecting to | ||
| if (profiles.length === 1) { | ||
| const p = profiles[0]; | ||
| log.info(`Pod: ${chalk.bold(p.name)} ${chalk.dim(p.config.podUrl)}`); | ||
| return p.config; | ||
| } | ||
| // Multiple profiles: let user pick | ||
| const active = profiles.find((p) => p.active); | ||
| const { profileName } = await prompts({ | ||
| type: "select", | ||
| name: "profileName", | ||
| message: "Which pod?", | ||
| choices: [ | ||
| ...profiles.map((p) => ({ | ||
| title: `${chalk.bold(p.name)}${p.active ? chalk.green(" ← active") : ""} ${chalk.dim(p.config.podUrl)}`, | ||
| value: p.name, | ||
| })), | ||
| { title: chalk.dim("Add a new pod…"), value: "__add__" }, | ||
| ], | ||
| initial: active ? profiles.indexOf(active) : 0, | ||
| }); | ||
| if (!profileName) | ||
| return null; | ||
| if (profileName === "__add__") { | ||
| log.blank(); | ||
| await podsAdd(); | ||
| const updated = listPodProfiles(); | ||
| // Return the most recently added profile (last in list) | ||
| const newest = updated.filter((p) => !profiles.some((o) => o.name === p.name)); | ||
| if (newest.length > 0) { | ||
| log.info(`Using pod: ${chalk.bold(newest[0].name)} ${chalk.dim(newest[0].config.podUrl)}`); | ||
| return newest[0].config; | ||
| } | ||
| return null; | ||
| } | ||
| if (!apiKey) | ||
| return; | ||
| log.blank(); | ||
| log.success("Connected to Synap pod"); | ||
| log.blank(); | ||
| log.info("Set these environment variables:"); | ||
| log.dim(` export SYNAP_HUB_API_KEY="${apiKey}"`); | ||
| log.dim(` export SYNAP_POD_URL="${podUrl}"`); | ||
| log.blank(); | ||
| log.info("Install the skill:"); | ||
| log.dim(" openclaw skills install synap"); | ||
| return profiles.find((p) => p.name === profileName).config; | ||
| } | ||
| async function resolveTarget(raw) { | ||
| if (raw) { | ||
| if (!isTargetName(raw)) { | ||
| log.error(`Unknown target: ${raw}`); | ||
| log.dim("Run `synap connect --list` to see supported targets."); | ||
| return null; | ||
| } | ||
| return raw; | ||
| } | ||
| const { target } = await prompts({ | ||
| type: "select", | ||
| name: "target", | ||
| message: "Which AI surface are you connecting?", | ||
| choices: Object.values(TARGETS).map((t) => ({ | ||
| title: `${t.label}${describeCaps(t.supports)}`, | ||
| value: t.name, | ||
| })), | ||
| }); | ||
| if (!target || !isTargetName(target)) | ||
| return null; | ||
| return target; | ||
| } | ||
| function describeCaps(supports) { | ||
| const parts = []; | ||
| if (supports.skills) | ||
| parts.push("skills"); | ||
| if (supports.mcp) | ||
| parts.push("MCP"); | ||
| return parts.length ? ` ${chalk.dim(`(${parts.join(" + ")})`)}` : ""; | ||
| } | ||
| //# sourceMappingURL=connect.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"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"} |
@@ -242,11 +242,28 @@ /** | ||
| log.blank(); | ||
| // ── Connections ────────────────────────────────────────────────────────── | ||
| log.heading("Connections"); | ||
| log.info("Already wired:"); | ||
| log.dim(" ✓ Synap pod ↔ OpenClaw (Hub API key, workspace, agent user)"); | ||
| log.dim(" ✓ synap skill installed"); | ||
| log.blank(); | ||
| log.info("Needs your input (optional):"); | ||
| log.dim(" ○ Channels (Telegram, Discord, WhatsApp, Slack, Signal...)"); | ||
| log.dim(" → synap openclaw open channels"); | ||
| log.dim(" ○ Extra skills from ClawHub"); | ||
| log.dim(" → synap openclaw open skills"); | ||
| log.blank(); | ||
| log.info("Connect an AI client:"); | ||
| log.dim(" Claude Desktop synap openclaw connect --client claude"); | ||
| log.dim(" Cursor synap openclaw connect --client cursor"); | ||
| log.dim(" Windsurf synap openclaw connect --client windsurf"); | ||
| log.blank(); | ||
| log.info("Useful commands:"); | ||
| log.dim(" synap openclaw — status overview"); | ||
| log.dim(" synap openclaw dashboard — open the web UI"); | ||
| log.dim(" synap openclaw connect — MCP config for Claude Desktop / Cursor / Windsurf"); | ||
| log.dim(" synap openclaw token — print the gateway token"); | ||
| log.dim(" synap openclaw configure — change AI provider"); | ||
| log.dim(" synap openclaw doctor — diagnostics"); | ||
| log.dim(" synap openclaw logs — view container logs"); | ||
| log.dim(" synap status — full health check"); | ||
| log.dim(" synap openclaw — status overview"); | ||
| log.dim(" synap openclaw connections — AI providers, skills, channels, MCP clients"); | ||
| log.dim(" synap openclaw dashboard — open the web UI"); | ||
| log.dim(" synap openclaw open <tab> — open dashboard at channels/skills/config/..."); | ||
| log.dim(" synap openclaw token — print the gateway token"); | ||
| log.dim(" synap openclaw configure — change AI provider"); | ||
| log.dim(" synap openclaw doctor — diagnostics"); | ||
| log.dim(" synap status — full health check"); | ||
| log.blank(); | ||
@@ -253,0 +270,0 @@ log.info("Try it — connect a client and ask your agent:"); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"finish.js","sourceRoot":"","sources":["../../src/commands/finish.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"finish.js","sourceRoot":"","sources":["../../src/commands/finish.ts"],"names":[],"mappings":"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"} |
+188
-10
@@ -22,2 +22,29 @@ /** | ||
| banner(); | ||
| // ── Pre-flight: "no pod anywhere" gate ────────────────────────────────── | ||
| // Keep this CLI laptop/agent-focused. If the user ran `synap init` without | ||
| // any signal of an existing pod, point them at the two supported ways to | ||
| // get one (self-host via ./synap install on a server, or a managed pod on | ||
| // synap.live) and exit. This replaces silent failure / interactive | ||
| // provisioning when there's nothing to connect to. | ||
| // | ||
| // A --pod-url flag that's explicitly unreachable is a separate diagnostic | ||
| // (handled below once checkPodHealth has confirmed). | ||
| if (!opts.podUrl) { | ||
| if (await hasAnyPodSignal()) { | ||
| // fall through into the normal flow | ||
| } | ||
| else { | ||
| printNoPodInstructions(); | ||
| process.exit(2); | ||
| } | ||
| } | ||
| else { | ||
| // Explicit URL was passed — probe it before letting downstream assume | ||
| // reachability. Fail loud with a helpful hint instead of silent 500s. | ||
| const probe = await checkPodHealth(opts.podUrl); | ||
| if (!probe.healthy) { | ||
| printUnreachablePodInstructions(opts.podUrl); | ||
| process.exit(2); | ||
| } | ||
| } | ||
| // ── Auto-detect environment ───────────────────────────────────────────── | ||
@@ -528,6 +555,32 @@ const oc = detectOpenClaw(); | ||
| } | ||
| const { installDomain } = await prompts({ | ||
| type: "text", | ||
| name: "installDomain", | ||
| message: "Domain for this pod (use localhost for local setup):", | ||
| initial: "localhost", | ||
| }); | ||
| if (!installDomain) | ||
| return null; | ||
| let installEmail = ""; | ||
| if (installDomain !== "localhost") { | ||
| const emailPrompt = await prompts({ | ||
| type: "text", | ||
| name: "installEmail", | ||
| message: "Email for Let's Encrypt SSL certificates:", | ||
| }); | ||
| installEmail = emailPrompt.installEmail ?? ""; | ||
| if (!installEmail) { | ||
| log.error("Email is required for non-localhost domains."); | ||
| return null; | ||
| } | ||
| } | ||
| const escapedDomain = String(installDomain).replace(/'/g, "'\\''"); | ||
| const escapedEmail = String(installEmail).replace(/'/g, "'\\''"); | ||
| const installCmd = installDomain === "localhost" | ||
| ? `curl -fsSL https://raw.githubusercontent.com/Synap-core/backend/main/install.sh | bash -s -- --domain '${escapedDomain}'` | ||
| : `curl -fsSL https://raw.githubusercontent.com/Synap-core/backend/main/install.sh | bash -s -- --domain '${escapedDomain}' --email '${escapedEmail}'`; | ||
| log.blank(); | ||
| log.info("Install Synap pod with:"); | ||
| log.blank(); | ||
| console.log(chalk.cyan(" curl -fsSL https://raw.githubusercontent.com/Synap-core/backend/main/install.sh | bash")); | ||
| console.log(chalk.cyan(` ${installCmd}`)); | ||
| log.blank(); | ||
@@ -542,3 +595,3 @@ const { proceed } = await prompts({ | ||
| try { | ||
| execSync("curl -fsSL https://raw.githubusercontent.com/Synap-core/backend/main/install.sh | bash", { stdio: "inherit" }); | ||
| execSync(installCmd, { stdio: "inherit" }); | ||
| return "http://localhost:4000"; | ||
@@ -822,4 +875,5 @@ } | ||
| const ocRuntime = detectOpenClaw(); | ||
| // Only write local config if OpenClaw has a local config file to write to | ||
| if (ocRuntime.runtime !== "docker") { | ||
| if (ocRuntime.runtime === "docker") { | ||
| // Docker path: write via openclaw config set | ||
| const containerName = ocRuntime.containerName ?? "openclaw"; | ||
| const { configureOc } = await prompts({ | ||
@@ -832,2 +886,46 @@ type: "confirm", | ||
| if (configureOc) { | ||
| const synapProvider = { | ||
| baseUrl: `${podUrl}/v1`, | ||
| api: "openai-completions", | ||
| apiKey, | ||
| models: [ | ||
| { id: "synap/auto", name: "Synap Auto", contextWindow: 200000, maxTokens: 8192 }, | ||
| { id: "synap/balanced", name: "Synap Balanced", contextWindow: 131072, maxTokens: 8192 }, | ||
| { id: "synap/advanced", name: "Synap Advanced", contextWindow: 200000, maxTokens: 8192 }, | ||
| ], | ||
| }; | ||
| const spinner = ora("Writing Synap IS provider to OpenClaw config...").start(); | ||
| try { | ||
| execSync(`docker exec ${containerName} openclaw config set models.providers.synap ${JSON.stringify(JSON.stringify(synapProvider))}`, { stdio: "pipe", timeout: 15000 }); | ||
| spinner.succeed("Synap IS registered as OpenClaw provider"); | ||
| log.dim("Available models: synap/auto, synap/balanced, synap/advanced"); | ||
| // Restart to apply (Docker has no hot reload) | ||
| try { | ||
| execSync(`docker restart ${containerName}`, { stdio: "pipe", timeout: 30000 }); | ||
| log.dim("Container restarted to pick up new config"); | ||
| } | ||
| catch { | ||
| log.warn("Restart failed — run manually: docker restart openclaw"); | ||
| } | ||
| } | ||
| catch (err) { | ||
| const stderr = err.stderr?.toString().trim(); | ||
| spinner.fail("Failed to set Synap IS provider"); | ||
| if (stderr) | ||
| log.dim(stderr); | ||
| log.dim("Run manually:"); | ||
| log.dim(` docker exec ${containerName} openclaw config set models.providers.synap.baseUrl ${podUrl}/v1`); | ||
| log.dim(` docker exec ${containerName} openclaw config set models.providers.synap.api openai-completions`); | ||
| } | ||
| } | ||
| } | ||
| else { | ||
| // Local install path: write to config file directly | ||
| const { configureOc } = await prompts({ | ||
| type: "confirm", | ||
| name: "configureOc", | ||
| message: "Configure Synap IS as OpenClaw AI provider?", | ||
| initial: true, | ||
| }); | ||
| if (configureOc) { | ||
| const config = readOpenClawConfig() ?? {}; | ||
@@ -848,7 +946,2 @@ setConfigValue(config, "models.providers.synap", { | ||
| } | ||
| else { | ||
| // Docker runtime — can't write config from host, tell user the command | ||
| log.success("IS is active. To configure it as OpenClaw provider:"); | ||
| log.dim(` docker exec ${ocRuntime.containerName ?? "openclaw"} openclaw config set models.providers.synap.baseUrl ${podUrl}/v1`); | ||
| } | ||
| } | ||
@@ -889,3 +982,3 @@ } | ||
| if (!authStatus.valid) { | ||
| log.info("Opening browser to sign in..."); | ||
| log.info("Opening browser to sign in and select your pod..."); | ||
| const spinner = ora("Waiting for browser authentication...").start(); | ||
@@ -899,2 +992,13 @@ const creds = await login(); | ||
| spinner.succeed(`Authenticated as ${creds.email}`); | ||
| // If the web flow already performed pod selection, use that result directly. | ||
| if (creds.podUrl && creds.podId) { | ||
| const healthSpinner = ora("Checking pod health...").start(); | ||
| const status = await checkPodHealth(creds.podUrl); | ||
| if (status.healthy) { | ||
| healthSpinner.succeed(`Pod ready at ${creds.podUrl}`); | ||
| return { url: creds.podUrl, podId: creds.podId }; | ||
| } | ||
| healthSpinner.warn(`Pod selected (${creds.podUrl}) but not yet reachable — may still be provisioning`); | ||
| return { url: creds.podUrl, podId: creds.podId }; | ||
| } | ||
| } | ||
@@ -907,2 +1011,6 @@ else { | ||
| return null; | ||
| // Short-circuit if credentials already carry a pod from a previous web-based selection. | ||
| if (token.podUrl && token.podId) { | ||
| return { url: token.podUrl, podId: token.podId }; | ||
| } | ||
| // List pods | ||
@@ -987,2 +1095,72 @@ const podsSpinner = ora("Fetching your pods...").start(); | ||
| /** | ||
| * Does the environment carry ANY signal that a Synap pod exists somewhere? | ||
| * Used by `init` to decide whether to run the full flow or short-circuit | ||
| * with a "no pod detected" instruction message. | ||
| * | ||
| * Treat these as signals (in cheap-to-expensive order): | ||
| * 1. SYNAP_POD_URL env var | ||
| * 2. A stored ~/.synap/pod-config.json from a previous run | ||
| * 3. A running pod detected on this machine | ||
| * 4. An OpenClaw install that already has synap.podUrl configured | ||
| */ | ||
| async function hasAnyPodSignal() { | ||
| if (process.env.SYNAP_POD_URL) | ||
| return true; | ||
| if (getLocalPodConfig()?.podUrl) | ||
| return true; | ||
| // OpenClaw may already carry a pod URL in its config — respect that. | ||
| try { | ||
| const oc = detectOpenClaw(); | ||
| const ocSynap = oc.config?.synap; | ||
| if (typeof ocSynap?.podUrl === "string" && ocSynap.podUrl.length > 0) | ||
| return true; | ||
| } | ||
| catch { | ||
| // ignore — detection is best-effort | ||
| } | ||
| // Last: probe the local machine. This is the expensive step. | ||
| const local = await detectLocalPod(); | ||
| return Boolean(local); | ||
| } | ||
| function printNoPodInstructions() { | ||
| const line = "─".repeat(63); | ||
| console.log(` | ||
| ┌${line}┐ | ||
| │ No Synap pod detected. │ | ||
| │ │ | ||
| │ You need a running pod before using @synap/cli init. │ | ||
| │ │ | ||
| │ Options: │ | ||
| │ │ | ||
| │ 1. Self-host on a server (free): │ | ||
| │ On your server, run: │ | ||
| │ curl -fsSL https://synap.live/install.sh | bash │ | ||
| │ Then come back and run: │ | ||
| │ npx @synap-core/cli init --pod-url https://your-pod... │ | ||
| │ │ | ||
| │ 2. Use a hosted pod ($): │ | ||
| │ Sign up at https://synap.live │ | ||
| │ Then run: │ | ||
| │ npx @synap-core/cli init --pod-url <your-pod-url> │ | ||
| │ │ | ||
| │ 3. Already running locally? Pass --pod-url: │ | ||
| │ npx @synap-core/cli init --pod-url http://localhost:4000 │ | ||
| └${line}┘ | ||
| `); | ||
| } | ||
| function printUnreachablePodInstructions(podUrl) { | ||
| console.log(""); | ||
| log.error(`Pod at ${podUrl} is not reachable.`); | ||
| log.blank(); | ||
| log.info("Checklist:"); | ||
| log.dim(" - Is the pod URL correct? (scheme + host + port)"); | ||
| log.dim(" - Is the pod container running? On the server: ./synap health"); | ||
| log.dim(" - Is there a firewall or reverse proxy in the way?"); | ||
| log.dim(" - For localhost setups, did you start the stack? ./synap start"); | ||
| log.blank(); | ||
| log.info("Once the pod is reachable, re-run:"); | ||
| log.dim(` npx @synap-core/cli init --pod-url ${podUrl}`); | ||
| log.blank(); | ||
| } | ||
| /** | ||
| * Probe the local machine for a running Synap pod. | ||
@@ -989,0 +1167,0 @@ * Returns the best URL candidate if found, null otherwise. |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"} |
@@ -27,2 +27,4 @@ /** | ||
| export declare function openclawConfigure(opts?: ConfigureOpts): Promise<void>; | ||
| export declare function openclawConnections(): void; | ||
| export declare function openclawOpen(section?: string): void; | ||
| export declare function openclawLogs(opts: { | ||
@@ -29,0 +31,0 @@ lines?: number; |
@@ -316,2 +316,5 @@ /** | ||
| const result = await requestDashboardDomainFromCp(creds.token, localConfig.podId); | ||
| if (result.domain.trim().toLowerCase() === envDomain.trim().toLowerCase()) { | ||
| throw new Error(`Refusing unsafe dashboard domain "${result.domain}": use a dedicated subdomain (e.g. openclaw.${envDomain}).`); | ||
| } | ||
| publicDomain = result.domain; | ||
@@ -339,2 +342,7 @@ authMode = result.authMode; | ||
| return; | ||
| if (subdomain.trim().toLowerCase() === envDomain.trim().toLowerCase()) { | ||
| log.error("OPENCLAW_DOMAIN cannot match DOMAIN. This causes redirect loops."); | ||
| log.dim(`Use a dedicated host, for example: openclaw.${envDomain}`); | ||
| return; | ||
| } | ||
| publicDomain = subdomain; | ||
@@ -556,2 +564,126 @@ authMode = "basic"; | ||
| } | ||
| // ─── Connections: unified view of what's connected ───────────────────────── | ||
| export function openclawConnections() { | ||
| banner(); | ||
| const oc = detectOpenClaw(); | ||
| if (!oc.found) { | ||
| log.error("OpenClaw is not running."); | ||
| return; | ||
| } | ||
| const publicUrl = getOpenClawPublicUrl(); | ||
| const gatewayPort = oc.gatewayPort ?? 18789; | ||
| const localUrl = `http://localhost:${gatewayPort}`; | ||
| const dashboardUrl = publicUrl ?? localUrl; | ||
| // ── AI Providers ───────────────────────────────────────────────────────── | ||
| log.heading("AI Providers"); | ||
| const ai = readOpenClawAiConfig(oc); | ||
| const synapProvider = readSynapProviderConfig(oc); | ||
| const hasAny = ai.anthropicKey || ai.openaiKey || ai.geminiKey || synapProvider; | ||
| if (!hasAny) { | ||
| log.warn("No provider configured"); | ||
| log.dim("Run: synap openclaw configure"); | ||
| } | ||
| else { | ||
| if (ai.anthropicKey) | ||
| log.success(`Anthropic ${maskKey(ai.anthropicKey)}`); | ||
| if (ai.openaiKey) | ||
| log.success(`OpenAI ${maskKey(ai.openaiKey)}`); | ||
| if (ai.geminiKey) | ||
| log.success(`Google Gemini ${maskKey(ai.geminiKey)}`); | ||
| if (synapProvider?.baseUrl) { | ||
| log.success(`Synap IS ${synapProvider.baseUrl}`); | ||
| log.dim(" Models: synap/auto, synap/balanced, synap/advanced"); | ||
| } | ||
| if (ai.primaryModel) | ||
| log.dim(`Primary model: ${ai.primaryModel}`); | ||
| } | ||
| // ── Skills ─────────────────────────────────────────────────────────────── | ||
| log.heading("Skills"); | ||
| const skills = readOpenClawSkills(oc); | ||
| if (skills.length > 0) { | ||
| for (const skill of skills) { | ||
| if (skill.toLowerCase().includes("synap")) { | ||
| log.success(`${skill} ${chalk.dim("(Synap knowledge graph + relay)")}`); | ||
| } | ||
| else { | ||
| log.info(skill); | ||
| } | ||
| } | ||
| } | ||
| else { | ||
| log.dim("None detected"); | ||
| } | ||
| log.dim(`Browse more: ${dashboardUrl}/#skills`); | ||
| // ── Channels ───────────────────────────────────────────────────────────── | ||
| log.heading("Channels"); | ||
| const channels = readOpenClawChannels(oc); | ||
| const channelTypes = [ | ||
| "telegram", | ||
| "discord", | ||
| "whatsapp", | ||
| "slack", | ||
| "signal", | ||
| "imessage", | ||
| "matrix", | ||
| ]; | ||
| for (const type of channelTypes) { | ||
| const connected = channels.some((c) => c.toLowerCase().includes(type)); | ||
| const label = type.charAt(0).toUpperCase() + type.slice(1); | ||
| if (connected) { | ||
| log.success(`${label.padEnd(12)}connected`); | ||
| } | ||
| else { | ||
| log.dim(`○ ${label.padEnd(12)}not connected`); | ||
| } | ||
| } | ||
| log.blank(); | ||
| log.dim(`Connect channels: ${dashboardUrl}/#channels`); | ||
| log.dim("Or: synap openclaw open channels"); | ||
| // ── MCP Clients ────────────────────────────────────────────────────────── | ||
| log.heading("MCP Clients"); | ||
| log.info("Connect Claude Desktop, Cursor, Windsurf to OpenClaw:"); | ||
| log.dim(" synap openclaw connect --client claude"); | ||
| log.dim(" synap openclaw connect --client cursor"); | ||
| log.dim(" synap openclaw connect --client windsurf"); | ||
| // ── Dashboard ──────────────────────────────────────────────────────────── | ||
| log.heading("Dashboard"); | ||
| log.info(chalk.cyan(dashboardUrl)); | ||
| if (!publicUrl) { | ||
| log.dim("Not publicly exposed — run: synap openclaw setup-domain"); | ||
| } | ||
| log.blank(); | ||
| } | ||
| // ─── Open: deep-link to dashboard sections ─────────────────────────────────── | ||
| const DASHBOARD_SECTIONS = ["channels", "skills", "config", "chat", "sessions", "logs"]; | ||
| export function openclawOpen(section) { | ||
| const oc = detectOpenClaw(); | ||
| if (!oc.found) { | ||
| log.error("OpenClaw is not running."); | ||
| return; | ||
| } | ||
| const publicUrl = getOpenClawPublicUrl(); | ||
| const gatewayPort = oc.gatewayPort ?? 18789; | ||
| const baseUrl = publicUrl ?? `http://localhost:${gatewayPort}`; | ||
| let url = baseUrl; | ||
| if (section) { | ||
| const s = section.toLowerCase(); | ||
| if (DASHBOARD_SECTIONS.includes(s)) { | ||
| url = `${baseUrl}/#${s}`; | ||
| } | ||
| else { | ||
| log.warn(`Unknown section "${section}". Known sections:`); | ||
| log.dim(` ${DASHBOARD_SECTIONS.join(", ")}`); | ||
| log.info(`Opening main dashboard instead: ${chalk.cyan(baseUrl)}`); | ||
| url = baseUrl; | ||
| } | ||
| } | ||
| log.info(`Opening ${chalk.cyan(url)}`); | ||
| try { | ||
| const open = process.platform === "darwin" ? "open" : "xdg-open"; | ||
| execSync(`${open} ${JSON.stringify(url)}`, { stdio: "ignore" }); | ||
| } | ||
| catch { | ||
| log.dim("Could not open browser automatically — open the URL above manually."); | ||
| } | ||
| } | ||
| // ─── Configure helpers ─────────────────────────────────────────────────────── | ||
@@ -932,2 +1064,71 @@ function verifyOpenclawCliReady(containerName) { | ||
| } | ||
| function readSynapProviderConfig(oc) { | ||
| if (!oc.found || oc.runtime !== "docker") | ||
| return null; | ||
| const containerName = oc.containerName ?? "openclaw"; | ||
| try { | ||
| const out = execSync(`docker exec ${containerName} openclaw config get models.providers.synap.baseUrl 2>/dev/null`, { encoding: "utf-8", timeout: 5000 }).trim(); | ||
| if (!out || out === "undefined" || out === "null") | ||
| return null; | ||
| return { baseUrl: out.replace(/^["']|["']$/g, "") }; | ||
| } | ||
| catch { | ||
| return null; | ||
| } | ||
| } | ||
| function readOpenClawSkills(oc) { | ||
| if (!oc.found) | ||
| return []; | ||
| if (oc.runtime === "docker") { | ||
| const containerName = oc.containerName ?? "openclaw"; | ||
| try { | ||
| const out = execSync(`docker exec ${containerName} openclaw skills list 2>/dev/null`, { encoding: "utf-8", timeout: 10000 }); | ||
| // OpenClaw's `skills list` output format varies; extract slug-like tokens. | ||
| const names = new Set(); | ||
| for (const line of out.split("\n")) { | ||
| const trimmed = line.trim(); | ||
| if (!trimmed || trimmed.startsWith("#") || /^(name|slug|version|installed)/i.test(trimmed)) { | ||
| continue; | ||
| } | ||
| // Pick the first slug-looking token on the line | ||
| const match = trimmed.match(/^([a-z0-9][\w-]+)\b/i); | ||
| if (match && match[1].length >= 3) { | ||
| names.add(match[1]); | ||
| } | ||
| } | ||
| return Array.from(names); | ||
| } | ||
| catch { | ||
| return []; | ||
| } | ||
| } | ||
| return []; | ||
| } | ||
| function readOpenClawChannels(oc) { | ||
| if (!oc.found) | ||
| return []; | ||
| if (oc.runtime === "docker") { | ||
| const containerName = oc.containerName ?? "openclaw"; | ||
| try { | ||
| const out = execSync(`docker exec ${containerName} openclaw channels list 2>/dev/null`, { encoding: "utf-8", timeout: 10000 }); | ||
| const names = new Set(); | ||
| for (const line of out.split("\n")) { | ||
| const trimmed = line.trim(); | ||
| if (!trimmed) | ||
| continue; | ||
| // Extract any line that mentions a known channel type | ||
| for (const type of ["telegram", "discord", "whatsapp", "slack", "signal", "imessage", "matrix"]) { | ||
| if (new RegExp(`\\b${type}\\b`, "i").test(trimmed)) { | ||
| names.add(type); | ||
| } | ||
| } | ||
| } | ||
| return Array.from(names); | ||
| } | ||
| catch { | ||
| return []; | ||
| } | ||
| } | ||
| return []; | ||
| } | ||
| async function requestDashboardDomainFromCp(cpToken, podId) { | ||
@@ -934,0 +1135,0 @@ const cpUrl = process.env.SYNAP_CP_URL ?? "https://api.synap.live"; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"openclaw.js","sourceRoot":"","sources":["../../src/commands/openclaw.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"openclaw.js","sourceRoot":"","sources":["../../src/commands/openclaw.ts"],"names":[],"mappings":"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"} |
| /** | ||
| * synap status | ||
| * | ||
| * Show Synap pod + OpenClaw health at a glance. | ||
| * API-only status: hits the pod's `/health` endpoint and related remote | ||
| * status endpoints. Never shells out to Docker; never SSHes. The bash | ||
| * `./synap health` on the pod host is the canonical local health check — | ||
| * this npm CLI is the remote / laptop-side view. | ||
| * | ||
| * Sources (all HTTP): | ||
| * - Pod `/health` (basic reachability + version) | ||
| * - Pod `/api/provision/status` (Intelligence Service state) | ||
| * - CP `/openclaw/status/:podId` for managed pods (via stored creds) | ||
| * | ||
| * Explicitly NOT sources anymore: | ||
| * - `docker ps` / `docker inspect` / `docker logs` (was getOpenClawDockerStatus) | ||
| * - `docker exec openclaw openclaw skills list` (was isSynapSkillInstalledInDocker) | ||
| * For those, the user runs `./synap health` on the pod host. | ||
| */ | ||
| export declare function status(): Promise<void>; |
+78
-220
| /** | ||
| * synap status | ||
| * | ||
| * Show Synap pod + OpenClaw health at a glance. | ||
| * API-only status: hits the pod's `/health` endpoint and related remote | ||
| * status endpoints. Never shells out to Docker; never SSHes. The bash | ||
| * `./synap health` on the pod host is the canonical local health check — | ||
| * this npm CLI is the remote / laptop-side view. | ||
| * | ||
| * Sources (all HTTP): | ||
| * - Pod `/health` (basic reachability + version) | ||
| * - Pod `/api/provision/status` (Intelligence Service state) | ||
| * - CP `/openclaw/status/:podId` for managed pods (via stored creds) | ||
| * | ||
| * Explicitly NOT sources anymore: | ||
| * - `docker ps` / `docker inspect` / `docker logs` (was getOpenClawDockerStatus) | ||
| * - `docker exec openclaw openclaw skills list` (was isSynapSkillInstalledInDocker) | ||
| * For those, the user runs `./synap health` on the pod host. | ||
| */ | ||
@@ -11,7 +24,4 @@ import chalk from "chalk"; | ||
| import { log, banner } from "../utils/logger.js"; | ||
| import { detectOpenClaw } from "../lib/openclaw.js"; | ||
| import { checkPodHealth, getLocalPodConfig } from "../lib/pod.js"; | ||
| import { runSecurityChecks, computeScore } from "../lib/hardening.js"; | ||
| import { execSync } from "child_process"; | ||
| import { isLoggedIn, getStoredToken, isTokenLocallyExpired, getOpenClawRemoteStatus } from "../lib/auth.js"; | ||
| import { checkPodHealth, getActivePodConfig, listPodProfiles } from "../lib/pod.js"; | ||
| import { isLoggedIn, getStoredToken, isTokenLocallyExpired, getOpenClawRemoteStatus, } from "../lib/auth.js"; | ||
| const __filename = fileURLToPath(import.meta.url); | ||
@@ -41,60 +51,2 @@ const __dirname = dirname(__filename); | ||
| } | ||
| /** | ||
| * Inspect the OpenClaw Docker container without needing CP auth. | ||
| * Works even when `openclaw` binary isn't installed (server Docker path). | ||
| */ | ||
| function getOpenClawDockerStatus() { | ||
| try { | ||
| // Find the container — try common name patterns | ||
| const psOut = execSync("docker ps -a --format '{{.Names}}\\t{{.Image}}\\t{{.Status}}' 2>/dev/null", { encoding: "utf-8", timeout: 4000 }); | ||
| let containerName = null; | ||
| let image = "unknown"; | ||
| for (const line of psOut.split("\n")) { | ||
| if (/openclaw/i.test(line)) { | ||
| const parts = line.split("\t"); | ||
| containerName = parts[0]?.trim() ?? null; | ||
| image = parts[1]?.trim() ?? "unknown"; | ||
| break; | ||
| } | ||
| } | ||
| if (!containerName) | ||
| return null; | ||
| // Get structured state + health | ||
| const inspectRaw = execSync(`docker inspect --format '{{.State.Status}}\\t{{if .State.Health}}{{.State.Health.Status}}{{else}}none{{end}}' ${containerName} 2>/dev/null`, { encoding: "utf-8", timeout: 4000 }).trim(); | ||
| const [state, healthRaw] = inspectRaw.split("\t"); | ||
| const health = healthRaw === "none" || !healthRaw ? null : healthRaw; | ||
| // Grab last 15 log lines, strip ANSI codes and docker timestamps | ||
| let logs = []; | ||
| try { | ||
| const rawLogs = execSync(`docker logs ${containerName} --tail 15 2>&1`, { encoding: "utf-8", timeout: 5000 }); | ||
| logs = rawLogs | ||
| .split("\n") | ||
| // Strip ANSI escape codes | ||
| .map((l) => l.replace(/\x1b\[[0-9;]*m/g, "").trim()) | ||
| // Strip docker log timestamps (2026-04-10T12:34:56.789Z ) | ||
| .map((l) => l.replace(/^\d{4}-\d{2}-\d{2}T[\d:.]+Z\s+/, "")) | ||
| .filter((l) => l.length > 0) | ||
| // Only show warnings, errors, or startup messages — skip noisy health pings | ||
| .filter((l) => { | ||
| const lower = l.toLowerCase(); | ||
| return (lower.includes("error") || | ||
| lower.includes("warn") || | ||
| lower.includes("fatal") || | ||
| lower.includes("start") || | ||
| lower.includes("listen") || | ||
| lower.includes("ready") || | ||
| lower.includes("connect") || | ||
| lower.includes("fail")); | ||
| }) | ||
| .slice(-8); // cap at 8 meaningful lines | ||
| } | ||
| catch { | ||
| // logs unavailable — not critical | ||
| } | ||
| return { state: state?.trim() ?? "unknown", health, image, logs }; | ||
| } | ||
| catch { | ||
| return null; | ||
| } | ||
| } | ||
| export async function status() { | ||
@@ -104,18 +56,13 @@ banner(); | ||
| const cliVersion = getCliVersion(); | ||
| log.info(`CLI v${cliVersion} ${chalk.dim("Update: npm update -g @synap/cli")}`); | ||
| // Hoist creds so all sections can use it | ||
| log.info(`CLI v${cliVersion} ${chalk.dim("Update: npm update -g @synap-core/cli")}`); | ||
| log.dim("Remote / API-only view. For local docker health, run ./synap health on the pod host."); | ||
| const creds = getStoredToken(); | ||
| // Auth status | ||
| // Strategy: show what we know locally first (email from stored creds), | ||
| // then validate with the server. If the server is unreachable, trust the | ||
| // local token as long as it hasn't locally expired. Only prompt to re-login | ||
| // when the server explicitly rejects it (401) or the local expiry has passed. | ||
| // ── Account ──────────────────────────────────────────────────────────── | ||
| log.heading("Account"); | ||
| let loggedIn = false; | ||
| if (creds) { | ||
| // Always show local identity immediately — don't wait for server | ||
| log.success(`Logged in as ${chalk.bold(creds.email)}`); | ||
| log.dim(`User ID: ${creds.userId}`); | ||
| if (isTokenLocallyExpired(creds)) { | ||
| // Local expiry passed — validate against server to confirm | ||
| // Local expiry passed — confirm with CP before declaring dead. | ||
| const authStatus = await isLoggedIn(); | ||
@@ -132,3 +79,3 @@ if (authStatus.valid) { | ||
| else { | ||
| // Token is locally fresh — validate in background but don't block on failure | ||
| // Token is locally fresh — validate in background but don't block on failure. | ||
| loggedIn = true; | ||
@@ -140,4 +87,3 @@ const authStatus = await isLoggedIn().catch(() => ({ valid: false })); | ||
| else { | ||
| // CP unreachable but token is fresh — trust it, just note it | ||
| log.dim(`Token fresh (CP unreachable — cached credentials in use)`); | ||
| log.dim("Token fresh (CP unreachable — cached credentials in use)"); | ||
| } | ||
@@ -149,97 +95,8 @@ } | ||
| } | ||
| // OpenClaw status | ||
| log.heading("OpenClaw"); | ||
| const oc = detectOpenClaw(); | ||
| let skillInstalled = false; | ||
| const localConfig = getLocalPodConfig(); | ||
| if (oc.found) { | ||
| const runtimeLabel = oc.runtime === "docker" | ||
| ? chalk.cyan(`Docker (${oc.containerName ?? "openclaw"})`) | ||
| : chalk.dim("local install"); | ||
| log.success(`Gateway: ${oc.gatewayRunning ? chalk.green("running") : chalk.yellow("stopped")} (port ${oc.gatewayPort ?? 18789}) [${runtimeLabel}]`); | ||
| if (oc.version) | ||
| log.info(`Version: ${oc.version}`); | ||
| const checks = runSecurityChecks(oc.version); | ||
| const score = computeScore(checks); | ||
| const passed = checks.filter((c) => c.passed).length; | ||
| log.info(`Security: ${score === "A" ? chalk.green(score) : score === "B" ? chalk.yellow(score) : chalk.red(score)} (${passed}/${checks.length})`); | ||
| } | ||
| else { | ||
| // Check Docker container (works even without CP login) | ||
| const dockerInfo = getOpenClawDockerStatus(); | ||
| if (dockerInfo) { | ||
| const { state, health, image, logs } = dockerInfo; | ||
| const stateLabel = state === "running" | ||
| ? chalk.green("running") | ||
| : state === "restarting" | ||
| ? chalk.yellow("restarting") | ||
| : state === "exited" | ||
| ? chalk.red("exited") | ||
| : chalk.dim(state); | ||
| log.info(`Container: ${stateLabel}${health ? ` (${health})` : ""} [${image}]`); | ||
| if (state === "running" && health !== "healthy") { | ||
| log.warn("Container is up but gateway health check hasn't passed yet"); | ||
| log.dim("Give it another minute, then: synap status"); | ||
| } | ||
| else if (state === "restarting") { | ||
| log.warn("Container is crash-looping — check logs below"); | ||
| } | ||
| else if (state === "exited") { | ||
| log.warn("Container has stopped — check logs below"); | ||
| log.dim("Restart: docker compose --profile openclaw up -d openclaw"); | ||
| } | ||
| if (logs.length > 0) { | ||
| log.blank(); | ||
| log.info("Recent container logs:"); | ||
| for (const line of logs) { | ||
| console.log(chalk.dim(` ${line}`)); | ||
| } | ||
| } | ||
| } | ||
| else if (localConfig?.podId && creds) { | ||
| // No Docker container visible here — check CP for remote provisioning state | ||
| const remoteStatus = await getOpenClawRemoteStatus(creds.token, localConfig.podId).catch(() => null); | ||
| if (remoteStatus === null) { | ||
| // CP unreachable — show what we know locally | ||
| log.dim(`Pod ID: ${localConfig.podId}`); | ||
| log.dim("CP unreachable — cannot check remote OpenClaw state"); | ||
| log.dim("If on the pod server, run: docker ps | grep openclaw"); | ||
| } | ||
| else if (remoteStatus.status === "not_provisioned") { | ||
| log.dim("Not provisioned on pod server. Run: synap init"); | ||
| } | ||
| else if (remoteStatus.status === "provisioning") { | ||
| log.info(`Pod server: ${chalk.yellow("provisioning")} — still starting up`); | ||
| log.dim("Check: docker logs openclaw --tail 30"); | ||
| log.dim("Once ready: synap finish"); | ||
| } | ||
| else if (remoteStatus.status === "running") { | ||
| log.success(`Pod server: ${chalk.green("running")}`); | ||
| if (remoteStatus.url) | ||
| log.dim(`URL: ${remoteStatus.url}`); | ||
| log.dim("Run synap finish to install the skill"); | ||
| } | ||
| else if (remoteStatus.status === "error") { | ||
| log.warn(`Pod server: ${chalk.red("error")} — provisioning failed`); | ||
| log.dim("Re-run: synap init"); | ||
| } | ||
| } | ||
| else { | ||
| log.dim("Not detected locally"); | ||
| if (!localConfig) { | ||
| log.dim("Run synap init to connect to a pod"); | ||
| } | ||
| else { | ||
| log.dim("Run synap init to set up OpenClaw"); | ||
| } | ||
| } | ||
| } | ||
| // Pod status | ||
| // ── Pod ──────────────────────────────────────────────────────────────── | ||
| const localConfig = getActivePodConfig(); | ||
| const podUrl = localConfig?.podUrl ?? process.env.SYNAP_POD_URL; | ||
| const allProfiles = listPodProfiles(); | ||
| log.heading("Synap Pod"); | ||
| const ocConfig = oc.found | ||
| ? oc.config?.synap | ||
| : null; | ||
| const podUrl = ocConfig?.podUrl ?? | ||
| localConfig?.podUrl ?? | ||
| process.env.SYNAP_POD_URL; | ||
| let podHealthy = false; | ||
| if (!podUrl) { | ||
@@ -250,2 +107,7 @@ log.dim("Not connected. Run: synap init"); | ||
| const pod = await checkPodHealth(podUrl); | ||
| podHealthy = pod.healthy; | ||
| if (allProfiles.length > 1) { | ||
| const active = allProfiles.find((p) => p.active); | ||
| log.info(`Active profile: ${chalk.bold(active?.name ?? "default")} ${chalk.dim("(synap pods list to see all)")}`); | ||
| } | ||
| log.info(`URL: ${podUrl}`); | ||
@@ -258,3 +120,3 @@ log.info(`Health: ${pod.healthy ? chalk.green("healthy") : chalk.red("unreachable")}`); | ||
| } | ||
| // Workspace Config section | ||
| // ── Workspace Config ─────────────────────────────────────────────────── | ||
| log.heading("Workspace Config"); | ||
@@ -269,5 +131,44 @@ if (localConfig) { | ||
| } | ||
| // Intelligence Service | ||
| // ── OpenClaw (remote state via CP, not local Docker) ─────────────────── | ||
| log.heading("OpenClaw (remote)"); | ||
| if (!localConfig?.podId) { // localConfig is the active pod config | ||
| log.dim("No pod ID on file — cannot query managed-pod OpenClaw state."); | ||
| log.dim("If self-hosted: run `./synap services status openclaw` on the pod host."); | ||
| } | ||
| else if (!creds) { | ||
| log.dim("Not logged in — cannot query CP for OpenClaw state."); | ||
| log.dim("Run: synap login"); | ||
| } | ||
| else { | ||
| const remote = await getOpenClawRemoteStatus(creds.token, localConfig.podId).catch(() => null); | ||
| if (remote === null) { | ||
| log.dim("CP unreachable — cannot check remote OpenClaw state"); | ||
| log.dim("If self-hosted: run `./synap services status openclaw` on the pod host."); | ||
| } | ||
| else if (remote.status === "not_provisioned") { | ||
| log.dim("Not provisioned on pod server. Run: synap init"); | ||
| } | ||
| else if (remote.status === "provisioning") { | ||
| log.info(`Pod server: ${chalk.yellow("provisioning")} — still starting up`); | ||
| log.dim("Check progress again in a minute."); | ||
| } | ||
| else if (remote.status === "running") { | ||
| log.success(`Pod server: ${chalk.green("running")}`); | ||
| if (remote.url) | ||
| log.dim(`URL: ${remote.url}`); | ||
| } | ||
| else if (remote.status === "error") { | ||
| log.warn(`Pod server: ${chalk.red("error")} — provisioning failed`); | ||
| log.dim("Re-run: synap init"); | ||
| } | ||
| } | ||
| // ── Intelligence Service (via pod's own endpoint) ────────────────────── | ||
| log.heading("Intelligence Service"); | ||
| if (podUrl) { | ||
| if (!podUrl) { | ||
| log.dim("No pod connected"); | ||
| } | ||
| else if (!podHealthy) { | ||
| log.dim("Pod unreachable — cannot check IS status"); | ||
| } | ||
| else { | ||
| try { | ||
@@ -307,43 +208,3 @@ const isRes = await fetch(`${podUrl}/api/provision/status`, { | ||
| } | ||
| else { | ||
| log.dim("No pod connected"); | ||
| } | ||
| // Synap skill | ||
| log.heading("Synap Skill"); | ||
| if (oc.found) { | ||
| if (oc.runtime === "docker") { | ||
| // Check inside the container | ||
| const { isSynapSkillInstalledInDocker } = await import("../lib/pod.js"); | ||
| const container = oc.containerName ?? "openclaw"; | ||
| try { | ||
| const installed = isSynapSkillInstalledInDocker(container); | ||
| if (installed) { | ||
| skillInstalled = true; | ||
| log.success(`Installed (inside ${container})`); | ||
| } | ||
| else { | ||
| log.dim(`Not installed. Run: docker exec ${container} openclaw skills install synap`); | ||
| log.dim("Or: synap finish"); | ||
| } | ||
| } | ||
| catch { | ||
| log.dim(`Could not check — try: docker exec ${container} openclaw skills list`); | ||
| } | ||
| } | ||
| else if (oc.skillsDir) { | ||
| const { existsSync } = await import("fs"); | ||
| const skillPath = join(oc.skillsDir, "synap"); | ||
| if (existsSync(skillPath)) { | ||
| skillInstalled = true; | ||
| log.success("Installed"); | ||
| } | ||
| else { | ||
| log.dim("Not installed. Run: openclaw skills install synap"); | ||
| } | ||
| } | ||
| } | ||
| else { | ||
| log.dim("Cannot check — OpenClaw not detected"); | ||
| } | ||
| // Next Steps section | ||
| // ── Next Steps ───────────────────────────────────────────────────────── | ||
| log.heading("Next Steps"); | ||
@@ -356,10 +217,7 @@ if (!loggedIn) { | ||
| } | ||
| else if (!oc.found) { | ||
| log.info("OpenClaw not running. Start it or run: synap init"); | ||
| else if (!podHealthy) { | ||
| log.info("Pod unreachable — check it with: ./synap health on the pod host"); | ||
| } | ||
| else if (!skillInstalled) { | ||
| log.info("Install skill: synap finish"); | ||
| } | ||
| else { | ||
| log.dim("All set. Use synap update to refresh the skill."); | ||
| log.dim("All set. To install/update the OpenClaw skill on your laptop: synap update"); | ||
| } | ||
@@ -366,0 +224,0 @@ log.blank(); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"} |
| /** | ||
| * synap update | ||
| * | ||
| * Update the synap skill and check for CLI updates. | ||
| * Update the synap skill and optionally trigger a server-side redeploy | ||
| * via Dokploy when DOKPLOY_API_KEY is configured. | ||
| * | ||
| * synap update — update skill + show service status | ||
| * synap update --server — also trigger Dokploy redeploy of control-plane | ||
| * synap update --all — trigger redeploy of all registered Dokploy services | ||
| */ | ||
| export declare function update(): Promise<void>; | ||
| export interface UpdateOptions { | ||
| server?: boolean; | ||
| all?: boolean; | ||
| } | ||
| export declare function update(opts?: UpdateOptions): Promise<void>; |
+116
-5
| /** | ||
| * synap update | ||
| * | ||
| * Update the synap skill and check for CLI updates. | ||
| * Update the synap skill and optionally trigger a server-side redeploy | ||
| * via Dokploy when DOKPLOY_API_KEY is configured. | ||
| * | ||
| * synap update — update skill + show service status | ||
| * synap update --server — also trigger Dokploy redeploy of control-plane | ||
| * synap update --all — trigger redeploy of all registered Dokploy services | ||
| */ | ||
| import chalk from "chalk"; | ||
| import ora from "ora"; | ||
@@ -10,6 +16,49 @@ import { log, banner } from "../utils/logger.js"; | ||
| import { installSynapSkill } from "../lib/pod.js"; | ||
| export async function update() { | ||
| function getDokployBase() { | ||
| const key = process.env.DOKPLOY_API_KEY ?? ""; | ||
| if (!key) | ||
| return null; | ||
| const domain = process.env.DEPLOY_DOMAIN ?? "deploy.synap.live"; | ||
| const url = process.env.DOKPLOY_URL ?? `https://${domain}`; | ||
| return { url, key }; | ||
| } | ||
| async function fetchApps() { | ||
| const dok = getDokployBase(); | ||
| if (!dok) | ||
| return []; | ||
| try { | ||
| const res = await fetch(`${dok.url}/api/application.all`, { | ||
| headers: { "x-api-key": dok.key }, | ||
| signal: AbortSignal.timeout(8000), | ||
| }); | ||
| if (!res.ok) | ||
| return []; | ||
| return (await res.json()); | ||
| } | ||
| catch { | ||
| return []; | ||
| } | ||
| } | ||
| async function triggerDeploy(appId) { | ||
| const dok = getDokployBase(); | ||
| if (!dok) | ||
| return false; | ||
| try { | ||
| const res = await fetch(`${dok.url}/api/application.deploy`, { | ||
| method: "POST", | ||
| headers: { "Content-Type": "application/json", "x-api-key": dok.key }, | ||
| body: JSON.stringify({ applicationId: appId }), | ||
| signal: AbortSignal.timeout(10000), | ||
| }); | ||
| return res.ok; | ||
| } | ||
| catch { | ||
| return false; | ||
| } | ||
| } | ||
| // ─── Main ──────────────────────────────────────────────────────────────────── | ||
| export async function update(opts = {}) { | ||
| banner(); | ||
| log.heading("Update"); | ||
| // Update skill | ||
| // ── 1. Skill update (OpenClaw) ──────────────────────────────────────────── | ||
| const oc = detectOpenClaw(); | ||
@@ -23,3 +72,3 @@ if (oc.found) { | ||
| catch (err) { | ||
| spinner.fail(err instanceof Error ? err.message : "Update failed"); | ||
| spinner.fail(err instanceof Error ? err.message : "Skill update failed"); | ||
| } | ||
@@ -30,4 +79,66 @@ } | ||
| } | ||
| // Check CLI version | ||
| // ── 2. Dokploy service status ───────────────────────────────────────────── | ||
| log.blank(); | ||
| const dok = getDokployBase(); | ||
| if (!dok) { | ||
| log.dim("Dokploy not configured (DOKPLOY_API_KEY not set)"); | ||
| log.dim("To enable server management: set DOKPLOY_API_KEY + DEPLOY_DOMAIN in your env"); | ||
| log.blank(); | ||
| log.info("To update the CLI itself:"); | ||
| log.dim(" npm update -g @synap/cli"); | ||
| log.blank(); | ||
| return; | ||
| } | ||
| const appsSpinner = ora("Fetching service status from Dokploy...").start(); | ||
| const apps = await fetchApps(); | ||
| appsSpinner.stop(); | ||
| if (apps.length === 0) { | ||
| log.dim("No services found in Dokploy (or API unreachable)"); | ||
| } | ||
| else { | ||
| log.heading("Services"); | ||
| for (const app of apps) { | ||
| const status = app.status === "running" | ||
| ? chalk.green(app.status) | ||
| : app.status === "error" | ||
| ? chalk.red(app.status) | ||
| : chalk.yellow(app.status); | ||
| console.log(` ${chalk.bold(app.name.padEnd(24))} ${status} ${chalk.dim(app.env ?? "")}`); | ||
| } | ||
| } | ||
| // ── 3. Trigger redeploys if requested ───────────────────────────────────── | ||
| if (opts.server || opts.all) { | ||
| log.blank(); | ||
| log.heading(opts.all ? "Redeploying all services" : "Redeploying control-plane"); | ||
| const targets = opts.all | ||
| ? apps | ||
| : apps.filter((a) => a.name.toLowerCase().includes("control-plane") || | ||
| a.appName?.toLowerCase().includes("control-plane")); | ||
| if (targets.length === 0) { | ||
| log.dim("No matching services found in Dokploy"); | ||
| log.dim("Register services first: synap infra status"); | ||
| } | ||
| else { | ||
| for (const app of targets) { | ||
| const spinner = ora(`Deploying ${app.name}...`).start(); | ||
| const ok = await triggerDeploy(app.id); | ||
| if (ok) { | ||
| spinner.succeed(`${app.name}: deploy triggered`); | ||
| } | ||
| else { | ||
| spinner.fail(`${app.name}: deploy failed`); | ||
| } | ||
| } | ||
| } | ||
| log.blank(); | ||
| log.dim(`Watch progress: ${chalk.cyan(`${dok.url}`)}`); | ||
| log.dim("Or tail logs: synap infra logs <service-name>"); | ||
| } | ||
| else if (apps.length > 0) { | ||
| log.blank(); | ||
| log.dim(`To redeploy: ${chalk.cyan("synap update --server")} (control-plane only)`); | ||
| log.dim(` ${chalk.cyan("synap update --all")} (all services)`); | ||
| } | ||
| // ── 4. CLI update reminder ──────────────────────────────────────────────── | ||
| log.blank(); | ||
| log.info("To update the CLI itself:"); | ||
@@ -34,0 +145,0 @@ log.dim(" npm update -g @synap/cli"); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,MAAM,EAAE,CAAC;IACT,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEtB,eAAe;IACf,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;IAC5B,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,CAAC,yBAAyB,CAAC,CAAC,KAAK,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,iBAAiB,EAAE,CAAC;YACpB,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;IAC3D,CAAC;IAED,oBAAoB;IACpB,GAAG,CAAC,KAAK,EAAE,CAAC;IACZ,GAAG,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IACtC,GAAG,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAEtC,GAAG,CAAC,KAAK,EAAE,CAAC;AACd,CAAC"} | ||
| {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAiBlD,SAAS,cAAc;IACrB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC;IAC9C,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAEtB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,mBAAmB,CAAC;IAChE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,WAAW,MAAM,EAAE,CAAC;IAC3D,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACtB,CAAC;AAED,KAAK,UAAU,SAAS;IACtB,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;IAC7B,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IAEpB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,sBAAsB,EAAE;YACxD,OAAO,EAAE,EAAE,WAAW,EAAE,GAAG,CAAC,GAAG,EAAE;YACjC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;SAClC,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,EAAE,CAAC;QACvB,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAiB,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,KAAa;IACxC,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;IAC7B,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IAEvB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,yBAAyB,EAAE;YAC3D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,WAAW,EAAE,GAAG,CAAC,GAAG,EAAE;YACrE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;YAC9C,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;SACnC,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,EAAE,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,gFAAgF;AAEhF,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAAsB,EAAE;IACnD,MAAM,EAAE,CAAC;IACT,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEtB,6EAA6E;IAC7E,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;IAC5B,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,CAAC,yBAAyB,CAAC,CAAC,KAAK,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,iBAAiB,EAAE,CAAC;YACpB,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;IAC3D,CAAC;IAED,6EAA6E;IAC7E,GAAG,CAAC,KAAK,EAAE,CAAC;IACZ,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;IAE7B,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,GAAG,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;QAC5D,GAAG,CAAC,GAAG,CAAC,8EAA8E,CAAC,CAAC;QACxF,GAAG,CAAC,KAAK,EAAE,CAAC;QACZ,GAAG,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACtC,GAAG,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QACtC,GAAG,CAAC,KAAK,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IAED,MAAM,WAAW,GAAG,GAAG,CAAC,yCAAyC,CAAC,CAAC,KAAK,EAAE,CAAC;IAC3E,MAAM,IAAI,GAAG,MAAM,SAAS,EAAE,CAAC;IAC/B,WAAW,CAAC,IAAI,EAAE,CAAC;IAEnB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,GAAG,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;IAC/D,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACxB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,MAAM,GACV,GAAG,CAAC,MAAM,KAAK,SAAS;gBACtB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;gBACzB,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,OAAO;oBACxB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;oBACvB,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC/B,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,CAC9E,CAAC;QACJ,CAAC;IACH,CAAC;IAED,6EAA6E;IAC7E,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QAC5B,GAAG,CAAC,KAAK,EAAE,CAAC;QACZ,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC;QAEjF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG;YACtB,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAChB,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;gBAC9C,CAAC,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,CACnD,CAAC;QAEN,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,GAAG,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;YACjD,GAAG,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;gBAC1B,MAAM,OAAO,GAAG,GAAG,CAAC,aAAa,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;gBACxD,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACvC,IAAI,EAAE,EAAE,CAAC;oBACP,OAAO,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,IAAI,oBAAoB,CAAC,CAAC;gBACnD,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,iBAAiB,CAAC,CAAC;gBAC7C,CAAC;YACH,CAAC;QACH,CAAC;QAED,GAAG,CAAC,KAAK,EAAE,CAAC;QACZ,GAAG,CAAC,GAAG,CAAC,mBAAmB,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACvD,GAAG,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;IAC7D,CAAC;SAAM,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,GAAG,CAAC,KAAK,EAAE,CAAC;QACZ,GAAG,CAAC,GAAG,CACL,iBAAiB,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,wBAAwB,CAC7E,CAAC;QACF,GAAG,CAAC,GAAG,CACL,iBAAiB,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,qBAAqB,CACvE,CAAC;IACJ,CAAC;IAED,6EAA6E;IAC7E,GAAG,CAAC,KAAK,EAAE,CAAC;IACZ,GAAG,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IACtC,GAAG,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IACtC,GAAG,CAAC,KAAK,EAAE,CAAC;AACd,CAAC"} |
+370
-3
@@ -58,5 +58,9 @@ #!/usr/bin/env node | ||
| .command("connect") | ||
| .description("Connect OpenClaw to an existing Synap pod") | ||
| .description("Connect an AI surface (Claude Code, Claude Desktop, Cursor, Raycast, OpenClaw) to a Synap pod") | ||
| .option("--target <name>", "AI surface: claude-code | claude-desktop | cursor | raycast | openclaw") | ||
| .option("--pod-url <url>", "Synap pod URL") | ||
| .option("--api-key <key>", "Hub Protocol API key") | ||
| .option("--name <name>", "Pod profile name to save credentials under (default: 'default')") | ||
| .option("--list", "List supported targets and exit") | ||
| .option("--manual-key", "Skip the browser approval flow and paste a key (or provisioning token)") | ||
| .action(async (opts) => { | ||
@@ -66,2 +70,36 @@ const { connect } = await import("./commands/connect.js"); | ||
| }); | ||
| // ─── pods ───────────────────────────────────────────────────────────────────── | ||
| const pods = program | ||
| .command("pods") | ||
| .description("Manage multiple Synap pod profiles and switch between them"); | ||
| pods | ||
| .command("list", { isDefault: true }) | ||
| .description("List all configured pod profiles") | ||
| .action(async () => { | ||
| const { podsList } = await import("./commands/pods.js"); | ||
| await podsList(); | ||
| }); | ||
| pods | ||
| .command("add [name] [url]") | ||
| .description("Connect a new pod and save as a named profile") | ||
| .action(async (name, url) => { | ||
| const { podsAdd } = await import("./commands/pods.js"); | ||
| await podsAdd(name, url); | ||
| }); | ||
| pods | ||
| .command("use <name>") | ||
| .description("Switch active pod and propagate credentials to all agent surfaces") | ||
| .option("--surface <surface>", "Only switch this surface (raycast, claude-code, claude-desktop, cursor, openclaw)") | ||
| .action(async (name, opts) => { | ||
| const { podsUse } = await import("./commands/pods.js"); | ||
| await podsUse(name, { surface: opts.surface }); | ||
| }); | ||
| pods | ||
| .command("remove <name>") | ||
| .alias("rm") | ||
| .description("Remove a pod profile") | ||
| .action(async (name) => { | ||
| const { podsRemove } = await import("./commands/pods.js"); | ||
| await podsRemove(name); | ||
| }); | ||
| program | ||
@@ -87,5 +125,7 @@ .command("security-audit") | ||
| .description("Update synap skill and check for CLI updates") | ||
| .action(async () => { | ||
| .option("--server", "Also trigger a Dokploy redeploy of the control-plane") | ||
| .option("--all", "Trigger a Dokploy redeploy of all registered services") | ||
| .action(async (opts) => { | ||
| const { update } = await import("./commands/update.js"); | ||
| await update(); | ||
| await update(opts); | ||
| }); | ||
@@ -172,3 +212,80 @@ const oc = program | ||
| }); | ||
| oc | ||
| .command("connections") | ||
| .alias("conn") | ||
| .description("Unified view: AI providers, skills, channels, MCP clients") | ||
| .action(async () => { | ||
| const { openclawConnections } = await import("./commands/openclaw.js"); | ||
| openclawConnections(); | ||
| }); | ||
| oc | ||
| .command("open [section]") | ||
| .description("Open the OpenClaw dashboard (optionally at a section: channels, skills, config, chat, sessions, logs)") | ||
| .action(async (section) => { | ||
| const { openclawOpen } = await import("./commands/openclaw.js"); | ||
| openclawOpen(section); | ||
| }); | ||
| // ─── infra ──────────────────────────────────────────────────────────────────── | ||
| const infra = program | ||
| .command("infra") | ||
| .description("Manage servers and deployments via Dokploy"); | ||
| infra | ||
| .command("status", { isDefault: true }) | ||
| .description("Overview: all servers and services status") | ||
| .action(async () => { | ||
| const { infraStatus } = await import("./commands/infra.js"); | ||
| await infraStatus(); | ||
| }); | ||
| infra | ||
| .command("deploy <app>") | ||
| .description("Trigger a redeploy for a named service") | ||
| .action(async (app) => { | ||
| const { infraDeploy } = await import("./commands/infra.js"); | ||
| await infraDeploy(app); | ||
| }); | ||
| infra | ||
| .command("logs <app>") | ||
| .description("Tail logs for a service") | ||
| .option("-n, --lines <n>", "Number of log lines", "100") | ||
| .option("-f, --follow", "Follow log output") | ||
| .action(async (app, opts) => { | ||
| const { infraLogs } = await import("./commands/infra.js"); | ||
| await infraLogs(app, { lines: opts.lines ? parseInt(opts.lines, 10) : 100, follow: opts.follow }); | ||
| }); | ||
| infra | ||
| .command("sync") | ||
| .description("Pull Dokploy state into Synap entities (server + deployment profiles)") | ||
| .option("--pod-url <url>", "Synap pod URL", process.env.SYNAP_POD_URL) | ||
| .option("--api-key <key>", "Hub Protocol API key", process.env.SYNAP_API_KEY) | ||
| .action(async (opts) => { | ||
| if (!opts.podUrl || !opts.apiKey) { | ||
| console.error(" --pod-url and --api-key are required (or set SYNAP_POD_URL / SYNAP_API_KEY)"); | ||
| process.exit(1); | ||
| } | ||
| const { infraSync } = await import("./commands/infra.js"); | ||
| await infraSync(opts.podUrl, opts.apiKey); | ||
| }); | ||
| infra | ||
| .command("open") | ||
| .description("Open the Dokploy dashboard in your browser") | ||
| .action(async () => { | ||
| const { infraOpen } = await import("./commands/infra.js"); | ||
| infraOpen(); | ||
| }); | ||
| program | ||
| .command("switch [name]") | ||
| .description("Switch active pod (interactive picker if no name given)") | ||
| .action(async (name) => { | ||
| const { podsSwitch } = await import("./commands/pods.js"); | ||
| await podsSwitch(name); | ||
| }); | ||
| program | ||
| .command("connections") | ||
| .alias("conn") | ||
| .description("Show which pod each agent surface (Claude Code, Desktop, Cursor, OpenClaw) is connected to") | ||
| .action(async () => { | ||
| const { connections } = await import("./commands/connections.js"); | ||
| await connections(); | ||
| }); | ||
| program | ||
| .command("login") | ||
@@ -224,3 +341,253 @@ .description("Sign in to your Synap account via browser") | ||
| }); | ||
| // ─── orient ─────────────────────────────────────────────────────────────────── | ||
| program | ||
| .command("orient") | ||
| .description("Show pod orientation: who you are, workspaces, profiles, and entity counts") | ||
| .option("--json", "Output as JSON") | ||
| .option("--pod-url <url>", "Pod URL override") | ||
| .option("--api-key <key>", "API key override") | ||
| .action(async (opts) => { | ||
| const { orient } = await import("./commands/data.js"); | ||
| await orient(opts); | ||
| }); | ||
| // ─── use ────────────────────────────────────────────────────────────────────── | ||
| program | ||
| .command("use <workspace>") | ||
| .description("Set the active workspace (by ID or name) — persisted to ~/.synap/config.json") | ||
| .option("--json", "Output as JSON") | ||
| .option("--pod-url <url>", "Pod URL override") | ||
| .option("--api-key <key>", "API key override") | ||
| .action(async (workspace, opts) => { | ||
| const { useWorkspace } = await import("./commands/data.js"); | ||
| await useWorkspace(workspace, opts); | ||
| }); | ||
| // ─── search ─────────────────────────────────────────────────────────────────── | ||
| program | ||
| .command("search <query>") | ||
| .description("Search entities, documents, and views (Typesense-powered)") | ||
| .option("--workspace <id>", "Scope to a specific workspace") | ||
| .option("--type <type>", "Filter: entity | doc | view") | ||
| .option("--limit <n>", "Max results", "20") | ||
| .option("--json", "Output as JSON") | ||
| .option("--pod-url <url>", "Pod URL override") | ||
| .option("--api-key <key>", "API key override") | ||
| .action(async (query, opts) => { | ||
| const { searchData } = await import("./commands/data.js"); | ||
| await searchData(query, opts); | ||
| }); | ||
| // ─── remember / recall ──────────────────────────────────────────────────────── | ||
| program | ||
| .command("remember <text>") | ||
| .description("Store a memory on the pod") | ||
| .option("--context <entity-id>", "Link memory to an entity") | ||
| .option("--json", "Output as JSON") | ||
| .option("--pod-url <url>", "Pod URL override") | ||
| .option("--api-key <key>", "API key override") | ||
| .action(async (text, opts) => { | ||
| const { rememberData } = await import("./commands/data.js"); | ||
| await rememberData(text, opts); | ||
| }); | ||
| program | ||
| .command("recall <query>") | ||
| .description("Retrieve memories from the pod (add --structured for knowledge entities)") | ||
| .option("--structured", "Search structured knowledge entities instead of episodic memory") | ||
| .option("--type <type>", "Filter by entry type: gotcha|lesson|decision|reference (--structured only)") | ||
| .option("--tags <csv>", "Filter by tags e.g. repo:synap-backend (--structured only)") | ||
| .option("--workspace <id>", "Workspace to search (--structured only, defaults to active)") | ||
| .option("--limit <n>", "Max results", "10") | ||
| .option("--json", "Output as JSON") | ||
| .option("--pod-url <url>", "Pod URL override") | ||
| .option("--api-key <key>", "API key override") | ||
| .action(async (query, opts) => { | ||
| if (opts.structured) { | ||
| const { recallStructured } = await import("./commands/knowledge.js"); | ||
| await recallStructured(query, opts); | ||
| } | ||
| else { | ||
| const { recallData } = await import("./commands/data.js"); | ||
| await recallData(query, opts); | ||
| } | ||
| }); | ||
| // ─── capture ────────────────────────────────────────────────────────────────── | ||
| // Uses the active pod + workspace from config (set via `synap pods use` / | ||
| // `synap use` / `synap workspace provision-agent`). No auth flags needed. | ||
| program | ||
| .command("capture") | ||
| .description("Capture a structured knowledge entry into the active agent workspace") | ||
| .requiredOption("--type <type>", "Entry type: gotcha|lesson|decision|reference") | ||
| .requiredOption("--claim <text>", "One-line assertion") | ||
| .option("--why <text>", "Reasoning or context") | ||
| .option("--evidence <text>", "Supporting file path, URL, or code snippet") | ||
| .option("--tags <csv>", "Comma-separated tags e.g. repo:synap-backend,layer:migrations") | ||
| .option("--json", "Output as JSON") | ||
| .action(async (opts) => { | ||
| const { captureKnowledge } = await import("./commands/knowledge.js"); | ||
| await captureKnowledge(opts); | ||
| }); | ||
| // ─── workspace ──────────────────────────────────────────────────────────────── | ||
| // Context setup commands. Run once to configure the session — all subsequent | ||
| // commands (capture, recall, search, …) inherit the active pod + workspace. | ||
| const workspace = program | ||
| .command("workspace") | ||
| .description("Set up and switch workspace context (run once — persisted to ~/.synap/config.json)"); | ||
| workspace | ||
| .command("provision-agent") | ||
| .description("Provision an agent-owned workspace and set it as active (idempotent)") | ||
| .option("--agent-user-id <uuid>", "Agent user ID (defaults to caller)") | ||
| .option("--name <name>", "Workspace display name override") | ||
| .option("--no-use", "Do not set as active workspace after provisioning") | ||
| .option("--json", "Output as JSON") | ||
| .action(async (opts) => { | ||
| const { provisionAgentWorkspace } = await import("./commands/knowledge.js"); | ||
| await provisionAgentWorkspace({ ...opts, agentUserId: opts.agentUserId }); | ||
| }); | ||
| // ─── list ───────────────────────────────────────────────────────────────────── | ||
| const list = program | ||
| .command("list") | ||
| .description("List pod resources"); | ||
| list | ||
| .command("workspaces") | ||
| .description("List workspaces you belong to") | ||
| .option("--json", "Output as JSON") | ||
| .option("--pod-url <url>", "Pod URL override") | ||
| .option("--api-key <key>", "API key override") | ||
| .action(async (opts) => { | ||
| const { listWorkspaces } = await import("./commands/data.js"); | ||
| await listWorkspaces(opts); | ||
| }); | ||
| list | ||
| .command("entities") | ||
| .description("List entities on the pod") | ||
| .option("--workspace <id>", "Scope to a workspace (omit for pod-wide)") | ||
| .option("--profile <slug>", "Filter by profile slug (e.g. person, task, note)") | ||
| .option("--limit <n>", "Max results", "50") | ||
| .option("--json", "Output as JSON") | ||
| .option("--pod-url <url>", "Pod URL override") | ||
| .option("--api-key <key>", "API key override") | ||
| .action(async (opts) => { | ||
| const { listEntities } = await import("./commands/data.js"); | ||
| await listEntities(opts); | ||
| }); | ||
| // ─── get ────────────────────────────────────────────────────────────────────── | ||
| const get = program | ||
| .command("get") | ||
| .description("Get a single pod resource"); | ||
| get | ||
| .command("entity <id>") | ||
| .description("Get an entity by ID") | ||
| .option("--workspace <id>", "Workspace context") | ||
| .option("--json", "Output as JSON") | ||
| .option("--pod-url <url>", "Pod URL override") | ||
| .option("--api-key <key>", "API key override") | ||
| .action(async (id, opts) => { | ||
| const { getEntity } = await import("./commands/data.js"); | ||
| await getEntity(id, opts); | ||
| }); | ||
| // ─── create ─────────────────────────────────────────────────────────────────── | ||
| const create = program | ||
| .command("create") | ||
| .description("Create pod resources"); | ||
| create | ||
| .command("entity") | ||
| .description("Create a new entity") | ||
| .requiredOption("--profile <slug>", "Profile slug (e.g. person, note, task)") | ||
| .requiredOption("--name <name>", "Entity name") | ||
| .option("--workspace <id>", "Create in this workspace") | ||
| .option("--props <json>", "Properties as JSON string", "{}") | ||
| .option("--json", "Output as JSON") | ||
| .option("--pod-url <url>", "Pod URL override") | ||
| .option("--api-key <key>", "API key override") | ||
| .action(async (opts) => { | ||
| const { createEntity } = await import("./commands/data.js"); | ||
| await createEntity(opts); | ||
| }); | ||
| create | ||
| .command("relation") | ||
| .description("Create a typed relation between two entities") | ||
| .requiredOption("--source <id>", "Source entity ID") | ||
| .requiredOption("--target <id>", "Target entity ID") | ||
| .requiredOption("--type <type>", "Relation type (e.g. extends, part_of, implements, governs, related_to)") | ||
| .option("--workspace <id>", "Workspace context") | ||
| .option("--json", "Output as JSON") | ||
| .option("--pod-url <url>", "Pod URL override") | ||
| .option("--api-key <key>", "API key override") | ||
| .action(async (opts) => { | ||
| const { createRelation } = await import("./commands/data.js"); | ||
| await createRelation(opts); | ||
| }); | ||
| // ─── set ────────────────────────────────────────────────────────────────────── | ||
| const set = program | ||
| .command("set") | ||
| .description("Update pod resources"); | ||
| set | ||
| .command("entity <id>") | ||
| .description("Update entity properties") | ||
| .requiredOption("--props <json>", "Properties as JSON string") | ||
| .option("--json", "Output as JSON") | ||
| .option("--pod-url <url>", "Pod URL override") | ||
| .option("--api-key <key>", "API key override") | ||
| .action(async (id, opts) => { | ||
| const { updateEntity } = await import("./commands/data.js"); | ||
| await updateEntity(id, opts); | ||
| }); | ||
| // ─── agents ─────────────────────────────────────────────────────────────────── | ||
| const agents = program | ||
| .command("agents") | ||
| .description("Manage named agent identities (different keys, different pod access)"); | ||
| agents | ||
| .command("list", { isDefault: true }) | ||
| .description("List configured agent identities") | ||
| .option("--json", "Output as JSON") | ||
| .action(async (opts) => { | ||
| const { agentsList } = await import("./commands/agents.js"); | ||
| agentsList(opts); | ||
| }); | ||
| agents | ||
| .command("add") | ||
| .description("Register a pre-existing agent credential locally. Use `synap agents create` for new agents.") | ||
| .option("--name <name>", "Agent name (e.g. researcher, builder)") | ||
| .option("--api-key <key>", "Hub Protocol API key for this agent") | ||
| .option("--pod <name>", "Pod profile to link (default: active pod)") | ||
| .option("--workspace <id>", "Default workspace for this agent") | ||
| .option("--label <label>", "Human-readable description") | ||
| .action(async (opts) => { | ||
| const { agentsAdd } = await import("./commands/agents.js"); | ||
| await agentsAdd(opts); | ||
| }); | ||
| agents | ||
| .command("create") | ||
| .description("Create a new agent on the pod (template-aware). Replaces `add` for new agents.") | ||
| .option("--template <tmpl>", "Agent template: twin | assistant | custom (default: custom)") | ||
| .option("--name <name>", "Agent name (not needed for twin — auto-generated)") | ||
| .option("--type <type>", "Agent type string for custom agents (default: matches template)") | ||
| .option("--role <role>", "Workspace role: admin | editor | viewer (default: editor; twin auto-inherits)") | ||
| .option("--workspace <id>", "Workspace ID to add the agent to (auto-detected if omitted)") | ||
| .option("--pod <name>", "Pod profile to use (default: active pod)") | ||
| .action(async (opts) => { | ||
| const { agentsCreate } = await import("./commands/agents.js"); | ||
| await agentsCreate(opts); | ||
| }); | ||
| agents | ||
| .command("rotate-key <name-or-id>") | ||
| .description("Rotate the Hub Protocol API key for an agent (invalidates the current key)") | ||
| .action(async (nameOrId) => { | ||
| const { agentsRotateKey } = await import("./commands/agents.js"); | ||
| await agentsRotateKey(nameOrId); | ||
| }); | ||
| agents | ||
| .command("remove <name>") | ||
| .alias("rm") | ||
| .description("Remove a named agent identity") | ||
| .action(async (name) => { | ||
| const { agentsRemove } = await import("./commands/agents.js"); | ||
| agentsRemove(name); | ||
| }); | ||
| agents | ||
| .command("info <name>") | ||
| .description("Show details for a named agent identity") | ||
| .action(async (name) => { | ||
| const { agentsInfo } = await import("./commands/agents.js"); | ||
| agentsInfo(name); | ||
| }); | ||
| program.parse(); | ||
| //# sourceMappingURL=index.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} |
@@ -16,2 +16,6 @@ /** | ||
| email: string; | ||
| /** ID of the pod the user chose during the web auth flow (optional). */ | ||
| podId?: string; | ||
| /** URL of the pod the user chose during the web auth flow (optional). */ | ||
| podUrl?: string; | ||
| } | ||
@@ -18,0 +22,0 @@ export declare function getStoredToken(): StoredCredentials | null; |
+4
-0
@@ -144,2 +144,4 @@ /** | ||
| const expiresAt = url.searchParams.get("expiresAt"); | ||
| const cbPodId = url.searchParams.get("podId") ?? undefined; | ||
| const cbPodUrl = url.searchParams.get("podUrl") ?? undefined; | ||
| if (token && email && userId) { | ||
@@ -152,2 +154,4 @@ const creds = { | ||
| new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString(), | ||
| ...(cbPodId ? { podId: cbPodId } : {}), | ||
| ...(cbPodUrl ? { podUrl: cbPodUrl } : {}), | ||
| }; | ||
@@ -154,0 +158,0 @@ writeCredentials(creds); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,MAAM,MAAM,GACV,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,wBAAwB,CAAC;AACvD,MAAM,WAAW,GACf,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,oBAAoB,CAAC;AAExD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC1D,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;AAaxE,8EAA8E;AAE9E,SAAS,oBAAoB;IAC3B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACpC,EAAE,CAAC,SAAS,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAwB;IAChD,oBAAoB,EAAE,CAAC;IACvB,EAAE,CAAC,aAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;QACjE,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC;YAAE,OAAO,IAAI,CAAC;QAClD,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAsB,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,qBAAqB,CAAC,KAAwB;IAC5D,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,MAAM;IACpB,IAAI,CAAC;QACH,IAAI,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACpC,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;AACH,CAAC;AAED,8EAA8E;AAE9E,MAAM,CAAC,KAAK,UAAU,UAAU;IAK9B,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAC/B,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAEpC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,UAAU,EAAE;YAC3C,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,CAAC,KAAK,EAAE,EAAE;YACnD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;SAClC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,6CAA6C;YAC7C,MAAM,EAAE,CAAC;YACT,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAC1B,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAE7B,CAAC;QAEF,yEAAyE;QACzE,yEAAyE;QACzE,gBAAgB,CAAC;YACf,GAAG,KAAK;YACR,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;YACtB,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;YACpB,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;SACxE,CAAC,CAAC;QAEH,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;IACvE,CAAC;IAAC,MAAM,CAAC;QACP,mEAAmE;QACnE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAa;IAChD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,UAAU,EAAE;QAC3C,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;QAC7C,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;KAClC,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IAEzB,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA4C,CAAC;IAC3E,MAAM,KAAK,GAAsB;QAC/B,KAAK;QACL,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;QACtB,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;QACpB,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;KACxE,CAAC;IACF,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACxB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8EAA8E;AAE9E,SAAS,WAAW,CAAC,GAAW;IAC9B,IAAI,CAAC;QACH,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;YACzB,KAAK,QAAQ;gBACX,QAAQ,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC;gBAC1B,MAAM;YACR,KAAK,OAAO;gBACV,QAAQ,CAAC,aAAa,GAAG,GAAG,CAAC,CAAC;gBAC9B,MAAM;YACR,KAAK,OAAO;gBACV,QAAQ,CAAC,aAAa,GAAG,GAAG,CAAC,CAAC;gBAC9B,MAAM;YACR;gBACE,+CAA+C;gBAC/C,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK;IACzB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC5C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC;YAExD,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;gBACjC,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC5C,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC5C,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC9C,MAAM,SAAS,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBACpD,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC;gBAC3D,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC;gBAE7D,IAAI,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;oBAC7B,MAAM,KAAK,GAAsB;wBAC/B,KAAK;wBACL,KAAK;wBACL,MAAM;wBACN,SAAS,EACP,SAAS;4BACT,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;wBAC9D,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBACtC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBAC1C,CAAC;oBACF,gBAAgB,CAAC,KAAK,CAAC,CAAC;oBAExB,oBAAoB;oBACpB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;oBACpD,GAAG,CAAC,GAAG,CAAC;;;;;;;;;QASV,CAAC,CAAC;oBAEA,OAAO,EAAE,CAAC;oBACV,OAAO,CAAC,KAAK,CAAC,CAAC;gBACjB,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;oBACpD,GAAG,CAAC,GAAG,CAAC;;;;;;;;;QASV,CAAC,CAAC;gBACF,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACnB,GAAG,CAAC,GAAG,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,wBAAwB;QACxB,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE;YACjC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9B,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtC,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,IAAI,CAAC,CAAC;gBACd,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YACvB,MAAM,WAAW,GAAG,oBAAoB,IAAI,WAAW,CAAC;YACxD,MAAM,QAAQ,GAAG,GAAG,WAAW,iBAAiB,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC;YAElF,IAAI,CAAC;gBACH,WAAW,CAAC,QAAQ,CAAC,CAAC;YACxB,CAAC;YAAC,MAAM,CAAC;gBACP,wCAAwC;gBACxC,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;gBACpD,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC;YACjC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,4BAA4B;QAC5B,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,OAAO,EAAE,CAAC;YACV,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,EAAE,OAAO,CAAC,CAAC;QAEZ,SAAS,OAAO;YACd,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,IAAI,CAAC;gBACH,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAeD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,SAAS,GAAG,OAAO,CAAC,kBAAkB;;IAEtC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC5C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC;YAExD,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;gBACjC,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC9C,MAAM,WAAW,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,SAAS,CAAC;gBAErE,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;gBACpD,GAAG,CAAC,GAAG,CAAC;;;;;;;;;QASR,CAAC,CAAC;gBAEF,OAAO,EAAE,CAAC;gBACV,IAAI,MAAM,EAAE,CAAC;oBACX,OAAO,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;gBACnC,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CAAC,CAAC;gBAChB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACnB,GAAG,CAAC,GAAG,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE;YACjC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9B,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtC,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,IAAI,CAAC,CAAC;gBACd,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YACvB,MAAM,WAAW,GAAG,oBAAoB,IAAI,WAAW,CAAC;YACxD,MAAM,YAAY,GAAG,GAAG,WAAW,uCAAuC,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC;YAE5G,IAAI,CAAC;gBACH,WAAW,CAAC,YAAY,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;gBAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,YAAY,IAAI,CAAC,CAAC;YACrC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,OAAO,EAAE,CAAC;YACV,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,SAAS,OAAO;YACd,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,IAAI,CAAC;gBACH,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAE9E,MAAM,UAAU,QAAQ;IACtB,OAAO,MAAM,CAAC;AAChB,CAAC;AAWD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,KAAa;IAC1C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,OAAO,EAAE;QACxC,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;QAC7C,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;KACnC,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAoB,CAAC;IACnD,4DAA4D;IAC5D,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,CAC7B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,cAAc,IAAI,CAAC,CAAC,MAAM,KAAK,sBAAsB,CACnG,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,OAAe,EACf,KAAa;IAEb,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,EAAE,0BAA0B,kBAAkB,CAAC,KAAK,CAAC,EAAE,EAAE;YAC1F,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,OAAO,EAAE,EAAE;YAC/C,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;SAClC,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QACzB,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA6F,CAAC;IACxH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"} |
+30
-19
@@ -13,4 +13,31 @@ /** | ||
| export function detectOpenClaw() { | ||
| // ── Path 1: Local install (npm -g or npx) ───────────────────────────── | ||
| if (existsSync(OPENCLAW_DIR)) { | ||
| // Detection priority: | ||
| // 1. Docker container (most reliable — actively running state) | ||
| // 2. Local install (openclaw binary in PATH + ~/.openclaw dir) | ||
| // | ||
| // Why Docker first: the presence of ~/.openclaw on the host doesn't prove | ||
| // OpenClaw is installed locally — it may be a stray directory, or the | ||
| // Synap deploy dir may live in the same home. A running Docker container | ||
| // is a much stronger signal. | ||
| // ── Path 1: Docker container ─────────────────────────────────────────── | ||
| const dockerInfo = detectOpenClawDocker(); | ||
| if (dockerInfo) | ||
| return dockerInfo; | ||
| // ── Path 2: Local install (npm -g or npx) ───────────────────────────── | ||
| // Require BOTH ~/.openclaw AND an `openclaw` binary in PATH. | ||
| // ~/.openclaw alone is not enough (could be a leftover dir). | ||
| let localBinaryVersion; | ||
| try { | ||
| const out = execSync("openclaw --version 2>/dev/null", { | ||
| encoding: "utf-8", | ||
| timeout: 5000, | ||
| }).trim(); | ||
| const match = out.match(/\d+\.\d+\.\d+/); | ||
| if (match) | ||
| localBinaryVersion = match[0]; | ||
| } | ||
| catch { | ||
| // binary not in PATH — not a local install | ||
| } | ||
| if (existsSync(OPENCLAW_DIR) && localBinaryVersion) { | ||
| const info = { | ||
@@ -21,14 +48,4 @@ found: true, | ||
| skillsDir: OPENCLAW_SKILLS, | ||
| version: localBinaryVersion, | ||
| }; | ||
| // Version | ||
| try { | ||
| const out = execSync("openclaw --version 2>/dev/null", { | ||
| encoding: "utf-8", | ||
| timeout: 5000, | ||
| }).trim(); | ||
| const match = out.match(/\d+\.\d+\.\d+/); | ||
| if (match) | ||
| info.version = match[0]; | ||
| } | ||
| catch { /* binary not in PATH */ } | ||
| // Config | ||
@@ -53,8 +70,2 @@ if (existsSync(OPENCLAW_CONFIG)) { | ||
| } | ||
| // ── Path 2: Docker container ─────────────────────────────────────────── | ||
| // OpenClaw may be running in Docker (no host ~/.openclaw dir). | ||
| // Detect by: (a) docker ps, (b) gateway health probe on port 18789. | ||
| const dockerInfo = detectOpenClawDocker(); | ||
| if (dockerInfo) | ||
| return dockerInfo; | ||
| return { found: false }; | ||
@@ -61,0 +72,0 @@ } |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"openclaw.js","sourceRoot":"","sources":["../../src/lib/openclaw.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"openclaw.js","sourceRoot":"","sources":["../../src/lib/openclaw.ts"],"names":[],"mappings":"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"} |
+32
-1
@@ -10,6 +10,37 @@ /** | ||
| hubApiKey: string; | ||
| label?: string; | ||
| savedAt: string; | ||
| } | ||
| export declare function saveLocalPodConfig(config: LocalPodConfig): void; | ||
| export type SurfaceName = "raycast" | "claude-code" | "claude-desktop" | "cursor" | "openclaw"; | ||
| export interface MultiPodConfig { | ||
| activePod: string; | ||
| /** Per-surface pod overrides. When set, takes priority over activePod for that surface. */ | ||
| surfaces?: Partial<Record<SurfaceName, string>>; | ||
| pods: Record<string, LocalPodConfig>; | ||
| /** Active workspace override — set by `synap use <workspaceId>`. Takes priority over the pod's default workspaceId. */ | ||
| activeWorkspaceId?: string; | ||
| } | ||
| /** Get the pod config for a specific surface, falling back to the global activePod. */ | ||
| export declare function getSurfacePod(surface: SurfaceName): LocalPodConfig | null; | ||
| /** Get the name of the pod assigned to a surface (or the global active pod name). */ | ||
| export declare function getSurfacePodName(surface: SurfaceName): string | null; | ||
| /** Assign a pod to a specific surface without changing the global activePod. */ | ||
| export declare function setSurfacePod(surface: SurfaceName, podName: string): LocalPodConfig; | ||
| export declare function getActivePodConfig(surface?: SurfaceName): LocalPodConfig | null; | ||
| /** @deprecated Use getActivePodConfig() */ | ||
| export declare function getLocalPodConfig(): LocalPodConfig | null; | ||
| export declare function listPodProfiles(): Array<{ | ||
| name: string; | ||
| config: LocalPodConfig; | ||
| active: boolean; | ||
| }>; | ||
| export declare function addPodProfile(name: string, podConfig: LocalPodConfig): void; | ||
| export declare function setActivePod(name: string): LocalPodConfig; | ||
| /** Get the active workspace ID: explicit override first, then the pod default. */ | ||
| export declare function getActiveWorkspaceId(): string | undefined; | ||
| /** Persist a workspace as the active context for all subsequent commands. */ | ||
| export declare function setActiveWorkspaceId(workspaceId: string): void; | ||
| export declare function removePodProfile(name: string): void; | ||
| /** @deprecated Use addPodProfile("default", config) */ | ||
| export declare function saveLocalPodConfig(podConfig: LocalPodConfig): void; | ||
| export interface PodStatus { | ||
@@ -16,0 +47,0 @@ url: string; |
+121
-9
@@ -9,21 +9,133 @@ /** | ||
| const CP_URL = process.env.SYNAP_CP_URL ?? "https://api.synap.live"; | ||
| // ─── Local CLI config (persists pod connection even without OpenClaw) ───────── | ||
| // ─── Local CLI config (persists pod connections) ────────────────────────────── | ||
| const CONFIG_DIR = path.join(os.homedir(), ".synap"); | ||
| const CONFIG_FILE = path.join(CONFIG_DIR, "pod-config.json"); | ||
| export function saveLocalPodConfig(config) { | ||
| const CONFIG_FILE = path.join(CONFIG_DIR, "config.json"); | ||
| const LEGACY_CONFIG_FILE = path.join(CONFIG_DIR, "pod-config.json"); | ||
| function ensureConfigDir() { | ||
| if (!fs.existsSync(CONFIG_DIR)) { | ||
| fs.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 }); | ||
| } | ||
| fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), { mode: 0o600 }); | ||
| } | ||
| export function getLocalPodConfig() { | ||
| function readMultiConfig() { | ||
| // Read new format | ||
| try { | ||
| if (!fs.existsSync(CONFIG_FILE)) | ||
| return null; | ||
| return JSON.parse(fs.readFileSync(CONFIG_FILE, "utf-8")); | ||
| if (fs.existsSync(CONFIG_FILE)) { | ||
| const parsed = JSON.parse(fs.readFileSync(CONFIG_FILE, "utf-8")); | ||
| if (parsed.pods) | ||
| return { activePod: parsed.activePod ?? "", pods: parsed.pods }; | ||
| // File exists but has old/unrecognized shape — fall through to migration | ||
| } | ||
| } | ||
| catch { | ||
| catch { /* fall through */ } | ||
| // Migrate from legacy flat format | ||
| try { | ||
| if (fs.existsSync(LEGACY_CONFIG_FILE)) { | ||
| const legacy = JSON.parse(fs.readFileSync(LEGACY_CONFIG_FILE, "utf-8")); | ||
| if (legacy.podUrl) { | ||
| const migrated = { activePod: "default", pods: { default: legacy } }; | ||
| writeMultiConfig(migrated); | ||
| return migrated; | ||
| } | ||
| } | ||
| } | ||
| catch { /* fall through */ } | ||
| return { activePod: "", pods: {} }; | ||
| } | ||
| function writeMultiConfig(config) { | ||
| ensureConfigDir(); | ||
| fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), { mode: 0o600 }); | ||
| } | ||
| // ─── Public API ─────────────────────────────────────────────────────────────── | ||
| /** Get the pod config for a specific surface, falling back to the global activePod. */ | ||
| export function getSurfacePod(surface) { | ||
| const config = readMultiConfig(); | ||
| const podName = config.surfaces?.[surface] ?? config.activePod; | ||
| if (!podName || !config.pods[podName]) | ||
| return null; | ||
| return config.pods[podName]; | ||
| } | ||
| /** Get the name of the pod assigned to a surface (or the global active pod name). */ | ||
| export function getSurfacePodName(surface) { | ||
| const config = readMultiConfig(); | ||
| return config.surfaces?.[surface] ?? config.activePod ?? null; | ||
| } | ||
| /** Assign a pod to a specific surface without changing the global activePod. */ | ||
| export function setSurfacePod(surface, podName) { | ||
| const config = readMultiConfig(); | ||
| if (!config.pods[podName]) | ||
| throw new Error(`Pod profile '${podName}' not found`); | ||
| config.surfaces = config.surfaces ?? {}; | ||
| config.surfaces[surface] = podName; | ||
| writeMultiConfig(config); | ||
| return config.pods[podName]; | ||
| } | ||
| export function getActivePodConfig(surface) { | ||
| if (surface) | ||
| return getSurfacePod(surface); | ||
| const config = readMultiConfig(); | ||
| if (!config.activePod || !config.pods[config.activePod]) | ||
| return null; | ||
| return config.pods[config.activePod]; | ||
| } | ||
| /** @deprecated Use getActivePodConfig() */ | ||
| export function getLocalPodConfig() { | ||
| return getActivePodConfig(); | ||
| } | ||
| export function listPodProfiles() { | ||
| const config = readMultiConfig(); | ||
| return Object.entries(config.pods).map(([name, podConfig]) => ({ | ||
| name, | ||
| config: podConfig, | ||
| active: name === config.activePod, | ||
| })); | ||
| } | ||
| export function addPodProfile(name, podConfig) { | ||
| const config = readMultiConfig(); | ||
| config.pods[name] = podConfig; | ||
| if (!config.activePod) | ||
| config.activePod = name; | ||
| writeMultiConfig(config); | ||
| } | ||
| export function setActivePod(name) { | ||
| const config = readMultiConfig(); | ||
| if (!config.pods[name]) | ||
| throw new Error(`Pod profile '${name}' not found`); | ||
| config.activePod = name; | ||
| writeMultiConfig(config); | ||
| return config.pods[name]; | ||
| } | ||
| /** Get the active workspace ID: explicit override first, then the pod default. */ | ||
| export function getActiveWorkspaceId() { | ||
| const config = readMultiConfig(); | ||
| if (config.activeWorkspaceId) | ||
| return config.activeWorkspaceId; | ||
| const pod = config.activePod ? config.pods[config.activePod] : undefined; | ||
| return pod?.workspaceId || undefined; | ||
| } | ||
| /** Persist a workspace as the active context for all subsequent commands. */ | ||
| export function setActiveWorkspaceId(workspaceId) { | ||
| const config = readMultiConfig(); | ||
| config.activeWorkspaceId = workspaceId; | ||
| writeMultiConfig(config); | ||
| } | ||
| export function removePodProfile(name) { | ||
| const config = readMultiConfig(); | ||
| if (!config.pods[name]) | ||
| throw new Error(`Pod profile '${name}' not found`); | ||
| delete config.pods[name]; | ||
| if (config.activePod === name) { | ||
| const remaining = Object.keys(config.pods); | ||
| config.activePod = remaining[0] ?? ""; | ||
| } | ||
| writeMultiConfig(config); | ||
| } | ||
| /** @deprecated Use addPodProfile("default", config) */ | ||
| export function saveLocalPodConfig(podConfig) { | ||
| const config = readMultiConfig(); | ||
| const name = config.activePod || "default"; | ||
| config.pods[name] = podConfig; | ||
| if (!config.activePod) | ||
| config.activePod = name; | ||
| writeMultiConfig(config); | ||
| } | ||
| /** | ||
@@ -30,0 +142,0 @@ * Check if a Synap pod is healthy. |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"pod.js","sourceRoot":"","sources":["../../src/lib/pod.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"pod.js","sourceRoot":"","sources":["../../src/lib/pod.ts"],"names":[],"mappings":"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"} |
+5
-3
| { | ||
| "name": "@synap-core/cli", | ||
| "version": "1.2.1", | ||
| "version": "1.5.0", | ||
| "description": "Synap CLI — connect OpenClaw to sovereign knowledge infrastructure", | ||
@@ -12,3 +12,4 @@ "type": "module", | ||
| "dev": "tsx src/index.ts", | ||
| "prepublishOnly": "pnpm build" | ||
| "sync-skills": "bash scripts/sync-skills.sh", | ||
| "prepublishOnly": "pnpm sync-skills && pnpm build" | ||
| }, | ||
@@ -28,3 +29,4 @@ "dependencies": { | ||
| "files": [ | ||
| "dist" | ||
| "dist", | ||
| "skills" | ||
| ], | ||
@@ -31,0 +33,0 @@ "engines": { |
+26
-0
@@ -79,2 +79,28 @@ # @synap-core/cli | ||
| ### `synap openclaw connections` | ||
| 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. | ||
| ```bash | ||
| synap openclaw connections | ||
| ``` | ||
| Everything marked `○` is something you'd manage from the OpenClaw dashboard — the command shows you exactly how to get there. | ||
| ### `synap openclaw open [section]` | ||
| Deep-link to a specific dashboard section. | ||
| ```bash | ||
| synap openclaw open # Main dashboard | ||
| synap openclaw open channels # Channels tab | ||
| synap openclaw open skills # Skills tab | ||
| synap openclaw open config # Config editor | ||
| synap openclaw open chat # Chat | ||
| synap openclaw open sessions # Sessions | ||
| synap openclaw open logs # Logs | ||
| ``` | ||
| Uses the public URL if `setup-domain` has been run, otherwise localhost. | ||
| ### `synap openclaw dashboard` | ||
@@ -81,0 +107,0 @@ |
Shell access
Supply chain riskThis module accesses the system shell. Accessing the system shell increases the risk of executing arbitrary code.
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 11 instances
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
917117
101.09%94
95.83%12031
53.59%322
8.78%56
107.41%44
69.23%