@earendil-works/chord 1.4.0 → 1.5.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.
- package/CHANGELOG.md +92 -0
- package/README.md +115 -90
- package/dist/context/index.d.ts +1 -1
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/index.js +1 -1
- package/dist/context/index.js.map +1 -1
- package/dist/contracts/accepts.d.ts +81 -0
- package/dist/contracts/accepts.d.ts.map +1 -0
- package/dist/contracts/accepts.js +123 -0
- package/dist/contracts/accepts.js.map +1 -0
- package/dist/contracts/contract.d.ts +121 -0
- package/dist/contracts/contract.d.ts.map +1 -0
- package/dist/contracts/contract.js +50 -0
- package/dist/contracts/contract.js.map +1 -0
- package/dist/contracts/declare.d.ts +107 -0
- package/dist/contracts/declare.d.ts.map +1 -0
- package/dist/contracts/declare.js +136 -0
- package/dist/contracts/declare.js.map +1 -0
- package/dist/contracts/evolve.d.ts +92 -0
- package/dist/contracts/evolve.d.ts.map +1 -0
- package/dist/contracts/evolve.js +179 -0
- package/dist/contracts/evolve.js.map +1 -0
- package/dist/contracts/fingerprint.d.ts +16 -0
- package/dist/contracts/fingerprint.d.ts.map +1 -0
- package/dist/contracts/fingerprint.js +50 -0
- package/dist/contracts/fingerprint.js.map +1 -0
- package/dist/contracts/history.d.ts +71 -0
- package/dist/contracts/history.d.ts.map +1 -0
- package/dist/contracts/history.js +3 -0
- package/dist/contracts/history.js.map +1 -0
- package/dist/contracts/host-kind.d.ts +40 -0
- package/dist/contracts/host-kind.d.ts.map +1 -0
- package/dist/contracts/host-kind.js +37 -0
- package/dist/contracts/host-kind.js.map +1 -0
- package/dist/contracts/index.d.ts +7 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +6 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/contracts/internal.d.ts +10 -0
- package/dist/contracts/internal.d.ts.map +1 -0
- package/dist/contracts/internal.js +9 -0
- package/dist/contracts/internal.js.map +1 -0
- package/dist/contracts/names.d.ts +3 -0
- package/dist/contracts/names.d.ts.map +1 -0
- package/dist/contracts/names.js +13 -0
- package/dist/contracts/names.js.map +1 -0
- package/dist/contracts/params.d.ts +28 -0
- package/dist/contracts/params.d.ts.map +1 -0
- package/dist/contracts/params.js +50 -0
- package/dist/contracts/params.js.map +1 -0
- package/dist/contracts/schema.d.ts +102 -0
- package/dist/contracts/schema.d.ts.map +1 -0
- package/dist/contracts/schema.js +103 -0
- package/dist/contracts/schema.js.map +1 -0
- package/dist/contracts/snapshot.d.ts +16 -0
- package/dist/contracts/snapshot.d.ts.map +1 -0
- package/dist/contracts/snapshot.js +167 -0
- package/dist/contracts/snapshot.js.map +1 -0
- package/dist/data/args.d.ts +50 -0
- package/dist/data/args.d.ts.map +1 -0
- package/dist/data/args.js +83 -0
- package/dist/data/args.js.map +1 -0
- package/dist/data/errors.d.ts +80 -0
- package/dist/data/errors.d.ts.map +1 -0
- package/dist/data/errors.js +116 -0
- package/dist/data/errors.js.map +1 -0
- package/dist/data/failure.d.ts +26 -0
- package/dist/data/failure.d.ts.map +1 -0
- package/dist/data/failure.js +77 -0
- package/dist/data/failure.js.map +1 -0
- package/dist/data/index.d.ts +4 -0
- package/dist/data/index.d.ts.map +1 -0
- package/dist/data/index.js +5 -0
- package/dist/data/index.js.map +1 -0
- package/dist/data/internal.d.ts +7 -0
- package/dist/data/internal.d.ts.map +1 -0
- package/dist/data/internal.js +8 -0
- package/dist/data/internal.js.map +1 -0
- package/dist/data/params.d.ts +20 -0
- package/dist/data/params.d.ts.map +1 -0
- package/dist/data/params.js +31 -0
- package/dist/data/params.js.map +1 -0
- package/dist/data/principal.d.ts +22 -0
- package/dist/data/principal.d.ts.map +1 -0
- package/dist/data/principal.js +49 -0
- package/dist/data/principal.js.map +1 -0
- package/dist/data/validator.d.ts +12 -0
- package/dist/data/validator.d.ts.map +1 -0
- package/dist/data/validator.js +35 -0
- package/dist/data/validator.js.map +1 -0
- package/dist/delta/apply-immutable-trusted.js +3 -4
- package/dist/delta/apply-immutable-trusted.js.map +1 -1
- package/dist/delta/diff.d.ts.map +1 -1
- package/dist/delta/diff.js +5 -3
- package/dist/delta/diff.js.map +1 -1
- package/dist/delta/index.d.ts +9 -1
- package/dist/delta/index.d.ts.map +1 -1
- package/dist/delta/index.js +15 -11
- package/dist/delta/index.js.map +1 -1
- package/dist/delta/pending.d.ts +36 -0
- package/dist/delta/pending.d.ts.map +1 -0
- package/dist/delta/pending.js +143 -0
- package/dist/delta/pending.js.map +1 -0
- package/dist/delta/tracker.d.ts +12 -0
- package/dist/delta/tracker.d.ts.map +1 -1
- package/dist/delta/tracker.js +109 -39
- package/dist/delta/tracker.js.map +1 -1
- package/dist/documents/address-source.d.ts +20 -0
- package/dist/documents/address-source.d.ts.map +1 -0
- package/dist/documents/address-source.js +44 -0
- package/dist/documents/address-source.js.map +1 -0
- package/dist/documents/definition.d.ts +84 -0
- package/dist/documents/definition.d.ts.map +1 -0
- package/dist/documents/definition.js +74 -0
- package/dist/documents/definition.js.map +1 -0
- package/dist/documents/documents.d.ts +126 -0
- package/dist/documents/documents.d.ts.map +1 -0
- package/dist/documents/documents.js +248 -0
- package/dist/documents/documents.js.map +1 -0
- package/dist/documents/fence.d.ts +9 -0
- package/dist/documents/fence.d.ts.map +1 -0
- package/dist/documents/fence.js +15 -0
- package/dist/documents/fence.js.map +1 -0
- package/dist/documents/handles.d.ts +76 -0
- package/dist/documents/handles.d.ts.map +1 -0
- package/dist/documents/handles.js +66 -0
- package/dist/documents/handles.js.map +1 -0
- package/dist/documents/index.d.ts +4 -0
- package/dist/documents/index.d.ts.map +1 -0
- package/dist/documents/index.js +3 -0
- package/dist/documents/index.js.map +1 -0
- package/dist/documents/internal.d.ts +9 -0
- package/dist/documents/internal.d.ts.map +1 -0
- package/dist/documents/internal.js +9 -0
- package/dist/documents/internal.js.map +1 -0
- package/dist/documents/keyed-slot.d.ts +103 -0
- package/dist/documents/keyed-slot.d.ts.map +1 -0
- package/dist/documents/keyed-slot.js +395 -0
- package/dist/documents/keyed-slot.js.map +1 -0
- package/dist/documents/line.d.ts +7 -0
- package/dist/documents/line.d.ts.map +1 -0
- package/dist/documents/line.js +14 -0
- package/dist/documents/line.js.map +1 -0
- package/dist/documents/persistence.d.ts +104 -0
- package/dist/documents/persistence.d.ts.map +1 -0
- package/dist/documents/persistence.js +129 -0
- package/dist/documents/persistence.js.map +1 -0
- package/dist/documents/residency.d.ts +31 -0
- package/dist/documents/residency.d.ts.map +1 -0
- package/dist/documents/residency.js +93 -0
- package/dist/documents/residency.js.map +1 -0
- package/dist/documents/slot.d.ts +109 -0
- package/dist/documents/slot.d.ts.map +1 -0
- package/dist/documents/slot.js +181 -0
- package/dist/documents/slot.js.map +1 -0
- package/dist/documents/transaction.d.ts +143 -0
- package/dist/documents/transaction.d.ts.map +1 -0
- package/dist/documents/transaction.js +442 -0
- package/dist/documents/transaction.js.map +1 -0
- package/dist/host/activity.d.ts +31 -0
- package/dist/host/activity.d.ts.map +1 -0
- package/dist/host/activity.js +40 -0
- package/dist/host/activity.js.map +1 -0
- package/dist/host/adapted.d.ts +49 -0
- package/dist/host/adapted.d.ts.map +1 -0
- package/dist/host/adapted.js +214 -0
- package/dist/host/adapted.js.map +1 -0
- package/dist/host/attempt.d.ts +308 -0
- package/dist/host/attempt.d.ts.map +1 -0
- package/dist/host/attempt.js +1199 -0
- package/dist/host/attempt.js.map +1 -0
- package/dist/host/backoff.d.ts +29 -0
- package/dist/host/backoff.d.ts.map +1 -0
- package/dist/host/backoff.js +69 -0
- package/dist/host/backoff.js.map +1 -0
- package/dist/host/ctx.d.ts +94 -0
- package/dist/host/ctx.d.ts.map +1 -0
- package/dist/host/ctx.js +200 -0
- package/dist/host/ctx.js.map +1 -0
- package/dist/host/deadline.d.ts +12 -0
- package/dist/host/deadline.d.ts.map +1 -0
- package/dist/host/deadline.js +40 -0
- package/dist/host/deadline.js.map +1 -0
- package/dist/host/dependencies.d.ts +65 -0
- package/dist/host/dependencies.d.ts.map +1 -0
- package/dist/host/dependencies.js +115 -0
- package/dist/host/dependencies.js.map +1 -0
- package/dist/host/destination.d.ts +48 -0
- package/dist/host/destination.d.ts.map +1 -0
- package/dist/host/destination.js +101 -0
- package/dist/host/destination.js.map +1 -0
- package/dist/host/facet.d.ts +84 -0
- package/dist/host/facet.d.ts.map +1 -0
- package/dist/host/facet.js +55 -0
- package/dist/host/facet.js.map +1 -0
- package/dist/host/follow.d.ts +52 -0
- package/dist/host/follow.d.ts.map +1 -0
- package/dist/host/follow.js +207 -0
- package/dist/host/follow.js.map +1 -0
- package/dist/host/host.d.ts +571 -0
- package/dist/host/host.d.ts.map +1 -0
- package/dist/host/host.js +1318 -0
- package/dist/host/host.js.map +1 -0
- package/dist/host/index.d.ts +17 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +6 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/internal.d.ts +11 -0
- package/dist/host/internal.d.ts.map +1 -0
- package/dist/host/internal.js +9 -0
- package/dist/host/internal.js.map +1 -0
- package/dist/host/members.d.ts +50 -0
- package/dist/host/members.d.ts.map +1 -0
- package/dist/host/members.js +107 -0
- package/dist/host/members.js.map +1 -0
- package/dist/host/native.d.ts +64 -0
- package/dist/host/native.d.ts.map +1 -0
- package/dist/host/native.js +126 -0
- package/dist/host/native.js.map +1 -0
- package/dist/host/object.d.ts +331 -0
- package/dist/host/object.d.ts.map +1 -0
- package/dist/host/object.js +1296 -0
- package/dist/host/object.js.map +1 -0
- package/dist/host/old-work.d.ts +34 -0
- package/dist/host/old-work.d.ts.map +1 -0
- package/dist/host/old-work.js +52 -0
- package/dist/host/old-work.js.map +1 -0
- package/dist/host/parked.d.ts +23 -0
- package/dist/host/parked.d.ts.map +1 -0
- package/dist/host/parked.js +79 -0
- package/dist/host/parked.js.map +1 -0
- package/dist/host/presence.d.ts +34 -0
- package/dist/host/presence.d.ts.map +1 -0
- package/dist/host/presence.js +117 -0
- package/dist/host/presence.js.map +1 -0
- package/dist/host/readiness.d.ts +27 -0
- package/dist/host/readiness.d.ts.map +1 -0
- package/dist/host/readiness.js +134 -0
- package/dist/host/readiness.js.map +1 -0
- package/dist/host/ref-state.d.ts +53 -0
- package/dist/host/ref-state.d.ts.map +1 -0
- package/dist/host/ref-state.js +83 -0
- package/dist/host/ref-state.js.map +1 -0
- package/dist/host/reference-keys.d.ts +36 -0
- package/dist/host/reference-keys.d.ts.map +1 -0
- package/dist/host/reference-keys.js +168 -0
- package/dist/host/reference-keys.js.map +1 -0
- package/dist/host/reference-source.d.ts +65 -0
- package/dist/host/reference-source.d.ts.map +1 -0
- package/dist/host/reference-source.js +285 -0
- package/dist/host/reference-source.js.map +1 -0
- package/dist/host/reference.d.ts +321 -0
- package/dist/host/reference.d.ts.map +1 -0
- package/dist/host/reference.js +797 -0
- package/dist/host/reference.js.map +1 -0
- package/dist/host/reload-cycle.d.ts +16 -0
- package/dist/host/reload-cycle.d.ts.map +1 -0
- package/dist/host/reload-cycle.js +81 -0
- package/dist/host/reload-cycle.js.map +1 -0
- package/dist/host/retry-on.d.ts +28 -0
- package/dist/host/retry-on.d.ts.map +1 -0
- package/dist/host/retry-on.js +52 -0
- package/dist/host/retry-on.js.map +1 -0
- package/dist/host/revocation.d.ts +16 -0
- package/dist/host/revocation.d.ts.map +1 -0
- package/dist/host/revocation.js +27 -0
- package/dist/host/revocation.js.map +1 -0
- package/dist/host/root.d.ts +37 -0
- package/dist/host/root.d.ts.map +1 -0
- package/dist/host/root.js +68 -0
- package/dist/host/root.js.map +1 -0
- package/dist/host/route.d.ts +64 -0
- package/dist/host/route.d.ts.map +1 -0
- package/dist/host/route.js +227 -0
- package/dist/host/route.js.map +1 -0
- package/dist/host/routines.d.ts +78 -0
- package/dist/host/routines.d.ts.map +1 -0
- package/dist/host/routines.js +398 -0
- package/dist/host/routines.js.map +1 -0
- package/dist/host/sleep.d.ts +9 -0
- package/dist/host/sleep.d.ts.map +1 -0
- package/dist/host/sleep.js +40 -0
- package/dist/host/sleep.js.map +1 -0
- package/dist/host/staging.d.ts +94 -0
- package/dist/host/staging.d.ts.map +1 -0
- package/dist/host/staging.js +304 -0
- package/dist/host/staging.js.map +1 -0
- package/dist/host/unbound-clock.d.ts +23 -0
- package/dist/host/unbound-clock.d.ts.map +1 -0
- package/dist/host/unbound-clock.js +58 -0
- package/dist/host/unbound-clock.js.map +1 -0
- package/dist/host/unbound.d.ts +37 -0
- package/dist/host/unbound.d.ts.map +1 -0
- package/dist/host/unbound.js +88 -0
- package/dist/host/unbound.js.map +1 -0
- package/dist/host/uuid.d.ts +3 -0
- package/dist/host/uuid.d.ts.map +1 -0
- package/dist/host/uuid.js +38 -0
- package/dist/host/uuid.js.map +1 -0
- package/dist/index.d.ts +29 -18
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -9
- package/dist/index.js.map +1 -1
- package/dist/jobs/definition.d.ts +96 -0
- package/dist/jobs/definition.d.ts.map +1 -0
- package/dist/jobs/definition.js +83 -0
- package/dist/jobs/definition.js.map +1 -0
- package/dist/jobs/index.d.ts +5 -0
- package/dist/jobs/index.d.ts.map +1 -0
- package/dist/jobs/index.js +3 -0
- package/dist/jobs/index.js.map +1 -0
- package/dist/jobs/internal.d.ts +3 -0
- package/dist/jobs/internal.d.ts.map +1 -0
- package/dist/jobs/internal.js +4 -0
- package/dist/jobs/internal.js.map +1 -0
- package/dist/jobs/job.d.ts +149 -0
- package/dist/jobs/job.d.ts.map +1 -0
- package/dist/jobs/job.js +387 -0
- package/dist/jobs/job.js.map +1 -0
- package/dist/jobs/persisted.d.ts +38 -0
- package/dist/jobs/persisted.d.ts.map +1 -0
- package/dist/jobs/persisted.js +95 -0
- package/dist/jobs/persisted.js.map +1 -0
- package/dist/jobs/records.d.ts +231 -0
- package/dist/jobs/records.d.ts.map +1 -0
- package/dist/jobs/records.js +871 -0
- package/dist/jobs/records.js.map +1 -0
- package/dist/jobs/run-states.d.ts +69 -0
- package/dist/jobs/run-states.d.ts.map +1 -0
- package/dist/jobs/run-states.js +228 -0
- package/dist/jobs/run-states.js.map +1 -0
- package/dist/jobs/run.d.ts +117 -0
- package/dist/jobs/run.d.ts.map +1 -0
- package/dist/jobs/run.js +204 -0
- package/dist/jobs/run.js.map +1 -0
- package/dist/jobs/running.d.ts +44 -0
- package/dist/jobs/running.d.ts.map +1 -0
- package/dist/jobs/running.js +117 -0
- package/dist/jobs/running.js.map +1 -0
- package/dist/jobs/stored.d.ts +63 -0
- package/dist/jobs/stored.d.ts.map +1 -0
- package/dist/jobs/stored.js +55 -0
- package/dist/jobs/stored.js.map +1 -0
- package/dist/link/binary.d.ts +4 -0
- package/dist/link/binary.d.ts.map +1 -0
- package/dist/link/binary.js +544 -0
- package/dist/link/binary.js.map +1 -0
- package/dist/link/channel.d.ts +68 -0
- package/dist/link/channel.d.ts.map +1 -0
- package/dist/link/channel.js +215 -0
- package/dist/link/channel.js.map +1 -0
- package/dist/link/errors.d.ts +7 -0
- package/dist/link/errors.d.ts.map +1 -0
- package/dist/link/errors.js +21 -0
- package/dist/link/errors.js.map +1 -0
- package/dist/link/index.d.ts +8 -0
- package/dist/link/index.d.ts.map +1 -0
- package/dist/link/index.js +8 -0
- package/dist/link/index.js.map +1 -0
- package/dist/link/internal.d.ts +9 -0
- package/dist/link/internal.d.ts.map +1 -0
- package/dist/link/internal.js +10 -0
- package/dist/link/internal.js.map +1 -0
- package/dist/link/ipc.d.ts +22 -0
- package/dist/link/ipc.d.ts.map +1 -0
- package/dist/link/ipc.js +64 -0
- package/dist/link/ipc.js.map +1 -0
- package/dist/link/link.d.ts +34 -0
- package/dist/link/link.d.ts.map +1 -0
- package/dist/link/link.js +87 -0
- package/dist/link/link.js.map +1 -0
- package/dist/link/message.d.ts +262 -0
- package/dist/link/message.d.ts.map +1 -0
- package/dist/link/message.js +156 -0
- package/dist/link/message.js.map +1 -0
- package/dist/link/part.d.ts +80 -0
- package/dist/link/part.d.ts.map +1 -0
- package/dist/link/part.js +165 -0
- package/dist/link/part.js.map +1 -0
- package/dist/link/text.d.ts +6 -0
- package/dist/link/text.d.ts.map +1 -0
- package/dist/link/text.js +355 -0
- package/dist/link/text.js.map +1 -0
- package/dist/link/values.d.ts +40 -0
- package/dist/link/values.d.ts.map +1 -0
- package/dist/link/values.js +121 -0
- package/dist/link/values.js.map +1 -0
- package/dist/link/websocket.d.ts +26 -0
- package/dist/link/websocket.d.ts.map +1 -0
- package/dist/link/websocket.js +91 -0
- package/dist/link/websocket.js.map +1 -0
- package/dist/node/app/app.d.ts +269 -0
- package/dist/node/app/app.d.ts.map +1 -0
- package/dist/node/app/app.js +513 -0
- package/dist/node/app/app.js.map +1 -0
- package/dist/node/app/archive.d.ts +37 -0
- package/dist/node/app/archive.d.ts.map +1 -0
- package/dist/node/app/archive.js +204 -0
- package/dist/node/app/archive.js.map +1 -0
- package/dist/node/app/blobs.d.ts +23 -0
- package/dist/node/app/blobs.d.ts.map +1 -0
- package/dist/node/app/blobs.js +64 -0
- package/dist/node/app/blobs.js.map +1 -0
- package/dist/node/app/data.d.ts +35 -0
- package/dist/node/app/data.d.ts.map +1 -0
- package/dist/node/app/data.js +44 -0
- package/dist/node/app/data.js.map +1 -0
- package/dist/node/app/ephemeral-sessions.d.ts +20 -0
- package/dist/node/app/ephemeral-sessions.d.ts.map +1 -0
- package/dist/node/app/ephemeral-sessions.js +69 -0
- package/dist/node/app/ephemeral-sessions.js.map +1 -0
- package/dist/node/app/ephemeral.d.ts +11 -0
- package/dist/node/app/ephemeral.d.ts.map +1 -0
- package/dist/node/app/ephemeral.js +34 -0
- package/dist/node/app/ephemeral.js.map +1 -0
- package/dist/node/app/files-copy.d.ts +13 -0
- package/dist/node/app/files-copy.d.ts.map +1 -0
- package/dist/node/app/files-copy.js +86 -0
- package/dist/node/app/files-copy.js.map +1 -0
- package/dist/node/app/files-entry.d.ts +4 -0
- package/dist/node/app/files-entry.d.ts.map +1 -0
- package/dist/node/app/files-entry.js +7 -0
- package/dist/node/app/files-entry.js.map +1 -0
- package/dist/node/app/files-index.d.ts +180 -0
- package/dist/node/app/files-index.d.ts.map +1 -0
- package/dist/node/app/files-index.js +535 -0
- package/dist/node/app/files-index.js.map +1 -0
- package/dist/node/app/files.d.ts +363 -0
- package/dist/node/app/files.d.ts.map +1 -0
- package/dist/node/app/files.js +368 -0
- package/dist/node/app/files.js.map +1 -0
- package/dist/node/app/folder-views.d.ts +21 -0
- package/dist/node/app/folder-views.d.ts.map +1 -0
- package/dist/node/app/folder-views.js +55 -0
- package/dist/node/app/folder-views.js.map +1 -0
- package/dist/node/app/index.d.ts +12 -0
- package/dist/node/app/index.d.ts.map +1 -0
- package/dist/node/app/index.js +15 -0
- package/dist/node/app/index.js.map +1 -0
- package/dist/node/app/info.d.ts +66 -0
- package/dist/node/app/info.d.ts.map +1 -0
- package/dist/node/app/info.js +37 -0
- package/dist/node/app/info.js.map +1 -0
- package/dist/node/app/invite.d.ts +5 -0
- package/dist/node/app/invite.d.ts.map +1 -0
- package/dist/node/app/invite.js +64 -0
- package/dist/node/app/invite.js.map +1 -0
- package/dist/node/app/layout.d.ts +36 -0
- package/dist/node/app/layout.d.ts.map +1 -0
- package/dist/node/app/layout.js +87 -0
- package/dist/node/app/layout.js.map +1 -0
- package/dist/node/app/owner.d.ts +31 -0
- package/dist/node/app/owner.d.ts.map +1 -0
- package/dist/node/app/owner.js +104 -0
- package/dist/node/app/owner.js.map +1 -0
- package/dist/node/app/pairing.d.ts +55 -0
- package/dist/node/app/pairing.d.ts.map +1 -0
- package/dist/node/app/pairing.js +183 -0
- package/dist/node/app/pairing.js.map +1 -0
- package/dist/node/app/secrets.d.ts +16 -0
- package/dist/node/app/secrets.d.ts.map +1 -0
- package/dist/node/app/secrets.js +72 -0
- package/dist/node/app/secrets.js.map +1 -0
- package/dist/node/app/sessions.d.ts +72 -0
- package/dist/node/app/sessions.d.ts.map +1 -0
- package/dist/node/app/sessions.js +222 -0
- package/dist/node/app/sessions.js.map +1 -0
- package/dist/node/app/tar.d.ts +24 -0
- package/dist/node/app/tar.d.ts.map +1 -0
- package/dist/node/app/tar.js +167 -0
- package/dist/node/app/tar.js.map +1 -0
- package/dist/node/app/uploads.d.ts +37 -0
- package/dist/node/app/uploads.d.ts.map +1 -0
- package/dist/node/app/uploads.js +157 -0
- package/dist/node/app/uploads.js.map +1 -0
- package/dist/node/app/users.d.ts +37 -0
- package/dist/node/app/users.d.ts.map +1 -0
- package/dist/node/app/users.js +62 -0
- package/dist/node/app/users.js.map +1 -0
- package/dist/node/app/worker.d.ts +18 -0
- package/dist/node/app/worker.d.ts.map +1 -0
- package/dist/node/app/worker.js +84 -0
- package/dist/node/app/worker.js.map +1 -0
- package/dist/node/compression.d.ts +7 -0
- package/dist/node/compression.d.ts.map +1 -0
- package/dist/node/compression.js +25 -0
- package/dist/node/compression.js.map +1 -0
- package/dist/node/http/admission.d.ts +63 -0
- package/dist/node/http/admission.d.ts.map +1 -0
- package/dist/node/http/admission.js +134 -0
- package/dist/node/http/admission.js.map +1 -0
- package/dist/node/http/authenticate.d.ts +21 -0
- package/dist/node/http/authenticate.d.ts.map +1 -0
- package/dist/node/http/authenticate.js +34 -0
- package/dist/node/http/authenticate.js.map +1 -0
- package/dist/node/http/cookies.d.ts +32 -0
- package/dist/node/http/cookies.d.ts.map +1 -0
- package/dist/node/http/cookies.js +70 -0
- package/dist/node/http/cookies.js.map +1 -0
- package/dist/node/http/file.d.ts +23 -0
- package/dist/node/http/file.d.ts.map +1 -0
- package/dist/node/http/file.js +94 -0
- package/dist/node/http/file.js.map +1 -0
- package/dist/node/http/headers.d.ts +37 -0
- package/dist/node/http/headers.d.ts.map +1 -0
- package/dist/node/http/headers.js +136 -0
- package/dist/node/http/headers.js.map +1 -0
- package/dist/node/http/http.d.ts +111 -0
- package/dist/node/http/http.d.ts.map +1 -0
- package/dist/node/http/http.js +524 -0
- package/dist/node/http/http.js.map +1 -0
- package/dist/node/http/incoming.d.ts +19 -0
- package/dist/node/http/incoming.d.ts.map +1 -0
- package/dist/node/http/incoming.js +31 -0
- package/dist/node/http/incoming.js.map +1 -0
- package/dist/node/http/index.d.ts +11 -0
- package/dist/node/http/index.d.ts.map +1 -0
- package/dist/node/http/index.js +12 -0
- package/dist/node/http/index.js.map +1 -0
- package/dist/node/http/node.d.ts +78 -0
- package/dist/node/http/node.d.ts.map +1 -0
- package/dist/node/http/node.js +291 -0
- package/dist/node/http/node.js.map +1 -0
- package/dist/node/http/request.d.ts +60 -0
- package/dist/node/http/request.d.ts.map +1 -0
- package/dist/node/http/request.js +118 -0
- package/dist/node/http/request.js.map +1 -0
- package/dist/node/http/response.d.ts +63 -0
- package/dist/node/http/response.d.ts.map +1 -0
- package/dist/node/http/response.js +202 -0
- package/dist/node/http/response.js.map +1 -0
- package/dist/node/http/router.d.ts +132 -0
- package/dist/node/http/router.d.ts.map +1 -0
- package/dist/node/http/router.js +267 -0
- package/dist/node/http/router.js.map +1 -0
- package/dist/node/http/upgrades.d.ts +61 -0
- package/dist/node/http/upgrades.d.ts.map +1 -0
- package/dist/node/http/upgrades.js +192 -0
- package/dist/node/http/upgrades.js.map +1 -0
- package/dist/node/plugins/base-inputs.d.ts +14 -0
- package/dist/node/plugins/base-inputs.d.ts.map +1 -0
- package/dist/node/plugins/base-inputs.js +33 -0
- package/dist/node/plugins/base-inputs.js.map +1 -0
- package/dist/node/plugins/build.d.ts +77 -0
- package/dist/node/plugins/build.d.ts.map +1 -0
- package/dist/node/plugins/build.js +576 -0
- package/dist/node/plugins/build.js.map +1 -0
- package/dist/node/plugins/css-modules.d.ts +13 -0
- package/dist/node/plugins/css-modules.d.ts.map +1 -0
- package/dist/node/plugins/css-modules.js +58 -0
- package/dist/node/plugins/css-modules.js.map +1 -0
- package/dist/node/plugins/discover.d.ts +67 -0
- package/dist/node/plugins/discover.d.ts.map +1 -0
- package/dist/node/plugins/discover.js +369 -0
- package/dist/node/plugins/discover.js.map +1 -0
- package/dist/node/plugins/evaluate.d.ts +33 -0
- package/dist/node/plugins/evaluate.d.ts.map +1 -0
- package/dist/node/plugins/evaluate.js +121 -0
- package/dist/node/plugins/evaluate.js.map +1 -0
- package/dist/node/plugins/index.d.ts +11 -0
- package/dist/node/plugins/index.d.ts.map +1 -0
- package/dist/node/plugins/index.js +13 -0
- package/dist/node/plugins/index.js.map +1 -0
- package/dist/node/plugins/install.d.ts +38 -0
- package/dist/node/plugins/install.d.ts.map +1 -0
- package/dist/node/plugins/install.js +213 -0
- package/dist/node/plugins/install.js.map +1 -0
- package/dist/node/plugins/plugins.d.ts +162 -0
- package/dist/node/plugins/plugins.d.ts.map +1 -0
- package/dist/node/plugins/plugins.js +244 -0
- package/dist/node/plugins/plugins.js.map +1 -0
- package/dist/node/plugins/runtime.d.ts +57 -0
- package/dist/node/plugins/runtime.d.ts.map +1 -0
- package/dist/node/plugins/runtime.js +92 -0
- package/dist/node/plugins/runtime.js.map +1 -0
- package/dist/node/plugins/stack.d.ts +16 -0
- package/dist/node/plugins/stack.d.ts.map +1 -0
- package/dist/node/plugins/stack.js +61 -0
- package/dist/node/plugins/stack.js.map +1 -0
- package/dist/node/plugins/testing.d.ts +58 -0
- package/dist/node/plugins/testing.d.ts.map +1 -0
- package/dist/node/plugins/testing.js +210 -0
- package/dist/node/plugins/testing.js.map +1 -0
- package/dist/node/plugins/watcher.d.ts +69 -0
- package/dist/node/plugins/watcher.d.ts.map +1 -0
- package/dist/node/plugins/watcher.js +622 -0
- package/dist/node/plugins/watcher.js.map +1 -0
- package/dist/node/surfaces/bundle.d.ts +31 -0
- package/dist/node/surfaces/bundle.d.ts.map +1 -0
- package/dist/node/surfaces/bundle.js +118 -0
- package/dist/node/surfaces/bundle.js.map +1 -0
- package/dist/node/surfaces/current.d.ts +17 -0
- package/dist/node/surfaces/current.d.ts.map +1 -0
- package/dist/node/surfaces/current.js +54 -0
- package/dist/node/surfaces/current.js.map +1 -0
- package/dist/node/surfaces/index.d.ts +6 -0
- package/dist/node/surfaces/index.d.ts.map +1 -0
- package/dist/node/surfaces/index.js +6 -0
- package/dist/node/surfaces/index.js.map +1 -0
- package/dist/node/surfaces/published.d.ts +27 -0
- package/dist/node/surfaces/published.d.ts.map +1 -0
- package/dist/node/surfaces/published.js +142 -0
- package/dist/node/surfaces/published.js.map +1 -0
- package/dist/node/surfaces/served.d.ts +15 -0
- package/dist/node/surfaces/served.d.ts.map +1 -0
- package/dist/node/surfaces/served.js +42 -0
- package/dist/node/surfaces/served.js.map +1 -0
- package/dist/node/surfaces/surface-build.d.ts +53 -0
- package/dist/node/surfaces/surface-build.d.ts.map +1 -0
- package/dist/node/surfaces/surface-build.js +105 -0
- package/dist/node/surfaces/surface-build.js.map +1 -0
- package/dist/node/surfaces/tui.d.ts +40 -0
- package/dist/node/surfaces/tui.d.ts.map +1 -0
- package/dist/node/surfaces/tui.js +55 -0
- package/dist/node/surfaces/tui.js.map +1 -0
- package/dist/node/surfaces/web.d.ts +56 -0
- package/dist/node/surfaces/web.d.ts.map +1 -0
- package/dist/node/surfaces/web.js +108 -0
- package/dist/node/surfaces/web.js.map +1 -0
- package/dist/node/tui/actions.d.ts +49 -0
- package/dist/node/tui/actions.d.ts.map +1 -0
- package/dist/node/tui/actions.js +195 -0
- package/dist/node/tui/actions.js.map +1 -0
- package/dist/node/tui/credentials.d.ts +17 -0
- package/dist/node/tui/credentials.d.ts.map +1 -0
- package/dist/node/tui/credentials.js +54 -0
- package/dist/node/tui/credentials.js.map +1 -0
- package/dist/node/tui/filter.d.ts +5 -0
- package/dist/node/tui/filter.d.ts.map +1 -0
- package/dist/node/tui/filter.js +79 -0
- package/dist/node/tui/filter.js.map +1 -0
- package/dist/node/tui/index.d.ts +6 -0
- package/dist/node/tui/index.d.ts.map +1 -0
- package/dist/node/tui/index.js +6 -0
- package/dist/node/tui/index.js.map +1 -0
- package/dist/node/tui/launcher.d.ts +40 -0
- package/dist/node/tui/launcher.d.ts.map +1 -0
- package/dist/node/tui/launcher.js +439 -0
- package/dist/node/tui/launcher.js.map +1 -0
- package/dist/node/tui/pipe.d.ts +18 -0
- package/dist/node/tui/pipe.d.ts.map +1 -0
- package/dist/node/tui/pipe.js +134 -0
- package/dist/node/tui/pipe.js.map +1 -0
- package/dist/node/tui/sandbox.d.ts +54 -0
- package/dist/node/tui/sandbox.d.ts.map +1 -0
- package/dist/node/tui/sandbox.js +431 -0
- package/dist/node/tui/sandbox.js.map +1 -0
- package/dist/node/workers/base.d.ts +30 -0
- package/dist/node/workers/base.d.ts.map +1 -0
- package/dist/node/workers/base.js +255 -0
- package/dist/node/workers/base.js.map +1 -0
- package/dist/node/workers/child.d.ts +4 -0
- package/dist/node/workers/child.d.ts.map +1 -0
- package/dist/node/workers/child.js +6 -0
- package/dist/node/workers/child.js.map +1 -0
- package/dist/node/workers/control.d.ts +83 -0
- package/dist/node/workers/control.d.ts.map +1 -0
- package/dist/node/workers/control.js +77 -0
- package/dist/node/workers/control.js.map +1 -0
- package/dist/node/workers/index.d.ts +4 -0
- package/dist/node/workers/index.d.ts.map +1 -0
- package/dist/node/workers/index.js +7 -0
- package/dist/node/workers/index.js.map +1 -0
- package/dist/node/workers/lock.d.ts +30 -0
- package/dist/node/workers/lock.d.ts.map +1 -0
- package/dist/node/workers/lock.js +180 -0
- package/dist/node/workers/lock.js.map +1 -0
- package/dist/node/workers/main.d.ts +46 -0
- package/dist/node/workers/main.d.ts.map +1 -0
- package/dist/node/workers/main.js +230 -0
- package/dist/node/workers/main.js.map +1 -0
- package/dist/node/workers/process.d.ts +42 -0
- package/dist/node/workers/process.d.ts.map +1 -0
- package/dist/node/workers/process.js +125 -0
- package/dist/node/workers/process.js.map +1 -0
- package/dist/node/workers/workers.d.ts +122 -0
- package/dist/node/workers/workers.d.ts.map +1 -0
- package/dist/node/workers/workers.js +677 -0
- package/dist/node/workers/workers.js.map +1 -0
- package/dist/output.d.ts +1 -1
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +4 -2
- package/dist/output.js.map +1 -1
- package/dist/react/hooks.d.ts +43 -0
- package/dist/react/hooks.d.ts.map +1 -0
- package/dist/react/hooks.js +82 -0
- package/dist/react/hooks.js.map +1 -0
- package/dist/react/index.d.ts +3 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +4 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/stores.d.ts +9 -0
- package/dist/react/stores.d.ts.map +1 -0
- package/dist/react/stores.js +37 -0
- package/dist/react/stores.js.map +1 -0
- package/dist/registries/contribution.d.ts +50 -0
- package/dist/registries/contribution.d.ts.map +1 -0
- package/dist/registries/contribution.js +129 -0
- package/dist/registries/contribution.js.map +1 -0
- package/dist/registries/entries.d.ts +18 -0
- package/dist/registries/entries.d.ts.map +1 -0
- package/dist/registries/entries.js +42 -0
- package/dist/registries/entries.js.map +1 -0
- package/dist/registries/index.d.ts +3 -0
- package/dist/registries/index.d.ts.map +1 -0
- package/dist/registries/index.js +5 -0
- package/dist/registries/index.js.map +1 -0
- package/dist/registries/internal.d.ts +4 -0
- package/dist/registries/internal.d.ts.map +1 -0
- package/dist/registries/internal.js +5 -0
- package/dist/registries/internal.js.map +1 -0
- package/dist/registries/record.d.ts +115 -0
- package/dist/registries/record.d.ts.map +1 -0
- package/dist/registries/record.js +283 -0
- package/dist/registries/record.js.map +1 -0
- package/dist/registries/registry.d.ts +74 -0
- package/dist/registries/registry.d.ts.map +1 -0
- package/dist/registries/registry.js +14 -0
- package/dist/registries/registry.js.map +1 -0
- package/dist/registries/value.d.ts +48 -0
- package/dist/registries/value.d.ts.map +1 -0
- package/dist/registries/value.js +224 -0
- package/dist/registries/value.js.map +1 -0
- package/dist/remote/calls.d.ts +25 -0
- package/dist/remote/calls.d.ts.map +1 -0
- package/dist/remote/calls.js +62 -0
- package/dist/remote/calls.js.map +1 -0
- package/dist/remote/consumer.d.ts +43 -0
- package/dist/remote/consumer.d.ts.map +1 -0
- package/dist/remote/consumer.js +350 -0
- package/dist/remote/consumer.js.map +1 -0
- package/dist/remote/hold.d.ts +141 -0
- package/dist/remote/hold.d.ts.map +1 -0
- package/dist/remote/hold.js +579 -0
- package/dist/remote/hold.js.map +1 -0
- package/dist/remote/host-link.d.ts +77 -0
- package/dist/remote/host-link.d.ts.map +1 -0
- package/dist/remote/host-link.js +184 -0
- package/dist/remote/host-link.js.map +1 -0
- package/dist/remote/internal.d.ts +6 -0
- package/dist/remote/internal.d.ts.map +1 -0
- package/dist/remote/internal.js +6 -0
- package/dist/remote/internal.js.map +1 -0
- package/dist/remote/path.d.ts +46 -0
- package/dist/remote/path.d.ts.map +1 -0
- package/dist/remote/path.js +73 -0
- package/dist/remote/path.js.map +1 -0
- package/dist/remote/provider.d.ts +89 -0
- package/dist/remote/provider.d.ts.map +1 -0
- package/dist/remote/provider.js +597 -0
- package/dist/remote/provider.js.map +1 -0
- package/dist/remote/relay.d.ts +69 -0
- package/dist/remote/relay.d.ts.map +1 -0
- package/dist/remote/relay.js +219 -0
- package/dist/remote/relay.js.map +1 -0
- package/dist/remote/remote-object.d.ts +138 -0
- package/dist/remote/remote-object.d.ts.map +1 -0
- package/dist/remote/remote-object.js +492 -0
- package/dist/remote/remote-object.js.map +1 -0
- package/dist/remote/replica.d.ts +59 -0
- package/dist/remote/replica.d.ts.map +1 -0
- package/dist/remote/replica.js +125 -0
- package/dist/remote/replica.js.map +1 -0
- package/dist/sqlite/cloudflare.d.ts +2 -0
- package/dist/sqlite/cloudflare.d.ts.map +1 -1
- package/dist/sqlite/cloudflare.js +10 -0
- package/dist/sqlite/cloudflare.js.map +1 -1
- package/dist/sqlite/database.d.ts +5 -2
- package/dist/sqlite/database.d.ts.map +1 -1
- package/dist/sqlite/database.js.map +1 -1
- package/dist/sqlite/node.d.ts +13 -2
- package/dist/sqlite/node.d.ts.map +1 -1
- package/dist/sqlite/node.js +31 -8
- package/dist/sqlite/node.js.map +1 -1
- package/dist/state/batch.d.ts +64 -0
- package/dist/state/batch.d.ts.map +1 -0
- package/dist/state/batch.js +164 -0
- package/dist/state/batch.js.map +1 -0
- package/dist/state/derive.d.ts +52 -0
- package/dist/state/derive.d.ts.map +1 -0
- package/dist/state/derive.js +182 -0
- package/dist/state/derive.js.map +1 -0
- package/dist/state/index.d.ts +6 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +4 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/internal.d.ts +6 -0
- package/dist/state/internal.d.ts.map +1 -0
- package/dist/state/internal.js +8 -0
- package/dist/state/internal.js.map +1 -0
- package/dist/state/native-source.d.ts +106 -0
- package/dist/state/native-source.d.ts.map +1 -0
- package/dist/state/native-source.js +240 -0
- package/dist/state/native-source.js.map +1 -0
- package/dist/state/watchable.d.ts +114 -0
- package/dist/state/watchable.d.ts.map +1 -0
- package/dist/state/watchable.js +156 -0
- package/dist/state/watchable.js.map +1 -0
- package/dist/state/writable.d.ts +32 -0
- package/dist/state/writable.d.ts.map +1 -0
- package/dist/state/writable.js +49 -0
- package/dist/state/writable.js.map +1 -0
- package/dist/store/adapter.d.ts +67 -0
- package/dist/store/adapter.d.ts.map +1 -0
- package/dist/store/adapter.js +118 -0
- package/dist/store/adapter.js.map +1 -0
- package/dist/store/allocator.d.ts +17 -0
- package/dist/store/allocator.d.ts.map +1 -0
- package/dist/store/allocator.js +30 -0
- package/dist/store/allocator.js.map +1 -0
- package/dist/store/applier.d.ts +8 -0
- package/dist/store/applier.d.ts.map +1 -0
- package/dist/store/applier.js +375 -0
- package/dist/store/applier.js.map +1 -0
- package/dist/store/apply-batch.d.ts +12 -0
- package/dist/store/apply-batch.d.ts.map +1 -0
- package/dist/store/apply-batch.js +83 -0
- package/dist/store/apply-batch.js.map +1 -0
- package/dist/store/archive.d.ts +32 -0
- package/dist/store/archive.d.ts.map +1 -0
- package/dist/store/archive.js +130 -0
- package/dist/store/archive.js.map +1 -0
- package/dist/store/backend.d.ts +10 -0
- package/dist/store/backend.d.ts.map +1 -0
- package/dist/store/backend.js +15 -0
- package/dist/store/backend.js.map +1 -0
- package/dist/store/catalog.d.ts +24 -0
- package/dist/store/catalog.d.ts.map +1 -0
- package/dist/store/catalog.js +17 -0
- package/dist/store/catalog.js.map +1 -0
- package/dist/store/claims.d.ts +23 -0
- package/dist/store/claims.d.ts.map +1 -0
- package/dist/store/claims.js +65 -0
- package/dist/store/claims.js.map +1 -0
- package/dist/store/columns.d.ts +77 -0
- package/dist/store/columns.d.ts.map +1 -0
- package/dist/store/columns.js +77 -0
- package/dist/store/columns.js.map +1 -0
- package/dist/store/engine.d.ts +176 -0
- package/dist/store/engine.d.ts.map +1 -0
- package/dist/store/engine.js +283 -0
- package/dist/store/engine.js.map +1 -0
- package/dist/store/evaluate.d.ts +17 -0
- package/dist/store/evaluate.d.ts.map +1 -0
- package/dist/store/evaluate.js +128 -0
- package/dist/store/evaluate.js.map +1 -0
- package/dist/store/export.d.ts +17 -0
- package/dist/store/export.d.ts.map +1 -0
- package/dist/store/export.js +200 -0
- package/dist/store/export.js.map +1 -0
- package/dist/store/expression.d.ts +150 -0
- package/dist/store/expression.d.ts.map +1 -0
- package/dist/store/expression.js +268 -0
- package/dist/store/expression.js.map +1 -0
- package/dist/store/import.d.ts +10 -0
- package/dist/store/import.d.ts.map +1 -0
- package/dist/store/import.js +276 -0
- package/dist/store/import.js.map +1 -0
- package/dist/store/index.d.ts +16 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +13 -0
- package/dist/store/index.js.map +1 -0
- package/dist/store/json-column.d.ts +33 -0
- package/dist/store/json-column.d.ts.map +1 -0
- package/dist/store/json-column.js +62 -0
- package/dist/store/json-column.js.map +1 -0
- package/dist/store/jsonl.d.ts +9 -0
- package/dist/store/jsonl.d.ts.map +1 -0
- package/dist/store/jsonl.js +61 -0
- package/dist/store/jsonl.js.map +1 -0
- package/dist/store/live-query.d.ts +108 -0
- package/dist/store/live-query.d.ts.map +1 -0
- package/dist/store/live-query.js +254 -0
- package/dist/store/live-query.js.map +1 -0
- package/dist/store/outbox.d.ts +26 -0
- package/dist/store/outbox.d.ts.map +1 -0
- package/dist/store/outbox.js +80 -0
- package/dist/store/outbox.js.map +1 -0
- package/dist/store/query.d.ts +39 -0
- package/dist/store/query.d.ts.map +1 -0
- package/dist/store/query.js +97 -0
- package/dist/store/query.js.map +1 -0
- package/dist/store/refusal.d.ts +15 -0
- package/dist/store/refusal.d.ts.map +1 -0
- package/dist/store/refusal.js +36 -0
- package/dist/store/refusal.js.map +1 -0
- package/dist/store/rows.d.ts +80 -0
- package/dist/store/rows.d.ts.map +1 -0
- package/dist/store/rows.js +183 -0
- package/dist/store/rows.js.map +1 -0
- package/dist/store/schema.d.ts +25 -0
- package/dist/store/schema.d.ts.map +1 -0
- package/dist/store/schema.js +115 -0
- package/dist/store/schema.js.map +1 -0
- package/dist/store/sql.d.ts +73 -0
- package/dist/store/sql.d.ts.map +1 -0
- package/dist/store/sql.js +234 -0
- package/dist/store/sql.js.map +1 -0
- package/dist/store/step.d.ts +50 -0
- package/dist/store/step.d.ts.map +1 -0
- package/dist/store/step.js +52 -0
- package/dist/store/step.js.map +1 -0
- package/dist/store/store.d.ts +171 -0
- package/dist/store/store.d.ts.map +1 -0
- package/dist/store/store.js +818 -0
- package/dist/store/store.js.map +1 -0
- package/dist/store/table-changes.d.ts +29 -0
- package/dist/store/table-changes.d.ts.map +1 -0
- package/dist/store/table-changes.js +102 -0
- package/dist/store/table-changes.js.map +1 -0
- package/dist/store/table-evolve.d.ts +74 -0
- package/dist/store/table-evolve.d.ts.map +1 -0
- package/dist/store/table-evolve.js +201 -0
- package/dist/store/table-evolve.js.map +1 -0
- package/dist/store/table-handle.d.ts +73 -0
- package/dist/store/table-handle.d.ts.map +1 -0
- package/dist/store/table-handle.js +101 -0
- package/dist/store/table-handle.js.map +1 -0
- package/dist/store/table-history.d.ts +75 -0
- package/dist/store/table-history.d.ts.map +1 -0
- package/dist/store/table-history.js +42 -0
- package/dist/store/table-history.js.map +1 -0
- package/dist/store/table-migration.d.ts +16 -0
- package/dist/store/table-migration.d.ts.map +1 -0
- package/dist/store/table-migration.js +202 -0
- package/dist/store/table-migration.js.map +1 -0
- package/dist/store/table-writes.d.ts +125 -0
- package/dist/store/table-writes.d.ts.map +1 -0
- package/dist/store/table-writes.js +170 -0
- package/dist/store/table-writes.js.map +1 -0
- package/dist/store/table.d.ts +80 -0
- package/dist/store/table.d.ts.map +1 -0
- package/dist/store/table.js +103 -0
- package/dist/store/table.js.map +1 -0
- package/dist/store/text.d.ts +14 -0
- package/dist/store/text.d.ts.map +1 -0
- package/dist/store/text.js +51 -0
- package/dist/store/text.js.map +1 -0
- package/dist/store/writes.d.ts +5 -0
- package/dist/store/writes.d.ts.map +1 -0
- package/dist/store/writes.js +4 -0
- package/dist/store/writes.js.map +1 -0
- package/dist/surfaces/active-language.d.ts +20 -0
- package/dist/surfaces/active-language.d.ts.map +1 -0
- package/dist/surfaces/active-language.js +78 -0
- package/dist/surfaces/active-language.js.map +1 -0
- package/dist/surfaces/active-theme.d.ts +16 -0
- package/dist/surfaces/active-theme.d.ts.map +1 -0
- package/dist/surfaces/active-theme.js +47 -0
- package/dist/surfaces/active-theme.js.map +1 -0
- package/dist/surfaces/client.d.ts +96 -0
- package/dist/surfaces/client.d.ts.map +1 -0
- package/dist/surfaces/client.js +264 -0
- package/dist/surfaces/client.js.map +1 -0
- package/dist/surfaces/connection.d.ts +49 -0
- package/dist/surfaces/connection.d.ts.map +1 -0
- package/dist/surfaces/connection.js +142 -0
- package/dist/surfaces/connection.js.map +1 -0
- package/dist/surfaces/format.d.ts +5 -0
- package/dist/surfaces/format.d.ts.map +1 -0
- package/dist/surfaces/format.js +37 -0
- package/dist/surfaces/format.js.map +1 -0
- package/dist/surfaces/index.d.ts +15 -0
- package/dist/surfaces/index.d.ts.map +1 -0
- package/dist/surfaces/index.js +18 -0
- package/dist/surfaces/index.js.map +1 -0
- package/dist/surfaces/language.d.ts +53 -0
- package/dist/surfaces/language.d.ts.map +1 -0
- package/dist/surfaces/language.js +74 -0
- package/dist/surfaces/language.js.map +1 -0
- package/dist/surfaces/loaded.d.ts +42 -0
- package/dist/surfaces/loaded.d.ts.map +1 -0
- package/dist/surfaces/loaded.js +116 -0
- package/dist/surfaces/loaded.js.map +1 -0
- package/dist/surfaces/locale-choice.d.ts +25 -0
- package/dist/surfaces/locale-choice.d.ts.map +1 -0
- package/dist/surfaces/locale-choice.js +14 -0
- package/dist/surfaces/locale-choice.js.map +1 -0
- package/dist/surfaces/messages.d.ts +67 -0
- package/dist/surfaces/messages.d.ts.map +1 -0
- package/dist/surfaces/messages.js +112 -0
- package/dist/surfaces/messages.js.map +1 -0
- package/dist/surfaces/page-state.d.ts +14 -0
- package/dist/surfaces/page-state.d.ts.map +1 -0
- package/dist/surfaces/page-state.js +43 -0
- package/dist/surfaces/page-state.js.map +1 -0
- package/dist/surfaces/preference.d.ts +32 -0
- package/dist/surfaces/preference.d.ts.map +1 -0
- package/dist/surfaces/preference.js +72 -0
- package/dist/surfaces/preference.js.map +1 -0
- package/dist/surfaces/registered.d.ts +33 -0
- package/dist/surfaces/registered.d.ts.map +1 -0
- package/dist/surfaces/registered.js +51 -0
- package/dist/surfaces/registered.js.map +1 -0
- package/dist/surfaces/scripts.d.ts +84 -0
- package/dist/surfaces/scripts.d.ts.map +1 -0
- package/dist/surfaces/scripts.js +28 -0
- package/dist/surfaces/scripts.js.map +1 -0
- package/dist/surfaces/theme-choice.d.ts +31 -0
- package/dist/surfaces/theme-choice.d.ts.map +1 -0
- package/dist/surfaces/theme-choice.js +18 -0
- package/dist/surfaces/theme-choice.js.map +1 -0
- package/dist/surfaces/themes.d.ts +43 -0
- package/dist/surfaces/themes.d.ts.map +1 -0
- package/dist/surfaces/themes.js +110 -0
- package/dist/surfaces/themes.js.map +1 -0
- package/dist/surfaces/translations.d.ts +29 -0
- package/dist/surfaces/translations.d.ts.map +1 -0
- package/dist/surfaces/translations.js +57 -0
- package/dist/surfaces/translations.js.map +1 -0
- package/dist/sync/batch.d.ts +18 -0
- package/dist/sync/batch.d.ts.map +1 -0
- package/dist/sync/batch.js +125 -0
- package/dist/sync/batch.js.map +1 -0
- package/dist/sync/client.d.ts +166 -0
- package/dist/sync/client.d.ts.map +1 -0
- package/dist/sync/client.js +438 -0
- package/dist/sync/client.js.map +1 -0
- package/dist/sync/files.d.ts +46 -0
- package/dist/sync/files.d.ts.map +1 -0
- package/dist/sync/files.js +13 -0
- package/dist/sync/files.js.map +1 -0
- package/dist/sync/filesystem.d.ts +37 -0
- package/dist/sync/filesystem.d.ts.map +1 -0
- package/dist/sync/filesystem.js +185 -0
- package/dist/sync/filesystem.js.map +1 -0
- package/dist/sync/index.d.ts +8 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +9 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/lines.d.ts +18 -0
- package/dist/sync/lines.d.ts.map +1 -0
- package/dist/sync/lines.js +46 -0
- package/dist/sync/lines.js.map +1 -0
- package/dist/sync/remote.d.ts +130 -0
- package/dist/sync/remote.d.ts.map +1 -0
- package/dist/sync/remote.js +46 -0
- package/dist/sync/remote.js.map +1 -0
- package/dist/sync/state.d.ts +17 -0
- package/dist/sync/state.d.ts.map +1 -0
- package/dist/sync/state.js +40 -0
- package/dist/sync/state.js.map +1 -0
- package/dist/telemetry-ingest/batch.d.ts +70 -0
- package/dist/telemetry-ingest/batch.d.ts.map +1 -0
- package/dist/telemetry-ingest/batch.js +110 -0
- package/dist/telemetry-ingest/batch.js.map +1 -0
- package/dist/telemetry-ingest/facet.d.ts +21 -0
- package/dist/telemetry-ingest/facet.d.ts.map +1 -0
- package/dist/telemetry-ingest/facet.js +96 -0
- package/dist/telemetry-ingest/facet.js.map +1 -0
- package/dist/telemetry-ingest/index.d.ts +5 -0
- package/dist/telemetry-ingest/index.d.ts.map +1 -0
- package/dist/telemetry-ingest/index.js +8 -0
- package/dist/telemetry-ingest/index.js.map +1 -0
- package/dist/telemetry-ingest/recorder.d.ts +50 -0
- package/dist/telemetry-ingest/recorder.d.ts.map +1 -0
- package/dist/telemetry-ingest/recorder.js +298 -0
- package/dist/telemetry-ingest/recorder.js.map +1 -0
- package/dist/telemetry-ingest/sender.d.ts +14 -0
- package/dist/telemetry-ingest/sender.d.ts.map +1 -0
- package/dist/telemetry-ingest/sender.js +64 -0
- package/dist/telemetry-ingest/sender.js.map +1 -0
- package/dist/telemetry-sqlite/index.d.ts +13 -4
- package/dist/telemetry-sqlite/index.d.ts.map +1 -1
- package/dist/telemetry-sqlite/index.js +81 -241
- package/dist/telemetry-sqlite/index.js.map +1 -1
- package/dist/telemetry-sqlite/node.d.ts +13 -0
- package/dist/telemetry-sqlite/node.d.ts.map +1 -0
- package/dist/telemetry-sqlite/node.js +27 -0
- package/dist/telemetry-sqlite/node.js.map +1 -0
- package/dist/telemetry-sqlite/schema.d.ts +9 -0
- package/dist/telemetry-sqlite/schema.d.ts.map +1 -0
- package/dist/telemetry-sqlite/schema.js +61 -0
- package/dist/telemetry-sqlite/schema.js.map +1 -0
- package/dist/telemetry-sqlite/store.d.ts +3 -0
- package/dist/telemetry-sqlite/store.d.ts.map +1 -1
- package/dist/telemetry-sqlite/store.js +24 -13
- package/dist/telemetry-sqlite/store.js.map +1 -1
- package/dist/telemetry.d.ts +937 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +470 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/tui/bridge.d.ts +112 -0
- package/dist/tui/bridge.d.ts.map +1 -0
- package/dist/tui/bridge.js +9 -0
- package/dist/tui/bridge.js.map +1 -0
- package/dist/tui/channel.d.ts +44 -0
- package/dist/tui/channel.d.ts.map +1 -0
- package/dist/tui/channel.js +150 -0
- package/dist/tui/channel.js.map +1 -0
- package/dist/tui/frames.d.ts +5 -0
- package/dist/tui/frames.d.ts.map +1 -0
- package/dist/tui/frames.js +52 -0
- package/dist/tui/frames.js.map +1 -0
- package/dist/tui/index.d.ts +7 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +8 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/runtime.d.ts +46 -0
- package/dist/tui/runtime.d.ts.map +1 -0
- package/dist/tui/runtime.js +101 -0
- package/dist/tui/runtime.js.map +1 -0
- package/dist/tui/scope.d.ts +46 -0
- package/dist/tui/scope.d.ts.map +1 -0
- package/dist/tui/scope.js +141 -0
- package/dist/tui/scope.js.map +1 -0
- package/dist/tui/terminal.d.ts +15 -0
- package/dist/tui/terminal.d.ts.map +1 -0
- package/dist/tui/terminal.js +37 -0
- package/dist/tui/terminal.js.map +1 -0
- package/dist/tui/theme.d.ts +17 -0
- package/dist/tui/theme.d.ts.map +1 -0
- package/dist/tui/theme.js +38 -0
- package/dist/tui/theme.js.map +1 -0
- package/dist/watch.d.ts +194 -0
- package/dist/watch.d.ts.map +1 -0
- package/dist/watch.js +383 -0
- package/dist/watch.js.map +1 -0
- package/dist/web/environment.d.ts +4 -0
- package/dist/web/environment.d.ts.map +1 -0
- package/dist/web/environment.js +37 -0
- package/dist/web/environment.js.map +1 -0
- package/dist/web/index.d.ts +5 -0
- package/dist/web/index.d.ts.map +1 -0
- package/dist/web/index.js +7 -0
- package/dist/web/index.js.map +1 -0
- package/dist/web/language.d.ts +7 -0
- package/dist/web/language.d.ts.map +1 -0
- package/dist/web/language.js +21 -0
- package/dist/web/language.js.map +1 -0
- package/dist/web/page.d.ts +29 -0
- package/dist/web/page.d.ts.map +1 -0
- package/dist/web/page.js +92 -0
- package/dist/web/page.js.map +1 -0
- package/dist/web/scripts.d.ts +23 -0
- package/dist/web/scripts.d.ts.map +1 -0
- package/dist/web/scripts.js +50 -0
- package/dist/web/scripts.js.map +1 -0
- package/dist/web/styles.d.ts +17 -0
- package/dist/web/styles.d.ts.map +1 -0
- package/dist/web/styles.js +218 -0
- package/dist/web/styles.js.map +1 -0
- package/dist/web/themes.d.ts +6 -0
- package/dist/web/themes.d.ts.map +1 -0
- package/dist/web/themes.js +31 -0
- package/dist/web/themes.js.map +1 -0
- package/docs/benchmarks.md +1036 -0
- package/docs/decisions.md +3436 -0
- package/docs/dependencies/book.md +1671 -0
- package/docs/dependencies/index.html +2641 -0
- package/docs/dependencies/model.md +330 -0
- package/docs/design.md +3065 -0
- package/docs/durable-observers/book.md +432 -0
- package/docs/durable-observers/index.html +517 -0
- package/docs/flow-control/book.md +333 -0
- package/docs/flow-control/fold/index.html +265 -0
- package/docs/flow-control/index.html +548 -0
- package/docs/flow-control/window/index.html +228 -0
- package/docs/guide-plugins-hosts/book.md +957 -0
- package/docs/guide-plugins-hosts/index.html +952 -0
- package/docs/http-workers/book.md +378 -0
- package/docs/http-workers/index.html +515 -0
- package/docs/i18n/book.md +217 -0
- package/docs/i18n/index.html +344 -0
- package/docs/layer-1.md +311 -0
- package/docs/layer-2.md +216 -0
- package/docs/p3-features/README.md +6 -0
- package/docs/p3-features/book.md +478 -0
- package/docs/plugin-authoring.md +276 -0
- package/docs/plugin-model/book.md +186 -0
- package/docs/plugin-model/index.html +310 -0
- package/docs/plugin-primer/book.md +273 -0
- package/docs/plugin-primer/index.html +430 -0
- package/docs/slice-1.md +236 -0
- package/docs/slice-10.md +288 -0
- package/docs/slice-11.md +114 -0
- package/docs/slice-12.md +132 -0
- package/docs/slice-13.md +121 -0
- package/docs/slice-2.md +174 -0
- package/docs/slice-3a.md +296 -0
- package/docs/slice-3b.md +197 -0
- package/docs/slice-4.md +146 -0
- package/docs/slice-4a.md +418 -0
- package/docs/slice-4b.md +208 -0
- package/docs/slice-5.md +281 -0
- package/docs/slice-6a.md +676 -0
- package/docs/slice-6b.md +332 -0
- package/docs/slice-7a.md +130 -0
- package/docs/slice-7b/book.md +608 -0
- package/docs/slice-7b/index.html +842 -0
- package/docs/slice-7b.md +255 -0
- package/docs/slice-7c.md +165 -0
- package/docs/slice-8.md +194 -0
- package/docs/slice-9.md +110 -0
- package/docs/slices.md +241 -0
- package/docs/store/book.md +670 -0
- package/docs/store/index.html +861 -0
- package/docs/store/walkthrough.md +193 -0
- package/docs/theming/book.md +223 -0
- package/docs/theming/index.html +371 -0
- package/docs/tutorial/book.md +2169 -0
- package/docs/tutorial/index.html +2112 -0
- package/docs/tutorial/screens/click-after.png +0 -0
- package/docs/tutorial/screens/click-before.png +0 -0
- package/docs/tutorial/screens/edited.png +0 -0
- package/docs/tutorial/screens/french.png +0 -0
- package/docs/tutorial/screens/harbor.png +0 -0
- package/docs/tutorial/screens/page.png +0 -0
- package/docs/tutorial/screens/traces-ada.png +0 -0
- package/docs/tutorial/screens/traces.png +0 -0
- package/package.json +114 -20
- package/src/delta/README.md +69 -0
- package/dist/cell.d.ts +0 -122
- package/dist/cell.d.ts.map +0 -1
- package/dist/cell.js +0 -356
- package/dist/cell.js.map +0 -1
- package/dist/cluster.d.ts +0 -27
- package/dist/cluster.d.ts.map +0 -1
- package/dist/cluster.js +0 -230
- package/dist/cluster.js.map +0 -1
- package/dist/connection.d.ts +0 -270
- package/dist/connection.d.ts.map +0 -1
- package/dist/connection.js +0 -1216
- package/dist/connection.js.map +0 -1
- package/dist/contract.d.ts +0 -208
- package/dist/contract.d.ts.map +0 -1
- package/dist/contract.js +0 -246
- package/dist/contract.js.map +0 -1
- package/dist/declare.d.ts +0 -33
- package/dist/declare.d.ts.map +0 -1
- package/dist/declare.js +0 -2
- package/dist/declare.js.map +0 -1
- package/dist/errors.d.ts +0 -28
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js +0 -59
- package/dist/errors.js.map +0 -1
- package/dist/host.d.ts +0 -348
- package/dist/host.d.ts.map +0 -1
- package/dist/host.js +0 -1000
- package/dist/host.js.map +0 -1
- package/dist/link.d.ts +0 -107
- package/dist/link.d.ts.map +0 -1
- package/dist/link.js +0 -355
- package/dist/link.js.map +0 -1
- package/dist/loader.d.ts +0 -4
- package/dist/loader.d.ts.map +0 -1
- package/dist/loader.js +0 -73
- package/dist/loader.js.map +0 -1
- package/dist/manager.d.ts +0 -115
- package/dist/manager.d.ts.map +0 -1
- package/dist/manager.js +0 -345
- package/dist/manager.js.map +0 -1
- package/dist/node.d.ts +0 -4
- package/dist/node.d.ts.map +0 -1
- package/dist/node.js +0 -4
- package/dist/node.js.map +0 -1
- package/dist/object.d.ts +0 -438
- package/dist/object.d.ts.map +0 -1
- package/dist/object.js +0 -1571
- package/dist/object.js.map +0 -1
- package/dist/publish.d.ts +0 -5
- package/dist/publish.d.ts.map +0 -1
- package/dist/publish.js +0 -40
- package/dist/publish.js.map +0 -1
- package/dist/registry.d.ts +0 -25
- package/dist/registry.d.ts.map +0 -1
- package/dist/registry.js +0 -6
- package/dist/registry.js.map +0 -1
- package/dist/reload.d.ts +0 -126
- package/dist/reload.d.ts.map +0 -1
- package/dist/reload.js +0 -653
- package/dist/reload.js.map +0 -1
- package/dist/remote.d.ts +0 -165
- package/dist/remote.d.ts.map +0 -1
- package/dist/remote.js +0 -612
- package/dist/remote.js.map +0 -1
- package/dist/schema.d.ts +0 -21
- package/dist/schema.d.ts.map +0 -1
- package/dist/schema.js +0 -228
- package/dist/schema.js.map +0 -1
- package/dist/state.d.ts +0 -92
- package/dist/state.d.ts.map +0 -1
- package/dist/state.js +0 -287
- package/dist/state.js.map +0 -1
- package/dist/types.d.ts +0 -88
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/dist/websocket.d.ts +0 -15
- package/dist/websocket.d.ts.map +0 -1
- package/dist/websocket.js +0 -16
- package/dist/websocket.js.map +0 -1
- package/dist/wire.d.ts +0 -216
- package/dist/wire.d.ts.map +0 -1
- package/dist/wire.js +0 -165
- package/dist/wire.js.map +0 -1
- package/docs/guide.md +0 -814
- package/docs/spec.md +0 -288
- package/docs/tutorial.md +0 -931
package/docs/slice-7b.md
ADDED
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
# Slice 7b: reload in the kernel (spec)
|
|
2
|
+
|
|
3
|
+
Status: **built** (2026-10-29; the rules folded into `design.md` §21, §6, §7, §15, §17, §22, §27). Spec: owner,
|
|
4
|
+
2026-10-29, the brief `slice-7b/` and its six points decided as recommended, decision "Slice 7b's open points, as
|
|
5
|
+
recommended"; decisions of the build, below each section where they apply (owner, 2026-10-29). 7b builds `host.reload` and everything an object, a reference, a job and a
|
|
6
|
+
registry does across it, on one host. Facets are passed in imported (tests import them statically); the bundler and
|
|
7
|
+
the dev loop are slice 7c, the rollout across hosts is the app's.
|
|
8
|
+
|
|
9
|
+
Read in full before writing code: this spec, the brief `slice-7b/book.md` (chapters "One Host Reloads" to "Across
|
|
10
|
+
Hosts"), `dependencies/model.md` (decided; built for 7a, its 7b parts are listed in its status line), `design.md` (§5,
|
|
11
|
+
§6, §9, §14, §15, §17, §21, §22, §27), `decisions.md` (the 2026-10-29 entries; R15, R16, Q10, "The seal fence", "Job runs
|
|
12
|
+
belong to the object", "A native restart drains first", "Slice 8 D1"), `slices.md` (slice 7b's carry-over: every entry
|
|
13
|
+
is in this spec or named as out of scope in §12).
|
|
14
|
+
|
|
15
|
+
## 1. The API
|
|
16
|
+
|
|
17
|
+
```ts
|
|
18
|
+
interface Host<P> {
|
|
19
|
+
load(facets: readonly PluginFacet<P>[], context: Context): Promise<void>; // once, first
|
|
20
|
+
reload(facets: readonly PluginFacet<P>[], context: Context): Promise<ReloadReport>; // after load, any number
|
|
21
|
+
}
|
|
22
|
+
type PluginFacet<P> = { readonly name: string; readonly facet: Facet<P> };
|
|
23
|
+
|
|
24
|
+
type ReloadReport = {
|
|
25
|
+
readonly plugins: { readonly added: readonly string[]; readonly changed: readonly string[]; readonly removed: readonly string[] };
|
|
26
|
+
readonly objects: readonly ReloadedObject[]; // every live, activating, parked or failed object of a reloaded plugin
|
|
27
|
+
};
|
|
28
|
+
type ReloadedObject = { readonly object: string } & (
|
|
29
|
+
| { readonly kind: "swapped" } // pure, in place
|
|
30
|
+
| { readonly kind: "restarted" } // natives: drained, closed (`reload`), activated again
|
|
31
|
+
| { readonly kind: "ended" } // its type is gone
|
|
32
|
+
| { readonly kind: "parked"; readonly cause: FailureCause } // the new code waits for a dependency (decision 4)
|
|
33
|
+
| { readonly kind: "retried" } // it was failed or parked; a new attempt runs on the new code
|
|
34
|
+
);
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
- `facets` is the host's **complete new plugin set**: a plugin in it and not loaded is added; one in it and loaded is
|
|
38
|
+
changed (Chord compares no code), unless its facet is the very same object as the loaded one (`===`): that plugin
|
|
39
|
+
is unchanged, untouched and not in the report (owner, 2026-10-29); one loaded and not in it is removed. The core
|
|
40
|
+
facet is a plugin like the others; base code passes the same facet value every time.
|
|
41
|
+
- `reload` resolves once the commit happened and every object has taken its fate (§4): swaps done, restarts and retries
|
|
42
|
+
started (it does not wait for them to go live; their outcome is in their `ref.state`). It rejects with the code error
|
|
43
|
+
when load or staging fails, and nothing has changed. Reloads are serialized per host (a second call waits for the
|
|
44
|
+
first). Before `load` resolved: throws; after `host.close`: rejects `released/closed`. `context` bounds the reload
|
|
45
|
+
(decision 4: no install watchdog); its abort before the commit rejects `aborted` and changes nothing; after the commit
|
|
46
|
+
it only ends the wait.
|
|
47
|
+
|
|
48
|
+
## 2. Staging (all or nothing; **superseded** 2026-10-30 by "Per plugin at startup and reload": a failing plugin keeps its old code, slice 7c §4)
|
|
49
|
+
|
|
50
|
+
1. **Setups.** Every facet's setup runs into a **staged** table, beside the live one: served types (with their factory,
|
|
51
|
+
options and `bindProvider(contract, options.accepts)`, which runs `checkAccepts`), served registries (provider
|
|
52
|
+
with `compose` and `accepts`), facet contributions. The checks of `load` apply (plugin names, a type or registry
|
|
53
|
+
served twice, a remote type on a host without principal or address).
|
|
54
|
+
2. **Factories.** For every object of a changed or removed plugin's types that exists now (live, activating, parked,
|
|
55
|
+
failed), and whose type is still served: the new factory runs against a **recording `self`**, with the object's
|
|
56
|
+
params (and principal), and declares only: what it opens (`self.open`), the documents and tables it declares with
|
|
57
|
+
their versions, its jobs with their versions, its contributions, its requests. Nothing is activated, bound or
|
|
58
|
+
opened; handles from a recording `self` are inert. This gives each object's fate (§4) before the commit.
|
|
59
|
+
3. **Any throw** (a setup, a factory, `checkAccepts`, a declaration error) rejects `reload` with that error, names the
|
|
60
|
+
plugin (and object), and the host stays entirely on its old code: the staged table is dropped.
|
|
61
|
+
4. **While staging,** the host is **installing** (model §1): a hold that arrives for a type or version that the running
|
|
62
|
+
code does not serve waits `installing` (`loading`) instead of `not_served`/`version`, and is re-evaluated when the
|
|
63
|
+
reload ends, by its commit or its rejection.
|
|
64
|
+
|
|
65
|
+
## 3. The commit (one batch)
|
|
66
|
+
|
|
67
|
+
In one `batch.commit`, synchronous:
|
|
68
|
+
|
|
69
|
+
- The served types table becomes the staged one: added and changed types replace their entries (factory, provider,
|
|
70
|
+
`linger`); removed types are dropped.
|
|
71
|
+
- **Registries** (slice 8 §6): a changed or added plugin's provider replaces the old one (`RegistryRecord.serve` refuses
|
|
72
|
+
a second serve today: it becomes `replace` for a reload); a removed plugin's provider goes (its readers become
|
|
73
|
+
unbound `not_served`); the reloaded plugins' facet contributions replace theirs, by plugin; object contributions stay
|
|
74
|
+
with their objects (they follow the objects' fates); every changed table recomposes once, lazily, as today. The record
|
|
75
|
+
keeps the provider, facet contributions by plugin and object contributions by object apart.
|
|
76
|
+
- **The publication** (model §4): after the batch, the unbound requests waiting for the names the reload serves (types,
|
|
77
|
+
registries, versions) are re-evaluated (`UnboundIndex.wake(names)`, per name: the carry-over "Publications wake per
|
|
78
|
+
name"), refused holds for those names re-run their start, and `installing` holds are re-evaluated against the new
|
|
79
|
+
code.
|
|
80
|
+
- `host.references(Type)` of a removed type is dropped (carry-over from 4b).
|
|
81
|
+
|
|
82
|
+
## 4. Fates
|
|
83
|
+
|
|
84
|
+
Each object of a changed or removed plugin's types takes one fate, decided in staging (design §21, decisions above):
|
|
85
|
+
|
|
86
|
+
| The object | Fate |
|
|
87
|
+
| --- | --- |
|
|
88
|
+
| its type is removed | **ended**: as an object end today (natives close with reason `end`, callers of running calls rejected `released`, handlers drained); its requests are released; its holders' requests become unbound `not_served` (§6) |
|
|
89
|
+
| failed or parked | **retried**: its attempt is replaced by one of the new factory (a parked attempt in one handover: the new requests bind before the old ones are released; the mechanism 7a removed comes back here, carry-over) |
|
|
90
|
+
| live, old and new code open no natives, and no table of the new factory is at a newer version | **swapped** in place (§5) |
|
|
91
|
+
| live, otherwise | **restarted**: new calls park (the gate closes, holders see `loading`), running calls drain (bounded by `closeTimeout`; a call outliving the drain is cut off by the seal fence), the attempt is sealed, natives close (reason `reload`), the new factory's attempt activates (documents stay; eager table migrations run as at activation) |
|
|
92
|
+
| any of the above whose new factory declares a dependency that is not there | **parked** on it (decision 4): the gate stays closed, holders see `loading` or `failed { waiting }`; no overlap of old and new code |
|
|
93
|
+
|
|
94
|
+
- A restarted object gets a new instance id (an old activation chain must not match it, carry-over from 4b); a swapped
|
|
95
|
+
object keeps it; a retried one keeps it, as any retry does (slice 4b; fix round 1, Opus F3).
|
|
96
|
+
- Objects of plugins not in the reload are untouched; their requests to changed types follow §6.
|
|
97
|
+
- Host-lifetime objects of an added plugin start after the commit as at `load` (no barrier: `reload` does not wait for
|
|
98
|
+
first outcomes).
|
|
99
|
+
|
|
100
|
+
## 5. The pure swap
|
|
101
|
+
|
|
102
|
+
A pure swap is not a replacement (decision "The seal fence"): the old attempt is not sealed while its calls run.
|
|
103
|
+
|
|
104
|
+
- **Gate.** For the swap itself the gate closes; new calls park (bounded) until the new attempt is live.
|
|
105
|
+
- **New attempt.** The new factory's attempt is made with the same object: same documents and line (they are the
|
|
106
|
+
object's), same job records. Its requests are made and bound before the old attempt's are released: a request equal
|
|
107
|
+
to an old one (same type, params, principal, version) binds to the same target with no gap. It parks if a new
|
|
108
|
+
dependency is not live (§4, parked). It runs its own steps (no natives by definition: derives, member checks), its
|
|
109
|
+
members re-bind by name (`#rebind` exists: one frame from the last value per member; a member the new variant lacks
|
|
110
|
+
fails `invalid/member`), its contributions replace the old attempt's in the registries in one batch, its routines
|
|
111
|
+
start after the handover (below), its jobs take over the job records (§8).
|
|
112
|
+
- **Old calls.** Running calls finish on the old attempt with its handles valid (their transactions commit) until they
|
|
113
|
+
settle, except R15: an old call touching a document whose version rose throws once (the document intact, the call
|
|
114
|
+
not resent); the same for a table whose version rose (old table handles' version fence, carry-over from 6a: old code
|
|
115
|
+
never issues SQL for a dropped column). Once the old attempt's calls settled, it is sealed and its references are
|
|
116
|
+
released.
|
|
117
|
+
- **Routines** hand over per object: the old attempt's routines are aborted; the new ones start once the old routine
|
|
118
|
+
calls finished, bounded by `closeTimeout` (a stuck one is reported and the new ones start anyway); calls never wait for
|
|
119
|
+
it; each old routine invocation is fenced on its own (carry-over from 6a).
|
|
120
|
+
- **Derives** have no names: exposed derives are matched by member name (references move to the new instance's members, §13
|
|
121
|
+
item 11); internal ones are rebuilt.
|
|
122
|
+
- **In-memory documents** migrate through their definition's `migrate` when the new code declares a higher version
|
|
123
|
+
(6a built the slot version check; carry-over).
|
|
124
|
+
- **`self.writable`** starts at its new initial value (decision 2).
|
|
125
|
+
- **`retryOn`** sources are re-declared by the new factory.
|
|
126
|
+
|
|
127
|
+
## 6. References across a reload
|
|
128
|
+
|
|
129
|
+
**Provider side** (holds this host serves, and bindings on this host):
|
|
130
|
+
|
|
131
|
+
| The reload | A hold or binding |
|
|
132
|
+
| --- | --- |
|
|
133
|
+
| the object is swapped, its version still accepted | kept; re-subscribed through the version's mappings; one `[["r", value]]` per member whose value changed |
|
|
134
|
+
| the object is restarted, version still accepted | kept; `loading`, then a fresh `bound` (a `bound` on a bound hold, which 4a's consumer applies as a re-binding) |
|
|
135
|
+
| the new code no longer accepts the hold's version | unbound `version` (`failed { waiting }`); the object and its other holds stay |
|
|
136
|
+
| the type is removed | unbound `not_served` (`failed { waiting }`) |
|
|
137
|
+
|
|
138
|
+
- **Over a link,** a `failed` on a bound hold unbinds it (model §5): the consumer applies it as `#startOver` plus
|
|
139
|
+
`failed`; the provider detaches the hold's sources, drops its unsent pending ops and a queued `bound`, keeps the ack
|
|
140
|
+
slots of `bound`/`state` messages already sent until their `ack` or the link's loss, and rejects the calls in flight on
|
|
141
|
+
it once. `Hold.moved` and `ProviderSide.unbind` handle bound and binding holds (carry-over from 3a/6a). A served hold
|
|
142
|
+
whose object leaves `live` while its `bound` waits for a slot goes back to pending.
|
|
143
|
+
- **On the same host,** a `Binding` whose target ended by removal becomes unbound and accepts a second `bind` (model
|
|
144
|
+
§5): the reference moves its members to the next object by name (§13 item 11), keyed pins re-pin, parked calls flush or reject, presence lists it again.
|
|
145
|
+
- **The consumer's own reload:** the new factory makes new requests (§5's handover). A reference made by outside code
|
|
146
|
+
(`host.hold`) keeps the token its caller passed; Chord reloads no caller code.
|
|
147
|
+
- **A remote object that leaves `live`** (`RemoteObject.failed` ignores a failure while live today): handled by the
|
|
148
|
+
unbinding above.
|
|
149
|
+
|
|
150
|
+
## 7. Versions in use (`accepts`)
|
|
151
|
+
|
|
152
|
+
- `host.serve(Type, factory, { accepts, linger })`: today every provider is bound with an empty table
|
|
153
|
+
(`bindProvider(contract, {})`); 7b passes `options.accepts`, checked by `checkAccepts` at the setup (a declaration
|
|
154
|
+
error rejects the reload or the load).
|
|
155
|
+
- **Binding an older consumer:** a hold whose version is accepted binds through the mappings of that version (Q10):
|
|
156
|
+
state members through `(current) => old`, served like a derive of the provider's member per object and version
|
|
157
|
+
(adapted bindings get diffs: the last adapted value per object and version, `diffRevisions`, never a whole value per
|
|
158
|
+
commit; §13.11); method calls through
|
|
159
|
+
`checkArgs`: `{ kind: "method", args, result? }` runs the handler and maps the result back with `result`; `{ kind:
|
|
160
|
+
"call", args, call }` runs the provider's replacement (L1 built the check; 7b invokes it). Removed state members with
|
|
161
|
+
`"refuse"` and removed methods with `"refuse"` fail the binding or the call `contract_mismatch`.
|
|
162
|
+
- **Keyed members** are mapped per key (carry-over from 6a), only on `local` contracts.
|
|
163
|
+
|
|
164
|
+
## 8. Jobs across a reload
|
|
165
|
+
|
|
166
|
+
- **Job records** keep the definition of the version their runs were started with; the new attempt's `self.job(Def,
|
|
167
|
+
impl)` at another version no longer throws (`ChordObject.jobRecords` today): the records take the new definition, and
|
|
168
|
+
each run keeps its own version.
|
|
169
|
+
- A run started on an older version and still running finishes on its old code across a pure swap (its invocation keeps
|
|
170
|
+
the old implementation); `finish` runs on the new code with the outcome's args and result mapped forwards through
|
|
171
|
+
`accepts[old]` (once per run); `running` shows its args mapped.
|
|
172
|
+
- No adapter for a run's version, or a run of a newer version (a rollback): the run is `blocked { version }` until a
|
|
173
|
+
reload brings matching code; blocked runs (also `finish_failed` ones) are retried on every reload.
|
|
174
|
+
- A native restart aborts running runs (`aborted { reason: "reload" }`); `finish` runs on the new code.
|
|
175
|
+
- A job the new code no longer declares: its runs are `blocked { version }` (kept, not invoked) until a reload declares
|
|
176
|
+
it again or they are aborted; a persisted run of another version or fingerprint stays blocked with its record as
|
|
177
|
+
stored and is resolved by the reload that brings its version.
|
|
178
|
+
- A `finish` in flight across a reload completes on the code it started with; the next one runs on the new code.
|
|
179
|
+
- A job's fingerprint covers args, result and state: a schema change without a version bump is refused at declaration
|
|
180
|
+
(as documents).
|
|
181
|
+
- An older run's state document migrates through its own `migrate` only once its run settled or moved to the new code
|
|
182
|
+
(the old code keeps writing the version it knows).
|
|
183
|
+
|
|
184
|
+
## 9. Errors, cycles, presence
|
|
185
|
+
|
|
186
|
+
- A broken object of a reloaded plugin is retried (as `ref.retry()`), whatever broke it.
|
|
187
|
+
- Cycles: the walk and chains as today, checked again for the new attempts; `parked_long` unchanged.
|
|
188
|
+
- Presence: holds kept across a swap stay listed; a restart lists them again when they re-bind.
|
|
189
|
+
|
|
190
|
+
## 10. Telemetry and reports
|
|
191
|
+
|
|
192
|
+
`onError` gets what fails after the commit as today (`activation_failed`, `close_failed`, `routine_failed`, …). No new
|
|
193
|
+
`HostError` kind; the report returned by `reload` is the summary.
|
|
194
|
+
|
|
195
|
+
## 11. Tests, examples, cost
|
|
196
|
+
|
|
197
|
+
- One `describe` per mechanism: the API (serialized, before load, after close, abort before and after the commit);
|
|
198
|
+
staging (each kind of throw leaves the host unchanged; recorded declarations decide the fate); the commit (types,
|
|
199
|
+
registries, per-name wakes, `installing` holds); each fate (swap, restart, end, retry, parked, a new dependency
|
|
200
|
+
missing); the swap (old calls on old handles, R15 for documents and tables, the handover of references without a gap,
|
|
201
|
+
member re-binding, routines handed over and fenced, derives, in-memory migrate, a writable back to initial);
|
|
202
|
+
references (each provider-side row over a memory link and through a relay, the window full while unbinding, a
|
|
203
|
+
removed-then-re-served type with a live local dependent and with a remote one); `accepts` (state mapped per object and version as
|
|
204
|
+
diffs, old args mapped, a result mapped back, a replacement `call`, `"refuse"`, keyed members per key); jobs (each
|
|
205
|
+
rule of §8, in memory and persisted); registries (provider replaced, contributions by plugin replaced, a reader of an
|
|
206
|
+
older version); a three-host scenario (server, worker, tab) reloaded in the app's order, as an example's test.
|
|
207
|
+
- Examples: `33-reload.ts` (a pure swap, a restart and a removal, with old calls and holders shown) and `34-versions.ts`
|
|
208
|
+
(a contract and a job at v2 with `accepts`, an old tab and an old run carried across).
|
|
209
|
+
- Benchmarks: the hot paths against HEAD (calls, commits through a watched derive, activation, links) within the bar;
|
|
210
|
+
plus a reload benchmark (one plugin of 20 reloaded on a host with 1,000 live objects, swap and restart) reported in
|
|
211
|
+
`benchmarks.md`.
|
|
212
|
+
- GC tests: an old attempt and its closures collected after its calls settled; a removed type's objects, providers
|
|
213
|
+
and registry entries collected; an old facet's code collected after a reload (the precondition for loader D).
|
|
214
|
+
|
|
215
|
+
## 12. Out of scope
|
|
216
|
+
|
|
217
|
+
Slice 7c: the bundler and loader (`chord/loader`), the dev loop (`chord/dev`), plugin discovery and npm
|
|
218
|
+
dependencies. The app: the rollout across hosts (decision 3: it calls `host.reload` per host in order). Slices 10 and
|
|
219
|
+
11: the app kit. `rebuild` of tables (key or column-type changes): only if a case needs it (carry-over stays).
|
|
220
|
+
|
|
221
|
+
## 13. Decisions of the build (owner, 2026-10-29; 11 is the builder's, reported for review)
|
|
222
|
+
|
|
223
|
+
1. An object of a reloaded plugin that is activating but not parked (its own steps), or waiting for its backoff, is
|
|
224
|
+
`retried` (an activating attempt sealed, its natives closed `reload`).
|
|
225
|
+
2. The report's `parked` is for swaps and retries whose new attempt's first dependency check is not live (`reload`
|
|
226
|
+
waits for that check, not for live); restarts are reported `restarted` at once (their check follows the drain). A
|
|
227
|
+
blocker that is only loading gives the cause `waiting` "waiting for X: X is loading".
|
|
228
|
+
3. A swapped-out attempt is sealed once its running calls settled (bounded by `closeTimeout`, `drain_timeout`) and
|
|
229
|
+
the swap ended; its references are released then. Its job invocations finish on their old code. Retiring
|
|
230
|
+
attempts are bounded by `closeTimeout` each; a later swap does not wait for them (several may retire at once after
|
|
231
|
+
quick reloads), a restart, an end and the host's close do (an end rejects their callers at once). (Fix round 1:
|
|
232
|
+
Fable, Opus F1.)
|
|
233
|
+
4. A stuck old routine call past the handover is reported `drain_timeout`; the old attempt's routine calls share one
|
|
234
|
+
fence token, sealed when the new routines start.
|
|
235
|
+
5. A swap whose new factory picks another variant sends its holds a fresh `bound`; so does one after which a hold's
|
|
236
|
+
version is an older one (adapted members).
|
|
237
|
+
6. A native restart: in-memory runs end `aborted { reason: "reload" }` and finish on the new code; persisted runs
|
|
238
|
+
follow 6b R3 (a seal while the object continues is a clean stop): written back stopped, resumed per `resume` by the
|
|
239
|
+
new attempt without counting a restart.
|
|
240
|
+
7. Staging is synchronous; `installing` is built and tested from inside a staged factory.
|
|
241
|
+
8. ~~A removed object's member sources and pinned keys are frozen and handed over to the next object of its identity.~~
|
|
242
|
+
**Superseded** (owner, 2026-10-29, decision "References are the only indirection"): references keep their last
|
|
243
|
+
values while unbound and move their subscriptions to the next object; nothing is handed between objects.
|
|
244
|
+
9. A loaded plugin passed as the same facet object is unchanged (§1).
|
|
245
|
+
10. Keyed members' versions (§7) are built with L1's keyed edits (`keyed`, `addKeyed`, `removeKeyed`) and an accepts
|
|
246
|
+
section `keyed: { member: (current) => old | "refuse" }` (removed ones: `"refuse"`).
|
|
247
|
+
11. Adapted state members are shared per object instance and version (not per binding): one cached value and one diff
|
|
248
|
+
per commit for every consumer of a version; each hold encodes its own ops. Fix rounds 1 to 7 built sources owned by
|
|
249
|
+
(identity, version) that outlived their object and moved to the next one (`host/handover.ts`), and kept finding
|
|
250
|
+
edge cases in that hand-over. **Replaced** (owner, 2026-10-29, decision "References are the only indirection"): a
|
|
251
|
+
consumer's watches and derives attach through the reference's member, which passes them straight to the object's
|
|
252
|
+
own document or derive and moves them when the reference's target changes (one frame); while unbound the reference
|
|
253
|
+
keeps its last values (watches get one `failed` call); an older consumer attaches to the instance's shared mapping
|
|
254
|
+
for its version (made on first use, dropped when no reference of the version is left, gone with the instance).
|
|
255
|
+
Nothing outlives its object instance.
|
package/docs/slice-7c.md
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# Slice 7c: plugins (spec)
|
|
2
|
+
|
|
3
|
+
Status: **ready to build** (owner, 2026-10-30: decisions "Slice 7c's points" and "Per plugin at startup and reload";
|
|
4
|
+
spec reviews by Fable and Opus, `/tmp/s7c-spec-review-{fable,opus}.md`, folded in). 7c builds `chord/plugins`: the
|
|
5
|
+
code that turns plugin directories into facets, loads and reloads them per plugin, and watches them. A Chord app is
|
|
6
|
+
self-modifying (the owner or an agent edits a plugin while it runs), so this is core machinery, not a dev tool (no
|
|
7
|
+
dev/prod split). It also changes the kernel's `load` and `reload` to per-plugin failure (§4). HTTP and workers are slice
|
|
8
|
+
10, the web page host and the TUI slice 11: 7c builds scripts for every surface and evaluates them on Node; its build
|
|
9
|
+
results are plain data those slices ship.
|
|
10
|
+
|
|
11
|
+
Read in full before writing code: this spec; `decisions.md` (2026-10-29/30: "Slice 7b's open points, as recommended",
|
|
12
|
+
"A plugin's npm dependencies are bundled", "Per plugin at startup and reload", "Slice 7c's points"); `design.md` (§3
|
|
13
|
+
`load`/`reload`, §16, §18, §21 in full); the 7b brief `slice-7b/book.md` (chapters "A Plugin, File by File", "Building
|
|
14
|
+
and Loading", "Assets and Files", "Performance", "A Mini p2 from Chord"); the two spec reviews; p2's
|
|
15
|
+
`apps/p2/src/hosts/{bundles,plugins}.ts` and `apps/p2/docs/plugin-loading.md` §4.1, §7.1, §8, §9, §14; coding-agent's
|
|
16
|
+
`packages/coding-agent/src/core/package-manager.ts` (dependency installs). Code lives in
|
|
17
|
+
`packages/chord/src/node/plugins/` (Node-only: `fs`, esbuild, `vm`; the kernel stays portable),
|
|
18
|
+
exported as `./next/plugins` when v2 gets its entry point; until then tests import the source.
|
|
19
|
+
|
|
20
|
+
## 1. A plugin on disk
|
|
21
|
+
|
|
22
|
+
```text
|
|
23
|
+
plugins/notes/
|
|
24
|
+
package.json "name": the plugin's name (required, npm style); "dependencies": bundled; "peerDependencies":
|
|
25
|
+
host packages; "chord": { "external": ["better-sqlite3"] } (optional, Node facets only)
|
|
26
|
+
server.ts worker.ts web.tsx tui.ts one file per facet kind the app names; default export: a facet
|
|
27
|
+
contract.ts store.ts NoteList.tsx notes.css assets/… plain files
|
|
28
|
+
node_modules/ its own npm dependencies (`installDependencies`)
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
- The plugin's name is its `package.json` `name`, never the directory name. A directory without a `package.json`, or
|
|
32
|
+
with an invalid name, is reported, not a plugin.
|
|
33
|
+
- Facet kinds are the app's (`["server", "worker", "web", "tui"]` in p3), each `.ts`, `.tsx`, `.js` or `.mjs`; two
|
|
34
|
+
files of one kind are reported (not chosen by extension). A plugin with none of the kinds (contracts only) is a
|
|
35
|
+
plugin with no facets: imported by others, never loaded.
|
|
36
|
+
- Discovery lists each root one level deep, reads only `package.json`, follows symlinks to their real paths, and keeps
|
|
37
|
+
the first root's plugin of a duplicate name (the other reported).
|
|
38
|
+
|
|
39
|
+
## 2. Building
|
|
40
|
+
|
|
41
|
+
```ts
|
|
42
|
+
const plugins = await discoverPlugins(["./plugins", join(dataDir, "plugins")], { kinds: KINDS }, ctx);
|
|
43
|
+
const built = await buildFacet(plugins[0], "worker", { hostPackages: HOST_NAMES, platform: "node" }, ctx);
|
|
44
|
+
// { kind: "script", plugin, facet: "worker", source, digest, inputs: [{ file, hash }], copied: [file],
|
|
45
|
+
// css?: { name, text }, assets: [{ name, bytes }] } | { kind: "failed", plugin, facet, errors }
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
One esbuild build per (plugin, kind), from cold (no kept contexts: about 10 ms per facet; p2 measured 237 ms for 25
|
|
49
|
+
worker facets). A failed build is a result, never a throw. The result is plain data (strings, bytes, arrays): the same
|
|
50
|
+
value a worker (slice 10) or a page (slice 11) evaluates where it runs.
|
|
51
|
+
|
|
52
|
+
| An import of | Becomes |
|
|
53
|
+
| --- | --- |
|
|
54
|
+
| the plugin's own files | inlined |
|
|
55
|
+
| a file of another discovered plugin (`../sessions/contract.ts`) | inlined (a copy), listed in `copied`; it may import only host packages and files of its own plugin, never packages (a build error otherwise): contracts and side-effect-free modules only (decision 4) |
|
|
56
|
+
| a package in the plugin's `dependencies` | inlined from its `node_modules` |
|
|
57
|
+
| a package in `chord.external` (Node builds) | external, `require`d at evaluation from the plugin's `node_modules`; a browser build fails |
|
|
58
|
+
| a host package (`options.hostPackages`, e.g. `@earendil-works/chord`, `react`, `react/jsx-runtime`, `@app/core`) | external, from the map at evaluation |
|
|
59
|
+
| `@earendil-works/chord/plugins` | external always (its `pluginFile` is per facet, §3) |
|
|
60
|
+
| a Node builtin (`node:fs`, `fs`) | external (Node builds); a browser build fails |
|
|
61
|
+
| CSS (browser builds) | one stylesheet per facet (`css`) |
|
|
62
|
+
| an asset (`import url from "./icon.svg?url"`, `.wasm`, browser builds) | a content-hashed file in `assets`; the import is its URL under the app's `options.publicPath` |
|
|
63
|
+
| `import.meta.url`, `__dirname`, `__filename`, a literal dynamic `import("x")`, top-level `await` | a build error pointing to `pluginFile` (§3); a computed `import(x)` cannot be seen at build and fails when it runs, through the facet's `require` naming the facet |
|
|
64
|
+
| anything else (a relative path into base code, a package not in `dependencies`) | a build error naming the file and the rule |
|
|
65
|
+
|
|
66
|
+
- Output: `format: "cjs"`, wrapped `(function (require, module, exports) { … })`; TypeScript stripped, JSX automatic
|
|
67
|
+
(`react/jsx-runtime`); no type check; minified; an inline source map whose `sources` are relative to the plugin's
|
|
68
|
+
directory (so the script and its `digest`, a hash of the source, are the same on every machine and checkout).
|
|
69
|
+
- `inputs` are captured where esbuild loads each file (an `onLoad` that hashes the exact bytes it hands esbuild, as p2's
|
|
70
|
+
`captureBundleInputs`; the metafile has no hashes), absolute paths, for the watcher.
|
|
71
|
+
|
|
72
|
+
## 3. Evaluating (Node)
|
|
73
|
+
|
|
74
|
+
```ts
|
|
75
|
+
const facet = evaluateFacet(built, { hostPackages: HOST, plugin }); // returns the facet, or throws its error
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
- `vm.Script` under a stable filename per (plugin, kind, digest), path-like (`/chord-plugins/@pi/notes/worker.ts`
|
|
79
|
+
plus the digest), run in this context; the default export, checked to be a facet (a declaration error otherwise).
|
|
80
|
+
- **The `require` it passes answers, in order:** the host-package map (each value is what Node's `require` would give:
|
|
81
|
+
a CommonJS package's exports, an ESM package's namespace wrapped once with `__esModule: true`, so default and named
|
|
82
|
+
imports both work); `@earendil-works/chord/plugins` → `{ pluginFile }` bound to this plugin's directory;
|
|
83
|
+
`chord.external` packages and Node builtins through `createRequire(join(plugin.dir, "package.json"))`; anything else
|
|
84
|
+
throws naming the facet.
|
|
85
|
+
- **`pluginFile(path)`** gives the absolute path of a file inside the plugin's directory; `..` out of it is refused.
|
|
86
|
+
- **No module map, no cache:** an old facet's closures are collected once nothing holds them. The component turns V8's
|
|
87
|
+
compilation cache off when it is created (`v8.setFlagsFromString("--no-compilation-cache")`, once per process; an
|
|
88
|
+
app may pass the flag itself).
|
|
89
|
+
- **Stack traces** (decision Q1 (b)): `mapStack(error)` returns the error's stack with plugin scripts' positions mapped
|
|
90
|
+
through their source maps (a `module.SourceMap` per evaluated script, kept while the script is) to `notes/worker.ts:12`;
|
|
91
|
+
the app's reporters call it. Nothing global (no `Error.prepareStackTrace`, no process-wide source-map switch).
|
|
92
|
+
|
|
93
|
+
## 4. Loading and reloading, per plugin (kernel change)
|
|
94
|
+
|
|
95
|
+
Decision "Per plugin at startup and reload" changes `host.load` and `host.reload` (slice 7b) and the component's
|
|
96
|
+
`load`/`reload` helpers:
|
|
97
|
+
|
|
98
|
+
- **`host.load(facets, ctx)`** resolves with `{ failed: [{ plugin, error }] }`: a plugin whose setup throws (or that is
|
|
99
|
+
refused at declaration: invalid name, a type or registry served twice, a remote type on a host without principal or
|
|
100
|
+
address, `checkAccepts`) is left out and reported; the others publish; its consumers wait `failed { waiting }`. `load`
|
|
101
|
+
never closes the host for a plugin (base code decides whether its core failing is fatal). A plugin left out is
|
|
102
|
+
loaded by the next reload after an edit rebuilt it (it is dirty).
|
|
103
|
+
- **`host.reload(facets, ctx)`**: staging per plugin. A plugin whose new code fails in staging (setup, a factory against
|
|
104
|
+
the recording `self`, a declaration error, `checkAccepts`) keeps its loaded facet (as if passed unchanged), and
|
|
105
|
+
staging runs again without its new code. **The closure rule:** a changed plugin whose recorded requests (staging
|
|
106
|
+
records them, for its existing objects, with their contract versions) would not bind (the same check as a real
|
|
107
|
+
bind, the provider's host address included) because the plugin they need was kept old, or because nobody serves the
|
|
108
|
+
name while any plugin of this reload failed (a failed new setup may be what would have served it: owner, 2026-10-30,
|
|
109
|
+
"keep"), is kept old too (repeat until stable). The report gains `failed: [{ plugin, error }]` (the same list as `load`'s; an added plugin that fails is left out); the commit applies the rest.
|
|
110
|
+
- **The component** builds and evaluates per plugin: a plugin whose build fails or whose evaluation throws is passed to
|
|
111
|
+
the host as its loaded facet at a reload, with `reload(facets, context, { failed })` naming it (the host applies the
|
|
112
|
+
closure rule to it and lists it in `failed`), left out at startup and reported with the host's report.
|
|
113
|
+
`plugins.load(host, ctx)` and `plugins.reload(host, names, ctx)` keep, per host, the facet loaded for every plugin, so
|
|
114
|
+
`reload` always passes the complete set (unchanged plugins as the same facet object, removed ones left out) and never
|
|
115
|
+
restarts an unchanged plugin.
|
|
116
|
+
|
|
117
|
+
## 5. Watching and rollout
|
|
118
|
+
|
|
119
|
+
```ts
|
|
120
|
+
const plugins = createPlugins({ roots: ["./plugins"], kinds: KINDS, hostPackages: HOST, base: ["./src"] }, ctx);
|
|
121
|
+
plugins.state // a JSON watchable: { dirty: ["@pi/notes"], install: ["@pi/notes"], set: false, base: false }
|
|
122
|
+
const next = await plugins.build(["@pi/notes"], ctx); // built results per (plugin, kind), plain data
|
|
123
|
+
await rollout([serverStep, ...workerSteps, ...clientSteps], next, ctx); // the app's order (decision 3)
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
- **The watcher** (`fs.watch` recursive over roots and `base`) ignores `node_modules` and `.git`. A changed file marks
|
|
127
|
+
dirty every plugin whose facets used it (`inputs`; a copied contract dirties every user) or whose directory contains
|
|
128
|
+
it; a changed `package.json` marks `install`; a plugin directory added or removed sets `set` (discovery runs again
|
|
129
|
+
at the next build); a file under `base` sets `base` (the app restarts its hosts; Chord restarts nothing). A change
|
|
130
|
+
during a build keeps its mark. If the watcher cannot watch (the system's limit), it reports once and the app builds
|
|
131
|
+
on demand. It marks, never applies.
|
|
132
|
+
- **`installDependencies(plugin, ctx)`**: `npm install --omit=dev --legacy-peer-deps --ignore-scripts --no-audit
|
|
133
|
+
--no-fund` in the plugin's real directory, the command overridable (decision 3); it clears `install`.
|
|
134
|
+
- **`rollout(steps, built, ctx)`**: each step is `{ name, kinds, reload(built, ctx) }` and returns the host's report;
|
|
135
|
+
steps run in order; a step's `reload` evaluates the facets of its kinds where its host runs (an in-process step through
|
|
136
|
+
the component's per-host state, §4; a remote one, slice 10/11, gets the built data). It stops at a step that rejects
|
|
137
|
+
(a host closed, an abort); kept plugins do not stop it. Marks clear for plugins applied on every step; a plugin kept
|
|
138
|
+
on any host stays dirty.
|
|
139
|
+
|
|
140
|
+
## 6. Not in 7c
|
|
141
|
+
|
|
142
|
+
Installing plugins from npm or git (p2 §8), project plugins with trust and snapshots (design §26 #14), a base bundle per
|
|
143
|
+
surface, evaluating in a browser (slice 11), shipping built scripts to workers and pages (slices 10, 11), static checks
|
|
144
|
+
of cross-plugin imports beyond §2's rule.
|
|
145
|
+
|
|
146
|
+
## 7. Tests, examples, cost
|
|
147
|
+
|
|
148
|
+
- One test file per source file; fixture plugins under `test/node/fixtures/plugins/`. Discovery (names, duplicates,
|
|
149
|
+
missing or invalid `package.json`, two files of a kind, contracts-only plugins, symlinks); build (every row of §2's
|
|
150
|
+
table, failures as results, relative source maps and stable digests across two checkout paths, inputs hashed at
|
|
151
|
+
load); evaluation (host packages as the host's instances: `instanceof ChordError` across a plugin; default and named
|
|
152
|
+
imports of ESM and CommonJS host packages; `pluginFile` and its `..` refusal; an import-time throw; a non-facet
|
|
153
|
+
export); `mapStack` naming plugin files and lines; per plugin at startup and reload (§4: a failing setup, factory,
|
|
154
|
+
declaration, build, evaluation; the closure rule with a provider and consumer changed together; the report's `failed`
|
|
155
|
+
and `failed`; `load` never closing the host); the watcher (dirty marks from inputs and directories, `install`, `set`,
|
|
156
|
+
`base`, a change during a build, `node_modules` ignored); `rollout` (order, stopping at a rejecting step, marks).
|
|
157
|
+
- **GC:** 200 reloads of an evaluated plugin facet: old closures collected, heap flat after warm-up.
|
|
158
|
+
- **End to end:** a server and a worker (memory links) loading plugin directories, a plugin edited on disk, built and
|
|
159
|
+
rolled out (server, then worker), a holder seeing one frame; a broken edit kept old on both hosts and reported.
|
|
160
|
+
- Examples (owner, 2026-10-30: full coverage, each a folder `NN-topic/` with the hosts in `main.ts` and real plugin
|
|
161
|
+
directories under `plugins/`): `35-plugins` (load, edit, build, rollout), `36-plugin-failures` (per plugin at startup
|
|
162
|
+
and reload, the closure rule, an abort after the commit), `37-plugin-imports` (copied contracts, dependencies,
|
|
163
|
+
`chord.external`, host packages, `pluginFile`, the refusals), `38-watch-and-rollout` (the marks, plugins added and
|
|
164
|
+
removed, a stopped rollout), `39-browser-build` (CSS, assets, the built result as plain data). Benchmark (`benchmarks.md`): cold build of a 20-plugin set, a rebuild of one facet,
|
|
165
|
+
evaluation per facet, heap after 100 reloads.
|
package/docs/slice-8.md
ADDED
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
# Slice 8: registries and `host.root` (spec)
|
|
2
|
+
|
|
3
|
+
Status: **built** (2026-10-28; build review and two fix rounds by the same four reviewers,
|
|
4
|
+
`/tmp/s8-build-review-*.md`, `/tmp/s8-build-rereview-*.md`). Before: ready to build (2026-10-27; D1-D3, the registry failures and S1-S3 decided by the owner; two spec reviews,
|
|
5
|
+
`/tmp/s8-review{,2}-{astra,fable,opus,sol}.md`, found no remaining blocker; S3 refined after the second: with no value
|
|
6
|
+
after `load`, a reader fails at once, as `self.get` of a type not served here)
|
|
7
|
+
|
|
8
|
+
8 builds the extension point between plugins (registries), in-process values that change (`self.writable`), wake
|
|
9
|
+
signals for failed objects (`retryOn`), and the call scope for code outside objects (`host.root`). The harness object
|
|
10
|
+
is p3's base code; Chord shows it only in an example.
|
|
11
|
+
|
|
12
|
+
## What an app can do after this slice
|
|
13
|
+
|
|
14
|
+
```ts
|
|
15
|
+
// the defining plugin (e.g. http): the token, exported for other plugins
|
|
16
|
+
export const Http = defineRegistry<HttpContribution, Router>("chord.http", { version: 2 }); // shared: identity only
|
|
17
|
+
export default defineFacet((host, self) => {
|
|
18
|
+
host.serve(Http, { // the one provider (Q8), as for object types
|
|
19
|
+
compose: (table, { report }) => buildRouter(table, report), // pure; always a value; conflicts reported
|
|
20
|
+
accepts: { 1: { contribution: (old: HttpContributionV1) => upgrade(old), value: (router) => routerV1(router) } },
|
|
21
|
+
});
|
|
22
|
+
host.serve(HttpServer, (_, self) => {
|
|
23
|
+
const router = self.registry(Http); // a NativeWatchable of the composed value
|
|
24
|
+
self.on(router, ({ value }, ctx) => …);
|
|
25
|
+
return { … };
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
// any plugin: a facet or a host-lifetime object contributes one value per registry
|
|
30
|
+
export default defineFacet((host, self) => {
|
|
31
|
+
self.contribute(Http, { routes: { "GET /notes/export": exportNotes } });
|
|
32
|
+
});
|
|
33
|
+
host.serve(McpStore, (_, self) => { // local, empty params (R21)
|
|
34
|
+
const ext = self.writable(mcpExtension([])); // an in-process value that changes
|
|
35
|
+
self.contribute(HarnessExtensions, ext);
|
|
36
|
+
self.on(mcp.tools, ({ value: tools }) => ext.set(mcpExtension(tools)));
|
|
37
|
+
self.retryOn(self.registry(HarnessModels)); // a model contribution wakes a failed attempt
|
|
38
|
+
return {};
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
// code outside objects (a Durable tool, a CLI): a call scope
|
|
42
|
+
await host.root(async (ctx) => (await ctx.get(Notes, { session })).add(note, ctx), context);
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## 1. Registries
|
|
46
|
+
|
|
47
|
+
- **Token and provider (D1, owner, 2026-10-27):** the token `defineRegistry<C, V>(name, { version })` is shared, as a
|
|
48
|
+
contract: its name (as types, `[a-z0-9@/._~-]`), the contribution type `C`, the composed value type `V`, and the
|
|
49
|
+
version the bundling plugin was built against. The defining plugin's facet provides it with `host.serve(R, {
|
|
50
|
+
compose, accepts? })`, as it serves object types (adapters with the provider, never in the shared token, as
|
|
51
|
+
`checkAccepts` for contracts); a second serve on a host is refused; a reload replaces it (slice 7).
|
|
52
|
+
|
|
53
|
+
- **Contributors** (R21): facets (by plugin name) and host-lifetime objects (`local`, empty params: by plugin name and
|
|
54
|
+
type), at most one value per registry each; `self.contribute(R, value | Watchable | NativeWatchable)` in a facet setup
|
|
55
|
+
or such an object's factory (a type error elsewhere; a declaration error at runtime). A facet's contribution is in the
|
|
56
|
+
table while its plugin is loaded; an object's from `live` until it ends, fails or restarts.
|
|
57
|
+
- **The table:** an immutable list of `{ contributor, plugin, value }`, sorted by plugin name, then type (never load
|
|
58
|
+
order); a contribution carries its token's version: an older one is adapted once with the declaration's `accepts`
|
|
59
|
+
when the table is built, an older one without an adapter or a newer one is left out and reported (`HostError`
|
|
60
|
+
`contribution_refused { registry, plugin, version }`).
|
|
61
|
+
- **Contributions:** a plain value, or a Chord watchable (a `writable`, a derive, a document member; another
|
|
62
|
+
registry's value too, a cycle of registries reading each other refused when the second one serves or contributes (superseded by audit A2: caught at the first composition by the runtime guard, reported `contribution_failed`)), followed as a dependent of the table (its change recomposes), recognised by Chord's own mark; anything
|
|
63
|
+
else is a plain value, whatever methods it has (a harness, a conversation handle or a runtime is contributed as a plain
|
|
64
|
+
value, not followed; build review 2026-10-27, replacing "a foreign watchable is refused"). The table's entry is `{ plugin, type?, version, value }` (`type` for
|
|
65
|
+
an object contributor; served types carry their plugin's name).
|
|
66
|
+
- **`compose(table, { report })`:** pure, lazy as a derive: the registry's value is marked when its table changes (a
|
|
67
|
+
contributor goes live or ends, a watchable contribution changes) and composed when read or, while watched, in the
|
|
68
|
+
owner's flush (W4: never by another owner's adoption itself; the flush after a commit step is where it runs). The first
|
|
69
|
+
composition happens at the serve: the facets' setups of one `load` serve and contribute, then every served registry
|
|
70
|
+
composes once in one batch at the end of the setups (an empty table composes too), so a served registry always has
|
|
71
|
+
a value before any object activates. `report(conflict)` goes to `onError` as `registry_conflict { registry, message,
|
|
72
|
+
plugins }`, once per conflict episode.
|
|
73
|
+
- **Failures (owner, 2026-10-27):** contributions never fail the registry. A contribution that is a watchable and fails
|
|
74
|
+
is left out of the table and reported (`contribution_failed { registry, plugin, error }`), the table recomposes without
|
|
75
|
+
it, and it is back once it heals. A `compose` that throws (the owner's bug) is reported (`registry_failed { registry,
|
|
76
|
+
error }`), the composed value's watches get a `failed` call, and `.value` keeps the last good composition (an extension
|
|
77
|
+
point stays available; derives keep their own rule, `.value` throwing while failed); the next good composition
|
|
78
|
+
replaces it. Before any good composition `.value` throws the error.
|
|
79
|
+
- **Without a provider** (the defining plugin is not loaded): the registry has no value; contributions wait in the
|
|
80
|
+
table; its serve composes it.
|
|
81
|
+
- **Reading is a dependency (S3, owner, 2026-10-27: "isn't self.registry meant to wait like self.get?"):**
|
|
82
|
+
`self.registry(R)` in a factory declares the registry as a dependency of the attempt, as `self.get`: activation waits
|
|
83
|
+
until it has a value; once `load`'s setups ran, a registry with no value cannot get one before a reload (a provider
|
|
84
|
+
comes only with a plugin), so a reader then fails at once `transient` with `unavailable/undeclared` as the
|
|
85
|
+
dependency's cause (as `self.get` of a type not served here fails at once, and the start barrier waits for no
|
|
86
|
+
contribution) and is retried the moment the registry gets its first value (R18); a first `compose` that throws fails
|
|
87
|
+
its readers the same way. It returns a `RegistryValue<V>` (a native source: a derive source, an `on` source, a `retryOn` source; never a
|
|
88
|
+
state member); methods and routines read `.value` at use. Once the object is live, a later failure of the registry
|
|
89
|
+
(a throwing `compose`) changes nothing for it: `.value` keeps the last good composition. Code outside objects:
|
|
90
|
+
`await host.registry(R, ctx)` waits the same way.
|
|
91
|
+
- **Older readers (S2, owner, 2026-10-27):** a reader whose bundled token has an older version than the provider's gets
|
|
92
|
+
the composed value mapped back with `accepts[old].value` (computed once per composition and version, while such a
|
|
93
|
+
reader exists); without that mapping, or for a reader newer than the provider, its dependency fails
|
|
94
|
+
`contract_mismatch` (reported). `accepts: { [old]: { contribution?: (old) => current, value?: (current) => old } }`.
|
|
95
|
+
Adapters are the provider's code, guarded as `compose`: a `contribution` adapter that throws leaves that contribution
|
|
96
|
+
out (reported `contribution_failed`); a `value` adapter that throws fails only that version's value, by the rules of a
|
|
97
|
+
throwing `compose` (its readers keep the last good mapped value; before any, a reader of that version waiting at
|
|
98
|
+
activation fails `transient`, retried when a mapped value arrives); current readers are never affected.
|
|
99
|
+
- **Helpers:** `keyed(table, entriesOf, report)` (a map, a duplicate key reported through `report`, the first by plugin
|
|
100
|
+
name wins) and
|
|
101
|
+
`ordered(table, itemsOf, orderOf?)`.
|
|
102
|
+
- **Use sites guard contributions** (Q8): Chord's helpers keep each entry's plugin name; the guide shows catching a
|
|
103
|
+
contribution's throws and rejections, reporting the plugin, and continuing.
|
|
104
|
+
- **Registries carry natives** (design §17): a contribution may be any in-process value; an entry lives exactly as long
|
|
105
|
+
as its contributor.
|
|
106
|
+
|
|
107
|
+
## 2. `self.writable(initial)` and native sources
|
|
108
|
+
|
|
109
|
+
A `NativeWatchable<T>` with `set(value)` (identity compared: `set` of the same value notifies nobody; a new value is a
|
|
110
|
+
new frame), owned by the attempt (dropped with it; `set` after the attempt's seal throws `released`); never a state
|
|
111
|
+
member; usable as a contribution, a derive source and an `on` source. `set` inside a batch marks it there; outside, it
|
|
112
|
+
opens its own batch. `writable`, `RegistryValue` and `ref.state` (a `NativeWatchable` since slice 3b, until now not derivable: design audit,
|
|
113
|
+
2026-10-27) are native sources: one base (`NativeSource`) the batch marks and derives depend on; `self.derive` takes JSON and native sources (its type and the source resolver widen), while the
|
|
114
|
+
member check still refuses a native as a state member.
|
|
115
|
+
|
|
116
|
+
## 3. `self.retryOn(...sources)`
|
|
117
|
+
|
|
118
|
+
In any object's factory, anywhere: Chord follows each source with watches owned by the object (under its context,
|
|
119
|
+
replaced by each attempt's declaration, stopped at the object's end; GC-tested), installed right after the factory
|
|
120
|
+
returns, before natives open, so a failed open still has them; a `value` call of a source while the object is failed
|
|
121
|
+
(`transient` or `broken`) retries it as `ref.retry()` does (backoff skipped, an attempt now, holders told `loading`);
|
|
122
|
+
a call while it activates is remembered and retries it at once if that attempt fails (decision S1); ignored while live. Sources
|
|
123
|
+
are those that live independently of the attempt: a `RegistryValue`, `constant`; anything else (a reference's member,
|
|
124
|
+
a `writable` of the same attempt) is refused at runtime (declaration policy; TypeScript cannot tell them apart).
|
|
125
|
+
|
|
126
|
+
**Which calls retry (D2, owner, 2026-10-27):** only `value` calls: a new value of a source wakes a failed object; a
|
|
127
|
+
`failed` call (a throwing `compose`) does nothing, its next good composition retries.
|
|
128
|
+
|
|
129
|
+
## 4. `host.root(fn, context, options?)`
|
|
130
|
+
|
|
131
|
+
**Signature and guarantees (D3, owner, 2026-10-27; design §26 #25):** `host.root<T>(fn: (ctx: Ctx) => Promise<T>,
|
|
132
|
+
context: Context, options?: { principal?: P }): Promise<T>`. `fn` gets a call context like a handler's: the host's
|
|
133
|
+
principal (or `options.principal`, a trusted same-host caller's choice, as base code acting for an authenticated
|
|
134
|
+
user), this host's incarnation, `context`'s telemetry and abort signal linked until `fn` settles
|
|
135
|
+
(`withLinkedAbortSignal`), and `ctx.get`. When `fn` settles or `context` aborts, the call context is sealed:
|
|
136
|
+
`ctx.abortSignal` aborted, `ctx.get` rejects `released`, every reference it took released (their calls reject
|
|
137
|
+
`released`, their watches end), so an uncooperative `fn` fails at its next use of Chord, as a handler after its caller
|
|
138
|
+
cancelled; work outside Chord runs on until then. `ctx.get` before `load` resolved parks like any reference;
|
|
139
|
+
`host.close` seals every open root scope (the host keeps them), so an `fn` waiting in `sleep(ms, ctx)` ends; `host.root`
|
|
140
|
+
after `host.close` rejects `released`. No span of its own until slice 9.
|
|
141
|
+
|
|
142
|
+
- `chord(fn, context)` is p3's helper over `host.root` (design §24); Chord ships none.
|
|
143
|
+
|
|
144
|
+
## 5. Durable on registries (examples, p3's pattern)
|
|
145
|
+
|
|
146
|
+
- Durable's `HarnessOptions.registry` takes a `RegistryReader` (`snapshot()`, `subscribe(listener)`, the listener
|
|
147
|
+
called synchronously after every publication). A `RegistryValue` offers a synchronous observer of its compositions
|
|
148
|
+
(`observe(observer, ctx)`, as Durable's `observeXXX`: `advance` inside the flush that composed, record only; an
|
|
149
|
+
attached observer counts as watching, so the lazy compose runs for it); Durable's
|
|
150
|
+
`registryReader(value)` (in its `src`) reads `.value` in `snapshot()` and forwards `observe` to `subscribe`. The
|
|
151
|
+
harness object declares the extensions registry with `self.registry(...)`, so it activates (and opens Durable) only
|
|
152
|
+
once the registry has a value. p3's `compose` builds Durable's snapshot without throwing (a duplicate task name is
|
|
153
|
+
reported and the later extension left out).
|
|
154
|
+
- **Durable's views from other objects** (carry-over from 6b): the object that opens Durable contributes its harness to
|
|
155
|
+
a registry (`HarnessRegistry`, p3's); another object declares it in its factory and follows a view through its value:
|
|
156
|
+
|
|
157
|
+
```ts
|
|
158
|
+
const harness = self.registry(HarnessRegistry); // a dependency: activation waits for it
|
|
159
|
+
self.retryOn(harness); // the new harness's contribution wakes the failed follower
|
|
160
|
+
const view = self.follow((observer, ctx) => harness.value.observeConversation(id, observer, ctx));
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
When that harness closes, Durable ends the observer `failed` (S1, a Durable change in this slice: a Session close
|
|
164
|
+
ends observers `failed`, `ended` only when the observed owner ended), so the follower fails `transient` and its retry
|
|
165
|
+
follows the new harness.
|
|
166
|
+
- Examples: Chord's `29-registries.ts` (a router registry with two contributing plugins, a conflict reported, a
|
|
167
|
+
`writable` contribution, a missing provider healing) and `30-host-root.ts`; Durable's `test/examples/37-harness-
|
|
168
|
+
registry.ts` (a Durable harness on the store, its extensions from a registry, its views followed by a second object)
|
|
169
|
+
and the `registryReader` tests in Durable's tree. Durable's `subscribe` listeners then run inside Chord's flush:
|
|
170
|
+
they only wake Durable's scheduler (no Chord call; a reentrant one would throw `invalid/reentrant`), which the
|
|
171
|
+
`registryReader` test pins.
|
|
172
|
+
|
|
173
|
+
## 6. Carry-over
|
|
174
|
+
|
|
175
|
+
From `slices.md` "Slice 8": `host.root` (D3); `retryOn` (section 3); registries recomposing in the owner's flush (W4);
|
|
176
|
+
`host.activity` on the facet's host: not built (nothing needs it; dropped from the carry-over); Durable's views from
|
|
177
|
+
other objects (section 5). Left to slice 7: registries on reload (a reload replaces a contribution and a provider
|
|
178
|
+
atomically; staging composes nothing, decision D1 of "Review round 1"); `accepts` of contracts and jobs; a `writable`
|
|
179
|
+
across a pure swap; older registry readers across a reload of the provider.
|
|
180
|
+
|
|
181
|
+
**New names** (design §3, §5, the pinned reason list): the reason `unavailable/undeclared`; `HostError` kinds
|
|
182
|
+
`registry_conflict`, `registry_failed`, `contribution_failed`, `contribution_refused`, each reported once per episode.
|
|
183
|
+
|
|
184
|
+
## 7. Tests and cost
|
|
185
|
+
|
|
186
|
+
- One `describe` per mechanism: tokens and providers (two serves refused, a missing one healing), contributors
|
|
187
|
+
(R21's type and runtime refusals, facet and object lifetimes, one value each), the table (order by plugin, versions
|
|
188
|
+
adapted, refused versions reported), `compose` (in the flush, after a commit that changed a watchable contribution,
|
|
189
|
+
conflicts reported, a throw as a failure call and its heal), reading (`self.registry` in derives and `on`, `.value` at
|
|
190
|
+
use), `writable` (identity, batching, as a contribution), `retryOn` (a failed object retried by a contribution, value
|
|
191
|
+
calls only, sources installed before natives), `host.root` (principal, release at settle, abort, before load, after
|
|
192
|
+
close), `registryReader` with a Durable harness; GC for every table, writable and root scope.
|
|
193
|
+
- Cost guards: one compose per flush per changed table; no compose for an unchanged table; a `writable.set` of the same
|
|
194
|
+
value costs one comparison.
|