@tokensize/agent-router 0.3.0-beta.0

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/dist/index.cjs ADDED
@@ -0,0 +1,777 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ AGENT_ROUTER_SCHEMA_VERSION: () => AGENT_ROUTER_SCHEMA_VERSION,
24
+ AGENT_ROUTER_VERSION: () => AGENT_ROUTER_VERSION,
25
+ RUN_SCHEMA_VERSION: () => RUN_SCHEMA_VERSION,
26
+ agentFeedbackSchema: () => agentFeedbackSchema,
27
+ agentModelSchema: () => agentModelSchema,
28
+ agentRouteRequestSchema: () => agentRouteRequestSchema,
29
+ agentRouteResponseSchema: () => agentRouteResponseSchema,
30
+ agentTaskFeaturesSchema: () => agentTaskFeaturesSchema,
31
+ allowanceSchema: () => allowanceSchema,
32
+ appendRunEvent: () => appendRunEvent,
33
+ approvalKindSchema: () => approvalKindSchema,
34
+ approvalSurfaceSchema: () => approvalSurfaceSchema,
35
+ clientSurfaceSchema: () => clientSurfaceSchema,
36
+ deriveRunStatus: () => deriveRunStatus,
37
+ effectivePolicySchema: () => effectivePolicySchema,
38
+ executionPlanSchema: () => executionPlanSchema,
39
+ featurizeAgentTask: () => featurizeAgentTask,
40
+ harnessIdSchema: () => harnessIdSchema,
41
+ isTerminalRunStatus: () => isTerminalRunStatus,
42
+ mergePolicy: () => mergePolicy,
43
+ permissionProfileSchema: () => permissionProfileSchema,
44
+ readinessSchema: () => readinessSchema,
45
+ routingObjectiveSchema: () => routingObjectiveSchema,
46
+ runActorSchema: () => runActorSchema,
47
+ runApprovalSchema: () => runApprovalSchema,
48
+ runCandidateSchema: () => runCandidateSchema,
49
+ runDocumentSchema: () => runDocumentSchema,
50
+ runEventSchema: () => runEventSchema,
51
+ runStatusSchema: () => runStatusSchema,
52
+ selectAgentRoute: () => selectAgentRoute,
53
+ taskRoleSchema: () => taskRoleSchema,
54
+ taskTypeSchema: () => taskTypeSchema,
55
+ validateTransition: () => validateTransition,
56
+ workflowSchema: () => workflowSchema
57
+ });
58
+ module.exports = __toCommonJS(index_exports);
59
+
60
+ // src/contracts.ts
61
+ var import_zod = require("zod");
62
+ var AGENT_ROUTER_SCHEMA_VERSION = 2;
63
+ var AGENT_ROUTER_VERSION = "2026-07-20-allowance-aware-v2";
64
+ var harnessIdSchema = import_zod.z.enum(["codex", "claude", "copilot", "cursor", "opencode", "custom"]);
65
+ var readinessSchema = import_zod.z.enum([
66
+ "installed",
67
+ "auth-ready",
68
+ "model-listed",
69
+ "invocation-compatible",
70
+ "live-confirmed"
71
+ ]);
72
+ var permissionProfileSchema = import_zod.z.enum(["inspect", "edit", "test", "network"]);
73
+ var taskRoleSchema = import_zod.z.enum(["inspect", "plan", "implement", "review", "test"]);
74
+ var taskTypeSchema = import_zod.z.enum([
75
+ "bug",
76
+ "feature",
77
+ "refactor",
78
+ "migration",
79
+ "review",
80
+ "research",
81
+ "docs",
82
+ "test",
83
+ "unknown"
84
+ ]);
85
+ var routingObjectiveSchema = import_zod.z.enum(["quality", "balanced", "tokens", "latency"]);
86
+ var clientSurfaceSchema = import_zod.z.enum(["cli", "skill", "codex-plugin", "opencode-plugin"]);
87
+ var allowanceSchema = import_zod.z.object({
88
+ status: import_zod.z.enum(["available", "low", "exhausted", "unmetered", "unknown"]),
89
+ remainingFraction: import_zod.z.number().min(0).max(1).optional(),
90
+ resetsAt: import_zod.z.iso.datetime().optional(),
91
+ observedAt: import_zod.z.iso.datetime(),
92
+ source: import_zod.z.enum(["runtime-reported", "credential-free", "unavailable"])
93
+ });
94
+ var agentModelSchema = import_zod.z.object({
95
+ id: import_zod.z.string().min(1).max(256),
96
+ harness: harnessIdSchema,
97
+ nativeModelId: import_zod.z.string().min(1).max(200),
98
+ displayName: import_zod.z.string().min(1).max(200),
99
+ readiness: readinessSchema,
100
+ authMode: import_zod.z.enum(["subscription", "api-key", "cloud-provider", "local", "unknown"]),
101
+ productUseApproved: import_zod.z.boolean(),
102
+ capabilities: import_zod.z.object({
103
+ tools: import_zod.z.boolean(),
104
+ vision: import_zod.z.boolean(),
105
+ structuredOutput: import_zod.z.enum(["none", "json", "jsonl", "schema"]),
106
+ sessions: import_zod.z.enum(["none", "resume", "continue"]),
107
+ permissions: import_zod.z.array(permissionProfileSchema).min(1)
108
+ }),
109
+ identityProof: import_zod.z.enum(["requested", "runtime-reported", "unavailable"]),
110
+ qualityPrior: import_zod.z.number().min(0).max(1),
111
+ tokenEfficiencyPrior: import_zod.z.number().min(0).max(1),
112
+ latencyPrior: import_zod.z.number().min(0).max(1),
113
+ allowance: allowanceSchema.optional(),
114
+ localHistory: import_zod.z.object({
115
+ verifiedRuns: import_zod.z.number().int().nonnegative(),
116
+ successRate: import_zod.z.number().min(0).max(1),
117
+ medianTokens: import_zod.z.number().nonnegative().optional()
118
+ }).optional()
119
+ });
120
+ var agentTaskFeaturesSchema = import_zod.z.object({
121
+ role: taskRoleSchema,
122
+ type: taskTypeSchema,
123
+ complexity: import_zod.z.number().min(0).max(1),
124
+ scopeBreadth: import_zod.z.number().min(0).max(1),
125
+ contextTokens: import_zod.z.number().int().nonnegative(),
126
+ oracleStrength: import_zod.z.number().min(0).max(1),
127
+ codeDensity: import_zod.z.number().min(0).max(1),
128
+ risk: import_zod.z.enum(["low", "medium", "high", "critical"]),
129
+ languages: import_zod.z.array(import_zod.z.string().min(1).max(50)).max(20),
130
+ requiredTools: import_zod.z.array(import_zod.z.string().min(1).max(80)).max(30),
131
+ requiresVision: import_zod.z.boolean(),
132
+ requiresNetwork: import_zod.z.boolean(),
133
+ cacheHit: import_zod.z.boolean()
134
+ });
135
+ var agentRouteRequestSchema = import_zod.z.object({
136
+ schemaVersion: import_zod.z.literal(AGENT_ROUTER_SCHEMA_VERSION),
137
+ client: import_zod.z.object({
138
+ surface: clientSurfaceSchema,
139
+ version: import_zod.z.string().min(1).max(100)
140
+ }),
141
+ requestId: import_zod.z.uuid(),
142
+ installationId: import_zod.z.string().min(8).max(128),
143
+ routerMode: import_zod.z.enum(["metadata-only", "prompt-assisted"]),
144
+ task: agentTaskFeaturesSchema,
145
+ prompt: import_zod.z.string().min(1).max(12e3).optional(),
146
+ candidates: import_zod.z.array(agentModelSchema).max(100),
147
+ root: import_zod.z.object({
148
+ harness: harnessIdSchema,
149
+ active: import_zod.z.boolean(),
150
+ modelId: import_zod.z.string().min(1).max(200).optional(),
151
+ qualityPrior: import_zod.z.number().min(0).max(1).default(0.9),
152
+ allowance: allowanceSchema.optional()
153
+ }),
154
+ policy: import_zod.z.object({
155
+ objective: routingObjectiveSchema,
156
+ maxDelegationDepth: import_zod.z.number().int().min(0).max(3),
157
+ delegationDepth: import_zod.z.number().int().min(0).max(10),
158
+ allowedHarnesses: import_zod.z.array(harnessIdSchema).max(10).optional(),
159
+ permissionCeiling: permissionProfileSchema,
160
+ tokenBudget: import_zod.z.number().int().positive().max(1e7).optional(),
161
+ wallTimeBudgetMs: import_zod.z.number().int().positive().max(864e5).optional()
162
+ })
163
+ });
164
+ var workflowSchema = import_zod.z.enum([
165
+ "root-only",
166
+ "single-inspector",
167
+ "single-implementer",
168
+ "implementer-deterministic-verify",
169
+ "implementer-independent-review"
170
+ ]);
171
+ var executionPlanSchema = import_zod.z.object({
172
+ workflow: workflowSchema,
173
+ targetId: import_zod.z.string().min(1).max(256).nullable(),
174
+ permissionProfile: permissionProfileSchema,
175
+ maxWallMs: import_zod.z.number().int().positive(),
176
+ maxTurns: import_zod.z.number().int().positive().max(100),
177
+ requiresWorktree: import_zod.z.boolean()
178
+ });
179
+ var agentRouteResponseSchema = import_zod.z.object({
180
+ schemaVersion: import_zod.z.literal(AGENT_ROUTER_SCHEMA_VERSION),
181
+ requestId: import_zod.z.uuid(),
182
+ routeId: import_zod.z.uuid(),
183
+ routerVersion: import_zod.z.string().min(1),
184
+ expiresAt: import_zod.z.iso.datetime(),
185
+ plan: executionPlanSchema,
186
+ fallback: executionPlanSchema,
187
+ confidence: import_zod.z.number().min(0).max(1),
188
+ reasonCodes: import_zod.z.array(import_zod.z.string().min(1)).max(20),
189
+ expected: import_zod.z.object({
190
+ verifiedSuccess: import_zod.z.number().min(0).max(1),
191
+ contextTokens: import_zod.z.number().int().nonnegative(),
192
+ wallTimeMs: import_zod.z.number().int().nonnegative()
193
+ }),
194
+ feedbackToken: import_zod.z.string().min(16).max(200)
195
+ });
196
+ var agentFeedbackSchema = import_zod.z.object({
197
+ schemaVersion: import_zod.z.literal(AGENT_ROUTER_SCHEMA_VERSION),
198
+ routeId: import_zod.z.uuid(),
199
+ feedbackToken: import_zod.z.string().min(16).max(200),
200
+ idempotencyKey: import_zod.z.string().min(1).max(200),
201
+ status: import_zod.z.enum(["completed", "verified", "failed", "blocked", "cancelled"]),
202
+ confirmedTargetId: import_zod.z.string().min(1).max(256).nullable(),
203
+ identityConfirmed: import_zod.z.boolean(),
204
+ checksPassed: import_zod.z.number().int().nonnegative(),
205
+ checksFailed: import_zod.z.number().int().nonnegative(),
206
+ retries: import_zod.z.number().int().nonnegative().max(100),
207
+ usage: import_zod.z.object({
208
+ inputTokens: import_zod.z.number().int().nonnegative().optional(),
209
+ outputTokens: import_zod.z.number().int().nonnegative().optional(),
210
+ contextTokensEstimated: import_zod.z.number().int().nonnegative(),
211
+ source: import_zod.z.enum(["reported", "estimated", "unknown"])
212
+ }),
213
+ timings: import_zod.z.object({
214
+ totalMs: import_zod.z.number().int().nonnegative(),
215
+ routingMs: import_zod.z.number().int().nonnegative(),
216
+ executionMs: import_zod.z.number().int().nonnegative(),
217
+ verificationMs: import_zod.z.number().int().nonnegative()
218
+ }),
219
+ failureCode: import_zod.z.string().min(1).max(100).optional()
220
+ });
221
+
222
+ // src/featurize.ts
223
+ function has(text, pattern) {
224
+ return pattern.test(text);
225
+ }
226
+ function clamp(value) {
227
+ return Math.max(0, Math.min(1, value));
228
+ }
229
+ function featurizeAgentTask(input) {
230
+ const text = input.task.trim();
231
+ const lower = text.toLowerCase();
232
+ const role = input.role ?? (input.permissionProfile === "inspect" ? "inspect" : "implement");
233
+ let type = "unknown";
234
+ if (has(lower, /\b(bug|fix|broken|regression|error|crash)\b/)) type = "bug";
235
+ else if (has(lower, /\b(refactor|cleanup|restructure|simplif)\w*\b/)) type = "refactor";
236
+ else if (has(lower, /\b(migrat|upgrade|port)\w*\b/)) type = "migration";
237
+ else if (has(lower, /\b(review|audit|analyse|analyze|inspect)\b/)) type = "review";
238
+ else if (has(lower, /\b(test|coverage|spec)\b/)) type = "test";
239
+ else if (has(lower, /\b(document|readme|docs|guide)\b/)) type = "docs";
240
+ else if (has(lower, /\b(research|investigate|compare)\b/)) type = "research";
241
+ else if (has(lower, /\b(add|build|create|implement|ship)\b/)) type = "feature";
242
+ const codeMatches = text.match(/```|\b(function|class|interface|const|let|SELECT|CREATE TABLE|npm|git)\b/g) ?? [];
243
+ const codeDensity = clamp(codeMatches.length / Math.max(4, text.split(/\s+/).length / 8));
244
+ const scopeBreadth = clamp(((input.scopePaths?.length ?? 1) - 1) / 12 + (has(lower, /\b(repo|workspace|all|across)\b/) ? 0.25 : 0));
245
+ const acceptanceCount = input.acceptance?.length ?? 0;
246
+ const complexity = clamp(
247
+ 0.16 + Math.min(text.length / 3e3, 0.3) + scopeBreadth * 0.25 + Math.min(acceptanceCount * 0.04, 0.16) + (has(lower, /\b(security|migration|concurrency|distributed|architecture|production)\b/) ? 0.2 : 0)
248
+ );
249
+ const risk = has(lower, /\b(secret|credential|payment|production deploy|delete data)\b/) ? "critical" : has(lower, /\b(auth|security|migration|database|deploy|billing)\b/) ? "high" : complexity > 0.65 ? "medium" : "low";
250
+ const oracleStrength = clamp(
251
+ (type === "test" || has(lower, /\b(test|typecheck|lint|build|benchmark|acceptance)\b/) ? 0.65 : 0.2) + Math.min(acceptanceCount * 0.05, 0.25)
252
+ );
253
+ return {
254
+ role,
255
+ type,
256
+ complexity,
257
+ scopeBreadth,
258
+ contextTokens: Math.max(0, Math.round(input.contextTokens ?? text.length / 4)),
259
+ oracleStrength,
260
+ codeDensity,
261
+ risk,
262
+ languages: [...new Set(input.languages ?? [])].slice(0, 20),
263
+ requiredTools: [...new Set(input.requiredTools ?? [])].slice(0, 30),
264
+ requiresVision: has(lower, /\b(image|screenshot|visual|design|browser)\b/),
265
+ requiresNetwork: input.permissionProfile === "network" || has(lower, /\b(web|internet|latest|browse|api docs)\b/),
266
+ cacheHit: false
267
+ };
268
+ }
269
+
270
+ // src/route.ts
271
+ var QUALITY_EQUIVALENCE_MARGIN = 5e-3;
272
+ var LOW_ALLOWANCE_THRESHOLD = 0.15;
273
+ var permissionRank = {
274
+ inspect: 0,
275
+ edit: 1,
276
+ test: 2,
277
+ network: 3
278
+ };
279
+ function rootPlan() {
280
+ return {
281
+ workflow: "root-only",
282
+ targetId: null,
283
+ permissionProfile: "inspect",
284
+ maxWallMs: 3e5,
285
+ maxTurns: 1,
286
+ requiresWorktree: false
287
+ };
288
+ }
289
+ function requiredPermission(request) {
290
+ if (request.task.requiresNetwork) return "network";
291
+ if (request.task.role === "test") return "test";
292
+ if (request.task.role === "implement") return "edit";
293
+ return "inspect";
294
+ }
295
+ function readinessScore(model) {
296
+ return {
297
+ installed: 0,
298
+ "auth-ready": 0.25,
299
+ "model-listed": 0.6,
300
+ "invocation-compatible": 0.85,
301
+ "live-confirmed": 1
302
+ }[model.readiness];
303
+ }
304
+ function candidateQuality(request, model) {
305
+ const history = model.localHistory;
306
+ const historyQuality = history && history.verifiedRuns >= 3 ? history.successRate : model.qualityPrior;
307
+ let quality = model.qualityPrior * 0.7 + historyQuality * 0.3;
308
+ if (request.task.codeDensity > 0.2 && model.capabilities.tools) quality += 0.03;
309
+ if (request.task.requiresVision && model.capabilities.vision) quality += 0.04;
310
+ return quality * (0.8 + readinessScore(model) * 0.2);
311
+ }
312
+ function candidateScore(request, model) {
313
+ const quality = candidateQuality(request, model);
314
+ switch (request.policy.objective) {
315
+ case "quality":
316
+ return quality;
317
+ case "tokens":
318
+ return quality * 0.65 + model.tokenEfficiencyPrior * 0.35;
319
+ case "latency":
320
+ return quality * 0.65 + model.latencyPrior * 0.35;
321
+ case "balanced":
322
+ return quality * 0.7 + model.tokenEfficiencyPrior * 0.2 + model.latencyPrior * 0.1;
323
+ }
324
+ }
325
+ function allowanceScore(allowance) {
326
+ if (!allowance || allowance.status === "unknown") return 2;
327
+ if (allowance.status === "unmetered") return 4;
328
+ if (allowance.status === "exhausted") return -1;
329
+ if (allowance.status === "available") return 3 + (allowance.remainingFraction ?? 0);
330
+ return 1 + (allowance.remainingFraction ?? 0);
331
+ }
332
+ function allowanceConstrained(allowance) {
333
+ return allowance?.status === "exhausted" || allowance?.status === "low" || allowance?.remainingFraction !== void 0 && allowance.remainingFraction <= LOW_ALLOWANCE_THRESHOLD;
334
+ }
335
+ function workflowFor(request) {
336
+ if (request.task.role === "inspect" || request.task.role === "plan" || request.task.role === "review") {
337
+ return "single-inspector";
338
+ }
339
+ if (request.task.role === "implement" && request.task.oracleStrength >= 0.4) {
340
+ return "implementer-deterministic-verify";
341
+ }
342
+ if (request.task.role === "implement" && (request.task.risk === "high" || request.task.risk === "critical")) {
343
+ return "implementer-independent-review";
344
+ }
345
+ return "single-implementer";
346
+ }
347
+ function selectAgentRoute(request) {
348
+ const fallback = rootPlan();
349
+ const permission = requiredPermission(request);
350
+ const reasons = [];
351
+ if (permissionRank[permission] > permissionRank[request.policy.permissionCeiling]) {
352
+ return {
353
+ plan: fallback,
354
+ fallback,
355
+ confidence: 1,
356
+ reasonCodes: ["PERMISSION_CEILING_EXCEEDED"],
357
+ expected: { verifiedSuccess: request.root.qualityPrior, contextTokens: request.task.contextTokens, wallTimeMs: 0 }
358
+ };
359
+ }
360
+ if (request.policy.delegationDepth >= request.policy.maxDelegationDepth) {
361
+ return {
362
+ plan: fallback,
363
+ fallback,
364
+ confidence: 1,
365
+ reasonCodes: ["DELEGATION_DEPTH_LIMIT"],
366
+ expected: { verifiedSuccess: request.root.qualityPrior, contextTokens: request.task.contextTokens, wallTimeMs: 0 }
367
+ };
368
+ }
369
+ const capabilityEligible = request.candidates.filter((candidate) => {
370
+ if (!candidate.productUseApproved) return false;
371
+ if (readinessScore(candidate) < 0.6) return false;
372
+ if (!candidate.capabilities.permissions.includes(permission)) return false;
373
+ if (request.policy.allowedHarnesses && !request.policy.allowedHarnesses.includes(candidate.harness)) return false;
374
+ if (request.root.active && candidate.harness === request.root.harness) return false;
375
+ if (request.task.requiresVision && !candidate.capabilities.vision) return false;
376
+ return true;
377
+ });
378
+ if (capabilityEligible.length === 0) {
379
+ return {
380
+ plan: fallback,
381
+ fallback,
382
+ confidence: 1,
383
+ reasonCodes: ["NO_ELIGIBLE_LOCAL_TARGET"],
384
+ expected: { verifiedSuccess: request.root.qualityPrior, contextTokens: request.task.contextTokens, wallTimeMs: 0 }
385
+ };
386
+ }
387
+ const eligible = capabilityEligible.filter((candidate) => candidate.allowance?.status !== "exhausted");
388
+ if (eligible.length === 0) {
389
+ return {
390
+ plan: fallback,
391
+ fallback,
392
+ confidence: 1,
393
+ reasonCodes: ["LOCAL_ALLOWANCE_EXHAUSTED"],
394
+ expected: { verifiedSuccess: request.root.qualityPrior, contextTokens: request.task.contextTokens, wallTimeMs: 0 }
395
+ };
396
+ }
397
+ const ranked = eligible.map((candidate) => ({
398
+ candidate,
399
+ quality: candidateQuality(request, candidate),
400
+ score: candidateScore(request, candidate),
401
+ allowance: allowanceScore(candidate.allowance)
402
+ }));
403
+ const qualityCeiling = Math.max(...ranked.map((item) => item.quality));
404
+ const qualityPeers = ranked.filter((item) => item.quality >= qualityCeiling - QUALITY_EQUIVALENCE_MARGIN);
405
+ const allowancePeers = [...qualityPeers].sort((a, b) => b.allowance - a.allowance || b.score - a.score || a.candidate.id.localeCompare(b.candidate.id));
406
+ const rankedByUtility = [...qualityPeers].sort((a, b) => b.score - a.score || a.candidate.id.localeCompare(b.candidate.id));
407
+ const best = allowancePeers[0];
408
+ const second = [...allowancePeers, ...ranked.filter((item) => !allowancePeers.includes(item))].filter((item) => item !== best).sort((a, b) => b.score - a.score)[0];
409
+ const rootIsConstrained = allowanceConstrained(request.root.allowance);
410
+ const targetHasHealthierAllowance = best.allowance > allowanceScore(request.root.allowance);
411
+ const quotaReliefIsQualitySafe = rootIsConstrained && targetHasHealthierAllowance && best.quality >= request.root.qualityPrior - QUALITY_EQUIVALENCE_MARGIN;
412
+ if (request.task.complexity < 0.24 && request.task.scopeBreadth < 0.2 && !quotaReliefIsQualitySafe) {
413
+ return {
414
+ plan: fallback,
415
+ fallback,
416
+ confidence: 0.9,
417
+ reasonCodes: ["ROOT_MORE_EFFICIENT_FOR_SMALL_TASK"],
418
+ expected: { verifiedSuccess: request.root.qualityPrior, contextTokens: request.task.contextTokens, wallTimeMs: 0 }
419
+ };
420
+ }
421
+ const delegationMargin = best.score - request.root.qualityPrior;
422
+ if (delegationMargin < -0.08 && request.task.complexity < 0.7 && !quotaReliefIsQualitySafe) {
423
+ return {
424
+ plan: fallback,
425
+ fallback,
426
+ confidence: Math.min(1, Math.abs(delegationMargin) + 0.75),
427
+ reasonCodes: ["ROOT_EXPECTED_UTILITY_HIGHER"],
428
+ expected: { verifiedSuccess: request.root.qualityPrior, contextTokens: request.task.contextTokens, wallTimeMs: 0 }
429
+ };
430
+ }
431
+ reasons.push("QUALITY_SAFE_LOCAL_TARGET");
432
+ if (rootIsConstrained) reasons.push("ROOT_ALLOWANCE_LOW");
433
+ if (targetHasHealthierAllowance) reasons.push("TARGET_ALLOWANCE_HEALTHIER");
434
+ if (best.candidate.id !== rankedByUtility[0]?.candidate.id) reasons.push("ALLOWANCE_BALANCED_WITHIN_QUALITY_TIER");
435
+ if (request.policy.objective === "tokens") reasons.push("TOKEN_EFFICIENCY_OBJECTIVE");
436
+ if (request.task.oracleStrength >= 0.4) reasons.push("DETERMINISTIC_VERIFICATION_AVAILABLE");
437
+ const workflow = workflowFor(request);
438
+ const maxWallMs = Math.min(request.policy.wallTimeBudgetMs ?? 9e5, 36e5);
439
+ const plan = {
440
+ workflow,
441
+ targetId: best.candidate.id,
442
+ permissionProfile: permission,
443
+ maxWallMs,
444
+ maxTurns: Math.max(3, Math.min(30, Math.round(5 + request.task.complexity * 15))),
445
+ requiresWorktree: permissionRank[permission] >= permissionRank.edit
446
+ };
447
+ const estimatedContext = Math.round(
448
+ request.task.contextTokens * (request.task.cacheHit ? 0.18 : 0.32) + 600 + request.task.scopeBreadth * 1200
449
+ );
450
+ return {
451
+ plan,
452
+ fallback,
453
+ confidence: Math.max(0.5, Math.min(0.99, 0.72 + (best.score - (second?.score ?? request.root.qualityPrior)) * 0.8)),
454
+ reasonCodes: reasons,
455
+ expected: {
456
+ verifiedSuccess: Math.max(0, Math.min(1, best.score)),
457
+ contextTokens: estimatedContext,
458
+ wallTimeMs: Math.round(6e4 + request.task.complexity * 42e4)
459
+ }
460
+ };
461
+ }
462
+
463
+ // src/run.ts
464
+ var import_zod2 = require("zod");
465
+ var RUN_SCHEMA_VERSION = 3;
466
+ var runStatusSchema = import_zod2.z.enum([
467
+ "planned",
468
+ "awaiting-approval",
469
+ "executing",
470
+ "verifying",
471
+ "completed",
472
+ "failed",
473
+ "cancelled",
474
+ "expired"
475
+ ]);
476
+ var runActorSchema = import_zod2.z.enum(["router", "root-agent", "delegate", "human", "system"]);
477
+ var approvalKindSchema = import_zod2.z.enum(["subscription-use", "execute", "share-prompt"]);
478
+ var approvalSurfaceSchema = import_zod2.z.enum(["local-cli", "web"]);
479
+ var usageSchema = import_zod2.z.strictObject({
480
+ inputTokens: import_zod2.z.number().int().nonnegative().optional(),
481
+ outputTokens: import_zod2.z.number().int().nonnegative().optional(),
482
+ contextTokensEstimated: import_zod2.z.number().int().nonnegative(),
483
+ source: import_zod2.z.enum(["reported", "estimated", "unknown"])
484
+ });
485
+ var failureCode = import_zod2.z.string().min(1).max(100);
486
+ var reasonCode = import_zod2.z.string().min(1).max(100);
487
+ var eventBase = {
488
+ seq: import_zod2.z.number().int().nonnegative(),
489
+ at: import_zod2.z.iso.datetime(),
490
+ actor: runActorSchema
491
+ };
492
+ var runEventSchema = import_zod2.z.discriminatedUnion("type", [
493
+ import_zod2.z.strictObject({
494
+ ...eventBase,
495
+ type: import_zod2.z.literal("created"),
496
+ data: import_zod2.z.strictObject({
497
+ surface: clientSurfaceSchema,
498
+ routerMode: import_zod2.z.enum(["metadata-only", "prompt-assisted"])
499
+ })
500
+ }),
501
+ import_zod2.z.strictObject({
502
+ ...eventBase,
503
+ type: import_zod2.z.literal("routed"),
504
+ data: import_zod2.z.strictObject({
505
+ targetId: import_zod2.z.string().min(1).max(256).nullable(),
506
+ workflow: executionPlanSchema.shape.workflow,
507
+ confidence: import_zod2.z.number().min(0).max(1),
508
+ reasonCodes: import_zod2.z.array(reasonCode).max(20)
509
+ })
510
+ }),
511
+ import_zod2.z.strictObject({
512
+ ...eventBase,
513
+ type: import_zod2.z.literal("approval-requested"),
514
+ data: import_zod2.z.strictObject({
515
+ kind: approvalKindSchema,
516
+ harness: harnessIdSchema.optional()
517
+ })
518
+ }),
519
+ import_zod2.z.strictObject({
520
+ ...eventBase,
521
+ type: import_zod2.z.literal("approval-granted"),
522
+ data: import_zod2.z.strictObject({
523
+ kind: approvalKindSchema,
524
+ grantedBy: approvalSurfaceSchema
525
+ })
526
+ }),
527
+ import_zod2.z.strictObject({
528
+ ...eventBase,
529
+ type: import_zod2.z.literal("approval-denied"),
530
+ data: import_zod2.z.strictObject({
531
+ kind: approvalKindSchema,
532
+ deniedBy: approvalSurfaceSchema
533
+ })
534
+ }),
535
+ import_zod2.z.strictObject({
536
+ ...eventBase,
537
+ type: import_zod2.z.literal("execution-started"),
538
+ data: import_zod2.z.strictObject({
539
+ targetId: import_zod2.z.string().min(1).max(256),
540
+ permissionProfile: permissionProfileSchema,
541
+ worktree: import_zod2.z.boolean()
542
+ })
543
+ }),
544
+ import_zod2.z.strictObject({
545
+ ...eventBase,
546
+ type: import_zod2.z.literal("execution-progress"),
547
+ data: import_zod2.z.strictObject({
548
+ turn: import_zod2.z.number().int().nonnegative(),
549
+ elapsedMs: import_zod2.z.number().int().nonnegative()
550
+ })
551
+ }),
552
+ import_zod2.z.strictObject({
553
+ ...eventBase,
554
+ type: import_zod2.z.literal("execution-finished"),
555
+ data: import_zod2.z.strictObject({
556
+ outcome: import_zod2.z.enum(["success", "failure", "timeout"]),
557
+ failureCode: failureCode.optional(),
558
+ elapsedMs: import_zod2.z.number().int().nonnegative(),
559
+ usage: usageSchema.optional()
560
+ })
561
+ }),
562
+ import_zod2.z.strictObject({
563
+ ...eventBase,
564
+ type: import_zod2.z.literal("verification-started"),
565
+ data: import_zod2.z.strictObject({})
566
+ }),
567
+ import_zod2.z.strictObject({
568
+ ...eventBase,
569
+ type: import_zod2.z.literal("verification-finished"),
570
+ data: import_zod2.z.strictObject({
571
+ passed: import_zod2.z.boolean(),
572
+ checksPassed: import_zod2.z.number().int().nonnegative(),
573
+ checksFailed: import_zod2.z.number().int().nonnegative()
574
+ })
575
+ }),
576
+ import_zod2.z.strictObject({
577
+ ...eventBase,
578
+ type: import_zod2.z.literal("feedback"),
579
+ data: import_zod2.z.strictObject({
580
+ status: import_zod2.z.enum(["completed", "verified", "failed", "blocked", "cancelled"]),
581
+ rating: import_zod2.z.number().int().min(1).max(5).optional(),
582
+ modelChoice: import_zod2.z.enum(["right", "acceptable", "wrong"]).optional(),
583
+ wouldUseAgain: import_zod2.z.boolean().optional()
584
+ })
585
+ }),
586
+ import_zod2.z.strictObject({
587
+ ...eventBase,
588
+ type: import_zod2.z.literal("cancelled"),
589
+ data: import_zod2.z.strictObject({
590
+ by: runActorSchema
591
+ })
592
+ }),
593
+ import_zod2.z.strictObject({
594
+ ...eventBase,
595
+ type: import_zod2.z.literal("expired"),
596
+ data: import_zod2.z.strictObject({})
597
+ })
598
+ ]);
599
+ var runCandidateSchema = import_zod2.z.strictObject({
600
+ id: import_zod2.z.string().min(1).max(256),
601
+ harness: harnessIdSchema,
602
+ nativeModelId: import_zod2.z.string().min(1).max(200),
603
+ readiness: import_zod2.z.enum(["installed", "auth-ready", "model-listed", "invocation-compatible", "live-confirmed"]),
604
+ authMode: import_zod2.z.enum(["subscription", "api-key", "cloud-provider", "local", "unknown"]),
605
+ productUseApproved: import_zod2.z.boolean(),
606
+ capabilities: import_zod2.z.object({
607
+ tools: import_zod2.z.boolean(),
608
+ vision: import_zod2.z.boolean(),
609
+ structuredOutput: import_zod2.z.enum(["none", "json", "jsonl", "schema"]),
610
+ sessions: import_zod2.z.enum(["none", "resume", "continue"]),
611
+ permissions: import_zod2.z.array(permissionProfileSchema).min(1)
612
+ }),
613
+ identityProof: import_zod2.z.enum(["requested", "runtime-reported", "unavailable"]),
614
+ qualityPrior: import_zod2.z.number().min(0).max(1),
615
+ tokenEfficiencyPrior: import_zod2.z.number().min(0).max(1),
616
+ latencyPrior: import_zod2.z.number().min(0).max(1)
617
+ });
618
+ var effectivePolicySchema = import_zod2.z.strictObject({
619
+ objective: routingObjectiveSchema,
620
+ maxDelegationDepth: import_zod2.z.number().int().min(0).max(3),
621
+ permissionCeiling: permissionProfileSchema,
622
+ allowedHarnesses: import_zod2.z.array(harnessIdSchema).max(10).optional(),
623
+ tokenBudget: import_zod2.z.number().int().positive().max(1e7).optional(),
624
+ wallTimeBudgetMs: import_zod2.z.number().int().positive().max(864e5).optional()
625
+ });
626
+ var runApprovalSchema = import_zod2.z.strictObject({
627
+ kind: approvalKindSchema,
628
+ state: import_zod2.z.enum(["pending", "granted", "denied"]),
629
+ surface: approvalSurfaceSchema.optional(),
630
+ at: import_zod2.z.iso.datetime()
631
+ });
632
+ var runDocumentSchema = import_zod2.z.strictObject({
633
+ schemaVersion: import_zod2.z.literal(RUN_SCHEMA_VERSION),
634
+ runId: import_zod2.z.uuid(),
635
+ createdAt: import_zod2.z.iso.datetime(),
636
+ expiresAt: import_zod2.z.iso.datetime(),
637
+ origin: import_zod2.z.strictObject({
638
+ surface: clientSurfaceSchema,
639
+ clientVersion: import_zod2.z.string().min(1).max(100)
640
+ }),
641
+ task: agentTaskFeaturesSchema,
642
+ candidatesSnapshot: import_zod2.z.array(runCandidateSchema).max(100),
643
+ decision: import_zod2.z.strictObject({
644
+ plan: executionPlanSchema,
645
+ fallback: executionPlanSchema,
646
+ confidence: import_zod2.z.number().min(0).max(1),
647
+ reasonCodes: import_zod2.z.array(reasonCode).max(20),
648
+ expected: import_zod2.z.strictObject({
649
+ verifiedSuccess: import_zod2.z.number().min(0).max(1),
650
+ contextTokens: import_zod2.z.number().int().nonnegative(),
651
+ wallTimeMs: import_zod2.z.number().int().nonnegative()
652
+ }),
653
+ routerVersion: import_zod2.z.string().min(1).max(100)
654
+ }),
655
+ policy: effectivePolicySchema,
656
+ approvals: import_zod2.z.array(runApprovalSchema).max(20),
657
+ events: import_zod2.z.array(runEventSchema).max(500),
658
+ status: runStatusSchema,
659
+ usage: usageSchema.optional()
660
+ });
661
+ var TERMINAL = /* @__PURE__ */ new Set(["cancelled", "expired"]);
662
+ var ALLOWED = {
663
+ none: ["created"],
664
+ planned: ["routed", "approval-requested", "execution-started", "cancelled", "expired"],
665
+ "awaiting-approval": ["approval-granted", "approval-denied", "cancelled", "expired"],
666
+ executing: ["execution-progress", "execution-finished", "cancelled", "expired"],
667
+ verifying: ["verification-finished", "cancelled", "expired"],
668
+ completed: ["verification-started", "feedback", "expired"],
669
+ failed: ["verification-started", "feedback", "expired"],
670
+ cancelled: ["feedback"],
671
+ expired: []
672
+ };
673
+ function apply(status, event) {
674
+ switch (event.type) {
675
+ case "created":
676
+ return "planned";
677
+ case "routed":
678
+ return "planned";
679
+ case "approval-requested":
680
+ return "awaiting-approval";
681
+ case "approval-granted":
682
+ return "planned";
683
+ case "approval-denied":
684
+ return "cancelled";
685
+ case "execution-started":
686
+ case "execution-progress":
687
+ return "executing";
688
+ case "execution-finished":
689
+ return event.data.outcome === "success" ? "completed" : "failed";
690
+ case "verification-started":
691
+ return "verifying";
692
+ case "verification-finished":
693
+ return event.data.passed ? "completed" : "failed";
694
+ case "feedback":
695
+ return status === "none" ? "planned" : status;
696
+ case "cancelled":
697
+ return "cancelled";
698
+ case "expired":
699
+ return "expired";
700
+ }
701
+ }
702
+ function validateTransition(status, event) {
703
+ return ALLOWED[status].includes(event.type);
704
+ }
705
+ function deriveRunStatus(events) {
706
+ let status = "none";
707
+ for (const event of events) status = apply(status, event);
708
+ return status;
709
+ }
710
+ function appendRunEvent(events, candidate) {
711
+ const parsed = runEventSchema.parse(candidate);
712
+ const expectedSeq = events.length === 0 ? 0 : events[events.length - 1].seq + 1;
713
+ if (parsed.seq !== expectedSeq) throw new Error(`RUN_EVENT_SEQ: expected seq ${expectedSeq}, received ${parsed.seq}`);
714
+ const status = deriveRunStatus(events);
715
+ if (!validateTransition(status, parsed)) {
716
+ throw new Error(`RUN_EVENT_TRANSITION: ${parsed.type} is not valid from ${status}`);
717
+ }
718
+ return [...events, parsed];
719
+ }
720
+ function isTerminalRunStatus(status) {
721
+ return TERMINAL.has(status) || status === "completed" || status === "failed";
722
+ }
723
+ var permissionRank2 = { inspect: 0, edit: 1, test: 2, network: 3 };
724
+ function lowerPermission(a, b) {
725
+ return permissionRank2[a] <= permissionRank2[b] ? a : b;
726
+ }
727
+ function mergePolicy(local, hosted = {}) {
728
+ const allowedHarnesses = local.allowedHarnesses && hosted.allowedHarnesses ? local.allowedHarnesses.filter((harness) => hosted.allowedHarnesses?.includes(harness)) : local.allowedHarnesses ?? hosted.allowedHarnesses;
729
+ const tokenBudget = local.tokenBudget !== void 0 && hosted.tokenBudget !== void 0 ? Math.min(local.tokenBudget, hosted.tokenBudget) : local.tokenBudget ?? hosted.tokenBudget;
730
+ const wallTimeBudgetMs = local.wallTimeBudgetMs !== void 0 && hosted.wallTimeBudgetMs !== void 0 ? Math.min(local.wallTimeBudgetMs, hosted.wallTimeBudgetMs) : local.wallTimeBudgetMs ?? hosted.wallTimeBudgetMs;
731
+ return effectivePolicySchema.parse({
732
+ objective: local.objective ?? hosted.objective ?? "balanced",
733
+ maxDelegationDepth: Math.min(local.maxDelegationDepth ?? 1, hosted.maxDelegationDepth ?? 3),
734
+ permissionCeiling: lowerPermission(local.permissionCeiling ?? "inspect", hosted.permissionCeiling ?? "network"),
735
+ ...allowedHarnesses === void 0 ? {} : { allowedHarnesses },
736
+ ...tokenBudget === void 0 ? {} : { tokenBudget },
737
+ ...wallTimeBudgetMs === void 0 ? {} : { wallTimeBudgetMs }
738
+ });
739
+ }
740
+ // Annotate the CommonJS export names for ESM import in node:
741
+ 0 && (module.exports = {
742
+ AGENT_ROUTER_SCHEMA_VERSION,
743
+ AGENT_ROUTER_VERSION,
744
+ RUN_SCHEMA_VERSION,
745
+ agentFeedbackSchema,
746
+ agentModelSchema,
747
+ agentRouteRequestSchema,
748
+ agentRouteResponseSchema,
749
+ agentTaskFeaturesSchema,
750
+ allowanceSchema,
751
+ appendRunEvent,
752
+ approvalKindSchema,
753
+ approvalSurfaceSchema,
754
+ clientSurfaceSchema,
755
+ deriveRunStatus,
756
+ effectivePolicySchema,
757
+ executionPlanSchema,
758
+ featurizeAgentTask,
759
+ harnessIdSchema,
760
+ isTerminalRunStatus,
761
+ mergePolicy,
762
+ permissionProfileSchema,
763
+ readinessSchema,
764
+ routingObjectiveSchema,
765
+ runActorSchema,
766
+ runApprovalSchema,
767
+ runCandidateSchema,
768
+ runDocumentSchema,
769
+ runEventSchema,
770
+ runStatusSchema,
771
+ selectAgentRoute,
772
+ taskRoleSchema,
773
+ taskTypeSchema,
774
+ validateTransition,
775
+ workflowSchema
776
+ });
777
+ //# sourceMappingURL=index.cjs.map