@todoforai/edge 0.13.22 → 0.13.23

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 (2) hide show
  1. package/dist/index.js +91 -29
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -48267,6 +48267,12 @@ class ApiClient {
48267
48267
  listEdges() {
48268
48268
  return this.request("GET", "/api/v1/edges");
48269
48269
  }
48270
+ setAgentDeviceConfig(agentId, agentSettingsId, deviceId, config) {
48271
+ return this.request("PUT", `/api/v1/agents/${agentId}/device-config`, { agentSettingsId, deviceId, config });
48272
+ }
48273
+ listDevices() {
48274
+ return this.request("GET", "/api/v1/devices");
48275
+ }
48270
48276
  startFromTemplate(projectId, templateId, opts) {
48271
48277
  return this.request("POST", `/api/v1/projects/${projectId}/todos/from-template`, {
48272
48278
  templateId,
@@ -48789,12 +48795,13 @@ var tool_catalog_default = {
48789
48795
  installer: "npm",
48790
48796
  label: "Gmail",
48791
48797
  statusCmd: "zele whoami",
48792
- loginCmd: "zele login",
48798
+ loginCmd: "zele login --method google",
48793
48799
  credentialPaths: [
48794
48800
  "~/.zele/sqlite.db"
48795
48801
  ],
48796
48802
  capabilities: "Read inbox, search/send/reply email, email addresses — multi-account Gmail, OAuth browser login for setup.",
48797
- versionCmd: "zele --version 2>/dev/null | head -1"
48803
+ versionCmd: "zele --version 2>/dev/null | head -1",
48804
+ preinstallCloud: true
48798
48805
  },
48799
48806
  xurl: {
48800
48807
  category: "social",
@@ -48824,6 +48831,20 @@ var tool_catalog_default = {
48824
48831
  description: "Authenticated LinkedIn Voyager API CLI. Cookie auth: `linkedin-api auth <li_at> <jsessionid>` (from browser DevTools).",
48825
48832
  versionCmd: "linkedin-api --version 2>/dev/null | head -1"
48826
48833
  },
48834
+ "figma-api": {
48835
+ category: "development",
48836
+ pkg: "@todoforai/figma-api",
48837
+ installer: "npm",
48838
+ label: "Figma",
48839
+ statusCmd: `figma-api me 2>/dev/null | grep -oP '"email":\\s*"\\K[^"]+' | head -1`,
48840
+ loginCmd: "figma-api auth",
48841
+ credentialPaths: [
48842
+ "~/.config/figma-api/credentials.json"
48843
+ ],
48844
+ capabilities: "Read+write Figma REST API: files/nodes JSON, render images (png/svg/pdf), comments & reactions, components/styles/variables, dev resources, webhooks, projects, library analytics — full subcommand-per-endpoint CLI.",
48845
+ description: "Authenticated Figma REST API CLI. Auth: `figma-api auth <token>` (PAT from figma.com/settings). File commands take a file key or Figma URL. Read files/nodes/images/comments/components/styles/variables; write comments/dev-resources/webhooks. Canvas writes (frames/text/shapes) use `figma-api run` via the plugin bridge. Run `figma-api <cmd> --help` for params/scopes.",
48846
+ versionCmd: "figma-api --version 2>/dev/null | head -1"
48847
+ },
48827
48848
  "tiktok-uploader": {
48828
48849
  category: "social",
48829
48850
  pkg: "tiktok-uploader",
@@ -48834,7 +48855,8 @@ var tool_catalog_default = {
48834
48855
  "~/.tiktok/cookies.txt"
48835
48856
  ],
48836
48857
  capabilities: "Upload videos, batch uploads, schedule posts, custom covers, hashtags & mentions",
48837
- versionCmd: "pip show tiktok-uploader 2>/dev/null | grep -oP 'Version: \\K.*'"
48858
+ versionCmd: "pip show tiktok-uploader 2>/dev/null | grep -oP 'Version: \\K.*'",
48859
+ statusCmd: "test -f ~/.tiktok/cookies.txt && echo authenticated"
48838
48860
  },
48839
48861
  instagrapi: {
48840
48862
  category: "social",
@@ -48842,7 +48864,8 @@ var tool_catalog_default = {
48842
48864
  installer: "pip",
48843
48865
  label: "Instagram",
48844
48866
  capabilities: "Upload photos & reels, post stories, send DMs, like & comment, manage followers",
48845
- versionCmd: "pip show instagrapi 2>/dev/null | grep -oP 'Version: \\K.*'"
48867
+ versionCmd: "pip show instagrapi 2>/dev/null | grep -oP 'Version: \\K.*'",
48868
+ statusCmd: "python3 -c 'import instagrapi' 2>/dev/null && echo installed"
48846
48869
  },
48847
48870
  mudslide: {
48848
48871
  category: "messaging",
@@ -48909,7 +48932,8 @@ var tool_catalog_default = {
48909
48932
  "~/.config/telegram-send/telegram-send.conf"
48910
48933
  ],
48911
48934
  capabilities: "Send messages, send files & images, send video & audio, Markdown/HTML formatting, channel & group support",
48912
- versionCmd: "telegram-send --version 2>/dev/null | head -1"
48935
+ versionCmd: "telegram-send --version 2>/dev/null | head -1",
48936
+ statusCmd: "test -f ~/.config/telegram-send/telegram-send.conf && echo authenticated"
48913
48937
  },
48914
48938
  "meta-ads": {
48915
48939
  category: "marketing",
@@ -48926,7 +48950,12 @@ var tool_catalog_default = {
48926
48950
  installer: "npm",
48927
48951
  label: "ElevenLabs",
48928
48952
  capabilities: "Text-to-speech, voice cloning, multiple languages. Needs ELEVENLABS_API_KEY.",
48929
- versionCmd: "elevenlabs-api --version 2>/dev/null | head -1"
48953
+ versionCmd: "elevenlabs-api --version 2>/dev/null | head -1",
48954
+ statusCmd: 'test -f ~/.config/todoforai/elevenlabs.json && echo authenticated || test -n "$ELEVENLABS_API_KEY" && echo authenticated',
48955
+ loginCmd: "elevenlabs-api auth <api_key>",
48956
+ credentialPaths: [
48957
+ "~/.config/todoforai/elevenlabs.json"
48958
+ ]
48930
48959
  },
48931
48960
  "codex-imagegen-api": {
48932
48961
  category: "media",
@@ -48934,7 +48963,11 @@ var tool_catalog_default = {
48934
48963
  installer: "npm",
48935
48964
  label: "Image Gen",
48936
48965
  capabilities: "AI image generation & editing via TODOFORAI backend (gpt-image)",
48937
- versionCmd: "codex-imagegen-api --version 2>/dev/null | head -1"
48966
+ versionCmd: "codex-imagegen-api --version 2>/dev/null | head -1",
48967
+ statusCmd: 'test -f ~/.config/todoforai/credentials.json && echo authenticated || test -n "$TODOFORAI_API_KEY" && echo authenticated',
48968
+ credentialPaths: [
48969
+ "~/.config/todoforai/credentials.json"
48970
+ ]
48938
48971
  },
48939
48972
  "suno-api": {
48940
48973
  category: "media",
@@ -48942,7 +48975,8 @@ var tool_catalog_default = {
48942
48975
  installer: "npm",
48943
48976
  label: "Suno",
48944
48977
  capabilities: "AI music generation, custom lyrics, multiple genres. Needs SUNO_API_KEY.",
48945
- versionCmd: "suno-api --version 2>/dev/null | head -1"
48978
+ versionCmd: "suno-api --version 2>/dev/null | head -1",
48979
+ statusCmd: 'test -n "$SUNO_API_KEY" && echo authenticated'
48946
48980
  },
48947
48981
  ntn: {
48948
48982
  category: "utility",
@@ -48963,7 +48997,12 @@ var tool_catalog_default = {
48963
48997
  installer: "npm",
48964
48998
  label: "Perplexity",
48965
48999
  capabilities: "AI-powered web search, chat completions, async chat, embeddings and agent runs",
48966
- versionCmd: "perplexity-api --version 2>/dev/null | head -1"
49000
+ versionCmd: "perplexity-api --version 2>/dev/null | head -1",
49001
+ statusCmd: 'test -f ~/.config/todoforai/perplexity.json && echo authenticated || test -n "$PERPLEXITY_API_KEY" && echo authenticated',
49002
+ loginCmd: "perplexity-api auth <api_key>",
49003
+ credentialPaths: [
49004
+ "~/.config/todoforai/perplexity.json"
49005
+ ]
48967
49006
  },
48968
49007
  gh: {
48969
49008
  category: "development",
@@ -49116,7 +49155,8 @@ var tool_catalog_default = {
49116
49155
  "~/.config/shopify/config.json"
49117
49156
  ],
49118
49157
  capabilities: "Theme development, app scaffolding, store management",
49119
- versionCmd: "shopify version 2>/dev/null | head -1"
49158
+ versionCmd: "shopify version 2>/dev/null | head -1",
49159
+ statusCmd: "test -f ~/.config/shopify/config.json && echo authenticated"
49120
49160
  },
49121
49161
  "shop-app": {
49122
49162
  category: "ecommerce",
@@ -49133,7 +49173,8 @@ var tool_catalog_default = {
49133
49173
  installer: "npm",
49134
49174
  label: "Datadog",
49135
49175
  capabilities: "CI test visibility, sourcemap uploads, deployment tracking. Needs DATADOG_API_KEY.",
49136
- versionCmd: "datadog-ci version 2>/dev/null | head -1"
49176
+ versionCmd: "datadog-ci version 2>/dev/null | head -1",
49177
+ statusCmd: 'test -n "$DATADOG_API_KEY" && echo authenticated'
49137
49178
  },
49138
49179
  "sentry-cli": {
49139
49180
  category: "monitoring",
@@ -49280,7 +49321,7 @@ var tool_catalog_default = {
49280
49321
  },
49281
49322
  "agent-browser": {
49282
49323
  category: "development",
49283
- pkg: "agent-browser",
49324
+ pkg: "agent-browser@0.30.1",
49284
49325
  installer: "npm",
49285
49326
  preinstallCloud: true,
49286
49327
  label: "Browser",
@@ -49295,30 +49336,30 @@ var tool_catalog_default = {
49295
49336
  binName: "browser-manager-cli",
49296
49337
  preinstallCloud: true,
49297
49338
  label: "Browser Manager",
49298
- statusCmd: "browser-manager-cli whoami",
49339
+ statusCmd: "browser-manager-cli status",
49299
49340
  loginCmd: "browser-manager-cli login",
49300
- capabilities: "On-demand cloud Chromium sessions exposed as CDP endpoints for agent-browser; create/list/get/delete sessions, hibernate/restore, health",
49301
- description: "Spawns on-demand cloud Chromium sessions and exposes each as a CDP WebSocket for agent-browser to drive. Reuses the bridge login (zero-config, same creds as the daemon). Flow: `browser-manager-cli create` prints a session with a cdpUrl; `browser-manager-cli connect <id> --exec` connects agent-browser to that session (runs `agent-browser connect '<cdp_url>'`), then drive it with normal agent-browser commands (open/click/snapshot/...). `browser-manager-cli list` shows your sessions, `whoami` the logged-in user, `delete <id>` / `delete-all` to clean up, `hibernate`/`restore` to pause/resume. Use this on the cloud VM instead of launching a local browser.",
49341
+ capabilities: "On-demand cloud Chromium sessions exposed as CDP endpoints for agent-browser; create/list/get/delete sessions, hibernate/restore, health, per-session residential/datacenter proxy (stealth Chromium via CloakBrowser)",
49342
+ description: "Spawns on-demand cloud Chromium sessions and exposes each as a CDP WebSocket for agent-browser to drive. Reuses the bridge login (zero-config, same creds as the daemon). `browser-manager-cli create` prints one line: status, cdpUrl, dimensions (e.g. `active\twss://...?token=...\t1280x720`) copy the cdpUrl straight into `agent-browser connect '<cdp_url>'`. `list`/`get <id>` show the same concise line per session; `hibernated-list` shows paused ones. `delete <id>` / `delete-all` to clean up, `hibernate`/`restore` to pause/resume. Add `--json` to any command for raw machine-readable output. Sessions run a stealth-patched Chromium (CloakBrowser: navigator.webdriver/UA/plugins/canvas/WebGL spoofed at the binary level), so they read as a real desktop browser. For sites that block datacenter IPs (e.g. login flows), route a session through a residential/ISP proxy: `create --proxy socks5://host:port [--proxy-user U --proxy-pass P]` — the server geoip-matches timezone/locale to the proxy exit IP, and the identity is kept across hibernate/restore. Use this on the cloud VM instead of launching a local browser.",
49302
49343
  versionCmd: "browser-manager-cli version 2>/dev/null | head -1",
49303
49344
  binary: {
49304
49345
  "linux-x86_64": {
49305
- url: "https://github.com/todoforai/browser-manager/releases/download/cli-v0.1.0/browser-manager-cli-linux-x86_64",
49346
+ url: "https://github.com/todoforai/browser-manager/releases/download/cli-v0.1.1/browser-manager-cli-linux-x86_64",
49306
49347
  archive: "raw"
49307
49348
  },
49308
49349
  "linux-aarch64": {
49309
- url: "https://github.com/todoforai/browser-manager/releases/download/cli-v0.1.0/browser-manager-cli-linux-aarch64",
49350
+ url: "https://github.com/todoforai/browser-manager/releases/download/cli-v0.1.1/browser-manager-cli-linux-aarch64",
49310
49351
  archive: "raw"
49311
49352
  },
49312
49353
  "darwin-x86_64": {
49313
- url: "https://github.com/todoforai/browser-manager/releases/download/cli-v0.1.0/browser-manager-cli-darwin-x86_64",
49354
+ url: "https://github.com/todoforai/browser-manager/releases/download/cli-v0.1.1/browser-manager-cli-darwin-x86_64",
49314
49355
  archive: "raw"
49315
49356
  },
49316
49357
  "darwin-aarch64": {
49317
- url: "https://github.com/todoforai/browser-manager/releases/download/cli-v0.1.0/browser-manager-cli-darwin-aarch64",
49358
+ url: "https://github.com/todoforai/browser-manager/releases/download/cli-v0.1.1/browser-manager-cli-darwin-aarch64",
49318
49359
  archive: "raw"
49319
49360
  },
49320
49361
  "windows-x86_64": {
49321
- url: "https://github.com/todoforai/browser-manager/releases/download/cli-v0.1.0/browser-manager-cli-windows-x86_64.exe",
49362
+ url: "https://github.com/todoforai/browser-manager/releases/download/cli-v0.1.1/browser-manager-cli-windows-x86_64.exe",
49322
49363
  archive: "raw"
49323
49364
  }
49324
49365
  }
@@ -49341,7 +49382,8 @@ var tool_catalog_default = {
49341
49382
  capabilities: "Spawn a TODO for AI sub-agent (FluidAgent) from the CLI; pipe stdin in, get an answer out",
49342
49383
  versionCmd: "todoforai-subagent --version 2>/dev/null | head -1",
49343
49384
  installCmd: "bun add -g @todoforai/subagent",
49344
- internal: true
49385
+ internal: true,
49386
+ statusCmd: "todoforai-subagent whoami 2>/dev/null | grep -v 'not logged'"
49345
49387
  },
49346
49388
  "tfa-handoff": {
49347
49389
  category: "development",
@@ -49352,7 +49394,8 @@ var tool_catalog_default = {
49352
49394
  description: "Compact a conversation into a handoff document for a fresh agent.",
49353
49395
  versionCmd: "tfa-handoff --version 2>/dev/null | head -1",
49354
49396
  installCmd: "bun add -g @todoforai/tfa-handoff",
49355
- internal: true
49397
+ internal: true,
49398
+ statusCmd: "tfa-handoff whoami 2>/dev/null | grep -v 'not logged'"
49356
49399
  },
49357
49400
  "tfa-vault": {
49358
49401
  category: "security",
@@ -51676,18 +51719,25 @@ function truncateLines(text, { maxLines = MAX_RESULT_LINES, maxLineLen = MAX_LIN
51676
51719
  ... (output truncated)`;
51677
51720
  return output;
51678
51721
  }
51679
- function capLineWidth(text, lineLimit) {
51680
- if (!isFinite(lineLimit))
51722
+ function collapseCarriageReturns(text) {
51723
+ if (!text.includes("\r"))
51681
51724
  return text;
51682
51725
  return text.split(`
51683
- `).map((line) => line.length > lineLimit ? line.slice(0, lineLimit) + ` ...[+${line.length - lineLimit} chars]` : line).join(`
51726
+ `).map((line) => {
51727
+ if (!line.includes("\r"))
51728
+ return line;
51729
+ let out = "";
51730
+ for (const seg of line.split("\r"))
51731
+ out = seg + out.slice(seg.length);
51732
+ return out;
51733
+ }).join(`
51684
51734
  `);
51685
51735
  }
51686
- function collapseCarriageReturns(text) {
51687
- if (!text.includes("\r"))
51736
+ function capLineWidth(text, lineLimit) {
51737
+ if (!isFinite(lineLimit))
51688
51738
  return text;
51689
51739
  return text.split(`
51690
- `).map((line) => line.includes("\r") ? line.split("\r").at(-1) ?? "" : line).join(`
51740
+ `).map((line) => line.length > lineLimit ? line.slice(0, lineLimit) + ` ...[+${line.length - lineLimit} chars]` : line).join(`
51691
51741
  `);
51692
51742
  }
51693
51743
  function formatTruncationNotice(totalLen, firstLimit, lastPart) {
@@ -51698,6 +51748,15 @@ function formatTruncationNotice(totalLen, firstLimit, lastPart) {
51698
51748
 
51699
51749
  ${lastPart}`;
51700
51750
  }
51751
+ function applyOutputPolicy(text, policy) {
51752
+ const headLimit = Math.min(policy.firstLimit, policy.hardCap);
51753
+ if (text.length <= headLimit)
51754
+ return capLineWidth(text, policy.lineLimit);
51755
+ const tailLimit = Math.min(policy.lastLimit, policy.hardCap - headLimit);
51756
+ const head = capLineWidth(text.slice(0, headLimit), policy.lineLimit);
51757
+ const tail = tailLimit > 0 ? capLineWidth(text.slice(-tailLimit), policy.lineLimit) : "";
51758
+ return head + formatTruncationNotice(text.length, headLimit, tail);
51759
+ }
51701
51760
 
51702
51761
  // src/shell.ts
51703
51762
  var IS_WIN = os6.platform() === "win32";
@@ -52582,7 +52641,10 @@ register("execute_shell_command", async (args, client) => {
52582
52641
  resolve((stdout || "") + (stderr || ""));
52583
52642
  });
52584
52643
  });
52585
- return { cmd, ...detectContentType(result, cmd) };
52644
+ const detected = detectContentType(result, cmd);
52645
+ if (detected.contentType)
52646
+ return { cmd, ...detected };
52647
+ return { cmd, result: applyOutputPolicy(detected.result, resolveOutputPolicy(outputMode)) };
52586
52648
  }
52587
52649
  const { execCmd, postFilter } = extractTrailingTail(cmd);
52588
52650
  const send = (m) => client.sendResponse(m);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@todoforai/edge",
3
- "version": "0.13.22",
3
+ "version": "0.13.23",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "todoforai-edge": "dist/index.js"