@synapsor/runner 0.1.0-alpha.9 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/CHANGELOG.md +189 -0
  2. package/README.md +949 -164
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.d.ts.map +1 -1
  5. package/dist/runner.mjs +2982 -238
  6. package/docs/README.md +90 -15
  7. package/docs/app-owned-executors.md +38 -0
  8. package/docs/capability-authoring.md +265 -0
  9. package/docs/cloud-mode.md +24 -0
  10. package/docs/current-scope.md +29 -0
  11. package/docs/dependency-license-inventory.md +35 -0
  12. package/docs/doctor.md +98 -0
  13. package/docs/getting-started-own-database.md +131 -46
  14. package/docs/handler-helper.md +228 -0
  15. package/docs/http-mcp.md +85 -17
  16. package/docs/licensing.md +36 -0
  17. package/docs/local-mode.md +44 -25
  18. package/docs/mcp-audit.md +8 -8
  19. package/docs/mcp-client-setup.md +59 -21
  20. package/docs/openai-agents-sdk.md +57 -0
  21. package/docs/recipes.md +6 -6
  22. package/docs/release-notes.md +348 -0
  23. package/docs/release-policy.md +125 -0
  24. package/docs/result-envelope-v2.md +151 -0
  25. package/docs/rfcs/001-result-envelope-v2.md +143 -0
  26. package/docs/rfcs/002-app-owned-handler-helper.md +161 -0
  27. package/docs/rfcs/003-integrator-feedback-teardown.md +97 -0
  28. package/docs/store-lifecycle.md +83 -0
  29. package/docs/troubleshooting-first-run.md +6 -6
  30. package/docs/use-your-own-database.md +18 -0
  31. package/docs/writeback-executors.md +92 -1
  32. package/examples/app-owned-writeback/README.md +128 -0
  33. package/examples/app-owned-writeback/business-actions.md +221 -0
  34. package/examples/app-owned-writeback/command-handler.mjs +55 -0
  35. package/examples/app-owned-writeback/node-fastify-handler.mjs +64 -0
  36. package/examples/app-owned-writeback/python-fastapi-handler.py +66 -0
  37. package/examples/claude-desktop-postgres/Makefile +6 -0
  38. package/examples/claude-desktop-postgres/README.md +40 -0
  39. package/examples/cursor-postgres/Makefile +6 -0
  40. package/examples/cursor-postgres/README.md +30 -0
  41. package/examples/mcp-postgres-billing-app-handler/README.md +94 -0
  42. package/examples/mcp-postgres-billing-app-handler/app-handler.mjs +123 -0
  43. package/examples/mcp-postgres-billing-app-handler/docker-compose.yml +13 -0
  44. package/examples/mcp-postgres-billing-app-handler/schema.sql +59 -0
  45. package/examples/mcp-postgres-billing-app-handler/scripts/run-demo.sh +100 -0
  46. package/examples/mcp-postgres-billing-app-handler/seed.sql +39 -0
  47. package/examples/mcp-postgres-billing-app-handler/synapsor-handler.mjs +437 -0
  48. package/examples/mcp-postgres-billing-app-handler/synapsor.runner.json +158 -0
  49. package/examples/mysql-refund-agent/Makefile +4 -0
  50. package/examples/mysql-refund-agent/README.md +36 -0
  51. package/examples/openai-agents-http/Makefile +6 -0
  52. package/examples/openai-agents-http/README.md +33 -12
  53. package/examples/openai-agents-http/agent.py +29 -65
  54. package/examples/openai-agents-stdio/Makefile +6 -0
  55. package/examples/openai-agents-stdio/README.md +24 -6
  56. package/examples/openai-agents-stdio/agent.py +4 -2
  57. package/examples/raw-sql-vs-synapsor/Makefile +11 -0
  58. package/examples/raw-sql-vs-synapsor/README.md +41 -0
  59. package/examples/reference-support-billing-app/README.md +16 -16
  60. package/examples/reference-support-billing-app/mcp-client.generic.json +1 -1
  61. package/examples/support-billing-agent/Makefile +19 -0
  62. package/examples/support-billing-agent/README.md +89 -0
  63. package/examples/support-billing-agent/app/README.md +13 -0
  64. package/examples/support-billing-agent/db/schema.sql +91 -0
  65. package/examples/support-billing-agent/db/seed.sql +43 -0
  66. package/examples/support-billing-agent/docker-compose.yml +13 -0
  67. package/examples/support-billing-agent/scripts/run-demo.sh +15 -0
  68. package/examples/support-billing-agent/synapsor.runner.json +233 -0
  69. package/fixtures/benchmark/mcp-efficiency.json +53 -0
  70. package/fixtures/benchmark/mcp-efficiency.txt +25 -0
  71. package/fixtures/protocol/MANIFEST.json +54 -0
  72. package/fixtures/protocol/change-set.late-fee-waiver.v1.json +72 -0
  73. package/fixtures/protocol/execution-receipt.applied.v1.json +14 -0
  74. package/fixtures/protocol/execution-receipt.conflict.v1.json +15 -0
  75. package/fixtures/protocol/runner-registration.v1.json +22 -0
  76. package/fixtures/protocol/writeback-job.late-fee-waiver.v1.json +44 -0
  77. package/package.json +27 -4
  78. package/schemas/change-set.v1.schema.json +140 -0
  79. package/schemas/execution-receipt.v1.schema.json +34 -0
  80. package/schemas/onboarding-selection.v1.schema.json +132 -0
  81. package/schemas/runner-registration.v1.schema.json +48 -0
  82. package/schemas/synapsor.app-handler-receipt.v1.json +39 -0
  83. package/schemas/synapsor.app-handler-request.v1.json +119 -0
  84. package/schemas/synapsor.runner.schema.json +415 -0
  85. package/schemas/writeback-job.v1.schema.json +121 -0
