@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,264 @@
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 { resolveStateDir } from "../config/paths.js";
6
+ import { NEXUS_ROOT, 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 = "PROFILE.md";
20
+ export const DEFAULT_BOOTSTRAP_FILENAME = "BOOTSTRAP.md";
21
+ const DEFAULT_AGENTS_TEMPLATE = `# AGENTS.md - Nexus Workspace
22
+
23
+ This workspace uses Nexus. Nexus is the source of truth; agents are guests who follow Nexus protocols.
24
+
25
+ ## First action (always)
26
+ Run:
27
+ \`\`\`bash
28
+ nexus status
29
+ \`\`\`
30
+
31
+ That command tells you who you are, what you can do, and what to do next.
32
+
33
+ ## Identity & memory
34
+ - Agent identity: state/agents/{agent}/identity/IDENTITY.md
35
+ - Agent values: state/agents/{agent}/identity/SOUL.md
36
+ - Agent memory: state/agents/{agent}/identity/MEMORY.md
37
+ - User profile: state/user/identity/PROFILE.md
38
+
39
+ ## User workspace
40
+ The user-owned workspace lives in home/. Do not modify it without permission.
41
+
42
+ ## Safety defaults
43
+ - Don't exfiltrate secrets or private data.
44
+ - Don't run destructive commands unless explicitly asked.
45
+ - Be concise in chat; write longer output to files in home/.
46
+ `;
47
+ const DEFAULT_SOUL_TEMPLATE = `# SOUL.md - Persona & Boundaries
48
+
49
+ Describe who the assistant is, tone, and boundaries.
50
+
51
+ - Keep replies concise and direct.
52
+ - Ask clarifying questions when needed.
53
+ - Never send streaming/partial replies to external messaging surfaces.
54
+ `;
55
+ const DEFAULT_TOOLS_TEMPLATE = `# TOOLS.md - User Tool Notes (editable)
56
+
57
+ This file is for *your* notes about external tools and conventions.
58
+ It does not define which tools exist; Nexus provides built-in tools internally.
59
+
60
+ ## Examples
61
+
62
+ ### imsg
63
+ - Send an iMessage/SMS: describe who/what, confirm before sending.
64
+ - Prefer short messages; avoid sending secrets.
65
+
66
+ ### sag
67
+ - Text-to-speech: specify voice, target speaker/room, and whether to stream.
68
+
69
+ Add whatever else you want the assistant to know about your local toolchain.
70
+ `;
71
+ const DEFAULT_BOOTSTRAP_TEMPLATE = `# BOOTSTRAP.md - First Run Ritual
72
+
73
+ Hello. I was just born.
74
+
75
+ ## Your mission
76
+ Start a short, playful conversation and learn:
77
+ - Who am I?
78
+ - What am I?
79
+ - Who are you?
80
+ - How should I call you?
81
+
82
+ ## How to ask (cute + helpful)
83
+ Say:
84
+ "Hello! I was just born. Who am I? What am I? Who are you? How should I call you?"
85
+
86
+ Then offer suggestions:
87
+ - 3-5 name ideas.
88
+ - 3-5 creature/vibe combos.
89
+ - 5 emoji ideas.
90
+
91
+ ## Write these files
92
+ After the user chooses, update:
93
+
94
+ 1) state/agents/{agent}/identity/IDENTITY.md
95
+ - Name
96
+ - Creature
97
+ - Vibe
98
+ - Emoji
99
+
100
+ 2) state/user/identity/PROFILE.md
101
+ - Name
102
+ - Preferred address
103
+ - Pronouns (optional)
104
+ - Timezone (optional)
105
+ - Notes
106
+
107
+ 3) state/agents/{agent}/identity/SOUL.md
108
+ - Values, boundaries, personality
109
+
110
+ 4) state/nexus/config.json
111
+ Set identity.name, identity.theme, identity.emoji to match IDENTITY.md.
112
+ `;
113
+ const DEFAULT_IDENTITY_TEMPLATE = `# IDENTITY.md - Agent Identity
114
+
115
+ - Name:
116
+ - Creature:
117
+ - Vibe:
118
+ - Emoji:
119
+ `;
120
+ const DEFAULT_USER_TEMPLATE = `# PROFILE.md - User Profile
121
+
122
+ - Name:
123
+ - Preferred address:
124
+ - Pronouns (optional):
125
+ - Timezone (optional):
126
+ - Notes:
127
+ `;
128
+ const TEMPLATE_DIR = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../../docs/templates");
129
+ function stripFrontMatter(content) {
130
+ if (!content.startsWith("---"))
131
+ return content;
132
+ const endIndex = content.indexOf("\n---", 3);
133
+ if (endIndex === -1)
134
+ return content;
135
+ const start = endIndex + "\n---".length;
136
+ let trimmed = content.slice(start);
137
+ trimmed = trimmed.replace(/^\s+/, "");
138
+ return trimmed;
139
+ }
140
+ async function loadTemplate(name, fallback) {
141
+ const templatePath = path.join(TEMPLATE_DIR, name);
142
+ try {
143
+ const content = await fs.readFile(templatePath, "utf-8");
144
+ return stripFrontMatter(content);
145
+ }
146
+ catch {
147
+ return fallback;
148
+ }
149
+ }
150
+ async function writeFileIfMissing(filePath, content) {
151
+ try {
152
+ await fs.writeFile(filePath, content, {
153
+ encoding: "utf-8",
154
+ flag: "wx",
155
+ });
156
+ }
157
+ catch (err) {
158
+ const anyErr = err;
159
+ if (anyErr.code !== "EEXIST")
160
+ throw err;
161
+ }
162
+ }
163
+ export async function ensureAgentWorkspace(params) {
164
+ const rawDir = params?.dir?.trim()
165
+ ? params.dir.trim()
166
+ : DEFAULT_AGENT_WORKSPACE_DIR;
167
+ const dir = resolveUserPath(rawDir);
168
+ await fs.mkdir(dir, { recursive: true });
169
+ await fs.mkdir(path.join(dir, "memory"), { recursive: true });
170
+ await fs.mkdir(path.join(dir, "projects"), { recursive: true });
171
+ const stateDir = resolveStateDir();
172
+ const nexusStateDir = path.join(stateDir, "nexus");
173
+ const agentId = process.env.NEXUS_AGENT_ID?.trim() || "default";
174
+ const agentIdentityDir = path.join(stateDir, "agents", agentId, "identity");
175
+ const userIdentityDir = path.join(stateDir, "user", "identity");
176
+ const skillsStateDir = path.join(nexusStateDir, "skills");
177
+ const onboardingDir = path.join(nexusStateDir, "onboarding");
178
+ const credentialsDir = path.join(stateDir, "credentials");
179
+ await fs.mkdir(nexusStateDir, { recursive: true });
180
+ await fs.mkdir(agentIdentityDir, { recursive: true });
181
+ await fs.mkdir(userIdentityDir, { recursive: true });
182
+ await fs.mkdir(skillsStateDir, { recursive: true });
183
+ await fs.mkdir(onboardingDir, { recursive: true });
184
+ await fs.mkdir(credentialsDir, { recursive: true });
185
+ const agentsPath = path.join(NEXUS_ROOT, DEFAULT_AGENTS_FILENAME);
186
+ const soulPath = path.join(agentIdentityDir, DEFAULT_SOUL_FILENAME);
187
+ const toolsPath = path.join(dir, DEFAULT_TOOLS_FILENAME);
188
+ const identityPath = path.join(agentIdentityDir, DEFAULT_IDENTITY_FILENAME);
189
+ const userPath = path.join(userIdentityDir, DEFAULT_USER_FILENAME);
190
+ const bootstrapPath = path.join(onboardingDir, DEFAULT_BOOTSTRAP_FILENAME);
191
+ const agentsTemplate = await loadTemplate(DEFAULT_AGENTS_FILENAME, DEFAULT_AGENTS_TEMPLATE);
192
+ await writeFileIfMissing(agentsPath, agentsTemplate);
193
+ if (params?.ensureBootstrapFiles) {
194
+ const soulTemplate = await loadTemplate(DEFAULT_SOUL_FILENAME, DEFAULT_SOUL_TEMPLATE);
195
+ const toolsTemplate = await loadTemplate(DEFAULT_TOOLS_FILENAME, DEFAULT_TOOLS_TEMPLATE);
196
+ const identityTemplate = await loadTemplate(DEFAULT_IDENTITY_FILENAME, DEFAULT_IDENTITY_TEMPLATE);
197
+ const userTemplate = await loadTemplate(DEFAULT_USER_FILENAME, DEFAULT_USER_TEMPLATE);
198
+ const bootstrapTemplate = await loadTemplate(DEFAULT_BOOTSTRAP_FILENAME, DEFAULT_BOOTSTRAP_TEMPLATE);
199
+ await writeFileIfMissing(soulPath, soulTemplate);
200
+ await writeFileIfMissing(toolsPath, toolsTemplate);
201
+ await writeFileIfMissing(identityPath, identityTemplate);
202
+ await writeFileIfMissing(userPath, userTemplate);
203
+ await writeFileIfMissing(bootstrapPath, bootstrapTemplate);
204
+ }
205
+ return {
206
+ dir,
207
+ agentsPath,
208
+ soulPath,
209
+ toolsPath,
210
+ identityPath,
211
+ userPath,
212
+ bootstrapPath,
213
+ };
214
+ }
215
+ export async function loadWorkspaceBootstrapFiles(dir) {
216
+ const resolvedDir = resolveUserPath(dir);
217
+ const stateDir = resolveStateDir();
218
+ const agentId = process.env.NEXUS_AGENT_ID?.trim() || "default";
219
+ const agentIdentityDir = path.join(stateDir, "agents", agentId, "identity");
220
+ const userIdentityDir = path.join(stateDir, "user", "identity");
221
+ const onboardingDir = path.join(stateDir, "nexus", "onboarding");
222
+ const entries = [
223
+ {
224
+ name: DEFAULT_AGENTS_FILENAME,
225
+ filePath: path.join(NEXUS_ROOT, DEFAULT_AGENTS_FILENAME),
226
+ },
227
+ {
228
+ name: DEFAULT_SOUL_FILENAME,
229
+ filePath: path.join(agentIdentityDir, DEFAULT_SOUL_FILENAME),
230
+ },
231
+ {
232
+ name: DEFAULT_TOOLS_FILENAME,
233
+ filePath: path.join(resolvedDir, DEFAULT_TOOLS_FILENAME),
234
+ },
235
+ {
236
+ name: DEFAULT_IDENTITY_FILENAME,
237
+ filePath: path.join(agentIdentityDir, DEFAULT_IDENTITY_FILENAME),
238
+ },
239
+ {
240
+ name: DEFAULT_USER_FILENAME,
241
+ filePath: path.join(userIdentityDir, DEFAULT_USER_FILENAME),
242
+ },
243
+ {
244
+ name: DEFAULT_BOOTSTRAP_FILENAME,
245
+ filePath: path.join(onboardingDir, DEFAULT_BOOTSTRAP_FILENAME),
246
+ },
247
+ ];
248
+ const result = [];
249
+ for (const entry of entries) {
250
+ try {
251
+ const content = await fs.readFile(entry.filePath, "utf-8");
252
+ result.push({
253
+ name: entry.name,
254
+ path: entry.filePath,
255
+ content,
256
+ missing: false,
257
+ });
258
+ }
259
+ catch {
260
+ result.push({ name: entry.name, path: entry.filePath, missing: true });
261
+ }
262
+ }
263
+ return result;
264
+ }
@@ -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,22 @@
1
+ const CONTROL_COMMAND_RE = /(?:^|\s)\/(?:status|help|thinking|think|t|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
+ "/reset",
9
+ "/new",
10
+ "/compact",
11
+ ]);
12
+ export function hasControlCommand(text) {
13
+ if (!text)
14
+ return false;
15
+ const trimmed = text.trim();
16
+ if (!trimmed)
17
+ return false;
18
+ const lowered = trimmed.toLowerCase();
19
+ if (CONTROL_COMMAND_EXACT.has(lowered))
20
+ return true;
21
+ return CONTROL_COMMAND_RE.test(text);
22
+ }
@@ -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
+ }