@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,209 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Automate `gog auth add` for multiple Google accounts using CDP Chrome.
4
+
5
+ How it works:
6
+ - Runs: gog auth add <email> --services ... --force-consent
7
+ - Captures the OAuth URL printed by gog
8
+ - Opens that URL in CDP-attached Chrome (Playwright connect_over_cdp)
9
+ - Clicks through account chooser + consent buttons
10
+ - Waits for gog to receive the localhost callback and store tokens
11
+
12
+ Usage:
13
+ python auth_add_accounts.py --emails a@b.com c@d.com
14
+ """
15
+
16
+ import argparse
17
+ import re
18
+ import subprocess
19
+ import time
20
+ from playwright.sync_api import sync_playwright
21
+
22
+
23
+ URL_RE = re.compile(r"https://accounts\\.google\\.com/o/oauth2/auth\\?[^\\s]+")
24
+ ANSI_ESCAPE_RE = re.compile(r"\x1b\[[0-9;]*[A-Za-z]")
25
+ URL_PREFIX = "https://accounts.google.com/o/oauth2/auth?"
26
+
27
+
28
+ def parse_args():
29
+ ap = argparse.ArgumentParser()
30
+ ap.add_argument("--emails", nargs="+", required=True, help="Account emails to authorize")
31
+ ap.add_argument(
32
+ "--services",
33
+ default="gmail,calendar,drive,contacts,sheets,people,tasks",
34
+ help="gog services (comma-separated)",
35
+ )
36
+ ap.add_argument("--cdp", default="http://127.0.0.1:9222", help="CDP endpoint (default: 127.0.0.1:9222)")
37
+ ap.add_argument("--timeout", type=int, default=120, help="Timeout per account in seconds")
38
+ return ap.parse_args()
39
+
40
+
41
+ def run_gog_auth_add(email: str, services: str) -> subprocess.Popen:
42
+ cmd = ["gog", "auth", "add", email, "--services", services, "--force-consent"]
43
+ # gog waits for localhost callback; keep it running
44
+ return subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True)
45
+
46
+
47
+ def read_oauth_url(proc: subprocess.Popen, timeout_s: int = 30) -> str:
48
+ start = time.time()
49
+ buf = []
50
+ while time.time() - start < timeout_s:
51
+ # If process already exited, stop waiting.
52
+ if proc.poll() is not None:
53
+ break
54
+
55
+ line = proc.stdout.readline() if proc.stdout else ""
56
+ if line:
57
+ buf.append(line)
58
+ clean = ANSI_ESCAPE_RE.sub("", line)
59
+
60
+ # Fast path: look for URL prefix (more robust than regex on wrapped/colored output)
61
+ idx = clean.find(URL_PREFIX)
62
+ if idx != -1:
63
+ candidate = clean[idx:].strip()
64
+ # If wrapped, remove internal whitespace/newlines by joining subsequent lines later.
65
+ # For single-line URLs, first token is enough.
66
+ first = candidate.split()[0]
67
+ if first.startswith(URL_PREFIX):
68
+ return first
69
+
70
+ m = URL_RE.search(clean)
71
+ if m:
72
+ return m.group(0)
73
+ else:
74
+ time.sleep(0.05)
75
+
76
+ # Fallback: try to reconstruct from the full buffer (handles wrapped URLs)
77
+ joined = ANSI_ESCAPE_RE.sub("", "".join(buf))
78
+ idx = joined.find(URL_PREFIX)
79
+ if idx != -1:
80
+ tail = joined[idx:]
81
+ # Remove whitespace entirely to undo hard wraps
82
+ tail_compact = "".join(tail.split())
83
+ # Stop at first obvious terminator
84
+ term_idx = tail_compact.find("authorizationcanceled")
85
+ if term_idx != -1:
86
+ tail_compact = tail_compact[:term_idx]
87
+ if tail_compact.startswith(URL_PREFIX):
88
+ return tail_compact
89
+
90
+ raise RuntimeError("Timed out waiting for OAuth URL. Output so far:\n" + "".join(buf[-50:]))
91
+
92
+
93
+ def click_if_exists(page, text_regex: str) -> bool:
94
+ loc = page.locator(f"text=/{text_regex}/i").first
95
+ try:
96
+ if loc.count() > 0:
97
+ loc.click(timeout=1500)
98
+ return True
99
+ except Exception:
100
+ return False
101
+ return False
102
+
103
+
104
+ def click_email(page, email: str) -> bool:
105
+ loc = page.locator(f"text={email}").first
106
+ try:
107
+ loc.wait_for(state="visible", timeout=8000)
108
+ loc.click()
109
+ return True
110
+ except Exception:
111
+ return False
112
+
113
+
114
+ def drive_consent_flow(page, email: str, max_steps: int = 30):
115
+ # Step 1: choose account if account chooser is shown
116
+ click_email(page, email)
117
+ page.wait_for_timeout(1000)
118
+
119
+ # Step 2: click through consent screens until redirect to localhost
120
+ for _ in range(max_steps):
121
+ url = page.url
122
+ if url.startswith("http://127.0.0.1:") or url.startswith("http://localhost:"):
123
+ return
124
+
125
+ # Common consent buttons
126
+ if click_if_exists(page, r"^continue$"):
127
+ page.wait_for_timeout(1200)
128
+ continue
129
+ if click_if_exists(page, r"^next$"):
130
+ page.wait_for_timeout(1200)
131
+ continue
132
+ if click_if_exists(page, r"^allow$"):
133
+ page.wait_for_timeout(1500)
134
+ continue
135
+ if click_if_exists(page, r"^accept$"):
136
+ page.wait_for_timeout(1500)
137
+ continue
138
+ if click_if_exists(page, r"^agree$"):
139
+ page.wait_for_timeout(1500)
140
+ continue
141
+
142
+ # looser matches
143
+ if click_if_exists(page, r"continue"):
144
+ page.wait_for_timeout(1200)
145
+ continue
146
+ if click_if_exists(page, r"allow"):
147
+ page.wait_for_timeout(1500)
148
+ continue
149
+
150
+ # wait for navigation changes
151
+ page.wait_for_timeout(1200)
152
+
153
+ raise RuntimeError(f"Consent flow did not complete for {email}. Current URL: {page.url}")
154
+
155
+
156
+ def main():
157
+ args = parse_args()
158
+
159
+ with sync_playwright() as p:
160
+ browser = p.chromium.connect_over_cdp(args.cdp)
161
+ ctx = browser.contexts[0]
162
+ ctx.set_default_timeout(30000)
163
+ page = ctx.new_page()
164
+
165
+ failures = []
166
+
167
+ for email in args.emails:
168
+ print(f"\n=== Authorizing {email} ===")
169
+ proc = run_gog_auth_add(email, args.services)
170
+ try:
171
+ oauth_url = read_oauth_url(proc)
172
+ print("OAuth URL captured")
173
+ page.goto(oauth_url, wait_until="domcontentloaded")
174
+ page.wait_for_timeout(1500)
175
+ drive_consent_flow(page, email)
176
+
177
+ # Wait for gog to finish
178
+ try:
179
+ exit_code = proc.wait(timeout=args.timeout)
180
+ except subprocess.TimeoutExpired:
181
+ proc.kill()
182
+ raise RuntimeError("gog auth add timed out waiting for callback")
183
+
184
+ if exit_code != 0:
185
+ out = proc.stdout.read() if proc.stdout else ""
186
+ raise RuntimeError(f"gog auth add failed with exit code {exit_code}:\n{out}")
187
+
188
+ print(f"Token stored for {email}")
189
+ except Exception as e:
190
+ try:
191
+ proc.kill()
192
+ except Exception:
193
+ pass
194
+ failures.append((email, str(e)))
195
+ print(f"Failed for {email}: {e}")
196
+
197
+ browser.close()
198
+
199
+ if failures:
200
+ print("\n=== Failures ===")
201
+ for email, err in failures:
202
+ print(f"- {email}: {err}")
203
+ raise SystemExit(1)
204
+
205
+ print("\nAll accounts authorized. Verify with: gog auth list")
206
+
207
+
208
+ if __name__ == "__main__":
209
+ main()
@@ -0,0 +1,206 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Automate `gog auth add --manual` for multiple Google accounts using CDP Chrome.
4
+
5
+ Why manual mode?
6
+ - `gog auth add` starts a local callback server and may time out if the browser
7
+ isn't opened quickly (or network changes interrupt it).
8
+ - `--manual` prints an OAuth URL and asks for the final redirect URL.
9
+ We can 100% automate that via Playwright CDP by reading the redirect from the browser.
10
+
11
+ Usage:
12
+ python auth_add_accounts_manual.py --emails a@b.com c@d.com
13
+ """
14
+
15
+ import argparse
16
+ import re
17
+ import subprocess
18
+ import time
19
+ from playwright.sync_api import sync_playwright
20
+
21
+
22
+ URL_PREFIX = "https://accounts.google.com/o/oauth2/auth?"
23
+ REDIRECT_PREFIX = "http://localhost:1"
24
+
25
+ # Strip common ANSI sequences and control chars that break URL parsing
26
+ ANSI_ESCAPE_RE = re.compile(r"\x1b\\[[0-9;]*[A-Za-z]|\x1b\\][^\\x1b]*\\x1b\\\\")
27
+
28
+
29
+ def parse_args():
30
+ ap = argparse.ArgumentParser()
31
+ ap.add_argument("--emails", nargs="+", required=True, help="Account emails to authorize")
32
+ ap.add_argument(
33
+ "--services",
34
+ default="gmail,calendar,drive,contacts,sheets,people,tasks",
35
+ help="gog services (comma-separated)",
36
+ )
37
+ ap.add_argument("--cdp", default="http://127.0.0.1:9222", help="CDP endpoint (default: 127.0.0.1:9222)")
38
+ ap.add_argument("--timeout", type=int, default=180, help="Timeout per account in seconds")
39
+ return ap.parse_args()
40
+
41
+
42
+ def _printable(s: str) -> str:
43
+ # Remove ANSI + non-printable (keep URL chars)
44
+ s = ANSI_ESCAPE_RE.sub("", s)
45
+ return "".join(ch for ch in s if ch.isprintable() or ch in "\n\t ")
46
+
47
+
48
+ def run_gog_manual(email: str, services: str) -> subprocess.Popen:
49
+ cmd = [
50
+ "gog",
51
+ "auth",
52
+ "add",
53
+ email,
54
+ "--services",
55
+ services,
56
+ "--force-consent",
57
+ "--manual",
58
+ ]
59
+ return subprocess.Popen(
60
+ cmd,
61
+ stdout=subprocess.PIPE,
62
+ stderr=subprocess.STDOUT,
63
+ stdin=subprocess.PIPE,
64
+ text=True,
65
+ bufsize=1,
66
+ )
67
+
68
+
69
+ def read_auth_url(proc: subprocess.Popen, timeout_s: int = 30) -> str:
70
+ start = time.time()
71
+ buf = []
72
+ while time.time() - start < timeout_s:
73
+ if proc.poll() is not None:
74
+ break
75
+ line = proc.stdout.readline() if proc.stdout else ""
76
+ if not line:
77
+ time.sleep(0.05)
78
+ continue
79
+ clean = _printable(line)
80
+ buf.append(clean)
81
+ idx = clean.find(URL_PREFIX)
82
+ if idx != -1:
83
+ candidate = clean[idx:].strip()
84
+ # remove whitespace (handles line wraps)
85
+ return "".join(candidate.split())
86
+
87
+ joined = "".join(buf)
88
+ idx = joined.find(URL_PREFIX)
89
+ if idx != -1:
90
+ tail = joined[idx:]
91
+ return "".join(tail.split())
92
+
93
+ raise RuntimeError("Timed out waiting for OAuth URL. Output so far:\n" + "".join(buf[-80:]))
94
+
95
+
96
+ def click_if_exists(page, text_regex: str) -> bool:
97
+ loc = page.locator(f"text=/{text_regex}/i").first
98
+ try:
99
+ if loc.count() > 0:
100
+ loc.click(timeout=1500)
101
+ return True
102
+ except Exception:
103
+ return False
104
+ return False
105
+
106
+
107
+ def click_email(page, email: str):
108
+ loc = page.locator(f"text={email}").first
109
+ try:
110
+ loc.wait_for(state="visible", timeout=8000)
111
+ loc.click()
112
+ return True
113
+ except Exception:
114
+ return False
115
+
116
+
117
+ def drive_consent(page, email: str, max_steps: int = 40):
118
+ # Choose account if shown
119
+ click_email(page, email)
120
+ page.wait_for_timeout(800)
121
+
122
+ for _ in range(max_steps):
123
+ url = page.url
124
+ if url.startswith(REDIRECT_PREFIX):
125
+ return url
126
+
127
+ # Common buttons
128
+ for pat in (r"^continue$", r"^next$", r"^allow$", r"^accept$", r"^agree$"):
129
+ if click_if_exists(page, pat):
130
+ page.wait_for_timeout(1200)
131
+ break
132
+ else:
133
+ # looser matches
134
+ if click_if_exists(page, r"continue"):
135
+ page.wait_for_timeout(1200)
136
+ elif click_if_exists(page, r"allow"):
137
+ page.wait_for_timeout(1500)
138
+ else:
139
+ page.wait_for_timeout(1000)
140
+
141
+ raise RuntimeError(f"Consent flow did not reach redirect for {email}. Current URL: {page.url}")
142
+
143
+
144
+ def main():
145
+ args = parse_args()
146
+
147
+ with sync_playwright() as p:
148
+ failures = []
149
+
150
+ for email in args.emails:
151
+ print(f"\n=== Authorizing (manual) {email} ===")
152
+ proc = run_gog_manual(email, args.services)
153
+ try:
154
+ oauth_url = read_auth_url(proc)
155
+ print("OAuth URL captured")
156
+
157
+ # Reconnect to CDP each iteration to avoid stale/closed pages
158
+ browser = p.chromium.connect_over_cdp(args.cdp)
159
+ ctx = browser.contexts[0]
160
+ ctx.set_default_timeout(30000)
161
+ page = ctx.new_page()
162
+
163
+ page.goto(oauth_url, wait_until="domcontentloaded")
164
+ page.wait_for_timeout(1200)
165
+
166
+ redirect_url = drive_consent(page, email)
167
+ print("Redirect captured")
168
+
169
+ browser.close()
170
+
171
+ # Send redirect URL back to gog
172
+ if not proc.stdin:
173
+ raise RuntimeError("gog stdin not available")
174
+ proc.stdin.write(redirect_url + "\n")
175
+ proc.stdin.flush()
176
+
177
+ try:
178
+ exit_code = proc.wait(timeout=args.timeout)
179
+ except subprocess.TimeoutExpired:
180
+ proc.kill()
181
+ raise RuntimeError("gog auth add --manual timed out waiting for token store")
182
+
183
+ out_rest = proc.stdout.read() if proc.stdout else ""
184
+ if exit_code != 0:
185
+ raise RuntimeError(f"gog auth add --manual failed (exit {exit_code}):\n{_printable(out_rest)}")
186
+
187
+ print(f"Token stored for {email}")
188
+ except Exception as e:
189
+ try:
190
+ proc.kill()
191
+ except Exception:
192
+ pass
193
+ failures.append((email, str(e)))
194
+ print(f"Failed for {email}: {e}")
195
+
196
+ if failures:
197
+ print("\n=== Failures ===")
198
+ for email, err in failures:
199
+ print(f"- {email}: {err}")
200
+ raise SystemExit(1)
201
+
202
+ print("\nAll accounts authorized. Verify with: gog auth list")
203
+
204
+
205
+ if __name__ == "__main__":
206
+ main()
@@ -0,0 +1,165 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Create a Google OAuth "Desktop app" client in Cloud Console via CDP Chrome and download credentials.json.
4
+
5
+ This automates:
6
+ - Enable Gmail API + Calendar API (best-effort)
7
+ - APIs & Services -> Credentials -> Create credentials -> OAuth client ID -> Desktop app
8
+ - Download JSON to ~/.config/gog/credentials.json (default)
9
+
10
+ Usage:
11
+ python create_oauth_client.py --project <gcp-project-id> --name gog-cli
12
+ """
13
+
14
+ import argparse
15
+ import os
16
+ import re
17
+ from pathlib import Path
18
+ from playwright.sync_api import sync_playwright
19
+
20
+
21
+ def parse_args():
22
+ ap = argparse.ArgumentParser()
23
+ ap.add_argument("--project", required=True, help="GCP project id (e.g. gen-lang-client-xxxx)")
24
+ ap.add_argument("--name", default="gog-cli", help="OAuth client name (default: gog-cli)")
25
+ ap.add_argument("--cdp", default="http://127.0.0.1:9222", help="CDP endpoint (default: 127.0.0.1:9222)")
26
+ ap.add_argument(
27
+ "--out",
28
+ default=os.path.expanduser("~/.config/gog/credentials.json"),
29
+ help="Where to save the downloaded credentials.json",
30
+ )
31
+ return ap.parse_args()
32
+
33
+
34
+ def snap(page, path: str):
35
+ page.screenshot(path=path, full_page=True)
36
+ print(f"[screenshot] {path}")
37
+
38
+
39
+ def click_text(page, text_regex: str, timeout=15000):
40
+ loc = page.locator(f"text=/{text_regex}/i").first
41
+ loc.wait_for(state="visible", timeout=timeout)
42
+ loc.click()
43
+
44
+
45
+ def maybe_enable_api(page, url: str, label: str):
46
+ page.goto(url, wait_until="domcontentloaded")
47
+ page.wait_for_timeout(2000)
48
+ snap(page, f"/private/tmp/gog-cdp-api-{label}.png")
49
+
50
+ enable = page.get_by_role("button", name=re.compile(r"^enable$", re.I))
51
+ if enable.count() == 0:
52
+ enable = page.get_by_role("button", name=re.compile(r"enable", re.I))
53
+
54
+ if enable.count() > 0:
55
+ try:
56
+ enable.first.click(timeout=3000)
57
+ page.wait_for_timeout(2000)
58
+ snap(page, f"/private/tmp/gog-cdp-api-{label}-enabled.png")
59
+ print(f"[api] enabled {label}")
60
+ except Exception:
61
+ print(f"[api] enable button found but click failed for {label}")
62
+ else:
63
+ print(f"[api] no enable button detected for {label} (maybe already enabled)")
64
+
65
+
66
+ def create_oauth_client(page, project: str, name: str, out_path: Path):
67
+ creds_url = f"https://console.cloud.google.com/apis/credentials?project={project}"
68
+ page.goto(creds_url, wait_until="domcontentloaded")
69
+ page.wait_for_timeout(2000)
70
+ snap(page, "/private/tmp/gog-cdp-creds-start.png")
71
+
72
+ # Open Create credentials menu
73
+ try:
74
+ page.get_by_role("button", name=re.compile(r"create credentials", re.I)).first.click(timeout=10000)
75
+ except Exception:
76
+ click_text(page, r"\+\s*create credentials|create credentials")
77
+
78
+ page.wait_for_timeout(800)
79
+ snap(page, "/private/tmp/gog-cdp-creds-menu.png")
80
+
81
+ # Pick OAuth client ID
82
+ try:
83
+ page.get_by_role("menuitem", name=re.compile(r"oauth\s*client\s*id", re.I)).first.click(timeout=8000)
84
+ except Exception:
85
+ click_text(page, r"oauth\s*client\s*id")
86
+
87
+ page.wait_for_timeout(2500)
88
+ snap(page, "/private/tmp/gog-cdp-oauth-client-page.png")
89
+
90
+ # Select Desktop app in Application type combobox
91
+ try:
92
+ combo = page.get_by_role("combobox", name=re.compile(r"application type", re.I)).first
93
+ combo.click(timeout=8000)
94
+ page.wait_for_timeout(300)
95
+ click_text(page, r"desktop")
96
+ except Exception:
97
+ click_text(page, r"application type")
98
+ page.wait_for_timeout(300)
99
+ click_text(page, r"desktop")
100
+
101
+ # Fill Name
102
+ try:
103
+ page.get_by_role("textbox", name=re.compile(r"name", re.I)).first.fill(name)
104
+ except Exception:
105
+ # fallback: first textbox
106
+ tbs = page.get_by_role("textbox")
107
+ if tbs.count() > 0:
108
+ tbs.first.fill(name)
109
+
110
+ snap(page, "/private/tmp/gog-cdp-oauth-client-filled.png")
111
+
112
+ # Create
113
+ try:
114
+ page.get_by_role("button", name=re.compile(r"^create$", re.I)).first.click(timeout=10000)
115
+ except Exception:
116
+ click_text(page, r"^create$")
117
+
118
+ page.wait_for_timeout(2500)
119
+ snap(page, "/private/tmp/gog-cdp-oauth-client-created.png")
120
+
121
+ # Download JSON
122
+ out_path.parent.mkdir(parents=True, exist_ok=True)
123
+ with page.expect_download(timeout=20000) as dl_info:
124
+ try:
125
+ page.get_by_role("button", name=re.compile(r"download", re.I)).first.click(timeout=8000)
126
+ except Exception:
127
+ click_text(page, r"download")
128
+
129
+ download = dl_info.value
130
+ download.save_as(str(out_path))
131
+ print(f"[oauth] downloaded credentials to {out_path}")
132
+
133
+
134
+ def main():
135
+ args = parse_args()
136
+ out = Path(args.out)
137
+
138
+ with sync_playwright() as p:
139
+ browser = p.chromium.connect_over_cdp(args.cdp)
140
+ ctx = browser.contexts[0]
141
+ ctx.set_default_timeout(30000)
142
+ page = ctx.new_page()
143
+
144
+ # Best-effort API enable (optional but useful for onboarding)
145
+ maybe_enable_api(
146
+ page,
147
+ f"https://console.cloud.google.com/apis/library/gmail.googleapis.com?project={args.project}",
148
+ "gmail",
149
+ )
150
+ maybe_enable_api(
151
+ page,
152
+ f"https://console.cloud.google.com/apis/library/calendar-json.googleapis.com?project={args.project}",
153
+ "calendar",
154
+ )
155
+
156
+ create_oauth_client(page, args.project, args.name, out)
157
+
158
+ browser.close()
159
+
160
+ print("\nNext:")
161
+ print(f" gog auth credentials {out}")
162
+
163
+
164
+ if __name__ == "__main__":
165
+ main()
@@ -0,0 +1,58 @@
1
+ #!/bin/bash
2
+ # Launch a dedicated Chrome instance with CDP enabled (port 9222)
3
+ #
4
+ # Why: lets Playwright attach to an already-logged-in session by copying a minimal Chrome profile.
5
+ #
6
+ # This script is safe-ish:
7
+ # - It DOES NOT touch your live Chrome profile
8
+ # - It copies a minimal set of files into Nexus state, then launches a separate Chrome instance
9
+ #
10
+ # Usage:
11
+ # bash launch_cdp_chrome.sh
12
+
13
+ set -euo pipefail
14
+
15
+ PORT="${CDP_PORT:-9222}"
16
+
17
+ SRC="$HOME/Library/Application Support/Google/Chrome"
18
+ DEST="$HOME/nexus/state/browser/cdp/chrome-user-data"
19
+
20
+ mkdir -p "$DEST/Default"
21
+
22
+ echo "Preparing copied Chrome profile at:"
23
+ echo " $DEST"
24
+
25
+ # Copy minimal set that preserves logins/cookies.
26
+ # (We avoid copying the entire profile to keep this light and reduce corruption risk.)
27
+ for p in \
28
+ "Cookies" "Cookies-journal" \
29
+ "Preferences" "Secure Preferences" \
30
+ "Web Data" "Web Data-journal" \
31
+ "Login Data" "Login Data-journal" \
32
+ "Network" "Sessions"; do
33
+ if [ -e "$SRC/Default/$p" ]; then
34
+ rm -rf "$DEST/Default/$p" 2>/dev/null || true
35
+ cp -R "$SRC/Default/$p" "$DEST/Default/" 2>/dev/null || true
36
+ fi
37
+ done
38
+
39
+ # Copy Local State (Chrome expects this; contains metadata/encryption material).
40
+ cp "$SRC/Local State" "$DEST/" 2>/dev/null || true
41
+
42
+ echo "Launching Chrome with CDP on port $PORT..."
43
+ open -na "Google Chrome" --args \
44
+ --remote-debugging-port="$PORT" \
45
+ --user-data-dir="$DEST" \
46
+ --profile-directory=Default
47
+
48
+ echo "Waiting for CDP endpoint..."
49
+ for i in {1..40}; do
50
+ if curl -s "http://127.0.0.1:$PORT/json/version" >/dev/null 2>&1; then
51
+ echo "CDP ready: http://127.0.0.1:$PORT"
52
+ exit 0
53
+ fi
54
+ sleep 0.25
55
+ done
56
+
57
+ echo "CDP did not become ready on port $PORT" >&2
58
+ exit 1