@synapsor/runner 1.6.3 → 1.6.5
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/AGENTS.md +2 -2
- package/CHANGELOG.md +94 -8
- package/CONTRIBUTING.md +10 -3
- package/README.md +90 -109
- package/SECURITY.md +7 -3
- package/THREAT_MODEL.md +37 -0
- package/dist/authoring.mjs +98 -13
- package/dist/cli.d.ts +12 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/local-ui.d.ts +60 -0
- package/dist/local-ui.d.ts.map +1 -1
- package/dist/runner.mjs +7688 -2227
- package/dist/runtime.mjs +528 -51
- package/docs/README.md +14 -0
- package/docs/agent-guided-setup.md +13 -11
- package/docs/aggregate-reads.md +14 -5
- package/docs/app-owned-executors.md +5 -6
- package/docs/auto-boundary-and-scoped-explore.md +70 -14
- package/docs/capability-authoring.md +2 -2
- package/docs/client-recipes.md +41 -12
- package/docs/cloud-mode.md +7 -7
- package/docs/conformance.md +6 -3
- package/docs/current-scope.md +13 -2
- package/docs/cursor-plugin.md +3 -3
- package/docs/database-enforced-scope.md +6 -0
- package/docs/dsl-reference.md +12 -1
- package/docs/fresh-developer-usability.md +6 -6
- package/docs/getting-started-own-database.md +52 -50
- package/docs/guided-onboarding.md +104 -34
- package/docs/host-compatibility.md +24 -11
- package/docs/limitations.md +34 -14
- package/docs/local-mode.md +20 -20
- package/docs/mcp-audit.md +14 -14
- package/docs/mcp-client-setup.md +26 -14
- package/docs/mcp-clients.md +47 -11
- package/docs/migrating-to-synapsor-spec.md +5 -1
- package/docs/openai-agents-sdk.md +2 -2
- package/docs/proposal-evidence-freshness.md +7 -7
- package/docs/recipes.md +6 -6
- package/docs/release-notes.md +100 -10
- package/docs/release-policy.md +20 -7
- package/docs/reversible-change-sets.md +1 -1
- package/docs/reviewed-database-views.md +132 -0
- package/docs/reviewed-relationships.md +245 -0
- package/docs/rfcs/006-reviewed-reversible-change-sets.md +1 -1
- package/docs/runner-bundles.md +7 -7
- package/docs/schema-api-candidates.md +1 -1
- package/docs/security-boundary.md +30 -0
- package/docs/troubleshooting-first-run.md +63 -19
- package/docs/use-your-own-database.md +6 -4
- package/docs/workbench-ask.md +279 -0
- package/docs/writeback-executors.md +7 -7
- package/examples/auto-boundary-churn/README.md +1 -1
- package/examples/community-solar-clean-room/README.md +7 -0
- package/examples/community-solar-clean-room/docker-compose.yml +16 -0
- package/examples/community-solar-clean-room/package.json +15 -0
- package/examples/community-solar-clean-room/prisma/schema.prisma +171 -0
- package/examples/community-solar-clean-room/seed/postgres.sql +571 -0
- package/examples/fitflow-guided-onboarding/README.md +2 -2
- package/examples/openai-agents-http/Makefile +1 -1
- package/examples/openai-agents-http/README.md +1 -1
- package/examples/openai-agents-stdio/Makefile +1 -1
- package/examples/openai-agents-stdio/README.md +2 -2
- package/examples/openai-agents-stdio/agent.py +1 -4
- package/examples/reference-support-billing-app/README.md +16 -16
- package/examples/retail-clean-room/README.md +7 -0
- package/examples/retail-clean-room/docker-compose.yml +16 -0
- package/examples/retail-clean-room/package.json +9 -0
- package/examples/retail-clean-room/prisma/schema.prisma +239 -0
- package/examples/retail-clean-room/seed/postgres.sql +781 -0
- package/examples/retail-clean-room/view-recipe/average-retained-revenue.synapsor.sql +21 -0
- package/examples/retail-clean-room/view-recipe/synapsor.runner.json +25 -0
- package/examples/support-plan-credit/mcp-client-examples/claude-code.sh +1 -4
- package/examples/support-plan-credit/mcp-client-examples/claude-desktop.json +1 -4
- package/examples/support-plan-credit/mcp-client-examples/codex.config.toml +1 -4
- package/examples/support-plan-credit/mcp-client-examples/cursor-global.mcp.json +1 -4
- package/examples/support-plan-credit/mcp-client-examples/cursor-project.mcp.json +1 -4
- package/examples/support-plan-credit/mcp-client-examples/generic-stdio.json +1 -4
- package/examples/support-plan-credit/mcp-client-examples/generic-stdio.mjs +1 -1
- package/examples/support-plan-credit/mcp-client-examples/google-adk.py +1 -1
- package/examples/support-plan-credit/mcp-client-examples/langchain.mjs +1 -1
- package/examples/support-plan-credit/mcp-client-examples/llamaindex.py +1 -1
- package/examples/support-plan-credit/mcp-client-examples/openai-agents-stdio.ts +1 -1
- package/examples/support-plan-credit/mcp-client-examples/vscode.mcp.json +1 -4
- package/fixtures/compatibility/published-1.6.3/manifest.json +76 -0
- package/fixtures/compatibility/published-1.6.3/sources/packages/dsl/examples/aggregate-read.synapsor.sql +21 -0
- package/fixtures/compatibility/published-1.6.3/sources/packages/dsl/examples/billing-late-fee.synapsor.sql +56 -0
- package/fixtures/compatibility/published-1.6.3/sources/packages/dsl/examples/bounded-set-multi-term.synapsor.sql +30 -0
- package/fixtures/compatibility/published-1.6.3/sources/packages/dsl/examples/principal-row-scope.synapsor.sql +23 -0
- package/fixtures/compatibility/published-1.6.3/sources/packages/spec/fixtures/conformance/aggregate-read/contract.json +119 -0
- package/fixtures/compatibility/published-1.6.3/sources/packages/spec/fixtures/conformance/approval-quorum/contract.json +44 -0
- package/fixtures/compatibility/published-1.6.3/sources/packages/spec/fixtures/conformance/bounded-set-threats/contract.json +115 -0
- package/fixtures/compatibility/published-1.6.3/sources/packages/spec/fixtures/conformance/principal-row-scope/contract.json +78 -0
- package/fixtures/compatibility/published-1.6.3/sources/packages/spec/fixtures/conformance/proposal-capability/contract.json +101 -0
- package/fixtures/compatibility/published-1.6.3/sources/packages/spec/fixtures/conformance/reversible-change-sets/contract.json +98 -0
- package/fixtures/compatibility/published-1.6.3/sources/packages/spec/fixtures/valid/basic-read.contract.json +60 -0
- package/llms.txt +10 -5
- package/package.json +9 -2
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
{
|
|
2
|
+
"spec_version": "0.1",
|
|
3
|
+
"kind": "SynapsorContract",
|
|
4
|
+
"metadata": { "name": "bounded-set-threats", "version": "1.0.0" },
|
|
5
|
+
"contexts": [
|
|
6
|
+
{
|
|
7
|
+
"name": "trusted_operator",
|
|
8
|
+
"bindings": [
|
|
9
|
+
{ "name": "tenant_id", "source": "environment", "key": "SYNAPSOR_TENANT_ID", "required": true },
|
|
10
|
+
{ "name": "principal", "source": "environment", "key": "SYNAPSOR_PRINCIPAL", "required": true }
|
|
11
|
+
],
|
|
12
|
+
"tenant_binding": "tenant_id",
|
|
13
|
+
"principal_binding": "principal"
|
|
14
|
+
}
|
|
15
|
+
],
|
|
16
|
+
"capabilities": [
|
|
17
|
+
{
|
|
18
|
+
"name": "billing.close_overdue_invoices",
|
|
19
|
+
"kind": "proposal",
|
|
20
|
+
"context": "trusted_operator",
|
|
21
|
+
"source": "local_postgres",
|
|
22
|
+
"subject": { "schema": "public", "table": "invoices", "primary_key": "id", "tenant_key": "tenant_id", "conflict_key": "version" },
|
|
23
|
+
"args": { "reason": { "type": "string", "required": true, "max_length": 500 } },
|
|
24
|
+
"visible_fields": ["id", "tenant_id", "status", "balance_cents", "version"],
|
|
25
|
+
"kept_out_fields": ["internal_risk_score"],
|
|
26
|
+
"evidence": { "required": true, "query_audit": true },
|
|
27
|
+
"proposal": {
|
|
28
|
+
"action": "close_overdue",
|
|
29
|
+
"operation": {
|
|
30
|
+
"kind": "update",
|
|
31
|
+
"cardinality": "set",
|
|
32
|
+
"selection": { "all": [{ "column": "status", "operator": "eq", "value": "overdue" }] },
|
|
33
|
+
"max_rows": 10,
|
|
34
|
+
"aggregate_bounds": [{ "column": "balance_cents", "measure": "before", "maximum": 50000 }],
|
|
35
|
+
"version_advance": { "column": "version", "strategy": "integer_increment" }
|
|
36
|
+
},
|
|
37
|
+
"allowed_fields": ["status", "close_reason"],
|
|
38
|
+
"patch": { "status": { "fixed": "closed" }, "close_reason": { "from_arg": "reason" } },
|
|
39
|
+
"conflict_guard": { "column": "version" },
|
|
40
|
+
"approval": { "mode": "human", "required_role": "billing_reviewer" },
|
|
41
|
+
"writeback": { "mode": "direct_sql" }
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"name": "billing.delete_expired_drafts",
|
|
46
|
+
"kind": "proposal",
|
|
47
|
+
"context": "trusted_operator",
|
|
48
|
+
"source": "local_postgres",
|
|
49
|
+
"subject": { "schema": "public", "table": "invoice_drafts", "primary_key": "id", "tenant_key": "tenant_id", "conflict_key": "version" },
|
|
50
|
+
"args": { "reason": { "type": "string", "required": true, "max_length": 500 } },
|
|
51
|
+
"visible_fields": ["id", "tenant_id", "status", "estimated_cents", "version"],
|
|
52
|
+
"evidence": { "required": true, "query_audit": true },
|
|
53
|
+
"proposal": {
|
|
54
|
+
"action": "delete_expired_drafts",
|
|
55
|
+
"operation": {
|
|
56
|
+
"kind": "delete",
|
|
57
|
+
"cardinality": "set",
|
|
58
|
+
"selection": { "all": [{ "column": "status", "operator": "eq", "value": "expired" }] },
|
|
59
|
+
"max_rows": 5,
|
|
60
|
+
"aggregate_bounds": [{ "column": "estimated_cents", "measure": "before", "maximum": 10000 }]
|
|
61
|
+
},
|
|
62
|
+
"allowed_fields": [],
|
|
63
|
+
"patch": {},
|
|
64
|
+
"conflict_guard": { "column": "version" },
|
|
65
|
+
"approval": { "mode": "human", "required_role": "billing_reviewer", "required_approvals": 2 },
|
|
66
|
+
"writeback": { "mode": "direct_sql" }
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"name": "billing.create_credits",
|
|
71
|
+
"kind": "proposal",
|
|
72
|
+
"context": "trusted_operator",
|
|
73
|
+
"source": "local_postgres",
|
|
74
|
+
"subject": { "schema": "public", "table": "account_credits", "primary_key": "id", "tenant_key": "tenant_id" },
|
|
75
|
+
"args": {
|
|
76
|
+
"items": {
|
|
77
|
+
"type": "object_array",
|
|
78
|
+
"required": true,
|
|
79
|
+
"max_items": 10,
|
|
80
|
+
"fields": {
|
|
81
|
+
"id": { "type": "string", "required": true, "max_length": 128 },
|
|
82
|
+
"external_id": { "type": "string", "required": true, "max_length": 128 },
|
|
83
|
+
"amount_cents": { "type": "number", "required": true, "minimum": 1, "maximum": 2500 },
|
|
84
|
+
"reason": { "type": "string", "required": true, "max_length": 500 }
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
"visible_fields": ["id", "tenant_id", "external_id", "amount_cents", "reason", "version"],
|
|
89
|
+
"kept_out_fields": ["internal_note"],
|
|
90
|
+
"evidence": { "required": true, "query_audit": true },
|
|
91
|
+
"proposal": {
|
|
92
|
+
"action": "create_credits",
|
|
93
|
+
"operation": {
|
|
94
|
+
"kind": "insert",
|
|
95
|
+
"cardinality": "set",
|
|
96
|
+
"batch": { "items_from_arg": "items" },
|
|
97
|
+
"max_rows": 10,
|
|
98
|
+
"aggregate_bounds": [{ "column": "amount_cents", "measure": "after", "maximum": 25000 }],
|
|
99
|
+
"deduplication": {
|
|
100
|
+
"components": [
|
|
101
|
+
{ "column": "tenant_id", "source": "trusted_tenant" },
|
|
102
|
+
{ "column": "id", "source": "item_field", "item_field": "id" },
|
|
103
|
+
{ "column": "external_id", "source": "item_field", "item_field": "external_id" }
|
|
104
|
+
]
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
"allowed_fields": ["amount_cents", "reason"],
|
|
108
|
+
"patch": { "amount_cents": { "from_item": "amount_cents" }, "reason": { "from_item": "reason" } },
|
|
109
|
+
"numeric_bounds": { "amount_cents": { "minimum": 1, "maximum": 2500 } },
|
|
110
|
+
"approval": { "mode": "human", "required_role": "billing_reviewer" },
|
|
111
|
+
"writeback": { "mode": "direct_sql" }
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
]
|
|
115
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
{
|
|
2
|
+
"spec_version": "0.1",
|
|
3
|
+
"kind": "SynapsorContract",
|
|
4
|
+
"metadata": {
|
|
5
|
+
"name": "trusted principal row scope",
|
|
6
|
+
"description": "Tenant-additive row authority for two case managers in one hospital."
|
|
7
|
+
},
|
|
8
|
+
"contexts": [
|
|
9
|
+
{
|
|
10
|
+
"name": "care_session",
|
|
11
|
+
"bindings": [
|
|
12
|
+
{
|
|
13
|
+
"name": "hospital_id",
|
|
14
|
+
"source": "http_claim",
|
|
15
|
+
"key": "hospital_id",
|
|
16
|
+
"required": true
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"name": "principal",
|
|
20
|
+
"source": "http_claim",
|
|
21
|
+
"key": "sub",
|
|
22
|
+
"required": true
|
|
23
|
+
}
|
|
24
|
+
],
|
|
25
|
+
"tenant_binding": "hospital_id",
|
|
26
|
+
"principal_binding": "principal"
|
|
27
|
+
}
|
|
28
|
+
],
|
|
29
|
+
"resources": [],
|
|
30
|
+
"capabilities": [
|
|
31
|
+
{
|
|
32
|
+
"name": "care.inspect_assigned_patient",
|
|
33
|
+
"description": "Inspect one patient assigned to the authenticated case manager within the trusted hospital.",
|
|
34
|
+
"returns_hint": "Returns reviewed patient fields and evidence only when both tenant and assignee locks match.",
|
|
35
|
+
"kind": "read",
|
|
36
|
+
"context": "care_session",
|
|
37
|
+
"source": "local_postgres",
|
|
38
|
+
"subject": {
|
|
39
|
+
"schema": "public",
|
|
40
|
+
"table": "patients",
|
|
41
|
+
"primary_key": "id",
|
|
42
|
+
"tenant_key": "hospital_id",
|
|
43
|
+
"principal_scope_key": "assigned_to",
|
|
44
|
+
"conflict_key": "updated_at"
|
|
45
|
+
},
|
|
46
|
+
"args": {
|
|
47
|
+
"patient_id": {
|
|
48
|
+
"type": "string",
|
|
49
|
+
"required": true,
|
|
50
|
+
"description": "Reviewed patient identifier.",
|
|
51
|
+
"max_length": 128
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
"lookup": {
|
|
55
|
+
"id_from_arg": "patient_id"
|
|
56
|
+
},
|
|
57
|
+
"visible_fields": [
|
|
58
|
+
"id",
|
|
59
|
+
"hospital_id",
|
|
60
|
+
"display_name",
|
|
61
|
+
"care_status",
|
|
62
|
+
"updated_at"
|
|
63
|
+
],
|
|
64
|
+
"kept_out_fields": [
|
|
65
|
+
"assigned_to",
|
|
66
|
+
"diagnosis_notes",
|
|
67
|
+
"insurance_member_id"
|
|
68
|
+
],
|
|
69
|
+
"evidence": {
|
|
70
|
+
"required": true,
|
|
71
|
+
"query_audit": true
|
|
72
|
+
},
|
|
73
|
+
"max_rows": 1
|
|
74
|
+
}
|
|
75
|
+
],
|
|
76
|
+
"workflows": [],
|
|
77
|
+
"policies": []
|
|
78
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
{
|
|
2
|
+
"spec_version": "0.1",
|
|
3
|
+
"kind": "SynapsorContract",
|
|
4
|
+
"metadata": {
|
|
5
|
+
"name": "proposal capability conformance"
|
|
6
|
+
},
|
|
7
|
+
"resources": [
|
|
8
|
+
{
|
|
9
|
+
"name": "billing_invoices",
|
|
10
|
+
"engine": "postgres",
|
|
11
|
+
"schema": "public",
|
|
12
|
+
"table": "invoices",
|
|
13
|
+
"primary_key": "id",
|
|
14
|
+
"tenant_key": "tenant_id",
|
|
15
|
+
"conflict_key": "updated_at"
|
|
16
|
+
}
|
|
17
|
+
],
|
|
18
|
+
"contexts": [
|
|
19
|
+
{
|
|
20
|
+
"name": "local_operator",
|
|
21
|
+
"bindings": [
|
|
22
|
+
{
|
|
23
|
+
"name": "tenant_id",
|
|
24
|
+
"source": "environment",
|
|
25
|
+
"key": "SYNAPSOR_TENANT_ID"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"name": "principal",
|
|
29
|
+
"source": "environment",
|
|
30
|
+
"key": "SYNAPSOR_PRINCIPAL"
|
|
31
|
+
}
|
|
32
|
+
],
|
|
33
|
+
"tenant_binding": "tenant_id",
|
|
34
|
+
"principal_binding": "principal"
|
|
35
|
+
}
|
|
36
|
+
],
|
|
37
|
+
"capabilities": [
|
|
38
|
+
{
|
|
39
|
+
"name": "billing.propose_late_fee_waiver",
|
|
40
|
+
"kind": "proposal",
|
|
41
|
+
"context": "local_operator",
|
|
42
|
+
"source": "local_postgres",
|
|
43
|
+
"subject": {
|
|
44
|
+
"resource": "billing_invoices"
|
|
45
|
+
},
|
|
46
|
+
"args": {
|
|
47
|
+
"invoice_id": {
|
|
48
|
+
"type": "string",
|
|
49
|
+
"required": true
|
|
50
|
+
},
|
|
51
|
+
"waiver_reason": {
|
|
52
|
+
"type": "string",
|
|
53
|
+
"required": true
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
"lookup": {
|
|
57
|
+
"id_from_arg": "invoice_id"
|
|
58
|
+
},
|
|
59
|
+
"visible_fields": [
|
|
60
|
+
"id",
|
|
61
|
+
"tenant_id",
|
|
62
|
+
"late_fee_cents",
|
|
63
|
+
"waiver_reason",
|
|
64
|
+
"updated_at"
|
|
65
|
+
],
|
|
66
|
+
"kept_out_fields": [
|
|
67
|
+
"card_token"
|
|
68
|
+
],
|
|
69
|
+
"evidence": {
|
|
70
|
+
"required": true,
|
|
71
|
+
"query_audit": true
|
|
72
|
+
},
|
|
73
|
+
"max_rows": 1,
|
|
74
|
+
"proposal": {
|
|
75
|
+
"action": "billing.waive_late_fee",
|
|
76
|
+
"allowed_fields": [
|
|
77
|
+
"late_fee_cents",
|
|
78
|
+
"waiver_reason"
|
|
79
|
+
],
|
|
80
|
+
"patch": {
|
|
81
|
+
"late_fee_cents": {
|
|
82
|
+
"fixed": 0
|
|
83
|
+
},
|
|
84
|
+
"waiver_reason": {
|
|
85
|
+
"from_arg": "waiver_reason"
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
"conflict_guard": {
|
|
89
|
+
"column": "updated_at"
|
|
90
|
+
},
|
|
91
|
+
"approval": {
|
|
92
|
+
"mode": "human",
|
|
93
|
+
"required_role": "billing_lead"
|
|
94
|
+
},
|
|
95
|
+
"writeback": {
|
|
96
|
+
"mode": "direct_sql"
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
]
|
|
101
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
{
|
|
2
|
+
"spec_version": "0.1",
|
|
3
|
+
"kind": "SynapsorContract",
|
|
4
|
+
"metadata": {
|
|
5
|
+
"name": "reviewed-reversible-change-sets",
|
|
6
|
+
"version": "1.4.0"
|
|
7
|
+
},
|
|
8
|
+
"contexts": [
|
|
9
|
+
{
|
|
10
|
+
"name": "trusted_operator",
|
|
11
|
+
"bindings": [
|
|
12
|
+
{ "name": "tenant_id", "source": "environment", "key": "SYNAPSOR_TENANT_ID", "required": true },
|
|
13
|
+
{ "name": "principal", "source": "environment", "key": "SYNAPSOR_PRINCIPAL", "required": true }
|
|
14
|
+
],
|
|
15
|
+
"tenant_binding": "tenant_id",
|
|
16
|
+
"principal_binding": "principal"
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
"capabilities": [
|
|
20
|
+
{
|
|
21
|
+
"name": "billing.adjust_credit",
|
|
22
|
+
"kind": "proposal",
|
|
23
|
+
"context": "trusted_operator",
|
|
24
|
+
"source": "local_postgres",
|
|
25
|
+
"subject": {
|
|
26
|
+
"schema": "public",
|
|
27
|
+
"table": "account_credits",
|
|
28
|
+
"primary_key": "id",
|
|
29
|
+
"tenant_key": "tenant_id",
|
|
30
|
+
"conflict_key": "version"
|
|
31
|
+
},
|
|
32
|
+
"args": {
|
|
33
|
+
"credit_id": { "type": "string", "required": true, "max_length": 128 },
|
|
34
|
+
"amount_cents": { "type": "number", "required": true, "minimum": 0, "maximum": 2500 }
|
|
35
|
+
},
|
|
36
|
+
"lookup": { "id_from_arg": "credit_id" },
|
|
37
|
+
"visible_fields": ["id", "tenant_id", "amount_cents", "version"],
|
|
38
|
+
"kept_out_fields": ["internal_note"],
|
|
39
|
+
"evidence": { "required": true, "query_audit": true },
|
|
40
|
+
"proposal": {
|
|
41
|
+
"action": "adjust_credit",
|
|
42
|
+
"operation": {
|
|
43
|
+
"kind": "update",
|
|
44
|
+
"cardinality": "single",
|
|
45
|
+
"version_advance": { "column": "version", "strategy": "integer_increment" }
|
|
46
|
+
},
|
|
47
|
+
"allowed_fields": ["amount_cents"],
|
|
48
|
+
"patch": { "amount_cents": { "from_arg": "amount_cents" } },
|
|
49
|
+
"numeric_bounds": { "amount_cents": { "minimum": 0, "maximum": 2500 } },
|
|
50
|
+
"reversibility": { "mode": "reviewed_inverse" },
|
|
51
|
+
"conflict_guard": { "column": "version" },
|
|
52
|
+
"approval": { "mode": "human", "required_role": "billing_reviewer", "required_approvals": 2 },
|
|
53
|
+
"writeback": { "mode": "direct_sql" }
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"name": "billing.create_credit",
|
|
58
|
+
"kind": "proposal",
|
|
59
|
+
"context": "trusted_operator",
|
|
60
|
+
"source": "local_postgres",
|
|
61
|
+
"subject": {
|
|
62
|
+
"schema": "public",
|
|
63
|
+
"table": "account_credits",
|
|
64
|
+
"primary_key": "id",
|
|
65
|
+
"tenant_key": "tenant_id"
|
|
66
|
+
},
|
|
67
|
+
"args": {
|
|
68
|
+
"amount_cents": { "type": "number", "required": true, "minimum": 1, "maximum": 2500 },
|
|
69
|
+
"reason": { "type": "string", "required": true, "max_length": 500 }
|
|
70
|
+
},
|
|
71
|
+
"visible_fields": ["id", "tenant_id", "amount_cents", "reason"],
|
|
72
|
+
"kept_out_fields": ["internal_note"],
|
|
73
|
+
"evidence": { "required": true, "query_audit": true },
|
|
74
|
+
"proposal": {
|
|
75
|
+
"action": "create_credit",
|
|
76
|
+
"operation": {
|
|
77
|
+
"kind": "insert",
|
|
78
|
+
"cardinality": "single",
|
|
79
|
+
"deduplication": {
|
|
80
|
+
"components": [
|
|
81
|
+
{ "column": "tenant_id", "source": "trusted_tenant" },
|
|
82
|
+
{ "column": "id", "source": "proposal_id" }
|
|
83
|
+
]
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
"allowed_fields": ["amount_cents", "reason"],
|
|
87
|
+
"patch": {
|
|
88
|
+
"amount_cents": { "from_arg": "amount_cents" },
|
|
89
|
+
"reason": { "from_arg": "reason" }
|
|
90
|
+
},
|
|
91
|
+
"numeric_bounds": { "amount_cents": { "minimum": 1, "maximum": 2500 } },
|
|
92
|
+
"reversibility": { "mode": "reviewed_inverse" },
|
|
93
|
+
"approval": { "mode": "human", "required_role": "billing_reviewer" },
|
|
94
|
+
"writeback": { "mode": "direct_sql" }
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
]
|
|
98
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"spec_version": "0.1",
|
|
3
|
+
"kind": "SynapsorContract",
|
|
4
|
+
"contexts": [
|
|
5
|
+
{
|
|
6
|
+
"name": "local_operator",
|
|
7
|
+
"bindings": [
|
|
8
|
+
{
|
|
9
|
+
"name": "tenant_id",
|
|
10
|
+
"source": "environment",
|
|
11
|
+
"key": "SYNAPSOR_TENANT_ID"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"name": "principal",
|
|
15
|
+
"source": "environment",
|
|
16
|
+
"key": "SYNAPSOR_PRINCIPAL"
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
"tenant_binding": "tenant_id",
|
|
20
|
+
"principal_binding": "principal"
|
|
21
|
+
}
|
|
22
|
+
],
|
|
23
|
+
"capabilities": [
|
|
24
|
+
{
|
|
25
|
+
"name": "billing.inspect_invoice",
|
|
26
|
+
"kind": "read",
|
|
27
|
+
"context": "local_operator",
|
|
28
|
+
"subject": {
|
|
29
|
+
"schema": "public",
|
|
30
|
+
"table": "invoices",
|
|
31
|
+
"primary_key": "id",
|
|
32
|
+
"tenant_key": "tenant_id",
|
|
33
|
+
"conflict_key": "updated_at"
|
|
34
|
+
},
|
|
35
|
+
"args": {
|
|
36
|
+
"invoice_id": {
|
|
37
|
+
"type": "string",
|
|
38
|
+
"required": true
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
"lookup": {
|
|
42
|
+
"id_from_arg": "invoice_id"
|
|
43
|
+
},
|
|
44
|
+
"visible_fields": [
|
|
45
|
+
"id",
|
|
46
|
+
"tenant_id",
|
|
47
|
+
"late_fee_cents",
|
|
48
|
+
"updated_at"
|
|
49
|
+
],
|
|
50
|
+
"kept_out_fields": [
|
|
51
|
+
"card_token"
|
|
52
|
+
],
|
|
53
|
+
"evidence": {
|
|
54
|
+
"required": true,
|
|
55
|
+
"query_audit": true
|
|
56
|
+
},
|
|
57
|
+
"max_rows": 1
|
|
58
|
+
}
|
|
59
|
+
]
|
|
60
|
+
}
|
package/llms.txt
CHANGED
|
@@ -18,17 +18,22 @@ Start here:
|
|
|
18
18
|
|
|
19
19
|
Current adoption loop:
|
|
20
20
|
Connect staging -> deterministic whole-schema draft -> human boundary review ->
|
|
21
|
-
bounded row or PM-style aggregate Explore in
|
|
22
|
-
-> digest-bound human activation -> named production
|
|
23
|
-
external approval -> guarded commit -> receipt and
|
|
21
|
+
bounded row or PM-style aggregate Explore in Workbench or an MCP client ->
|
|
22
|
+
Protect This Query -> digest-bound human activation -> named production
|
|
23
|
+
capability -> proposal -> external approval -> guarded commit -> receipt and
|
|
24
|
+
replay.
|
|
24
25
|
|
|
25
26
|
Important boundaries:
|
|
26
27
|
- No raw SQL or SQL-string tool argument.
|
|
27
28
|
- Scoped Explore is disabled by default and is local development/staging
|
|
28
29
|
authoring only. Production and shared/remote HTTP never advertise it.
|
|
29
30
|
- Aggregate Explore is a reviewed analytical cube: approved measures,
|
|
30
|
-
dimensions, time buckets, filters, at most
|
|
31
|
-
|
|
31
|
+
dimensions, time buckets, filters, and at most three activated paths of one
|
|
32
|
+
or two catalog-proven many-to-one links, plus suppression and
|
|
33
|
+
extraction/differencing budgets.
|
|
34
|
+
- Optional local Workbench Ask can use OpenAI, Anthropic, or a tested
|
|
35
|
+
OpenAI-compatible endpoint, but it calls only the exact reviewed tools and
|
|
36
|
+
adds no activation, approval, or commit authority.
|
|
32
37
|
- Auto Boundary and Protect are deterministic and use no LLM.
|
|
33
38
|
- Generated authority starts disabled. The model cannot activate, approve,
|
|
34
39
|
apply, commit, or widen it.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@synapsor/runner",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.5",
|
|
4
4
|
"description": "Open-source MCP runtime for governed Postgres/MySQL access with reviewed capabilities, proposals, guarded writes, receipts, and replay.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -8,6 +8,10 @@
|
|
|
8
8
|
"synapsor-runner": "dist/cli.js"
|
|
9
9
|
},
|
|
10
10
|
"exports": {
|
|
11
|
+
"./cli": {
|
|
12
|
+
"types": "./dist/cli.d.ts",
|
|
13
|
+
"import": "./dist/runner.mjs"
|
|
14
|
+
},
|
|
11
15
|
"./authoring": {
|
|
12
16
|
"types": "./dist/authoring.d.ts",
|
|
13
17
|
"import": "./dist/authoring.mjs"
|
|
@@ -41,6 +45,8 @@
|
|
|
41
45
|
"examples/dangerous-mcp-tools.json",
|
|
42
46
|
"examples/app-owned-writeback/**",
|
|
43
47
|
"examples/auto-boundary-churn/**",
|
|
48
|
+
"examples/community-solar-clean-room/**",
|
|
49
|
+
"examples/retail-clean-room/**",
|
|
44
50
|
"examples/fitflow-guided-onboarding/**",
|
|
45
51
|
"examples/claude-desktop-postgres/**",
|
|
46
52
|
"examples/cursor-postgres/**",
|
|
@@ -87,8 +93,9 @@
|
|
|
87
93
|
},
|
|
88
94
|
"dependencies": {
|
|
89
95
|
"@modelcontextprotocol/sdk": "1.29.0",
|
|
90
|
-
"@synapsor/spec": "^1.
|
|
96
|
+
"@synapsor/spec": "^1.7.0",
|
|
91
97
|
"jose": "6.2.3",
|
|
98
|
+
"jsonc-parser": "3.3.1",
|
|
92
99
|
"mysql2": "^3.11.0",
|
|
93
100
|
"pdf-lib": "1.17.1",
|
|
94
101
|
"pg": "^8.13.0",
|