xaq-cli 0.0.0 → 0.1.0-nightly.71

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 (227) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +79 -0
  3. package/dist/admin-5gThRwgj.js +162 -0
  4. package/dist/admin-5gThRwgj.js.map +1 -0
  5. package/dist/admin-Btrm8mCd.js +218 -0
  6. package/dist/admin-Btrm8mCd.js.map +1 -0
  7. package/dist/admin-CWofnT_Q.js +2 -0
  8. package/dist/api-BFpElwqK.js +89 -0
  9. package/dist/api-BFpElwqK.js.map +1 -0
  10. package/dist/audit-BB7jK9Z5.js +2 -0
  11. package/dist/audit-BVYknW2i.js +79 -0
  12. package/dist/audit-BVYknW2i.js.map +1 -0
  13. package/dist/auth-CXmBdMqw.js +2 -0
  14. package/dist/auth-D-GmwNv-.js +550 -0
  15. package/dist/auth-D-GmwNv-.js.map +1 -0
  16. package/dist/brand--ZB8jTn1.js +32 -0
  17. package/dist/brand--ZB8jTn1.js.map +1 -0
  18. package/dist/bus-Cz0flS37.js +12 -0
  19. package/dist/bus-Cz0flS37.js.map +1 -0
  20. package/dist/bus-OKIGut72.js +2 -0
  21. package/dist/cli.js +234 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/commands-BNVLjYXA.js +167 -0
  24. package/dist/commands-BNVLjYXA.js.map +1 -0
  25. package/dist/commands-CdA6-WE7.js +112 -0
  26. package/dist/commands-CdA6-WE7.js.map +1 -0
  27. package/dist/config-C9XmYZWO.js +94 -0
  28. package/dist/config-C9XmYZWO.js.map +1 -0
  29. package/dist/config-CNVi0v5t.js +2 -0
  30. package/dist/connect-TtJ9n0Rw.js +362 -0
  31. package/dist/connect-TtJ9n0Rw.js.map +1 -0
  32. package/dist/content-C1lKMxFS.js +1170 -0
  33. package/dist/content-C1lKMxFS.js.map +1 -0
  34. package/dist/content-worker.js +28 -0
  35. package/dist/content-worker.js.map +1 -0
  36. package/dist/crypto-fv2fj3S8.js +75 -0
  37. package/dist/crypto-fv2fj3S8.js.map +1 -0
  38. package/dist/db-BEUEUPyP.js +561 -0
  39. package/dist/db-BEUEUPyP.js.map +1 -0
  40. package/dist/db-Q5BQuwga.js +2 -0
  41. package/dist/errors-FbMS3QBo.js +39 -0
  42. package/dist/errors-FbMS3QBo.js.map +1 -0
  43. package/dist/filter-Ck6OMxvu.js +158 -0
  44. package/dist/filter-Ck6OMxvu.js.map +1 -0
  45. package/dist/hermes-CKyzt1mH.js +3 -0
  46. package/dist/hermes-DHnDTYJp.js +1023 -0
  47. package/dist/hermes-DHnDTYJp.js.map +1 -0
  48. package/dist/import-DsN5NZT3.js +910 -0
  49. package/dist/import-DsN5NZT3.js.map +1 -0
  50. package/dist/instance-CwWbFbJ8.js +2 -0
  51. package/dist/instance-Dj9TpJB2.js +195 -0
  52. package/dist/instance-Dj9TpJB2.js.map +1 -0
  53. package/dist/listen-B9iO7HgQ.js +1568 -0
  54. package/dist/listen-B9iO7HgQ.js.map +1 -0
  55. package/dist/listen-CXVKG9XD.js +2 -0
  56. package/dist/manage-Bo6COB4p.js +477 -0
  57. package/dist/manage-Bo6COB4p.js.map +1 -0
  58. package/dist/manage-DoXqvjnU.js +2 -0
  59. package/dist/mcpheader-B8c5YO1B.js +2 -0
  60. package/dist/mcpheader-C9H4vudu.js +185 -0
  61. package/dist/mcpheader-C9H4vudu.js.map +1 -0
  62. package/dist/mcpsetup-BnHudwpq.js +2 -0
  63. package/dist/mcpsetup-DXXo2qjf.js +1053 -0
  64. package/dist/mcpsetup-DXXo2qjf.js.map +1 -0
  65. package/dist/node-check-CjTk6VNL.js +24 -0
  66. package/dist/node-check-CjTk6VNL.js.map +1 -0
  67. package/dist/paths-d-C2kdjo.js +2 -0
  68. package/dist/paths-yzOKD6ow.js +46 -0
  69. package/dist/paths-yzOKD6ow.js.map +1 -0
  70. package/dist/profile-CcMZ4hn7.js +2 -0
  71. package/dist/profile-NmMKAczz.js +222 -0
  72. package/dist/profile-NmMKAczz.js.map +1 -0
  73. package/dist/prompt-CKMQx_MJ.js +114 -0
  74. package/dist/prompt-CKMQx_MJ.js.map +1 -0
  75. package/dist/recipes-C7TIDlRj.js +3 -0
  76. package/dist/recipes-DG_-doGq.js +314 -0
  77. package/dist/recipes-DG_-doGq.js.map +1 -0
  78. package/dist/send-Dk-t8ia-.js +108 -0
  79. package/dist/send-Dk-t8ia-.js.map +1 -0
  80. package/dist/server-CDqDp1q3.js +20640 -0
  81. package/dist/server-CDqDp1q3.js.map +1 -0
  82. package/dist/service-BVn3soZZ.js +766 -0
  83. package/dist/service-BVn3soZZ.js.map +1 -0
  84. package/dist/service-BaWGPmSd.js +2 -0
  85. package/dist/service-C7jfo-Ex.js +457 -0
  86. package/dist/service-C7jfo-Ex.js.map +1 -0
  87. package/dist/service-DxDyKDQ-.js +2 -0
  88. package/dist/settings-B5qSHxRM.js +134 -0
  89. package/dist/settings-B5qSHxRM.js.map +1 -0
  90. package/dist/settings-DQvZaMN1.js +2 -0
  91. package/dist/setup-token-CwuSzfLK.js +48 -0
  92. package/dist/setup-token-CwuSzfLK.js.map +1 -0
  93. package/dist/skill/SKILL.md +445 -0
  94. package/dist/skill-1UQj3qgW.js +69 -0
  95. package/dist/skill-1UQj3qgW.js.map +1 -0
  96. package/dist/skill-pelq18JQ.js +2 -0
  97. package/dist/ssrf-BlVpGZ7C.js +181 -0
  98. package/dist/ssrf-BlVpGZ7C.js.map +1 -0
  99. package/dist/types-BhJDbSzE.js +135 -0
  100. package/dist/types-BhJDbSzE.js.map +1 -0
  101. package/dist/ui-B8Sd4Y7Y.js +81 -0
  102. package/dist/ui-B8Sd4Y7Y.js.map +1 -0
  103. package/dist/urls-Dp8pBGMU.js +2 -0
  104. package/dist/urls-U_LfYV61.js +27 -0
  105. package/dist/urls-U_LfYV61.js.map +1 -0
  106. package/dist/version-BxH7OuWD.js +20 -0
  107. package/dist/version-BxH7OuWD.js.map +1 -0
  108. package/dist/web/assets/_agentId-DonOCOlC.js +1 -0
  109. package/dist/web/assets/_app-B7t5lEia.js +1 -0
  110. package/dist/web/assets/_app-DMTGqYpM.js +65 -0
  111. package/dist/web/assets/_connectionId-DR5vFXOg.js +1 -0
  112. package/dist/web/assets/_webhookId-LfUlsULp.js +1 -0
  113. package/dist/web/assets/account-status-CEszs13C.js +1 -0
  114. package/dist/web/assets/accounts-5m7aiXuZ.js +1 -0
  115. package/dist/web/assets/accounts-list-YfJzThZa.js +1 -0
  116. package/dist/web/assets/activity-DOIe7SAg.js +1 -0
  117. package/dist/web/assets/add-connection-C8JR-13R.js +1 -0
  118. package/dist/web/assets/agent-create-form-CPxnPYH4.js +1 -0
  119. package/dist/web/assets/agents-B2Qj5KxT.js +1 -0
  120. package/dist/web/assets/approvals-BGaVaoFy.js +1 -0
  121. package/dist/web/assets/approve._id-BLrQnzPM.js +1 -0
  122. package/dist/web/assets/arrow-left-DZVAXoKj.js +1 -0
  123. package/dist/web/assets/arrow-right-C2zcqRr2.js +1 -0
  124. package/dist/web/assets/attention-gO9Nw5uW.js +1 -0
  125. package/dist/web/assets/audit-BPXXre8S.js +1 -0
  126. package/dist/web/assets/audit-bits-CGyIprzK.js +1 -0
  127. package/dist/web/assets/bell-ring-ig3zn1iS.js +1 -0
  128. package/dist/web/assets/bot-Zk76q_39.js +1 -0
  129. package/dist/web/assets/calendar-notice-DsCfq3VJ.js +1 -0
  130. package/dist/web/assets/calendar-plus-Cycfkk0y.js +1 -0
  131. package/dist/web/assets/calendar-setup-Pn61Wj1n.js +2 -0
  132. package/dist/web/assets/card-GSO5o-Ug.js +1 -0
  133. package/dist/web/assets/check-check-Ds1bPIGv.js +1 -0
  134. package/dist/web/assets/checkbox-B937U-Fd.js +1 -0
  135. package/dist/web/assets/chevron-right-Cqh4mDk1.js +1 -0
  136. package/dist/web/assets/chips-input-2xWDofmE.js +1 -0
  137. package/dist/web/assets/choice-cards-CgAIqBGX.js +1 -0
  138. package/dist/web/assets/circle-x-DcU-0zVh.js +1 -0
  139. package/dist/web/assets/command-khhto70y.js +1 -0
  140. package/dist/web/assets/common-BPZV8TFb.js +1 -0
  141. package/dist/web/assets/connect-agent-guide-CJdw31p2.js +1 -0
  142. package/dist/web/assets/connect-host-lr2c3xWh.js +6 -0
  143. package/dist/web/assets/connection-row-DYx_5o0c.js +1 -0
  144. package/dist/web/assets/connections-C4NOFb5R.js +1 -0
  145. package/dist/web/assets/data-table-kW1pkRB5.js +1 -0
  146. package/dist/web/assets/empty-DzTDioBP.js +1 -0
  147. package/dist/web/assets/events-C9zJnPKK.js +1 -0
  148. package/dist/web/assets/eye-B9gT1QSq.js +1 -0
  149. package/dist/web/assets/eye-off-Diktqz_g.js +1 -0
  150. package/dist/web/assets/field-C6ejurju.js +1 -0
  151. package/dist/web/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
  152. package/dist/web/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
  153. package/dist/web/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
  154. package/dist/web/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
  155. package/dist/web/assets/geist-mono-cyrillic-ext-wght-normal-X_5orZeX.woff2 +0 -0
  156. package/dist/web/assets/geist-mono-cyrillic-wght-normal-DiZS0aHC.woff2 +0 -0
  157. package/dist/web/assets/geist-mono-latin-ext-wght-normal-Bwz-egvJ.woff2 +0 -0
  158. package/dist/web/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2 +0 -0
  159. package/dist/web/assets/geist-mono-symbols2-wght-normal-CO5SzqOn.woff2 +0 -0
  160. package/dist/web/assets/geist-mono-vietnamese-wght-normal-DadHysG0.woff2 +0 -0
  161. package/dist/web/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
  162. package/dist/web/assets/get-started-C38bq1gZ.js +2 -0
  163. package/dist/web/assets/hidden-chars-Dr9TxfvF.js +1 -0
  164. package/dist/web/assets/index-DGzo3kGh.js +11 -0
  165. package/dist/web/assets/index-zKOCQLGX.css +2 -0
  166. package/dist/web/assets/input-CWwJgozn.js +1 -0
  167. package/dist/web/assets/input-group-HG8OXcJ4.js +1 -0
  168. package/dist/web/assets/label-multi-select-sH8mllw8.js +1 -0
  169. package/dist/web/assets/labels-B5UqVwFo.js +1 -0
  170. package/dist/web/assets/laptop-BxJ4Nbj7.js +1 -0
  171. package/dist/web/assets/last-call-D-O5O94z.js +1 -0
  172. package/dist/web/assets/listener-handled-HNCuVrQ7.js +1 -0
  173. package/dist/web/assets/login-DaeKclcf.js +1 -0
  174. package/dist/web/assets/mail-C5fm2pTC.js +1 -0
  175. package/dist/web/assets/mcp-call-UoOTPFyh.js +1 -0
  176. package/dist/web/assets/mcp-call-card-Cr-OEDX2.js +3 -0
  177. package/dist/web/assets/message-square-quote-se8Bf3RP.js +1 -0
  178. package/dist/web/assets/mutations-CLPqJ6cj.js +1 -0
  179. package/dist/web/assets/network-igNw0VVx.js +1 -0
  180. package/dist/web/assets/pairing-XjuaVr2u.js +1 -0
  181. package/dist/web/assets/pairing-notifier-KPzOEZSO.js +1 -0
  182. package/dist/web/assets/paperclip-znS4iTrg.js +1 -0
  183. package/dist/web/assets/password-input-DV3aqcNf.js +1 -0
  184. package/dist/web/assets/pause-o-dK3khK.js +1 -0
  185. package/dist/web/assets/pencil-DkPFAhEq.js +1 -0
  186. package/dist/web/assets/play-DvCHND93.js +1 -0
  187. package/dist/web/assets/plug-CXAniEiR.js +1 -0
  188. package/dist/web/assets/plug-zap-BwR-l5wb.js +1 -0
  189. package/dist/web/assets/plus-B_TUslu3.js +1 -0
  190. package/dist/web/assets/preload-helper-Cc_aKyUb.js +1 -0
  191. package/dist/web/assets/public-url-rF2Xjyel.js +1 -0
  192. package/dist/web/assets/queries-Cv3nXx0U.js +42 -0
  193. package/dist/web/assets/refresh-cw-Ch5FNrby.js +1 -0
  194. package/dist/web/assets/revealed-keys-C_9NtJPY.js +1 -0
  195. package/dist/web/assets/rolldown-runtime-XKyaHtl9.js +1 -0
  196. package/dist/web/assets/rotate-ccw-B-mzPDk0.js +1 -0
  197. package/dist/web/assets/search-CTVKGomS.js +1 -0
  198. package/dist/web/assets/select-Bb806bpq.js +1 -0
  199. package/dist/web/assets/send-DuMVuYs1.js +1 -0
  200. package/dist/web/assets/settings-BWauhfFf.js +1 -0
  201. package/dist/web/assets/setup-B7bNKQOp.js +1 -0
  202. package/dist/web/assets/sheet-CYPwpUsH.js +1 -0
  203. package/dist/web/assets/shield-alert-CSYB-ThV.js +1 -0
  204. package/dist/web/assets/shield-check-BulpsYqK.js +1 -0
  205. package/dist/web/assets/sparkles-CUTiob4K.js +1 -0
  206. package/dist/web/assets/stamp-BNXUGNa3.js +1 -0
  207. package/dist/web/assets/step-url-51aMNak-.js +1 -0
  208. package/dist/web/assets/stream-Du7fY5_Y.js +1 -0
  209. package/dist/web/assets/tag-I5_-1jFL.js +1 -0
  210. package/dist/web/assets/terminal-BvxDFTJc.js +1 -0
  211. package/dist/web/assets/test-email-button-DYi7V_6X.js +1 -0
  212. package/dist/web/assets/toggle-group-Bdo1gmQ1.js +1 -0
  213. package/dist/web/assets/trash-Ci0aICEl.js +1 -0
  214. package/dist/web/assets/use-delivery-speed-BBh7W2q6.js +1 -0
  215. package/dist/web/assets/use-label-names-BXicesnP.js +1 -0
  216. package/dist/web/assets/use-sign-out-CPrY_oVO.js +1 -0
  217. package/dist/web/assets/useInfiniteQuery-DJLIM8yJ.js +1 -0
  218. package/dist/web/assets/useQuery-MrTwwNy5.js +1 -0
  219. package/dist/web/assets/useRouterState-D4OBK8l5.js +1 -0
  220. package/dist/web/assets/webhook-DjeeZiNC.js +1 -0
  221. package/dist/web/assets/webhook-bits-jw-y2D3u.js +1 -0
  222. package/dist/web/assets/webhook-sheet-B8h0skDe.js +34 -0
  223. package/dist/web/assets/webhooks-Cfsdpoyd.js +1 -0
  224. package/dist/web/assets/x-MF2TZ9aG.js +1 -0
  225. package/dist/web/favicon.svg +1 -0
  226. package/dist/web/index.html +27 -0
  227. package/package.json +98 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect-TtJ9n0Rw.js","names":[],"sources":["../server/listen/connect.ts"],"sourcesContent":["import { closeSync, constants, fchmodSync, lstatSync, openSync, writeSync } from \"node:fs\";\nimport { hostname } from \"node:os\";\nimport pc from \"picocolors\";\nimport type { AgentSelf, AgentTool, PairingPoll, PairingStart, PairingStartInput } from \"../../shared/agent-api.ts\";\nimport { CAPABILITIES, type Capability } from \"../../shared/types.ts\";\nimport { ApiError, clientInfo, getSelf, pollPairing, startPairing } from \"./api.ts\";\nimport { describeGrants, hasAccess } from \"./grants.ts\";\nimport { writeClaudeMcpConfig } from \"./mcpheader.ts\";\nimport { isServiceInstalled } from \"./service.ts\";\nimport { setupMcp, mcpTarget, type McpSetupResult } from \"./mcpsetup.ts\";\nimport { defaultConsumer, validConsumer } from \"./options.ts\";\nimport { DEFAULT_PROFILE, profilePath, validProfileName } from \"./paths.ts\";\nimport { listProfiles, loadProfile, type Profile, profileExists, saveProfile } from \"./profile.ts\";\nimport { recipe, shellQuote, TOOL_LABELS, TOOLS } from \"./recipes.ts\";\nimport { checkTransport, insecureBanner, normalizeDaemonUrl } from \"./transport.ts\";\nimport { box, formatDuration, safeText, StatusLine } from \"./ui.ts\";\nimport { NPX } from \"./version.ts\";\n\nexport interface ConnectFlags {\n name?: string;\n tool?: string;\n account?: string[];\n capabilities?: string;\n reason?: string;\n profile?: string;\n consumer?: string;\n insecure?: boolean;\n force?: boolean;\n setupMcp?: boolean;\n /** Also write the output (plain text) to this file: created 0600, never through a symlink or someone else's file. */\n log?: string;\n}\n\n/** Exit codes, so scripts (and agents setting themselves up) can tell outcomes apart. */\nexport const CONNECT_EXIT = { approved: 0, error: 1, denied: 2, expired: 3, consumed: 4, cancelled: 130 } as const;\n\nexport interface ConnectOptions {\n /** Tests: poll faster than the server's interval. */\n pollIntervalMs?: number;\n signal?: AbortSignal;\n handleSignals?: boolean;\n}\n\nexport function parseTool(value: string | undefined): AgentTool {\n if (value === undefined) return \"other\";\n const v = value.trim().toLowerCase().replace(/^claude$/, \"claude-code\");\n if (!(TOOLS as readonly string[]).includes(v)) throw new Error(`Unknown --tool \"${value}\". Choose one of: ${TOOLS.join(\", \")}.`);\n return v as AgentTool;\n}\n\nexport function parseCapabilities(value: string | undefined): Capability[] | undefined {\n if (value === undefined) return undefined;\n const list = value\n .split(\",\")\n .map((s) => s.trim().toLowerCase())\n .filter(Boolean);\n const bad = list.filter((c) => !(CAPABILITIES as readonly string[]).includes(c));\n if (bad.length) throw new Error(`Unknown capabilit${bad.length > 1 ? \"ies\" : \"y\"} ${bad.join(\", \")}. Choose from: ${CAPABILITIES.join(\", \")}.`);\n return [...new Set(list)] as Capability[];\n}\n\nconst shortHost = () => hostname().replace(/\\.(local|lan|home)$/i, \"\");\n\nconst sleep = (ms: number, signal?: AbortSignal) =>\n new Promise<void>((resolve) => {\n const t = setTimeout(resolve, ms);\n signal?.addEventListener(\n \"abort\",\n () => {\n clearTimeout(t);\n resolve();\n },\n { once: true },\n );\n });\n\n// eslint-disable-next-line no-control-regex\nconst stripAnsi = (s: string) => s.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n/** --log target (fd), written in parallel with the console. */\nlet logFd: number | null = null;\nconst toLog = (s: string) => {\n if (logFd !== null) writeSync(logFd, stripAnsi(s) + \"\\n\");\n};\nconst out = (s = \"\") => {\n process.stdout.write(`${s}\\n`);\n toLog(s);\n};\nconst err = (s = \"\") => {\n process.stderr.write(`${s}\\n`);\n toLog(s);\n};\n\n/**\n * Opens --log safely: a new file is created 0600 with O_EXCL; an existing one (e.g. from `mktemp`) is\n * only reused if it is a regular file owned by us, opened without following symlinks. This is what\n * keeps another local user from pre-creating the log and reading the pairing as it happens.\n */\nexport function openConnectLog(path: string): number {\n try {\n return openSync(path, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW, 0o600);\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code !== \"EEXIST\") throw e;\n }\n const st = lstatSync(path);\n const uid = process.getuid?.();\n if (!st.isFile() || (uid !== undefined && st.uid !== uid)) throw new Error(`Refusing --log ${path}: it exists and is not a regular file owned by you.`);\n const fd = openSync(path, constants.O_WRONLY | constants.O_TRUNC | constants.O_NOFOLLOW);\n fchmodSync(fd, 0o600);\n return fd;\n}\n\nexport async function runConnect(rawUrl: string, flags: ConnectFlags, opts: ConnectOptions = {}): Promise<number> {\n if (flags.log) logFd = openConnectLog(flags.log);\n try {\n return await connect(rawUrl, flags, opts);\n } finally {\n if (logFd !== null) closeSync(logFd);\n logFd = null;\n }\n}\n\nasync function connect(rawUrl: string, flags: ConnectFlags, opts: ConnectOptions): Promise<number> {\n const url = normalizeDaemonUrl(rawUrl);\n const verdict = await checkTransport(url, { insecure: flags.insecure });\n if (verdict.warning) err(insecureBanner(verdict.warning));\n\n const profileName = validProfileName(flags.profile ?? DEFAULT_PROFILE);\n let replacing: Profile | null = null;\n if (profileExists(profileName) && flags.force) {\n try {\n replacing = loadProfile(profileName);\n } catch {\n // Unreadable: it's being replaced anyway.\n }\n }\n if (profileExists(profileName) && !flags.force) {\n let who = \"\";\n try {\n const p = loadProfile(profileName);\n who = ` (agent \"${safeText(p.agentName)}\" on ${p.url})`;\n } catch {\n // Unreadable: still don't overwrite silently.\n }\n const others = listProfiles();\n throw new Error(\n `Profile \"${profileName}\" already exists${who}.\\n` +\n ` Pair a second agent with --profile <name>${others.length > 1 ? ` (existing: ${others.join(\", \")})` : \"\"}, or replace this one with --force.`,\n );\n }\n const tool = parseTool(flags.tool);\n const capabilities = parseCapabilities(flags.capabilities);\n // --force keeps the listener's consumer, so the server-side cursor carries on (no replay, no gap).\n const consumer = validConsumer(flags.consumer ?? replacing?.consumer ?? defaultConsumer(profileName));\n const name = (flags.name?.trim() || `${tool === \"other\" ? \"Agent\" : TOOL_LABELS[tool]} on ${shortHost()}`).slice(0, 80);\n\n const input: PairingStartInput = {\n name,\n requested: {\n ...(flags.account?.length ? { accounts: flags.account } : {}),\n ...(capabilities ? { capabilities } : {}),\n ...(flags.reason ? { reason: flags.reason } : {}),\n },\n client: { ...clientInfo(), tool },\n };\n\n let start: PairingStart;\n try {\n start = await startPairing(url, input);\n } catch (e) {\n if (e instanceof ApiError && e.status === 404) {\n throw new Error(`${url} doesn't support pairing (no /agent/v1/pairings). Is this a xaq daemon, and is it up to date?`);\n }\n if (e instanceof ApiError) throw new Error(`${e.message}${e.hint ? `\\n ${e.hint}` : \"\"}`);\n throw e;\n }\n\n const links = approveLinks(url, start);\n out();\n out(\n box([\n pc.bold(\"Approve this agent in the xaq console\"),\n \"\",\n `Code: ${pc.bold(pc.yellow(safeText(start.userCode, 40)))}`,\n `Open: ${pc.cyan(safeText(links.primary, 300))}`,\n ...(links.publicUrl\n ? [` or: ${pc.cyan(safeText(links.publicUrl, 300))}`, pc.gray(` (first: the address this CLI used; second: the console's public URL setting)`)]\n : []),\n `Agent: ${safeText(name)}`,\n \"\",\n pc.gray(\"Only approve if the console shows this exact code.\"),\n ]),\n );\n out();\n\n // Ctrl-C: stop cleanly. Nothing was approved; the request just expires.\n const ac = new AbortController();\n const onAbort = () => ac.abort();\n opts.signal?.addEventListener(\"abort\", onAbort, { once: true });\n const onSigint = () => ac.abort();\n if (opts.handleSignals) process.on(\"SIGINT\", onSigint);\n\n const started = Date.now();\n const expiresAt = Date.parse(start.expiresAt) || started + 10 * 60_000;\n let interval = Math.max(1, start.interval || 5) * 1000;\n let note = \"\";\n const status = new StatusLine(process.stderr);\n status.start(\n () =>\n `Waiting for approval · ${formatDuration(Date.now() - started)} elapsed · code expires in ${formatDuration(expiresAt - Date.now())}${note ? pc.yellow(` · ${note}`) : \"\"}`,\n );\n\n let result: PairingPoll | null = null;\n try {\n while (!ac.signal.aborted) {\n await sleep(opts.pollIntervalMs ?? interval, ac.signal);\n if (ac.signal.aborted) break;\n try {\n const r = await pollPairing(url, start.deviceCode);\n note = \"\";\n if (r.status === \"pending\") continue;\n if (r.status === \"slow_down\") {\n // The server asks for more room between polls.\n interval = Math.max(interval + 1000, (r.interval || 0) * 1000);\n continue;\n }\n result = r;\n break;\n } catch (e) {\n if (e instanceof ApiError && e.status === 429) {\n interval += 5000;\n note = \"rate limited, slowing down\";\n continue;\n }\n if (e instanceof ApiError && e.status >= 400 && e.status < 500 && e.status !== 408) {\n throw new Error(`${e.message}${e.hint ? `\\n ${e.hint}` : \"\"}`);\n }\n // Network trouble or a 5xx: keep trying until the code expires.\n note = \"can't reach the daemon, retrying\";\n if (Date.now() > expiresAt + 30_000) {\n result = { status: \"expired\" };\n break;\n }\n }\n }\n } finally {\n status.stop();\n if (opts.handleSignals) process.off(\"SIGINT\", onSigint);\n opts.signal?.removeEventListener(\"abort\", onAbort);\n }\n\n if (!result) {\n err(pc.yellow(\"Cancelled. Nothing was approved; the code expires on its own.\"));\n return CONNECT_EXIT.cancelled;\n }\n\n switch (result.status) {\n case \"denied\":\n err(pc.red(`✖ The request was denied in the console${result.note ? `: ${safeText(result.note, 300)}` : \".\"}`));\n return CONNECT_EXIT.denied;\n case \"expired\":\n err(pc.red(\"✖ The code expired before it was approved.\"));\n err(` Run the same command again for a fresh code, and approve it within ${formatDuration(Date.parse(start.expiresAt) - started)}.`);\n return CONNECT_EXIT.expired;\n case \"consumed\":\n err(pc.red(\"✖ This pairing was already completed and its key handed out once (perhaps by an earlier run of this command).\"));\n err(` For safety the key is never delivered twice. Start over with \\`${NPX} connect\\`, or rotate the agent's key in the console.`);\n return CONNECT_EXIT.consumed;\n case \"approved\":\n break;\n default:\n throw new Error(`Unexpected pairing status ${JSON.stringify((result as { status: unknown }).status)}`);\n }\n\n // --force keeps everything about the listener (targets, filters, limits, forward secret, cwd); only\n // the pairing (daemon, key, agent) is replaced.\n const kept: Partial<Profile> = replacing\n ? {\n types: replacing.types,\n filter: replacing.filter,\n includeBody: replacing.includeBody,\n exec: replacing.exec,\n forward: replacing.forward,\n forwardSecret: replacing.forwardSecret,\n concurrency: replacing.concurrency,\n timeoutSeconds: replacing.timeoutSeconds,\n maxAttempts: replacing.maxAttempts,\n cwd: replacing.cwd,\n }\n : {};\n const profile: Profile = {\n ...kept,\n url,\n apiKey: result.apiKey,\n agentId: result.agent.id,\n agentName: result.agent.name,\n consumer,\n ...(verdict.kind === \"insecure\" ? { insecure: true } : {}),\n tool,\n // Derived from the URL the user chose and transport-checked; the daemon's advertised URLs come\n // from its publicUrl setting and are never trusted with the key.\n mcpUrl: `${url}/mcp`,\n skillUrl: `${url}/skill.md`,\n createdAt: new Date().toISOString(),\n };\n const path = saveProfile(profileName, profile);\n writeClaudeMcpConfig(profileName, profile.mcpUrl!);\n if (typeof result.mcpUrl === \"string\" && result.mcpUrl !== profile.mcpUrl) {\n err(\n pc.yellow(\n `! The daemon advertises its MCP endpoint as ${safeText(result.mcpUrl, 200)} (its \"public URL\" setting); using ${profile.mcpUrl}, the address you connected to. Set the public URL in the console if agents should use another address.`,\n ),\n );\n }\n\n out(`${pc.green(\"✔\")} Approved. Agent ${pc.bold(safeText(result.agent.name))} ${pc.gray(`(${result.agent.id})`)} is connected.`);\n out(` Key saved to ${pc.cyan(path)} ${pc.gray(\"(mode 0600; never displayed. Rotate it in the console if it leaks.)\")}`);\n if (replacing && (replacing.exec || replacing.forward)) {\n out(` Kept this profile's listener settings. Restart the listener to use the new key${isServiceInstalled(profileName) ? `: ${NPX} listen service install${profileName === DEFAULT_PROFILE ? \"\" : ` --profile ${profileName}`}` : \".\"}`);\n }\n if (replacing && replacing.agentId !== profile.agentId) {\n err(\n pc.yellow(\n `! Replaced profile \"${profileName}\" (agent \"${safeText(replacing.agentName)}\", ${replacing.agentId}). Its key still works until you rotate it or delete that agent in the console; config backups made by setup-mcp (*.xaq-backup-*, or *.agentinbox-backup-* from before the rename) may contain it.`, // rename-xaq: keep\n ),\n );\n }\n\n const access = await printGrants(url, profile.apiKey, profileName);\n\n let mcp: McpSetupResult | null = null;\n if (flags.setupMcp) {\n mcp = setupMcp(tool, mcpTarget(profileName, profile), path);\n printMcpResult(mcp);\n }\n // Mail-only steps (the listener's mail wording, the test email) only when it has a mailbox; unknown = as before.\n printNextSteps(profileName, profile, tool, mcp, { mail: access ? access.grants.length > 0 : true });\n return CONNECT_EXIT.approved;\n}\n\n/**\n * The approve link. The daemon builds it from its public URL setting (default http://localhost:<port>),\n * which may not be the address this CLI reached it at (127.0.0.1, a LAN IP, an SSH tunnel's port): then\n * the link on the address we used comes first, and the public-URL one is shown as well.\n */\nexport function approveLinks(url: string, start: Pick<PairingStart, \"verificationUrl\" | \"userCode\">): { primary: string; publicUrl: string | null } {\n let advertised: URL;\n try {\n advertised = new URL(start.verificationUrl);\n } catch {\n return { primary: start.verificationUrl, publicUrl: null };\n }\n const ours = new URL(url);\n if (advertised.origin === ours.origin) return { primary: start.verificationUrl, publicUrl: null };\n // Same page on our address: keep a path prefix we connected through (reverse proxy), else swap the origin.\n const rest = `${advertised.search}${advertised.hash}`;\n const primary = advertised.pathname.endsWith(\"/approvals\") ? `${url}/approvals${rest}` : `${ours.origin}${advertised.pathname}${rest}`;\n return { primary, publicUrl: start.verificationUrl };\n}\n\n/** What the approver actually granted, in plain words (the console's choice decides, not the request). Null when unreadable. */\nasync function printGrants(url: string, key: string, profileName: string): Promise<AgentSelf | null> {\n const p = profileName === DEFAULT_PROFILE ? \"\" : ` --profile ${profileName}`;\n try {\n const self = await getSelf(url, key, 8000);\n out(` ${pc.bold(\"Access granted\")} ${pc.gray(\"(chosen by whoever approved it; change it in the console under Agents):\")}`);\n for (const line of describeGrants(self.grants, self.connections)) out(` ${hasAccess(self) ? line : pc.yellow(line)}`);\n return self;\n } catch (e) {\n err(pc.yellow(`! Couldn't read this agent's access yet (${e instanceof Error ? e.message.split(\"\\n\")[0] : String(e)}). Check it with: ${NPX} listen status${p}`));\n return null;\n }\n}\n\nexport function printMcpResult(r: McpSetupResult): void {\n if (r.ok) out(`${r.dryRun ? pc.cyan(\"○\") : pc.green(\"✔\")} ${r.message}`);\n else err(`${pc.yellow(\"!\")} ${r.message}`);\n if (r.ok && r.changes?.length) {\n // Indented lines are file contents; the rest are steps.\n for (const l of r.changes) out(l.startsWith(\" \") ? pc.gray(` ${l}`) : ` - ${l}`);\n }\n if (r.backup) out(pc.gray(` Backup: ${r.backup}`));\n if (!r.ok && r.manual?.length) {\n out(\" Do it by hand:\");\n for (const l of r.manual) out(` ${l}`);\n }\n if (r.ok && r.verify?.length) out(` ${r.dryRun ? \"Afterwards, check it with\" : \"Check it with\"}: ${r.verify.map((v) => pc.cyan(v)).join(\"; \")}`);\n if (r.ok) for (const n of r.notes ?? []) out(` ${n}`);\n}\n\nfunction skillCommand(tool: AgentTool, url: string): string {\n switch (tool) {\n case \"claude-code\":\n return `${NPX} skill install --target claude --url ${url}`;\n case \"codex\":\n return `${NPX} skill install --target codex --url ${url}`;\n case \"hermes\":\n return `${NPX} skill install --target ~/.hermes/skills/email --url ${url}`;\n case \"cursor\":\n return `${NPX} skill install --target agents --url ${url}`;\n default:\n // install, not `skill print > SKILL.md`: a redirect would capture npx's \"Ok to proceed?\" prompt into the file.\n return `${NPX} skill install --target ./skills --url ${url}`;\n }\n}\n\n/** `listen hermes … --run`: creates the Hermes route (the console shows the same command). */\nexport const hermesRouteCommand = (profileName: string) => `${NPX} listen hermes${profileName === DEFAULT_PROFILE ? \"\" : ` --profile ${profileName}`} --deliver telegram --run`;\n\nexport function printNextSteps(profileName: string, profile: Profile, tool: AgentTool, mcp: McpSetupResult | null, o: { mail?: boolean } = {}): void {\n const mail = o.mail !== false;\n const p = profileName === DEFAULT_PROFILE ? \"\" : ` --profile ${profileName}`;\n const label = tool === \"other\" ? \"your agent\" : TOOL_LABELS[tool];\n const r = recipe(tool, profileName);\n // Known tools use --recipe: no `$(…)` for npx's install prompt to hide in, and the command stays the CLI's own.\n const target = tool === \"other\" ? `--exec ${shellQuote(r.exec!)}` : `--recipe ${tool}`;\n out();\n out(pc.bold(\"Next steps\"));\n let n = 1;\n if (mcp?.ok) {\n out(` ${n++}. ${label} has the xaq MCP tools ${pc.gray(`(restart it if it's running)`)}.`);\n } else if (tool === \"other\") {\n out(` ${n++}. Point your agent's MCP client at ${pc.cyan(profile.mcpUrl ?? `${profile.url}/mcp`)} with header Authorization: Bearer <key>`);\n out(pc.gray(` The key is the \"apiKey\" field in ${profilePath(profileName)}.`));\n } else {\n out(` ${n++}. Give ${label} the xaq MCP tools without ever seeing the key:`);\n out(` ${pc.cyan(`${NPX} setup-mcp --tool ${tool}${p}`)} ${pc.gray(\"(add --dry-run to see exactly what it changes first)\")}`);\n }\n out(` ${n++}. Install the xaq skill so ${label} knows the rules:`);\n out(` ${pc.cyan(skillCommand(tool, profile.url))}`);\n if (tool === \"hermes\") {\n out(` ${n++}. Create the Hermes gateway route the listener forwards to, saying where Hermes should tell you (once; needs the gateway's webhook platform on):`);\n out(` ${pc.cyan(hermesRouteCommand(profileName))}`);\n out(pc.gray(` Or --deliver discord|slack|…, or --deliver-chat-id <id>. It sets the listener's secret without showing it and limits the route to the xaq tools.`));\n }\n if (mail) {\n out(` ${n++}. Wake ${label} when mail arrives. First try it in the foreground (Ctrl-C stops it; --save keeps the command in the profile):`);\n out(` ${pc.cyan(`${NPX} listen${p} --save ${target}`)}`);\n out(pc.gray(` Only new mail wakes it (message.received), not mail you send. Change it with --types, e.g. --types thread.reply_received (only replies to threads you sent) or --types all.`));\n out(pc.gray(` Gmail's Promotions, Social and Forums tabs are skipped (--all-categories to include them); skip more with --not-from '*@github.com'. --batch 60s runs a burst of mail once.`));\n } else {\n // No mailbox: its connections' events (an approval waiting, a connection that needs reconnecting).\n out(` ${n++}. Wake ${label} when one of its connections needs it. First try it in the foreground (Ctrl-C stops it; --save keeps the command in the profile):`);\n out(` ${pc.cyan(`${NPX} listen${p} --save ${target} --types approval.requested,connection.auth_failed,connection.expiring`)}`);\n out(pc.gray(` Add an integration's own events too, e.g. whoop.recovery_updated.`));\n }\n out(pc.gray(` What the woken agent can use: ${r.confinement}.`));\n out(pc.gray(` Where its output goes: ${r.output}`));\n for (const note of r.notes.filter((x) => tool !== \"hermes\" || !x.startsWith(\"Create the Hermes route\"))) out(pc.gray(` ${note}`));\n if (tool !== \"other\") {\n out(pc.gray(` It runs: ${r.runs}`));\n if (r.exec) out(pc.gray(` To change it: ${NPX} listen${p} --print-recipe ${tool} prints it; pass your edit with --exec '…' instead of --recipe.`));\n }\n if (mail) {\n out(` ${n++}. Check that it works: in the console's setup, the \"Check that it works\" step sends a test email.`);\n out(\n ` Watch it arrive in the foreground listener as ${pc.cyan(\"→ #… message.received\")} followed by one ${pc.green(\"✓\")} line once ${\n tool === \"hermes\" ? \"Hermes accepted it (Hermes then triages it and tells you if it matters)\" : `${label} handled it`\n }.`,\n );\n }\n out(` ${n++}. Then keep it running in the background (systemd / launchd, starts at login; stop the foreground one first):`);\n out(` ${pc.cyan(`${NPX} listen service install${p}`)}`);\n out(` ${pc.cyan(`${NPX} listen status${p}`)} ${pc.gray(\"(connection, cursor, recent events and the access granted)\")}`);\n out();\n}\n"],"mappings":"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"}