@@ -0,0 +1,43 @@
1
+ INSERT INTO public.tenants (id, name, created_at, updated_at)
2
+ VALUES
3
+ ('acme', 'Acme Robotics', '2026-06-20T10:00:00Z', '2026-06-20T10:00:00Z'),
4
+ ('otherco', 'OtherCo Labs', '2026-06-20T10:00:00Z', '2026-06-20T10:00:00Z')
5
+ ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name, updated_at = EXCLUDED.updated_at;
6
+
7
+ INSERT INTO public.customers (id, tenant_id, name, email, plan, plan_credit_cents, credit_reason, created_at, updated_at)
8
+ VALUES
9
+ ('cust_acme_1', 'acme', 'Acme Robotics', 'ops@example.invalid', 'enterprise', 0, NULL, '2026-06-20T10:00:00Z', '2026-06-20T10:00:00Z'),
10
+ ('cust_acme_2', 'acme', 'Acme Field Ops', 'field@example.invalid', 'builder', 0, NULL, '2026-06-20T10:00:00Z', '2026-06-20T10:00:00Z'),
11
+ ('cust_other_1', 'otherco', 'OtherCo Labs', 'ops@otherco.invalid', 'builder', 0, NULL, '2026-06-20T10:00:00Z', '2026-06-20T10:00:00Z')
12
+ ON CONFLICT (id) DO UPDATE SET tenant_id = EXCLUDED.tenant_id, name = EXCLUDED.name, email = EXCLUDED.email, plan = EXCLUDED.plan, plan_credit_cents = EXCLUDED.plan_credit_cents, credit_reason = EXCLUDED.credit_reason, updated_at = EXCLUDED.updated_at;
13
+
14
+ INSERT INTO public.support_tickets (id, tenant_id, customer_id, subject, status, resolution_note, updated_at)
15
+ VALUES
16
+ ('T-1042', 'acme', 'cust_acme_1', 'Late fee waiver request for INV-3001', 'open', NULL, '2026-06-20T12:00:00Z'),
17
+ ('T-1043', 'acme', 'cust_acme_2', 'Duplicate card charge question', 'open', NULL, '2026-06-20T12:05:00Z'),
18
+ ('T-9001', 'otherco', 'cust_other_1', 'OtherCo private billing ticket', 'open', NULL, '2026-06-20T12:00:00Z')
19
+ ON CONFLICT (id) DO UPDATE SET tenant_id = EXCLUDED.tenant_id, customer_id = EXCLUDED.customer_id, subject = EXCLUDED.subject, status = EXCLUDED.status, resolution_note = EXCLUDED.resolution_note, updated_at = EXCLUDED.updated_at;
20
+
21
+ INSERT INTO public.invoices (id, tenant_id, customer_id, status, balance_cents, late_fee_cents, waiver_reason, updated_at)
22
+ VALUES
23
+ ('INV-3001', 'acme', 'cust_acme_1', 'overdue', 25500, 5500, NULL, '2026-06-20T14:31:08Z'),
24
+ ('INV-3002', 'acme', 'cust_acme_2', 'paid', 0, 0, NULL, '2026-06-20T14:40:00Z'),
25
+ ('INV-9001', 'otherco', 'cust_other_1', 'overdue', 25500, 5500, NULL, '2026-06-20T14:31:08Z')
26
+ ON CONFLICT (id) DO UPDATE SET tenant_id = EXCLUDED.tenant_id, customer_id = EXCLUDED.customer_id, status = EXCLUDED.status, balance_cents = EXCLUDED.balance_cents, late_fee_cents = EXCLUDED.late_fee_cents, waiver_reason = EXCLUDED.waiver_reason, updated_at = EXCLUDED.updated_at;
27
+
28
+ INSERT INTO public.credits (id, tenant_id, customer_id, invoice_id, amount_cents, reason, status, created_at, updated_at)
29
+ VALUES
30
+ ('CR-1001', 'acme', 'cust_acme_1', 'INV-3001', 1000, 'Seeded goodwill credit for review flow', 'draft', '2026-06-20T15:00:00Z', '2026-06-20T15:00:00Z')
31
+ ON CONFLICT (id) DO UPDATE SET tenant_id = EXCLUDED.tenant_id, customer_id = EXCLUDED.customer_id, invoice_id = EXCLUDED.invoice_id, amount_cents = EXCLUDED.amount_cents, reason = EXCLUDED.reason, status = EXCLUDED.status, updated_at = EXCLUDED.updated_at;
32
+
33
+ INSERT INTO public.agent_actions (id, tenant_id, action_type, target_type, target_id, proposal_id, status, created_at)
34
+ VALUES
35
+ ('ACT-1001', 'acme', 'late_fee_review', 'invoice', 'INV-3001', NULL, 'seeded', '2026-06-20T15:05:00Z')
36
+ ON CONFLICT (id) DO UPDATE SET tenant_id = EXCLUDED.tenant_id, action_type = EXCLUDED.action_type, target_type = EXCLUDED.target_type, target_id = EXCLUDED.target_id, proposal_id = EXCLUDED.proposal_id, status = EXCLUDED.status, created_at = EXCLUDED.created_at;
37
+
38
+ INSERT INTO public.orders (id, tenant_id, customer_id, status, status_change_reason, updated_at)
39
+ VALUES
40
+ ('O-1001', 'acme', 'cust_acme_1', 'paid', NULL, '2026-06-20T13:00:00Z'),
41
+ ('O-1002', 'acme', 'cust_acme_2', 'processing', NULL, '2026-06-20T13:05:00Z'),
42
+ ('O-9001', 'otherco', 'cust_other_1', 'paid', NULL, '2026-06-20T13:00:00Z')
43
+ ON CONFLICT (id) DO UPDATE SET tenant_id = EXCLUDED.tenant_id, customer_id = EXCLUDED.customer_id, status = EXCLUDED.status, status_change_reason = EXCLUDED.status_change_reason, updated_at = EXCLUDED.updated_at;
@@ -0,0 +1,13 @@
1
+ services:
2
+ postgres:
3
+ image: postgres:16
4
+ container_name: synapsor_runner_support_billing_agent
5
+ environment:
6
+ POSTGRES_DB: synapsor_support_billing_agent
7
+ POSTGRES_USER: synapsor_admin
8
+ POSTGRES_PASSWORD: synapsor_admin_password
9
+ ports:
10
+ - "55436:5432"
11
+ volumes:
12
+ - ./db/schema.sql:/docker-entrypoint-initdb.d/001_schema.sql:ro
13
+ - ./db/seed.sql:/docker-entrypoint-initdb.d/002_seed.sql:ro
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." && pwd)"
5
+ cd "$ROOT_DIR"
6
+
7
+ SYNAPSOR_REFERENCE_EXAMPLE_DIR="examples/support-billing-agent" \
8
+ SYNAPSOR_REFERENCE_CONFIG_PATH="examples/support-billing-agent/synapsor.runner.json" \
9
+ SYNAPSOR_REFERENCE_TMP_DIR="tmp/support-billing-agent" \
10
+ SYNAPSOR_REFERENCE_CONTAINER="synapsor_runner_support_billing_agent" \
11
+ SYNAPSOR_REFERENCE_DB="synapsor_support_billing_agent" \
12
+ SYNAPSOR_REFERENCE_PORT="55436" \
13
+ SYNAPSOR_REFERENCE_EXPECTED_TOOLS="support.inspect_ticket,support.propose_plan_credit,billing.inspect_invoice,billing.propose_late_fee_waiver" \
14
+ SYNAPSOR_REFERENCE_EXACT_TOOLS="1" \
15
+ node scripts/smoke-reference-support-billing-app.mjs
@@ -0,0 +1,233 @@
1
+ {
2
+ "version": 1,
3
+ "mode": "review",
4
+ "storage": {
5
+ "sqlite_path": "./tmp/support-billing-agent/local.db"
6
+ },
7
+ "sources": {
8
+ "app_postgres": {
9
+ "engine": "postgres",
10
+ "read_url_env": "REFERENCE_POSTGRES_READ_URL",
11
+ "write_url_env": "REFERENCE_POSTGRES_WRITE_URL",
12
+ "statement_timeout_ms": 3000
13
+ }
14
+ },
15
+ "trusted_context": {
16
+ "provider": "environment",
17
+ "values": {
18
+ "tenant_id_env": "SYNAPSOR_TENANT_ID",
19
+ "principal_env": "SYNAPSOR_PRINCIPAL"
20
+ }
21
+ },
22
+ "contexts": {
23
+ "local_operator": {
24
+ "provider": "environment",
25
+ "values": {
26
+ "tenant_id_env": "SYNAPSOR_TENANT_ID",
27
+ "principal_env": "SYNAPSOR_PRINCIPAL"
28
+ }
29
+ }
30
+ },
31
+ "capabilities": [
32
+ {
33
+ "name": "support.inspect_ticket",
34
+ "kind": "read",
35
+ "source": "app_postgres",
36
+ "context": "local_operator",
37
+ "target": {
38
+ "schema": "public",
39
+ "table": "support_tickets",
40
+ "primary_key": "id",
41
+ "tenant_key": "tenant_id"
42
+ },
43
+ "args": {
44
+ "ticket_id": {
45
+ "type": "string",
46
+ "required": true,
47
+ "max_length": 128
48
+ }
49
+ },
50
+ "lookup": {
51
+ "id_from_arg": "ticket_id"
52
+ },
53
+ "visible_columns": [
54
+ "id",
55
+ "tenant_id",
56
+ "customer_id",
57
+ "subject",
58
+ "status",
59
+ "resolution_note",
60
+ "updated_at"
61
+ ],
62
+ "evidence": "required",
63
+ "max_rows": 1
64
+ },
65
+ {
66
+ "name": "support.propose_plan_credit",
67
+ "kind": "proposal",
68
+ "source": "app_postgres",
69
+ "context": "local_operator",
70
+ "target": {
71
+ "schema": "public",
72
+ "table": "customers",
73
+ "primary_key": "id",
74
+ "tenant_key": "tenant_id"
75
+ },
76
+ "args": {
77
+ "customer_id": {
78
+ "type": "string",
79
+ "required": true,
80
+ "max_length": 128
81
+ },
82
+ "credit_cents": {
83
+ "type": "number",
84
+ "required": true,
85
+ "minimum": 0,
86
+ "maximum": 5000
87
+ },
88
+ "reason": {
89
+ "type": "string",
90
+ "required": true,
91
+ "max_length": 500
92
+ }
93
+ },
94
+ "lookup": {
95
+ "id_from_arg": "customer_id"
96
+ },
97
+ "visible_columns": [
98
+ "id",
99
+ "tenant_id",
100
+ "name",
101
+ "plan",
102
+ "plan_credit_cents",
103
+ "credit_reason",
104
+ "updated_at"
105
+ ],
106
+ "evidence": "required",
107
+ "max_rows": 1,
108
+ "patch": {
109
+ "plan_credit_cents": {
110
+ "from_arg": "credit_cents"
111
+ },
112
+ "credit_reason": {
113
+ "from_arg": "reason"
114
+ }
115
+ },
116
+ "allowed_columns": [
117
+ "plan_credit_cents",
118
+ "credit_reason"
119
+ ],
120
+ "numeric_bounds": {
121
+ "plan_credit_cents": {
122
+ "minimum": 0,
123
+ "maximum": 5000
124
+ }
125
+ },
126
+ "conflict_guard": {
127
+ "column": "updated_at"
128
+ },
129
+ "approval": {
130
+ "mode": "human",
131
+ "required_role": "support_lead"
132
+ }
133
+ },
134
+ {
135
+ "name": "billing.inspect_invoice",
136
+ "kind": "read",
137
+ "source": "app_postgres",
138
+ "context": "local_operator",
139
+ "target": {
140
+ "schema": "public",
141
+ "table": "invoices",
142
+ "primary_key": "id",
143
+ "tenant_key": "tenant_id"
144
+ },
145
+ "args": {
146
+ "invoice_id": {
147
+ "type": "string",
148
+ "required": true,
149
+ "max_length": 128
150
+ }
151
+ },
152
+ "lookup": {
153
+ "id_from_arg": "invoice_id"
154
+ },
155
+ "visible_columns": [
156
+ "id",
157
+ "tenant_id",
158
+ "customer_id",
159
+ "status",
160
+ "balance_cents",
161
+ "late_fee_cents",
162
+ "waiver_reason",
163
+ "updated_at"
164
+ ],
165
+ "evidence": "required",
166
+ "max_rows": 1
167
+ },
168
+ {
169
+ "name": "billing.propose_late_fee_waiver",
170
+ "kind": "proposal",
171
+ "source": "app_postgres",
172
+ "context": "local_operator",
173
+ "target": {
174
+ "schema": "public",
175
+ "table": "invoices",
176
+ "primary_key": "id",
177
+ "tenant_key": "tenant_id"
178
+ },
179
+ "args": {
180
+ "invoice_id": {
181
+ "type": "string",
182
+ "required": true,
183
+ "max_length": 128
184
+ },
185
+ "reason": {
186
+ "type": "string",
187
+ "required": true,
188
+ "max_length": 500
189
+ }
190
+ },
191
+ "lookup": {
192
+ "id_from_arg": "invoice_id"
193
+ },
194
+ "visible_columns": [
195
+ "id",
196
+ "tenant_id",
197
+ "customer_id",
198
+ "status",
199
+ "balance_cents",
200
+ "late_fee_cents",
201
+ "waiver_reason",
202
+ "updated_at"
203
+ ],
204
+ "evidence": "required",
205
+ "max_rows": 1,
206
+ "patch": {
207
+ "late_fee_cents": {
208
+ "fixed": 0
209
+ },
210
+ "waiver_reason": {
211
+ "from_arg": "reason"
212
+ }
213
+ },
214
+ "allowed_columns": [
215
+ "late_fee_cents",
216
+ "waiver_reason"
217
+ ],
218
+ "numeric_bounds": {
219
+ "late_fee_cents": {
220
+ "minimum": 0,
221
+ "maximum": 10000
222
+ }
223
+ },
224
+ "conflict_guard": {
225
+ "column": "updated_at"
226
+ },
227
+ "approval": {
228
+ "mode": "human",
229
+ "required_role": "billing_lead"
230
+ }
231
+ }
232
+ ]
233
+ }
@@ -0,0 +1,53 @@
1
+ {
2
+ "benchmark": "mcp-efficiency",
3
+ "fixture": "late-fee-waiver",
4
+ "tokenizer": {
5
+ "name": "synapsor-fixture-tokenizer-v1",
6
+ "version": 1,
7
+ "method": "deterministic regex tokenization for fixture comparison; not a model billing tokenizer"
8
+ },
9
+ "note": "This benchmark compares the included fixture/reference workflow only. It is not a universal token-savings claim.",
10
+ "paths": {
11
+ "generic_database_mcp_reference": {
12
+ "exposed_tools": 4,
13
+ "serialized_tools_list_bytes": 822,
14
+ "serialized_tools_list_tokens": 298,
15
+ "schema_context_bytes": 215,
16
+ "schema_context_tokens": 75,
17
+ "business_result_bytes": 199,
18
+ "business_result_tokens": 77,
19
+ "scripted_tool_calls": 5,
20
+ "exposes_raw_sql": true,
21
+ "exposes_write_credentials": false,
22
+ "approval_separated": false,
23
+ "stale_row_conflict_checked": false
24
+ },
25
+ "synapsor_runner_semantic_path": {
26
+ "exposed_tools": 2,
27
+ "serialized_tools_list_bytes": 728,
28
+ "serialized_tools_list_tokens": 236,
29
+ "schema_context_bytes": 331,
30
+ "schema_context_tokens": 87,
31
+ "business_result_bytes": 277,
32
+ "business_result_tokens": 91,
33
+ "scripted_tool_calls": 2,
34
+ "exposes_raw_sql": false,
35
+ "exposes_write_credentials": false,
36
+ "approval_separated": true,
37
+ "stale_row_conflict_checked": true
38
+ }
39
+ },
40
+ "scripted_plans": {
41
+ "generic_database_mcp_reference": [
42
+ "list_tables",
43
+ "describe_table invoices",
44
+ "query_database SELECT invoice",
45
+ "formulate raw UPDATE",
46
+ "execute_sql UPDATE invoice"
47
+ ],
48
+ "synapsor_runner_semantic_path": [
49
+ "billing.inspect_invoice",
50
+ "billing.propose_late_fee_waiver"
51
+ ]
52
+ }
53
+ }
@@ -0,0 +1,25 @@
1
+ MCP efficiency benchmark: late-fee-waiver fixture
2
+ Tokenizer: synapsor-fixture-tokenizer-v1 (deterministic fixture tokenizer; not a model billing tokenizer)
3
+ Scope: included fixture/reference workflow only; not a universal savings claim.
4
+
5
+ Generic database MCP reference:
6
+ exposed tools: 4
7
+ tools/list: 822 bytes, 298 tokens
8
+ scripted tool calls: 5
9
+ schema/context: 215 bytes, 75 tokens
10
+ business result: 199 bytes, 77 tokens
11
+ raw SQL exposed: yes
12
+ approval separated: no
13
+ stale-row conflict checked: no
14
+
15
+ Synapsor Runner semantic path:
16
+ exposed tools: 2
17
+ tools/list: 728 bytes, 236 tokens
18
+ scripted tool calls: 2
19
+ schema/context: 331 bytes, 87 tokens
20
+ business result: 277 bytes, 91 tokens
21
+ raw SQL exposed: no
22
+ approval separated: yes
23
+ stale-row conflict checked: yes
24
+
25
+ Run with --json to inspect machine-readable measurements and scripted plans.
@@ -0,0 +1,54 @@
1
+ {
2
+ "schema_version": "synapsor.protocol-manifest.v1",
3
+ "protocol_set": "database-mcp-writeback",
4
+ "version": "0.1.0-alpha",
5
+ "hash_algorithm": "sha256",
6
+ "note": "This manifest is copied in Synapsor main protocol/MANIFEST.json and synapsor-runner fixtures/protocol/MANIFEST.json. Hashes are over the checked-in JSON artifact bytes.",
7
+ "artifacts": [
8
+ {
9
+ "kind": "fixture",
10
+ "name": "change-set.late-fee-waiver.v1.json",
11
+ "sha256": "7112d0f28832e61b4ac5846d169666c0476ba92eb68c6790c10ac614ee3f2b33"
12
+ },
13
+ {
14
+ "kind": "fixture",
15
+ "name": "execution-receipt.applied.v1.json",
16
+ "sha256": "5af8be1b72b03d5a4c7af22748d9ade9f0febbf5e9503931054361ef998b5870"
17
+ },
18
+ {
19
+ "kind": "fixture",
20
+ "name": "execution-receipt.conflict.v1.json",
21
+ "sha256": "64e8a5fd90cdeafa2dd92a2c67cad1307b9d09e585cc82b06b987bde382f7733"
22
+ },
23
+ {
24
+ "kind": "fixture",
25
+ "name": "runner-registration.v1.json",
26
+ "sha256": "3eaf844cdc94a4274601cedfed7252d65dd837a345c8c3b0f17ab6bbdf7f75da"
27
+ },
28
+ {
29
+ "kind": "fixture",
30
+ "name": "writeback-job.late-fee-waiver.v1.json",
31
+ "sha256": "577e7987427031b55134c3d7296e644b1c8b7adec495758d4cff3665e954dbc8"
32
+ },
33
+ {
34
+ "kind": "schema",
35
+ "name": "change-set.v1.schema.json",
36
+ "sha256": "4e52b369b0d3bea30b0ed7b61ec239fc67de3dc691ed4014d6d5eabc7d2be4de"
37
+ },
38
+ {
39
+ "kind": "schema",
40
+ "name": "execution-receipt.v1.schema.json",
41
+ "sha256": "69504ce51fa66440e42d57ef6cb36cc6d8543427d8d385c9ccff954ecae5ec83"
42
+ },
43
+ {
44
+ "kind": "schema",
45
+ "name": "runner-registration.v1.schema.json",
46
+ "sha256": "86242555545b44ae747965ddb8aa35e2982587c76c2538f0f646e8b63994286b"
47
+ },
48
+ {
49
+ "kind": "schema",
50
+ "name": "writeback-job.v1.schema.json",
51
+ "sha256": "eab35194dd6b6caa7694aa8f14afbf265338d6ee8ed3d3db5d08ec83c4e7092e"
52
+ }
53
+ ]
54
+ }
@@ -0,0 +1,72 @@
1
+ {
2
+ "schema_version": "synapsor.change-set.v1",
3
+ "proposal_id": "wrp_123",
4
+ "proposal_version": 1,
5
+ "action": "billing.waive_late_fee",
6
+ "mode": "review_required",
7
+ "principal": {
8
+ "id": "support_agent_17",
9
+ "source": "trusted_session"
10
+ },
11
+ "scope": {
12
+ "tenant_id": "acme",
13
+ "business_object": "invoice",
14
+ "object_id": "INV-3001"
15
+ },
16
+ "source": {
17
+ "kind": "external_postgres",
18
+ "source_id": "src_pg_acme",
19
+ "schema": "public",
20
+ "table": "invoices",
21
+ "primary_key": {
22
+ "column": "id",
23
+ "value": "INV-3001"
24
+ }
25
+ },
26
+ "before": {
27
+ "late_fee_cents": 5500,
28
+ "waiver_reason": null,
29
+ "updated_at": "2026-06-20T14:31:08Z"
30
+ },
31
+ "patch": {
32
+ "late_fee_cents": 0,
33
+ "waiver_reason": "customer requested review"
34
+ },
35
+ "after": {
36
+ "late_fee_cents": 0,
37
+ "waiver_reason": "customer requested review",
38
+ "updated_at": "2026-06-20T14:31:08Z"
39
+ },
40
+ "guards": {
41
+ "tenant": {
42
+ "column": "tenant_id",
43
+ "value": "acme"
44
+ },
45
+ "allowed_columns": [
46
+ "late_fee_cents",
47
+ "waiver_reason"
48
+ ],
49
+ "expected_version": {
50
+ "column": "updated_at",
51
+ "value": "2026-06-20T14:31:08Z"
52
+ }
53
+ },
54
+ "evidence": {
55
+ "bundle_id": "ev_456",
56
+ "query_fingerprint": "sha256:1111111111111111111111111111111111111111111111111111111111111111",
57
+ "items": []
58
+ },
59
+ "approval": {
60
+ "status": "pending",
61
+ "required_role": "support_lead"
62
+ },
63
+ "writeback": {
64
+ "status": "not_applied",
65
+ "mode": "trusted_worker_required"
66
+ },
67
+ "source_database_mutated": false,
68
+ "integrity": {
69
+ "proposal_hash": "sha256:2222222222222222222222222222222222222222222222222222222222222222"
70
+ },
71
+ "created_at": "2026-06-20T14:31:09Z"
72
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "schema_version": "synapsor.execution-receipt.v1",
3
+ "writeback_job_id": "wbj_123",
4
+ "proposal_id": "wrp_123",
5
+ "runner_id": "runner_123",
6
+ "status": "applied",
7
+ "rows_affected": 1,
8
+ "idempotency_key": "wrp_123:INV-3001",
9
+ "previous_version": "2026-06-20T14:31:08Z",
10
+ "new_version": "2026-06-20T14:34:19Z",
11
+ "source_database_mutated": true,
12
+ "executed_at": "2026-06-20T14:34:19Z",
13
+ "receipt_hash": "sha256:3333333333333333333333333333333333333333333333333333333333333333"
14
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "schema_version": "synapsor.execution-receipt.v1",
3
+ "writeback_job_id": "wbj_124",
4
+ "proposal_id": "wrp_124",
5
+ "runner_id": "runner_123",
6
+ "status": "conflict",
7
+ "rows_affected": 0,
8
+ "idempotency_key": "wrp_124:INV-3001",
9
+ "previous_version": "2026-06-20T14:31:08Z",
10
+ "new_version": "2026-06-20T14:39:19Z",
11
+ "source_database_mutated": false,
12
+ "executed_at": "2026-06-20T14:40:19Z",
13
+ "safe_error_code": "VERSION_CONFLICT",
14
+ "receipt_hash": "sha256:4444444444444444444444444444444444444444444444444444444444444444"
15
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "schema_version": "synapsor.runner-registration.v1",
3
+ "runner_id": "runner_123",
4
+ "runner_version": "0.1.0-alpha.0",
5
+ "engines": [
6
+ "postgres",
7
+ "mysql"
8
+ ],
9
+ "capabilities": [
10
+ "single_row_update",
11
+ "idempotency_receipts",
12
+ "version_conflict_guard"
13
+ ],
14
+ "scope": {
15
+ "project_id": "acme-support",
16
+ "source_ids": [
17
+ "src_pg_acme",
18
+ "src_mysql_acme"
19
+ ]
20
+ },
21
+ "registered_at": "2026-06-20T14:30:00Z"
22
+ }
@@ -0,0 +1,44 @@
1
+ {
2
+ "schema_version": "synapsor.writeback-job.v1",
3
+ "writeback_job_id": "wbj_123",
4
+ "proposal_id": "wrp_123",
5
+ "proposal_version": 1,
6
+ "proposal_hash": "sha256:2222222222222222222222222222222222222222222222222222222222222222",
7
+ "runner_scope": {
8
+ "project_id": "acme-support",
9
+ "source_id": "src_pg_acme"
10
+ },
11
+ "engine": "postgres",
12
+ "operation": "single_row_update",
13
+ "target": {
14
+ "schema": "public",
15
+ "table": "invoices",
16
+ "primary_key": {
17
+ "column": "id",
18
+ "value": "INV-3001"
19
+ }
20
+ },
21
+ "tenant_guard": {
22
+ "column": "tenant_id",
23
+ "value": "acme"
24
+ },
25
+ "allowed_columns": [
26
+ "late_fee_cents",
27
+ "waiver_reason"
28
+ ],
29
+ "patch": {
30
+ "late_fee_cents": 0,
31
+ "waiver_reason": "approved support waiver"
32
+ },
33
+ "conflict_guard": {
34
+ "kind": "column",
35
+ "column": "updated_at",
36
+ "expected_value": "2026-06-20T14:31:08Z"
37
+ },
38
+ "idempotency_key": "wrp_123:INV-3001",
39
+ "lease": {
40
+ "lease_id": "lease_123",
41
+ "attempt": 1,
42
+ "expires_at": "2026-06-20T14:36:00Z"
43
+ }
44
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@synapsor/runner",
3
- "version": "0.1.0-alpha.9",
4
- "description": "Commit-safe MCP runner for Postgres and MySQL agents",
3
+ "version": "0.1.1",
4
+ "description": "Stop giving AI agents execute_sql; expose reviewed Postgres/MySQL MCP actions with proposals, approval, writeback, and replay.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
7
7
  "bin": {
@@ -16,15 +16,39 @@
16
16
  "dist/runner.mjs",
17
17
  "docs/**/*.md",
18
18
  "examples/dangerous-mcp-tools.json",
19
+ "examples/app-owned-writeback/**",
20
+ "examples/claude-desktop-postgres/**",
21
+ "examples/cursor-postgres/**",
22
+ "examples/mcp-postgres-billing-app-handler/**",
23
+ "examples/mysql-refund-agent/**",
19
24
  "examples/openai-agents-http/**",
20
25
  "examples/openai-agents-stdio/**",
26
+ "examples/raw-sql-vs-synapsor/**",
21
27
  "examples/reference-support-billing-app/**",
28
+ "examples/support-billing-agent/**",
29
+ "fixtures/**",
30
+ "schemas/**",
22
31
  "recipes/**/*.json",
23
32
  "README.md",
33
+ "CHANGELOG.md",
24
34
  "LICENSE",
25
35
  "NOTICE",
26
36
  "TRADEMARKS.md"
27
37
  ],
38
+ "keywords": [
39
+ "mcp",
40
+ "postgres",
41
+ "mysql",
42
+ "ai-agents",
43
+ "sql-safety",
44
+ "database-safety",
45
+ "openai-agents",
46
+ "claude",
47
+ "cursor",
48
+ "writeback",
49
+ "replay",
50
+ "model-context-protocol"
51
+ ],
28
52
  "engines": {
29
53
  "node": ">=22.5.0"
30
54
  },
@@ -52,7 +76,6 @@
52
76
  "url": "https://synapsor.ai/contact"
53
77
  },
54
78
  "publishConfig": {
55
- "access": "public",
56
- "tag": "alpha"
79
+ "access": "public"
57
80
  }
58
81
  }