@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
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
// `startTerminal` (slice 11 §4, decision "Slice 11, P8"): the trusted launcher of a terminal client. It signs in with
|
|
2
|
+
// its token (given, from a file, or by pairing), downloads the terminal kind's base bundle and plugin scripts, and
|
|
3
|
+
// runs them in the sandbox, always. It keeps the credentials, the real terminal and the user's choices: the sandbox
|
|
4
|
+
// gets input and resizes, its frames pass the output filter, its Chord link is a socket the launcher opens and relays,
|
|
5
|
+
// its plugin script fetches go only to the terminal surface's files, and its actions on the machine (copy, open a URL,
|
|
6
|
+
// attach a file) are confirmed by the launcher's own prompt. A new base bundle on the server starts a new sandbox.
|
|
7
|
+
// Nothing the sandbox sends can end the launcher (fix round 2, Opus E3): its messages are checked (`pipe.ts`), a send
|
|
8
|
+
// on a socket not yet open is dropped, every buffer and the requests in flight are bounded, a signal cannot open the
|
|
9
|
+
// launcher's inspector, and however the launcher's process ends the terminal is given back (fix round 3, Opus E8,
|
|
10
|
+
// E10, E11). During a prompt Ctrl-C ends the client: its keys are the launcher's; and three Ctrl-C within a second
|
|
11
|
+
// always end it (Opus R2).
|
|
12
|
+
import { WebSocket } from "ws";
|
|
13
|
+
import { act, attach, promptLines } from "./actions.js";
|
|
14
|
+
import { tokenOf } from "./credentials.js";
|
|
15
|
+
import { filterOutput } from "./filter.js";
|
|
16
|
+
import { MAX_BUNDLE, requireSandboxNode, Sandbox } from "./sandbox.js";
|
|
17
|
+
/** The terminal surface's files (the server's `TUI_PREFIX`). */
|
|
18
|
+
const PREFIX = "/_chord/tui/";
|
|
19
|
+
/**
|
|
20
|
+
* `path` resolved on the server `server` when it names one of the terminal surface's files (dot segments and encodings
|
|
21
|
+
* resolved first: Opus M2, Fable L1); throws otherwise: the sandbox reaches nothing else of the server through the
|
|
22
|
+
* launcher's token.
|
|
23
|
+
*/
|
|
24
|
+
export function terminalFile(path, server) {
|
|
25
|
+
const target = typeof path === "string" ? new URL(path, server) : undefined;
|
|
26
|
+
if (target === undefined ||
|
|
27
|
+
target.origin !== server.origin ||
|
|
28
|
+
target.search !== "" ||
|
|
29
|
+
!TERMINAL_FILE.test(target.pathname)) {
|
|
30
|
+
throw new Error("terminal: no terminal file");
|
|
31
|
+
}
|
|
32
|
+
return target.pathname;
|
|
33
|
+
}
|
|
34
|
+
/** A terminal surface file's path, as the sandbox may ask for it. */
|
|
35
|
+
const TERMINAL_FILE = /^\/_chord\/tui\/(?:plugin\/)?[\w.~@-]+$/;
|
|
36
|
+
/** The most frames held while a prompt is open: 1 MiB (characters); later ones are dropped. */
|
|
37
|
+
const MAX_HELD = 1024 * 1024;
|
|
38
|
+
/** The most link sockets the sandbox may have open at once. */
|
|
39
|
+
const MAX_SOCKETS = 4;
|
|
40
|
+
/** The most bytes a link socket may have waiting to go out; a sandbox sending more loses the socket. */
|
|
41
|
+
const MAX_SOCKET_BUFFER = 16 * 1024 * 1024;
|
|
42
|
+
/** How long after a prompt appears its keys are ignored: a key typed for the sandbox does not answer it (Opus E4). */
|
|
43
|
+
const PROMPT_GUARD_MS = 300;
|
|
44
|
+
/**
|
|
45
|
+
* The terminal modes the sandbox may have set, back to the shell's: sync, mouse, focus, paste, cursor, the scroll region
|
|
46
|
+
* (the cursor kept where it was) and autowrap (Opus E11), screen, colours.
|
|
47
|
+
*/
|
|
48
|
+
const RESET_MODES = "\x1b[?2026l\x1b[?1000l\x1b[?1002l\x1b[?1006l\x1b[?1004l\x1b[?2004l\x1b[?25h\x1b7\x1b[r\x1b8\x1b[?7h\x1b[?1049l\x1b[0m";
|
|
49
|
+
/** The most requests of one sandbox the launcher answers at once; more are refused at once (Opus E10). */
|
|
50
|
+
const MAX_REQUESTS = 8;
|
|
51
|
+
/**
|
|
52
|
+
* Ctrl-C: during a prompt it ends the client, so a sandbox asking again and again can always be left (Opus E11); and
|
|
53
|
+
* three within a second always end it, whatever the sandbox does with them (Opus R2).
|
|
54
|
+
*/
|
|
55
|
+
const INTERRUPT = "\x03";
|
|
56
|
+
/** How many Ctrl-C within `INTERRUPT_WINDOW_MS` end the client however the sandbox takes them. */
|
|
57
|
+
const INTERRUPTS_TO_END = 3;
|
|
58
|
+
const INTERRUPT_WINDOW_MS = 1000;
|
|
59
|
+
/** Starts a terminal client; rejects when it cannot sign in or download, or Node is too old for the sandbox. */
|
|
60
|
+
export async function startTerminal(options) {
|
|
61
|
+
requireSandboxNode();
|
|
62
|
+
const output = options.output ?? process.stdout;
|
|
63
|
+
const url = new URL(options.url);
|
|
64
|
+
const abort = new AbortController();
|
|
65
|
+
// What the launcher prints of the server's (the pairing's code) passes the output filter too.
|
|
66
|
+
const token = await tokenOf(options.credentials, url, (line) => output.write(`${filterOutput(line)}\r\n`), abort.signal);
|
|
67
|
+
const launcher = new Launcher(url, token, options);
|
|
68
|
+
await launcher.start();
|
|
69
|
+
return { exited: launcher.exited, stop: () => launcher.finish(0) };
|
|
70
|
+
}
|
|
71
|
+
/** One terminal client's launcher. */
|
|
72
|
+
class Launcher {
|
|
73
|
+
#url;
|
|
74
|
+
#headers;
|
|
75
|
+
#options;
|
|
76
|
+
#input;
|
|
77
|
+
#output;
|
|
78
|
+
#sockets = new Map();
|
|
79
|
+
#sandbox;
|
|
80
|
+
/** The running base bundle's hash: an `outdated` sandbox restarts only for another. */
|
|
81
|
+
#base = "";
|
|
82
|
+
/**
|
|
83
|
+
* Whether an action is being confirmed (one at a time), from its request to its end: meanwhile the sandbox's frames
|
|
84
|
+
* are held (`#held`, at most `MAX_HELD` bytes), so nothing draws over the prompt, even before it appears.
|
|
85
|
+
*/
|
|
86
|
+
#confirming = false;
|
|
87
|
+
/** The running sandbox's requests being answered (at most `MAX_REQUESTS`). */
|
|
88
|
+
#requests = 0;
|
|
89
|
+
/** The prompt open: its lines, its answer, and when its keys start to count. Keys go to it, not the sandbox. */
|
|
90
|
+
#prompt;
|
|
91
|
+
#held = [];
|
|
92
|
+
#heldBytes = 0;
|
|
93
|
+
#finished = false;
|
|
94
|
+
#exit;
|
|
95
|
+
exited = new Promise((resolve) => {
|
|
96
|
+
this.#exit = resolve;
|
|
97
|
+
});
|
|
98
|
+
#onInput = (data) => {
|
|
99
|
+
const text = data.toString();
|
|
100
|
+
if (this.#interrupted(text)) {
|
|
101
|
+
void this.finish(130);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (this.#prompt === undefined)
|
|
105
|
+
this.#sandbox?.post({ kind: "input", data: text });
|
|
106
|
+
else if (text.includes(INTERRUPT))
|
|
107
|
+
void this.finish(130);
|
|
108
|
+
else if (Date.now() >= this.#prompt.ready)
|
|
109
|
+
this.#answered(text === "y" || text === "Y");
|
|
110
|
+
};
|
|
111
|
+
#onResize = () => {
|
|
112
|
+
if (this.#prompt !== undefined)
|
|
113
|
+
this.#drawPrompt();
|
|
114
|
+
this.#sandbox?.post({ kind: "resize", columns: this.#columns, rows: this.#rows });
|
|
115
|
+
};
|
|
116
|
+
/** When the last Ctrl-C keys came: three within a second end the client. */
|
|
117
|
+
#interrupts = [];
|
|
118
|
+
/** The terminal given back if the launcher's process ends without `finish` (a crash). */
|
|
119
|
+
#onExit = () => {
|
|
120
|
+
this.#output.write(RESET_MODES);
|
|
121
|
+
if (this.#input.isTTY === true)
|
|
122
|
+
this.#input.setRawMode?.(false);
|
|
123
|
+
};
|
|
124
|
+
constructor(url, token, options) {
|
|
125
|
+
this.#url = url;
|
|
126
|
+
this.#headers = { authorization: `Bearer ${token}` };
|
|
127
|
+
this.#options = options;
|
|
128
|
+
this.#input = options.input ?? process.stdin;
|
|
129
|
+
this.#output = options.output ?? process.stdout;
|
|
130
|
+
}
|
|
131
|
+
/** Whether `text` brings the third Ctrl-C within a second (each still goes to the sandbox otherwise). */
|
|
132
|
+
#interrupted(text) {
|
|
133
|
+
const now = Date.now();
|
|
134
|
+
for (const character of text)
|
|
135
|
+
if (character === INTERRUPT)
|
|
136
|
+
this.#interrupts.push(now);
|
|
137
|
+
this.#interrupts = this.#interrupts.filter((at) => now - at < INTERRUPT_WINDOW_MS);
|
|
138
|
+
return this.#interrupts.length >= INTERRUPTS_TO_END;
|
|
139
|
+
}
|
|
140
|
+
// A pseudo-terminal may report 0 (Opus E4).
|
|
141
|
+
get #columns() {
|
|
142
|
+
return this.#output.columns || 80;
|
|
143
|
+
}
|
|
144
|
+
get #rows() {
|
|
145
|
+
return this.#output.rows || 24;
|
|
146
|
+
}
|
|
147
|
+
/** Downloads the base bundle and the plugins, starts the sandbox and takes the terminal. */
|
|
148
|
+
async start() {
|
|
149
|
+
await this.#startSandbox();
|
|
150
|
+
if (this.#input.isTTY === true)
|
|
151
|
+
this.#input.setRawMode?.(true);
|
|
152
|
+
this.#input.on("data", this.#onInput);
|
|
153
|
+
this.#output.on("resize", this.#onResize);
|
|
154
|
+
process.once("exit", this.#onExit);
|
|
155
|
+
// Node opens its inspector on SIGUSR1 unless the signal has a listener: a sandbox may signal its launcher, and
|
|
156
|
+
// an inspector would give any local process the launcher's token and files (Opus E8). Windows has no SIGUSR1.
|
|
157
|
+
if (process.platform !== "win32")
|
|
158
|
+
process.on("SIGUSR1", ignoreSignal);
|
|
159
|
+
}
|
|
160
|
+
/** Ends the client with `code`: the terminal given back, the sockets closed, the sandbox ended. */
|
|
161
|
+
async finish(code) {
|
|
162
|
+
if (this.#finished)
|
|
163
|
+
return;
|
|
164
|
+
this.#finished = true;
|
|
165
|
+
this.#input.off("data", this.#onInput);
|
|
166
|
+
this.#output.off("resize", this.#onResize);
|
|
167
|
+
process.off("exit", this.#onExit);
|
|
168
|
+
if (process.platform !== "win32")
|
|
169
|
+
process.off("SIGUSR1", ignoreSignal);
|
|
170
|
+
if (this.#input.isTTY === true)
|
|
171
|
+
this.#input.setRawMode?.(false);
|
|
172
|
+
this.#prompt?.answer(false);
|
|
173
|
+
this.#prompt = undefined;
|
|
174
|
+
this.#output.write(RESET_MODES);
|
|
175
|
+
this.#closeSockets();
|
|
176
|
+
await this.#sandbox?.terminate();
|
|
177
|
+
this.#exit(code);
|
|
178
|
+
}
|
|
179
|
+
/** A new sandbox with what the server serves now. */
|
|
180
|
+
async #startSandbox() {
|
|
181
|
+
const start = JSON.parse(await this.#get(`${PREFIX}start`));
|
|
182
|
+
const [source, combined] = await Promise.all([this.#get(start.script), this.#get(start.combined)]);
|
|
183
|
+
this.#base = start.base;
|
|
184
|
+
const colors = this.#options.colors ?? (/truecolor|24bit/.test(process.env.COLORTERM ?? "") ? "truecolor" : "256");
|
|
185
|
+
const bridge = {
|
|
186
|
+
base: start.base,
|
|
187
|
+
combined,
|
|
188
|
+
columns: this.#columns,
|
|
189
|
+
rows: this.#rows,
|
|
190
|
+
colors,
|
|
191
|
+
mode: this.#options.mode ?? "dark",
|
|
192
|
+
locales: this.#options.locales ?? systemLocales(),
|
|
193
|
+
};
|
|
194
|
+
this.#requests = 0;
|
|
195
|
+
this.#sandbox = await Sandbox.start(source, bridge, (message) => this.#message(message), () => void this.finish(1));
|
|
196
|
+
}
|
|
197
|
+
/** One message of the sandbox; one the launcher fails on ends the client, never the launcher's process. */
|
|
198
|
+
#message(message) {
|
|
199
|
+
try {
|
|
200
|
+
this.#handle(message);
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
void this.finish(1);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
#handle(message) {
|
|
207
|
+
switch (message.kind) {
|
|
208
|
+
case "write":
|
|
209
|
+
this.#write(message.data);
|
|
210
|
+
return;
|
|
211
|
+
case "socket_open":
|
|
212
|
+
this.#openSocket(message.socket);
|
|
213
|
+
return;
|
|
214
|
+
case "socket_send":
|
|
215
|
+
this.#send(message.socket, message.bytes);
|
|
216
|
+
return;
|
|
217
|
+
case "socket_close":
|
|
218
|
+
this.#sockets.get(message.socket)?.close();
|
|
219
|
+
return;
|
|
220
|
+
case "request":
|
|
221
|
+
void this.#answer(message.id, message.request);
|
|
222
|
+
return;
|
|
223
|
+
case "outdated":
|
|
224
|
+
void this.#outdated();
|
|
225
|
+
return;
|
|
226
|
+
case "failed":
|
|
227
|
+
this.#output.write("terminal: the terminal client failed to start\n");
|
|
228
|
+
void this.finish(1);
|
|
229
|
+
return;
|
|
230
|
+
case "exit":
|
|
231
|
+
void this.finish(message.code);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/** Writes the sandbox's frame through the output filter (held while a prompt is open); one over 64 KiB is dropped. */
|
|
235
|
+
#write(data) {
|
|
236
|
+
if (this.#confirming) {
|
|
237
|
+
if (typeof data === "string" && this.#heldBytes + data.length <= MAX_HELD) {
|
|
238
|
+
this.#held.push(data);
|
|
239
|
+
this.#heldBytes += data.length;
|
|
240
|
+
}
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
try {
|
|
244
|
+
this.#output.write(filterOutput(data));
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
// Over 64 KiB (or no text): dropped, as an escape it could hide would be.
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
/** Opens socket `socket` to the links endpoint with the launcher's token, relaying it to the sandbox. */
|
|
251
|
+
#openSocket(socket) {
|
|
252
|
+
// A few at a time: the connection loop needs one; a runaway sandbox gets no more.
|
|
253
|
+
if (this.#sockets.size >= MAX_SOCKETS) {
|
|
254
|
+
this.#sandbox?.post({ kind: "socket_closed", socket });
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
const target = new URL("/chord", this.#url);
|
|
258
|
+
target.protocol = target.protocol === "https:" ? "wss:" : "ws:";
|
|
259
|
+
const ws = new WebSocket(target, { headers: this.#headers });
|
|
260
|
+
this.#sockets.set(socket, ws);
|
|
261
|
+
ws.on("open", () => this.#sandbox?.post({ kind: "socket_opened", socket }));
|
|
262
|
+
ws.on("message", (data) => {
|
|
263
|
+
this.#sandbox?.post({ kind: "socket_message", socket, bytes: new Uint8Array(data) });
|
|
264
|
+
});
|
|
265
|
+
const closed = () => {
|
|
266
|
+
if (this.#sockets.get(socket) !== ws)
|
|
267
|
+
return;
|
|
268
|
+
this.#sockets.delete(socket);
|
|
269
|
+
this.#sandbox?.post({ kind: "socket_closed", socket });
|
|
270
|
+
};
|
|
271
|
+
ws.on("close", closed);
|
|
272
|
+
ws.on("error", closed);
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Sends `bytes` on socket `socket` once it is open (before, the sandbox's link holds its messages; a send then is
|
|
276
|
+
* dropped: Opus E3); a socket with more than 16 MiB waiting is closed.
|
|
277
|
+
*/
|
|
278
|
+
#send(socket, bytes) {
|
|
279
|
+
const ws = this.#sockets.get(socket);
|
|
280
|
+
if (ws?.readyState !== WebSocket.OPEN)
|
|
281
|
+
return;
|
|
282
|
+
if (ws.bufferedAmount + bytes.length > MAX_SOCKET_BUFFER)
|
|
283
|
+
ws.terminate();
|
|
284
|
+
else
|
|
285
|
+
ws.send(bytes);
|
|
286
|
+
}
|
|
287
|
+
/** Answers the sandbox's request `id`. */
|
|
288
|
+
async #answer(id, request) {
|
|
289
|
+
// The sandbox that asked: a reply never goes to the one a restart started meanwhile.
|
|
290
|
+
const sandbox = this.#sandbox;
|
|
291
|
+
if (sandbox === undefined)
|
|
292
|
+
return;
|
|
293
|
+
if (this.#requests >= MAX_REQUESTS) {
|
|
294
|
+
sandbox.post({ kind: "refused", id, message: "terminal: too many requests at once" });
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
this.#requests++;
|
|
298
|
+
try {
|
|
299
|
+
let value;
|
|
300
|
+
if (request.kind === "fetch")
|
|
301
|
+
value = await this.#get(terminalFile(request.path, this.#url));
|
|
302
|
+
else if (request.kind === "base")
|
|
303
|
+
value = JSON.parse(await this.#get(`${PREFIX}base`));
|
|
304
|
+
else if (request.kind === "attach") {
|
|
305
|
+
const file = await this.#confirm(() => attach(request.path, this.#prompter()));
|
|
306
|
+
if (file !== null) {
|
|
307
|
+
sandbox.post({ kind: "attached", id, name: file.name, bytes: file.bytes });
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
value = null;
|
|
311
|
+
}
|
|
312
|
+
else
|
|
313
|
+
value = await this.#confirm(() => act(request, this.#prompter(), this.#options.opener));
|
|
314
|
+
sandbox.post({ kind: "reply", id, value });
|
|
315
|
+
}
|
|
316
|
+
catch (error) {
|
|
317
|
+
sandbox.post({ kind: "refused", id, message: error instanceof Error ? error.message : String(error) });
|
|
318
|
+
}
|
|
319
|
+
finally {
|
|
320
|
+
if (this.#sandbox === sandbox)
|
|
321
|
+
this.#requests--;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Runs the action `run` (it asks the user), one at a time: a second is refused while one runs. Afterwards the held
|
|
326
|
+
* frames are written and the sandbox asked to redraw.
|
|
327
|
+
*/
|
|
328
|
+
async #confirm(run) {
|
|
329
|
+
if (this.#confirming)
|
|
330
|
+
throw new Error("terminal: a prompt is open");
|
|
331
|
+
this.#confirming = true;
|
|
332
|
+
try {
|
|
333
|
+
return await run();
|
|
334
|
+
}
|
|
335
|
+
finally {
|
|
336
|
+
this.#confirming = false;
|
|
337
|
+
const held = this.#held;
|
|
338
|
+
this.#held = [];
|
|
339
|
+
this.#heldBytes = 0;
|
|
340
|
+
for (const frame of held)
|
|
341
|
+
this.#write(frame);
|
|
342
|
+
this.#sandbox?.post({ kind: "resize", columns: this.#columns, rows: this.#rows });
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
/** The launcher's own prompt on the real terminal, for the action being confirmed: its key not the sandbox's. */
|
|
346
|
+
#prompter() {
|
|
347
|
+
return {
|
|
348
|
+
columns: this.#columns,
|
|
349
|
+
ask: (lines) => {
|
|
350
|
+
// Shown whole or not at all: a prompt is never cut.
|
|
351
|
+
if (promptLines(lines, this.#columns).length >= this.#rows) {
|
|
352
|
+
return Promise.reject(new Error("terminal: the prompt does not fit the terminal"));
|
|
353
|
+
}
|
|
354
|
+
return new Promise((answer) => {
|
|
355
|
+
this.#prompt = { lines, answer, ready: Date.now() + PROMPT_GUARD_MS };
|
|
356
|
+
this.#drawPrompt();
|
|
357
|
+
});
|
|
358
|
+
},
|
|
359
|
+
write: (data) => this.#output.write(data),
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Draws the open prompt on the bottom lines after closing a synchronized update the sandbox began: its attributes
|
|
364
|
+
* reset and its colours explicit, black on white, so no state the sandbox left (concealed, black on black: Opus E4)
|
|
365
|
+
* applies to it.
|
|
366
|
+
*/
|
|
367
|
+
#drawPrompt() {
|
|
368
|
+
const lines = promptLines(this.#prompt.lines, this.#columns);
|
|
369
|
+
const top = Math.max(1, this.#rows - lines.length + 1);
|
|
370
|
+
const drawn = lines.map((line, index) => `\x1b[${top + index};1H\x1b[0;30;47m\x1b[2K ${line} `);
|
|
371
|
+
this.#output.write(`\x1b[?2026l\x1b[s${drawn.join("")}\x1b[0m`);
|
|
372
|
+
}
|
|
373
|
+
/** The prompt answered: cleared, the cursor back where the sandbox had it. */
|
|
374
|
+
#answered(yes) {
|
|
375
|
+
const { lines, answer } = this.#prompt;
|
|
376
|
+
this.#prompt = undefined;
|
|
377
|
+
const rows = promptLines(lines, this.#columns);
|
|
378
|
+
const top = Math.max(1, this.#rows - rows.length + 1);
|
|
379
|
+
const cleared = rows.map((_row, index) => `\x1b[${top + index};1H\x1b[0m\x1b[2K`).join("");
|
|
380
|
+
this.#output.write(`${cleared}\x1b[u`);
|
|
381
|
+
answer(yes);
|
|
382
|
+
}
|
|
383
|
+
/** The sandbox says its code is outdated: a new sandbox only when the server's base bundle is another. */
|
|
384
|
+
async #outdated() {
|
|
385
|
+
const base = JSON.parse(await this.#get(`${PREFIX}base`).catch(() => "null"));
|
|
386
|
+
if (typeof base === "string" && base !== this.#base)
|
|
387
|
+
await this.#restart();
|
|
388
|
+
}
|
|
389
|
+
/** The server has a new base bundle: a new sandbox with it, the old one ended. */
|
|
390
|
+
async #restart() {
|
|
391
|
+
this.#closeSockets();
|
|
392
|
+
await this.#sandbox?.terminate();
|
|
393
|
+
this.#sandbox = undefined;
|
|
394
|
+
try {
|
|
395
|
+
await this.#startSandbox();
|
|
396
|
+
this.#onResize();
|
|
397
|
+
}
|
|
398
|
+
catch {
|
|
399
|
+
await this.finish(1);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
#closeSockets() {
|
|
403
|
+
for (const ws of this.#sockets.values())
|
|
404
|
+
ws.close();
|
|
405
|
+
this.#sockets.clear();
|
|
406
|
+
}
|
|
407
|
+
/** The text at `path` on the server, signed in; at most 8 MiB, read no further. */
|
|
408
|
+
async #get(path) {
|
|
409
|
+
const response = await fetch(new URL(path, this.#url), { headers: this.#headers });
|
|
410
|
+
if (!response.ok || response.body === null)
|
|
411
|
+
throw new Error(`terminal: GET ${path} answered ${response.status}`);
|
|
412
|
+
if (Number(response.headers.get("content-length") ?? 0) > MAX_BUNDLE)
|
|
413
|
+
throw new Error(`terminal: ${path} exceeds 8 MiB`);
|
|
414
|
+
const chunks = [];
|
|
415
|
+
let size = 0;
|
|
416
|
+
for await (const chunk of response.body) {
|
|
417
|
+
size += chunk.length;
|
|
418
|
+
if (size > MAX_BUNDLE)
|
|
419
|
+
throw new Error(`terminal: ${path} exceeds 8 MiB`);
|
|
420
|
+
chunks.push(chunk);
|
|
421
|
+
}
|
|
422
|
+
return new TextDecoder().decode(Buffer.concat(chunks));
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
/** The launcher's SIGUSR1 listener: the signal does nothing. */
|
|
426
|
+
function ignoreSignal() { }
|
|
427
|
+
/**
|
|
428
|
+
* The system's languages: `LANGUAGE` (a colon list), then `LC_ALL`, `LC_MESSAGES`, `LANG` (`de_DE.UTF-8` is `de-DE`;
|
|
429
|
+
* `C` and `POSIX` name none), then the runtime's default locale.
|
|
430
|
+
*/
|
|
431
|
+
function systemLocales() {
|
|
432
|
+
const { LANGUAGE, LC_ALL, LC_MESSAGES, LANG } = process.env;
|
|
433
|
+
const named = [...(LANGUAGE ?? "").split(":"), LC_ALL, LC_MESSAGES, LANG].flatMap((value) => {
|
|
434
|
+
const tag = value?.replace(/[.@].*$/, "").replace(/_/g, "-");
|
|
435
|
+
return tag === undefined || tag === "" || tag === "C" || tag === "POSIX" ? [] : [tag];
|
|
436
|
+
});
|
|
437
|
+
return [...new Set([...named, Intl.DateTimeFormat().resolvedOptions().locale])];
|
|
438
|
+
}
|
|
439
|
+
//# sourceMappingURL=launcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launcher.js","sourceRoot":"","sources":["../../../src/node/tui/launcher.ts"],"names":[],"mappings":"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","sourcesContent":["// `startTerminal` (slice 11 §4, decision \"Slice 11, P8\"): the trusted launcher of a terminal client. It signs in with\n// its token (given, from a file, or by pairing), downloads the terminal kind's base bundle and plugin scripts, and\n// runs them in the sandbox, always. It keeps the credentials, the real terminal and the user's choices: the sandbox\n// gets input and resizes, its frames pass the output filter, its Chord link is a socket the launcher opens and relays,\n// its plugin script fetches go only to the terminal surface's files, and its actions on the machine (copy, open a URL,\n// attach a file) are confirmed by the launcher's own prompt. A new base bundle on the server starts a new sandbox.\n// Nothing the sandbox sends can end the launcher (fix round 2, Opus E3): its messages are checked (`pipe.ts`), a send\n// on a socket not yet open is dropped, every buffer and the requests in flight are bounded, a signal cannot open the\n// launcher's inspector, and however the launcher's process ends the terminal is given back (fix round 3, Opus E8,\n// E10, E11). During a prompt Ctrl-C ends the client: its keys are the launcher's; and three Ctrl-C within a second\n// always end it (Opus R2).\n\nimport type { Readable, Writable } from \"node:stream\";\nimport { WebSocket } from \"ws\";\nimport type { ColorDepth } from \"../../surfaces/index.ts\";\nimport type { BridgeRequest, SandboxMessage } from \"../../tui/bridge.ts\";\nimport type { TuiStart } from \"../surfaces/tui.ts\";\nimport { act, attach, type PromptTerminal, promptLines } from \"./actions.ts\";\nimport { type TerminalCredentials, tokenOf } from \"./credentials.ts\";\nimport { filterOutput } from \"./filter.ts\";\nimport { MAX_BUNDLE, requireSandboxNode, Sandbox } from \"./sandbox.ts\";\n\n/** What `startTerminal` takes. */\nexport type TerminalOptions = {\n\t/** The app's server (`http://127.0.0.1:8788`). */\n\treadonly url: string;\n\treadonly credentials: TerminalCredentials;\n\t/** The terminal's input and output: the process's by default (raw mode while running, when a TTY). */\n\treadonly input?: Readable & { setRawMode?(raw: boolean): unknown; readonly isTTY?: boolean };\n\treadonly output?: Writable & { readonly columns?: number; readonly rows?: number };\n\t/** How many colours the terminal shows: true colour when `COLORTERM` says so, else 256. */\n\treadonly colors?: ColorDepth;\n\t/** The terminal's background, choosing between the user's dark and light theme: dark by default. */\n\treadonly mode?: \"dark\" | \"light\";\n\t/** The user's languages, most preferred first, until they choose one: the system's locale by default. */\n\treadonly locales?: readonly string[];\n\t/** Opens a URL the user confirmed: the platform's opener by default. */\n\treadonly opener?: (url: string) => Promise<void>;\n};\n\n/** A running terminal client: its exit code once it ends, and its stop. */\nexport type RunningTerminal = { readonly exited: Promise<number>; stop(): Promise<void> };\n\n/** The terminal surface's files (the server's `TUI_PREFIX`). */\nconst PREFIX = \"/_chord/tui/\";\n\n/**\n * `path` resolved on the server `server` when it names one of the terminal surface's files (dot segments and encodings\n * resolved first: Opus M2, Fable L1); throws otherwise: the sandbox reaches nothing else of the server through the\n * launcher's token.\n */\nexport function terminalFile(path: unknown, server: URL): string {\n\tconst target = typeof path === \"string\" ? new URL(path, server) : undefined;\n\tif (\n\t\ttarget === undefined ||\n\t\ttarget.origin !== server.origin ||\n\t\ttarget.search !== \"\" ||\n\t\t!TERMINAL_FILE.test(target.pathname)\n\t) {\n\t\tthrow new Error(\"terminal: no terminal file\");\n\t}\n\treturn target.pathname;\n}\n\n/** A terminal surface file's path, as the sandbox may ask for it. */\nconst TERMINAL_FILE = /^\\/_chord\\/tui\\/(?:plugin\\/)?[\\w.~@-]+$/;\n\n/** The most frames held while a prompt is open: 1 MiB (characters); later ones are dropped. */\nconst MAX_HELD = 1024 * 1024;\n\n/** The most link sockets the sandbox may have open at once. */\nconst MAX_SOCKETS = 4;\n\n/** The most bytes a link socket may have waiting to go out; a sandbox sending more loses the socket. */\nconst MAX_SOCKET_BUFFER = 16 * 1024 * 1024;\n\n/** How long after a prompt appears its keys are ignored: a key typed for the sandbox does not answer it (Opus E4). */\nconst PROMPT_GUARD_MS = 300;\n\n/**\n * The terminal modes the sandbox may have set, back to the shell's: sync, mouse, focus, paste, cursor, the scroll region\n * (the cursor kept where it was) and autowrap (Opus E11), screen, colours.\n */\nconst RESET_MODES =\n\t\"\\x1b[?2026l\\x1b[?1000l\\x1b[?1002l\\x1b[?1006l\\x1b[?1004l\\x1b[?2004l\\x1b[?25h\\x1b7\\x1b[r\\x1b8\\x1b[?7h\\x1b[?1049l\\x1b[0m\";\n\n/** The most requests of one sandbox the launcher answers at once; more are refused at once (Opus E10). */\nconst MAX_REQUESTS = 8;\n\n/**\n * Ctrl-C: during a prompt it ends the client, so a sandbox asking again and again can always be left (Opus E11); and\n * three within a second always end it, whatever the sandbox does with them (Opus R2).\n */\nconst INTERRUPT = \"\\x03\";\n\n/** How many Ctrl-C within `INTERRUPT_WINDOW_MS` end the client however the sandbox takes them. */\nconst INTERRUPTS_TO_END = 3;\nconst INTERRUPT_WINDOW_MS = 1000;\n\n/** Starts a terminal client; rejects when it cannot sign in or download, or Node is too old for the sandbox. */\nexport async function startTerminal(options: TerminalOptions): Promise<RunningTerminal> {\n\trequireSandboxNode();\n\tconst output = options.output ?? process.stdout;\n\tconst url = new URL(options.url);\n\tconst abort = new AbortController();\n\t// What the launcher prints of the server's (the pairing's code) passes the output filter too.\n\tconst token = await tokenOf(\n\t\toptions.credentials,\n\t\turl,\n\t\t(line) => output.write(`${filterOutput(line)}\\r\\n`),\n\t\tabort.signal,\n\t);\n\tconst launcher = new Launcher(url, token, options);\n\tawait launcher.start();\n\treturn { exited: launcher.exited, stop: () => launcher.finish(0) };\n}\n\n/** One terminal client's launcher. */\nclass Launcher {\n\treadonly #url: URL;\n\treadonly #headers: Readonly<Record<string, string>>;\n\treadonly #options: TerminalOptions;\n\treadonly #input: NonNullable<TerminalOptions[\"input\"]>;\n\treadonly #output: NonNullable<TerminalOptions[\"output\"]>;\n\treadonly #sockets = new Map<number, WebSocket>();\n\t#sandbox: Sandbox | undefined;\n\t/** The running base bundle's hash: an `outdated` sandbox restarts only for another. */\n\t#base = \"\";\n\t/**\n\t * Whether an action is being confirmed (one at a time), from its request to its end: meanwhile the sandbox's frames\n\t * are held (`#held`, at most `MAX_HELD` bytes), so nothing draws over the prompt, even before it appears.\n\t */\n\t#confirming = false;\n\t/** The running sandbox's requests being answered (at most `MAX_REQUESTS`). */\n\t#requests = 0;\n\t/** The prompt open: its lines, its answer, and when its keys start to count. Keys go to it, not the sandbox. */\n\t#prompt:\n\t\t| { readonly lines: readonly string[]; readonly answer: (yes: boolean) => void; readonly ready: number }\n\t\t| undefined;\n\t#held: string[] = [];\n\t#heldBytes = 0;\n\t#finished = false;\n\t#exit!: (code: number) => void;\n\treadonly exited = new Promise<number>((resolve) => {\n\t\tthis.#exit = resolve;\n\t});\n\treadonly #onInput = (data: Buffer | string): void => {\n\t\tconst text = data.toString();\n\t\tif (this.#interrupted(text)) {\n\t\t\tvoid this.finish(130);\n\t\t\treturn;\n\t\t}\n\t\tif (this.#prompt === undefined) this.#sandbox?.post({ kind: \"input\", data: text });\n\t\telse if (text.includes(INTERRUPT)) void this.finish(130);\n\t\telse if (Date.now() >= this.#prompt.ready) this.#answered(text === \"y\" || text === \"Y\");\n\t};\n\treadonly #onResize = (): void => {\n\t\tif (this.#prompt !== undefined) this.#drawPrompt();\n\t\tthis.#sandbox?.post({ kind: \"resize\", columns: this.#columns, rows: this.#rows });\n\t};\n\t/** When the last Ctrl-C keys came: three within a second end the client. */\n\t#interrupts: number[] = [];\n\t/** The terminal given back if the launcher's process ends without `finish` (a crash). */\n\treadonly #onExit = (): void => {\n\t\tthis.#output.write(RESET_MODES);\n\t\tif (this.#input.isTTY === true) this.#input.setRawMode?.(false);\n\t};\n\n\tconstructor(url: URL, token: string, options: TerminalOptions) {\n\t\tthis.#url = url;\n\t\tthis.#headers = { authorization: `Bearer ${token}` };\n\t\tthis.#options = options;\n\t\tthis.#input = options.input ?? process.stdin;\n\t\tthis.#output = options.output ?? process.stdout;\n\t}\n\n\t/** Whether `text` brings the third Ctrl-C within a second (each still goes to the sandbox otherwise). */\n\t#interrupted(text: string): boolean {\n\t\tconst now = Date.now();\n\t\tfor (const character of text) if (character === INTERRUPT) this.#interrupts.push(now);\n\t\tthis.#interrupts = this.#interrupts.filter((at) => now - at < INTERRUPT_WINDOW_MS);\n\t\treturn this.#interrupts.length >= INTERRUPTS_TO_END;\n\t}\n\n\t// A pseudo-terminal may report 0 (Opus E4).\n\tget #columns(): number {\n\t\treturn this.#output.columns || 80;\n\t}\n\n\tget #rows(): number {\n\t\treturn this.#output.rows || 24;\n\t}\n\n\t/** Downloads the base bundle and the plugins, starts the sandbox and takes the terminal. */\n\tasync start(): Promise<void> {\n\t\tawait this.#startSandbox();\n\t\tif (this.#input.isTTY === true) this.#input.setRawMode?.(true);\n\t\tthis.#input.on(\"data\", this.#onInput);\n\t\tthis.#output.on(\"resize\", this.#onResize);\n\t\tprocess.once(\"exit\", this.#onExit);\n\t\t// Node opens its inspector on SIGUSR1 unless the signal has a listener: a sandbox may signal its launcher, and\n\t\t// an inspector would give any local process the launcher's token and files (Opus E8). Windows has no SIGUSR1.\n\t\tif (process.platform !== \"win32\") process.on(\"SIGUSR1\", ignoreSignal);\n\t}\n\n\t/** Ends the client with `code`: the terminal given back, the sockets closed, the sandbox ended. */\n\tasync finish(code: number): Promise<void> {\n\t\tif (this.#finished) return;\n\t\tthis.#finished = true;\n\t\tthis.#input.off(\"data\", this.#onInput);\n\t\tthis.#output.off(\"resize\", this.#onResize);\n\t\tprocess.off(\"exit\", this.#onExit);\n\t\tif (process.platform !== \"win32\") process.off(\"SIGUSR1\", ignoreSignal);\n\t\tif (this.#input.isTTY === true) this.#input.setRawMode?.(false);\n\t\tthis.#prompt?.answer(false);\n\t\tthis.#prompt = undefined;\n\t\tthis.#output.write(RESET_MODES);\n\t\tthis.#closeSockets();\n\t\tawait this.#sandbox?.terminate();\n\t\tthis.#exit(code);\n\t}\n\n\t/** A new sandbox with what the server serves now. */\n\tasync #startSandbox(): Promise<void> {\n\t\tconst start = JSON.parse(await this.#get(`${PREFIX}start`)) as TuiStart;\n\t\tconst [source, combined] = await Promise.all([this.#get(start.script), this.#get(start.combined)]);\n\t\tthis.#base = start.base;\n\t\tconst colors =\n\t\t\tthis.#options.colors ?? (/truecolor|24bit/.test(process.env.COLORTERM ?? \"\") ? \"truecolor\" : \"256\");\n\t\tconst bridge = {\n\t\t\tbase: start.base,\n\t\t\tcombined,\n\t\t\tcolumns: this.#columns,\n\t\t\trows: this.#rows,\n\t\t\tcolors,\n\t\t\tmode: this.#options.mode ?? \"dark\",\n\t\t\tlocales: this.#options.locales ?? systemLocales(),\n\t\t} as const;\n\t\tthis.#requests = 0;\n\t\tthis.#sandbox = await Sandbox.start(\n\t\t\tsource,\n\t\t\tbridge,\n\t\t\t(message) => this.#message(message),\n\t\t\t() => void this.finish(1),\n\t\t);\n\t}\n\n\t/** One message of the sandbox; one the launcher fails on ends the client, never the launcher's process. */\n\t#message(message: SandboxMessage): void {\n\t\ttry {\n\t\t\tthis.#handle(message);\n\t\t} catch {\n\t\t\tvoid this.finish(1);\n\t\t}\n\t}\n\n\t#handle(message: SandboxMessage): void {\n\t\tswitch (message.kind) {\n\t\t\tcase \"write\":\n\t\t\t\tthis.#write(message.data);\n\t\t\t\treturn;\n\t\t\tcase \"socket_open\":\n\t\t\t\tthis.#openSocket(message.socket);\n\t\t\t\treturn;\n\t\t\tcase \"socket_send\":\n\t\t\t\tthis.#send(message.socket, message.bytes);\n\t\t\t\treturn;\n\t\t\tcase \"socket_close\":\n\t\t\t\tthis.#sockets.get(message.socket)?.close();\n\t\t\t\treturn;\n\t\t\tcase \"request\":\n\t\t\t\tvoid this.#answer(message.id, message.request);\n\t\t\t\treturn;\n\t\t\tcase \"outdated\":\n\t\t\t\tvoid this.#outdated();\n\t\t\t\treturn;\n\t\t\tcase \"failed\":\n\t\t\t\tthis.#output.write(\"terminal: the terminal client failed to start\\n\");\n\t\t\t\tvoid this.finish(1);\n\t\t\t\treturn;\n\t\t\tcase \"exit\":\n\t\t\t\tvoid this.finish(message.code);\n\t\t}\n\t}\n\n\t/** Writes the sandbox's frame through the output filter (held while a prompt is open); one over 64 KiB is dropped. */\n\t#write(data: string): void {\n\t\tif (this.#confirming) {\n\t\t\tif (typeof data === \"string\" && this.#heldBytes + data.length <= MAX_HELD) {\n\t\t\t\tthis.#held.push(data);\n\t\t\t\tthis.#heldBytes += data.length;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tthis.#output.write(filterOutput(data));\n\t\t} catch {\n\t\t\t// Over 64 KiB (or no text): dropped, as an escape it could hide would be.\n\t\t}\n\t}\n\n\t/** Opens socket `socket` to the links endpoint with the launcher's token, relaying it to the sandbox. */\n\t#openSocket(socket: number): void {\n\t\t// A few at a time: the connection loop needs one; a runaway sandbox gets no more.\n\t\tif (this.#sockets.size >= MAX_SOCKETS) {\n\t\t\tthis.#sandbox?.post({ kind: \"socket_closed\", socket });\n\t\t\treturn;\n\t\t}\n\t\tconst target = new URL(\"/chord\", this.#url);\n\t\ttarget.protocol = target.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n\t\tconst ws = new WebSocket(target, { headers: this.#headers });\n\t\tthis.#sockets.set(socket, ws);\n\t\tws.on(\"open\", () => this.#sandbox?.post({ kind: \"socket_opened\", socket }));\n\t\tws.on(\"message\", (data: Buffer) => {\n\t\t\tthis.#sandbox?.post({ kind: \"socket_message\", socket, bytes: new Uint8Array(data) });\n\t\t});\n\t\tconst closed = (): void => {\n\t\t\tif (this.#sockets.get(socket) !== ws) return;\n\t\t\tthis.#sockets.delete(socket);\n\t\t\tthis.#sandbox?.post({ kind: \"socket_closed\", socket });\n\t\t};\n\t\tws.on(\"close\", closed);\n\t\tws.on(\"error\", closed);\n\t}\n\n\t/**\n\t * Sends `bytes` on socket `socket` once it is open (before, the sandbox's link holds its messages; a send then is\n\t * dropped: Opus E3); a socket with more than 16 MiB waiting is closed.\n\t */\n\t#send(socket: number, bytes: Uint8Array): void {\n\t\tconst ws = this.#sockets.get(socket);\n\t\tif (ws?.readyState !== WebSocket.OPEN) return;\n\t\tif (ws.bufferedAmount + bytes.length > MAX_SOCKET_BUFFER) ws.terminate();\n\t\telse ws.send(bytes);\n\t}\n\n\t/** Answers the sandbox's request `id`. */\n\tasync #answer(id: number, request: BridgeRequest): Promise<void> {\n\t\t// The sandbox that asked: a reply never goes to the one a restart started meanwhile.\n\t\tconst sandbox = this.#sandbox;\n\t\tif (sandbox === undefined) return;\n\t\tif (this.#requests >= MAX_REQUESTS) {\n\t\t\tsandbox.post({ kind: \"refused\", id, message: \"terminal: too many requests at once\" });\n\t\t\treturn;\n\t\t}\n\t\tthis.#requests++;\n\t\ttry {\n\t\t\tlet value: unknown;\n\t\t\tif (request.kind === \"fetch\") value = await this.#get(terminalFile(request.path, this.#url));\n\t\t\telse if (request.kind === \"base\") value = JSON.parse(await this.#get(`${PREFIX}base`));\n\t\t\telse if (request.kind === \"attach\") {\n\t\t\t\tconst file = await this.#confirm(() => attach(request.path, this.#prompter()));\n\t\t\t\tif (file !== null) {\n\t\t\t\t\tsandbox.post({ kind: \"attached\", id, name: file.name, bytes: file.bytes });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvalue = null;\n\t\t\t} else value = await this.#confirm(() => act(request, this.#prompter(), this.#options.opener));\n\t\t\tsandbox.post({ kind: \"reply\", id, value });\n\t\t} catch (error) {\n\t\t\tsandbox.post({ kind: \"refused\", id, message: error instanceof Error ? error.message : String(error) });\n\t\t} finally {\n\t\t\tif (this.#sandbox === sandbox) this.#requests--;\n\t\t}\n\t}\n\n\t/**\n\t * Runs the action `run` (it asks the user), one at a time: a second is refused while one runs. Afterwards the held\n\t * frames are written and the sandbox asked to redraw.\n\t */\n\tasync #confirm<T>(run: () => Promise<T>): Promise<T> {\n\t\tif (this.#confirming) throw new Error(\"terminal: a prompt is open\");\n\t\tthis.#confirming = true;\n\t\ttry {\n\t\t\treturn await run();\n\t\t} finally {\n\t\t\tthis.#confirming = false;\n\t\t\tconst held = this.#held;\n\t\t\tthis.#held = [];\n\t\t\tthis.#heldBytes = 0;\n\t\t\tfor (const frame of held) this.#write(frame);\n\t\t\tthis.#sandbox?.post({ kind: \"resize\", columns: this.#columns, rows: this.#rows });\n\t\t}\n\t}\n\n\t/** The launcher's own prompt on the real terminal, for the action being confirmed: its key not the sandbox's. */\n\t#prompter(): PromptTerminal {\n\t\treturn {\n\t\t\tcolumns: this.#columns,\n\t\t\task: (lines) => {\n\t\t\t\t// Shown whole or not at all: a prompt is never cut.\n\t\t\t\tif (promptLines(lines, this.#columns).length >= this.#rows) {\n\t\t\t\t\treturn Promise.reject(new Error(\"terminal: the prompt does not fit the terminal\"));\n\t\t\t\t}\n\t\t\t\treturn new Promise<boolean>((answer) => {\n\t\t\t\t\tthis.#prompt = { lines, answer, ready: Date.now() + PROMPT_GUARD_MS };\n\t\t\t\t\tthis.#drawPrompt();\n\t\t\t\t});\n\t\t\t},\n\t\t\twrite: (data) => this.#output.write(data),\n\t\t};\n\t}\n\n\t/**\n\t * Draws the open prompt on the bottom lines after closing a synchronized update the sandbox began: its attributes\n\t * reset and its colours explicit, black on white, so no state the sandbox left (concealed, black on black: Opus E4)\n\t * applies to it.\n\t */\n\t#drawPrompt(): void {\n\t\tconst lines = promptLines(this.#prompt!.lines, this.#columns);\n\t\tconst top = Math.max(1, this.#rows - lines.length + 1);\n\t\tconst drawn = lines.map((line, index) => `\\x1b[${top + index};1H\\x1b[0;30;47m\\x1b[2K ${line} `);\n\t\tthis.#output.write(`\\x1b[?2026l\\x1b[s${drawn.join(\"\")}\\x1b[0m`);\n\t}\n\n\t/** The prompt answered: cleared, the cursor back where the sandbox had it. */\n\t#answered(yes: boolean): void {\n\t\tconst { lines, answer } = this.#prompt!;\n\t\tthis.#prompt = undefined;\n\t\tconst rows = promptLines(lines, this.#columns);\n\t\tconst top = Math.max(1, this.#rows - rows.length + 1);\n\t\tconst cleared = rows.map((_row, index) => `\\x1b[${top + index};1H\\x1b[0m\\x1b[2K`).join(\"\");\n\t\tthis.#output.write(`${cleared}\\x1b[u`);\n\t\tanswer(yes);\n\t}\n\n\t/** The sandbox says its code is outdated: a new sandbox only when the server's base bundle is another. */\n\tasync #outdated(): Promise<void> {\n\t\tconst base = JSON.parse(await this.#get(`${PREFIX}base`).catch(() => \"null\")) as unknown;\n\t\tif (typeof base === \"string\" && base !== this.#base) await this.#restart();\n\t}\n\n\t/** The server has a new base bundle: a new sandbox with it, the old one ended. */\n\tasync #restart(): Promise<void> {\n\t\tthis.#closeSockets();\n\t\tawait this.#sandbox?.terminate();\n\t\tthis.#sandbox = undefined;\n\t\ttry {\n\t\t\tawait this.#startSandbox();\n\t\t\tthis.#onResize();\n\t\t} catch {\n\t\t\tawait this.finish(1);\n\t\t}\n\t}\n\n\t#closeSockets(): void {\n\t\tfor (const ws of this.#sockets.values()) ws.close();\n\t\tthis.#sockets.clear();\n\t}\n\n\t/** The text at `path` on the server, signed in; at most 8 MiB, read no further. */\n\tasync #get(path: string): Promise<string> {\n\t\tconst response = await fetch(new URL(path, this.#url), { headers: this.#headers });\n\t\tif (!response.ok || response.body === null) throw new Error(`terminal: GET ${path} answered ${response.status}`);\n\t\tif (Number(response.headers.get(\"content-length\") ?? 0) > MAX_BUNDLE)\n\t\t\tthrow new Error(`terminal: ${path} exceeds 8 MiB`);\n\t\tconst chunks: Uint8Array[] = [];\n\t\tlet size = 0;\n\t\tfor await (const chunk of response.body) {\n\t\t\tsize += chunk.length;\n\t\t\tif (size > MAX_BUNDLE) throw new Error(`terminal: ${path} exceeds 8 MiB`);\n\t\t\tchunks.push(chunk);\n\t\t}\n\t\treturn new TextDecoder().decode(Buffer.concat(chunks));\n\t}\n}\n\n/** The launcher's SIGUSR1 listener: the signal does nothing. */\nfunction ignoreSignal(): void {}\n\n/**\n * The system's languages: `LANGUAGE` (a colon list), then `LC_ALL`, `LC_MESSAGES`, `LANG` (`de_DE.UTF-8` is `de-DE`;\n * `C` and `POSIX` name none), then the runtime's default locale.\n */\nfunction systemLocales(): readonly string[] {\n\tconst { LANGUAGE, LC_ALL, LC_MESSAGES, LANG } = process.env;\n\tconst named = [...(LANGUAGE ?? \"\").split(\":\"), LC_ALL, LC_MESSAGES, LANG].flatMap((value) => {\n\t\tconst tag = value?.replace(/[.@].*$/, \"\").replace(/_/g, \"-\");\n\t\treturn tag === undefined || tag === \"\" || tag === \"C\" || tag === \"POSIX\" ? [] : [tag];\n\t});\n\treturn [...new Set([...named, Intl.DateTimeFormat().resolvedOptions().locale])];\n}\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { LauncherMessage, SandboxMessage } from "../../tui/bridge.ts";
|
|
2
|
+
/** The largest frame either side takes: 17 MiB (an attached file of 16 MiB and its header). */
|
|
3
|
+
export declare const MAX_PIPE_FRAME: number;
|
|
4
|
+
/** `message` as one frame for the sandbox. */
|
|
5
|
+
export declare function launcherFrame(message: LauncherMessage): Buffer;
|
|
6
|
+
/** The first frame: the bridge's start and the base bundle's text as body. */
|
|
7
|
+
export declare function startFrame(start: unknown, source: string): Buffer;
|
|
8
|
+
/**
|
|
9
|
+
* Cuts the sandbox's output into messages as chunks arrive; throws (the sandbox is ended) on a frame over
|
|
10
|
+
* `MAX_PIPE_FRAME`, a header over 1 MiB, or a message of no known shape. Each byte is copied in once, however small the
|
|
11
|
+
* chunks the sandbox writes.
|
|
12
|
+
*/
|
|
13
|
+
export declare class FrameReader {
|
|
14
|
+
#private;
|
|
15
|
+
/** The messages complete with `chunk`. */
|
|
16
|
+
push(chunk: Buffer): SandboxMessage[];
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=pipe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipe.d.ts","sourceRoot":"","sources":["../../../src/node/tui/pipe.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAiB,eAAe,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1F,+FAA+F;AAC/F,eAAO,MAAM,cAAc,QAAmB,CAAC;AAK/C,8CAA8C;AAC9C,wBAAgB,aAAa,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAM9D;AAED,8EAA8E;AAC9E,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEjE;AAWD;;;;GAIG;AACH,qBAAa,WAAW;;IAKvB,0CAA0C;IAC1C,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,EAAE,CAapC;CAmBD"}
|