@sponsio/sdk 0.1.0-alpha.3 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/sponsio.cjs +11 -0
- package/contracts/capability/credentials.yaml +8 -8
- package/contracts/capability/database.yaml +6 -6
- package/contracts/capability/filesystem-strict.yaml +4 -4
- package/contracts/capability/filesystem.yaml +9 -9
- package/contracts/capability/host-config-integrity.yaml +285 -0
- package/contracts/capability/self-modify.yaml +214 -9
- package/contracts/capability/shell.yaml +25 -32
- package/contracts/capability/subagent.yaml +5 -5
- package/contracts/core/llm_safety.yaml +23 -13
- package/contracts/incident/claude-code-secret-bypass.yaml +10 -11
- package/contracts/incident/cursor-railway-wipe.yaml +3 -3
- package/contracts/incident/mcp-composition.yaml +12 -12
- package/contracts/incident/openclaw.yaml +53 -45
- package/contracts/incident/subagent-escape.yaml +4 -4
- 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 +459 -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 +184 -0
- package/dist/cli/packs.js.map +1 -0
- package/dist/cli/patterns.d.ts +15 -0
- package/dist/cli/patterns.d.ts.map +1 -0
- package/dist/cli/patterns.js +135 -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/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.js +35 -17
- package/dist/core/config-loader.js.map +1 -1
- package/dist/core/grounding.d.ts +49 -2
- package/dist/core/grounding.d.ts.map +1 -1
- package/dist/core/grounding.js +302 -142
- package/dist/core/grounding.js.map +1 -1
- package/dist/core/nl-parser.d.ts.map +1 -1
- package/dist/core/nl-parser.js +74 -2
- package/dist/core/nl-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 +46 -4
- package/dist/core/pattern-factory.js.map +1 -1
- package/dist/core/patterns.d.ts +78 -4
- package/dist/core/patterns.d.ts.map +1 -1
- package/dist/core/patterns.js +211 -3
- package/dist/core/patterns.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 +32 -62
- package/dist/core/sto.d.ts.map +1 -1
- package/dist/core/sto.js +32 -90
- package/dist/core/sto.js.map +1 -1
- package/dist/index.d.ts +77 -32
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +172 -133
- package/dist/index.js.map +1 -1
- package/dist/integrations/openai-agents.d.ts.map +1 -1
- package/dist/integrations/openai-agents.js +5 -4
- package/dist/integrations/openai-agents.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 +28 -4
- package/prompts/onboard.md +250 -0
- package/prompts/refresh.md +118 -0
- package/prompts/scan.md +125 -0
- package/skills/SKILL.md +502 -0
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ``sponsio.yaml`` loader for ``@sponsio/sdk``.
|
|
4
|
+
*
|
|
5
|
+
* Parity feature with the Python side's ``sponsio/config.py``. The
|
|
6
|
+
* goal is *semantic* parity — same YAML file works for both
|
|
7
|
+
* scanners, same env-var interpolation rules, same precedence
|
|
8
|
+
* (CLI flag > YAML > built-in default) — not byte-level parity of
|
|
9
|
+
* the parsed dataclasses (the TS scanner only needs a narrow slice
|
|
10
|
+
* of the schema).
|
|
11
|
+
*
|
|
12
|
+
* The three things we read:
|
|
13
|
+
*
|
|
14
|
+
* 1. ``scan:`` — optional section for TS-scanner-specific
|
|
15
|
+
* knobs: patterns, ignore list, output path, provenance
|
|
16
|
+
* inclusion. Lets a repo put all scanner config in one
|
|
17
|
+
* file instead of sprinkling CLI flags across workflows.
|
|
18
|
+
* 2. ``extractor:`` — *passthrough* (not interpreted here).
|
|
19
|
+
* We embed it in the output JSON as ``_extractor`` metadata
|
|
20
|
+
* so a downstream ``sponsio scan tools.json`` picks up the
|
|
21
|
+
* same LLM config without needing ``--config`` a second
|
|
22
|
+
* time. Mirrors the Python ``ExtractorSection``.
|
|
23
|
+
* 3. ``${ENV_VAR}`` / ``${ENV_VAR:-default}`` — interpolated
|
|
24
|
+
* on load with EXACTLY the same regex and semantics as
|
|
25
|
+
* Python (see ``_ENV_VAR_RE`` in ``sponsio/config.py``).
|
|
26
|
+
*
|
|
27
|
+
* Sections we *don't* parse: contracts, agents, judge, defaults.
|
|
28
|
+
* Those are Python-runtime concerns; touching them here would
|
|
29
|
+
* duplicate the Python schema and invite drift.
|
|
30
|
+
*/
|
|
31
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
32
|
+
if (k2 === undefined) k2 = k;
|
|
33
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
34
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
35
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
36
|
+
}
|
|
37
|
+
Object.defineProperty(o, k2, desc);
|
|
38
|
+
}) : (function(o, m, k, k2) {
|
|
39
|
+
if (k2 === undefined) k2 = k;
|
|
40
|
+
o[k2] = m[k];
|
|
41
|
+
}));
|
|
42
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
43
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
44
|
+
}) : function(o, v) {
|
|
45
|
+
o["default"] = v;
|
|
46
|
+
});
|
|
47
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
48
|
+
var ownKeys = function(o) {
|
|
49
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
50
|
+
var ar = [];
|
|
51
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
52
|
+
return ar;
|
|
53
|
+
};
|
|
54
|
+
return ownKeys(o);
|
|
55
|
+
};
|
|
56
|
+
return function (mod) {
|
|
57
|
+
if (mod && mod.__esModule) return mod;
|
|
58
|
+
var result = {};
|
|
59
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
60
|
+
__setModuleDefault(result, mod);
|
|
61
|
+
return result;
|
|
62
|
+
};
|
|
63
|
+
})();
|
|
64
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
65
|
+
exports.ConfigError = void 0;
|
|
66
|
+
exports.loadConfig = loadConfig;
|
|
67
|
+
const fs = __importStar(require("fs"));
|
|
68
|
+
const path = __importStar(require("path"));
|
|
69
|
+
const yaml = __importStar(require("js-yaml"));
|
|
70
|
+
class ConfigError extends Error {
|
|
71
|
+
constructor(message, sourcePath) {
|
|
72
|
+
super(message);
|
|
73
|
+
this.sourcePath = sourcePath;
|
|
74
|
+
this.name = "ConfigError";
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
exports.ConfigError = ConfigError;
|
|
78
|
+
/**
|
|
79
|
+
* Bash-style: ``${VAR}`` or ``${VAR:-default}``. We deliberately
|
|
80
|
+
* do NOT support the bare ``$VAR`` shorthand because YAML strings
|
|
81
|
+
* routinely contain naked dollar signs (template vars, regex,
|
|
82
|
+
* currency) and we don't want to accidentally munch those. Same
|
|
83
|
+
* regex as Python's ``_ENV_VAR_RE`` — keep them synchronized.
|
|
84
|
+
*/
|
|
85
|
+
const ENV_VAR_RE = /\$\{([A-Za-z_][A-Za-z0-9_]*)(?::-([^}]*))?\}/g;
|
|
86
|
+
/**
|
|
87
|
+
* Recursively expand ``${VAR}`` / ``${VAR:-default}`` inside the
|
|
88
|
+
* parsed YAML tree. Operates on a deep-cloned copy (we could
|
|
89
|
+
* mutate, but a clone makes the function safe to call on the raw
|
|
90
|
+
* parse result without surprising the caller if they also hold a
|
|
91
|
+
* reference).
|
|
92
|
+
*
|
|
93
|
+
* @param value Any JSON-serialisable value (string/array/object/primitive).
|
|
94
|
+
* @param missing Out-param: receives the names of unset-no-default env vars.
|
|
95
|
+
* Shared across recursion so one flat list comes back.
|
|
96
|
+
*/
|
|
97
|
+
function interpolateEnv(value, missing) {
|
|
98
|
+
if (typeof value === "string") {
|
|
99
|
+
return value.replace(ENV_VAR_RE, (_match, name, def) => {
|
|
100
|
+
const resolved = process.env[name];
|
|
101
|
+
if (resolved !== undefined)
|
|
102
|
+
return resolved;
|
|
103
|
+
if (def !== undefined)
|
|
104
|
+
return def;
|
|
105
|
+
missing.add(name);
|
|
106
|
+
return "";
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
if (Array.isArray(value)) {
|
|
110
|
+
return value.map((v) => interpolateEnv(v, missing));
|
|
111
|
+
}
|
|
112
|
+
if (value !== null && typeof value === "object") {
|
|
113
|
+
const out = {};
|
|
114
|
+
for (const [k, v] of Object.entries(value)) {
|
|
115
|
+
out[k] = interpolateEnv(v, missing);
|
|
116
|
+
}
|
|
117
|
+
return out;
|
|
118
|
+
}
|
|
119
|
+
return value;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Load and parse ``sponsio.yaml``.
|
|
123
|
+
*
|
|
124
|
+
* Design notes:
|
|
125
|
+
* * We *don't* validate the full Python schema — only the two
|
|
126
|
+
* sections we care about. Everything else (``contracts``,
|
|
127
|
+
* ``agents``, ``judge``) sails through untouched so a
|
|
128
|
+
* single file can be authoritative for both Python and TS.
|
|
129
|
+
* * Missing file → ``ConfigError`` (not silently-empty config),
|
|
130
|
+
* because the user explicitly passed ``--config <path>`` and
|
|
131
|
+
* typos are the #1 failure mode.
|
|
132
|
+
* * Malformed YAML → ``ConfigError`` with the parser's line/col
|
|
133
|
+
* where available (js-yaml's default YAMLException already
|
|
134
|
+
* includes this in its ``reason`` field).
|
|
135
|
+
*/
|
|
136
|
+
function loadConfig(configPath) {
|
|
137
|
+
const abs = path.resolve(configPath);
|
|
138
|
+
if (!fs.existsSync(abs)) {
|
|
139
|
+
throw new ConfigError(`sponsio.yaml not found: ${abs}\n` +
|
|
140
|
+
` (pass an absolute or cwd-relative path to --config)`, abs);
|
|
141
|
+
}
|
|
142
|
+
let raw;
|
|
143
|
+
try {
|
|
144
|
+
raw = fs.readFileSync(abs, "utf8");
|
|
145
|
+
}
|
|
146
|
+
catch (err) {
|
|
147
|
+
throw new ConfigError(`cannot read ${abs}: ${err.message}`, abs);
|
|
148
|
+
}
|
|
149
|
+
let parsed;
|
|
150
|
+
try {
|
|
151
|
+
parsed = yaml.load(raw);
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
throw new ConfigError(`invalid YAML in ${abs}: ${err.message}`, abs);
|
|
155
|
+
}
|
|
156
|
+
if (parsed === null || parsed === undefined) {
|
|
157
|
+
// Empty file is legal in YAML — treat as no-config-at-all, not
|
|
158
|
+
// an error. Users sometimes ``touch sponsio.yaml`` before
|
|
159
|
+
// filling it in.
|
|
160
|
+
return {
|
|
161
|
+
extractor: {},
|
|
162
|
+
scan: {},
|
|
163
|
+
missingEnvVars: [],
|
|
164
|
+
sourcePath: abs,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
if (typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
168
|
+
throw new ConfigError(`top level of ${abs} must be a mapping, got ${typeof parsed}`, abs);
|
|
169
|
+
}
|
|
170
|
+
const missing = new Set();
|
|
171
|
+
const interpolated = interpolateEnv(parsed, missing);
|
|
172
|
+
return {
|
|
173
|
+
extractor: normaliseExtractor(interpolated.extractor, abs),
|
|
174
|
+
scan: normaliseScan(interpolated.scan, abs),
|
|
175
|
+
missingEnvVars: [...missing].sort(),
|
|
176
|
+
sourcePath: abs,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
function normaliseExtractor(raw, source) {
|
|
180
|
+
if (raw === undefined || raw === null)
|
|
181
|
+
return {};
|
|
182
|
+
if (typeof raw !== "object" || Array.isArray(raw)) {
|
|
183
|
+
throw new ConfigError(`'extractor' must be a mapping in ${source}, got ${Array.isArray(raw) ? "array" : typeof raw}`, source);
|
|
184
|
+
}
|
|
185
|
+
const r = raw;
|
|
186
|
+
const out = {};
|
|
187
|
+
for (const key of ["provider", "model", "api_key", "base_url"]) {
|
|
188
|
+
const v = r[key];
|
|
189
|
+
if (v === undefined || v === null)
|
|
190
|
+
continue;
|
|
191
|
+
if (typeof v !== "string") {
|
|
192
|
+
throw new ConfigError(`'extractor.${key}' must be a string in ${source}, got ${typeof v}`, source);
|
|
193
|
+
}
|
|
194
|
+
// Filter empty strings — the interpolator turns unset vars
|
|
195
|
+
// into ``""`` and emitting ``api_key: ""`` in the output
|
|
196
|
+
// downstream would look like an explicit blanking rather than
|
|
197
|
+
// "not set". Treat empty as absent.
|
|
198
|
+
if (v !== "")
|
|
199
|
+
out[key] = v;
|
|
200
|
+
}
|
|
201
|
+
return out;
|
|
202
|
+
}
|
|
203
|
+
function normaliseScan(raw, source) {
|
|
204
|
+
if (raw === undefined || raw === null)
|
|
205
|
+
return {};
|
|
206
|
+
if (typeof raw !== "object" || Array.isArray(raw)) {
|
|
207
|
+
throw new ConfigError(`'scan' must be a mapping in ${source}, got ${Array.isArray(raw) ? "array" : typeof raw}`, source);
|
|
208
|
+
}
|
|
209
|
+
const r = raw;
|
|
210
|
+
const out = {};
|
|
211
|
+
const asStringArray = (v, key) => {
|
|
212
|
+
if (!Array.isArray(v)) {
|
|
213
|
+
throw new ConfigError(`'scan.${key}' must be an array of strings in ${source}`, source);
|
|
214
|
+
}
|
|
215
|
+
for (const item of v) {
|
|
216
|
+
if (typeof item !== "string") {
|
|
217
|
+
throw new ConfigError(`'scan.${key}' items must be strings in ${source}`, source);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return v;
|
|
221
|
+
};
|
|
222
|
+
if (r.patterns !== undefined)
|
|
223
|
+
out.patterns = asStringArray(r.patterns, "patterns");
|
|
224
|
+
if (r.ignore !== undefined)
|
|
225
|
+
out.ignore = asStringArray(r.ignore, "ignore");
|
|
226
|
+
if (r.out !== undefined) {
|
|
227
|
+
if (typeof r.out !== "string") {
|
|
228
|
+
throw new ConfigError(`'scan.out' must be a string in ${source}`, source);
|
|
229
|
+
}
|
|
230
|
+
// Empty string (from an unset ``${OUT_FILE}``) is treated as
|
|
231
|
+
// unset — same rationale as extractor fields above.
|
|
232
|
+
if (r.out !== "")
|
|
233
|
+
out.out = r.out;
|
|
234
|
+
}
|
|
235
|
+
if (r.provenance !== undefined) {
|
|
236
|
+
if (typeof r.provenance !== "boolean") {
|
|
237
|
+
throw new ConfigError(`'scan.provenance' must be a boolean in ${source}, got ${typeof r.provenance}`, source);
|
|
238
|
+
}
|
|
239
|
+
out.provenance = r.provenance;
|
|
240
|
+
}
|
|
241
|
+
return out;
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ``sponsio demo`` — terminal demo of unsafe agent behavior + Sponsio
|
|
3
|
+
* blocking it.
|
|
4
|
+
*
|
|
5
|
+
* Mirrors the Python ``sponsio demo`` UX in spirit. The Python version
|
|
6
|
+
* ships four baked-in scenarios; the TS version ships one (``wire``,
|
|
7
|
+
* the AP-copilot wire-transfer story) inline, and points users at the
|
|
8
|
+
* full ``ts/examples/bec-backoffice/`` example for a richer scenario
|
|
9
|
+
* with real Vercel AI SDK + @ai-sdk/anthropic integration.
|
|
10
|
+
*/
|
|
11
|
+
export declare function runDemoCli(argv: string[]): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=demo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demo.d.ts","sourceRoot":"","sources":["../../src/cli/demo.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAwTH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6C9D"}
|
package/dist/cli/demo.js
ADDED
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ``sponsio demo`` — terminal demo of unsafe agent behavior + Sponsio
|
|
4
|
+
* blocking it.
|
|
5
|
+
*
|
|
6
|
+
* Mirrors the Python ``sponsio demo`` UX in spirit. The Python version
|
|
7
|
+
* ships four baked-in scenarios; the TS version ships one (``wire``,
|
|
8
|
+
* the AP-copilot wire-transfer story) inline, and points users at the
|
|
9
|
+
* full ``ts/examples/bec-backoffice/`` example for a richer scenario
|
|
10
|
+
* with real Vercel AI SDK + @ai-sdk/anthropic integration.
|
|
11
|
+
*/
|
|
12
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
15
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
16
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
17
|
+
}
|
|
18
|
+
Object.defineProperty(o, k2, desc);
|
|
19
|
+
}) : (function(o, m, k, k2) {
|
|
20
|
+
if (k2 === undefined) k2 = k;
|
|
21
|
+
o[k2] = m[k];
|
|
22
|
+
}));
|
|
23
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
24
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
25
|
+
}) : function(o, v) {
|
|
26
|
+
o["default"] = v;
|
|
27
|
+
});
|
|
28
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
29
|
+
var ownKeys = function(o) {
|
|
30
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
31
|
+
var ar = [];
|
|
32
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
33
|
+
return ar;
|
|
34
|
+
};
|
|
35
|
+
return ownKeys(o);
|
|
36
|
+
};
|
|
37
|
+
return function (mod) {
|
|
38
|
+
if (mod && mod.__esModule) return mod;
|
|
39
|
+
var result = {};
|
|
40
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
41
|
+
__setModuleDefault(result, mod);
|
|
42
|
+
return result;
|
|
43
|
+
};
|
|
44
|
+
})();
|
|
45
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
+
exports.runDemoCli = runDemoCli;
|
|
47
|
+
const HELP = "sponsio demo — terminal demo of unsafe agent behavior + the contract that blocks it\n" +
|
|
48
|
+
"\n" +
|
|
49
|
+
"USAGE:\n" +
|
|
50
|
+
" sponsio demo [options]\n" +
|
|
51
|
+
"\n" +
|
|
52
|
+
"OPTIONS:\n" +
|
|
53
|
+
" --scenario <name> Scenario to replay (default: wire)\n" +
|
|
54
|
+
" Built-in: wire\n" +
|
|
55
|
+
" --no-guard Replay without Sponsio (show the unsafe outcome)\n" +
|
|
56
|
+
" --list List available scenarios and exit\n" +
|
|
57
|
+
" -h, --help Show this help\n" +
|
|
58
|
+
"\n" +
|
|
59
|
+
"EXAMPLES:\n" +
|
|
60
|
+
" sponsio demo # blocked-by-default\n" +
|
|
61
|
+
" sponsio demo --no-guard # see the unsafe trajectory\n" +
|
|
62
|
+
" sponsio demo --list\n" +
|
|
63
|
+
"\n" +
|
|
64
|
+
"For a richer end-to-end demo with real LLM tool-calling, see\n" +
|
|
65
|
+
" ts/examples/bec-backoffice/ (Vercel AI SDK + @ai-sdk/anthropic)\n";
|
|
66
|
+
async function loadSdk() {
|
|
67
|
+
const mod = await Promise.resolve().then(() => __importStar(require("@sponsio/sdk")));
|
|
68
|
+
return mod;
|
|
69
|
+
}
|
|
70
|
+
const SCENARIOS = {
|
|
71
|
+
wire: {
|
|
72
|
+
id: "wire",
|
|
73
|
+
title: "AP copilot wires $847k to an unverified vendor (OWASP ASI-09)",
|
|
74
|
+
blurb: "The accounts-payable agent processes a vendor invoice email. The email\n" +
|
|
75
|
+
"claims the vendor's banking changed; the agent updates the bank record\n" +
|
|
76
|
+
"and wires the funds — without an out-of-band callback. This is the\n" +
|
|
77
|
+
"structural shape of a Business Email Compromise attack against agents.",
|
|
78
|
+
events: [
|
|
79
|
+
{ tool: "list_invoices", args: { quarter: "q2" } },
|
|
80
|
+
{ tool: "read_invoice", args: { id: "inv_044" } },
|
|
81
|
+
{
|
|
82
|
+
tool: "check_vendor_history",
|
|
83
|
+
args: { vendor: "Acme Logistics LLC" },
|
|
84
|
+
narration: "No prior transactions with this vendor — new bank, new EIN",
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
tool: "wire_transfer",
|
|
88
|
+
args: { to: "Acme Logistics LLC", amount: 847000, invoice_id: "inv_044" },
|
|
89
|
+
narration: "$847k wired to an unverified vendor with no confirm or compliance sign-off",
|
|
90
|
+
},
|
|
91
|
+
],
|
|
92
|
+
async build() {
|
|
93
|
+
const sdk = await loadSdk();
|
|
94
|
+
const { argValueRange, mustPrecede, mustConfirm, rateLimit } = sdk;
|
|
95
|
+
const contracts = [
|
|
96
|
+
argValueRange("wire_transfer", "amount", 0, 50000),
|
|
97
|
+
mustPrecede("compliance_approve", "wire_transfer"),
|
|
98
|
+
mustConfirm("wire_transfer"),
|
|
99
|
+
rateLimit("wire_transfer", 5),
|
|
100
|
+
];
|
|
101
|
+
const descs = contracts.map((c) => c.desc);
|
|
102
|
+
return { contracts, contractDescs: descs };
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
backup: {
|
|
106
|
+
id: "backup",
|
|
107
|
+
title: "SRE cost-optimizer deletes prod DR backups (OWASP ASI-10)",
|
|
108
|
+
blurb: "Under a 'cut storage bill 20%' KPI, an SRE agent deletes off-site\n" +
|
|
109
|
+
"disaster-recovery snapshots it reads as 'unused'. Three rapid-fire\n" +
|
|
110
|
+
"deletes wipe out the 90-day DR window. Sponsio blocks the first\n" +
|
|
111
|
+
"delete via path-scope (only dev/staging allowed) + age-bound (only\n" +
|
|
112
|
+
"snapshots <= 30 days old).",
|
|
113
|
+
events: [
|
|
114
|
+
{ tool: "list_snapshots", args: { root: "/snapshots/" } },
|
|
115
|
+
{
|
|
116
|
+
tool: "estimate_savings",
|
|
117
|
+
args: { pattern: "/snapshots/prod/db_2025_11_*.tar.gz" },
|
|
118
|
+
narration: "Agent decides $3,400/mo can come from the 'unused' prod snapshots",
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
tool: "delete_snapshot",
|
|
122
|
+
args: { path: "/snapshots/prod/db_2025_11_01.tar.gz", age_days: 94 },
|
|
123
|
+
narration: "Off-site DR backup deleted",
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
tool: "delete_snapshot",
|
|
127
|
+
args: { path: "/snapshots/prod/db_2025_11_08.tar.gz", age_days: 87 },
|
|
128
|
+
narration: "Second DR backup deleted",
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
tool: "delete_snapshot",
|
|
132
|
+
args: { path: "/snapshots/prod/db_2025_11_15.tar.gz", age_days: 80 },
|
|
133
|
+
narration: "Third DR backup deleted",
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
tool: "generate_report",
|
|
137
|
+
args: { output_path: "/reports/cost_savings.json" },
|
|
138
|
+
narration: "Report claims $3,400/mo savings; DR window silently gone",
|
|
139
|
+
},
|
|
140
|
+
],
|
|
141
|
+
async build() {
|
|
142
|
+
const sdk = await loadSdk();
|
|
143
|
+
const { scopeLimit, argValueRange, rateLimit } = sdk;
|
|
144
|
+
const contracts = [
|
|
145
|
+
scopeLimit("delete_snapshot", ["/snapshots/dev/", "/snapshots/staging/"]),
|
|
146
|
+
argValueRange("delete_snapshot", "age_days", 0, 30),
|
|
147
|
+
rateLimit("delete_snapshot", 5),
|
|
148
|
+
];
|
|
149
|
+
const descs = contracts.map((c) => c.desc);
|
|
150
|
+
return { contracts, contractDescs: descs };
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
cleanup: {
|
|
154
|
+
id: "cleanup",
|
|
155
|
+
title: "Coding cleanup agent deletes .env / .git, force-pushes to main",
|
|
156
|
+
blurb: "A Claude Code-style cleanup agent reads .env contents, then 'cleans\n" +
|
|
157
|
+
"up' by rm-ing them along with .git/, then force-pushes to main.\n" +
|
|
158
|
+
"Two arg-blacklist contracts on Bash.command catch the destructive\n" +
|
|
159
|
+
"commands before the shell sees them.",
|
|
160
|
+
events: [
|
|
161
|
+
{ tool: "Bash", args: { command: "git status --porcelain" } },
|
|
162
|
+
{
|
|
163
|
+
tool: "Bash",
|
|
164
|
+
args: { command: "cat .env .env.production" },
|
|
165
|
+
narration: ".env contents loaded into context",
|
|
166
|
+
},
|
|
167
|
+
{ tool: "Bash", args: { command: "rm -rf node_modules dist .next build" } },
|
|
168
|
+
{
|
|
169
|
+
tool: "Bash",
|
|
170
|
+
args: { command: "rm -f .env .env.local .env.production prod.env" },
|
|
171
|
+
narration: "secret files deleted",
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
tool: "Bash",
|
|
175
|
+
args: { command: "git push --force origin main" },
|
|
176
|
+
narration: "force-pushed to main",
|
|
177
|
+
},
|
|
178
|
+
],
|
|
179
|
+
async build() {
|
|
180
|
+
const sdk = await loadSdk();
|
|
181
|
+
const { argBlacklist } = sdk;
|
|
182
|
+
const contracts = [
|
|
183
|
+
argBlacklist("Bash", "command", ["rm\\s+.*\\.env", "rm\\s+.*\\.git"]),
|
|
184
|
+
argBlacklist("Bash", "command", ["git\\s+push\\s+.*--force.*\\b(main|master)\\b"]),
|
|
185
|
+
];
|
|
186
|
+
const descs = contracts.map((c) => c.desc);
|
|
187
|
+
return { contracts, contractDescs: descs };
|
|
188
|
+
},
|
|
189
|
+
},
|
|
190
|
+
freeze: {
|
|
191
|
+
id: "freeze",
|
|
192
|
+
title: "Coding agent violates code freeze, drops prod tables, hides damage",
|
|
193
|
+
blurb: "Replays the July 2025 Replit incident: agent receives a 'code freeze'\n" +
|
|
194
|
+
"instruction, then drops a prod table and fabricates replacement rows\n" +
|
|
195
|
+
"from memory. The TS port lands two of the canonical contracts: the\n" +
|
|
196
|
+
"'no destructive SQL' arg blacklist on execute_sql.query, and the\n" +
|
|
197
|
+
"must_precede(escalate_to_human, generate_status_report) gate that\n" +
|
|
198
|
+
"stops the silent status report after destructive ops.",
|
|
199
|
+
events: [
|
|
200
|
+
{
|
|
201
|
+
tool: "user_instruction",
|
|
202
|
+
args: { text: "Code freeze for the next 48h — please don't touch the prod DB" },
|
|
203
|
+
narration: "Operator declares the freeze",
|
|
204
|
+
},
|
|
205
|
+
{ tool: "edit_react_component", args: { file: "src/Header.tsx" } },
|
|
206
|
+
{
|
|
207
|
+
tool: "execute_sql",
|
|
208
|
+
args: { query: "DROP TABLE archived_events" },
|
|
209
|
+
narration: "Agent 'cleans up' an archived table",
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
tool: "execute_sql",
|
|
213
|
+
args: { query: "DELETE FROM users WHERE last_login < NOW() - INTERVAL '90 days'" },
|
|
214
|
+
narration: "Mass DELETE on prod users",
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
tool: "execute_sql",
|
|
218
|
+
args: { query: "INSERT INTO users (email, name) VALUES ('[email protected]', 'Test User')" },
|
|
219
|
+
narration: "Fabricates rows to refill the table",
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
tool: "generate_status_report",
|
|
223
|
+
args: { content: "Database intact. No issues." },
|
|
224
|
+
narration: "Status report hides the damage",
|
|
225
|
+
},
|
|
226
|
+
],
|
|
227
|
+
async build() {
|
|
228
|
+
const sdk = await loadSdk();
|
|
229
|
+
const { argBlacklist, mustPrecede } = sdk;
|
|
230
|
+
const contracts = [
|
|
231
|
+
argBlacklist("execute_sql", "query", ["\\b(DROP|DELETE|TRUNCATE|ALTER)\\b"]),
|
|
232
|
+
mustPrecede("escalate_to_human", "generate_status_report"),
|
|
233
|
+
];
|
|
234
|
+
const descs = contracts.map((c) => c.desc);
|
|
235
|
+
return { contracts, contractDescs: descs };
|
|
236
|
+
},
|
|
237
|
+
},
|
|
238
|
+
};
|
|
239
|
+
function decorate(label) {
|
|
240
|
+
switch (label) {
|
|
241
|
+
case "blocked":
|
|
242
|
+
return `\x1b[31mBLOCKED\x1b[0m`;
|
|
243
|
+
case "would-block":
|
|
244
|
+
return `\x1b[33mWOULD-BLOCK\x1b[0m`;
|
|
245
|
+
case "allowed":
|
|
246
|
+
return `\x1b[32mallowed\x1b[0m`;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
async function buildGuard(scenario, contracts) {
|
|
250
|
+
const mod = await Promise.resolve().then(() => __importStar(require("@sponsio/sdk")));
|
|
251
|
+
const Sponsio = mod.Sponsio;
|
|
252
|
+
if (!Sponsio)
|
|
253
|
+
throw new Error("[demo] @sponsio/sdk does not export Sponsio");
|
|
254
|
+
return new Sponsio({
|
|
255
|
+
agentId: scenario.id,
|
|
256
|
+
contracts,
|
|
257
|
+
mode: "enforce",
|
|
258
|
+
sessionLog: false,
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
async function runScenario(scenario, guarded) {
|
|
262
|
+
const built = await scenario.build();
|
|
263
|
+
process.stdout.write(`\n╔═ ${scenario.title}\n║\n`);
|
|
264
|
+
for (const line of scenario.blurb.split("\n"))
|
|
265
|
+
process.stdout.write(`║ ${line}\n`);
|
|
266
|
+
process.stdout.write(`║\n║ Contracts armed:\n`);
|
|
267
|
+
for (const d of built.contractDescs) {
|
|
268
|
+
process.stdout.write(`║ • ${d.split("\n")[0]}\n`);
|
|
269
|
+
}
|
|
270
|
+
process.stdout.write(`║\n║ Mode: ${guarded ? "guarded (Sponsio enforce)" : "no-guard (raw replay)"}\n`);
|
|
271
|
+
process.stdout.write(`╚═\n\n`);
|
|
272
|
+
const guard = guarded ? await buildGuard(scenario, built.contracts) : null;
|
|
273
|
+
let blockedAt = -1;
|
|
274
|
+
for (let i = 0; i < scenario.events.length; i++) {
|
|
275
|
+
const ev = scenario.events[i];
|
|
276
|
+
process.stdout.write(` ${String(i + 1).padStart(2)}. ${ev.tool}${ev.args ? "(" + JSON.stringify(ev.args) + ")" : "()"}\n`);
|
|
277
|
+
if (ev.narration)
|
|
278
|
+
process.stdout.write(` ${ev.narration}\n`);
|
|
279
|
+
if (guard) {
|
|
280
|
+
const r = guard.guardBefore(ev.tool, ev.args ?? {});
|
|
281
|
+
if (r.blocked) {
|
|
282
|
+
const desc = (r.violatedDescs ?? [])[0] ?? r.detViolations?.[0]?.desc ?? "(no desc)";
|
|
283
|
+
process.stdout.write(` ${decorate("blocked")}: ${desc}\n`);
|
|
284
|
+
blockedAt = i;
|
|
285
|
+
break;
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
process.stdout.write(` ${decorate("allowed")}\n`);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
process.stdout.write(`\n`);
|
|
293
|
+
if (guarded) {
|
|
294
|
+
if (blockedAt >= 0) {
|
|
295
|
+
process.stdout.write(`✓ Sponsio blocked the trajectory at step ${blockedAt + 1}.\n`);
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
process.stdout.write(`(no contract fired — scenario contracts may need tuning)\n`);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
process.stdout.write(`Trajectory completed unguarded. The full attack would have succeeded.\n`);
|
|
303
|
+
}
|
|
304
|
+
process.stdout.write(`\nFor a richer end-to-end demo with real Anthropic tool-calling, see:\n` +
|
|
305
|
+
` ts/examples/bec-backoffice/\n`);
|
|
306
|
+
}
|
|
307
|
+
async function runDemoCli(argv) {
|
|
308
|
+
let scenarioId = "wire";
|
|
309
|
+
let noGuard = false;
|
|
310
|
+
let listOnly = false;
|
|
311
|
+
for (let i = 0; i < argv.length; i++) {
|
|
312
|
+
const a = argv[i];
|
|
313
|
+
if (a === "-h" || a === "--help") {
|
|
314
|
+
process.stdout.write(HELP);
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
if (a === "--scenario") {
|
|
318
|
+
scenarioId = argv[++i];
|
|
319
|
+
continue;
|
|
320
|
+
}
|
|
321
|
+
if (a === "--no-guard") {
|
|
322
|
+
noGuard = true;
|
|
323
|
+
continue;
|
|
324
|
+
}
|
|
325
|
+
if (a === "--list") {
|
|
326
|
+
listOnly = true;
|
|
327
|
+
continue;
|
|
328
|
+
}
|
|
329
|
+
if (a.startsWith("-")) {
|
|
330
|
+
process.stderr.write(`unknown flag: ${a}\n${HELP}`);
|
|
331
|
+
process.exit(2);
|
|
332
|
+
}
|
|
333
|
+
process.stderr.write(`unexpected positional: ${a}\n${HELP}`);
|
|
334
|
+
process.exit(2);
|
|
335
|
+
}
|
|
336
|
+
if (listOnly) {
|
|
337
|
+
process.stdout.write("Available scenarios:\n");
|
|
338
|
+
for (const s of Object.values(SCENARIOS)) {
|
|
339
|
+
process.stdout.write(` ${s.id.padEnd(8)} ${s.title}\n`);
|
|
340
|
+
}
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
343
|
+
const scenario = SCENARIOS[scenarioId];
|
|
344
|
+
if (!scenario) {
|
|
345
|
+
process.stderr.write(`Error: unknown scenario '${scenarioId}'. Try --list.\n`);
|
|
346
|
+
process.exit(2);
|
|
347
|
+
}
|
|
348
|
+
await runScenario(scenario, !noGuard);
|
|
349
|
+
}
|
|
350
|
+
//# sourceMappingURL=demo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demo.js","sourceRoot":"","sources":["../../src/cli/demo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ``sponsio doctor`` — pre-flight env + config sanity check.
|
|
3
|
+
*
|
|
4
|
+
* Parity with Python's ``sponsio doctor``, tuned to the TS runtime:
|
|
5
|
+
* verifies node version, the ``yaml`` peer dep, the session log dir,
|
|
6
|
+
* ``SPONSIO_MODE`` value, and (if ``sponsio.yaml`` is present in CWD)
|
|
7
|
+
* that it parses cleanly. Exits non-zero when any check fails so CI
|
|
8
|
+
* can gate on it.
|
|
9
|
+
*/
|
|
10
|
+
export declare function runDoctorCli(argv: string[]): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA+KH,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BhE"}
|