@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
|
|
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
|
})
|
package/landing/src/app/page.tsx
CHANGED
|
@@ -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
|
-
|
|
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>
|