@synapsor/runner 1.6.2 → 1.6.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 +77 -2
- package/README.md +33 -19
- package/SECURITY.md +10 -2
- package/THREAT_MODEL.md +27 -4
- package/dist/authoring.mjs +53 -3
- package/dist/cli.d.ts +19 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/local-ui.d.ts +85 -1
- package/dist/local-ui.d.ts.map +1 -1
- package/dist/runner.mjs +36107 -22949
- package/dist/runtime.mjs +3581 -237
- package/dist/shadow.mjs +2423 -65
- package/docs/README.md +22 -2
- package/docs/agent-guided-setup.md +239 -0
- package/docs/approval-roles-and-operator-identity.md +353 -0
- package/docs/auto-boundary-and-scoped-explore.md +32 -6
- package/docs/capability-authoring.md +19 -0
- package/docs/current-scope.md +20 -1
- package/docs/dsl-json-parity.md +75 -0
- package/docs/dsl-reference.md +10 -0
- package/docs/fresh-developer-usability.md +155 -80
- package/docs/getting-started-own-database.md +5 -4
- package/docs/guarded-crud-writeback.md +19 -0
- package/docs/guided-onboarding.md +331 -0
- package/docs/human-attention-notifications.md +367 -0
- package/docs/limitations.md +19 -3
- package/docs/local-mode.md +16 -2
- package/docs/migrating-to-synapsor-spec.md +38 -0
- package/docs/production.md +39 -0
- package/docs/release-notes.md +66 -2
- package/docs/runner-config-reference.md +132 -0
- package/docs/running-a-runner-fleet.md +16 -1
- package/docs/security-boundary.md +24 -0
- package/docs/store-lifecycle.md +20 -1
- package/docs/supervised-automatic-apply.md +267 -0
- package/docs/troubleshooting-first-run.md +35 -0
- package/examples/fitflow-guided-onboarding/README.md +43 -0
- package/examples/fitflow-guided-onboarding/app/page.tsx +8 -0
- package/examples/fitflow-guided-onboarding/docker-compose.yml +16 -0
- package/examples/fitflow-guided-onboarding/package.json +18 -0
- package/examples/fitflow-guided-onboarding/prisma/schema.prisma +98 -0
- package/examples/fitflow-guided-onboarding/seed/postgres.sql +401 -0
- package/examples/operator-oidc/issuer.mjs +188 -0
- package/examples/support-plan-credit/README.md +6 -2
- package/package.json +5 -3
- package/schemas/schema-candidate-review.schema.json +42 -0
- package/schemas/synapsor.runner.schema.json +227 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,81 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 1.6.
|
|
3
|
+
## 1.6.3 (prepared, not published)
|
|
4
|
+
|
|
5
|
+
### Guided adoption without weaker authority
|
|
6
|
+
|
|
7
|
+
- Turns a fresh interactive
|
|
8
|
+
`npx -y @synapsor/runner@latest start --from-env DATABASE_URL` into one
|
|
9
|
+
resumable journey: metadata-only inspection, conservative classification,
|
|
10
|
+
disabled project generation, review-by-exception in the loopback Workbench,
|
|
11
|
+
exact-digest activation, a real bounded read, and host-neutral MCP setup.
|
|
12
|
+
- Generates the complete local project without requiring hand-edited DSL, JSON,
|
|
13
|
+
config, store paths, DDL, or grants for the reference development journey.
|
|
14
|
+
Existing selectors, automation, headless startup, hand-authored projects,
|
|
15
|
+
active contracts, and tool lists retain their prior behavior.
|
|
16
|
+
- Adds no-ID, project-aware CLI paths for trying active named tools, bounded
|
|
17
|
+
row/aggregate exploration, protecting a successful analysis, guided action
|
|
18
|
+
authoring, proposal review, apply, receipt, replay, and compensation.
|
|
19
|
+
- Reworks Workbench onboarding around one plain-language boundary summary,
|
|
20
|
+
conservative defaults, unresolved exceptions, one primary next action, and
|
|
21
|
+
progressive disclosure of DSL, canonical JSON, digests, role posture, and
|
|
22
|
+
generated tests.
|
|
23
|
+
- Adds a guided write-action flow that drafts public DSL, canonical JSON,
|
|
24
|
+
tests, policy limits, conflict guards, receipt mode, and optional reviewed
|
|
25
|
+
compensation. It never derives business write authority from schema and
|
|
26
|
+
never activates, approves, or applies for the human.
|
|
27
|
+
- Adds the FitFlow 30-50-table packed-artifact acceptance journey, including
|
|
28
|
+
first read, PM-style aggregate Explore, Protect, proposal, bounded policy
|
|
29
|
+
approval, guarded writeback, receipts/replay, compensation, host parity,
|
|
30
|
+
privacy gates, and source-unchanged assertions before commit.
|
|
31
|
+
- Documents the full `APPROVAL ROLE` lifecycle from contract requirement
|
|
32
|
+
through external IdP claims and a verified immutable decision. A separate
|
|
33
|
+
local OIDC/JWKS issuer proves accepted reviewer/applier roles, role
|
|
34
|
+
separation, key rotation, and rejection of missing/similar roles, bad or
|
|
35
|
+
unknown signatures, expired/not-yet-valid tokens, wrong issuer/audience,
|
|
36
|
+
malformed claims, proof tampering, and cross-proposal replay.
|
|
37
|
+
- Adds default-off operator-supervised automatic apply as a separate execution
|
|
38
|
+
axis. Contract permission plus an independent deployment allowlist must match
|
|
39
|
+
one exact digest; old `AUTO APPROVE` remains manual-apply. Eligible
|
|
40
|
+
single-row INSERT/UPDATE work reuses guarded apply and repeats policy, limit,
|
|
41
|
+
scope, target/supporting-evidence freshness, writer-posture, receipt, and
|
|
42
|
+
lease checks before every execution.
|
|
43
|
+
- Adds durable redacted human-attention events and a coalesced Workbench inbox
|
|
44
|
+
for proposal, worker, boundary, schema, credential, policy, and sensitive
|
|
45
|
+
override lifecycle. A separately operated dispatcher supports quiet
|
|
46
|
+
per-sink routing, budgets, cooldowns, digests, JSONL development output, and
|
|
47
|
+
signed HTTPS webhooks. Notifications are disabled by default and never
|
|
48
|
+
authorize approval or mutation.
|
|
49
|
+
- Binds dead-letter notification replay to a fresh verified signed-key or OIDC
|
|
50
|
+
operator decision over the exact delivery revision and reason. Replay
|
|
51
|
+
requeues only the immutable redacted event, records `notification.replayed`,
|
|
52
|
+
and cannot replay approval or source mutation. The packed gate exercises two
|
|
53
|
+
competing dispatchers, zero default success noise, duplicate suppression,
|
|
54
|
+
metadata-endpoint SSRF refusal, and event-only replay with an unchanged
|
|
55
|
+
source snapshot.
|
|
56
|
+
- Adds pause/drain, exact-digest enable/disable/revoke, queue cancellation,
|
|
57
|
+
dead-letter, UNKNOWN/reconciliation, writer-posture, and optional required
|
|
58
|
+
attention-sink controls outside MCP. Fenced leases, limit reservations,
|
|
59
|
+
duplicate-consumption, process-death, known-commit, and ambiguous-outcome
|
|
60
|
+
paths retain the established fail-closed behavior.
|
|
61
|
+
- Makes CLI failure output recovery-oriented and keeps supported `--json`
|
|
62
|
+
failure paths to one parseable document with redacted diagnostics on stderr,
|
|
63
|
+
preserved-state information, source-change status, and one next action.
|
|
64
|
+
- Allows an explicit empty canonical `capabilities` array to represent a
|
|
65
|
+
validated zero-authority review draft and adds the optional canonical
|
|
66
|
+
`execution.supervised_worker` permission plus its public DSL clause. This
|
|
67
|
+
additive behavior is staged as `@synapsor/spec@1.6.0` and
|
|
68
|
+
`@synapsor/dsl@1.6.0`; legacy contracts retain their exact normalization and
|
|
69
|
+
digests.
|
|
70
|
+
- Prepares `@synapsor/runner@1.6.3`, `@synapsor/spec@1.6.0`, and
|
|
71
|
+
`@synapsor/dsl@1.6.0`. No package is published by this change.
|
|
72
|
+
- Makes the clean Runner tarball gate use the locally packed public Spec while
|
|
73
|
+
the new Spec version is still unpublished, then automatically return to the
|
|
74
|
+
stronger registry-only dependency-resolution proof once npm has that exact
|
|
75
|
+
Spec. This preserves the required Spec-first release order without masking a
|
|
76
|
+
broken packed Runner manifest.
|
|
77
|
+
|
|
78
|
+
## 1.6.2 (published 2026-07-23)
|
|
4
79
|
|
|
5
80
|
### Registry-installable packaging hotfix
|
|
6
81
|
|
|
@@ -16,7 +91,7 @@
|
|
|
16
91
|
masking it with a simultaneously packed local Spec.
|
|
17
92
|
- Contains the same proposal/evidence freshness runtime behavior prepared in
|
|
18
93
|
`1.6.1`; this patch changes packaging and version surfaces only.
|
|
19
|
-
-
|
|
94
|
+
- Published only `@synapsor/runner@1.6.2`. `@synapsor/spec@1.5.0` and
|
|
20
95
|
`@synapsor/dsl@1.5.0` remain unchanged.
|
|
21
96
|
|
|
22
97
|
## 1.6.1 (published 2026-07-23; install-broken)
|
package/README.md
CHANGED
|
@@ -64,22 +64,23 @@ existing Synapsor definitions. It does not execute adopter code, sample source
|
|
|
64
64
|
rows, or use an LLM:
|
|
65
65
|
|
|
66
66
|
```bash
|
|
67
|
-
npm install -g @synapsor/runner
|
|
68
67
|
export DATABASE_URL="postgresql://runner_reader:REPLACE_ME@db.example.com:5432/app?sslmode=require"
|
|
69
68
|
export SYNAPSOR_TENANT_ID="acme"
|
|
70
69
|
export SYNAPSOR_PRINCIPAL="developer-1"
|
|
71
|
-
synapsor
|
|
70
|
+
npx -y @synapsor/runner@latest start --from-env DATABASE_URL
|
|
72
71
|
```
|
|
73
72
|
|
|
74
|
-
A fresh project
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
73
|
+
A fresh project checks credentials, inspects metadata, emits a validated
|
|
74
|
+
zero-authority project, and opens secured localhost Workbench. Review its
|
|
75
|
+
disabled DSL, fields, scope, analytical boundary, and role/RLS posture before
|
|
76
|
+
activating the exact digest.
|
|
77
|
+
|
|
78
|
+
[Database To First Safe Tool](docs/guided-onboarding.md) covers the complete
|
|
79
|
+
path.
|
|
78
80
|
|
|
79
81
|
## Ask Your First Real Question In Cursor
|
|
80
82
|
|
|
81
|
-
After activation,
|
|
82
|
-
project:
|
|
83
|
+
After activation, install only the local authoring entry in this Cursor project:
|
|
83
84
|
|
|
84
85
|
```bash
|
|
85
86
|
synapsor-runner mcp install cursor \
|
|
@@ -103,10 +104,9 @@ Which reviewed regions and reason categories contributed most to the increase
|
|
|
103
104
|
in churned accounts by week?
|
|
104
105
|
```
|
|
105
106
|
|
|
106
|
-
Runner
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
This is descriptive analysis, not proof of causation.
|
|
107
|
+
Runner validates a typed plan against the activated digest, injects trusted
|
|
108
|
+
scope, and runs a read-only transaction. Cohort suppression and durable budgets
|
|
109
|
+
limit extraction. This is descriptive analysis, not proof of causation.
|
|
110
110
|
|
|
111
111
|
Scoped Explore is local authoring only. Missing/unknown/production profiles,
|
|
112
112
|
write-capable or owner credentials, stale generation locks, remote/shared HTTP,
|
|
@@ -182,9 +182,11 @@ synapsor-runner proposals check-freshness latest \
|
|
|
182
182
|
```
|
|
183
183
|
|
|
184
184
|
See the [own-database guide](docs/getting-started-own-database.md),
|
|
185
|
-
[
|
|
186
|
-
[
|
|
187
|
-
|
|
185
|
+
[proposal freshness](docs/proposal-evidence-freshness.md), and
|
|
186
|
+
[store lifecycle](docs/store-lifecycle.md). For production identity, follow
|
|
187
|
+
`APPROVAL ROLE` through verified OIDC/signed-key approval and a separate apply
|
|
188
|
+
role in [Approval Roles And Verified Operator
|
|
189
|
+
Identity](docs/approval-roles-and-operator-identity.md).
|
|
188
190
|
|
|
189
191
|
## Safety Model
|
|
190
192
|
|
|
@@ -241,10 +243,22 @@ See [Security Boundary](docs/security-boundary.md) and
|
|
|
241
243
|
## Operate The Approval Loop
|
|
242
244
|
|
|
243
245
|
Policies can combine per-proposal and aggregate ceilings; exceeding one routes
|
|
244
|
-
to human review.
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
and
|
|
246
|
+
to human review. Auto-approval does not mean auto-apply: existing policies wait
|
|
247
|
+
for manual apply unless the exact contract digest and deployment both opt into
|
|
248
|
+
a separately trusted supervised worker. That worker repeats scope, freshness,
|
|
249
|
+
policy, limit, credential-posture, idempotency, and guarded-write checks before
|
|
250
|
+
every execution.
|
|
251
|
+
|
|
252
|
+
The ledger and secured Workbench also provide a Human Attention Inbox.
|
|
253
|
+
External notifications are disabled and quiet by default; an operator can route
|
|
254
|
+
review-required, UNKNOWN, reconciliation, dead-letter, drift, or sustained
|
|
255
|
+
health incidents through a signed generic webhook without granting the receiver
|
|
256
|
+
approval authority. A webhook response cannot approve, apply, or change Runner
|
|
257
|
+
state. See [Supervised Automatic
|
|
258
|
+
Apply](docs/supervised-automatic-apply.md), [Human Attention And
|
|
259
|
+
Notifications](docs/human-attention-notifications.md),
|
|
260
|
+
[Production](docs/production.md), and [Small Runner
|
|
261
|
+
Fleets](docs/running-a-runner-fleet.md).
|
|
248
262
|
|
|
249
263
|
## Packages
|
|
250
264
|
|
package/SECURITY.md
CHANGED
|
@@ -6,6 +6,14 @@ Do not include production credentials, customer data, or full source rows in bug
|
|
|
6
6
|
|
|
7
7
|
## Supported security scope
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
Runner protects the local model/database boundary for reviewed semantic reads,
|
|
10
|
+
structured proposals, verified approval, guarded writeback, receipts, replay,
|
|
11
|
+
and optional exact-digest supervised execution. Human-attention notifications
|
|
12
|
+
are redacted interruption channels and never authority.
|
|
10
13
|
|
|
11
|
-
|
|
14
|
+
It does not make the hosted Synapsor control plane self-hosted, prevent prompt
|
|
15
|
+
injection, replace database roles/RLS, or provide HA, compliance certification,
|
|
16
|
+
or a general database proxy.
|
|
17
|
+
|
|
18
|
+
See `THREAT_MODEL.md` and `docs/security-boundary.md` for detailed trust
|
|
19
|
+
boundaries, covered threats, non-goals, and release blockers.
|
package/THREAT_MODEL.md
CHANGED
|
@@ -12,6 +12,8 @@ It is not a general MCP security gateway, not a prompt-injection cure, not a rep
|
|
|
12
12
|
- Proposal diffs, evidence bundles, query audit, approvals, writeback jobs, receipts, and replay records.
|
|
13
13
|
- Runner/session/operator tokens, local SQLite state, and optional shared
|
|
14
14
|
Postgres proposal/evidence/replay ledger.
|
|
15
|
+
- Exact-digest supervised-worker policy, worker leases, attention events,
|
|
16
|
+
notification delivery records, and webhook signing secrets.
|
|
15
17
|
|
|
16
18
|
## Trust Boundaries
|
|
17
19
|
|
|
@@ -21,8 +23,8 @@ MCP client/model
|
|
|
21
23
|
-> reviewed capability config
|
|
22
24
|
-> read-only database credential
|
|
23
25
|
-> local proposal/evidence/replay store
|
|
24
|
-
-> human approval outside the model
|
|
25
|
-
-> guarded worker with write credential
|
|
26
|
+
-> human or reviewed deterministic policy approval outside the model
|
|
27
|
+
-> manual apply or separately enabled guarded worker with write credential
|
|
26
28
|
-> Postgres/MySQL
|
|
27
29
|
```
|
|
28
30
|
|
|
@@ -37,7 +39,11 @@ MCP client/model
|
|
|
37
39
|
-> Postgres/MySQL
|
|
38
40
|
```
|
|
39
41
|
|
|
40
|
-
The model-facing MCP tool call has request/proposal authority. The
|
|
42
|
+
The model-facing MCP tool call has bounded request/proposal authority. The
|
|
43
|
+
trusted runner has execution authority only for already-approved, scoped
|
|
44
|
+
writeback jobs. Manual apply is the default. Supervised automatic execution
|
|
45
|
+
requires both contract permission and a deployment allowlist for the exact
|
|
46
|
+
active digest; the model controls neither.
|
|
41
47
|
|
|
42
48
|
In small-fleet mode, a TLS load balancer sends signed sessions to stateless
|
|
43
49
|
Runner instances. Every effective capability context must bind tenant and
|
|
@@ -65,7 +71,17 @@ idempotency boundary for effects.
|
|
|
65
71
|
- Over-broad write: direct INSERT/UPDATE/DELETE is single-row, tenant-bound,
|
|
66
72
|
operation-guarded, and success requires exactly one affected row.
|
|
67
73
|
- Cloud credential leakage: database URLs and write credentials stay local and are not sent to Cloud.
|
|
68
|
-
- Model-callable approval
|
|
74
|
+
- Model-callable approval or execution: activation, approval, apply, worker,
|
|
75
|
+
notification-routing, and recovery controls are not exposed to MCP clients.
|
|
76
|
+
- Stale policy-approved work: supervised execution repeats current policy,
|
|
77
|
+
limit, tenant/principal, target and supporting-evidence freshness,
|
|
78
|
+
generation-lock, writer-posture, receipt, and lease checks before apply.
|
|
79
|
+
- Notification confused deputy or replay: webhook destinations and filters are
|
|
80
|
+
operator-owned; payloads are redacted and HMAC-signed with event ID and
|
|
81
|
+
timestamp; response content and delivery replay cannot authorize or mutate.
|
|
82
|
+
- Notification flood: the default external route is quiet; related incidents
|
|
83
|
+
coalesce, transient recovery stays internal, and per-sink budgets/cooldowns
|
|
84
|
+
bound non-critical interruption while retaining immutable events.
|
|
69
85
|
- Claims/environment confusion: an `http_claims` server fails before serving
|
|
70
86
|
if a capability resolves an environment/static contract context.
|
|
71
87
|
- Leaked local resource handle: proposal, evidence, and replay reads resolve
|
|
@@ -94,6 +110,7 @@ idempotency boundary for effects.
|
|
|
94
110
|
predicates, or cross-database atomicity in the Runner direct-write path.
|
|
95
111
|
- A compromised IdP/JWKS host, ledger database, source database, TLS
|
|
96
112
|
terminator, or administrator-approved contract.
|
|
113
|
+
- A compromised operator-approved notification destination or signing secret.
|
|
97
114
|
- Unbounded/high-throughput or multi-region ledger scale, compliance
|
|
98
115
|
certification, or production SLA.
|
|
99
116
|
|
|
@@ -106,6 +123,12 @@ idempotency boundary for effects.
|
|
|
106
123
|
- Prefer version/timestamp conflict guards over weak row-hash fallback.
|
|
107
124
|
- Review proposal diffs and evidence before approval.
|
|
108
125
|
- Monitor conflict/failed receipt rates.
|
|
126
|
+
- Keep automatic execution disabled unless both exact-digest opt-ins and a
|
|
127
|
+
separately scoped least-privilege writer are reviewed. Monitor queue,
|
|
128
|
+
dead-letter, UNKNOWN, reconciliation, and writer-posture state.
|
|
129
|
+
- Keep notifications disabled unless needed. Store webhook URL/signing secret
|
|
130
|
+
only in operator environment, allowlist egress, and treat Workbench/ledger as
|
|
131
|
+
authoritative rather than a chat or incident system.
|
|
109
132
|
- Allowlist JWKS egress, keep `/metrics` separately authorized, budget source
|
|
110
133
|
pools across replicas, back up/verify the shared ledger, and retain the
|
|
111
134
|
configured `max_entries` safety bound.
|
package/dist/authoring.mjs
CHANGED
|
@@ -37,7 +37,7 @@ var SUBJECT_KEYS = /* @__PURE__ */ new Set(["resource", "schema", "table", "prim
|
|
|
37
37
|
var ARG_KEYS = /* @__PURE__ */ new Set(["type", "description", "required", "max_length", "minimum", "maximum", "enum", "max_items", "fields"]);
|
|
38
38
|
var LOOKUP_KEYS = /* @__PURE__ */ new Set(["id_from_arg"]);
|
|
39
39
|
var EVIDENCE_KEYS = /* @__PURE__ */ new Set(["required", "sources", "query_audit", "handle_prefix"]);
|
|
40
|
-
var PROPOSAL_KEYS = /* @__PURE__ */ new Set(["action", "operation", "allowed_fields", "patch", "numeric_bounds", "transition_guards", "reversibility", "conflict_guard", "approval", "writeback"]);
|
|
40
|
+
var PROPOSAL_KEYS = /* @__PURE__ */ new Set(["action", "operation", "allowed_fields", "patch", "numeric_bounds", "transition_guards", "reversibility", "conflict_guard", "approval", "execution", "writeback"]);
|
|
41
41
|
var OPERATION_KEYS = /* @__PURE__ */ new Set(["kind", "cardinality", "selection", "max_rows", "aggregate_bounds", "batch", "deduplication", "version_advance"]);
|
|
42
42
|
var SELECTION_KEYS = /* @__PURE__ */ new Set(["all"]);
|
|
43
43
|
var PREDICATE_TERM_KEYS = /* @__PURE__ */ new Set(["column", "operator", "value"]);
|
|
@@ -52,6 +52,7 @@ var NUMERIC_BOUND_KEYS = /* @__PURE__ */ new Set(["minimum", "maximum"]);
|
|
|
52
52
|
var TRANSITION_GUARD_KEYS = /* @__PURE__ */ new Set(["from_column", "allowed"]);
|
|
53
53
|
var CONFLICT_GUARD_KEYS = /* @__PURE__ */ new Set(["column", "weak_guard_ack"]);
|
|
54
54
|
var APPROVAL_KEYS = /* @__PURE__ */ new Set(["mode", "required_role", "required_approvals", "policy"]);
|
|
55
|
+
var EXECUTION_KEYS = /* @__PURE__ */ new Set(["supervised_worker"]);
|
|
55
56
|
var WRITEBACK_KEYS = /* @__PURE__ */ new Set(["mode", "executor", "idempotency_key"]);
|
|
56
57
|
var REVERSIBILITY_KEYS = /* @__PURE__ */ new Set(["mode"]);
|
|
57
58
|
var AGGREGATE_READ_KEYS = /* @__PURE__ */ new Set(["function", "count_mode", "column", "selection", "minimum_group_size"]);
|
|
@@ -273,8 +274,8 @@ function validateContexts(value, errors, warnings) {
|
|
|
273
274
|
}
|
|
274
275
|
function validateCapabilities(value, contextNames, resourceNames, errors, warnings) {
|
|
275
276
|
const names = /* @__PURE__ */ new Set();
|
|
276
|
-
if (!Array.isArray(value)
|
|
277
|
-
errors.push({ path: "$.capabilities", code: "CAPABILITIES_REQUIRED", message: "
|
|
277
|
+
if (!Array.isArray(value)) {
|
|
278
|
+
errors.push({ path: "$.capabilities", code: "CAPABILITIES_REQUIRED", message: "capabilities must be an array; an empty array represents zero authority." });
|
|
278
279
|
return names;
|
|
279
280
|
}
|
|
280
281
|
value.forEach((capability, index) => {
|
|
@@ -1001,6 +1002,55 @@ function validateProposalAction(value, subject, path, errors) {
|
|
|
1001
1002
|
});
|
|
1002
1003
|
}
|
|
1003
1004
|
}
|
|
1005
|
+
if (value.execution !== void 0) {
|
|
1006
|
+
validateNestedObject(value.execution, EXECUTION_KEYS, `${path}.execution`, errors);
|
|
1007
|
+
if (isRecord(value.execution) && value.execution.supervised_worker !== "allowed") {
|
|
1008
|
+
errors.push({
|
|
1009
|
+
path: `${path}.execution.supervised_worker`,
|
|
1010
|
+
code: "INVALID_SUPERVISED_WORKER_PERMISSION",
|
|
1011
|
+
message: "execution.supervised_worker must be allowed when the optional permission is present."
|
|
1012
|
+
});
|
|
1013
|
+
}
|
|
1014
|
+
if (isRecord(value.execution) && value.execution.supervised_worker === "allowed") {
|
|
1015
|
+
const cardinality = isRecord(value.operation) ? value.operation.cardinality ?? "single" : "single";
|
|
1016
|
+
const writebackMode = isRecord(value.writeback) ? value.writeback.mode : "direct_sql";
|
|
1017
|
+
if (writebackMode !== "direct_sql") {
|
|
1018
|
+
errors.push({
|
|
1019
|
+
path: `${path}.writeback.mode`,
|
|
1020
|
+
code: "SUPERVISED_WORKER_DIRECT_SQL_REQUIRED",
|
|
1021
|
+
message: "supervised-worker execution is initially limited to Runner-owned direct_sql writeback."
|
|
1022
|
+
});
|
|
1023
|
+
}
|
|
1024
|
+
if (cardinality !== "single") {
|
|
1025
|
+
errors.push({
|
|
1026
|
+
path: `${path}.operation.cardinality`,
|
|
1027
|
+
code: "SUPERVISED_WORKER_SINGLE_ROW_REQUIRED",
|
|
1028
|
+
message: "supervised-worker execution is initially limited to deterministic single-row writes."
|
|
1029
|
+
});
|
|
1030
|
+
}
|
|
1031
|
+
if (deleteOperation) {
|
|
1032
|
+
errors.push({
|
|
1033
|
+
path: `${path}.operation.kind`,
|
|
1034
|
+
code: "SUPERVISED_WORKER_DELETE_FORBIDDEN",
|
|
1035
|
+
message: "hard DELETE is not eligible for supervised-worker execution in this release."
|
|
1036
|
+
});
|
|
1037
|
+
}
|
|
1038
|
+
if (value.reversibility !== void 0) {
|
|
1039
|
+
errors.push({
|
|
1040
|
+
path: `${path}.reversibility`,
|
|
1041
|
+
code: "SUPERVISED_WORKER_REVERSIBILITY_FORBIDDEN",
|
|
1042
|
+
message: "reviewed compensation actions require manual execution in this release."
|
|
1043
|
+
});
|
|
1044
|
+
}
|
|
1045
|
+
if (operation === "update" && (!isRecord(value.conflict_guard) || !isSafeIdentifier(value.conflict_guard.column) || value.conflict_guard.weak_guard_ack === true)) {
|
|
1046
|
+
errors.push({
|
|
1047
|
+
path: `${path}.conflict_guard.column`,
|
|
1048
|
+
code: "SUPERVISED_WORKER_EXACT_CONFLICT_GUARD_REQUIRED",
|
|
1049
|
+
message: "supervised-worker UPDATE requires an exact source version/conflict column; a weak row hash is not eligible."
|
|
1050
|
+
});
|
|
1051
|
+
}
|
|
1052
|
+
}
|
|
1053
|
+
}
|
|
1004
1054
|
if (value.writeback !== void 0) {
|
|
1005
1055
|
validateNestedObject(value.writeback, WRITEBACK_KEYS, `${path}.writeback`, errors);
|
|
1006
1056
|
if (isRecord(value.writeback) && !["direct_sql", "app_handler", "cloud_worker", "none"].includes(String(value.writeback.mode)))
|
package/dist/cli.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { type DbRowReader } from "@synapsor-runner/mcp-server";
|
|
3
|
-
import { type StoredWritebackIntent } from "@synapsor-runner/proposal-store";
|
|
2
|
+
import { type DbRowReader, type RuntimeCapabilityConfig, type RuntimeConfig, type RuntimeSupervisedWorkerCapabilityPolicy } from "@synapsor-runner/mcp-server";
|
|
3
|
+
import { ProposalStore, type PolicyApprovalLimit, type StoredProposal, type StoredWritebackIntent } from "@synapsor-runner/proposal-store";
|
|
4
4
|
import { type ExecutionReceiptV2, type ExecutionReceiptV3, type ExecutionReceiptV4, type WritebackJob } from "@synapsor-runner/protocol";
|
|
5
5
|
import { type SchemaInspection } from "@synapsor-runner/schema-inspector";
|
|
6
6
|
import { type ReconciliationObservation } from "@synapsor-runner/worker-core";
|
|
7
|
+
import { type WorkbenchDeploymentProfile } from "./local-ui.js";
|
|
7
8
|
export declare function main(argv: string[]): Promise<number>;
|
|
8
9
|
type WizardAsk = (question: string, defaultValue?: string) => Promise<string>;
|
|
9
10
|
export declare function runInitWizard(args: string[], options?: {
|
|
@@ -19,5 +20,21 @@ export declare function verifyLocalWritebackAuthority(job: WritebackJob, configP
|
|
|
19
20
|
}): Promise<void>;
|
|
20
21
|
export declare function reconciliationSupportedOutcome(observation: ReconciliationObservation): "applied" | "conflict" | "failed";
|
|
21
22
|
export declare function reconciliationReceipt(intent: StoredWritebackIntent, observation: ReconciliationObservation, outcome: "applied" | "conflict" | "failed", runnerId: string, reason: string): ExecutionReceiptV2 | ExecutionReceiptV3 | ExecutionReceiptV4;
|
|
23
|
+
export declare function assertSupervisedPolicyApprovalCurrent(store: ProposalStore, config: RuntimeConfig, capability: RuntimeCapabilityConfig, proposal: StoredProposal): {
|
|
24
|
+
policy: string;
|
|
25
|
+
limits: PolicyApprovalLimit[];
|
|
26
|
+
} | undefined;
|
|
27
|
+
export type SupervisedWriterPostureAssessment = {
|
|
28
|
+
ok: boolean;
|
|
29
|
+
fingerprint: `sha256:${string}`;
|
|
30
|
+
expected_fingerprint: `sha256:${string}` | null;
|
|
31
|
+
reasons: string[];
|
|
32
|
+
allowed_relations: string[];
|
|
33
|
+
writable_relations: string[];
|
|
34
|
+
};
|
|
35
|
+
export declare function assessSupervisedWriterPosture(config: RuntimeConfig, policy: RuntimeSupervisedWorkerCapabilityPolicy, inspection: SchemaInspection): SupervisedWriterPostureAssessment;
|
|
36
|
+
export declare function updateSupervisedProposalExpiryAttention(store: ProposalStore, config: RuntimeConfig, now?: string): void;
|
|
37
|
+
export declare function workbenchDeploymentProfileArg(args: string[]): WorkbenchDeploymentProfile | undefined;
|
|
38
|
+
export declare function runCliProcess(argv: string[]): Promise<number>;
|
|
22
39
|
export {};
|
|
23
40
|
//# sourceMappingURL=cli.d.ts.map
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAaA,OAAO,EAAkgB,KAAK,WAAW,EAAuD,KAAK,uBAAuB,EAAE,KAAK,aAAa,EAAE,KAAK,uCAAuC,EAAoF,MAAM,6BAA6B,CAAC;AAItyB,OAAO,EAEL,aAAa,EAab,KAAK,mBAAmB,EAcxB,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAO3B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAiL,KAAK,kBAAkB,EAAE,KAAK,kBAAkB,EAAE,KAAK,kBAAkB,EAAqG,KAAK,YAAY,EAAwB,MAAM,2BAA2B,CAAC;AAEjb,OAAO,EASL,KAAK,gBAAgB,EAEtB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAcL,KAAK,yBAAyB,EAG/B,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAGL,KAAK,0BAA0B,EAQhC,MAAM,eAAe,CAAC;AA8ZvB,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA6E1D;AAwID,KAAK,SAAS,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAE9E,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE;IACP,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;CACvC,GACL,OAAO,CAAC,MAAM,CAAC,CA+YjB;AAokKD,wBAAsB,0BAA0B,CAAC,GAAG,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAc/H;AAojBD,wBAAsB,6BAA6B,CACjD,GAAG,EAAE,YAAY,EACjB,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,GAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAO,GACxC,OAAO,CAAC,IAAI,CAAC,CA0Hf;AA41DD,wBAAgB,8BAA8B,CAAC,WAAW,EAAE,yBAAyB,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,CAKxH;AA2BD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,qBAAqB,EAC7B,WAAW,EAAE,yBAAyB,EACtC,OAAO,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,EAC1C,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,kBAAkB,GAAG,kBAAkB,GAAG,kBAAkB,CAgH9D;AAqtHD,wBAAgB,qCAAqC,CACnD,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,uBAAuB,EACnC,QAAQ,EAAE,cAAc,GACvB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,mBAAmB,EAAE,CAAA;CAAE,GAAG,SAAS,CAgD/D;AAED,MAAM,MAAM,iCAAiC,GAAG;IAC9C,EAAE,EAAE,OAAO,CAAC;IACZ,WAAW,EAAE,UAAU,MAAM,EAAE,CAAC;IAChC,oBAAoB,EAAE,UAAU,MAAM,EAAE,GAAG,IAAI,CAAC;IAChD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B,CAAC;AAEF,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,uCAAuC,EAC/C,UAAU,EAAE,gBAAgB,GAC3B,iCAAiC,CA2HnC;AA8sBD,wBAAgB,uCAAuC,CACrD,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,aAAa,EACrB,GAAG,SAA2B,GAC7B,IAAI,CAqFN;AAizBD,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,0BAA0B,GAAG,SAAS,CAOpG;AAovKD,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BnE"}
|
package/dist/local-ui.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type Server } from "node:http";
|
|
2
2
|
import { type ProposalFreshnessEvaluation } from "@synapsor-runner/mcp-server";
|
|
3
|
-
import { ProposalStore, type StoredProposal } from "@synapsor-runner/proposal-store";
|
|
3
|
+
import { ProposalStore, type StoredProposal, type WorkerControlAction } from "@synapsor-runner/proposal-store";
|
|
4
|
+
import { inspectDatabase } from "@synapsor-runner/schema-inspector";
|
|
4
5
|
type JsonRecord = Record<string, unknown>;
|
|
5
6
|
export type LocalUiOptions = {
|
|
6
7
|
configPath?: string;
|
|
@@ -15,8 +16,78 @@ export type LocalUiOptions = {
|
|
|
15
16
|
projectRoot?: string;
|
|
16
17
|
storeAccess?: LocalUiStoreAccess;
|
|
17
18
|
safeActionPreview?: SafeActionPreview;
|
|
19
|
+
guidedActionPreview?: GuidedActionPreview;
|
|
18
20
|
freshnessEvaluator?: ProposalFreshnessEvaluator;
|
|
21
|
+
schemaInspector?: typeof inspectDatabase;
|
|
22
|
+
ledgerScope?: WorkbenchLedgerScope;
|
|
23
|
+
deploymentProfile?: WorkbenchDeploymentProfile;
|
|
24
|
+
proposalApprove?: WorkbenchProposalDecision;
|
|
25
|
+
proposalApply?: WorkbenchProposalDecision;
|
|
26
|
+
attentionAcknowledge?: WorkbenchAttentionDecision;
|
|
27
|
+
workerDecision?: WorkbenchWorkerDecision;
|
|
28
|
+
workerReconciliationInspect?: WorkbenchReconciliationInspect;
|
|
29
|
+
workerReconciliationResolve?: WorkbenchReconciliationResolve;
|
|
19
30
|
};
|
|
31
|
+
export type WorkbenchDeploymentProfile = "development" | "staging" | "production" | "unknown";
|
|
32
|
+
export type WorkbenchLedgerScope = {
|
|
33
|
+
tenant?: string;
|
|
34
|
+
principal?: string;
|
|
35
|
+
required?: boolean;
|
|
36
|
+
};
|
|
37
|
+
export type WorkbenchProposalDecision = (input: {
|
|
38
|
+
proposalId: string;
|
|
39
|
+
actor?: string;
|
|
40
|
+
reason?: string;
|
|
41
|
+
identityToken?: string;
|
|
42
|
+
}) => Promise<{
|
|
43
|
+
code: number;
|
|
44
|
+
}>;
|
|
45
|
+
export type WorkbenchAttentionDecision = (input: {
|
|
46
|
+
attentionId: string;
|
|
47
|
+
actor?: string;
|
|
48
|
+
identityToken?: string;
|
|
49
|
+
}) => Promise<{
|
|
50
|
+
code: number;
|
|
51
|
+
}>;
|
|
52
|
+
export type WorkbenchWorkerDecision = (input: {
|
|
53
|
+
action: WorkerControlAction | "cancel" | "dead_letter_requeue" | "dead_letter_discard";
|
|
54
|
+
capability?: string;
|
|
55
|
+
contractDigest?: `sha256:${string}`;
|
|
56
|
+
proposalId?: string;
|
|
57
|
+
retryBudget?: number;
|
|
58
|
+
actor?: string;
|
|
59
|
+
reason?: string;
|
|
60
|
+
identityToken?: string;
|
|
61
|
+
}) => Promise<{
|
|
62
|
+
code: number;
|
|
63
|
+
}>;
|
|
64
|
+
export type WorkbenchReconciliationView = {
|
|
65
|
+
intent_id: string;
|
|
66
|
+
proposal_id: string;
|
|
67
|
+
operation: string;
|
|
68
|
+
intent_status: string;
|
|
69
|
+
reconciliation_reason?: string;
|
|
70
|
+
classification: string;
|
|
71
|
+
supported_outcome: "applied" | "conflict" | "failed";
|
|
72
|
+
observed_digest: `sha256:${string}`;
|
|
73
|
+
expected_fields: string[];
|
|
74
|
+
observed_fields: string[];
|
|
75
|
+
member_count: number;
|
|
76
|
+
member_classifications: Record<string, number>;
|
|
77
|
+
source_database_changed: false;
|
|
78
|
+
};
|
|
79
|
+
export type WorkbenchReconciliationInspect = (input: {
|
|
80
|
+
intentId: string;
|
|
81
|
+
}) => Promise<WorkbenchReconciliationView>;
|
|
82
|
+
export type WorkbenchReconciliationResolve = (input: {
|
|
83
|
+
intentId: string;
|
|
84
|
+
outcome: "applied" | "conflict" | "failed";
|
|
85
|
+
actor?: string;
|
|
86
|
+
reason: string;
|
|
87
|
+
identityToken?: string;
|
|
88
|
+
}) => Promise<{
|
|
89
|
+
code: number;
|
|
90
|
+
}>;
|
|
20
91
|
export type SafeActionPreview = (input: {
|
|
21
92
|
projectRoot: string;
|
|
22
93
|
configPath: string;
|
|
@@ -28,6 +99,19 @@ export type SafeActionPreview = (input: {
|
|
|
28
99
|
proposal_hash: string;
|
|
29
100
|
source_database_changed: boolean;
|
|
30
101
|
}>;
|
|
102
|
+
export type GuidedActionPreview = (input: {
|
|
103
|
+
projectRoot: string;
|
|
104
|
+
configPath: string;
|
|
105
|
+
storePath: string;
|
|
106
|
+
capabilityName: string;
|
|
107
|
+
args: JsonRecord;
|
|
108
|
+
env: NodeJS.ProcessEnv;
|
|
109
|
+
}) => Promise<{
|
|
110
|
+
draft_digest: `sha256:${string}`;
|
|
111
|
+
proposal_id: string;
|
|
112
|
+
proposal_hash: string;
|
|
113
|
+
source_database_changed: boolean;
|
|
114
|
+
}>;
|
|
31
115
|
export type ProposalFreshnessEvaluator = (proposal: StoredProposal) => Promise<ProposalFreshnessEvaluation>;
|
|
32
116
|
export type LocalUiStoreAccess = <T>(mode: "read" | "write", operation: string, callback: (store: ProposalStore) => T) => Promise<T>;
|
|
33
117
|
export type LocalUiServer = {
|
package/dist/local-ui.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-ui.d.ts","sourceRoot":"","sources":["../src/local-ui.ts"],"names":[],"mappings":"AAEA,OAAO,EAAsC,KAAK,MAAM,EAAuB,MAAM,WAAW,CAAC;AAIjG,OAAO,EAAmG,KAAK,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAChL,OAAO,
|
|
1
|
+
{"version":3,"file":"local-ui.d.ts","sourceRoot":"","sources":["../src/local-ui.ts"],"names":[],"mappings":"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"}
|