@kernel.chat/kbot-finance 0.2.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.
Files changed (100) hide show
  1. package/LICENSE +19 -0
  2. package/README.md +188 -0
  3. package/RFC-content-addressed-mcp.md +240 -0
  4. package/dist/adapters/edgar/client.d.ts +11 -0
  5. package/dist/adapters/edgar/client.d.ts.map +1 -0
  6. package/dist/adapters/edgar/client.js +56 -0
  7. package/dist/adapters/edgar/client.js.map +1 -0
  8. package/dist/adapters/edgar/commands.d.ts +27 -0
  9. package/dist/adapters/edgar/commands.d.ts.map +1 -0
  10. package/dist/adapters/edgar/commands.js +56 -0
  11. package/dist/adapters/edgar/commands.js.map +1 -0
  12. package/dist/adapters/edgar/index.d.ts +4 -0
  13. package/dist/adapters/edgar/index.d.ts.map +1 -0
  14. package/dist/adapters/edgar/index.js +4 -0
  15. package/dist/adapters/edgar/index.js.map +1 -0
  16. package/dist/adapters/edgar/types.d.ts +70 -0
  17. package/dist/adapters/edgar/types.d.ts.map +1 -0
  18. package/dist/adapters/edgar/types.js +23 -0
  19. package/dist/adapters/edgar/types.js.map +1 -0
  20. package/dist/adapters/polymarket/client.d.ts +7 -0
  21. package/dist/adapters/polymarket/client.d.ts.map +1 -0
  22. package/dist/adapters/polymarket/client.js +58 -0
  23. package/dist/adapters/polymarket/client.js.map +1 -0
  24. package/dist/adapters/polymarket/commands.d.ts +30 -0
  25. package/dist/adapters/polymarket/commands.d.ts.map +1 -0
  26. package/dist/adapters/polymarket/commands.js +67 -0
  27. package/dist/adapters/polymarket/commands.js.map +1 -0
  28. package/dist/adapters/polymarket/index.d.ts +4 -0
  29. package/dist/adapters/polymarket/index.d.ts.map +1 -0
  30. package/dist/adapters/polymarket/index.js +4 -0
  31. package/dist/adapters/polymarket/index.js.map +1 -0
  32. package/dist/adapters/polymarket/types.d.ts +58 -0
  33. package/dist/adapters/polymarket/types.d.ts.map +1 -0
  34. package/dist/adapters/polymarket/types.js +12 -0
  35. package/dist/adapters/polymarket/types.js.map +1 -0
  36. package/dist/audit-log.d.ts +65 -0
  37. package/dist/audit-log.d.ts.map +1 -0
  38. package/dist/audit-log.js +96 -0
  39. package/dist/audit-log.js.map +1 -0
  40. package/dist/cli.d.ts +3 -0
  41. package/dist/cli.d.ts.map +1 -0
  42. package/dist/cli.js +44 -0
  43. package/dist/cli.js.map +1 -0
  44. package/dist/demo.d.ts +11 -0
  45. package/dist/demo.d.ts.map +1 -0
  46. package/dist/demo.js +133 -0
  47. package/dist/demo.js.map +1 -0
  48. package/dist/envelope.d.ts +71 -0
  49. package/dist/envelope.d.ts.map +1 -0
  50. package/dist/envelope.js +83 -0
  51. package/dist/envelope.js.map +1 -0
  52. package/dist/exporters/annex-iv.d.ts +40 -0
  53. package/dist/exporters/annex-iv.d.ts.map +1 -0
  54. package/dist/exporters/annex-iv.js +154 -0
  55. package/dist/exporters/annex-iv.js.map +1 -0
  56. package/dist/governance.d.ts +55 -0
  57. package/dist/governance.d.ts.map +1 -0
  58. package/dist/governance.js +73 -0
  59. package/dist/governance.js.map +1 -0
  60. package/dist/index.d.ts +32 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +32 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/kbot-tool.d.ts +31 -0
  65. package/dist/kbot-tool.d.ts.map +1 -0
  66. package/dist/kbot-tool.js +325 -0
  67. package/dist/kbot-tool.js.map +1 -0
  68. package/dist/mcp-server.d.ts +25 -0
  69. package/dist/mcp-server.d.ts.map +1 -0
  70. package/dist/mcp-server.js +80 -0
  71. package/dist/mcp-server.js.map +1 -0
  72. package/dist/tools/edgar-query.d.ts +36 -0
  73. package/dist/tools/edgar-query.d.ts.map +1 -0
  74. package/dist/tools/edgar-query.js +108 -0
  75. package/dist/tools/edgar-query.js.map +1 -0
  76. package/dist/tools/polymarket-query.d.ts +55 -0
  77. package/dist/tools/polymarket-query.d.ts.map +1 -0
  78. package/dist/tools/polymarket-query.js +128 -0
  79. package/dist/tools/polymarket-query.js.map +1 -0
  80. package/dist/verifier/eu-rts6.d.ts +3 -0
  81. package/dist/verifier/eu-rts6.d.ts.map +1 -0
  82. package/dist/verifier/eu-rts6.js +45 -0
  83. package/dist/verifier/eu-rts6.js.map +1 -0
  84. package/dist/verifier/index.d.ts +67 -0
  85. package/dist/verifier/index.d.ts.map +1 -0
  86. package/dist/verifier/index.js +22 -0
  87. package/dist/verifier/index.js.map +1 -0
  88. package/dist/verifier/kelly-cap.d.ts +19 -0
  89. package/dist/verifier/kelly-cap.d.ts.map +1 -0
  90. package/dist/verifier/kelly-cap.js +64 -0
  91. package/dist/verifier/kelly-cap.js.map +1 -0
  92. package/dist/verifier/model-version.d.ts +3 -0
  93. package/dist/verifier/model-version.d.ts.map +1 -0
  94. package/dist/verifier/model-version.js +28 -0
  95. package/dist/verifier/model-version.js.map +1 -0
  96. package/dist/verifier/position-limit.d.ts +21 -0
  97. package/dist/verifier/position-limit.d.ts.map +1 -0
  98. package/dist/verifier/position-limit.js +42 -0
  99. package/dist/verifier/position-limit.js.map +1 -0
  100. package/package.json +101 -0
