@synap-core/cli 1.7.0 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/dist/commands/agent-run.d.ts +47 -0
  2. package/dist/commands/agent-run.js +302 -0
  3. package/dist/commands/agent-run.js.map +1 -0
  4. package/dist/commands/artifact.d.ts +26 -0
  5. package/dist/commands/artifact.js +76 -0
  6. package/dist/commands/artifact.js.map +1 -0
  7. package/dist/commands/automation.d.ts +47 -0
  8. package/dist/commands/automation.js +600 -0
  9. package/dist/commands/automation.js.map +1 -0
  10. package/dist/commands/cell.d.ts +55 -0
  11. package/dist/commands/cell.js +277 -0
  12. package/dist/commands/cell.js.map +1 -0
  13. package/dist/commands/connect.js +41 -7
  14. package/dist/commands/connect.js.map +1 -1
  15. package/dist/commands/connections.js +0 -16
  16. package/dist/commands/connections.js.map +1 -1
  17. package/dist/commands/connectors.d.ts +31 -0
  18. package/dist/commands/connectors.js +276 -0
  19. package/dist/commands/connectors.js.map +1 -0
  20. package/dist/commands/context.d.ts +22 -0
  21. package/dist/commands/context.js +151 -0
  22. package/dist/commands/context.js.map +1 -0
  23. package/dist/commands/data-extra.d.ts +13 -0
  24. package/dist/commands/data-extra.js +161 -0
  25. package/dist/commands/data-extra.js.map +1 -0
  26. package/dist/commands/data.d.ts +13 -9
  27. package/dist/commands/data.js +213 -109
  28. package/dist/commands/data.js.map +1 -1
  29. package/dist/commands/doc.d.ts +39 -0
  30. package/dist/commands/doc.js +130 -0
  31. package/dist/commands/doc.js.map +1 -0
  32. package/dist/commands/events.d.ts +26 -0
  33. package/dist/commands/events.js +68 -0
  34. package/dist/commands/events.js.map +1 -0
  35. package/dist/commands/explain.d.ts +21 -0
  36. package/dist/commands/explain.js +248 -0
  37. package/dist/commands/explain.js.map +1 -0
  38. package/dist/commands/graph.d.ts +18 -0
  39. package/dist/commands/graph.js +73 -0
  40. package/dist/commands/graph.js.map +1 -0
  41. package/dist/commands/home.d.ts +12 -0
  42. package/dist/commands/home.js +54 -0
  43. package/dist/commands/home.js.map +1 -0
  44. package/dist/commands/init.d.ts +0 -2
  45. package/dist/commands/init.js +62 -102
  46. package/dist/commands/init.js.map +1 -1
  47. package/dist/commands/keys.d.ts +9 -0
  48. package/dist/commands/keys.js +79 -0
  49. package/dist/commands/keys.js.map +1 -0
  50. package/dist/commands/knowledge.d.ts +32 -18
  51. package/dist/commands/knowledge.js +301 -55
  52. package/dist/commands/knowledge.js.map +1 -1
  53. package/dist/commands/observe.d.ts +9 -0
  54. package/dist/commands/observe.js +90 -0
  55. package/dist/commands/observe.js.map +1 -0
  56. package/dist/commands/open.d.ts +15 -0
  57. package/dist/commands/open.js +44 -0
  58. package/dist/commands/open.js.map +1 -0
  59. package/dist/commands/pods.d.ts +5 -0
  60. package/dist/commands/pods.js +85 -37
  61. package/dist/commands/pods.js.map +1 -1
  62. package/dist/commands/proposals-actions.d.ts +7 -0
  63. package/dist/commands/proposals-actions.js +40 -0
  64. package/dist/commands/proposals-actions.js.map +1 -0
  65. package/dist/commands/providers.d.ts +38 -0
  66. package/dist/commands/providers.js +170 -0
  67. package/dist/commands/providers.js.map +1 -0
  68. package/dist/commands/sessions.d.ts +31 -0
  69. package/dist/commands/sessions.js +224 -0
  70. package/dist/commands/sessions.js.map +1 -0
  71. package/dist/commands/skills-commands.d.ts +26 -0
  72. package/dist/commands/skills-commands.js +186 -0
  73. package/dist/commands/skills-commands.js.map +1 -0
  74. package/dist/commands/skills.d.ts +26 -0
  75. package/dist/commands/skills.js +195 -0
  76. package/dist/commands/skills.js.map +1 -0
  77. package/dist/commands/status.js +68 -30
  78. package/dist/commands/status.js.map +1 -1
  79. package/dist/commands/subscribe.d.ts +19 -0
  80. package/dist/commands/subscribe.js +91 -0
  81. package/dist/commands/subscribe.js.map +1 -0
  82. package/dist/commands/view.d.ts +57 -0
  83. package/dist/commands/view.js +194 -0
  84. package/dist/commands/view.js.map +1 -0
  85. package/dist/index.d.ts +3 -4
  86. package/dist/index.js +812 -206
  87. package/dist/index.js.map +1 -1
  88. package/dist/lib/agent-templates.d.ts +25 -0
  89. package/dist/lib/agent-templates.js +148 -0
  90. package/dist/lib/agent-templates.js.map +1 -0
  91. package/dist/lib/agents-config.d.ts +4 -1
  92. package/dist/lib/agents-config.js +19 -2
  93. package/dist/lib/agents-config.js.map +1 -1
  94. package/dist/lib/capture-lane.d.ts +49 -0
  95. package/dist/lib/capture-lane.js +79 -0
  96. package/dist/lib/capture-lane.js.map +1 -0
  97. package/dist/lib/hub-client.d.ts +6 -0
  98. package/dist/lib/hub-client.js +31 -3
  99. package/dist/lib/hub-client.js.map +1 -1
  100. package/dist/lib/pod.d.ts +14 -1
  101. package/dist/lib/pod.js +24 -2
  102. package/dist/lib/pod.js.map +1 -1
  103. package/dist/lib/skills-installer.d.ts +1 -1
  104. package/dist/lib/skills-installer.js +1 -1
  105. package/dist/lib/skills-installer.js.map +1 -1
  106. package/dist/lib/targets.d.ts +17 -1
  107. package/dist/lib/targets.js +713 -63
  108. package/dist/lib/targets.js.map +1 -1
  109. package/package.json +2 -1
  110. package/skills/synap/SKILL.md +357 -82
  111. package/skills/synap-ui/SKILL.md +12 -9
  112. package/dist/lib/templates.d.ts +0 -11
  113. package/dist/lib/templates.js +0 -13
  114. package/dist/lib/templates.js.map +0 -1
  115. package/dist/templates/agent-os.json +0 -3090
