@synap-core/cli 1.8.0 → 1.10.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 (332) hide show
  1. package/dist/commands/agent-chat.d.ts +47 -0
  2. package/dist/commands/agent-chat.js +250 -0
  3. package/dist/commands/agent-chat.js.map +1 -0
  4. package/dist/commands/agent-run.js +3 -4
  5. package/dist/commands/agent-run.js.map +1 -1
  6. package/dist/commands/agents.js +85 -46
  7. package/dist/commands/agents.js.map +1 -1
  8. package/dist/commands/automation.js +2 -1
  9. package/dist/commands/automation.js.map +1 -1
  10. package/dist/commands/bridge-setup.d.ts +66 -0
  11. package/dist/commands/bridge-setup.js +1112 -0
  12. package/dist/commands/bridge-setup.js.map +1 -0
  13. package/dist/commands/cap-connections.d.ts +28 -0
  14. package/dist/commands/cap-connections.js +224 -0
  15. package/dist/commands/cap-connections.js.map +1 -0
  16. package/dist/commands/capability.d.ts +89 -0
  17. package/dist/commands/capability.js +1523 -0
  18. package/dist/commands/capability.js.map +1 -0
  19. package/dist/commands/centrality.d.ts +20 -0
  20. package/dist/commands/centrality.js +94 -0
  21. package/dist/commands/centrality.js.map +1 -0
  22. package/dist/commands/connect.d.ts +2 -0
  23. package/dist/commands/connect.js +16 -35
  24. package/dist/commands/connect.js.map +1 -1
  25. package/dist/commands/context.js +4 -6
  26. package/dist/commands/context.js.map +1 -1
  27. package/dist/commands/data-extra.d.ts +1 -0
  28. package/dist/commands/data-extra.js +34 -10
  29. package/dist/commands/data-extra.js.map +1 -1
  30. package/dist/commands/data.d.ts +4 -4
  31. package/dist/commands/data.js +241 -184
  32. package/dist/commands/data.js.map +1 -1
  33. package/dist/commands/diagnose.d.ts +20 -0
  34. package/dist/commands/diagnose.js +143 -0
  35. package/dist/commands/diagnose.js.map +1 -0
  36. package/dist/commands/digest.d.ts +17 -0
  37. package/dist/commands/digest.js +121 -0
  38. package/dist/commands/digest.js.map +1 -0
  39. package/dist/commands/discover.d.ts +2 -0
  40. package/dist/commands/discover.js +25 -8
  41. package/dist/commands/discover.js.map +1 -1
  42. package/dist/commands/events.js +2 -1
  43. package/dist/commands/events.js.map +1 -1
  44. package/dist/commands/explain.d.ts +1 -1
  45. package/dist/commands/explain.js +18 -15
  46. package/dist/commands/explain.js.map +1 -1
  47. package/dist/commands/facet.d.ts +29 -0
  48. package/dist/commands/facet.js +113 -0
  49. package/dist/commands/facet.js.map +1 -0
  50. package/dist/commands/graph.js +2 -1
  51. package/dist/commands/graph.js.map +1 -1
  52. package/dist/commands/import.d.ts +38 -0
  53. package/dist/commands/import.js +440 -0
  54. package/dist/commands/import.js.map +1 -0
  55. package/dist/commands/init.js +35 -16
  56. package/dist/commands/init.js.map +1 -1
  57. package/dist/commands/keys.js +3 -4
  58. package/dist/commands/keys.js.map +1 -1
  59. package/dist/commands/knowledge.d.ts +2 -0
  60. package/dist/commands/knowledge.js +61 -9
  61. package/dist/commands/knowledge.js.map +1 -1
  62. package/dist/commands/launch.d.ts +50 -0
  63. package/dist/commands/launch.js +790 -0
  64. package/dist/commands/launch.js.map +1 -0
  65. package/dist/commands/lens.d.ts +45 -0
  66. package/dist/commands/lens.js +386 -0
  67. package/dist/commands/lens.js.map +1 -0
  68. package/dist/commands/market.d.ts +209 -0
  69. package/dist/commands/market.js +1368 -0
  70. package/dist/commands/market.js.map +1 -0
  71. package/dist/commands/mcp.d.ts +42 -0
  72. package/dist/commands/mcp.js +184 -0
  73. package/dist/commands/mcp.js.map +1 -0
  74. package/dist/commands/observe.js +14 -11
  75. package/dist/commands/observe.js.map +1 -1
  76. package/dist/commands/open.d.ts +21 -4
  77. package/dist/commands/open.js +45 -4
  78. package/dist/commands/open.js.map +1 -1
  79. package/dist/commands/pod.d.ts +100 -0
  80. package/dist/commands/pod.js +359 -0
  81. package/dist/commands/pod.js.map +1 -0
  82. package/dist/commands/pods.d.ts +1 -0
  83. package/dist/commands/pods.js +77 -15
  84. package/dist/commands/pods.js.map +1 -1
  85. package/dist/commands/proposals-actions.js +40 -3
  86. package/dist/commands/proposals-actions.js.map +1 -1
  87. package/dist/commands/purge.d.ts +23 -0
  88. package/dist/commands/purge.js +148 -0
  89. package/dist/commands/purge.js.map +1 -0
  90. package/dist/commands/raycast.d.ts +15 -0
  91. package/dist/commands/raycast.js +153 -0
  92. package/dist/commands/raycast.js.map +1 -0
  93. package/dist/commands/sessions.js +45 -21
  94. package/dist/commands/sessions.js.map +1 -1
  95. package/dist/commands/skill-manage.d.ts +21 -0
  96. package/dist/commands/skill-manage.js +195 -0
  97. package/dist/commands/skill-manage.js.map +1 -0
  98. package/dist/commands/skills-commands.js +2 -1
  99. package/dist/commands/skills-commands.js.map +1 -1
  100. package/dist/commands/skills.js +4 -3
  101. package/dist/commands/skills.js.map +1 -1
  102. package/dist/commands/status.d.ts +3 -1
  103. package/dist/commands/status.js +166 -14
  104. package/dist/commands/status.js.map +1 -1
  105. package/dist/commands/statusline.d.ts +24 -0
  106. package/dist/commands/statusline.js +450 -0
  107. package/dist/commands/statusline.js.map +1 -0
  108. package/dist/commands/subscribe.js +2 -2
  109. package/dist/commands/subscribe.js.map +1 -1
  110. package/dist/commands/tools.d.ts +30 -0
  111. package/dist/commands/tools.js +315 -0
  112. package/dist/commands/tools.js.map +1 -0
  113. package/dist/commands/versions.d.ts +27 -0
  114. package/dist/commands/versions.js +277 -0
  115. package/dist/commands/versions.js.map +1 -0
  116. package/dist/commands/view.js +3 -2
  117. package/dist/commands/view.js.map +1 -1
  118. package/dist/commands/whoami.d.ts +21 -0
  119. package/dist/commands/whoami.js +129 -0
  120. package/dist/commands/whoami.js.map +1 -0
  121. package/dist/index.js +776 -60
  122. package/dist/index.js.map +1 -1
  123. package/dist/lib/approval-poll.d.ts +42 -0
  124. package/dist/lib/approval-poll.js +52 -0
  125. package/dist/lib/approval-poll.js.map +1 -0
  126. package/dist/lib/auth.d.ts +29 -6
  127. package/dist/lib/auth.js +105 -94
  128. package/dist/lib/auth.js.map +1 -1
  129. package/dist/lib/bundle-version.d.ts +11 -0
  130. package/dist/lib/bundle-version.js +33 -0
  131. package/dist/lib/bundle-version.js.map +1 -0
  132. package/dist/lib/capture-lane.d.ts +30 -12
  133. package/dist/lib/capture-lane.js +71 -14
  134. package/dist/lib/capture-lane.js.map +1 -1
  135. package/dist/lib/cp-packages.d.ts +121 -0
  136. package/dist/lib/cp-packages.js +218 -0
  137. package/dist/lib/cp-packages.js.map +1 -0
  138. package/dist/lib/describe-lens.d.ts +46 -0
  139. package/dist/lib/describe-lens.js +33 -0
  140. package/dist/lib/describe-lens.js.map +1 -0
  141. package/dist/lib/hub-client.d.ts +78 -1
  142. package/dist/lib/hub-client.js +474 -22
  143. package/dist/lib/hub-client.js.map +1 -1
  144. package/dist/lib/installed.d.ts +51 -0
  145. package/dist/lib/installed.js +70 -0
  146. package/dist/lib/installed.js.map +1 -0
  147. package/dist/lib/next-steps.d.ts +61 -0
  148. package/dist/lib/next-steps.js +146 -0
  149. package/dist/lib/next-steps.js.map +1 -0
  150. package/dist/lib/pod.d.ts +91 -19
  151. package/dist/lib/pod.js +222 -56
  152. package/dist/lib/pod.js.map +1 -1
  153. package/dist/lib/project-ref.d.ts +95 -0
  154. package/dist/lib/project-ref.js +144 -0
  155. package/dist/lib/project-ref.js.map +1 -0
  156. package/dist/lib/project.d.ts +35 -0
  157. package/dist/lib/project.js +39 -0
  158. package/dist/lib/project.js.map +1 -0
  159. package/dist/lib/session-lens.d.ts +33 -0
  160. package/dist/lib/session-lens.js +76 -0
  161. package/dist/lib/session-lens.js.map +1 -0
  162. package/dist/lib/skill-import.d.ts +40 -0
  163. package/dist/lib/skill-import.js +203 -0
  164. package/dist/lib/skill-import.js.map +1 -0
  165. package/dist/lib/skills-installer.d.ts +17 -6
  166. package/dist/lib/skills-installer.js +133 -19
  167. package/dist/lib/skills-installer.js.map +1 -1
  168. package/dist/lib/suite.d.ts +28 -0
  169. package/dist/lib/suite.js +29 -0
  170. package/dist/lib/suite.js.map +1 -0
  171. package/dist/lib/superwhisper-import.d.ts +40 -0
  172. package/dist/lib/superwhisper-import.js +389 -0
  173. package/dist/lib/superwhisper-import.js.map +1 -0
  174. package/dist/lib/targets.d.ts +49 -1
  175. package/dist/lib/targets.js +420 -288
  176. package/dist/lib/targets.js.map +1 -1
  177. package/dist/lib/unwrapList.d.ts +1 -0
  178. package/dist/lib/unwrapList.js +20 -0
  179. package/dist/lib/unwrapList.js.map +1 -0
  180. package/dist/utils/logger.d.ts +2 -0
  181. package/dist/utils/logger.js +10 -2
  182. package/dist/utils/logger.js.map +1 -1
  183. package/package.json +9 -4
  184. package/skills/agent-os/SKILL.md +212 -0
  185. package/skills/manifest.json +5 -0
  186. package/skills/onboard/SKILL.md +186 -0
  187. package/skills/synap/SKILL.md +1182 -37
  188. package/skills/synap/_order.txt +37 -0
  189. package/skills/synap/_skill.yaml +24 -0
  190. package/skills/synap/authentication.md +10 -0
  191. package/skills/synap/automations.md +264 -0
  192. package/skills/synap/capabilities.md +107 -0
  193. package/skills/synap/capture.md +10 -0
  194. package/skills/synap/cli-operations.md +107 -0
  195. package/skills/synap/common-mistakes.md +12 -0
  196. package/skills/synap/creative-loop.md +43 -0
  197. package/skills/synap/crm.md +117 -0
  198. package/skills/synap/diagnostics.md +35 -0
  199. package/skills/synap/digesting-a-channel.md +38 -0
  200. package/skills/synap/document-embeds.md +123 -0
  201. package/skills/synap/escalation-ladder.md +71 -0
  202. package/skills/synap/focus-sessions.md +47 -0
  203. package/skills/synap/governance-rules.md +64 -0
  204. package/skills/synap/governance.md +6 -6
  205. package/skills/synap/graph-gardening.md +21 -0
  206. package/skills/synap/inline-patterns.md +38 -0
  207. package/skills/synap/lenses.md +38 -0
  208. package/skills/synap/linking-principle.md +39 -0
  209. package/skills/synap/linking.md +1 -0
  210. package/skills/synap/mental-model.md +45 -0
  211. package/skills/synap/more.md +7 -0
  212. package/skills/synap/multi-entity-capture.md +10 -0
  213. package/skills/synap/next-action.md +37 -0
  214. package/skills/synap/north-star.md +17 -0
  215. package/skills/synap/operating-mode-rules.md +45 -0
  216. package/skills/synap/operating-mode.md +9 -0
  217. package/skills/synap/quick-reference.md +67 -0
  218. package/skills/synap/reading.md +43 -0
  219. package/skills/synap/recap.md +21 -0
  220. package/skills/synap/reflexes.md +46 -0
  221. package/skills/synap/response-style.md +21 -0
  222. package/skills/synap/scope.md +13 -0
  223. package/skills/synap/showing.md +17 -0
  224. package/skills/synap/user-model.md +25 -0
  225. package/skills/synap/viewframe-cells.md +290 -0
  226. package/skills/synap/work-flow.md +113 -0
  227. package/skills/synap/worked-examples.md +53 -0
  228. package/skills/synap/workspace-design.md +45 -0
  229. package/skills/synap/workspace-edges.md +49 -0
  230. package/skills/synap/writes.md +156 -0
  231. package/skills/synap-schema/SKILL.md +97 -6
  232. package/skills/synap-schema/_order.txt +13 -0
  233. package/skills/synap-schema/_skill.yaml +22 -0
  234. package/skills/synap-schema/before-you-touch.md +14 -0
  235. package/skills/synap-schema/common-mistakes.md +9 -0
  236. package/skills/synap-schema/creating-profiles.md +17 -0
  237. package/skills/synap-schema/discover-profiles.md +24 -0
  238. package/skills/synap-schema/entity-scope.md +8 -0
  239. package/skills/synap-schema/extend-vs-create.md +31 -0
  240. package/skills/synap-schema/more.md +6 -0
  241. package/skills/synap-schema/overlay-properties.md +22 -0
  242. package/skills/synap-schema/profiles.md +3 -0
  243. package/skills/synap-schema/property-defs.md +29 -0
  244. package/skills/synap-schema/read-before-write.md +50 -0
  245. package/skills/synap-schema/relations.md +18 -0
  246. package/skills/synap-schema/worked-example.md +30 -0
  247. package/skills/synap-ui/SKILL.md +26 -2
  248. package/skills/synap-ui/_order.txt +13 -0
  249. package/skills/synap-ui/_skill.yaml +23 -0
  250. package/skills/synap-ui/ai-companion.md +27 -0
  251. package/skills/synap-ui/arranging-bento.md +8 -0
  252. package/skills/synap-ui/before-you-build.md +20 -0
  253. package/skills/synap-ui/bento-layouts.md +35 -0
  254. package/skills/synap-ui/common-mistakes.md +10 -0
  255. package/skills/synap-ui/creating-views.md +26 -0
  256. package/skills/synap-ui/four-builds.md +24 -0
  257. package/skills/synap-ui/more.md +7 -0
  258. package/skills/synap-ui/proposing-vs-extending.md +11 -0
  259. package/skills/synap-ui/view-list.md +24 -0
  260. package/skills/synap-ui/views.md +3 -0
  261. package/skills/synap-ui/worked-example.md +18 -0
  262. package/skills/synap-ui/workspaces.md +47 -0
  263. package/templates/automations/bookmark-enrichment.automation.json +44 -0
  264. package/templates/automations/mail-feed.automation.json +86 -0
  265. package/templates/automations/url-bookmark-capture.automation.json +70 -0
  266. package/templates/skills/README.md +21 -0
  267. package/templates/skills/authoring-automations/SKILL.md +95 -0
  268. package/templates/skills/authoring-automations/reference/node-matrix.md +49 -0
  269. package/templates/skills/authoring-capabilities/SKILL.md +93 -0
  270. package/templates/skills/authoring-capabilities/reference/template-anatomy.md +70 -0
  271. package/templates/skills/authoring-playbooks/SKILL.md +102 -0
  272. package/templates/skills/authoring-playbooks/reference/stages-contract.md +35 -0
  273. package/templates/skills/authoring-playbooks/reference/worked-example.md +64 -0
  274. package/templates/skills/bookmark-enrichment/SKILL.md +40 -0
  275. package/templates/skills/coordinating-agents/SKILL.md +32 -0
  276. package/templates/skills/coordinating-branches/SKILL.md +27 -0
  277. package/templates/skills/mapping-the-server/SKILL.md +54 -0
  278. package/templates/skills/reading-client-progress/SKILL.md +65 -0
  279. package/templates/skills/routing-to-channels/SKILL.md +54 -0
  280. package/templates/skills/stellar-scf-grants-advisor/ASSOCIATE-CHEATSHEET.md +133 -0
  281. package/templates/skills/stellar-scf-grants-advisor/ASSOCIATE-ONBOARDING-GUIDE.md +761 -0
  282. package/templates/skills/stellar-scf-grants-advisor/CLIENT-FAQ.md +181 -0
  283. package/templates/skills/stellar-scf-grants-advisor/PARTNER-HANDOVER.md +130 -0
  284. package/templates/skills/stellar-scf-grants-advisor/SKILL.md +102 -0
  285. package/templates/skills/stellar-scf-grants-advisor/examples/README.md +43 -0
  286. package/templates/skills/stellar-scf-grants-advisor/examples/chat-summary-templates.md +158 -0
  287. package/templates/skills/stellar-scf-grants-advisor/examples/corpus-comparable-rows.md +136 -0
  288. package/templates/skills/stellar-scf-grants-advisor/examples/q10-team-rewrites.md +109 -0
  289. package/templates/skills/stellar-scf-grants-advisor/examples/q2-description-rewrites.md +88 -0
  290. package/templates/skills/stellar-scf-grants-advisor/examples/q6-integration-rewrites.md +107 -0
  291. package/templates/skills/stellar-scf-grants-advisor/examples/tranche-structures.md +176 -0
  292. package/templates/skills/stellar-scf-grants-advisor/reference/01-methodology.md +96 -0
  293. package/templates/skills/stellar-scf-grants-advisor/reference/02-scoring-framework.md +199 -0
  294. package/templates/skills/stellar-scf-grants-advisor/reference/03-rejection-patterns.md +241 -0
  295. package/templates/skills/stellar-scf-grants-advisor/reference/04-winner-patterns.md +120 -0
  296. package/templates/skills/stellar-scf-grants-advisor/reference/05-comeback-patterns.md +92 -0
  297. package/templates/skills/stellar-scf-grants-advisor/reference/06-budget-benchmarks.md +125 -0
  298. package/templates/skills/stellar-scf-grants-advisor/reference/07-integration-list.md +147 -0
  299. package/templates/skills/stellar-scf-grants-advisor/reference/08-abstract-fields.md +258 -0
  300. package/templates/skills/stellar-scf-grants-advisor/reference/09-build-fields.md +259 -0
  301. package/templates/skills/stellar-scf-grants-advisor/reference/10-corpus-winners.md +135 -0
  302. package/templates/skills/stellar-scf-grants-advisor/reference/11-corpus-rejects.md +267 -0
  303. package/templates/skills/stellar-scf-grants-advisor/reference/12-client-communication.md +131 -0
  304. package/templates/skills/stellar-scf-grants-advisor/reference/13-excel-output-spec.md +199 -0
  305. package/templates/skills/stellar-scf-grants-advisor/reference/14-worked-examples.md +160 -0
  306. package/templates/skills/stellar-scf-grants-advisor/templates/abstract-review-builder.py +253 -0
  307. package/templates/skills/stellar-scf-grants-advisor/templates/build-review-builder.py +213 -0
  308. package/dist/commands/connectors.d.ts +0 -31
  309. package/dist/commands/connectors.js +0 -276
  310. package/dist/commands/connectors.js.map +0 -1
  311. package/dist/commands/finish.d.ts +0 -25
  312. package/dist/commands/finish.js +0 -274
  313. package/dist/commands/finish.js.map +0 -1
  314. package/dist/commands/openclaw.d.ts +0 -40
  315. package/dist/commands/openclaw.js +0 -1148
  316. package/dist/commands/openclaw.js.map +0 -1
  317. package/dist/commands/security-audit.d.ts +0 -12
  318. package/dist/commands/security-audit.js +0 -100
  319. package/dist/commands/security-audit.js.map +0 -1
  320. package/dist/lib/hardening.d.ts +0 -18
  321. package/dist/lib/hardening.js +0 -214
  322. package/dist/lib/hardening.js.map +0 -1
  323. package/node_modules/@synap/hub-rest-client/dist/index.cjs +0 -881
  324. package/node_modules/@synap/hub-rest-client/dist/index.d.cts +0 -907
  325. package/node_modules/@synap/hub-rest-client/dist/index.d.ts +0 -907
  326. package/node_modules/@synap/hub-rest-client/dist/index.js +0 -851
  327. package/node_modules/@synap/hub-rest-client/package.json +0 -45
  328. package/node_modules/@synap/hub-rest-client/src/client.ts +0 -1143
  329. package/node_modules/@synap/hub-rest-client/src/errors.ts +0 -30
  330. package/node_modules/@synap/hub-rest-client/src/index.ts +0 -111
  331. package/node_modules/@synap/hub-rest-client/src/setup.ts +0 -77
  332. package/node_modules/@synap/hub-rest-client/src/types.ts +0 -639
