-
A2A packed app
-
type-data-csv-excel-7rh4pz-057e66
-
- {config.agent.name} v{config.agent.version}
+
A2A data workflow builder
+
Turn uploaded data into a reusable extraction workflow
+
+ Upload CSV, Excel, JSON, JSON-LD, or delimited data, paste the JSON Schema you want out,
+ and this agent saves a workflow spec with mappings, transformations, validation gates, and a receipt.
-
-
-
{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" : "Sign-in required to run"}
+
{session?.user?.email || session?.email || config.agent?.name}
+ {needsSignIn && signin ?
Sign in with A2A Cloud : null}
-
+
-
-
-
-
Skill runner
-
{selectedSkill?.name || "No skills found"}
+
+
+
+
+
+
+
Generated workflow
+
{result?.workflow_name || "No workflow yet"}
+
+
-
- ) : (
-
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."}
-
+ {result ? (
+
+
+ - Status
- {result.status}
+ - Source format
- {result.source_format}
+ - Workflow path
- {result.workflow_path}
+ - Receipt
- {result.receipt_id || "not persisted"}
+
+
Mapped fields
+
+ {(result.mapped_fields || []).map((item) => (
+ -
+ {item.target_field}
+ {item.source_field || "needs review"}
+
+ ))}
+
+ {result.unmapped_required_fields?.length ? (
+
Unmapped required fields: {result.unmapped_required_fields.join(", ")}
+ ) : null}
+ {result.warnings?.length ?
{result.warnings.join(" ")}
: null}
+
+ ) : (
+ Run the builder to see mappings, saved path, artifact URI, and receipt status.
+ )}
+
+
+ Recent execution receipts
+ {history.length ? (
+
+ {history.map((item) => (
+
+ {item.receipt_id}
+ {item.workflow_id} · {item.status}
+ {item.created_at}
+
+ ))}
+
+ ) : (
+ Receipts appear here after a production call with managed Postgres available.
+ )}
+
);
}
+
+function fileToBase64(file) {
+ return new Promise((resolve, reject) => {
+ const reader = new FileReader();
+ reader.onerror = () => reject(new Error("Could not read file"));
+ reader.onload = () => {
+ const value = String(reader.result || "");
+ resolve(value.includes(",") ? value.split(",").pop() : value);
+ };
+ reader.readAsDataURL(file);
+ });
+}