Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
c6fcb63
feat(cli): next lines, a json error envelope and ax learn
assafelovic Nov 13, 2026
c7e68e0
fix(cli): keep --json error bodies as raw passthrough
assafelovic Nov 13, 2026
6aa88a0
fix(cli): keep --json in the ax skill retry next line
assafelovic Nov 13, 2026
b286849
feat(cli): render journey flags and ora's next action in deep-journey
assafelovic Nov 13, 2026
33a05fb
fix(cli): show the keyed retry when ora links a docs page
assafelovic Nov 13, 2026
17559e0
feat(trial): add levels, outcome rules, flags, counting, the record a…
assafelovic Nov 13, 2026
7cbeb0b
feat(cli): point a free deep-journey run at ax trial run
assafelovic Nov 13, 2026
3227090
refactor(api): type the Studio client's failures and time out each re…
assafelovic Nov 13, 2026
85ac683
feat(trial): add the preview, launch, follow and collect steps
assafelovic Nov 13, 2026
1104a9e
fix(trial): compare gap lines by rate when levels have different grad…
assafelovic Nov 13, 2026
d747788
feat(trial): render the preview, the stop messages and the report
assafelovic Nov 13, 2026
2703715
feat(trial): add the trial list and cancel commands
assafelovic Nov 13, 2026
8413108
feat(trial): add the trial run and view commands
assafelovic Nov 13, 2026
95624f7
feat(cli): register ax trial with run, view, list and cancel
assafelovic Nov 13, 2026
07cfbac
docs(readme): document ax trial and the self-serve Front API key
assafelovic Nov 13, 2026
2db5314
feat(journey): run sets of journeys from ax journey, replacing ax trial
assafelovic Nov 14, 2026
e5a0ecf
fix(journey): name the Front API key in the missing-key hint
assafelovic Nov 14, 2026
8120282
fix(journey): stop the over-allowance hint switching a set to one jou…
assafelovic Nov 14, 2026
9b2e830
fix(api): send keys only to hosts the user chose, and clean server te…
assafelovic Nov 14, 2026
932f671
docs(readme): say where ax will send a key and why a .env host is ref…
assafelovic Nov 14, 2026
7278a72
fix(api): match .env names the way Windows does, and keep .localhost …
assafelovic Nov 14, 2026
cea36b5
docs(readme): show a set with two agents side by side and its report
assafelovic Nov 14, 2026
0205173
feat(journey): one ax journey command, with deep-journey kept as a de…
assafelovic Nov 14, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@
# ora.ai host and need none of these — `ax audit <url>` works with zero
# configuration, and so does `ax webmcp-audit http://localhost:3000`.

# Secret API key (looks like ora_sk_...). Required by `journey` and by
# `audit --tunnel ora` (needs the tunnels:write + tunnels:connect scopes), which
# exchange it for a short-lived bearer token.
# Front API key (looks like ora_sk_...; made in your Front account at app.ora.ai).
# Required by `journey` and `audit --tunnel ora`. A set of journeys needs the
# journeys:write, journeys:read, runs:read, runs:write and intents:read scopes;
# the tunnel needs tunnels:write + tunnels:connect. Each exchanges the key for a
# short-lived bearer token.
ORA_API_KEY=

# Platform API base. Defaults to https://api.agentfront.sh (production) if unset.
Expand Down
342 changes: 262 additions & 80 deletions README.md

Large diffs are not rendered by default.

3 changes: 2 additions & 1 deletion biome.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@
"!**/.context",
"!src/contract/types.gen.ts",
"!src/webmcp/vendor",
"!src/tunnel/vendor"
"!src/tunnel/vendor",
"!src/journey-set/vendor"
]
}
}
37 changes: 36 additions & 1 deletion scripts/smoke.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
// Also checks the things that break `npx ax` but never break `pnpm test`:
// a missing shebang or a non-executable bin.

import { execFileSync } from "node:child_process";
import { execFileSync, spawnSync } from "node:child_process";
import { readFileSync, statSync } from "node:fs";

const BIN = "dist/main.cjs";
Expand Down Expand Up @@ -80,6 +80,41 @@ check("webmcp-audit --help exits 0", () => ax(["webmcp-audit", "--help"]));
check("deep-journey --help exits 0", () => ax(["deep-journey", "--help"]));
check("journey --help exits 0", () => ax(["journey", "--help"]));

// Each call below fails on its flags before any network call, so these run offline.
function axFails(args) {
const run = spawnSync(process.execPath, [BIN, ...args], { encoding: "utf8" });
return { status: run.status, stderr: run.stderr };
}

check("deep-journey still runs, notes its new name, and keeps its exit codes", () => {
const args = [
"deep-journey",
"example.com",
"--task",
"Find the pricing page",
"--intent",
"pricing",
];
const { status, stderr } = axFails(args);
if (status !== 2) throw new Error(`exit ${status}, want 2`);
if (
!stderr.includes(
"ax deep-journey is now ax journey 'Find the pricing page' --domain example.com",
)
) {
throw new Error("no deprecation note naming the new call");
}
if (!stderr.includes("ax deep-journey: --task and --intent"))
throw new Error("the error changed");
});

check("journey with no goal takes the free path, which needs --domain", () => {
const { status, stderr } = axFails(["journey", "--intent", "pricing"]);
if (status !== 2) throw new Error(`exit ${status}, want 2`);
if (!stderr.includes("--domain names the site")) throw new Error("not the free path's error");
if (stderr.includes("ORA_API_KEY")) throw new Error("the free path asked for a Front key");
});

if (failures.length > 0) {
console.error(`\nsmoke failed (${failures.length}):`);
for (const failure of failures) console.error(` - ${failure}`);
Expand Down
18 changes: 18 additions & 0 deletions src/api/__fixtures__/deep-journey-detail-running.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"id": "795ec07c-342a-4603-9649-66be4bb7936e",
"status": "running",
"intent_id": "pricing",
"domain": "linear.app",
"agent": {
"harness": "claude-agent-sdk",
"model": "claude-haiku-5-5"
},
"started_at": "2026-11-13T12:13:32.627Z",
"stream_url": "/api/journey/runs/795ec07c-342a-4603-9649-66be4bb7936e/stream",
"contractVersion": "1.42.0",
"next_action": {
"method": "GET",
"url": "/api/journey/runs/795ec07c-342a-4603-9649-66be4bb7936e/stream",
"reason": "Hold the stream open to the end; only a followed stream saves the result."
}
}
Loading
Loading