@intent-systems/nexus 2026.1.5-11

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 (838) 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-id.js +41 -0
  6. package/dist/agents/agent-paths.js +16 -0
  7. package/dist/agents/agent-scope.js +44 -0
  8. package/dist/agents/auth-profiles.js +715 -0
  9. package/dist/agents/bash-process-registry.js +126 -0
  10. package/dist/agents/bash-tools.js +838 -0
  11. package/dist/agents/chutes-oauth.js +47 -0
  12. package/dist/agents/clawdbot-tools.js +62 -0
  13. package/dist/agents/context.js +34 -0
  14. package/dist/agents/defaults.js +6 -0
  15. package/dist/agents/identity-state.js +101 -0
  16. package/dist/agents/memory-search.js +80 -0
  17. package/dist/agents/model-auth.js +116 -0
  18. package/dist/agents/model-catalog.js +55 -0
  19. package/dist/agents/model-fallback.js +216 -0
  20. package/dist/agents/model-scan.js +263 -0
  21. package/dist/agents/model-selection.js +152 -0
  22. package/dist/agents/models-config.js +177 -0
  23. package/dist/agents/nexus-tools.js +46 -0
  24. package/dist/agents/pi-embedded-block-chunker.js +188 -0
  25. package/dist/agents/pi-embedded-helpers.js +139 -0
  26. package/dist/agents/pi-embedded-runner.js +1024 -0
  27. package/dist/agents/pi-embedded-subscribe.js +541 -0
  28. package/dist/agents/pi-embedded-utils.js +20 -0
  29. package/dist/agents/pi-embedded.js +1 -0
  30. package/dist/agents/pi-extensions/compaction-safeguard.js +140 -0
  31. package/dist/agents/pi-tool-definition-adapter.js +17 -0
  32. package/dist/agents/pi-tools.js +510 -0
  33. package/dist/agents/pi-tools.schema.js +358 -0
  34. package/dist/agents/sandbox-paths.js +68 -0
  35. package/dist/agents/sandbox.js +676 -0
  36. package/dist/agents/shell-utils.js +53 -0
  37. package/dist/agents/skill-runner.js +256 -0
  38. package/dist/agents/skill-state.js +164 -0
  39. package/dist/agents/skill-tools.js +191 -0
  40. package/dist/agents/skill-usage.js +143 -0
  41. package/dist/agents/skills-install.js +244 -0
  42. package/dist/agents/skills-status.js +154 -0
  43. package/dist/agents/skills.js +476 -0
  44. package/dist/agents/subagent-registry.js +335 -0
  45. package/dist/agents/subagent-registry.store.js +47 -0
  46. package/dist/agents/system-prompt.js +195 -0
  47. package/dist/agents/timeout.js +26 -0
  48. package/dist/agents/tool-display.js +155 -0
  49. package/dist/agents/tool-display.json +236 -0
  50. package/dist/agents/tool-images.js +138 -0
  51. package/dist/agents/tool-policy.js +103 -0
  52. package/dist/agents/tools/agent-step.js +41 -0
  53. package/dist/agents/tools/browser-tool.js +298 -0
  54. package/dist/agents/tools/canvas-tool.js +193 -0
  55. package/dist/agents/tools/common.js +88 -0
  56. package/dist/agents/tools/cron-tool.js +141 -0
  57. package/dist/agents/tools/discord-actions-guild.js +186 -0
  58. package/dist/agents/tools/discord-actions-messaging.js +313 -0
  59. package/dist/agents/tools/discord-actions-moderation.js +70 -0
  60. package/dist/agents/tools/discord-actions.js +56 -0
  61. package/dist/agents/tools/discord-schema.js +199 -0
  62. package/dist/agents/tools/discord-tool.js +16 -0
  63. package/dist/agents/tools/gateway-tool.js +46 -0
  64. package/dist/agents/tools/gateway.js +28 -0
  65. package/dist/agents/tools/image-tool.js +225 -0
  66. package/dist/agents/tools/memory-tool.js +92 -0
  67. package/dist/agents/tools/nodes-tool.js +413 -0
  68. package/dist/agents/tools/nodes-utils.js +92 -0
  69. package/dist/agents/tools/sessions-announce-target.js +39 -0
  70. package/dist/agents/tools/sessions-helpers.js +88 -0
  71. package/dist/agents/tools/sessions-history-tool.js +137 -0
  72. package/dist/agents/tools/sessions-list-tool.js +196 -0
  73. package/dist/agents/tools/sessions-send-helpers.js +103 -0
  74. package/dist/agents/tools/sessions-send-tool.js +371 -0
  75. package/dist/agents/tools/sessions-spawn-tool.js +319 -0
  76. package/dist/agents/tools/slack-actions.js +129 -0
  77. package/dist/agents/tools/slack-schema.js +59 -0
  78. package/dist/agents/tools/slack-tool.js +16 -0
  79. package/dist/agents/tools/telegram-actions.js +159 -0
  80. package/dist/agents/tools/telegram-schema.js +28 -0
  81. package/dist/agents/tools/telegram-tool.js +16 -0
  82. package/dist/agents/tools/whatsapp-login-tool.js +63 -0
  83. package/dist/agents/usage.js +58 -0
  84. package/dist/agents/workspace.js +286 -0
  85. package/dist/auto-reply/chunk.js +177 -0
  86. package/dist/auto-reply/command-auth.js +44 -0
  87. package/dist/auto-reply/command-detection.js +23 -0
  88. package/dist/auto-reply/envelope.js +30 -0
  89. package/dist/auto-reply/group-activation.js +20 -0
  90. package/dist/auto-reply/heartbeat.js +58 -0
  91. package/dist/auto-reply/model.js +22 -0
  92. package/dist/auto-reply/reply/abort.js +14 -0
  93. package/dist/auto-reply/reply/agent-runner.js +426 -0
  94. package/dist/auto-reply/reply/bash-command.js +314 -0
  95. package/dist/auto-reply/reply/block-streaming.js +34 -0
  96. package/dist/auto-reply/reply/body.js +29 -0
  97. package/dist/auto-reply/reply/commands.js +332 -0
  98. package/dist/auto-reply/reply/directive-handling.js +751 -0
  99. package/dist/auto-reply/reply/directives.js +74 -0
  100. package/dist/auto-reply/reply/dispatch-from-config.js +23 -0
  101. package/dist/auto-reply/reply/followup-runner.js +181 -0
  102. package/dist/auto-reply/reply/groups.js +152 -0
  103. package/dist/auto-reply/reply/mentions.js +64 -0
  104. package/dist/auto-reply/reply/model-selection.js +214 -0
  105. package/dist/auto-reply/reply/queue.js +399 -0
  106. package/dist/auto-reply/reply/reply-dispatcher.js +68 -0
  107. package/dist/auto-reply/reply/reply-tags.js +26 -0
  108. package/dist/auto-reply/reply/session-updates.js +103 -0
  109. package/dist/auto-reply/reply/session.js +169 -0
  110. package/dist/auto-reply/reply/typing.js +125 -0
  111. package/dist/auto-reply/reply.js +655 -0
  112. package/dist/auto-reply/send-policy.js +28 -0
  113. package/dist/auto-reply/status.js +197 -0
  114. package/dist/auto-reply/templating.js +9 -0
  115. package/dist/auto-reply/thinking.js +64 -0
  116. package/dist/auto-reply/tokens.js +2 -0
  117. package/dist/auto-reply/tool-meta.js +74 -0
  118. package/dist/auto-reply/transcription.js +57 -0
  119. package/dist/auto-reply/types.js +1 -0
  120. package/dist/browser/bridge-server.js +37 -0
  121. package/dist/browser/cdp.js +382 -0
  122. package/dist/browser/chrome.js +432 -0
  123. package/dist/browser/client-actions-core.js +67 -0
  124. package/dist/browser/client-actions-observe.js +24 -0
  125. package/dist/browser/client-actions-types.js +1 -0
  126. package/dist/browser/client-actions.js +3 -0
  127. package/dist/browser/client-fetch.js +43 -0
  128. package/dist/browser/client.js +107 -0
  129. package/dist/browser/config.js +159 -0
  130. package/dist/browser/constants.js +5 -0
  131. package/dist/browser/profiles-service.js +124 -0
  132. package/dist/browser/profiles.js +96 -0
  133. package/dist/browser/pw-ai.js +2 -0
  134. package/dist/browser/pw-session.js +144 -0
  135. package/dist/browser/pw-tools-core.js +366 -0
  136. package/dist/browser/routes/agent.js +549 -0
  137. package/dist/browser/routes/basic.js +155 -0
  138. package/dist/browser/routes/index.js +8 -0
  139. package/dist/browser/routes/tabs.js +105 -0
  140. package/dist/browser/routes/utils.js +62 -0
  141. package/dist/browser/screenshot.js +40 -0
  142. package/dist/browser/server-context.js +377 -0
  143. package/dist/browser/server.js +81 -0
  144. package/dist/browser/target-id.js +18 -0
  145. package/dist/browser/trash.js +21 -0
  146. package/dist/canvas-host/a2ui/a2ui.bundle.js +17768 -0
  147. package/dist/canvas-host/a2ui/index.html +246 -0
  148. package/dist/canvas-host/a2ui.js +187 -0
  149. package/dist/canvas-host/server.js +382 -0
  150. package/dist/capabilities/detector.js +245 -0
  151. package/dist/capabilities/registry.js +99 -0
  152. package/dist/channel-web.js +8 -0
  153. package/dist/channels/location.js +44 -0
  154. package/dist/channels/web/index.js +2 -0
  155. package/dist/cli/browser-cli-actions-input.js +459 -0
  156. package/dist/cli/browser-cli-actions-observe.js +56 -0
  157. package/dist/cli/browser-cli-examples.js +31 -0
  158. package/dist/cli/browser-cli-inspect.js +97 -0
  159. package/dist/cli/browser-cli-manage.js +286 -0
  160. package/dist/cli/browser-cli-shared.js +1 -0
  161. package/dist/cli/browser-cli.js +26 -0
  162. package/dist/cli/canvas-cli.js +416 -0
  163. package/dist/cli/cloud-cli.js +399 -0
  164. package/dist/cli/credential-cli.js +418 -0
  165. package/dist/cli/cron-cli.js +454 -0
  166. package/dist/cli/deps.js +17 -0
  167. package/dist/cli/dns-cli.js +180 -0
  168. package/dist/cli/gateway-cli.js +665 -0
  169. package/dist/cli/gateway-rpc.js +20 -0
  170. package/dist/cli/hooks-cli.js +135 -0
  171. package/dist/cli/log-cli.js +25 -0
  172. package/dist/cli/memory-cli.js +101 -0
  173. package/dist/cli/models-cli.js +248 -0
  174. package/dist/cli/nodes-camera.js +57 -0
  175. package/dist/cli/nodes-canvas.js +26 -0
  176. package/dist/cli/nodes-cli.js +946 -0
  177. package/dist/cli/nodes-screen.js +37 -0
  178. package/dist/cli/pairing-cli.js +100 -0
  179. package/dist/cli/parse-duration.js +20 -0
  180. package/dist/cli/plugins-cli.js +158 -0
  181. package/dist/cli/ports.js +97 -0
  182. package/dist/cli/profile.js +81 -0
  183. package/dist/cli/program.js +236 -0
  184. package/dist/cli/prompt.js +19 -0
  185. package/dist/cli/run-main.js +48 -0
  186. package/dist/cli/skills-cli.js +290 -0
  187. package/dist/cli/skills-hub-cli.js +1465 -0
  188. package/dist/cli/telegram-cli.js +56 -0
  189. package/dist/cli/tool-connector-cli.js +193 -0
  190. package/dist/cli/tui-cli.js +35 -0
  191. package/dist/cli/upstream-sync-cli.js +2990 -0
  192. package/dist/cli/usage-cli.js +38 -0
  193. package/dist/cli/wait.js +8 -0
  194. package/dist/commands/agent-via-gateway.js +115 -0
  195. package/dist/commands/agent.js +665 -0
  196. package/dist/commands/antigravity-oauth.js +327 -0
  197. package/dist/commands/auth-choice-options.js +85 -0
  198. package/dist/commands/auth-choice.js +286 -0
  199. package/dist/commands/auth-token.js +31 -0
  200. package/dist/commands/bootstrap-preset.js +228 -0
  201. package/dist/commands/capabilities.js +63 -0
  202. package/dist/commands/chutes-oauth.js +144 -0
  203. package/dist/commands/claude-md.js +138 -0
  204. package/dist/commands/config-view.js +11 -0
  205. package/dist/commands/config.js +85 -0
  206. package/dist/commands/configure.js +648 -0
  207. package/dist/commands/credential.js +697 -0
  208. package/dist/commands/cursor-hooks.js +240 -0
  209. package/dist/commands/cursor-rules.js +56 -0
  210. package/dist/commands/doctor-state-migrations.js +358 -0
  211. package/dist/commands/doctor-ui.js +113 -0
  212. package/dist/commands/doctor.js +674 -0
  213. package/dist/commands/health.js +112 -0
  214. package/dist/commands/identity.js +51 -0
  215. package/dist/commands/init.js +450 -0
  216. package/dist/commands/log.js +134 -0
  217. package/dist/commands/models/aliases.js +85 -0
  218. package/dist/commands/models/fallbacks.js +123 -0
  219. package/dist/commands/models/image-fallbacks.js +123 -0
  220. package/dist/commands/models/list.js +347 -0
  221. package/dist/commands/models/scan.js +271 -0
  222. package/dist/commands/models/set-image.js +27 -0
  223. package/dist/commands/models/set.js +27 -0
  224. package/dist/commands/models/shared.js +73 -0
  225. package/dist/commands/models.js +7 -0
  226. package/dist/commands/onboard-auth.js +126 -0
  227. package/dist/commands/onboard-channels.js +814 -0
  228. package/dist/commands/onboard-eve-identity.js +97 -0
  229. package/dist/commands/onboard-github.js +153 -0
  230. package/dist/commands/onboard-helpers.js +303 -0
  231. package/dist/commands/onboard-interactive.js +17 -0
  232. package/dist/commands/onboard-non-interactive.js +230 -0
  233. package/dist/commands/onboard-providers.js +829 -0
  234. package/dist/commands/onboard-quickstart.js +192 -0
  235. package/dist/commands/onboard-remote.js +120 -0
  236. package/dist/commands/onboard-skills.js +148 -0
  237. package/dist/commands/onboard-types.js +1 -0
  238. package/dist/commands/onboard.js +19 -0
  239. package/dist/commands/openai-codex-model-default.js +38 -0
  240. package/dist/commands/poll.js +64 -0
  241. package/dist/commands/quest-state.js +271 -0
  242. package/dist/commands/quest.js +67 -0
  243. package/dist/commands/reset.js +61 -0
  244. package/dist/commands/send.js +124 -0
  245. package/dist/commands/sessions-ingest.js +360 -0
  246. package/dist/commands/sessions.js +212 -0
  247. package/dist/commands/setup.js +61 -0
  248. package/dist/commands/signal-install.js +135 -0
  249. package/dist/commands/skills-manifest.js +514 -0
  250. package/dist/commands/status.js +259 -0
  251. package/dist/commands/suggestions.js +54 -0
  252. package/dist/commands/systemd-linger.js +71 -0
  253. package/dist/commands/update.js +16 -0
  254. package/dist/commands/usage-tracking.js +32 -0
  255. package/dist/commands/usage-upload.js +32 -0
  256. package/dist/config/config.js +6 -0
  257. package/dist/config/defaults.js +138 -0
  258. package/dist/config/group-policy.js +49 -0
  259. package/dist/config/includes.js +181 -0
  260. package/dist/config/io.js +260 -0
  261. package/dist/config/legacy-migrate.js +13 -0
  262. package/dist/config/legacy.js +427 -0
  263. package/dist/config/paths.js +98 -0
  264. package/dist/config/port-defaults.js +32 -0
  265. package/dist/config/schema.js +173 -0
  266. package/dist/config/sessions.js +615 -0
  267. package/dist/config/talk.js +31 -0
  268. package/dist/config/types.js +1 -0
  269. package/dist/config/validation.js +29 -0
  270. package/dist/config/zod-schema.js +1111 -0
  271. package/dist/control-plane/broker/broker.js +1022 -0
  272. package/dist/control-plane/compaction.js +282 -0
  273. package/dist/control-plane/factory.js +31 -0
  274. package/dist/control-plane/index.js +10 -0
  275. package/dist/control-plane/odu/agents.js +192 -0
  276. package/dist/control-plane/odu/interaction-tools.js +208 -0
  277. package/dist/control-plane/odu/prompt-loader.js +95 -0
  278. package/dist/control-plane/odu/runtime.js +479 -0
  279. package/dist/control-plane/odu/types.js +6 -0
  280. package/dist/control-plane/odu-control-plane.js +316 -0
  281. package/dist/control-plane/single-agent.js +249 -0
  282. package/dist/control-plane/types.js +11 -0
  283. package/dist/control-ui/assets/index-D8Q5AI4D.js +2393 -0
  284. package/dist/control-ui/assets/index-D8Q5AI4D.js.map +1 -0
  285. package/dist/control-ui/assets/index-g06q5Xc3.css +1 -0
  286. package/dist/control-ui/favicon.ico +0 -0
  287. package/dist/control-ui/index.html +16 -0
  288. package/dist/credentials/store.js +449 -0
  289. package/dist/cron/isolated-agent.js +529 -0
  290. package/dist/cron/normalize.js +73 -0
  291. package/dist/cron/parse.js +24 -0
  292. package/dist/cron/run-log.js +72 -0
  293. package/dist/cron/schedule.js +24 -0
  294. package/dist/cron/service.js +471 -0
  295. package/dist/cron/store.js +43 -0
  296. package/dist/cron/types.js +1 -0
  297. package/dist/daemon/constants.js +10 -0
  298. package/dist/daemon/launchd.js +309 -0
  299. package/dist/daemon/legacy.js +63 -0
  300. package/dist/daemon/program-args.js +141 -0
  301. package/dist/daemon/schtasks.js +269 -0
  302. package/dist/daemon/service.js +69 -0
  303. package/dist/daemon/systemd.js +332 -0
  304. package/dist/discord/index.js +2 -0
  305. package/dist/discord/monitor.js +1089 -0
  306. package/dist/discord/probe.js +54 -0
  307. package/dist/discord/send.js +652 -0
  308. package/dist/discord/token.js +8 -0
  309. package/dist/entry.js +16 -0
  310. package/dist/gateway/auth.js +121 -0
  311. package/dist/gateway/call.js +103 -0
  312. package/dist/gateway/chat-attachments.js +41 -0
  313. package/dist/gateway/client.js +180 -0
  314. package/dist/gateway/config-reload.js +279 -0
  315. package/dist/gateway/control-ui.js +184 -0
  316. package/dist/gateway/hooks-mapping.js +282 -0
  317. package/dist/gateway/hooks.js +168 -0
  318. package/dist/gateway/net.js +29 -0
  319. package/dist/gateway/protocol/index.js +62 -0
  320. package/dist/gateway/protocol/schema.js +577 -0
  321. package/dist/gateway/server-bridge-subscriptions.js +93 -0
  322. package/dist/gateway/server-bridge.js +1066 -0
  323. package/dist/gateway/server-browser.js +12 -0
  324. package/dist/gateway/server-channels.js +680 -0
  325. package/dist/gateway/server-chat.js +159 -0
  326. package/dist/gateway/server-constants.js +8 -0
  327. package/dist/gateway/server-discovery.js +62 -0
  328. package/dist/gateway/server-http.js +165 -0
  329. package/dist/gateway/server-methods/agent-job.js +114 -0
  330. package/dist/gateway/server-methods/agent.js +254 -0
  331. package/dist/gateway/server-methods/channels.js +239 -0
  332. package/dist/gateway/server-methods/chat.js +207 -0
  333. package/dist/gateway/server-methods/config.js +50 -0
  334. package/dist/gateway/server-methods/connect.js +6 -0
  335. package/dist/gateway/server-methods/cron.js +99 -0
  336. package/dist/gateway/server-methods/health.js +28 -0
  337. package/dist/gateway/server-methods/models.js +16 -0
  338. package/dist/gateway/server-methods/nodes.js +294 -0
  339. package/dist/gateway/server-methods/providers.js +257 -0
  340. package/dist/gateway/server-methods/send.js +254 -0
  341. package/dist/gateway/server-methods/sessions.js +382 -0
  342. package/dist/gateway/server-methods/skills.js +83 -0
  343. package/dist/gateway/server-methods/system.js +118 -0
  344. package/dist/gateway/server-methods/talk.js +22 -0
  345. package/dist/gateway/server-methods/types.js +1 -0
  346. package/dist/gateway/server-methods/voicewake.js +30 -0
  347. package/dist/gateway/server-methods/web.js +81 -0
  348. package/dist/gateway/server-methods/wizard.js +100 -0
  349. package/dist/gateway/server-methods.js +53 -0
  350. package/dist/gateway/server-providers.js +687 -0
  351. package/dist/gateway/server-shared.js +1 -0
  352. package/dist/gateway/server-utils.js +35 -0
  353. package/dist/gateway/server.js +1492 -0
  354. package/dist/gateway/session-utils.js +355 -0
  355. package/dist/gateway/ws-log.js +343 -0
  356. package/dist/gateway/ws-logging.js +8 -0
  357. package/dist/globals.js +41 -0
  358. package/dist/hooks/gmail-ops.js +236 -0
  359. package/dist/hooks/gmail-setup-utils.js +278 -0
  360. package/dist/hooks/gmail-watcher.js +190 -0
  361. package/dist/hooks/gmail.js +177 -0
  362. package/dist/imessage/client.js +165 -0
  363. package/dist/imessage/index.js +3 -0
  364. package/dist/imessage/monitor.js +365 -0
  365. package/dist/imessage/probe.js +26 -0
  366. package/dist/imessage/send.js +83 -0
  367. package/dist/imessage/targets.js +176 -0
  368. package/dist/index.js +55 -0
  369. package/dist/infra/agent-events.js +46 -0
  370. package/dist/infra/binaries.js +9 -0
  371. package/dist/infra/bonjour-discovery.js +163 -0
  372. package/dist/infra/bonjour.js +200 -0
  373. package/dist/infra/bridge/server.js +564 -0
  374. package/dist/infra/canvas-host-url.js +54 -0
  375. package/dist/infra/channel-summary.js +78 -0
  376. package/dist/infra/control-ui-assets.js +112 -0
  377. package/dist/infra/dotenv.js +15 -0
  378. package/dist/infra/env.js +8 -0
  379. package/dist/infra/errors.js +28 -0
  380. package/dist/infra/event-log.js +257 -0
  381. package/dist/infra/gateway-lock.js +8 -0
  382. package/dist/infra/git-commit.js +91 -0
  383. package/dist/infra/heartbeat-events.js +21 -0
  384. package/dist/infra/heartbeat-runner.js +458 -0
  385. package/dist/infra/heartbeat-wake.js +61 -0
  386. package/dist/infra/is-main.js +37 -0
  387. package/dist/infra/json-file.js +21 -0
  388. package/dist/infra/machine-name.js +40 -0
  389. package/dist/infra/nexus-root.js +56 -0
  390. package/dist/infra/node-pairing.js +212 -0
  391. package/dist/infra/path-env.js +92 -0
  392. package/dist/infra/ports.js +87 -0
  393. package/dist/infra/provider-summary.js +80 -0
  394. package/dist/infra/provider-usage.auth.js +191 -0
  395. package/dist/infra/provider-usage.fetch.claude.js +139 -0
  396. package/dist/infra/provider-usage.fetch.codex.js +62 -0
  397. package/dist/infra/provider-usage.fetch.copilot.js +42 -0
  398. package/dist/infra/provider-usage.fetch.gemini.js +57 -0
  399. package/dist/infra/provider-usage.fetch.js +6 -0
  400. package/dist/infra/provider-usage.fetch.minimax.js +219 -0
  401. package/dist/infra/provider-usage.fetch.shared.js +11 -0
  402. package/dist/infra/provider-usage.fetch.zai.js +62 -0
  403. package/dist/infra/provider-usage.format.js +77 -0
  404. package/dist/infra/provider-usage.js +149 -0
  405. package/dist/infra/provider-usage.load.js +54 -0
  406. package/dist/infra/provider-usage.shared.js +19 -0
  407. package/dist/infra/provider-usage.types.js +1 -0
  408. package/dist/infra/restart.js +29 -0
  409. package/dist/infra/retry.js +16 -0
  410. package/dist/infra/runtime-guard.js +59 -0
  411. package/dist/infra/shell-env.js +88 -0
  412. package/dist/infra/system-events.js +71 -0
  413. package/dist/infra/system-presence.js +217 -0
  414. package/dist/infra/tailnet.js +46 -0
  415. package/dist/infra/tailscale.js +149 -0
  416. package/dist/infra/unhandled-rejections.js +19 -0
  417. package/dist/infra/usage-settings.js +78 -0
  418. package/dist/infra/usage-suggestions.js +253 -0
  419. package/dist/infra/usage-upload.js +327 -0
  420. package/dist/infra/voicewake.js +78 -0
  421. package/dist/infra/widearea-dns.js +123 -0
  422. package/dist/infra/ws.js +13 -0
  423. package/dist/logger.js +52 -0
  424. package/dist/logging/redact.js +109 -0
  425. package/dist/logging.js +506 -0
  426. package/dist/macos/gateway-daemon.js +145 -0
  427. package/dist/macos/relay.js +49 -0
  428. package/dist/markdown/fences.js +58 -0
  429. package/dist/media/constants.js +33 -0
  430. package/dist/media/host.js +42 -0
  431. package/dist/media/image-ops.js +121 -0
  432. package/dist/media/mime.js +123 -0
  433. package/dist/media/parse.js +83 -0
  434. package/dist/media/server.js +64 -0
  435. package/dist/media/store.js +139 -0
  436. package/dist/memory/embeddings.js +146 -0
  437. package/dist/memory/index.js +3 -0
  438. package/dist/memory/internal.js +163 -0
  439. package/dist/native/nexus-cloud/darwin-arm64/nexus-cloud +0 -0
  440. package/dist/native/nexus-cloud/darwin-arm64/nexus-cloud-rs +0 -0
  441. package/dist/native/nexus-cloud/darwin-x64/nexus-cloud-rs +0 -0
  442. package/dist/native/nexus-cloud/linux-arm64/nexus-cloud-rs +0 -0
  443. package/dist/native/nexus-cloud/linux-x64/nexus-cloud-rs +0 -0
  444. package/dist/native/nexus-cloud/win32-x64/nexus-cloud-rs.exe +0 -0
  445. package/dist/pairing/pairing-store.js +218 -0
  446. package/dist/plugins/cli.js +42 -0
  447. package/dist/plugins/discovery.js +253 -0
  448. package/dist/plugins/install.js +181 -0
  449. package/dist/plugins/loader.js +290 -0
  450. package/dist/plugins/registry.js +105 -0
  451. package/dist/plugins/status.js +29 -0
  452. package/dist/plugins/tools.js +39 -0
  453. package/dist/plugins/types.js +1 -0
  454. package/dist/polls.js +43 -0
  455. package/dist/process/command-queue.js +97 -0
  456. package/dist/process/exec.js +75 -0
  457. package/dist/provider-web.js +8 -0
  458. package/dist/providers/github-copilot-auth.js +123 -0
  459. package/dist/providers/github-copilot-models.js +35 -0
  460. package/dist/providers/github-copilot-token.js +11 -0
  461. package/dist/providers/location.js +48 -0
  462. package/dist/providers/web/index.js +2 -0
  463. package/dist/routing/resolve-route.js +144 -0
  464. package/dist/routing/session-key.js +65 -0
  465. package/dist/runtime.js +8 -0
  466. package/dist/sessions/level-overrides.js +9 -0
  467. package/dist/sessions/send-policy.js +68 -0
  468. package/dist/signal/client.js +134 -0
  469. package/dist/signal/daemon.js +69 -0
  470. package/dist/signal/index.js +3 -0
  471. package/dist/signal/monitor.js +411 -0
  472. package/dist/signal/probe.js +46 -0
  473. package/dist/signal/send.js +91 -0
  474. package/dist/skills/scan-runner.js +204 -0
  475. package/dist/slack/actions.js +97 -0
  476. package/dist/slack/index.js +5 -0
  477. package/dist/slack/monitor.js +1291 -0
  478. package/dist/slack/probe.js +47 -0
  479. package/dist/slack/send.js +131 -0
  480. package/dist/slack/token.js +10 -0
  481. package/dist/telegram/allowed-updates.js +8 -0
  482. package/dist/telegram/bot.js +724 -0
  483. package/dist/telegram/download.js +34 -0
  484. package/dist/telegram/index.js +4 -0
  485. package/dist/telegram/monitor.js +47 -0
  486. package/dist/telegram/pairing-store.js +77 -0
  487. package/dist/telegram/probe.js +63 -0
  488. package/dist/telegram/proxy.js +9 -0
  489. package/dist/telegram/reaction-level.js +46 -0
  490. package/dist/telegram/send.js +151 -0
  491. package/dist/telegram/sent-message-cache.js +65 -0
  492. package/dist/telegram/token.js +30 -0
  493. package/dist/telegram/update-offset-store.js +61 -0
  494. package/dist/telegram/webhook-set.js +12 -0
  495. package/dist/telegram/webhook.js +56 -0
  496. package/dist/tui/commands.js +87 -0
  497. package/dist/tui/components/assistant-message.js +16 -0
  498. package/dist/tui/components/chat-log.js +92 -0
  499. package/dist/tui/components/custom-editor.js +55 -0
  500. package/dist/tui/components/selectors.js +8 -0
  501. package/dist/tui/components/tool-execution.js +111 -0
  502. package/dist/tui/components/user-message.js +17 -0
  503. package/dist/tui/gateway-chat.js +140 -0
  504. package/dist/tui/theme/theme.js +80 -0
  505. package/dist/tui/tui.js +708 -0
  506. package/dist/utils/provider-utils.js +28 -0
  507. package/dist/utils.js +158 -0
  508. package/dist/version.js +18 -0
  509. package/dist/web/accounts.js +86 -0
  510. package/dist/web/active-listener.js +25 -0
  511. package/dist/web/auto-reply.js +1256 -0
  512. package/dist/web/inbound.js +649 -0
  513. package/dist/web/login-qr.js +230 -0
  514. package/dist/web/login.js +71 -0
  515. package/dist/web/media.js +175 -0
  516. package/dist/web/outbound.js +102 -0
  517. package/dist/web/qr-image.js +97 -0
  518. package/dist/web/reconnect.js +60 -0
  519. package/dist/web/session.js +370 -0
  520. package/dist/wizard/clack-prompter.js +56 -0
  521. package/dist/wizard/onboarding.js +642 -0
  522. package/dist/wizard/prompts.js +6 -0
  523. package/dist/wizard/session.js +203 -0
  524. package/docs/AGENTS.default.md +116 -0
  525. package/docs/CAPABILITIES.md +444 -0
  526. package/docs/CNAME +1 -0
  527. package/docs/NEXUS_CORE_REWRITE_SPEC.md +226 -0
  528. package/docs/RELEASING.md +69 -0
  529. package/docs/_config.yml +53 -0
  530. package/docs/_layouts/default.html +145 -0
  531. package/docs/agent-assisted-install.md +95 -0
  532. package/docs/agent-loop.md +61 -0
  533. package/docs/agent-send.md +21 -0
  534. package/docs/agent.md +108 -0
  535. package/docs/android.md +133 -0
  536. package/docs/architecture.md +114 -0
  537. package/docs/assets/markdown.css +133 -0
  538. package/docs/assets/pixel-lobster.svg +60 -0
  539. package/docs/assets/terminal.css +470 -0
  540. package/docs/assets/theme.js +55 -0
  541. package/docs/audio.md +48 -0
  542. package/docs/automation/nexus-sync.md +371 -0
  543. package/docs/background-process.md +74 -0
  544. package/docs/bash.md +32 -0
  545. package/docs/bedrock.md +71 -0
  546. package/docs/bonjour.md +159 -0
  547. package/docs/browser-linux-troubleshooting.md +114 -0
  548. package/docs/browser.md +293 -0
  549. package/docs/bun.md +56 -0
  550. package/docs/camera.md +152 -0
  551. package/docs/clawd.md +212 -0
  552. package/docs/concepts/usage-tracking.md +29 -0
  553. package/docs/configuration.md +1666 -0
  554. package/docs/control-ui.md +83 -0
  555. package/docs/cron.md +385 -0
  556. package/docs/dashboard.md +17 -0
  557. package/docs/device-models.md +46 -0
  558. package/docs/discord.md +308 -0
  559. package/docs/discovery.md +112 -0
  560. package/docs/docker.md +258 -0
  561. package/docs/docs.json +105 -0
  562. package/docs/doctor.md +68 -0
  563. package/docs/elevated.md +31 -0
  564. package/docs/faq.md +736 -0
  565. package/docs/feature-inventory/overview.md +141 -0
  566. package/docs/feature-inventory/rollout-checklist.md +53 -0
  567. package/docs/feature-inventory/test-matrix.md +87 -0
  568. package/docs/feature-inventory.md +9 -0
  569. package/docs/gateway/configuration-examples.md +221 -0
  570. package/docs/gateway/configuration.md +172 -0
  571. package/docs/gateway/cron.md +61 -0
  572. package/docs/gateway/heartbeat.md +207 -0
  573. package/docs/gateway/pairing.md +109 -0
  574. package/docs/gateway-lock.md +28 -0
  575. package/docs/gateway.md +227 -0
  576. package/docs/gmail-pubsub.md +191 -0
  577. package/docs/grammy.md +27 -0
  578. package/docs/group-messages.md +73 -0
  579. package/docs/groups.md +130 -0
  580. package/docs/health.md +28 -0
  581. package/docs/heartbeat.md +73 -0
  582. package/docs/home-userspace.md +277 -0
  583. package/docs/hubs.md +148 -0
  584. package/docs/images.md +51 -0
  585. package/docs/imessage.md +94 -0
  586. package/docs/index.md +196 -0
  587. package/docs/ios.md +372 -0
  588. package/docs/linux.md +11 -0
  589. package/docs/location-command.md +95 -0
  590. package/docs/location.md +46 -0
  591. package/docs/logging.md +110 -0
  592. package/docs/lore.md +131 -0
  593. package/docs/mac/bun.md +133 -0
  594. package/docs/mac/canvas.md +161 -0
  595. package/docs/mac/child-process.md +72 -0
  596. package/docs/mac/dev-setup.md +81 -0
  597. package/docs/mac/health.md +28 -0
  598. package/docs/mac/icon.md +26 -0
  599. package/docs/mac/logging.md +51 -0
  600. package/docs/mac/menu-bar.md +69 -0
  601. package/docs/mac/peekaboo.md +170 -0
  602. package/docs/mac/permissions.md +40 -0
  603. package/docs/mac/release.md +76 -0
  604. package/docs/mac/remote.md +57 -0
  605. package/docs/mac/signing.md +41 -0
  606. package/docs/mac/skills.md +27 -0
  607. package/docs/mac/voice-overlay.md +52 -0
  608. package/docs/mac/voicewake.md +56 -0
  609. package/docs/mac/webchat.md +27 -0
  610. package/docs/mac/xpc.md +40 -0
  611. package/docs/macos.md +104 -0
  612. package/docs/model-failover.md +75 -0
  613. package/docs/models.md +91 -0
  614. package/docs/multi-agent.md +74 -0
  615. package/docs/nix.md +95 -0
  616. package/docs/nodes.md +157 -0
  617. package/docs/onboarding-config-protocol.md +34 -0
  618. package/docs/onboarding.md +189 -0
  619. package/docs/pairing.md +85 -0
  620. package/docs/plans/cron-add-hardening.md +72 -0
  621. package/docs/plans/group-policy-hardening.md +121 -0
  622. package/docs/poll.md +52 -0
  623. package/docs/prereqs.md +67 -0
  624. package/docs/presence.md +133 -0
  625. package/docs/proposals/model-config.md +147 -0
  626. package/docs/provider-routing.md +25 -0
  627. package/docs/queue.md +78 -0
  628. package/docs/reference/templates/AGENTS.md +226 -0
  629. package/docs/remote-gateway-readme.md +153 -0
  630. package/docs/remote.md +61 -0
  631. package/docs/research/memory.md +227 -0
  632. package/docs/rpc.md +35 -0
  633. package/docs/security.md +200 -0
  634. package/docs/session-ingestion.md +119 -0
  635. package/docs/session-tool.md +154 -0
  636. package/docs/session.md +85 -0
  637. package/docs/sessions.md +8 -0
  638. package/docs/setup.md +131 -0
  639. package/docs/showcase.md +37 -0
  640. package/docs/signal.md +122 -0
  641. package/docs/skills-config.md +68 -0
  642. package/docs/skills-scan.md +81 -0
  643. package/docs/skills-updates.md +113 -0
  644. package/docs/skills.md +166 -0
  645. package/docs/slack.md +221 -0
  646. package/docs/subagents.md +72 -0
  647. package/docs/tailscale.md +71 -0
  648. package/docs/talk.md +79 -0
  649. package/docs/telegram.md +96 -0
  650. package/docs/templates/AGENTS.md +226 -0
  651. package/docs/templates/BOOTSTRAP.md +55 -0
  652. package/docs/templates/IDENTITY.md +23 -0
  653. package/docs/templates/SOUL.md +41 -0
  654. package/docs/templates/TOOLS.md +41 -0
  655. package/docs/templates/USER.md +28 -0
  656. package/docs/test.md +43 -0
  657. package/docs/testing-onboarding-quickstart.md +76 -0
  658. package/docs/testing-philosophy.md +211 -0
  659. package/docs/thinking.md +46 -0
  660. package/docs/timezone.md +40 -0
  661. package/docs/tools.md +346 -0
  662. package/docs/troubleshooting.md +257 -0
  663. package/docs/tui.md +71 -0
  664. package/docs/typebox.md +42 -0
  665. package/docs/updating.md +138 -0
  666. package/docs/usage-cloud-aggregation-spec.md +133 -0
  667. package/docs/usage-suggestions-pipeline.md +126 -0
  668. package/docs/voicewake.md +61 -0
  669. package/docs/web.md +115 -0
  670. package/docs/webchat.md +34 -0
  671. package/docs/webhook.md +132 -0
  672. package/docs/whatsapp-clawd.jpg +0 -0
  673. package/docs/whatsapp.md +170 -0
  674. package/docs/windows.md +11 -0
  675. package/docs/wizard.md +167 -0
  676. package/package.json +186 -0
  677. package/patches/@mariozechner__pi-ai.patch +215 -0
  678. package/patches/playwright-core@1.57.0.patch +13 -0
  679. package/patches/qrcode-terminal.patch +12 -0
  680. package/scripts/postinstall.js +202 -0
  681. package/skills/connectors/brave-search/SKILL.md +36 -0
  682. package/skills/connectors/brave-search/docs/setup.md +40 -0
  683. package/skills/connectors/brave-search/docs/troubleshooting.md +37 -0
  684. package/skills/connectors/brave-search/docs/usage.md +28 -0
  685. package/skills/connectors/brave-search/scripts/content.mjs +53 -0
  686. package/skills/connectors/brave-search/scripts/search.mjs +79 -0
  687. package/skills/connectors/discord/SKILL.md +370 -0
  688. package/skills/connectors/gemini/SKILL.md +23 -0
  689. package/skills/connectors/github/SKILL.md +26 -0
  690. package/skills/connectors/github/docs/setup.md +21 -0
  691. package/skills/connectors/github/docs/troubleshooting.md +24 -0
  692. package/skills/connectors/google-oauth/SKILL.md +94 -0
  693. package/skills/connectors/notion/SKILL.md +156 -0
  694. package/skills/connectors/slack/SKILL.md +144 -0
  695. package/skills/connectors/telegram/SKILL.md +20 -0
  696. package/skills/connectors/telegram/docs/pairing.md +30 -0
  697. package/skills/connectors/telegram/docs/setup.md +41 -0
  698. package/skills/connectors/telegram/docs/webhook.md +17 -0
  699. package/skills/connectors/wacli/SKILL.md +48 -0
  700. package/skills/connectors/wacli/docs/auth.md +21 -0
  701. package/skills/connectors/wacli/docs/backup.md +9 -0
  702. package/skills/connectors/wacli/docs/troubleshooting.md +21 -0
  703. package/skills/guides/browser-use-agent-sdk/SKILL.md +90 -0
  704. package/skills/guides/filesystem/SKILL.md +217 -0
  705. package/skills/guides/json-render/SKILL.md +154 -0
  706. package/skills/guides/json-render/assets/components/README.md +21 -0
  707. package/skills/guides/json-render/assets/components/catalog.ts +78 -0
  708. package/skills/guides/json-render/assets/components/registry.tsx +172 -0
  709. package/skills/guides/json-render/assets/demo/App.css +397 -0
  710. package/skills/guides/json-render/assets/demo/App.tsx +897 -0
  711. package/skills/guides/json-render/assets/demo/README.md +22 -0
  712. package/skills/guides/json-render/assets/demo/catalog.ts +78 -0
  713. package/skills/guides/json-render/assets/demo/data/nexus-core.json +31 -0
  714. package/skills/guides/json-render/assets/demo/index.css +27 -0
  715. package/skills/guides/json-render/assets/demo/registry.tsx +150 -0
  716. package/skills/guides/json-render/docs/nexus-state-demo.md +84 -0
  717. package/skills/guides/json-render/docs/shadcn-preset.md +33 -0
  718. package/skills/guides/json-render/scripts/create-vite-demo.sh +45 -0
  719. package/skills/guides/json-render/scripts/llm-server/README.md +33 -0
  720. package/skills/guides/json-render/scripts/llm-server/catalog.ts +78 -0
  721. package/skills/guides/json-render/scripts/llm-server/package-lock.json +702 -0
  722. package/skills/guides/json-render/scripts/llm-server/package.json +18 -0
  723. package/skills/guides/json-render/scripts/llm-server/server.ts +285 -0
  724. package/skills/skill-creator/scripts/__pycache__/quick_validate.cpython-311.pyc +0 -0
  725. package/skills/tools/1password/SKILL.md +54 -0
  726. package/skills/tools/1password/docs/setup.md +85 -0
  727. package/skills/tools/1password/docs/troubleshooting.md +63 -0
  728. package/skills/tools/1password/references/cli-examples.md +29 -0
  729. package/skills/tools/1password/references/get-started.md +17 -0
  730. package/skills/tools/agent-browser/SKILL.md +450 -0
  731. package/skills/tools/agent-browser/docs/browser-use-eval.md +95 -0
  732. package/skills/tools/agent-browser/docs/first-tests.md +261 -0
  733. package/skills/tools/agent-browser/docs/wordle-nyt-eval.js +32 -0
  734. package/skills/tools/aix/SKILL.md +93 -0
  735. package/skills/tools/aix/docs/embeddings.md +40 -0
  736. package/skills/tools/aix/docs/setup.md +58 -0
  737. package/skills/tools/aix/docs/troubleshooting.md +41 -0
  738. package/skills/tools/aix/references/sql.md +48 -0
  739. package/skills/tools/apple-notes/SKILL.md +50 -0
  740. package/skills/tools/apple-reminders/SKILL.md +67 -0
  741. package/skills/tools/bear-notes/SKILL.md +79 -0
  742. package/skills/tools/bird/SKILL.md +32 -0
  743. package/skills/tools/bird/docs/auth.md +31 -0
  744. package/skills/tools/bird/docs/troubleshooting.md +31 -0
  745. package/skills/tools/blogwatcher/SKILL.md +46 -0
  746. package/skills/tools/blucli/SKILL.md +27 -0
  747. package/skills/tools/camsnap/SKILL.md +25 -0
  748. package/skills/tools/clawdhub/SKILL.md +53 -0
  749. package/skills/tools/coding-agent/SKILL.md +274 -0
  750. package/skills/tools/comms/SKILL.md +249 -0
  751. package/skills/tools/comms/docs/adapters.md +54 -0
  752. package/skills/tools/comms/docs/setup.md +56 -0
  753. package/skills/tools/comms/docs/troubleshooting.md +44 -0
  754. package/skills/tools/comms/references/schema.md +49 -0
  755. package/skills/tools/computer-use/SKILL.md +204 -0
  756. package/skills/tools/computer-use/docs/open-interpreter.md +26 -0
  757. package/skills/tools/computer-use/docs/peekaboo.md +26 -0
  758. package/skills/tools/computer-use/docs/setup.md +47 -0
  759. package/skills/tools/computer-use/docs/troubleshooting.md +33 -0
  760. package/skills/tools/eightctl/SKILL.md +29 -0
  761. package/skills/tools/eve/SKILL.md +215 -0
  762. package/skills/tools/eve/docs/dual-account.md +84 -0
  763. package/skills/tools/eve/docs/intelligence.md +58 -0
  764. package/skills/tools/eve/docs/setup.md +60 -0
  765. package/skills/tools/eve/docs/troubleshooting.md +54 -0
  766. package/skills/tools/eve/scripts/setup-dual-account.sh +125 -0
  767. package/skills/tools/food-order/SKILL.md +41 -0
  768. package/skills/tools/gh/SKILL.md +22 -0
  769. package/skills/tools/gh/docs/usage.md +41 -0
  770. package/skills/tools/gifgrep/SKILL.md +47 -0
  771. package/skills/tools/gog/SKILL.md +104 -0
  772. package/skills/tools/gog/docs/portability.md +94 -0
  773. package/skills/tools/gog/docs/setup.md +76 -0
  774. package/skills/tools/gog/docs/troubleshooting.md +94 -0
  775. package/skills/tools/gog/scripts/cdp/README.md +90 -0
  776. package/skills/tools/gog/scripts/cdp/add_test_users.py +69 -0
  777. package/skills/tools/gog/scripts/cdp/auth_add_accounts.py +209 -0
  778. package/skills/tools/gog/scripts/cdp/auth_add_accounts_manual.py +206 -0
  779. package/skills/tools/gog/scripts/cdp/create_oauth_client.py +165 -0
  780. package/skills/tools/gog/scripts/cdp/launch_cdp_chrome.sh +58 -0
  781. package/skills/tools/goplaces/SKILL.md +30 -0
  782. package/skills/tools/imsg/SKILL.md +25 -0
  783. package/skills/tools/local-places/SERVER_README.md +101 -0
  784. package/skills/tools/local-places/SKILL.md +91 -0
  785. package/skills/tools/local-places/pyproject.toml +27 -0
  786. package/skills/tools/local-places/src/local_places/__init__.py +2 -0
  787. package/skills/tools/local-places/src/local_places/__pycache__/__init__.cpython-314.pyc +0 -0
  788. package/skills/tools/local-places/src/local_places/__pycache__/google_places.cpython-314.pyc +0 -0
  789. package/skills/tools/local-places/src/local_places/__pycache__/main.cpython-314.pyc +0 -0
  790. package/skills/tools/local-places/src/local_places/__pycache__/schemas.cpython-314.pyc +0 -0
  791. package/skills/tools/local-places/src/local_places/google_places.py +314 -0
  792. package/skills/tools/local-places/src/local_places/main.py +65 -0
  793. package/skills/tools/local-places/src/local_places/schemas.py +107 -0
  794. package/skills/tools/mcporter/SKILL.md +38 -0
  795. package/skills/tools/model-usage/SKILL.md +45 -0
  796. package/skills/tools/model-usage/references/codexbar-cli.md +28 -0
  797. package/skills/tools/model-usage/scripts/model_usage.py +310 -0
  798. package/skills/tools/nano-banana-pro/SKILL.md +30 -0
  799. package/skills/tools/nano-banana-pro/scripts/generate_image.py +169 -0
  800. package/skills/tools/nano-pdf/SKILL.md +20 -0
  801. package/skills/tools/nexus-cloud/SKILL.md +54 -0
  802. package/skills/tools/nexus-cloud/docs/security.md +24 -0
  803. package/skills/tools/nexus-cloud/docs/setup.md +51 -0
  804. package/skills/tools/nexus-cloud/docs/troubleshooting.md +28 -0
  805. package/skills/tools/obsidian/SKILL.md +55 -0
  806. package/skills/tools/openai-image-gen/SKILL.md +31 -0
  807. package/skills/tools/openai-image-gen/scripts/gen.py +173 -0
  808. package/skills/tools/openai-whisper/SKILL.md +19 -0
  809. package/skills/tools/openai-whisper-api/SKILL.md +43 -0
  810. package/skills/tools/openai-whisper-api/scripts/transcribe.sh +85 -0
  811. package/skills/tools/openhue/SKILL.md +30 -0
  812. package/skills/tools/oracle/SKILL.md +105 -0
  813. package/skills/tools/ordercli/SKILL.md +47 -0
  814. package/skills/tools/peekaboo/SKILL.md +153 -0
  815. package/skills/tools/qmd/SKILL.md +32 -0
  816. package/skills/tools/qmd/docs/mcp.md +30 -0
  817. package/skills/tools/qmd/docs/ollama.md +42 -0
  818. package/skills/tools/qmd/docs/setup.md +44 -0
  819. package/skills/tools/sag/SKILL.md +62 -0
  820. package/skills/tools/skill-cli-template/SKILL.md +109 -0
  821. package/skills/tools/songsee/SKILL.md +29 -0
  822. package/skills/tools/sonoscli/SKILL.md +26 -0
  823. package/skills/tools/spotify-player/SKILL.md +34 -0
  824. package/skills/tools/summarize/SKILL.md +49 -0
  825. package/skills/tools/things-mac/SKILL.md +61 -0
  826. package/skills/tools/tmux/SKILL.md +121 -0
  827. package/skills/tools/tmux/scripts/find-sessions.sh +112 -0
  828. package/skills/tools/tmux/scripts/wait-for-text.sh +83 -0
  829. package/skills/tools/trello/SKILL.md +84 -0
  830. package/skills/tools/upstream-sync/SKILL.md +151 -0
  831. package/skills/tools/upstream-sync/scripts/auto-port.sh +227 -0
  832. package/skills/tools/upstream-sync/scripts/check-all.sh +88 -0
  833. package/skills/tools/upstream-sync/scripts/check-nexus.sh +146 -0
  834. package/skills/tools/upstream-sync/scripts/check-pi-ai.sh +129 -0
  835. package/skills/tools/video-frames/SKILL.md +29 -0
  836. package/skills/tools/video-frames/scripts/frame.sh +81 -0
  837. package/skills/tools/weather/SKILL.md +53 -0
  838. package/skills/tools/weather/docs/usage.md +40 -0