@@ -0,0 +1,73 @@
1
+ /**
2
+ * synap graph
3
+ *
4
+ * BFS graph traversal from a starting entity via the Hub Protocol.
5
+ *
6
+ * Usage:
7
+ * synap graph --entity <id> # traversal depth 2
8
+ * synap graph --entity <id> --depth 3
9
+ * synap graph --entity <id> --json
10
+ */
11
+ import chalk from "chalk";
12
+ import { log } from "../utils/logger.js";
13
+ import { resolveHubConfig, resolveUserId, hubGet } from "../lib/hub-client.js";
14
+ export async function graphTraverse(opts) {
15
+ try {
16
+ const cfg = await resolveHubConfig(opts);
17
+ const userId = await resolveUserId(cfg);
18
+ const maxDepth = parseInt(opts.depth ?? "2", 10);
19
+ const results = await hubGet("/graph/traverse", {
20
+ startEntityId: opts.entity,
21
+ maxDepth,
22
+ userId,
23
+ }, cfg);
24
+ if (opts.json) {
25
+ console.log(JSON.stringify(results, null, 2));
26
+ return;
27
+ }
28
+ // The API returns a flat array of records — each record is an entity or
29
+ // relation row from the traversal. Split by whether it has a `sourceEntityId`
30
+ // (relation) or not (node).
31
+ const nodes = [];
32
+ const edges = [];
33
+ for (const row of (Array.isArray(results) ? results : [])) {
34
+ if (row.sourceEntityId || row.targetEntityId) {
35
+ edges.push(row);
36
+ }
37
+ else {
38
+ nodes.push(row);
39
+ }
40
+ }
41
+ console.log(chalk.bold(`\nGraph from ${opts.entity} (depth ${maxDepth})`));
42
+ console.log(chalk.bold(`\nNodes (${nodes.length}):`));
43
+ if (nodes.length === 0) {
44
+ log.dim("(none)");
45
+ }
46
+ else {
47
+ for (const n of nodes) {
48
+ const profile = String(n.profileSlug ?? n.entityType ?? n.type ?? "entity").padEnd(14);
49
+ const title = String(n.title ?? n.name ?? "–").slice(0, 40).padEnd(42);
50
+ const id = chalk.dim(String(n.id ?? "").slice(0, 8));
51
+ console.log(` ${chalk.cyan("•")} ${profile} ${title} ${id}`);
52
+ }
53
+ }
54
+ console.log(chalk.bold(`\nEdges (${edges.length}):`));
55
+ if (edges.length === 0) {
56
+ log.dim("(none)");
57
+ }
58
+ else {
59
+ for (const e of edges) {
60
+ const relType = String(e.type ?? e.relationType ?? e.relationshipType ?? "–").padEnd(22);
61
+ const src = String(e.sourceEntityId ?? "?").slice(0, 8);
62
+ const tgt = String(e.targetEntityId ?? "?").slice(0, 8);
63
+ console.log(` ${chalk.dim(relType)} ${chalk.dim(src)} → ${chalk.dim(tgt)}`);
64
+ }
65
+ }
66
+ console.log("");
67
+ }
68
+ catch (e) {
69
+ log.error("Error: " + e.message);
70
+ process.exit(1);
71
+ }
72
+ }
73
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/commands/graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * synap home
3
+ *
4
+ * Show the current bento layout of the active workspace's home screen.
5
+ * Useful at the start of an agent session to understand what's already
6
+ * present before proposing UI changes.
7
+ */
8
+ import type { BaseOpts } from "./data.js";
9
+ export interface HomeOpts extends BaseOpts {
10
+ workspace?: string;
11
+ }
12
+ export declare function showHome(opts: HomeOpts): Promise<void>;
@@ -0,0 +1,54 @@
1
+ /**
2
+ * synap home
3
+ *
4
+ * Show the current bento layout of the active workspace's home screen.
5
+ * Useful at the start of an agent session to understand what's already
6
+ * present before proposing UI changes.
7
+ */
8
+ import chalk from "chalk";
9
+ import { log } from "../utils/logger.js";
10
+ import { resolveHubConfig, hubGet } from "../lib/hub-client.js";
11
+ import { getAgentWorkspaceRouting } from "../lib/pod.js";
12
+ export async function showHome(opts) {
13
+ try {
14
+ const cfg = await resolveHubConfig(opts);
15
+ const routing = getAgentWorkspaceRouting();
16
+ const workspaceId = opts.workspace ??
17
+ routing?.memoryWorkspaceId ??
18
+ cfg.workspaceId;
19
+ if (!workspaceId) {
20
+ console.error(chalk.red("Error: no workspace resolved. Pass --workspace <id> or run `synap context` to set active workspace."));
21
+ process.exit(1);
22
+ }
23
+ const res = (await hubGet(`/workspaces/${workspaceId}/home`, {}, cfg));
24
+ if (opts.json) {
25
+ console.log(JSON.stringify(res, null, 2));
26
+ return;
27
+ }
28
+ const viewLabel = res.homeViewName
29
+ ? `${res.homeViewName} (${res.homeViewId ?? "no view"})`
30
+ : res.homeViewId ?? chalk.dim("none");
31
+ log.info(`Home layout — workspace ${chalk.bold(workspaceId.slice(0, 8))}`);
32
+ console.log(` View: ${chalk.cyan(viewLabel)}`);
33
+ console.log(` Blocks: ${res.blocks.length}`);
34
+ if (res.blockSummary.length === 0) {
35
+ console.log(chalk.dim(" (empty — no bento blocks on home yet)"));
36
+ return;
37
+ }
38
+ console.log("");
39
+ for (const b of res.blockSummary) {
40
+ const kindLabel = chalk.dim(`[${b.kind}]`);
41
+ const typeLabel = b.typeKey ? chalk.cyan(b.typeKey) : "";
42
+ const nameLabel = b.label ? chalk.white(b.label) : chalk.dim("unlabelled");
43
+ const idLabel = b.id ? chalk.dim(` ${b.id.slice(0, 8)}`) : "";
44
+ console.log(` ${kindLabel} ${typeLabel} ${nameLabel}${idLabel}`);
45
+ }
46
+ console.log("");
47
+ console.log(chalk.dim("Tip: use `create_proposal` with targetType:\"workspace_home\" to propose adding or removing blocks."));
48
+ }
49
+ catch (e) {
50
+ log.error("Error: " + e.message);
51
+ process.exit(1);
52
+ }
53
+ }
54
+ //# sourceMappingURL=home.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"home.js","sourceRoot":"","sources":["../../src/commands/home.ts"],"names":[],"mappings":"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"}
@@ -10,11 +10,9 @@ import { detectOpenClaw } from "../lib/openclaw.js";
10
10
  interface InitOptions {
11
11
  podUrl?: string;
12
12
  apiKey?: string;
13
- skipSecurity?: boolean;
14
13
  skipIs?: boolean;
15
14
  }
