@sponsio/sdk 0.1.0-alpha.3
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/contracts/capability/credentials.yaml +188 -0
- package/contracts/capability/database.yaml +141 -0
- package/contracts/capability/filesystem-strict.yaml +101 -0
- package/contracts/capability/filesystem.yaml +239 -0
- package/contracts/capability/self-modify.yaml +152 -0
- package/contracts/capability/shell.yaml +246 -0
- package/contracts/capability/subagent.yaml +184 -0
- package/contracts/core/llm_safety.yaml +130 -0
- package/contracts/core/runaway.yaml +43 -0
- package/contracts/core/universal.yaml +34 -0
- package/contracts/incident/claude-code-secret-bypass.yaml +197 -0
- package/contracts/incident/cursor-railway-wipe.yaml +164 -0
- package/contracts/incident/mcp-composition.yaml +418 -0
- package/contracts/incident/openclaw.yaml +500 -0
- package/contracts/incident/subagent-escape.yaml +177 -0
- package/contracts/premium/.gitkeep +7 -0
- package/dist/contract.d.ts +59 -0
- package/dist/contract.d.ts.map +1 -0
- package/dist/contract.js +97 -0
- package/dist/contract.js.map +1 -0
- package/dist/core/config-loader.d.ts +90 -0
- package/dist/core/config-loader.d.ts.map +1 -0
- package/dist/core/config-loader.js +530 -0
- package/dist/core/config-loader.js.map +1 -0
- package/dist/core/evaluator.d.ts +15 -0
- package/dist/core/evaluator.d.ts.map +1 -0
- package/dist/core/evaluator.js +87 -0
- package/dist/core/evaluator.js.map +1 -0
- package/dist/core/formula.d.ts +103 -0
- package/dist/core/formula.d.ts.map +1 -0
- package/dist/core/formula.js +167 -0
- package/dist/core/formula.js.map +1 -0
- package/dist/core/grounding.d.ts +43 -0
- package/dist/core/grounding.d.ts.map +1 -0
- package/dist/core/grounding.js +269 -0
- package/dist/core/grounding.js.map +1 -0
- package/dist/core/nl-parser.d.ts +12 -0
- package/dist/core/nl-parser.d.ts.map +1 -0
- package/dist/core/nl-parser.js +152 -0
- package/dist/core/nl-parser.js.map +1 -0
- package/dist/core/pack-loader.d.ts +15 -0
- package/dist/core/pack-loader.d.ts.map +1 -0
- package/dist/core/pack-loader.js +220 -0
- package/dist/core/pack-loader.js.map +1 -0
- package/dist/core/parser.d.ts +19 -0
- package/dist/core/parser.d.ts.map +1 -0
- package/dist/core/parser.js +235 -0
- package/dist/core/parser.js.map +1 -0
- package/dist/core/pattern-factory.d.ts +38 -0
- package/dist/core/pattern-factory.d.ts.map +1 -0
- package/dist/core/pattern-factory.js +222 -0
- package/dist/core/pattern-factory.js.map +1 -0
- package/dist/core/patterns.d.ts +67 -0
- package/dist/core/patterns.d.ts.map +1 -0
- package/dist/core/patterns.js +585 -0
- package/dist/core/patterns.js.map +1 -0
- package/dist/core/session-log.d.ts +91 -0
- package/dist/core/session-log.d.ts.map +1 -0
- package/dist/core/session-log.js +196 -0
- package/dist/core/session-log.js.map +1 -0
- package/dist/core/spans.d.ts +92 -0
- package/dist/core/spans.d.ts.map +1 -0
- package/dist/core/spans.js +148 -0
- package/dist/core/spans.js.map +1 -0
- package/dist/core/sto.d.ts +120 -0
- package/dist/core/sto.d.ts.map +1 -0
- package/dist/core/sto.js +147 -0
- package/dist/core/sto.js.map +1 -0
- package/dist/index.d.ts +267 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +540 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/claude-agent.d.ts +29 -0
- package/dist/integrations/claude-agent.d.ts.map +1 -0
- package/dist/integrations/claude-agent.js +40 -0
- package/dist/integrations/claude-agent.js.map +1 -0
- package/dist/integrations/google-adk.d.ts +27 -0
- package/dist/integrations/google-adk.d.ts.map +1 -0
- package/dist/integrations/google-adk.js +81 -0
- package/dist/integrations/google-adk.js.map +1 -0
- package/dist/integrations/langchain.d.ts +26 -0
- package/dist/integrations/langchain.d.ts.map +1 -0
- package/dist/integrations/langchain.js +74 -0
- package/dist/integrations/langchain.js.map +1 -0
- package/dist/integrations/openai-agents.d.ts +45 -0
- package/dist/integrations/openai-agents.d.ts.map +1 -0
- package/dist/integrations/openai-agents.js +81 -0
- package/dist/integrations/openai-agents.js.map +1 -0
- package/dist/integrations/openai.d.ts +24 -0
- package/dist/integrations/openai.d.ts.map +1 -0
- package/dist/integrations/openai.js +77 -0
- package/dist/integrations/openai.js.map +1 -0
- package/dist/integrations/vercel-ai.d.ts +38 -0
- package/dist/integrations/vercel-ai.d.ts.map +1 -0
- package/dist/integrations/vercel-ai.js +107 -0
- package/dist/integrations/vercel-ai.js.map +1 -0
- package/dist/render/components.d.ts +23 -0
- package/dist/render/components.d.ts.map +1 -0
- package/dist/render/components.js +133 -0
- package/dist/render/components.js.map +1 -0
- package/dist/render/derive.d.ts +23 -0
- package/dist/render/derive.d.ts.map +1 -0
- package/dist/render/derive.js +92 -0
- package/dist/render/derive.js.map +1 -0
- package/dist/render/session-view.d.ts +19 -0
- package/dist/render/session-view.d.ts.map +1 -0
- package/dist/render/session-view.js +236 -0
- package/dist/render/session-view.js.map +1 -0
- package/dist/render/tokens.d.ts +44 -0
- package/dist/render/tokens.d.ts.map +1 -0
- package/dist/render/tokens.js +72 -0
- package/dist/render/tokens.js.map +1 -0
- package/package.json +83 -0
|
@@ -0,0 +1,530 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* sponsio.yaml loader for the TypeScript runtime.
|
|
3
|
+
*
|
|
4
|
+
* Parses a Python-compatible sponsio.yaml into the shape the
|
|
5
|
+
* {@link Sponsio} constructor expects: a list of NL-string contracts
|
|
6
|
+
* plus runtime settings (mode, dashboard).
|
|
7
|
+
*
|
|
8
|
+
* Intentionally conservative — this loader understands the **subset**
|
|
9
|
+
* of the yaml schema that makes sense in TS today:
|
|
10
|
+
*
|
|
11
|
+
* - `runtime.mode` / `runtime.dashboard`
|
|
12
|
+
* - `agents.<id>.contracts[]` with either a plain-string `E:` field
|
|
13
|
+
* or a top-level `desc:` / direct-string entry. Structured
|
|
14
|
+
* `{ pattern, args }` forms that need pack-runtime support
|
|
15
|
+
* (token_budget, delegation_depth_limit, loop_detection, …)
|
|
16
|
+
* are *skipped with a warning* — the TS runtime does not ship
|
|
17
|
+
* pack infrastructure yet.
|
|
18
|
+
* - `include:` pack references are skipped with a warning for the
|
|
19
|
+
* same reason.
|
|
20
|
+
*
|
|
21
|
+
* The loader is therefore a **strict superset of inline TS usage**:
|
|
22
|
+
* contracts that work when passed as `contracts: string[]` to the
|
|
23
|
+
* ctor also work when loaded from yaml. More exotic Python-side
|
|
24
|
+
* features (sto contracts, packs, LTL patterns) are logged and
|
|
25
|
+
* ignored rather than crashing, so a user can share a single
|
|
26
|
+
* sponsio.yaml between Python and TS without the TS side refusing
|
|
27
|
+
* to start.
|
|
28
|
+
*/
|
|
29
|
+
import { readFileSync } from "node:fs";
|
|
30
|
+
import { createRequire } from "node:module";
|
|
31
|
+
import { buildPatternByName, isAePair, PatternFactoryError, } from "./pattern-factory.js";
|
|
32
|
+
import { parseRepr, ParseError } from "./parser.js";
|
|
33
|
+
import { And, G, Implies } from "./formula.js";
|
|
34
|
+
import { loadPackContracts } from "./pack-loader.js";
|
|
35
|
+
import { dirname, resolve as resolvePath } from "node:path";
|
|
36
|
+
// Use createRequire so we can lazily load the optional `yaml` package
|
|
37
|
+
// without breaking non-yaml users (ESM dynamic import would force the
|
|
38
|
+
// entire constructor path async, which we don't want).
|
|
39
|
+
const requireCjs = createRequire(import.meta.url);
|
|
40
|
+
function loadYamlLib() {
|
|
41
|
+
try {
|
|
42
|
+
return requireCjs("yaml");
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
throw new Error("[sponsio] config loading requires the `yaml` package. " +
|
|
46
|
+
"Install it with: npm install yaml");
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Load sponsio.yaml and project it onto the TS runtime's contract
|
|
51
|
+
* surface. Reads synchronously so it can be called from a ctor.
|
|
52
|
+
*
|
|
53
|
+
* @param path Path to sponsio.yaml (absolute or CWD-relative).
|
|
54
|
+
* @param agentId Which agent block to pull contracts from. Falls
|
|
55
|
+
* back to `agents["*"]` (the wildcard block used by
|
|
56
|
+
* packs) if `agentId` is missing.
|
|
57
|
+
*/
|
|
58
|
+
export function loadSponsoConfig(path, agentId) {
|
|
59
|
+
const yamlLib = loadYamlLib();
|
|
60
|
+
let raw;
|
|
61
|
+
try {
|
|
62
|
+
raw = readFileSync(path, "utf-8");
|
|
63
|
+
}
|
|
64
|
+
catch (e) {
|
|
65
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
66
|
+
throw new Error(`[sponsio] cannot read config ${path}: ${msg}`);
|
|
67
|
+
}
|
|
68
|
+
let parsed;
|
|
69
|
+
try {
|
|
70
|
+
parsed = yamlLib.parse(raw);
|
|
71
|
+
}
|
|
72
|
+
catch (e) {
|
|
73
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
74
|
+
throw new Error(`[sponsio] invalid yaml in ${path}: ${msg}`);
|
|
75
|
+
}
|
|
76
|
+
if (!isObject(parsed)) {
|
|
77
|
+
throw new Error(`[sponsio] ${path}: expected a YAML mapping at the top level`);
|
|
78
|
+
}
|
|
79
|
+
const skipped = [];
|
|
80
|
+
const contracts = [];
|
|
81
|
+
const stoSpecs = [];
|
|
82
|
+
const runtime = getObject(parsed["runtime"]);
|
|
83
|
+
const mode = extractMode(runtime);
|
|
84
|
+
const dashboard = extractDashboard(runtime);
|
|
85
|
+
const judge = extractJudge(parsed["judge"]);
|
|
86
|
+
const agents = getObject(parsed["agents"]);
|
|
87
|
+
const agentBlock = agents
|
|
88
|
+
? (getObject(agents[agentId]) ?? getObject(agents["*"]) ?? null)
|
|
89
|
+
: null;
|
|
90
|
+
if (agentBlock) {
|
|
91
|
+
extractAgentContracts(agentBlock, contracts, stoSpecs, skipped);
|
|
92
|
+
}
|
|
93
|
+
// `include:` resolution. Both placements are supported (agent-level
|
|
94
|
+
// and top-level) for legacy reasons; agent-level takes precedence
|
|
95
|
+
// since it scopes pack additions to a specific agent. Each pack's
|
|
96
|
+
// contracts are projected through the same pipeline as user-yaml
|
|
97
|
+
// contracts.
|
|
98
|
+
const baseDir = dirname(resolvePath(path));
|
|
99
|
+
const agentIncludes = agentBlock?.["include"];
|
|
100
|
+
expandIncludes(agentIncludes, baseDir, contracts, stoSpecs, skipped);
|
|
101
|
+
expandIncludes(parsed["include"], baseDir, contracts, stoSpecs, skipped);
|
|
102
|
+
return { contracts, stoSpecs, judge, mode, dashboard, skipped };
|
|
103
|
+
}
|
|
104
|
+
function expandIncludes(raw, baseDir, detOut, stoOut, skipped) {
|
|
105
|
+
if (!Array.isArray(raw))
|
|
106
|
+
return;
|
|
107
|
+
for (const spec of raw) {
|
|
108
|
+
if (typeof spec !== "string") {
|
|
109
|
+
skipped.push({ kind: "pack", detail: `include entry must be a string, got ${typeof spec}` });
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
const items = loadPackContracts(spec, baseDir, new Set(), skipped);
|
|
113
|
+
for (const item of items) {
|
|
114
|
+
const projected = projectContract(item.raw);
|
|
115
|
+
if (projected.kind === "nl")
|
|
116
|
+
detOut.push(projected.value);
|
|
117
|
+
else if (projected.kind === "det")
|
|
118
|
+
detOut.push(projected.value);
|
|
119
|
+
else if (projected.kind === "sto")
|
|
120
|
+
stoOut.push(projected.value);
|
|
121
|
+
else
|
|
122
|
+
skipped.push(projected.reason);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
function extractJudge(raw) {
|
|
127
|
+
if (!isObject(raw))
|
|
128
|
+
return undefined;
|
|
129
|
+
const provider = raw["provider"];
|
|
130
|
+
const model = raw["model"];
|
|
131
|
+
const apiKey = raw["api_key"];
|
|
132
|
+
const baseUrl = raw["base_url"];
|
|
133
|
+
const fallbackMode = raw["fallback_mode"];
|
|
134
|
+
const spec = {};
|
|
135
|
+
if (provider === "openai")
|
|
136
|
+
spec.provider = provider;
|
|
137
|
+
if (typeof model === "string")
|
|
138
|
+
spec.model = model;
|
|
139
|
+
if (typeof apiKey === "string" && apiKey)
|
|
140
|
+
spec.apiKey = apiKey;
|
|
141
|
+
if (typeof baseUrl === "string" && baseUrl)
|
|
142
|
+
spec.baseUrl = baseUrl;
|
|
143
|
+
if (fallbackMode === "allow" ||
|
|
144
|
+
fallbackMode === "deny" ||
|
|
145
|
+
fallbackMode === "skip") {
|
|
146
|
+
spec.fallbackMode = fallbackMode;
|
|
147
|
+
}
|
|
148
|
+
return Object.keys(spec).length > 0 ? spec : undefined;
|
|
149
|
+
}
|
|
150
|
+
/* -----------------------------------------------------------------
|
|
151
|
+
* helpers
|
|
152
|
+
* -----------------------------------------------------------------*/
|
|
153
|
+
function extractMode(runtime) {
|
|
154
|
+
if (!runtime)
|
|
155
|
+
return undefined;
|
|
156
|
+
const m = runtime["mode"];
|
|
157
|
+
if (m === "enforce" || m === "observe")
|
|
158
|
+
return m;
|
|
159
|
+
return undefined;
|
|
160
|
+
}
|
|
161
|
+
function extractDashboard(runtime) {
|
|
162
|
+
if (!runtime)
|
|
163
|
+
return undefined;
|
|
164
|
+
const d = runtime["dashboard"];
|
|
165
|
+
if (typeof d === "string" || typeof d === "boolean")
|
|
166
|
+
return d;
|
|
167
|
+
return undefined;
|
|
168
|
+
}
|
|
169
|
+
function extractAgentContracts(agent, detOut, stoOut, skipped) {
|
|
170
|
+
const raw = agent["contracts"];
|
|
171
|
+
if (!Array.isArray(raw))
|
|
172
|
+
return;
|
|
173
|
+
for (const entry of raw) {
|
|
174
|
+
const projected = projectContract(entry);
|
|
175
|
+
if (projected.kind === "nl") {
|
|
176
|
+
detOut.push(projected.value);
|
|
177
|
+
}
|
|
178
|
+
else if (projected.kind === "det") {
|
|
179
|
+
detOut.push(projected.value);
|
|
180
|
+
}
|
|
181
|
+
else if (projected.kind === "sto") {
|
|
182
|
+
stoOut.push(projected.value);
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
skipped.push(projected.reason);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
const STO_ATOMS = new Set([
|
|
190
|
+
"tone",
|
|
191
|
+
"llm_judge",
|
|
192
|
+
"relevance",
|
|
193
|
+
"semantic_pii_free",
|
|
194
|
+
"hallucination_free",
|
|
195
|
+
"scope_respect",
|
|
196
|
+
"metric_integrity",
|
|
197
|
+
"injection_free",
|
|
198
|
+
]);
|
|
199
|
+
function projectContract(entry) {
|
|
200
|
+
// Simplest form: a bare string on the contracts list.
|
|
201
|
+
if (typeof entry === "string") {
|
|
202
|
+
return { kind: "nl", value: entry };
|
|
203
|
+
}
|
|
204
|
+
if (!isObject(entry)) {
|
|
205
|
+
return {
|
|
206
|
+
kind: "skip",
|
|
207
|
+
reason: {
|
|
208
|
+
kind: "unknown-contract",
|
|
209
|
+
detail: `unexpected contract entry type: ${typeof entry}`,
|
|
210
|
+
},
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
// Accept both short-key (``A`` / ``E``) and long-key
|
|
214
|
+
// (``assumption`` / ``enforcement``) — matches Python's loader.
|
|
215
|
+
const eField = entry["E"] ?? entry["enforcement"];
|
|
216
|
+
const aField = entry["A"] ?? entry["assumption"];
|
|
217
|
+
const desc = stringOr(entry["desc"], "");
|
|
218
|
+
// Legacy ``sto: true`` flag without a structured pattern — caller
|
|
219
|
+
// declared intent to run a stochastic rule but didn't pick an
|
|
220
|
+
// atom. Skip with reason so the user knows to switch to
|
|
221
|
+
// ``E: { pattern: tone | llm_judge, args, threshold }``.
|
|
222
|
+
if (entry["sto"] === true || entry["type"] === "sto") {
|
|
223
|
+
if (!(isObject(eField) && "pattern" in eField)) {
|
|
224
|
+
return {
|
|
225
|
+
kind: "skip",
|
|
226
|
+
reason: {
|
|
227
|
+
kind: "sto-contract",
|
|
228
|
+
detail: desc ||
|
|
229
|
+
"sto flag set without a `pattern:` (use pattern: tone | llm_judge)",
|
|
230
|
+
},
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// Sto takes priority — if ``E.pattern`` matches a known sto atom,
|
|
235
|
+
// route straight to the sto spec builder (no A-side composition
|
|
236
|
+
// is supported for sto today, matching Python).
|
|
237
|
+
if (isObject(eField) && typeof eField["pattern"] === "string") {
|
|
238
|
+
const pattern = String(eField["pattern"]);
|
|
239
|
+
if (STO_ATOMS.has(pattern)) {
|
|
240
|
+
return projectSto(pattern, eField, desc);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
// ``desc:`` as sole contract body — matches the old loader's
|
|
244
|
+
// lossy-but-useful fallback when the user wrote only a human
|
|
245
|
+
// description. Runs before ``buildConstraint`` so the "missing E"
|
|
246
|
+
// error doesn't preempt it.
|
|
247
|
+
if (eField === undefined && aField === undefined && desc) {
|
|
248
|
+
return { kind: "nl", value: desc };
|
|
249
|
+
}
|
|
250
|
+
// Build the enforcement formula. Possible shapes:
|
|
251
|
+
// - string: NL
|
|
252
|
+
// - { pattern: X, args: [...] }: structured det
|
|
253
|
+
// - { ltl: "G(…)" }: raw LTL
|
|
254
|
+
// - list of any of the above: AND-combined
|
|
255
|
+
const eBuilt = buildConstraint(eField, "E", desc);
|
|
256
|
+
if (eBuilt.kind === "skip")
|
|
257
|
+
return eBuilt;
|
|
258
|
+
if (eBuilt.kind === "nl-string") {
|
|
259
|
+
// No A-side composition for NL strings — the NL parser already
|
|
260
|
+
// handles conditional forms ("if X then Y") via its own rules.
|
|
261
|
+
if (aField !== undefined) {
|
|
262
|
+
// User wrote an A alongside an NL E — we can't cleanly compose
|
|
263
|
+
// without reparsing both sides, so fall through to NL-only with
|
|
264
|
+
// a note in skipped so they know A was dropped.
|
|
265
|
+
return { kind: "nl", value: eBuilt.value };
|
|
266
|
+
}
|
|
267
|
+
return { kind: "nl", value: eBuilt.value };
|
|
268
|
+
}
|
|
269
|
+
// We have a structured E formula. Compose with A if present.
|
|
270
|
+
if (aField !== undefined) {
|
|
271
|
+
const aBuilt = buildConstraint(aField, "A", desc);
|
|
272
|
+
if (aBuilt.kind === "skip")
|
|
273
|
+
return aBuilt;
|
|
274
|
+
if (aBuilt.kind === "nl-string") {
|
|
275
|
+
// NL on A side composes poorly with a structured E — would
|
|
276
|
+
// need to re-parse, defer to Python. Surface as skipped.
|
|
277
|
+
return {
|
|
278
|
+
kind: "skip",
|
|
279
|
+
reason: {
|
|
280
|
+
kind: "structured-contract",
|
|
281
|
+
detail: `${desc || "contract"}: mixed NL A with structured E not supported in TS`,
|
|
282
|
+
},
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
// Both sides structured: compose as ``G(A -> E)``. ``G`` is
|
|
286
|
+
// required because ``evaluate`` runs from ``pos=0``; a bare
|
|
287
|
+
// ``Implies(A, E)`` short-circuits to ``true`` whenever ``A`` is
|
|
288
|
+
// false at step 0, regardless of later events. Lifting the
|
|
289
|
+
// implication under ``G`` makes it fire at every state where the
|
|
290
|
+
// assumption holds.
|
|
291
|
+
const composed = {
|
|
292
|
+
formula: new G(new Implies(aBuilt.formula.formula, eBuilt.formula.formula)),
|
|
293
|
+
desc: desc || `${aBuilt.formula.desc} => ${eBuilt.formula.desc}`,
|
|
294
|
+
patternName: `${aBuilt.formula.patternName}__implies__${eBuilt.formula.patternName}`,
|
|
295
|
+
liveness: eBuilt.formula.liveness,
|
|
296
|
+
};
|
|
297
|
+
return { kind: "det", value: composed };
|
|
298
|
+
}
|
|
299
|
+
// Plain structured E, no A.
|
|
300
|
+
const naked = {
|
|
301
|
+
formula: eBuilt.formula.formula,
|
|
302
|
+
desc: desc || eBuilt.formula.desc,
|
|
303
|
+
patternName: eBuilt.formula.patternName,
|
|
304
|
+
liveness: eBuilt.formula.liveness,
|
|
305
|
+
};
|
|
306
|
+
return { kind: "det", value: naked };
|
|
307
|
+
}
|
|
308
|
+
/** Parse one side (A or E) of a yaml contract into a DetFormula or
|
|
309
|
+
* an NL string. Lists are AND-combined pairwise. */
|
|
310
|
+
function buildConstraint(raw, side, parentDesc) {
|
|
311
|
+
if (raw === undefined || raw === null) {
|
|
312
|
+
if (side === "A") {
|
|
313
|
+
// A is optional — caller falls through to plain-E path.
|
|
314
|
+
return {
|
|
315
|
+
kind: "skip",
|
|
316
|
+
reason: {
|
|
317
|
+
kind: "unknown-contract",
|
|
318
|
+
detail: `${parentDesc || "contract"}: missing ${side}:`,
|
|
319
|
+
},
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
return {
|
|
323
|
+
kind: "skip",
|
|
324
|
+
reason: {
|
|
325
|
+
kind: "unknown-contract",
|
|
326
|
+
detail: `${parentDesc || "contract"}: missing E: / enforcement:`,
|
|
327
|
+
},
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
if (typeof raw === "string") {
|
|
331
|
+
const trimmed = raw.trim();
|
|
332
|
+
if (!trimmed) {
|
|
333
|
+
return {
|
|
334
|
+
kind: "skip",
|
|
335
|
+
reason: {
|
|
336
|
+
kind: "unknown-contract",
|
|
337
|
+
detail: `${parentDesc || "contract"}: empty ${side}:`,
|
|
338
|
+
},
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
return { kind: "nl-string", value: trimmed };
|
|
342
|
+
}
|
|
343
|
+
if (Array.isArray(raw)) {
|
|
344
|
+
// AND-combine every item; every item must itself be structured
|
|
345
|
+
// (list of bare NL strings on the A/E side is unusual and would
|
|
346
|
+
// compose ambiguously through parseNl — defer to Python).
|
|
347
|
+
const parts = [];
|
|
348
|
+
for (const item of raw) {
|
|
349
|
+
const r = buildConstraint(item, side, parentDesc);
|
|
350
|
+
if (r.kind !== "formula") {
|
|
351
|
+
return {
|
|
352
|
+
kind: "skip",
|
|
353
|
+
reason: {
|
|
354
|
+
kind: "structured-contract",
|
|
355
|
+
detail: `${parentDesc || "contract"}: list-valued ${side} mixes shapes TS can't merge`,
|
|
356
|
+
},
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
parts.push(r.formula);
|
|
360
|
+
}
|
|
361
|
+
if (parts.length === 0) {
|
|
362
|
+
return {
|
|
363
|
+
kind: "skip",
|
|
364
|
+
reason: {
|
|
365
|
+
kind: "unknown-contract",
|
|
366
|
+
detail: `${parentDesc || "contract"}: empty list ${side}:`,
|
|
367
|
+
},
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
const combined = parts
|
|
371
|
+
.map((p) => p.formula)
|
|
372
|
+
.reduce((acc, f) => (acc ? new And(acc, f) : f), undefined);
|
|
373
|
+
return {
|
|
374
|
+
kind: "formula",
|
|
375
|
+
formula: {
|
|
376
|
+
formula: combined,
|
|
377
|
+
desc: parts.map((p) => p.desc).join(" ∧ "),
|
|
378
|
+
patternName: "and_of_" + parts.map((p) => p.patternName).join("_"),
|
|
379
|
+
liveness: parts.some((p) => p.liveness),
|
|
380
|
+
},
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
if (!isObject(raw)) {
|
|
384
|
+
return {
|
|
385
|
+
kind: "skip",
|
|
386
|
+
reason: {
|
|
387
|
+
kind: "unknown-contract",
|
|
388
|
+
detail: `${parentDesc || "contract"}: ${side} must be string / mapping / list`,
|
|
389
|
+
},
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
// { ltl: "G(!called(foo))" } — raw formula, parsed via parseRepr.
|
|
393
|
+
const ltl = raw["ltl"];
|
|
394
|
+
if (typeof ltl === "string" && ltl.trim()) {
|
|
395
|
+
try {
|
|
396
|
+
const f = parseRepr(ltl);
|
|
397
|
+
return {
|
|
398
|
+
kind: "formula",
|
|
399
|
+
formula: {
|
|
400
|
+
formula: f,
|
|
401
|
+
desc: parentDesc || `ltl(${ltl})`,
|
|
402
|
+
patternName: "ltl",
|
|
403
|
+
liveness: false,
|
|
404
|
+
},
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
catch (err) {
|
|
408
|
+
const msg = err instanceof ParseError ? err.message : String(err);
|
|
409
|
+
return {
|
|
410
|
+
kind: "skip",
|
|
411
|
+
reason: {
|
|
412
|
+
kind: "structured-contract",
|
|
413
|
+
detail: `${parentDesc || "contract"}: ${side}.ltl parse error — ${msg}`,
|
|
414
|
+
},
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
// { pattern: <name>, args: [...] } — structured det pattern.
|
|
419
|
+
if (typeof raw["pattern"] === "string") {
|
|
420
|
+
const pattern = String(raw["pattern"]);
|
|
421
|
+
const args = Array.isArray(raw["args"]) ? raw["args"] : [];
|
|
422
|
+
try {
|
|
423
|
+
const built = buildPatternByName(pattern, args);
|
|
424
|
+
if (built === null) {
|
|
425
|
+
return {
|
|
426
|
+
kind: "skip",
|
|
427
|
+
reason: {
|
|
428
|
+
kind: "structured-contract",
|
|
429
|
+
detail: parentDesc || `pattern=${pattern}`,
|
|
430
|
+
},
|
|
431
|
+
};
|
|
432
|
+
}
|
|
433
|
+
const det = isAePair(built) ? built.enforcement : built;
|
|
434
|
+
return { kind: "formula", formula: det };
|
|
435
|
+
}
|
|
436
|
+
catch (err) {
|
|
437
|
+
const msg = err instanceof PatternFactoryError ? err.message : String(err);
|
|
438
|
+
return {
|
|
439
|
+
kind: "skip",
|
|
440
|
+
reason: {
|
|
441
|
+
kind: "structured-contract",
|
|
442
|
+
detail: `${parentDesc || "contract"}: pattern=${pattern} — ${msg}`,
|
|
443
|
+
},
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
// { nl: "..." } — rare, but Python accepts it. Treat as NL string.
|
|
448
|
+
if (typeof raw["nl"] === "string" && raw["nl"].trim()) {
|
|
449
|
+
return { kind: "nl-string", value: raw["nl"].trim() };
|
|
450
|
+
}
|
|
451
|
+
return {
|
|
452
|
+
kind: "skip",
|
|
453
|
+
reason: {
|
|
454
|
+
kind: "unknown-contract",
|
|
455
|
+
detail: `${parentDesc || "contract"}: ${side} has no pattern / ltl / nl`,
|
|
456
|
+
},
|
|
457
|
+
};
|
|
458
|
+
}
|
|
459
|
+
function projectSto(atom, eField, desc) {
|
|
460
|
+
const rawThreshold = eField["threshold"];
|
|
461
|
+
let threshold = 0.7;
|
|
462
|
+
if (typeof rawThreshold === "number" && Number.isFinite(rawThreshold)) {
|
|
463
|
+
threshold = clamp01(rawThreshold);
|
|
464
|
+
}
|
|
465
|
+
const args = [];
|
|
466
|
+
const rawArgs = eField["args"];
|
|
467
|
+
if (Array.isArray(rawArgs)) {
|
|
468
|
+
for (const a of rawArgs) {
|
|
469
|
+
if (typeof a === "string" || typeof a === "number")
|
|
470
|
+
args.push(String(a));
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
const promptOverride = typeof eField["prompt_override"] === "string"
|
|
474
|
+
? eField["prompt_override"]
|
|
475
|
+
: undefined;
|
|
476
|
+
// Per-atom arg requirements — tone/scope_respect need at least
|
|
477
|
+
// one arg (the target tone / scope blurb). Other atoms run
|
|
478
|
+
// unconditionally on the output (+ optional context fields set
|
|
479
|
+
// via guard.setContext).
|
|
480
|
+
if ((atom === "tone" || atom === "scope_respect") && args.length === 0) {
|
|
481
|
+
const need = atom === "tone" ? "[target_tone]" : "[scope_description]";
|
|
482
|
+
return {
|
|
483
|
+
kind: "skip",
|
|
484
|
+
reason: {
|
|
485
|
+
kind: "sto-contract",
|
|
486
|
+
detail: `${desc || atom} (missing args: expected ${need})`,
|
|
487
|
+
},
|
|
488
|
+
};
|
|
489
|
+
}
|
|
490
|
+
const defaultDesc = atom === "tone"
|
|
491
|
+
? `tone(${args[0]})`
|
|
492
|
+
: atom === "scope_respect"
|
|
493
|
+
? `scope_respect(${args[0]})`
|
|
494
|
+
: atom;
|
|
495
|
+
const spec = {
|
|
496
|
+
atom,
|
|
497
|
+
desc: desc || defaultDesc,
|
|
498
|
+
threshold,
|
|
499
|
+
args,
|
|
500
|
+
};
|
|
501
|
+
if (promptOverride)
|
|
502
|
+
spec.promptOverride = promptOverride;
|
|
503
|
+
return { kind: "sto", value: spec };
|
|
504
|
+
}
|
|
505
|
+
function clamp01(n) {
|
|
506
|
+
if (n < 0)
|
|
507
|
+
return 0;
|
|
508
|
+
if (n > 1)
|
|
509
|
+
return 1;
|
|
510
|
+
return n;
|
|
511
|
+
}
|
|
512
|
+
function recordIncludes(raw, skipped) {
|
|
513
|
+
if (!Array.isArray(raw))
|
|
514
|
+
return;
|
|
515
|
+
for (const pack of raw) {
|
|
516
|
+
if (typeof pack === "string") {
|
|
517
|
+
skipped.push({ kind: "pack", detail: pack });
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
function isObject(v) {
|
|
522
|
+
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
523
|
+
}
|
|
524
|
+
function getObject(v) {
|
|
525
|
+
return isObject(v) ? v : null;
|
|
526
|
+
}
|
|
527
|
+
function stringOr(v, fallback) {
|
|
528
|
+
return typeof v === "string" ? v : fallback;
|
|
529
|
+
}
|
|
530
|
+
//# sourceMappingURL=config-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/core/config-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Finite-trace LTL evaluator with weak semantics.
|
|
3
|
+
*
|
|
4
|
+
* Direct port of sponsio/formulas/evaluator.py.
|
|
5
|
+
*
|
|
6
|
+
* Weak finite-trace semantics at trace end:
|
|
7
|
+
* G(φ) → true (vacuously globally)
|
|
8
|
+
* F(φ) → false (never eventually)
|
|
9
|
+
* U → false (ψ never discharged)
|
|
10
|
+
* X(φ) → true (weak next)
|
|
11
|
+
*/
|
|
12
|
+
import { Formula } from "./formula.js";
|
|
13
|
+
export type Valuation = Record<string, boolean | number>;
|
|
14
|
+
export declare function evaluate(formula: Formula, trace: Valuation[], pos?: number): boolean;
|
|
15
|
+
//# sourceMappingURL=evaluator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluator.d.ts","sourceRoot":"","sources":["../../src/core/evaluator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,OAAO,EAIR,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,CAAC;AAUzD,wBAAgB,QAAQ,CACtB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,SAAS,EAAE,EAClB,GAAG,GAAE,MAAU,GACd,OAAO,CA6ET"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Finite-trace LTL evaluator with weak semantics.
|
|
3
|
+
*
|
|
4
|
+
* Direct port of sponsio/formulas/evaluator.py.
|
|
5
|
+
*
|
|
6
|
+
* Weak finite-trace semantics at trace end:
|
|
7
|
+
* G(φ) → true (vacuously globally)
|
|
8
|
+
* F(φ) → false (never eventually)
|
|
9
|
+
* U → false (ψ never discharged)
|
|
10
|
+
* X(φ) → true (weak next)
|
|
11
|
+
*/
|
|
12
|
+
function resolveArith(expr, state) {
|
|
13
|
+
if (expr.kind === "Const")
|
|
14
|
+
return expr.value;
|
|
15
|
+
const key = expr.key();
|
|
16
|
+
const val = state[key];
|
|
17
|
+
if (typeof val === "number")
|
|
18
|
+
return val;
|
|
19
|
+
return 0; // default for missing variables
|
|
20
|
+
}
|
|
21
|
+
export function evaluate(formula, trace, pos = 0) {
|
|
22
|
+
// Past end of trace — weak semantics
|
|
23
|
+
if (pos >= trace.length) {
|
|
24
|
+
if (formula.kind === "F" || formula.kind === "U")
|
|
25
|
+
return false;
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
const state = trace[pos];
|
|
29
|
+
// --- Propositional ---
|
|
30
|
+
switch (formula.kind) {
|
|
31
|
+
case "Atom":
|
|
32
|
+
return Boolean(state[formula.key()] ?? false);
|
|
33
|
+
case "Not":
|
|
34
|
+
return !evaluate(formula.child, trace, pos);
|
|
35
|
+
case "And":
|
|
36
|
+
return evaluate(formula.left, trace, pos) && evaluate(formula.right, trace, pos);
|
|
37
|
+
case "Or":
|
|
38
|
+
return evaluate(formula.left, trace, pos) || evaluate(formula.right, trace, pos);
|
|
39
|
+
case "Implies":
|
|
40
|
+
return !evaluate(formula.left, trace, pos) || evaluate(formula.right, trace, pos);
|
|
41
|
+
// --- Temporal ---
|
|
42
|
+
case "G":
|
|
43
|
+
for (let i = pos; i < trace.length; i++) {
|
|
44
|
+
if (!evaluate(formula.child, trace, i))
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
return true;
|
|
48
|
+
case "F":
|
|
49
|
+
for (let i = pos; i < trace.length; i++) {
|
|
50
|
+
if (evaluate(formula.child, trace, i))
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
return false;
|
|
54
|
+
case "X":
|
|
55
|
+
if (pos + 1 >= trace.length)
|
|
56
|
+
return true; // weak next
|
|
57
|
+
return evaluate(formula.child, trace, pos + 1);
|
|
58
|
+
case "U":
|
|
59
|
+
for (let j = pos; j < trace.length; j++) {
|
|
60
|
+
if (evaluate(formula.right, trace, j))
|
|
61
|
+
return true;
|
|
62
|
+
if (!evaluate(formula.left, trace, j))
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
return false; // ψ never became true
|
|
66
|
+
// --- Arithmetic ---
|
|
67
|
+
case "Le":
|
|
68
|
+
return resolveArith(formula.left, state) <= resolveArith(formula.right, state);
|
|
69
|
+
case "Lt":
|
|
70
|
+
return resolveArith(formula.left, state) < resolveArith(formula.right, state);
|
|
71
|
+
case "Ge":
|
|
72
|
+
return resolveArith(formula.left, state) >= resolveArith(formula.right, state);
|
|
73
|
+
case "Gt":
|
|
74
|
+
return resolveArith(formula.left, state) > resolveArith(formula.right, state);
|
|
75
|
+
case "Eq":
|
|
76
|
+
return resolveArith(formula.left, state) === resolveArith(formula.right, state);
|
|
77
|
+
case "Var":
|
|
78
|
+
return Boolean(state[formula.key()] ?? false);
|
|
79
|
+
case "Const":
|
|
80
|
+
return formula.value !== 0;
|
|
81
|
+
default: {
|
|
82
|
+
const _exhaustive = formula;
|
|
83
|
+
throw new Error(`Unknown formula kind: ${_exhaustive.kind}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=evaluator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../../src/core/evaluator.ts"],"names":[],"mappings":"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"}
|