@intent-systems/nexus 2026.1.5-3

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 (827) hide show
  1. package/CHANGELOG.md +222 -0
  2. package/LICENSE +21 -0
  3. package/README-header.png +0 -0
  4. package/README.md +462 -0
  5. package/dist/agents/agent-paths.js +16 -0
  6. package/dist/agents/agent-scope.js +44 -0
  7. package/dist/agents/auth-profiles.js +626 -0
  8. package/dist/agents/bash-process-registry.js +126 -0
  9. package/dist/agents/bash-tools.js +838 -0
  10. package/dist/agents/chutes-oauth.js +47 -0
  11. package/dist/agents/clawdbot-tools.js +62 -0
  12. package/dist/agents/context.js +34 -0
  13. package/dist/agents/defaults.js +6 -0
  14. package/dist/agents/memory-search.js +80 -0
  15. package/dist/agents/model-auth.js +115 -0
  16. package/dist/agents/model-catalog.js +55 -0
  17. package/dist/agents/model-fallback.js +210 -0
  18. package/dist/agents/model-scan.js +263 -0
  19. package/dist/agents/model-selection.js +152 -0
  20. package/dist/agents/models-config.js +171 -0
  21. package/dist/agents/nexus-tools.js +46 -0
  22. package/dist/agents/pi-embedded-block-chunker.js +188 -0
  23. package/dist/agents/pi-embedded-helpers.js +139 -0
  24. package/dist/agents/pi-embedded-runner.js +932 -0
  25. package/dist/agents/pi-embedded-subscribe.js +541 -0
  26. package/dist/agents/pi-embedded-utils.js +20 -0
  27. package/dist/agents/pi-embedded.js +1 -0
  28. package/dist/agents/pi-extensions/compaction-safeguard.js +140 -0
  29. package/dist/agents/pi-tool-definition-adapter.js +17 -0
  30. package/dist/agents/pi-tools.js +510 -0
  31. package/dist/agents/pi-tools.schema.js +358 -0
  32. package/dist/agents/sandbox-paths.js +68 -0
  33. package/dist/agents/sandbox.js +667 -0
  34. package/dist/agents/shell-utils.js +53 -0
  35. package/dist/agents/skill-runner.js +224 -0
  36. package/dist/agents/skill-state.js +164 -0
  37. package/dist/agents/skill-tools.js +191 -0
  38. package/dist/agents/skill-usage.js +43 -0
  39. package/dist/agents/skills-install.js +244 -0
  40. package/dist/agents/skills-status.js +157 -0
  41. package/dist/agents/skills.js +472 -0
  42. package/dist/agents/subagent-registry.js +321 -0
  43. package/dist/agents/subagent-registry.store.js +47 -0
  44. package/dist/agents/system-prompt.js +179 -0
  45. package/dist/agents/timeout.js +26 -0
  46. package/dist/agents/tool-display.js +155 -0
  47. package/dist/agents/tool-display.json +236 -0
  48. package/dist/agents/tool-images.js +138 -0
  49. package/dist/agents/tool-policy.js +87 -0
  50. package/dist/agents/tools/agent-step.js +41 -0
  51. package/dist/agents/tools/browser-tool.js +295 -0
  52. package/dist/agents/tools/canvas-tool.js +193 -0
  53. package/dist/agents/tools/common.js +88 -0
  54. package/dist/agents/tools/cron-tool.js +141 -0
  55. package/dist/agents/tools/discord-actions-guild.js +186 -0
  56. package/dist/agents/tools/discord-actions-messaging.js +313 -0
  57. package/dist/agents/tools/discord-actions-moderation.js +70 -0
  58. package/dist/agents/tools/discord-actions.js +56 -0
  59. package/dist/agents/tools/discord-schema.js +199 -0
  60. package/dist/agents/tools/discord-tool.js +16 -0
  61. package/dist/agents/tools/gateway-tool.js +46 -0
  62. package/dist/agents/tools/gateway.js +28 -0
  63. package/dist/agents/tools/image-tool.js +140 -0
  64. package/dist/agents/tools/memory-tool.js +92 -0
  65. package/dist/agents/tools/nodes-tool.js +413 -0
  66. package/dist/agents/tools/nodes-utils.js +92 -0
  67. package/dist/agents/tools/sessions-announce-target.js +35 -0
  68. package/dist/agents/tools/sessions-helpers.js +88 -0
  69. package/dist/agents/tools/sessions-history-tool.js +137 -0
  70. package/dist/agents/tools/sessions-list-tool.js +196 -0
  71. package/dist/agents/tools/sessions-send-helpers.js +103 -0
  72. package/dist/agents/tools/sessions-send-tool.js +371 -0
  73. package/dist/agents/tools/sessions-spawn-tool.js +319 -0
  74. package/dist/agents/tools/slack-actions.js +129 -0
  75. package/dist/agents/tools/slack-schema.js +59 -0
  76. package/dist/agents/tools/slack-tool.js +16 -0
  77. package/dist/agents/tools/telegram-actions.js +159 -0
  78. package/dist/agents/tools/telegram-schema.js +28 -0
  79. package/dist/agents/tools/telegram-tool.js +16 -0
  80. package/dist/agents/tools/whatsapp-login-tool.js +63 -0
  81. package/dist/agents/usage.js +58 -0
  82. package/dist/agents/workspace.js +264 -0
  83. package/dist/auto-reply/chunk.js +177 -0
  84. package/dist/auto-reply/command-auth.js +44 -0
  85. package/dist/auto-reply/command-detection.js +22 -0
  86. package/dist/auto-reply/envelope.js +30 -0
  87. package/dist/auto-reply/group-activation.js +20 -0
  88. package/dist/auto-reply/heartbeat.js +58 -0
  89. package/dist/auto-reply/model.js +22 -0
  90. package/dist/auto-reply/reply/abort.js +14 -0
  91. package/dist/auto-reply/reply/agent-runner.js +426 -0
  92. package/dist/auto-reply/reply/bash-command.js +314 -0
  93. package/dist/auto-reply/reply/block-streaming.js +34 -0
  94. package/dist/auto-reply/reply/body.js +29 -0
  95. package/dist/auto-reply/reply/commands.js +332 -0
  96. package/dist/auto-reply/reply/directive-handling.js +626 -0
  97. package/dist/auto-reply/reply/directives.js +59 -0
  98. package/dist/auto-reply/reply/dispatch-from-config.js +23 -0
  99. package/dist/auto-reply/reply/followup-runner.js +181 -0
  100. package/dist/auto-reply/reply/groups.js +152 -0
  101. package/dist/auto-reply/reply/mentions.js +64 -0
  102. package/dist/auto-reply/reply/model-selection.js +209 -0
  103. package/dist/auto-reply/reply/queue.js +399 -0
  104. package/dist/auto-reply/reply/reply-dispatcher.js +68 -0
  105. package/dist/auto-reply/reply/reply-tags.js +26 -0
  106. package/dist/auto-reply/reply/session-updates.js +103 -0
  107. package/dist/auto-reply/reply/session.js +169 -0
  108. package/dist/auto-reply/reply/typing.js +125 -0
  109. package/dist/auto-reply/reply.js +655 -0
  110. package/dist/auto-reply/send-policy.js +28 -0
  111. package/dist/auto-reply/status.js +197 -0
  112. package/dist/auto-reply/templating.js +9 -0
  113. package/dist/auto-reply/thinking.js +49 -0
  114. package/dist/auto-reply/tokens.js +2 -0
  115. package/dist/auto-reply/tool-meta.js +74 -0
  116. package/dist/auto-reply/transcription.js +57 -0
  117. package/dist/auto-reply/types.js +1 -0
  118. package/dist/browser/bridge-server.js +37 -0
  119. package/dist/browser/cdp.js +382 -0
  120. package/dist/browser/chrome.js +432 -0
  121. package/dist/browser/client-actions-core.js +67 -0
  122. package/dist/browser/client-actions-observe.js +24 -0
  123. package/dist/browser/client-actions-types.js +1 -0
  124. package/dist/browser/client-actions.js +3 -0
  125. package/dist/browser/client-fetch.js +43 -0
  126. package/dist/browser/client.js +105 -0
  127. package/dist/browser/config.js +155 -0
  128. package/dist/browser/constants.js +5 -0
  129. package/dist/browser/profiles-service.js +124 -0
  130. package/dist/browser/profiles.js +96 -0
  131. package/dist/browser/pw-ai.js +2 -0
  132. package/dist/browser/pw-session.js +144 -0
  133. package/dist/browser/pw-tools-core.js +363 -0
  134. package/dist/browser/routes/agent.js +535 -0
  135. package/dist/browser/routes/basic.js +155 -0
  136. package/dist/browser/routes/index.js +8 -0
  137. package/dist/browser/routes/tabs.js +105 -0
  138. package/dist/browser/routes/utils.js +62 -0
  139. package/dist/browser/screenshot.js +40 -0
  140. package/dist/browser/server-context.js +377 -0
  141. package/dist/browser/server.js +81 -0
  142. package/dist/browser/target-id.js +18 -0
  143. package/dist/browser/trash.js +21 -0
  144. package/dist/canvas-host/a2ui/a2ui.bundle.js +17768 -0
  145. package/dist/canvas-host/a2ui/index.html +246 -0
  146. package/dist/canvas-host/a2ui.js +187 -0
  147. package/dist/canvas-host/server.js +382 -0
  148. package/dist/channel-web.js +8 -0
  149. package/dist/cli/browser-cli-actions-input.js +459 -0
  150. package/dist/cli/browser-cli-actions-observe.js +56 -0
  151. package/dist/cli/browser-cli-examples.js +31 -0
  152. package/dist/cli/browser-cli-inspect.js +97 -0
  153. package/dist/cli/browser-cli-manage.js +286 -0
  154. package/dist/cli/browser-cli-shared.js +1 -0
  155. package/dist/cli/browser-cli.js +26 -0
  156. package/dist/cli/canvas-cli.js +416 -0
  157. package/dist/cli/cloud-cli.js +336 -0
  158. package/dist/cli/credential-cli.js +227 -0
  159. package/dist/cli/cron-cli.js +454 -0
  160. package/dist/cli/deps.js +17 -0
  161. package/dist/cli/dns-cli.js +180 -0
  162. package/dist/cli/gateway-cli.js +665 -0
  163. package/dist/cli/gateway-rpc.js +20 -0
  164. package/dist/cli/hooks-cli.js +135 -0
  165. package/dist/cli/memory-cli.js +101 -0
  166. package/dist/cli/models-cli.js +248 -0
  167. package/dist/cli/nodes-camera.js +57 -0
  168. package/dist/cli/nodes-canvas.js +26 -0
  169. package/dist/cli/nodes-cli.js +946 -0
  170. package/dist/cli/nodes-screen.js +37 -0
  171. package/dist/cli/pairing-cli.js +100 -0
  172. package/dist/cli/parse-duration.js +20 -0
  173. package/dist/cli/plugins-cli.js +158 -0
  174. package/dist/cli/ports.js +97 -0
  175. package/dist/cli/profile.js +81 -0
  176. package/dist/cli/program.js +162 -0
  177. package/dist/cli/prompt.js +19 -0
  178. package/dist/cli/run-main.js +48 -0
  179. package/dist/cli/skills-cli.js +132 -0
  180. package/dist/cli/skills-hub-cli.js +1093 -0
  181. package/dist/cli/telegram-cli.js +56 -0
  182. package/dist/cli/tool-connector-cli.js +118 -0
  183. package/dist/cli/tui-cli.js +35 -0
  184. package/dist/cli/upstream-sync-cli.js +2833 -0
  185. package/dist/cli/usage-cli.js +24 -0
  186. package/dist/cli/wait.js +8 -0
  187. package/dist/commands/agent-via-gateway.js +115 -0
  188. package/dist/commands/agent.js +665 -0
  189. package/dist/commands/antigravity-oauth.js +327 -0
  190. package/dist/commands/auth-choice-options.js +80 -0
  191. package/dist/commands/auth-choice.js +134 -0
  192. package/dist/commands/auth-token.js +31 -0
  193. package/dist/commands/bootstrap-preset.js +214 -0
  194. package/dist/commands/capabilities.js +36 -0
  195. package/dist/commands/chutes-oauth.js +144 -0
  196. package/dist/commands/claude-md.js +137 -0
  197. package/dist/commands/config-view.js +11 -0
  198. package/dist/commands/configure.js +648 -0
  199. package/dist/commands/credential.js +236 -0
  200. package/dist/commands/cursor-rules.js +230 -0
  201. package/dist/commands/doctor-state-migrations.js +358 -0
  202. package/dist/commands/doctor-ui.js +113 -0
  203. package/dist/commands/doctor.js +673 -0
  204. package/dist/commands/health.js +112 -0
  205. package/dist/commands/identity.js +54 -0
  206. package/dist/commands/init.js +167 -0
  207. package/dist/commands/models/aliases.js +85 -0
  208. package/dist/commands/models/fallbacks.js +123 -0
  209. package/dist/commands/models/image-fallbacks.js +123 -0
  210. package/dist/commands/models/list.js +347 -0
  211. package/dist/commands/models/scan.js +271 -0
  212. package/dist/commands/models/set-image.js +27 -0
  213. package/dist/commands/models/set.js +27 -0
  214. package/dist/commands/models/shared.js +73 -0
  215. package/dist/commands/models.js +7 -0
  216. package/dist/commands/onboard-auth.js +101 -0
  217. package/dist/commands/onboard-channels.js +814 -0
  218. package/dist/commands/onboard-eve-identity.js +98 -0
  219. package/dist/commands/onboard-github.js +153 -0
  220. package/dist/commands/onboard-helpers.js +303 -0
  221. package/dist/commands/onboard-interactive.js +17 -0
  222. package/dist/commands/onboard-non-interactive.js +228 -0
  223. package/dist/commands/onboard-providers.js +829 -0
  224. package/dist/commands/onboard-quickstart.js +185 -0
  225. package/dist/commands/onboard-remote.js +120 -0
  226. package/dist/commands/onboard-skills.js +148 -0
  227. package/dist/commands/onboard-types.js +1 -0
  228. package/dist/commands/onboard.js +19 -0
  229. package/dist/commands/openai-codex-model-default.js +38 -0
  230. package/dist/commands/poll.js +64 -0
  231. package/dist/commands/quest.js +27 -0
  232. package/dist/commands/reset.js +61 -0
  233. package/dist/commands/send.js +124 -0
  234. package/dist/commands/sessions-ingest.js +359 -0
  235. package/dist/commands/sessions.js +212 -0
  236. package/dist/commands/setup.js +59 -0
  237. package/dist/commands/signal-install.js +135 -0
  238. package/dist/commands/skills-manifest.js +235 -0
  239. package/dist/commands/status.js +139 -0
  240. package/dist/commands/suggestions.js +54 -0
  241. package/dist/commands/systemd-linger.js +71 -0
  242. package/dist/commands/update.js +16 -0
  243. package/dist/commands/usage-upload.js +27 -0
  244. package/dist/config/config.js +6 -0
  245. package/dist/config/defaults.js +140 -0
  246. package/dist/config/group-policy.js +49 -0
  247. package/dist/config/includes.js +183 -0
  248. package/dist/config/io.js +188 -0
  249. package/dist/config/legacy-migrate.js +13 -0
  250. package/dist/config/legacy.js +425 -0
  251. package/dist/config/paths.js +82 -0
  252. package/dist/config/port-defaults.js +32 -0
  253. package/dist/config/schema.js +173 -0
  254. package/dist/config/sessions.js +611 -0
  255. package/dist/config/talk.js +31 -0
  256. package/dist/config/types.js +1 -0
  257. package/dist/config/validation.js +29 -0
  258. package/dist/config/zod-schema.js +1110 -0
  259. package/dist/control-ui/assets/index-D8Q5AI4D.js +2393 -0
  260. package/dist/control-ui/assets/index-D8Q5AI4D.js.map +1 -0
  261. package/dist/control-ui/assets/index-g06q5Xc3.css +1 -0
  262. package/dist/control-ui/favicon.ico +0 -0
  263. package/dist/control-ui/index.html +16 -0
  264. package/dist/cron/isolated-agent.js +529 -0
  265. package/dist/cron/normalize.js +73 -0
  266. package/dist/cron/parse.js +24 -0
  267. package/dist/cron/run-log.js +72 -0
  268. package/dist/cron/schedule.js +24 -0
  269. package/dist/cron/service.js +471 -0
  270. package/dist/cron/store.js +43 -0
  271. package/dist/cron/types.js +1 -0
  272. package/dist/daemon/constants.js +10 -0
  273. package/dist/daemon/launchd.js +295 -0
  274. package/dist/daemon/legacy.js +63 -0
  275. package/dist/daemon/program-args.js +141 -0
  276. package/dist/daemon/schtasks.js +269 -0
  277. package/dist/daemon/service.js +69 -0
  278. package/dist/daemon/systemd.js +332 -0
  279. package/dist/discord/index.js +2 -0
  280. package/dist/discord/monitor.js +1089 -0
  281. package/dist/discord/probe.js +54 -0
  282. package/dist/discord/send.js +652 -0
  283. package/dist/discord/token.js +8 -0
  284. package/dist/entry.js +16 -0
  285. package/dist/gateway/auth.js +121 -0
  286. package/dist/gateway/call.js +103 -0
  287. package/dist/gateway/chat-attachments.js +41 -0
  288. package/dist/gateway/client.js +180 -0
  289. package/dist/gateway/config-reload.js +274 -0
  290. package/dist/gateway/control-ui.js +184 -0
  291. package/dist/gateway/hooks-mapping.js +282 -0
  292. package/dist/gateway/hooks.js +168 -0
  293. package/dist/gateway/net.js +29 -0
  294. package/dist/gateway/protocol/index.js +62 -0
  295. package/dist/gateway/protocol/schema.js +577 -0
  296. package/dist/gateway/server-bridge-subscriptions.js +93 -0
  297. package/dist/gateway/server-bridge.js +1066 -0
  298. package/dist/gateway/server-browser.js +11 -0
  299. package/dist/gateway/server-channels.js +680 -0
  300. package/dist/gateway/server-chat.js +159 -0
  301. package/dist/gateway/server-constants.js +8 -0
  302. package/dist/gateway/server-discovery.js +62 -0
  303. package/dist/gateway/server-http.js +165 -0
  304. package/dist/gateway/server-methods/agent-job.js +114 -0
  305. package/dist/gateway/server-methods/agent.js +254 -0
  306. package/dist/gateway/server-methods/channels.js +239 -0
  307. package/dist/gateway/server-methods/chat.js +207 -0
  308. package/dist/gateway/server-methods/config.js +50 -0
  309. package/dist/gateway/server-methods/connect.js +6 -0
  310. package/dist/gateway/server-methods/cron.js +89 -0
  311. package/dist/gateway/server-methods/health.js +28 -0
  312. package/dist/gateway/server-methods/models.js +16 -0
  313. package/dist/gateway/server-methods/nodes.js +294 -0
  314. package/dist/gateway/server-methods/providers.js +257 -0
  315. package/dist/gateway/server-methods/send.js +254 -0
  316. package/dist/gateway/server-methods/sessions.js +382 -0
  317. package/dist/gateway/server-methods/skills.js +83 -0
  318. package/dist/gateway/server-methods/system.js +118 -0
  319. package/dist/gateway/server-methods/talk.js +22 -0
  320. package/dist/gateway/server-methods/types.js +1 -0
  321. package/dist/gateway/server-methods/voicewake.js +30 -0
  322. package/dist/gateway/server-methods/web.js +81 -0
  323. package/dist/gateway/server-methods/wizard.js +100 -0
  324. package/dist/gateway/server-methods.js +53 -0
  325. package/dist/gateway/server-providers.js +687 -0
  326. package/dist/gateway/server-shared.js +1 -0
  327. package/dist/gateway/server-utils.js +35 -0
  328. package/dist/gateway/server.js +1478 -0
  329. package/dist/gateway/session-utils.js +355 -0
  330. package/dist/gateway/ws-log.js +343 -0
  331. package/dist/gateway/ws-logging.js +8 -0
  332. package/dist/globals.js +41 -0
  333. package/dist/hooks/gmail-ops.js +236 -0
  334. package/dist/hooks/gmail-setup-utils.js +278 -0
  335. package/dist/hooks/gmail-watcher.js +190 -0
  336. package/dist/hooks/gmail.js +177 -0
  337. package/dist/imessage/client.js +165 -0
  338. package/dist/imessage/index.js +3 -0
  339. package/dist/imessage/monitor.js +365 -0
  340. package/dist/imessage/probe.js +26 -0
  341. package/dist/imessage/send.js +83 -0
  342. package/dist/imessage/targets.js +176 -0
  343. package/dist/index.js +55 -0
  344. package/dist/infra/agent-events.js +46 -0
  345. package/dist/infra/binaries.js +9 -0
  346. package/dist/infra/bonjour-discovery.js +163 -0
  347. package/dist/infra/bonjour.js +200 -0
  348. package/dist/infra/bridge/server.js +564 -0
  349. package/dist/infra/canvas-host-url.js +54 -0
  350. package/dist/infra/channel-summary.js +78 -0
  351. package/dist/infra/control-ui-assets.js +112 -0
  352. package/dist/infra/dotenv.js +15 -0
  353. package/dist/infra/env.js +8 -0
  354. package/dist/infra/errors.js +28 -0
  355. package/dist/infra/event-log.js +251 -0
  356. package/dist/infra/gateway-lock.js +8 -0
  357. package/dist/infra/git-commit.js +91 -0
  358. package/dist/infra/heartbeat-events.js +21 -0
  359. package/dist/infra/heartbeat-runner.js +458 -0
  360. package/dist/infra/heartbeat-wake.js +61 -0
  361. package/dist/infra/is-main.js +37 -0
  362. package/dist/infra/json-file.js +21 -0
  363. package/dist/infra/machine-name.js +40 -0
  364. package/dist/infra/nexus-root.js +56 -0
  365. package/dist/infra/node-pairing.js +212 -0
  366. package/dist/infra/path-env.js +93 -0
  367. package/dist/infra/ports.js +87 -0
  368. package/dist/infra/provider-summary.js +80 -0
  369. package/dist/infra/provider-usage.auth.js +189 -0
  370. package/dist/infra/provider-usage.fetch.claude.js +129 -0
  371. package/dist/infra/provider-usage.fetch.codex.js +62 -0
  372. package/dist/infra/provider-usage.fetch.copilot.js +42 -0
  373. package/dist/infra/provider-usage.fetch.gemini.js +57 -0
  374. package/dist/infra/provider-usage.fetch.js +6 -0
  375. package/dist/infra/provider-usage.fetch.minimax.js +214 -0
  376. package/dist/infra/provider-usage.fetch.shared.js +11 -0
  377. package/dist/infra/provider-usage.fetch.zai.js +62 -0
  378. package/dist/infra/provider-usage.format.js +77 -0
  379. package/dist/infra/provider-usage.js +145 -0
  380. package/dist/infra/provider-usage.load.js +54 -0
  381. package/dist/infra/provider-usage.shared.js +19 -0
  382. package/dist/infra/provider-usage.types.js +1 -0
  383. package/dist/infra/restart.js +29 -0
  384. package/dist/infra/retry.js +16 -0
  385. package/dist/infra/runtime-guard.js +59 -0
  386. package/dist/infra/shell-env.js +88 -0
  387. package/dist/infra/system-events.js +71 -0
  388. package/dist/infra/system-presence.js +217 -0
  389. package/dist/infra/tailnet.js +46 -0
  390. package/dist/infra/tailscale.js +149 -0
  391. package/dist/infra/unhandled-rejections.js +19 -0
  392. package/dist/infra/usage-suggestions.js +241 -0
  393. package/dist/infra/usage-upload.js +290 -0
  394. package/dist/infra/voicewake.js +78 -0
  395. package/dist/infra/widearea-dns.js +123 -0
  396. package/dist/infra/ws.js +13 -0
  397. package/dist/logger.js +52 -0
  398. package/dist/logging.js +506 -0
  399. package/dist/macos/gateway-daemon.js +145 -0
  400. package/dist/macos/relay.js +49 -0
  401. package/dist/media/constants.js +33 -0
  402. package/dist/media/host.js +42 -0
  403. package/dist/media/image-ops.js +119 -0
  404. package/dist/media/mime.js +123 -0
  405. package/dist/media/parse.js +83 -0
  406. package/dist/media/server.js +64 -0
  407. package/dist/media/store.js +139 -0
  408. package/dist/polls.js +43 -0
  409. package/dist/process/command-queue.js +97 -0
  410. package/dist/process/exec.js +75 -0
  411. package/dist/provider-web.js +8 -0
  412. package/dist/providers/github-copilot-auth.js +123 -0
  413. package/dist/providers/github-copilot-models.js +35 -0
  414. package/dist/providers/github-copilot-token.js +11 -0
  415. package/dist/providers/location.js +48 -0
  416. package/dist/providers/web/index.js +2 -0
  417. package/dist/runtime.js +8 -0
  418. package/dist/sessions/level-overrides.js +9 -0
  419. package/dist/sessions/send-policy.js +68 -0
  420. package/dist/signal/client.js +134 -0
  421. package/dist/signal/daemon.js +69 -0
  422. package/dist/signal/index.js +3 -0
  423. package/dist/signal/monitor.js +411 -0
  424. package/dist/signal/probe.js +46 -0
  425. package/dist/signal/send.js +91 -0
  426. package/dist/slack/actions.js +97 -0
  427. package/dist/slack/index.js +5 -0
  428. package/dist/slack/monitor.js +1270 -0
  429. package/dist/slack/probe.js +47 -0
  430. package/dist/slack/send.js +131 -0
  431. package/dist/slack/token.js +10 -0
  432. package/dist/telegram/allowed-updates.js +8 -0
  433. package/dist/telegram/bot.js +724 -0
  434. package/dist/telegram/download.js +34 -0
  435. package/dist/telegram/index.js +4 -0
  436. package/dist/telegram/monitor.js +47 -0
  437. package/dist/telegram/pairing-store.js +77 -0
  438. package/dist/telegram/probe.js +63 -0
  439. package/dist/telegram/proxy.js +9 -0
  440. package/dist/telegram/reaction-level.js +45 -0
  441. package/dist/telegram/send.js +151 -0
  442. package/dist/telegram/sent-message-cache.js +65 -0
  443. package/dist/telegram/token.js +30 -0
  444. package/dist/telegram/update-offset-store.js +61 -0
  445. package/dist/telegram/webhook-set.js +12 -0
  446. package/dist/telegram/webhook.js +56 -0
  447. package/dist/tui/commands.js +87 -0
  448. package/dist/tui/components/assistant-message.js +16 -0
  449. package/dist/tui/components/chat-log.js +92 -0
  450. package/dist/tui/components/custom-editor.js +55 -0
  451. package/dist/tui/components/selectors.js +8 -0
  452. package/dist/tui/components/tool-execution.js +111 -0
  453. package/dist/tui/components/user-message.js +17 -0
  454. package/dist/tui/gateway-chat.js +140 -0
  455. package/dist/tui/theme/theme.js +80 -0
  456. package/dist/tui/tui.js +708 -0
  457. package/dist/utils.js +153 -0
  458. package/dist/version.js +18 -0
  459. package/dist/web/accounts.js +86 -0
  460. package/dist/web/active-listener.js +25 -0
  461. package/dist/web/auto-reply.js +1256 -0
  462. package/dist/web/inbound.js +649 -0
  463. package/dist/web/login-qr.js +230 -0
  464. package/dist/web/login.js +71 -0
  465. package/dist/web/media.js +175 -0
  466. package/dist/web/outbound.js +102 -0
  467. package/dist/web/qr-image.js +97 -0
  468. package/dist/web/reconnect.js +60 -0
  469. package/dist/web/session.js +370 -0
  470. package/dist/wizard/clack-prompter.js +56 -0
  471. package/dist/wizard/onboarding.js +620 -0
  472. package/dist/wizard/prompts.js +6 -0
  473. package/dist/wizard/session.js +203 -0
  474. package/docs/AGENTS.default.md +116 -0
  475. package/docs/CAPABILITIES.md +444 -0
  476. package/docs/CNAME +1 -0
  477. package/docs/NEXUS_CORE_REWRITE_SPEC.md +226 -0
  478. package/docs/RELEASING.md +69 -0
  479. package/docs/_config.yml +53 -0
  480. package/docs/_layouts/default.html +145 -0
  481. package/docs/agent-assisted-install.md +95 -0
  482. package/docs/agent-loop.md +61 -0
  483. package/docs/agent-send.md +21 -0
  484. package/docs/agent.md +108 -0
  485. package/docs/android.md +133 -0
  486. package/docs/architecture.md +114 -0
  487. package/docs/assets/markdown.css +133 -0
  488. package/docs/assets/pixel-lobster.svg +60 -0
  489. package/docs/assets/terminal.css +470 -0
  490. package/docs/assets/theme.js +55 -0
  491. package/docs/audio.md +48 -0
  492. package/docs/automation/nexus-sync.md +371 -0
  493. package/docs/background-process.md +74 -0
  494. package/docs/bash.md +32 -0
  495. package/docs/bedrock.md +71 -0
  496. package/docs/bonjour.md +159 -0
  497. package/docs/browser-linux-troubleshooting.md +114 -0
  498. package/docs/browser.md +293 -0
  499. package/docs/bun.md +56 -0
  500. package/docs/camera.md +152 -0
  501. package/docs/clawd.md +212 -0
  502. package/docs/concepts/usage-tracking.md +29 -0
  503. package/docs/configuration.md +1666 -0
  504. package/docs/control-ui.md +83 -0
  505. package/docs/cron.md +385 -0
  506. package/docs/dashboard.md +17 -0
  507. package/docs/device-models.md +46 -0
  508. package/docs/discord.md +308 -0
  509. package/docs/discovery.md +112 -0
  510. package/docs/docker.md +258 -0
  511. package/docs/docs.json +105 -0
  512. package/docs/doctor.md +68 -0
  513. package/docs/elevated.md +31 -0
  514. package/docs/faq.md +736 -0
  515. package/docs/feature-inventory/overview.md +141 -0
  516. package/docs/feature-inventory/rollout-checklist.md +53 -0
  517. package/docs/feature-inventory/test-matrix.md +87 -0
  518. package/docs/feature-inventory.md +9 -0
  519. package/docs/gateway/configuration-examples.md +221 -0
  520. package/docs/gateway/configuration.md +172 -0
  521. package/docs/gateway/cron.md +61 -0
  522. package/docs/gateway/heartbeat.md +207 -0
  523. package/docs/gateway/pairing.md +109 -0
  524. package/docs/gateway-lock.md +28 -0
  525. package/docs/gateway.md +227 -0
  526. package/docs/gmail-pubsub.md +191 -0
  527. package/docs/grammy.md +27 -0
  528. package/docs/group-messages.md +73 -0
  529. package/docs/groups.md +130 -0
  530. package/docs/health.md +28 -0
  531. package/docs/heartbeat.md +73 -0
  532. package/docs/home-userspace.md +277 -0
  533. package/docs/hubs.md +148 -0
  534. package/docs/images.md +51 -0
  535. package/docs/imessage.md +94 -0
  536. package/docs/index.md +196 -0
  537. package/docs/ios.md +372 -0
  538. package/docs/linux.md +11 -0
  539. package/docs/location-command.md +95 -0
  540. package/docs/location.md +46 -0
  541. package/docs/logging.md +110 -0
  542. package/docs/lore.md +131 -0
  543. package/docs/mac/bun.md +133 -0
  544. package/docs/mac/canvas.md +161 -0
  545. package/docs/mac/child-process.md +72 -0
  546. package/docs/mac/dev-setup.md +81 -0
  547. package/docs/mac/health.md +28 -0
  548. package/docs/mac/icon.md +26 -0
  549. package/docs/mac/logging.md +51 -0
  550. package/docs/mac/menu-bar.md +69 -0
  551. package/docs/mac/peekaboo.md +170 -0
  552. package/docs/mac/permissions.md +40 -0
  553. package/docs/mac/release.md +76 -0
  554. package/docs/mac/remote.md +57 -0
  555. package/docs/mac/signing.md +41 -0
  556. package/docs/mac/skills.md +27 -0
  557. package/docs/mac/voice-overlay.md +52 -0
  558. package/docs/mac/voicewake.md +56 -0
  559. package/docs/mac/webchat.md +27 -0
  560. package/docs/mac/xpc.md +40 -0
  561. package/docs/macos.md +104 -0
  562. package/docs/model-failover.md +75 -0
  563. package/docs/models.md +91 -0
  564. package/docs/multi-agent.md +74 -0
  565. package/docs/nix.md +95 -0
  566. package/docs/nodes.md +157 -0
  567. package/docs/onboarding-config-protocol.md +34 -0
  568. package/docs/onboarding.md +189 -0
  569. package/docs/pairing.md +85 -0
  570. package/docs/plans/cron-add-hardening.md +72 -0
  571. package/docs/plans/group-policy-hardening.md +121 -0
  572. package/docs/poll.md +52 -0
  573. package/docs/prereqs.md +67 -0
  574. package/docs/presence.md +133 -0
  575. package/docs/proposals/model-config.md +147 -0
  576. package/docs/provider-routing.md +25 -0
  577. package/docs/queue.md +78 -0
  578. package/docs/reference/templates/AGENTS.md +164 -0
  579. package/docs/remote-gateway-readme.md +153 -0
  580. package/docs/remote.md +61 -0
  581. package/docs/research/memory.md +227 -0
  582. package/docs/rpc.md +35 -0
  583. package/docs/security.md +200 -0
  584. package/docs/session-ingestion.md +119 -0
  585. package/docs/session-tool.md +154 -0
  586. package/docs/session.md +85 -0
  587. package/docs/sessions.md +8 -0
  588. package/docs/setup.md +131 -0
  589. package/docs/showcase.md +37 -0
  590. package/docs/signal.md +122 -0
  591. package/docs/skills-config.md +58 -0
  592. package/docs/skills.md +153 -0
  593. package/docs/slack.md +221 -0
  594. package/docs/subagents.md +72 -0
  595. package/docs/tailscale.md +71 -0
  596. package/docs/talk.md +79 -0
  597. package/docs/telegram.md +96 -0
  598. package/docs/templates/AGENTS.md +286 -0
  599. package/docs/templates/BOOTSTRAP.md +35 -0
  600. package/docs/templates/IDENTITY.md +17 -0
  601. package/docs/templates/PROFILE.md +14 -0
  602. package/docs/templates/SOUL.md +41 -0
  603. package/docs/templates/TOOLS.md +41 -0
  604. package/docs/templates/USER.md +8 -0
  605. package/docs/test.md +43 -0
  606. package/docs/testing-onboarding-quickstart.md +76 -0
  607. package/docs/testing-philosophy.md +211 -0
  608. package/docs/thinking.md +46 -0
  609. package/docs/timezone.md +40 -0
  610. package/docs/tools.md +346 -0
  611. package/docs/troubleshooting.md +257 -0
  612. package/docs/tui.md +71 -0
  613. package/docs/typebox.md +42 -0
  614. package/docs/updating.md +138 -0
  615. package/docs/usage-cloud-aggregation-spec.md +133 -0
  616. package/docs/usage-suggestions-pipeline.md +126 -0
  617. package/docs/voicewake.md +61 -0
  618. package/docs/web.md +115 -0
  619. package/docs/webchat.md +34 -0
  620. package/docs/webhook.md +132 -0
  621. package/docs/whatsapp-clawd.jpg +0 -0
  622. package/docs/whatsapp.md +170 -0
  623. package/docs/windows.md +11 -0
  624. package/docs/wizard.md +167 -0
  625. package/package.json +209 -0
  626. package/skills/1password/SKILL.md +54 -0
  627. package/skills/1password/docs/setup.md +85 -0
  628. package/skills/1password/docs/troubleshooting.md +63 -0
  629. package/skills/1password/references/cli-examples.md +29 -0
  630. package/skills/1password/references/get-started.md +17 -0
  631. package/skills/agent-browser/SKILL.md +450 -0
  632. package/skills/agent-browser/docs/browser-use-eval.md +95 -0
  633. package/skills/agent-browser/docs/first-tests.md +261 -0
  634. package/skills/agent-browser/docs/wordle-nyt-eval.js +32 -0
  635. package/skills/aix/SKILL.md +93 -0
  636. package/skills/aix/docs/embeddings.md +40 -0
  637. package/skills/aix/docs/setup.md +58 -0
  638. package/skills/aix/docs/troubleshooting.md +41 -0
  639. package/skills/aix/references/sql.md +48 -0
  640. package/skills/apple-notes/SKILL.md +50 -0
  641. package/skills/apple-reminders/SKILL.md +67 -0
  642. package/skills/bear-notes/SKILL.md +79 -0
  643. package/skills/bird/SKILL.md +32 -0
  644. package/skills/bird/docs/auth.md +31 -0
  645. package/skills/bird/docs/troubleshooting.md +31 -0
  646. package/skills/blogwatcher/SKILL.md +46 -0
  647. package/skills/blucli/SKILL.md +27 -0
  648. package/skills/brave-search/SKILL.md +36 -0
  649. package/skills/brave-search/docs/setup.md +40 -0
  650. package/skills/brave-search/docs/troubleshooting.md +37 -0
  651. package/skills/brave-search/docs/usage.md +28 -0
  652. package/skills/brave-search/scripts/content.mjs +53 -0
  653. package/skills/brave-search/scripts/search.mjs +79 -0
  654. package/skills/browser-use-agent-sdk/SKILL.md +90 -0
  655. package/skills/camsnap/SKILL.md +25 -0
  656. package/skills/clawdhub/SKILL.md +53 -0
  657. package/skills/coding-agent/SKILL.md +274 -0
  658. package/skills/comms/SKILL.md +249 -0
  659. package/skills/comms/docs/adapters.md +54 -0
  660. package/skills/comms/docs/setup.md +56 -0
  661. package/skills/comms/docs/troubleshooting.md +44 -0
  662. package/skills/comms/references/schema.md +49 -0
  663. package/skills/computer-use/SKILL.md +204 -0
  664. package/skills/computer-use/docs/open-interpreter.md +26 -0
  665. package/skills/computer-use/docs/peekaboo.md +26 -0
  666. package/skills/computer-use/docs/setup.md +47 -0
  667. package/skills/computer-use/docs/troubleshooting.md +33 -0
  668. package/skills/discord/SKILL.md +370 -0
  669. package/skills/eightctl/SKILL.md +29 -0
  670. package/skills/eve/SKILL.md +215 -0
  671. package/skills/eve/docs/dual-account.md +84 -0
  672. package/skills/eve/docs/intelligence.md +58 -0
  673. package/skills/eve/docs/setup.md +60 -0
  674. package/skills/eve/docs/troubleshooting.md +54 -0
  675. package/skills/eve/scripts/setup-dual-account.sh +125 -0
  676. package/skills/filesystem/SKILL.md +217 -0
  677. package/skills/food-order/SKILL.md +41 -0
  678. package/skills/gemini/SKILL.md +23 -0
  679. package/skills/gh/SKILL.md +22 -0
  680. package/skills/gh/docs/usage.md +41 -0
  681. package/skills/gifgrep/SKILL.md +47 -0
  682. package/skills/github/SKILL.md +26 -0
  683. package/skills/github/docs/setup.md +21 -0
  684. package/skills/github/docs/troubleshooting.md +24 -0
  685. package/skills/gog/SKILL.md +104 -0
  686. package/skills/gog/docs/portability.md +94 -0
  687. package/skills/gog/docs/setup.md +76 -0
  688. package/skills/gog/docs/troubleshooting.md +94 -0
  689. package/skills/gog/scripts/cdp/README.md +90 -0
  690. package/skills/gog/scripts/cdp/add_test_users.py +69 -0
  691. package/skills/gog/scripts/cdp/auth_add_accounts.py +209 -0
  692. package/skills/gog/scripts/cdp/auth_add_accounts_manual.py +206 -0
  693. package/skills/gog/scripts/cdp/create_oauth_client.py +165 -0
  694. package/skills/gog/scripts/cdp/launch_cdp_chrome.sh +58 -0
  695. package/skills/google-oauth/SKILL.md +94 -0
  696. package/skills/goplaces/SKILL.md +30 -0
  697. package/skills/imsg/SKILL.md +25 -0
  698. package/skills/json-render/SKILL.md +154 -0
  699. package/skills/json-render/assets/components/README.md +21 -0
  700. package/skills/json-render/assets/components/catalog.ts +78 -0
  701. package/skills/json-render/assets/components/registry.tsx +172 -0
  702. package/skills/json-render/assets/demo/App.css +397 -0
  703. package/skills/json-render/assets/demo/App.tsx +897 -0
  704. package/skills/json-render/assets/demo/README.md +22 -0
  705. package/skills/json-render/assets/demo/catalog.ts +78 -0
  706. package/skills/json-render/assets/demo/data/nexus-core.json +31 -0
  707. package/skills/json-render/assets/demo/index.css +27 -0
  708. package/skills/json-render/assets/demo/registry.tsx +150 -0
  709. package/skills/json-render/docs/nexus-state-demo.md +84 -0
  710. package/skills/json-render/docs/shadcn-preset.md +33 -0
  711. package/skills/json-render/scripts/create-vite-demo.sh +45 -0
  712. package/skills/json-render/scripts/llm-server/README.md +33 -0
  713. package/skills/json-render/scripts/llm-server/catalog.ts +78 -0
  714. package/skills/json-render/scripts/llm-server/package-lock.json +702 -0
  715. package/skills/json-render/scripts/llm-server/package.json +18 -0
  716. package/skills/json-render/scripts/llm-server/server.ts +285 -0
  717. package/skills/local-places/SERVER_README.md +101 -0
  718. package/skills/local-places/SKILL.md +91 -0
  719. package/skills/local-places/pyproject.toml +27 -0
  720. package/skills/local-places/src/local_places/__init__.py +2 -0
  721. package/skills/local-places/src/local_places/__pycache__/__init__.cpython-314.pyc +0 -0
  722. package/skills/local-places/src/local_places/__pycache__/google_places.cpython-314.pyc +0 -0
  723. package/skills/local-places/src/local_places/__pycache__/main.cpython-314.pyc +0 -0
  724. package/skills/local-places/src/local_places/__pycache__/schemas.cpython-314.pyc +0 -0
  725. package/skills/local-places/src/local_places/google_places.py +314 -0
  726. package/skills/local-places/src/local_places/main.py +65 -0
  727. package/skills/local-places/src/local_places/schemas.py +107 -0
  728. package/skills/mcporter/SKILL.md +38 -0
  729. package/skills/model-usage/SKILL.md +45 -0
  730. package/skills/model-usage/references/codexbar-cli.md +28 -0
  731. package/skills/model-usage/scripts/model_usage.py +310 -0
  732. package/skills/nano-banana-pro/SKILL.md +30 -0
  733. package/skills/nano-banana-pro/scripts/generate_image.py +169 -0
  734. package/skills/nano-pdf/SKILL.md +20 -0
  735. package/skills/nexus-cloud/SKILL.md +53 -0
  736. package/skills/nexus-cloud/docs/security.md +24 -0
  737. package/skills/nexus-cloud/docs/setup.md +51 -0
  738. package/skills/nexus-cloud/docs/troubleshooting.md +28 -0
  739. package/skills/notion/SKILL.md +156 -0
  740. package/skills/obsidian/SKILL.md +55 -0
  741. package/skills/onboarding/SKILL.md +515 -0
  742. package/skills/onboarding/docs/CAPABILITIES.md +444 -0
  743. package/skills/onboarding/docs/CAPABILITY_TAXONOMY.md +608 -0
  744. package/skills/onboarding/docs/CLI_GRAMMAR.md +797 -0
  745. package/skills/onboarding/docs/CLI_GRAMMAR_CREDENTIALS.md +632 -0
  746. package/skills/onboarding/docs/CLI_GRAMMAR_ONBOARDING.md +815 -0
  747. package/skills/onboarding/docs/CLI_GRAMMAR_SKILLS.md +449 -0
  748. package/skills/onboarding/docs/DOCUMENTATION_OVERVIEW.md +290 -0
  749. package/skills/onboarding/docs/ENTITY_MODEL.md +582 -0
  750. package/skills/onboarding/docs/GOAL_STATE_ARCHITECTURE.md +395 -0
  751. package/skills/onboarding/docs/NEXUS_SYSTEM_OVERVIEW.md +476 -0
  752. package/skills/onboarding/docs/SKILLS_HUB_SPEC.md +477 -0
  753. package/skills/onboarding/docs/SKILLS_SPECIFICATION.md +947 -0
  754. package/skills/onboarding/docs/SKILL_GATEWAY_DESIGN.md +702 -0
  755. package/skills/onboarding/docs/SKILL_GATEWAY_PRD.md +278 -0
  756. package/skills/onboarding/docs/SKILL_INVENTORY.md +266 -0
  757. package/skills/onboarding/docs/STATE_ARCHITECTURE.md +547 -0
  758. package/skills/onboarding/docs/TROUBLESHOOTING.md +363 -0
  759. package/skills/onboarding/docs/USER_JOURNEY.md +797 -0
  760. package/skills/onboarding/docs/WOW_MOMENTS.md +232 -0
  761. package/skills/onboarding/docs/agent-apple-id.md +289 -0
  762. package/skills/onboarding/docs/skill-deep-dives/1password.md +367 -0
  763. package/skills/onboarding/docs/skill-deep-dives/TEMPLATE.md +197 -0
  764. package/skills/onboarding/docs/skill-deep-dives/aix.md +498 -0
  765. package/skills/onboarding/docs/skill-deep-dives/bird.md +357 -0
  766. package/skills/onboarding/docs/skill-deep-dives/brave-search.md +601 -0
  767. package/skills/onboarding/docs/skill-deep-dives/comms.md +607 -0
  768. package/skills/onboarding/docs/skill-deep-dives/computer-use.md +599 -0
  769. package/skills/onboarding/docs/skill-deep-dives/cron-and-heartbeat.md +576 -0
  770. package/skills/onboarding/docs/skill-deep-dives/eve.md +711 -0
  771. package/skills/onboarding/docs/skill-deep-dives/github.md +333 -0
  772. package/skills/onboarding/docs/skill-deep-dives/gog.md +640 -0
  773. package/skills/onboarding/docs/skill-deep-dives/homebrew-prereqs.md +785 -0
  774. package/skills/onboarding/docs/skill-deep-dives/nexus-cloud.md +689 -0
  775. package/skills/onboarding/docs/skill-deep-dives/qmd.md +742 -0
  776. package/skills/onboarding/docs/skill-deep-dives/telegram.md +379 -0
  777. package/skills/onboarding/docs/skill-deep-dives/wacli.md +399 -0
  778. package/skills/onboarding/docs/skill-deep-dives/weather.md +513 -0
  779. package/skills/onboarding/scripts/ralph/prd.json +215 -0
  780. package/skills/onboarding/scripts/ralph/progress.txt +99 -0
  781. package/skills/onboarding/scripts/ralph/prompt.md +87 -0
  782. package/skills/onboarding/scripts/ralph/ralph.log +84 -0
  783. package/skills/onboarding/scripts/ralph/ralph.sh +45 -0
  784. package/skills/onboarding/scripts/setup-cursor-skills.sh +40 -0
  785. package/skills/openai-image-gen/SKILL.md +31 -0
  786. package/skills/openai-image-gen/scripts/gen.py +173 -0
  787. package/skills/openai-whisper/SKILL.md +19 -0
  788. package/skills/openai-whisper-api/SKILL.md +43 -0
  789. package/skills/openai-whisper-api/scripts/transcribe.sh +85 -0
  790. package/skills/openhue/SKILL.md +30 -0
  791. package/skills/oracle/SKILL.md +105 -0
  792. package/skills/ordercli/SKILL.md +47 -0
  793. package/skills/peekaboo/SKILL.md +153 -0
  794. package/skills/qmd/SKILL.md +32 -0
  795. package/skills/qmd/docs/mcp.md +30 -0
  796. package/skills/qmd/docs/ollama.md +42 -0
  797. package/skills/qmd/docs/setup.md +44 -0
  798. package/skills/sag/SKILL.md +62 -0
  799. package/skills/skill-cli-template/SKILL.md +109 -0
  800. package/skills/skill-creator/scripts/__pycache__/quick_validate.cpython-311.pyc +0 -0
  801. package/skills/slack/SKILL.md +144 -0
  802. package/skills/songsee/SKILL.md +29 -0
  803. package/skills/sonoscli/SKILL.md +26 -0
  804. package/skills/spotify-player/SKILL.md +34 -0
  805. package/skills/summarize/SKILL.md +49 -0
  806. package/skills/telegram/SKILL.md +20 -0
  807. package/skills/telegram/docs/pairing.md +30 -0
  808. package/skills/telegram/docs/setup.md +41 -0
  809. package/skills/telegram/docs/webhook.md +17 -0
  810. package/skills/things-mac/SKILL.md +61 -0
  811. package/skills/tmux/SKILL.md +121 -0
  812. package/skills/tmux/scripts/find-sessions.sh +112 -0
  813. package/skills/tmux/scripts/wait-for-text.sh +83 -0
  814. package/skills/trello/SKILL.md +84 -0
  815. package/skills/upstream-sync/SKILL.md +151 -0
  816. package/skills/upstream-sync/scripts/auto-port.sh +227 -0
  817. package/skills/upstream-sync/scripts/check-all.sh +88 -0
  818. package/skills/upstream-sync/scripts/check-nexus.sh +146 -0
  819. package/skills/upstream-sync/scripts/check-pi-ai.sh +129 -0
  820. package/skills/video-frames/SKILL.md +29 -0
  821. package/skills/video-frames/scripts/frame.sh +81 -0
  822. package/skills/wacli/SKILL.md +48 -0
  823. package/skills/wacli/docs/auth.md +21 -0
  824. package/skills/wacli/docs/backup.md +9 -0
  825. package/skills/wacli/docs/troubleshooting.md +21 -0
  826. package/skills/weather/SKILL.md +53 -0
  827. package/skills/weather/docs/usage.md +40 -0