16
15
  export declare function init(opts: InitOptions): Promise<void>;
17
- export declare function securityStep(version?: string): Promise<void>;
18
16
  export declare function skillStep(openclawFound: boolean, oc?: ReturnType<typeof detectOpenClaw>): Promise<void>;
19
17
  export declare function seedStep(podUrl: string, apiKey: string, oc: ReturnType<typeof detectOpenClaw>): Promise<void>;
20
18
  export declare function isStep(podUrl: string, apiKey: string, openclawFound: boolean): Promise<void>;
@@ -13,7 +13,6 @@ import { execSync } from "child_process";
13
13
  import fs from "fs";
14
14
  import { log, banner } from "../utils/logger.js";
15
15
  import { detectOpenClaw, readOpenClawConfig, writeOpenClawConfig, setConfigValue, } from "../lib/openclaw.js";
16
- import { runSecurityChecks, computeScore } from "../lib/hardening.js";
17
16
  import { checkPodHealth, setupAgent, setupAgentViaCp, provisionUserOnPod, installSynapSkill, enableOpenClawAddonManaged, saveLocalPodConfig, checkServerResources, startOpenClawOnServer, findSynapDeployDir, getLocalPodConfig, } from "../lib/pod.js";
18
17
  import { seedAgentEntities } from "../lib/seed.js";
