@synap-core/cli 1.8.0 → 1.11.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 (372) 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 +1594 -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 +95 -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 +6 -7
  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 +41 -14
  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 +254 -187
  32. package/dist/commands/data.js.map +1 -1
  33. package/dist/commands/diagnose.d.ts +20 -0
  34. package/dist/commands/diagnose.js +186 -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 +122 -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/doc.d.ts +14 -0
  43. package/dist/commands/doc.js +61 -4
  44. package/dist/commands/doc.js.map +1 -1
  45. package/dist/commands/doctor.d.ts +21 -0
  46. package/dist/commands/doctor.js +189 -0
  47. package/dist/commands/doctor.js.map +1 -0
  48. package/dist/commands/events.js +5 -2
  49. package/dist/commands/events.js.map +1 -1
  50. package/dist/commands/explain.d.ts +1 -1
  51. package/dist/commands/explain.js +18 -15
  52. package/dist/commands/explain.js.map +1 -1
  53. package/dist/commands/facet.d.ts +29 -0
  54. package/dist/commands/facet.js +113 -0
  55. package/dist/commands/facet.js.map +1 -0
  56. package/dist/commands/graph.js +7 -4
  57. package/dist/commands/graph.js.map +1 -1
  58. package/dist/commands/import.d.ts +38 -0
  59. package/dist/commands/import.js +471 -0
  60. package/dist/commands/import.js.map +1 -0
  61. package/dist/commands/init.js +35 -16
  62. package/dist/commands/init.js.map +1 -1
  63. package/dist/commands/keys.js +3 -4
  64. package/dist/commands/keys.js.map +1 -1
  65. package/dist/commands/knowledge.d.ts +8 -0
  66. package/dist/commands/knowledge.js +308 -33
  67. package/dist/commands/knowledge.js.map +1 -1
  68. package/dist/commands/launch.d.ts +50 -0
  69. package/dist/commands/launch.js +790 -0
  70. package/dist/commands/launch.js.map +1 -0
  71. package/dist/commands/lens.d.ts +45 -0
  72. package/dist/commands/lens.js +386 -0
  73. package/dist/commands/lens.js.map +1 -0
  74. package/dist/commands/market-authoring.d.ts +45 -0
  75. package/dist/commands/market-authoring.js +225 -0
  76. package/dist/commands/market-authoring.js.map +1 -0
  77. package/dist/commands/market.d.ts +224 -0
  78. package/dist/commands/market.js +1643 -0
  79. package/dist/commands/market.js.map +1 -0
  80. package/dist/commands/mcp.d.ts +64 -0
  81. package/dist/commands/mcp.js +265 -0
  82. package/dist/commands/mcp.js.map +1 -0
  83. package/dist/commands/observe.js +14 -11
  84. package/dist/commands/observe.js.map +1 -1
  85. package/dist/commands/open.d.ts +21 -4
  86. package/dist/commands/open.js +45 -4
  87. package/dist/commands/open.js.map +1 -1
  88. package/dist/commands/pod.d.ts +100 -0
  89. package/dist/commands/pod.js +359 -0
  90. package/dist/commands/pod.js.map +1 -0
  91. package/dist/commands/pods.d.ts +15 -0
  92. package/dist/commands/pods.js +233 -17
  93. package/dist/commands/pods.js.map +1 -1
  94. package/dist/commands/proposals-actions.js +43 -3
  95. package/dist/commands/proposals-actions.js.map +1 -1
  96. package/dist/commands/purge.d.ts +23 -0
  97. package/dist/commands/purge.js +148 -0
  98. package/dist/commands/purge.js.map +1 -0
  99. package/dist/commands/raycast.d.ts +15 -0
  100. package/dist/commands/raycast.js +153 -0
  101. package/dist/commands/raycast.js.map +1 -0
  102. package/dist/commands/sessions.js +47 -22
  103. package/dist/commands/sessions.js.map +1 -1
  104. package/dist/commands/skill-manage.d.ts +21 -0
  105. package/dist/commands/skill-manage.js +195 -0
  106. package/dist/commands/skill-manage.js.map +1 -0
  107. package/dist/commands/skills-commands.js +2 -1
  108. package/dist/commands/skills-commands.js.map +1 -1
  109. package/dist/commands/skills.js +7 -4
  110. package/dist/commands/skills.js.map +1 -1
  111. package/dist/commands/status.d.ts +3 -1
  112. package/dist/commands/status.js +166 -14
  113. package/dist/commands/status.js.map +1 -1
  114. package/dist/commands/statusline.d.ts +24 -0
  115. package/dist/commands/statusline.js +450 -0
  116. package/dist/commands/statusline.js.map +1 -0
  117. package/dist/commands/subscribe.js +2 -2
  118. package/dist/commands/subscribe.js.map +1 -1
  119. package/dist/commands/template.d.ts +42 -0
  120. package/dist/commands/template.js +191 -0
  121. package/dist/commands/template.js.map +1 -0
  122. package/dist/commands/tools.d.ts +30 -0
  123. package/dist/commands/tools.js +315 -0
  124. package/dist/commands/tools.js.map +1 -0
  125. package/dist/commands/upload.d.ts +30 -0
  126. package/dist/commands/upload.js +155 -0
  127. package/dist/commands/upload.js.map +1 -0
  128. package/dist/commands/versions.d.ts +27 -0
  129. package/dist/commands/versions.js +277 -0
  130. package/dist/commands/versions.js.map +1 -0
  131. package/dist/commands/view.js +3 -2
  132. package/dist/commands/view.js.map +1 -1
  133. package/dist/commands/whoami.d.ts +21 -0
  134. package/dist/commands/whoami.js +129 -0
  135. package/dist/commands/whoami.js.map +1 -0
  136. package/dist/index.js +894 -60
  137. package/dist/index.js.map +1 -1
  138. package/dist/lib/approval-poll.d.ts +42 -0
  139. package/dist/lib/approval-poll.js +52 -0
  140. package/dist/lib/approval-poll.js.map +1 -0
  141. package/dist/lib/auth.d.ts +29 -6
  142. package/dist/lib/auth.js +105 -94
  143. package/dist/lib/auth.js.map +1 -1
  144. package/dist/lib/bundle-version.d.ts +11 -0
  145. package/dist/lib/bundle-version.js +33 -0
  146. package/dist/lib/bundle-version.js.map +1 -0
  147. package/dist/lib/capture-lane.d.ts +30 -12
  148. package/dist/lib/capture-lane.js +73 -14
  149. package/dist/lib/capture-lane.js.map +1 -1
  150. package/dist/lib/capture-structure.d.ts +123 -0
  151. package/dist/lib/capture-structure.js +57 -0
  152. package/dist/lib/capture-structure.js.map +1 -0
  153. package/dist/lib/cp-packages.d.ts +177 -0
  154. package/dist/lib/cp-packages.js +389 -0
  155. package/dist/lib/cp-packages.js.map +1 -0
  156. package/dist/lib/describe-lens.d.ts +46 -0
  157. package/dist/lib/describe-lens.js +33 -0
  158. package/dist/lib/describe-lens.js.map +1 -0
  159. package/dist/lib/hub-client.d.ts +91 -1
  160. package/dist/lib/hub-client.js +565 -22
  161. package/dist/lib/hub-client.js.map +1 -1
  162. package/dist/lib/id.d.ts +23 -0
  163. package/dist/lib/id.js +35 -0
  164. package/dist/lib/id.js.map +1 -0
  165. package/dist/lib/installed.d.ts +51 -0
  166. package/dist/lib/installed.js +70 -0
  167. package/dist/lib/installed.js.map +1 -0
  168. package/dist/lib/next-steps.d.ts +61 -0
  169. package/dist/lib/next-steps.js +146 -0
  170. package/dist/lib/next-steps.js.map +1 -0
  171. package/dist/lib/pod.d.ts +144 -22
  172. package/dist/lib/pod.js +302 -64
  173. package/dist/lib/pod.js.map +1 -1
  174. package/dist/lib/project-ref.d.ts +95 -0
  175. package/dist/lib/project-ref.js +144 -0
  176. package/dist/lib/project-ref.js.map +1 -0
  177. package/dist/lib/project.d.ts +35 -0
  178. package/dist/lib/project.js +39 -0
  179. package/dist/lib/project.js.map +1 -0
  180. package/dist/lib/session-lens.d.ts +33 -0
  181. package/dist/lib/session-lens.js +76 -0
  182. package/dist/lib/session-lens.js.map +1 -0
  183. package/dist/lib/skill-import.d.ts +40 -0
  184. package/dist/lib/skill-import.js +203 -0
  185. package/dist/lib/skill-import.js.map +1 -0
  186. package/dist/lib/skills-installer.d.ts +17 -6
  187. package/dist/lib/skills-installer.js +133 -19
  188. package/dist/lib/skills-installer.js.map +1 -1
  189. package/dist/lib/suite.d.ts +28 -0
  190. package/dist/lib/suite.js +29 -0
  191. package/dist/lib/suite.js.map +1 -0
  192. package/dist/lib/superwhisper-import.d.ts +40 -0
  193. package/dist/lib/superwhisper-import.js +389 -0
  194. package/dist/lib/superwhisper-import.js.map +1 -0
  195. package/dist/lib/targets.d.ts +49 -1
  196. package/dist/lib/targets.js +420 -288
  197. package/dist/lib/targets.js.map +1 -1
  198. package/dist/lib/template-file.d.ts +74 -0
  199. package/dist/lib/template-file.js +140 -0
  200. package/dist/lib/template-file.js.map +1 -0
  201. package/dist/lib/unwrapList.d.ts +1 -0
  202. package/dist/lib/unwrapList.js +20 -0
  203. package/dist/lib/unwrapList.js.map +1 -0
  204. package/dist/utils/logger.d.ts +2 -0
  205. package/dist/utils/logger.js +10 -2
  206. package/dist/utils/logger.js.map +1 -1
  207. package/node_modules/@synap/hub-rest-client/dist/index.cjs +414 -34
  208. package/node_modules/@synap/hub-rest-client/dist/index.d.cts +762 -22
  209. package/node_modules/@synap/hub-rest-client/dist/index.d.ts +762 -22
  210. package/node_modules/@synap/hub-rest-client/dist/index.js +414 -34
  211. package/node_modules/@synap/hub-rest-client/package.json +1 -1
  212. package/node_modules/@synap/hub-rest-client/src/client.ts +525 -37
  213. package/node_modules/@synap/hub-rest-client/src/index.ts +42 -0
  214. package/node_modules/@synap/hub-rest-client/src/setup.ts +57 -1
  215. package/node_modules/@synap/hub-rest-client/src/types.ts +697 -37
  216. package/package.json +11 -5
  217. package/skills/agent-os/SKILL.md +218 -0
  218. package/skills/manifest.json +5 -0
  219. package/skills/onboard/SKILL.md +193 -0
  220. package/skills/synap/SKILL.md +1284 -58
  221. package/skills/synap/_order.txt +37 -0
  222. package/skills/synap/_skill.yaml +24 -0
  223. package/skills/synap/authentication.md +10 -0
  224. package/skills/synap/automations.md +264 -0
  225. package/skills/synap/capabilities.md +107 -0
  226. package/skills/synap/capture.md +50 -142
  227. package/skills/synap/cli-operations.md +107 -0
  228. package/skills/synap/common-mistakes.md +13 -0
  229. package/skills/synap/content-os.md +83 -0
  230. package/skills/synap/creative-loop.md +43 -0
  231. package/skills/synap/crm.md +117 -0
  232. package/skills/synap/diagnostics.md +35 -0
  233. package/skills/synap/digesting-a-channel.md +63 -0
  234. package/skills/synap/document-embeds.md +123 -0
  235. package/skills/synap/escalation-ladder.md +71 -0
  236. package/skills/synap/focus-sessions.md +47 -0
  237. package/skills/synap/governance-rules.md +64 -0
  238. package/skills/synap/governance.md +6 -6
  239. package/skills/synap/graph-gardening.md +21 -0
  240. package/skills/synap/inline-patterns.md +38 -0
  241. package/skills/synap/lenses.md +38 -0
  242. package/skills/synap/linking-principle.md +39 -0
  243. package/skills/synap/linking.md +1 -0
  244. package/skills/synap/mental-model.md +45 -0
  245. package/skills/synap/more.md +7 -0
  246. package/skills/synap/multi-entity-capture.md +12 -0
  247. package/skills/synap/next-action.md +37 -0
  248. package/skills/synap/north-star.md +17 -0
  249. package/skills/synap/operating-mode-rules.md +45 -0
  250. package/skills/synap/operating-mode.md +9 -0
  251. package/skills/synap/quick-reference.md +67 -0
  252. package/skills/synap/reading.md +43 -0
  253. package/skills/synap/recap.md +21 -0
  254. package/skills/synap/reflexes.md +46 -0
  255. package/skills/synap/response-style.md +21 -0
  256. package/skills/synap/scope.md +13 -0
  257. package/skills/synap/showing.md +17 -0
  258. package/skills/synap/user-model.md +25 -0
  259. package/skills/synap/viewframe-cells.md +290 -0
  260. package/skills/synap/work-flow.md +113 -0
  261. package/skills/synap/worked-examples.md +74 -0
  262. package/skills/synap/workspace-design.md +45 -0
  263. package/skills/synap/workspace-edges.md +49 -0
  264. package/skills/synap/writes.md +213 -0
  265. package/skills/synap-app/SKILL.md +319 -0
  266. package/skills/synap-app/_order.txt +5 -0
  267. package/skills/synap-app/_skill.yaml +20 -0
  268. package/skills/synap-app/creating-the-base-app.md +64 -0
  269. package/skills/synap-app/governance.md +42 -0
  270. package/skills/synap-app/install-commands.md +55 -0
  271. package/skills/synap-app/overview.md +50 -0
  272. package/skills/synap-app/using-the-sdk.md +73 -0
  273. package/skills/synap-market/SKILL.md +335 -0
  274. package/skills/synap-market/_order.txt +5 -0
  275. package/skills/synap-market/_skill.yaml +24 -0
  276. package/skills/synap-market/author-and-publish.md +75 -0
  277. package/skills/synap-market/discover-and-fetch.md +59 -0
  278. package/skills/synap-market/governance-and-catalog.md +56 -0
  279. package/skills/synap-market/install.md +55 -0
  280. package/skills/synap-market/overview.md +51 -0
  281. package/skills/synap-schema/SKILL.md +97 -6
  282. package/skills/synap-schema/_order.txt +13 -0
  283. package/skills/synap-schema/_skill.yaml +22 -0
  284. package/skills/synap-schema/before-you-touch.md +14 -0
  285. package/skills/synap-schema/common-mistakes.md +9 -0
  286. package/skills/synap-schema/creating-profiles.md +17 -0
  287. package/skills/synap-schema/discover-profiles.md +24 -0
  288. package/skills/synap-schema/entity-scope.md +8 -0
  289. package/skills/synap-schema/extend-vs-create.md +31 -0
  290. package/skills/synap-schema/more.md +6 -0
  291. package/skills/synap-schema/overlay-properties.md +22 -0
  292. package/skills/synap-schema/profiles.md +3 -0
  293. package/skills/synap-schema/property-defs.md +29 -0
  294. package/skills/synap-schema/read-before-write.md +50 -0
  295. package/skills/synap-schema/relations.md +18 -0
  296. package/skills/synap-schema/worked-example.md +30 -0
  297. package/skills/synap-ui/SKILL.md +26 -2
  298. package/skills/synap-ui/_order.txt +13 -0
  299. package/skills/synap-ui/_skill.yaml +23 -0
  300. package/skills/synap-ui/ai-companion.md +27 -0
  301. package/skills/synap-ui/arranging-bento.md +8 -0
  302. package/skills/synap-ui/before-you-build.md +20 -0
  303. package/skills/synap-ui/bento-layouts.md +35 -0
  304. package/skills/synap-ui/common-mistakes.md +10 -0
  305. package/skills/synap-ui/creating-views.md +26 -0
  306. package/skills/synap-ui/four-builds.md +24 -0
  307. package/skills/synap-ui/more.md +7 -0
  308. package/skills/synap-ui/proposing-vs-extending.md +11 -0
  309. package/skills/synap-ui/view-list.md +24 -0
  310. package/skills/synap-ui/views.md +3 -0
  311. package/skills/synap-ui/worked-example.md +18 -0
  312. package/skills/synap-ui/workspaces.md +47 -0
  313. package/templates/automations/bookmark-enrichment.automation.json +44 -0
  314. package/templates/automations/mail-feed.automation.json +86 -0
  315. package/templates/automations/url-bookmark-capture.automation.json +70 -0
  316. package/templates/skills/README.md +21 -0
  317. package/templates/skills/authoring-automations/SKILL.md +95 -0
  318. package/templates/skills/authoring-automations/reference/node-matrix.md +49 -0
  319. package/templates/skills/authoring-capabilities/SKILL.md +93 -0
  320. package/templates/skills/authoring-capabilities/reference/template-anatomy.md +70 -0
  321. package/templates/skills/authoring-playbooks/SKILL.md +102 -0
  322. package/templates/skills/authoring-playbooks/reference/stages-contract.md +35 -0
  323. package/templates/skills/authoring-playbooks/reference/worked-example.md +64 -0
  324. package/templates/skills/bookmark-enrichment/SKILL.md +40 -0
  325. package/templates/skills/coordinating-agents/SKILL.md +32 -0
  326. package/templates/skills/coordinating-branches/SKILL.md +27 -0
  327. package/templates/skills/mapping-the-server/SKILL.md +54 -0
  328. package/templates/skills/reading-client-progress/SKILL.md +65 -0
  329. package/templates/skills/routing-to-channels/SKILL.md +54 -0
  330. package/templates/skills/stellar-scf-grants-advisor/ASSOCIATE-CHEATSHEET.md +133 -0
  331. package/templates/skills/stellar-scf-grants-advisor/ASSOCIATE-ONBOARDING-GUIDE.md +761 -0
  332. package/templates/skills/stellar-scf-grants-advisor/CLIENT-FAQ.md +181 -0
  333. package/templates/skills/stellar-scf-grants-advisor/PARTNER-HANDOVER.md +130 -0
  334. package/templates/skills/stellar-scf-grants-advisor/SKILL.md +102 -0
  335. package/templates/skills/stellar-scf-grants-advisor/examples/README.md +43 -0
  336. package/templates/skills/stellar-scf-grants-advisor/examples/chat-summary-templates.md +158 -0
  337. package/templates/skills/stellar-scf-grants-advisor/examples/corpus-comparable-rows.md +136 -0
  338. package/templates/skills/stellar-scf-grants-advisor/examples/q10-team-rewrites.md +109 -0
  339. package/templates/skills/stellar-scf-grants-advisor/examples/q2-description-rewrites.md +88 -0
  340. package/templates/skills/stellar-scf-grants-advisor/examples/q6-integration-rewrites.md +107 -0
  341. package/templates/skills/stellar-scf-grants-advisor/examples/tranche-structures.md +176 -0
  342. package/templates/skills/stellar-scf-grants-advisor/reference/01-methodology.md +96 -0
  343. package/templates/skills/stellar-scf-grants-advisor/reference/02-scoring-framework.md +199 -0
  344. package/templates/skills/stellar-scf-grants-advisor/reference/03-rejection-patterns.md +241 -0
  345. package/templates/skills/stellar-scf-grants-advisor/reference/04-winner-patterns.md +120 -0
  346. package/templates/skills/stellar-scf-grants-advisor/reference/05-comeback-patterns.md +92 -0
  347. package/templates/skills/stellar-scf-grants-advisor/reference/06-budget-benchmarks.md +125 -0
  348. package/templates/skills/stellar-scf-grants-advisor/reference/07-integration-list.md +147 -0
  349. package/templates/skills/stellar-scf-grants-advisor/reference/08-abstract-fields.md +258 -0
  350. package/templates/skills/stellar-scf-grants-advisor/reference/09-build-fields.md +259 -0
  351. package/templates/skills/stellar-scf-grants-advisor/reference/10-corpus-winners.md +135 -0
  352. package/templates/skills/stellar-scf-grants-advisor/reference/11-corpus-rejects.md +267 -0
  353. package/templates/skills/stellar-scf-grants-advisor/reference/12-client-communication.md +131 -0
  354. package/templates/skills/stellar-scf-grants-advisor/reference/13-excel-output-spec.md +199 -0
  355. package/templates/skills/stellar-scf-grants-advisor/reference/14-worked-examples.md +160 -0
  356. package/templates/skills/stellar-scf-grants-advisor/templates/abstract-review-builder.py +253 -0
  357. package/templates/skills/stellar-scf-grants-advisor/templates/build-review-builder.py +213 -0
  358. package/dist/commands/connectors.d.ts +0 -31
  359. package/dist/commands/connectors.js +0 -276
  360. package/dist/commands/connectors.js.map +0 -1
  361. package/dist/commands/finish.d.ts +0 -25
  362. package/dist/commands/finish.js +0 -274
  363. package/dist/commands/finish.js.map +0 -1
  364. package/dist/commands/openclaw.d.ts +0 -40
  365. package/dist/commands/openclaw.js +0 -1148
  366. package/dist/commands/openclaw.js.map +0 -1
  367. package/dist/commands/security-audit.d.ts +0 -12
  368. package/dist/commands/security-audit.js +0 -100
  369. package/dist/commands/security-audit.js.map +0 -1
  370. package/dist/lib/hardening.d.ts +0 -18
  371. package/dist/lib/hardening.js +0 -214
  372. package/dist/lib/hardening.js.map +0 -1