@@ -0,0 +1,829 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { loginWeb } from "../provider-web.js";
4
+ import { normalizeE164 } from "../utils.js";
5
+ import { WA_WEB_AUTH_DIR } from "../web/session.js";
6
+ import { detectBinary } from "./onboard-helpers.js";
7
+ import { installSignalCli } from "./signal-install.js";
8
+ function addWildcardAllowFrom(allowFrom) {
9
+ const next = (allowFrom ?? []).map((v) => String(v).trim()).filter(Boolean);
10
+ if (!next.includes("*"))
11
+ next.push("*");
12
+ return next;
13
+ }
14
+ async function pathExists(filePath) {
15
+ try {
16
+ await fs.access(filePath);
17
+ return true;
18
+ }
19
+ catch {
20
+ return false;
21
+ }
22
+ }
23
+ async function detectWhatsAppLinked() {
24
+ const credsPath = path.join(WA_WEB_AUTH_DIR, "creds.json");
25
+ return await pathExists(credsPath);
26
+ }
27
+ async function noteProviderPrimer(prompter) {
28
+ await prompter.note([
29
+ "DM security: default is pairing; unknown DMs get a pairing code.",
30
+ "Approve with: nexus pairing approve --provider <provider> <code>",
31
+ 'Public DMs require dmPolicy="open" + allowFrom=["*"].',
32
+ "",
33
+ "WhatsApp: links via WhatsApp Web (scan QR), stores creds for future sends.",
34
+ "WhatsApp: dedicated second number recommended; primary number OK (self-chat).",
35
+ "Telegram: Bot API (token from @BotFather), replies via your bot.",
36
+ "Discord: Bot token from Discord Developer Portal; invite bot to your server.",
37
+ "Slack: Socket Mode app token + bot token, DMs via App Home Messages tab.",
38
+ "Signal: signal-cli as a linked device; separate number recommended.",
39
+ "iMessage: local imsg CLI; separate Apple ID recommended only on a separate Mac.",
40
+ ].join("\n"), "How providers work");
41
+ }
42
+ async function noteTelegramTokenHelp(prompter) {
43
+ await prompter.note([
44
+ "1) Open Telegram and chat with @BotFather",
45
+ "2) Run /newbot (or /mybots)",
46
+ "3) Copy the token (looks like 123456:ABC...)",
47
+ "Tip: you can also set TELEGRAM_BOT_TOKEN in your env.",
48
+ ].join("\n"), "Telegram bot token");
49
+ }
50
+ async function noteDiscordTokenHelp(prompter) {
51
+ await prompter.note([
52
+ "1) Discord Developer Portal → Applications → New Application",
53
+ "2) Bot → Add Bot → Reset Token → copy token",
54
+ "3) OAuth2 → URL Generator → scope 'bot' → invite to your server",
55
+ "Tip: enable Message Content Intent if you need message text.",
56
+ ].join("\n"), "Discord bot token");
57
+ }
58
+ function buildSlackManifest(botName) {
59
+ const safeName = botName.trim() || "Nexus";
60
+ const manifest = {
61
+ display_information: {
62
+ name: safeName,
63
+ description: `${safeName} connector for Nexus`,
64
+ },
65
+ features: {
66
+ bot_user: {
67
+ display_name: safeName,
68
+ always_online: false,
69
+ },
70
+ app_home: {
71
+ messages_tab_enabled: true,
72
+ messages_tab_read_only_enabled: false,
73
+ },
74
+ slash_commands: [
75
+ {
76
+ command: "/nexus",
77
+ description: "Send a message to Nexus",
78
+ should_escape: false,
79
+ },
80
+ ],
81
+ },
82
+ oauth_config: {
83
+ scopes: {
84
+ bot: [
85
+ "chat:write",
86
+ "channels:history",
87
+ "channels:read",
88
+ "groups:history",
89
+ "im:history",
90
+ "mpim:history",
91
+ "users:read",
92
+ "app_mentions:read",
93
+ "reactions:read",
94
+ "reactions:write",
95
+ "pins:read",
96
+ "pins:write",
97
+ "emoji:read",
98
+ "commands",
99
+ "files:read",
100
+ "files:write",
101
+ ],
102
+ },
103
+ },
104
+ settings: {
105
+ socket_mode_enabled: true,
106
+ event_subscriptions: {
107
+ bot_events: [
108
+ "app_mention",
109
+ "message.channels",
110
+ "message.groups",
111
+ "message.im",
112
+ "message.mpim",
113
+ "reaction_added",
114
+ "reaction_removed",
115
+ "member_joined_channel",
116
+ "member_left_channel",
117
+ "channel_rename",
118
+ "pin_added",
119
+ "pin_removed",
120
+ ],
121
+ },
122
+ },
123
+ };
124
+ return JSON.stringify(manifest, null, 2);
125
+ }
126
+ async function noteSlackTokenHelp(prompter, botName) {
127
+ const manifest = buildSlackManifest(botName);
128
+ await prompter.note([
129
+ "1) Slack API → Create App → From scratch",
130
+ "2) Add Socket Mode + enable it to get the app-level token (xapp-...)",
131
+ "3) OAuth & Permissions → install app to workspace (xoxb- bot token)",
132
+ "4) Enable Event Subscriptions (socket) for message events",
133
+ "5) App Home → enable the Messages tab for DMs",
134
+ "Tip: set SLACK_BOT_TOKEN + SLACK_APP_TOKEN in your env.",
135
+ "",
136
+ "Manifest (JSON):",
137
+ manifest,
138
+ ].join("\n"), "Slack socket mode tokens");
139
+ }
140
+ function setWhatsAppDmPolicy(cfg, dmPolicy) {
141
+ return {
142
+ ...cfg,
143
+ whatsapp: {
144
+ ...cfg.whatsapp,
145
+ dmPolicy,
146
+ },
147
+ };
148
+ }
149
+ function setWhatsAppAllowFrom(cfg, allowFrom) {
150
+ return {
151
+ ...cfg,
152
+ whatsapp: {
153
+ ...cfg.whatsapp,
154
+ allowFrom,
155
+ },
156
+ };
157
+ }
158
+ function setTelegramDmPolicy(cfg, dmPolicy) {
159
+ const allowFrom = dmPolicy === "open"
160
+ ? addWildcardAllowFrom(cfg.telegram?.allowFrom)
161
+ : undefined;
162
+ return {
163
+ ...cfg,
164
+ telegram: {
165
+ ...cfg.telegram,
166
+ dmPolicy,
167
+ ...(allowFrom ? { allowFrom } : {}),
168
+ },
169
+ };
170
+ }
171
+ function setDiscordDmPolicy(cfg, dmPolicy) {
172
+ const allowFrom = dmPolicy === "open"
173
+ ? addWildcardAllowFrom(cfg.discord?.dm?.allowFrom)
174
+ : undefined;
175
+ return {
176
+ ...cfg,
177
+ discord: {
178
+ ...cfg.discord,
179
+ dm: {
180
+ ...cfg.discord?.dm,
181
+ enabled: cfg.discord?.dm?.enabled ?? true,
182
+ policy: dmPolicy,
183
+ ...(allowFrom ? { allowFrom } : {}),
184
+ },
185
+ },
186
+ };
187
+ }
188
+ function setSlackDmPolicy(cfg, dmPolicy) {
189
+ const allowFrom = dmPolicy === "open"
190
+ ? addWildcardAllowFrom(cfg.slack?.dm?.allowFrom)
191
+ : undefined;
192
+ return {
193
+ ...cfg,
194
+ slack: {
195
+ ...cfg.slack,
196
+ dm: {
197
+ ...cfg.slack?.dm,
198
+ enabled: cfg.slack?.dm?.enabled ?? true,
199
+ policy: dmPolicy,
200
+ ...(allowFrom ? { allowFrom } : {}),
201
+ },
202
+ },
203
+ };
204
+ }
205
+ function setSignalDmPolicy(cfg, dmPolicy) {
206
+ const allowFrom = dmPolicy === "open"
207
+ ? addWildcardAllowFrom(cfg.signal?.allowFrom)
208
+ : undefined;
209
+ return {
210
+ ...cfg,
211
+ signal: {
212
+ ...cfg.signal,
213
+ dmPolicy,
214
+ ...(allowFrom ? { allowFrom } : {}),
215
+ },
216
+ };
217
+ }
218
+ function setIMessageDmPolicy(cfg, dmPolicy) {
219
+ const allowFrom = dmPolicy === "open"
220
+ ? addWildcardAllowFrom(cfg.imessage?.allowFrom)
221
+ : undefined;
222
+ return {
223
+ ...cfg,
224
+ imessage: {
225
+ ...cfg.imessage,
226
+ dmPolicy,
227
+ ...(allowFrom ? { allowFrom } : {}),
228
+ },
229
+ };
230
+ }
231
+ async function maybeConfigureDmPolicies(params) {
232
+ const { selection, prompter } = params;
233
+ const supportsDmPolicy = selection.some((p) => ["telegram", "discord", "slack", "signal", "imessage"].includes(p));
234
+ if (!supportsDmPolicy)
235
+ return params.cfg;
236
+ const wants = await prompter.confirm({
237
+ message: "Configure DM access policies now? (default: pairing)",
238
+ initialValue: false,
239
+ });
240
+ if (!wants)
241
+ return params.cfg;
242
+ let cfg = params.cfg;
243
+ const selectPolicy = async (params) => {
244
+ await prompter.note([
245
+ "Default: pairing (unknown DMs get a pairing code).",
246
+ `Approve: nexus pairing approve --provider ${params.provider} <code>`,
247
+ `Public DMs: ${params.policyKey}="open" + ${params.allowFromKey} includes "*".`,
248
+ ].join("\n"), `${params.label} DM access`);
249
+ return (await prompter.select({
250
+ message: `${params.label} DM policy`,
251
+ options: [
252
+ { value: "pairing", label: "Pairing (recommended)" },
253
+ { value: "open", label: "Open (public inbound DMs)" },
254
+ { value: "disabled", label: "Disabled (ignore DMs)" },
255
+ ],
256
+ }));
257
+ };
258
+ if (selection.includes("telegram")) {
259
+ const current = cfg.telegram?.dmPolicy ?? "pairing";
260
+ const policy = await selectPolicy({
261
+ label: "Telegram",
262
+ provider: "telegram",
263
+ policyKey: "telegram.dmPolicy",
264
+ allowFromKey: "telegram.allowFrom",
265
+ });
266
+ if (policy !== current)
267
+ cfg = setTelegramDmPolicy(cfg, policy);
268
+ }
269
+ if (selection.includes("discord")) {
270
+ const current = cfg.discord?.dm?.policy ?? "pairing";
271
+ const policy = await selectPolicy({
272
+ label: "Discord",
273
+ provider: "discord",
274
+ policyKey: "discord.dm.policy",
275
+ allowFromKey: "discord.dm.allowFrom",
276
+ });
277
+ if (policy !== current)
278
+ cfg = setDiscordDmPolicy(cfg, policy);
279
+ }
280
+ if (selection.includes("slack")) {
281
+ const current = cfg.slack?.dm?.policy ?? "pairing";
282
+ const policy = await selectPolicy({
283
+ label: "Slack",
284
+ provider: "slack",
285
+ policyKey: "slack.dm.policy",
286
+ allowFromKey: "slack.dm.allowFrom",
287
+ });
288
+ if (policy !== current)
289
+ cfg = setSlackDmPolicy(cfg, policy);
290
+ }
291
+ if (selection.includes("signal")) {
292
+ const current = cfg.signal?.dmPolicy ?? "pairing";
293
+ const policy = await selectPolicy({
294
+ label: "Signal",
295
+ provider: "signal",
296
+ policyKey: "signal.dmPolicy",
297
+ allowFromKey: "signal.allowFrom",
298
+ });
299
+ if (policy !== current)
300
+ cfg = setSignalDmPolicy(cfg, policy);
301
+ }
302
+ if (selection.includes("imessage")) {
303
+ const current = cfg.imessage?.dmPolicy ?? "pairing";
304
+ const policy = await selectPolicy({
305
+ label: "iMessage",
306
+ provider: "imessage",
307
+ policyKey: "imessage.dmPolicy",
308
+ allowFromKey: "imessage.allowFrom",
309
+ });
310
+ if (policy !== current)
311
+ cfg = setIMessageDmPolicy(cfg, policy);
312
+ }
313
+ return cfg;
314
+ }
315
+ async function promptWhatsAppAllowFrom(cfg, _runtime, prompter) {
316
+ const existingPolicy = cfg.whatsapp?.dmPolicy ?? "pairing";
317
+ const existingAllowFrom = cfg.whatsapp?.allowFrom ?? [];
318
+ const existingLabel = existingAllowFrom.length > 0 ? existingAllowFrom.join(", ") : "unset";
319
+ await prompter.note([
320
+ "WhatsApp direct chats are gated by `whatsapp.dmPolicy` + `whatsapp.allowFrom`.",
321
+ "- pairing (default): unknown senders get a pairing code; owner approves",
322
+ "- allowlist: unknown senders are blocked",
323
+ '- open: public inbound DMs (requires allowFrom to include "*")',
324
+ "- disabled: ignore WhatsApp DMs",
325
+ "",
326
+ `Current: dmPolicy=${existingPolicy}, allowFrom=${existingLabel}`,
327
+ ].join("\n"), "WhatsApp DM access");
328
+ const policy = (await prompter.select({
329
+ message: "WhatsApp DM policy",
330
+ options: [
331
+ { value: "pairing", label: "Pairing (recommended)" },
332
+ { value: "allowlist", label: "Allowlist only (block unknown senders)" },
333
+ { value: "open", label: "Open (public inbound DMs)" },
334
+ { value: "disabled", label: "Disabled (ignore WhatsApp DMs)" },
335
+ ],
336
+ }));
337
+ const next = setWhatsAppDmPolicy(cfg, policy);
338
+ if (policy === "open")
339
+ return setWhatsAppAllowFrom(next, ["*"]);
340
+ if (policy === "disabled")
341
+ return next;
342
+ const options = existingAllowFrom.length > 0
343
+ ? [
344
+ { value: "keep", label: "Keep current allowFrom" },
345
+ {
346
+ value: "unset",
347
+ label: "Unset allowFrom (use pairing approvals only)",
348
+ },
349
+ { value: "list", label: "Set allowFrom to specific numbers" },
350
+ ]
351
+ : [
352
+ { value: "unset", label: "Unset allowFrom (default)" },
353
+ { value: "list", label: "Set allowFrom to specific numbers" },
354
+ ];
355
+ const mode = (await prompter.select({
356
+ message: "WhatsApp allowFrom (optional pre-allowlist)",
357
+ options: options.map((opt) => ({ value: opt.value, label: opt.label })),
358
+ }));
359
+ if (mode === "keep")
360
+ return next;
361
+ if (mode === "unset")
362
+ return setWhatsAppAllowFrom(next, undefined);
363
+ const allowRaw = await prompter.text({
364
+ message: "Allowed sender numbers (comma-separated, E.164)",
365
+ placeholder: "+15555550123, +447700900123",
366
+ validate: (value) => {
367
+ const raw = String(value ?? "").trim();
368
+ if (!raw)
369
+ return "Required";
370
+ const parts = raw
371
+ .split(/[\n,;]+/g)
372
+ .map((p) => p.trim())
373
+ .filter(Boolean);
374
+ if (parts.length === 0)
375
+ return "Required";
376
+ for (const part of parts) {
377
+ if (part === "*")
378
+ continue;
379
+ const normalized = normalizeE164(part);
380
+ if (!normalized)
381
+ return `Invalid number: ${part}`;
382
+ }
383
+ return undefined;
384
+ },
385
+ });
386
+ const parts = String(allowRaw)
387
+ .split(/[\n,;]+/g)
388
+ .map((p) => p.trim())
389
+ .filter(Boolean);
390
+ const normalized = parts.map((part) => part === "*" ? "*" : normalizeE164(part));
391
+ const unique = [...new Set(normalized.filter(Boolean))];
392
+ return setWhatsAppAllowFrom(next, unique);
393
+ }
394
+ export async function setupProviders(cfg, runtime, prompter, options) {
395
+ const whatsappLinked = await detectWhatsAppLinked();
396
+ const telegramEnv = Boolean(process.env.TELEGRAM_BOT_TOKEN?.trim());
397
+ const discordEnv = Boolean(process.env.DISCORD_BOT_TOKEN?.trim());
398
+ const slackBotEnv = Boolean(process.env.SLACK_BOT_TOKEN?.trim());
399
+ const slackAppEnv = Boolean(process.env.SLACK_APP_TOKEN?.trim());
400
+ const telegramConfigured = Boolean(telegramEnv || cfg.telegram?.botToken || cfg.telegram?.tokenFile);
401
+ const discordConfigured = Boolean(discordEnv || cfg.discord?.token);
402
+ const slackConfigured = Boolean((slackBotEnv && slackAppEnv) ||
403
+ (cfg.slack?.botToken && cfg.slack?.appToken));
404
+ const signalConfigured = Boolean(cfg.signal?.account || cfg.signal?.httpUrl || cfg.signal?.httpPort);
405
+ const signalCliPath = cfg.signal?.cliPath ?? "signal-cli";
406
+ const signalCliDetected = await detectBinary(signalCliPath);
407
+ const imessageConfigured = Boolean(cfg.imessage?.cliPath || cfg.imessage?.dbPath || cfg.imessage?.allowFrom);
408
+ const imessageCliPath = cfg.imessage?.cliPath ?? "imsg";
409
+ const imessageCliDetected = await detectBinary(imessageCliPath);
410
+ await prompter.note([
411
+ `WhatsApp: ${whatsappLinked ? "linked" : "not linked"}`,
412
+ `Telegram: ${telegramConfigured ? "configured" : "needs token"}`,
413
+ `Discord: ${discordConfigured ? "configured" : "needs token"}`,
414
+ `Slack: ${slackConfigured ? "configured" : "needs tokens"}`,
415
+ `Signal: ${signalConfigured ? "configured" : "needs setup"}`,
416
+ `iMessage: ${imessageConfigured ? "configured" : "needs setup"}`,
417
+ `signal-cli: ${signalCliDetected ? "found" : "missing"} (${signalCliPath})`,
418
+ `imsg: ${imessageCliDetected ? "found" : "missing"} (${imessageCliPath})`,
419
+ ].join("\n"), "Provider status");
420
+ const shouldConfigure = await prompter.confirm({
421
+ message: "Configure chat providers now?",
422
+ initialValue: true,
423
+ });
424
+ if (!shouldConfigure)
425
+ return cfg;
426
+ await noteProviderPrimer(prompter);
427
+ const selection = (await prompter.multiselect({
428
+ message: "Select providers",
429
+ options: [
430
+ {
431
+ value: "whatsapp",
432
+ label: "WhatsApp (QR link)",
433
+ hint: whatsappLinked ? "linked" : "not linked",
434
+ },
435
+ {
436
+ value: "telegram",
437
+ label: "Telegram (Bot API)",
438
+ hint: telegramConfigured ? "configured" : "needs token",
439
+ },
440
+ {
441
+ value: "discord",
442
+ label: "Discord (Bot API)",
443
+ hint: discordConfigured ? "configured" : "needs token",
444
+ },
445
+ {
446
+ value: "slack",
447
+ label: "Slack (Socket Mode)",
448
+ hint: slackConfigured ? "configured" : "needs tokens",
449
+ },
450
+ {
451
+ value: "signal",
452
+ label: "Signal (signal-cli)",
453
+ hint: signalCliDetected ? "signal-cli found" : "signal-cli missing",
454
+ },
455
+ {
456
+ value: "imessage",
457
+ label: "iMessage (imsg)",
458
+ hint: imessageCliDetected ? "imsg found" : "imsg missing",
459
+ },
460
+ ],
461
+ }));
462
+ let next = cfg;
463
+ if (selection.includes("whatsapp")) {
464
+ if (!whatsappLinked) {
465
+ await prompter.note([
466
+ "Scan the QR with WhatsApp on your phone.",
467
+ `Credentials are stored under ${WA_WEB_AUTH_DIR}/ for future runs.`,
468
+ ].join("\n"), "WhatsApp linking");
469
+ }
470
+ const wantsLink = await prompter.confirm({
471
+ message: whatsappLinked
472
+ ? "WhatsApp already linked. Re-link now?"
473
+ : "Link WhatsApp now (QR)?",
474
+ initialValue: !whatsappLinked,
475
+ });
476
+ if (wantsLink) {
477
+ try {
478
+ await loginWeb(false, "web");
479
+ }
480
+ catch (err) {
481
+ runtime.error(`WhatsApp login failed: ${String(err)}`);
482
+ }
483
+ }
484
+ else if (!whatsappLinked) {
485
+ await prompter.note("Run `nexus login` later to link WhatsApp.", "WhatsApp");
486
+ }
487
+ next = await promptWhatsAppAllowFrom(next, runtime, prompter);
488
+ }
489
+ if (selection.includes("telegram")) {
490
+ let token = null;
491
+ if (!telegramConfigured) {
492
+ await noteTelegramTokenHelp(prompter);
493
+ }
494
+ if (telegramEnv && !cfg.telegram?.botToken) {
495
+ const keepEnv = await prompter.confirm({
496
+ message: "TELEGRAM_BOT_TOKEN detected. Use env var?",
497
+ initialValue: true,
498
+ });
499
+ if (keepEnv) {
500
+ next = {
501
+ ...next,
502
+ telegram: {
503
+ ...next.telegram,
504
+ enabled: true,
505
+ },
506
+ };
507
+ }
508
+ else {
509
+ token = String(await prompter.text({
510
+ message: "Enter Telegram bot token",
511
+ validate: (value) => (value?.trim() ? undefined : "Required"),
512
+ })).trim();
513
+ }
514
+ }
515
+ else if (cfg.telegram?.botToken) {
516
+ const keep = await prompter.confirm({
517
+ message: "Telegram token already configured. Keep it?",
518
+ initialValue: true,
519
+ });
520
+ if (!keep) {
521
+ token = String(await prompter.text({
522
+ message: "Enter Telegram bot token",
523
+ validate: (value) => (value?.trim() ? undefined : "Required"),
524
+ })).trim();
525
+ }
526
+ }
527
+ else {
528
+ token = String(await prompter.text({
529
+ message: "Enter Telegram bot token",
530
+ validate: (value) => (value?.trim() ? undefined : "Required"),
531
+ })).trim();
532
+ }
533
+ if (token) {
534
+ next = {
535
+ ...next,
536
+ telegram: {
537
+ ...next.telegram,
538
+ enabled: true,
539
+ botToken: token,
540
+ },
541
+ };
542
+ }
543
+ }
544
+ if (selection.includes("discord")) {
545
+ let token = null;
546
+ if (!discordConfigured) {
547
+ await noteDiscordTokenHelp(prompter);
548
+ }
549
+ if (discordEnv && !cfg.discord?.token) {
550
+ const keepEnv = await prompter.confirm({
551
+ message: "DISCORD_BOT_TOKEN detected. Use env var?",
552
+ initialValue: true,
553
+ });
554
+ if (keepEnv) {
555
+ next = {
556
+ ...next,
557
+ discord: {
558
+ ...next.discord,
559
+ enabled: true,
560
+ },
561
+ };
562
+ }
563
+ else {
564
+ token = String(await prompter.text({
565
+ message: "Enter Discord bot token",
566
+ validate: (value) => (value?.trim() ? undefined : "Required"),
567
+ })).trim();
568
+ }
569
+ }
570
+ else if (cfg.discord?.token) {
571
+ const keep = await prompter.confirm({
572
+ message: "Discord token already configured. Keep it?",
573
+ initialValue: true,
574
+ });
575
+ if (!keep) {
576
+ token = String(await prompter.text({
577
+ message: "Enter Discord bot token",
578
+ validate: (value) => (value?.trim() ? undefined : "Required"),
579
+ })).trim();
580
+ }
581
+ }
582
+ else {
583
+ token = String(await prompter.text({
584
+ message: "Enter Discord bot token",
585
+ validate: (value) => (value?.trim() ? undefined : "Required"),
586
+ })).trim();
587
+ }
588
+ if (token) {
589
+ next = {
590
+ ...next,
591
+ discord: {
592
+ ...next.discord,
593
+ enabled: true,
594
+ token,
595
+ },
596
+ };
597
+ }
598
+ }
599
+ if (selection.includes("slack")) {
600
+ let botToken = null;
601
+ let appToken = null;
602
+ const slackBotName = String(await prompter.text({
603
+ message: "Slack bot display name (used for manifest)",
604
+ initialValue: "Nexus",
605
+ })).trim();
606
+ if (!slackConfigured) {
607
+ await noteSlackTokenHelp(prompter, slackBotName);
608
+ }
609
+ if (slackBotEnv &&
610
+ slackAppEnv &&
611
+ (!cfg.slack?.botToken || !cfg.slack?.appToken)) {
612
+ const keepEnv = await prompter.confirm({
613
+ message: "SLACK_BOT_TOKEN + SLACK_APP_TOKEN detected. Use env vars?",
614
+ initialValue: true,
615
+ });
616
+ if (keepEnv) {
617
+ next = {
618
+ ...next,
619
+ slack: {
620
+ ...next.slack,
621
+ enabled: true,
622
+ },
623
+ };
624
+ }
625
+ else {
626
+ botToken = String(await prompter.text({
627
+ message: "Enter Slack bot token (xoxb-...)",
628
+ validate: (value) => (value?.trim() ? undefined : "Required"),
629
+ })).trim();
630
+ appToken = String(await prompter.text({
631
+ message: "Enter Slack app token (xapp-...)",
632
+ validate: (value) => (value?.trim() ? undefined : "Required"),
633
+ })).trim();
634
+ }
635
+ }
636
+ else if (cfg.slack?.botToken && cfg.slack?.appToken) {
637
+ const keep = await prompter.confirm({
638
+ message: "Slack tokens already configured. Keep them?",
639
+ initialValue: true,
640
+ });
641
+ if (!keep) {
642
+ botToken = String(await prompter.text({
643
+ message: "Enter Slack bot token (xoxb-...)",
644
+ validate: (value) => (value?.trim() ? undefined : "Required"),
645
+ })).trim();
646
+ appToken = String(await prompter.text({
647
+ message: "Enter Slack app token (xapp-...)",
648
+ validate: (value) => (value?.trim() ? undefined : "Required"),
649
+ })).trim();
650
+ }
651
+ }
652
+ else {
653
+ botToken = String(await prompter.text({
654
+ message: "Enter Slack bot token (xoxb-...)",
655
+ validate: (value) => (value?.trim() ? undefined : "Required"),
656
+ })).trim();
657
+ appToken = String(await prompter.text({
658
+ message: "Enter Slack app token (xapp-...)",
659
+ validate: (value) => (value?.trim() ? undefined : "Required"),
660
+ })).trim();
661
+ }
662
+ if (botToken && appToken) {
663
+ next = {
664
+ ...next,
665
+ slack: {
666
+ ...next.slack,
667
+ enabled: true,
668
+ botToken,
669
+ appToken,
670
+ },
671
+ };
672
+ }
673
+ }
674
+ if (selection.includes("signal")) {
675
+ let resolvedCliPath = signalCliPath;
676
+ let cliDetected = signalCliDetected;
677
+ if (options?.allowSignalInstall) {
678
+ const wantsInstall = await prompter.confirm({
679
+ message: cliDetected
680
+ ? "signal-cli detected. Reinstall/update now?"
681
+ : "signal-cli not found. Install now?",
682
+ initialValue: !cliDetected,
683
+ });
684
+ if (wantsInstall) {
685
+ try {
686
+ const result = await installSignalCli(runtime);
687
+ if (result.ok && result.cliPath) {
688
+ cliDetected = true;
689
+ resolvedCliPath = result.cliPath;
690
+ await prompter.note(`Installed signal-cli at ${result.cliPath}`, "Signal");
691
+ }
692
+ else if (!result.ok) {
693
+ await prompter.note(result.error ?? "signal-cli install failed.", "Signal");
694
+ }
695
+ }
696
+ catch (err) {
697
+ await prompter.note(`signal-cli install failed: ${String(err)}`, "Signal");
698
+ }
699
+ }
700
+ }
701
+ if (!cliDetected) {
702
+ await prompter.note("signal-cli not found. Install it, then rerun this step or set signal.cliPath.", "Signal");
703
+ }
704
+ let account = cfg.signal?.account ?? "";
705
+ if (account) {
706
+ const keep = await prompter.confirm({
707
+ message: `Signal account set (${account}). Keep it?`,
708
+ initialValue: true,
709
+ });
710
+ if (!keep)
711
+ account = "";
712
+ }
713
+ if (!account) {
714
+ account = String(await prompter.text({
715
+ message: "Signal bot number (E.164)",
716
+ validate: (value) => (value?.trim() ? undefined : "Required"),
717
+ })).trim();
718
+ }
719
+ if (account) {
720
+ next = {
721
+ ...next,
722
+ signal: {
723
+ ...next.signal,
724
+ enabled: true,
725
+ account,
726
+ cliPath: resolvedCliPath ?? "signal-cli",
727
+ },
728
+ };
729
+ }
730
+ await prompter.note([
731
+ 'Link device with: signal-cli link -n "Nexus"',
732
+ "Scan QR in Signal → Linked Devices",
733
+ "Then run: nexus gateway call providers.status --params '{\"probe\":true}'",
734
+ ].join("\n"), "Signal next steps");
735
+ }
736
+ if (selection.includes("imessage")) {
737
+ let resolvedCliPath = imessageCliPath;
738
+ if (!imessageCliDetected) {
739
+ const entered = await prompter.text({
740
+ message: "imsg CLI path",
741
+ initialValue: resolvedCliPath,
742
+ validate: (value) => (value?.trim() ? undefined : "Required"),
743
+ });
744
+ resolvedCliPath = String(entered).trim();
745
+ if (!resolvedCliPath) {
746
+ await prompter.note("imsg CLI path required to enable iMessage.", "iMessage");
747
+ }
748
+ }
749
+ if (resolvedCliPath) {
750
+ next = {
751
+ ...next,
752
+ imessage: {
753
+ ...next.imessage,
754
+ enabled: true,
755
+ cliPath: resolvedCliPath,
756
+ },
757
+ };
758
+ }
759
+ await prompter.note([
760
+ "Ensure Nexus has Full Disk Access to Messages DB.",
761
+ "Grant Automation permission for Messages when prompted.",
762
+ "List chats with: imsg chats --limit 20",
763
+ ].join("\n"), "iMessage next steps");
764
+ }
765
+ next = await maybeConfigureDmPolicies({ cfg: next, selection, prompter });
766
+ if (options?.allowDisable) {
767
+ if (!selection.includes("telegram") && telegramConfigured) {
768
+ const disable = await prompter.confirm({
769
+ message: "Disable Telegram provider?",
770
+ initialValue: false,
771
+ });
772
+ if (disable) {
773
+ next = {
774
+ ...next,
775
+ telegram: { ...next.telegram, enabled: false },
776
+ };
777
+ }
778
+ }
779
+ if (!selection.includes("discord") && discordConfigured) {
780
+ const disable = await prompter.confirm({
781
+ message: "Disable Discord provider?",
782
+ initialValue: false,
783
+ });
784
+ if (disable) {
785
+ next = {
786
+ ...next,
787
+ discord: { ...next.discord, enabled: false },
788
+ };
789
+ }
790
+ }
791
+ if (!selection.includes("slack") && slackConfigured) {
792
+ const disable = await prompter.confirm({
793
+ message: "Disable Slack provider?",
794
+ initialValue: false,
795
+ });
796
+ if (disable) {
797
+ next = {
798
+ ...next,
799
+ slack: { ...next.slack, enabled: false },
800
+ };
801
+ }
802
+ }
803
+ if (!selection.includes("signal") && signalConfigured) {
804
+ const disable = await prompter.confirm({
805
+ message: "Disable Signal provider?",
806
+ initialValue: false,
807
+ });
808
+ if (disable) {
809
+ next = {
810
+ ...next,
811
+ signal: { ...next.signal, enabled: false },
812
+ };
813
+ }
814
+ }
815
+ if (!selection.includes("imessage") && imessageConfigured) {
816
+ const disable = await prompter.confirm({
817
+ message: "Disable iMessage provider?",
818
+ initialValue: false,
819
+ });
820
+ if (disable) {
821
+ next = {
822
+ ...next,
823
+ imessage: { ...next.imessage, enabled: false },
824
+ };
825
+ }
826
+ }
827
+ }
828
+ return next;
829
+ }