@synap-core/cli 1.11.0 → 1.12.2

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 (452) hide show
  1. package/README.md +23 -198
  2. package/dist/build-info.json +6 -0
  3. package/dist/commands/agent-run.js +3 -2
  4. package/dist/commands/agent-run.js.map +1 -1
  5. package/dist/commands/agents.d.ts +33 -17
  6. package/dist/commands/agents.js +203 -237
  7. package/dist/commands/agents.js.map +1 -1
  8. package/dist/commands/app.d.ts +143 -0
  9. package/dist/commands/app.js +523 -0
  10. package/dist/commands/app.js.map +1 -0
  11. package/dist/commands/automate.d.ts +21 -0
  12. package/dist/commands/automate.js +42 -0
  13. package/dist/commands/automate.js.map +1 -0
  14. package/dist/commands/automation-schema.test.d.ts +16 -0
  15. package/dist/commands/automation-schema.test.js +77 -0
  16. package/dist/commands/automation-schema.test.js.map +1 -0
  17. package/dist/commands/automation.d.ts +12 -0
  18. package/dist/commands/automation.js +80 -35
  19. package/dist/commands/automation.js.map +1 -1
  20. package/dist/commands/bridge-setup.d.ts +14 -1
  21. package/dist/commands/bridge-setup.js +392 -128
  22. package/dist/commands/bridge-setup.js.map +1 -1
  23. package/dist/commands/cap-connections.d.ts +4 -4
  24. package/dist/commands/cap-connections.js +14 -14
  25. package/dist/commands/cap-connections.js.map +1 -1
  26. package/dist/commands/capability.d.ts +2 -0
  27. package/dist/commands/capability.js +218 -168
  28. package/dist/commands/capability.js.map +1 -1
  29. package/dist/commands/catalog.d.ts +275 -0
  30. package/dist/commands/catalog.js +481 -0
  31. package/dist/commands/catalog.js.map +1 -0
  32. package/dist/commands/cell.d.ts +155 -8
  33. package/dist/commands/cell.js +416 -40
  34. package/dist/commands/cell.js.map +1 -1
  35. package/dist/commands/centrality.js +1 -13
  36. package/dist/commands/centrality.js.map +1 -1
  37. package/dist/commands/connect.d.ts +38 -13
  38. package/dist/commands/connect.js +68 -167
  39. package/dist/commands/connect.js.map +1 -1
  40. package/dist/commands/connections.d.ts +3 -2
  41. package/dist/commands/connections.js +95 -25
  42. package/dist/commands/connections.js.map +1 -1
  43. package/dist/commands/context.js +7 -1
  44. package/dist/commands/context.js.map +1 -1
  45. package/dist/commands/data-extra.d.ts +34 -0
  46. package/dist/commands/data-extra.js +193 -23
  47. package/dist/commands/data-extra.js.map +1 -1
  48. package/dist/commands/data.d.ts +120 -2
  49. package/dist/commands/data.js +293 -20
  50. package/dist/commands/data.js.map +1 -1
  51. package/dist/commands/diagnose.d.ts +66 -4
  52. package/dist/commands/diagnose.js +285 -28
  53. package/dist/commands/diagnose.js.map +1 -1
  54. package/dist/commands/doc.d.ts +11 -4
  55. package/dist/commands/doc.js +39 -14
  56. package/dist/commands/doc.js.map +1 -1
  57. package/dist/commands/doctor.d.ts +112 -3
  58. package/dist/commands/doctor.js +657 -32
  59. package/dist/commands/doctor.js.map +1 -1
  60. package/dist/commands/explain.js +5 -5
  61. package/dist/commands/explain.js.map +1 -1
  62. package/dist/commands/import.d.ts +368 -13
  63. package/dist/commands/import.js +1064 -54
  64. package/dist/commands/import.js.map +1 -1
  65. package/dist/commands/init.d.ts +20 -9
  66. package/dist/commands/init.js +433 -973
  67. package/dist/commands/init.js.map +1 -1
  68. package/dist/commands/keys.d.ts +1 -0
  69. package/dist/commands/keys.js +15 -2
  70. package/dist/commands/keys.js.map +1 -1
  71. package/dist/commands/knowledge.d.ts +22 -6
  72. package/dist/commands/knowledge.js +117 -55
  73. package/dist/commands/knowledge.js.map +1 -1
  74. package/dist/commands/lens.d.ts +37 -1
  75. package/dist/commands/lens.js +192 -71
  76. package/dist/commands/lens.js.map +1 -1
  77. package/dist/commands/market-authoring.d.ts +29 -2
  78. package/dist/commands/market-authoring.js +348 -7
  79. package/dist/commands/market-authoring.js.map +1 -1
  80. package/dist/commands/market-official.d.ts +58 -0
  81. package/dist/commands/market-official.js +84 -0
  82. package/dist/commands/market-official.js.map +1 -0
  83. package/dist/commands/market.d.ts +400 -16
  84. package/dist/commands/market.js +1802 -146
  85. package/dist/commands/market.js.map +1 -1
  86. package/dist/commands/mcp.d.ts +60 -25
  87. package/dist/commands/mcp.js +251 -64
  88. package/dist/commands/mcp.js.map +1 -1
  89. package/dist/commands/open.d.ts +39 -9
  90. package/dist/commands/open.js +80 -25
  91. package/dist/commands/open.js.map +1 -1
  92. package/dist/commands/playbook.d.ts +42 -0
  93. package/dist/commands/playbook.js +162 -0
  94. package/dist/commands/playbook.js.map +1 -0
  95. package/dist/commands/pod.js +1 -1
  96. package/dist/commands/pod.js.map +1 -1
  97. package/dist/commands/pods.d.ts +5 -0
  98. package/dist/commands/pods.js +97 -116
  99. package/dist/commands/pods.js.map +1 -1
  100. package/dist/commands/proposals-actions.d.ts +62 -0
  101. package/dist/commands/proposals-actions.js +143 -8
  102. package/dist/commands/proposals-actions.js.map +1 -1
  103. package/dist/commands/proposals-await.d.ts +68 -0
  104. package/dist/commands/proposals-await.js +248 -0
  105. package/dist/commands/proposals-await.js.map +1 -0
  106. package/dist/commands/proton-setup.d.ts +73 -0
  107. package/dist/commands/proton-setup.js +577 -0
  108. package/dist/commands/proton-setup.js.map +1 -0
  109. package/dist/commands/providers.d.ts +23 -0
  110. package/dist/commands/providers.js +126 -1
  111. package/dist/commands/providers.js.map +1 -1
  112. package/dist/commands/raycast.js +6 -2
  113. package/dist/commands/raycast.js.map +1 -1
  114. package/dist/commands/rule.d.ts +150 -0
  115. package/dist/commands/rule.js +447 -0
  116. package/dist/commands/rule.js.map +1 -0
  117. package/dist/commands/session-wait.d.ts +111 -0
  118. package/dist/commands/session-wait.js +209 -0
  119. package/dist/commands/session-wait.js.map +1 -0
  120. package/dist/commands/sessions.d.ts +52 -0
  121. package/dist/commands/sessions.js +478 -58
  122. package/dist/commands/sessions.js.map +1 -1
  123. package/dist/commands/skill-manage.d.ts +21 -0
  124. package/dist/commands/skill-manage.js +136 -19
  125. package/dist/commands/skill-manage.js.map +1 -1
  126. package/dist/commands/skills.js +16 -0
  127. package/dist/commands/skills.js.map +1 -1
  128. package/dist/commands/status.d.ts +1 -4
  129. package/dist/commands/status.js +5 -34
  130. package/dist/commands/status.js.map +1 -1
  131. package/dist/commands/statusline.backoff.test.d.ts +13 -0
  132. package/dist/commands/statusline.backoff.test.js +100 -0
  133. package/dist/commands/statusline.backoff.test.js.map +1 -0
  134. package/dist/commands/statusline.js +16 -9
  135. package/dist/commands/statusline.js.map +1 -1
  136. package/dist/commands/sync-status.d.ts +12 -0
  137. package/dist/commands/sync-status.js +125 -0
  138. package/dist/commands/sync-status.js.map +1 -0
  139. package/dist/commands/templates-retire.d.ts +34 -0
  140. package/dist/commands/templates-retire.js +192 -0
  141. package/dist/commands/templates-retire.js.map +1 -0
  142. package/dist/commands/tools.js +6 -21
  143. package/dist/commands/tools.js.map +1 -1
  144. package/dist/commands/tracks.d.ts +51 -0
  145. package/dist/commands/tracks.js +291 -0
  146. package/dist/commands/tracks.js.map +1 -0
  147. package/dist/commands/update.d.ts +3 -11
  148. package/dist/commands/update.js +5 -134
  149. package/dist/commands/update.js.map +1 -1
  150. package/dist/commands/upload.d.ts +41 -3
  151. package/dist/commands/upload.js +120 -18
  152. package/dist/commands/upload.js.map +1 -1
  153. package/dist/commands/vendor.d.ts +28 -0
  154. package/dist/commands/vendor.js +110 -0
  155. package/dist/commands/vendor.js.map +1 -0
  156. package/dist/commands/versions.js +6 -0
  157. package/dist/commands/versions.js.map +1 -1
  158. package/dist/commands/view.js +10 -5
  159. package/dist/commands/view.js.map +1 -1
  160. package/dist/commands/whoami.d.ts +23 -3
  161. package/dist/commands/whoami.js +169 -23
  162. package/dist/commands/whoami.js.map +1 -1
  163. package/dist/commands/worker.d.ts +122 -0
  164. package/dist/commands/worker.js +435 -0
  165. package/dist/commands/worker.js.map +1 -0
  166. package/dist/commands/worker.test.d.ts +1 -0
  167. package/dist/commands/worker.test.js +116 -0
  168. package/dist/commands/worker.test.js.map +1 -0
  169. package/dist/commands/workspace-ops.d.ts +35 -0
  170. package/dist/commands/workspace-ops.js +153 -0
  171. package/dist/commands/workspace-ops.js.map +1 -0
  172. package/dist/index.d.ts +6 -6
  173. package/dist/index.js +900 -180
  174. package/dist/index.js.map +1 -1
  175. package/dist/lib/agent-connections.d.ts +31 -0
  176. package/dist/lib/agent-connections.js +33 -0
  177. package/dist/lib/agent-connections.js.map +1 -0
  178. package/dist/lib/agent-detect.d.ts +27 -0
  179. package/dist/lib/agent-detect.js +71 -0
  180. package/dist/lib/agent-detect.js.map +1 -0
  181. package/dist/lib/agent-door.d.ts +138 -0
  182. package/dist/lib/agent-door.js +426 -0
  183. package/dist/lib/agent-door.js.map +1 -0
  184. package/dist/lib/agents-config.d.ts +2 -0
  185. package/dist/lib/agents-config.js +4 -9
  186. package/dist/lib/agents-config.js.map +1 -1
  187. package/dist/lib/approval-poll.d.ts +31 -2
  188. package/dist/lib/approval-poll.js +20 -7
  189. package/dist/lib/approval-poll.js.map +1 -1
  190. package/dist/lib/atomic-file.d.ts +48 -0
  191. package/dist/lib/atomic-file.js +129 -0
  192. package/dist/lib/atomic-file.js.map +1 -0
  193. package/dist/lib/auth.d.ts +14 -9
  194. package/dist/lib/auth.js +44 -61
  195. package/dist/lib/auth.js.map +1 -1
  196. package/dist/lib/batch-approval.d.ts +85 -0
  197. package/dist/lib/batch-approval.js +170 -0
  198. package/dist/lib/batch-approval.js.map +1 -0
  199. package/dist/lib/capture-lane.d.ts +6 -5
  200. package/dist/lib/capture-lane.js +6 -5
  201. package/dist/lib/capture-lane.js.map +1 -1
  202. package/dist/lib/capture-structure.d.ts +230 -11
  203. package/dist/lib/capture-structure.js +251 -13
  204. package/dist/lib/capture-structure.js.map +1 -1
  205. package/dist/lib/catalog-templates.d.ts +59 -0
  206. package/dist/lib/catalog-templates.js +126 -0
  207. package/dist/lib/catalog-templates.js.map +1 -0
  208. package/dist/lib/cli-build.d.ts +19 -0
  209. package/dist/lib/cli-build.js +37 -0
  210. package/dist/lib/cli-build.js.map +1 -0
  211. package/dist/lib/conversation-headers.d.ts +18 -0
  212. package/dist/lib/conversation-headers.js +32 -0
  213. package/dist/lib/conversation-headers.js.map +1 -0
  214. package/dist/lib/cp-packages.d.ts +167 -11
  215. package/dist/lib/cp-packages.js +253 -21
  216. package/dist/lib/cp-packages.js.map +1 -1
  217. package/dist/lib/credential-class.d.ts +117 -0
  218. package/dist/lib/credential-class.js +116 -0
  219. package/dist/lib/credential-class.js.map +1 -0
  220. package/dist/lib/describe-lens.d.ts +35 -0
  221. package/dist/lib/describe-lens.js +40 -0
  222. package/dist/lib/describe-lens.js.map +1 -1
  223. package/dist/lib/device-connect.d.ts +125 -0
  224. package/dist/lib/device-connect.js +256 -0
  225. package/dist/lib/device-connect.js.map +1 -0
  226. package/dist/lib/directory-lens.d.ts +99 -0
  227. package/dist/lib/directory-lens.js +187 -0
  228. package/dist/lib/directory-lens.js.map +1 -0
  229. package/dist/lib/exporter-coverage.d.ts +71 -0
  230. package/dist/lib/exporter-coverage.js +97 -0
  231. package/dist/lib/exporter-coverage.js.map +1 -0
  232. package/dist/lib/hub-client.d.ts +29 -8
  233. package/dist/lib/hub-client.js +328 -55
  234. package/dist/lib/hub-client.js.map +1 -1
  235. package/dist/lib/init-connect.d.ts +41 -0
  236. package/dist/lib/init-connect.js +75 -0
  237. package/dist/lib/init-connect.js.map +1 -0
  238. package/dist/lib/init-exit.d.ts +24 -0
  239. package/dist/lib/init-exit.js +41 -0
  240. package/dist/lib/init-exit.js.map +1 -0
  241. package/dist/lib/init-flow.d.ts +25 -0
  242. package/dist/lib/init-flow.js +40 -0
  243. package/dist/lib/init-flow.js.map +1 -0
  244. package/dist/lib/init-handoff.d.ts +16 -0
  245. package/dist/lib/init-handoff.js +19 -0
  246. package/dist/lib/init-handoff.js.map +1 -0
  247. package/dist/lib/init-output.d.ts +18 -0
  248. package/dist/lib/init-output.js +43 -0
  249. package/dist/lib/init-output.js.map +1 -0
  250. package/dist/lib/init-pod.d.ts +45 -0
  251. package/dist/lib/init-pod.js +36 -0
  252. package/dist/lib/init-pod.js.map +1 -0
  253. package/dist/lib/installed.d.ts +210 -11
  254. package/dist/lib/installed.js +234 -36
  255. package/dist/lib/installed.js.map +1 -1
  256. package/dist/lib/key-approval.d.ts +57 -0
  257. package/dist/lib/key-approval.js +117 -0
  258. package/dist/lib/key-approval.js.map +1 -0
  259. package/dist/lib/key-diagnosis.d.ts +56 -0
  260. package/dist/lib/key-diagnosis.js +227 -0
  261. package/dist/lib/key-diagnosis.js.map +1 -0
  262. package/dist/lib/key-doctor.d.ts +136 -0
  263. package/dist/lib/key-doctor.js +286 -0
  264. package/dist/lib/key-doctor.js.map +1 -0
  265. package/dist/lib/key-locations.d.ts +120 -0
  266. package/dist/lib/key-locations.js +326 -0
  267. package/dist/lib/key-locations.js.map +1 -0
  268. package/dist/lib/key-source.d.ts +66 -0
  269. package/dist/lib/key-source.js +106 -0
  270. package/dist/lib/key-source.js.map +1 -0
  271. package/dist/lib/key-state.d.ts +70 -0
  272. package/dist/lib/key-state.js +115 -0
  273. package/dist/lib/key-state.js.map +1 -0
  274. package/dist/lib/kind-package.d.ts +181 -0
  275. package/dist/lib/kind-package.js +679 -0
  276. package/dist/lib/kind-package.js.map +1 -0
  277. package/dist/lib/knowledge-title.d.ts +24 -0
  278. package/dist/lib/knowledge-title.js +46 -0
  279. package/dist/lib/knowledge-title.js.map +1 -0
  280. package/dist/lib/knowledge-title.test.d.ts +1 -0
  281. package/dist/lib/knowledge-title.test.js +34 -0
  282. package/dist/lib/knowledge-title.test.js.map +1 -0
  283. package/dist/lib/machine-instance.d.ts +64 -0
  284. package/dist/lib/machine-instance.js +142 -0
  285. package/dist/lib/machine-instance.js.map +1 -0
  286. package/dist/lib/mcp-bridge.d.ts +42 -0
  287. package/dist/lib/mcp-bridge.js +147 -0
  288. package/dist/lib/mcp-bridge.js.map +1 -0
  289. package/dist/lib/mcp-bridge.test.d.ts +1 -0
  290. package/dist/lib/mcp-bridge.test.js +90 -0
  291. package/dist/lib/mcp-bridge.test.js.map +1 -0
  292. package/dist/lib/mcp-call.d.ts +30 -0
  293. package/dist/lib/mcp-call.js +107 -0
  294. package/dist/lib/mcp-call.js.map +1 -0
  295. package/dist/lib/mcp-snippets.d.ts +53 -0
  296. package/dist/lib/mcp-snippets.js +82 -0
  297. package/dist/lib/mcp-snippets.js.map +1 -0
  298. package/dist/lib/next-steps.d.ts +8 -0
  299. package/dist/lib/next-steps.js +31 -1
  300. package/dist/lib/next-steps.js.map +1 -1
  301. package/dist/lib/package-wire.d.ts +179 -0
  302. package/dist/lib/package-wire.js +68 -0
  303. package/dist/lib/package-wire.js.map +1 -0
  304. package/dist/lib/pair-link.d.ts +38 -0
  305. package/dist/lib/pair-link.js +68 -0
  306. package/dist/lib/pair-link.js.map +1 -0
  307. package/dist/lib/pod-wide.d.ts +40 -0
  308. package/dist/lib/pod-wide.js +46 -0
  309. package/dist/lib/pod-wide.js.map +1 -0
  310. package/dist/lib/pod.d.ts +66 -112
  311. package/dist/lib/pod.js +134 -412
  312. package/dist/lib/pod.js.map +1 -1
  313. package/dist/lib/project-ref.d.ts +9 -3
  314. package/dist/lib/project-ref.js +10 -4
  315. package/dist/lib/project-ref.js.map +1 -1
  316. package/dist/lib/review-credential.d.ts +119 -0
  317. package/dist/lib/review-credential.js +147 -0
  318. package/dist/lib/review-credential.js.map +1 -0
  319. package/dist/lib/safe-open.d.ts +49 -0
  320. package/dist/lib/safe-open.js +119 -0
  321. package/dist/lib/safe-open.js.map +1 -0
  322. package/dist/lib/session-lens.d.ts +40 -1
  323. package/dist/lib/session-lens.js +54 -4
  324. package/dist/lib/session-lens.js.map +1 -1
  325. package/dist/lib/superwhisper-import.d.ts +8 -0
  326. package/dist/lib/superwhisper-import.js +14 -7
  327. package/dist/lib/superwhisper-import.js.map +1 -1
  328. package/dist/lib/superwhisper-title.test.d.ts +1 -0
  329. package/dist/lib/superwhisper-title.test.js +18 -0
  330. package/dist/lib/superwhisper-title.test.js.map +1 -0
  331. package/dist/lib/targets.d.ts +134 -10
  332. package/dist/lib/targets.js +962 -258
  333. package/dist/lib/targets.js.map +1 -1
  334. package/dist/lib/template-file.d.ts +4 -0
  335. package/dist/lib/template-file.js.map +1 -1
  336. package/dist/lib/template-lifecycle.d.ts +217 -0
  337. package/dist/lib/template-lifecycle.js +433 -0
  338. package/dist/lib/template-lifecycle.js.map +1 -0
  339. package/dist/lib/template-steps.d.ts +88 -0
  340. package/dist/lib/template-steps.js +118 -0
  341. package/dist/lib/template-steps.js.map +1 -0
  342. package/dist/lib/time-ago.d.ts +2 -0
  343. package/dist/lib/time-ago.js +15 -0
  344. package/dist/lib/time-ago.js.map +1 -0
  345. package/dist/utils/logger.js +5 -2
  346. package/dist/utils/logger.js.map +1 -1
  347. package/package.json +23 -17
  348. package/skills/README.md +12 -10
  349. package/skills/agent-os/SKILL.md +214 -99
  350. package/skills/manifest.json +1 -1
  351. package/skills/onboard/SKILL.md +55 -26
  352. package/skills/synap/README.md +5 -8
  353. package/skills/synap/SKILL.md +1086 -283
  354. package/skills/synap/_order.txt +7 -0
  355. package/skills/synap/_skill.yaml +1 -1
  356. package/skills/synap/automations.md +15 -0
  357. package/skills/synap/capture.md +5 -0
  358. package/skills/synap/cli-operations.md +24 -18
  359. package/skills/synap/concepts.md +28 -0
  360. package/skills/synap/content-os.md +10 -1
  361. package/skills/synap/creative-loop.md +15 -10
  362. package/skills/synap/crm.md +21 -52
  363. package/skills/synap/document-embeds.md +141 -47
  364. package/skills/synap/escalation-ladder.md +20 -10
  365. package/skills/synap/focus-sessions.md +47 -21
  366. package/skills/synap/from-intent.md +142 -0
  367. package/skills/synap/governance-rules.md +4 -4
  368. package/skills/synap/governance.md +10 -7
  369. package/skills/synap/hand-off.md +33 -0
  370. package/skills/synap/inline-patterns.md +15 -7
  371. package/skills/synap/lenses.md +33 -15
  372. package/skills/synap/linking.md +41 -40
  373. package/skills/synap/mcp-remote-servers.md +64 -0
  374. package/skills/synap/mental-model.md +17 -15
  375. package/skills/synap/operating-mode-rules.md +1 -1
  376. package/skills/synap/processes.md +118 -0
  377. package/skills/synap/quick-reference.md +5 -1
  378. package/skills/synap/reading.md +3 -1
  379. package/skills/synap/reflexes.md +12 -42
  380. package/skills/synap/viewframe-cells.md +38 -5
  381. package/skills/synap/work-flow.md +1 -1
  382. package/skills/synap/work-model.md +96 -0
  383. package/skills/synap/worked-examples.md +4 -5
  384. package/skills/synap/workspace-design.md +14 -10
  385. package/skills/synap/writes.md +97 -24
  386. package/skills/synap/writing-titles.md +63 -0
  387. package/skills/synap-app/SKILL.md +2 -2
  388. package/skills/synap-app/_skill.yaml +1 -1
  389. package/skills/synap-app/install-commands.md +1 -1
  390. package/skills/synap-design/SKILL.md +474 -0
  391. package/skills/synap-design/_order.txt +4 -0
  392. package/skills/synap-design/_skill.yaml +21 -0
  393. package/skills/synap-design/loop.md +134 -0
  394. package/skills/synap-design/overview.md +44 -0
  395. package/skills/synap-design/principles.md +130 -0
  396. package/skills/synap-design/system.md +133 -0
  397. package/skills/synap-market/SKILL.md +306 -16
  398. package/skills/synap-market/_skill.yaml +1 -1
  399. package/skills/synap-market/author-and-publish.md +145 -8
  400. package/skills/synap-market/governance-and-catalog.md +7 -0
  401. package/skills/synap-market/install.md +79 -1
  402. package/skills/synap-market/overview.md +74 -6
  403. package/skills/synap-schema/SKILL.md +172 -10
  404. package/skills/synap-schema/_order.txt +2 -0
  405. package/skills/synap-schema/_skill.yaml +4 -2
  406. package/skills/synap-schema/common-mistakes.md +4 -2
  407. package/skills/synap-schema/discover-profiles.md +1 -1
  408. package/skills/synap-schema/entity-scope.md +15 -3
  409. package/skills/synap-schema/extend-first.md +29 -0
  410. package/skills/synap-schema/extend-vs-create.md +1 -1
  411. package/skills/synap-schema/intent-vocabulary-ssot.md +111 -0
  412. package/skills/synap-schema/property-types.md +1 -1
  413. package/skills/synap-schema/relations.md +1 -1
  414. package/skills/synap-ui/SKILL.md +19 -12
  415. package/skills/synap-ui/_skill.yaml +1 -1
  416. package/skills/synap-ui/ai-companion.md +1 -1
  417. package/skills/synap-ui/arranging-bento.md +2 -0
  418. package/skills/synap-ui/bento-layouts.md +10 -10
  419. package/skills/synap-ui/bento-recipes.md +313 -543
  420. package/skills/synap-ui/four-builds.md +5 -0
  421. package/skills/synap-ui/view-types.md +2 -2
  422. package/skills/synap-ui/widget-catalog.md +22 -278
  423. package/templates/automations/bookmark-enrichment.automation.json +290 -13
  424. package/templates/automations/url-bookmark-capture.automation.json +73 -11
  425. package/templates/skills/authoring-playbooks/SKILL.md +6 -3
  426. package/templates/skills/authoring-playbooks/reference/stages-contract.md +15 -0
  427. package/templates/skills/authoring-playbooks/reference/worked-example.md +3 -0
  428. package/dist/commands/infra.d.ts +0 -21
  429. package/dist/commands/infra.js +0 -262
  430. package/dist/commands/infra.js.map +0 -1
  431. package/dist/commands/template.d.ts +0 -42
  432. package/dist/commands/template.js +0 -191
  433. package/dist/commands/template.js.map +0 -1
  434. package/dist/lib/browser-auth.d.ts +0 -35
  435. package/dist/lib/browser-auth.js +0 -170
  436. package/dist/lib/browser-auth.js.map +0 -1
  437. package/dist/lib/openclaw.d.ts +0 -32
  438. package/dist/lib/openclaw.js +0 -164
  439. package/dist/lib/openclaw.js.map +0 -1
  440. package/dist/lib/seed.d.ts +0 -13
  441. package/dist/lib/seed.js +0 -135
  442. package/dist/lib/seed.js.map +0 -1
  443. package/node_modules/@synap/hub-rest-client/dist/index.cjs +0 -1261
  444. package/node_modules/@synap/hub-rest-client/dist/index.d.cts +0 -1647
  445. package/node_modules/@synap/hub-rest-client/dist/index.d.ts +0 -1647
  446. package/node_modules/@synap/hub-rest-client/dist/index.js +0 -1231
  447. package/node_modules/@synap/hub-rest-client/package.json +0 -45
  448. package/node_modules/@synap/hub-rest-client/src/client.ts +0 -1631
  449. package/node_modules/@synap/hub-rest-client/src/errors.ts +0 -30
  450. package/node_modules/@synap/hub-rest-client/src/index.ts +0 -153
  451. package/node_modules/@synap/hub-rest-client/src/setup.ts +0 -133
  452. package/node_modules/@synap/hub-rest-client/src/types.ts +0 -1299