@@ -57,6 +57,9 @@ var HubRestClient = class {
57
57
  base;
58
58
  headers;
59
59
  timeoutMs;
60
+ readTimeoutMs;
61
+ writeTimeoutMs;
62
+ maxAttempts;
60
63
  workspaceId;
61
64
  /** Cached from GET /users/me — avoids repeated identity calls. */
62
65
  resolvedUserId = null;
@@ -68,6 +71,9 @@ var HubRestClient = class {
68
71
  };
69
72
  this.workspaceId = config.workspaceId;
70
73
  this.timeoutMs = config.timeoutMs ?? 3e4;
74
+ this.readTimeoutMs = config.readTimeoutMs ?? this.timeoutMs;
75
+ this.writeTimeoutMs = config.writeTimeoutMs ?? this.timeoutMs;
76
+ this.maxAttempts = Math.max(1, config.maxAttempts ?? 3);
71
77
  }
72
78
  /** User id for the current API key (Hub REST requires userId on several GETs). */
73
79
  async resolveUserId() {
@@ -76,25 +82,80 @@ var HubRestClient = class {
76
82
  this.resolvedUserId = me.id;
77
83
  return me.id;
78
84
  }
79
- async request(method, path, body, signal) {
85
+ /**
86
+ * The ONE shared request loop. Per-method timeout (GET = read, else write, or a
87
+ * caller override) + up to `maxAttempts` with exponential backoff. Retries ONLY
88
+ * on a network failure or 5xx; NEVER on a 4xx or a caller abort. Returns the raw
89
+ * `Response` for any non-5xx (ok OR 4xx) — the typed entry points below decide
90
+ * how to interpret it. This is the single source of retry/timeout truth, shared
91
+ * by the CLI and the IS's `ISHubClient` (which reuses the protected entry points
92
+ * rather than re-implementing fetch).
93
+ */
94
+ async fetchWithRetry(method, path, body, signal, timeoutMsOverride) {
80
95
  const url = `${this.base}${path}`;
81
- const timeout = AbortSignal.timeout(this.timeoutMs);
82
- const combined = signal ? AbortSignal.any([signal, timeout]) : timeout;
83
- const res = await fetch(url, {
84
- method,
85
- headers: this.headers,
86
- body: body !== void 0 ? JSON.stringify(body) : void 0,
87
- signal: combined
88
- });
89
- if (!res.ok) {
90
- const errorBody = await res.json().catch(() => ({}));
91
- throw new HubApiError(
92
- formatHubErrorMessage(res.status, res.statusText, errorBody),
93
- res.status,
94
- errorBody
95
- );
96
+ const perAttemptTimeout = timeoutMsOverride ?? (method.toUpperCase() === "GET" ? this.readTimeoutMs : this.writeTimeoutMs);
97
+ let lastError;
98
+ for (let attempt = 0; attempt < this.maxAttempts; attempt++) {
99
+ if (attempt > 0) {
100
+ await new Promise((r) => setTimeout(r, 1e3 * attempt));
101
+ }
102
+ const timeout = AbortSignal.timeout(perAttemptTimeout);
103
+ const combined = signal ? AbortSignal.any([signal, timeout]) : timeout;
104
+ try {
105
+ const res = await fetch(url, {
106
+ method,
107
+ headers: this.headers,
108
+ body: body !== void 0 ? JSON.stringify(body) : void 0,
109
+ signal: combined
110
+ });
111
+ if (res.status < 500) return res;
112
+ lastError = new Error(`HTTP ${res.status}`);
113
+ } catch (err) {
114
+ if (signal?.aborted) throw err;
115
+ lastError = err;
116
+ }
96
117
  }
97
- return res.json();
118
+ throw lastError;
119
+ }
120
+ /** Build a HubApiError from a non-ok Response (reads the JSON error body). */
121
+ async toHubError(res) {
122
+ const errorBody = await res.json().catch(() => ({}));
123
+ return new HubApiError(
124
+ formatHubErrorMessage(res.status, res.statusText, errorBody),
125
+ res.status,
126
+ errorBody
127
+ );
128
+ }
129
+ /** Parse a 2xx body, tolerating an empty/204 response (returns undefined). */
130
+ async parseBody(res) {
131
+ const text = await res.text();
132
+ return text ? JSON.parse(text) : void 0;
133
+ }
134
+ /**
135
+ * Typed JSON request — throws `HubApiError` on any non-2xx. Protected so the IS
136
+ * subclass reuses it. Tolerates an empty/204 body (returns `undefined`).
137
+ */
138
+ async request(method, path, body, signal) {
139
+ const res = await this.fetchWithRetry(method, path, body, signal);
140
+ if (!res.ok) throw await this.toHubError(res);
141
+ return this.parseBody(res);
142
+ }
143
+ /**
144
+ * Like `request<T>` but returns `null` on 404/403 (the "absent/forbidden →
145
+ * empty" contract several IS reads use) instead of throwing.
146
+ */
147
+ async requestOrNull(method, path, body, signal) {
148
+ const res = await this.fetchWithRetry(method, path, body, signal);
149
+ if (res.status === 404 || res.status === 403) return null;
150
+ if (!res.ok) throw await this.toHubError(res);
151
+ return this.parseBody(res);
152
+ }
153
+ /**
154
+ * The raw `Response` (same retry/timeout infra), for the few callers that read
155
+ * `.text()`, branch on status themselves, or need a per-call timeout override.
156
+ */
157
+ async requestRaw(method, path, body, signal, timeoutMsOverride) {
158
+ return this.fetchWithRetry(method, path, body, signal, timeoutMsOverride);
98
159
  }
99
160
  // ─── Identity ─────────────────────────────────────────────────────────────
100
161
  async getMe() {
@@ -166,16 +227,39 @@ var HubRestClient = class {
166
227
  return unwrapList(result);
167
228
  }
168
229
  async createEntity(input) {
230
+ const { content, url, status, priority, dueDate, properties, ...rest } = input;
169
231
  return this.request("POST", "/api/hub/entities", {
170
- ...input,
171
- workspaceId: input.workspaceId ?? this.workspaceId
232
+ ...rest,
233
+ // Entity placement is a write decision, never an ambient client default.
234
+ // Omitted means pod/base behavior; an explicit workspace opts into its
235
+ // overlay/membership lens. This deliberately differs from read helpers.
236
+ ...rest.workspaceId ? { workspaceId: rest.workspaceId } : {},
237
+ ...content !== void 0 ? { content } : {},
238
+ properties: {
239
+ ...properties,
240
+ ...url !== void 0 ? { url } : {},
241
+ ...status !== void 0 ? { status } : {},
242
+ ...priority !== void 0 ? { priority } : {},
243
+ ...dueDate !== void 0 ? { dueDate } : {}
244
+ }
172
245
  });
173
246
  }
174
247
  async updateEntity(id, input) {
248
+ const { properties, content, url, status, priority, dueDate, ...rest } = input;
175
249
  return this.request(
176
250
  "PATCH",
177
251
  `/api/hub/entities/${id}`,
178
- input
252
+ {
253
+ ...rest,
254
+ metadata: {
255
+ ...properties,
256
+ ...content !== void 0 ? { content } : {},
257
+ ...url !== void 0 ? { url } : {},
258
+ ...status !== void 0 ? { status } : {},
259
+ ...priority !== void 0 ? { priority } : {},
260
+ ...dueDate !== void 0 ? { dueDate } : {}
261
+ }
262
+ }
179
263
  );
180
264
  }
181
265
  // ─── Unified Search ───────────────────────────────────────────────────────
@@ -235,6 +319,28 @@ var HubRestClient = class {
235
319
  type: input.type
236
320
  });
237
321
  }
322
+ /**
323
+ * Attach a role-profile through the canonical governed facet door. A result
324
+ * may be `proposed`; callers must surface its review information instead of
325
+ * claiming the role was applied.
326
+ */
327
+ async attachFacet(input) {
328
+ const userId = await this.resolveUserId();
329
+ return this.request(
330
+ "POST",
331
+ `/api/hub/entities/${input.entityId}/facets`,
332
+ {
333
+ userId,
334
+ profileSlug: input.profileSlug,
335
+ profileId: input.profileId,
336
+ workspaceId: input.workspaceId ?? this.workspaceId,
337
+ contextEntityId: input.contextEntityId,
338
+ status: input.status,
339
+ properties: input.properties,
340
+ reasoning: input.reasoning
341
+ }
342
+ );
343
+ }
238
344
  /**
239
345
  * Delete a relation by ID (get from getRelations()).
240
346
  */
@@ -268,10 +374,10 @@ var HubRestClient = class {
268
374
  );
269
375
  }
270
376
  /**
271
- * Unified view of everything connected to an entity. Merges three sources:
377
+ * Unified view of everything connected to an entity across the local graph:
272
378
  * 1. Graph relations — explicit rows in the relations table (both directions)
273
- * 2. Structural links — entities whose `entity_id` properties point to this entity
274
- * 3. Thread connections — chat threads that touched this entity
379
+ * 2. Structural links — inbound and outbound `entity_id` property edges
380
+ * 3. Channel and focus-session connections around this entity
275
381
  *
276
382
  * Prefer this over `getRelations()` / `traverseGraph()` when you want the complete
277
383
  * picture — those only see the relations table and miss property-based links that
@@ -294,15 +400,31 @@ var HubRestClient = class {
294
400
  `/api/hub/entities/${entityId}/connections?${params}`
295
401
  );
296
402
  }
403
+ // ─── Session orientation & profile discovery ─────────────────────────────
404
+ /**
405
+ * Canonical session bootstrap shared by the MCP, CLI, and external surfaces.
406
+ * It is deliberately a lens map, not a profile/schema dump; use discover()
407
+ * only for the selected profiles needed by the next action.
408
+ */
409
+ async orient(options) {
410
+ const params = new URLSearchParams();
411
+ if (options?.detail) params.set("detail", options.detail);
412
+ if (options?.scope?.length) params.set("scope", options.scope.join(","));
413
+ if (options?.workspaceId) params.set("workspaceId", options.workspaceId);
414
+ if (options?.projectId) params.set("projectId", options.projectId);
415
+ const qs = params.toString() ? `?${params}` : "";
416
+ return this.request("GET", `/api/hub/orient${qs}`);
417
+ }
297
418
  // ─── Profiles & Schema ────────────────────────────────────────────────────
298
419
  /**
299
420
  * List all entity profile types in the workspace.
300
421
  * Always call before creating entities to discover what types are available.
301
422
  * Returns system profiles (always present) + custom workspace profiles.
302
423
  */
303
- async listProfiles(workspaceId) {
424
+ async listProfiles(workspaceId, options) {
304
425
  const userId = await this.resolveUserId();
305
426
  const params = new URLSearchParams({ userId, workspaceId });
427
+ if (options?.detail) params.set("detail", options.detail);
306
428
  const result = await this.request("GET", `/api/hub/profiles?${params}`);
307
429
  return unwrapList(result);
308
430
  }
@@ -323,10 +445,16 @@ var HubRestClient = class {
323
445
  * schemas (including custom workspace profiles) and the canonical CLI
324
446
  * command map. Replaces static skill file profile descriptions.
325
447
  */
326
- async discover(workspaceId) {
448
+ async discover(options) {
327
449
  const userId = await this.resolveUserId();
328
- const wsId = workspaceId ?? this.workspaceId ?? "";
329
- const params = new URLSearchParams({ userId, workspaceId: wsId });
450
+ const normalized = typeof options === "string" ? { workspaceId: options } : options ?? {};
451
+ const params = new URLSearchParams({ userId });
452
+ if (normalized.workspaceId)
453
+ params.set("workspaceId", normalized.workspaceId);
454
+ if (normalized.summary !== void 0)
455
+ params.set("summary", String(normalized.summary));
456
+ if (normalized.profileSlugs?.length)
457
+ params.set("profileSlugs", normalized.profileSlugs.join(","));
330
458
  return this.request(
331
459
  "GET",
332
460
  `/api/hub/discover?${params}`
@@ -488,10 +616,12 @@ var HubRestClient = class {
488
616
  */
489
617
  async listProposals(options) {
490
618
  const userId = await this.resolveUserId();
491
- const wsId = options?.workspaceId ?? this.workspaceId;
492
619
  const params = new URLSearchParams({ userId });
620
+ if (options?.scope !== "all") {
621
+ const wsId = options?.workspaceId ?? this.workspaceId;
622
+ if (wsId) params.set("workspaceId", wsId);
623
+ }
493
624
  if (options?.status) params.set("status", options.status);
494
- if (wsId) params.set("workspaceId", wsId);
495
625
  if (options?.limit) params.set("limit", String(options.limit));
496
626
  const result = await this.request("GET", `/api/hub/proposals?${params}`);
497
627
  return unwrapList(result);
@@ -538,9 +668,51 @@ var HubRestClient = class {
538
668
  name: input.name,
539
669
  type: input.type,
540
670
  profileId: input.profileSlug,
541
- config: input.config
671
+ config: input.config,
672
+ metadata: input.metadata,
673
+ agentUserId: input.agentUserId,
674
+ reasoning: input.reasoning,
675
+ sourceMessageId: input.sourceMessageId
542
676
  });
543
677
  }
678
+ /** Update a view through the existing governed Hub route. */
679
+ async updateView(viewId, input) {
680
+ const userId = input.userId ?? await this.resolveUserId();
681
+ return this.request(
682
+ "PATCH",
683
+ `/api/hub/views/${viewId}`,
684
+ {
685
+ userId,
686
+ workspaceId: input.workspaceId ?? this.workspaceId,
687
+ name: input.name,
688
+ config: input.config,
689
+ metadata: input.metadata,
690
+ agentUserId: input.agentUserId,
691
+ reasoning: input.reasoning,
692
+ sourceMessageId: input.sourceMessageId
693
+ }
694
+ );
695
+ }
696
+ /** Replace a bento view's widget arrangement through the existing Hub route. */
697
+ async arrangeBentoView(viewId, input) {
698
+ const userId = input.userId ?? await this.resolveUserId();
699
+ const workspaceId = input.workspaceId ?? this.workspaceId;
700
+ if (!workspaceId) {
701
+ throw new Error("workspaceId is required for arrangeBentoView");
702
+ }
703
+ return this.request(
704
+ "POST",
705
+ `/api/hub/views/${viewId}/arrange`,
706
+ {
707
+ userId,
708
+ workspaceId,
709
+ widgets: input.widgets,
710
+ agentUserId: input.agentUserId,
711
+ reasoning: input.reasoning,
712
+ sourceMessageId: input.sourceMessageId
713
+ }
714
+ );
715
+ }
544
716
  // ─── Documents ────────────────────────────────────────────────────────────
545
717
  /**
546
718
  * Get a document by ID with full markdown content.
@@ -548,10 +720,11 @@ var HubRestClient = class {
548
720
  async getDocument(documentId) {
549
721
  const userId = await this.resolveUserId();
550
722
  const params = new URLSearchParams({ userId });
551
- return this.request(
723
+ const result = await this.request(
552
724
  "GET",
553
725
  `/api/hub/documents/${documentId}?${params}`
554
726
  );
727
+ return "document" in result ? result.document : result;
555
728
  }
556
729
  /**
557
730
  * Create a document. Use for long-form content: meeting notes, research, writeups.
@@ -563,9 +736,140 @@ var HubRestClient = class {
563
736
  userId,
564
737
  workspaceId: input.workspaceId ?? this.workspaceId,
565
738
  title: input.title,
566
- content: input.content ?? ""
739
+ content: input.content ?? "",
740
+ type: input.type,
741
+ reasoning: input.reasoning,
742
+ agentUserId: input.agentUserId,
743
+ sourceMessageId: input.sourceMessageId,
744
+ sessionId: input.sessionId
567
745
  });
568
746
  }
747
+ /** Propose a full document-content replacement through the governed Hub route. */
748
+ async updateDocument(documentId, input) {
749
+ const userId = await this.resolveUserId();
750
+ return this.request(
751
+ "PATCH",
752
+ `/api/hub/documents/${documentId}`,
753
+ {
754
+ userId,
755
+ content: input.content,
756
+ title: input.title,
757
+ agentUserId: input.agentUserId,
758
+ sourceMessageId: input.sourceMessageId,
759
+ sessionId: input.sessionId
760
+ }
761
+ );
762
+ }
763
+ /** Submit a structured, reviewable document-edit proposal. */
764
+ async createDocumentProposal(input) {
765
+ const userId = await this.resolveUserId();
766
+ return this.request(
767
+ "POST",
768
+ "/api/hub/documents/proposals",
769
+ {
770
+ userId,
771
+ ...input
772
+ }
773
+ );
774
+ }
775
+ // ─── Capabilities & teaching substrate ───────────────────────────────────
776
+ /** Flat capability read-model. Prefer getCapabilityCatalog() for presentation. */
777
+ async listCapabilities(options) {
778
+ const workspaceId = options?.workspaceId ?? this.workspaceId;
779
+ if (!workspaceId) {
780
+ throw new Error("workspaceId is required for listCapabilities");
781
+ }
782
+ const params = new URLSearchParams({ workspaceId });
783
+ const result = await this.request(
784
+ "GET",
785
+ `/api/hub/capabilities?${params}`
786
+ );
787
+ return result.capabilities;
788
+ }
789
+ /** Status-computed, pack-grouped capability catalog for every external surface. */
790
+ async getCapabilityCatalog(options) {
791
+ const workspaceId = options?.workspaceId ?? this.workspaceId;
792
+ if (!workspaceId) {
793
+ throw new Error("workspaceId is required for getCapabilityCatalog");
794
+ }
795
+ const params = new URLSearchParams({ workspaceId });
796
+ if (options?.extraKey) params.set("extraKey", options.extraKey);
797
+ return this.request(
798
+ "GET",
799
+ `/api/hub/capabilities/catalog?${params}`
800
+ );
801
+ }
802
+ /** List only approved, connected actions that this client can execute now. */
803
+ async listRunnableCapabilityActions(options) {
804
+ const workspaceId = options?.workspaceId ?? this.workspaceId;
805
+ if (!workspaceId) {
806
+ throw new Error(
807
+ "workspaceId is required for listRunnableCapabilityActions"
808
+ );
809
+ }
810
+ const params = new URLSearchParams({ workspaceId });
811
+ if (options?.query) params.set("query", options.query);
812
+ if (options?.kind) params.set("kind", options.kind);
813
+ if (options?.limit !== void 0)
814
+ params.set("limit", String(options.limit));
815
+ return this.request(
816
+ "GET",
817
+ `/api/hub/capabilities/actions?${params}`
818
+ );
819
+ }
820
+ /** Run one registered capability through the shared governance gate. */
821
+ async executeCapability(input) {
822
+ return this.request(
823
+ "POST",
824
+ "/api/hub/capabilities/execute",
825
+ {
826
+ ...input,
827
+ // Graph proposals follow the same explicit-scope rule as direct writes.
828
+ ...input.workspaceId ? { workspaceId: input.workspaceId } : {}
829
+ }
830
+ );
831
+ }
832
+ /** List the compact system teaching catalog, or search the available skill index. */
833
+ async listAgentSkills(options) {
834
+ const params = new URLSearchParams();
835
+ if (options?.topic) params.set("topic", options.topic);
836
+ if (options?.query) params.set("q", options.query);
837
+ if (options?.tag) params.set("tag", options.tag);
838
+ if (options?.system !== void 0)
839
+ params.set("system", String(options.system));
840
+ const workspaceId = options?.workspaceId ?? this.workspaceId;
841
+ if (workspaceId) params.set("workspaceId", workspaceId);
842
+ if (options?.limit !== void 0)
843
+ params.set("limit", String(options.limit));
844
+ if (options?.offset !== void 0)
845
+ params.set("offset", String(options.offset));
846
+ const qs = params.toString() ? `?${params}` : "";
847
+ return this.request(
848
+ "GET",
849
+ `/api/hub/agent-skills${qs}`
850
+ );
851
+ }
852
+ /** Load one skill body only when it is relevant to the agent's next action. */
853
+ async getAgentSkillBySlug(slug, options) {
854
+ const workspaceId = options?.workspaceId ?? this.workspaceId;
855
+ const qs = workspaceId ? `?${new URLSearchParams({ workspaceId })}` : "";
856
+ return this.request(
857
+ "GET",
858
+ `/api/hub/agent-skills/by-slug/${encodeURIComponent(slug)}${qs}`
859
+ );
860
+ }
861
+ /** Compose just-in-time teaching and governance briefs for selected tools. */
862
+ async getCapabilityBriefs(input) {
863
+ if (input.tools.length === 0) return { briefs: {} };
864
+ const workspaceId = input.workspaceId ?? this.workspaceId;
865
+ const params = new URLSearchParams({ tools: input.tools.join(",") });
866
+ if (workspaceId) params.set("workspaceId", workspaceId);
867
+ if (input.door) params.set("door", input.door);
868
+ return this.request(
869
+ "GET",
870
+ `/api/hub/briefs?${params}`
871
+ );
872
+ }
569
873
  // ─── Commands & Agents ────────────────────────────────────────────────────
570
874
  /**
571
875
  * List available commands (automation shortcuts) in the workspace.
@@ -649,10 +953,61 @@ var HubRestClient = class {
649
953
  userId,
650
954
  entities: input.entities,
651
955
  relations: input.relations ?? [],
652
- workspaceId: input.workspaceId ?? this.workspaceId
956
+ workspaceId: input.workspaceId ?? this.workspaceId,
957
+ // Keep this exact routing bundle in lockstep with CaptureExecuteInput
958
+ // and the REST codec. Dropping it here silently made CLI/Raycast capture
959
+ // behave differently from MCP despite all three using the same backend.
960
+ projectId: input.projectId,
961
+ targetWorkspaceId: input.targetWorkspaceId,
962
+ keepRaw: input.keepRaw,
963
+ file: input.file,
964
+ idempotencyKey: input.idempotencyKey,
965
+ workspaceRouting: input.workspaceRouting,
966
+ aiWorkspaceId: input.aiWorkspaceId,
967
+ aiWorkspaceConfidence: input.aiWorkspaceConfidence,
968
+ aiWorkspaceReason: input.aiWorkspaceReason
653
969
  }
654
970
  );
655
971
  }
972
+ /**
973
+ * Submit a designed entity graph as ONE reviewable composite proposal.
974
+ *
975
+ * This is intentionally distinct from captureExecute(): execute materializes
976
+ * a prior structure result immediately, while this door keeps an autonomous
977
+ * graph plan reviewable and applies entities, relations, and bindings together
978
+ * only after approval.
979
+ */
980
+ async submitCaptureGraph(input) {
981
+ const { workspaceId, relations, bindings, ...body } = input;
982
+ return this.request(
983
+ "POST",
984
+ "/api/hub/capture/graph",
985
+ {
986
+ ...body,
987
+ // Proposal audience and schema overlays are explicit write choices.
988
+ ...workspaceId ? { workspaceId } : {},
989
+ relations: relations ?? [],
990
+ bindings: bindings ?? []
991
+ }
992
+ );
993
+ }
994
+ // ─── Recall: the one door ──────────────────────────────────────────────────
995
+ /**
996
+ * `ask` — the unified recall verb. Routes a natural-language question across
997
+ * all knowledge substrates (semantic entities, procedural runbooks, episodic
998
+ * facts) server-side and returns ONE provenance-tagged answer. The canonical
999
+ * recall door — prefer it over the fragmented searchEntities / recallMemory.
1000
+ * The server builds the profile catalog from the caller's workspace; the
1001
+ * client only sends the query (+ optional scope).
1002
+ */
1003
+ async ask(input) {
1004
+ return this.request("POST", "/api/hub/knowledge/ask", {
1005
+ query: input.query,
1006
+ workspaceId: input.workspaceId ?? this.workspaceId,
1007
+ limit: input.limit,
1008
+ parseOnly: input.parseOnly
1009
+ });
1010
+ }
656
1011
  // ─── Automations ───────────────────────────────────────────────────────────
657
1012
  /**
658
1013
  * List automations for the current user, optionally filtered by workspace and status.
@@ -806,6 +1161,30 @@ var HubRestClient = class {
806
1161
  function normalizeUrl2(url) {
807
1162
  return url.replace(/\/$/, "");
808
1163
  }
1164
+ function assertValidPodUrl(url, opts = {}) {
1165
+ let parsed;
1166
+ try {
1167
+ parsed = new URL(url);
1168
+ } catch {
1169
+ throw new HubApiError(`Invalid pod URL: ${url}`, 0, {
1170
+ code: "INVALID_POD_URL"
1171
+ });
1172
+ }
1173
+ if (parsed.username || parsed.password) {
1174
+ throw new HubApiError("Pod URL must not contain embedded credentials", 0, {
1175
+ code: "INVALID_POD_URL"
1176
+ });
1177
+ }
1178
+ const isHttps = parsed.protocol === "https:";
1179
+ const isHttp = parsed.protocol === "http:";
1180
+ if (!isHttps && !(isHttp && opts.allowHttp)) {
1181
+ throw new HubApiError(
1182
+ `Pod URL must use https:// (got ${parsed.protocol}//)`,
1183
+ 0,
1184
+ { code: "INSECURE_POD_URL" }
1185
+ );
1186
+ }
1187
+ }
809
1188
  async function checkPodHealth(podUrl) {
810
1189
  const url = normalizeUrl2(podUrl);
811
1190
  const status = { url, healthy: false };
@@ -822,7 +1201,8 @@ async function checkPodHealth(podUrl) {
822
1201
  }
823
1202
  return status;
824
1203
  }
825
- async function setupAgent(podUrl, provisioningToken, agentType = "openclaw") {
1204
+ async function setupAgent(podUrl, provisioningToken, agentType, opts = {}) {
1205
+ assertValidPodUrl(podUrl, { allowHttp: opts.allowHttp });
826
1206
  const url = normalizeUrl2(podUrl);
827
1207
  const res = await fetch(`${url}/api/hub/setup/agent`, {
828
1208
  method: "POST",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@synap/hub-rest-client",
3
- "version": "1.0.2",
3
+ "version": "1.0.5",
4
4
  "description": "Zero-dependency TypeScript client for the Synap Hub Protocol REST API",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",