@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,932 @@
1
+ import fs from "node:fs/promises";
2
+ import os from "node:os";
3
+ import { buildSystemPrompt, createAgentSession, discoverAuthStorage, discoverModels, SessionManager, SettingsManager, } from "@mariozechner/pi-coding-agent";
4
+ import { formatToolAggregate } from "../auto-reply/tool-meta.js";
5
+ import { getMachineDisplayName } from "../infra/machine-name.js";
6
+ import { createSubsystemLogger } from "../logging.js";
7
+ import { splitMediaFromOutput } from "../media/parse.js";
8
+ import { enqueueCommandInLane, } from "../process/command-queue.js";
9
+ import { resolveUserPath } from "../utils.js";
10
+ import { resolveNexusAgentDir } from "./agent-paths.js";
11
+ import { markAuthProfileCooldown, markAuthProfileGood, markAuthProfileUsed, } from "./auth-profiles.js";
12
+ import { DEFAULT_MODEL, DEFAULT_PROVIDER } from "./defaults.js";
13
+ import { ensureAuthProfileStore, getApiKeyForModel, resolveAuthProfileOrder, } from "./model-auth.js";
14
+ import { ensureNexusModelsJson } from "./models-config.js";
15
+ import { buildBootstrapContextFiles, ensureSessionHeader, formatAssistantErrorText, isAuthAssistantError, isAuthErrorMessage, isRateLimitAssistantError, isRateLimitErrorMessage, pickFallbackThinkingLevel, sanitizeSessionMessagesImages, } from "./pi-embedded-helpers.js";
16
+ import { subscribeEmbeddedPiSession, } from "./pi-embedded-subscribe.js";
17
+ import { extractAssistantText } from "./pi-embedded-utils.js";
18
+ import { toToolDefinitions } from "./pi-tool-definition-adapter.js";
19
+ import { createNexusCodingTools } from "./pi-tools.js";
20
+ import { resolveSandboxContext } from "./sandbox.js";
21
+ import { resolveTelegramReactionLevel } from "../telegram/reaction-level.js";
22
+ import { applySkillEnvOverrides, applySkillEnvOverridesFromSnapshot, buildWorkspaceSkillSnapshot, loadWorkspaceSkillEntries, } from "./skills.js";
23
+ import { buildAgentSystemPromptAppend } from "./system-prompt.js";
24
+ import { normalizeUsage } from "./usage.js";
25
+ import { loadWorkspaceBootstrapFiles } from "./workspace.js";
26
+ const log = createSubsystemLogger("agent/embedded");
27
+ const GOOGLE_SCHEMA_UNSUPPORTED_KEYWORDS = new Set([
28
+ "patternProperties",
29
+ "additionalProperties",
30
+ "$schema",
31
+ "$id",
32
+ "$ref",
33
+ "$defs",
34
+ "definitions",
35
+ "examples",
36
+ "minLength",
37
+ "maxLength",
38
+ "minimum",
39
+ "maximum",
40
+ "multipleOf",
41
+ "pattern",
42
+ "format",
43
+ "minItems",
44
+ "maxItems",
45
+ "uniqueItems",
46
+ "minProperties",
47
+ "maxProperties",
48
+ ]);
49
+ function isAntigravityClaudeModel(provider, modelId) {
50
+ if (provider !== "google-antigravity")
51
+ return false;
52
+ return modelId.trim().toLowerCase().includes("claude");
53
+ }
54
+ function findUnsupportedSchemaKeywords(schema, path) {
55
+ if (!schema || typeof schema !== "object")
56
+ return [];
57
+ if (Array.isArray(schema)) {
58
+ return schema.flatMap((item, index) => findUnsupportedSchemaKeywords(item, `${path}[${index}]`));
59
+ }
60
+ const record = schema;
61
+ const violations = [];
62
+ for (const [key, value] of Object.entries(record)) {
63
+ if (GOOGLE_SCHEMA_UNSUPPORTED_KEYWORDS.has(key)) {
64
+ violations.push(`${path}.${key}`);
65
+ }
66
+ if (value && typeof value === "object") {
67
+ violations.push(...findUnsupportedSchemaKeywords(value, `${path}.${key}`));
68
+ }
69
+ }
70
+ return violations;
71
+ }
72
+ function logToolSchemasForGoogle(params) {
73
+ if (params.provider !== "google-antigravity" && params.provider !== "google-gemini-cli") {
74
+ return;
75
+ }
76
+ const toolNames = params.tools.map((tool, index) => `${index}:${tool.name}`);
77
+ log.info("google tool schema snapshot", {
78
+ provider: params.provider,
79
+ toolCount: params.tools.length,
80
+ tools: toolNames,
81
+ });
82
+ for (const [index, tool] of params.tools.entries()) {
83
+ const violations = findUnsupportedSchemaKeywords(tool.parameters, `${tool.name}.parameters`);
84
+ if (violations.length > 0) {
85
+ log.warn("google tool schema has unsupported keywords", {
86
+ index,
87
+ tool: tool.name,
88
+ violations: violations.slice(0, 12),
89
+ violationCount: violations.length,
90
+ });
91
+ }
92
+ }
93
+ }
94
+ /**
95
+ * Limits conversation history to the last N user turns (and their associated
96
+ * assistant responses). This reduces token usage for long-running DM sessions.
97
+ *
98
+ * @param messages - The full message history
99
+ * @param limit - Max number of user turns to keep (undefined = no limit)
100
+ * @returns Messages trimmed to the last `limit` user turns
101
+ */
102
+ export function limitHistoryTurns(messages, limit) {
103
+ if (!limit || limit <= 0 || messages.length === 0)
104
+ return messages;
105
+ // Count user messages from the end, find cutoff point
106
+ let userCount = 0;
107
+ let lastUserIndex = messages.length;
108
+ for (let i = messages.length - 1; i >= 0; i--) {
109
+ if (messages[i].role === "user") {
110
+ userCount++;
111
+ if (userCount > limit) {
112
+ // We exceeded the limit; keep from the last valid user turn onwards
113
+ return messages.slice(lastUserIndex);
114
+ }
115
+ lastUserIndex = i;
116
+ }
117
+ }
118
+ // Fewer than limit user turns, keep all
119
+ return messages;
120
+ }
121
+ /**
122
+ * Extracts the channel name and user ID from a session key and looks up
123
+ * dmHistoryLimit from the channel config, with per-DM override support.
124
+ *
125
+ * Session key formats:
126
+ * - `telegram:dm:123` → channel = telegram, userId = 123
127
+ * - `agent:default:telegram:dm:123` → channel = telegram, userId = 123
128
+ *
129
+ * Resolution order:
130
+ * 1. Per-DM override: channel.dms[userId].historyLimit
131
+ * 2. Channel default: channel.dmHistoryLimit
132
+ */
133
+ export function getDmHistoryLimitFromSessionKey(sessionKey, config, messageChannel) {
134
+ if (!config)
135
+ return undefined;
136
+ const raw = sessionKey?.trim() ?? "";
137
+ if (!raw)
138
+ return undefined;
139
+ if (raw.startsWith("group:") || raw.includes(":group:") || raw.includes(":channel:")) {
140
+ return undefined;
141
+ }
142
+ const parts = raw.split(":").filter(Boolean);
143
+ const channelParts = parts.length >= 3 && parts[0] === "agent" ? parts.slice(2) : parts;
144
+ const kind = channelParts[1]?.toLowerCase();
145
+ if (kind && kind !== "dm")
146
+ return undefined;
147
+ const channelFromKey = kind === "dm" ? channelParts[0]?.toLowerCase() : undefined;
148
+ const channel = channelFromKey ?? messageChannel?.trim().toLowerCase() ?? undefined;
149
+ if (!channel)
150
+ return undefined;
151
+ // The userId may contain colons (e.g., email addresses), so join remaining parts.
152
+ const userId = kind === "dm" ? channelParts.slice(2).join(":") : "";
153
+ const getLimit = (channelConfig) => {
154
+ if (!channelConfig || typeof channelConfig !== "object")
155
+ return undefined;
156
+ const parsed = channelConfig;
157
+ if (userId && parsed.dms?.[userId]?.historyLimit !== undefined) {
158
+ return parsed.dms[userId].historyLimit;
159
+ }
160
+ return parsed.dmHistoryLimit;
161
+ };
162
+ switch (channel) {
163
+ case "telegram":
164
+ return getLimit(config.telegram);
165
+ case "whatsapp":
166
+ return getLimit(config.whatsapp);
167
+ case "discord":
168
+ return getLimit(config.discord);
169
+ case "slack":
170
+ return getLimit(config.slack);
171
+ case "signal":
172
+ return getLimit(config.signal);
173
+ case "imessage":
174
+ return getLimit(config.imessage);
175
+ default:
176
+ return undefined;
177
+ }
178
+ }
179
+ function resolveReactionGuidance(params) {
180
+ if (!params.config)
181
+ return undefined;
182
+ const rawChannel = params.messageChannel ?? params.messageProvider ?? "";
183
+ const normalized = rawChannel.trim().toLowerCase();
184
+ const baseChannel = normalized.split(":")[0];
185
+ if (baseChannel !== "telegram")
186
+ return undefined;
187
+ const resolved = resolveTelegramReactionLevel({ cfg: params.config });
188
+ const level = resolved.agentReactionGuidance;
189
+ return level ? { level, channel: "Telegram" } : undefined;
190
+ }
191
+ const ACTIVE_EMBEDDED_RUNS = new Map();
192
+ const EMBEDDED_RUN_WAITERS = new Map();
193
+ function resolveSessionLane(key) {
194
+ const cleaned = key.trim() || "main";
195
+ return cleaned.startsWith("session:") ? cleaned : `session:${cleaned}`;
196
+ }
197
+ function resolveGlobalLane(lane) {
198
+ const cleaned = lane?.trim();
199
+ return cleaned ? cleaned : "main";
200
+ }
201
+ function resolveUserTimezone(configured) {
202
+ const trimmed = configured?.trim();
203
+ if (trimmed) {
204
+ try {
205
+ new Intl.DateTimeFormat("en-US", { timeZone: trimmed }).format(new Date());
206
+ return trimmed;
207
+ }
208
+ catch {
209
+ // ignore invalid timezone
210
+ }
211
+ }
212
+ const host = Intl.DateTimeFormat().resolvedOptions().timeZone;
213
+ return host?.trim() || "UTC";
214
+ }
215
+ function formatUserTime(date, timeZone) {
216
+ try {
217
+ const parts = new Intl.DateTimeFormat("en-CA", {
218
+ timeZone,
219
+ year: "numeric",
220
+ month: "2-digit",
221
+ day: "2-digit",
222
+ hour: "2-digit",
223
+ minute: "2-digit",
224
+ hourCycle: "h23",
225
+ }).formatToParts(date);
226
+ const map = {};
227
+ for (const part of parts) {
228
+ if (part.type !== "literal")
229
+ map[part.type] = part.value;
230
+ }
231
+ if (!map.year || !map.month || !map.day || !map.hour || !map.minute) {
232
+ return undefined;
233
+ }
234
+ return `${map.year}-${map.month}-${map.day} ${map.hour}:${map.minute}`;
235
+ }
236
+ catch {
237
+ return undefined;
238
+ }
239
+ }
240
+ function describeUnknownError(error) {
241
+ if (error instanceof Error)
242
+ return error.message;
243
+ if (typeof error === "string")
244
+ return error;
245
+ try {
246
+ const serialized = JSON.stringify(error);
247
+ return serialized ?? "Unknown error";
248
+ }
249
+ catch {
250
+ return "Unknown error";
251
+ }
252
+ }
253
+ export function buildEmbeddedSandboxInfo(sandbox) {
254
+ if (!sandbox?.enabled)
255
+ return undefined;
256
+ return {
257
+ enabled: true,
258
+ workspaceDir: sandbox.workspaceDir,
259
+ browserControlUrl: sandbox.browser?.controlUrl,
260
+ browserNoVncUrl: sandbox.browser?.noVncUrl,
261
+ };
262
+ }
263
+ export function queueEmbeddedPiMessage(sessionId, text) {
264
+ const handle = ACTIVE_EMBEDDED_RUNS.get(sessionId);
265
+ if (!handle)
266
+ return false;
267
+ if (!handle.isStreaming())
268
+ return false;
269
+ if (handle.isCompacting())
270
+ return false;
271
+ void handle.queueMessage(text);
272
+ return true;
273
+ }
274
+ export function abortEmbeddedPiRun(sessionId) {
275
+ const handle = ACTIVE_EMBEDDED_RUNS.get(sessionId);
276
+ if (!handle)
277
+ return false;
278
+ handle.abort();
279
+ return true;
280
+ }
281
+ export function isEmbeddedPiRunActive(sessionId) {
282
+ return ACTIVE_EMBEDDED_RUNS.has(sessionId);
283
+ }
284
+ export function isEmbeddedPiRunStreaming(sessionId) {
285
+ const handle = ACTIVE_EMBEDDED_RUNS.get(sessionId);
286
+ if (!handle)
287
+ return false;
288
+ return handle.isStreaming();
289
+ }
290
+ export function waitForEmbeddedPiRunEnd(sessionId, timeoutMs = 15_000) {
291
+ if (!sessionId || !ACTIVE_EMBEDDED_RUNS.has(sessionId))
292
+ return Promise.resolve(true);
293
+ return new Promise((resolve) => {
294
+ const waiters = EMBEDDED_RUN_WAITERS.get(sessionId) ?? new Set();
295
+ const waiter = {
296
+ resolve,
297
+ timer: setTimeout(() => {
298
+ waiters.delete(waiter);
299
+ if (waiters.size === 0)
300
+ EMBEDDED_RUN_WAITERS.delete(sessionId);
301
+ resolve(false);
302
+ }, Math.max(100, timeoutMs)),
303
+ };
304
+ waiters.add(waiter);
305
+ EMBEDDED_RUN_WAITERS.set(sessionId, waiters);
306
+ if (!ACTIVE_EMBEDDED_RUNS.has(sessionId)) {
307
+ waiters.delete(waiter);
308
+ if (waiters.size === 0)
309
+ EMBEDDED_RUN_WAITERS.delete(sessionId);
310
+ clearTimeout(waiter.timer);
311
+ resolve(true);
312
+ }
313
+ });
314
+ }
315
+ function notifyEmbeddedRunEnded(sessionId) {
316
+ const waiters = EMBEDDED_RUN_WAITERS.get(sessionId);
317
+ if (!waiters || waiters.size === 0)
318
+ return;
319
+ EMBEDDED_RUN_WAITERS.delete(sessionId);
320
+ for (const waiter of waiters) {
321
+ clearTimeout(waiter.timer);
322
+ waiter.resolve(true);
323
+ }
324
+ }
325
+ export function resolveEmbeddedSessionLane(key) {
326
+ return resolveSessionLane(key);
327
+ }
328
+ function mapThinkingLevel(level) {
329
+ // pi-agent-core supports "xhigh" too; Nexus doesn't surface it for now.
330
+ if (!level)
331
+ return "off";
332
+ return level;
333
+ }
334
+ function resolveModel(provider, modelId, agentDir) {
335
+ const resolvedAgentDir = agentDir ?? resolveNexusAgentDir();
336
+ const authStorage = discoverAuthStorage(resolvedAgentDir);
337
+ const modelRegistry = discoverModels(authStorage, resolvedAgentDir);
338
+ const model = modelRegistry.find(provider, modelId);
339
+ if (!model) {
340
+ return {
341
+ error: `Unknown model: ${provider}/${modelId}`,
342
+ authStorage,
343
+ modelRegistry,
344
+ };
345
+ }
346
+ return { model, authStorage, modelRegistry };
347
+ }
348
+ function resolvePromptSkills(snapshot, entries) {
349
+ if (snapshot.resolvedSkills?.length) {
350
+ return snapshot.resolvedSkills;
351
+ }
352
+ const snapshotNames = snapshot.skills.map((entry) => entry.name);
353
+ if (snapshotNames.length === 0)
354
+ return [];
355
+ const entryByName = new Map(entries.map((entry) => [entry.skill.name, entry.skill]));
356
+ return snapshotNames
357
+ .map((name) => entryByName.get(name))
358
+ .filter((skill) => Boolean(skill));
359
+ }
360
+ export async function compactEmbeddedPiSession(params) {
361
+ const sessionLane = resolveSessionLane(params.sessionKey?.trim() || params.sessionId);
362
+ const globalLane = resolveGlobalLane(params.lane);
363
+ const enqueueGlobal = params.enqueue ??
364
+ ((task, opts) => enqueueCommandInLane(globalLane, task, opts));
365
+ return enqueueCommandInLane(sessionLane, () => enqueueGlobal(async () => {
366
+ const resolvedWorkspace = resolveUserPath(params.workspaceDir);
367
+ const prevCwd = process.cwd();
368
+ const provider = (params.provider ?? DEFAULT_PROVIDER).trim() || DEFAULT_PROVIDER;
369
+ const modelId = (params.model ?? DEFAULT_MODEL).trim() || DEFAULT_MODEL;
370
+ await ensureNexusModelsJson(params.config);
371
+ const agentDir = params.agentDir ?? resolveNexusAgentDir();
372
+ const { model, error, authStorage, modelRegistry } = resolveModel(provider, modelId, agentDir);
373
+ if (!model) {
374
+ return {
375
+ ok: false,
376
+ compacted: false,
377
+ reason: error ?? `Unknown model: ${provider}/${modelId}`,
378
+ };
379
+ }
380
+ try {
381
+ const apiKeyInfo = await getApiKeyForModel({
382
+ model,
383
+ cfg: params.config,
384
+ });
385
+ authStorage.setRuntimeApiKey(model.provider, apiKeyInfo.apiKey);
386
+ }
387
+ catch (err) {
388
+ return {
389
+ ok: false,
390
+ compacted: false,
391
+ reason: describeUnknownError(err),
392
+ };
393
+ }
394
+ await fs.mkdir(resolvedWorkspace, { recursive: true });
395
+ await ensureSessionHeader({
396
+ sessionFile: params.sessionFile,
397
+ sessionId: params.sessionId,
398
+ cwd: resolvedWorkspace,
399
+ });
400
+ let restoreSkillEnv;
401
+ process.chdir(resolvedWorkspace);
402
+ try {
403
+ const shouldLoadSkillEntries = !params.skillsSnapshot || !params.skillsSnapshot.resolvedSkills;
404
+ const skillEntries = shouldLoadSkillEntries
405
+ ? loadWorkspaceSkillEntries(resolvedWorkspace)
406
+ : [];
407
+ const skillsSnapshot = params.skillsSnapshot ??
408
+ buildWorkspaceSkillSnapshot(resolvedWorkspace, {
409
+ config: params.config,
410
+ entries: skillEntries,
411
+ });
412
+ const sandboxSessionKey = params.sessionKey?.trim() || params.sessionId;
413
+ const sandbox = await resolveSandboxContext({
414
+ config: params.config,
415
+ sessionKey: sandboxSessionKey,
416
+ workspaceDir: resolvedWorkspace,
417
+ });
418
+ restoreSkillEnv = params.skillsSnapshot
419
+ ? applySkillEnvOverridesFromSnapshot({
420
+ snapshot: params.skillsSnapshot,
421
+ config: params.config,
422
+ })
423
+ : applySkillEnvOverrides({
424
+ skills: skillEntries ?? [],
425
+ config: params.config,
426
+ });
427
+ const bootstrapFiles = await loadWorkspaceBootstrapFiles(resolvedWorkspace);
428
+ const contextFiles = buildBootstrapContextFiles(bootstrapFiles);
429
+ const promptSkills = resolvePromptSkills(skillsSnapshot, skillEntries);
430
+ const tools = createNexusCodingTools({
431
+ bash: {
432
+ ...params.config?.agent?.bash,
433
+ elevated: params.bashElevated,
434
+ },
435
+ sandbox,
436
+ messageProvider: params.messageProvider,
437
+ sessionKey: params.sessionKey ?? params.sessionId,
438
+ agentDir,
439
+ config: params.config,
440
+ });
441
+ const machineName = await getMachineDisplayName();
442
+ const runtimeInfo = {
443
+ host: machineName,
444
+ os: `${os.type()} ${os.release()}`,
445
+ arch: os.arch(),
446
+ node: process.version,
447
+ model: `${provider}/${modelId}`,
448
+ };
449
+ const sandboxInfo = buildEmbeddedSandboxInfo(sandbox);
450
+ const reasoningTagHint = provider === "ollama";
451
+ const userTimezone = resolveUserTimezone(params.config?.agent?.userTimezone);
452
+ const userTime = formatUserTime(new Date(), userTimezone);
453
+ const systemPrompt = buildSystemPrompt({
454
+ appendPrompt: buildAgentSystemPromptAppend({
455
+ workspaceDir: resolvedWorkspace,
456
+ defaultThinkLevel: params.thinkLevel,
457
+ extraSystemPrompt: params.extraSystemPrompt,
458
+ ownerNumbers: params.ownerNumbers,
459
+ reasoningTagHint,
460
+ runtimeInfo,
461
+ sandboxInfo,
462
+ toolNames: tools.map((tool) => tool.name),
463
+ userTimezone,
464
+ userTime,
465
+ }),
466
+ contextFiles,
467
+ skills: promptSkills,
468
+ cwd: resolvedWorkspace,
469
+ tools,
470
+ });
471
+ const sessionManager = SessionManager.open(params.sessionFile);
472
+ const settingsManager = SettingsManager.create(resolvedWorkspace, agentDir);
473
+ const builtInToolNames = new Set(["read", "bash", "edit", "write"]);
474
+ const builtInTools = tools.filter((t) => builtInToolNames.has(t.name));
475
+ const customTools = toToolDefinitions(tools.filter((t) => !builtInToolNames.has(t.name)));
476
+ const { session } = await createAgentSession({
477
+ cwd: resolvedWorkspace,
478
+ agentDir,
479
+ authStorage,
480
+ modelRegistry,
481
+ model,
482
+ thinkingLevel: mapThinkingLevel(params.thinkLevel),
483
+ systemPrompt,
484
+ tools: builtInTools,
485
+ customTools,
486
+ sessionManager,
487
+ settingsManager,
488
+ skills: promptSkills,
489
+ contextFiles,
490
+ });
491
+ try {
492
+ const prior = await sanitizeSessionMessagesImages(session.messages, "session:history");
493
+ if (prior.length > 0) {
494
+ session.agent.replaceMessages(prior);
495
+ }
496
+ const result = await session.compact(params.customInstructions);
497
+ return {
498
+ ok: true,
499
+ compacted: true,
500
+ result: {
501
+ summary: result.summary,
502
+ firstKeptEntryId: result.firstKeptEntryId,
503
+ tokensBefore: result.tokensBefore,
504
+ details: result.details,
505
+ },
506
+ };
507
+ }
508
+ finally {
509
+ session.dispose();
510
+ }
511
+ }
512
+ catch (err) {
513
+ return {
514
+ ok: false,
515
+ compacted: false,
516
+ reason: describeUnknownError(err),
517
+ };
518
+ }
519
+ finally {
520
+ restoreSkillEnv?.();
521
+ process.chdir(prevCwd);
522
+ }
523
+ }));
524
+ }
525
+ export async function runEmbeddedPiAgent(params) {
526
+ const sessionLane = resolveSessionLane(params.sessionKey?.trim() || params.sessionId);
527
+ const globalLane = resolveGlobalLane(params.lane);
528
+ const enqueueGlobal = params.enqueue ??
529
+ ((task, opts) => enqueueCommandInLane(globalLane, task, opts));
530
+ return enqueueCommandInLane(sessionLane, () => enqueueGlobal(async () => {
531
+ const started = Date.now();
532
+ const resolvedWorkspace = resolveUserPath(params.workspaceDir);
533
+ const prevCwd = process.cwd();
534
+ const provider = (params.provider ?? DEFAULT_PROVIDER).trim() || DEFAULT_PROVIDER;
535
+ const modelId = (params.model ?? DEFAULT_MODEL).trim() || DEFAULT_MODEL;
536
+ await ensureNexusModelsJson(params.config);
537
+ const agentDir = params.agentDir ?? resolveNexusAgentDir();
538
+ const { model, error, authStorage, modelRegistry } = resolveModel(provider, modelId, agentDir);
539
+ if (!model) {
540
+ throw new Error(error ?? `Unknown model: ${provider}/${modelId}`);
541
+ }
542
+ const authStore = ensureAuthProfileStore(agentDir);
543
+ const explicitProfileId = params.authProfileId?.trim();
544
+ const profileOrder = resolveAuthProfileOrder({
545
+ cfg: params.config,
546
+ store: authStore,
547
+ provider,
548
+ preferredProfile: explicitProfileId,
549
+ });
550
+ if (explicitProfileId && !profileOrder.includes(explicitProfileId)) {
551
+ throw new Error(`Auth profile "${explicitProfileId}" is not configured for ${provider}.`);
552
+ }
553
+ const profileCandidates = profileOrder.length > 0 ? profileOrder : [undefined];
554
+ let profileIndex = 0;
555
+ const initialThinkLevel = params.thinkLevel ?? "off";
556
+ let thinkLevel = initialThinkLevel;
557
+ const attemptedThinking = new Set();
558
+ let apiKeyInfo = null;
559
+ let lastProfileId;
560
+ const resolveApiKeyForCandidate = async (candidate) => {
561
+ return getApiKeyForModel({
562
+ model,
563
+ cfg: params.config,
564
+ profileId: candidate,
565
+ store: authStore,
566
+ });
567
+ };
568
+ const applyApiKeyInfo = async (candidate) => {
569
+ apiKeyInfo = await resolveApiKeyForCandidate(candidate);
570
+ authStorage.setRuntimeApiKey(model.provider, apiKeyInfo.apiKey);
571
+ lastProfileId = apiKeyInfo.profileId;
572
+ };
573
+ const advanceAuthProfile = async () => {
574
+ let nextIndex = profileIndex + 1;
575
+ while (nextIndex < profileCandidates.length) {
576
+ const candidate = profileCandidates[nextIndex];
577
+ try {
578
+ await applyApiKeyInfo(candidate);
579
+ profileIndex = nextIndex;
580
+ thinkLevel = initialThinkLevel;
581
+ attemptedThinking.clear();
582
+ return true;
583
+ }
584
+ catch (err) {
585
+ if (candidate && candidate === explicitProfileId)
586
+ throw err;
587
+ nextIndex += 1;
588
+ }
589
+ }
590
+ return false;
591
+ };
592
+ try {
593
+ await applyApiKeyInfo(profileCandidates[profileIndex]);
594
+ }
595
+ catch (err) {
596
+ if (profileCandidates[profileIndex] === explicitProfileId)
597
+ throw err;
598
+ const advanced = await advanceAuthProfile();
599
+ if (!advanced)
600
+ throw err;
601
+ }
602
+ while (true) {
603
+ const thinkingLevel = mapThinkingLevel(thinkLevel);
604
+ attemptedThinking.add(thinkLevel);
605
+ log.debug(`embedded run start: runId=${params.runId} sessionId=${params.sessionId} provider=${provider} model=${modelId} thinking=${thinkLevel} messageProvider=${params.messageProvider ?? "unknown"}`);
606
+ await fs.mkdir(resolvedWorkspace, { recursive: true });
607
+ await ensureSessionHeader({
608
+ sessionFile: params.sessionFile,
609
+ sessionId: params.sessionId,
610
+ cwd: resolvedWorkspace,
611
+ });
612
+ let restoreSkillEnv;
613
+ process.chdir(resolvedWorkspace);
614
+ try {
615
+ const shouldLoadSkillEntries = !params.skillsSnapshot || !params.skillsSnapshot.resolvedSkills;
616
+ const skillEntries = shouldLoadSkillEntries
617
+ ? loadWorkspaceSkillEntries(resolvedWorkspace)
618
+ : [];
619
+ const skillsSnapshot = params.skillsSnapshot ??
620
+ buildWorkspaceSkillSnapshot(resolvedWorkspace, {
621
+ config: params.config,
622
+ entries: skillEntries,
623
+ });
624
+ const sandboxSessionKey = params.sessionKey?.trim() || params.sessionId;
625
+ const sandbox = await resolveSandboxContext({
626
+ config: params.config,
627
+ sessionKey: sandboxSessionKey,
628
+ workspaceDir: resolvedWorkspace,
629
+ });
630
+ restoreSkillEnv = params.skillsSnapshot
631
+ ? applySkillEnvOverridesFromSnapshot({
632
+ snapshot: params.skillsSnapshot,
633
+ config: params.config,
634
+ })
635
+ : applySkillEnvOverrides({
636
+ skills: skillEntries ?? [],
637
+ config: params.config,
638
+ });
639
+ const bootstrapFiles = await loadWorkspaceBootstrapFiles(resolvedWorkspace);
640
+ const contextFiles = buildBootstrapContextFiles(bootstrapFiles);
641
+ const promptSkills = resolvePromptSkills(skillsSnapshot, skillEntries);
642
+ // Tool schemas must be provider-compatible (OpenAI requires top-level `type: "object"`).
643
+ // `createNexusCodingTools()` normalizes schemas so the session can pass them through unchanged.
644
+ const tools = createNexusCodingTools({
645
+ bash: {
646
+ ...params.config?.agent?.bash,
647
+ elevated: params.bashElevated,
648
+ },
649
+ sandbox,
650
+ messageProvider: params.messageProvider,
651
+ sessionKey: params.sessionKey ?? params.sessionId,
652
+ agentDir,
653
+ config: params.config,
654
+ });
655
+ const machineName = await getMachineDisplayName();
656
+ const runtimeInfo = {
657
+ host: machineName,
658
+ os: `${os.type()} ${os.release()}`,
659
+ arch: os.arch(),
660
+ node: process.version,
661
+ model: `${provider}/${modelId}`,
662
+ };
663
+ const sandboxInfo = buildEmbeddedSandboxInfo(sandbox);
664
+ const reasoningTagHint = provider === "ollama";
665
+ const userTimezone = resolveUserTimezone(params.config?.agent?.userTimezone);
666
+ const userTime = formatUserTime(new Date(), userTimezone);
667
+ const systemPrompt = buildSystemPrompt({
668
+ appendPrompt: buildAgentSystemPromptAppend({
669
+ workspaceDir: resolvedWorkspace,
670
+ defaultThinkLevel: thinkLevel,
671
+ extraSystemPrompt: params.extraSystemPrompt,
672
+ ownerNumbers: params.ownerNumbers,
673
+ reasoningTagHint,
674
+ runtimeInfo,
675
+ sandboxInfo,
676
+ toolNames: tools.map((tool) => tool.name),
677
+ userTimezone,
678
+ userTime,
679
+ }),
680
+ contextFiles,
681
+ skills: promptSkills,
682
+ cwd: resolvedWorkspace,
683
+ tools,
684
+ });
685
+ const sessionManager = SessionManager.open(params.sessionFile);
686
+ const settingsManager = SettingsManager.create(resolvedWorkspace, agentDir);
687
+ // Split tools into built-in (recognized by pi-coding-agent SDK) and custom (nexus-specific)
688
+ const builtInToolNames = new Set(["read", "bash", "edit", "write"]);
689
+ const builtInTools = tools.filter((t) => builtInToolNames.has(t.name));
690
+ const customTools = toToolDefinitions(tools.filter((t) => !builtInToolNames.has(t.name)));
691
+ const { session } = await createAgentSession({
692
+ cwd: resolvedWorkspace,
693
+ agentDir,
694
+ authStorage,
695
+ modelRegistry,
696
+ model,
697
+ thinkingLevel,
698
+ systemPrompt,
699
+ // Built-in tools recognized by pi-coding-agent SDK
700
+ tools: builtInTools,
701
+ // Custom nexus tools (browser, canvas, nodes, cron, etc.)
702
+ customTools,
703
+ sessionManager,
704
+ settingsManager,
705
+ skills: promptSkills,
706
+ contextFiles,
707
+ });
708
+ const prior = await sanitizeSessionMessagesImages(session.messages, "session:history");
709
+ if (prior.length > 0) {
710
+ session.agent.replaceMessages(prior);
711
+ }
712
+ let aborted = Boolean(params.abortSignal?.aborted);
713
+ let timedOut = false;
714
+ const abortRun = (isTimeout = false) => {
715
+ aborted = true;
716
+ if (isTimeout)
717
+ timedOut = true;
718
+ void session.abort();
719
+ };
720
+ const subscription = subscribeEmbeddedPiSession({
721
+ session,
722
+ runId: params.runId,
723
+ verboseLevel: params.verboseLevel,
724
+ shouldEmitToolResult: params.shouldEmitToolResult,
725
+ onToolResult: params.onToolResult,
726
+ onBlockReply: params.onBlockReply,
727
+ blockReplyBreak: params.blockReplyBreak,
728
+ blockReplyChunking: params.blockReplyChunking,
729
+ onPartialReply: params.onPartialReply,
730
+ onAgentEvent: params.onAgentEvent,
731
+ enforceFinalTag: params.enforceFinalTag,
732
+ });
733
+ const { assistantTexts, toolMetas, unsubscribe, waitForCompactionRetry, } = subscription;
734
+ const queueHandle = {
735
+ queueMessage: async (text) => {
736
+ await session.steer(text);
737
+ },
738
+ isStreaming: () => session.isStreaming,
739
+ isCompacting: () => subscription.isCompacting(),
740
+ abort: abortRun,
741
+ };
742
+ ACTIVE_EMBEDDED_RUNS.set(params.sessionId, queueHandle);
743
+ let abortWarnTimer;
744
+ const abortTimer = setTimeout(() => {
745
+ log.warn(`embedded run timeout: runId=${params.runId} sessionId=${params.sessionId} timeoutMs=${params.timeoutMs}`);
746
+ abortRun(true);
747
+ if (!abortWarnTimer) {
748
+ abortWarnTimer = setTimeout(() => {
749
+ if (!session.isStreaming)
750
+ return;
751
+ log.warn(`embedded run abort still streaming: runId=${params.runId} sessionId=${params.sessionId}`);
752
+ }, 10_000);
753
+ }
754
+ }, Math.max(1, params.timeoutMs));
755
+ let messagesSnapshot = [];
756
+ let sessionIdUsed = session.sessionId;
757
+ const onAbort = () => {
758
+ abortRun();
759
+ };
760
+ if (params.abortSignal) {
761
+ if (params.abortSignal.aborted) {
762
+ onAbort();
763
+ }
764
+ else {
765
+ params.abortSignal.addEventListener("abort", onAbort, {
766
+ once: true,
767
+ });
768
+ }
769
+ }
770
+ let promptError = null;
771
+ try {
772
+ const promptStartedAt = Date.now();
773
+ log.debug(`embedded run prompt start: runId=${params.runId} sessionId=${params.sessionId}`);
774
+ try {
775
+ await session.prompt(params.prompt);
776
+ }
777
+ catch (err) {
778
+ promptError = err;
779
+ }
780
+ finally {
781
+ log.debug(`embedded run prompt end: runId=${params.runId} sessionId=${params.sessionId} durationMs=${Date.now() - promptStartedAt}`);
782
+ }
783
+ await waitForCompactionRetry();
784
+ messagesSnapshot = session.messages.slice();
785
+ sessionIdUsed = session.sessionId;
786
+ }
787
+ finally {
788
+ clearTimeout(abortTimer);
789
+ if (abortWarnTimer) {
790
+ clearTimeout(abortWarnTimer);
791
+ abortWarnTimer = undefined;
792
+ }
793
+ unsubscribe();
794
+ if (ACTIVE_EMBEDDED_RUNS.get(params.sessionId) === queueHandle) {
795
+ ACTIVE_EMBEDDED_RUNS.delete(params.sessionId);
796
+ notifyEmbeddedRunEnded(params.sessionId);
797
+ }
798
+ session.dispose();
799
+ params.abortSignal?.removeEventListener?.("abort", onAbort);
800
+ }
801
+ if (promptError && !aborted) {
802
+ const errorText = describeUnknownError(promptError);
803
+ if ((isAuthErrorMessage(errorText) ||
804
+ isRateLimitErrorMessage(errorText)) &&
805
+ (await advanceAuthProfile())) {
806
+ continue;
807
+ }
808
+ const fallbackThinking = pickFallbackThinkingLevel({
809
+ message: errorText,
810
+ attempted: attemptedThinking,
811
+ });
812
+ if (fallbackThinking) {
813
+ log.warn(`unsupported thinking level for ${provider}/${modelId}; retrying with ${fallbackThinking}`);
814
+ thinkLevel = fallbackThinking;
815
+ continue;
816
+ }
817
+ throw promptError;
818
+ }
819
+ const lastAssistant = messagesSnapshot
820
+ .slice()
821
+ .reverse()
822
+ .find((m) => m?.role === "assistant");
823
+ const fallbackThinking = pickFallbackThinkingLevel({
824
+ message: lastAssistant?.errorMessage,
825
+ attempted: attemptedThinking,
826
+ });
827
+ if (fallbackThinking && !aborted) {
828
+ log.warn(`unsupported thinking level for ${provider}/${modelId}; retrying with ${fallbackThinking}`);
829
+ thinkLevel = fallbackThinking;
830
+ continue;
831
+ }
832
+ const fallbackConfigured = (params.config?.agent?.model?.fallbacks?.length ?? 0) > 0;
833
+ const authFailure = isAuthAssistantError(lastAssistant);
834
+ const rateLimitFailure = isRateLimitAssistantError(lastAssistant);
835
+ // Treat timeout as potential rate limit (Antigravity hangs on rate limit)
836
+ const shouldRotate = (!aborted && (authFailure || rateLimitFailure)) || timedOut;
837
+ if (shouldRotate) {
838
+ // Mark current profile for cooldown before rotating
839
+ if (lastProfileId) {
840
+ markAuthProfileCooldown({
841
+ store: authStore,
842
+ profileId: lastProfileId,
843
+ });
844
+ if (timedOut) {
845
+ log.warn(`Profile ${lastProfileId} timed out (possible rate limit). Trying next account...`);
846
+ }
847
+ }
848
+ const rotated = await advanceAuthProfile();
849
+ if (rotated) {
850
+ continue;
851
+ }
852
+ if (fallbackConfigured) {
853
+ const message = lastAssistant?.errorMessage?.trim() ||
854
+ (lastAssistant
855
+ ? formatAssistantErrorText(lastAssistant)
856
+ : "") ||
857
+ (timedOut
858
+ ? "LLM request timed out."
859
+ : rateLimitFailure
860
+ ? "LLM request rate limited."
861
+ : "LLM request unauthorized.");
862
+ throw new Error(message);
863
+ }
864
+ }
865
+ const usage = normalizeUsage(lastAssistant?.usage);
866
+ const agentMeta = {
867
+ sessionId: sessionIdUsed,
868
+ provider: lastAssistant?.provider ?? provider,
869
+ model: lastAssistant?.model ?? model.id,
870
+ usage,
871
+ };
872
+ const replyItems = [];
873
+ const errorText = lastAssistant
874
+ ? formatAssistantErrorText(lastAssistant)
875
+ : undefined;
876
+ if (errorText)
877
+ replyItems.push({ text: errorText });
878
+ const inlineToolResults = params.verboseLevel === "on" &&
879
+ !params.onPartialReply &&
880
+ !params.onToolResult &&
881
+ toolMetas.length > 0;
882
+ if (inlineToolResults) {
883
+ for (const { toolName, meta } of toolMetas) {
884
+ const agg = formatToolAggregate(toolName, meta ? [meta] : []);
885
+ const { text: cleanedText, mediaUrls } = splitMediaFromOutput(agg);
886
+ if (cleanedText)
887
+ replyItems.push({ text: cleanedText, media: mediaUrls });
888
+ }
889
+ }
890
+ for (const text of assistantTexts.length
891
+ ? assistantTexts
892
+ : lastAssistant
893
+ ? [extractAssistantText(lastAssistant)]
894
+ : []) {
895
+ const { text: cleanedText, mediaUrls } = splitMediaFromOutput(text);
896
+ if (!cleanedText && (!mediaUrls || mediaUrls.length === 0))
897
+ continue;
898
+ replyItems.push({ text: cleanedText, media: mediaUrls });
899
+ }
900
+ const payloads = replyItems
901
+ .map((item) => ({
902
+ text: item.text?.trim() ? item.text.trim() : undefined,
903
+ mediaUrls: item.media?.length ? item.media : undefined,
904
+ mediaUrl: item.media?.[0],
905
+ }))
906
+ .filter((p) => p.text || p.mediaUrl || (p.mediaUrls && p.mediaUrls.length > 0));
907
+ log.debug(`embedded run done: runId=${params.runId} sessionId=${params.sessionId} durationMs=${Date.now() - started} aborted=${aborted}`);
908
+ if (lastProfileId) {
909
+ markAuthProfileGood({
910
+ store: authStore,
911
+ provider,
912
+ profileId: lastProfileId,
913
+ });
914
+ // Track usage for round-robin rotation
915
+ markAuthProfileUsed({ store: authStore, profileId: lastProfileId });
916
+ }
917
+ return {
918
+ payloads: payloads.length ? payloads : undefined,
919
+ meta: {
920
+ durationMs: Date.now() - started,
921
+ agentMeta,
922
+ aborted,
923
+ },
924
+ };
925
+ }
926
+ finally {
927
+ restoreSkillEnv?.();
928
+ process.chdir(prevCwd);
929
+ }
930
+ }
931
+ }));
932
+ }