@@ -0,0 +1,315 @@
1
+ /**
2
+ * synap tools — Add and manage external service tools (credentials + connections)
3
+ *
4
+ * Subcommands: list, connect, disconnect, sync, schema
5
+ */
6
+ import chalk from "chalk";
7
+ import ora from "ora";
8
+ import { exec } from "child_process";
9
+ import { mkdirSync, writeFileSync, existsSync } from "fs";
10
+ import { resolveHubConfig, hubGet, hubPost, renderHubError } from "../lib/hub-client.js";
11
+ import { capabilityList, capabilityConnect, capabilityDisconnect } from "./capability.js";
12
+ import { log } from "../utils/logger.js";
13
+ /**
14
+ * The one deprecation line every `tools` subcommand prints. `synap capability`
15
+ * (alias `cap`) is the single capability root; `tools` survives only as an alias
16
+ * so existing scripts keep working.
17
+ */
18
+ const TOOLS_DEPRECATED = "`synap tools` is deprecated — use `synap cap`";
19
+ // ── Helpers ───────────────────────────────────────────────────────────────────
20
+ /** Render the verbs a connection installed, e.g. after OAuth completes. */
21
+ function printUnlocked(unlocked) {
22
+ const skills = (unlocked ?? []).flatMap((u) => u.skills);
23
+ if (skills.length === 0)
24
+ return;
25
+ console.log();
26
+ log.heading("Capabilities installed");
27
+ for (const s of skills) {
28
+ const label = s.name.replace(/_/g, " ");
29
+ console.log(` ${chalk.green("✓")} ${chalk.bold(label)}${s.description ? chalk.dim(` — ${s.description}`) : ""}`);
30
+ }
31
+ console.log();
32
+ // Code skills are seeded as DRAFT (a deliberate gate — code runs unreviewed
33
+ // only after an explicit enable). Be honest about the one-time step.
34
+ log.dim("Enable these in Synap → Settings → Capabilities to let your agent use them.");
35
+ log.dim("Once enabled, each action still asks for your approval before it runs.");
36
+ }
37
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
38
+ /**
39
+ * Poll the connect door until the provider flips to `connected` (the user
40
+ * finished OAuth in the browser). The door is self-completing: on `connected`
41
+ * it materializes the tool + family template server-side and returns `unlocked`.
42
+ * Bounded so the CLI never hangs forever.
43
+ */
44
+ async function pollUntilConnected(cfg, provider, workspaceId, timeoutMs = 180_000, intervalMs = 3_000) {
45
+ const deadline = Date.now() + timeoutMs;
46
+ while (Date.now() < deadline) {
47
+ await sleep(intervalMs);
48
+ try {
49
+ const body = { provider };
50
+ if (workspaceId)
51
+ body.workspaceId = workspaceId;
52
+ const res = (await hubPost("/connectors/connect", body, cfg));
53
+ if (String(res.status) === "connected")
54
+ return res;
55
+ }
56
+ catch {
57
+ // transient — keep polling until the deadline
58
+ }
59
+ }
60
+ return null;
61
+ }
62
+ function openBrowser(url) {
63
+ const platform = process.platform;
64
+ let cmd;
65
+ if (platform === "darwin") {
66
+ cmd = `open "${url}"`;
67
+ }
68
+ else if (platform === "win32") {
69
+ cmd = `start "" "${url}"`;
70
+ }
71
+ else {
72
+ cmd = `xdg-open "${url}"`;
73
+ }
74
+ try {
75
+ exec(cmd);
76
+ }
77
+ catch {
78
+ // silently ignore — caller already prints the URL
79
+ }
80
+ }
81
+ async function fetchProviders(cfg, workspaceId) {
82
+ const params = {};
83
+ if (workspaceId)
84
+ params.workspaceId = workspaceId;
85
+ const res = await hubGet("/connectors/providers", params, cfg);
86
+ const r = res;
87
+ return (r.providers ?? []);
88
+ }
89
+ export async function toolsConnect(service, opts) {
90
+ log.dim(TOOLS_DEPRECATED);
91
+ // Capabilities are the one root now — forward the named-service connect to
92
+ // `cap connect` (the capability-first equivalent).
93
+ if (service) {
94
+ await capabilityConnect(service, { workspace: opts.workspace });
95
+ return;
96
+ }
97
+ let cfg;
98
+ try {
99
+ cfg = await resolveHubConfig({ podUrl: opts.podUrl, apiKey: opts.apiKey });
100
+ }
101
+ catch (err) {
102
+ log.error(err.message);
103
+ process.exit(1);
104
+ }
105
+ const workspaceId = opts.workspace ?? cfg.workspaceId;
106
+ const spinner = ora({ text: "Resolving connection…", color: "cyan" }).start();
107
+ // The unified door: resolves the provider, checks for an existing connection,
108
+ // and returns connected / setup_required / provider_required in one call.
109
+ // Connects as the operator (the CLI's key owner) — no per-user binding here.
110
+ let res;
111
+ try {
112
+ const body = {};
113
+ if (service)
114
+ body.provider = service;
115
+ if (workspaceId)
116
+ body.workspaceId = workspaceId;
117
+ res = (await hubPost("/connectors/connect", body, cfg));
118
+ spinner.stop();
119
+ }
120
+ catch (err) {
121
+ spinner.fail(chalk.red("Failed to resolve connection"));
122
+ log.error(err.message);
123
+ process.exit(1);
124
+ }
125
+ const status = String(res.status);
126
+ if (status === "connected") {
127
+ log.heading(`${res.displayName ?? res.provider} is already connected`);
128
+ printUnlocked(res.unlocked);
129
+ log.dim(`Run \`synap tools list\` to see all tools and their credentials.`);
130
+ return;
131
+ }
132
+ if (status === "provider_required") {
133
+ // The door only returns `provider_required` when Nango ANSWERED and declares
134
+ // at least one integration — "nothing declared" is `provider_unavailable`
135
+ // now, so this list is never empty. (The old fallback here opened a Connect
136
+ // session "for all services" against a Nango that declared none: it could
137
+ // only ever dead-end.)
138
+ const providers = (res.providers ?? []);
139
+ log.heading("Which service do you want to connect?");
140
+ console.log();
141
+ for (const p of providers) {
142
+ console.log(` ${chalk.cyan(p.provider)}${p.displayName ? chalk.dim(` (${p.displayName})`) : ""}`);
143
+ }
144
+ console.log();
145
+ log.dim(`Run \`synap cap connect <name>\` with one of the above.`);
146
+ return;
147
+ }
148
+ if (status === "provider_unavailable") {
149
+ // The pod can't offer this provider (not declared / unreachable / malformed).
150
+ // The server message already names the real cause + remedy — print it as-is.
151
+ // No browser, and no "re-run connect": re-running cannot fix a server-side gap.
152
+ log.warn(`${res.displayName ?? res.provider ?? service ?? "That service"} is unavailable on this pod.`);
153
+ if (res.message)
154
+ log.dim(String(res.message));
155
+ return;
156
+ }
157
+ // setup_required (or any status this CLI doesn't know) → only ever open a
158
+ // browser when the server actually handed us a URL. An older/newer pod that
159
+ // returns a status we don't handle must NOT send the user to "undefined".
160
+ const redirectUrl = typeof res.redirectUrl === "string" && res.redirectUrl.length > 0 ? res.redirectUrl : null;
161
+ if (!redirectUrl) {
162
+ log.warn(`Couldn't start a connection for ${res.displayName ?? res.provider ?? service ?? "that service"}.`);
163
+ if (res.message)
164
+ log.dim(String(res.message));
165
+ else
166
+ log.dim(`The pod returned status "${status}" with no connect URL. Check the pod's connector configuration.`);
167
+ return;
168
+ }
169
+ const matchedProvider = res.provider ? String(res.provider) : service;
170
+ log.heading(`Connect to ${res.displayName ?? res.provider ?? service ?? "external service"}`);
171
+ console.log();
172
+ console.log(` Opening OAuth flow in your browser…`);
173
+ console.log(` ${chalk.dim("If it didn't open, paste this URL in your browser:")}`);
174
+ console.log();
175
+ console.log(` ${chalk.underline(chalk.cyan(redirectUrl))}`);
176
+ console.log();
177
+ openBrowser(redirectUrl);
178
+ // Wait for the user to finish OAuth, then confirm + show what unlocked. The
179
+ // connect door materializes the capability server-side on `connected`, so by
180
+ // the time this resolves the agent can already use the new verbs.
181
+ if (matchedProvider) {
182
+ const waitSpinner = ora({ text: "Waiting for you to finish in the browser…", color: "cyan" }).start();
183
+ const connected = await pollUntilConnected(cfg, matchedProvider, workspaceId);
184
+ if (connected) {
185
+ waitSpinner.succeed(chalk.green(`Connected ${chalk.bold(String(connected.displayName ?? matchedProvider))}!`));
186
+ printUnlocked(connected.unlocked);
187
+ return;
188
+ }
189
+ waitSpinner.stop();
190
+ log.dim(`Didn't detect a connection yet — finish the browser flow, then run \`synap tools list\` to check status.`);
191
+ return;
192
+ }
193
+ log.dim(`Once connected, records will import automatically. Run \`synap tools list\` to check status.`);
194
+ }
195
+ export async function toolsList(opts) {
196
+ // `cap list` is the one capability-first view.
197
+ log.dim(TOOLS_DEPRECATED);
198
+ await capabilityList({ json: opts.json, workspace: opts.workspace });
199
+ }
200
+ export async function toolsSync(provider, opts) {
201
+ log.dim(TOOLS_DEPRECATED);
202
+ let cfg;
203
+ try {
204
+ cfg = await resolveHubConfig();
205
+ }
206
+ catch (err) {
207
+ log.error(err.message);
208
+ process.exit(1);
209
+ }
210
+ const workspaceId = opts.workspace ?? cfg.workspaceId;
211
+ try {
212
+ const providers = await fetchProviders(cfg, workspaceId);
213
+ const match = providers.find((p) => p.provider === provider || p.id === provider || p.displayName.toLowerCase() === provider.toLowerCase());
214
+ if (!match || !match.connected) {
215
+ log.error(`Provider ${chalk.bold(provider)} is not connected. Run: ${chalk.cyan(`synap cap connect ${provider}`)}`);
216
+ process.exit(1);
217
+ }
218
+ }
219
+ catch (err) {
220
+ renderHubError(err);
221
+ process.exit(1);
222
+ }
223
+ // The old background-import "sync" (POST /connectors/actions, a Nango named
224
+ // action) was retired — self-hosted Nango doesn't run Actions, and the model
225
+ // moved to ON-DEMAND access: a connected service is reached live via its
226
+ // capability skills (e.g. gmail_search), not pre-imported on a schedule. There
227
+ // is nothing to trigger, so this command does nothing and must not claim
228
+ // otherwise.
229
+ log.warn(`\`synap tools sync\` does nothing and will be removed.`);
230
+ log.dim(`${provider} is connected. Connected services are queried on demand by your ` +
231
+ "agent's capabilities (e.g. search, list, send), not imported on a schedule — " +
232
+ "so there is no sync to trigger.");
233
+ log.dim(`See connection status: synap cap list`);
234
+ }
235
+ export async function toolsDisconnect(provider, opts) {
236
+ log.dim(TOOLS_DEPRECATED);
237
+ // `cap disconnect` resolves a capability name OR a raw provider id, so the
238
+ // provider ids this command has always taken keep resolving.
239
+ await capabilityDisconnect(provider, { workspace: opts.workspace, force: opts.force });
240
+ }
241
+ export async function toolsSchema(opts) {
242
+ let cfg;
243
+ try {
244
+ cfg = await resolveHubConfig();
245
+ }
246
+ catch (err) {
247
+ log.error(err.message);
248
+ process.exit(1);
249
+ }
250
+ const spinner = opts.json ? null : ora({ text: "Fetching tool schema…", color: "cyan" }).start();
251
+ // The dedicated /connectors/schema route was retired; the provider catalog +
252
+ // connection status now comes from /connectors/providers (the same source the
253
+ // list command uses). Shape it into the { providers } envelope the markdown
254
+ // builder expects.
255
+ let schema;
256
+ try {
257
+ const providers = await fetchProviders(cfg);
258
+ schema = { providers };
259
+ spinner?.stop();
260
+ }
261
+ catch (err) {
262
+ spinner?.fail(chalk.red("Failed to fetch tool schema"));
263
+ log.error(err.message);
264
+ process.exit(1);
265
+ }
266
+ if (opts.json) {
267
+ console.log(JSON.stringify(schema, null, 2));
268
+ return;
269
+ }
270
+ const s = schema;
271
+ const md = buildToolSchemaMarkdown(s, cfg.podUrl);
272
+ if (opts.writeContext !== undefined && opts.writeContext !== false) {
273
+ const outputPath = typeof opts.writeContext === "string" && opts.writeContext.length > 0
274
+ ? opts.writeContext
275
+ : ".claude/TOOLS_CONTEXT.md";
276
+ const dir = outputPath.includes("/") ? outputPath.split("/").slice(0, -1).join("/") : ".";
277
+ if (dir && dir !== "." && !existsSync(dir)) {
278
+ mkdirSync(dir, { recursive: true });
279
+ }
280
+ writeFileSync(outputPath, md, "utf-8");
281
+ log.success(`Context written to ${chalk.underline(outputPath)} — Claude Code will auto-load this in all sessions from this directory`);
282
+ }
283
+ else {
284
+ console.log(md);
285
+ }
286
+ }
287
+ function buildToolSchemaMarkdown(schema, podUrl) {
288
+ const lines = [
289
+ `# Synap Tool Reference`,
290
+ ``,
291
+ `> Fetched from pod: ${podUrl} — use this context to connect, manage, and query external service integrations.`,
292
+ ``,
293
+ `## Supported Providers`,
294
+ ];
295
+ const providers = (schema.providers ?? schema.supported ?? []);
296
+ if (providers.length > 0) {
297
+ for (const p of providers) {
298
+ lines.push(``, `### ${p.displayName ?? p.provider ?? p.id}`);
299
+ if (p.description)
300
+ lines.push(``, String(p.description));
301
+ if (p.actions) {
302
+ lines.push(``, `**Available actions:**`);
303
+ for (const action of p.actions) {
304
+ lines.push(`- \`${action}\``);
305
+ }
306
+ }
307
+ }
308
+ }
309
+ else {
310
+ lines.push(``, `Providers are configured in Nango. Common integrations include:`, `- Google Workspace (gmail, google-calendar, google-drive)`, `- GitHub (github)`, `- Notion (notion)`, `- Linear (linear)`, `- Slack (slack)`, `- HubSpot (hubspot)`);
311
+ }
312
+ lines.push(``, `## CLI Commands`, ``, `\`\`\`bash`, `# Connect a service (opens OAuth flow in browser)`, `synap cap connect [name]`, `synap cap connect "Nango — Google Workspace"`, ``, `# List all capabilities and connection status`, `synap tools list`, `synap tools list --json`, `synap cap list`, ``, `# Show one capability's detail (status, connection, verbs, next action)`, `synap cap show <name>`, ``, `# Turn on a capability (ensures its connection, then picks verbs)`, `synap cap enable [name]`, ``, `# Run a verb`, `synap cap run <verb>`, ``, `# Disconnect a provider`, `synap tools disconnect <provider>`, `synap tools disconnect google --force`, ``, `# Fetch this schema`, `synap tools schema`, `synap tools schema --write-context # writes to .claude/TOOLS_CONTEXT.md`, `\`\`\``, ``, `## Hub REST Endpoints`, ``, `| Method | Path | Description |`, `|--------|------|-------------|`, `| POST | /api/hub/connectors/connect | Resolve-or-start a connection (unified door) |`, `| GET | /api/hub/connectors/providers | List providers and connection status |`, `| POST | /api/hub/connectors/session | Start OAuth session, get redirectUrl |`, `| POST | /api/hub/connectors/disconnect | Disconnect a provider |`, `| POST | /api/hub/connectors/tool-execute | Run a provider call (proxied, governed) |`, ``, `## AI Usage Flow`, ``, `1. Check connected services: \`synap cap list\``, `2. Connect a new service: \`synap cap connect <name>\` — opens OAuth in browser`, `3. Connecting installs the service's capability skills (e.g. gmail_send, gmail_search)`, `4. The agent reaches the service ON DEMAND through those skills (no scheduled import)`, `5. Ask naturally: \`synap ask "any emails from Acme this week?"\``);
313
+ return lines.join("\n");
314
+ }
315
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/commands/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * synap versions
3
+ * ===============
4
+ *
5
+ * Answers "what version of each Synap artifact is LOCAL vs NPM vs
6
+ * CONTROL-PLANE vs POD" in one glance — the question `market update` can't
7
+ * answer because it only looks at what's already installed on the active pod,
8
+ * not whether the CP itself is seeded from a stale npm version. That gap is
9
+ * exactly how a publish can silently fail to propagate (e.g. templates
10
+ * published to npm 0.6.4 while the CP is still seeded from 0.5.0).
11
+ *
12
+ * READ-ONLY: every network call here is a GET (or `npm view`, which never
13
+ * mutates the registry). No pod/CP mutation, no writes anywhere.
14
+ *
15
+ * Reuses rather than re-derives:
16
+ * - `bundledTemplatesVersion()` (lib/bundle-version.ts) for the LOCAL
17
+ * workspace-templates version.
18
+ * - `fetchInstalledTemplates()` (lib/installed.ts) for the POD stamp summary.
19
+ * - `computeTemplateUpdates`/`isHashVersion` (@synap-core/workspace-templates)
20
+ * for the actual semver comparison — the same comparator `market update`
21
+ * already uses. Comparing two bare version strings is done by feeding them
22
+ * through that door via `compareVersions()` below rather than
23
+ * hand-rolling a second semver parser.
24
+ */
25
+ export declare function versions(opts?: {
26
+ json?: boolean;
27
+ }): Promise<void>;
@@ -0,0 +1,277 @@
1
+ /**
2
+ * synap versions
3
+ * ===============
4
+ *
5
+ * Answers "what version of each Synap artifact is LOCAL vs NPM vs
6
+ * CONTROL-PLANE vs POD" in one glance — the question `market update` can't
7
+ * answer because it only looks at what's already installed on the active pod,
8
+ * not whether the CP itself is seeded from a stale npm version. That gap is
9
+ * exactly how a publish can silently fail to propagate (e.g. templates
10
+ * published to npm 0.6.4 while the CP is still seeded from 0.5.0).
11
+ *
12
+ * READ-ONLY: every network call here is a GET (or `npm view`, which never
13
+ * mutates the registry). No pod/CP mutation, no writes anywhere.
14
+ *
15
+ * Reuses rather than re-derives:
16
+ * - `bundledTemplatesVersion()` (lib/bundle-version.ts) for the LOCAL
17
+ * workspace-templates version.
18
+ * - `fetchInstalledTemplates()` (lib/installed.ts) for the POD stamp summary.
19
+ * - `computeTemplateUpdates`/`isHashVersion` (@synap-core/workspace-templates)
20
+ * for the actual semver comparison — the same comparator `market update`
21
+ * already uses. Comparing two bare version strings is done by feeding them
22
+ * through that door via `compareVersions()` below rather than
23
+ * hand-rolling a second semver parser.
24
+ */
25
+ import { execSync } from "node:child_process";
26
+ import { createRequire } from "node:module";
27
+ import path from "node:path";
28
+ import fs from "node:fs";
29
+ import chalk from "chalk";
30
+ import { computeTemplateUpdates, isHashVersion, } from "@synap-core/workspace-templates";
31
+ import { log, banner } from "../utils/logger.js";
32
+ import { bundledTemplatesVersion } from "../lib/bundle-version.js";
33
+ import { fetchInstalledTemplates } from "../lib/installed.js";
34
+ import { getCpUrl } from "../lib/auth.js";
35
+ import { getActivePodConfig } from "../lib/pod.js";
36
+ const FETCH_TIMEOUT_MS = 8000;
37
+ // ── version lookups ─────────────────────────────────────────────────────────
38
+ /** `npm view <pkg> version` — spawned, tolerant of being offline/unpublished. */
39
+ function npmViewVersion(pkgName) {
40
+ try {
41
+ const out = execSync(`npm view ${pkgName} version`, {
42
+ encoding: "utf-8",
43
+ timeout: 10_000,
44
+ stdio: ["ignore", "pipe", "ignore"],
45
+ }).trim();
46
+ return out || undefined;
47
+ }
48
+ catch {
49
+ return undefined;
50
+ }
51
+ }
52
+ /** Best-effort resolve of an installed package's own version, mirroring `bundledTemplatesVersion()`'s walk-up-to-package.json approach for any package name. */
53
+ function resolvedLocalVersion(pkgName) {
54
+ try {
55
+ const req = createRequire(import.meta.url);
56
+ let dir = path.dirname(req.resolve(pkgName));
57
+ for (let i = 0; i < 6; i++) {
58
+ const pj = path.join(dir, "package.json");
59
+ if (fs.existsSync(pj)) {
60
+ const parsed = JSON.parse(fs.readFileSync(pj, "utf8"));
61
+ if (parsed.name === pkgName)
62
+ return parsed.version ?? undefined;
63
+ }
64
+ const parent = path.dirname(dir);
65
+ if (parent === dir)
66
+ break;
67
+ dir = parent;
68
+ }
69
+ }
70
+ catch {
71
+ /* not resolvable from this CLI — expected for packages the CLI doesn't depend on */
72
+ }
73
+ return undefined;
74
+ }
75
+ /**
76
+ * GET {CP}/api/packages/:slug — the CP's own copy of a published package,
77
+ * whose `definition.sourcePackage.version` is the npm version the CP last
78
+ * seeded from (see `packages.ts` publish flow). Tries a short list of known
79
+ * bundled slugs so a CP with one renamed/missing package doesn't blank the
80
+ * whole row.
81
+ */
82
+ async function fetchCpSeededVersion() {
83
+ const candidates = ["foundation", "ecosystem", "operations", "crm"];
84
+ for (const slug of candidates) {
85
+ try {
86
+ const res = await fetch(`${getCpUrl()}/api/packages/${encodeURIComponent(slug)}`, {
87
+ signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
88
+ });
89
+ if (!res.ok)
90
+ continue;
91
+ const data = (await res.json());
92
+ const version = data.package?.definition?.sourcePackage?.version;
93
+ if (version)
94
+ return { slug, version };
95
+ }
96
+ catch {
97
+ /* try next candidate */
98
+ }
99
+ }
100
+ return undefined;
101
+ }
102
+ /** GET {pod}/health — non-fatal on any failure (pod unreachable, older build). */
103
+ async function fetchPodHealth(podUrl) {
104
+ try {
105
+ const res = await fetch(`${podUrl}/health`, { signal: AbortSignal.timeout(FETCH_TIMEOUT_MS) });
106
+ if (!res.ok)
107
+ return undefined;
108
+ return (await res.json());
109
+ }
110
+ catch {
111
+ return undefined;
112
+ }
113
+ }
114
+ /** GET {CP}/api/marketplace/capabilities — public, no auth. */
115
+ async function fetchCapabilitiesCatalog() {
116
+ try {
117
+ const res = await fetch(`${getCpUrl()}/api/marketplace/capabilities`, {
118
+ signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
119
+ });
120
+ if (!res.ok)
121
+ return undefined;
122
+ const data = (await res.json());
123
+ const rows = data.capabilities ?? [];
124
+ const hashVersioned = rows.filter((r) => isHashVersion(r.version)).length;
125
+ return { total: rows.length, hashVersioned, semverVersioned: rows.length - hashVersioned };
126
+ }
127
+ catch {
128
+ return undefined;
129
+ }
130
+ }
131
+ // ── comparison (reused, not re-derived) ─────────────────────────────────────
132
+ /**
133
+ * Is `to` strictly newer than `from`? Routed through the shared
134
+ * `computeTemplateUpdates` comparator (`@synap-core/workspace-templates`) —
135
+ * the same one `market update` uses — instead of a second semver parser.
136
+ * Returns `undefined` when either side is unknown (nothing to compare).
137
+ */
138
+ function isNewer(from, to) {
139
+ if (!from || !to)
140
+ return undefined;
141
+ const entry = {
142
+ slug: "__cmp__",
143
+ name: "cmp",
144
+ tags: [],
145
+ isPrivate: false,
146
+ source: "remote",
147
+ remote: { slug: "__cmp__", name: "cmp", definition: { sourcePackage: { version: to } } },
148
+ };
149
+ const [check] = computeTemplateUpdates([{ slug: "__cmp__", version: from }], [entry]);
150
+ return check.updateAvailable;
151
+ }
152
+ // ── row rendering ───────────────────────────────────────────────────────────
153
+ const DASH = chalk.dim("—");
154
+ function fmt(v) {
155
+ return v ? v : DASH;
156
+ }
157
+ function printRow(label, value) {
158
+ console.log(` ${chalk.dim(label.padEnd(16))} ${value}`);
159
+ }
160
+ function printVerdict(d) {
161
+ if (d.inSync) {
162
+ log.success(d.message);
163
+ }
164
+ else {
165
+ log.warn(d.message);
166
+ }
167
+ }
168
+ async function checkWorkspaceTemplates() {
169
+ const local = bundledTemplatesVersion() || undefined;
170
+ const npm = npmViewVersion("@synap-core/workspace-templates");
171
+ const [cpInfo, installed] = await Promise.all([
172
+ fetchCpSeededVersion(),
173
+ fetchInstalledTemplates(),
174
+ ]);
175
+ const stamped = installed.filter((t) => t.version);
176
+ const pod = installed.length > 0
177
+ ? `${stamped.length}/${installed.length} stamped`
178
+ : undefined;
179
+ const cpBehindNpm = isNewer(cpInfo?.version, npm);
180
+ const localBehindNpm = isNewer(local, npm);
181
+ let drift;
182
+ if (!npm) {
183
+ drift = { inSync: false, message: "? npm unreachable — cannot verify drift" };
184
+ }
185
+ else if (cpBehindNpm) {
186
+ drift = {
187
+ inSync: false,
188
+ message: `CP is behind npm (seeded ${cpInfo?.version}, latest ${npm}) — redeploy CP to propagate`,
189
+ };
190
+ }
191
+ else if (cpInfo === undefined) {
192
+ drift = { inSync: false, message: "? CP has no known template package — cannot verify CP drift" };
193
+ }
194
+ else if (localBehindNpm) {
195
+ drift = {
196
+ inSync: false,
197
+ message: `Local CLI bundle is behind npm (local ${local}, latest ${npm}) — update @synap-core/workspace-templates`,
198
+ };
199
+ }
200
+ else {
201
+ drift = { inSync: true, message: "in sync" };
202
+ }
203
+ return { name: "workspace-templates", local, npm, cp: cpInfo?.version, cpSlug: cpInfo?.slug, pod, drift };
204
+ }
205
+ async function checkApiTypes(podUrl) {
206
+ const local = resolvedLocalVersion("@synap-core/api-types");
207
+ const npm = npmViewVersion("@synap-core/api-types");
208
+ const health = podUrl ? await fetchPodHealth(podUrl) : undefined;
209
+ const pod = health?.apiTypesVersion;
210
+ const podBehindNpm = isNewer(pod, npm);
211
+ let drift;
212
+ if (!npm) {
213
+ drift = { inSync: false, message: "? npm unreachable — cannot verify drift" };
214
+ }
215
+ else if (!pod) {
216
+ drift = { inSync: false, message: podUrl ? "? pod unreachable/older build — no apiTypesVersion reported" : "? no pod connected" };
217
+ }
218
+ else if (podBehindNpm) {
219
+ drift = {
220
+ inSync: false,
221
+ message: `Pod is behind npm (pod reports ${pod}, latest ${npm}) — bump the apiTypesVersion literal in synap-backend and redeploy`,
222
+ };
223
+ }
224
+ else {
225
+ drift = { inSync: true, message: "in sync" };
226
+ }
227
+ return { name: "api-types", local, npm, pod, drift };
228
+ }
229
+ async function checkCapabilities() {
230
+ const cat = await fetchCapabilitiesCatalog();
231
+ const cp = cat
232
+ ? `${cat.total} published${cat.hashVersioned > 0 ? ` (${cat.hashVersioned} hash-versioned, ${cat.semverVersioned} semver)` : ""}`
233
+ : undefined;
234
+ const pod = "n/a, see synap status";
235
+ const drift = cat
236
+ ? { inSync: true, message: cat.total > 0 ? `${cat.total} capabilities published to CP` : "no capabilities published" }
237
+ : { inSync: false, message: "? CP capability catalog unreachable" };
238
+ return { name: "capabilities", cp, pod, drift };
239
+ }
240
+ // ── entrypoint ───────────────────────────────────────────────────────────────
241
+ export async function versions(opts = {}) {
242
+ const localConfig = getActivePodConfig();
243
+ const podUrl = localConfig?.podUrl ?? process.env.SYNAP_POD_URL;
244
+ const [wt, at, cap] = await Promise.all([
245
+ checkWorkspaceTemplates(),
246
+ checkApiTypes(podUrl),
247
+ checkCapabilities(),
248
+ ]);
249
+ if (opts.json) {
250
+ const artifacts = [
251
+ { name: wt.name, local: wt.local ?? null, npm: wt.npm ?? null, cp: wt.cp ?? null, pod: wt.pod ?? null, drift: wt.drift },
252
+ { name: at.name, local: at.local ?? null, npm: at.npm ?? null, cp: null, pod: at.pod ?? null, drift: at.drift },
253
+ { name: cap.name, local: null, npm: null, cp: cap.cp ?? null, pod: cap.pod ?? null, drift: cap.drift },
254
+ ];
255
+ process.stdout.write(JSON.stringify({ artifacts }, null, 2) + "\n");
256
+ return;
257
+ }
258
+ banner();
259
+ log.dim("Version status across LOCAL / NPM / CONTROL-PLANE / POD for each Synap artifact.");
260
+ log.heading("workspace-templates");
261
+ printRow("LOCAL", fmt(wt.local));
262
+ printRow("NPM", fmt(wt.npm));
263
+ printRow("CP", wt.cp ? `${wt.cp}${wt.cpSlug ? chalk.dim(` (seeded via "${wt.cpSlug}")`) : ""}` : DASH);
264
+ printRow("POD", fmt(wt.pod));
265
+ printVerdict(wt.drift);
266
+ log.heading("api-types");
267
+ printRow("LOCAL", at.local ? at.local : chalk.dim("not installed in this CLI"));
268
+ printRow("NPM", fmt(at.npm));
269
+ printRow("POD", fmt(at.pod));
270
+ printVerdict(at.drift);
271
+ log.heading("capabilities");
272
+ printRow("CP", fmt(cap.cp));
273
+ printRow("POD", chalk.dim(cap.pod ?? ""));
274
+ printVerdict(cap.drift);
275
+ log.blank();
276
+ }
277
+ //# sourceMappingURL=versions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versions.js","sourceRoot":"","sources":["../../src/commands/versions.ts"],"names":[],"mappings":"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"}