@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.
Files changed (113) hide show
  1. package/contracts/capability/credentials.yaml +188 -0
  2. package/contracts/capability/database.yaml +141 -0
  3. package/contracts/capability/filesystem-strict.yaml +101 -0
  4. package/contracts/capability/filesystem.yaml +239 -0
  5. package/contracts/capability/self-modify.yaml +152 -0
  6. package/contracts/capability/shell.yaml +246 -0
  7. package/contracts/capability/subagent.yaml +184 -0
  8. package/contracts/core/llm_safety.yaml +130 -0
  9. package/contracts/core/runaway.yaml +43 -0
  10. package/contracts/core/universal.yaml +34 -0
  11. package/contracts/incident/claude-code-secret-bypass.yaml +197 -0
  12. package/contracts/incident/cursor-railway-wipe.yaml +164 -0
  13. package/contracts/incident/mcp-composition.yaml +418 -0
  14. package/contracts/incident/openclaw.yaml +500 -0
  15. package/contracts/incident/subagent-escape.yaml +177 -0
  16. package/contracts/premium/.gitkeep +7 -0
  17. package/dist/contract.d.ts +59 -0
  18. package/dist/contract.d.ts.map +1 -0
  19. package/dist/contract.js +97 -0
  20. package/dist/contract.js.map +1 -0
  21. package/dist/core/config-loader.d.ts +90 -0
  22. package/dist/core/config-loader.d.ts.map +1 -0
  23. package/dist/core/config-loader.js +530 -0
  24. package/dist/core/config-loader.js.map +1 -0
  25. package/dist/core/evaluator.d.ts +15 -0
  26. package/dist/core/evaluator.d.ts.map +1 -0
  27. package/dist/core/evaluator.js +87 -0
  28. package/dist/core/evaluator.js.map +1 -0
  29. package/dist/core/formula.d.ts +103 -0
  30. package/dist/core/formula.d.ts.map +1 -0
  31. package/dist/core/formula.js +167 -0
  32. package/dist/core/formula.js.map +1 -0
  33. package/dist/core/grounding.d.ts +43 -0
  34. package/dist/core/grounding.d.ts.map +1 -0
  35. package/dist/core/grounding.js +269 -0
  36. package/dist/core/grounding.js.map +1 -0
  37. package/dist/core/nl-parser.d.ts +12 -0
  38. package/dist/core/nl-parser.d.ts.map +1 -0
  39. package/dist/core/nl-parser.js +152 -0
  40. package/dist/core/nl-parser.js.map +1 -0
  41. package/dist/core/pack-loader.d.ts +15 -0
  42. package/dist/core/pack-loader.d.ts.map +1 -0
  43. package/dist/core/pack-loader.js +220 -0
  44. package/dist/core/pack-loader.js.map +1 -0
  45. package/dist/core/parser.d.ts +19 -0
  46. package/dist/core/parser.d.ts.map +1 -0
  47. package/dist/core/parser.js +235 -0
  48. package/dist/core/parser.js.map +1 -0
  49. package/dist/core/pattern-factory.d.ts +38 -0
  50. package/dist/core/pattern-factory.d.ts.map +1 -0
  51. package/dist/core/pattern-factory.js +222 -0
  52. package/dist/core/pattern-factory.js.map +1 -0
  53. package/dist/core/patterns.d.ts +67 -0
  54. package/dist/core/patterns.d.ts.map +1 -0
  55. package/dist/core/patterns.js +585 -0
  56. package/dist/core/patterns.js.map +1 -0
  57. package/dist/core/session-log.d.ts +91 -0
  58. package/dist/core/session-log.d.ts.map +1 -0
  59. package/dist/core/session-log.js +196 -0
  60. package/dist/core/session-log.js.map +1 -0
  61. package/dist/core/spans.d.ts +92 -0
  62. package/dist/core/spans.d.ts.map +1 -0
  63. package/dist/core/spans.js +148 -0
  64. package/dist/core/spans.js.map +1 -0
  65. package/dist/core/sto.d.ts +120 -0
  66. package/dist/core/sto.d.ts.map +1 -0
  67. package/dist/core/sto.js +147 -0
  68. package/dist/core/sto.js.map +1 -0
  69. package/dist/index.d.ts +267 -0
  70. package/dist/index.d.ts.map +1 -0
  71. package/dist/index.js +540 -0
  72. package/dist/index.js.map +1 -0
  73. package/dist/integrations/claude-agent.d.ts +29 -0
  74. package/dist/integrations/claude-agent.d.ts.map +1 -0
  75. package/dist/integrations/claude-agent.js +40 -0
  76. package/dist/integrations/claude-agent.js.map +1 -0
  77. package/dist/integrations/google-adk.d.ts +27 -0
  78. package/dist/integrations/google-adk.d.ts.map +1 -0
  79. package/dist/integrations/google-adk.js +81 -0
  80. package/dist/integrations/google-adk.js.map +1 -0
  81. package/dist/integrations/langchain.d.ts +26 -0
  82. package/dist/integrations/langchain.d.ts.map +1 -0
  83. package/dist/integrations/langchain.js +74 -0
  84. package/dist/integrations/langchain.js.map +1 -0
  85. package/dist/integrations/openai-agents.d.ts +45 -0
  86. package/dist/integrations/openai-agents.d.ts.map +1 -0
  87. package/dist/integrations/openai-agents.js +81 -0
  88. package/dist/integrations/openai-agents.js.map +1 -0
  89. package/dist/integrations/openai.d.ts +24 -0
  90. package/dist/integrations/openai.d.ts.map +1 -0
  91. package/dist/integrations/openai.js +77 -0
  92. package/dist/integrations/openai.js.map +1 -0
  93. package/dist/integrations/vercel-ai.d.ts +38 -0
  94. package/dist/integrations/vercel-ai.d.ts.map +1 -0
  95. package/dist/integrations/vercel-ai.js +107 -0
  96. package/dist/integrations/vercel-ai.js.map +1 -0
  97. package/dist/render/components.d.ts +23 -0
  98. package/dist/render/components.d.ts.map +1 -0
  99. package/dist/render/components.js +133 -0
  100. package/dist/render/components.js.map +1 -0
  101. package/dist/render/derive.d.ts +23 -0
  102. package/dist/render/derive.d.ts.map +1 -0
  103. package/dist/render/derive.js +92 -0
  104. package/dist/render/derive.js.map +1 -0
  105. package/dist/render/session-view.d.ts +19 -0
  106. package/dist/render/session-view.d.ts.map +1 -0
  107. package/dist/render/session-view.js +236 -0
  108. package/dist/render/session-view.js.map +1 -0
  109. package/dist/render/tokens.d.ts +44 -0
  110. package/dist/render/tokens.d.ts.map +1 -0
  111. package/dist/render/tokens.js +72 -0
  112. package/dist/render/tokens.js.map +1 -0
  113. 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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"}