19
18
  import { login, isLoggedIn, listPods, getStoredToken, waitForPodCallback } from "../lib/auth.js";
@@ -47,12 +46,13 @@ export async function init(opts) {
47
46
  }
48
47
  }
49
48
  // ── Auto-detect environment ─────────────────────────────────────────────
49
+ // Pod URL is always the primary decision axis. OpenClaw, if present, is an
50
+ // optional enhancement that gets wired after the pod connection is set up —
51
+ // it is no longer the gating condition for which path runs.
50
52
  const oc = detectOpenClaw();
51
53
  const isServer = detectServer();
52
54
  if (oc.found) {
53
- log.info(`OpenClaw detected${oc.version ? ` v${oc.version}` : ""} — connect mode`);
54
- await pathA(opts, oc);
55
- return;
55
+ log.info(`OpenClaw detected${oc.version ? ` v${oc.version}` : ""} — will wire it after pod setup`);
56
56
  }
57
57
  if (isServer) {
58
58
  // Before assuming fresh install, check if a pod is already running
@@ -61,15 +61,26 @@ export async function init(opts) {
61
61
  spinner.stop();
62
62
  if (existingPodUrl) {
63
63
  log.success(`Found existing pod at ${existingPodUrl}`);
64
- log.info("Server detected, no OpenClaw — connecting to existing pod");
65
- await pathBExisting(opts, existingPodUrl);
64
+ if (oc.found) {
65
+ log.info("Server + OpenClaw — connecting pod then wiring OpenClaw");
66
+ await pathA(opts, oc);
67
+ }
68
+ else {
69
+ log.info("Server detected — connecting to existing pod");
70
+ await pathBExisting(opts, existingPodUrl);
71
+ }
66
72
  }
67
73
  else {
68
- log.info("Server detected, no OpenClaw — fresh setup mode");
74
+ log.info("Server detected — fresh setup mode");
69
75
  await pathB(opts);
70
76
  }
71
77
  return;
72
78
  }
79
+ if (oc.found) {
80
+ // Desktop with OpenClaw — use pathA (OpenClaw connect mode)
81
+ await pathA(opts, oc);
82
+ return;
83
+ }
73
84
  log.info("Running on desktop — hosting mode");
74
85
  await pathC(opts);
75
86
  }
