@synapsor/runner 1.6.1 → 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.
Files changed (53) hide show
  1. package/CHANGELOG.md +98 -3
  2. package/README.md +33 -19
  3. package/SECURITY.md +10 -2
  4. package/THREAT_MODEL.md +27 -4
  5. package/dist/authoring.mjs +53 -3
  6. package/dist/cli.d.ts +19 -2
  7. package/dist/cli.d.ts.map +1 -1
  8. package/dist/local-ui.d.ts +85 -1
  9. package/dist/local-ui.d.ts.map +1 -1
  10. package/dist/runner.mjs +33542 -20382
  11. package/dist/runtime.mjs +3581 -237
  12. package/dist/shadow.mjs +2423 -65
  13. package/docs/README.md +22 -2
  14. package/docs/agent-guided-setup.md +239 -0
  15. package/docs/approval-roles-and-operator-identity.md +353 -0
  16. package/docs/auto-boundary-and-scoped-explore.md +32 -6
  17. package/docs/capability-authoring.md +19 -0
  18. package/docs/current-scope.md +20 -1
  19. package/docs/cursor-plugin.md +2 -2
  20. package/docs/dsl-json-parity.md +75 -0
  21. package/docs/dsl-reference.md +10 -0
  22. package/docs/fresh-developer-usability.md +155 -80
  23. package/docs/getting-started-own-database.md +5 -4
  24. package/docs/guarded-crud-writeback.md +19 -0
  25. package/docs/guided-onboarding.md +331 -0
  26. package/docs/human-attention-notifications.md +367 -0
  27. package/docs/limitations.md +19 -3
  28. package/docs/local-mode.md +16 -2
  29. package/docs/migrating-to-synapsor-spec.md +38 -0
  30. package/docs/production.md +39 -0
  31. package/docs/release-notes.md +87 -4
  32. package/docs/runner-config-reference.md +132 -0
  33. package/docs/running-a-runner-fleet.md +16 -1
  34. package/docs/security-boundary.md +24 -0
  35. package/docs/store-lifecycle.md +20 -1
  36. package/docs/supervised-automatic-apply.md +267 -0
  37. package/docs/troubleshooting-first-run.md +35 -0
  38. package/examples/app-owned-writeback/command-handler.mjs +0 -0
  39. package/examples/fitflow-guided-onboarding/README.md +43 -0
  40. package/examples/fitflow-guided-onboarding/app/page.tsx +8 -0
  41. package/examples/fitflow-guided-onboarding/docker-compose.yml +16 -0
  42. package/examples/fitflow-guided-onboarding/package.json +18 -0
  43. package/examples/fitflow-guided-onboarding/prisma/schema.prisma +98 -0
  44. package/examples/fitflow-guided-onboarding/seed/postgres.sql +401 -0
  45. package/examples/mcp-postgres-billing-app-handler/scripts/run-demo.sh +0 -0
  46. package/examples/operator-oidc/issuer.mjs +188 -0
  47. package/examples/reference-support-billing-app/scripts/run-demo.sh +0 -0
  48. package/examples/support-billing-agent/scripts/run-demo.sh +0 -0
  49. package/examples/support-billing-agent/scripts/run-evaluation.sh +0 -0
  50. package/examples/support-plan-credit/README.md +6 -2
  51. package/package.json +11 -9
  52. package/schemas/schema-candidate-review.schema.json +42 -0
  53. package/schemas/synapsor.runner.schema.json +227 -4
package/CHANGELOG.md CHANGED
@@ -1,6 +1,100 @@
1
1
  # Changelog
2
2
 
3
- ## 1.6.1 (prepared, not published)
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)
79
+
80
+ ### Registry-installable packaging hotfix
81
+
82
+ - Keeps Runner linked to the local `@synapsor/spec@1.5.0` workspace during
83
+ development while requiring pnpm to transform that dependency to the public
84
+ `^1.5.0` range in the release tarball.
85
+ - Adds a `prepublishOnly` fail-closed guard that rejects `npm publish` and
86
+ requires `corepack pnpm publish`. It also rejects unexpected `workspace:`,
87
+ `file:`, `link:`, `portal:`, absolute-path, or incorrect Spec dependencies.
88
+ - Changes the packed Runner release gate to inspect pnpm's actual transformed
89
+ tarball manifest and install that tarball by itself from a clean project.
90
+ This reproduces the public `npx` dependency-resolution path instead of
91
+ masking it with a simultaneously packed local Spec.
92
+ - Contains the same proposal/evidence freshness runtime behavior prepared in
93
+ `1.6.1`; this patch changes packaging and version surfaces only.
94
+ - Published only `@synapsor/runner@1.6.2`. `@synapsor/spec@1.5.0` and
95
+ `@synapsor/dsl@1.5.0` remain unchanged.
96
+
97
+ ## 1.6.1 (published 2026-07-23; install-broken)
4
98
 
