@agenticprimitives/model-gateway 0.0.0-alpha.0 → 0.0.0-stage

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.
Files changed (48) hide show
  1. package/README.md +2 -28
  2. package/package.json +4 -30
  3. package/LICENSE +0 -21
  4. package/dist/adapters/anthropic.d.ts +0 -13
  5. package/dist/adapters/anthropic.d.ts.map +0 -1
  6. package/dist/adapters/anthropic.js +0 -59
  7. package/dist/adapters/anthropic.js.map +0 -1
  8. package/dist/adapters/openai-compat.d.ts +0 -17
  9. package/dist/adapters/openai-compat.d.ts.map +0 -1
  10. package/dist/adapters/openai-compat.js +0 -66
  11. package/dist/adapters/openai-compat.js.map +0 -1
  12. package/dist/budget.d.ts +0 -86
  13. package/dist/budget.d.ts.map +0 -1
  14. package/dist/budget.js +0 -98
  15. package/dist/budget.js.map +0 -1
  16. package/dist/contract.d.ts +0 -268
  17. package/dist/contract.d.ts.map +0 -1
  18. package/dist/contract.js +0 -128
  19. package/dist/contract.js.map +0 -1
  20. package/dist/handler.d.ts +0 -24
  21. package/dist/handler.d.ts.map +0 -1
  22. package/dist/handler.js +0 -124
  23. package/dist/handler.js.map +0 -1
  24. package/dist/index.d.ts +0 -20
  25. package/dist/index.d.ts.map +0 -1
  26. package/dist/index.js +0 -13
  27. package/dist/index.js.map +0 -1
  28. package/dist/openai-compat/translate.d.ts +0 -122
  29. package/dist/openai-compat/translate.d.ts.map +0 -1
  30. package/dist/openai-compat/translate.js +0 -72
  31. package/dist/openai-compat/translate.js.map +0 -1
  32. package/dist/ops.d.ts +0 -6
  33. package/dist/ops.d.ts.map +0 -1
  34. package/dist/ops.js +0 -38
  35. package/dist/ops.js.map +0 -1
  36. package/dist/policy.d.ts +0 -26
  37. package/dist/policy.d.ts.map +0 -1
  38. package/dist/policy.js +0 -83
  39. package/dist/policy.js.map +0 -1
  40. package/dist/ports.d.ts +0 -95
  41. package/dist/ports.d.ts.map +0 -1
  42. package/dist/ports.js +0 -43
  43. package/dist/ports.js.map +0 -1
  44. package/dist/usage.d.ts +0 -23
  45. package/dist/usage.d.ts.map +0 -1
  46. package/dist/usage.js +0 -16
  47. package/dist/usage.js.map +0 -1
  48. package/spec.md +0 -7
