-
A2A packed app
-
invoice-guard-studio-v1
-
- {config.agent.name} v{config.agent.version}
+
InvoiceGuard Studio
+
Catch duplicate invoices before payment.
+
+ Paste or upload invoices, deterministically flag duplicate invoice numbers and total mismatches,
+ save the review case to your user-scoped database, then reopen it after refresh.
-
-
-
{session?.authenticated ? "Signed in" : needsSignIn ? "Signed out" : "Local session"}
-
{session?.user?.email || session?.org?.slug || "dev@example.local"}
- {/* Skills that spend the caller's LLM budget need a signed-in
- visitor even when the page itself is public, so offer the way in
- rather than failing at the first click. */}
- {needsSignIn && signInHref ? (
-
Sign in to run
- ) : null}
+
+
{session?.authenticated ? "Signed in" : "Signed out"}
+
{session?.user?.email || session?.org?.slug || "Platform session required"}
+ {needsSignIn && signInHref ?
Sign in to run : null}
-
+
-
-
-
-
Skill runner
-
{selectedSkill?.name || "No skills found"}
+
+
- {selectedSkill ? (
-
- ) : (
- Add a `@a2a.tool` to your agent to make it callable here.
- )}
+
-
-
-
Input schema
-
{JSON.stringify(selectedSkill?.input_schema || {}, null, 2)}
-
-
-
Result
-
{error || JSON.stringify(result, null, 2) || "No run yet."}
-
+
+ 3. Decision receipt
+
+
+ Review writes and production execution receipts are committed in one database transaction.
+
+
);
}
+
+function ResultPanel({ result, error, running }) {
+ return (
+
+ Review result
+ {running ? Running deterministic checks...
: null}
+ {error ? {error}
: null}
+ {!error && result?.ok ? (
+
+
Case{result.case_id}
+
Duplicates{result.duplicate_count}
+
Total mismatches{result.total_mismatch_count}
+
Receipt{result.receipt?.receipt_id || "saved"}
+
+ ) : null}
+ {!error && result?.ok === false ? {result.code}: {result.message}
: null}
+ {result ? JSON.stringify(result, null, 2) : "Run a review or reopen a case to see persisted evidence."}
+
+ );
+}