@synap-core/cli 1.7.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 (371) 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.d.ts +47 -0
  5. package/dist/commands/agent-run.js +301 -0
  6. package/dist/commands/agent-run.js.map +1 -0
  7. package/dist/commands/agents.js +85 -46
  8. package/dist/commands/agents.js.map +1 -1
  9. package/dist/commands/artifact.d.ts +26 -0
  10. package/dist/commands/artifact.js +76 -0
  11. package/dist/commands/artifact.js.map +1 -0
  12. package/dist/commands/automation.d.ts +47 -0
  13. package/dist/commands/automation.js +601 -0
  14. package/dist/commands/automation.js.map +1 -0
  15. package/dist/commands/bridge-setup.d.ts +66 -0
  16. package/dist/commands/bridge-setup.js +1112 -0
  17. package/dist/commands/bridge-setup.js.map +1 -0
  18. package/dist/commands/cap-connections.d.ts +28 -0
  19. package/dist/commands/cap-connections.js +224 -0
  20. package/dist/commands/cap-connections.js.map +1 -0
  21. package/dist/commands/capability.d.ts +89 -0
  22. package/dist/commands/capability.js +1523 -0
  23. package/dist/commands/capability.js.map +1 -0
  24. package/dist/commands/cell.d.ts +55 -0
  25. package/dist/commands/cell.js +277 -0
  26. package/dist/commands/cell.js.map +1 -0
  27. package/dist/commands/centrality.d.ts +20 -0
  28. package/dist/commands/centrality.js +94 -0
  29. package/dist/commands/centrality.js.map +1 -0
  30. package/dist/commands/connect.d.ts +2 -0
  31. package/dist/commands/connect.js +25 -10
  32. package/dist/commands/connect.js.map +1 -1
  33. package/dist/commands/connections.js +0 -16
  34. package/dist/commands/connections.js.map +1 -1
  35. package/dist/commands/context.d.ts +22 -0
  36. package/dist/commands/context.js +149 -0
  37. package/dist/commands/context.js.map +1 -0
  38. package/dist/commands/data-extra.d.ts +14 -0
  39. package/dist/commands/data-extra.js +185 -0
  40. package/dist/commands/data-extra.js.map +1 -0
  41. package/dist/commands/data.d.ts +14 -10
  42. package/dist/commands/data.js +353 -192
  43. package/dist/commands/data.js.map +1 -1
  44. package/dist/commands/diagnose.d.ts +20 -0
  45. package/dist/commands/diagnose.js +143 -0
  46. package/dist/commands/diagnose.js.map +1 -0
  47. package/dist/commands/digest.d.ts +17 -0
  48. package/dist/commands/digest.js +121 -0
  49. package/dist/commands/digest.js.map +1 -0
  50. package/dist/commands/discover.d.ts +2 -0
  51. package/dist/commands/discover.js +25 -8
  52. package/dist/commands/discover.js.map +1 -1
  53. package/dist/commands/doc.d.ts +39 -0
  54. package/dist/commands/doc.js +130 -0
  55. package/dist/commands/doc.js.map +1 -0
  56. package/dist/commands/events.d.ts +26 -0
  57. package/dist/commands/events.js +69 -0
  58. package/dist/commands/events.js.map +1 -0
  59. package/dist/commands/explain.d.ts +21 -0
  60. package/dist/commands/explain.js +251 -0
  61. package/dist/commands/explain.js.map +1 -0
  62. package/dist/commands/facet.d.ts +29 -0
  63. package/dist/commands/facet.js +113 -0
  64. package/dist/commands/facet.js.map +1 -0
  65. package/dist/commands/graph.d.ts +18 -0
  66. package/dist/commands/graph.js +74 -0
  67. package/dist/commands/graph.js.map +1 -0
  68. package/dist/commands/home.d.ts +12 -0
  69. package/dist/commands/home.js +54 -0
  70. package/dist/commands/home.js.map +1 -0
  71. package/dist/commands/import.d.ts +38 -0
  72. package/dist/commands/import.js +440 -0
  73. package/dist/commands/import.js.map +1 -0
  74. package/dist/commands/init.d.ts +0 -2
  75. package/dist/commands/init.js +97 -118
  76. package/dist/commands/init.js.map +1 -1
  77. package/dist/commands/keys.d.ts +9 -0
  78. package/dist/commands/keys.js +78 -0
  79. package/dist/commands/keys.js.map +1 -0
  80. package/dist/commands/knowledge.d.ts +34 -18
  81. package/dist/commands/knowledge.js +355 -57
  82. package/dist/commands/knowledge.js.map +1 -1
  83. package/dist/commands/launch.d.ts +50 -0
  84. package/dist/commands/launch.js +790 -0
  85. package/dist/commands/launch.js.map +1 -0
  86. package/dist/commands/lens.d.ts +45 -0
  87. package/dist/commands/lens.js +386 -0
  88. package/dist/commands/lens.js.map +1 -0
  89. package/dist/commands/market.d.ts +209 -0
  90. package/dist/commands/market.js +1368 -0
  91. package/dist/commands/market.js.map +1 -0
  92. package/dist/commands/mcp.d.ts +42 -0
  93. package/dist/commands/mcp.js +184 -0
  94. package/dist/commands/mcp.js.map +1 -0
  95. package/dist/commands/observe.d.ts +9 -0
  96. package/dist/commands/observe.js +93 -0
  97. package/dist/commands/observe.js.map +1 -0
  98. package/dist/commands/open.d.ts +32 -0
  99. package/dist/commands/open.js +85 -0
  100. package/dist/commands/open.js.map +1 -0
  101. package/dist/commands/pod.d.ts +100 -0
  102. package/dist/commands/pod.js +359 -0
  103. package/dist/commands/pod.js.map +1 -0
  104. package/dist/commands/pods.d.ts +6 -0
  105. package/dist/commands/pods.js +160 -50
  106. package/dist/commands/pods.js.map +1 -1
  107. package/dist/commands/proposals-actions.d.ts +7 -0
  108. package/dist/commands/proposals-actions.js +77 -0
  109. package/dist/commands/proposals-actions.js.map +1 -0
  110. package/dist/commands/providers.d.ts +38 -0
  111. package/dist/commands/providers.js +170 -0
  112. package/dist/commands/providers.js.map +1 -0
  113. package/dist/commands/purge.d.ts +23 -0
  114. package/dist/commands/purge.js +148 -0
  115. package/dist/commands/purge.js.map +1 -0
  116. package/dist/commands/raycast.d.ts +15 -0
  117. package/dist/commands/raycast.js +153 -0
  118. package/dist/commands/raycast.js.map +1 -0
  119. package/dist/commands/sessions.d.ts +31 -0
  120. package/dist/commands/sessions.js +248 -0
  121. package/dist/commands/sessions.js.map +1 -0
  122. package/dist/commands/skill-manage.d.ts +21 -0
  123. package/dist/commands/skill-manage.js +195 -0
  124. package/dist/commands/skill-manage.js.map +1 -0
  125. package/dist/commands/skills-commands.d.ts +26 -0
  126. package/dist/commands/skills-commands.js +187 -0
  127. package/dist/commands/skills-commands.js.map +1 -0
  128. package/dist/commands/skills.d.ts +26 -0
  129. package/dist/commands/skills.js +196 -0
  130. package/dist/commands/skills.js.map +1 -0
  131. package/dist/commands/status.d.ts +3 -1
  132. package/dist/commands/status.js +231 -41
  133. package/dist/commands/status.js.map +1 -1
  134. package/dist/commands/statusline.d.ts +24 -0
  135. package/dist/commands/statusline.js +450 -0
  136. package/dist/commands/statusline.js.map +1 -0
  137. package/dist/commands/subscribe.d.ts +19 -0
  138. package/dist/commands/subscribe.js +91 -0
  139. package/dist/commands/subscribe.js.map +1 -0
  140. package/dist/commands/tools.d.ts +30 -0
  141. package/dist/commands/tools.js +315 -0
  142. package/dist/commands/tools.js.map +1 -0
  143. package/dist/commands/versions.d.ts +27 -0
  144. package/dist/commands/versions.js +277 -0
  145. package/dist/commands/versions.js.map +1 -0
  146. package/dist/commands/view.d.ts +57 -0
  147. package/dist/commands/view.js +195 -0
  148. package/dist/commands/view.js.map +1 -0
  149. package/dist/commands/whoami.d.ts +21 -0
  150. package/dist/commands/whoami.js +129 -0
  151. package/dist/commands/whoami.js.map +1 -0
  152. package/dist/index.d.ts +3 -4
  153. package/dist/index.js +1524 -202
  154. package/dist/index.js.map +1 -1
  155. package/dist/lib/agent-templates.d.ts +25 -0
  156. package/dist/lib/agent-templates.js +148 -0
  157. package/dist/lib/agent-templates.js.map +1 -0
  158. package/dist/lib/agents-config.d.ts +4 -1
  159. package/dist/lib/agents-config.js +19 -2
  160. package/dist/lib/agents-config.js.map +1 -1
  161. package/dist/lib/approval-poll.d.ts +42 -0
  162. package/dist/lib/approval-poll.js +52 -0
  163. package/dist/lib/approval-poll.js.map +1 -0
  164. package/dist/lib/auth.d.ts +29 -6
  165. package/dist/lib/auth.js +105 -94
  166. package/dist/lib/auth.js.map +1 -1
  167. package/dist/lib/bundle-version.d.ts +11 -0
  168. package/dist/lib/bundle-version.js +33 -0
  169. package/dist/lib/bundle-version.js.map +1 -0
  170. package/dist/lib/capture-lane.d.ts +67 -0
  171. package/dist/lib/capture-lane.js +136 -0
  172. package/dist/lib/capture-lane.js.map +1 -0
  173. package/dist/lib/cp-packages.d.ts +121 -0
  174. package/dist/lib/cp-packages.js +218 -0
  175. package/dist/lib/cp-packages.js.map +1 -0
  176. package/dist/lib/describe-lens.d.ts +46 -0
  177. package/dist/lib/describe-lens.js +33 -0
  178. package/dist/lib/describe-lens.js.map +1 -0
  179. package/dist/lib/hub-client.d.ts +84 -1
  180. package/dist/lib/hub-client.js +502 -22
  181. package/dist/lib/hub-client.js.map +1 -1
  182. package/dist/lib/installed.d.ts +51 -0
  183. package/dist/lib/installed.js +70 -0
  184. package/dist/lib/installed.js.map +1 -0
  185. package/dist/lib/next-steps.d.ts +61 -0
  186. package/dist/lib/next-steps.js +146 -0
  187. package/dist/lib/next-steps.js.map +1 -0
  188. package/dist/lib/pod.d.ts +104 -19
  189. package/dist/lib/pod.js +245 -57
  190. package/dist/lib/pod.js.map +1 -1
  191. package/dist/lib/project-ref.d.ts +95 -0
  192. package/dist/lib/project-ref.js +144 -0
  193. package/dist/lib/project-ref.js.map +1 -0
  194. package/dist/lib/project.d.ts +35 -0
  195. package/dist/lib/project.js +39 -0
  196. package/dist/lib/project.js.map +1 -0
  197. package/dist/lib/session-lens.d.ts +33 -0
  198. package/dist/lib/session-lens.js +76 -0
  199. package/dist/lib/session-lens.js.map +1 -0
  200. package/dist/lib/skill-import.d.ts +40 -0
  201. package/dist/lib/skill-import.js +203 -0
  202. package/dist/lib/skill-import.js.map +1 -0
  203. package/dist/lib/skills-installer.d.ts +16 -5
  204. package/dist/lib/skills-installer.js +132 -18
  205. package/dist/lib/skills-installer.js.map +1 -1
  206. package/dist/lib/suite.d.ts +28 -0
  207. package/dist/lib/suite.js +29 -0
  208. package/dist/lib/suite.js.map +1 -0
  209. package/dist/lib/superwhisper-import.d.ts +40 -0
  210. package/dist/lib/superwhisper-import.js +389 -0
  211. package/dist/lib/superwhisper-import.js.map +1 -0
  212. package/dist/lib/targets.d.ts +66 -2
  213. package/dist/lib/targets.js +914 -132
  214. package/dist/lib/targets.js.map +1 -1
  215. package/dist/lib/unwrapList.d.ts +1 -0
  216. package/dist/lib/unwrapList.js +20 -0
  217. package/dist/lib/unwrapList.js.map +1 -0
  218. package/dist/utils/logger.d.ts +2 -0
  219. package/dist/utils/logger.js +10 -2
  220. package/dist/utils/logger.js.map +1 -1
  221. package/package.json +10 -4
  222. package/skills/agent-os/SKILL.md +212 -0
  223. package/skills/manifest.json +5 -0
  224. package/skills/onboard/SKILL.md +186 -0
  225. package/skills/synap/SKILL.md +1524 -104
  226. package/skills/synap/_order.txt +37 -0
  227. package/skills/synap/_skill.yaml +24 -0
  228. package/skills/synap/authentication.md +10 -0
  229. package/skills/synap/automations.md +264 -0
  230. package/skills/synap/capabilities.md +107 -0
  231. package/skills/synap/capture.md +10 -0
  232. package/skills/synap/cli-operations.md +107 -0
  233. package/skills/synap/common-mistakes.md +12 -0
  234. package/skills/synap/creative-loop.md +43 -0
  235. package/skills/synap/crm.md +117 -0
  236. package/skills/synap/diagnostics.md +35 -0
  237. package/skills/synap/digesting-a-channel.md +38 -0
  238. package/skills/synap/document-embeds.md +123 -0
  239. package/skills/synap/escalation-ladder.md +71 -0
  240. package/skills/synap/focus-sessions.md +47 -0
  241. package/skills/synap/governance-rules.md +64 -0
  242. package/skills/synap/governance.md +6 -6
  243. package/skills/synap/graph-gardening.md +21 -0
  244. package/skills/synap/inline-patterns.md +38 -0
  245. package/skills/synap/lenses.md +38 -0
  246. package/skills/synap/linking-principle.md +39 -0
  247. package/skills/synap/linking.md +1 -0
  248. package/skills/synap/mental-model.md +45 -0
  249. package/skills/synap/more.md +7 -0
  250. package/skills/synap/multi-entity-capture.md +10 -0
  251. package/skills/synap/next-action.md +37 -0
  252. package/skills/synap/north-star.md +17 -0
  253. package/skills/synap/operating-mode-rules.md +45 -0
  254. package/skills/synap/operating-mode.md +9 -0
  255. package/skills/synap/quick-reference.md +67 -0
  256. package/skills/synap/reading.md +43 -0
  257. package/skills/synap/recap.md +21 -0
  258. package/skills/synap/reflexes.md +46 -0
  259. package/skills/synap/response-style.md +21 -0
  260. package/skills/synap/scope.md +13 -0
  261. package/skills/synap/showing.md +17 -0
  262. package/skills/synap/user-model.md +25 -0
  263. package/skills/synap/viewframe-cells.md +290 -0
  264. package/skills/synap/work-flow.md +113 -0
  265. package/skills/synap/worked-examples.md +53 -0
  266. package/skills/synap/workspace-design.md +45 -0
  267. package/skills/synap/workspace-edges.md +49 -0
  268. package/skills/synap/writes.md +156 -0
  269. package/skills/synap-schema/SKILL.md +97 -6
  270. package/skills/synap-schema/_order.txt +13 -0
  271. package/skills/synap-schema/_skill.yaml +22 -0
  272. package/skills/synap-schema/before-you-touch.md +14 -0
  273. package/skills/synap-schema/common-mistakes.md +9 -0
  274. package/skills/synap-schema/creating-profiles.md +17 -0
  275. package/skills/synap-schema/discover-profiles.md +24 -0
  276. package/skills/synap-schema/entity-scope.md +8 -0
  277. package/skills/synap-schema/extend-vs-create.md +31 -0
  278. package/skills/synap-schema/more.md +6 -0
  279. package/skills/synap-schema/overlay-properties.md +22 -0
  280. package/skills/synap-schema/profiles.md +3 -0
  281. package/skills/synap-schema/property-defs.md +29 -0
  282. package/skills/synap-schema/read-before-write.md +50 -0
  283. package/skills/synap-schema/relations.md +18 -0
  284. package/skills/synap-schema/worked-example.md +30 -0
  285. package/skills/synap-ui/SKILL.md +38 -11
  286. package/skills/synap-ui/_order.txt +13 -0
  287. package/skills/synap-ui/_skill.yaml +23 -0
  288. package/skills/synap-ui/ai-companion.md +27 -0
  289. package/skills/synap-ui/arranging-bento.md +8 -0
  290. package/skills/synap-ui/before-you-build.md +20 -0
  291. package/skills/synap-ui/bento-layouts.md +35 -0
  292. package/skills/synap-ui/common-mistakes.md +10 -0
  293. package/skills/synap-ui/creating-views.md +26 -0
  294. package/skills/synap-ui/four-builds.md +24 -0
  295. package/skills/synap-ui/more.md +7 -0
  296. package/skills/synap-ui/proposing-vs-extending.md +11 -0
  297. package/skills/synap-ui/view-list.md +24 -0
  298. package/skills/synap-ui/views.md +3 -0
  299. package/skills/synap-ui/worked-example.md +18 -0
  300. package/skills/synap-ui/workspaces.md +47 -0
  301. package/templates/automations/bookmark-enrichment.automation.json +44 -0
  302. package/templates/automations/mail-feed.automation.json +86 -0
  303. package/templates/automations/url-bookmark-capture.automation.json +70 -0
  304. package/templates/skills/README.md +21 -0
  305. package/templates/skills/authoring-automations/SKILL.md +95 -0
  306. package/templates/skills/authoring-automations/reference/node-matrix.md +49 -0
  307. package/templates/skills/authoring-capabilities/SKILL.md +93 -0
  308. package/templates/skills/authoring-capabilities/reference/template-anatomy.md +70 -0
  309. package/templates/skills/authoring-playbooks/SKILL.md +102 -0
  310. package/templates/skills/authoring-playbooks/reference/stages-contract.md +35 -0
  311. package/templates/skills/authoring-playbooks/reference/worked-example.md +64 -0
  312. package/templates/skills/bookmark-enrichment/SKILL.md +40 -0
  313. package/templates/skills/coordinating-agents/SKILL.md +32 -0
  314. package/templates/skills/coordinating-branches/SKILL.md +27 -0
  315. package/templates/skills/mapping-the-server/SKILL.md +54 -0
  316. package/templates/skills/reading-client-progress/SKILL.md +65 -0
  317. package/templates/skills/routing-to-channels/SKILL.md +54 -0
  318. package/templates/skills/stellar-scf-grants-advisor/ASSOCIATE-CHEATSHEET.md +133 -0
  319. package/templates/skills/stellar-scf-grants-advisor/ASSOCIATE-ONBOARDING-GUIDE.md +761 -0
  320. package/templates/skills/stellar-scf-grants-advisor/CLIENT-FAQ.md +181 -0
  321. package/templates/skills/stellar-scf-grants-advisor/PARTNER-HANDOVER.md +130 -0
  322. package/templates/skills/stellar-scf-grants-advisor/SKILL.md +102 -0
  323. package/templates/skills/stellar-scf-grants-advisor/examples/README.md +43 -0
  324. package/templates/skills/stellar-scf-grants-advisor/examples/chat-summary-templates.md +158 -0
  325. package/templates/skills/stellar-scf-grants-advisor/examples/corpus-comparable-rows.md +136 -0
  326. package/templates/skills/stellar-scf-grants-advisor/examples/q10-team-rewrites.md +109 -0
  327. package/templates/skills/stellar-scf-grants-advisor/examples/q2-description-rewrites.md +88 -0
  328. package/templates/skills/stellar-scf-grants-advisor/examples/q6-integration-rewrites.md +107 -0
  329. package/templates/skills/stellar-scf-grants-advisor/examples/tranche-structures.md +176 -0
  330. package/templates/skills/stellar-scf-grants-advisor/reference/01-methodology.md +96 -0
  331. package/templates/skills/stellar-scf-grants-advisor/reference/02-scoring-framework.md +199 -0
  332. package/templates/skills/stellar-scf-grants-advisor/reference/03-rejection-patterns.md +241 -0
  333. package/templates/skills/stellar-scf-grants-advisor/reference/04-winner-patterns.md +120 -0
  334. package/templates/skills/stellar-scf-grants-advisor/reference/05-comeback-patterns.md +92 -0
  335. package/templates/skills/stellar-scf-grants-advisor/reference/06-budget-benchmarks.md +125 -0
  336. package/templates/skills/stellar-scf-grants-advisor/reference/07-integration-list.md +147 -0
  337. package/templates/skills/stellar-scf-grants-advisor/reference/08-abstract-fields.md +258 -0
  338. package/templates/skills/stellar-scf-grants-advisor/reference/09-build-fields.md +259 -0
  339. package/templates/skills/stellar-scf-grants-advisor/reference/10-corpus-winners.md +135 -0
  340. package/templates/skills/stellar-scf-grants-advisor/reference/11-corpus-rejects.md +267 -0
  341. package/templates/skills/stellar-scf-grants-advisor/reference/12-client-communication.md +131 -0
  342. package/templates/skills/stellar-scf-grants-advisor/reference/13-excel-output-spec.md +199 -0
  343. package/templates/skills/stellar-scf-grants-advisor/reference/14-worked-examples.md +160 -0
  344. package/templates/skills/stellar-scf-grants-advisor/templates/abstract-review-builder.py +253 -0
  345. package/templates/skills/stellar-scf-grants-advisor/templates/build-review-builder.py +213 -0
  346. package/dist/commands/finish.d.ts +0 -25
  347. package/dist/commands/finish.js +0 -274
  348. package/dist/commands/finish.js.map +0 -1
  349. package/dist/commands/openclaw.d.ts +0 -40
  350. package/dist/commands/openclaw.js +0 -1148
  351. package/dist/commands/openclaw.js.map +0 -1
  352. package/dist/commands/security-audit.d.ts +0 -12
  353. package/dist/commands/security-audit.js +0 -100
  354. package/dist/commands/security-audit.js.map +0 -1
  355. package/dist/lib/hardening.d.ts +0 -18
  356. package/dist/lib/hardening.js +0 -214
  357. package/dist/lib/hardening.js.map +0 -1
  358. package/dist/lib/templates.d.ts +0 -11
  359. package/dist/lib/templates.js +0 -13
  360. package/dist/lib/templates.js.map +0 -1
  361. package/dist/templates/agent-os.json +0 -3090
  362. package/node_modules/@synap/hub-rest-client/dist/index.cjs +0 -881
  363. package/node_modules/@synap/hub-rest-client/dist/index.d.cts +0 -907
  364. package/node_modules/@synap/hub-rest-client/dist/index.d.ts +0 -907
  365. package/node_modules/@synap/hub-rest-client/dist/index.js +0 -851
  366. package/node_modules/@synap/hub-rest-client/package.json +0 -45
  367. package/node_modules/@synap/hub-rest-client/src/client.ts +0 -1143
  368. package/node_modules/@synap/hub-rest-client/src/errors.ts +0 -30
  369. package/node_modules/@synap/hub-rest-client/src/index.ts +0 -111
  370. package/node_modules/@synap/hub-rest-client/src/setup.ts +0 -77
  371. package/node_modules/@synap/hub-rest-client/src/types.ts +0 -639
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Control-plane package registry client (read-only).
3
+ * ==================================================
4
+ *
5
+ * The ONE authed HTTP client for the CP package registry (`/api/packages`).
6
+ * Before this file there was NO `/api/packages` client in the CLI — `launch`
7
+ * read the whole catalog from the bundled `@synap-core/workspace-templates`
8
+ * package. The ratified architecture is: PUBLIC templates ship in the bundle,
9
+ * PRIVATE templates live in the CP behind the user's login. This client is the
10
+ * private half.
11
+ *
12
+ * Two list endpoints, one detail endpoint:
13
+ * • GET /api/packages — public browse rows (no auth, `definition` stripped)
14
+ * • GET /api/packages/mine — the caller's own packages (Bearer, incl. private)
15
+ * • GET /api/packages/:slug — full row WITH `definition` (Bearer → private visible to author)
16
+ *
17
+ * The row→`RemoteEntry` mapping is NOT here — it is the canonical
18
+ * `rowToRemoteEntry` in `@synap-core/workspace-templates` (browser + CLI share
19
+ * the ONE copy; the two hand-copies had already drifted). This file owns only
20
+ * TRANSPORT: the Bearer token, the base URL (`auth.ts`'s `getCpUrl()`), and the
21
+ * query params the CP `/api/packages` route supports (`search`/`category`/`tag`/
22
+ * `verified`).
23
+ */
24
+ import { type CpPackageRow, type RemoteEntry, type RemoteSourceStatus } from "@synap-core/workspace-templates";
25
+ /**
26
+ * The server-side filters `GET /api/packages` accepts (CP `routes/packages.ts`).
27
+ * `category` is a PACKAGE_TYPES value (`workspace`/`capability`/`skill`/…). The
28
+ * `/mine` route supports none of these — it is the caller's own small set — so
29
+ * they are applied CLIENT-side there.
30
+ */
31
+ export interface PackageFilters {
32
+ search?: string;
33
+ category?: string;
34
+ tag?: string;
35
+ verified?: boolean;
36
+ }
37
+ /** Tier / pricing signal the browse route carries but `RemoteEntry` drops. */
38
+ export interface TierInfo {
39
+ requiredTier?: string | null;
40
+ pricingModel?: string | null;
41
+ }
42
+ /**
43
+ * A public browse row — the canonical `CpPackageRow` PLUS the tier/pricing and
44
+ * count fields the browse route (`GET /api/packages`) returns but the shared
45
+ * `RemoteEntry` shape does not carry. Kept local because they are a
46
+ * discovery-surface concern, not part of the merge door's contract.
47
+ */
48
+ export interface CpBrowseRow extends CpPackageRow {
49
+ version?: string;
50
+ requiredTier?: string | null;
51
+ pricingModel?: string | null;
52
+ isVerified?: boolean;
53
+ installCount?: number;
54
+ }
55
+ /** `/mine` returns `isPublic` (and, like the browse route, `version`) on top of the canonical row shape. */
56
+ export type CpMineRow = CpPackageRow & {
57
+ isPublic?: boolean;
58
+ version?: string;
59
+ };
60
+ /**
61
+ * GET /api/packages — public browse rows, RAW (incl. `requiredTier`/
62
+ * `pricingModel`/`category`). No auth. Throws on non-2xx / network. This is the
63
+ * source both the merged launch catalog and the `market` command read from.
64
+ */
65
+ export declare function fetchPublicBrowseRows(filters?: PackageFilters): Promise<CpBrowseRow[]>;
66
+ /** GET /api/packages — public workspace templates as `RemoteEntry`. No auth. */
67
+ export declare function fetchPublicPackages(filters?: PackageFilters): Promise<RemoteEntry[]>;
68
+ /**
69
+ * GET /api/packages/mine — the caller's own packages (incl. private). Bearer
70
+ * required. The route has no `search`/`category` params, so those filters are
71
+ * applied client-side over this (small) set; `search` is honored, `category`
72
+ * only when the row actually carries one (the `/mine` select omits it, so a
73
+ * type filter never silently drops the user's own rows).
74
+ */
75
+ export declare function fetchMyRows(token: string, filters?: PackageFilters): Promise<CpMineRow[]>;
76
+ export declare function fetchMyPackages(token: string, filters?: PackageFilters): Promise<RemoteEntry[]>;
77
+ /**
78
+ * GET /api/packages/available — the slugs THIS account's subscription tier can
79
+ * install (Bearer required; the route reads the user's `subscriptions.tier`).
80
+ * Used to compute the "locked" set: a public package that declares a
81
+ * `requiredTier` but is absent here is ungrantable for this account. Only
82
+ * `category` is a real filter on this route — the others are ignored server-side.
83
+ */
84
+ export declare function fetchAvailableSlugs(token: string, filters?: PackageFilters): Promise<Set<string>>;
85
+ /**
86
+ * GET /api/packages/:slug — the full row, INCLUDING `definition` (the install
87
+ * payload). Authed when a token is given, which is REQUIRED for a private
88
+ * template (the author-only visibility gate 404s otherwise). Returns `null` if
89
+ * the package is absent / not visible.
90
+ */
91
+ export declare function fetchPackageDefinition(slug: string, token?: string): Promise<Record<string, unknown> | null>;
92
+ /** The remote half of the catalog, plus the health `mergeCatalog` needs. */
93
+ export interface RemoteCatalog {
94
+ rows: RemoteEntry[];
95
+ status: RemoteSourceStatus;
96
+ loggedIn: boolean;
97
+ email?: string;
98
+ /** How many private rows we actually fetched (meaningful only when status === "ok"). */
99
+ privateCount: number;
100
+ /** Tier/pricing per public slug — the browse route carries it, `RemoteEntry` drops it. */
101
+ tierBySlug: Map<string, TierInfo>;
102
+ /**
103
+ * Slugs that declare a `requiredTier` this account CANNOT install (browse ∖
104
+ * `/available`). Empty when logged out or when `/available` couldn't be read
105
+ * (older pod / failure) — absence means "unknown", never "locked".
106
+ */
107
+ lockedSlugs: Set<string>;
108
+ }
109
+ /**
110
+ * Assemble the remote catalog for `launch`, degrading HONESTLY rather than
111
+ * failing open empty:
112
+ *
113
+ * • Logged out → NO network. The bundle already IS the public catalog, and
114
+ * private templates are invisible without auth. Status "unauthenticated"
115
+ * tells the consumer to render the `synap login` path.
116
+ * • Logged in → fetch `/mine` (private + own public) and best-effort `/packages`
117
+ * (official / third-party public); merge, private-carrying rows win a tie.
118
+ * • `/mine` 401/403 → "unauthenticated" (session expired). Network failure →
119
+ * "unreachable". Either way `rows` is empty and the door keeps the bundle.
120
+ */
121
+ export declare function fetchRemoteCatalog(filters?: PackageFilters): Promise<RemoteCatalog>;
@@ -0,0 +1,218 @@
1
+ /**
2
+ * Control-plane package registry client (read-only).
3
+ * ==================================================
4
+ *
5
+ * The ONE authed HTTP client for the CP package registry (`/api/packages`).
6
+ * Before this file there was NO `/api/packages` client in the CLI — `launch`
7
+ * read the whole catalog from the bundled `@synap-core/workspace-templates`
8
+ * package. The ratified architecture is: PUBLIC templates ship in the bundle,
9
+ * PRIVATE templates live in the CP behind the user's login. This client is the
10
+ * private half.
11
+ *
12
+ * Two list endpoints, one detail endpoint:
13
+ * • GET /api/packages — public browse rows (no auth, `definition` stripped)
14
+ * • GET /api/packages/mine — the caller's own packages (Bearer, incl. private)
15
+ * • GET /api/packages/:slug — full row WITH `definition` (Bearer → private visible to author)
16
+ *
17
+ * The row→`RemoteEntry` mapping is NOT here — it is the canonical
18
+ * `rowToRemoteEntry` in `@synap-core/workspace-templates` (browser + CLI share
19
+ * the ONE copy; the two hand-copies had already drifted). This file owns only
20
+ * TRANSPORT: the Bearer token, the base URL (`auth.ts`'s `getCpUrl()`), and the
21
+ * query params the CP `/api/packages` route supports (`search`/`category`/`tag`/
22
+ * `verified`).
23
+ */
24
+ import { rowToRemoteEntry, } from "@synap-core/workspace-templates";
25
+ import { getCpUrl, getStoredToken, isTokenLocallyExpired } from "./auth.js";
26
+ // Packages mount under `/api/packages` (CP `routes/index.ts`), unlike `/auth`
27
+ // and `/pods` which sit at the root — hence the explicit `/api` segment here.
28
+ const packagesBase = () => `${getCpUrl()}/api/packages`;
29
+ const FETCH_TIMEOUT_MS = 10_000;
30
+ /** Build the `/api/packages` query string from filters + any extra params. */
31
+ function buildQuery(filters, extra) {
32
+ const p = new URLSearchParams(extra);
33
+ if (filters?.search)
34
+ p.set("search", filters.search);
35
+ if (filters?.category)
36
+ p.set("category", filters.category);
37
+ if (filters?.tag)
38
+ p.set("tag", filters.tag);
39
+ if (filters?.verified)
40
+ p.set("verified", "true");
41
+ return p.toString();
42
+ }
43
+ /** An auth failure (401/403) — distinct from an unreachable-network failure. */
44
+ class CpAuthError extends Error {
45
+ authFailed = true;
46
+ }
47
+ /**
48
+ * GET /api/packages — public browse rows, RAW (incl. `requiredTier`/
49
+ * `pricingModel`/`category`). No auth. Throws on non-2xx / network. This is the
50
+ * source both the merged launch catalog and the `market` command read from.
51
+ */
52
+ export async function fetchPublicBrowseRows(filters) {
53
+ const qs = buildQuery(filters, { limit: "100" });
54
+ const res = await fetch(`${packagesBase()}?${qs}`, {
55
+ signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
56
+ });
57
+ if (!res.ok)
58
+ throw new Error(`CP GET /api/packages → HTTP ${res.status}`);
59
+ const data = (await res.json());
60
+ return data.packages ?? [];
61
+ }
62
+ /** GET /api/packages — public workspace templates as `RemoteEntry`. No auth. */
63
+ export async function fetchPublicPackages(filters) {
64
+ const rows = await fetchPublicBrowseRows(filters);
65
+ // Browse rows are all public by construction — pass `isPrivate` undefined.
66
+ return rows.map((r) => rowToRemoteEntry(r, undefined));
67
+ }
68
+ /**
69
+ * GET /api/packages/mine — the caller's own packages (incl. private). Bearer
70
+ * required. The route has no `search`/`category` params, so those filters are
71
+ * applied client-side over this (small) set; `search` is honored, `category`
72
+ * only when the row actually carries one (the `/mine` select omits it, so a
73
+ * type filter never silently drops the user's own rows).
74
+ */
75
+ export async function fetchMyRows(token, filters) {
76
+ const res = await fetch(`${packagesBase()}/mine?limit=100`, {
77
+ headers: { Authorization: `Bearer ${token}` },
78
+ signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
79
+ });
80
+ if (res.status === 401 || res.status === 403) {
81
+ throw new CpAuthError(`CP GET /api/packages/mine → HTTP ${res.status}`);
82
+ }
83
+ if (!res.ok)
84
+ throw new Error(`CP GET /api/packages/mine → HTTP ${res.status}`);
85
+ const data = (await res.json());
86
+ let rows = data.packages ?? [];
87
+ if (filters?.category) {
88
+ rows = rows.filter((r) => r.category == null || r.category === filters.category);
89
+ }
90
+ if (filters?.search) {
91
+ const q = filters.search.toLowerCase();
92
+ rows = rows.filter((r) => r.slug.toLowerCase().includes(q) ||
93
+ r.displayName.toLowerCase().includes(q) ||
94
+ (r.description ?? "").toLowerCase().includes(q));
95
+ }
96
+ return rows;
97
+ }
98
+ export async function fetchMyPackages(token, filters) {
99
+ const rows = await fetchMyRows(token, filters);
100
+ return rows.map((r) => rowToRemoteEntry(r, r.isPublic === false ? true : undefined));
101
+ }
102
+ /**
103
+ * GET /api/packages/available — the slugs THIS account's subscription tier can
104
+ * install (Bearer required; the route reads the user's `subscriptions.tier`).
105
+ * Used to compute the "locked" set: a public package that declares a
106
+ * `requiredTier` but is absent here is ungrantable for this account. Only
107
+ * `category` is a real filter on this route — the others are ignored server-side.
108
+ */
109
+ export async function fetchAvailableSlugs(token, filters) {
110
+ const qs = buildQuery({ category: filters?.category }, { limit: "100" });
111
+ const res = await fetch(`${packagesBase()}/available?${qs}`, {
112
+ headers: { Authorization: `Bearer ${token}` },
113
+ signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
114
+ });
115
+ if (!res.ok)
116
+ throw new Error(`CP GET /api/packages/available → HTTP ${res.status}`);
117
+ const data = (await res.json());
118
+ return new Set((data.packages ?? []).map((p) => p.slug));
119
+ }
120
+ /**
121
+ * GET /api/packages/:slug — the full row, INCLUDING `definition` (the install
122
+ * payload). Authed when a token is given, which is REQUIRED for a private
123
+ * template (the author-only visibility gate 404s otherwise). Returns `null` if
124
+ * the package is absent / not visible.
125
+ */
126
+ export async function fetchPackageDefinition(slug, token) {
127
+ const res = await fetch(`${packagesBase()}/${encodeURIComponent(slug)}`, {
128
+ headers: token ? { Authorization: `Bearer ${token}` } : {},
129
+ signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
130
+ });
131
+ if (!res.ok)
132
+ return null;
133
+ const data = (await res.json());
134
+ return data.package?.definition ?? null;
135
+ }
136
+ /**
137
+ * Assemble the remote catalog for `launch`, degrading HONESTLY rather than
138
+ * failing open empty:
139
+ *
140
+ * • Logged out → NO network. The bundle already IS the public catalog, and
141
+ * private templates are invisible without auth. Status "unauthenticated"
142
+ * tells the consumer to render the `synap login` path.
143
+ * • Logged in → fetch `/mine` (private + own public) and best-effort `/packages`
144
+ * (official / third-party public); merge, private-carrying rows win a tie.
145
+ * • `/mine` 401/403 → "unauthenticated" (session expired). Network failure →
146
+ * "unreachable". Either way `rows` is empty and the door keeps the bundle.
147
+ */
148
+ export async function fetchRemoteCatalog(filters) {
149
+ const creds = getStoredToken();
150
+ const loggedIn = !!creds && !isTokenLocallyExpired(creds);
151
+ if (!loggedIn) {
152
+ return {
153
+ rows: [],
154
+ status: "unauthenticated",
155
+ loggedIn: false,
156
+ privateCount: 0,
157
+ tierBySlug: new Map(),
158
+ lockedSlugs: new Set(),
159
+ };
160
+ }
161
+ let publicRows = [];
162
+ let mineRows = [];
163
+ let availableSlugs = null;
164
+ try {
165
+ [publicRows, mineRows, availableSlugs] = await Promise.all([
166
+ // Public is best-effort: a private catalog that resolves is still useful
167
+ // even if the browse route hiccups.
168
+ fetchPublicBrowseRows(filters).catch(() => []),
169
+ fetchMyPackages(creds.token, filters),
170
+ // Tier gate is best-effort: an older pod without `/available` ⇒ null ⇒
171
+ // "unknown", never "locked".
172
+ fetchAvailableSlugs(creds.token, filters).catch(() => null),
173
+ ]);
174
+ }
175
+ catch (e) {
176
+ const authFailed = e.authFailed === true;
177
+ return {
178
+ rows: [],
179
+ status: authFailed ? "unauthenticated" : "unreachable",
180
+ loggedIn: true,
181
+ email: creds.email,
182
+ privateCount: 0,
183
+ tierBySlug: new Map(),
184
+ lockedSlugs: new Set(),
185
+ };
186
+ }
187
+ const tierBySlug = new Map();
188
+ const lockedSlugs = new Set();
189
+ for (const r of publicRows) {
190
+ if (r.requiredTier != null || r.pricingModel != null) {
191
+ tierBySlug.set(r.slug, {
192
+ requiredTier: r.requiredTier ?? null,
193
+ pricingModel: r.pricingModel ?? null,
194
+ });
195
+ }
196
+ // Locked = declares a tier this account's `/available` set doesn't include.
197
+ if (availableSlugs && r.requiredTier && !availableSlugs.has(r.slug)) {
198
+ lockedSlugs.add(r.slug);
199
+ }
200
+ }
201
+ // Dedup by slug; `/mine` rows overwrite public ones so the private flag wins.
202
+ const bySlug = new Map();
203
+ for (const r of publicRows)
204
+ bySlug.set(r.slug, rowToRemoteEntry(r, undefined));
205
+ for (const r of mineRows)
206
+ bySlug.set(r.slug, r);
207
+ const rows = [...bySlug.values()];
208
+ return {
209
+ rows,
210
+ status: "ok",
211
+ loggedIn: true,
212
+ email: creds.email,
213
+ privateCount: rows.filter((r) => r.isPrivate).length,
214
+ tierBySlug,
215
+ lockedSlugs,
216
+ };
217
+ }
218
+ //# sourceMappingURL=cp-packages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cp-packages.js","sourceRoot":"","sources":["../../src/lib/cp-packages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Shared lens display formatter.
3
+ *
4
+ * The lens itself — `{ workspaceId, projectId, focusSessionId }` — is resolved
5
+ * by `resolveActiveLens()` in `session-lens.ts`; this module only answers "how
6
+ * do we SHOW it". Before this existed, `commands/lens.ts` and
7
+ * `commands/statusline.ts` each hand-rolled their own "no workspace → pod-wide"
8
+ * / "no project → none" fallback text. One formatter now owns that logic so
9
+ * new surfaces (Raycast, `orient`) can render the same lens consistently.
10
+ *
11
+ * Colors/links are deliberately NOT baked in here — `lens.ts` uses chalk,
12
+ * `statusline.ts` uses raw ANSI + OSC-8 hyperlinks, and a future Raycast
13
+ * consumer will use neither. Callers wrap the plain names/ids this module
14
+ * resolves in whatever presentation their surface needs.
15
+ */
16
+ export interface LensEntry {
17
+ id: string;
18
+ name?: string;
19
+ }
20
+ export interface ResolvedLens {
21
+ workspace?: LensEntry;
22
+ project?: LensEntry;
23
+ session?: LensEntry;
24
+ }
25
+ export interface DescribedLensField {
26
+ id: string;
27
+ /** Display name, falling back to the raw id when no name was resolved. */
28
+ name: string;
29
+ }
30
+ export interface DescribedLens {
31
+ structured: {
32
+ workspace?: DescribedLensField;
33
+ project?: DescribedLensField;
34
+ session?: DescribedLensField;
35
+ /** True iff neither a workspace nor a project is bound — fully pod-wide. */
36
+ podWide: boolean;
37
+ };
38
+ /** One "Label: value" line per field, in workspace/project/session order — value is the
39
+ * placeholder text when unset, so callers can print it as-is or re-color it. */
40
+ lines: Array<{
41
+ label: "Workspace" | "Project" | "Session";
42
+ value: string;
43
+ bound: boolean;
44
+ }>;
45
+ }
46
+ export declare function describeLens(lens: ResolvedLens): DescribedLens;
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Shared lens display formatter.
3
+ *
4
+ * The lens itself — `{ workspaceId, projectId, focusSessionId }` — is resolved
5
+ * by `resolveActiveLens()` in `session-lens.ts`; this module only answers "how
6
+ * do we SHOW it". Before this existed, `commands/lens.ts` and
7
+ * `commands/statusline.ts` each hand-rolled their own "no workspace → pod-wide"
8
+ * / "no project → none" fallback text. One formatter now owns that logic so
9
+ * new surfaces (Raycast, `orient`) can render the same lens consistently.
10
+ *
11
+ * Colors/links are deliberately NOT baked in here — `lens.ts` uses chalk,
12
+ * `statusline.ts` uses raw ANSI + OSC-8 hyperlinks, and a future Raycast
13
+ * consumer will use neither. Callers wrap the plain names/ids this module
14
+ * resolves in whatever presentation their surface needs.
15
+ */
16
+ function describeField(entry) {
17
+ if (!entry?.id)
18
+ return undefined;
19
+ return { id: entry.id, name: entry.name?.trim() || entry.id };
20
+ }
21
+ export function describeLens(lens) {
22
+ const workspace = describeField(lens.workspace);
23
+ const project = describeField(lens.project);
24
+ const session = describeField(lens.session);
25
+ const podWide = !workspace && !project;
26
+ const lines = [
27
+ { label: "Workspace", value: workspace?.name ?? "— (pod-wide)", bound: Boolean(workspace) },
28
+ { label: "Project", value: project?.name ?? "— none", bound: Boolean(project) },
29
+ { label: "Session", value: session?.name ?? "— none", bound: Boolean(session) },
30
+ ];
31
+ return { structured: { workspace, project, session, podWide }, lines };
32
+ }
33
+ //# sourceMappingURL=describe-lens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe-lens.js","sourceRoot":"","sources":["../../src/lib/describe-lens.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAgCH,SAAS,aAAa,CAAC,KAAiB;IACtC,IAAI,CAAC,KAAK,EAAE,EAAE;QAAE,OAAO,SAAS,CAAC;IACjC,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAkB;IAC7C,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC;IAEvC,MAAM,KAAK,GAA2B;QACpC,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,cAAc,EAAE,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,EAAE;QAC3F,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE;QAC/E,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE;KAChF,CAAC;IAEF,OAAO,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC;AACzE,CAAC"}
@@ -1,10 +1,73 @@
1
1
  import { HubRestClient } from "@synap/hub-rest-client";
2
+ /**
3
+ * A failed Hub call, carrying the structured facts callers need to branch on.
4
+ *
5
+ * `message` is HUMAN-READABLE and is what the many `log.error((err as Error).message)`
6
+ * sites print. It keeps a literal `(HTTP <status>)` token: several call sites
7
+ * classify errors by matching that substring, and the token is the contract they
8
+ * depend on. The raw response body is kept on `rawBody` and never spliced into
9
+ * `message` — a JSON blob truncated mid-object is unreadable and leaks internals.
10
+ */
11
+ export declare class HubError extends Error {
12
+ readonly status: number;
13
+ readonly code?: string;
14
+ readonly reason?: string;
15
+ readonly body?: unknown;
16
+ readonly rawBody: string;
17
+ readonly path: string;
18
+ readonly method: string;
19
+ constructor(init: {
20
+ message: string;
21
+ status: number;
22
+ code?: string;
23
+ reason?: string;
24
+ body?: unknown;
25
+ rawBody: string;
26
+ path: string;
27
+ method: string;
28
+ });
29
+ }
30
+ /**
31
+ * A Hub call that never reached the pod — DNS, TCP, TLS or timeout.
32
+ *
33
+ * Peer of {@link HubError}: same rendering path, same `message`-is-human-readable
34
+ * rule. It deliberately carries NO `(HTTP <status>)` token — there was no HTTP
35
+ * response, and the call sites that classify on that substring must not match.
36
+ * `podUrl` is the origin we failed to reach and `hint` is the next action.
37
+ */
38
+ export declare class HubNetworkError extends Error {
39
+ /** Transport code we classified on: ENOTFOUND, ECONNREFUSED, TIMEOUT, TLS… */
40
+ readonly code: string;
41
+ readonly podUrl: string;
42
+ readonly path: string;
43
+ readonly method: string;
44
+ /** The one thing the user should do next. Rendered under the message. */
45
+ readonly hint: string;
46
+ constructor(init: {
47
+ message: string;
48
+ code: string;
49
+ podUrl: string;
50
+ path: string;
51
+ method: string;
52
+ hint: string;
53
+ cause?: unknown;
54
+ });
55
+ }
56
+ /**
57
+ * Print a failed Hub call: its humanized message plus a hint for the classes
58
+ * where the cause is not obvious from the message alone. Lives here rather than
59
+ * in utils/logger so the logger stays domain-agnostic and the taxonomy and its
60
+ * presentation sit in one file.
61
+ */
62
+ export declare function renderHubError(err: unknown): void;
2
63
  export interface HubConfig {
3
64
  podUrl: string;
4
65
  apiKey: string;
5
66
  userId: string;
6
67
  /** Active workspace — from `synap use`, pod default, or env var. Undefined if none configured. */
7
68
  workspaceId?: string;
69
+ /** Active project — from `synap project use`, pod default, or env var. Peer of workspaceId; independent. */
70
+ projectId?: string;
8
71
  scopes?: string[];
9
72
  }
10
73
  export declare function resolveUserId(cfg: HubConfig): Promise<string>;
@@ -13,9 +76,29 @@ export declare function resolveHubConfig(opts?: {
13
76
  podUrl?: string;
14
77
  apiKey?: string;
15
78
  }): Promise<HubConfig>;
79
+ /** Read the active session ID for this terminal from CWD or env var. */
80
+ export declare function readActiveSessionId(): string | undefined;
81
+ /** Attach a session to this terminal — writes .synap-session in CWD. */
82
+ export declare function writeActiveSessionId(sessionId: string): void;
83
+ /** Detach the active session from this terminal — removes .synap-session. */
84
+ export declare function clearActiveSessionId(): void;
16
85
  export declare function hubGet(path: string, params: Record<string, string | number | undefined>, cfg: HubConfig): Promise<unknown>;
17
- export declare function hubPost(path: string, body: unknown, cfg: HubConfig): Promise<unknown>;
86
+ export declare function hubPost(path: string, body: unknown, cfg: HubConfig, timeoutMs?: number): Promise<unknown>;
87
+ /**
88
+ * Multipart POST for Hub doors that accept file uploads (e.g. source-file).
89
+ * Do NOT set Content-Type — fetch sets the boundary for FormData.
90
+ *
91
+ * Note: on 429 retry we cannot re-use a consumed FormData body in all runtimes.
92
+ * Callers that hit 429 mid-bulk should rebuild FormData — see hubPostMultipartRetryable.
93
+ */
94
+ export declare function hubPostMultipart(path: string, form: FormData, cfg: HubConfig, timeoutMs?: number): Promise<unknown>;
95
+ /**
96
+ * Multipart POST that rebuilds the body on each 429 retry (FormData streams
97
+ * can only be read once).
98
+ */
99
+ export declare function hubPostMultipartRetryable(path: string, buildForm: () => FormData, cfg: HubConfig, timeoutMs?: number): Promise<unknown>;
18
100
  export declare function hubPatch(path: string, body: unknown, cfg: HubConfig): Promise<unknown>;
101
+ export declare function hubDelete(path: string, cfg: HubConfig): Promise<unknown>;
19
102
  /**
20
103
  * Create a typed HubRestClient from a resolved HubConfig.
21
104
  * Use this in new code and shared surfaces (e.g. Raycast) to get full