Fuaran.UI.Ops
0.32.0
Prefix Reserved
See the version list below for details.
dotnet add package Fuaran.UI.Ops --version 0.32.0
NuGet\Install-Package Fuaran.UI.Ops -Version 0.32.0
<PackageReference Include="Fuaran.UI.Ops" Version="0.32.0" />
<PackageVersion Include="Fuaran.UI.Ops" Version="0.32.0" />
<PackageReference Include="Fuaran.UI.Ops" />
paket add Fuaran.UI.Ops --version 0.32.0
#r "nuget: Fuaran.UI.Ops, 0.32.0"
#:package Fuaran.UI.Ops@0.32.0
#addin nuget:?package=Fuaran.UI.Ops&version=0.32.0
#tool nuget:?package=Fuaran.UI.Ops&version=0.32.0
Fuaran.UI.Ops
Fuaran tree-op apply engine — the conversation-as-source-of-truth substrate. Implements §4g of the Fuaran design specification: a slim 10-op vocabulary the AI emits in lieu of full-tree regenerations, plus an apply : TreeOp<'Msg> -> Node<'Msg> -> Result<Node<'Msg>, ApplyError> engine that walks the tree by NodeId and returns either an updated tree or a §4d AI-recovery-shaped error payload.
Surface
Fuaran.UI.Ops.Types—TreeOp<'Msg>DU (EditNode/UpdateProp/ReplaceBinding/UpdateStyle/UpdateState/InsertChild/RemoveNode/MoveNode/ReorderChildren/Batch),ApplyError,ApplyHint,ApplyErrorCode.Fuaran.UI.Ops.Apply—apply : TreeOp<'Msg> -> Node<'Msg> -> Result<Node<'Msg>, ApplyError>.Batchis all-or-nothing — the first failing op aborts the batch and the tree is returned to its pre-batch state, with the error carrying the inner-op index.Fuaran.UI.Ops.Introspect— reflection-free shape helpers consumed by error rendering (kind name lookup, available-field enumeration perNodeKind,nodes_with_<field>_fieldtree search). Fable-compatible.Fuaran.UI.Ops.ErrorRender— turns an(op, error)pair into the §4d JSON shape (flatcode/message/hint.available_fields/hint.nodes_with_<field>_field/hint.suggestion). Consumers (downstream AI consumers) parse this to drive AI retries.Fuaran.UI.Ops.OpNotation— a read-only, human-readable projection of ops and op batches. See below.
Op-diff review notation
OpNotation renders TreeOp values as a terse, deterministic change-log — one line per op, NodeId-anchored, delta-only:
turn 12 · agent claude-fable-5 · 3 ops:
revenue-kpi: Source → $query.netRevenue
revenue-kpi: Label → "Net revenue"
channel-grid: + child Metric "margin-kpi"
The full grammar is documented in the module's header doc-comment. Two properties are worth stating here:
- It is output, not input. There is no decoder, no round-trip obligation, and no wire-format change — the module exports
render/renderOps/renderTurn/renderTailand nothing else. The canonical JSON stays the only interchange form; the notation is a review surface, so a notation change is a docs change rather than a conformance event. - It is delta-only. An inserted or replacement subtree is summarised (kind, id, node count), never dumped. A reviewer wanting the contents reads the tree; this projection answers "what changed".
Intended consumers: inspector "ops" tabs alongside the tree / JSON views; live op-stream tail views over a sink; and PR review of committed op streams, where renderTail turns a diff of the stream into a diff of the changes. Erased values render as the canonical encoder's own sentinels (<closure>, <opaque>), so notation and JSON read with one vocabulary. Scalar payloads route through Fuaran.Core.Canon, so the projection is key-order independent and uses the pinned cross-host float layout.
What's out of scope (v1)
- Wire-format storage layer. §4g's
Node<obj>+moduleMsgDecoder: JVal -> 'Msgstorage shape is a follow-up. v1 ships the typed in-memory apply (TreeOp<'Msg>overNode<'Msg>) the downstream AI consumer hooks into directly; JSONL persistence + decoder come with the per-turn op-log substrate. - Nested
UpdateProppaths. Top-level field paths ("Label","Tone","Format","Rows", ...) ship working; nested paths like"Columns.2.Label"return a structuredPathNotSupportedYeterror with the supported field list, so an AI consumer gets a useful hint rather than a silent acceptance. UpdatePropagainstAction-carrying or function-carrying fields.OnClick/OnRowClick/OnChange/ etc. are not editable via property paths; the AI re-emits the parent spec viaEditNodeto swap behaviour. Surfaced asPathNotSupportedYetwith the supported field list.
Both gaps surface to the AI through the same §4d hint shape, so the closed loop can recover by picking a structural op instead.
Apache-2.0 licensed — see the repo LICENSE.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Fable.Core (>= 5.0.0)
- FSharp.Core (>= 10.1.300)
- Fuaran.Core.Column (>= 0.11.0)
- Fuaran.Core.DataFrame (>= 0.11.0)
- Fuaran.Core.Ops (>= 0.11.0)
- Fuaran.Core.Tree (>= 0.11.0)
- Fuaran.Core.Validator (>= 0.11.0)
- Fuaran.Core.Wire (>= 0.11.0)
- Fuaran.UI (>= 0.32.0)
- Fuaran.UI.Ops.Abstractions (>= 0.32.0)
NuGet packages (18)
Showing the top 5 NuGet packages that depend on Fuaran.UI.Ops:
| Package | Downloads |
|---|---|
|
Fuaran.UI.OpStream.Abstractions
Fuaran op-stream — type contract, canonical-JSON encoder, hash-chain primitive, and sink interface. The durable / replayable counterpart to the Fuaran.UI.Ops apply engine: every applied TreeOp surfaces as a hash-chained OpRecord against the configured IOpStreamSink. CanonicalJson.encodeNode doubles as the AI pre-emit self-check encoder (Fable-compatible). Apache-2.0 licensed. |
|
|
Fuaran.UI.OpStream.Replay
Op-stream replay engine — folds OpRecord sequences through the Fuaran.UI.Ops apply engine to reconstruct any tree state. Companion to Fuaran.UI.OpStream.Abstractions. Apache-2.0 licensed. |
|
|
Fuaran.UI.OpStream.Dag.Abstractions
Fuaran op-stream branching-DAG abstractions (opt-in, rung-4). Generalises the linear hash-chained op-stream into a content-addressed Merkle-DAG: DagOpRecord with multi-parent links + lexicographically-sorted-parent canonical hash, the IDagOpStreamSink superset interface (atomic tryAdvanceHead CAS + parents/reachable/lca topology), and DAG integrity verification with tombstone-aware pruning. The linear OpRecord / IOpStreamSink are untouched — a linear chain is a valid degenerate DAG. Apache-2.0 licensed. |
|
|
Fuaran.UI.ServerDriven
Fuaran server-driven interactivity — the transport-agnostic core for the third client tier (HTMX / LiveView / Blazor-Server-shaped): the closure-free DomPatch + ClientEffect wire vocabularies the generic JS shim applies, the TreeOp→DomPatch lowering, the per-connection driver, and the IFuaranLiveChannel transport seam. Keep the Elmish update loop on the server; ship ~nothing to the browser. No platform-SDK dependency. Apache-2.0 licensed. |
|
|
Fuaran.UI.OpStream.InMemory
In-memory IOpStreamSink — per-process Dictionary-backed sink for tests, ephemeral previews, and host-tier development environments. Companion to Fuaran.UI.OpStream.Abstractions. Apache-2.0 licensed. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.46.0 | 33 | 8/28/2026 |
| 0.39.0 | 107 | 8/27/2026 |
| 0.35.0 | 347 | 8/24/2026 |
| 0.32.0 | 329 | 8/23/2026 |
| 0.31.0 | 345 | 8/21/2026 |
| 0.30.0 | 348 | 8/21/2026 |
| 0.29.0 | 329 | 8/19/2026 |
| 0.28.0 | 314 | 8/18/2026 |
| 0.27.0 | 293 | 8/18/2026 |
| 0.26.0 | 340 | 8/18/2026 |
| 0.18.0 | 294 | 8/10/2026 |
| 0.15.0 | 257 | 8/9/2026 |
| 0.12.0 | 338 | 7/31/2026 |
| 0.11.0 | 315 | 7/30/2026 |
| 0.10.0 | 368 | 7/29/2026 |
| 0.6.0 | 336 | 7/27/2026 |
| 0.4.0 | 319 | 7/26/2026 |
| 0.3.0 | 338 | 7/24/2026 |