@aisy/core 0.1.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/LICENSE +202 -0
- package/dist/agent-loop/index.d.ts +4 -0
- package/dist/agent-loop/index.d.ts.map +1 -0
- package/dist/agent-loop/index.js +352 -0
- package/dist/agent-loop/index.js.map +1 -0
- package/dist/agent-loop/types.d.ts +183 -0
- package/dist/agent-loop/types.d.ts.map +1 -0
- package/dist/agent-loop/types.js +3 -0
- package/dist/agent-loop/types.js.map +1 -0
- package/dist/bin/aisy.d.ts +3 -0
- package/dist/bin/aisy.d.ts.map +1 -0
- package/dist/bin/aisy.js +14 -0
- package/dist/bin/aisy.js.map +1 -0
- package/dist/cli/index.d.ts +17 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +114 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/context-engine/index.d.ts +4 -0
- package/dist/context-engine/index.d.ts.map +1 -0
- package/dist/context-engine/index.js +126 -0
- package/dist/context-engine/index.js.map +1 -0
- package/dist/context-engine/types.d.ts +54 -0
- package/dist/context-engine/types.d.ts.map +1 -0
- package/dist/context-engine/types.js +4 -0
- package/dist/context-engine/types.js.map +1 -0
- package/dist/eval/index.d.ts +20 -0
- package/dist/eval/index.d.ts.map +1 -0
- package/dist/eval/index.js +128 -0
- package/dist/eval/index.js.map +1 -0
- package/dist/eval/types.d.ts +62 -0
- package/dist/eval/types.d.ts.map +1 -0
- package/dist/eval/types.js +17 -0
- package/dist/eval/types.js.map +1 -0
- package/dist/gateway/index.d.ts +5 -0
- package/dist/gateway/index.d.ts.map +1 -0
- package/dist/gateway/index.js +288 -0
- package/dist/gateway/index.js.map +1 -0
- package/dist/gateway/types.d.ts +194 -0
- package/dist/gateway/types.d.ts.map +1 -0
- package/dist/gateway/types.js +94 -0
- package/dist/gateway/types.js.map +1 -0
- package/dist/goals/index.d.ts +11 -0
- package/dist/goals/index.d.ts.map +1 -0
- package/dist/goals/index.js +21 -0
- package/dist/goals/index.js.map +1 -0
- package/dist/goals/types.d.ts +47 -0
- package/dist/goals/types.d.ts.map +1 -0
- package/dist/goals/types.js +5 -0
- package/dist/goals/types.js.map +1 -0
- package/dist/index.d.ts +56 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/index.d.ts +5 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +215 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/types.d.ts +148 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +4 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/memory/index.d.ts +6 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +419 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/types.d.ts +131 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +33 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/nightly/index.d.ts +4 -0
- package/dist/nightly/index.d.ts.map +1 -0
- package/dist/nightly/index.js +470 -0
- package/dist/nightly/index.js.map +1 -0
- package/dist/nightly/types.d.ts +326 -0
- package/dist/nightly/types.d.ts.map +1 -0
- package/dist/nightly/types.js +3 -0
- package/dist/nightly/types.js.map +1 -0
- package/dist/observability/index.d.ts +11 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +396 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/types.d.ts +139 -0
- package/dist/observability/types.d.ts.map +1 -0
- package/dist/observability/types.js +4 -0
- package/dist/observability/types.js.map +1 -0
- package/dist/onboarding/index.d.ts +16 -0
- package/dist/onboarding/index.d.ts.map +1 -0
- package/dist/onboarding/index.js +787 -0
- package/dist/onboarding/index.js.map +1 -0
- package/dist/onboarding/interactive.d.ts +23 -0
- package/dist/onboarding/interactive.d.ts.map +1 -0
- package/dist/onboarding/interactive.js +45 -0
- package/dist/onboarding/interactive.js.map +1 -0
- package/dist/onboarding/types.d.ts +388 -0
- package/dist/onboarding/types.d.ts.map +1 -0
- package/dist/onboarding/types.js +35 -0
- package/dist/onboarding/types.js.map +1 -0
- package/dist/orchestration/index.d.ts +8 -0
- package/dist/orchestration/index.d.ts.map +1 -0
- package/dist/orchestration/index.js +706 -0
- package/dist/orchestration/index.js.map +1 -0
- package/dist/orchestration/types.d.ts +391 -0
- package/dist/orchestration/types.d.ts.map +1 -0
- package/dist/orchestration/types.js +30 -0
- package/dist/orchestration/types.js.map +1 -0
- package/dist/personality/index.d.ts +65 -0
- package/dist/personality/index.d.ts.map +1 -0
- package/dist/personality/index.js +339 -0
- package/dist/personality/index.js.map +1 -0
- package/dist/personality/types.d.ts +103 -0
- package/dist/personality/types.d.ts.map +1 -0
- package/dist/personality/types.js +15 -0
- package/dist/personality/types.js.map +1 -0
- package/dist/provider/index.d.ts +4 -0
- package/dist/provider/index.d.ts.map +1 -0
- package/dist/provider/index.js +236 -0
- package/dist/provider/index.js.map +1 -0
- package/dist/provider/types.d.ts +180 -0
- package/dist/provider/types.d.ts.map +1 -0
- package/dist/provider/types.js +4 -0
- package/dist/provider/types.js.map +1 -0
- package/dist/runtime/agent-cards.d.ts +14 -0
- package/dist/runtime/agent-cards.d.ts.map +1 -0
- package/dist/runtime/agent-cards.js +90 -0
- package/dist/runtime/agent-cards.js.map +1 -0
- package/dist/runtime/agent-runner.d.ts +30 -0
- package/dist/runtime/agent-runner.d.ts.map +1 -0
- package/dist/runtime/agent-runner.js +37 -0
- package/dist/runtime/agent-runner.js.map +1 -0
- package/dist/runtime/budget.d.ts +15 -0
- package/dist/runtime/budget.d.ts.map +1 -0
- package/dist/runtime/budget.js +24 -0
- package/dist/runtime/budget.js.map +1 -0
- package/dist/runtime/delegation-driver.d.ts +11 -0
- package/dist/runtime/delegation-driver.d.ts.map +1 -0
- package/dist/runtime/delegation-driver.js +132 -0
- package/dist/runtime/delegation-driver.js.map +1 -0
- package/dist/runtime/exact-cache.d.ts +10 -0
- package/dist/runtime/exact-cache.d.ts.map +1 -0
- package/dist/runtime/exact-cache.js +30 -0
- package/dist/runtime/exact-cache.js.map +1 -0
- package/dist/runtime/execute-tool.d.ts +29 -0
- package/dist/runtime/execute-tool.d.ts.map +1 -0
- package/dist/runtime/execute-tool.js +80 -0
- package/dist/runtime/execute-tool.js.map +1 -0
- package/dist/runtime/guardian.d.ts +9 -0
- package/dist/runtime/guardian.d.ts.map +1 -0
- package/dist/runtime/guardian.js +41 -0
- package/dist/runtime/guardian.js.map +1 -0
- package/dist/runtime/hook-gate.d.ts +17 -0
- package/dist/runtime/hook-gate.d.ts.map +1 -0
- package/dist/runtime/hook-gate.js +56 -0
- package/dist/runtime/hook-gate.js.map +1 -0
- package/dist/runtime/memory-adapter.d.ts +6 -0
- package/dist/runtime/memory-adapter.d.ts.map +1 -0
- package/dist/runtime/memory-adapter.js +38 -0
- package/dist/runtime/memory-adapter.js.map +1 -0
- package/dist/runtime/nightly-adapters.d.ts +48 -0
- package/dist/runtime/nightly-adapters.d.ts.map +1 -0
- package/dist/runtime/nightly-adapters.js +139 -0
- package/dist/runtime/nightly-adapters.js.map +1 -0
- package/dist/runtime/nightly-generator.d.ts +10 -0
- package/dist/runtime/nightly-generator.d.ts.map +1 -0
- package/dist/runtime/nightly-generator.js +335 -0
- package/dist/runtime/nightly-generator.js.map +1 -0
- package/dist/runtime/onboarding-node.d.ts +6 -0
- package/dist/runtime/onboarding-node.d.ts.map +1 -0
- package/dist/runtime/onboarding-node.js +356 -0
- package/dist/runtime/onboarding-node.js.map +1 -0
- package/dist/runtime/provider-anthropic.d.ts +43 -0
- package/dist/runtime/provider-anthropic.d.ts.map +1 -0
- package/dist/runtime/provider-anthropic.js +148 -0
- package/dist/runtime/provider-anthropic.js.map +1 -0
- package/dist/runtime/provider-cli.d.ts +18 -0
- package/dist/runtime/provider-cli.d.ts.map +1 -0
- package/dist/runtime/provider-cli.js +73 -0
- package/dist/runtime/provider-cli.js.map +1 -0
- package/dist/runtime/provider-openai.d.ts +30 -0
- package/dist/runtime/provider-openai.d.ts.map +1 -0
- package/dist/runtime/provider-openai.js +114 -0
- package/dist/runtime/provider-openai.js.map +1 -0
- package/dist/runtime/providers.d.ts +43 -0
- package/dist/runtime/providers.d.ts.map +1 -0
- package/dist/runtime/providers.js +72 -0
- package/dist/runtime/providers.js.map +1 -0
- package/dist/runtime/sandbox-bash.d.ts +21 -0
- package/dist/runtime/sandbox-bash.d.ts.map +1 -0
- package/dist/runtime/sandbox-bash.js +51 -0
- package/dist/runtime/sandbox-bash.js.map +1 -0
- package/dist/runtime/scoped-tool-executor.d.ts +10 -0
- package/dist/runtime/scoped-tool-executor.d.ts.map +1 -0
- package/dist/runtime/scoped-tool-executor.js +30 -0
- package/dist/runtime/scoped-tool-executor.js.map +1 -0
- package/dist/runtime/session-log.d.ts +6 -0
- package/dist/runtime/session-log.d.ts.map +1 -0
- package/dist/runtime/session-log.js +54 -0
- package/dist/runtime/session-log.js.map +1 -0
- package/dist/runtime/settings.d.ts +24 -0
- package/dist/runtime/settings.d.ts.map +1 -0
- package/dist/runtime/settings.js +29 -0
- package/dist/runtime/settings.js.map +1 -0
- package/dist/runtime/spawn-plan.d.ts +13 -0
- package/dist/runtime/spawn-plan.d.ts.map +1 -0
- package/dist/runtime/spawn-plan.js +107 -0
- package/dist/runtime/spawn-plan.js.map +1 -0
- package/dist/runtime/spend.d.ts +41 -0
- package/dist/runtime/spend.d.ts.map +1 -0
- package/dist/runtime/spend.js +0 -0
- package/dist/runtime/spend.js.map +1 -0
- package/dist/runtime/sub-agent-runner.d.ts +19 -0
- package/dist/runtime/sub-agent-runner.d.ts.map +1 -0
- package/dist/runtime/sub-agent-runner.js +47 -0
- package/dist/runtime/sub-agent-runner.js.map +1 -0
- package/dist/safety/grants.d.ts +7 -0
- package/dist/safety/grants.d.ts.map +1 -0
- package/dist/safety/grants.js +53 -0
- package/dist/safety/grants.js.map +1 -0
- package/dist/safety/index.d.ts +72 -0
- package/dist/safety/index.d.ts.map +1 -0
- package/dist/safety/index.js +464 -0
- package/dist/safety/index.js.map +1 -0
- package/dist/safety/types.d.ts +254 -0
- package/dist/safety/types.d.ts.map +1 -0
- package/dist/safety/types.js +3 -0
- package/dist/safety/types.js.map +1 -0
- package/dist/skills/index.d.ts +4 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +463 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/types.d.ts +177 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/skills/types.js +3 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/testing/clock.d.ts +8 -0
- package/dist/testing/clock.d.ts.map +1 -0
- package/dist/testing/clock.js +13 -0
- package/dist/testing/clock.js.map +1 -0
- package/dist/testing/effect-verifier.d.ts +15 -0
- package/dist/testing/effect-verifier.d.ts.map +1 -0
- package/dist/testing/effect-verifier.js +27 -0
- package/dist/testing/effect-verifier.js.map +1 -0
- package/dist/testing/index.d.ts +5 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +5 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/provider-fake.d.ts +14 -0
- package/dist/testing/provider-fake.d.ts.map +1 -0
- package/dist/testing/provider-fake.js +18 -0
- package/dist/testing/provider-fake.js.map +1 -0
- package/dist/testing/sandbox-stub.d.ts +15 -0
- package/dist/testing/sandbox-stub.d.ts.map +1 -0
- package/dist/testing/sandbox-stub.js +15 -0
- package/dist/testing/sandbox-stub.js.map +1 -0
- package/dist/tools/index.d.ts +11 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +0 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/types.d.ts +138 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +4 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/triggers/index.d.ts +4 -0
- package/dist/triggers/index.d.ts.map +1 -0
- package/dist/triggers/index.js +187 -0
- package/dist/triggers/index.js.map +1 -0
- package/dist/triggers/types.d.ts +74 -0
- package/dist/triggers/types.d.ts.map +1 -0
- package/dist/triggers/types.js +5 -0
- package/dist/triggers/types.js.map +1 -0
- package/package.json +36 -0
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// Fixed routing policy (ADR-0018)
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
const TABLE = {
|
|
6
|
+
reasoning: { family: 'deepseek', model: 'deepseek-v4-pro' },
|
|
7
|
+
critique: { family: 'anthropic', model: 'claude-opus-4.8' },
|
|
8
|
+
routine: { family: 'deepseek', model: 'deepseek-v4-flash' },
|
|
9
|
+
};
|
|
10
|
+
/** Fallback fires when consecutiveErrors reaches exactly this (ADR-0018). */
|
|
11
|
+
const HYSTERESIS_THRESHOLD = 2;
|
|
12
|
+
/** Frozen cache-breakpoint layout (ADR-0019). */
|
|
13
|
+
const MAX_CACHE_BREAKPOINTS = 4;
|
|
14
|
+
const keyOf = (p) => `${p.family}:${p.model}`;
|
|
15
|
+
const sha256 = (bytes) => createHash('sha256').update(bytes).digest('hex');
|
|
16
|
+
const classifyRole = (req) => {
|
|
17
|
+
switch (req.role) {
|
|
18
|
+
case 'generator': return 'reasoning';
|
|
19
|
+
case 'judge': return 'critique';
|
|
20
|
+
case 'agent':
|
|
21
|
+
case 'classifier': return 'routine';
|
|
22
|
+
default:
|
|
23
|
+
throw new Error(`classify: unknown role '${String(req.role)}'`);
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
// makeModelRouter
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
export function makeModelRouter(deps) {
|
|
30
|
+
const adapters = new Map(deps.adapters.map(a => [keyOf(a.providerId), a]));
|
|
31
|
+
const hysteresis = deps.hysteresisStore ?? new Map();
|
|
32
|
+
const budgets = deps.budgets ?? new Map();
|
|
33
|
+
const queueStore = deps.queueStore ?? new Map();
|
|
34
|
+
const reviewQueue = deps.reviewQueue ?? new Map();
|
|
35
|
+
/** Per-task session-start prefix hash — the stable-prefix contract (ADR-0019). */
|
|
36
|
+
const prefixHashes = new Map();
|
|
37
|
+
const emit = (event) => { deps.emitEvent?.(event); };
|
|
38
|
+
const errorCount = (p) => hysteresis.get(keyOf(p))?.consecutiveErrors ?? 0;
|
|
39
|
+
const isDown = (p) => errorCount(p) >= HYSTERESIS_THRESHOLD;
|
|
40
|
+
const recordError = (p) => {
|
|
41
|
+
const next = errorCount(p) + 1;
|
|
42
|
+
hysteresis.set(keyOf(p), { provider: p, consecutiveErrors: next });
|
|
43
|
+
return next;
|
|
44
|
+
};
|
|
45
|
+
const recordSuccess = (p) => {
|
|
46
|
+
hysteresis.set(keyOf(p), { provider: p, consecutiveErrors: 0 });
|
|
47
|
+
};
|
|
48
|
+
/** Escalation order for a tier: the table default first, then the policy order. */
|
|
49
|
+
const orderFor = (tier) => {
|
|
50
|
+
const rest = deps.escalationOrder ?? deps.adapters.map(a => a.providerId);
|
|
51
|
+
const ordered = [TABLE[tier], ...rest];
|
|
52
|
+
const seen = new Set();
|
|
53
|
+
return ordered.filter(p => {
|
|
54
|
+
const k = keyOf(p);
|
|
55
|
+
if (seen.has(k) || !adapters.has(k))
|
|
56
|
+
return false;
|
|
57
|
+
seen.add(k);
|
|
58
|
+
return true;
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
/** First not-down provider in escalation order; null when all are down. */
|
|
62
|
+
const resolveProvider = (tier) => orderFor(tier).find(p => !isDown(p)) ?? null;
|
|
63
|
+
const classifySafe = (req) => {
|
|
64
|
+
try {
|
|
65
|
+
return classifyRole(req);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// Fail SAFE: an unclassifiable request gets the critique tier — never a
|
|
69
|
+
// weaker one (spec 09, Eng). Surface the safe-default classification with
|
|
70
|
+
// the fallback flag so Observability sees the downgrade-avoidance (spec
|
|
71
|
+
// 09 §7 "Classifier call fails or times out" → route.classified(fallback=true)).
|
|
72
|
+
const tier = 'critique';
|
|
73
|
+
emit({ type: 'route.classified', taskId: req.taskId, tier, fallback: true });
|
|
74
|
+
return tier;
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
// Serialize the WHOLE request so the queued record is replayable — body.raw
|
|
78
|
+
// alone drops role, the stable prefix, the token estimate, and the paired
|
|
79
|
+
// generator, none of which can be reconstructed on resume (spec 09 §4, Eng-7).
|
|
80
|
+
const serializeRequest = (req) => {
|
|
81
|
+
const payload = {
|
|
82
|
+
taskId: req.taskId,
|
|
83
|
+
requestId: req.requestId,
|
|
84
|
+
role: req.role,
|
|
85
|
+
stablePrefix: Array.from(req.stablePrefix),
|
|
86
|
+
body: {
|
|
87
|
+
raw: Array.from(req.body.raw),
|
|
88
|
+
estimatedInputTokens: req.body.estimatedInputTokens,
|
|
89
|
+
},
|
|
90
|
+
...(req.pairedGeneratorProvider ? { pairedGeneratorProvider: req.pairedGeneratorProvider } : {}),
|
|
91
|
+
};
|
|
92
|
+
return new TextEncoder().encode(JSON.stringify(payload));
|
|
93
|
+
};
|
|
94
|
+
const allDown = (req) => {
|
|
95
|
+
queueStore.set(req.requestId, {
|
|
96
|
+
taskId: req.taskId,
|
|
97
|
+
requestId: req.requestId,
|
|
98
|
+
serializedRequest: serializeRequest(req),
|
|
99
|
+
queuedAt: Date.now(),
|
|
100
|
+
});
|
|
101
|
+
emit({ type: 'route.all_down_queued', taskId: req.taskId, requestId: req.requestId });
|
|
102
|
+
return { kind: 'all_providers_down', queuedRequestId: req.requestId };
|
|
103
|
+
};
|
|
104
|
+
return {
|
|
105
|
+
async classify(req) {
|
|
106
|
+
const tier = classifyRole(req);
|
|
107
|
+
emit({ type: 'route.classified', taskId: req.taskId, tier, fallback: false });
|
|
108
|
+
return tier;
|
|
109
|
+
},
|
|
110
|
+
// Route is code-only: nothing inside body.raw can influence the decision —
|
|
111
|
+
// the router never inspects the opaque request body (spec 09 §2).
|
|
112
|
+
async route(req) {
|
|
113
|
+
const tier = classifySafe(req);
|
|
114
|
+
// Fail closed when every provider is down — never hand back a known-down
|
|
115
|
+
// provider as a non-error decision (spec 09 §3/§7, Eng-7 terminal policy).
|
|
116
|
+
const provider = resolveProvider(tier);
|
|
117
|
+
if (!provider)
|
|
118
|
+
return allDown(req);
|
|
119
|
+
const decision = {
|
|
120
|
+
provider,
|
|
121
|
+
tier,
|
|
122
|
+
fromFallback: keyOf(provider) !== keyOf(TABLE[tier]),
|
|
123
|
+
cacheBreakpoints: MAX_CACHE_BREAKPOINTS,
|
|
124
|
+
};
|
|
125
|
+
emit({ type: 'route.resolved', taskId: req.taskId, decision });
|
|
126
|
+
return decision;
|
|
127
|
+
},
|
|
128
|
+
async dispatch(req) {
|
|
129
|
+
// Cold-start guard: refuse until the routing table / price sheet loads.
|
|
130
|
+
if (deps.ready === false)
|
|
131
|
+
return { kind: 'router_not_ready' };
|
|
132
|
+
// Stable-prefix contract (ADR-0019): the prefix is byte-stable per task;
|
|
133
|
+
// a mutated prefix is refused before any adapter call.
|
|
134
|
+
const actualHash = sha256(req.stablePrefix);
|
|
135
|
+
const expectedHash = prefixHashes.get(req.taskId);
|
|
136
|
+
if (expectedHash === undefined) {
|
|
137
|
+
prefixHashes.set(req.taskId, actualHash);
|
|
138
|
+
}
|
|
139
|
+
else if (expectedHash !== actualHash) {
|
|
140
|
+
emit({ type: 'cache.prefix_mismatch', taskId: req.taskId, expectedHash, actualHash });
|
|
141
|
+
return { kind: 'prefix_mutated', expectedHash, actualHash };
|
|
142
|
+
}
|
|
143
|
+
const tier = classifySafe(req);
|
|
144
|
+
let provider = resolveProvider(tier);
|
|
145
|
+
if (!provider)
|
|
146
|
+
return allDown(req);
|
|
147
|
+
// Judge-independence (Eng): the RUN-TIME resolved provider (including
|
|
148
|
+
// after fallback) must differ in family from the paired generator. The
|
|
149
|
+
// check runs both before the call AND after any within-loop fallback,
|
|
150
|
+
// because a fallback can land the judge on the generator's family
|
|
151
|
+
// (spec 09 §5 step 4 — "after the provider is resolved … including any
|
|
152
|
+
// fallback").
|
|
153
|
+
const judgeCollision = (p) => {
|
|
154
|
+
if (req.role === 'judge' && req.pairedGeneratorProvider &&
|
|
155
|
+
p.family === req.pairedGeneratorProvider.family) {
|
|
156
|
+
reviewQueue.set(req.requestId, req);
|
|
157
|
+
emit({ type: 'judge.collision_held', taskId: req.taskId, candidateId: req.requestId });
|
|
158
|
+
return { kind: 'judge_collision_held', candidateId: req.requestId };
|
|
159
|
+
}
|
|
160
|
+
return null;
|
|
161
|
+
};
|
|
162
|
+
const preCollision = judgeCollision(provider);
|
|
163
|
+
if (preCollision)
|
|
164
|
+
return preCollision;
|
|
165
|
+
// Budget ceiling enforced in code BEFORE dispatch (Eng-12).
|
|
166
|
+
const budget = budgets.get(req.taskId);
|
|
167
|
+
if (budget) {
|
|
168
|
+
// Both ceilings guard the SAME thing — the PROJECTED (post-call) total
|
|
169
|
+
// — so a call that *would* cross either ceiling is refused before it
|
|
170
|
+
// runs (spec 09 §4). The dollar side has no per-call dollar estimate, so
|
|
171
|
+
// it projects this call's cost from the realized rate ($/token so far)
|
|
172
|
+
// applied to the estimated input tokens, mirroring the token check.
|
|
173
|
+
const projectedTokens = budget.tokensSpent + req.body.estimatedInputTokens;
|
|
174
|
+
const pricePerToken = budget.tokensSpent > 0 ? budget.dollarsSpent / budget.tokensSpent : 0;
|
|
175
|
+
const projectedDollars = budget.dollarsSpent + req.body.estimatedInputTokens * pricePerToken;
|
|
176
|
+
if (projectedTokens > budget.tokenCeiling || projectedDollars > budget.dollarCeiling) {
|
|
177
|
+
emit({ type: 'budget.exceeded', taskId: req.taskId, budget });
|
|
178
|
+
return { kind: 'budget_exceeded', budget };
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// Single attempt per dispatch; the second consecutive error marks the
|
|
182
|
+
// provider down and escalates within this dispatch (hysteresis, ADR-0018).
|
|
183
|
+
for (;;) {
|
|
184
|
+
const adapter = adapters.get(keyOf(provider));
|
|
185
|
+
try {
|
|
186
|
+
const result = await adapter.call(req);
|
|
187
|
+
recordSuccess(provider);
|
|
188
|
+
// Cost telemetry (ADR-0036): on EVERY successful dispatch, emit the
|
|
189
|
+
// per-call charge for the RESOLVED provider (after any fallback) —
|
|
190
|
+
// independent of whether a TaskBudget is configured (spec 09 §5,
|
|
191
|
+
// AC-09-19).
|
|
192
|
+
emit({
|
|
193
|
+
type: 'provider.cost.charged',
|
|
194
|
+
taskId: req.taskId,
|
|
195
|
+
requestId: req.requestId,
|
|
196
|
+
tier,
|
|
197
|
+
tokens: result.inputTokens + result.outputTokens,
|
|
198
|
+
dollars: result.dollarsCharged,
|
|
199
|
+
});
|
|
200
|
+
if (budget) {
|
|
201
|
+
budget.tokensSpent += result.inputTokens + result.outputTokens;
|
|
202
|
+
budget.dollarsSpent += result.dollarsCharged;
|
|
203
|
+
emit({
|
|
204
|
+
type: 'budget.charged',
|
|
205
|
+
taskId: req.taskId,
|
|
206
|
+
requestId: req.requestId,
|
|
207
|
+
dollars: result.dollarsCharged,
|
|
208
|
+
tokens: result.inputTokens + result.outputTokens,
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
return result;
|
|
212
|
+
}
|
|
213
|
+
catch (err) {
|
|
214
|
+
const errorKind = (err.kind ?? 'server-error');
|
|
215
|
+
const count = recordError(provider);
|
|
216
|
+
if (count < HYSTERESIS_THRESHOLD) {
|
|
217
|
+
// A single transient error never flips the route.
|
|
218
|
+
return { kind: 'provider_error', providerId: provider, errorKind };
|
|
219
|
+
}
|
|
220
|
+
// Provider is down — escalate to the next available one.
|
|
221
|
+
const next = resolveProvider(tier);
|
|
222
|
+
if (!next)
|
|
223
|
+
return allDown(req);
|
|
224
|
+
emit({ type: 'route.fallback', taskId: req.taskId, from: provider, to: next });
|
|
225
|
+
provider = next;
|
|
226
|
+
// Re-run the run-time independence guard: the fallback may have landed
|
|
227
|
+
// the judge on the generator's family — hold instead of self-judging.
|
|
228
|
+
const postCollision = judgeCollision(provider);
|
|
229
|
+
if (postCollision)
|
|
230
|
+
return postCollision;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
},
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/provider/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
export type RouteTier = "reasoning" | "critique" | "routine";
|
|
2
|
+
export type ProviderFamily = "deepseek" | "anthropic" | "openai";
|
|
3
|
+
export type ProviderErrorKind = "rate-limit" | "server-error" | "timeout";
|
|
4
|
+
export interface ProviderId {
|
|
5
|
+
family: ProviderFamily;
|
|
6
|
+
model: string;
|
|
7
|
+
}
|
|
8
|
+
/** Opaque append-only conversation tail + tool definitions authored by Core. */
|
|
9
|
+
export interface RequestBody {
|
|
10
|
+
/** Serialised conversation tail; router must not inspect or mutate. */
|
|
11
|
+
raw: Uint8Array;
|
|
12
|
+
/** Estimated input token count for budget pre-check. */
|
|
13
|
+
estimatedInputTokens: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* A request handed in by Core (01) or Nightly (10).
|
|
17
|
+
* The prefix is already byte-stable; the router MUST NOT mutate it (ADR-0019).
|
|
18
|
+
*/
|
|
19
|
+
export interface ModelRequest {
|
|
20
|
+
taskId: string;
|
|
21
|
+
requestId: string;
|
|
22
|
+
role: "classifier" | "generator" | "judge" | "agent";
|
|
23
|
+
/** Byte-stable; cache-breakpoint layout is frozen by Core (ADR-0019). */
|
|
24
|
+
stablePrefix: Uint8Array;
|
|
25
|
+
body: RequestBody;
|
|
26
|
+
/** For judge calls: the provider actually used for the paired generator artifact. */
|
|
27
|
+
pairedGeneratorProvider?: ProviderId;
|
|
28
|
+
}
|
|
29
|
+
export interface ModelResult {
|
|
30
|
+
requestId: string;
|
|
31
|
+
provider: ProviderId;
|
|
32
|
+
content: string;
|
|
33
|
+
inputTokens: number;
|
|
34
|
+
outputTokens: number;
|
|
35
|
+
/** Actual dollar cost charged, computed from the resolved provider's price sheet. */
|
|
36
|
+
dollarsCharged: number;
|
|
37
|
+
}
|
|
38
|
+
export interface RouteDecision {
|
|
39
|
+
provider: ProviderId;
|
|
40
|
+
tier: RouteTier;
|
|
41
|
+
/** true if hysteresis escalated off the default provider (ADR-0018). */
|
|
42
|
+
fromFallback: boolean;
|
|
43
|
+
/** 0..4 cache breakpoints placed in the dispatched request (ADR-0019). */
|
|
44
|
+
cacheBreakpoints: number;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Per-provider error counter for the current session.
|
|
48
|
+
* Increments on 429 / 5xx / timeout; resets to 0 on any success.
|
|
49
|
+
* Fallback fires when consecutiveErrors reaches exactly 2.
|
|
50
|
+
*/
|
|
51
|
+
export interface HysteresisState {
|
|
52
|
+
provider: ProviderId;
|
|
53
|
+
consecutiveErrors: number;
|
|
54
|
+
}
|
|
55
|
+
/** Per-task token and dollar ceilings enforced in code across all calls. */
|
|
56
|
+
export interface TaskBudget {
|
|
57
|
+
taskId: string;
|
|
58
|
+
tokenCeiling: number;
|
|
59
|
+
dollarCeiling: number;
|
|
60
|
+
tokensSpent: number;
|
|
61
|
+
dollarsSpent: number;
|
|
62
|
+
}
|
|
63
|
+
export interface QueueRecord {
|
|
64
|
+
taskId: string;
|
|
65
|
+
requestId: string;
|
|
66
|
+
serializedRequest: Uint8Array;
|
|
67
|
+
queuedAt: number;
|
|
68
|
+
}
|
|
69
|
+
/** Session-start hash of the stable prefix used on every dispatch assertion. */
|
|
70
|
+
export interface PrefixContract {
|
|
71
|
+
sessionId: string;
|
|
72
|
+
/** Hex-encoded SHA-256 of stablePrefix bytes at session start. */
|
|
73
|
+
hash: string;
|
|
74
|
+
}
|
|
75
|
+
/** Narrow adapter contract — Eng-11 / Finding 4: swappable test double. */
|
|
76
|
+
export interface ProviderAdapter {
|
|
77
|
+
readonly providerId: ProviderId;
|
|
78
|
+
call(req: ModelRequest): Promise<ModelResult>;
|
|
79
|
+
}
|
|
80
|
+
/** Dependencies injected into makeModelRouter. */
|
|
81
|
+
export interface ModelRouterDeps {
|
|
82
|
+
adapters: ProviderAdapter[];
|
|
83
|
+
/** Resolution order for fallback escalation. Defaults to the fixed policy. */
|
|
84
|
+
escalationOrder?: ProviderId[];
|
|
85
|
+
/** Write-only sink for observability events (route.*, budget.*, judge.*, cache.*). */
|
|
86
|
+
emitEvent?: (event: RouterEvent) => void;
|
|
87
|
+
/** Mutable budget store; keyed by taskId. */
|
|
88
|
+
budgets?: Map<string, TaskBudget>;
|
|
89
|
+
/** Mutable hysteresis store; keyed by `${family}:${model}`. */
|
|
90
|
+
hysteresisStore?: Map<string, HysteresisState>;
|
|
91
|
+
/** Mutable queue for all-providers-down records; keyed by requestId. */
|
|
92
|
+
queueStore?: Map<string, QueueRecord>;
|
|
93
|
+
/** Human review staging queue for judge collisions. */
|
|
94
|
+
reviewQueue?: Map<string, ModelRequest>;
|
|
95
|
+
/** Whether the router is ready to dispatch (cold-start guard). */
|
|
96
|
+
ready?: boolean;
|
|
97
|
+
}
|
|
98
|
+
export interface ModelRouter {
|
|
99
|
+
classify(req: ModelRequest): Promise<RouteTier>;
|
|
100
|
+
/**
|
|
101
|
+
* Resolves the tier → provider decision. Fails closed: when every provider in
|
|
102
|
+
* the escalation chain is down, returns the same all-providers-down terminal
|
|
103
|
+
* policy as dispatch() rather than handing back a known-down provider.
|
|
104
|
+
*/
|
|
105
|
+
route(req: ModelRequest): Promise<RouteDecision | DispatchError>;
|
|
106
|
+
dispatch(req: ModelRequest): Promise<ModelResult | DispatchError>;
|
|
107
|
+
}
|
|
108
|
+
/** Alias for the routing table + escalation constants — config-level concept. */
|
|
109
|
+
export type RoutingPolicy = {
|
|
110
|
+
readonly table: Readonly<Record<RouteTier, ProviderId>>;
|
|
111
|
+
readonly escalationOrder: readonly ProviderId[];
|
|
112
|
+
readonly hysteresisThreshold: number;
|
|
113
|
+
readonly maxCacheBreakpoints: number;
|
|
114
|
+
};
|
|
115
|
+
export type DispatchError = {
|
|
116
|
+
kind: "budget_exceeded";
|
|
117
|
+
budget: TaskBudget;
|
|
118
|
+
} | {
|
|
119
|
+
kind: "all_providers_down";
|
|
120
|
+
queuedRequestId: string;
|
|
121
|
+
} | {
|
|
122
|
+
kind: "judge_collision_held";
|
|
123
|
+
candidateId: string;
|
|
124
|
+
} | {
|
|
125
|
+
kind: "prefix_mutated";
|
|
126
|
+
expectedHash: string;
|
|
127
|
+
actualHash: string;
|
|
128
|
+
} | {
|
|
129
|
+
kind: "router_not_ready";
|
|
130
|
+
} | {
|
|
131
|
+
kind: "provider_error";
|
|
132
|
+
providerId: ProviderId;
|
|
133
|
+
errorKind: ProviderErrorKind;
|
|
134
|
+
};
|
|
135
|
+
export type RouterEvent = {
|
|
136
|
+
type: "route.classified";
|
|
137
|
+
taskId: string;
|
|
138
|
+
tier: RouteTier;
|
|
139
|
+
fallback: boolean;
|
|
140
|
+
} | {
|
|
141
|
+
type: "route.resolved";
|
|
142
|
+
taskId: string;
|
|
143
|
+
decision: RouteDecision;
|
|
144
|
+
} | {
|
|
145
|
+
type: "route.fallback";
|
|
146
|
+
taskId: string;
|
|
147
|
+
from: ProviderId;
|
|
148
|
+
to: ProviderId;
|
|
149
|
+
} | {
|
|
150
|
+
type: "route.all_down_queued";
|
|
151
|
+
taskId: string;
|
|
152
|
+
requestId: string;
|
|
153
|
+
} | {
|
|
154
|
+
type: "provider.cost.charged";
|
|
155
|
+
taskId: string;
|
|
156
|
+
requestId: string;
|
|
157
|
+
tier: RouteTier;
|
|
158
|
+
tokens: number;
|
|
159
|
+
dollars: number;
|
|
160
|
+
} | {
|
|
161
|
+
type: "budget.charged";
|
|
162
|
+
taskId: string;
|
|
163
|
+
requestId: string;
|
|
164
|
+
dollars: number;
|
|
165
|
+
tokens: number;
|
|
166
|
+
} | {
|
|
167
|
+
type: "budget.exceeded";
|
|
168
|
+
taskId: string;
|
|
169
|
+
budget: TaskBudget;
|
|
170
|
+
} | {
|
|
171
|
+
type: "judge.collision_held";
|
|
172
|
+
taskId: string;
|
|
173
|
+
candidateId: string;
|
|
174
|
+
} | {
|
|
175
|
+
type: "cache.prefix_mismatch";
|
|
176
|
+
taskId: string;
|
|
177
|
+
expectedHash: string;
|
|
178
|
+
actualHash: string;
|
|
179
|
+
};
|
|
180
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/provider/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/provider/types.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,0CAA0C"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { AgentCard } from '../orchestration/index.js';
|
|
2
|
+
export interface CardResolver {
|
|
3
|
+
resolve(name: string): AgentCard | undefined;
|
|
4
|
+
names(): string[];
|
|
5
|
+
}
|
|
6
|
+
export declare const DEFAULT_GENERAL_CARD: AgentCard;
|
|
7
|
+
export declare function parseAgentCard(text: string): AgentCard;
|
|
8
|
+
export declare function makeCardResolver(deps: {
|
|
9
|
+
dir: string;
|
|
10
|
+
exists: (path: string) => boolean;
|
|
11
|
+
readDir: (dir: string) => string[];
|
|
12
|
+
readFile: (path: string) => string;
|
|
13
|
+
}): CardResolver;
|
|
14
|
+
//# sourceMappingURL=agent-cards.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-cards.d.ts","sourceRoot":"","sources":["../../src/runtime/agent-cards.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAE1D,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAA;IAC5C,KAAK,IAAI,MAAM,EAAE,CAAA;CAClB;AAED,eAAO,MAAM,oBAAoB,EAAE,SASpB,CAAA;AAwBf,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAwBtD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IACrC,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;IACjC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,EAAE,CAAA;IAClC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;CACnC,GAAG,YAAY,CAoBf"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
// AgentCard loader (runtime, ADR-0039/0052).
|
|
2
|
+
//
|
|
3
|
+
// Loads sub-agent capability cards from .aisy/agents/*.md (YAML frontmatter +
|
|
4
|
+
// Markdown body) and always offers a bundled read-only general card so
|
|
5
|
+
// delegation works out of the box. The card is the SOLE capability authority —
|
|
6
|
+
// the model cannot widen tools/skills/MCP beyond what its card declares.
|
|
7
|
+
export const DEFAULT_GENERAL_CARD = Object.freeze({
|
|
8
|
+
name: 'general',
|
|
9
|
+
description: 'Read-only general worker (search, read, list).',
|
|
10
|
+
skills: [],
|
|
11
|
+
mcpAllowlist: [],
|
|
12
|
+
toolTiers: Object.freeze({ read_file: 1, list_dir: 1, search_memory: 1 }),
|
|
13
|
+
maxIterations: 12,
|
|
14
|
+
contextStrategy: 'compact',
|
|
15
|
+
provenance: 'builtin',
|
|
16
|
+
});
|
|
17
|
+
function stripQuotes(s) {
|
|
18
|
+
const t = s.trim();
|
|
19
|
+
return (t.startsWith('"') && t.endsWith('"')) || (t.startsWith("'") && t.endsWith("'")) ? t.slice(1, -1) : t;
|
|
20
|
+
}
|
|
21
|
+
function parseList(v) {
|
|
22
|
+
const inner = v.trim().replace(/^\[/, '').replace(/\]$/, '').trim();
|
|
23
|
+
if (inner.length === 0)
|
|
24
|
+
return [];
|
|
25
|
+
return inner.split(',').map((x) => stripQuotes(x)).filter((x) => x.length > 0);
|
|
26
|
+
}
|
|
27
|
+
function parseRecord(v) {
|
|
28
|
+
const inner = v.trim().replace(/^\{/, '').replace(/\}$/, '').trim();
|
|
29
|
+
const out = {};
|
|
30
|
+
if (inner.length === 0)
|
|
31
|
+
return out;
|
|
32
|
+
for (const pair of inner.split(',')) {
|
|
33
|
+
const [k, val] = pair.split(':');
|
|
34
|
+
if (k && val !== undefined)
|
|
35
|
+
out[stripQuotes(k)] = Number(val.trim());
|
|
36
|
+
}
|
|
37
|
+
return out;
|
|
38
|
+
}
|
|
39
|
+
export function parseAgentCard(text) {
|
|
40
|
+
const m = /^---\n([\s\S]*?)\n---/.exec(text);
|
|
41
|
+
if (!m || !m[1])
|
|
42
|
+
throw new Error('agent card: missing YAML frontmatter');
|
|
43
|
+
const fm = {};
|
|
44
|
+
for (const line of m[1].split('\n')) {
|
|
45
|
+
const idx = line.indexOf(':');
|
|
46
|
+
if (idx < 0)
|
|
47
|
+
continue;
|
|
48
|
+
fm[line.slice(0, idx).trim()] = line.slice(idx + 1).trim();
|
|
49
|
+
}
|
|
50
|
+
const name = fm['name'] ? stripQuotes(fm['name']) : '';
|
|
51
|
+
if (name.length === 0)
|
|
52
|
+
throw new Error('agent card: name is required');
|
|
53
|
+
const ctx = fm['context_strategy'] ? stripQuotes(fm['context_strategy']) : 'compact';
|
|
54
|
+
const prov = fm['provenance'] ? stripQuotes(fm['provenance']) : 'user';
|
|
55
|
+
const card = {
|
|
56
|
+
name,
|
|
57
|
+
...(fm['description'] ? { description: stripQuotes(fm['description']) } : {}),
|
|
58
|
+
skills: fm['skills'] ? parseList(fm['skills']) : [],
|
|
59
|
+
mcpAllowlist: fm['mcp_allowlist'] ? parseList(fm['mcp_allowlist']) : [],
|
|
60
|
+
toolTiers: fm['tool_tiers'] ? parseRecord(fm['tool_tiers']) : {},
|
|
61
|
+
maxIterations: fm['max_iterations'] ? Number(fm['max_iterations']) : 12,
|
|
62
|
+
contextStrategy: ctx === 'full' ? 'full' : 'compact',
|
|
63
|
+
provenance: prov === 'builtin' ? 'builtin' : prov === 'community' ? 'community' : 'user',
|
|
64
|
+
};
|
|
65
|
+
return card;
|
|
66
|
+
}
|
|
67
|
+
export function makeCardResolver(deps) {
|
|
68
|
+
const cards = new Map();
|
|
69
|
+
if (deps.exists(deps.dir)) {
|
|
70
|
+
for (const f of deps.readDir(deps.dir)) {
|
|
71
|
+
if (!f.endsWith('.md'))
|
|
72
|
+
continue;
|
|
73
|
+
try {
|
|
74
|
+
const card = parseAgentCard(deps.readFile(`${deps.dir}/${f}`));
|
|
75
|
+
cards.set(card.name, card);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// skip malformed card; the default remains available
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// The built-in general card is reserved + read-only: it always wins, so a user
|
|
83
|
+
// file named general.md cannot shadow it with elevated tools (ADR-0052).
|
|
84
|
+
cards.set(DEFAULT_GENERAL_CARD.name, DEFAULT_GENERAL_CARD);
|
|
85
|
+
return {
|
|
86
|
+
resolve: (name) => cards.get(name),
|
|
87
|
+
names: () => [...cards.keys()],
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=agent-cards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-cards.js","sourceRoot":"","sources":["../../src/runtime/agent-cards.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { GrantStore, SandboxSecurityLevel } from '../safety/index.js';
|
|
2
|
+
import { type ApprovalDecision } from './hook-gate.js';
|
|
3
|
+
import type { Clock, ProviderAdapter, MemoryPort, LoopGuardian, SessionLog, ToolCall, TurnInput, TurnResult } from '../agent-loop/types.js';
|
|
4
|
+
import type { PendingAction } from '../gateway/index.js';
|
|
5
|
+
export interface AgentRunnerDeps {
|
|
6
|
+
provider: ProviderAdapter;
|
|
7
|
+
memory: MemoryPort;
|
|
8
|
+
grants: GrantStore;
|
|
9
|
+
executeTool: (call: ToolCall) => unknown | Promise<unknown>;
|
|
10
|
+
/** Human approval round-trip — the transport issues a card and awaits the tap. */
|
|
11
|
+
approve: (action: PendingAction) => Promise<ApprovalDecision>;
|
|
12
|
+
guardian: LoopGuardian;
|
|
13
|
+
sessionLog: SessionLog;
|
|
14
|
+
clock?: Clock;
|
|
15
|
+
sandboxSecurityLevel?: SandboxSecurityLevel;
|
|
16
|
+
maxReplans?: number;
|
|
17
|
+
maxTotalToolCalls?: number;
|
|
18
|
+
/** Mid-turn budget probe forwarded to the loop (ADR-0051). */
|
|
19
|
+
budgetCheck?: (usage: {
|
|
20
|
+
sessionId: string;
|
|
21
|
+
inputTokens: number;
|
|
22
|
+
outputTokens: number;
|
|
23
|
+
dollars: number;
|
|
24
|
+
}) => boolean | Promise<boolean>;
|
|
25
|
+
}
|
|
26
|
+
export interface AgentRunner {
|
|
27
|
+
handle(input: TurnInput): Promise<TurnResult>;
|
|
28
|
+
}
|
|
29
|
+
export declare function makeAgentRunner(deps: AgentRunnerDeps): AgentRunner;
|
|
30
|
+
//# sourceMappingURL=agent-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-runner.d.ts","sourceRoot":"","sources":["../../src/runtime/agent-runner.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAC1E,OAAO,EAAgB,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAEpE,OAAO,KAAK,EAEV,KAAK,EACL,eAAe,EACf,UAAU,EACV,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,SAAS,EACT,UAAU,EACX,MAAM,wBAAwB,CAAA;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAExD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,eAAe,CAAA;IACzB,MAAM,EAAE,UAAU,CAAA;IAClB,MAAM,EAAE,UAAU,CAAA;IAClB,WAAW,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC3D,kFAAkF;IAClF,OAAO,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAA;IAC7D,QAAQ,EAAE,YAAY,CAAA;IACtB,UAAU,EAAE,UAAU,CAAA;IACtB,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,oBAAoB,CAAC,EAAE,oBAAoB,CAAA;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,8DAA8D;IAC9D,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE;QACpB,SAAS,EAAE,MAAM,CAAA;QACjB,WAAW,EAAE,MAAM,CAAA;QACnB,YAAY,EAAE,MAAM,CAAA;QACpB,OAAO,EAAE,MAAM,CAAA;KAChB,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CACjC;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;CAC9C;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,eAAe,GAAG,WAAW,CA4BlE"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Composition root (runtime).
|
|
2
|
+
//
|
|
3
|
+
// Wires the safety-critical core into one runnable agent: SafetyPolicy + the
|
|
4
|
+
// grant store + the HookGate (approval round-trip) feed the agent loop, which
|
|
5
|
+
// drives the provider and tool execution. Everything that touches the outside
|
|
6
|
+
// world — the LLM provider, tool implementations, the human approval port,
|
|
7
|
+
// memory, guardian, session log — is injected, so this stays pure and testable
|
|
8
|
+
// and the transport (Telegram) lives outside, in the app package.
|
|
9
|
+
import { makeSafetyPolicy } from '../safety/index.js';
|
|
10
|
+
import { makeHookGate } from './hook-gate.js';
|
|
11
|
+
import { makeAgentLoop } from '../agent-loop/index.js';
|
|
12
|
+
export function makeAgentRunner(deps) {
|
|
13
|
+
const clock = deps.clock ?? { now: () => new Date().toISOString() };
|
|
14
|
+
const safety = makeSafetyPolicy({
|
|
15
|
+
grants: deps.grants,
|
|
16
|
+
...(deps.sandboxSecurityLevel !== undefined
|
|
17
|
+
? { sandboxSecurityLevel: deps.sandboxSecurityLevel }
|
|
18
|
+
: {}),
|
|
19
|
+
});
|
|
20
|
+
const hookGate = makeHookGate({ safety, grants: deps.grants, approve: deps.approve });
|
|
21
|
+
const loop = makeAgentLoop({
|
|
22
|
+
clock,
|
|
23
|
+
provider: deps.provider,
|
|
24
|
+
hookGate,
|
|
25
|
+
memory: deps.memory,
|
|
26
|
+
guardian: deps.guardian,
|
|
27
|
+
sessionLog: deps.sessionLog,
|
|
28
|
+
executeTool: deps.executeTool,
|
|
29
|
+
...(deps.maxReplans !== undefined ? { maxReplans: deps.maxReplans } : {}),
|
|
30
|
+
...(deps.maxTotalToolCalls !== undefined ? { maxTotalToolCalls: deps.maxTotalToolCalls } : {}),
|
|
31
|
+
...(deps.budgetCheck !== undefined ? { budgetCheck: deps.budgetCheck } : {}),
|
|
32
|
+
});
|
|
33
|
+
return {
|
|
34
|
+
handle: (input) => loop.runTurn(input),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=agent-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-runner.js","sourceRoot":"","sources":["../../src/runtime/agent-runner.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,EAAE;AACF,6EAA6E;AAC7E,8EAA8E;AAC9E,8EAA8E;AAC9E,2EAA2E;AAC3E,+EAA+E;AAC/E,kEAAkE;AAElE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAErD,OAAO,EAAE,YAAY,EAAyB,MAAM,gBAAgB,CAAA;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAwCtD,MAAM,UAAU,eAAe,CAAC,IAAqB;IACnD,MAAM,KAAK,GAAU,IAAI,CAAC,KAAK,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAA;IAE1E,MAAM,MAAM,GAAG,gBAAgB,CAAC;QAC9B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,GAAG,CAAC,IAAI,CAAC,oBAAoB,KAAK,SAAS;YACzC,CAAC,CAAC,EAAE,oBAAoB,EAAE,IAAI,CAAC,oBAAoB,EAAE;YACrD,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAA;IAEF,MAAM,QAAQ,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;IAErF,MAAM,IAAI,GAAc,aAAa,CAAC;QACpC,KAAK;QACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,QAAQ;QACR,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,GAAG,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,GAAG,CAAC,IAAI,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9F,GAAG,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7E,CAAC,CAAA;IAEF,OAAO;QACL,MAAM,EAAE,CAAC,KAAgB,EAAuB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;KACvE,CAAA;AACH,CAAC"}
|