@astrosheep/keiyaku 4.5.29 → 4.6.2
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/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku/SKILL.md +0 -13
- package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-akuma/SKILL.md +47 -78
- package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-akuma/references/automation.md +54 -41
- package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-babysit/SKILL.md +10 -0
- package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-bind/SKILL.md +27 -9
- package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-workflow/SKILL.md +68 -71
- package/build/src/akuma/akuma-call.d.ts +53 -0
- package/build/src/akuma/akuma-call.js +113 -0
- package/build/src/akuma/akuma-instance.d.ts +20 -18
- package/build/src/akuma/akuma-instance.js +65 -175
- package/build/src/akuma/akuma-observe.d.ts +3 -21
- package/build/src/akuma/akuma-observe.js +7 -24
- package/build/src/akuma/{akuma-handle.d.ts → akuma-owner.d.ts} +55 -27
- package/build/src/akuma/{akuma-handle.js → akuma-owner.js} +24 -23
- package/build/src/akuma/akuma-selection-execution.d.ts +51 -0
- package/build/src/akuma/akuma-selection-execution.js +134 -0
- package/build/src/akuma/{fleet-execution.d.ts → akuma-wait.d.ts} +24 -44
- package/build/src/akuma/akuma-wait.js +113 -0
- package/build/src/akuma/akuma.d.ts +35 -89
- package/build/src/akuma/akuma.js +148 -30
- package/build/src/akuma/archetype.d.ts +12 -0
- package/build/src/akuma/archetype.js +47 -19
- package/build/src/akuma/body.d.ts +76 -36
- package/build/src/akuma/body.js +84 -49
- package/build/src/akuma/call-initial-tell.d.ts +131 -22
- package/build/src/akuma/call-initial-tell.js +31 -1
- package/build/src/akuma/call-request.d.ts +237 -31
- package/build/src/akuma/call-request.js +67 -94
- package/build/src/akuma/coordinate.d.ts +15 -5
- package/build/src/akuma/coordinate.js +12 -22
- package/build/src/akuma/dispatch-association.d.ts +1 -1
- package/build/src/akuma/dispatch-association.js +1 -10
- package/build/src/akuma/heart/activity-schema.d.ts +325 -0
- package/build/src/akuma/heart/activity-schema.js +53 -0
- package/build/src/akuma/heart/facts.d.ts +1 -6
- package/build/src/akuma/heart/index.d.ts +3 -1
- package/build/src/akuma/heart/index.js +4 -1
- package/build/src/akuma/heart/rows.d.ts +49 -2
- package/build/src/akuma/heart/rows.js +16 -2
- package/build/src/akuma/heart/soul.d.ts +1 -0
- package/build/src/akuma/heart/soul.js +6 -4
- package/build/src/akuma/heart/tells.d.ts +1 -0
- package/build/src/akuma/heart/tells.js +18 -0
- package/build/src/akuma/identity.d.ts +10 -7
- package/build/src/akuma/identity.js +23 -0
- package/build/src/akuma/index.d.ts +10 -8
- package/build/src/akuma/index.js +2 -2
- package/build/src/akuma/nuke.d.ts +3 -0
- package/build/src/akuma/nuke.js +13 -7
- package/build/src/akuma/projection.d.ts +0 -5
- package/build/src/akuma/projection.js +22 -43
- package/build/src/akuma/provider-recipe.d.ts +58 -13
- package/build/src/akuma/provider-recipe.js +62 -80
- package/build/src/akuma/provider.d.ts +6 -76
- package/build/src/akuma/provider.js +11 -219
- package/build/src/akuma/providers/acp/config.d.ts +2 -0
- package/build/src/akuma/providers/acp/config.js +26 -1
- package/build/src/akuma/providers/acp/core.d.ts +7 -0
- package/build/src/akuma/providers/acp/core.js +49 -18
- package/build/src/akuma/providers/acp/index.js +14 -6
- package/build/src/akuma/providers/grok-build/index.js +44 -13
- package/build/src/akuma/providers/index.d.ts +3 -3
- package/build/src/akuma/providers/index.js +2 -13
- package/build/src/akuma/providers/opencode-sdk/event-stream.d.ts +28 -0
- package/build/src/akuma/providers/opencode-sdk/event-stream.js +92 -0
- package/build/src/akuma/providers/opencode-sdk/events.d.ts +0 -1
- package/build/src/akuma/providers/opencode-sdk/index.js +200 -64
- package/build/src/akuma/providers/opencode-sdk/session.d.ts +41 -1
- package/build/src/akuma/providers/opencode-sdk/session.js +69 -2
- package/build/src/akuma/providers/pi/events.js +5 -2
- package/build/src/akuma/providers/pi/index.d.ts +3 -4
- package/build/src/akuma/providers/pi/index.js +99 -45
- package/build/src/akuma/publication.d.ts +84 -3
- package/build/src/akuma/publication.js +145 -2
- package/build/src/akuma/read-pool.d.ts +2 -0
- package/build/src/akuma/read-pool.js +15 -0
- package/build/src/akuma/request-rendezvous.js +10 -0
- package/build/src/akuma/request-serve.js +7 -0
- package/build/src/akuma/request-wire.d.ts +14 -26
- package/build/src/akuma/request-wire.js +4 -0
- package/build/src/akuma/requests.d.ts +0 -2
- package/build/src/akuma/requests.js +0 -17
- package/build/src/akuma/{fleet-observation.d.ts → selection-observation.d.ts} +37 -36
- package/build/src/akuma/selection-observation.js +65 -0
- package/build/src/akuma/{fleet-owner-port.d.ts → selection-owner-port.d.ts} +3 -3
- package/build/src/akuma/{fleet-owner-port.js → selection-owner-port.js} +11 -17
- package/build/src/akuma/{fleet-request.d.ts → selection-request.d.ts} +42 -82
- package/build/src/akuma/{fleet-request.js → selection-request.js} +92 -136
- package/build/src/akuma/turn-drive.js +73 -14
- package/build/src/akuma-body.js +91 -56
- package/build/src/body/amend.d.ts +5 -0
- package/build/src/body/amend.js +26 -50
- package/build/src/body/arc.d.ts +4 -2
- package/build/src/body/arc.js +19 -26
- package/build/src/body/criteria.d.ts +6 -0
- package/build/src/body/criteria.js +37 -0
- package/build/src/body/decode.js +5 -42
- package/build/src/body/region.d.ts +5 -0
- package/build/src/body/region.js +45 -2
- package/build/src/body/render.js +2 -4
- package/build/src/cli/activity.d.ts +26 -0
- package/build/src/cli/activity.js +75 -0
- package/build/src/cli/actor.d.ts +3 -1
- package/build/src/cli/actor.js +15 -2
- package/build/src/cli/commands/akuma-grammar.d.ts +75 -0
- package/build/src/cli/commands/akuma-grammar.js +414 -0
- package/build/src/cli/commands/akuma.d.ts +5 -69
- package/build/src/cli/commands/akuma.js +352 -319
- package/build/src/cli/commands/amend.d.ts +4 -5
- package/build/src/cli/commands/amend.js +1 -2
- package/build/src/cli/commands/bind.d.ts +4 -5
- package/build/src/cli/commands/bind.js +7 -10
- package/build/src/cli/commands/contract-grammar.d.ts +112 -0
- package/build/src/cli/commands/contract-grammar.js +282 -0
- package/build/src/cli/commands/contract-help.d.ts +17 -22
- package/build/src/cli/commands/contract-help.js +37 -24
- package/build/src/cli/commands/contract.d.ts +18 -97
- package/build/src/cli/commands/contract.js +621 -233
- package/build/src/cli/commands/install.d.ts +1 -1
- package/build/src/cli/commands/install.js +2 -2
- package/build/src/cli/commands/task-grammar.d.ts +19 -0
- package/build/src/cli/commands/task-grammar.js +438 -0
- package/build/src/cli/commands/task-query.js +23 -104
- package/build/src/cli/commands/task.d.ts +5 -20
- package/build/src/cli/commands/task.js +414 -364
- package/build/src/cli/coordinates.d.ts +10 -0
- package/build/src/cli/coordinates.js +20 -0
- package/build/src/cli/draft.d.ts +7 -1
- package/build/src/cli/main.js +10 -1
- package/build/src/cli/parse.d.ts +8 -9
- package/build/src/cli/parse.js +62 -62
- package/build/src/cli/render/akuma-activity.d.ts +54 -36
- package/build/src/cli/render/akuma-activity.js +262 -242
- package/build/src/cli/render/akuma-tool.d.ts +8 -4
- package/build/src/cli/render/akuma-tool.js +6 -5
- package/build/src/cli/render/akuma.d.ts +36 -16
- package/build/src/cli/render/akuma.js +65 -132
- package/build/src/cli/render/audit.d.ts +6 -2
- package/build/src/cli/render/audit.js +59 -28
- package/build/src/cli/render/catalog.d.ts +11 -2
- package/build/src/cli/render/catalog.js +75 -95
- package/build/src/cli/render/contract-history.d.ts +3 -1
- package/build/src/cli/render/contract-history.js +215 -22
- package/build/src/cli/render/contract-observation.d.ts +10 -5
- package/build/src/cli/render/contract-observation.js +29 -46
- package/build/src/cli/render/contract.d.ts +10 -3
- package/build/src/cli/render/contract.js +252 -103
- package/build/src/cli/render/effects.d.ts +26 -0
- package/build/src/cli/render/effects.js +41 -0
- package/build/src/cli/render/execution-progress.d.ts +18 -6
- package/build/src/cli/render/execution-progress.js +34 -31
- package/build/src/cli/render/kanshi-akuma.d.ts +1 -2
- package/build/src/cli/render/kanshi-akuma.js +5 -26
- package/build/src/cli/render/kanshi.js +107 -128
- package/build/src/cli/render/marks.d.ts +13 -0
- package/build/src/cli/render/marks.js +74 -0
- package/build/src/cli/render/nuke.js +18 -7
- package/build/src/cli/render/receipt.d.ts +10 -4
- package/build/src/cli/render/receipt.js +124 -44
- package/build/src/cli/render/reconcile.d.ts +5 -0
- package/build/src/cli/render/reconcile.js +152 -0
- package/build/src/cli/render/refusal.d.ts +21 -4
- package/build/src/cli/render/refusal.js +60 -33
- package/build/src/cli/render/region.js +3 -2
- package/build/src/cli/render/settings.js +2 -12
- package/build/src/cli/render/task.d.ts +37 -6
- package/build/src/cli/render/task.js +161 -157
- package/build/src/cli/render/terminal.d.ts +20 -1
- package/build/src/cli/render/terminal.js +92 -18
- package/build/src/cli/runtime.d.ts +32 -8
- package/build/src/cli/runtime.js +157 -165
- package/build/src/cli/selectors.d.ts +5 -2
- package/build/src/cli/selectors.js +11 -3
- package/build/src/cli/streams.d.ts +11 -0
- package/build/src/cli/streams.js +32 -0
- package/build/src/cli/usage.d.ts +2 -0
- package/build/src/cli/usage.js +12 -8
- package/build/src/contract-guidance.js +3 -7
- package/build/src/contract-worktree.d.ts +20 -28
- package/build/src/contract-worktree.js +18 -70
- package/build/src/coordination/durable-file.d.ts +2 -2
- package/build/src/coordination/durable-file.js +0 -27
- package/build/src/core/facts/codec.d.ts +1 -2
- package/build/src/core/facts/codec.js +6 -7
- package/build/src/core/facts/gate.d.ts +0 -1
- package/build/src/core/facts/gate.js +0 -82
- package/build/src/core/facts/types.d.ts +1 -2
- package/build/src/core/verbs/abandon.d.ts +2 -6
- package/build/src/core/verbs/abandon.js +0 -16
- package/build/src/core/verbs/amend.d.ts +0 -1
- package/build/src/core/verbs/amend.js +0 -20
- package/build/src/core/verbs/arc.d.ts +7 -8
- package/build/src/core/verbs/arc.js +2 -19
- package/build/src/core/verbs/attestation.d.ts +2 -6
- package/build/src/core/verbs/attestation.js +0 -16
- package/build/src/core/verbs/bind.d.ts +0 -1
- package/build/src/core/verbs/bind.js +0 -16
- package/build/src/core/verbs/deliver.d.ts +0 -1
- package/build/src/core/verbs/deliver.js +0 -16
- package/build/src/core/verbs/placement.d.ts +2 -1
- package/build/src/core/verbs/placement.js +10 -59
- package/build/src/git/admission.d.ts +6 -4
- package/build/src/git/admission.js +4 -0
- package/build/src/git/hooks.d.ts +55 -30
- package/build/src/git/hooks.js +30 -3
- package/build/src/git/identity.d.ts +6 -0
- package/build/src/git/identity.js +47 -0
- package/build/src/git/integration.d.ts +31 -13
- package/build/src/git/integration.js +32 -1
- package/build/src/git/nuke.d.ts +10 -1
- package/build/src/git/nuke.js +31 -11
- package/build/src/git/observe.js +2 -15
- package/build/src/git/private-state-seat.d.ts +6 -7
- package/build/src/git/private-state-seat.js +8 -6
- package/build/src/git/read-observation.d.ts +6 -1
- package/build/src/git/read-observation.js +81 -46
- package/build/src/git/reconcile.d.ts +117 -40
- package/build/src/git/reconcile.js +169 -40
- package/build/src/git/scratch.d.ts +7 -4
- package/build/src/git/scratch.js +28 -6
- package/build/src/git/target-placement.d.ts +53 -38
- package/build/src/git/target-placement.js +69 -54
- package/build/src/git/tender.d.ts +37 -28
- package/build/src/git/tender.js +39 -0
- package/build/src/git/terminal-reconcile.js +21 -23
- package/build/src/git/terminal-seal.d.ts +8 -6
- package/build/src/git/terminal-seal.js +10 -0
- package/build/src/git/workspace.d.ts +29 -15
- package/build/src/git/workspace.js +28 -2
- package/build/src/identity/normalize.js +19 -6
- package/build/src/index.d.ts +78 -7
- package/build/src/index.js +52 -4
- package/build/src/kanshi/read.d.ts +3 -3
- package/build/src/kanshi/read.js +21 -21
- package/build/src/kanshi/report.d.ts +9 -8
- package/build/src/kanshi/roster.d.ts +2 -0
- package/build/src/kanshi/roster.js +2 -0
- package/build/src/kanshi/select.js +7 -3
- package/build/src/library/address.d.ts +3 -7
- package/build/src/library/address.js +7 -7
- package/build/src/library/akuma-creation.d.ts +21 -32
- package/build/src/library/akuma-creation.js +148 -165
- package/build/src/library/akumas.d.ts +20 -22
- package/build/src/library/akumas.js +43 -20
- package/build/src/library/bind.d.ts +107 -13
- package/build/src/library/bind.js +29 -23
- package/build/src/library/continuation.d.ts +556 -28
- package/build/src/library/continuation.js +29 -54
- package/build/src/library/contract-composition.d.ts +40 -0
- package/build/src/library/contract-composition.js +105 -0
- package/build/src/library/contract-creation.d.ts +7 -0
- package/build/src/library/contract-creation.js +192 -0
- package/build/src/library/contract-execution.d.ts +29 -40
- package/build/src/library/contract-execution.js +503 -128
- package/build/src/library/contract-operations.d.ts +275 -134
- package/build/src/library/contract-operations.js +83 -92
- package/build/src/library/contract-outcomes.d.ts +71 -0
- package/build/src/library/contract-outcomes.js +32 -0
- package/build/src/library/contract-settings.d.ts +25 -0
- package/build/src/library/contract-settings.js +135 -0
- package/build/src/library/contract-types.d.ts +17 -38
- package/build/src/library/delivery.d.ts +530 -10
- package/build/src/library/delivery.js +20 -45
- package/build/src/library/input.d.ts +3 -1
- package/build/src/library/input.js +11 -16
- package/build/src/library/invocation.d.ts +87 -0
- package/build/src/library/invocation.js +290 -0
- package/build/src/library/keiyaku.d.ts +45 -22
- package/build/src/library/keiyaku.js +134 -8
- package/build/src/library/nuke.d.ts +2 -11
- package/build/src/library/nuke.js +70 -57
- package/build/src/library/outcome.d.ts +13196 -0
- package/build/src/library/outcome.js +487 -0
- package/build/src/library/reconcile.d.ts +96 -24
- package/build/src/library/reconcile.js +102 -42
- package/build/src/library/refusal.d.ts +470 -42
- package/build/src/library/refusal.js +55 -143
- package/build/src/library/region.d.ts +15 -7
- package/build/src/library/region.js +23 -3
- package/build/src/library/repo.d.ts +2 -12
- package/build/src/library/repo.js +1 -22
- package/build/src/library/selection.d.ts +121 -0
- package/build/src/library/{fleet.js → selection.js} +169 -152
- package/build/src/plugin/public.d.ts +2 -0
- package/build/src/protocol/abandon.d.ts +2 -2
- package/build/src/protocol/abandon.js +1 -0
- package/build/src/protocol/amend.js +1 -0
- package/build/src/protocol/arc.d.ts +6 -4
- package/build/src/protocol/attempt.d.ts +4 -2
- package/build/src/protocol/attempt.js +10 -0
- package/build/src/protocol/audit.d.ts +255 -52
- package/build/src/protocol/audit.js +63 -5
- package/build/src/protocol/bind.d.ts +18 -17
- package/build/src/protocol/bind.js +9 -28
- package/build/src/protocol/completion.d.ts +256 -22
- package/build/src/protocol/completion.js +100 -12
- package/build/src/protocol/deliver.d.ts +34 -23
- package/build/src/protocol/deliver.js +39 -25
- package/build/src/protocol/execution-observation.d.ts +36 -37
- package/build/src/protocol/execution-observation.js +7 -9
- package/build/src/protocol/intent.d.ts +101 -30
- package/build/src/protocol/intent.js +74 -1
- package/build/src/protocol/operations.d.ts +570 -64
- package/build/src/protocol/operations.js +189 -9
- package/build/src/protocol/outcome.d.ts +2 -1
- package/build/src/protocol/placement.d.ts +2 -2
- package/build/src/protocol/placement.js +3 -1
- package/build/src/protocol/progress.d.ts +108 -65
- package/build/src/protocol/progress.js +82 -132
- package/build/src/protocol/read/status.d.ts +4 -3
- package/build/src/protocol/read/status.js +6 -5
- package/build/src/protocol/reconcile.d.ts +3 -3
- package/build/src/protocol/reconcile.js +4 -0
- package/build/src/protocol/reintegrate.d.ts +2 -2
- package/build/src/protocol/review.d.ts +30 -12
- package/build/src/protocol/review.js +15 -24
- package/build/src/protocol/run.d.ts +34 -5
- package/build/src/protocol/run.js +24 -12
- package/build/src/runtime/proc/windows-launch.exe +0 -0
- package/build/src/settings.d.ts +0 -10
- package/build/src/settings.js +0 -76
- package/build/src/settlement/holder.d.ts +1 -1
- package/build/src/settlement/settle.d.ts +25 -16
- package/build/src/settlement/settle.js +80 -20
- package/build/src/task/board.d.ts +3 -1
- package/build/src/task/board.js +13 -17
- package/build/src/task/catalog.d.ts +0 -4
- package/build/src/task/catalog.js +0 -15
- package/build/src/task/compose-language.d.ts +19 -9
- package/build/src/task/compose-language.js +30 -20
- package/build/src/task/compose.d.ts +7 -37
- package/build/src/task/compose.js +20 -2
- package/build/src/task/created-observation.d.ts +0 -1
- package/build/src/task/created-observation.js +1 -4
- package/build/src/task/document.d.ts +12 -2
- package/build/src/task/document.js +4 -0
- package/build/src/task/identity.d.ts +4 -1
- package/build/src/task/identity.js +21 -17
- package/build/src/task/index.d.ts +36 -16
- package/build/src/task/index.js +103 -96
- package/build/src/task/lifecycle-operations.d.ts +1 -1
- package/build/src/task/mutation-result.d.ts +647 -586
- package/build/src/task/mutation-result.js +79 -46
- package/build/src/task/mutation.d.ts +298 -270
- package/build/src/task/mutation.js +93 -110
- package/build/src/task/operation-types.d.ts +6 -49
- package/build/src/task/operations.d.ts +2 -1
- package/build/src/task/operations.js +35 -12
- package/build/src/task/query.d.ts +9 -3
- package/build/src/task/query.js +42 -16
- package/build/src/task/store.d.ts +2 -1
- package/build/src/task/store.js +10 -14
- package/build/src/verification/declaration.d.ts +0 -1
- package/build/src/verification/declaration.js +1 -18
- package/build/src/verification/execution.d.ts +6 -2
- package/build/src/verification/observation.d.ts +1 -1
- package/package.json +2 -18
- package/build/src/akuma/akuma-product.d.ts +0 -58
- package/build/src/akuma/akuma-product.js +0 -276
- package/build/src/akuma/fleet-execution.js +0 -234
- package/build/src/akuma/fleet-observation.js +0 -97
- package/build/src/cli/accepted.d.ts +0 -24
- package/build/src/cli/accepted.js +0 -167
- package/build/src/cli/catalog.d.ts +0 -45
- package/build/src/cli/catalog.js +0 -1
- package/build/src/cli/commands/akuma-invoke.d.ts +0 -114
- package/build/src/cli/commands/akuma-invoke.js +0 -375
- package/build/src/cli/commands/contract-invoke.d.ts +0 -34
- package/build/src/cli/commands/contract-invoke.js +0 -259
- package/build/src/cli/commands/nuke.d.ts +0 -10
- package/build/src/cli/commands/nuke.js +0 -20
- package/build/src/cli/commands/status-set.d.ts +0 -4
- package/build/src/cli/commands/status-set.js +0 -52
- package/build/src/cli/commands/task-invoke.d.ts +0 -49
- package/build/src/cli/commands/task-invoke.js +0 -306
- package/build/src/cli/invoke.d.ts +0 -27
- package/build/src/cli/invoke.js +0 -521
- package/build/src/cli/render/board.d.ts +0 -3
- package/build/src/cli/render/board.js +0 -25
- package/build/src/cli/render/status-set.d.ts +0 -5
- package/build/src/cli/render/status-set.js +0 -19
- package/build/src/cli/render/text.d.ts +0 -3
- package/build/src/cli/render/text.js +0 -33
- package/build/src/cli/result.d.ts +0 -240
- package/build/src/cli/result.js +0 -1
- package/build/src/git/result-codec.d.ts +0 -29
- package/build/src/git/result-codec.js +0 -309
- package/build/src/kanshi/fleet.d.ts +0 -6
- package/build/src/kanshi/fleet.js +0 -27
- package/build/src/library/audit.d.ts +0 -29
- package/build/src/library/audit.js +0 -41
- package/build/src/library/composition.d.ts +0 -15
- package/build/src/library/composition.js +0 -28
- package/build/src/library/configuration.d.ts +0 -4
- package/build/src/library/configuration.js +0 -2
- package/build/src/library/contract-bind.d.ts +0 -31
- package/build/src/library/contract-bind.js +0 -140
- package/build/src/library/contract-forwarding.d.ts +0 -55
- package/build/src/library/contract-forwarding.js +0 -67
- package/build/src/library/contract-handle.d.ts +0 -50
- package/build/src/library/contract-handle.js +0 -385
- package/build/src/library/contract.d.ts +0 -46
- package/build/src/library/contract.js +0 -73
- package/build/src/library/execution-result.d.ts +0 -243
- package/build/src/library/execution-result.js +0 -101
- package/build/src/library/execution.d.ts +0 -8
- package/build/src/library/execution.js +0 -102
- package/build/src/library/fleet.d.ts +0 -83
- package/build/src/library/mutation.d.ts +0 -501
- package/build/src/library/mutation.js +0 -248
- package/build/src/library/result-codec.d.ts +0 -2
- package/build/src/library/result-codec.js +0 -12
- package/build/src/protocol/result-codec.d.ts +0 -23
- package/build/src/protocol/result-codec.js +0 -488
- package/build/src/settlement/result-codec.d.ts +0 -2
- package/build/src/settlement/result-codec.js +0 -56
- package/build/src/task/public.d.ts +0 -2
- package/build/src/task/public.js +0 -1
|
@@ -1,21 +1,22 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { AkumaNotBornError, AkumaObservationError } from "./akuma-errors.js";
|
|
3
|
+
import { akumaIdSchema } from "./identity.js";
|
|
2
4
|
import { requestBodyCommand } from "./request-rendezvous.js";
|
|
3
5
|
import { eraseRequestCommand, } from "./request-wire.js";
|
|
4
|
-
import { fleetResultSchemas, isKillResult, isTellResult, isTellWaitResult, isWaitResult, } from "./fleet-observation.js";
|
|
5
|
-
import { z } from "zod";
|
|
6
6
|
import { schemaJsonText } from "./schema.js";
|
|
7
|
-
import {
|
|
7
|
+
import { selectionResultSchemas, } from "./selection-observation.js";
|
|
8
8
|
const nonblankTextSchema = z.string().refine((value) => value.trim() !== "");
|
|
9
|
-
const
|
|
9
|
+
const selectionTargetsSchema = z
|
|
10
10
|
.array(akumaIdSchema)
|
|
11
11
|
.min(1)
|
|
12
12
|
.superRefine((ids, context) => {
|
|
13
13
|
if (new Set(ids).size !== ids.length)
|
|
14
14
|
context.addIssue({ code: "custom", message: "expected a deduplicated target set" });
|
|
15
|
-
})
|
|
15
|
+
})
|
|
16
|
+
.readonly();
|
|
16
17
|
const waitRequestSchema = z
|
|
17
18
|
.object({
|
|
18
|
-
targets:
|
|
19
|
+
targets: selectionTargetsSchema,
|
|
19
20
|
completion: z.enum(["any", "all"]),
|
|
20
21
|
timeoutMs: z.number().int().nonnegative().optional(),
|
|
21
22
|
})
|
|
@@ -26,65 +27,62 @@ const waitRequestSchema = z
|
|
|
26
27
|
...(timeoutMs === undefined ? {} : { timeoutMs }),
|
|
27
28
|
}));
|
|
28
29
|
const tellRequestSchema = z
|
|
29
|
-
.object({ target: akumaIdSchema, body: z.string(), initiator: nonblankTextSchema.optional() })
|
|
30
|
-
.strict()
|
|
31
|
-
.transform((request) => ({ action: "akuma.tell", ...request }));
|
|
32
|
-
const tellAnswerRequestSchema = z
|
|
33
30
|
.object({
|
|
34
31
|
target: akumaIdSchema,
|
|
35
32
|
body: z.string(),
|
|
36
|
-
schemaJson: nonblankTextSchema,
|
|
37
33
|
initiator: nonblankTextSchema.optional(),
|
|
38
34
|
interrupt: z.boolean().optional(),
|
|
39
35
|
})
|
|
40
36
|
.strict()
|
|
41
|
-
.transform((request) => ({ action: "akuma.tell
|
|
42
|
-
const
|
|
37
|
+
.transform((request) => ({ action: "akuma.tell", ...request }));
|
|
38
|
+
const askRequestSchema = z
|
|
43
39
|
.object({
|
|
44
40
|
target: akumaIdSchema,
|
|
45
41
|
body: z.string(),
|
|
46
|
-
timeoutMs: z.number().int().nonnegative(),
|
|
42
|
+
timeoutMs: z.number().int().nonnegative().optional(),
|
|
47
43
|
schemaJson: nonblankTextSchema.optional(),
|
|
48
44
|
initiator: nonblankTextSchema.optional(),
|
|
49
45
|
interrupt: z.boolean().optional(),
|
|
50
46
|
})
|
|
51
47
|
.strict()
|
|
52
|
-
.transform((request) => ({ action: "akuma.
|
|
48
|
+
.transform((request) => ({ action: "akuma.ask", ...request }));
|
|
53
49
|
const killRequestSchema = z
|
|
54
|
-
.object({ targets:
|
|
50
|
+
.object({ targets: selectionTargetsSchema })
|
|
55
51
|
.strict()
|
|
56
52
|
.transform((request) => ({ action: "akuma.kill", ...request }));
|
|
57
53
|
const waitServiceSchema = z.object({ action: z.literal("akuma.wait") }).strict();
|
|
58
54
|
const tellServiceSchema = z
|
|
59
55
|
.object({ action: z.literal("akuma.tell"), target: akumaIdSchema, tellId: nonblankTextSchema })
|
|
60
56
|
.strict();
|
|
61
|
-
const
|
|
62
|
-
.object({ action: z.literal("akuma.
|
|
57
|
+
const askServiceSchema = z
|
|
58
|
+
.object({ action: z.literal("akuma.ask"), target: akumaIdSchema, tellId: nonblankTextSchema })
|
|
63
59
|
.strict();
|
|
64
60
|
const killServiceSchema = z
|
|
65
61
|
.object({
|
|
66
62
|
action: z.literal("akuma.kill"),
|
|
67
|
-
results: z
|
|
63
|
+
results: z
|
|
64
|
+
.array(z.object({ id: akumaIdSchema, evidence: selectionResultSchemas.killEvidence }).strict())
|
|
65
|
+
.readonly(),
|
|
68
66
|
})
|
|
69
67
|
.strict();
|
|
70
68
|
/**
|
|
71
|
-
* A forwarded
|
|
69
|
+
* A forwarded Selection request leaves selection and observation to the parent, so
|
|
72
70
|
* the parent's typed refusal is the only evidence the child can classify on.
|
|
73
71
|
* Transporting it is the codec's own duty: an unencoded failure reaches the
|
|
74
72
|
* caller as an anonymous request error and loses the identity it names.
|
|
75
73
|
*
|
|
76
74
|
* The transport voids a begun request only when the encoded failure proves no
|
|
77
75
|
* product effect. A refused selection or an unreadable observation never
|
|
78
|
-
* reached an action, so
|
|
76
|
+
* reached an action, so Selection proves that through the same refusal envelope
|
|
79
77
|
* the Contract codec uses; a genuinely failed action stays unencoded and
|
|
80
78
|
* keeps its existing anonymous classification.
|
|
81
79
|
*/
|
|
82
|
-
const
|
|
80
|
+
const selectionRefusalSchema = z.union([
|
|
83
81
|
z.object({ kind: z.literal("akuma-not-born"), id: akumaIdSchema }).strict(),
|
|
84
82
|
z.object({ kind: z.literal("akuma-observation"), id: akumaIdSchema, diagnostic: z.string() }).strict(),
|
|
85
83
|
]);
|
|
86
|
-
const
|
|
87
|
-
export function
|
|
84
|
+
const selectionLiveFailureSchema = z.object({ kind: z.literal("refused"), failure: selectionRefusalSchema }).strict();
|
|
85
|
+
export function encodeSelectionLiveFailure(error) {
|
|
88
86
|
const failure = error instanceof AkumaNotBornError
|
|
89
87
|
? { kind: "akuma-not-born", id: error.id }
|
|
90
88
|
: error instanceof AkumaObservationError
|
|
@@ -92,8 +90,8 @@ export function encodeFleetLiveFailure(error) {
|
|
|
92
90
|
: null;
|
|
93
91
|
return failure === null ? null : { kind: "refused", failure };
|
|
94
92
|
}
|
|
95
|
-
export function
|
|
96
|
-
const parsed =
|
|
93
|
+
export function decodeSelectionLiveFailure(value) {
|
|
94
|
+
const parsed = selectionLiveFailureSchema.safeParse(value);
|
|
97
95
|
if (!parsed.success)
|
|
98
96
|
return null;
|
|
99
97
|
const failure = parsed.data.failure;
|
|
@@ -101,49 +99,45 @@ export function decodeFleetLiveFailure(value) {
|
|
|
101
99
|
? new AkumaNotBornError(failure.id)
|
|
102
100
|
: new AkumaObservationError(failure.id, failure.diagnostic);
|
|
103
101
|
}
|
|
104
|
-
function
|
|
102
|
+
function decodeSelectionRequest(action, value) {
|
|
105
103
|
const schema = action === "akuma.wait"
|
|
106
104
|
? waitRequestSchema
|
|
107
105
|
: action === "akuma.tell"
|
|
108
106
|
? tellRequestSchema
|
|
109
|
-
: action === "akuma.
|
|
110
|
-
?
|
|
111
|
-
:
|
|
112
|
-
? tellWaitRequestSchema
|
|
113
|
-
: killRequestSchema;
|
|
107
|
+
: action === "akuma.ask"
|
|
108
|
+
? askRequestSchema
|
|
109
|
+
: killRequestSchema;
|
|
114
110
|
const parsed = schema.safeParse(value);
|
|
115
111
|
return parsed.success ? parsed.data : null;
|
|
116
112
|
}
|
|
117
|
-
function
|
|
113
|
+
function decodeSelectionService(action, value) {
|
|
118
114
|
const schema = action === "akuma.wait"
|
|
119
115
|
? waitServiceSchema
|
|
120
|
-
: action === "akuma.tell"
|
|
116
|
+
: action === "akuma.tell"
|
|
121
117
|
? tellServiceSchema
|
|
122
|
-
: action === "akuma.
|
|
123
|
-
?
|
|
118
|
+
: action === "akuma.ask"
|
|
119
|
+
? askServiceSchema
|
|
124
120
|
: killServiceSchema;
|
|
125
121
|
const parsed = schema.safeParse(value);
|
|
126
122
|
if (!parsed.success)
|
|
127
|
-
throw new Error("malformed stored
|
|
123
|
+
throw new Error("malformed stored Selection service evidence");
|
|
128
124
|
return parsed.data;
|
|
129
125
|
}
|
|
130
|
-
function
|
|
131
|
-
if (action === "akuma.tell-answer")
|
|
132
|
-
return value;
|
|
126
|
+
function decodedSelectionResult(action, value) {
|
|
133
127
|
const schema = action === "akuma.wait"
|
|
134
|
-
?
|
|
128
|
+
? selectionResultSchemas.wait
|
|
135
129
|
: action === "akuma.tell"
|
|
136
|
-
?
|
|
137
|
-
: action === "akuma.
|
|
138
|
-
?
|
|
139
|
-
:
|
|
130
|
+
? selectionResultSchemas.tell
|
|
131
|
+
: action === "akuma.ask"
|
|
132
|
+
? selectionResultSchemas.ask
|
|
133
|
+
: selectionResultSchemas.kill;
|
|
140
134
|
const parsed = schema.safeParse(value);
|
|
141
135
|
if (!parsed.success)
|
|
142
136
|
throw new Error(`Akuma body request returned an invalid live result for ${action}`);
|
|
143
137
|
return parsed.data;
|
|
144
138
|
}
|
|
145
139
|
/** Akuma owns Body Request payload, live result, and durable service codecs for wait/tell/kill. */
|
|
146
|
-
export function
|
|
140
|
+
export function selectionRequestProtocol(action) {
|
|
147
141
|
return {
|
|
148
142
|
action,
|
|
149
143
|
supportsCancellation: true,
|
|
@@ -151,70 +145,58 @@ export function fleetRequestProtocol(action) {
|
|
|
151
145
|
const { action: _action, ...payload } = request;
|
|
152
146
|
return payload;
|
|
153
147
|
},
|
|
154
|
-
decodeRequest: (payload) =>
|
|
148
|
+
decodeRequest: (payload) => decodeSelectionRequest(action, payload),
|
|
155
149
|
encodeResult: (result) => result,
|
|
156
|
-
decodeResult: (result) =>
|
|
157
|
-
encodeFailure:
|
|
158
|
-
decodeFailure:
|
|
159
|
-
decodeReference: (reference) =>
|
|
150
|
+
decodeResult: (result) => decodedSelectionResult(action, result),
|
|
151
|
+
encodeFailure: encodeSelectionLiveFailure,
|
|
152
|
+
decodeFailure: decodeSelectionLiveFailure,
|
|
153
|
+
decodeReference: (reference) => decodeSelectionService(action, reference),
|
|
160
154
|
isPermitted: (allowed) => action === "akuma.wait" ||
|
|
161
|
-
((action === "akuma.tell" || action === "akuma.
|
|
162
|
-
allowed.includes("akuma.tell")) ||
|
|
155
|
+
((action === "akuma.tell" || action === "akuma.ask") && allowed.includes("akuma.tell")) ||
|
|
163
156
|
(action === "akuma.kill" && allowed.includes("akuma.kill")),
|
|
164
157
|
};
|
|
165
158
|
}
|
|
166
|
-
export function
|
|
159
|
+
export function selectionRequestCommand(action, port) {
|
|
167
160
|
return {
|
|
168
161
|
completion: "service",
|
|
169
|
-
protocol:
|
|
170
|
-
encodeService: (service) =>
|
|
171
|
-
decodeService: (service) =>
|
|
172
|
-
projectService: (service) =>
|
|
162
|
+
protocol: selectionRequestProtocol(action),
|
|
163
|
+
encodeService: (service) => service,
|
|
164
|
+
decodeService: (service) => decodeSelectionService(action, service),
|
|
165
|
+
projectService: (service) => service,
|
|
173
166
|
execute: async (request, facts) => {
|
|
174
167
|
if (request.action === "akuma.wait") {
|
|
175
168
|
return {
|
|
169
|
+
kind: "served",
|
|
176
170
|
result: await port.wait({ ...request, signal: facts.signal }),
|
|
177
171
|
service: { action: request.action },
|
|
178
172
|
};
|
|
179
173
|
}
|
|
180
174
|
if (request.action === "akuma.tell") {
|
|
181
175
|
return {
|
|
176
|
+
kind: "served",
|
|
182
177
|
result: await port.tell({
|
|
183
178
|
target: request.target,
|
|
184
179
|
body: request.body,
|
|
185
180
|
tellId: facts.id,
|
|
186
181
|
...(request.initiator === undefined ? {} : { initiator: request.initiator }),
|
|
182
|
+
...(request.interrupt === undefined ? {} : { interrupt: request.interrupt }),
|
|
187
183
|
recordedAt: facts.admittedAt,
|
|
188
184
|
signal: facts.signal,
|
|
189
185
|
}),
|
|
190
186
|
service: { action: request.action, target: request.target, tellId: facts.id },
|
|
191
187
|
};
|
|
192
188
|
}
|
|
193
|
-
if (request.action === "akuma.
|
|
194
|
-
if (port.
|
|
195
|
-
throw new Error("
|
|
196
|
-
return {
|
|
197
|
-
result: await port.tellAnswer({
|
|
198
|
-
target: request.target,
|
|
199
|
-
body: request.body,
|
|
200
|
-
schemaJson: request.schemaJson,
|
|
201
|
-
...(request.initiator === undefined ? {} : { initiator: request.initiator }),
|
|
202
|
-
...(request.interrupt === undefined ? {} : { interrupt: request.interrupt }),
|
|
203
|
-
signal: facts.signal,
|
|
204
|
-
}),
|
|
205
|
-
service: { action: "akuma.tell", target: request.target, tellId: facts.id },
|
|
206
|
-
};
|
|
207
|
-
}
|
|
208
|
-
if (request.action === "akuma.tell-wait") {
|
|
209
|
-
if (port.tellWait === undefined)
|
|
210
|
-
throw new Error("bounded Tell Fleet port is unavailable");
|
|
189
|
+
if (request.action === "akuma.ask") {
|
|
190
|
+
if (port.ask === undefined)
|
|
191
|
+
throw new Error("bounded Tell Selection port is unavailable");
|
|
211
192
|
return {
|
|
212
|
-
|
|
193
|
+
kind: "served",
|
|
194
|
+
result: await port.ask({
|
|
213
195
|
target: request.target,
|
|
214
196
|
body: request.body,
|
|
215
197
|
tellId: facts.id,
|
|
216
198
|
recordedAt: facts.admittedAt,
|
|
217
|
-
timeoutMs: request.timeoutMs,
|
|
199
|
+
...(request.timeoutMs === undefined ? {} : { timeoutMs: request.timeoutMs }),
|
|
218
200
|
...(request.schemaJson === undefined ? {} : { schemaJson: request.schemaJson }),
|
|
219
201
|
...(request.initiator === undefined ? {} : { initiator: request.initiator }),
|
|
220
202
|
...(request.interrupt === undefined ? {} : { interrupt: request.interrupt }),
|
|
@@ -225,64 +207,37 @@ export function fleetRequestCommand(action, port) {
|
|
|
225
207
|
}
|
|
226
208
|
const result = await port.kill({ targets: request.targets, signal: facts.signal });
|
|
227
209
|
if ("result" in result)
|
|
228
|
-
return { result: result.result, service: { action: request.action, results: result.service } };
|
|
210
|
+
return { kind: "served", result: result.result, service: { action: request.action, results: result.service } };
|
|
229
211
|
return {
|
|
212
|
+
kind: "served",
|
|
230
213
|
result,
|
|
231
214
|
service: { action: request.action, results: result.results.map(({ id, evidence }) => ({ id, evidence })) },
|
|
232
215
|
};
|
|
233
216
|
},
|
|
234
217
|
};
|
|
235
218
|
}
|
|
236
|
-
export function
|
|
219
|
+
export function selectionRequestCommands(port) {
|
|
237
220
|
return {
|
|
238
|
-
"akuma.wait": eraseRequestCommand(
|
|
239
|
-
"akuma.tell": eraseRequestCommand(
|
|
240
|
-
"akuma.
|
|
241
|
-
"akuma.
|
|
242
|
-
"akuma.kill": eraseRequestCommand(fleetRequestCommand("akuma.kill", port)),
|
|
221
|
+
"akuma.wait": eraseRequestCommand(selectionRequestCommand("akuma.wait", port)),
|
|
222
|
+
"akuma.tell": eraseRequestCommand(selectionRequestCommand("akuma.tell", port)),
|
|
223
|
+
"akuma.ask": eraseRequestCommand(selectionRequestCommand("akuma.ask", port)),
|
|
224
|
+
"akuma.kill": eraseRequestCommand(selectionRequestCommand("akuma.kill", port)),
|
|
243
225
|
};
|
|
244
226
|
}
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
...(input.initiator === undefined ? {} : { initiator: input.initiator }),
|
|
255
|
-
...(input.interrupt === undefined ? {} : { interrupt: input.interrupt }),
|
|
256
|
-
},
|
|
257
|
-
...(input.signal === undefined ? {} : { signal: input.signal }),
|
|
258
|
-
});
|
|
259
|
-
if (response.kind !== "returned")
|
|
260
|
-
throw new Error("Akuma body request terminal schema answer cannot reproduce an expired live result");
|
|
261
|
-
try {
|
|
262
|
-
return input.schema.decode(response.result);
|
|
263
|
-
}
|
|
264
|
-
catch (error) {
|
|
265
|
-
throw new AkumaDecodeError(error instanceof Error ? error.message : "Answer failed schema decode", typeof response.result === "string" ? response.result : JSON.stringify(response.result));
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
function forwardedFleetCommandResult(response, action) {
|
|
269
|
-
if (response.kind === "returned") {
|
|
270
|
-
if (action === "akuma.wait" && isWaitResult(response.result))
|
|
271
|
-
return response.result;
|
|
272
|
-
if (action === "akuma.tell" && isTellResult(response.result))
|
|
273
|
-
return response.result;
|
|
274
|
-
if (action === "akuma.tell-wait" && isTellWaitResult(response.result))
|
|
275
|
-
return response.result;
|
|
276
|
-
if (action === "akuma.kill" && isKillResult(response.result))
|
|
277
|
-
return response.result;
|
|
278
|
-
throw new Error(`transport integrity: request Fleet ${action} returned an invalid live result`);
|
|
279
|
-
}
|
|
280
|
-
throw new Error("Akuma body request terminal Fleet reference cannot reproduce an expired live result");
|
|
227
|
+
/**
|
|
228
|
+
* The one terminal guard for every forwarded Selection operation: a returned
|
|
229
|
+
* live result is the operation's own answer, and a durable reference can never
|
|
230
|
+
* reproduce an expired live result.
|
|
231
|
+
*/
|
|
232
|
+
function forwardedSelectionResult(response) {
|
|
233
|
+
if (response.kind === "returned")
|
|
234
|
+
return response.result;
|
|
235
|
+
throw new Error("Akuma body request terminal Selection reference cannot reproduce an expired live result");
|
|
281
236
|
}
|
|
282
|
-
export async function
|
|
237
|
+
export async function requestForwardedSelectionWait(input) {
|
|
283
238
|
const response = await requestBodyCommand({
|
|
284
239
|
directory: input.directory,
|
|
285
|
-
command:
|
|
240
|
+
command: selectionRequestProtocol("akuma.wait"),
|
|
286
241
|
value: {
|
|
287
242
|
action: "akuma.wait",
|
|
288
243
|
targets: input.targets,
|
|
@@ -291,45 +246,46 @@ export async function requestForwardedFleetWait(input) {
|
|
|
291
246
|
},
|
|
292
247
|
...(input.signal === undefined ? {} : { signal: input.signal }),
|
|
293
248
|
});
|
|
294
|
-
return
|
|
249
|
+
return forwardedSelectionResult(response);
|
|
295
250
|
}
|
|
296
|
-
export async function
|
|
251
|
+
export async function requestForwardedSelectionTell(input) {
|
|
297
252
|
const response = await requestBodyCommand({
|
|
298
253
|
directory: input.directory,
|
|
299
|
-
command:
|
|
254
|
+
command: selectionRequestProtocol("akuma.tell"),
|
|
300
255
|
value: {
|
|
301
256
|
action: "akuma.tell",
|
|
302
257
|
target: input.target,
|
|
303
258
|
body: input.body,
|
|
304
259
|
...(input.initiator === undefined ? {} : { initiator: input.initiator }),
|
|
260
|
+
...(input.interrupt === true ? { interrupt: true } : {}),
|
|
305
261
|
},
|
|
306
262
|
...(input.signal === undefined ? {} : { signal: input.signal }),
|
|
307
263
|
});
|
|
308
|
-
return
|
|
264
|
+
return forwardedSelectionResult(response);
|
|
309
265
|
}
|
|
310
|
-
export async function
|
|
266
|
+
export async function requestForwardedSelectionAsk(input) {
|
|
311
267
|
const response = await requestBodyCommand({
|
|
312
268
|
directory: input.directory,
|
|
313
|
-
command:
|
|
269
|
+
command: selectionRequestProtocol("akuma.ask"),
|
|
314
270
|
value: {
|
|
315
|
-
action: "akuma.
|
|
271
|
+
action: "akuma.ask",
|
|
316
272
|
target: input.target,
|
|
317
273
|
body: input.body,
|
|
318
|
-
timeoutMs: input.timeoutMs,
|
|
274
|
+
...(input.timeoutMs === undefined ? {} : { timeoutMs: input.timeoutMs }),
|
|
319
275
|
...(input.schema === undefined ? {} : { schemaJson: schemaJsonText(input.schema) }),
|
|
320
276
|
...(input.initiator === undefined ? {} : { initiator: input.initiator }),
|
|
321
277
|
...(input.interrupt === undefined ? {} : { interrupt: input.interrupt }),
|
|
322
278
|
},
|
|
323
279
|
...(input.signal === undefined ? {} : { signal: input.signal }),
|
|
324
280
|
});
|
|
325
|
-
return
|
|
281
|
+
return forwardedSelectionResult(response);
|
|
326
282
|
}
|
|
327
|
-
export async function
|
|
283
|
+
export async function requestForwardedSelectionKill(input) {
|
|
328
284
|
const response = await requestBodyCommand({
|
|
329
285
|
directory: input.directory,
|
|
330
|
-
command:
|
|
286
|
+
command: selectionRequestProtocol("akuma.kill"),
|
|
331
287
|
value: { action: "akuma.kill", targets: input.targets },
|
|
332
288
|
...(input.signal === undefined ? {} : { signal: input.signal }),
|
|
333
289
|
});
|
|
334
|
-
return
|
|
290
|
+
return forwardedSelectionResult(response);
|
|
335
291
|
}
|
|
@@ -288,6 +288,63 @@ async function settleCompletion(result, session, active) {
|
|
|
288
288
|
active.releaseDriveSignal();
|
|
289
289
|
}
|
|
290
290
|
}
|
|
291
|
+
/**
|
|
292
|
+
* One bounded wake slot per live Turn source.
|
|
293
|
+
*
|
|
294
|
+
* A stalled provider leaves its current event pull pending, so attaching a fresh reaction to that
|
|
295
|
+
* pull on every control observation retains a reaction and a derived promise per tick. Here each
|
|
296
|
+
* source registers exactly one reaction and is re-armed only after the wake it produced has been
|
|
297
|
+
* consumed; terminal sources settle once and are never re-armed. The queue therefore holds at most
|
|
298
|
+
* one wake per source. A new Heart observation is armed only after the prior observation is
|
|
299
|
+
* consumed, so the wait never falls back to an older snapshot. Stop clears the queue and its
|
|
300
|
+
* waiter; later notifications are ignored rather than written, though the one reaction already
|
|
301
|
+
* registered on a source that never settled stays attached until that source settles.
|
|
302
|
+
*/
|
|
303
|
+
function createTurnWakeups(observeHeart) {
|
|
304
|
+
const queue = [];
|
|
305
|
+
let waiter;
|
|
306
|
+
let stopped = false;
|
|
307
|
+
const publish = (wakeup) => {
|
|
308
|
+
if (stopped)
|
|
309
|
+
return;
|
|
310
|
+
const waiting = waiter;
|
|
311
|
+
waiter = undefined;
|
|
312
|
+
if (waiting === undefined)
|
|
313
|
+
queue.push(wakeup);
|
|
314
|
+
else
|
|
315
|
+
waiting(wakeup);
|
|
316
|
+
};
|
|
317
|
+
return {
|
|
318
|
+
event: (pull) => {
|
|
319
|
+
void pull.then((event) => publish({ kind: "event", event }), (error) => publish({ kind: "failed", error }));
|
|
320
|
+
},
|
|
321
|
+
heart: (after) => {
|
|
322
|
+
void observeHeart(after).then((observation) => publish({ kind: "heart", observation }), (error) => publish({ kind: "failed", error }));
|
|
323
|
+
},
|
|
324
|
+
tell: (submission) => {
|
|
325
|
+
void submission.then((result) => publish({ kind: "tell", result }), (error) => publish({ kind: "failed", error }));
|
|
326
|
+
},
|
|
327
|
+
failure: (source) => {
|
|
328
|
+
void source.then(() => undefined, (error) => publish({ kind: "failed", error }));
|
|
329
|
+
},
|
|
330
|
+
completionFailed: (source) => {
|
|
331
|
+
void source.then((wakeup) => publish(wakeup));
|
|
332
|
+
},
|
|
333
|
+
next: () => {
|
|
334
|
+
const ready = queue.shift();
|
|
335
|
+
if (ready !== undefined)
|
|
336
|
+
return Promise.resolve(ready);
|
|
337
|
+
return new Promise((resolve) => {
|
|
338
|
+
waiter = resolve;
|
|
339
|
+
});
|
|
340
|
+
},
|
|
341
|
+
stop: () => {
|
|
342
|
+
stopped = true;
|
|
343
|
+
waiter = undefined;
|
|
344
|
+
queue.length = 0;
|
|
345
|
+
},
|
|
346
|
+
};
|
|
347
|
+
}
|
|
291
348
|
async function consumeTurnDrive(input, active) {
|
|
292
349
|
const { turnSequence, drive, requests, resume } = active;
|
|
293
350
|
let heart = input.supervisor.current();
|
|
@@ -300,10 +357,15 @@ async function consumeTurnDrive(input, active) {
|
|
|
300
357
|
const receiptFailure = observeReceiptFailure(pumpReceipts(writers));
|
|
301
358
|
const completionFailure = observeCompletionFailure(drive);
|
|
302
359
|
const iterator = drive.events[Symbol.asyncIterator]();
|
|
303
|
-
let pending = iterator.next();
|
|
304
360
|
let liveTells = true;
|
|
305
361
|
let tellPump = null;
|
|
306
|
-
|
|
362
|
+
const wakeups = createTurnWakeups((after) => input.supervisor.next(after));
|
|
363
|
+
wakeups.event(iterator.next());
|
|
364
|
+
wakeups.heart(heart);
|
|
365
|
+
wakeups.failure(receiptFailure);
|
|
366
|
+
wakeups.failure(requests.failure);
|
|
367
|
+
wakeups.failure(active.custodyFailure);
|
|
368
|
+
wakeups.completionFailed(completionFailure);
|
|
307
369
|
try {
|
|
308
370
|
for (;;) {
|
|
309
371
|
if (input.supervisor.signal.aborted) {
|
|
@@ -318,28 +380,22 @@ async function consumeTurnDrive(input, active) {
|
|
|
318
380
|
return retirement.kind === "hung" ? retirement : { kind: "handoff" };
|
|
319
381
|
}
|
|
320
382
|
tellPump = submitPendingLiveTells(writers, heart.pending, attempted, drive.tell);
|
|
321
|
-
|
|
383
|
+
wakeups.tell(tellPump);
|
|
322
384
|
}
|
|
323
|
-
const next = await
|
|
324
|
-
pending.then((event) => ({ kind: "event", event })),
|
|
325
|
-
input.supervisor.next(heart).then((observation) => ({ kind: "heart", observation })),
|
|
326
|
-
...(tellObservation === null ? [] : [tellObservation]),
|
|
327
|
-
receiptFailure,
|
|
328
|
-
requests.failure,
|
|
329
|
-
completionFailure,
|
|
330
|
-
active.custodyFailure,
|
|
331
|
-
]);
|
|
385
|
+
const next = await wakeups.next();
|
|
332
386
|
if (next.kind === "completion-failed") {
|
|
333
387
|
requests.stopAdmission();
|
|
334
388
|
throw next.error;
|
|
335
389
|
}
|
|
390
|
+
if (next.kind === "failed")
|
|
391
|
+
throw next.error;
|
|
336
392
|
if (next.kind === "heart") {
|
|
337
393
|
heart = next.observation;
|
|
394
|
+
wakeups.heart(heart);
|
|
338
395
|
continue;
|
|
339
396
|
}
|
|
340
397
|
if (next.kind === "tell") {
|
|
341
398
|
tellPump = null;
|
|
342
|
-
tellObservation = null;
|
|
343
399
|
liveTells = next.result === "live";
|
|
344
400
|
continue;
|
|
345
401
|
}
|
|
@@ -348,7 +404,7 @@ async function consumeTurnDrive(input, active) {
|
|
|
348
404
|
await writeProviderEvent(input, active, next.event.value);
|
|
349
405
|
if (next.event.value.type === "session")
|
|
350
406
|
turnSession = next.event.value.coordinate;
|
|
351
|
-
|
|
407
|
+
wakeups.event(iterator.next());
|
|
352
408
|
}
|
|
353
409
|
const result = await drive.completion;
|
|
354
410
|
await active.attempt.closed;
|
|
@@ -376,6 +432,9 @@ async function consumeTurnDrive(input, active) {
|
|
|
376
432
|
return retirement;
|
|
377
433
|
return { kind: "failed", diagnostic: error instanceof Error ? error.message : String(error) };
|
|
378
434
|
}
|
|
435
|
+
finally {
|
|
436
|
+
wakeups.stop();
|
|
437
|
+
}
|
|
379
438
|
}
|
|
380
439
|
export async function driveTurn(input) {
|
|
381
440
|
let active;
|