5
99
  ### Fail-closed proposal and evidence freshness
6
100
 
@@ -26,8 +120,9 @@
26
120
  - Preserves existing contract normalization/digests, DSL, tools lists,
27
121
  approval paths, receipts, and deployments when the optional overlay is
28
122
  absent. `@synapsor/spec` and `@synapsor/dsl` remain at 1.5.0.
29
- - Prepares only `@synapsor/runner@1.6.1`. Nothing is published, tagged, pushed,
30
- or released by this change.
123
+ - Published with `@synapsor/spec: "workspace:^"` in the registry manifest,
124
+ causing clean npm/npx installs to fail with `EUNSUPPORTEDPROTOCOL`.
125
+ Superseded by the `1.6.2` packaging hotfix and should remain deprecated.
31
126
 
32
127
  ## 1.6.0 (published 2026-07-23)
33
128
 
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-runner start --from-env DATABASE_URL --schema public
70
+ npx -y @synapsor/runner@latest start --from-env DATABASE_URL
72
71
  ```
73
72
 
74
- A fresh project opens the secured localhost Workbench and emits disabled DSL,
75
- canonical JSON, tests, review evidence, and a generation lock. Review scope,
76
- fields, aggregate members, relationships, privacy budgets, profile, and exact
77
- role/RLS posture, then activate the exact digest. Existing tools stay unchanged.
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, let Runner add only the local authoring entry to this Cursor
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 accepts a typed plan, not SQL. It validates every member against the
107
- activated digest, injects trusted scope, and runs a read-only transaction.
108
- Small cohorts are suppressed and durable budgets limit repeated differencing.
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
- [Cursor plugin guide](docs/cursor-plugin.md), and
186
- [proposal freshness](docs/proposal-evidence-freshness.md) and
187
- [store lifecycle](docs/store-lifecycle.md) guides for the complete paths.
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. Local SQLite is the default, while bounded fleets can use
245
- verified HTTP claims and a shared Postgres runtime store. See
246
- [Production](docs/production.md), [Runner Config](docs/runner-config-reference.md),
247
- and [Small Runner Fleets](docs/running-a-runner-fleet.md).
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
- The v0.1 runner protects the local writeback boundary for approved structured jobs. It does not make the hosted Synapsor control plane self-hosted, and it does not provide HA, compliance certification, or a general database proxy.
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
- See `docs/threat-model.md` for detailed trust boundaries, covered threats, non-goals, and release blockers.
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 trusted runner has execution authority only for already-approved, scoped writeback jobs.
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: approval/commit tools are not exposed to MCP clients by default.
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.
@@ -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) || value.length === 0) {
277
- errors.push({ path: "$.capabilities", code: "CAPABILITIES_REQUIRED", message: "At least one capability is required." });
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":";AAYA,OAAO,EAAsc,KAAK,WAAW,EAA2L,MAAM,6BAA6B,CAAC;AAI5rB,OAAO,EAsBL,KAAK,qBAAqB,EAK3B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAiL,KAAK,kBAAkB,EAAE,KAAK,kBAAkB,EAAE,KAAK,kBAAkB,EAAqG,KAAK,YAAY,EAAwB,MAAM,2BAA2B,CAAC;AAEjb,OAAO,EAQL,KAAK,gBAAgB,EAEtB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAaL,KAAK,yBAAyB,EAG/B,MAAM,8BAA8B,CAAC;AAgXtC,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAsE1D;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;AA81JD,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;AAsvDD,wBAAgB,8BAA8B,CAAC,WAAW,EAAE,yBAAyB,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,CAKxH;AAED,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"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -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 = {
@@ -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,EAAE,aAAa,EAA2B,KAAK,cAAc,EAAE,MAAM,iCAAiC,CAAC;AA0B9G,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE1C,MAAM,MAAM,cAAc,GAAG;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,kBAAkB,CAAC,EAAE,0BAA0B,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,UAAU,CAAC;CAClB,KAAK,OAAO,CAAC;IACZ,YAAY,EAAE,UAAU,MAAM,EAAE,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,uBAAuB,EAAE,OAAO,CAAC;CAClC,CAAC,CAAC;AAEH,MAAM,MAAM,0BAA0B,GAAG,CACvC,QAAQ,EAAE,cAAc,KACrB,OAAO,CAAC,2BAA2B,CAAC,CAAC;AAE1C,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,EACjC,IAAI,EAAE,MAAM,GAAG,OAAO,EACtB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,CAAC,KAClC,OAAO,CAAC,CAAC,CAAC,CAAC;AAEhB,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B,CAAC;AAEF,wBAAsB,kBAAkB,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CAqD7F"}
1
+ {"version":3,"file":"local-ui.d.ts","sourceRoot":"","sources":["../src/local-ui.ts"],"names":[],"mappings":"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"}