@dtmd/temper 0.0.17 → 0.0.19

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/dist/src/emit.js CHANGED
@@ -13,6 +13,7 @@ import { readFileSync } from "node:fs";
13
13
  import { checkMentions, isTextSpan, renderText, resolveLeaf } from "./prose.js";
14
14
  import { permissionUnion } from "./needs.js";
15
15
  import { compareStrings, compileDeclarations, declaredAddresses, declaredAtLocusKinds, declaredRequirements, encodeSeam, placementKey, registrationRows, settingsRows, tapHookRows, uniqueMap, } from "./declarations.js";
16
+ import { bareLookupKey, edgeLookupKey, hostAddress, nestedAddress } from "./member-address.js";
16
17
  /** The {@link MentionScope} a set of {@link ResolveOptions} names — its two sets, each defaulting to empty. */
17
18
  function scopeOf(options) {
18
19
  return {
@@ -93,7 +94,7 @@ function hostUnit(host, context) {
93
94
  if (host.facts.locus.kind === "at" && host.facts.unitShape === "directory") {
94
95
  return joinSlash(host.facts.locus.root, host.name);
95
96
  }
96
- throw new Error(`${context}: its host \`${host.kind}:${host.name}\` owns no directory unit — a template's ` +
97
+ throw new Error(`${context}: its host \`${hostAddress(host.kind, host.name)}\` owns no directory unit — a template's ` +
97
98
  `path pattern is relative to the host's unit, and a lone file has no interior for a ` +
98
99
  `child to sit in (specs/model/representation.md, "locus").`);
99
100
  }
@@ -115,7 +116,7 @@ function nestedFilePath(member) {
115
116
  }
116
117
  const template = (host.facts.templates ?? []).find((layer) => layer.kind.key === member.kind && layer.path !== undefined);
117
118
  if (template?.path === undefined) {
118
- throw new Error(`${context}: its host \`${host.kind}:${host.name}\` templates no file layer for kind ` +
119
+ throw new Error(`${context}: its host \`${hostAddress(host.kind, host.name)}\` templates no file layer for kind ` +
119
120
  `\`${member.kind}\` — the path pattern is the host kind's declared fact, and there is ` +
120
121
  `none to compose against (specs/model/representation.md, "locus").`);
121
122
  }
@@ -178,9 +179,10 @@ function relativeProjection(from, to) {
178
179
  * own field schema, which fails in the author's program at compose time.
179
180
  *
180
181
  * # Throws
181
- * If a filled leaf names no composed member, or names one that owns no projection to
182
- * point at. An edge target cannot defer to the gate the way a bare mention may: the
183
- * reference is written now, and there is nothing true to write.
182
+ * If a filled leaf names no composed member, names one that owns no projection to
183
+ * point at, or names a bare nested key several hosts carry
184
+ * ({@link resolvedTargetFacts}). An edge target cannot defer to the gate the way a bare
185
+ * mention may: the reference is written now, and there is nothing true to write.
184
186
  */
185
187
  function edgeTargetFacts(host, value, leaves, options) {
186
188
  const targets = {};
@@ -189,22 +191,40 @@ function edgeTargetFacts(host, value, leaves, options) {
189
191
  const address = leaves[edge.field];
190
192
  if (address === undefined || address === "")
191
193
  continue;
192
- // A one-element `to` set resolves a bare address within its one kind; a
193
- // multi-element set reads the kind-qualified `kind:name` the author wrote
194
- // (`EdgeField.to`). An already-qualified address carries its own colon, so
195
- // only a bare leaf is lifted to `${edge.to[0]}:${address}` for the lookup.
196
- const lookup = edge.to.length === 1 && !address.includes(":") ? `${edge.to[0]}:${address}` : address;
194
+ const lookup = edgeLookupKey(address, edge.to);
197
195
  const target = options.members?.get(lookup);
196
+ const reference = `${context}: edge field \`${edge.field}\` names \`${address}\``;
198
197
  if (target === undefined) {
199
- throw new Error(`${context}: edge field \`${edge.field}\` names \`${address}\`, which resolves to no ` +
200
- `composed member an edge target's facts are derived, never fabricated ` +
201
- `(specs/model/pipeline.md, "Emit", the "Refusing" bullet).`);
198
+ throw new Error(`${reference}, which resolves to no composed member an edge target's facts are ` +
199
+ `derived, never fabricated (specs/model/pipeline.md, "Emit", the "Refusing" bullet).`);
202
200
  }
203
- if (!isProjected(target)) {
204
- throw new Error(`${context}: edge field \`${edge.field}\` names \`${address}\`, which owns no ` +
205
- `projection to reference (specs/model/representation.md, "locus").`);
206
- }
207
- targets[edge.field] = {
201
+ targets[edge.field] = resolvedTargetFacts(host, target, lookup, reference);
202
+ }
203
+ return targets;
204
+ }
205
+ /** Whether an address named the nested index — the embedded values one spelling reaches. */
206
+ function isNested(target) {
207
+ return Array.isArray(target);
208
+ }
209
+ /**
210
+ * The four derived facts one resolved edge target contributes, read off the target
211
+ * itself and never off the citing instance. A top-level member answers with its own
212
+ * identity and its own projection; an embedded value answers with its own kind and key,
213
+ * its canonical `<host-address>/<kind>/<key>` address (whichever spelling the leaf
214
+ * authored), and its *host's* projection — an embedded member owns no file, so the file
215
+ * its rendering lands in is the host's.
216
+ *
217
+ * # Throws
218
+ * If a bare `kind:key` is carried by more than one host — an ambiguous address names
219
+ * nothing, and the full spelling is what tells the carriers apart — or if the target,
220
+ * or the host carrying it, owns no projection to point at.
221
+ */
222
+ function resolvedTargetFacts(host, target, lookup, reference) {
223
+ const noProjection = () => new Error(`${reference}, which owns no projection to reference (specs/model/representation.md, "locus").`);
224
+ if (!isNested(target)) {
225
+ if (!isProjected(target))
226
+ throw noProjection();
227
+ return {
208
228
  name: target.name,
209
229
  address: lookup,
210
230
  kind: target.kind,
@@ -212,7 +232,23 @@ function edgeTargetFacts(host, value, leaves, options) {
212
232
  repoRootedPath: projectionPath(target),
213
233
  };
214
234
  }
215
- return targets;
235
+ if (target.length > 1) {
236
+ const hosts = target.map((carrier) => `\`${hostAddress(carrier.host.kind, carrier.host.name)}\``).join(", ");
237
+ throw new Error(`${reference}, a bare key ${target.length} hosts carry (${hosts}) — a nested member's address ` +
238
+ `composes through its host, so spell the whole \`<host-address>/<kind>/<key>\` ` +
239
+ `(specs/model/representation.md, "member").`);
240
+ }
241
+ const { host: carrier, value } = target[0];
242
+ if (!isProjected(carrier))
243
+ throw noProjection();
244
+ const carrierPath = projectionPath(carrier);
245
+ return {
246
+ name: value.key,
247
+ address: nestedAddress(hostAddress(carrier.kind, carrier.name), value.kind, value.key),
248
+ kind: value.kind,
249
+ path: relativeProjection(projectionPath(host), carrierPath),
250
+ repoRootedPath: carrierPath,
251
+ };
216
252
  }
217
253
  /**
218
254
  * Resolve one embedded member's value's leaves — top-level and each
@@ -359,7 +395,7 @@ function edgePlacements(harness, options) {
359
395
  continue;
360
396
  const placed = placedEdges(member, value, options);
361
397
  if (placed !== undefined) {
362
- entries.push([placementKey(`${member.kind}:${member.name}`, value.kind, value.key), placed]);
398
+ entries.push([placementKey(hostAddress(member.kind, member.name), value.kind, value.key), placed]);
363
399
  }
364
400
  }
365
401
  }
@@ -400,7 +436,7 @@ function renderedExtents(harness, options) {
400
436
  continue;
401
437
  const block = renderMemberBlock(member, value, options);
402
438
  entries.push([
403
- placementKey(`${member.kind}:${member.name}`, value.kind, value.key),
439
+ placementKey(hostAddress(member.kind, member.name), value.kind, value.key),
404
440
  {
405
441
  lines: renderedLineCount(block),
406
442
  // Unicode scalar values, matching Rust's `chars().count()` — iterating a string
@@ -549,9 +585,12 @@ function settingsResidue(harness) {
549
585
  return settingsRows(harness).map((row) => ({ manifest: row.manifest, key: row.key, value: row.value }));
550
586
  }
551
587
  /**
552
- * The harness's composed members by `kind:name` address — the table an embedded value's
553
- * edge field resolves its target against. Keyed the identical way {@link declaredAddresses}
554
- * spells a member address, so an edge field and a mention name a member the same way.
588
+ * The harness's composed members by address — the table an embedded value's edge field
589
+ * resolves its target against. A top-level member keys the identical way
590
+ * {@link declaredAddresses} spells a member address, so an edge field and a mention name
591
+ * a member the same way; a nested member keys under both of its own spellings
592
+ * ({@link nestedTargets}), so an embedded edge target resolves at emit as a top-level one
593
+ * does.
555
594
  *
556
595
  * A projected member's address is its file, so two at one address are a collision and
557
596
  * refuse loud. A registration member's address is its *group key* — a `hook` registers on
@@ -562,14 +601,48 @@ function settingsResidue(harness) {
562
601
  * `emit` on every harness with two hooks on one event (0.0.16).
563
602
  */
564
603
  function memberTable(harness) {
565
- const table = uniqueMap(harness.members
566
- .filter((member) => !isRegistration(member))
567
- .map((member) => [`${member.kind}:${member.name}`, member]));
604
+ const table = uniqueMap([
605
+ ...harness.members
606
+ .filter((member) => !isRegistration(member))
607
+ .map((member) => [hostAddress(member.kind, member.name), member]),
608
+ ...nestedTargets(harness),
609
+ ]);
568
610
  for (const member of harness.members.filter(isRegistration)) {
569
- table.set(`${member.kind}:${member.name}`, member);
611
+ table.set(hostAddress(member.kind, member.name), member);
570
612
  }
571
613
  return table;
572
614
  }
615
+ /**
616
+ * Every composed embedded value as member-table entries, under both of its spellings: the
617
+ * full `<host-address>/<kind>/<key>` address, whose one carrier is the host whose body
618
+ * composed it — two of those coincident are a malformed lock, refused by the shared
619
+ * {@link uniqueMap} the way two members at one address are — and the bare `kind:key`,
620
+ * whose entry carries *every* host that spells it. A bare key names a nested member only
621
+ * when a single host carries it; several is ambiguous, refused by name at resolution
622
+ * ({@link resolvedTargetFacts}) rather than here, since uniqueness is the resolver's bar
623
+ * and not the corpus's — one key two hosts carry and nothing cites still composes.
624
+ */
625
+ function nestedTargets(harness) {
626
+ const qualified = [];
627
+ const bare = new Map();
628
+ for (const member of harness.members) {
629
+ if (member.prose?.kind !== "blocks")
630
+ continue;
631
+ for (const value of member.prose.values) {
632
+ if (isTextSpan(value))
633
+ continue;
634
+ const target = { host: member, value };
635
+ qualified.push([nestedAddress(hostAddress(member.kind, member.name), value.kind, value.key), [target]]);
636
+ const key = bareLookupKey(value.kind, value.key);
637
+ const carriers = bare.get(key);
638
+ if (carriers === undefined)
639
+ bare.set(key, [target]);
640
+ else
641
+ carriers.push(target);
642
+ }
643
+ }
644
+ return [...qualified, ...bare];
645
+ }
573
646
  /** The harness's projected members as payload members, deterministically kind-then-name ordered. */
574
647
  function orderedMembers(harness, options) {
575
648
  return [...harness.members]
@@ -578,7 +651,7 @@ function orderedMembers(harness, options) {
578
651
  .map((member) => ({
579
652
  kind: member.kind,
580
653
  name: member.name,
581
- host: member.host && `${member.host.kind}:${member.host.name}`,
654
+ host: member.host && hostAddress(member.host.kind, member.host.name),
582
655
  // The generated row carries a mutable field list; the member's is read-only,
583
656
  // so copy each pair into a fresh tuple — the same values, a shape the row accepts.
584
657
  fields: member.fields.map(([name, value]) => [name, value]),
@@ -38,10 +38,11 @@ export type ClauseRow = {
38
38
  */
39
39
  label?: string;
40
40
  /**
41
- * The kind whose contract carries the clause. `None` when this row is nested
42
- * inside a [`RequirementRow`]'s own [`clauses`](RequirementRow::clauses) — a
43
- * requirement's set-scope demand names no kind of its own; it ranges over
44
- * whatever kind the requirement's own row already carries.
41
+ * The kind whose contract carries the clause. `None` has two homes, distinguished
42
+ * by nesting rather than by a second column: inside a [`RequirementRow`]'s own
43
+ * [`clauses`](RequirementRow::clauses) it is the requirement's set-scope demand,
44
+ * ranging over whatever kind the requirement's own row already carries; at the top
45
+ * level it is the **root member's** clause, ranging over the whole governed forest.
45
46
  */
46
47
  kind?: string;
47
48
  /**
@@ -49,7 +50,14 @@ export type ClauseRow = {
49
50
  */
50
51
  predicate: string;
51
52
  /**
52
- * The field (or marker) the predicate constrains, when it names one.
53
+ * The clause's **compiled label** segment ([`crate::contract::clause_label`]) the
54
+ * field the predicate constrains where it names one, and otherwise the identity the
55
+ * seam synthesizes from the arguments the row already carries (`section_contains`
56
+ * and `require_sections` name no field, so `clauseField` in
57
+ * `sdk/src/declarations.ts` lowers a `<heading>.<marker>` / joined-sections segment
58
+ * here instead). `None` where the predicate needs no segment to label uniquely. A
59
+ * synthesized segment labels only: those two predicates are reconstructed from
60
+ * their own `section`/`sections` columns, never round-tripped through this one.
53
61
  */
54
62
  field?: string;
55
63
  /**
@@ -71,14 +79,28 @@ export type ClauseRow = {
71
79
  */
72
80
  count?: CountBoundRow;
73
81
  /**
74
- * The `membership` clause's target requirement name, when the predicate is
75
- * `membership`.
82
+ * The **requirement name** whose satisfiers a clause reads its second selection
83
+ * from — two owners, one naming scheme: `membership`'s allowed-set source and
84
+ * `reached-from`'s closure roots. Both ask the same question of the same column
85
+ * ("which requirement's satisfiers?"), so a second column would be the residue
86
+ * class ([`crate::contract::predicate_from_row`] decodes either from here).
76
87
  */
77
88
  target?: string;
78
89
  /**
79
90
  * The `degree` clause's in/out edge-count bound, when the predicate is `degree`.
80
91
  */
81
92
  degree?: DegreeBoundRow;
93
+ /**
94
+ * The **field set** a by-incidence clause filters its selection to — `degree`'s
95
+ * bound and `reached-from`'s via set (`specs/decisions/0056-…`). Shared rather
96
+ * than nested inside [`DegreeBoundRow`] because the filter is the *clause's*, not
97
+ * either direction's, and the two consumers name one concept: a lock spelling it
98
+ * twice would be the residue class.
99
+ *
100
+ * Absent ⇒ unfiltered, so no committed lock row moves when a clause declares no
101
+ * filter.
102
+ */
103
+ fields?: Array<string>;
82
104
  /**
83
105
  * The `mention-reachable` clause's **target-side gate field**, when the predicate
84
106
  * is `mention-reachable`. The one predicate taking two field arguments: its
@@ -1,6 +1,7 @@
1
1
  import type { AssemblyFactRow } from "./AssemblyFactRow.js";
2
2
  import type { ClauseRow } from "./ClauseRow.js";
3
3
  import type { IncludeRow } from "./IncludeRow.js";
4
+ import type { InputRow } from "./InputRow.js";
4
5
  import type { KindFactRow } from "./KindFactRow.js";
5
6
  import type { MentionRow } from "./MentionRow.js";
6
7
  import type { NestedMemberRow } from "./NestedMemberRow.js";
@@ -65,6 +66,13 @@ export type Declarations = {
65
66
  * declaration table, so a lock round-trip reads it empty).
66
67
  */
67
68
  includes: Array<IncludeRow>;
69
+ /**
70
+ * The members' declared inputs — the files their claims rest on. Seam-inbound
71
+ * like `includes`: `emit` resolves and fingerprints each as an `input` source
72
+ * dependency without moving a byte into any projection, so a lock round-trip reads
73
+ * this family empty.
74
+ */
75
+ inputs: Array<InputRow>;
68
76
  /**
69
77
  * The host members' declared embedded-member facts — captured as declaration
70
78
  * rows rather than a second copy the engine reads back off the rendered fence
@@ -0,0 +1,21 @@
1
+ /**
2
+ * One **declared input** the SDK declares — a file the member's claims rest on, and the
3
+ * member that rests on it. Its own type, not a reuse of [`IncludeRow`]: an include's
4
+ * path pairs positionally with a body slot, an input's moves nothing, and two concepts
5
+ * sharing two columns are still two concepts.
6
+ *
7
+ * A seam-inbound row only, the same posture an include takes: `emit` resolves it against
8
+ * disk ([`resolve_source_dependency`]) and lowers it to a fingerprinted `input` source
9
+ * dependency — this row itself never reaches the lock. Nothing is spliced and no byte
10
+ * moves, so the target is never decoded and a binary input is legal.
11
+ */
12
+ export type InputRow = {
13
+ /**
14
+ * The declaring member's own `kind:name` address.
15
+ */
16
+ member: string;
17
+ /**
18
+ * The input's SDK-resolved absolute path.
19
+ */
20
+ source_path: string;
21
+ };
@@ -0,0 +1,2 @@
1
+ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
2
+ export {};
@@ -73,6 +73,18 @@ export type KindFactRow = {
73
73
  * take, so a body-bearing kind's row stays byte-identical.
74
74
  */
75
75
  shape?: string;
76
+ /**
77
+ * The kind's **leaf set** — the leaf names a member of it carries, derived at emit
78
+ * from the member value type the SDK knows, never authored twice (decision 0053).
79
+ * Empty for a kind whose declaration carries none, the same tolerant round-trip
80
+ * [`registration`](KindFactRow::registration) takes, so a committed lock written
81
+ * before the column existed re-reads byte-identically.
82
+ *
83
+ * The declaration a read verb renders where the surface holds no member yet: the
84
+ * type is the declaration, so a present set outranks the union of what members
85
+ * carry today.
86
+ */
87
+ leaves?: Array<string>;
76
88
  /**
77
89
  * The declared **collection address** — for a registration member surfacing inside a
78
90
  * host manifest, which manifest and which key path it keys at. Absent for a
@@ -15,6 +15,7 @@ export type { FeatureValue } from "./FeatureValue.js";
15
15
  export type { Features } from "./Features.js";
16
16
  export type { FencedBlock } from "./FencedBlock.js";
17
17
  export type { IncludeRow } from "./IncludeRow.js";
18
+ export type { InputRow } from "./InputRow.js";
18
19
  export type { KindFactRow } from "./KindFactRow.js";
19
20
  export type { LayoutRegionRow } from "./LayoutRegionRow.js";
20
21
  export type { LayoutRow } from "./LayoutRow.js";
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * temper's authoring face — the six-noun core as a typed module library.
3
3
  * A harness author imports plain nouns — `harness()`, the generic `kind`
4
- * constructor, the clause and requirement constructors, `needs`, and the three
4
+ * constructor, the clause and requirement constructors, `needs`, and the four
5
5
  * prose constructors — and composes members as typed values. `emit` compiles the
6
6
  * whole into the declaration rows and the projected members' erased payload —
7
7
  * the JSON pipe printed to stdout; the engine is the sole compiler of every
@@ -13,16 +13,17 @@
13
13
  * the `./claude-code` subpath, never here.
14
14
  */
15
15
  export type { Blocks, File, Include, Mention, Mentionable, Prose, Reference, Text } from "./prose.js";
16
- export { blocks, file, include, mentionOf, renderText, text } from "./prose.js";
16
+ export { blocks, file, include, mentionOf, renderText, span, text } from "./prose.js";
17
17
  export type { Capability } from "./needs.js";
18
18
  export { bash, capability, permissionUnion } from "./needs.js";
19
19
  export type { Charset, Clause, ExtentUnit, Predicate, Requirement, Severity, Verifier } from "./contract.js";
20
- export { allowedChars, clause, closedKeys, count, degree, deny, enumOf, extent, forbiddenKeys, formatPlacesEdges, globValid, maxLen, membership, mentionReachable, minLen, mustDefine, nameMatchesDir, optional, range, required, requireSections, requirement, script, sectionContains, shape, telemetry, type, unique, uniqueName, when, } from "./contract.js";
21
- export type { CollectionAddress, EdgeField, EdgeTargetFacts, EmbeddedMemberCollectionEntry, EmbeddedMemberValue, Format, KindDefinition, KindFacts, KindOptions, Layout, LayoutRegion, Locus, Member, MemberInit, Registration, ResolvedEmbeddedMemberCollectionEntry, ResolvedEmbeddedMemberValue, Shape, Template, UnitShape, } from "./kind.js";
22
- export { embeddedMemberValue, kind } from "./kind.js";
20
+ export { allowedChars, clause, closedKeys, count, degree, deny, enumOf, extent, forbiddenKeys, formatPlacesEdges, fresh, globValid, locusDeclared, maxLen, membership, mentionReachable, minLen, mustDefine, nameMatchesDir, optional, range, reachable, reachedFrom, required, requireSections, requirement, script, sectionContains, shape, telemetry, type, unique, uniqueName, when, } from "./contract.js";
21
+ export type { CollectionAddress, EdgeField, EdgeTargetFacts, EmbeddedMemberCollectionEntry, EmbeddedMemberValue, Format, Input, KindDefinition, KindFacts, KindOptions, KindRelocation, Layout, LayoutRegion, LeafSet, Locus, Member, MemberInit, Registration, Residue, ResolvedEmbeddedMemberCollectionEntry, ResolvedEmbeddedMemberValue, Shape, Template, UnitShape, } from "./kind.js";
22
+ export { embeddedMemberValue, kind, relocate } from "./kind.js";
23
+ export { input } from "./kind.js";
23
24
  export type { Admission, EnforcementMode, ExpectBinding, Harness } from "./assembly.js";
24
- export { harness } from "./assembly.js";
25
- export type { EmitResult, RegistrationFact, ResolveOptions, SettingsResidue } from "./emit.js";
25
+ export { harness, rootDefaultContract } from "./assembly.js";
26
+ export type { EdgeTarget, EmbeddedTarget, EmitResult, RegistrationFact, ResolveOptions, SettingsResidue, } from "./emit.js";
26
27
  export { emit } from "./emit.js";
27
28
  export type { Dial, DialEntry } from "./dial.js";
28
29
  export { dial, dialDefaultContract } from "./dial.js";
package/dist/src/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * temper's authoring face — the six-noun core as a typed module library.
3
3
  * A harness author imports plain nouns — `harness()`, the generic `kind`
4
- * constructor, the clause and requirement constructors, `needs`, and the three
4
+ * constructor, the clause and requirement constructors, `needs`, and the four
5
5
  * prose constructors — and composes members as typed values. `emit` compiles the
6
6
  * whole into the declaration rows and the projected members' erased payload —
7
7
  * the JSON pipe printed to stdout; the engine is the sole compiler of every
@@ -12,10 +12,14 @@
12
12
  * The first-party Claude Code provider face — the built-in kinds — lives at
13
13
  * the `./claude-code` subpath, never here.
14
14
  */
15
- export { blocks, file, include, mentionOf, renderText, text } from "./prose.js";
15
+ export { blocks, file, include, mentionOf, renderText, span, text } from "./prose.js";
16
16
  export { bash, capability, permissionUnion } from "./needs.js";
17
- export { allowedChars, clause, closedKeys, count, degree, deny, enumOf, extent, forbiddenKeys, formatPlacesEdges, globValid, maxLen, membership, mentionReachable, minLen, mustDefine, nameMatchesDir, optional, range, required, requireSections, requirement, script, sectionContains, shape, telemetry, type, unique, uniqueName, when, } from "./contract.js";
18
- export { embeddedMemberValue, kind } from "./kind.js";
19
- export { harness } from "./assembly.js";
17
+ export { allowedChars, clause, closedKeys, count, degree, deny, enumOf, extent, forbiddenKeys, formatPlacesEdges, fresh, globValid, locusDeclared, maxLen, membership, mentionReachable, minLen, mustDefine, nameMatchesDir, optional, range, reachable, reachedFrom, required, requireSections, requirement, script, sectionContains, shape, telemetry, type, unique, uniqueName, when, } from "./contract.js";
18
+ export { embeddedMemberValue, kind, relocate } from "./kind.js";
19
+ // Inputs the files a member's claims rest on, fingerprinted by the lock and moved
20
+ // nowhere. A member-grain declaration, not a word in a body, so it rides here rather
21
+ // than on the prose line.
22
+ export { input } from "./kind.js";
23
+ export { harness, rootDefaultContract } from "./assembly.js";
20
24
  export { emit } from "./emit.js";
21
25
  export { dial, dialDefaultContract } from "./dial.js";