@@ -81,10 +92,6 @@ async function pathA(opts, oc) {
81
92
  log.heading("Step 1: OpenClaw Detected");
82
93
  log.success(`Version: ${oc.version ?? "unknown"}`);
83
94
  log.success(`Gateway: ${oc.gatewayRunning ? "running" : "stopped"} (port ${oc.gatewayPort ?? 18789})`);
84
- // ── Security ────────────────────────────────────────────────────────────
85
- if (!opts.skipSecurity) {
86
- await securityStep(oc.version);
87
- }
88
95
  // ── Pod ─────────────────────────────────────────────────────────────────
89
96
  const podUrl = await podChoiceStep(opts);
90
97
  if (!podUrl)
@@ -136,7 +143,7 @@ async function pathBExisting(opts, detectedUrl) {
136
143
  log.warn("Could not find your Synap deploy directory automatically.");
137
144
  log.dim("Start OpenClaw manually from your synap-backend dir:");
138
145
  log.dim(" docker compose --profile openclaw up -d openclaw");
139
- log.dim("Then run: synap finish");
146
+ log.dim("Then run: synap update");
140
147
  return;
141
148
  }
142
149
  log.info(`Deploy dir: ${deployDir}`);
@@ -160,14 +167,14 @@ async function pathBExisting(opts, detectedUrl) {
160
167
  if (ocStarted) {
161
168
  log.info("OpenClaw is initializing (first boot takes 1-2 min).");
162
169
  log.info("Once it's ready, run:");
163
- console.log(chalk.cyan("\n synap finish\n"));
170
+ console.log(chalk.cyan("\n synap update\n"));
164
171
  log.dim("This will install the skill, seed your workspace, and configure AI routing.");
165
172
  log.dim("Check progress at any time: synap status");
166
173
  }
167
174
  else {
168
175
  log.info("Start OpenClaw manually:");
169
176
  console.log(chalk.cyan(`\n cd ${deployDir} && docker compose --profile openclaw up -d openclaw\n`));
170
- log.dim("Then run: synap finish");
177
+ log.dim("Then run: synap update");
171
178
  }
172
179
  }
173
180
  // =============================================================================
@@ -233,7 +240,7 @@ async function pathB(opts) {
233
240
  }
234
241
  log.blank();
235
242
  log.info("OpenClaw is initializing. Once it's ready, run:");
236
- console.log(chalk.cyan("\n synap finish\n"));
243
+ console.log(chalk.cyan("\n synap update\n"));
237
244
  log.dim("Check progress: synap status");
238
245
  return;
239
246
  }
@@ -344,8 +351,7 @@ async function connectExistingPod(podUrl, opts, podType, podId) {
344
351
  const oc = detectOpenClaw();
345
352
  if (oc.found) {
346
353
  log.success(`OpenClaw detected${oc.version ? ` v${oc.version}` : ""}`);
347
- if (!opts.skipSecurity)
348
- await securityStep(oc.version);
354
+ // Security audit removed — no longer OpenClaw-specific
349
355
  }
350
356
  // Get API key
351
357
  const apiKey = await connectStep(podUrl, opts, oc.found, podId);
@@ -431,44 +437,10 @@ async function connectExistingPod(podUrl, opts, podType, podId) {
431
437
  log.info("Pod connected. Once OpenClaw is running:");
432
438
  log.dim(" Local: openclaw skills install synap");
433
439
  log.dim(" Docker: docker exec openclaw openclaw skills install synap");
434
- log.dim(" Or run: synap finish");
440
+ log.dim(" Or run: synap update");
435
441
  }
436
442
  printSummary(podUrl, ocAfter.found);
437
443
  }
