@abide/abide 0.124.0 → 0.124.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 CHANGED
@@ -1,5 +1,12 @@
1
1
  # @abide/abide
2
2
 
3
+ ## 0.124.1
4
+
5
+ ### Patch Changes
6
+
7
+ - cd07376: a throttled or debounced body is busy while its window holds a run, and an await waits for it — 5.15 ([`1482fd3`](https://github.com/briancray/abide/commit/1482fd3368675794ab6db48ff1ff2c5b8861d68c))
8
+ - cd07376: a bind: through a path is checked as the get/set pair the build emits — 32.5 ([`c91d03f`](https://github.com/briancray/abide/commit/c91d03f816af91f994314fc17b2101d8ec77ec51))
9
+
3
10
  ## 0.124.0
4
11
 
5
12
  ### Minor Changes
package/docs/REGISTRY.md CHANGED
@@ -906,6 +906,6 @@ site's `claudeCode`.
906
906
 
907
907
  | Command | Meaning | Rules |
908
908
  | --- | --- | --- |
909
- | `abide-bridge <site> <code> [--claude <path>] [--env NAME=VALUE]… [-- <options>]` | This machine's Claude Code, paired with the browser a site minted the code for. | 44.15, 44.16, 44.24, 44.25, 44.27, 44.30, 44.44, 44.45, 44.46 |
909
+ | `abide-bridge <site> <code> [--claude <path>] [--env NAME=VALUE]… [-- <options>]` | This machine's Claude Code, paired with the browser a site minted the code for. | 44.15, 44.16, 44.24, 44.25, 44.27, 44.30, 44.44, 44.45, 44.46, 44.47 |
910
910
  | `abide-bridge install [--claude <path>] [--env NAME=VALUE]… [-- <options>]` | The app that opens a site's `abide-bridge` links on this machine, registered. | 44.41, 44.42, 44.43, 44.44 |
911
911
  | `abide-bridge uninstall` | `abide-bridge install`, undone. | 44.43 |
package/docs/RULEBOOK.md CHANGED
@@ -290,8 +290,8 @@ two is a comparator answering directly.
290
290
 
291
291
  5.14 Declaring both `throttle` and `debounce` MUST refuse at construction.
292
292
 
293
- 5.15 Where a `throttle` or a `debounce` window is holding a production back, the held value MUST
294
- be served and `s.busy` MUST be true.
293
+ 5.15 Where a `throttle` or a `debounce` window is holding a production back, or a body's run under
294
+ 5.11, the value served before it MUST go on being served and `s.busy` MUST be true.
295
295
 
296
296
  5.16 A `bind:` read MUST NOT be capped.
297
297
 
@@ -3450,6 +3450,9 @@ report is taken, and MUST NOT say it while it redials per 44.25.
3450
3450
  44.46 A bridge MUST end a turn once `/__abide/bridge` did not take a report carrying it, and MUST
3451
3451
  report that turn failed.
3452
3452
 
3453
+ 44.47 A bridge MUST reach `/__abide/bridge` over a certificate that either bun's own authorities or
3454
+ the authorities its machine trusts sign, however the bridge was started.
3455
+
3453
3456
  # 45. Offline
3454
3457
 
3455
3458
  45.1 Where `ABIDE_OFFLINE` is on, a page `abide build` built MUST register the worker
package/docs/abide.md CHANGED
@@ -11291,7 +11291,7 @@ CLI: what is written in place rather than imported.
11291
11291
 
11292
11292
  | Command | Meaning | Rules |
11293
11293
  | --- | --- | --- |
11294
- | `abide-bridge <site> <code> [--claude <path>] [--env NAME=VALUE]… [-- <options>]` | This machine's Claude Code, paired with the browser a site minted the code for. | [44.15](/rulebook#44.15), [44.16](/rulebook#44.16), [44.24](/rulebook#44.24), [44.25](/rulebook#44.25), [44.27](/rulebook#44.27), [44.30](/rulebook#44.30), [44.44](/rulebook#44.44), [44.45](/rulebook#44.45), [44.46](/rulebook#44.46) |
11294
+ | `abide-bridge <site> <code> [--claude <path>] [--env NAME=VALUE]… [-- <options>]` | This machine's Claude Code, paired with the browser a site minted the code for. | [44.15](/rulebook#44.15), [44.16](/rulebook#44.16), [44.24](/rulebook#44.24), [44.25](/rulebook#44.25), [44.27](/rulebook#44.27), [44.30](/rulebook#44.30), [44.44](/rulebook#44.44), [44.45](/rulebook#44.45), [44.46](/rulebook#44.46), [44.47](/rulebook#44.47) |
11295
11295
  | `abide-bridge install [--claude <path>] [--env NAME=VALUE]… [-- <options>]` | The app that opens a site's `abide-bridge` links on this machine, registered. | [44.41](/rulebook#44.41), [44.42](/rulebook#44.42), [44.43](/rulebook#44.43), [44.44](/rulebook#44.44) |
11296
11296
  | `abide-bridge uninstall` | `abide-bridge install`, undone. | [44.43](/rulebook#44.43) |
11297
11297
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@abide/abide",
3
- "version": "0.124.0",
3
+ "version": "0.124.1",
4
4
  "type": "module",
5
5
  "description": "Isomorphic type-safe framework for reactive async interfaces for humans and machines",
6
6
  "license": "MIT",
@@ -371,7 +371,7 @@ export class Lowering {
371
371
  */
372
372
  reference(holder: object): string {
373
373
  const span = this.spanOf(holder)
374
- return this.boundPath(span) ?? grouped(this.lowerChunk(span, true))
374
+ return grouped(this.lowerChunk(span, true))
375
375
  }
376
376
 
377
377
  /**
@@ -383,9 +383,17 @@ export class Lowering {
383
383
  * A COMPUTED STEP IS EMITTED SOURCE, as 31.8's is: `params[s.k]` writes through `s.k` lowered,
384
384
  * so the key is read when the input writes and the get reads it too — the binding follows the
385
385
  * key. A `!` is a type and no step. `undefined` for an operand that is not a name followed by
386
- * steps, which `reference` lowers as it stands — save 32.76's optional step, which is refused.
386
+ * steps, which `lower` lowers as it stands — save 32.76's optional step, which is refused.
387
+ *
388
+ * IN `lower`, SO THE CHECKER READS THE PAIR THE BUILD EMITS. Taken only where the build asked
389
+ * (`reference`), the shadow lowered the same path as a read, and a component's `bind:` held
390
+ * `__bound` to the string it read — TS2769 on a binding the build compiles and runs.
387
391
  */
388
- private boundPath(span: Span): string | undefined {
392
+ private boundPath(
393
+ span: Span,
394
+ origins: Origin[] | undefined,
395
+ base: number,
396
+ ): string | undefined {
389
397
  const source = this.projection.text
390
398
  const text = source.slice(span.start, span.end)
391
399
  const from = span.start + (text.length - text.trimStart().length)
@@ -433,7 +441,20 @@ export class Lowering {
433
441
  }
434
442
  if (segments.length === 0) return undefined
435
443
  const name = this.nameOf(read)
436
- return `{ get: () => ${this.lowerChunk({ start: from, end: to })}, set: (${STORED}) => ${name}.set(${this.use('writePath')}(${name}(), [${segments.join(', ')}], ${STORED})) }`
444
+ const open = '{ get: () => '
445
+ origins?.push({ at: base, source: from, length: 0 })
446
+ const got = this.lower(
447
+ { start: from, end: to },
448
+ false,
449
+ origins,
450
+ base + open.length,
451
+ )
452
+ origins?.push({
453
+ at: base + open.length + got.length,
454
+ source: to,
455
+ length: 0,
456
+ })
457
+ return `${open}${got}, set: (${STORED}) => ${name}.set(${this.use('writePath')}(${name}(), [${segments.join(', ')}], ${STORED})) }`
437
458
  }
438
459
 
439
460
  /**
@@ -567,6 +588,10 @@ export class Lowering {
567
588
  const text = source.slice(from, to)
568
589
  const wholeFrom = from + (text.length - text.trimStart().length)
569
590
  const wholeTo = from + text.trimEnd().length
591
+ if (holds) {
592
+ const path = this.boundPath(span, origins, base)
593
+ if (path !== undefined) return path
594
+ }
570
595
  const reads = this.answer.reads
571
596
  let read = this.answer.firstRead(from)
572
597
  if (read === reads.length || (reads[read] as Read).start >= to) {
@@ -694,6 +694,7 @@ const POSITION_DECLARATIONS = `
694
694
  declare function ${ON}<Name extends string>(name: Name, handler: ((event: Name extends keyof HTMLElementEventMap ? HTMLElementEventMap[Name] : Event) => unknown) | null | undefined | false): void
695
695
  declare function ${ANY}(value: any): void
696
696
  declare function ${PROP}<Value>(value: Value): Value
697
+ declare function ${BIND}<Value>(value: { get(): Value; set(value: Value): unknown }): void
697
698
  declare function ${BIND}(value: any): void
698
699
  declare function ${BOUND}<Value>(value: ${REACTIVE}<Value, any, any, any>): Value
699
700
  declare function ${BOUND}<Value>(value: { get(): Value; set(value: Value): unknown }): Value
@@ -1,3 +1,3 @@
1
1
  // The `abide-bridge` release a pairing command names, so a visitor's `bunx` runs the relay this
2
2
  // server speaks. `packages/abide/tests/claudeCode.test.ts` holds it to the bridge package's own.
3
- export const BRIDGE_VERSION = '0.5.1'
3
+ export const BRIDGE_VERSION = '0.5.2'
@@ -560,7 +560,11 @@ function markReaders(cell: Cell, wanted: number): void {
560
560
  const cap = below.cap
561
561
  if (cap !== null && below.body !== null) {
562
562
  if (windowHolds(below, cap)) {
563
- cap.owed = true
563
+ // 5.15: the held run is a production held back, so `busy` moves as it is owed.
564
+ if (!cap.owed) {
565
+ cap.owed = true
566
+ probesMoved(below)
567
+ }
564
568
  // BACK TO CLEAN so the next source production marks it again and re-arms.
565
569
  // Left marked it takes this walk's own `state >= wanted` short-circuit,
566
570
  // and the changes after the first become invisible to the window.
@@ -1174,6 +1178,8 @@ function openWindow(cell: Cell, cap: Cap): void {
1174
1178
  cell.state = DIRTY
1175
1179
  cell.direct = false
1176
1180
  cascade(cell)
1181
+ // The close is a `busy` edge, as a held production's is.
1182
+ probesMoved(cell)
1177
1183
  return
1178
1184
  }
1179
1185
  // A throttle's window ending with nothing held is the window simply over: the
@@ -2465,6 +2471,11 @@ let PROBE_PASS = 0
2465
2471
  */
2466
2472
  function walkBusy(cell: Cell, pass: number): boolean {
2467
2473
  if (cell.loading) return true
2474
+ // 5.15 over a body: a run the window owes. Read here rather than written into `loading`,
2475
+ // which a load ending inside the window clears while the run is still owed. Only a value with
2476
+ // sources is ever owed, so `busyNow`'s leaf answer never needs it.
2477
+ const cap = cell.cap
2478
+ if (cap !== null && cap.owed) return true
2468
2479
  const adoption = cell.adoption
2469
2480
  if (cell.sources.length === 0 && adoption === null) return false
2470
2481
  if (cell.probePass === pass) return false