@nordsym/apiclaw 1.5.6 → 1.5.7

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.
package/convex/logs.ts CHANGED
@@ -364,8 +364,9 @@ export const getLogStats = query({
364
364
  }))
365
365
  .sort((a, b) => a.date.localeCompare(b.date));
366
366
 
367
- // Get unique providers for filter dropdown
367
+ // Get unique providers and agents for filter dropdowns
368
368
  const providers = [...new Set(logs.map((l) => l.provider))].sort();
369
+ const agents = [...new Set(logs.map((l) => l.subagentId || "main"))].sort();
369
370
 
370
371
  return {
371
372
  totalCalls,
@@ -376,6 +377,7 @@ export const getLogStats = query({
376
377
  byProvider,
377
378
  byDay,
378
379
  providers,
380
+ agents,
379
381
  };
380
382
  },
381
383
  });
@@ -527,6 +529,9 @@ export const createProxyLog = mutation({
527
529
  createdAt: now,
528
530
  });
529
531
 
532
+ // Update workspace lastActiveAt (main agent activity)
533
+ await ctx.db.patch(workspaceId, { lastActiveAt: now });
534
+
530
535
  // If this is a subagent call, update that subagent's timestamp
531
536
  if (subagentId && subagentId !== "unknown" && subagentId !== "main") {
532
537
  const subagent = await ctx.db
package/convex/schema.ts CHANGED
@@ -84,6 +84,8 @@ export default defineSchema({
84
84
  pauseOnBudgetExceeded: v.optional(v.boolean()), // If true, block execution when budget exceeded
85
85
  monthlySpendCents: v.optional(v.number()), // Current month's spend in cents
86
86
  lastSpendResetAt: v.optional(v.number()), // When monthly spend was last reset
87
+ // Activity tracking
88
+ lastActiveAt: v.optional(v.number()), // Last API call timestamp (main agent)
87
89
  createdAt: v.number(),
88
90
  updatedAt: v.number(),
89
91
  })
@@ -60,8 +60,6 @@ export async function GET() {
60
60
  >
61
61
  <span>{statsData.apiCount.toLocaleString()}+ APIs</span>
62
62
  <span>•</span>
63
- <span>{statsData.directCallCount} Direct Call</span>
64
- <span>•</span>
65
63
  <span>MCP Native</span>
66
64
  </div>
67
65
  <div
@@ -14,10 +14,8 @@ import { PhoneDemo } from "@/components/demo";
14
14
  import { AITestimonials } from "@/components/AITestimonials";
15
15
 
16
16
  const stats = [
17
- { number: "4,232+", label: "Installs", live: true },
18
17
  { number: statsData.apiCount.toLocaleString(), label: "APIs Indexed", live: true },
19
18
  { number: statsData.openApiCount.toLocaleString(), label: "Open APIs", live: true },
20
- { number: statsData.directCallCount.toString(), label: "Direct Call", live: true },
21
19
  { number: statsData.categoryCount.toString(), label: "Categories", live: false },
22
20
  ];
23
21
 
@@ -211,7 +209,7 @@ Instant highlights:
211
209
  • Code sandbox (E2B)
212
210
  • Multi-LLM routing (OpenRouter)
213
211
 
214
- ${statsData.directCallCount}+ Direct Call providers across categories:
212
+ Direct Call providers across categories:
215
213
  AI/ML: Replicate, OpenRouter, Groq, Mistral, Cohere, Together AI, Stability AI
216
214
  Voice: ElevenLabs, Deepgram, AssemblyAI
217
215
  Search: Brave Search, Serper, Firecrawl
@@ -3486,6 +3486,7 @@ interface ApiLogEntry {
3486
3486
  status: "success" | "error";
3487
3487
  latencyMs: number;
3488
3488
  errorMessage?: string;
3489
+ subagentId?: string;
3489
3490
  createdAt: number;
3490
3491
  }
3491
3492
 
@@ -3516,7 +3517,9 @@ function LogsTab({ sessionToken }: { sessionToken: string | null }) {
3516
3517
  const [isLoading, setIsLoading] = useState(true);
3517
3518
  const [statusFilter, setStatusFilter] = useState<"all" | "success" | "error">("all");
3518
3519
  const [providerFilter, setProviderFilter] = useState<string>("all");
3520
+ const [agentFilter, setAgentFilter] = useState<string>("all");
3519
3521
  const [providers, setProviders] = useState<string[]>([]);
3522
+ const [agents, setAgents] = useState<string[]>([]);
3520
3523
  const [hasMore, setHasMore] = useState(false);
3521
3524
  const [nextCursor, setNextCursor] = useState<number | undefined>();
3522
3525
  const [loadingMore, setLoadingMore] = useState(false);
@@ -3545,6 +3548,7 @@ function LogsTab({ sessionToken }: { sessionToken: string | null }) {
3545
3548
  cursor,
3546
3549
  status: statusFilter,
3547
3550
  provider: providerFilter === "all" ? undefined : providerFilter,
3551
+ subagentId: agentFilter === "all" ? undefined : agentFilter,
3548
3552
  },
3549
3553
  }),
3550
3554
  });