package/dist/index.js DELETED
@@ -1,13 +0,0 @@
1
- // @agenticprimitives/model-gateway — spec 434: the contract, the policy, the budget algebra, the usage normalizer, the
2
- // adapters and the handler the town's inference Worker mounts. No deployed infra, no provider SDK, no vendor named.
3
- export { PACKAGE_NAME, PACKAGE_STATUS, SPEC_REF, FALLBACK_CLASSES, isRefusal, catalogKey, canonicalJson, digestOf, profileVersion, validateProfile, validateCatalogEntry, validateEntitlement, validateGenerateRequest, } from './contract.js';
4
- export { decidePolicy, limitsFor, profilesEmptiedBy, DEFAULT_MAX_ATTEMPTS } from './policy.js';
5
- export { reserve, settle, expire, stale, rollDay, rebuildFromReceipts, utilisation, emptyBudget, estimateTokens, estimateCostMicroUsd, costMicroUsd, dayOf, minuteOf } from './budget.js';
6
- export { normalizeAnthropicUsage, normalizeOpenAiUsage, UNKNOWN_USAGE } from './usage.js';
7
- export { ProviderFailure, classifyStatus, classifyError } from './ports.js';
8
- export { createGatewayHandler } from './handler.js';
9
- export { anthropicAdapter, foldForAnthropic } from './adapters/anthropic.js';
10
- export { openAiCompatAdapter, foldForOpenAi, parseToolCalls } from './adapters/openai-compat.js';
11
- export { chatRequestToGenerate, generateToChatCompletion, refusalToChatError, streamEventToChatChunks } from './openai-compat/translate.js';
12
- export { summarizeReceipts } from './ops.js';
13
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,uHAAuH;AACvH,oHAAoH;AACpH,OAAO,EACL,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,gBAAgB,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EACxH,eAAe,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,uBAAuB,GACpF,MAAM,eAAe,CAAC;AAMvB,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAE/F,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,oBAAoB,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE1L,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE1F,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE7E,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAEjG,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAE5I,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC"}
@@ -1,122 +0,0 @@
1
- import type { GenerateRequestV1, GenerateResponseV1, GatewayRefusalV1, StreamEventV1 } from '../contract.js';
2
- export interface ChatCompletionRequest {
3
- model: string;
4
- messages: Array<{
5
- role: string;
6
- content: string | Array<{
7
- type: string;
8
- text?: string;
9
- }> | null;
10
- tool_call_id?: string;
11
- name?: string;
12
- tool_calls?: Array<{
13
- id?: string;
14
- type?: string;
15
- function: {
16
- name: string;
17
- arguments: string;
18
- };
19
- }>;
20
- }>;
21
- tools?: Array<{
22
- type: 'function';
23
- function: {
24
- name: string;
25
- description?: string;
26
- parameters?: Record<string, unknown>;
27
- };
28
- }>;
29
- tool_choice?: 'none' | 'auto' | 'required' | {
30
- type: 'function';
31
- function: {
32
- name: string;
33
- };
34
- };
35
- max_tokens?: number;
36
- max_completion_tokens?: number;
37
- temperature?: number;
38
- stream?: boolean;
39
- stream_options?: {
40
- include_usage?: boolean;
41
- };
42
- user?: string;
43
- /** Agentic Primitives extension: run attribution. Everything here is ASSERTED. */
44
- metadata?: {
45
- run_ref?: string;
46
- step_ref?: string;
47
- agent?: string;
48
- purpose?: string;
49
- };
50
- }
51
- export type TranslateResult = {
52
- ok: true;
53
- request: GenerateRequestV1;
54
- } | {
55
- ok: false;
56
- status: number;
57
- error: {
58
- message: string;
59
- type: string;
60
- code: string;
61
- };
62
- };
63
- export declare function chatRequestToGenerate(body: unknown, opts?: {
64
- purpose?: string;
65
- }): TranslateResult;
66
- export interface ChatCompletionResponse {
67
- id: string;
68
- object: 'chat.completion';
69
- created: number;
70
- model: string;
71
- choices: Array<{
72
- index: number;
73
- message: {
74
- role: 'assistant';
75
- content: string | null;
76
- tool_calls?: Array<{
77
- id: string;
78
- type: 'function';
79
- function: {
80
- name: string;
81
- arguments: string;
82
- };
83
- }>;
84
- };
85
- finish_reason: 'stop' | 'length' | 'tool_calls' | 'content_filter';
86
- }>;
87
- usage: {
88
- prompt_tokens: number;
89
- completion_tokens: number;
90
- total_tokens: number;
91
- prompt_tokens_details?: {
92
- cached_tokens: number;
93
- };
94
- completion_tokens_details?: {
95
- reasoning_tokens: number;
96
- };
97
- };
98
- /** Agentic Primitives extension: the receipt that answers for this completion. */
99
- ap_receipt: GenerateResponseV1['receipt'];
100
- }
101
- export declare function generateToChatCompletion(res: GenerateResponseV1, opts?: {
102
- created?: number;
103
- }): ChatCompletionResponse;
104
- /** The OpenAI error envelope for a gateway refusal, with the status the reason implies. */
105
- export declare function refusalToChatError(r: GatewayRefusalV1): {
106
- status: number;
107
- body: {
108
- error: {
109
- message: string;
110
- type: string;
111
- code: string;
112
- ap_receipts?: string[];
113
- };
114
- };
115
- };
116
- /** One SSE chunk line per stream event; the `done` event yields the final chunk with usage, then `[DONE]`. */
117
- export declare function streamEventToChatChunks(e: StreamEventV1, ctx: {
118
- id: string;
119
- profile: string;
120
- created: number;
121
- }): string[];
122
- //# sourceMappingURL=translate.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"translate.d.ts","sourceRoot":"","sources":["../../src/openai-compat/translate.ts"],"names":[],"mappings":"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"}
@@ -1,72 +0,0 @@
1
- const contentText = (c) => typeof c === 'string' ? c : Array.isArray(c) ? c.map((p) => (p.type === 'text' ? p.text ?? '' : '')).join('') : '';
2
- export function chatRequestToGenerate(body, opts = {}) {
3
- const b = (body ?? {});
4
- const bad = (message, code = 'invalid_request_error') => ({ ok: false, status: 400, error: { message, type: 'invalid_request_error', code } });
5
- if (typeof b.model !== 'string' || !b.model)
6
- return bad('`model` is required and names a PROFILE (planner-fast, composer-default, …), never a provider model');
7
- if (/[\/:]/.test(b.model) || /^(gpt|claude|gemini|llama|grok|mistral|deepseek|qwen|o[0-9])[-_.0-9]/i.test(b.model))
8
- return bad(`\`model\` names a profile here; "${b.model}" looks like a provider model. GET /v1/models lists the profiles this credential may use.`, 'model_not_found');
9
- if (!Array.isArray(b.messages) || b.messages.length === 0)
10
- return bad('`messages` must be a non-empty array');
11
- const messages = [];
12
- for (const m of b.messages) {
13
- const role = m.role;
14
- if (role === 'system' || role === 'developer')
15
- messages.push({ role: 'system', content: contentText(m.content) });
16
- else if (role === 'user')
17
- messages.push({ role: 'user', content: contentText(m.content) });
18
- else if (role === 'assistant')
19
- messages.push({ role: 'assistant', content: contentText(m.content), ...(m.tool_calls?.length ? { toolCalls: m.tool_calls.map((c) => { let args = {}; try {
20
- args = JSON.parse(c.function.arguments || '{}');
21
- }
22
- catch {
23
- args = { _raw: c.function.arguments };
24
- } return { ...(c.id ? { id: c.id } : {}), name: c.function.name, args }; }) } : {}) });
25
- else if (role === 'tool') {
26
- if (!m.tool_call_id)
27
- return bad('a `tool` message needs `tool_call_id`');
28
- messages.push({ role: 'tool', content: contentText(m.content), toolCallId: m.tool_call_id });
29
- }
30
- else
31
- return bad(`unknown message role "${String(role)}"`);
32
- }
33
- const tools = b.tools?.map((t) => ({ name: t.function.name, ...(t.function.description ? { description: t.function.description } : {}), inputSchema: t.function.parameters ?? { type: 'object', properties: {} } }));
34
- const toolChoice = b.tool_choice === undefined ? undefined : typeof b.tool_choice === 'string' ? b.tool_choice : { name: b.tool_choice.function.name };
35
- const max = b.max_completion_tokens ?? b.max_tokens;
36
- const md = b.metadata ?? {};
37
- return {
38
- ok: true,
39
- request: {
40
- profile: b.model, messages, ...(tools ? { tools } : {}), ...(toolChoice ? { toolChoice } : {}), ...(typeof max === 'number' && max > 0 ? { maxOutputTokens: max } : {}),
41
- ...(typeof b.temperature === 'number' ? { temperature: b.temperature } : {}), ...(b.stream ? { stream: true } : {}),
42
- context: { purpose: md.purpose ?? opts.purpose ?? 'chat', ...(md.run_ref ? { runRef: md.run_ref } : {}), ...(md.step_ref ? { stepRef: md.step_ref } : {}), ...(md.agent && /^0x[0-9a-fA-F]{40}$/.test(md.agent) ? { agent: md.agent } : {}) },
43
- },
44
- };
45
- }
46
- const finishOf = (s) => (s === 'tool' ? 'tool_calls' : s === 'length' ? 'length' : s === 'filtered' ? 'content_filter' : 'stop');
47
- const usageOf = (u) => ({ prompt_tokens: u.tokensIn, completion_tokens: u.tokensOut, total_tokens: u.tokensIn + u.tokensOut, ...(u.cachedIn ? { prompt_tokens_details: { cached_tokens: u.cachedIn } } : {}), ...(u.reasoningOut ? { completion_tokens_details: { reasoning_tokens: u.reasoningOut } } : {}) });
48
- export function generateToChatCompletion(res, opts = {}) {
49
- return {
50
- id: `chatcmpl-${res.receipt.id}`, object: 'chat.completion', created: opts.created ?? Math.floor(Date.now() / 1000), model: res.receipt.profile,
51
- choices: [{ index: 0, message: { role: 'assistant', content: res.content || (res.toolCalls.length ? null : ''), ...(res.toolCalls.length ? { tool_calls: res.toolCalls.map((c, i) => ({ id: c.id ?? `call_${res.receipt.id}_${i}`, type: 'function', function: { name: c.name, arguments: JSON.stringify(c.args) } })) } : {}) }, finish_reason: finishOf(res.stopReason) }],
52
- usage: usageOf(res.usage), ap_receipt: res.receipt,
53
- };
54
- }
55
- /** The OpenAI error envelope for a gateway refusal, with the status the reason implies. */
56
- export function refusalToChatError(r) {
57
- const status = r.reason === 'unknown_caller' ? 401 : r.reason === 'not_entitled' ? 403 : r.reason === 'unknown_profile' ? 404 : r.reason === 'over_budget' ? 429 : r.reason === 'invalid_request' ? 400 : r.reason === 'profile_unavailable' ? 503 : r.failureClass === 'rate-limited' ? 429 : r.failureClass === 'timeout' ? 504 : 502;
58
- const type = status === 401 ? 'authentication_error' : status === 403 ? 'permission_error' : status === 404 ? 'not_found_error' : status === 429 ? 'rate_limit_error' : status === 400 ? 'invalid_request_error' : 'server_error';
59
- return { status, body: { error: { message: r.detail, type, code: r.reason, ...(r.receiptIds?.length ? { ap_receipts: r.receiptIds } : {}) } } };
60
- }
61
- /** One SSE chunk line per stream event; the `done` event yields the final chunk with usage, then `[DONE]`. */
62
- export function streamEventToChatChunks(e, ctx) {
63
- const chunk = (delta, finish, usage, extra) => `data: ${JSON.stringify({ id: `chatcmpl-${ctx.id}`, object: 'chat.completion.chunk', created: ctx.created, model: ctx.profile, choices: [{ index: 0, delta, finish_reason: finish }], ...(usage ? { usage } : {}), ...(extra ?? {}) })}\n\n`;
64
- if (e.type === 'delta')
65
- return [chunk({ role: 'assistant', content: e.text }, null)];
66
- if (e.type === 'tool_call')
67
- return [chunk({ tool_calls: [{ index: 0, ...(e.call.id ? { id: e.call.id } : {}), type: 'function', function: { name: e.call.name, arguments: JSON.stringify(e.call.args) } }] }, null)];
68
- if (e.type === 'done')
69
- return [chunk({}, finishOf(e.response.stopReason), usageOf(e.response.usage), { ap_receipt: e.response.receipt }), 'data: [DONE]\n\n'];
70
- return [`data: ${JSON.stringify({ error: { message: e.message, type: 'server_error', code: e.failureClass ?? 'error' } })}\n\n`, 'data: [DONE]\n\n'];
71
- }
72
- //# sourceMappingURL=translate.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"translate.js","sourceRoot":"","sources":["../../src/openai-compat/translate.ts"],"names":[],"mappings":"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"}
package/dist/ops.d.ts DELETED
@@ -1,6 +0,0 @@
1
- import type { InferenceOpsSummaryV1, InferenceReceiptV1 } from './contract.js';
2
- export declare function summarizeReceipts(receipts: readonly InferenceReceiptV1[], window: {
3
- from: string;
4
- to: string;
5
- }): InferenceOpsSummaryV1;
6
- //# sourceMappingURL=ops.d.ts.map
package/dist/ops.d.ts.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"ops.d.ts","sourceRoot":"","sources":["../src/ops.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAuB,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAwBpG,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,SAAS,kBAAkB,EAAE,EAAE,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG,qBAAqB,CAatI"}
package/dist/ops.js DELETED
@@ -1,38 +0,0 @@
1
- const percentile = (sorted, p) => (sorted.length ? sorted[Math.min(sorted.length - 1, Math.max(0, Math.ceil((p / 100) * sorted.length) - 1))] : 0);
2
- function slice(key, rs) {
3
- const lat = rs.filter((r) => r.outcome === 'answered').map((r) => r.latencyMs).sort((a, b) => a - b);
4
- return {
5
- key, requests: rs.length,
6
- answered: rs.filter((r) => r.outcome === 'answered').length,
7
- failed: rs.filter((r) => r.outcome === 'failed').length,
8
- refused: rs.filter((r) => r.outcome === 'refused').length,
9
- tokensIn: rs.reduce((n, r) => n + r.usage.tokensIn, 0),
10
- tokensOut: rs.reduce((n, r) => n + r.usage.tokensOut, 0),
11
- costMicroUsd: rs.reduce((n, r) => n + r.costMicroUsd, 0),
12
- fallbacks: rs.filter((r) => !!r.fallbackOf).length,
13
- latencyP50Ms: percentile(lat, 50), latencyP95Ms: percentile(lat, 95),
14
- };
15
- }
16
- const group = (rs, by) => {
17
- const m = new Map();
18
- for (const r of rs) {
19
- const k = by(r) ?? '(none)';
20
- m.set(k, [...(m.get(k) ?? []), r]);
21
- }
22
- return [...m.entries()].map(([k, v]) => slice(k, v)).sort((a, b) => b.requests - a.requests);
23
- };
24
- export function summarizeReceipts(receipts, window) {
25
- const from = Date.parse(window.from), to = Date.parse(window.to);
26
- const rs = receipts.filter((r) => { const t = Date.parse(r.at); return t >= from && t <= to; });
27
- return {
28
- window,
29
- totals: slice('total', rs),
30
- byClient: group(rs, (r) => r.principal),
31
- byProfile: group(rs, (r) => r.profile),
32
- byProvider: group(rs, (r) => r.provider || undefined),
33
- byModel: group(rs, (r) => (r.provider && r.model ? `${r.provider}/${r.model}` : undefined)),
34
- byEstate: group(rs, (r) => r.estate),
35
- pendingReconciliation: rs.filter((r) => r.reconciliation === 'pending').length,
36
- };
37
- }
38
- //# sourceMappingURL=ops.js.map
package/dist/ops.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"ops.js","sourceRoot":"","sources":["../src/ops.ts"],"names":[],"mappings":"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"}
package/dist/policy.d.ts DELETED
@@ -1,26 +0,0 @@
1
- import { type BudgetLimitsV1, type ClientEntitlementV1, type GenerateRequestV1, type ModelCatalogEntryV1, type ModelProfileV1, type PolicyDecisionV1 } from './contract.js';
2
- export interface PolicyInput {
3
- profile: ModelProfileV1 | null;
4
- /** The whole catalog; eligibility is decided here, never pre-filtered by the store. */
5
- catalog: readonly ModelCatalogEntryV1[];
6
- entitlement: ClientEntitlementV1 | null;
7
- request: Pick<GenerateRequestV1, 'profile' | 'maxOutputTokens' | 'tools' | 'stream'>;
8
- now?: Date;
9
- /** Already-computed version (the store caches it); computed here when absent. */
10
- profileVersion?: string;
11
- }
12
- export declare const DEFAULT_MAX_ATTEMPTS = 2;
13
- /** The limits that apply to one profile for one entitlement: the named row over the `*` row. */
14
- export declare function limitsFor(entitlement: ClientEntitlementV1 | null, profile: string): BudgetLimitsV1;
15
- export declare function decidePolicy(input: PolicyInput): Promise<PolicyDecisionV1>;
16
- /** What the admin page shows before a toggle: the profiles the change would leave with no eligible model (434 §11). */
17
- export declare function profilesEmptiedBy(input: {
18
- catalog: readonly ModelCatalogEntryV1[];
19
- change: {
20
- provider: string;
21
- model: string;
22
- enabled: boolean;
23
- };
24
- profiles: readonly ModelProfileV1[];
25
- }): Promise<string[]>;
26
- //# sourceMappingURL=policy.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,KAAK,cAAc,EAAE,KAAK,mBAAmB,EAAE,KAAK,iBAAiB,EAAE,KAAK,mBAAmB,EAAE,KAAK,cAAc,EAA0B,KAAK,gBAAgB,EACpK,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;IAC/B,uFAAuF;IACvF,OAAO,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACxC,WAAW,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACxC,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,GAAG,iBAAiB,GAAG,OAAO,GAAG,QAAQ,CAAC,CAAC;IACrF,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,iFAAiF;IACjF,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAGD,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC,gGAAgG;AAChG,wBAAgB,SAAS,CAAC,WAAW,EAAE,mBAAmB,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc,CAGlG;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAuChF;AAED,uHAAuH;AACvH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE;IAAE,OAAO,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CASjN"}
package/dist/policy.js DELETED
@@ -1,83 +0,0 @@
1
- // THE POLICY ENGINE — spec 434 §4. A capability names a profile; a profile orders models; a model has one switch in the
2
- // catalog. This function is the ONLY place that turns (profile, catalog, entitlement, request) into the candidates an
3
- // attempt may use — the same function the admin page runs to preview what a toggle would empty, so preview and
4
- // enforcement cannot disagree (the smart-agent TOOL_POLICIES rule). A profile left with no eligible candidate fails
5
- // closed: `profile_unavailable`, never a borrow from another profile (ADR-0013).
6
- import { catalogKey, FALLBACK_CLASSES, profileVersion, } from './contract.js';
7
- const PRIVACY_RANK = { standard: 0, 'no-retention': 1 };
8
- export const DEFAULT_MAX_ATTEMPTS = 2;
9
- /** The limits that apply to one profile for one entitlement: the named row over the `*` row. */
10
- export function limitsFor(entitlement, profile) {
11
- if (!entitlement)
12
- return {};
13
- return { ...(entitlement.limits['*'] ?? {}), ...(entitlement.limits[profile] ?? {}) };
14
- }
15
- export async function decidePolicy(input) {
16
- const id = input.request.profile;
17
- if (!input.profile)
18
- return { allowed: false, profile: id, reason: 'unknown_profile', detail: `no profile "${id}" is served here` };
19
- const version = input.profileVersion ?? (await profileVersion(input.profile));
20
- const ent = input.entitlement;
21
- if (!ent)
22
- return { allowed: false, profile: id, profileVersion: version, reason: 'not_entitled', detail: 'this principal holds no entitlement here' };
23
- if (ent.validUntil && (input.now ?? new Date()).getTime() > Date.parse(ent.validUntil))
24
- return { allowed: false, profile: id, profileVersion: version, reason: 'entitlement_expired', detail: `the entitlement expired ${ent.validUntil}` };
25
- if (!ent.profiles.includes(id) && !ent.profiles.includes('*'))
26
- return { allowed: false, profile: id, profileVersion: version, reason: 'not_entitled', detail: `this principal is not entitled to profile "${id}" (entitled: ${ent.profiles.join(', ') || 'none'})` };
27
- const byKey = new Map(input.catalog.map((c) => [catalogKey(c.provider, c.model), c]));
28
- const required = new Set(input.profile.requiredCapabilities);
29
- if (input.request.tools?.length)
30
- required.add('tools');
31
- if (input.request.stream)
32
- required.add('stream');
33
- const floor = Math.max(PRIVACY_RANK[input.profile.privacy], PRIVACY_RANK[ent.privacyFloor ?? 'standard']);
34
- const candidates = [];
35
- const skipped = [];
36
- for (const m of input.profile.models) {
37
- const entry = byKey.get(catalogKey(m.provider, m.model));
38
- if (!entry) {
39
- skipped.push({ provider: m.provider, model: m.model, why: 'not in the catalog' });
40
- continue;
41
- }
42
- if (!entry.enabled) {
43
- skipped.push({ provider: m.provider, model: m.model, why: 'disabled in the catalog' });
44
- continue;
45
- }
46
- const missing = [...required].filter((c) => !entry.capabilities.includes(c));
47
- if (missing.length) {
48
- skipped.push({ provider: m.provider, model: m.model, why: `lacks ${missing.join(', ')}` });
49
- continue;
50
- }
51
- if (PRIVACY_RANK[entry.privacy] < floor) {
52
- skipped.push({ provider: m.provider, model: m.model, why: `privacy ${entry.privacy} is below the ${floor === 1 ? 'no-retention' : 'standard'} floor` });
53
- continue;
54
- }
55
- candidates.push({ provider: entry.provider, model: entry.model, ...(m.endpoint ?? entry.endpoint ? { endpoint: m.endpoint ?? entry.endpoint } : {}), pricing: entry.pricing, privacy: entry.privacy });
56
- }
57
- if (candidates.length === 0)
58
- return { allowed: false, profile: id, profileVersion: version, reason: 'profile_unavailable', detail: `profile "${id}" has no eligible model: ${skipped.map((s) => `${s.provider}/${s.model} (${s.why})`).join('; ')}`, skipped };
59
- const limits = limitsFor(ent, id);
60
- const maxAttempts = Math.max(1, Math.min(limits.maxAttempts ?? DEFAULT_MAX_ATTEMPTS, candidates.length));
61
- const ceiling = input.profile.maxOutputTokens;
62
- const asked = input.request.maxOutputTokens;
63
- return {
64
- allowed: true, profile: id, profileVersion: version, candidates, skipped,
65
- maxOutputTokens: asked && asked > 0 ? Math.min(asked, ceiling) : ceiling,
66
- fallbackOn: input.profile.fallbackOn.filter((c) => FALLBACK_CLASSES.includes(c)),
67
- timeoutMs: input.profile.timeoutMs,
68
- maxAttempts,
69
- };
70
- }
71
- /** What the admin page shows before a toggle: the profiles the change would leave with no eligible model (434 §11). */
72
- export async function profilesEmptiedBy(input) {
73
- const next = input.catalog.map((c) => (c.provider === input.change.provider && c.model === input.change.model ? { ...c, enabled: input.change.enabled } : c));
74
- const everyProfile = { principal: '0x0000000000000000000000000000000000000000', kind: 'town-service', profiles: ['*'], limits: {} };
75
- const out = [];
76
- for (const p of input.profiles) {
77
- const d = await decidePolicy({ profile: p, catalog: next, entitlement: everyProfile, request: { profile: p.id } });
78
- if (!d.allowed && d.reason === 'profile_unavailable')
79
- out.push(p.id);
80
- }
81
- return out;
82
- }
83
- //# sourceMappingURL=policy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"policy.js","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"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"}
package/dist/ports.d.ts DELETED
@@ -1,95 +0,0 @@
1
- import type { Address } from '@agenticprimitives/types';
2
- import type { ClientEntitlementV1, ClientKindV1, FailureClassV1, GenerateRequestV1, InferenceReceiptV1, MessageV1, ModelCatalogEntryV1, ModelProfileV1, ModelUsageV1, StopReasonV1, ToolCallV1, ToolChoiceV1, ToolDefinitionV1 } from './contract.js';
3
- /** Caller class (a): an app credential. Caller class (b): a session-wrapped A2A assertion over a wire (spec 372 S3c). */
4
- export type CallerCredentialV1 = {
5
- kind: 'app-key';
6
- key: string;
7
- } | {
8
- kind: 'session-wire';
9
- assertion: unknown;
10
- headers: Record<string, string>;
11
- method: string;
12
- };
13
- export interface ResolvedPrincipalV1 {
14
- principal: Address;
15
- principalClass: 'app' | 'wire';
16
- estate?: string;
17
- clientKind?: ClientKindV1;
18
- }
19
- export interface PrincipalResolverPort {
20
- /** `null` ⇒ `unknown_caller`. A resolver verifies; it never guesses from `context.agent` (G3). */
21
- resolve(caller: CallerCredentialV1): Promise<ResolvedPrincipalV1 | null>;
22
- }
23
- export interface PolicyStorePort {
24
- profile(id: string): Promise<{
25
- profile: ModelProfileV1;
26
- version: string;
27
- } | null>;
28
- catalog(): Promise<ModelCatalogEntryV1[]>;
29
- entitlement(principal: Address): Promise<ClientEntitlementV1 | null>;
30
- }
31
- export interface MeterPort {
32
- reserve(input: {
33
- principal: Address;
34
- profile: string;
35
- estimateTokens: number;
36
- estimateMicroUsd: number;
37
- limits: import('./contract.js').BudgetLimitsV1;
38
- }): Promise<{
39
- ok: true;
40
- reservationId: string;
41
- } | {
42
- ok: false;
43
- reason: string;
44
- detail: string;
45
- }>;
46
- settle(input: {
47
- principal: Address;
48
- reservationId: string;
49
- usage: ModelUsageV1;
50
- costMicroUsd: number;
51
- }): Promise<void>;
52
- /** The attempt ended without usage (timeout, lost connection): the reservation stays and the alarm reconciles or expires it. */
53
- hold?(input: {
54
- principal: Address;
55
- reservationId: string;
56
- }): Promise<void>;
57
- }
58
- export interface ReceiptLedgerPort {
59
- write(receipt: InferenceReceiptV1): Promise<void>;
60
- }
61
- export interface AdapterRequestV1 {
62
- model: string;
63
- endpoint?: string;
64
- messages: MessageV1[];
65
- tools?: ToolDefinitionV1[];
66
- toolChoice?: ToolChoiceV1;
67
- maxOutputTokens: number;
68
- temperature?: number;
69
- timeoutMs: number;
70
- }
71
- export interface AdapterResultV1 {
72
- content: string;
73
- toolCalls: ToolCallV1[];
74
- stopReason: StopReasonV1;
75
- usage?: ModelUsageV1;
76
- providerUsage?: unknown;
77
- }
78
- /** A provider failure with its CLASS — the only thing the fallback rule reads (G5). */
79
- export declare class ProviderFailure extends Error {
80
- readonly failureClass: FailureClassV1;
81
- readonly status?: number;
82
- constructor(failureClass: FailureClassV1, message: string, status?: number);
83
- }
84
- export interface ProviderAdapter {
85
- readonly provider: string;
86
- generate(req: AdapterRequestV1): Promise<AdapterResultV1>;
87
- /** Token streaming; absent ⇒ the handler streams the whole answer as one delta (said on the receipt, never silent). */
88
- stream?(req: AdapterRequestV1, onDelta: (text: string) => void): Promise<AdapterResultV1>;
89
- }
90
- /** HTTP status → failure class, the one mapping every adapter uses. */
91
- export declare function classifyStatus(status: number): FailureClassV1;
92
- /** A thrown error → its class: a `ProviderFailure` keeps its own; an abort is a timeout; the rest are `unavailable`. */
93
- export declare function classifyError(e: unknown): FailureClassV1;
94
- export type GenerateRequestInput = GenerateRequestV1;
95
- //# sourceMappingURL=ports.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../src/ports.ts"],"names":[],"mappings":"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"}
package/dist/ports.js DELETED
@@ -1,43 +0,0 @@
1
- /** A provider failure with its CLASS — the only thing the fallback rule reads (G5). */
2
- export class ProviderFailure extends Error {
3
- failureClass;
4
- status;
5
- constructor(failureClass, message, status) {
6
- super(message);
7
- this.name = 'ProviderFailure';
8
- this.failureClass = failureClass;
9
- if (status !== undefined)
10
- this.status = status;
11
- }
12
- }
13
- /** HTTP status → failure class, the one mapping every adapter uses. */
14
- export function classifyStatus(status) {
15
- if (status === 429)
16
- return 'rate-limited';
17
- if (status === 401 || status === 403)
18
- return 'auth';
19
- if (status === 408 || status === 504)
20
- return 'timeout';
21
- if (status >= 500)
22
- return 'unavailable';
23
- if (status === 400 || status === 413 || status === 422)
24
- return 'content';
25
- return 'malformed';
26
- }
27
- /** A thrown error → its class: a `ProviderFailure` keeps its own; an abort is a timeout; the rest are `unavailable`. */
28
- export function classifyError(e) {
29
- if (e instanceof ProviderFailure)
30
- return e.failureClass;
31
- const msg = e instanceof Error ? e.message : String(e);
32
- const name = e instanceof Error ? e.name : '';
33
- if (name === 'AbortError' || /abort|timed? ?out/i.test(msg))
34
- return 'timeout';
35
- const m = /\b(\d{3})\b/.exec(msg);
36
- if (m) {
37
- const c = classifyStatus(Number(m[1]));
38
- if (c !== 'malformed')
39
- return c;
40
- }
41
- return 'unavailable';
42
- }
43
- //# sourceMappingURL=ports.js.map
package/dist/ports.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"ports.js","sourceRoot":"","sources":["../src/ports.ts"],"names":[],"mappings":"AAmEA,uFAAuF;AACvF,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAC/B,YAAY,CAAiB;IAC7B,MAAM,CAAU;IACzB,YAAY,YAA4B,EAAE,OAAe,EAAE,MAAe;QACxE,KAAK,CAAC,OAAO,CAAC,CAAC;QAAC,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAAC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QAAC,IAAI,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IAClI,CAAC;CACF;AAQD,uEAAuE;AACvE,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,cAAc,CAAC;IAC1C,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,MAAM,CAAC;IACpD,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,SAAS,CAAC;IACvD,IAAI,MAAM,IAAI,GAAG;QAAE,OAAO,aAAa,CAAC;IACxC,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,SAAS,CAAC;IACzE,OAAO,WAAW,CAAC;AACrB,CAAC;AACD,wHAAwH;AACxH,MAAM,UAAU,aAAa,CAAC,CAAU;IACtC,IAAI,CAAC,YAAY,eAAe;QAAE,OAAO,CAAC,CAAC,YAAY,CAAC;IACxD,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9C,IAAI,IAAI,KAAK,YAAY,IAAI,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9E,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,CAAC,EAAE,CAAC;QAAC,MAAM,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,IAAI,CAAC,KAAK,WAAW;YAAE,OAAO,CAAC,CAAC;IAAC,CAAC;IACnF,OAAO,aAAa,CAAC;AACvB,CAAC"}
package/dist/usage.d.ts DELETED
@@ -1,23 +0,0 @@
1
- import type { ModelUsageV1 } from './contract.js';
2
- export interface AnthropicRawUsage {
3
- input_tokens?: number;
4
- output_tokens?: number;
5
- cache_read_input_tokens?: number;
6
- cache_creation_input_tokens?: number;
7
- }
8
- export interface OpenAiRawUsage {
9
- prompt_tokens?: number;
10
- completion_tokens?: number;
11
- total_tokens?: number;
12
- prompt_tokens_details?: {
13
- cached_tokens?: number;
14
- };
15
- completion_tokens_details?: {
16
- reasoning_tokens?: number;
17
- };
18
- }
19
- export declare function normalizeAnthropicUsage(u: AnthropicRawUsage | undefined | null): ModelUsageV1 | undefined;
20
- export declare function normalizeOpenAiUsage(u: OpenAiRawUsage | undefined | null): ModelUsageV1 | undefined;
21
- /** The usage a receipt carries when the provider reported none: zeros, flagged so the reconciler can read it back later. */
22
- export declare const UNKNOWN_USAGE: ModelUsageV1;
23
- //# sourceMappingURL=usage.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../src/usage.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,MAAM,WAAW,iBAAiB;IAAG,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAAC,2BAA2B,CAAC,EAAE,MAAM,CAAA;CAAE;AAC5J,MAAM,WAAW,cAAc;IAAG,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,qBAAqB,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,yBAAyB,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE;AAI5N,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,iBAAiB,GAAG,SAAS,GAAG,IAAI,GAAG,YAAY,GAAG,SAAS,CAIzG;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,cAAc,GAAG,SAAS,GAAG,IAAI,GAAG,YAAY,GAAG,SAAS,CAInG;AAED,4HAA4H;AAC5H,eAAO,MAAM,aAAa,EAAE,YAA4C,CAAC"}
package/dist/usage.js DELETED
@@ -1,16 +0,0 @@
1
- const n = (x) => (typeof x === 'number' && Number.isFinite(x) && x > 0 ? x : 0);
2
- export function normalizeAnthropicUsage(u) {
3
- if (!u || (typeof u.input_tokens !== 'number' && typeof u.output_tokens !== 'number'))
4
- return undefined;
5
- const cached = n(u.cache_read_input_tokens);
6
- return { tokensIn: n(u.input_tokens) + cached + n(u.cache_creation_input_tokens), tokensOut: n(u.output_tokens), ...(cached ? { cachedIn: cached } : {}) };
7
- }
8
- export function normalizeOpenAiUsage(u) {
9
- if (!u || (typeof u.prompt_tokens !== 'number' && typeof u.completion_tokens !== 'number'))
10
- return undefined;
11
- const cached = n(u.prompt_tokens_details?.cached_tokens), reasoning = n(u.completion_tokens_details?.reasoning_tokens);
12
- return { tokensIn: n(u.prompt_tokens), tokensOut: n(u.completion_tokens), ...(cached ? { cachedIn: cached } : {}), ...(reasoning ? { reasoningOut: reasoning } : {}) };
13
- }
14
- /** The usage a receipt carries when the provider reported none: zeros, flagged so the reconciler can read it back later. */
15
- export const UNKNOWN_USAGE = { tokensIn: 0, tokensOut: 0 };
16
- //# sourceMappingURL=usage.js.map