nativeapptemplate-agent 0.3.1 → 0.3.2
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/README.md +13 -6
- package/dist/agents/repair.d.ts +5 -0
- package/dist/agents/repair.d.ts.map +1 -1
- package/dist/agents/repair.js +9 -1
- package/dist/agents/repair.js.map +1 -1
- package/dist/models.d.ts +6 -0
- package/dist/models.d.ts.map +1 -1
- package/dist/models.js +11 -0
- package/dist/models.js.map +1 -1
- package/dist/structured-output.d.ts +7 -0
- package/dist/structured-output.d.ts.map +1 -1
- package/dist/structured-output.js +10 -1
- package/dist/structured-output.js.map +1 -1
- package/dist/validation/layer3.d.ts +1 -0
- package/dist/validation/layer3.d.ts.map +1 -1
- package/dist/validation/layer3.js +20 -3
- package/dist/validation/layer3.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -17,7 +17,7 @@ Coherent across all three, in under an hour.
|
|
|
17
17
|
npx nativeapptemplate-agent "a walk-in clinic queue for small veterinary practices" --project-name="VetClinic"
|
|
18
18
|
```
|
|
19
19
|
|
|
20
|
-
> **Status: 0.3.
|
|
20
|
+
> **Status: 0.3.2 stable.** First built during [Built with Opus 4.7: a Claude Code Hackathon](https://cerebralvalley.ai/e/built-with-4-7-hackathon) (April 21–27, 2026); shipped to npm post-hackathon. Verified end-to-end on the three demo specs below from a fresh `/tmp/` cwd — the full 3-spec × 2-edition × 2-platform matrix is green at `NATIVEAPPTEMPLATE_VISUAL=2` (see the [matrix](#demo)). Stage 2 (scripted-CRUD walk-through via `mobile-mcp` against a live Rails server) and paid-edition parity validation landed post-launch. Active development continues — see the [roadmap](./ROADMAP.md) for what's next.
|
|
21
21
|
|
|
22
22
|
---
|
|
23
23
|
|
|
@@ -123,15 +123,22 @@ Both screenshots are real captures from the booted iOS Simulator and Android emu
|
|
|
123
123
|
|
|
124
124
|
End-to-end wall-clock per run, measured from `report.json`'s `meta.durationMs` on a 2021 M1 Max with both simulators pre-booted:
|
|
125
125
|
|
|
126
|
-
| `NATIVEAPPTEMPLATE_VISUAL` | What runs | Observed time | Approx cost |
|
|
126
|
+
| `NATIVEAPPTEMPLATE_VISUAL` | What runs | Observed time | Approx cost (Opus 5.5, 2026-10-15) |
|
|
127
127
|
|---|---|---|---|
|
|
128
|
-
| `0` (default) | Layer 1 (ripgrep) + Layer 2 *fast* (Rails boot probe, iOS/Android type-check) + reviewer | ~2–3 min | ~$0.
|
|
129
|
-
| `1` | + full `xcodebuild build` + `./gradlew assembleDebug` + home-screen capture + Stage 1 vision judge | ~2.5 min (barbershop-queue · 2026-05-24) |
|
|
130
|
-
| `2` | + Rails server boot + scripted-CRUD walk via `mobile-mcp` + Stage 2 vision judge | ~7–8 min (sentova / sushi / task-tracker · 2026-05-23) |
|
|
128
|
+
| `0` (default) | Layer 1 (ripgrep) + Layer 2 *fast* (Rails boot probe, iOS/Android type-check) + reviewer | ~2–3 min | ~$0.02 (planner only, measured) |
|
|
129
|
+
| `1` | + full `xcodebuild build` + `./gradlew assembleDebug` + home-screen capture + Stage 1 vision judge | ~2.5 min (barbershop-queue · 2026-05-24) | ~$0.13 (derived) |
|
|
130
|
+
| `2` | + Rails server boot + scripted-CRUD walk via `mobile-mcp` + Stage 2 vision judge | ~7–8 min (sentova / sushi / task-tracker · 2026-05-23) | ~$0.24 (derived) |
|
|
131
131
|
|
|
132
132
|
Cold builds, first-run cocoapods/gradle dependency resolution, or unbooted simulators add a one-time minute or two. The self-repair loop (opt-in, hard-capped at 5 iterations) can extend a failing run substantially — budget for it if you set `NATIVEAPPTEMPLATE_REPAIR=on`.
|
|
133
133
|
|
|
134
|
-
**Cost
|
|
134
|
+
**Cost.** The agent makes real `claude-opus-5-5` API calls ($4 / $20 per million input / output tokens; 5-minute cache writes $5, cache reads $0.40; rates in [`src/models.ts`](./src/models.ts)). How the numbers above were made, on 2026-10-15:
|
|
135
|
+
|
|
136
|
+
- **Measured, per call:** the planner ("a walk-in queue for a barbershop") used 2,722 in / 446 out = **$0.020**. The vision judge caches the screenshot: its first call writes the cache (~150 in / ~110 out / ~4,400 cache-write tokens = **~$0.025**), then the remaining samples run in parallel and read it (~160 in / ~90–260 out / ~4,400 cache-read tokens = **~$0.006** each).
|
|
137
|
+
- **Measured, per platform:** a judge pass is 2 criteria × 3 samples = 6 calls: **$0.054** for Stage 1 (iOS home screen). Stage 2 sends the same shape of request on a list screen; before the cache warm-up it measured the same as Stage 1 ($0.15 each), so it is taken as ~$0.054 too.
|
|
138
|
+
- **Derived, per run:** VISUAL=1 = planner + Stage 1 on iOS and Android ≈ $0.13; VISUAL=2 adds Stage 2 on both ≈ $0.24. A judge retry after a transient render failure adds ~$0.05 per retried platform.
|
|
139
|
+
- **Self-repair** (`NATIVEAPPTEMPLATE_REPAIR`): a toy fix converged in 3 turns for ~$0.10 (measured). A real Compose/Hilt build fix can take many more turns (up to 40); estimate ~$0.10–$1 per attempt, at most 5 attempts per run. Re-validation after a repair does not re-run the judge.
|
|
140
|
+
|
|
141
|
+
**Check your own spend:** clear `tmp/trace/`, run the agent, then `npm run cost` prints per-agent tokens (including cache writes/reads) and estimated USD; repair uses the Agent SDK's own `total_cost_usd`. For billed amounts, see usage per API key in the Claude Console, and set a workspace spend cap (see [Security](#security)) as a backstop — the agent exits non-zero on validation failure, but doesn't gate on spend itself.
|
|
135
142
|
|
|
136
143
|
## Architecture
|
|
137
144
|
|
package/dist/agents/repair.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type Options } from "@anthropic-ai/claude-agent-sdk";
|
|
2
2
|
import type { DomainSpec, Platform } from "./types.js";
|
|
3
|
+
import { type TokenUsage } from "../structured-output.js";
|
|
3
4
|
export type RepairLayer = "layer1" | "layer2";
|
|
4
5
|
export type RepairTarget = {
|
|
5
6
|
platform: Platform;
|
|
@@ -12,5 +13,9 @@ export type RepairOutcome = {
|
|
|
12
13
|
action: string;
|
|
13
14
|
};
|
|
14
15
|
export declare function runRepair(target: RepairTarget, domain: DomainSpec): Promise<RepairOutcome>;
|
|
16
|
+
export declare function repairCostLine(result: {
|
|
17
|
+
total_cost_usd: number;
|
|
18
|
+
usage: TokenUsage;
|
|
19
|
+
}): string;
|
|
15
20
|
export declare function buildRepairOptions(target: RepairTarget, apiKey: string, allowedTools: string[]): Options;
|
|
16
21
|
//# sourceMappingURL=repair.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repair.d.ts","sourceRoot":"","sources":["../../src/agents/repair.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAGrE,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"repair.d.ts","sourceRoot":"","sources":["../../src/agents/repair.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAGrE,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEvD,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAMvE,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE9C,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,EAAE,QAAQ,CAAC;IAGnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,WAAW,CAAC;IAGnB,MAAM,EAAE,MAAM,CAAC;IAEf,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAI1B,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAKF,wBAAsB,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,CAuChG;AAMD,wBAAgB,cAAc,CAAC,MAAM,EAAE;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GAAG,MAAM,CAE5F;AAKD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAgBxG"}
|
package/dist/agents/repair.js
CHANGED
|
@@ -2,6 +2,7 @@ import { query } from "@anthropic-ai/claude-agent-sdk";
|
|
|
2
2
|
import { trace } from "../trace.js";
|
|
3
3
|
import { isStub } from "../stub.js";
|
|
4
4
|
import { REPAIR_EFFORT, REPAIR_MODEL } from "../models.js";
|
|
5
|
+
import { tokenCounts } from "../structured-output.js";
|
|
5
6
|
// One repair pass over a single failing platform. Drives the Claude Agent
|
|
6
7
|
// SDK's agentic loop (Read/Edit/Bash) scoped to the generated project, then
|
|
7
8
|
// returns a summary. The caller re-validates and records resolved/unresolved.
|
|
@@ -28,7 +29,7 @@ export async function runRepair(target, domain) {
|
|
|
28
29
|
for await (const message of response) {
|
|
29
30
|
if (message.type === "result") {
|
|
30
31
|
turns = message.num_turns;
|
|
31
|
-
cost =
|
|
32
|
+
cost = `, ${repairCostLine(message)}`;
|
|
32
33
|
if (message.subtype === "success" && !message.is_error) {
|
|
33
34
|
action = firstLine(message.result) || action;
|
|
34
35
|
}
|
|
@@ -40,6 +41,13 @@ export async function runRepair(target, domain) {
|
|
|
40
41
|
trace("repair", `${target.platform}/${target.layer}: ${turns} turns${cost} — ${action}`);
|
|
41
42
|
return { action };
|
|
42
43
|
}
|
|
44
|
+
// The Agent SDK prices its own multi-turn loop (cache reads dominate) and
|
|
45
|
+
// reports it as total_cost_usd. scripts/cost.sh takes that figure as is
|
|
46
|
+
// rather than re-pricing the tokens, so this deliberately avoids the
|
|
47
|
+
// "usage:" prefix the planner/judge lines use.
|
|
48
|
+
export function repairCostLine(result) {
|
|
49
|
+
return `sdk-cost: $${result.total_cost_usd.toFixed(4)} (${tokenCounts(result.usage)})`;
|
|
50
|
+
}
|
|
43
51
|
// Agent SDK options for one repair pass. Exported so tests can check them
|
|
44
52
|
// without starting an agent. Thinking is left unset: Opus 5.5 always runs
|
|
45
53
|
// adaptive thinking, and effort is the control.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repair.js","sourceRoot":"","sources":["../../src/agents/repair.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAgB,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"repair.js","sourceRoot":"","sources":["../../src/agents/repair.ts"],"names":[],"mappings":"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"}
|
package/dist/models.d.ts
CHANGED
|
@@ -8,4 +8,10 @@ export declare const JUDGE_EFFORT: Effort;
|
|
|
8
8
|
export declare const REPAIR_EFFORT: Effort;
|
|
9
9
|
export declare const FALLBACK_BETA = "server-side-fallback-2026-07-01";
|
|
10
10
|
export declare const FALLBACKS: "default";
|
|
11
|
+
export declare const OPUS_PRICE_PER_MTOK: {
|
|
12
|
+
readonly input: 4;
|
|
13
|
+
readonly output: 20;
|
|
14
|
+
readonly cacheWrite5m: 5;
|
|
15
|
+
readonly cacheRead: 0.4;
|
|
16
|
+
};
|
|
11
17
|
//# sourceMappingURL=models.d.ts.map
|
package/dist/models.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,UAAU,oBAAoB,CAAC;AAE5C,eAAO,MAAM,aAAa,oBAAa,CAAC;AACxC,eAAO,MAAM,WAAW,oBAAa,CAAC;AACtC,eAAO,MAAM,YAAY,oBAAa,CAAC;AAEvC,MAAM,MAAM,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;AAajE,eAAO,MAAM,cAAc,EAAE,MAAe,CAAC;AAC7C,eAAO,MAAM,YAAY,EAAE,MAAiB,CAAC;AAC7C,eAAO,MAAM,aAAa,EAAE,MAAe,CAAC;AAM5C,eAAO,MAAM,aAAa,oCAAoC,CAAC;AAC/D,eAAO,MAAM,SAAS,EAAG,SAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,UAAU,oBAAoB,CAAC;AAE5C,eAAO,MAAM,aAAa,oBAAa,CAAC;AACxC,eAAO,MAAM,WAAW,oBAAa,CAAC;AACtC,eAAO,MAAM,YAAY,oBAAa,CAAC;AAEvC,MAAM,MAAM,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;AAajE,eAAO,MAAM,cAAc,EAAE,MAAe,CAAC;AAC7C,eAAO,MAAM,YAAY,EAAE,MAAiB,CAAC;AAC7C,eAAO,MAAM,aAAa,EAAE,MAAe,CAAC;AAM5C,eAAO,MAAM,aAAa,oCAAoC,CAAC;AAC/D,eAAO,MAAM,SAAS,EAAG,SAAkB,CAAC;AAO5C,eAAO,MAAM,mBAAmB;;;;;CAKtB,CAAC"}
|
package/dist/models.js
CHANGED
|
@@ -24,4 +24,15 @@ export const REPAIR_EFFORT = "high";
|
|
|
24
24
|
// this beta header (the array form uses server-side-fallback-2026-06-01).
|
|
25
25
|
export const FALLBACK_BETA = "server-side-fallback-2026-07-01";
|
|
26
26
|
export const FALLBACKS = "default";
|
|
27
|
+
// Claude Opus 5.5 list prices, USD per million tokens (Anthropic pricing page,
|
|
28
|
+
// checked 2026-10-15). Cache writes use the 5-minute TTL rate (1.25x input),
|
|
29
|
+
// which is what the judge's `cache_control: { type: "ephemeral" }` gets;
|
|
30
|
+
// cache reads are 0.1x input. scripts/cost.sh repeats these as RATE_* and a
|
|
31
|
+
// test keeps the two in sync — update both on a model or price change.
|
|
32
|
+
export const OPUS_PRICE_PER_MTOK = {
|
|
33
|
+
input: 4,
|
|
34
|
+
output: 20,
|
|
35
|
+
cacheWrite5m: 5,
|
|
36
|
+
cacheRead: 0.4,
|
|
37
|
+
};
|
|
27
38
|
//# sourceMappingURL=models.js.map
|
package/dist/models.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.js","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,yDAAyD;AAEzD,MAAM,CAAC,MAAM,UAAU,GAAG,iBAAiB,CAAC;AAE5C,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC;AACxC,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC;AACtC,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAC;AAIvC,6EAA6E;AAC7E,6DAA6D;AAC7D,EAAE;AACF,yEAAyE;AACzE,4EAA4E;AAC5E,uBAAuB;AACvB,8EAA8E;AAC9E,+EAA+E;AAC/E,0CAA0C;AAC1C,4EAA4E;AAC5E,uEAAuE;AACvE,MAAM,CAAC,MAAM,cAAc,GAAW,MAAM,CAAC;AAC7C,MAAM,CAAC,MAAM,YAAY,GAAW,QAAQ,CAAC;AAC7C,MAAM,CAAC,MAAM,aAAa,GAAW,MAAM,CAAC;AAE5C,2EAA2E;AAC3E,yEAAyE;AACzE,2EAA2E;AAC3E,0EAA0E;AAC1E,MAAM,CAAC,MAAM,aAAa,GAAG,iCAAiC,CAAC;AAC/D,MAAM,CAAC,MAAM,SAAS,GAAG,SAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,yDAAyD;AAEzD,MAAM,CAAC,MAAM,UAAU,GAAG,iBAAiB,CAAC;AAE5C,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC;AACxC,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC;AACtC,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAC;AAIvC,6EAA6E;AAC7E,6DAA6D;AAC7D,EAAE;AACF,yEAAyE;AACzE,4EAA4E;AAC5E,uBAAuB;AACvB,8EAA8E;AAC9E,+EAA+E;AAC/E,0CAA0C;AAC1C,4EAA4E;AAC5E,uEAAuE;AACvE,MAAM,CAAC,MAAM,cAAc,GAAW,MAAM,CAAC;AAC7C,MAAM,CAAC,MAAM,YAAY,GAAW,QAAQ,CAAC;AAC7C,MAAM,CAAC,MAAM,aAAa,GAAW,MAAM,CAAC;AAE5C,2EAA2E;AAC3E,yEAAyE;AACzE,2EAA2E;AAC3E,0EAA0E;AAC1E,MAAM,CAAC,MAAM,aAAa,GAAG,iCAAiC,CAAC;AAC/D,MAAM,CAAC,MAAM,SAAS,GAAG,SAAkB,CAAC;AAE5C,+EAA+E;AAC/E,6EAA6E;AAC7E,yEAAyE;AACzE,4EAA4E;AAC5E,uEAAuE;AACvE,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,KAAK,EAAE,CAAC;IACR,MAAM,EAAE,EAAE;IACV,YAAY,EAAE,CAAC;IACf,SAAS,EAAE,GAAG;CACN,CAAC"}
|
|
@@ -2,5 +2,12 @@ import type Anthropic from "@anthropic-ai/sdk";
|
|
|
2
2
|
type BetaMessage = Anthropic.Beta.Messages.BetaMessage;
|
|
3
3
|
export declare function readStructuredJson(response: BetaMessage, label: string): unknown;
|
|
4
4
|
export declare function usageLine(response: BetaMessage, requestedModel: string): string;
|
|
5
|
+
export type TokenUsage = {
|
|
6
|
+
input_tokens: number;
|
|
7
|
+
output_tokens: number;
|
|
8
|
+
cache_creation_input_tokens?: number | null;
|
|
9
|
+
cache_read_input_tokens?: number | null;
|
|
10
|
+
};
|
|
11
|
+
export declare function tokenCounts(usage: TokenUsage): string;
|
|
5
12
|
export {};
|
|
6
13
|
//# sourceMappingURL=structured-output.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structured-output.d.ts","sourceRoot":"","sources":["../src/structured-output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,mBAAmB,CAAC;AAE/C,KAAK,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;AAKvD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAqBhF;
|
|
1
|
+
{"version":3,"file":"structured-output.d.ts","sourceRoot":"","sources":["../src/structured-output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,mBAAmB,CAAC;AAE/C,KAAK,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;AAKvD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAqBhF;AAOD,wBAAgB,SAAS,CAAC,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAG/E;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,2BAA2B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,uBAAuB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzC,CAAC;AAGF,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAIrD"}
|
|
@@ -25,8 +25,17 @@ export function readStructuredJson(response, label) {
|
|
|
25
25
|
}
|
|
26
26
|
// One trace line per call: tokens, plus the model that actually answered
|
|
27
27
|
// (differs from the requested one when a refusal fallback served it).
|
|
28
|
+
// Cache writes/reads are billed separately from input_tokens (the judge's
|
|
29
|
+
// screenshot is cached, so most of its tokens land there); scripts/cost.sh
|
|
30
|
+
// parses this exact shape, so keep all four fields even when zero.
|
|
28
31
|
export function usageLine(response, requestedModel) {
|
|
29
32
|
const servedBy = response.model !== requestedModel ? ` (served by ${response.model})` : "";
|
|
30
|
-
return `usage: ${response.usage
|
|
33
|
+
return `usage: ${tokenCounts(response.usage)}${servedBy}`;
|
|
34
|
+
}
|
|
35
|
+
// "<in> in / <out> out / <write> cache-write / <read> cache-read"
|
|
36
|
+
export function tokenCounts(usage) {
|
|
37
|
+
const write = usage.cache_creation_input_tokens ?? 0;
|
|
38
|
+
const read = usage.cache_read_input_tokens ?? 0;
|
|
39
|
+
return `${usage.input_tokens} in / ${usage.output_tokens} out / ${write} cache-write / ${read} cache-read`;
|
|
31
40
|
}
|
|
32
41
|
//# sourceMappingURL=structured-output.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structured-output.js","sourceRoot":"","sources":["../src/structured-output.ts"],"names":[],"mappings":"AAIA,sEAAsE;AACtE,4EAA4E;AAC5E,8DAA8D;AAC9D,MAAM,UAAU,kBAAkB,CAAC,QAAqB,EAAE,KAAa;IACrE,IAAI,QAAQ,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,EAAE,QAAQ,IAAI,SAAS,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,yDAAyD,QAAQ,GAAG,CAAC,CAAC;IAChG,CAAC;IACD,IAAI,QAAQ,CAAC,WAAW,KAAK,YAAY,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,wDAAwD,CAAC,CAAC;IACpF,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO;SAC1B,MAAM,CAAC,CAAC,CAAC,EAA8C,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;SAC5E,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAClB,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,0CAA0C,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACxG,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,iCAAiC,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACpG,CAAC;AACH,CAAC;AAED,yEAAyE;AACzE,sEAAsE;AACtE,MAAM,UAAU,SAAS,CAAC,QAAqB,EAAE,cAAsB;IACrE,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,KAAK,cAAc,CAAC,CAAC,CAAC,eAAe,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3F,OAAO,UAAU,QAAQ,CAAC,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"structured-output.js","sourceRoot":"","sources":["../src/structured-output.ts"],"names":[],"mappings":"AAIA,sEAAsE;AACtE,4EAA4E;AAC5E,8DAA8D;AAC9D,MAAM,UAAU,kBAAkB,CAAC,QAAqB,EAAE,KAAa;IACrE,IAAI,QAAQ,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,EAAE,QAAQ,IAAI,SAAS,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,yDAAyD,QAAQ,GAAG,CAAC,CAAC;IAChG,CAAC;IACD,IAAI,QAAQ,CAAC,WAAW,KAAK,YAAY,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,wDAAwD,CAAC,CAAC;IACpF,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO;SAC1B,MAAM,CAAC,CAAC,CAAC,EAA8C,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;SAC5E,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAClB,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,0CAA0C,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACxG,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,iCAAiC,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACpG,CAAC;AACH,CAAC;AAED,yEAAyE;AACzE,sEAAsE;AACtE,0EAA0E;AAC1E,2EAA2E;AAC3E,mEAAmE;AACnE,MAAM,UAAU,SAAS,CAAC,QAAqB,EAAE,cAAsB;IACrE,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,KAAK,cAAc,CAAC,CAAC,CAAC,eAAe,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3F,OAAO,UAAU,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,QAAQ,EAAE,CAAC;AAC5D,CAAC;AASD,kEAAkE;AAClE,MAAM,UAAU,WAAW,CAAC,KAAiB;IAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,2BAA2B,IAAI,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,KAAK,CAAC,uBAAuB,IAAI,CAAC,CAAC;IAChD,OAAO,GAAG,KAAK,CAAC,YAAY,SAAS,KAAK,CAAC,aAAa,UAAU,KAAK,kBAAkB,IAAI,aAAa,CAAC;AAC7G,CAAC"}
|
|
@@ -40,4 +40,5 @@ export declare function parseVerdict(response: Anthropic.Beta.Messages.BetaMessa
|
|
|
40
40
|
rationale: string;
|
|
41
41
|
};
|
|
42
42
|
export declare function runLayer3(input: Layer3Input): Promise<Layer3Result>;
|
|
43
|
+
export declare function firstThenTogether<T, R>(items: readonly T[], run: (item: T) => Promise<R>): Promise<R[]>;
|
|
43
44
|
//# sourceMappingURL=layer3.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layer3.d.ts","sourceRoot":"","sources":["../../src/validation/layer3.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAO1C,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB,CAAC;AAcF,eAAO,MAAM,cAAc;;;;;;;;;;;;;;CAcjB,CAAC;AAIX,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,eAAe,GACzB,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,+BAA+B,CA4BzD;AAID,wBAAgB,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAMhH;AAED,wBAAsB,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,
|
|
1
|
+
{"version":3,"file":"layer3.d.ts","sourceRoot":"","sources":["../../src/validation/layer3.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAO1C,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB,CAAC;AAcF,eAAO,MAAM,cAAc;;;;;;;;;;;;;;CAcjB,CAAC;AAIX,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,eAAe,GACzB,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,+BAA+B,CA4BzD;AAID,wBAAgB,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAMhH;AAED,wBAAsB,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAmCzE;AAID,wBAAsB,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAK7G"}
|
|
@@ -78,8 +78,16 @@ export async function runLayer3(input) {
|
|
|
78
78
|
const imageBase64 = png.toString("base64");
|
|
79
79
|
const apiKey = process.env['NATIVEAPPTEMPLATE_AGENT_ANTHROPIC_KEY'] ?? process.env['ANTHROPIC_API_KEY'];
|
|
80
80
|
const client = new Anthropic({ apiKey });
|
|
81
|
-
|
|
82
|
-
|
|
81
|
+
// Every sample shares the cached prefix (system prompt + screenshot); only
|
|
82
|
+
// the criterion text after the breakpoint differs. Calls sent at the same
|
|
83
|
+
// time all miss the cache and each write it, so judge one sample first to
|
|
84
|
+
// write it, then send the rest together to read it (0.1× input instead of
|
|
85
|
+
// 1.25×).
|
|
86
|
+
const judge = (criterion) => judgeOne(client, model, imageBase64, input.spec, criterion);
|
|
87
|
+
const jobs = input.rubric.flatMap((criterion) => Array.from({ length: samplesPerCriterion }, () => criterion));
|
|
88
|
+
const verdicts = await firstThenTogether(jobs, judge);
|
|
89
|
+
const scores = input.rubric.map((criterion, index) => {
|
|
90
|
+
const samples = verdicts.slice(index * samplesPerCriterion, (index + 1) * samplesPerCriterion);
|
|
83
91
|
const passCount = samples.filter((s) => s.pass).length;
|
|
84
92
|
const median = passCount > samplesPerCriterion / 2;
|
|
85
93
|
const winningSample = samples.find((s) => s.pass === median) ?? samples[0];
|
|
@@ -88,10 +96,19 @@ export async function runLayer3(input) {
|
|
|
88
96
|
pass: median,
|
|
89
97
|
rationale: winningSample.rationale,
|
|
90
98
|
};
|
|
91
|
-
})
|
|
99
|
+
});
|
|
92
100
|
const pass = scores.every((s) => s.pass);
|
|
93
101
|
return { pass, scores };
|
|
94
102
|
}
|
|
103
|
+
// Runs `run` on the first item alone, then on the rest at once; results keep
|
|
104
|
+
// the input order. Lets the first call write a prompt cache the others read.
|
|
105
|
+
export async function firstThenTogether(items, run) {
|
|
106
|
+
const [first, ...rest] = items;
|
|
107
|
+
if (first === undefined)
|
|
108
|
+
return [];
|
|
109
|
+
const head = await run(first);
|
|
110
|
+
return [head, ...(await Promise.all(rest.map(run)))];
|
|
111
|
+
}
|
|
95
112
|
async function judgeOne(client, model, imageBase64, spec, criterion) {
|
|
96
113
|
const response = await client.beta.messages.create(buildJudgeRequest(model, imageBase64, spec, criterion));
|
|
97
114
|
trace("judge", `layer3 ${criterion.id}: ${usageLine(response, model)}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layer3.js","sourceRoot":"","sources":["../../src/validation/layer3.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"layer3.js","sourceRoot":"","sources":["../../src/validation/layer3.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nativeapptemplate-agent",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.2",
|
|
4
4
|
"description": "A Claude Code agent that turns a natural-language SaaS spec into a working three-platform implementation (Rails API + SwiftUI iOS + Jetpack Compose Android).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|