@@ -3602,7 +3606,7 @@ function LogsTab({ sessionToken }: { sessionToken: string | null }) {
3602
3606
  setIsLoading(false);
3603
3607
  setLoadingMore(false);
3604
3608
  }
3605
- }, [sessionToken, statusFilter, providerFilter, nextCursor]);
3609
+ }, [sessionToken, statusFilter, providerFilter, agentFilter, nextCursor]);
3606
3610
 
3607
3611
  const fetchStats = useCallback(async () => {
3608
3612
  if (!sessionToken) return;
@@ -3621,6 +3625,7 @@ function LogsTab({ sessionToken }: { sessionToken: string | null }) {
3621
3625
  const result = statsData.value || statsData;
3622
3626
  setStats(result);
3623
3627
  setProviders(result.providers || []);
3628
+ setAgents(result.agents || []);
3624
3629
  } catch (err) {
3625
3630
  console.error("Error fetching stats:", err);
3626
3631
  }
@@ -3692,6 +3697,18 @@ function LogsTab({ sessionToken }: { sessionToken: string | null }) {
3692
3697
  <option key={p} value={p}>{p}</option>
3693
3698
  ))}
3694
3699
  </select>
3700
+
3701
+ <select
3702
+ value={agentFilter}
3703
+ onChange={(e) => setAgentFilter(e.target.value)}
3704
+ className="px-3 py-2 rounded-lg border border-[var(--border)] bg-[var(--background)] text-sm focus:outline-none focus:ring-2 focus:ring-[#ef4444]/50"
3705
+ >
3706
+ <option value="all">All Agents</option>
3707
+ <option value="main">Main Agent</option>
3708
+ {agents.filter(a => a !== "main" && a !== "unknown").map((a) => (
3709
+ <option key={a} value={a}>{a}</option>
3710
+ ))}
3711
+ </select>
3695
3712
  </div>
3696
3713
 
3697
3714
  {/* Stats Cards */}
@@ -3753,6 +3770,7 @@ function LogsTab({ sessionToken }: { sessionToken: string | null }) {
3753
3770
  <thead className="bg-[var(--surface)]">
3754
3771
  <tr>
3755
3772
  <th className="px-4 py-3 text-left text-sm font-medium text-[var(--text-muted)]">Type</th>
3773
+ <th className="px-4 py-3 text-left text-sm font-medium text-[var(--text-muted)]">Agent</th>
3756
3774
  <th className="px-4 py-3 text-left text-sm font-medium text-[var(--text-muted)]">Time</th>
3757
3775
  <th className="px-4 py-3 text-left text-sm font-medium text-[var(--text-muted)]">Provider</th>
3758
3776
  <th className="px-4 py-3 text-left text-sm font-medium text-[var(--text-muted)]">Action</th>
@@ -3766,6 +3784,13 @@ function LogsTab({ sessionToken }: { sessionToken: string | null }) {
3766
3784
  <td className="px-4 py-3">
3767
3785
  <TypeBadge type={log.type} />
3768
3786
  </td>
3787
+ <td className="px-4 py-3">
3788
+ <span className="text-sm font-mono text-[var(--text-muted)]">
3789
+ {log.type === "direct_call"
3790
+ ? ((log as ApiLogEntry).subagentId || "main")
3791
+ : "—"}
3792
+ </span>
3793
+ </td>
3769
3794
  <td className="px-4 py-3 text-sm text-[var(--text-muted)]">
3770
3795
  {formatTime(log.createdAt)}
3771
3796
  </td>
@@ -4,7 +4,7 @@
4
4
  "directCallCount": 18,
5
5
  "categoryCount": 13,
6
6
  "lastUpdated": "2026-02-27T09:10:41.344767",
7
- "generatedAt": "2026-03-18T11:19:31.518Z",
7
+ "generatedAt": "2026-03-18T11:41:41.087Z",
8
8
  "categoryBreakdown": {
9
9
  "Finance": 1179,
10
10
  "Auth & Security": 491,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nordsym/apiclaw",
3
- "version": "1.5.6",
3
+ "version": "1.5.7",
4
4
  "description": "The API layer for AI agents. Dashboard + 22K APIs + 18 Direct Call providers. MCP native.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",