@synapsor/runner 1.4.123 → 1.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +144 -19
- package/README.md +132 -135
- package/dist/authoring.d.ts +23 -0
- package/dist/authoring.d.ts.map +1 -0
- package/dist/authoring.mjs +1318 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +4 -5
- package/dist/local-ui.d.ts +14 -0
- package/dist/local-ui.d.ts.map +1 -1
- package/dist/runner.mjs +18427 -7084
- package/dist/runtime.d.ts +50 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.mjs +15094 -0
- package/dist/shadow.d.ts +36 -0
- package/dist/shadow.d.ts.map +1 -0
- package/dist/shadow.mjs +5262 -0
- package/docs/README.md +44 -5
- package/docs/alternatives.md +122 -0
- package/docs/capability-authoring.md +44 -1
- package/docs/client-recipes.md +218 -0
- package/docs/contract-testing.md +9 -7
- package/docs/cursor-plugin.md +78 -0
- package/docs/database-enforced-scope.md +273 -0
- package/docs/dependency-license-inventory.md +6 -2
- package/docs/doctor.md +17 -0
- package/docs/effect-regression.md +179 -0
- package/docs/fresh-developer-usability.md +110 -0
- package/docs/getting-started-own-database.md +103 -2
- package/docs/host-compatibility.md +59 -0
- package/docs/local-mode.md +12 -7
- package/docs/mcp-apps.md +188 -0
- package/docs/mcp-audit.md +220 -2
- package/docs/mcp-client-setup.md +20 -4
- package/docs/mcp-clients.md +41 -4
- package/docs/oss-vs-cloud.md +3 -0
- package/docs/production.md +8 -0
- package/docs/release-notes.md +138 -14
- package/docs/release-policy.md +9 -5
- package/docs/runner-config-reference.md +25 -0
- package/docs/schema-api-candidates.md +68 -0
- package/docs/security-boundary.md +30 -5
- package/docs/shadow-studies.md +241 -0
- package/docs/troubleshooting-first-run.md +46 -0
- package/examples/mcp-postgres-billing-app-handler/app-handler.mjs +9 -1
- package/examples/mcp-postgres-billing-app-handler/schema.sql +11 -0
- package/examples/mcp-postgres-billing-app-handler/synapsor-handler.mjs +3 -0
- package/examples/raw-sql-vs-synapsor/Makefile +2 -2
- package/examples/raw-sql-vs-synapsor/README.md +6 -4
- package/examples/support-billing-agent/Makefile +5 -1
- package/examples/support-billing-agent/README.md +57 -5
- package/examples/support-billing-agent/app/README.md +6 -0
- package/examples/support-billing-agent/app/contract.ts +28 -0
- package/examples/support-billing-agent/app/effect-adapter.mjs +23 -0
- package/examples/support-billing-agent/app/record-shadow-outcomes.mjs +44 -0
- package/examples/support-billing-agent/db/schema.sql +88 -1
- package/examples/support-billing-agent/db/seed.sql +15 -15
- package/examples/support-billing-agent/scripts/run-demo.sh +4 -0
- package/examples/support-billing-agent/scripts/run-evaluation.sh +63 -0
- package/examples/support-billing-agent/shadow-study/cases.jsonl +6 -0
- package/examples/support-billing-agent/shadow-study/outcomes.jsonl +2 -0
- package/examples/support-billing-agent/synapsor.runner.json +17 -5
- package/examples/support-plan-credit/README.md +48 -2
- package/examples/support-plan-credit/mcp-client-examples/README.md +23 -0
- package/examples/support-plan-credit/mcp-client-examples/claude-code.sh +34 -0
- package/examples/support-plan-credit/mcp-client-examples/codex.config.toml +24 -0
- package/examples/support-plan-credit/mcp-client-examples/generic-stdio.mjs +35 -0
- package/examples/support-plan-credit/mcp-client-examples/generic-streamable-http.mjs +31 -0
- package/examples/support-plan-credit/mcp-client-examples/google-adk.py +40 -0
- package/examples/support-plan-credit/mcp-client-examples/langchain.mjs +29 -0
- package/examples/support-plan-credit/mcp-client-examples/llamaindex.py +36 -0
- package/examples/support-plan-credit/mcp-client-examples/openai-agents-stdio.ts +1 -1
- package/examples/support-plan-credit/mcp-client-examples/openai-agents-streamable-http.ts +1 -1
- package/examples/support-plan-credit/mcp-client-examples/vscode.mcp.json +20 -0
- package/examples/support-plan-credit/synapsor/actions/support.propose_plan_credit.contract-tests.generated.json +221 -0
- package/examples/support-plan-credit/synapsor/actions/support.propose_plan_credit.ts +34 -0
- package/fixtures/effects/changed/eff_support_late_fee_v1.result.json +58 -0
- package/fixtures/effects/dataset.json +8 -0
- package/fixtures/effects/results/eff_support_late_fee_v1.result.json +59 -0
- package/fixtures/effects/support-late-fee.effect.json +71 -0
- package/fixtures/generators/drizzle/malicious.ts +11 -0
- package/fixtures/generators/drizzle/schema.ts +12 -0
- package/fixtures/generators/openapi/external-ref.yaml +15 -0
- package/fixtures/generators/openapi/openapi.yaml +81 -0
- package/fixtures/generators/prisma/schema.prisma +34 -0
- package/fixtures/mcp-audit/README.md +14 -0
- package/fixtures/mcp-audit/cursor-bypass-config.json +38 -0
- package/fixtures/mcp-audit/dangerous-tools-list.json +33 -0
- package/fixtures/mcp-audit/reviewed-proposal-tools-list.json +60 -0
- package/package.json +29 -3
- package/schemas/effect-dataset.schema.json +19 -0
- package/schemas/effect-fixture.schema.json +191 -0
- package/schemas/effect-result.schema.json +52 -0
- package/schemas/mcp-audit-candidates.schema.json +41 -0
- package/schemas/mcp-audit-report.schema.json +203 -0
- package/schemas/schema-candidate-review.schema.json +167 -0
- package/schemas/schema-candidates.schema.json +49 -0
- package/schemas/synapsor.contract-tests.schema.json +1 -1
- package/schemas/synapsor.runner.schema.json +51 -0
package/docs/mcp-audit.md
CHANGED
|
@@ -8,7 +8,10 @@ available for users who look for the command under the MCP namespace.
|
|
|
8
8
|
From a source checkout, use `./bin/synapsor-runner ...` if the global binary is not
|
|
9
9
|
linked yet.
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
Static mode does not launch configured MCP servers or call business tools. It
|
|
12
|
+
only inspects names, descriptions, input schemas, output schemas, annotations,
|
|
13
|
+
and examples when those are present. An explicitly consented live check calls
|
|
14
|
+
only `initialize` and `tools/list` on one named server.
|
|
12
15
|
|
|
13
16
|
Every report includes this disclaimer:
|
|
14
17
|
|
|
@@ -37,6 +40,15 @@ Human-readable output:
|
|
|
37
40
|
npx -y -p @synapsor/runner synapsor-runner audit ./tools-list.json
|
|
38
41
|
```
|
|
39
42
|
|
|
43
|
+
The default terminal report groups repeated findings into the three most
|
|
44
|
+
important root causes. It shows affected tools, a short blast-radius statement,
|
|
45
|
+
and one next action instead of repeating the same explanation for every tool.
|
|
46
|
+
Use the complete view when triaging every finding:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
npx -y -p @synapsor/runner synapsor-runner audit ./tools-list.json --verbose
|
|
50
|
+
```
|
|
51
|
+
|
|
40
52
|
Remote `tools/list` endpoint with a bearer token kept in the environment:
|
|
41
53
|
|
|
42
54
|
```bash
|
|
@@ -62,12 +74,51 @@ JSON output:
|
|
|
62
74
|
npx -y -p @synapsor/runner synapsor-runner audit ./tools-list.json --format json
|
|
63
75
|
```
|
|
64
76
|
|
|
77
|
+
The JSON contract remains `synapsor.mcp-audit.v1`; its published schema is
|
|
78
|
+
[`schemas/mcp-audit-report.schema.json`](../schemas/mcp-audit-report.schema.json).
|
|
79
|
+
|
|
80
|
+
SARIF 2.1.0 output for code-scanning ingestion:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
npx -y -p @synapsor/runner synapsor-runner audit ./tools-list.json --format sarif > mcp-audit.sarif
|
|
84
|
+
```
|
|
85
|
+
|
|
65
86
|
Markdown output for issues, PRs, or security review notes:
|
|
66
87
|
|
|
67
88
|
```bash
|
|
68
89
|
npx -y -p @synapsor/runner synapsor-runner audit --example dangerous-db-mcp --format markdown
|
|
69
90
|
```
|
|
70
91
|
|
|
92
|
+
Inspect a project-scoped Cursor configuration without launching anything:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
npx -y -p @synapsor/runner synapsor-runner audit \
|
|
96
|
+
--mcp-config ./.cursor/mcp.json \
|
|
97
|
+
--format markdown
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Static client-config output marks every server without supplied tool metadata
|
|
101
|
+
as `requires_operator_verification`. To query one reviewed stdio command, name
|
|
102
|
+
that exact server and give explicit consent:
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
npx -y -p @synapsor/runner synapsor-runner audit \
|
|
106
|
+
--mcp-config ./.cursor/mcp.json \
|
|
107
|
+
--live-server synapsor \
|
|
108
|
+
--yes \
|
|
109
|
+
--format json
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Runner does not use a shell and refuses unresolved interpolation. For Cursor's
|
|
113
|
+
documented `${workspaceFolder}` token, a config under `.cursor/mcp.json`
|
|
114
|
+
resolves against the project root. Live mode executes no business, approval,
|
|
115
|
+
apply, commit, or revert tool. It cannot prove the selected server is secure.
|
|
116
|
+
|
|
117
|
+
The bypass check matters after installing Runner: another model-visible MCP
|
|
118
|
+
server may still expose `execute_sql` or a direct write. Synapsor cannot govern
|
|
119
|
+
calls routed around Runner. Audit reports the server and observed tool names,
|
|
120
|
+
but never removes or rewrites unrelated MCP configuration automatically.
|
|
121
|
+
|
|
71
122
|
During local development, the repo-local wrapper can run the same command:
|
|
72
123
|
|
|
73
124
|
```bash
|
|
@@ -75,6 +126,55 @@ During local development, the repo-local wrapper can run the same command:
|
|
|
75
126
|
./bin/synapsor-runner audit ./tools-list.json --format json
|
|
76
127
|
```
|
|
77
128
|
|
|
129
|
+
## Generate review candidates
|
|
130
|
+
|
|
131
|
+
Audit can create a separate review directory without editing or activating the
|
|
132
|
+
source configuration:
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
npx -y -p @synapsor/runner synapsor-runner audit generate \
|
|
136
|
+
./tools-list.json \
|
|
137
|
+
--output ./synapsor-audit-candidates
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Open the same blocked candidate directly in the secured local review
|
|
141
|
+
workbench:
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
npx -y -p @synapsor/runner synapsor-runner audit generate \
|
|
145
|
+
./tools-list.json \
|
|
146
|
+
--output ./synapsor-audit-candidates \
|
|
147
|
+
--open-ui
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
This does not activate the candidate. The generated Runner config has no source
|
|
151
|
+
and every proposal writeback is `none`.
|
|
152
|
+
|
|
153
|
+
The generator uses the same parser and findings as `audit`. It writes:
|
|
154
|
+
|
|
155
|
+
- a canonical `@synapsor/spec` contract;
|
|
156
|
+
- a strict-shadow Runner scaffold with no configured source;
|
|
157
|
+
- deny, redaction, and operator-boundary test candidates;
|
|
158
|
+
- before/after model tool-surface reports;
|
|
159
|
+
- a `REVIEW.md` checklist.
|
|
160
|
+
|
|
161
|
+
Generated candidates do not carry authority. Every proposal has
|
|
162
|
+
`writeback.mode: none`, the Runner scaffold is `shadow`, and the source map is
|
|
163
|
+
empty. Subject identifiers and visible/write fields are conspicuous
|
|
164
|
+
`review_required_*` placeholders. Input fields that look like SQL, dynamic
|
|
165
|
+
identifiers, tenant/principal scope, credentials, approval identity, or row
|
|
166
|
+
version are omitted rather than copied into model arguments.
|
|
167
|
+
|
|
168
|
+
The output excludes raw descriptions, defaults, examples, enum values, bearer
|
|
169
|
+
tokens, and credentials. Unknown business meaning becomes a TODO. A developer
|
|
170
|
+
must inspect the real schema, choose trusted tenant/principal bindings, run the
|
|
171
|
+
generated tests and a Shadow study, then deliberately copy reviewed definitions
|
|
172
|
+
into an active contract.
|
|
173
|
+
|
|
174
|
+
Generation refuses an existing directory. `--force` only replaces a directory
|
|
175
|
+
that carries Runner's `synapsor.audit-candidates.v1` ownership marker; it will
|
|
176
|
+
not overwrite an arbitrary hand-edited directory.
|
|
177
|
+
|
|
78
178
|
## Supported inputs
|
|
79
179
|
|
|
80
180
|
The audit accepts common exported shapes:
|
|
@@ -93,7 +193,33 @@ The audit accepts common exported shapes:
|
|
|
93
193
|
|
|
94
194
|
It also scans nested `adapter`, `mcpServers`, and `servers` blocks when they include tool metadata.
|
|
95
195
|
|
|
96
|
-
For live targets, the audit
|
|
196
|
+
For live stdio targets, the audit performs MCP `initialize`, then calls only
|
|
197
|
+
JSON-RPC `tools/list`. Remote URL mode calls `tools/list`. It does not call
|
|
198
|
+
business tools, approval tools, commit tools, or writeback tools.
|
|
199
|
+
|
|
200
|
+
Checked-in deterministic fixtures live under
|
|
201
|
+
[`fixtures/mcp-audit`](../fixtures/mcp-audit). The repository's
|
|
202
|
+
[`mcp-audit` GitHub Actions workflow](https://github.com/Synapsor/Synapsor-Runner/blob/main/.github/workflows/mcp-audit.yml)
|
|
203
|
+
builds the package, proves the dangerous fixture is detected, emits SARIF for
|
|
204
|
+
the reviewed proposal fixture, validates the SARIF shape, and uploads the
|
|
205
|
+
artifacts. Code-scanning upload runs only outside pull requests so forks do not
|
|
206
|
+
receive write authority.
|
|
207
|
+
|
|
208
|
+
## Model-authority map
|
|
209
|
+
|
|
210
|
+
Every text, JSON, Markdown, and SARIF report records structural evidence for:
|
|
211
|
+
|
|
212
|
+
- semantic reads and semantic proposals;
|
|
213
|
+
- direct writes and raw SQL/query authority;
|
|
214
|
+
- arbitrary identifier and model-controlled trust inputs;
|
|
215
|
+
- model-visible approval/apply/commit/revert authority;
|
|
216
|
+
- structured output and observable conflict/idempotency signals;
|
|
217
|
+
- controls that require an operator or sit outside static audit visibility.
|
|
218
|
+
|
|
219
|
+
Statuses are `observed`, `not_observed`, `requires_operator_verification`, or
|
|
220
|
+
`outside_static_audit_visibility`. These are evidence labels, not a numerical
|
|
221
|
+
security score. `not_observed` means only that the supplied metadata did not
|
|
222
|
+
show the authority. It is not proof of absence at runtime.
|
|
97
223
|
|
|
98
224
|
## Findings
|
|
99
225
|
|
|
@@ -110,6 +236,85 @@ The audit flags database-commit risks such as:
|
|
|
110
236
|
- ambiguous read/write tool boundaries;
|
|
111
237
|
- missing business descriptions, annotations, or fixture examples.
|
|
112
238
|
|
|
239
|
+
### Finding remediation index
|
|
240
|
+
|
|
241
|
+
The report carries one stable remediation URL for every finding. These anchors
|
|
242
|
+
are intentionally durable for JSON, Markdown, SARIF, pull requests, and code
|
|
243
|
+
scanning.
|
|
244
|
+
|
|
245
|
+
<a id="finding-generic-sql-tool"></a>
|
|
246
|
+
<a id="finding-write-tool-accepts-arbitrary-sql"></a>
|
|
247
|
+
<a id="finding-arbitrary-identifier-input"></a>
|
|
248
|
+
<a id="finding-arbitrary-predicate-input"></a>
|
|
249
|
+
|
|
250
|
+
#### Raw SQL, arbitrary identifiers, and free-form predicates
|
|
251
|
+
|
|
252
|
+
Replace generic SQL/query tools and model-selected schemas, tables, databases,
|
|
253
|
+
columns, filters, predicates, or WHERE clauses with a reviewed semantic
|
|
254
|
+
capability. Fixed identifiers and row-selection rules belong in the contract;
|
|
255
|
+
model inputs carry bounded business values only.
|
|
256
|
+
|
|
257
|
+
<a id="finding-model-controlled-trust-scope"></a>
|
|
258
|
+
|
|
259
|
+
#### Model-controlled trust scope
|
|
260
|
+
|
|
261
|
+
Bind tenant, principal, source, allowed fields, approval identity, and conflict
|
|
262
|
+
authority from verified context outside model arguments. Retain database RLS,
|
|
263
|
+
restricted views, and least-privilege roles underneath Runner.
|
|
264
|
+
|
|
265
|
+
<a id="finding-model-callable-commit-or-approval"></a>
|
|
266
|
+
<a id="finding-write-without-proposal-boundary"></a>
|
|
267
|
+
<a id="finding-mcp-bypass-direct-authority"></a>
|
|
268
|
+
|
|
269
|
+
#### Missing review boundary or bypass
|
|
270
|
+
|
|
271
|
+
Expose an immutable proposal rather than direct mutation. Keep activation,
|
|
272
|
+
approval, apply, commit, and revert outside MCP. Disable or independently
|
|
273
|
+
constrain another model-visible server that bypasses Runner; Synapsor cannot
|
|
274
|
+
govern calls made through that server.
|
|
275
|
+
|
|
276
|
+
<a id="finding-no-idempotency-field"></a>
|
|
277
|
+
<a id="finding-no-conflict-guard"></a>
|
|
278
|
+
<a id="finding-ambiguous-read-write-tool"></a>
|
|
279
|
+
|
|
280
|
+
#### Retry, stale-state, and mixed-authority gaps
|
|
281
|
+
|
|
282
|
+
Separate reads from proposals and require stable operation identity,
|
|
283
|
+
idempotency receipts, an exact conflict/version guard, and an affected-row
|
|
284
|
+
bound before trusted writeback.
|
|
285
|
+
|
|
286
|
+
<a id="finding-no-structured-output-schema"></a>
|
|
287
|
+
|
|
288
|
+
#### Missing structured output
|
|
289
|
+
|
|
290
|
+
Publish typed results that distinguish reads, pending proposals, conflicts,
|
|
291
|
+
failures, receipts, evidence, replay, and retry guidance without parsing prose.
|
|
292
|
+
|
|
293
|
+
<a id="finding-missing-business-description"></a>
|
|
294
|
+
<a id="finding-missing-risk-annotations"></a>
|
|
295
|
+
<a id="finding-missing-test-fixture"></a>
|
|
296
|
+
|
|
297
|
+
#### Reviewability gaps
|
|
298
|
+
|
|
299
|
+
Add a reviewer-readable business description, honest read/destructive hints,
|
|
300
|
+
and a non-production fixture. Annotations are vocabulary for clients, not an
|
|
301
|
+
enforcement boundary.
|
|
302
|
+
|
|
303
|
+
<a id="finding-mcp-server-tool-surface-unverified"></a>
|
|
304
|
+
|
|
305
|
+
#### Unverified configured server
|
|
306
|
+
|
|
307
|
+
Export that server's `tools/list`, or run the exact named `--live-server` check
|
|
308
|
+
after reviewing its configured command. Static client configuration does not
|
|
309
|
+
reveal the actual tool catalog.
|
|
310
|
+
|
|
311
|
+
<a id="finding-no-tools-found"></a>
|
|
312
|
+
|
|
313
|
+
#### No tools found
|
|
314
|
+
|
|
315
|
+
Provide an exported `tools/list` response, a supported manifest, a Runner
|
|
316
|
+
config, or an explicitly consented live target.
|
|
317
|
+
|
|
113
318
|
## Recommended target shape
|
|
114
319
|
|
|
115
320
|
A safer model-facing database MCP tool should look like a reviewed semantic proposal capability:
|
|
@@ -151,6 +356,19 @@ A safer model-facing database MCP tool should look like a reviewed semantic prop
|
|
|
151
356
|
|
|
152
357
|
Trusted values such as tenant, principal, source, allowed columns, approval identity, row-version guard, and database credentials must come from Synapsor/runner context, not from model-facing arguments.
|
|
153
358
|
|
|
359
|
+
To turn an identified business write into a disabled reviewed action, continue
|
|
360
|
+
with the Safe Action Composer:
|
|
361
|
+
|
|
362
|
+
```bash
|
|
363
|
+
synapsor-runner start \
|
|
364
|
+
--action refund_order \
|
|
365
|
+
--description "Propose one reviewed order refund"
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
The generated TypeScript action remains disabled. A coding agent may complete
|
|
369
|
+
and validate it; only a human can activate its exact digest in the secured
|
|
370
|
+
localhost Workbench.
|
|
371
|
+
|
|
154
372
|
## Related Fixture Benchmark
|
|
155
373
|
|
|
156
374
|
`synapsor-runner benchmark mcp-efficiency` compares a fixed generic database
|
package/docs/mcp-client-setup.md
CHANGED
|
@@ -11,9 +11,18 @@ or SDK. The simplest local-client contract is stdio. Standard HTTP MCP is
|
|
|
11
11
|
available through Streamable HTTP when your agent connects to a long-running
|
|
12
12
|
Runner service.
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
The checked [Client And Framework Recipes](client-recipes.md) use one shared
|
|
15
|
+
`support.propose_plan_credit` flow and distinguish host evidence from standard
|
|
16
|
+
MCP protocol evidence.
|
|
17
|
+
|
|
18
|
+
Proposal tools also advertise a standard display-only
|
|
19
|
+
[MCP App](mcp-apps.md). Supporting hosts discover it from tool metadata;
|
|
20
|
+
other clients keep the same text/JSON proposal result. Approval and apply
|
|
21
|
+
remain outside MCP in both cases.
|
|
22
|
+
|
|
23
|
+
Command examples use the stable untagged package through `npx`. From a source
|
|
24
|
+
checkout, use `./bin/synapsor-runner ...` only when you intentionally want the
|
|
25
|
+
local source wrapper.
|
|
17
26
|
|
|
18
27
|
Checked examples live in:
|
|
19
28
|
|
|
@@ -136,6 +145,11 @@ backup before writing. Noninteractive scripts must add `--yes`.
|
|
|
136
145
|
The command writes only the local stdio MCP command and args. It does not write
|
|
137
146
|
database URLs or passwords into the client config.
|
|
138
147
|
|
|
148
|
+
No separate Apps flag is required. A compatible host discovers
|
|
149
|
+
`ui://synapsor/proposal-review.html` from proposal-tool metadata. The app can
|
|
150
|
+
display the exact diff, but it has no approval/apply authority; use the
|
|
151
|
+
standalone local UI or terminal for human review.
|
|
152
|
+
|
|
139
153
|
## Start Command
|
|
140
154
|
|
|
141
155
|
From the runner repository:
|
|
@@ -144,7 +158,9 @@ From the runner repository:
|
|
|
144
158
|
npx -y -p @synapsor/runner synapsor-runner mcp serve --config ./examples/mcp-postgres-billing/synapsor.runner.json --store ./.synapsor/local.db
|
|
145
159
|
```
|
|
146
160
|
|
|
147
|
-
For
|
|
161
|
+
For reproducible deployments, pin an exact stable version in package manifests
|
|
162
|
+
and MCP client configuration. The untagged examples above intentionally resolve
|
|
163
|
+
the current `latest` release.
|
|
148
164
|
|
|
149
165
|
For standard app/server HTTP MCP mode:
|
|
150
166
|
|
package/docs/mcp-clients.md
CHANGED
|
@@ -4,12 +4,22 @@ Synapsor Runner exposes reviewed semantic tools over standard MCP. The model
|
|
|
4
4
|
receives inspect/propose capabilities; it does not receive raw SQL, database
|
|
5
5
|
credentials, approval commands, or apply commands.
|
|
6
6
|
|
|
7
|
+
Proposal tools advertise a display-only [MCP App](mcp-apps.md). Hosts that
|
|
8
|
+
implement the Apps extension can render the exact proposal diff inline.
|
|
9
|
+
Clients without it receive the same structured/text result, and human approval
|
|
10
|
+
still occurs in the standalone operator UI or terminal.
|
|
11
|
+
|
|
7
12
|
The complete copy-paste templates live in:
|
|
8
13
|
|
|
9
14
|
- [`examples/support-plan-credit/mcp-client-examples/`](../examples/support-plan-credit/mcp-client-examples/)
|
|
10
15
|
- every local `synapsor-runner contract bundle` output;
|
|
11
16
|
- every downloadable Synapsor Cloud runner bundle.
|
|
12
17
|
|
|
18
|
+
For one shared proposal call across Claude Code, Codex, VS Code, OpenAI Agents,
|
|
19
|
+
LangChain/LangGraph, Google ADK, LlamaIndex, and generic MCP clients, see
|
|
20
|
+
[Client And Framework Recipes](client-recipes.md). Each recipe states whether
|
|
21
|
+
it is host-tested, configuration-tested, protocol-tested, or recipe-only.
|
|
22
|
+
|
|
13
23
|
Before connecting a client, validate the local boundary:
|
|
14
24
|
|
|
15
25
|
```bash
|
|
@@ -57,15 +67,39 @@ repository file.
|
|
|
57
67
|
|
|
58
68
|
### Cursor
|
|
59
69
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
70
|
+
Prefer Runner's owned project lifecycle for one repository:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
synapsor-runner mcp install cursor --project --dry-run \
|
|
74
|
+
--config ./synapsor.runner.json \
|
|
75
|
+
--store ./.synapsor/local.db
|
|
76
|
+
synapsor-runner mcp install cursor --project --yes \
|
|
77
|
+
--config ./synapsor.runner.json \
|
|
78
|
+
--store ./.synapsor/local.db
|
|
79
|
+
synapsor-runner mcp status cursor --project --check-launch
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Runner previews the merge, backs up an existing `.cursor/mcp.json`, preserves
|
|
83
|
+
other MCP servers/settings, writes an exact-version `npx` invocation, and
|
|
84
|
+
tracks only its own entry with an integrity marker. Repeating install is
|
|
85
|
+
idempotent. `mcp uninstall cursor --project --yes` removes only that intact,
|
|
86
|
+
Runner-owned entry and also creates a backup.
|
|
87
|
+
|
|
88
|
+
For global setup, merge `cursor-global.mcp.json` through Cursor's MCP settings
|
|
89
|
+
and replace every `<absolute-path-to-bundle>` marker. Restart the MCP server
|
|
90
|
+
from Cursor settings after editing.
|
|
64
91
|
|
|
65
92
|
The model-facing list should contain only the contract's inspect/propose tools.
|
|
66
93
|
If Cursor reports a missing config or store, use absolute paths and rerun
|
|
67
94
|
`tools preview` from the same working directory.
|
|
68
95
|
|
|
96
|
+
Cursor can be configured to auto-run model-facing tools. Synapsor therefore
|
|
97
|
+
never exposes approval, apply, revert, policy activation, trusted identity, or
|
|
98
|
+
credentials as MCP tools. Inline MCP App review is not assumed for Cursor; use
|
|
99
|
+
the secured localhost workbench or operator CLI. No Add to Cursor deep link is
|
|
100
|
+
generated because Runner has not verified a currently documented generic
|
|
101
|
+
payload for this server. See [Host Compatibility](host-compatibility.md).
|
|
102
|
+
|
|
69
103
|
### OpenAI Agents SDK
|
|
70
104
|
|
|
71
105
|
Install the SDK in your agent project and run either TypeScript template:
|
|
@@ -110,6 +144,9 @@ The preview must list semantic capabilities and must not list `execute_sql`,
|
|
|
110
144
|
approval/apply tools, database URLs, write credentials, or model-controlled
|
|
111
145
|
tenant authority.
|
|
112
146
|
|
|
147
|
+
MCP App discovery is automatic from the proposal tool's
|
|
148
|
+
`_meta.ui.resourceUri`; it does not require credentials in the client snippet.
|
|
149
|
+
|
|
113
150
|
## Troubleshooting
|
|
114
151
|
|
|
115
152
|
- `ENOENT` or missing config: use absolute config/store paths.
|
package/docs/oss-vs-cloud.md
CHANGED
|
@@ -22,6 +22,7 @@ runtime stay local.
|
|
|
22
22
|
| Contract source | Local files reviewed in Git | Shared registry with immutable versions and digests |
|
|
23
23
|
| Trusted context | Local environment/session bindings | Registered bindings plus deployment-specific Cloud session context |
|
|
24
24
|
| Capabilities | Local semantic MCP tools | Registry, version history, and capability inspection |
|
|
25
|
+
| Safe Action activation | Explicit digest-confirmed local Workbench activation after a source-unchanged staging Data PR | Governed Cloud activation and immutable registry version; local coding agents still cannot activate |
|
|
25
26
|
| Evidence and replay | Local SQLite ledger by default; optional shared Postgres runtime store | Redacted shared chronology and references; full evidence payload stays local by default |
|
|
26
27
|
| Approval | Local CLI or localhost UI | Human-authenticated shared approval inbox; unavailable to MCP/Runner tokens |
|
|
27
28
|
| Writeback | Guarded one-row CRUD, fixed/frozen bounded sets, or app-owned executor | Durable approval/job/lease coordination; the local Runner rechecks and executes |
|
|
@@ -36,6 +37,8 @@ runtime stay local.
|
|
|
36
37
|
- direct access to Postgres or MySQL;
|
|
37
38
|
- the process that executes guarded writeback;
|
|
38
39
|
- local development ledgers when Cloud linkage is not enabled.
|
|
40
|
+
- local disabled Safe Action drafts, project agent instructions, and source
|
|
41
|
+
database preview/writeback execution.
|
|
39
42
|
|
|
40
43
|
Cloud contract registration does not require uploading database credentials or
|
|
41
44
|
business rows. A Runner bundle contains the normalized contract, placeholder
|
package/docs/production.md
CHANGED
|
@@ -94,6 +94,14 @@ Read credential:
|
|
|
94
94
|
- can `SELECT` only the tables/views used by capabilities;
|
|
95
95
|
- should be restricted by views/RLS where possible.
|
|
96
96
|
|
|
97
|
+
Name the scope mode in production reviews. The compatibility default is
|
|
98
|
+
application-level Runner predicates with a shared credential. PostgreSQL can
|
|
99
|
+
add database-enforced RLS to catch omitted predicates and pooled-context
|
|
100
|
+
leakage. Tenant-bound credentials or isolated processes remove
|
|
101
|
+
organization-wide authority from a Runner process. See
|
|
102
|
+
[Database-Enforced Tenant And Principal
|
|
103
|
+
Scope](database-enforced-scope.md).
|
|
104
|
+
|
|
97
105
|
Write credential for direct `sql_update`:
|
|
98
106
|
|
|
99
107
|
- can use only the operation-specific business DML and reviewed columns;
|
package/docs/release-notes.md
CHANGED
|
@@ -10,7 +10,131 @@ npx -y -p @synapsor/runner synapsor-runner demo --quick
|
|
|
10
10
|
The OSS runner command is `synapsor-runner`. The `synapsor` command is reserved
|
|
11
11
|
for the Synapsor Cloud CLI.
|
|
12
12
|
|
|
13
|
-
## 1.
|
|
13
|
+
## 1.5.3 (prepared, not published)
|
|
14
|
+
|
|
15
|
+
### Intent to Safe Action
|
|
16
|
+
|
|
17
|
+
- `start --action <name> --description <intent>` creates one inert TypeScript
|
|
18
|
+
Safe Action scaffold from an existing reviewed read boundary. Project-scoped
|
|
19
|
+
instructions let a coding agent complete and validate only the draft.
|
|
20
|
+
- `action validate` statically parses the restricted object and emits a
|
|
21
|
+
digest-addressed disabled canonical draft, explanation, and deterministic
|
|
22
|
+
allow/deny/effect tests. It does not import adopter code, activate the action,
|
|
23
|
+
or alter the active MCP tool catalog.
|
|
24
|
+
- The secured Workbench runs one real source-unchanged staging Data PR before
|
|
25
|
+
activation and requires `ACTIVATE` plus the complete digest. Cloud-linked
|
|
26
|
+
projects use governed Cloud activation. Existing proposals remain bound to
|
|
27
|
+
the exact active contract digest they were created under.
|
|
28
|
+
- The package includes a current-format Cursor plugin with
|
|
29
|
+
`/synapsor-protect`, diagnostics, deterministic package verification, and
|
|
30
|
+
project-safe MCP wiring. Cursor host claims remain evidence-labeled; a stable
|
|
31
|
+
UI pass and Marketplace submission are owner gates.
|
|
32
|
+
- MCP audit now renders a model-authority map and opt-in bypass evidence as
|
|
33
|
+
text, JSON, Markdown, or SARIF. A checked-in GitHub Actions workflow and Safe
|
|
34
|
+
Action team CI are deterministic and non-mutating.
|
|
35
|
+
- Proposal-only integration recipes cover Claude Code, Codex, VS Code, OpenAI
|
|
36
|
+
Agents, LangChain/LangGraph, Google ADK, LlamaIndex, and generic MCP clients.
|
|
37
|
+
- The first two README screens, public website, article, discovery routes, and
|
|
38
|
+
36-second evidence-backed demo now lead with the own-project Data PR path.
|
|
39
|
+
|
|
40
|
+
Prepared package version: `@synapsor/runner@1.5.3`. Spec, DSL, and Cloud CLI
|
|
41
|
+
packages are unchanged. Nothing has been published by this repository change.
|
|
42
|
+
|
|
43
|
+
## 1.5.2 (prepared, not published)
|
|
44
|
+
|
|
45
|
+
### First safe action in an existing application
|
|
46
|
+
|
|
47
|
+
- `start --from-env DATABASE_URL` and
|
|
48
|
+
`try --prove --from-env DATABASE_URL` now converge on one own-data
|
|
49
|
+
onboarding path. It inspects a staging database read-only, asks the developer
|
|
50
|
+
to choose trusted scope and one reviewed action, emits canonical files, and
|
|
51
|
+
never substitutes synthetic data after an own-data failure.
|
|
52
|
+
- The localhost workbench presents Project, Data source, Trust scope, Action,
|
|
53
|
+
Agent, Test, and Review plus an exact proposal Data PR. Test is complete only
|
|
54
|
+
after a scoped tool call records query audit, not after config validation.
|
|
55
|
+
- Project-scoped Cursor install/status/uninstall previews and owns only its MCP
|
|
56
|
+
entry, preserves other entries, and launches the exact Runner version.
|
|
57
|
+
Approval, apply, revert, credentials, and trusted identity stay outside MCP.
|
|
58
|
+
- Local activation reports measure proof, onboarding, Cursor, first read, and
|
|
59
|
+
first proposal without telemetry or business identifiers. Product time
|
|
60
|
+
excludes initial package download; cold `npx` time is reported separately
|
|
61
|
+
as an observed environment-specific measurement.
|
|
62
|
+
- Optional TypeScript authoring emits the same canonical Spec contract. Shadow
|
|
63
|
+
trust progression and provider-neutral effect regression remain
|
|
64
|
+
non-activating and preserve deterministic/external-model provenance.
|
|
65
|
+
- MCP audit candidates can open directly in the secured workbench, and the
|
|
66
|
+
release includes the host-compatibility matrix and support/billing reference
|
|
67
|
+
workflow.
|
|
68
|
+
- The package now requires Node 22.13.0 or newer, the first Node 22 release
|
|
69
|
+
where Runner's `node:sqlite` dependency is available without an experimental
|
|
70
|
+
runtime flag. Older Node versions fail immediately with an actionable error.
|
|
71
|
+
|
|
72
|
+
Prepared package version: `@synapsor/runner@1.5.2`. Spec, DSL, and Cloud CLI
|
|
73
|
+
packages are unchanged. Nothing has been published by this repository change.
|
|
74
|
+
|
|
75
|
+
## 1.5.1 (prepared, not published)
|
|
76
|
+
|
|
77
|
+
### Safe disposable state ownership
|
|
78
|
+
|
|
79
|
+
- `try --state-dir` no longer treats the supplied directory as disposable.
|
|
80
|
+
The supplied path is a caller-owned container and Runner uses a marked
|
|
81
|
+
managed child beneath it.
|
|
82
|
+
- Cleanup removes only known direct try-state files. Unrelated files remain in
|
|
83
|
+
place, and roots, home/cwd/repository paths, traversal, symlink escapes,
|
|
84
|
+
unmarked lookalikes, and linked managed files fail closed.
|
|
85
|
+
- An atomic state lease prevents concurrent runs from corrupting each other and
|
|
86
|
+
permits recovery from a valid lease whose process is no longer alive.
|
|
87
|
+
- `demo inspect --state-dir` resolves the same managed child. The default
|
|
88
|
+
`.synapsor/try` path safely adopts only the recognized legacy file layout.
|
|
89
|
+
- Explicit `--force` replacement of generated schema and MCP-audit candidate
|
|
90
|
+
directories now rejects protected paths, symlinked ancestors, and linked or
|
|
91
|
+
invalid ownership markers.
|
|
92
|
+
- The embedded `try` data source is consistently identified as synthetic.
|
|
93
|
+
- The packaged YAML parser is updated to `2.8.3` to include the upstream fix
|
|
94
|
+
for deeply nested collection denial of service.
|
|
95
|
+
|
|
96
|
+
Prepared package version: `@synapsor/runner@1.5.1`. Spec, DSL, and Cloud CLI
|
|
97
|
+
packages are unchanged. Nothing has been published by this repository change.
|
|
98
|
+
|
|
99
|
+
## 1.5.0 (published 2026-07-20)
|
|
100
|
+
|
|
101
|
+
### Complete guarded-action developer proof
|
|
102
|
+
|
|
103
|
+
- `synapsor-runner try --prove` now demonstrates the complete embedded
|
|
104
|
+
business-action boundary without an account, database, Docker daemon, MCP
|
|
105
|
+
client, or model key: scoped evidence, exact `late_fee_cents: 5500 -> 0`
|
|
106
|
+
proposal, no pre-approval mutation, guarded commit, duplicate-free retry,
|
|
107
|
+
changed-intent collision refusal, stale conflict, receipt, and replay.
|
|
108
|
+
- Deployments can explicitly select application-level shared-credential scope,
|
|
109
|
+
PostgreSQL RLS defense in depth, or a tenant-bound credential resolver.
|
|
110
|
+
Diagnostics report the active assurance and remaining trust boundary;
|
|
111
|
+
hardened modes fail closed when prerequisites are missing.
|
|
112
|
+
- Strict Shadow Mode now has durable studies, bounded case imports,
|
|
113
|
+
authoritative human outcomes, deterministic comparison/readiness reports,
|
|
114
|
+
and effect-level regression fixtures. No study or evaluation path grants
|
|
115
|
+
authority or writes source data.
|
|
116
|
+
- Proposal tools advertise a standard display-only MCP App where the host
|
|
117
|
+
supports it. The app and standalone local UI share one reviewer-facing view;
|
|
118
|
+
approval/apply authority and privileged tokens remain outside MCP.
|
|
119
|
+
- `audit` can generate disabled canonical replacement candidates, while
|
|
120
|
+
Prisma, Drizzle, and OpenAPI generators create bounded review-only candidate
|
|
121
|
+
contracts without executing adopter source.
|
|
122
|
+
- The `support-billing-agent` reference now provides a live disposable
|
|
123
|
+
PostgreSQL/RLS proof for tenant/principal scope, kept-out fields, proposal,
|
|
124
|
+
approval/apply, receipt/retry, stale conflict, replay, strict shadow, and
|
|
125
|
+
effect regression.
|
|
126
|
+
- The bundled app-owned handler helper now uses a pre-provisioned receipt table
|
|
127
|
+
without requiring schema `CREATE`; DDL is attempted only when the table is
|
|
128
|
+
absent. The source-workspace and packed billing-handler examples both verify
|
|
129
|
+
transactional apply and idempotent retry.
|
|
130
|
+
- The public README leads with `try --prove`, keeps MCP database-risk audit
|
|
131
|
+
immediately second, and distinguishes application scope, PostgreSQL RLS, and
|
|
132
|
+
tenant-bound isolation without overstating any of them.
|
|
133
|
+
|
|
134
|
+
Published package version: `@synapsor/runner@1.5.0`. Spec, DSL, and Cloud CLI
|
|
135
|
+
packages were unchanged.
|
|
136
|
+
|
|
137
|
+
## 1.4.123 (2026-07-17)
|
|
14
138
|
|
|
15
139
|
### Advisory capability-surface fitness lint
|
|
16
140
|
|
|
@@ -25,10 +149,10 @@ for the Synapsor Cloud CLI.
|
|
|
25
149
|
CI policy gate with `--strict` or `--fail-on warning`; canonical validity and
|
|
26
150
|
runtime enforcement are unchanged.
|
|
27
151
|
|
|
28
|
-
|
|
152
|
+
Published package version: `@synapsor/runner@1.4.123`. Spec, DSL, and Cloud CLI
|
|
29
153
|
packages are unchanged.
|
|
30
154
|
|
|
31
|
-
## 1.4.122 (2026-07-
|
|
155
|
+
## 1.4.122 (2026-07-17)
|
|
32
156
|
|
|
33
157
|
### Trusted principal scope and Cloud-linked authority
|
|
34
158
|
|
|
@@ -54,11 +178,11 @@ packages are unchanged.
|
|
|
54
178
|
projects, scoped credentials, Runner connections, proposal decisions, and
|
|
55
179
|
audit records. Runner keeps the `synapsor-runner` binary and local boundary.
|
|
56
180
|
|
|
57
|
-
|
|
181
|
+
Published package versions: `@synapsor/spec@1.4.2`,
|
|
58
182
|
`@synapsor/dsl@1.4.3`, `@synapsor/runner@1.4.122`, and
|
|
59
183
|
`@synapsor/cli@0.1.0-beta.1`.
|
|
60
184
|
|
|
61
|
-
## 1.4.121 (
|
|
185
|
+
## 1.4.121 (2026-07-15)
|
|
62
186
|
|
|
63
187
|
### Contract trust surface and bounded-set parser correctness
|
|
64
188
|
|
|
@@ -90,10 +214,10 @@ Prepared package versions: `@synapsor/spec@1.4.2`,
|
|
|
90
214
|
- C++/Cloud validators and exporters preserve the new additive enum/aggregate
|
|
91
215
|
fields for canonical round-trip compatibility.
|
|
92
216
|
|
|
93
|
-
|
|
217
|
+
Published package versions: `@synapsor/spec@1.4.1`,
|
|
94
218
|
`@synapsor/dsl@1.4.2`, and `@synapsor/runner@1.4.121`.
|
|
95
219
|
|
|
96
|
-
## 1.4.12 (
|
|
220
|
+
## 1.4.12 (2026-07-14)
|
|
97
221
|
|
|
98
222
|
### Runtime-store smoke-call consistency
|
|
99
223
|
|
|
@@ -108,10 +232,10 @@ Prepared package versions: `@synapsor/spec@1.4.1`,
|
|
|
108
232
|
- Local SQLite and mirror modes retain their existing behavior; no source row
|
|
109
233
|
changes before the normal external approval/apply path.
|
|
110
234
|
|
|
111
|
-
|
|
235
|
+
Published package version: `@synapsor/runner@1.4.12`.
|
|
112
236
|
`@synapsor/dsl` remains `1.4.1`; `@synapsor/spec` remains `1.4.0`.
|
|
113
237
|
|
|
114
|
-
## 1.4.1 (
|
|
238
|
+
## 1.4.1 (2026-07-14)
|
|
115
239
|
|
|
116
240
|
### Bounded-set digest compatibility patch
|
|
117
241
|
|
|
@@ -131,10 +255,10 @@ Prepared package version: `@synapsor/runner@1.4.12`.
|
|
|
131
255
|
authority, hand-built semantic tools, structural enforcement, build-vs-adopt
|
|
132
256
|
fit, and regulated-data boundaries.
|
|
133
257
|
|
|
134
|
-
|
|
258
|
+
Published package versions: `@synapsor/dsl@1.4.1` and
|
|
135
259
|
`@synapsor/runner@1.4.1`. `@synapsor/spec` remains `1.4.0`.
|
|
136
260
|
|
|
137
|
-
## 1.4.0 (
|
|
261
|
+
## 1.4.0 (2026-07-14)
|
|
138
262
|
|
|
139
263
|
### Reviewed Reversible Change Sets
|
|
140
264
|
|
|
@@ -149,7 +273,7 @@ Prepared package versions: `@synapsor/dsl@1.4.1` and
|
|
|
149
273
|
- Keeps hard DELETE restoration, app-owned handlers, payments, messages, and
|
|
150
274
|
other external effects outside Runner's automatic compensation claim.
|
|
151
275
|
|
|
152
|
-
|
|
276
|
+
Published package versions: `@synapsor/spec@1.4.0`,
|
|
153
277
|
`@synapsor/dsl@1.4.0`, and `@synapsor/runner@1.4.0`.
|
|
154
278
|
|
|
155
279
|
## 1.3.0 (prepared, not published)
|
|
@@ -254,7 +378,7 @@ Released package versions: `@synapsor/spec@1.1.0`,
|
|
|
254
378
|
- Declares the first semver contract for the documented CLI, schema, contract,
|
|
255
379
|
MCP result, writeback, approval, metrics, and replay surfaces.
|
|
256
380
|
|
|
257
|
-
|
|
381
|
+
Released package versions: `@synapsor/spec@1.0.0`,
|
|
258
382
|
`@synapsor/dsl@1.0.0`, and `@synapsor/runner@1.0.0`.
|
|
259
383
|
|
|
260
384
|
## 0.1.16
|
|
@@ -706,7 +830,7 @@ not change and must not be republished for this release.
|
|
|
706
830
|
CDC, managed runner fleets, compliance exports, production SLA, or C++ DBMS
|
|
707
831
|
internals.
|
|
708
832
|
- The local store is single-node SQLite for local/dev/staging usage.
|
|
709
|
-
- Node >= 22.
|
|
833
|
+
- Node >= 22.13.0 is required because the local ledger uses Node's unflagged
|
|
710
834
|
`node:sqlite` runtime. Use a supported Node runtime or the Docker-backed
|
|
711
835
|
source demo path.
|
|
712
836
|
|