@@ -0,0 +1,286 @@
1
+ import fs from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { resolveBootstrapPath, resolveStateDir } from "../config/paths.js";
6
+ import { NEXUS_ROOT, SKILLS_STATE_DIR, resolveUserPath } from "../utils.js";
7
+ export function resolveDefaultAgentWorkspaceDir(env = process.env, homedir = os.homedir) {
8
+ const profile = env.NEXUS_PROFILE?.trim();
9
+ if (profile && profile.toLowerCase() !== "default") {
10
+ return path.join(homedir(), "nexus", `home-${profile}`);
11
+ }
12
+ return path.join(homedir(), "nexus", "home");
13
+ }
14
+ export const DEFAULT_AGENT_WORKSPACE_DIR = resolveDefaultAgentWorkspaceDir();
15
+ export const DEFAULT_AGENTS_FILENAME = "AGENTS.md";
16
+ export const DEFAULT_SOUL_FILENAME = "SOUL.md";
17
+ export const DEFAULT_TOOLS_FILENAME = "TOOLS.md";
18
+ export const DEFAULT_IDENTITY_FILENAME = "IDENTITY.md";
19
+ export const DEFAULT_USER_FILENAME = "IDENTITY.md";
20
+ export const DEFAULT_USER_TEMPLATE_NAME = "USER.md";
21
+ export const DEFAULT_BOOTSTRAP_FILENAME = "BOOTSTRAP.md";
22
+ const DEFAULT_AGENTS_TEMPLATE = `# AGENTS.md - Nexus Workspace
23
+
24
+ This workspace uses Nexus. Nexus is the source of truth; agents are guests who follow Nexus protocols.
25
+
26
+ ## First action (always)
27
+ Run:
28
+ \`\`\`bash
29
+ nexus status
30
+ \`\`\`
31
+
32
+ That command tells you who you are, what you can do, and what to do next.
33
+
34
+ ## Identity & memory
35
+ - Agent identity: state/agents/{agent}/IDENTITY.md
36
+ - Agent values: state/agents/{agent}/SOUL.md
37
+ - Agent memory: state/agents/{agent}/MEMORY.md
38
+ - User identity: state/user/IDENTITY.md
39
+
40
+ ## User workspace
41
+ The user-owned workspace lives in home/. Do not modify it without permission.
42
+
43
+ ## Safety defaults
44
+ - Don't exfiltrate secrets or private data.
45
+ - Don't run destructive commands unless explicitly asked.
46
+ - Be concise in chat; write longer output to files in home/.
47
+ `;
48
+ const DEFAULT_SOUL_TEMPLATE = `# SOUL.md - Persona & Boundaries
49
+
50
+ Describe who the assistant is, tone, and boundaries.
51
+
52
+ - Keep replies concise and direct.
53
+ - Ask clarifying questions when needed.
54
+ - Never send streaming/partial replies to external messaging surfaces.
55
+ `;
56
+ const DEFAULT_TOOLS_TEMPLATE = `# TOOLS.md - User Tool Notes (editable)
57
+
58
+ This file is for *your* notes about external tools and conventions.
59
+ It does not define which tools exist; Nexus provides built-in tools internally.
60
+
61
+ ## Examples
62
+
63
+ ### imsg
64
+ - Send an iMessage/SMS: describe who/what, confirm before sending.
65
+ - Prefer short messages; avoid sending secrets.
66
+
67
+ ### sag
68
+ - Text-to-speech: specify voice, target speaker/room, and whether to stream.
69
+
70
+ Add whatever else you want the assistant to know about your local toolchain.
71
+ `;
72
+ const DEFAULT_BOOTSTRAP_TEMPLATE = `# BOOTSTRAP.md - Welcome to Nexus
73
+
74
+ This workspace needs identity setup before agents can help.
75
+
76
+ ## For humans
77
+ Start a short conversation with your AI assistant. Share:
78
+ - Your name (and how you'd like to be addressed)
79
+ - What you're hoping to accomplish with AI
80
+ - Any preferences for tone, boundaries, or style
81
+
82
+ The agent will write identity files as you chat (takes ~5 min).
83
+
84
+ ## For agents
85
+ You are beginning the bootstrap conversation. Goals:
86
+
87
+ 1) Learn the user's name
88
+ → Write: state/user/IDENTITY.md
89
+
90
+ 2) Let the user name you
91
+ → Write: state/agents/{agent}/IDENTITY.md
92
+
93
+ 3) Define personality and boundaries
94
+ → Write: state/agents/{agent}/SOUL.md
95
+
96
+ 4) Initialize long-term memory
97
+ → Write: state/agents/{agent}/MEMORY.md
98
+
99
+ Be warm, curious, and conversational. Don't rush a checklist.
100
+
101
+ When complete, run \`nexus status\` to show what's unlocked.
102
+ `;
103
+ const DEFAULT_IDENTITY_TEMPLATE = `---
104
+ name:
105
+ emoji:
106
+ creature:
107
+ vibe:
108
+ ---
109
+ # IDENTITY.md - Agent Identity
110
+
111
+ - Name:
112
+ - Creature:
113
+ - Vibe:
114
+ - Emoji:
115
+ `;
116
+ const DEFAULT_USER_TEMPLATE = `---
117
+ name:
118
+ call:
119
+ pronouns:
120
+ timezone:
121
+ ---
122
+ # IDENTITY.md - About Your Human
123
+
124
+ - Name:
125
+ - What to call them:
126
+ - Pronouns (optional):
127
+ - Timezone (optional):
128
+ - Notes:
129
+ `;
130
+ const DEFAULT_MEMORY_TEMPLATE = `# MEMORY.md - Long-Term Memory
131
+
132
+ This file stores distilled, long-term insights about the user and context.
133
+ Keep it concise and updated as you learn important facts.
134
+ `;
135
+ const TEMPLATE_DIR = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../../docs/templates");
136
+ function stripFrontMatter(content) {
137
+ if (!content.startsWith("---"))
138
+ return content;
139
+ const endIndex = content.indexOf("\n---", 3);
140
+ if (endIndex === -1)
141
+ return content;
142
+ const start = endIndex + "\n---".length;
143
+ let trimmed = content.slice(start);
144
+ trimmed = trimmed.replace(/^\s+/, "");
145
+ return trimmed;
146
+ }
147
+ async function loadTemplate(name, fallback) {
148
+ const templatePath = path.join(TEMPLATE_DIR, name);
149
+ try {
150
+ const content = await fs.readFile(templatePath, "utf-8");
151
+ return stripFrontMatter(content);
152
+ }
153
+ catch {
154
+ return fallback;
155
+ }
156
+ }
157
+ async function writeFileIfMissing(filePath, content) {
158
+ try {
159
+ await fs.writeFile(filePath, content, {
160
+ encoding: "utf-8",
161
+ flag: "wx",
162
+ });
163
+ }
164
+ catch (err) {
165
+ const anyErr = err;
166
+ if (anyErr.code !== "EEXIST")
167
+ throw err;
168
+ }
169
+ }
170
+ export async function ensureAgentWorkspace(params) {
171
+ const rawDir = params?.dir?.trim()
172
+ ? params.dir.trim()
173
+ : DEFAULT_AGENT_WORKSPACE_DIR;
174
+ const dir = resolveUserPath(rawDir);
175
+ const createHomeLayout = params?.createHomeLayout ?? false;
176
+ await fs.mkdir(dir, { recursive: true });
177
+ if (createHomeLayout) {
178
+ await fs.mkdir(path.join(dir, "memory"), { recursive: true });
179
+ await fs.mkdir(path.join(dir, "projects"), { recursive: true });
180
+ }
181
+ await fs.mkdir(NEXUS_ROOT, { recursive: true });
182
+ const stateDir = resolveStateDir();
183
+ const nexusStateDir = path.join(stateDir, "nexus");
184
+ const agentId = process.env.NEXUS_AGENT_ID?.trim() || "default";
185
+ const agentIdentityDir = path.join(stateDir, "agents", agentId);
186
+ const userIdentityDir = path.join(stateDir, "user");
187
+ const skillsStateDir = SKILLS_STATE_DIR;
188
+ const credentialsDir = path.join(stateDir, "credentials");
189
+ await fs.mkdir(nexusStateDir, { recursive: true });
190
+ await fs.mkdir(agentIdentityDir, { recursive: true });
191
+ await fs.mkdir(userIdentityDir, { recursive: true });
192
+ await fs.mkdir(skillsStateDir, { recursive: true });
193
+ await fs.mkdir(credentialsDir, { recursive: true });
194
+ const agentsPath = path.join(NEXUS_ROOT, DEFAULT_AGENTS_FILENAME);
195
+ const soulPath = path.join(agentIdentityDir, DEFAULT_SOUL_FILENAME);
196
+ const toolsPath = path.join(dir, DEFAULT_TOOLS_FILENAME);
197
+ const identityPath = path.join(agentIdentityDir, DEFAULT_IDENTITY_FILENAME);
198
+ const memoryPath = path.join(agentIdentityDir, "MEMORY.md");
199
+ const userPath = path.join(userIdentityDir, DEFAULT_USER_FILENAME);
200
+ const bootstrapPath = resolveBootstrapPath();
201
+ const agentsTemplate = await loadTemplate(DEFAULT_AGENTS_FILENAME, DEFAULT_AGENTS_TEMPLATE);
202
+ await writeFileIfMissing(agentsPath, agentsTemplate);
203
+ if (params?.ensureBootstrapFiles) {
204
+ const bootstrapMode = params.bootstrapMode ?? "full";
205
+ const soulTemplate = await loadTemplate(DEFAULT_SOUL_FILENAME, DEFAULT_SOUL_TEMPLATE);
206
+ const toolsTemplate = await loadTemplate(DEFAULT_TOOLS_FILENAME, DEFAULT_TOOLS_TEMPLATE);
207
+ const identityTemplate = await loadTemplate(DEFAULT_IDENTITY_FILENAME, DEFAULT_IDENTITY_TEMPLATE);
208
+ const userTemplate = await loadTemplate(DEFAULT_USER_TEMPLATE_NAME, DEFAULT_USER_TEMPLATE);
209
+ const memoryTemplate = DEFAULT_MEMORY_TEMPLATE;
210
+ const bootstrapTemplate = await loadTemplate(DEFAULT_BOOTSTRAP_FILENAME, DEFAULT_BOOTSTRAP_TEMPLATE);
211
+ if (createHomeLayout) {
212
+ await writeFileIfMissing(toolsPath, toolsTemplate);
213
+ }
214
+ await writeFileIfMissing(bootstrapPath, bootstrapTemplate);
215
+ await writeFileIfMissing(soulPath, soulTemplate);
216
+ if (bootstrapMode === "full") {
217
+ await writeFileIfMissing(identityPath, identityTemplate);
218
+ await writeFileIfMissing(memoryPath, memoryTemplate);
219
+ await writeFileIfMissing(userPath, userTemplate);
220
+ }
221
+ }
222
+ return {
223
+ dir,
224
+ agentsPath,
225
+ soulPath,
226
+ toolsPath,
227
+ identityPath,
228
+ memoryPath,
229
+ userPath,
230
+ bootstrapPath,
231
+ };
232
+ }
233
+ export async function loadWorkspaceBootstrapFiles(dir) {
234
+ const resolvedDir = resolveUserPath(dir);
235
+ const stateDir = resolveStateDir();
236
+ const agentId = process.env.NEXUS_AGENT_ID?.trim() || "default";
237
+ const agentIdentityDir = path.join(stateDir, "agents", agentId);
238
+ const userIdentityDir = path.join(stateDir, "user");
239
+ const bootstrapPath = resolveBootstrapPath();
240
+ const entries = [
241
+ {
242
+ name: DEFAULT_AGENTS_FILENAME,
243
+ filePath: path.join(NEXUS_ROOT, DEFAULT_AGENTS_FILENAME),
244
+ },
245
+ {
246
+ name: DEFAULT_SOUL_FILENAME,
247
+ filePath: path.join(agentIdentityDir, DEFAULT_SOUL_FILENAME),
248
+ },
249
+ {
250
+ name: DEFAULT_TOOLS_FILENAME,
251
+ filePath: path.join(resolvedDir, DEFAULT_TOOLS_FILENAME),
252
+ },
253
+ {
254
+ name: DEFAULT_IDENTITY_FILENAME,
255
+ filePath: path.join(agentIdentityDir, DEFAULT_IDENTITY_FILENAME),
256
+ },
257
+ {
258
+ name: "MEMORY.md",
259
+ filePath: path.join(agentIdentityDir, "MEMORY.md"),
260
+ },
261
+ {
262
+ name: DEFAULT_USER_FILENAME,
263
+ filePath: path.join(userIdentityDir, DEFAULT_USER_FILENAME),
264
+ },
265
+ {
266
+ name: DEFAULT_BOOTSTRAP_FILENAME,
267
+ filePath: bootstrapPath,
268
+ },
269
+ ];
270
+ const result = [];
271
+ for (const entry of entries) {
272
+ try {
273
+ const content = await fs.readFile(entry.filePath, "utf-8");
274
+ result.push({
275
+ name: entry.name,
276
+ path: entry.filePath,
277
+ content,
278
+ missing: false,
279
+ });
280
+ }
281
+ catch {
282
+ result.push({ name: entry.name, path: entry.filePath, missing: true });
283
+ }
284
+ }
285
+ return result;
286
+ }
@@ -0,0 +1,177 @@
1
+ // Utilities for splitting outbound text into platform-sized chunks without
2
+ // unintentionally breaking on newlines. Using [\s\S] keeps newlines inside
3
+ // the chunk so messages are only split when they truly exceed the limit.
4
+ import { findFenceSpanAt, isSafeFenceBreak, parseFenceSpans, } from "../markdown/fences.js";
5
+ const DEFAULT_CHUNK_LIMIT_BY_PROVIDER = {
6
+ whatsapp: 4000,
7
+ telegram: 4000,
8
+ discord: 2000,
9
+ slack: 4000,
10
+ signal: 4000,
11
+ imessage: 4000,
12
+ webchat: 4000,
13
+ };
14
+ export function resolveTextChunkLimit(cfg, provider) {
15
+ const providerOverride = (() => {
16
+ if (!provider)
17
+ return undefined;
18
+ if (provider === "whatsapp")
19
+ return cfg?.whatsapp?.textChunkLimit;
20
+ if (provider === "telegram")
21
+ return cfg?.telegram?.textChunkLimit;
22
+ if (provider === "discord")
23
+ return cfg?.discord?.textChunkLimit;
24
+ if (provider === "slack")
25
+ return cfg?.slack?.textChunkLimit;
26
+ if (provider === "signal")
27
+ return cfg?.signal?.textChunkLimit;
28
+ if (provider === "imessage")
29
+ return cfg?.imessage?.textChunkLimit;
30
+ return undefined;
31
+ })();
32
+ if (typeof providerOverride === "number" && providerOverride > 0) {
33
+ return providerOverride;
34
+ }
35
+ if (provider)
36
+ return DEFAULT_CHUNK_LIMIT_BY_PROVIDER[provider];
37
+ return 4000;
38
+ }
39
+ export function chunkText(text, limit) {
40
+ if (!text)
41
+ return [];
42
+ if (limit <= 0)
43
+ return [text];
44
+ if (text.length <= limit)
45
+ return [text];
46
+ const chunks = [];
47
+ let remaining = text;
48
+ while (remaining.length > limit) {
49
+ const window = remaining.slice(0, limit);
50
+ // 1) Prefer a newline break inside the window.
51
+ let breakIdx = window.lastIndexOf("\n");
52
+ // 2) Otherwise prefer the last whitespace (word boundary) inside the window.
53
+ if (breakIdx <= 0) {
54
+ for (let i = window.length - 1; i >= 0; i--) {
55
+ if (/\s/.test(window[i])) {
56
+ breakIdx = i;
57
+ break;
58
+ }
59
+ }
60
+ }
61
+ // 3) Fallback: hard break exactly at the limit.
62
+ if (breakIdx <= 0)
63
+ breakIdx = limit;
64
+ const rawChunk = remaining.slice(0, breakIdx);
65
+ const chunk = rawChunk.trimEnd();
66
+ if (chunk.length > 0) {
67
+ chunks.push(chunk);
68
+ }
69
+ // If we broke on whitespace/newline, skip that separator; for hard breaks keep it.
70
+ const brokeOnSeparator = breakIdx < remaining.length && /\s/.test(remaining[breakIdx]);
71
+ const nextStart = Math.min(remaining.length, breakIdx + (brokeOnSeparator ? 1 : 0));
72
+ remaining = remaining.slice(nextStart).trimStart();
73
+ }
74
+ if (remaining.length)
75
+ chunks.push(remaining);
76
+ return chunks;
77
+ }
78
+ export function chunkMarkdownText(text, limit) {
79
+ if (!text)
80
+ return [];
81
+ if (limit <= 0)
82
+ return [text];
83
+ if (text.length <= limit)
84
+ return [text];
85
+ const chunks = [];
86
+ let remaining = text;
87
+ while (remaining.length > limit) {
88
+ const spans = parseFenceSpans(remaining);
89
+ const window = remaining.slice(0, limit);
90
+ const softBreak = pickSafeBreakIndex(window, spans);
91
+ let breakIdx = softBreak > 0 ? softBreak : limit;
92
+ const initialFence = isSafeFenceBreak(spans, breakIdx)
93
+ ? undefined
94
+ : findFenceSpanAt(spans, breakIdx);
95
+ let fenceToSplit = initialFence;
96
+ if (initialFence) {
97
+ const closeLine = `${initialFence.indent}${initialFence.marker}`;
98
+ const maxIdxIfNeedNewline = limit - (closeLine.length + 1);
99
+ if (maxIdxIfNeedNewline <= 0) {
100
+ fenceToSplit = undefined;
101
+ breakIdx = limit;
102
+ }
103
+ else {
104
+ const minProgressIdx = Math.min(remaining.length, initialFence.start + initialFence.openLine.length + 2);
105
+ const maxIdxIfAlreadyNewline = limit - closeLine.length;
106
+ let pickedNewline = false;
107
+ let lastNewline = remaining.lastIndexOf("\n", Math.max(0, maxIdxIfAlreadyNewline - 1));
108
+ while (lastNewline !== -1) {
109
+ const candidateBreak = lastNewline + 1;
110
+ if (candidateBreak < minProgressIdx)
111
+ break;
112
+ const candidateFence = findFenceSpanAt(spans, candidateBreak);
113
+ if (candidateFence && candidateFence.start === initialFence.start) {
114
+ breakIdx = Math.max(1, candidateBreak);
115
+ pickedNewline = true;
116
+ break;
117
+ }
118
+ lastNewline = remaining.lastIndexOf("\n", lastNewline - 1);
119
+ }
120
+ if (!pickedNewline) {
121
+ if (minProgressIdx > maxIdxIfAlreadyNewline) {
122
+ fenceToSplit = undefined;
123
+ breakIdx = limit;
124
+ }
125
+ else {
126
+ breakIdx = Math.max(minProgressIdx, maxIdxIfNeedNewline);
127
+ }
128
+ }
129
+ }
130
+ const fenceAtBreak = findFenceSpanAt(spans, breakIdx);
131
+ fenceToSplit =
132
+ fenceAtBreak && fenceAtBreak.start === initialFence.start
133
+ ? fenceAtBreak
134
+ : undefined;
135
+ }
136
+ let rawChunk = remaining.slice(0, breakIdx);
137
+ if (!rawChunk)
138
+ break;
139
+ const brokeOnSeparator = breakIdx < remaining.length && /\s/.test(remaining[breakIdx]);
140
+ const nextStart = Math.min(remaining.length, breakIdx + (brokeOnSeparator ? 1 : 0));
141
+ let next = remaining.slice(nextStart);
142
+ if (fenceToSplit) {
143
+ const closeLine = `${fenceToSplit.indent}${fenceToSplit.marker}`;
144
+ rawChunk = rawChunk.endsWith("\n")
145
+ ? `${rawChunk}${closeLine}`
146
+ : `${rawChunk}\n${closeLine}`;
147
+ next = `${fenceToSplit.openLine}\n${next}`;
148
+ }
149
+ else {
150
+ next = stripLeadingNewlines(next);
151
+ }
152
+ chunks.push(rawChunk);
153
+ remaining = next;
154
+ }
155
+ if (remaining.length)
156
+ chunks.push(remaining);
157
+ return chunks;
158
+ }
159
+ function stripLeadingNewlines(value) {
160
+ let i = 0;
161
+ while (i < value.length && value[i] === "\n")
162
+ i++;
163
+ return i > 0 ? value.slice(i) : value;
164
+ }
165
+ function pickSafeBreakIndex(window, spans) {
166
+ let newlineIdx = window.lastIndexOf("\n");
167
+ while (newlineIdx > 0) {
168
+ if (isSafeFenceBreak(spans, newlineIdx))
169
+ return newlineIdx;
170
+ newlineIdx = window.lastIndexOf("\n", newlineIdx - 1);
171
+ }
172
+ for (let i = window.length - 1; i > 0; i--) {
173
+ if (/\s/.test(window[i]) && isSafeFenceBreak(spans, i))
174
+ return i;
175
+ }
176
+ return -1;
177
+ }
@@ -0,0 +1,44 @@
1
+ import { normalizeE164 } from "../utils.js";
2
+ export function resolveCommandAuthorization(params) {
3
+ const { ctx, cfg, commandAuthorized } = params;
4
+ const provider = (ctx.Provider ?? "").trim().toLowerCase();
5
+ const from = (ctx.From ?? "").replace(/^whatsapp:/, "");
6
+ const to = (ctx.To ?? "").replace(/^whatsapp:/, "");
7
+ const hasWhatsappPrefix = (ctx.From ?? "").startsWith("whatsapp:") ||
8
+ (ctx.To ?? "").startsWith("whatsapp:");
9
+ const looksLikeE164 = (value) => Boolean(value && /^\+?\d{3,}$/.test(value.replace(/[^\d+]/g, "")));
10
+ const inferWhatsApp = !provider &&
11
+ Boolean(cfg.whatsapp?.allowFrom?.length) &&
12
+ (looksLikeE164(from) || looksLikeE164(to));
13
+ const isWhatsAppProvider = provider === "whatsapp" || hasWhatsappPrefix || inferWhatsApp;
14
+ const configuredAllowFrom = isWhatsAppProvider
15
+ ? cfg.whatsapp?.allowFrom
16
+ : undefined;
17
+ const allowFromList = configuredAllowFrom?.filter((entry) => entry?.trim()) ?? [];
18
+ const allowAll = !isWhatsAppProvider ||
19
+ allowFromList.length === 0 ||
20
+ allowFromList.some((entry) => entry.trim() === "*");
21
+ const senderE164 = normalizeE164(ctx.SenderE164 ?? (isWhatsAppProvider ? from : ""));
22
+ const ownerCandidates = isWhatsAppProvider && !allowAll
23
+ ? allowFromList.filter((entry) => entry !== "*")
24
+ : [];
25
+ if (isWhatsAppProvider && !allowAll && ownerCandidates.length === 0 && to) {
26
+ ownerCandidates.push(to);
27
+ }
28
+ const ownerList = ownerCandidates
29
+ .map((entry) => normalizeE164(entry))
30
+ .filter((entry) => Boolean(entry));
31
+ const isOwner = !isWhatsAppProvider ||
32
+ allowAll ||
33
+ ownerList.length === 0 ||
34
+ (senderE164 ? ownerList.includes(senderE164) : false);
35
+ const isAuthorizedSender = commandAuthorized && isOwner;
36
+ return {
37
+ isWhatsAppProvider,
38
+ ownerList,
39
+ senderE164: senderE164 || undefined,
40
+ isAuthorizedSender,
41
+ from: from || undefined,
42
+ to: to || undefined,
43
+ };
44
+ }
@@ -0,0 +1,23 @@
1
+ const CONTROL_COMMAND_RE = /(?:^|\s)\/(?:status|help|thinking|think|t|reasoning|reason|verbose|v|elevated|elev|model|queue|activation|send|restart|reset|new|compact)(?=$|\s|:)\b/i;
2
+ const CONTROL_COMMAND_EXACT = new Set([
3
+ "/help",
4
+ "/status",
5
+ "/restart",
6
+ "/activation",
7
+ "/send",
8
+ "/reasoning",
9
+ "/reset",
10
+ "/new",
11
+ "/compact",
12
+ ]);
13
+ export function hasControlCommand(text) {
14
+ if (!text)
15
+ return false;
16
+ const trimmed = text.trim();
17
+ if (!trimmed)
18
+ return false;
19
+ const lowered = trimmed.toLowerCase();
20
+ if (CONTROL_COMMAND_EXACT.has(lowered))
21
+ return true;
22
+ return CONTROL_COMMAND_RE.test(text);
23
+ }
@@ -0,0 +1,30 @@
1
+ function formatTimestamp(ts) {
2
+ if (!ts)
3
+ return undefined;
4
+ const date = ts instanceof Date ? ts : new Date(ts);
5
+ if (Number.isNaN(date.getTime()))
6
+ return undefined;
7
+ const yyyy = String(date.getUTCFullYear()).padStart(4, "0");
8
+ const mm = String(date.getUTCMonth() + 1).padStart(2, "0");
9
+ const dd = String(date.getUTCDate()).padStart(2, "0");
10
+ const hh = String(date.getUTCHours()).padStart(2, "0");
11
+ const min = String(date.getUTCMinutes()).padStart(2, "0");
12
+ // Compact ISO-like UTC timestamp with minutes precision.
13
+ // Example: 2025-01-02T03:04Z
14
+ return `${yyyy}-${mm}-${dd}T${hh}:${min}Z`;
15
+ }
16
+ export function formatAgentEnvelope(params) {
17
+ const provider = params.provider?.trim() || "Provider";
18
+ const parts = [provider];
19
+ if (params.from?.trim())
20
+ parts.push(params.from.trim());
21
+ if (params.host?.trim())
22
+ parts.push(params.host.trim());
23
+ if (params.ip?.trim())
24
+ parts.push(params.ip.trim());
25
+ const ts = formatTimestamp(params.timestamp);
26
+ if (ts)
27
+ parts.push(ts);
28
+ const header = `[${parts.join(" ")}]`;
29
+ return `${header} ${params.body}`;
30
+ }
@@ -0,0 +1,20 @@
1
+ export function normalizeGroupActivation(raw) {
2
+ const value = raw?.trim().toLowerCase();
3
+ if (value === "mention")
4
+ return "mention";
5
+ if (value === "always")
6
+ return "always";
7
+ return undefined;
8
+ }
9
+ export function parseActivationCommand(raw) {
10
+ if (!raw)
11
+ return { hasCommand: false };
12
+ const trimmed = raw.trim();
13
+ if (!trimmed)
14
+ return { hasCommand: false };
15
+ const match = trimmed.match(/^\/activation\b(?:\s+([a-zA-Z]+))?/i);
16
+ if (!match)
17
+ return { hasCommand: false };
18
+ const mode = normalizeGroupActivation(match[1]);
19
+ return { hasCommand: true, mode };
20
+ }
@@ -0,0 +1,58 @@
1
+ import { HEARTBEAT_TOKEN } from "./tokens.js";
2
+ export const HEARTBEAT_PROMPT = "HEARTBEAT";
3
+ export const DEFAULT_HEARTBEAT_ACK_MAX_CHARS = 30;
4
+ function stripTokenAtEdges(raw) {
5
+ let text = raw.trim();
6
+ if (!text)
7
+ return { text: "", didStrip: false };
8
+ const token = HEARTBEAT_TOKEN;
9
+ if (!text.includes(token))
10
+ return { text, didStrip: false };
11
+ let didStrip = false;
12
+ let changed = true;
13
+ while (changed) {
14
+ changed = false;
15
+ const next = text.trim();
16
+ if (next.startsWith(token)) {
17
+ const after = next.slice(token.length).trimStart();
18
+ text = after;
19
+ didStrip = true;
20
+ changed = true;
21
+ continue;
22
+ }
23
+ if (next.endsWith(token)) {
24
+ const before = next.slice(0, Math.max(0, next.length - token.length));
25
+ text = before.trimEnd();
26
+ didStrip = true;
27
+ changed = true;
28
+ }
29
+ }
30
+ const collapsed = text.replace(/\s+/g, " ").trim();
31
+ return { text: collapsed, didStrip };
32
+ }
33
+ export function stripHeartbeatToken(raw, opts = {}) {
34
+ if (!raw)
35
+ return { shouldSkip: true, text: "", didStrip: false };
36
+ const trimmed = raw.trim();
37
+ if (!trimmed)
38
+ return { shouldSkip: true, text: "", didStrip: false };
39
+ const mode = opts.mode ?? "message";
40
+ const maxAckChars = Math.max(0, opts.maxAckChars ?? DEFAULT_HEARTBEAT_ACK_MAX_CHARS);
41
+ if (!trimmed.includes(HEARTBEAT_TOKEN)) {
42
+ return { shouldSkip: false, text: trimmed, didStrip: false };
43
+ }
44
+ const stripped = stripTokenAtEdges(trimmed);
45
+ if (!stripped.didStrip) {
46
+ return { shouldSkip: false, text: trimmed, didStrip: false };
47
+ }
48
+ if (!stripped.text) {
49
+ return { shouldSkip: true, text: "", didStrip: true };
50
+ }
51
+ if (mode === "heartbeat") {
52
+ const rest = stripped.text.trim();
53
+ if (rest.length <= maxAckChars) {
54
+ return { shouldSkip: true, text: "", didStrip: true };
55
+ }
56
+ }
57
+ return { shouldSkip: false, text: stripped.text, didStrip: true };
58
+ }
@@ -0,0 +1,22 @@
1
+ export function extractModelDirective(body) {
2
+ if (!body)
3
+ return { cleaned: "", hasDirective: false };
4
+ const match = body.match(/(?:^|\s)\/model(?=$|\s|:)\s*:?\s*([A-Za-z0-9_.:@-]+(?:\/[A-Za-z0-9_.:@-]+)?)?/i);
5
+ const raw = match?.[1]?.trim();
6
+ let rawModel = raw;
7
+ let rawProfile;
8
+ if (raw?.includes("@")) {
9
+ const parts = raw.split("@");
10
+ rawModel = parts[0]?.trim();
11
+ rawProfile = parts.slice(1).join("@").trim() || undefined;
12
+ }
13
+ const cleaned = match
14
+ ? body.replace(match[0], "").replace(/\s+/g, " ").trim()
15
+ : body.trim();
16
+ return {
17
+ cleaned,
18
+ rawModel,
19
+ rawProfile,
20
+ hasDirective: !!match,
21
+ };
22
+ }
@@ -0,0 +1,14 @@
1
+ const ABORT_TRIGGERS = new Set(["stop", "esc", "abort", "wait", "exit"]);
2
+ const ABORT_MEMORY = new Map();
3
+ export function isAbortTrigger(text) {
4
+ if (!text)
5
+ return false;
6
+ const normalized = text.trim().toLowerCase();
7
+ return ABORT_TRIGGERS.has(normalized);
8
+ }
9
+ export function getAbortMemory(key) {
10
+ return ABORT_MEMORY.get(key);
11
+ }
12
+ export function setAbortMemory(key, value) {
13
+ ABORT_MEMORY.set(key, value);
14
+ }