@@ -0,0 +1,36 @@
1
+ import { type ContentAddressedResponse, type JsonValue } from "../envelope.js";
2
+ import { AppendOnlyAuditLog } from "../audit-log.js";
3
+ import { type Rule, type VerifierContext } from "../verifier/index.js";
4
+ import { getSubmissions, getCompanyFacts, type NormalizedFiling } from "../adapters/edgar/index.js";
5
+ export interface EdgarQueryInputs {
6
+ readonly mode: "submissions" | "company_facts";
7
+ readonly cik: string;
8
+ readonly limit?: number;
9
+ readonly data_as_of: string;
10
+ }
11
+ export interface EdgarQueryValue {
12
+ readonly mode: "submissions" | "company_facts";
13
+ readonly entity_name: string | null;
14
+ readonly cik: string;
15
+ readonly filings?: ReadonlyArray<NormalizedFiling>;
16
+ readonly facts_keys?: ReadonlyArray<string>;
17
+ }
18
+ export interface EdgarQueryDeps {
19
+ readonly auditLog: AppendOnlyAuditLog;
20
+ readonly rules: ReadonlyArray<Rule>;
21
+ readonly verifierContext: VerifierContext;
22
+ readonly engine?: {
23
+ getSubmissions: typeof getSubmissions;
24
+ getCompanyFacts: typeof getCompanyFacts;
25
+ };
26
+ }
27
+ export type EdgarQueryResult = {
28
+ readonly ok: true;
29
+ readonly response: ContentAddressedResponse<EdgarQueryValue>;
30
+ } | {
31
+ readonly ok: false;
32
+ readonly stage: "verifier" | "engine";
33
+ readonly detail: JsonValue;
34
+ };
35
+ export declare function edgarQuery(inputs: EdgarQueryInputs, deps: EdgarQueryDeps): Promise<EdgarQueryResult>;
36
+ //# sourceMappingURL=edgar-query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edgar-query.d.ts","sourceRoot":"","sources":["../../src/tools/edgar-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,wBAAwB,EAC7B,KAAK,SAAS,EACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAe,KAAK,IAAI,EAAE,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EACL,cAAc,EACd,eAAe,EAGf,KAAK,gBAAgB,EACtB,MAAM,4BAA4B,CAAC;AAwBpC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,aAAa,GAAG,eAAe,CAAC;IAC/C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,aAAa,GAAG,eAAe,CAAC;IAC/C,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAC;IACnD,QAAQ,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;IACpC,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE;QAChB,cAAc,EAAE,OAAO,cAAc,CAAC;QACtC,eAAe,EAAE,OAAO,eAAe,CAAC;KACzC,CAAC;CACH;AAED,MAAM,MAAM,gBAAgB,GACxB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,wBAAwB,CAAC,eAAe,CAAC,CAAA;CAAE,GACnF;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;CAAE,CAAC;AAE9F,wBAAsB,UAAU,CAC9B,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,gBAAgB,CAAC,CAqG3B"}
@@ -0,0 +1,108 @@
1
+ import { sealEnvelope, sha256, canonicalize, } from "../envelope.js";
2
+ import { runVerifier } from "../verifier/index.js";
3
+ import { getSubmissions, getCompanyFacts, normalizeRecentFilings, EDGAR_ADAPTER_VERSION, } from "../adapters/edgar/index.js";
4
+ /**
5
+ * edgar_query — read-only access to SEC EDGAR via the full kbot-finance
6
+ * audit substrate. Same wiring shape as polymarket-query.ts.
7
+ *
8
+ * Filings are immutable by SEC policy: an accession number resolves to a
9
+ * specific filing forever. This is the cleanest content-addressing story
10
+ * available for US public-company data and is why EDGAR is a natural
11
+ * second adapter — it proves the substrate works for both prediction
12
+ * markets and official securities filings.
13
+ */
14
+ const SCHEMA_HASH = sha256(canonicalize({
15
+ type: "object",
16
+ fields: {
17
+ mode: { type: "string", enum: ["submissions", "company_facts"] },
18
+ cik: { type: "string" },
19
+ limit: { type: "number", optional: true },
20
+ },
21
+ }));
22
+ export async function edgarQuery(inputs, deps) {
23
+ const engine = deps.engine ?? { getSubmissions, getCompanyFacts };
24
+ const request = {
25
+ operation: inputs.mode === "submissions" ? "edgar.submissions" : "edgar.company_facts",
26
+ engine_version: EDGAR_ADAPTER_VERSION,
27
+ schema_hash: SCHEMA_HASH,
28
+ inputs: inputs,
29
+ data_as_of: inputs.data_as_of,
30
+ };
31
+ const verifier_report = runVerifier(deps.rules, {
32
+ operation: request.operation,
33
+ inputs: request.inputs,
34
+ materiality: "informational",
35
+ }, deps.verifierContext);
36
+ await deps.auditLog.append({
37
+ action: "verifier_check",
38
+ subject: request.operation,
39
+ session_id: deps.verifierContext.session_id,
40
+ payload: verifier_report,
41
+ });
42
+ if (!verifier_report.ok) {
43
+ return { ok: false, stage: "verifier", detail: verifier_report };
44
+ }
45
+ await deps.auditLog.append({
46
+ action: "engine_request",
47
+ subject: request.operation,
48
+ session_id: deps.verifierContext.session_id,
49
+ payload: request,
50
+ });
51
+ const sealed = await sealEnvelope(request, async () => {
52
+ if (inputs.mode === "submissions") {
53
+ const r = await engine.getSubmissions(inputs.cik);
54
+ if (!r.ok) {
55
+ throw new Error(`edgar.submissions failed: ${r.error.code}: ${r.error.message}`);
56
+ }
57
+ const filings = normalizeRecentFilings(r.value, inputs.cik, inputs.limit ?? 25);
58
+ return {
59
+ mode: "submissions",
60
+ entity_name: r.value.name ?? null,
61
+ cik: inputs.cik,
62
+ filings,
63
+ };
64
+ }
65
+ else {
66
+ const r = await engine.getCompanyFacts(inputs.cik);
67
+ if (!r.ok) {
68
+ throw new Error(`edgar.company_facts failed: ${r.error.code}: ${r.error.message}`);
69
+ }
70
+ const usGaap = r.value.facts?.["us-gaap"] ?? {};
71
+ const facts_keys = Object.keys(usGaap).slice(0, inputs.limit ?? 50);
72
+ return {
73
+ mode: "company_facts",
74
+ entity_name: r.value.entityName ?? null,
75
+ cik: inputs.cik,
76
+ facts_keys,
77
+ };
78
+ }
79
+ },
80
+ // EDGAR filings are immutable by accession number, so for a given CIK
81
+ // + as-of date the result is byte-stable if pinned to a snapshot.
82
+ // The live API is byte-stable for closed filings but the `recent`
83
+ // table grows; we mark replay as conditional, not guaranteed.
84
+ { byte_identical_replayable: false }).catch((e) => ({ error: e.message }));
85
+ if ("error" in sealed) {
86
+ await deps.auditLog.append({
87
+ action: "incident",
88
+ subject: request.operation,
89
+ session_id: deps.verifierContext.session_id,
90
+ payload: { error: sealed.error },
91
+ });
92
+ return { ok: false, stage: "engine", detail: { error: sealed.error } };
93
+ }
94
+ await deps.auditLog.append({
95
+ action: "engine_response",
96
+ subject: request.operation,
97
+ session_id: deps.verifierContext.session_id,
98
+ payload: {
99
+ request_hash: sealed.request_hash,
100
+ produced_at: sealed.produced_at,
101
+ byte_identical_replayable: sealed.byte_identical_replayable,
102
+ entity_name: sealed.value.entity_name,
103
+ result_count: sealed.value.filings?.length ?? sealed.value.facts_keys?.length ?? 0,
104
+ },
105
+ });
106
+ return { ok: true, response: sealed };
107
+ }
108
+ //# sourceMappingURL=edgar-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edgar-query.js","sourceRoot":"","sources":["../../src/tools/edgar-query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import { type ContentAddressedResponse, type JsonValue } from "../envelope.js";
2
+ import { AppendOnlyAuditLog } from "../audit-log.js";
3
+ import { type Rule, type VerifierContext } from "../verifier/index.js";
4
+ import { getMarket, listMarkets } from "../adapters/polymarket/index.js";
5
+ export interface PolymarketQueryInputs {
6
+ /** "by_id" returns a single market; "list_active" returns top markets. */
7
+ readonly mode: "by_id" | "list_active";
8
+ readonly market_id?: string;
9
+ readonly limit?: number;
10
+ /** ISO 8601 UTC. The agent supplies "as of"; the engine doesn't time-travel today. */
11
+ readonly data_as_of: string;
12
+ }
13
+ export interface PolymarketQueryValue {
14
+ readonly mode: "by_id" | "list_active";
15
+ readonly markets: ReadonlyArray<NormalizedMarket>;
16
+ }
17
+ export interface NormalizedMarket {
18
+ readonly id: string | null;
19
+ readonly question: string | null;
20
+ readonly slug: string | null;
21
+ readonly outcomes: ReadonlyArray<string> | null;
22
+ readonly outcome_prices: ReadonlyArray<number> | null;
23
+ readonly last_trade_price: number | null;
24
+ readonly best_bid: number | null;
25
+ readonly best_ask: number | null;
26
+ readonly spread: number | null;
27
+ readonly volume_total: number | null;
28
+ readonly volume_24h: number | null;
29
+ readonly liquidity: number | null;
30
+ readonly active: boolean | null;
31
+ readonly closed: boolean | null;
32
+ readonly end_date: string | null;
33
+ readonly condition_id: string | null;
34
+ readonly uma_resolution_status: string | null;
35
+ }
36
+ export interface PolymarketQueryDeps {
37
+ readonly auditLog: AppendOnlyAuditLog;
38
+ readonly rules: ReadonlyArray<Rule>;
39
+ readonly verifierContext: VerifierContext;
40
+ /** Override for testing. Defaults to the real Gamma client. */
41
+ readonly engine?: {
42
+ getMarket: typeof getMarket;
43
+ listMarkets: typeof listMarkets;
44
+ };
45
+ }
46
+ export type PolymarketQueryResult = {
47
+ readonly ok: true;
48
+ readonly response: ContentAddressedResponse<PolymarketQueryValue>;
49
+ } | {
50
+ readonly ok: false;
51
+ readonly stage: "verifier" | "engine";
52
+ readonly detail: JsonValue;
53
+ };
54
+ export declare function polymarketQuery(inputs: PolymarketQueryInputs, deps: PolymarketQueryDeps): Promise<PolymarketQueryResult>;
55
+ //# sourceMappingURL=polymarket-query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polymarket-query.d.ts","sourceRoot":"","sources":["../../src/tools/polymarket-query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,128 @@
1
+ import { sealEnvelope, sha256, canonicalize, } from "../envelope.js";
2
+ import { runVerifier } from "../verifier/index.js";
3
+ import { getMarket, listMarkets, decodeOutcomePrices, decodeOutcomes, POLYMARKET_ADAPTER_VERSION, } from "../adapters/polymarket/index.js";
4
+ /**
5
+ * polymarket_query — the kbot tool entry point.
6
+ *
7
+ * Wires the full architecture for one operation:
8
+ * 1. Build the content-addressed request envelope.
9
+ * 2. Run the regulatory verifier (informational ops still get audited).
10
+ * 3. Log the verifier check.
11
+ * 4. Call the Polymarket Gamma engine adapter.
12
+ * 5. Seal the response into an envelope.
13
+ * 6. Log the engine response.
14
+ *
15
+ * The AI agent calling this tool cannot produce the market price. It can
16
+ * only request one, inside an envelope, with a replayable hash.
17
+ */
18
+ const SCHEMA_HASH = sha256(canonicalize({
19
+ type: "object",
20
+ fields: {
21
+ mode: { type: "string", enum: ["by_id", "list_active"] },
22
+ market_id: { type: "string", optional: true },
23
+ limit: { type: "number", optional: true },
24
+ },
25
+ }));
26
+ function normalize(m) {
27
+ return {
28
+ id: m.id ?? null,
29
+ question: m.question ?? null,
30
+ slug: m.slug ?? null,
31
+ outcomes: decodeOutcomes(m.outcomes),
32
+ outcome_prices: decodeOutcomePrices(m.outcomePrices),
33
+ last_trade_price: m.lastTradePrice ?? null,
34
+ best_bid: m.bestBid ?? null,
35
+ best_ask: m.bestAsk ?? null,
36
+ spread: m.spread ?? null,
37
+ volume_total: m.volumeNum ?? null,
38
+ volume_24h: m.volume24hr ?? null,
39
+ liquidity: m.liquidityNum ?? null,
40
+ active: m.active ?? null,
41
+ closed: m.closed ?? null,
42
+ end_date: m.endDate ?? null,
43
+ condition_id: m.conditionId ?? null,
44
+ uma_resolution_status: m.umaResolutionStatus ?? null,
45
+ };
46
+ }
47
+ export async function polymarketQuery(inputs, deps) {
48
+ const engine = deps.engine ?? { getMarket, listMarkets };
49
+ const request = {
50
+ operation: inputs.mode === "by_id" ? "polymarket.get_market" : "polymarket.list_markets",
51
+ engine_version: POLYMARKET_ADAPTER_VERSION,
52
+ schema_hash: SCHEMA_HASH,
53
+ inputs: inputs,
54
+ data_as_of: inputs.data_as_of,
55
+ };
56
+ const verifier_report = runVerifier(deps.rules, {
57
+ operation: request.operation,
58
+ inputs: request.inputs,
59
+ materiality: "informational",
60
+ }, deps.verifierContext);
61
+ await deps.auditLog.append({
62
+ action: "verifier_check",
63
+ subject: request.operation,
64
+ session_id: deps.verifierContext.session_id,
65
+ payload: verifier_report,
66
+ });
67
+ if (!verifier_report.ok) {
68
+ return { ok: false, stage: "verifier", detail: verifier_report };
69
+ }
70
+ await deps.auditLog.append({
71
+ action: "engine_request",
72
+ subject: request.operation,
73
+ session_id: deps.verifierContext.session_id,
74
+ payload: request,
75
+ });
76
+ const sealed = await sealEnvelope(request, async () => {
77
+ if (inputs.mode === "by_id") {
78
+ if (!inputs.market_id) {
79
+ throw new Error("market_id required for mode=by_id");
80
+ }
81
+ const r = await engine.getMarket(inputs.market_id);
82
+ if (!r.ok) {
83
+ throw new Error(`polymarket.get_market failed: ${r.error.code}: ${r.error.message}`);
84
+ }
85
+ return { mode: "by_id", markets: [normalize(r.value)] };
86
+ }
87
+ else {
88
+ const r = await engine.listMarkets({
89
+ limit: inputs.limit ?? 10,
90
+ active: true,
91
+ closed: false,
92
+ order: "volume24hr",
93
+ });
94
+ if (!r.ok) {
95
+ throw new Error(`polymarket.list_markets failed: ${r.error.code}: ${r.error.message}`);
96
+ }
97
+ return { mode: "list_active", markets: r.value.map(normalize) };
98
+ }
99
+ },
100
+ // Gamma over HTTPS is not byte-replayable — markets move. The honesty
101
+ // primitive: declare it. A second-pass replay must hit the same `data_as_of`
102
+ // block on an indexer like Goldsky for true determinism. v0.1 does not yet.
103
+ { byte_identical_replayable: false }).catch((e) => ({ error: e.message }));
104
+ if ("error" in sealed) {
105
+ await deps.auditLog.append({
106
+ action: "incident",
107
+ subject: request.operation,
108
+ session_id: deps.verifierContext.session_id,
109
+ payload: { error: sealed.error },
110
+ });
111
+ return { ok: false, stage: "engine", detail: { error: sealed.error } };
112
+ }
113
+ await deps.auditLog.append({
114
+ action: "engine_response",
115
+ subject: request.operation,
116
+ session_id: deps.verifierContext.session_id,
117
+ payload: {
118
+ request_hash: sealed.request_hash,
119
+ produced_at: sealed.produced_at,
120
+ byte_identical_replayable: sealed.byte_identical_replayable,
121
+ // Don't log the full market list at audit-info level; log the count
122
+ // and the hash. Full payload is recoverable via replay.
123
+ market_count: sealed.value.markets.length,
124
+ },
125
+ });
126
+ return { ok: true, response: sealed };
127
+ }
128
+ //# sourceMappingURL=polymarket-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polymarket-query.js","sourceRoot":"","sources":["../../src/tools/polymarket-query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Rule } from "./index.js";
2
+ export declare function makeRts6AlgorithmDeclaredRule(): Rule;
3
+ //# sourceMappingURL=eu-rts6.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eu-rts6.d.ts","sourceRoot":"","sources":["../../src/verifier/eu-rts6.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAA+C,MAAM,YAAY,CAAC;AA4BpF,wBAAgB,6BAA6B,IAAI,IAAI,CAqCpD"}
@@ -0,0 +1,45 @@
1
+ const TRADE_OPERATIONS = new Set([
2
+ "polymarket.trade",
3
+ "polymarket.market_make",
4
+ "alts.allocate",
5
+ "rates.swap_execute",
6
+ "equities.order",
7
+ ]);
8
+ export function makeRts6AlgorithmDeclaredRule() {
9
+ return {
10
+ id: "rule.eu_rts6_algorithm_declared",
11
+ jurisdictions: ["EU"],
12
+ operations: Array.from(TRADE_OPERATIONS),
13
+ evaluate(action, _context) {
14
+ const inputs = action.inputs;
15
+ const id = inputs?.rts6_algorithm_id;
16
+ if (typeof id !== "string" || id.trim().length === 0) {
17
+ return {
18
+ pass: false,
19
+ reason: {
20
+ code: "RTS6_ALGO_ID_MISSING",
21
+ summary: "MiFID II RTS 6 requires every algorithmic-trading action to carry an algorithm declaration ID.",
22
+ details: {
23
+ required_field: "rts6_algorithm_id",
24
+ regulation: "Commission Delegated Regulation 2017/589, Article 9",
25
+ esma_briefing: "ESMA74-1505669079-10311 (26 Feb 2026)",
26
+ },
27
+ },
28
+ };
29
+ }
30
+ // Cheap shape check — typical IDs are alphanumeric with optional hyphens.
31
+ if (!/^[A-Za-z0-9_-]{3,64}$/.test(id)) {
32
+ return {
33
+ pass: false,
34
+ reason: {
35
+ code: "RTS6_ALGO_ID_INVALID_SHAPE",
36
+ summary: `rts6_algorithm_id "${id}" does not match the expected 3-64 char alphanumeric format.`,
37
+ details: { received: id },
38
+ },
39
+ };
40
+ }
41
+ return { pass: true };
42
+ },
43
+ };
44
+ }
45
+ //# sourceMappingURL=eu-rts6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eu-rts6.js","sourceRoot":"","sources":["../../src/verifier/eu-rts6.ts"],"names":[],"mappings":"AAoBA,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAS;IACvC,kBAAkB;IAClB,wBAAwB;IACxB,eAAe;IACf,oBAAoB;IACpB,gBAAgB;CACjB,CAAC,CAAC;AAEH,MAAM,UAAU,6BAA6B;IAC3C,OAAO;QACL,EAAE,EAAE,iCAAiC;QACrC,aAAa,EAAE,CAAC,IAAI,CAAC;QACrB,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC;QACxC,QAAQ,CAAC,MAAsB,EAAE,QAAyB;YACxD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAoB,CAAC;YAC3C,MAAM,EAAE,GAAG,MAAM,EAAE,iBAAiB,CAAC;YACrC,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrD,OAAO;oBACL,IAAI,EAAE,KAAK;oBACX,MAAM,EAAE;wBACN,IAAI,EAAE,sBAAsB;wBAC5B,OAAO,EACL,gGAAgG;wBAClG,OAAO,EAAE;4BACP,cAAc,EAAE,mBAAmB;4BACnC,UAAU,EAAE,qDAAqD;4BACjE,aAAa,EAAE,uCAAuC;yBACvD;qBACF;iBACF,CAAC;YACJ,CAAC;YACD,0EAA0E;YAC1E,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;gBACtC,OAAO;oBACL,IAAI,EAAE,KAAK;oBACX,MAAM,EAAE;wBACN,IAAI,EAAE,4BAA4B;wBAClC,OAAO,EAAE,sBAAsB,EAAE,8DAA8D;wBAC/F,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;qBAC1B;iBACF,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACxB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,67 @@
1
+ import type { JsonValue } from "../envelope.js";
2
+ /**
3
+ * Regulatory verifier — Norm-AI-pattern, ported.
4
+ *
5
+ * Every action passes through the verifier before reaching the engine.
6
+ * Rules are pure functions over (action, context); failures emit a reason
7
+ * code analogous to ECOA adverse-action notices.
8
+ *
9
+ * Jurisdiction-specific rulesets are composed by selecting which rules
10
+ * are active. SR 11-7 / SR 26-02 / MiFID II / RTS 6 / FINRA 2026 / FCA
11
+ * Consumer Duty all become libraries of these predicates.
12
+ */
13
+ export interface VerifierAction {
14
+ /** Operation, e.g. "polymarket.market_make", "alts.nav_compute". */
15
+ readonly operation: string;
16
+ /** The request payload the agent is asking to execute. */
17
+ readonly inputs: JsonValue;
18
+ /** Materiality classification — used by rules to scale scrutiny. */
19
+ readonly materiality: "informational" | "operational" | "material";
20
+ }
21
+ export interface VerifierContext {
22
+ /** Session ID. */
23
+ readonly session_id: string;
24
+ /** Current positions, exposure, or other state rules may need to inspect. */
25
+ readonly state: JsonValue;
26
+ /** Jurisdiction tag — selects the active ruleset. */
27
+ readonly jurisdiction: "US" | "EU" | "UK" | "SG" | "HK" | "UAE" | "GLOBAL";
28
+ }
29
+ export interface RuleEvidence {
30
+ readonly code: string;
31
+ readonly summary: string;
32
+ readonly details: JsonValue;
33
+ }
34
+ export type RuleResult = {
35
+ readonly pass: true;
36
+ } | {
37
+ readonly pass: false;
38
+ readonly reason: RuleEvidence;
39
+ };
40
+ export interface Rule {
41
+ /** Stable identifier, e.g. "rule.position_limit", "rule.kelly_cap". */
42
+ readonly id: string;
43
+ /** Jurisdictions where this rule applies. */
44
+ readonly jurisdictions: ReadonlyArray<VerifierContext["jurisdiction"]>;
45
+ /** Operations the rule cares about. Match-all = "*". */
46
+ readonly operations: ReadonlyArray<string>;
47
+ /** Pure evaluator. */
48
+ evaluate(action: VerifierAction, context: VerifierContext): RuleResult;
49
+ }
50
+ export interface VerifierReport {
51
+ readonly ok: boolean;
52
+ readonly checks: ReadonlyArray<{
53
+ readonly rule_id: string;
54
+ readonly result: RuleResult;
55
+ }>;
56
+ }
57
+ /**
58
+ * Run all applicable rules. Returns a structured report. Short-circuit
59
+ * is intentionally not used: every applicable rule runs so audit logs
60
+ * record the full evaluation, not just the first failure.
61
+ */
62
+ export declare function runVerifier(rules: ReadonlyArray<Rule>, action: VerifierAction, context: VerifierContext): VerifierReport;
63
+ export * from "./position-limit.js";
64
+ export * from "./kelly-cap.js";
65
+ export * from "./eu-rts6.js";
66
+ export * from "./model-version.js";
67
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/verifier/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,cAAc;IAC7B,oEAAoE;IACpE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,oEAAoE;IACpE,QAAQ,CAAC,WAAW,EAAE,eAAe,GAAG,aAAa,GAAG,UAAU,CAAC;CACpE;AAED,MAAM,WAAW,eAAe;IAC9B,kBAAkB;IAClB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,6EAA6E;IAC7E,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,qDAAqD;IACrD,QAAQ,CAAC,YAAY,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,QAAQ,CAAC;CAC5E;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;CAC7B;AAED,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;CAAE,GACvB;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;CAAE,CAAC;AAE5D,MAAM,WAAW,IAAI;IACnB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAC;IACvE,wDAAwD;IACxD,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC3C,sBAAsB;IACtB,QAAQ,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,eAAe,GAAG,UAAU,CAAC;CACxE;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;QAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;KAC7B,CAAC,CAAC;CACJ;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,EAC1B,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,eAAe,GACvB,cAAc,CAchB;AAED,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Run all applicable rules. Returns a structured report. Short-circuit
3
+ * is intentionally not used: every applicable rule runs so audit logs
4
+ * record the full evaluation, not just the first failure.
5
+ */
6
+ export function runVerifier(rules, action, context) {
7
+ const applicable = rules.filter((r) => (r.jurisdictions.includes(context.jurisdiction) || r.jurisdictions.includes("GLOBAL")) &&
8
+ (r.operations.includes("*") || r.operations.includes(action.operation)));
9
+ const checks = applicable.map((rule) => ({
10
+ rule_id: rule.id,
11
+ result: rule.evaluate(action, context),
12
+ }));
13
+ return {
14
+ ok: checks.every((c) => c.result.pass),
15
+ checks,
16
+ };
17
+ }
18
+ export * from "./position-limit.js";
19
+ export * from "./kelly-cap.js";
20
+ export * from "./eu-rts6.js";
21
+ export * from "./model-version.js";
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/verifier/index.ts"],"names":[],"mappings":"AA6DA;;;;GAIG;AACH,MAAM,UAAU,WAAW,CACzB,KAA0B,EAC1B,MAAsB,EACtB,OAAwB;IAExB,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAC7B,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACtF,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAC1E,CAAC;IACF,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACvC,OAAO,EAAE,IAAI,CAAC,EAAE;QAChB,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;KACvC,CAAC,CAAC,CAAC;IACJ,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;QACtC,MAAM;KACP,CAAC;AACJ,CAAC;AAED,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { Rule } from "./index.js";
2
+ /**
3
+ * Kelly criterion cap — refuses position sizes above the Kelly fraction for
4
+ * the AI agent's stated probabilistic edge. The math: f* = (bp - q) / b
5
+ * where p = win prob, q = 1-p, b = decimal odds payoff.
6
+ *
7
+ * The agent must declare its `edge_probability` and `payoff_b` for any
8
+ * trade-shaped action. If the requested size exceeds Kelly, the rule
9
+ * vetoes. Half-Kelly is enforced by default — full Kelly is empirically
10
+ * too aggressive for any realistic edge estimate.
11
+ */
12
+ export interface KellyCapConfig {
13
+ /** Fraction of full Kelly allowed. 0.5 (half-Kelly) is the conventional default. */
14
+ readonly kelly_fraction: number;
15
+ /** Bankroll the Kelly fraction is computed against. */
16
+ readonly bankroll: number;
17
+ }
18
+ export declare function makeKellyCapRule(config: KellyCapConfig): Rule;
19
+ //# sourceMappingURL=kelly-cap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kelly-cap.d.ts","sourceRoot":"","sources":["../../src/verifier/kelly-cap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAA+C,MAAM,YAAY,CAAC;AAEpF;;;;;;;;;GASG;AAEH,MAAM,WAAW,cAAc;IAC7B,oFAAoF;IACpF,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,uDAAuD;IACvD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAQD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CA+D7D"}
@@ -0,0 +1,64 @@
1
+ export function makeKellyCapRule(config) {
2
+ return {
3
+ id: "rule.kelly_cap",
4
+ jurisdictions: ["GLOBAL"],
5
+ operations: ["polymarket.trade", "polymarket.market_make", "alts.allocate"],
6
+ evaluate(action, _context) {
7
+ const inputs = action.inputs;
8
+ const p = inputs?.edge_probability;
9
+ const b = inputs?.payoff_b;
10
+ const requested_notional = inputs?.notional ?? 0;
11
+ if (p === undefined || b === undefined) {
12
+ return {
13
+ pass: false,
14
+ reason: {
15
+ code: "KELLY_INPUTS_MISSING",
16
+ summary: "Trade-shaped action must declare edge_probability and payoff_b for Kelly sizing.",
17
+ details: { edge_probability: p ?? null, payoff_b: b ?? null },
18
+ },
19
+ };
20
+ }
21
+ if (!(p > 0 && p < 1) || b <= 0) {
22
+ return {
23
+ pass: false,
24
+ reason: {
25
+ code: "KELLY_INPUTS_INVALID",
26
+ summary: "edge_probability must be in (0,1) and payoff_b must be > 0.",
27
+ details: { edge_probability: p, payoff_b: b },
28
+ },
29
+ };
30
+ }
31
+ const q = 1 - p;
32
+ const full_kelly = (b * p - q) / b;
33
+ if (full_kelly <= 0) {
34
+ return {
35
+ pass: false,
36
+ reason: {
37
+ code: "KELLY_NEGATIVE_EDGE",
38
+ summary: "Implied Kelly fraction is non-positive; the bet has no edge.",
39
+ details: { kelly_fraction: full_kelly, p, b },
40
+ },
41
+ };
42
+ }
43
+ const allowed_notional = config.kelly_fraction * full_kelly * config.bankroll;
44
+ if (requested_notional > allowed_notional) {
45
+ return {
46
+ pass: false,
47
+ reason: {
48
+ code: "KELLY_CAP_EXCEEDED",
49
+ summary: `Notional ${requested_notional.toFixed(2)} exceeds ${(config.kelly_fraction * 100).toFixed(0)}%-Kelly cap of ${allowed_notional.toFixed(2)}.`,
50
+ details: {
51
+ full_kelly_fraction: full_kelly,
52
+ applied_fraction: config.kelly_fraction,
53
+ bankroll: config.bankroll,
54
+ allowed_notional,
55
+ requested_notional,
56
+ },
57
+ },
58
+ };
59
+ }
60
+ return { pass: true };
61
+ },
62
+ };
63
+ }
64
+ //# sourceMappingURL=kelly-cap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kelly-cap.js","sourceRoot":"","sources":["../../src/verifier/kelly-cap.ts"],"names":[],"mappings":"AA0BA,MAAM,UAAU,gBAAgB,CAAC,MAAsB;IACrD,OAAO;QACL,EAAE,EAAE,gBAAgB;QACpB,aAAa,EAAE,CAAC,QAAQ,CAAC;QACzB,UAAU,EAAE,CAAC,kBAAkB,EAAE,wBAAwB,EAAE,eAAe,CAAC;QAC3E,QAAQ,CAAC,MAAsB,EAAE,QAAyB;YACxD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAqB,CAAC;YAC5C,MAAM,CAAC,GAAG,MAAM,EAAE,gBAAgB,CAAC;YACnC,MAAM,CAAC,GAAG,MAAM,EAAE,QAAQ,CAAC;YAC3B,MAAM,kBAAkB,GAAG,MAAM,EAAE,QAAQ,IAAI,CAAC,CAAC;YACjD,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;gBACvC,OAAO;oBACL,IAAI,EAAE,KAAK;oBACX,MAAM,EAAE;wBACN,IAAI,EAAE,sBAAsB;wBAC5B,OAAO,EACL,kFAAkF;wBACpF,OAAO,EAAE,EAAE,gBAAgB,EAAE,CAAC,IAAI,IAAI,EAAE,QAAQ,EAAE,CAAC,IAAI,IAAI,EAAE;qBAC9D;iBACF,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,OAAO;oBACL,IAAI,EAAE,KAAK;oBACX,MAAM,EAAE;wBACN,IAAI,EAAE,sBAAsB;wBAC5B,OAAO,EAAE,6DAA6D;wBACtE,OAAO,EAAE,EAAE,gBAAgB,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE;qBAC9C;iBACF,CAAC;YACJ,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAChB,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACnC,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;gBACpB,OAAO;oBACL,IAAI,EAAE,KAAK;oBACX,MAAM,EAAE;wBACN,IAAI,EAAE,qBAAqB;wBAC3B,OAAO,EAAE,8DAA8D;wBACvE,OAAO,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE;qBAC9C;iBACF,CAAC;YACJ,CAAC;YACD,MAAM,gBAAgB,GAAG,MAAM,CAAC,cAAc,GAAG,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC;YAC9E,IAAI,kBAAkB,GAAG,gBAAgB,EAAE,CAAC;gBAC1C,OAAO;oBACL,IAAI,EAAE,KAAK;oBACX,MAAM,EAAE;wBACN,IAAI,EAAE,oBAAoB;wBAC1B,OAAO,EAAE,YAAY,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;wBACtJ,OAAO,EAAE;4BACP,mBAAmB,EAAE,UAAU;4BAC/B,gBAAgB,EAAE,MAAM,CAAC,cAAc;4BACvC,QAAQ,EAAE,MAAM,CAAC,QAAQ;4BACzB,gBAAgB;4BAChB,kBAAkB;yBACnB;qBACF;iBACF,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACxB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Rule } from "./index.js";
2
+ export declare function makeModelVersionPinnedRule(): Rule;
3
+ //# sourceMappingURL=model-version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-version.d.ts","sourceRoot":"","sources":["../../src/verifier/model-version.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAA+C,MAAM,YAAY,CAAC;AAoBpF,wBAAgB,0BAA0B,IAAI,IAAI,CA0BjD"}