438
- // =============================================================================
439
- // SHARED STEPS
440
- // =============================================================================
441
- export async function securityStep(version) {
442
- log.heading("Security Audit");
443
- const checks = runSecurityChecks(version);
444
- const failed = checks.filter((c) => !c.passed);
445
- const score = computeScore(checks);
446
- const passed = checks.filter((c) => c.passed).length;
447
- console.log(` ${passed}/${checks.length} passed — Score: ${score === "A" ? chalk.green.bold("A") : score === "B" ? chalk.yellow.bold("B") : chalk.red.bold(score)}`);
448
- if (failed.length > 0) {
449
- const fixable = failed.filter((c) => c.fixable && c.fix);
450
- if (fixable.length > 0) {
451
- const { doFix } = await prompts({
452
- type: "confirm",
453
- name: "doFix",
454
- message: `Auto-fix ${fixable.length} issue(s)?`,
455
- initial: true,
456
- });
457
- if (doFix) {
458
- for (const check of fixable) {
459
- check.fix();
460
- log.success(`Fixed: ${check.name}`);
461
- }
462
- }
463
- }
464
- for (const check of failed.filter((c) => !c.fixable)) {
465
- log.warn(`${check.name} — ${check.message}`);
466
- }
467
- }
468
- else {
469
- log.success("All checks passed");
470
- }
471
- }
472
444
  async function podChoiceStep(opts) {
473
445
  log.heading("Synap Pod");
474
446
  if (opts.podUrl) {
@@ -837,11 +809,11 @@ export async function isStep(podUrl, apiKey, openclawFound) {
837
809
  }
838
810
  else if (!provData?.subscribed) {
839
811
  log.dim("No AI subscription — subscribe at https://synap.live/pricing");
840
- log.dim("Skip this step with: synap finish --skip-is");
812
+ log.dim("Skip this step with: synap update --skip-is");
841
813
  }
842
814
  else if (provData?.cpProvisioned) {
843
815
  log.dim("IS provisioned on CP but not yet confirmed on pod.");
844
- log.dim("Re-run 'synap finish' in a minute, or reprovision from Browser Settings.");
816
+ log.dim("Re-run 'synap update' in a minute, or reprovision from Browser Settings.");
845
817
  }
846
818
  }
847
819
  else {
@@ -861,40 +833,47 @@ export async function isStep(podUrl, apiKey, openclawFound) {
861
833
  log.blank();
862
834
  log.dim("To enable AI routing via Synap:");
863
835
  log.dim(" 1. Log in: synap login --token <token> (get token at synap.live/account/tokens)");
864
- log.dim(" 2. Re-run: synap finish");
836
+ log.dim(" 2. Re-run: synap update");
865
837
  log.blank();
866
- log.dim("Or skip AI for now: synap finish --skip-is");
838
+ log.dim("Or skip AI for now: synap update --skip-is");
867
839
  }
868
840
  }
869
841
  // 3. Configure OpenClaw provider (if found and IS is active)
870
842
  if (openclawFound && isActive) {
871
843
  const ocRuntime = detectOpenClaw();
872
- if (ocRuntime.runtime === "docker") {
873
- // Docker path: write via openclaw config set
874
- const containerName = ocRuntime.containerName ?? "openclaw";
875
- const { configureOc } = await prompts({
876
- type: "confirm",
877
- name: "configureOc",
878
- message: "Configure Synap IS as OpenClaw AI provider?",
879
- initial: true,
880
- });
881
- if (configureOc) {
882
- const synapProvider = {
883
- baseUrl: `${podUrl}/v1`,
884
- api: "openai-completions",
885
- apiKey,
886
- models: [
887
- { id: "synap/auto", name: "Synap Auto", contextWindow: 200000, maxTokens: 8192 },
888
- { id: "synap/balanced", name: "Synap Balanced", contextWindow: 131072, maxTokens: 8192 },
889
- { id: "synap/advanced", name: "Synap Advanced", contextWindow: 200000, maxTokens: 8192 },
890
- ],
891
- };
844
+ const { configureOc } = await prompts({
845
+ type: "confirm",
846
+ name: "configureOc",
847
+ message: "Configure Synap IS as OpenClaw AI provider?",
848
+ initial: true,
849
+ });
850
+ if (configureOc) {
851
+ // Fetch real model IDs from the pod so OpenClaw shows actual provider names
852
+ const { fetchPodProviders } = await import("./providers.js");
853
+ const podProviders = await fetchPodProviders(podUrl, apiKey);
854
+ const models = podProviders.flatMap((p) => p.models.map((m) => ({
855
+ id: `${p.providerId}/${m.id}`,
856
+ name: `${p.name} — ${m.id}`,
857
+ ...(m.contextWindow ? { contextWindow: m.contextWindow } : {}),
858
+ })));
859
+ if (models.length === 0) {
860
+ log.warn("No model IDs found — configure models in pod admin → Intelligence → Providers.");
861
+ log.dim("Skipping OpenClaw AI provider setup. Re-run: synap update");
862
+ return;
863
+ }
864
+ const synapProvider = {
865
+ baseUrl: `${podUrl}/v1`,
866
+ api: "openai-completions",
867
+ apiKey,
868
+ models,
869
+ };
870
+ if (ocRuntime.runtime === "docker") {
871
+ const containerName = ocRuntime.containerName ?? "openclaw";
892
872
  const spinner = ora("Writing Synap IS provider to OpenClaw config...").start();
893
873
  try {
894
874
  execSync(`docker exec ${containerName} openclaw config set models.providers.synap ${JSON.stringify(JSON.stringify(synapProvider))}`, { stdio: "pipe", timeout: 15000 });
895
875
  spinner.succeed("Synap IS registered as OpenClaw provider");
896
- log.dim("Available models: synap/auto, synap/balanced, synap/advanced");
897
- // Restart to apply (Docker has no hot reload)
876
+ log.dim(`Models: ${models.slice(0, 3).map((m) => m.id).join(", ")}${models.length > 3 ? ` +${models.length - 3} more` : ""}`);
898
877
  try {
899
878
  execSync(`docker restart ${containerName}`, { stdio: "pipe", timeout: 30000 });
900
879
  log.dim("Container restarted to pick up new config");
@@ -908,34 +887,15 @@ export async function isStep(podUrl, apiKey, openclawFound) {
908
887
  spinner.fail("Failed to set Synap IS provider");
909
888
  if (stderr)
910
889
  log.dim(stderr);
911
- log.dim("Run manually:");
912
890
  log.dim(` docker exec ${containerName} openclaw config set models.providers.synap.baseUrl ${podUrl}/v1`);
913
- log.dim(` docker exec ${containerName} openclaw config set models.providers.synap.api openai-completions`);
914
891
  }
915
892
  }
916
- }
917
- else {
918
- // Local install path: write to config file directly
919
- const { configureOc } = await prompts({
920
- type: "confirm",
921
- name: "configureOc",
922
- message: "Configure Synap IS as OpenClaw AI provider?",
923
- initial: true,
924
- });
925
- if (configureOc) {
893
+ else {
926
894
  const config = readOpenClawConfig() ?? {};
927
- setConfigValue(config, "models.providers.synap", {
928
- baseUrl: `${podUrl}/v1`,
929
- api: "openai-completions",
930
- apiKey,
931
- models: [
932
- { id: "synap/auto", name: "Synap Auto", contextWindow: 200000, maxTokens: 8192 },
933
- { id: "synap/balanced", name: "Synap Balanced", contextWindow: 131072, maxTokens: 8192 },
934
- { id: "synap/advanced", name: "Synap Advanced", contextWindow: 200000, maxTokens: 8192 },
935
- ],
936
- });
895
+ setConfigValue(config, "models.providers.synap", synapProvider);
937
896
  writeOpenClawConfig(config);
938
897
  log.success("Synap IS configured as OpenClaw provider — restart OpenClaw to apply");
898
+ log.dim(`Models: ${models.slice(0, 3).map((m) => m.id).join(", ")}${models.length > 3 ? ` +${models.length - 3} more` : ""}`);
939
899
  }
940
900
  }
941
901
  }
@@ -957,13 +917,13 @@ function printSummary(podUrl, openclawConnected) {
957
917
  }
958
918
  log.blank();
959
919
  log.dim(" synap status — health check");
960
- log.dim(" synap security-audit — verify security");
920
+ log.dim(" synap status — verify security");
961
921
  log.blank();
962
922
  if (!openclawConnected) {
963
923
  log.info("OpenClaw is provisioning on your pod server (2-5 min).");
964
924
  log.info("Once it's ready, run:");
965
925
  log.blank();
966
- console.log(chalk.cyan(" synap finish"));
926
+ console.log(chalk.cyan(" synap update"));
967
927
  log.blank();
968
928
  log.dim("This will install the skill, seed your workspace, and configure AI routing.");
969
929
  log.dim("Check progress: synap status");