replicas-cli 0.3.46 → 0.3.48

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.cjs +54 -14
  2. package/package.json +1 -1
package/dist/index.cjs CHANGED
@@ -25297,6 +25297,8 @@ Use this when:
25297
25297
  - The user asks to inspect Vanta controls, tests, evidence, vendors, risks, or compliance data
25298
25298
  - The user asks to query or update a connected turbopuffer namespace
25299
25299
  - The user asks for PlanetScale organizations, databases, branches, or Insights data
25300
+ - The user asks to read, triage, label, or draft replies to LinkedIn messages through Kondo
25301
+ - The user asks to query Sazabi logs, investigate Sazabi issues, or ask the Sazabi agent about production
25300
25302
  - The user asks to analyze text with Pangram`;
25301
25303
  var REFERENCE9 = `# Plugins
25302
25304
 
@@ -25393,6 +25395,29 @@ const databases = await replicas.planetscale.request('/organizations/acme/databa
25393
25395
 
25394
25396
  OAuth scopes control permitted operations. Confirm mutations before using POST, PUT, PATCH, or DELETE.
25395
25397
 
25398
+ ## Sazabi
25399
+
25400
+ Sazabi is a native OAuth integration. Its MCP server has two tools: \`search\` finds an operation and \`execute\` runs it. Replicas refreshes access tokens server-side:
25401
+
25402
+ \`\`\`ts
25403
+ const hits = await replicas.sazabi.call('search', { query: 'log query', namespace: 'sazabi' });
25404
+ const schema = await replicas.sazabi.call('search', { query: 'sazabi/logs.ask', namespace: 'sazabi', includeInputSchema: true });
25405
+ const answer = await replicas.sazabi.call('execute', { name: 'sazabi/logs.ask', arguments: { question: 'Why did checkout 500 in the last hour?' } });
25406
+ \`\`\`
25407
+
25408
+ Copy each hit's \`name\` into \`execute\` and match its input schema. Agent runs that outlive \`execute\` return a run ID; poll it with \`sazabi/runs.get\`. Calls act as the user who connected Sazabi, with that user's read and write access, so confirm mutations first. See [Sazabi's MCP reference](https://docs.sazabi.com/reference/mcp-server).
25409
+
25410
+ ## Kondo
25411
+
25412
+ Kondo is a native OAuth integration for the user's LinkedIn inbox. List its MCP tools first, since Kondo adds tools over time, then call one by name:
25413
+
25414
+ \`\`\`ts
25415
+ const { tools } = await replicas.kondo.tools();
25416
+ const inboxes = await replicas.kondo.call('list_inboxes');
25417
+ \`\`\`
25418
+
25419
+ Calls reach LinkedIn through Kondo in the user's browser: if they fail or time out, ask the user to keep Kondo open in exactly one tab. Label tools take ids from \`list_inboxes\`. \`set_chat_draft\` only fills the compose box; never say a message was sent. See [Kondo's LinkedIn guide](https://www.trykondo.com/skills/kondo-linkedin.md).
25420
+
25396
25421
  ## Vercel
25397
25422
 
25398
25423
  Vercel is a native access-token integration. Pass a relative path from the Vercel REST API, including a \`teamId\` query parameter for team-owned resources:
@@ -28449,7 +28474,7 @@ var headlessAgentRequestSchema = external_exports.object({
28449
28474
  });
28450
28475
 
28451
28476
  // ../shared/src/cli-version.ts
28452
- var CLI_VERSION = "0.3.46";
28477
+ var CLI_VERSION = "0.3.48";
28453
28478
 
28454
28479
  // ../shared/src/version.ts
28455
28480
  function compareVersions(v1, v2) {
@@ -28732,6 +28757,15 @@ var EXPLICIT_PLUGIN_CATALOG = [
28732
28757
  name: "PlanetScale",
28733
28758
  description: "Manage organizations, databases, branches, deploy requests, and Insights."
28734
28759
  },
28760
+ {
28761
+ id: "sazabi",
28762
+ backend: "native",
28763
+ toolkit: "sazabi",
28764
+ authType: "oauth",
28765
+ category: "data",
28766
+ name: "Sazabi",
28767
+ description: "Query logs, investigate issues, and run the Sazabi observability agent."
28768
+ },
28735
28769
  {
28736
28770
  id: "stripe",
28737
28771
  backend: "composio",
@@ -28741,6 +28775,15 @@ var EXPLICIT_PLUGIN_CATALOG = [
28741
28775
  name: "Stripe",
28742
28776
  description: "Manage customers, payments, invoices, subscriptions, and balances."
28743
28777
  },
28778
+ {
28779
+ id: "kondo",
28780
+ backend: "native",
28781
+ toolkit: "kondo",
28782
+ authType: "oauth",
28783
+ category: "business",
28784
+ name: "Kondo",
28785
+ description: "Manage LinkedIn chats, labels, reminders, drafts, connections, and invites."
28786
+ },
28744
28787
  {
28745
28788
  id: "lightfield",
28746
28789
  backend: "native",
@@ -30757,10 +30800,11 @@ var import_readline = __toESM(require("readline"));
30757
30800
  var import_chalk15 = __toESM(require("chalk"));
30758
30801
  var DEFAULT_CLIENT_ID = "9d1c250a-e61b-44d9-88ed-5944d1962f5e";
30759
30802
  var CLAUDE_CLIENT_ID = process.env.CLAUDE_OAUTH_CLIENT_ID || DEFAULT_CLIENT_ID;
30760
- var AUTHORIZATION_ENDPOINT2 = "https://claude.ai/oauth/authorize";
30761
- var TOKEN_ENDPOINT2 = "https://console.anthropic.com/v1/oauth/token";
30762
- var REDIRECT_URI = "https://console.anthropic.com/oauth/code/callback";
30763
- var SCOPES = "org:create_api_key user:profile user:inference";
30803
+ var AUTHORIZATION_ENDPOINT2 = "https://claude.com/cai/oauth/authorize";
30804
+ var TOKEN_ENDPOINT2 = "https://platform.claude.com/v1/oauth/token";
30805
+ var REDIRECT_URI = "https://platform.claude.com/oauth/code/callback";
30806
+ var SCOPES = "user:inference";
30807
+ var TOKEN_LIFETIME_SECONDS = 365 * 24 * 60 * 60;
30764
30808
  function buildAuthorizationUrl2(codeChallenge, state) {
30765
30809
  const params = new URLSearchParams({
30766
30810
  code: "true",
@@ -30819,7 +30863,8 @@ async function exchangeCodeForTokens2(code, state, expectedState, codeVerifier)
30819
30863
  grant_type: "authorization_code",
30820
30864
  client_id: CLAUDE_CLIENT_ID,
30821
30865
  redirect_uri: REDIRECT_URI,
30822
- code_verifier: codeVerifier
30866
+ code_verifier: codeVerifier,
30867
+ expires_in: TOKEN_LIFETIME_SECONDS
30823
30868
  };
30824
30869
  const response = await fetch(TOKEN_ENDPOINT2, {
30825
30870
  method: "POST",
@@ -30833,16 +30878,12 @@ async function exchangeCodeForTokens2(code, state, expectedState, codeVerifier)
30833
30878
  throw new Error(`Failed to exchange authorization code: ${response.status} ${text2}`);
30834
30879
  }
30835
30880
  const data = await response.json();
30836
- const now = Date.now();
30837
- const expiresAt = new Date(now + data.expires_in * 1e3).toISOString();
30838
- const refreshTokenExpiresAt = data.refresh_token_expires_in ? new Date(now + data.refresh_token_expires_in * 1e3).toISOString() : void 0;
30839
30881
  return {
30840
30882
  accessToken: data.access_token,
30841
- refreshToken: data.refresh_token,
30842
30883
  tokenType: data.token_type,
30843
30884
  scope: data.scope,
30844
- expiresAt,
30845
- refreshTokenExpiresAt
30885
+ expiresAt: new Date(Date.now() + (data.expires_in ?? TOKEN_LIFETIME_SECONDS) * 1e3).toISOString(),
30886
+ accountEmail: data.account?.email_address
30846
30887
  };
30847
30888
  }
30848
30889
  async function runClaudeOAuthFlow(totalSteps) {
@@ -30878,11 +30919,10 @@ async function claudeAuthCommand(options = {}) {
30878
30919
  },
30879
30920
  toRequestBody: (tokens) => ({
30880
30921
  access_token: tokens.accessToken,
30881
- refresh_token: tokens.refreshToken,
30882
30922
  token_type: tokens.tokenType,
30883
30923
  scope: tokens.scope,
30884
30924
  expires_at: tokens.expiresAt,
30885
- refresh_token_expires_at: tokens.refreshTokenExpiresAt
30925
+ account_email: tokens.accountEmail
30886
30926
  })
30887
30927
  });
30888
30928
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "replicas-cli",
3
- "version": "0.3.46",
3
+ "version": "0.3.48",
4
4
  "description": "CLI for managing Replicas workspaces - SSH into cloud dev environments with automatic port forwarding",
5
5
  "main": "dist/index.cjs",
6
6
  "bin": {