@sponsio/sdk 0.1.0-alpha.3 → 0.2.0-alpha.10
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/bin/sponsio.cjs +11 -0
- package/contracts/benchmark/agentdojo.yaml +551 -0
- package/contracts/benchmark/odcv_bench.yaml +393 -0
- package/contracts/benchmark/redcode_exec.yaml +488 -0
- package/contracts/benchmark/swebench.yaml +176 -0
- package/contracts/benchmark/tau2_bench.yaml +984 -0
- package/contracts/capability/credentials.yaml +8 -8
- package/contracts/capability/database.yaml +6 -6
- package/contracts/capability/destructive.yaml +213 -0
- package/contracts/capability/factual-claims.yaml +79 -0
- package/contracts/capability/filesystem-strict.yaml +4 -4
- package/contracts/capability/filesystem.yaml +9 -9
- package/contracts/capability/host-config-integrity.yaml +318 -0
- package/contracts/capability/self-modify.yaml +260 -9
- package/contracts/capability/shell.yaml +43 -41
- package/contracts/capability/subagent.yaml +5 -5
- package/contracts/incident/claude-code-secret-bypass.yaml +57 -26
- package/contracts/incident/cursor-railway-wipe.yaml +63 -7
- package/contracts/incident/mcp-composition.yaml +12 -12
- package/contracts/incident/openclaw.yaml +47 -92
- package/contracts/incident/subagent-escape.yaml +4 -4
- package/contracts/premium/.gitkeep +5 -6
- package/dist/cli/check.d.ts +2 -0
- package/dist/cli/check.d.ts.map +1 -0
- package/dist/cli/check.js +283 -0
- package/dist/cli/check.js.map +1 -0
- package/dist/cli/cli.d.ts +25 -0
- package/dist/cli/cli.d.ts.map +1 -0
- package/dist/cli/cli.js +491 -0
- package/dist/cli/cli.js.map +1 -0
- package/dist/cli/config.d.ts +88 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +243 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/demo.d.ts +12 -0
- package/dist/cli/demo.d.ts.map +1 -0
- package/dist/cli/demo.js +350 -0
- package/dist/cli/demo.js.map +1 -0
- package/dist/cli/doctor.d.ts +11 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +201 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/eval.d.ts +2 -0
- package/dist/cli/eval.d.ts.map +1 -0
- package/dist/cli/eval.js +361 -0
- package/dist/cli/eval.js.map +1 -0
- package/dist/cli/explain.d.ts +2 -0
- package/dist/cli/explain.d.ts.map +1 -0
- package/dist/cli/explain.js +266 -0
- package/dist/cli/explain.js.map +1 -0
- package/dist/cli/export-sessions.d.ts +2 -0
- package/dist/cli/export-sessions.d.ts.map +1 -0
- package/dist/cli/export-sessions.js +182 -0
- package/dist/cli/export-sessions.js.map +1 -0
- package/dist/cli/export.d.ts +2 -0
- package/dist/cli/export.d.ts.map +1 -0
- package/dist/cli/export.js +222 -0
- package/dist/cli/export.js.map +1 -0
- package/dist/cli/extractors/common.d.ts +27 -0
- package/dist/cli/extractors/common.d.ts.map +1 -0
- package/dist/cli/extractors/common.js +107 -0
- package/dist/cli/extractors/common.js.map +1 -0
- package/dist/cli/extractors/generic.d.ts +37 -0
- package/dist/cli/extractors/generic.d.ts.map +1 -0
- package/dist/cli/extractors/generic.js +185 -0
- package/dist/cli/extractors/generic.js.map +1 -0
- package/dist/cli/extractors/langchain.d.ts +18 -0
- package/dist/cli/extractors/langchain.d.ts.map +1 -0
- package/dist/cli/extractors/langchain.js +86 -0
- package/dist/cli/extractors/langchain.js.map +1 -0
- package/dist/cli/extractors/vercel.d.ts +17 -0
- package/dist/cli/extractors/vercel.d.ts.map +1 -0
- package/dist/cli/extractors/vercel.js +46 -0
- package/dist/cli/extractors/vercel.js.map +1 -0
- package/dist/cli/index.d.ts +38 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +146 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +2 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +177 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/mode.d.ts +2 -0
- package/dist/cli/mode.d.ts.map +1 -0
- package/dist/cli/mode.js +71 -0
- package/dist/cli/mode.js.map +1 -0
- package/dist/cli/onboard.d.ts +88 -0
- package/dist/cli/onboard.d.ts.map +1 -0
- package/dist/cli/onboard.js +758 -0
- package/dist/cli/onboard.js.map +1 -0
- package/dist/cli/otlp.d.ts +27 -0
- package/dist/cli/otlp.d.ts.map +1 -0
- package/dist/cli/otlp.js +79 -0
- package/dist/cli/otlp.js.map +1 -0
- package/dist/cli/package.json +1 -0
- package/dist/cli/packs.d.ts +16 -0
- package/dist/cli/packs.d.ts.map +1 -0
- package/dist/cli/packs.js +190 -0
- package/dist/cli/packs.js.map +1 -0
- package/dist/cli/patterns.d.ts +16 -0
- package/dist/cli/patterns.d.ts.map +1 -0
- package/dist/cli/patterns.js +136 -0
- package/dist/cli/patterns.js.map +1 -0
- package/dist/cli/prompt.d.ts +2 -0
- package/dist/cli/prompt.d.ts.map +1 -0
- package/dist/cli/prompt.js +54 -0
- package/dist/cli/prompt.js.map +1 -0
- package/dist/cli/replay.d.ts +2 -0
- package/dist/cli/replay.d.ts.map +1 -0
- package/dist/cli/replay.js +196 -0
- package/dist/cli/replay.js.map +1 -0
- package/dist/cli/report.d.ts +57 -0
- package/dist/cli/report.d.ts.map +1 -0
- package/dist/cli/report.js +298 -0
- package/dist/cli/report.js.map +1 -0
- package/dist/cli/scan.d.ts +2 -0
- package/dist/cli/scan.d.ts.map +1 -0
- package/dist/cli/scan.js +172 -0
- package/dist/cli/scan.js.map +1 -0
- package/dist/cli/skill.d.ts +15 -0
- package/dist/cli/skill.d.ts.map +1 -0
- package/dist/cli/skill.js +131 -0
- package/dist/cli/skill.js.map +1 -0
- package/dist/cli/tokens.d.ts +31 -0
- package/dist/cli/tokens.d.ts.map +1 -0
- package/dist/cli/tokens.js +73 -0
- package/dist/cli/tokens.js.map +1 -0
- package/dist/cli/types.d.ts +46 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +3 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/cli/validate.d.ts +19 -0
- package/dist/cli/validate.d.ts.map +1 -0
- package/dist/cli/validate.js +205 -0
- package/dist/cli/validate.js.map +1 -0
- package/dist/cli/zod.d.ts +36 -0
- package/dist/cli/zod.d.ts.map +1 -0
- package/dist/cli/zod.js +226 -0
- package/dist/cli/zod.js.map +1 -0
- package/dist/cloud/client.d.ts +76 -0
- package/dist/cloud/client.d.ts.map +1 -0
- package/dist/cloud/client.js +204 -0
- package/dist/cloud/client.js.map +1 -0
- package/dist/cloud/evidence.d.ts +108 -0
- package/dist/cloud/evidence.d.ts.map +1 -0
- package/dist/cloud/evidence.js +184 -0
- package/dist/cloud/evidence.js.map +1 -0
- package/dist/cloud/privacy.d.ts +67 -0
- package/dist/cloud/privacy.d.ts.map +1 -0
- package/dist/cloud/privacy.js +170 -0
- package/dist/cloud/privacy.js.map +1 -0
- package/dist/cloud/view-model.d.ts +49 -0
- package/dist/cloud/view-model.d.ts.map +1 -0
- package/dist/cloud/view-model.js +172 -0
- package/dist/cloud/view-model.js.map +1 -0
- package/dist/contract.d.ts +13 -13
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +21 -21
- package/dist/contract.js.map +1 -1
- package/dist/core/config-loader.d.ts +1 -1
- package/dist/core/config-loader.d.ts.map +1 -1
- package/dist/core/config-loader.js +116 -26
- package/dist/core/config-loader.js.map +1 -1
- package/dist/core/evaluator.d.ts +11 -1
- package/dist/core/evaluator.d.ts.map +1 -1
- package/dist/core/evaluator.js +275 -13
- package/dist/core/evaluator.js.map +1 -1
- package/dist/core/formula.d.ts +76 -17
- package/dist/core/formula.d.ts.map +1 -1
- package/dist/core/formula.js +95 -1
- package/dist/core/formula.js.map +1 -1
- package/dist/core/grounding.d.ts +86 -3
- package/dist/core/grounding.d.ts.map +1 -1
- package/dist/core/grounding.js +485 -143
- package/dist/core/grounding.js.map +1 -1
- package/dist/core/nl-parser.d.ts +2 -2
- package/dist/core/nl-parser.d.ts.map +1 -1
- package/dist/core/nl-parser.js +690 -42
- package/dist/core/nl-parser.js.map +1 -1
- package/dist/core/pack-loader.d.ts.map +1 -1
- package/dist/core/pack-loader.js +14 -2
- package/dist/core/pack-loader.js.map +1 -1
- package/dist/core/parser.d.ts.map +1 -1
- package/dist/core/parser.js +30 -1
- package/dist/core/parser.js.map +1 -1
- package/dist/core/pattern-factory.d.ts +4 -4
- package/dist/core/pattern-factory.d.ts.map +1 -1
- package/dist/core/pattern-factory.js +59 -4
- package/dist/core/pattern-factory.js.map +1 -1
- package/dist/core/patterns.d.ts +196 -5
- package/dist/core/patterns.d.ts.map +1 -1
- package/dist/core/patterns.js +400 -13
- package/dist/core/patterns.js.map +1 -1
- package/dist/core/session-log.d.ts.map +1 -1
- package/dist/core/session-log.js +20 -1
- package/dist/core/session-log.js.map +1 -1
- package/dist/core/spans.d.ts +1 -1
- package/dist/core/spans.d.ts.map +1 -1
- package/dist/core/spans.js.map +1 -1
- package/dist/core/sto.d.ts +30 -66
- package/dist/core/sto.d.ts.map +1 -1
- package/dist/core/sto.js +39 -100
- package/dist/core/sto.js.map +1 -1
- package/dist/core/tool-names.d.ts +59 -0
- package/dist/core/tool-names.d.ts.map +1 -0
- package/dist/core/tool-names.js +128 -0
- package/dist/core/tool-names.js.map +1 -0
- package/dist/index.d.ts +227 -33
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +539 -152
- package/dist/index.js.map +1 -1
- package/dist/integrations/claude-agent.d.ts +5 -0
- package/dist/integrations/claude-agent.d.ts.map +1 -1
- package/dist/integrations/claude-agent.js +42 -13
- package/dist/integrations/claude-agent.js.map +1 -1
- package/dist/integrations/google-adk.d.ts +5 -3
- package/dist/integrations/google-adk.d.ts.map +1 -1
- package/dist/integrations/google-adk.js +9 -5
- package/dist/integrations/google-adk.js.map +1 -1
- package/dist/integrations/langchain.d.ts +7 -0
- package/dist/integrations/langchain.d.ts.map +1 -1
- package/dist/integrations/langchain.js +21 -3
- package/dist/integrations/langchain.js.map +1 -1
- package/dist/integrations/openai-agents.d.ts +22 -10
- package/dist/integrations/openai-agents.d.ts.map +1 -1
- package/dist/integrations/openai-agents.js +57 -16
- package/dist/integrations/openai-agents.js.map +1 -1
- package/dist/integrations/openai.d.ts +11 -0
- package/dist/integrations/openai.d.ts.map +1 -1
- package/dist/integrations/openai.js +130 -48
- package/dist/integrations/openai.js.map +1 -1
- package/dist/integrations/vercel-ai.d.ts +20 -9
- package/dist/integrations/vercel-ai.d.ts.map +1 -1
- package/dist/integrations/vercel-ai.js +131 -32
- package/dist/integrations/vercel-ai.js.map +1 -1
- package/dist/render/tokens.d.ts.map +1 -1
- package/dist/render/tokens.js +1 -0
- package/dist/render/tokens.js.map +1 -1
- package/package.json +41 -9
- package/prompts/onboard.md +259 -0
- package/prompts/scan.md +123 -0
- package/skills/SKILL.md +432 -0
- package/contracts/core/llm_safety.yaml +0 -130
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ``sponsio validate`` — CI-friendly config check.
|
|
4
|
+
*
|
|
5
|
+
* Mirrors the first half of Python's ``sponsio validate`` command:
|
|
6
|
+
* parse sponsio.yaml, surface structural errors, and report what
|
|
7
|
+
* the TS runtime can / cannot handle. Exits non-zero when the file
|
|
8
|
+
* doesn't load or when --strict is set and the loader had to skip
|
|
9
|
+
* any unsupported yaml items.
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
*
|
|
13
|
+
* sponsio validate # validates ./sponsio.yaml
|
|
14
|
+
* sponsio validate ./config.yaml
|
|
15
|
+
* sponsio validate --agent support_bot
|
|
16
|
+
* sponsio validate --strict # non-zero on any skip
|
|
17
|
+
* sponsio validate --format json # machine-readable
|
|
18
|
+
*/
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.runValidateCli = runValidateCli;
|
|
21
|
+
const node_fs_1 = require("node:fs");
|
|
22
|
+
const node_path_1 = require("node:path");
|
|
23
|
+
const HELP = [
|
|
24
|
+
"sponsio validate — parse sponsio.yaml and report what the TS runtime will use",
|
|
25
|
+
"",
|
|
26
|
+
"USAGE:",
|
|
27
|
+
" sponsio validate [path] [options]",
|
|
28
|
+
"",
|
|
29
|
+
"ARGUMENTS:",
|
|
30
|
+
" [path] Path to sponsio.yaml (default: ./sponsio.yaml)",
|
|
31
|
+
"",
|
|
32
|
+
"OPTIONS:",
|
|
33
|
+
" --agent <id> Which agent block to project (default: first one found)",
|
|
34
|
+
" --strict Exit non-zero if the loader had to skip anything",
|
|
35
|
+
" --format <f> 'text' (default) or 'json'",
|
|
36
|
+
" -h, --help Show this help",
|
|
37
|
+
"",
|
|
38
|
+
"EXIT CODES:",
|
|
39
|
+
" 0 config loads and the TS runtime can honour every declared contract",
|
|
40
|
+
" 1 yaml / schema error — config does not load at all",
|
|
41
|
+
" 2 loaded with warnings (unsupported yaml items skipped); only with --strict",
|
|
42
|
+
].join("\n") + "\n";
|
|
43
|
+
function parseArgs(argv) {
|
|
44
|
+
const a = {
|
|
45
|
+
path: "sponsio.yaml",
|
|
46
|
+
strict: false,
|
|
47
|
+
format: "text",
|
|
48
|
+
help: false,
|
|
49
|
+
};
|
|
50
|
+
const positional = [];
|
|
51
|
+
for (let i = 0; i < argv.length; i++) {
|
|
52
|
+
const flag = argv[i];
|
|
53
|
+
if (flag === "-h" || flag === "--help")
|
|
54
|
+
a.help = true;
|
|
55
|
+
else if (flag === "--agent")
|
|
56
|
+
a.agent = argv[++i];
|
|
57
|
+
else if (flag === "--strict")
|
|
58
|
+
a.strict = true;
|
|
59
|
+
else if (flag === "--format") {
|
|
60
|
+
const v = argv[++i];
|
|
61
|
+
if (v !== "text" && v !== "json") {
|
|
62
|
+
throw new Error(`--format must be 'text' or 'json', got ${v}`);
|
|
63
|
+
}
|
|
64
|
+
a.format = v;
|
|
65
|
+
}
|
|
66
|
+
else if (flag.startsWith("-")) {
|
|
67
|
+
throw new Error(`unknown flag: ${flag}`);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
positional.push(flag);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (positional.length > 1) {
|
|
74
|
+
throw new Error(`validate accepts at most one positional path, got ${positional.length}`);
|
|
75
|
+
}
|
|
76
|
+
if (positional[0])
|
|
77
|
+
a.path = positional[0];
|
|
78
|
+
return a;
|
|
79
|
+
}
|
|
80
|
+
async function runValidateCli(argv) {
|
|
81
|
+
let args;
|
|
82
|
+
try {
|
|
83
|
+
args = parseArgs(argv);
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
process.stderr.write(`${err instanceof Error ? err.message : String(err)}\n`);
|
|
87
|
+
process.exit(2);
|
|
88
|
+
}
|
|
89
|
+
if (args.help) {
|
|
90
|
+
process.stdout.write(HELP);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const resolved = (0, node_path_1.resolve)(process.cwd(), args.path);
|
|
94
|
+
if (!(0, node_fs_1.existsSync)(resolved)) {
|
|
95
|
+
process.stderr.write(`[sponsio] config not found: ${resolved}\n`);
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
98
|
+
// Lazy-load: avoids paying for the ts-sdk import on `--help`.
|
|
99
|
+
let result;
|
|
100
|
+
try {
|
|
101
|
+
// Import through the dist of ``@sponsio/sdk`` when the scanner
|
|
102
|
+
// ships on npm, and through a relative path when we're running
|
|
103
|
+
// in-repo. ``require.resolve`` lets us tolerate either.
|
|
104
|
+
const sdk = await loadSdk();
|
|
105
|
+
const loaded = sdk.loadSponsoConfig(resolved, args.agent ?? "agent");
|
|
106
|
+
// ``loaded.contracts`` is ``(string | DetFormula)[]``:
|
|
107
|
+
// - strings are NL that still needs ``parseNl`` (some rule
|
|
108
|
+
// factories might reject, count those separately);
|
|
109
|
+
// - objects are already-compiled DetFormula entries (structured
|
|
110
|
+
// patterns, raw LTL, A/G composition) — those are det-valid by
|
|
111
|
+
// construction.
|
|
112
|
+
const unparseable = [];
|
|
113
|
+
let preCompiled = 0;
|
|
114
|
+
for (const c of loaded.contracts) {
|
|
115
|
+
if (typeof c === "string") {
|
|
116
|
+
try {
|
|
117
|
+
if (!sdk.parseNl(c))
|
|
118
|
+
unparseable.push(c);
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
unparseable.push(c);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
preCompiled++;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
result = {
|
|
129
|
+
path: resolved,
|
|
130
|
+
agent: args.agent ?? "agent",
|
|
131
|
+
mode: loaded.mode,
|
|
132
|
+
detContracts: preCompiled +
|
|
133
|
+
(loaded.contracts.filter((c) => typeof c === "string").length -
|
|
134
|
+
unparseable.length),
|
|
135
|
+
stoContracts: loaded.stoSpecs?.length ?? 0,
|
|
136
|
+
judgeConfigured: !!loaded.judge,
|
|
137
|
+
skipped: loaded.skipped ?? [],
|
|
138
|
+
unparseableNl: unparseable,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
catch (err) {
|
|
142
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
143
|
+
const error = { path: resolved, error: msg };
|
|
144
|
+
if (args.format === "json") {
|
|
145
|
+
process.stdout.write(JSON.stringify(error, null, 2) + "\n");
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
process.stderr.write(`[sponsio] validate failed: ${msg}\n`);
|
|
149
|
+
}
|
|
150
|
+
process.exit(1);
|
|
151
|
+
}
|
|
152
|
+
if (args.format === "json") {
|
|
153
|
+
process.stdout.write(JSON.stringify(result, null, 2) + "\n");
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
process.stdout.write(renderText(result));
|
|
157
|
+
}
|
|
158
|
+
const hasWarnings = result.skipped.length > 0 ||
|
|
159
|
+
result.unparseableNl.length > 0 ||
|
|
160
|
+
// Sto contracts are not supported in this build (the engine is
|
|
161
|
+
// deterministic-only). They are rejected at load time. Surface as
|
|
162
|
+
// a strict-mode warning so CI catches it.
|
|
163
|
+
result.stoContracts > 0;
|
|
164
|
+
if (args.strict && hasWarnings)
|
|
165
|
+
process.exit(2);
|
|
166
|
+
}
|
|
167
|
+
function renderText(r) {
|
|
168
|
+
const lines = [];
|
|
169
|
+
lines.push(`✓ loaded ${r.path}`);
|
|
170
|
+
lines.push(` agent: ${r.agent}`);
|
|
171
|
+
lines.push(` runtime.mode: ${r.mode ?? "(unset — falls to observe)"}`);
|
|
172
|
+
lines.push(` det contracts: ${r.detContracts}`);
|
|
173
|
+
lines.push(` sto contracts: ${r.stoContracts}${r.stoContracts > 0 ? " (not supported in this build)" : ""}`);
|
|
174
|
+
lines.push(` judge configured: ${r.judgeConfigured ? "yes (not supported in this build)" : "no"}`);
|
|
175
|
+
if (r.unparseableNl.length) {
|
|
176
|
+
lines.push("");
|
|
177
|
+
lines.push(`! ${r.unparseableNl.length} contract(s) failed NL parsing:`);
|
|
178
|
+
for (const c of r.unparseableNl)
|
|
179
|
+
lines.push(` - ${c}`);
|
|
180
|
+
}
|
|
181
|
+
if (r.skipped.length) {
|
|
182
|
+
lines.push("");
|
|
183
|
+
lines.push(`! ${r.skipped.length} yaml item(s) skipped (Python-only):`);
|
|
184
|
+
for (const s of r.skipped)
|
|
185
|
+
lines.push(` - [${s.kind}] ${s.detail}`);
|
|
186
|
+
}
|
|
187
|
+
lines.push("");
|
|
188
|
+
return lines.join("\n");
|
|
189
|
+
}
|
|
190
|
+
async function loadSdk() {
|
|
191
|
+
// Resolve order: installed ``@sponsio/sdk`` > sibling repo path
|
|
192
|
+
// (useful during local dev when ``scan-ts`` runs via npm link but
|
|
193
|
+
// the SDK isn't hoisted). The bare specifier goes through a
|
|
194
|
+
// function-wrapped require so TS doesn't complain when the SDK
|
|
195
|
+
// isn't a declared dep of this package.
|
|
196
|
+
const dynamicImport = new Function("s", "return import(s)");
|
|
197
|
+
try {
|
|
198
|
+
return await dynamicImport("@sponsio/sdk");
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
const devPath = (0, node_path_1.resolve)(__dirname, "..", "..", "ts-sdk", "dist", "index.js");
|
|
202
|
+
return await dynamicImport(devPath);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/cli/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Static Zod-expression → JSON-Schema converter.
|
|
3
|
+
*
|
|
4
|
+
* We never execute the user's code — we read the TypeScript AST and
|
|
5
|
+
* translate common Zod call patterns:
|
|
6
|
+
*
|
|
7
|
+
* z.object({ user_id: z.string(), count: z.number().int() })
|
|
8
|
+
*
|
|
9
|
+
* becomes:
|
|
10
|
+
*
|
|
11
|
+
* { type: "object",
|
|
12
|
+
* properties: {
|
|
13
|
+
* user_id: { type: "string" },
|
|
14
|
+
* count: { type: "integer" }
|
|
15
|
+
* },
|
|
16
|
+
* required: ["user_id", "count"] }
|
|
17
|
+
*
|
|
18
|
+
* Unknown Zod calls degrade to ``{ type: "string" }`` so the tool
|
|
19
|
+
* still shows up in the inventory — downstream heuristics care more
|
|
20
|
+
* about *which* param names exist than their exact types.
|
|
21
|
+
*/
|
|
22
|
+
import { Expression, ObjectLiteralExpression } from "ts-morph";
|
|
23
|
+
import type { JSONSchema, JSONSchemaProperty } from "./types";
|
|
24
|
+
/**
|
|
25
|
+
* Convert a Zod expression (``z.object({ ... })``, ``z.string()``, etc.)
|
|
26
|
+
* into a JSON Schema property. Returns ``{ type: "string" }`` for
|
|
27
|
+
* anything we can't statically decode — the param *name* carries most
|
|
28
|
+
* of the signal for the downstream Sponsio heuristics.
|
|
29
|
+
*/
|
|
30
|
+
export declare function zodExprToJsonSchema(expr: Expression): JSONSchemaProperty;
|
|
31
|
+
/**
|
|
32
|
+
* Translate a ``z.object({...})`` inner literal into a top-level
|
|
33
|
+
* JSON Schema.
|
|
34
|
+
*/
|
|
35
|
+
export declare function objectLiteralToJsonSchema(literal: ObjectLiteralExpression): JSONSchema;
|
|
36
|
+
//# sourceMappingURL=zod.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zod.d.ts","sourceRoot":"","sources":["../../src/cli/zod.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAEL,UAAU,EAEV,uBAAuB,EAGxB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAkB,MAAM,SAAS,CAAC;AAe9E;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,UAAU,GAAG,kBAAkB,CAoExE;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,uBAAuB,GAC/B,UAAU,CAmBZ"}
|
package/dist/cli/zod.js
ADDED
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Static Zod-expression → JSON-Schema converter.
|
|
4
|
+
*
|
|
5
|
+
* We never execute the user's code — we read the TypeScript AST and
|
|
6
|
+
* translate common Zod call patterns:
|
|
7
|
+
*
|
|
8
|
+
* z.object({ user_id: z.string(), count: z.number().int() })
|
|
9
|
+
*
|
|
10
|
+
* becomes:
|
|
11
|
+
*
|
|
12
|
+
* { type: "object",
|
|
13
|
+
* properties: {
|
|
14
|
+
* user_id: { type: "string" },
|
|
15
|
+
* count: { type: "integer" }
|
|
16
|
+
* },
|
|
17
|
+
* required: ["user_id", "count"] }
|
|
18
|
+
*
|
|
19
|
+
* Unknown Zod calls degrade to ``{ type: "string" }`` so the tool
|
|
20
|
+
* still shows up in the inventory — downstream heuristics care more
|
|
21
|
+
* about *which* param names exist than their exact types.
|
|
22
|
+
*/
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.zodExprToJsonSchema = zodExprToJsonSchema;
|
|
25
|
+
exports.objectLiteralToJsonSchema = objectLiteralToJsonSchema;
|
|
26
|
+
const ts_morph_1 = require("ts-morph");
|
|
27
|
+
const PRIMITIVE_MAP = {
|
|
28
|
+
string: "string",
|
|
29
|
+
number: "number",
|
|
30
|
+
bigint: "integer",
|
|
31
|
+
boolean: "boolean",
|
|
32
|
+
date: "string",
|
|
33
|
+
null: "null",
|
|
34
|
+
any: "string",
|
|
35
|
+
unknown: "string",
|
|
36
|
+
never: "string",
|
|
37
|
+
void: "null",
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Convert a Zod expression (``z.object({ ... })``, ``z.string()``, etc.)
|
|
41
|
+
* into a JSON Schema property. Returns ``{ type: "string" }`` for
|
|
42
|
+
* anything we can't statically decode — the param *name* carries most
|
|
43
|
+
* of the signal for the downstream Sponsio heuristics.
|
|
44
|
+
*/
|
|
45
|
+
function zodExprToJsonSchema(expr) {
|
|
46
|
+
const call = unwrapChain(expr);
|
|
47
|
+
if (!call)
|
|
48
|
+
return { type: "string" };
|
|
49
|
+
const head = getHeadMethod(call);
|
|
50
|
+
if (!head)
|
|
51
|
+
return { type: "string" };
|
|
52
|
+
// ── z.object({...}) — the only compound shape we emit as ``object``.
|
|
53
|
+
if (head === "object") {
|
|
54
|
+
const firstArg = call.getArguments()[0];
|
|
55
|
+
if (firstArg && ts_morph_1.Node.isObjectLiteralExpression(firstArg)) {
|
|
56
|
+
const nested = objectLiteralToJsonSchema(firstArg);
|
|
57
|
+
return {
|
|
58
|
+
type: "object",
|
|
59
|
+
properties: nested.properties,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
return { type: "object", properties: {} };
|
|
63
|
+
}
|
|
64
|
+
// ── z.array(<inner>) → { type: "array", items: ... }
|
|
65
|
+
if (head === "array") {
|
|
66
|
+
const inner = call.getArguments()[0];
|
|
67
|
+
if (inner && ts_morph_1.Node.isExpression(inner)) {
|
|
68
|
+
return { type: "array", items: zodExprToJsonSchema(inner) };
|
|
69
|
+
}
|
|
70
|
+
return { type: "array", items: { type: "string" } };
|
|
71
|
+
}
|
|
72
|
+
// ── z.enum([...]) → { type: "string", enum: [...] }
|
|
73
|
+
if (head === "enum") {
|
|
74
|
+
const arr = call.getArguments()[0];
|
|
75
|
+
if (arr && ts_morph_1.Node.isArrayLiteralExpression(arr)) {
|
|
76
|
+
const values = arr
|
|
77
|
+
.getElements()
|
|
78
|
+
.map((e) => literalValue(e))
|
|
79
|
+
.filter((v) => v !== undefined);
|
|
80
|
+
return { type: "string", enum: values };
|
|
81
|
+
}
|
|
82
|
+
return { type: "string" };
|
|
83
|
+
}
|
|
84
|
+
// ── z.literal(x) → narrow type + enum
|
|
85
|
+
if (head === "literal") {
|
|
86
|
+
const arg = call.getArguments()[0];
|
|
87
|
+
if (arg && ts_morph_1.Node.isExpression(arg)) {
|
|
88
|
+
const lit = literalValue(arg);
|
|
89
|
+
if (typeof lit === "string")
|
|
90
|
+
return { type: "string", enum: [lit] };
|
|
91
|
+
if (typeof lit === "number")
|
|
92
|
+
return { type: "number", enum: [lit] };
|
|
93
|
+
if (typeof lit === "boolean")
|
|
94
|
+
return { type: "boolean", enum: [lit] };
|
|
95
|
+
}
|
|
96
|
+
return { type: "string" };
|
|
97
|
+
}
|
|
98
|
+
// ── Primitive: z.string(), z.number(), z.boolean(), ...
|
|
99
|
+
const prim = PRIMITIVE_MAP[head];
|
|
100
|
+
if (prim) {
|
|
101
|
+
const base = { type: prim };
|
|
102
|
+
// Walk the method chain beyond the primitive to catch ``.int()``
|
|
103
|
+
// and similar refinements.
|
|
104
|
+
if (head === "number" && chainContains(expr, "int")) {
|
|
105
|
+
base.type = "integer";
|
|
106
|
+
}
|
|
107
|
+
return base;
|
|
108
|
+
}
|
|
109
|
+
// Unknown method — degrade gracefully.
|
|
110
|
+
return { type: "string" };
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Translate a ``z.object({...})`` inner literal into a top-level
|
|
114
|
+
* JSON Schema.
|
|
115
|
+
*/
|
|
116
|
+
function objectLiteralToJsonSchema(literal) {
|
|
117
|
+
const properties = {};
|
|
118
|
+
const required = [];
|
|
119
|
+
for (const prop of literal.getProperties()) {
|
|
120
|
+
if (!ts_morph_1.Node.isPropertyAssignment(prop))
|
|
121
|
+
continue;
|
|
122
|
+
const key = prop.getName().replace(/^['"`]|['"`]$/g, "");
|
|
123
|
+
const init = prop.getInitializer();
|
|
124
|
+
if (!init)
|
|
125
|
+
continue;
|
|
126
|
+
const schema = zodExprToJsonSchema(init);
|
|
127
|
+
properties[key] = schema;
|
|
128
|
+
if (!chainContains(init, "optional") && !chainContains(init, "nullish")) {
|
|
129
|
+
required.push(key);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
const out = { type: "object", properties };
|
|
133
|
+
if (required.length)
|
|
134
|
+
out.required = required;
|
|
135
|
+
return out;
|
|
136
|
+
}
|
|
137
|
+
// ---------------------------------------------------------------------------
|
|
138
|
+
// AST walk helpers
|
|
139
|
+
// ---------------------------------------------------------------------------
|
|
140
|
+
/** Return the *deepest* CallExpression in a ``a.b().c().d()`` chain. */
|
|
141
|
+
function unwrapChain(expr) {
|
|
142
|
+
let cur = expr;
|
|
143
|
+
while (cur) {
|
|
144
|
+
if (ts_morph_1.Node.isCallExpression(cur))
|
|
145
|
+
return cur;
|
|
146
|
+
if (ts_morph_1.Node.isPropertyAccessExpression(cur)) {
|
|
147
|
+
cur = cur.getExpression();
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
return undefined;
|
|
151
|
+
}
|
|
152
|
+
return undefined;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Return the *head* method name of a Zod chain —
|
|
156
|
+
* ``z.string().min(3).optional()`` → ``"string"``. This is the
|
|
157
|
+
* identifier immediately following the root ``z.`` / variable.
|
|
158
|
+
*/
|
|
159
|
+
function getHeadMethod(call) {
|
|
160
|
+
let cur = call;
|
|
161
|
+
let last;
|
|
162
|
+
while (cur) {
|
|
163
|
+
if (ts_morph_1.Node.isCallExpression(cur)) {
|
|
164
|
+
const callee = cur.getExpression();
|
|
165
|
+
if (ts_morph_1.Node.isPropertyAccessExpression(callee)) {
|
|
166
|
+
last = callee.getName();
|
|
167
|
+
cur = callee.getExpression();
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
if (ts_morph_1.Node.isIdentifier(callee)) {
|
|
171
|
+
return callee.getText();
|
|
172
|
+
}
|
|
173
|
+
return last;
|
|
174
|
+
}
|
|
175
|
+
if (ts_morph_1.Node.isPropertyAccessExpression(cur)) {
|
|
176
|
+
last = cur.getName();
|
|
177
|
+
cur = cur.getExpression();
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
return last;
|
|
181
|
+
}
|
|
182
|
+
return last;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Does any node in the method chain (at any depth) call a method
|
|
186
|
+
* whose name matches ``target``? Used to detect ``.optional()`` and
|
|
187
|
+
* ``.int()`` refiners.
|
|
188
|
+
*/
|
|
189
|
+
function chainContains(expr, target) {
|
|
190
|
+
let found = false;
|
|
191
|
+
expr.forEachDescendant((node, traversal) => {
|
|
192
|
+
if (ts_morph_1.Node.isCallExpression(node) &&
|
|
193
|
+
ts_morph_1.Node.isPropertyAccessExpression(node.getExpression()) &&
|
|
194
|
+
node.getExpression().getName() === target) {
|
|
195
|
+
found = true;
|
|
196
|
+
traversal.stop();
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
if (found)
|
|
200
|
+
return true;
|
|
201
|
+
// Also check the immediate expression itself
|
|
202
|
+
if (ts_morph_1.Node.isCallExpression(expr)) {
|
|
203
|
+
const callee = expr.getExpression();
|
|
204
|
+
if (ts_morph_1.Node.isPropertyAccessExpression(callee) &&
|
|
205
|
+
callee.getName() === target) {
|
|
206
|
+
return true;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return false;
|
|
210
|
+
}
|
|
211
|
+
/** Extract a literal JS value from an AST node, or ``undefined``. */
|
|
212
|
+
function literalValue(node) {
|
|
213
|
+
if (ts_morph_1.Node.isStringLiteral(node) || ts_morph_1.Node.isNoSubstitutionTemplateLiteral(node)) {
|
|
214
|
+
return node.getLiteralText();
|
|
215
|
+
}
|
|
216
|
+
if (ts_morph_1.Node.isNumericLiteral(node)) {
|
|
217
|
+
return Number(node.getLiteralText());
|
|
218
|
+
}
|
|
219
|
+
const k = node.getKind();
|
|
220
|
+
if (k === ts_morph_1.SyntaxKind.TrueKeyword)
|
|
221
|
+
return true;
|
|
222
|
+
if (k === ts_morph_1.SyntaxKind.FalseKeyword)
|
|
223
|
+
return false;
|
|
224
|
+
return undefined;
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=zod.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zod.js","sourceRoot":"","sources":["../../src/cli/zod.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Talking to the cloud.
|
|
3
|
+
*
|
|
4
|
+
* Port of ``sponsio/cloud/client.py`` narrowed to the two calls an agent
|
|
5
|
+
* makes at runtime: pull the book it should enforce, and upload what it
|
|
6
|
+
* did. Everything else in the Python client belongs to the CLI.
|
|
7
|
+
*
|
|
8
|
+
* Until this existed the TypeScript SDK enforced correctly and uploaded
|
|
9
|
+
* nothing, so a customer running a TypeScript agent showed up in the
|
|
10
|
+
* console with no runs at all: rules could not be rolled out to them and
|
|
11
|
+
* nothing they did could be seen.
|
|
12
|
+
*/
|
|
13
|
+
export declare class CloudError extends Error {
|
|
14
|
+
readonly status?: number;
|
|
15
|
+
constructor(message: string, status?: number);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* ``SPONSIO_API_KEY`` first, then ``~/.sponsio/credentials``. The
|
|
19
|
+
* environment wins so CI and one-off runs can override a logged-in
|
|
20
|
+
* machine without touching files.
|
|
21
|
+
*/
|
|
22
|
+
export declare function readApiKey(): string | null;
|
|
23
|
+
/**
|
|
24
|
+
* ``SPONSIO_PROJECT``, or null.
|
|
25
|
+
*
|
|
26
|
+
* Which customer a run belongs to is deployment configuration, not code.
|
|
27
|
+
* A platform running one agent for forty customers ships one image and
|
|
28
|
+
* varies the environment; naming the customer in the call would mean an
|
|
29
|
+
* image per customer.
|
|
30
|
+
*/
|
|
31
|
+
export declare function readProject(): string | null;
|
|
32
|
+
export declare function baseUrl(): string;
|
|
33
|
+
export interface PulledRulebook {
|
|
34
|
+
yamlText: string;
|
|
35
|
+
versions?: string;
|
|
36
|
+
sha?: string;
|
|
37
|
+
agent?: string;
|
|
38
|
+
channel?: string;
|
|
39
|
+
}
|
|
40
|
+
export interface CloudClientOptions {
|
|
41
|
+
apiKey?: string | null;
|
|
42
|
+
baseUrl?: string;
|
|
43
|
+
/** Milliseconds. A run must not wait on telemetry. */
|
|
44
|
+
timeoutMs?: number;
|
|
45
|
+
}
|
|
46
|
+
export declare class CloudClient {
|
|
47
|
+
readonly apiKey: string | null;
|
|
48
|
+
readonly base: string;
|
|
49
|
+
readonly timeoutMs: number;
|
|
50
|
+
constructor(opts?: CloudClientOptions);
|
|
51
|
+
/** Whether there is a credential to speak with at all. */
|
|
52
|
+
get configured(): boolean;
|
|
53
|
+
private request;
|
|
54
|
+
private static detail;
|
|
55
|
+
/**
|
|
56
|
+
* Fetch a project's rulebook.
|
|
57
|
+
*
|
|
58
|
+
* Without ``agent`` this returns every agent merged into one document:
|
|
59
|
+
* a guard binds by agent id and loads only its own section, so one
|
|
60
|
+
* request serves a whole repo.
|
|
61
|
+
*/
|
|
62
|
+
pullRulebook(project?: string | null, opts?: {
|
|
63
|
+
agent?: string;
|
|
64
|
+
version?: number;
|
|
65
|
+
}): Promise<PulledRulebook>;
|
|
66
|
+
/**
|
|
67
|
+
* Send a run to the cloud.
|
|
68
|
+
*
|
|
69
|
+
* Idempotent on the session key server-side, so a retry after a blip
|
|
70
|
+
* cannot double a run. Callers on the hot path must not wait on this:
|
|
71
|
+
* telemetry is outbound-only and best-effort, and losing it must never
|
|
72
|
+
* change what the agent does.
|
|
73
|
+
*/
|
|
74
|
+
ingestSession(project: string | null, payload: Record<string, unknown>): Promise<Record<string, unknown>>;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/cloud/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAeH,qBAAa,UAAW,SAAQ,KAAK;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;gBACb,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAK7C;AAED;;;;GAIG;AACH,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,CAkB1C;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,IAAI,MAAM,GAAG,IAAI,CAE3C;AAcD,wBAAgB,OAAO,IAAI,MAAM,CAGhC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,WAAW;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;gBAEf,IAAI,GAAE,kBAAuB;IAMzC,0DAA0D;IAC1D,IAAI,UAAU,IAAI,OAAO,CAExB;YAEa,OAAO;IA0BrB,OAAO,CAAC,MAAM,CAAC,MAAM;IAerB;;;;;;OAMG;IACG,YAAY,CAChB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,EACvB,IAAI,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAO,GAC9C,OAAO,CAAC,cAAc,CAAC;IAkC1B;;;;;;;OAOG;IACG,aAAa,CACjB,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAsBpC"}
|