@@ -0,0 +1,326 @@
1
+ /**
2
+ * Every place on this computer that holds a Synap key for one pod.
3
+ *
4
+ * A key is not "configured" in one place. `synap connect claude-code` alone
5
+ * writes three copies (the CLI config, Claude Code's env, Claude Code's MCP
6
+ * registry); every other client `synap connect` supports keeps its own copy in
7
+ * its own file and format (Cursor, Codex, Windsurf, Zed, Goose, VS Code…); a
8
+ * shell rc may export another, and the ambient `SYNAP_HUB_API_KEY` silently
9
+ * beats the CLI profile. When the copies disagree, the one that wins is the one
10
+ * nobody looked at — so the doctor reads all of them, and says which FILE each
11
+ * one lives in.
12
+ *
13
+ * Two honesty rules:
14
+ * - A file it cannot read or parse is reported `unchecked` ("not checked:
15
+ * Zed — settings.json is not valid JSON"), never silently skipped — an
16
+ * unread file is not a file with no key in it.
17
+ * - `podKnown`: a key is sent to this pod (`/auth/key-state`) only when
18
+ * something ties it to THIS pod — a profile / agent key recorded for this
19
+ * pod URL, a client entry whose MCP URL is this pod, a shell rc / process env
20
+ * that also names this pod. A key with no recorded pod (an old `agentKeys`
21
+ * entry, a bare `export SYNAP_HUB_API_KEY`) may be another pod's secret, so it
22
+ * is listed but never sent.
23
+ *
24
+ * Read-only. The client files to read come in as `clients` (derived from
25
+ * `TARGETS` by the caller); everything else is derived from `home`, so tests
26
+ * run on a temp HOME and never see the person's real files.
27
+ */
28
+ import fs from "node:fs";
29
+ import path from "node:path";
30
+ import YAML from "yaml";
31
+ const norm = (u) => u.replace(/\/+$/, "");
32
+ /** File text, `null` ONLY when it does not exist; any other failure is a reason. */
33
+ function readText(file) {
34
+ try {
35
+ return { ok: true, value: fs.readFileSync(file, "utf8") };
36
+ }
37
+ catch (err) {
38
+ const code = err.code;
39
+ if (code === "ENOENT" || code === "ENOTDIR")
40
+ return { ok: true, value: null };
41
+ return { ok: false, reason: `could not be read (${code ?? err.message})` };
42
+ }
43
+ }
44
+ /** Strip // and /* *\/ comments and trailing commas OUTSIDE strings (JSONC). */
45
+ export function stripJsonc(text) {
46
+ let out = "";
47
+ let i = 0;
48
+ let inStr = false;
49
+ while (i < text.length) {
50
+ const c = text[i];
51
+ if (inStr) {
52
+ out += c;
53
+ if (c === "\\") {
54
+ out += text[i + 1] ?? "";
55
+ i += 2;
56
+ continue;
57
+ }
58
+ if (c === '"')
59
+ inStr = false;
60
+ i++;
61
+ continue;
62
+ }
63
+ if (c === '"') {
64
+ inStr = true;
65
+ out += c;
66
+ i++;
67
+ }
68
+ else if (c === "/" && text[i + 1] === "/") {
69
+ while (i < text.length && text[i] !== "\n")
70
+ i++;
71
+ }
72
+ else if (c === "/" && text[i + 1] === "*") {
73
+ const end = text.indexOf("*/", i + 2);
74
+ i = end < 0 ? text.length : end + 2;
75
+ }
76
+ else {
77
+ out += c;
78
+ i++;
79
+ }
80
+ }
81
+ return out.replace(/,(\s*[}\]])/g, "$1");
82
+ }
83
+ function readJsonObject(file, jsonc = false) {
84
+ const t = readText(file);
85
+ if (!t.ok || t.value === null)
86
+ return t;
87
+ try {
88
+ const v = JSON.parse(jsonc ? stripJsonc(t.value) : t.value);
89
+ if (!v || typeof v !== "object" || Array.isArray(v))
90
+ return { ok: false, reason: "is not a JSON object" };
91
+ return { ok: true, value: v };
92
+ }
93
+ catch (err) {
94
+ return { ok: false, reason: `is not valid JSON (${err.message})` };
95
+ }
96
+ }
97
+ /** `~/…` for display. */
98
+ export function tildify(file, home) {
99
+ return file.startsWith(home + path.sep) ? `~${file.slice(home.length)}` : file;
100
+ }
101
+ export const SHELL_RC_FILES = [".zshrc", ".zprofile", ".zshenv", ".bashrc", ".bash_profile", ".profile", ".config/fish/config.fish"];
102
+ const assignment = (name) => [
103
+ new RegExp(`^(?:export\\s+)?${name}=["']?([^"'\\s]+)["']?`),
104
+ new RegExp(`^set\\s+-[gx]+\\s+${name}\\s+["']?([^"'\\s]+)["']?`),
105
+ ];
106
+ /**
107
+ * `SYNAP_HUB_API_KEY=…` assignments in shell rc files (export / set -x /
108
+ * plain), each with the `SYNAP_POD_URL` the same file sets, if any.
109
+ */
110
+ export function shellRcAssignments(home) {
111
+ const out = [];
112
+ for (const rel of SHELL_RC_FILES) {
113
+ const file = path.join(home, rel);
114
+ let text;
115
+ try {
116
+ text = fs.readFileSync(file, "utf8");
117
+ }
118
+ catch {
119
+ continue;
120
+ }
121
+ let podUrl;
122
+ const keys = [];
123
+ text.split("\n").forEach((raw, i) => {
124
+ const line = raw.trim();
125
+ if (line.startsWith("#"))
126
+ return;
127
+ const k = assignment("SYNAP_HUB_API_KEY").map((r) => line.match(r)).find(Boolean);
128
+ if (k?.[1] && !k[1].startsWith("$"))
129
+ keys.push({ line: i + 1, key: k[1] });
130
+ const p = assignment("SYNAP_POD_URL").map((r) => line.match(r)).find(Boolean);
131
+ if (p?.[1] && !p[1].startsWith("$"))
132
+ podUrl = p[1];
133
+ });
134
+ for (const k of keys)
135
+ out.push({ file, ...k, ...(podUrl ? { podUrl } : {}) });
136
+ }
137
+ return out;
138
+ }
139
+ const BEARER = /(?:^|Authorization:\s*)Bearer\s+([^\s"']+)/i;
140
+ /** An entry of any JSON client shape: `{url|uri|serverUrl, headers}`, mcp-remote `args`, Zed `command.args`. */
141
+ function jsonEntry(name, e) {
142
+ if (!e || typeof e !== "object")
143
+ return { name };
144
+ const o = e;
145
+ const strings = [];
146
+ for (const k of ["url", "uri", "serverUrl"])
147
+ if (typeof o[k] === "string")
148
+ strings.push(o[k]);
149
+ for (const args of [o.args, o.command?.args])
150
+ if (Array.isArray(args))
151
+ strings.push(...args.filter((a) => typeof a === "string"));
152
+ const headers = { ...(o.headers ?? {}), ...(o.http_headers ?? {}), ...(o.requestInit?.headers ?? {}) };
153
+ const url = strings.find((s) => /^https?:\/\//i.test(s));
154
+ let key;
155
+ for (const [h, v] of Object.entries(headers))
156
+ if (/^authorization$/i.test(h) && typeof v === "string")
157
+ key ??= v.match(BEARER)?.[1];
158
+ for (const s of strings)
159
+ key ??= /Authorization:/i.test(s) ? s.match(BEARER)?.[1] : undefined;
160
+ // mcp-remote keeps the header VALUE in env (`Authorization:${SYNAP_AUTH}` +
161
+ // `env.SYNAP_AUTH = "Bearer <key>"`) so the key is never in argv — read it there too.
162
+ for (const env of [o.env, o.command?.env])
163
+ if (env && typeof env === "object")
164
+ for (const v of Object.values(env))
165
+ if (typeof v === "string")
166
+ key ??= v.match(BEARER)?.[1];
167
+ return { name, url, key };
168
+ }
169
+ const JSON_CONTAINERS = ["mcpServers", "servers", "mcp", "context_servers"];
170
+ function jsonEntries(obj) {
171
+ const out = [];
172
+ for (const c of JSON_CONTAINERS) {
173
+ const box = obj[c];
174
+ if (box && typeof box === "object" && !Array.isArray(box))
175
+ for (const [name, e] of Object.entries(box))
176
+ out.push({ ...jsonEntry(name, e), name: `${c}.${name}` });
177
+ }
178
+ return out;
179
+ }
180
+ /** `[mcp_servers.<name>]` tables (Codex, Grok): `url = "…"` + a `Bearer …` header line. */
181
+ export function tomlEntries(text) {
182
+ const out = [];
183
+ const parts = text.split(/^\s*\[([^\]\n]+)\]\s*$/m);
184
+ for (let i = 1; i < parts.length; i += 2) {
185
+ const header = parts[i].trim();
186
+ if (!header.startsWith("mcp_servers."))
187
+ continue;
188
+ const body = parts[i + 1] ?? "";
189
+ out.push({
190
+ name: `[${header}]`,
191
+ url: body.match(/^\s*url\s*=\s*"([^"]+)"/m)?.[1],
192
+ key: body.match(/Authorization\s*=\s*"Bearer\s+([^"\s]+)"/i)?.[1],
193
+ });
194
+ }
195
+ return out;
196
+ }
197
+ /** Goose `extensions:` (YAML): `uri` + `headers.Authorization`. */
198
+ function gooseEntries(doc) {
199
+ const ext = doc?.extensions;
200
+ if (!ext || typeof ext !== "object")
201
+ return [];
202
+ return Object.entries(ext).map(([name, e]) => ({ ...jsonEntry(name, e), name: `extensions.${name}` }));
203
+ }
204
+ /** The entries of one client file, or why it could not be read. */
205
+ function readClientEntries(c) {
206
+ if (c.format === "json" || c.format === "jsonc") {
207
+ const r = readJsonObject(c.file, c.format === "jsonc");
208
+ return r.ok ? { ok: true, value: r.value ? jsonEntries(r.value) : null } : r;
209
+ }
210
+ const t = readText(c.file);
211
+ if (!t.ok || t.value === null)
212
+ return t;
213
+ if (c.format === "toml")
214
+ return { ok: true, value: tomlEntries(t.value) };
215
+ try {
216
+ return { ok: true, value: gooseEntries(YAML.parse(t.value)) };
217
+ }
218
+ catch (err) {
219
+ return { ok: false, reason: `is not valid YAML (${err.message.split("\n")[0]})` };
220
+ }
221
+ }
222
+ export function collectKeyInventory(input) {
223
+ const { home } = input;
224
+ const pod = norm(input.podUrl);
225
+ const out = [];
226
+ const unchecked = [];
227
+ const configFile = path.join(home, ".synap", "config.json");
228
+ const cfgLabel = tildify(configFile, home);
229
+ const cfgRead = readJsonObject(configFile);
230
+ if (!cfgRead.ok)
231
+ unchecked.push({ tool: "Synap CLI", file: cfgLabel, reason: cfgRead.reason });
232
+ const cfg = (cfgRead.ok ? cfgRead.value : null) ?? {};
233
+ const onPod = (u) => !!u && norm(u) === pod;
234
+ const isPodMcp = (u) => !!u && (norm(u) === `${pod}/mcp` || norm(u).startsWith(`${pod}/mcp?`) || norm(u).startsWith(`${pod}/mcp/`));
235
+ // 1. Pod profiles (the person's / this computer's own key) for this pod.
236
+ const pods = (cfg.pods ?? {});
237
+ for (const [name, p] of Object.entries(pods)) {
238
+ if (onPod(p?.podUrl) && p.hubApiKey)
239
+ out.push({ kind: "profile", label: `${cfgLabel} → pods.${name}`, file: configFile, role: "person", key: p.hubApiKey, rewritable: false, ref: name, podKnown: true });
240
+ }
241
+ const byPod = (cfg.agentKeysByPod ?? {});
242
+ for (const [surface, map] of Object.entries(byPod)) {
243
+ const hit = map?.[pod] ?? Object.entries(map ?? {}).find(([u]) => norm(u) === pod)?.[1];
244
+ if (hit?.hubApiKey)
245
+ out.push({ kind: "agent-key-by-pod", label: `${cfgLabel} → agentKeysByPod.${surface}`, file: configFile, role: "agent", surface, key: hit.hubApiKey, agentUserId: hit.agentUserId, rewritable: true, podKnown: true });
246
+ }
247
+ const legacy = (cfg.agentKeys ?? {});
248
+ for (const [surface, k] of Object.entries(legacy)) {
249
+ if (!k?.hubApiKey)
250
+ continue;
251
+ if (k.podUrl && !onPod(k.podUrl))
252
+ continue;
253
+ // No recorded pod: it may be another pod's key — listed, never sent.
254
+ out.push({ kind: "agent-key", label: `${cfgLabel} → agentKeys.${surface}`, file: configFile, role: "agent", surface, key: k.hubApiKey, agentUserId: k.agentUserId, rewritable: true, podKnown: !!k.podUrl });
255
+ }
256
+ const pending = (cfg.pendingAgentKeys ?? {});
257
+ for (const [surface, map] of Object.entries(pending)) {
258
+ const hit = map?.[pod];
259
+ if (hit?.hubApiKey)
260
+ out.push({ kind: "pending", label: `${cfgLabel} → pendingAgentKeys.${surface}`, file: configFile, role: "agent", surface, key: hit.hubApiKey, agentUserId: hit.agentUserId, rewritable: true, podKnown: true });
261
+ }
262
+ // 3. Each client's own config file — one parser per format.
263
+ for (const c of input.clients ?? []) {
264
+ const shown = tildify(c.file, home);
265
+ if (c.format === "claude-code") {
266
+ // Claude Code: its env block (the ambient SYNAP_HUB_API_KEY inside every
267
+ // Claude session) and its MCP registry headers in ~/.claude.json.
268
+ const settings = readJsonObject(c.file);
269
+ if (!settings.ok)
270
+ unchecked.push({ tool: c.tool, file: shown, reason: settings.reason });
271
+ const env = ((settings.ok && settings.value?.env) || {});
272
+ if (env.SYNAP_HUB_API_KEY && (!env.SYNAP_POD_URL || onPod(env.SYNAP_POD_URL)))
273
+ out.push({ kind: "claude-settings-env", label: `${shown} → env.SYNAP_HUB_API_KEY`, file: c.file, role: "agent", surface: c.surface, key: env.SYNAP_HUB_API_KEY, rewritable: true, podKnown: onPod(env.SYNAP_POD_URL) });
274
+ const claudeJsonFile = path.join(home, ".claude.json");
275
+ const claudeJson = readJsonObject(claudeJsonFile);
276
+ if (!claudeJson.ok)
277
+ unchecked.push({ tool: c.tool, file: tildify(claudeJsonFile, home), reason: claudeJson.reason });
278
+ const servers = ((claudeJson.ok && claudeJson.value?.mcpServers) || {});
279
+ for (const [name, s] of Object.entries(servers)) {
280
+ const e = jsonEntry(name, s);
281
+ if (isPodMcp(e.url) && e.key)
282
+ out.push({ kind: "claude-mcp-header", label: `${tildify(claudeJsonFile, home)} → mcpServers.${name}`, file: claudeJsonFile, role: "agent", surface: c.surface, key: e.key, rewritable: true, ref: name, podKnown: true });
283
+ }
284
+ continue;
285
+ }
286
+ const r = readClientEntries(c);
287
+ if (!r.ok) {
288
+ unchecked.push({ tool: c.tool, file: shown, reason: r.reason });
289
+ continue;
290
+ }
291
+ for (const e of r.value ?? []) {
292
+ if (!isPodMcp(e.url) || !e.key)
293
+ continue;
294
+ out.push({ kind: "client-config", label: `${shown} → ${e.name}`, file: c.file, role: "agent", surface: c.surface, key: e.key, rewritable: true, ref: e.name, podKnown: true });
295
+ }
296
+ }
297
+ // 4. Shell rc exports, and the process environment itself. A file that pins
298
+ // ANOTHER pod is that pod's business; one that pins none is unknown.
299
+ for (const a of shellRcAssignments(home)) {
300
+ if (a.podUrl && !onPod(a.podUrl))
301
+ continue;
302
+ out.push({ kind: "shell-rc", label: `${tildify(a.file, home)}:${a.line}`, file: a.file, role: "agent", key: a.key, rewritable: false, ref: String(a.line), podKnown: onPod(a.podUrl) });
303
+ }
304
+ if (input.envKey && (!input.envPodUrl || onPod(input.envPodUrl)))
305
+ out.push({ kind: "process-env", label: "SYNAP_HUB_API_KEY (this shell)", role: "agent", key: input.envKey, rewritable: false, podKnown: onPod(input.envPodUrl) });
306
+ return { locations: out, unchecked };
307
+ }
308
+ /** The locations only (see {@link collectKeyInventory}). */
309
+ export function collectKeyLocations(input) {
310
+ return collectKeyInventory(input).locations;
311
+ }
312
+ /**
313
+ * The keys this pod may be asked about: those with at least one copy tied to
314
+ * this pod. Every other key stays on this computer.
315
+ */
316
+ export function keysToProbe(locations) {
317
+ return [...new Set(locations.filter((l) => l.podKnown !== false).map((l) => l.key))];
318
+ }
319
+ /**
320
+ * Which file(s) put the process env key there — the settings env Claude Code
321
+ * injects, or a shell rc. Empty = set by something the doctor cannot see.
322
+ */
323
+ export function envKeySetBy(locations, envKey) {
324
+ return locations.filter((l) => (l.kind === "claude-settings-env" || l.kind === "shell-rc") && l.key === envKey);
325
+ }
326
+ //# sourceMappingURL=key-locations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key-locations.js","sourceRoot":"","sources":["../../src/lib/key-locations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Which path supplied the winning API key — report-only mirror of
3
+ * `resolveHubConfig`'s ladder (hub-client.ts). Does NOT resolve the key itself;
4
+ * callers still go through `resolveHubConfig`. This module answers "why did we
5
+ * get THIS key" so doctor/whoami can name the source without re-deriving
6
+ * precedence (and without diverging from it).
7
+ *
8
+ * The claude-code surface-over-env preference also lives here so hub-client and
9
+ * whoami cannot drift on that rule.
10
+ */
11
+ /** Rungs of the key ladder, highest precedence first — matches resolveHubConfig steps. */
12
+ export type KeySource = "flag" | "agent" | "env-surface" | "env" | "profile";
13
+ export interface KeySourceInfo {
14
+ source: KeySource;
15
+ /** Concrete origin: env var name, agent name, profile name, "--pod", etc. */
16
+ detail?: string;
17
+ }
18
+ /** Human wording for each key source — used verbatim in doctor/whoami. */
19
+ export declare const KEY_SOURCE_LABEL: Record<KeySource, string>;
20
+ /** Ready-to-print origin, parallel to `LensFieldProvenance.origin`. */
21
+ export declare function formatKeySource(info: KeySourceInfo): string;
22
+ /**
23
+ * Prefer the claude-code surface key when it is pinned to the same pod and
24
+ * differs from the ambient env key. Pure — no stderr, no IO. Callers that need
25
+ * the swap warning (hub-client) write it themselves when `usedSurface` is true.
26
+ *
27
+ * Mirrors hub-client resolveHubConfig step 3 surface guard exactly.
28
+ */
29
+ export declare function preferClaudeCodeSurfaceKey(input: {
30
+ envPod: string;
31
+ envKey: string;
32
+ envUser: string;
33
+ surface: {
34
+ podUrl?: string;
35
+ hubApiKey: string;
36
+ agentUserId?: string;
37
+ } | null | undefined;
38
+ }): {
39
+ apiKey: string;
40
+ userId: string;
41
+ usedSurface: boolean;
42
+ };
43
+ /**
44
+ * Classify the winning key path given pre-read inputs. Pure and order-driven —
45
+ * first match wins, same ladder as `resolveHubConfig` steps 0–4.
46
+ */
47
+ export declare function classifyKeySource(input: {
48
+ podOverride?: boolean;
49
+ /** Explicit command flags supplied both podUrl and apiKey. */
50
+ flagApiKey?: boolean;
51
+ agentName?: string | null;
52
+ envPod?: string;
53
+ envKey?: string;
54
+ envUser?: string;
55
+ /** True when preferClaudeCodeSurfaceKey would swap in the surface key. */
56
+ surfacePrefersOverEnv?: boolean;
57
+ profileName?: string | null;
58
+ }): KeySourceInfo;
59
+ /**
60
+ * Report which path would supply the API key for this invocation.
61
+ * Reads the same doors as resolveHubConfig; never returns the secret.
62
+ */
63
+ export declare function resolveKeySource(opts?: {
64
+ podUrl?: string;
65
+ apiKey?: string;
66
+ }): KeySourceInfo;
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Which path supplied the winning API key — report-only mirror of
3
+ * `resolveHubConfig`'s ladder (hub-client.ts). Does NOT resolve the key itself;
4
+ * callers still go through `resolveHubConfig`. This module answers "why did we
5
+ * get THIS key" so doctor/whoami can name the source without re-deriving
6
+ * precedence (and without diverging from it).
7
+ *
8
+ * The claude-code surface-over-env preference also lives here so hub-client and
9
+ * whoami cannot drift on that rule.
10
+ */
11
+ import { getActivePodConfig, getPodOverride, getSurfaceAgentKey, listPodProfiles } from "./pod.js";
12
+ import { resolveAgentOverride } from "./agents-config.js";
13
+ /** Human wording for each key source — used verbatim in doctor/whoami. */
14
+ export const KEY_SOURCE_LABEL = {
15
+ flag: "explicit flag",
16
+ agent: "agent override",
17
+ "env-surface": "claude-code surface key",
18
+ env: "environment variable",
19
+ profile: "pod profile",
20
+ };
21
+ /** Ready-to-print origin, parallel to `LensFieldProvenance.origin`. */
22
+ export function formatKeySource(info) {
23
+ return info.detail
24
+ ? `${KEY_SOURCE_LABEL[info.source]}: ${info.detail}`
25
+ : KEY_SOURCE_LABEL[info.source];
26
+ }
27
+ /**
28
+ * Prefer the claude-code surface key when it is pinned to the same pod and
29
+ * differs from the ambient env key. Pure — no stderr, no IO. Callers that need
30
+ * the swap warning (hub-client) write it themselves when `usedSurface` is true.
31
+ *
32
+ * Mirrors hub-client resolveHubConfig step 3 surface guard exactly.
33
+ */
34
+ export function preferClaudeCodeSurfaceKey(input) {
35
+ const s = input.surface;
36
+ // Trailing-slash-tolerant: surface keys and env pods are often saved with
37
+ // slightly different URL shapes after multi-pod connect.
38
+ const norm = (u) => u.replace(/\/+$/, "");
39
+ if (s &&
40
+ s.podUrl &&
41
+ norm(s.podUrl) === norm(input.envPod) &&
42
+ s.hubApiKey &&
43
+ s.hubApiKey !== input.envKey) {
44
+ return {
45
+ apiKey: s.hubApiKey,
46
+ userId: s.agentUserId || input.envUser,
47
+ usedSurface: true,
48
+ };
49
+ }
50
+ return { apiKey: input.envKey, userId: input.envUser, usedSurface: false };
51
+ }
52
+ /**
53
+ * Classify the winning key path given pre-read inputs. Pure and order-driven —
54
+ * first match wins, same ladder as `resolveHubConfig` steps 0–4.
55
+ */
56
+ export function classifyKeySource(input) {
57
+ if (input.podOverride)
58
+ return { source: "flag", detail: "--pod" };
59
+ if (input.flagApiKey)
60
+ return { source: "flag" };
61
+ if (input.agentName)
62
+ return { source: "agent", detail: input.agentName };
63
+ if (input.envPod && input.envKey && input.envUser) {
64
+ if (input.surfacePrefersOverEnv) {
65
+ return { source: "env-surface", detail: "claude-code" };
66
+ }
67
+ return { source: "env", detail: "SYNAP_HUB_API_KEY" };
68
+ }
69
+ return {
70
+ source: "profile",
71
+ detail: input.profileName ?? undefined,
72
+ };
73
+ }
74
+ /**
75
+ * Report which path would supply the API key for this invocation.
76
+ * Reads the same doors as resolveHubConfig; never returns the secret.
77
+ */
78
+ export function resolveKeySource(opts) {
79
+ const envPod = process.env.SYNAP_POD_URL;
80
+ const envKey = process.env.SYNAP_HUB_API_KEY;
81
+ const envUser = process.env.SYNAP_USER_ID;
82
+ // Pod-qualified lookup so a surface key for another pod never shadows env.
83
+ const surface = getSurfaceAgentKey("claude-code", envPod);
84
+ const surfacePrefersOverEnv = Boolean(envPod &&
85
+ envKey &&
86
+ envUser &&
87
+ preferClaudeCodeSurfaceKey({
88
+ envPod,
89
+ envKey,
90
+ envUser,
91
+ surface,
92
+ }).usedSurface);
93
+ const activeName = listPodProfiles().find((p) => p.active)?.name ?? null;
94
+ return classifyKeySource({
95
+ podOverride: Boolean(getPodOverride()),
96
+ flagApiKey: Boolean(opts?.podUrl && opts?.apiKey),
97
+ agentName: resolveAgentOverride() ? process.env.SYNAP_AGENT ?? null : null,
98
+ envPod,
99
+ envKey,
100
+ envUser,
101
+ surfacePrefersOverEnv,
102
+ // Only meaningful when the profile rung wins; still pass for completeness.
103
+ profileName: activeName ?? (getActivePodConfig() ? "default" : null),
104
+ });
105
+ }
106
+ //# sourceMappingURL=key-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key-source.js","sourceRoot":"","sources":["../../src/lib/key-source.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * What the pod says about ONE key — asked by its holder.
3
+ *
4
+ * `GET /api/hub/auth/key-state` answers for a key whether or not it
5
+ * authenticates: active, awaiting approval (+ the approval page), revoked (+
6
+ * why, and when/where a replacing connection was made), expired, or unknown.
7
+ * A pod older than that door answers 404; we then fall back to `/auth/status`,
8
+ * which can only say "works" or "does not work" — reported as `inactive`, never
9
+ * guessed into "revoked" (that guess is what sent the 2026-10-12 incident down
10
+ * the wrong path: the key was only awaiting approval).
11
+ *
12
+ * Also the ONE write gate: a key is persisted into a config only when the pod
13
+ * has not positively said it is unusable (`writeGate`).
14
+ */
15
+ export type KeyStateName = "active" | "awaiting_approval" | "revoked" | "expired" | "unknown"
16
+ /** Older pod: the key does not authenticate, and the pod cannot say why. */
17
+ | "inactive"
18
+ /** The pod could not be asked (network, 5xx). Not evidence either way. */
19
+ | "unreachable";
20
+ export interface KeyState {
21
+ state: KeyStateName;
22
+ keyIdPrefix?: string;
23
+ keyId?: string;
24
+ agentType?: string | null;
25
+ instanceId?: string | null;
26
+ /** The computer's name this key was made on; null = unlabelled (older CLI). */
27
+ instanceLabel?: string | null;
28
+ createdAt?: string;
29
+ expiresAt?: string | null;
30
+ approvalUrl?: string;
31
+ revokedAt?: string | null;
32
+ revokedReason?: string | null;
33
+ replacedBy?: {
34
+ createdAt: string;
35
+ instanceId: string | null;
36
+ instanceLabel?: string | null;
37
+ } | null;
38
+ /** True when the answer came from the `/auth/status` fallback (older pod). */
39
+ legacy?: boolean;
40
+ /** `unreachable`, or the HTTP refusal behind an `inactive`. */
41
+ error?: string;
42
+ }
43
+ export type FetchLike = (url: string, init?: RequestInit) => Promise<Response>;
44
+ /** Ask the pod about `key`. Never throws. */
45
+ export declare function fetchKeyState(podUrl: string, key: string, deps?: {
46
+ fetch?: FetchLike;
47
+ timeoutMs?: number;
48
+ }): Promise<KeyState>;
49
+ export type WriteGate = {
50
+ allow: true;
51
+ warning?: string;
52
+ } | {
53
+ allow: false;
54
+ reason: string;
55
+ };
56
+ /**
57
+ * May this key be written into a config? Only a POSITIVE "unusable" refuses:
58
+ * pending, revoked, expired, unknown to the pod, or (older pod) rejected. An
59
+ * unreachable pod is not evidence — it allows, with a warning.
60
+ */
61
+ export declare function writeGate(s: KeyState): WriteGate;
62
+ /** Thrown when a caller tries to persist a key the pod says is unusable. */
63
+ export declare class KeyNotLiveError extends Error {
64
+ readonly keyState: KeyState;
65
+ constructor(keyState: KeyState, reason: string);
66
+ }
67
+ /** Ask the pod, then refuse (throw) unless the key may be written. */
68
+ export declare function assertKeyWritable(podUrl: string, key: string, deps?: {
69
+ fetch?: FetchLike;
70
+ }): Promise<KeyState>;