@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,59 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import JSON5 from "json5";
4
+ import { DEFAULT_AGENT_WORKSPACE_DIR, ensureAgentWorkspace } from "../agents/workspace.js";
5
+ import { CONFIG_PATH_NEXUS } from "../config/config.js";
6
+ import { applyModelDefaults } from "../config/defaults.js";
7
+ import { resolveSessionTranscriptsDir } from "../config/sessions.js";
8
+ import { defaultRuntime } from "../runtime.js";
9
+ async function readConfigFileRaw() {
10
+ try {
11
+ const raw = await fs.readFile(CONFIG_PATH_NEXUS, "utf-8");
12
+ const parsed = JSON5.parse(raw);
13
+ if (parsed && typeof parsed === "object") {
14
+ return { exists: true, parsed: parsed };
15
+ }
16
+ return { exists: true, parsed: {} };
17
+ }
18
+ catch {
19
+ return { exists: false, parsed: {} };
20
+ }
21
+ }
22
+ async function writeConfigFile(cfg) {
23
+ await fs.mkdir(path.dirname(CONFIG_PATH_NEXUS), { recursive: true });
24
+ const json = JSON.stringify(applyModelDefaults(cfg), null, 2).trimEnd().concat("\n");
25
+ await fs.writeFile(CONFIG_PATH_NEXUS, json, "utf-8");
26
+ }
27
+ export async function setupCommand(opts, runtime = defaultRuntime) {
28
+ const desiredWorkspace = typeof opts?.workspace === "string" && opts.workspace.trim()
29
+ ? opts.workspace.trim()
30
+ : undefined;
31
+ const existingRaw = await readConfigFileRaw();
32
+ const cfg = existingRaw.parsed;
33
+ const agent = cfg.agent ?? {};
34
+ const workspace = desiredWorkspace ?? agent.workspace ?? DEFAULT_AGENT_WORKSPACE_DIR;
35
+ const next = {
36
+ ...cfg,
37
+ agent: {
38
+ ...agent,
39
+ workspace,
40
+ },
41
+ };
42
+ if (!existingRaw.exists || agent.workspace !== workspace) {
43
+ await writeConfigFile(next);
44
+ runtime.log(!existingRaw.exists
45
+ ? `Wrote ${CONFIG_PATH_NEXUS}`
46
+ : `Updated ${CONFIG_PATH_NEXUS} (set agent.workspace)`);
47
+ }
48
+ else {
49
+ runtime.log(`Config OK: ${CONFIG_PATH_NEXUS}`);
50
+ }
51
+ const ws = await ensureAgentWorkspace({
52
+ dir: workspace,
53
+ ensureBootstrapFiles: !next.agent?.skipBootstrap,
54
+ });
55
+ runtime.log(`Workspace OK: ${ws.dir}`);
56
+ const sessionsDir = resolveSessionTranscriptsDir();
57
+ await fs.mkdir(sessionsDir, { recursive: true });
58
+ runtime.log(`Sessions OK: ${sessionsDir}`);
59
+ }
@@ -0,0 +1,135 @@
1
+ import { createWriteStream } from "node:fs";
2
+ import fs from "node:fs/promises";
3
+ import { request } from "node:https";
4
+ import os from "node:os";
5
+ import path from "node:path";
6
+ import { pipeline } from "node:stream/promises";
7
+ import { runCommandWithTimeout } from "../process/exec.js";
8
+ import { CONFIG_DIR } from "../utils.js";
9
+ function looksLikeArchive(name) {
10
+ return (name.endsWith(".tar.gz") || name.endsWith(".tgz") || name.endsWith(".zip"));
11
+ }
12
+ function pickAsset(assets, platform) {
13
+ const withName = assets.filter((asset) => Boolean(asset.name && asset.browser_download_url));
14
+ const byName = (pattern) => withName.find((asset) => pattern.test(asset.name.toLowerCase()));
15
+ if (platform === "linux") {
16
+ return (byName(/linux-native/) ||
17
+ byName(/linux/) ||
18
+ withName.find((asset) => looksLikeArchive(asset.name.toLowerCase())));
19
+ }
20
+ if (platform === "darwin") {
21
+ return (byName(/macos|osx|darwin/) ||
22
+ withName.find((asset) => looksLikeArchive(asset.name.toLowerCase())));
23
+ }
24
+ if (platform === "win32") {
25
+ return (byName(/windows|win/) ||
26
+ withName.find((asset) => looksLikeArchive(asset.name.toLowerCase())));
27
+ }
28
+ return withName.find((asset) => looksLikeArchive(asset.name.toLowerCase()));
29
+ }
30
+ async function downloadToFile(url, dest, maxRedirects = 5) {
31
+ await new Promise((resolve, reject) => {
32
+ const req = request(url, (res) => {
33
+ if (res.statusCode && res.statusCode >= 300 && res.statusCode < 400) {
34
+ const location = res.headers.location;
35
+ if (!location || maxRedirects <= 0) {
36
+ reject(new Error("Redirect loop or missing Location header"));
37
+ return;
38
+ }
39
+ const redirectUrl = new URL(location, url).href;
40
+ resolve(downloadToFile(redirectUrl, dest, maxRedirects - 1));
41
+ return;
42
+ }
43
+ if (!res.statusCode || res.statusCode >= 400) {
44
+ reject(new Error(`HTTP ${res.statusCode ?? "?"} downloading file`));
45
+ return;
46
+ }
47
+ const out = createWriteStream(dest);
48
+ pipeline(res, out).then(resolve).catch(reject);
49
+ });
50
+ req.on("error", reject);
51
+ req.end();
52
+ });
53
+ }
54
+ async function findSignalCliBinary(root) {
55
+ const candidates = [];
56
+ const enqueue = async (dir, depth) => {
57
+ if (depth > 3)
58
+ return;
59
+ const entries = await fs
60
+ .readdir(dir, { withFileTypes: true })
61
+ .catch(() => []);
62
+ for (const entry of entries) {
63
+ const full = path.join(dir, entry.name);
64
+ if (entry.isDirectory()) {
65
+ await enqueue(full, depth + 1);
66
+ }
67
+ else if (entry.isFile() && entry.name === "signal-cli") {
68
+ candidates.push(full);
69
+ }
70
+ }
71
+ };
72
+ await enqueue(root, 0);
73
+ return candidates[0] ?? null;
74
+ }
75
+ export async function installSignalCli(runtime) {
76
+ if (process.platform === "win32") {
77
+ return {
78
+ ok: false,
79
+ error: "Signal CLI auto-install is not supported on Windows yet.",
80
+ };
81
+ }
82
+ const apiUrl = "https://api.github.com/repos/AsamK/signal-cli/releases/latest";
83
+ const response = await fetch(apiUrl, {
84
+ headers: {
85
+ "User-Agent": "nexus",
86
+ Accept: "application/vnd.github+json",
87
+ },
88
+ });
89
+ if (!response.ok) {
90
+ return {
91
+ ok: false,
92
+ error: `Failed to fetch release info (${response.status})`,
93
+ };
94
+ }
95
+ const payload = (await response.json());
96
+ const version = payload.tag_name?.replace(/^v/, "") ?? "unknown";
97
+ const assets = payload.assets ?? [];
98
+ const asset = pickAsset(assets, process.platform);
99
+ const assetName = asset?.name ?? "";
100
+ const assetUrl = asset?.browser_download_url ?? "";
101
+ if (!assetName || !assetUrl) {
102
+ return {
103
+ ok: false,
104
+ error: "No compatible release asset found for this platform.",
105
+ };
106
+ }
107
+ const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "nexus-signal-"));
108
+ const archivePath = path.join(tmpDir, assetName);
109
+ runtime.log(`Downloading signal-cli ${version} (${assetName})…`);
110
+ await downloadToFile(assetUrl, archivePath);
111
+ const installRoot = path.join(CONFIG_DIR, "tools", "signal-cli", version);
112
+ await fs.mkdir(installRoot, { recursive: true });
113
+ if (assetName.endsWith(".zip")) {
114
+ await runCommandWithTimeout(["unzip", "-q", archivePath, "-d", installRoot], {
115
+ timeoutMs: 60_000,
116
+ });
117
+ }
118
+ else if (assetName.endsWith(".tar.gz") || assetName.endsWith(".tgz")) {
119
+ await runCommandWithTimeout(["tar", "-xzf", archivePath, "-C", installRoot], {
120
+ timeoutMs: 60_000,
121
+ });
122
+ }
123
+ else {
124
+ return { ok: false, error: `Unsupported archive type: ${assetName}` };
125
+ }
126
+ const cliPath = await findSignalCliBinary(installRoot);
127
+ if (!cliPath) {
128
+ return {
129
+ ok: false,
130
+ error: `signal-cli binary not found after extracting ${assetName}`,
131
+ };
132
+ }
133
+ await fs.chmod(cliPath, 0o755).catch(() => { });
134
+ return { ok: true, cliPath, version };
135
+ }
@@ -0,0 +1,235 @@
1
+ import fs from "node:fs";
2
+ import fsp from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { resolveStateDir } from "../config/paths.js";
6
+ /**
7
+ * Parse skill frontmatter to extract name and description
8
+ */
9
+ function parseSkillFrontmatter(content) {
10
+ const result = {};
11
+ const normalized = content.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
12
+ if (!normalized.startsWith("---"))
13
+ return result;
14
+ const endIndex = normalized.indexOf("\n---", 3);
15
+ if (endIndex === -1)
16
+ return result;
17
+ const block = normalized.slice(4, endIndex);
18
+ for (const line of block.split("\n")) {
19
+ const match = line.match(/^(name|description):\s*(.*)$/);
20
+ if (!match)
21
+ continue;
22
+ const key = match[1];
23
+ let value = match[2].trim();
24
+ // Strip quotes
25
+ if ((value.startsWith('"') && value.endsWith('"')) ||
26
+ (value.startsWith("'") && value.endsWith("'"))) {
27
+ value = value.slice(1, -1);
28
+ }
29
+ result[key] = value;
30
+ }
31
+ return result;
32
+ }
33
+ /**
34
+ * Resolve the bundled skills directory from the installed Nexus package.
35
+ * This finds skills shipped with the CLI, NOT from user workspace.
36
+ */
37
+ export function resolveBundledSkillsDir() {
38
+ // Check env override first
39
+ const override = process.env.NEXUS_BUNDLED_SKILLS_DIR?.trim();
40
+ if (override && fs.existsSync(override))
41
+ return override;
42
+ // bun --compile: ship a sibling `skills/` next to the executable
43
+ try {
44
+ const execDir = path.dirname(process.execPath);
45
+ const sibling = path.join(execDir, "skills");
46
+ if (fs.existsSync(sibling))
47
+ return sibling;
48
+ }
49
+ catch {
50
+ // ignore
51
+ }
52
+ // npm/dev: resolve `<packageRoot>/skills` relative to this module
53
+ try {
54
+ const moduleDir = path.dirname(fileURLToPath(import.meta.url));
55
+ const root = path.resolve(moduleDir, "..", "..");
56
+ const candidate = path.join(root, "skills");
57
+ if (fs.existsSync(candidate))
58
+ return candidate;
59
+ }
60
+ catch {
61
+ // ignore
62
+ }
63
+ return undefined;
64
+ }
65
+ /**
66
+ * Scan a directory for SKILL.md files and return manifest entries
67
+ */
68
+ async function scanSkillsDir(dir, source) {
69
+ const skills = {};
70
+ if (!fs.existsSync(dir)) {
71
+ return skills;
72
+ }
73
+ const entries = await fsp.readdir(dir, { withFileTypes: true });
74
+ for (const entry of entries) {
75
+ if (!entry.isDirectory())
76
+ continue;
77
+ if (entry.name.startsWith("."))
78
+ continue;
79
+ const skillPath = path.join(dir, entry.name, "SKILL.md");
80
+ if (!fs.existsSync(skillPath))
81
+ continue;
82
+ try {
83
+ const content = await fsp.readFile(skillPath, "utf-8");
84
+ const frontmatter = parseSkillFrontmatter(content);
85
+ const name = frontmatter.name || entry.name;
86
+ skills[name] = {
87
+ name,
88
+ description: frontmatter.description,
89
+ version: source === "bundled" ? "bundled" : "installed",
90
+ enabled: true,
91
+ source,
92
+ dirName: entry.name,
93
+ };
94
+ }
95
+ catch {
96
+ // Skip malformed skills
97
+ }
98
+ }
99
+ return skills;
100
+ }
101
+ /**
102
+ * Copy bundled skills from installed package to ~/nexus/skills/
103
+ */
104
+ export async function copyBundledSkills(targetDir) {
105
+ const bundledDir = resolveBundledSkillsDir();
106
+ const result = {
107
+ copied: [],
108
+ skipped: [],
109
+ errors: [],
110
+ };
111
+ if (!bundledDir) {
112
+ result.errors.push("Bundled skills directory not found in package");
113
+ return result;
114
+ }
115
+ await fsp.mkdir(targetDir, { recursive: true });
116
+ const entries = await fsp.readdir(bundledDir, { withFileTypes: true });
117
+ for (const entry of entries) {
118
+ if (!entry.isDirectory())
119
+ continue;
120
+ if (entry.name.startsWith("."))
121
+ continue;
122
+ const sourcePath = path.join(bundledDir, entry.name);
123
+ const targetPath = path.join(targetDir, entry.name);
124
+ // Check if SKILL.md exists
125
+ if (!fs.existsSync(path.join(sourcePath, "SKILL.md")))
126
+ continue;
127
+ try {
128
+ // Check if already exists
129
+ if (fs.existsSync(targetPath)) {
130
+ result.skipped.push(entry.name);
131
+ continue;
132
+ }
133
+ // Copy recursively
134
+ await fsp.cp(sourcePath, targetPath, { recursive: true });
135
+ result.copied.push(entry.name);
136
+ }
137
+ catch (err) {
138
+ result.errors.push(`${entry.name}: ${err instanceof Error ? err.message : String(err)}`);
139
+ }
140
+ }
141
+ return result;
142
+ }
143
+ /**
144
+ * Generate a complete skill manifest by scanning skill directories
145
+ */
146
+ export async function generateSkillManifest(skillsDir, userSkillsDir) {
147
+ // Skills in ~/nexus/skills/ are considered "bundled" (copied from package)
148
+ // Skills user installs via NexusHub go in a managed/ subfolder or directly
149
+ // User skills are in ~/nexus/home/skills/
150
+ const bundledSkills = await scanSkillsDir(skillsDir, "bundled");
151
+ // Check for managed subfolder (NexusHub installs)
152
+ const managedDir = path.join(skillsDir, "managed");
153
+ const managedSkills = fs.existsSync(managedDir)
154
+ ? await scanSkillsDir(managedDir, "managed")
155
+ : {};
156
+ // User skills from workspace
157
+ const userSkills = userSkillsDir
158
+ ? await scanSkillsDir(userSkillsDir, "user")
159
+ : {};
160
+ return {
161
+ version: 1,
162
+ lastUpdated: new Date().toISOString(),
163
+ bundled: {
164
+ count: Object.keys(bundledSkills).length,
165
+ skills: bundledSkills,
166
+ },
167
+ managed: {
168
+ count: Object.keys(managedSkills).length,
169
+ skills: managedSkills,
170
+ },
171
+ user: {
172
+ count: Object.keys(userSkills).length,
173
+ skills: userSkills,
174
+ },
175
+ };
176
+ }
177
+ /**
178
+ * Get the path to the skills manifest file
179
+ */
180
+ export function getSkillManifestPath() {
181
+ return path.join(resolveStateDir(), "nexus", "skills", "manifest.json");
182
+ }
183
+ /**
184
+ * Write the skill manifest to disk
185
+ */
186
+ export async function writeSkillManifest(manifest) {
187
+ const manifestPath = getSkillManifestPath();
188
+ const stateDir = path.dirname(manifestPath);
189
+ await fsp.mkdir(stateDir, { recursive: true });
190
+ await fsp.writeFile(manifestPath, JSON.stringify(manifest, null, 2), "utf-8");
191
+ }
192
+ /**
193
+ * Read the skill manifest from disk
194
+ */
195
+ export async function readSkillManifest() {
196
+ const manifestPath = getSkillManifestPath();
197
+ try {
198
+ const content = await fsp.readFile(manifestPath, "utf-8");
199
+ return JSON.parse(content);
200
+ }
201
+ catch {
202
+ return undefined;
203
+ }
204
+ }
205
+ /**
206
+ * Get all skills as a flat list for display
207
+ */
208
+ export function flattenManifest(manifest) {
209
+ const all = [];
210
+ // Add in precedence order: bundled < managed < user
211
+ for (const skill of Object.values(manifest.bundled.skills)) {
212
+ all.push(skill);
213
+ }
214
+ for (const skill of Object.values(manifest.managed.skills)) {
215
+ // Managed overrides bundled
216
+ const existingIdx = all.findIndex((s) => s.name === skill.name);
217
+ if (existingIdx >= 0) {
218
+ all[existingIdx] = skill;
219
+ }
220
+ else {
221
+ all.push(skill);
222
+ }
223
+ }
224
+ for (const skill of Object.values(manifest.user.skills)) {
225
+ // User overrides all
226
+ const existingIdx = all.findIndex((s) => s.name === skill.name);
227
+ if (existingIdx >= 0) {
228
+ all[existingIdx] = skill;
229
+ }
230
+ else {
231
+ all.push(skill);
232
+ }
233
+ }
234
+ return all.sort((a, b) => a.name.localeCompare(b.name));
235
+ }
@@ -0,0 +1,139 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { detectCapabilities } from "../capabilities/detector.js";
4
+ import { listCredentials } from "./credential.js";
5
+ import { resolveStateDir } from "../config/paths.js";
6
+ import { defaultRuntime } from "../runtime.js";
7
+ function readField(pathname, label) {
8
+ try {
9
+ const raw = fs.readFileSync(pathname, "utf-8");
10
+ const regex = new RegExp(`^[-*]?\\s*${label}\\s*:\\s*(.+)$`, "im");
11
+ const match = raw.match(regex);
12
+ return match?.[1]?.trim();
13
+ }
14
+ catch {
15
+ return undefined;
16
+ }
17
+ }
18
+ function getIdentitySnapshot() {
19
+ const stateDir = resolveStateDir();
20
+ const agentId = process.env.NEXUS_AGENT_ID?.trim() || "default";
21
+ const agentIdentityDir = path.join(stateDir, "agents", agentId, "identity");
22
+ const userIdentityDir = path.join(stateDir, "user", "identity");
23
+ const onboardingDir = path.join(stateDir, "nexus", "onboarding");
24
+ const agentIdentityPath = path.join(agentIdentityDir, "IDENTITY.md");
25
+ const agentSoulPath = path.join(agentIdentityDir, "SOUL.md");
26
+ const agentMemoryPath = path.join(agentIdentityDir, "MEMORY.md");
27
+ const userProfilePath = path.join(userIdentityDir, "PROFILE.md");
28
+ const bootstrapPath = path.join(onboardingDir, "BOOTSTRAP.md");
29
+ const hasIdentity = fs.existsSync(agentIdentityPath) && fs.existsSync(userProfilePath);
30
+ const agentName = readField(agentIdentityPath, "Name");
31
+ const userName = readField(userProfilePath, "Name");
32
+ return {
33
+ agentId,
34
+ agentName,
35
+ userName,
36
+ agentIdentityPath,
37
+ agentSoulPath,
38
+ agentMemoryPath,
39
+ userProfilePath,
40
+ bootstrapPath,
41
+ hasIdentity,
42
+ };
43
+ }
44
+ function readBootstrapPrompt(pathname) {
45
+ try {
46
+ return fs.readFileSync(pathname, "utf-8");
47
+ }
48
+ catch {
49
+ return null;
50
+ }
51
+ }
52
+ function formatSuggestions(capabilities) {
53
+ const picks = capabilities.filter((cap) => ["ready", "needs_setup", "needs_install", "broken"].includes(cap.status));
54
+ const sorted = picks.sort((a, b) => a.status.localeCompare(b.status));
55
+ return sorted.slice(0, 3).map((cap, idx) => ({
56
+ id: cap.id,
57
+ status: cap.status,
58
+ index: idx + 1,
59
+ }));
60
+ }
61
+ export async function statusCommand(opts, runtime = defaultRuntime) {
62
+ const identity = getIdentitySnapshot();
63
+ const bootstrapPrompt = !identity.hasIdentity
64
+ ? readBootstrapPrompt(identity.bootstrapPath)
65
+ : null;
66
+ const showBrief = opts.brief === true;
67
+ const showCredentials = opts.credentials === true || (!opts.capabilities && !showBrief);
68
+ const showCapabilities = opts.capabilities === true || (!opts.credentials && !showBrief);
69
+ const credentials = showCredentials ? await listCredentials() : null;
70
+ const capabilitySnapshot = showCapabilities ? detectCapabilities() : null;
71
+ const suggestions = capabilitySnapshot ? formatSuggestions(capabilitySnapshot.capabilities) : [];
72
+ if (opts.json) {
73
+ runtime.log(JSON.stringify({
74
+ platform: `${process.platform}/${process.arch}`,
75
+ identity,
76
+ bootstrap: bootstrapPrompt ? { required: true, prompt: bootstrapPrompt } : undefined,
77
+ credentials: credentials ?? undefined,
78
+ capabilities: capabilitySnapshot ?? undefined,
79
+ suggestions,
80
+ }, null, 2));
81
+ return;
82
+ }
83
+ runtime.log(`\nNexus Status (${process.platform}/${process.arch})`);
84
+ if (bootstrapPrompt) {
85
+ runtime.log("\nBootstrap required (identity missing).");
86
+ runtime.log(`\nBootstrap prompt (${identity.bootstrapPath}):\n`);
87
+ runtime.log(bootstrapPrompt.trimEnd());
88
+ return;
89
+ }
90
+ runtime.log("\nIdentity");
91
+ runtime.log(` User: ${identity.userName ?? "(unknown)"} → ${identity.userProfilePath}`);
92
+ runtime.log(` Agent: ${identity.agentName ?? "(unknown)"} (${identity.agentId}) → ${identity.agentIdentityPath}`);
93
+ runtime.log(` → ${identity.agentSoulPath}`);
94
+ runtime.log(` → ${identity.agentMemoryPath}`);
95
+ if (showCredentials && credentials) {
96
+ const services = Object.entries(credentials.services ?? {});
97
+ runtime.log(`\nCredentials (${services.length} services)`);
98
+ for (const [service, info] of services) {
99
+ const accounts = info.accounts ?? [];
100
+ const summary = accounts.length > 0 ? `${accounts.length} account(s)` : "no accounts";
101
+ runtime.log(` ${service}: ${summary}`);
102
+ }
103
+ }
104
+ if (showCapabilities && capabilitySnapshot) {
105
+ runtime.log(`\nCapabilities (${capabilitySnapshot.summary.active}/${capabilitySnapshot.summary.total} active)`);
106
+ for (const [category, entries] of Object.entries(capabilitySnapshot.registry.categories)) {
107
+ const categoryCaps = capabilitySnapshot.capabilities.filter((cap) => cap.category === category);
108
+ const activeCount = categoryCaps.filter((cap) => cap.status === "active").length;
109
+ if (categoryCaps.length === 0)
110
+ continue;
111
+ runtime.log(` ${category} (${activeCount}/${categoryCaps.length})`);
112
+ const sample = categoryCaps.slice(0, 3);
113
+ for (const cap of sample) {
114
+ const providers = cap.providers.map((p) => p.id).join(", ");
115
+ runtime.log(` - ${cap.id}: ${providers || cap.providersRaw}`);
116
+ }
117
+ }
118
+ }
119
+ if (suggestions.length > 0) {
120
+ runtime.log("\nSuggestions");
121
+ for (const suggestion of suggestions) {
122
+ runtime.log(` ${suggestion.index}. ${suggestion.id} (${suggestion.status})`);
123
+ }
124
+ }
125
+ runtime.log(`\nNext: run 'nexus capabilities' or 'nexus credential list' for details.`);
126
+ }
127
+ export async function getStatusSummary() {
128
+ const identity = getIdentitySnapshot();
129
+ return {
130
+ ok: true,
131
+ platform: `${process.platform}/${process.arch}`,
132
+ identity: {
133
+ agentId: identity.agentId,
134
+ hasIdentity: identity.hasIdentity,
135
+ agentName: identity.agentName,
136
+ userName: identity.userName,
137
+ },
138
+ };
139
+ }
@@ -0,0 +1,54 @@
1
+ import { defaultRuntime } from "../runtime.js";
2
+ import { buildUsageSuggestions } from "../infra/usage-suggestions.js";
3
+ function parseKinds(raw) {
4
+ if (!raw)
5
+ return undefined;
6
+ const parts = raw
7
+ .split(",")
8
+ .map((item) => item.trim())
9
+ .filter(Boolean);
10
+ const out = [];
11
+ for (const part of parts) {
12
+ if (part === "cli" || part === "tool") {
13
+ out.push(part);
14
+ }
15
+ }
16
+ return out.length > 0 ? out : undefined;
17
+ }
18
+ export async function suggestionsCommand(opts, runtime = defaultRuntime) {
19
+ const sources = opts.source ? [opts.source] : undefined;
20
+ const kinds = parseKinds(opts.kind);
21
+ const history = opts.history && opts.history > 0 ? opts.history : 1;
22
+ const limit = opts.limit && opts.limit > 0 ? opts.limit : 5;
23
+ const scope = opts.scope === "session" ? "session" : "global";
24
+ const result = await buildUsageSuggestions({
25
+ history,
26
+ limit,
27
+ sessionId: opts.session,
28
+ sources,
29
+ kinds,
30
+ scope,
31
+ });
32
+ if (opts.json) {
33
+ runtime.log(JSON.stringify({
34
+ history: result.history,
35
+ suggestions: result.suggestions,
36
+ totalEvents: result.totalEvents,
37
+ }, null, 2));
38
+ return;
39
+ }
40
+ runtime.log("\nUsage Suggestions");
41
+ runtime.log(` Scope: ${scope}`);
42
+ if (result.history.length > 0) {
43
+ const last = result.history[result.history.length - 1];
44
+ runtime.log(` Based on: ${last.source}:${last.kind}:${last.name}`);
45
+ }
46
+ if (result.suggestions.length === 0) {
47
+ runtime.log(" No suggestions yet (insufficient history).");
48
+ return;
49
+ }
50
+ for (const [idx, suggestion] of result.suggestions.entries()) {
51
+ const score = (suggestion.score * 100).toFixed(1);
52
+ runtime.log(` ${idx + 1}. ${suggestion.source}:${suggestion.kind}:${suggestion.name} (${score}%)`);
53
+ }
54
+ }
@@ -0,0 +1,71 @@
1
+ import { note } from "@clack/prompts";
2
+ import { enableSystemdUserLinger, readSystemdUserLingerStatus, } from "../daemon/systemd.js";
3
+ export async function ensureSystemdUserLingerInteractive(params) {
4
+ if (process.platform !== "linux")
5
+ return;
6
+ if (params.prompt === false)
7
+ return;
8
+ const env = params.env ?? process.env;
9
+ const prompter = params.prompter ?? { note };
10
+ const title = params.title ?? "Systemd";
11
+ const status = await readSystemdUserLingerStatus(env);
12
+ if (!status) {
13
+ await prompter.note("Unable to read loginctl linger status. Ensure systemd + loginctl are available.", title);
14
+ return;
15
+ }
16
+ if (status.linger === "yes")
17
+ return;
18
+ const reason = params.reason ??
19
+ "Systemd user services stop when you log out or go idle, which kills the Gateway.";
20
+ const actionNote = params.requireConfirm
21
+ ? "We can enable lingering now (may require sudo; writes /var/lib/systemd/linger)."
22
+ : "Enabling lingering now (may require sudo; writes /var/lib/systemd/linger).";
23
+ await prompter.note(`${reason}\n${actionNote}`, title);
24
+ if (params.requireConfirm && prompter.confirm) {
25
+ const ok = await prompter.confirm({
26
+ message: `Enable systemd lingering for ${status.user}?`,
27
+ initialValue: true,
28
+ });
29
+ if (!ok) {
30
+ await prompter.note("Without lingering, the Gateway will stop when you log out.", title);
31
+ return;
32
+ }
33
+ }
34
+ const resultNoSudo = await enableSystemdUserLinger({
35
+ env,
36
+ user: status.user,
37
+ });
38
+ if (resultNoSudo.ok) {
39
+ await prompter.note(`Enabled systemd lingering for ${status.user}.`, title);
40
+ return;
41
+ }
42
+ const result = await enableSystemdUserLinger({
43
+ env,
44
+ user: status.user,
45
+ sudoMode: "prompt",
46
+ });
47
+ if (result.ok) {
48
+ await prompter.note(`Enabled systemd lingering for ${status.user}.`, title);
49
+ return;
50
+ }
51
+ params.runtime.error(`Failed to enable lingering: ${result.stderr || result.stdout || "unknown error"}`);
52
+ await prompter.note(`Run manually: sudo loginctl enable-linger ${status.user}`, title);
53
+ }
54
+ export async function ensureSystemdUserLingerNonInteractive(params) {
55
+ if (process.platform !== "linux")
56
+ return;
57
+ const env = params.env ?? process.env;
58
+ const status = await readSystemdUserLingerStatus(env);
59
+ if (!status || status.linger === "yes")
60
+ return;
61
+ const result = await enableSystemdUserLinger({
62
+ env,
63
+ user: status.user,
64
+ sudoMode: "non-interactive",
65
+ });
66
+ if (result.ok) {
67
+ params.runtime.log(`Enabled systemd lingering for ${status.user}.`);
68
+ return;
69
+ }
70
+ params.runtime.log(`Systemd lingering is disabled for ${status.user}. Run: sudo loginctl enable-linger ${status.user}`);
71
+ }