@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,26 +1,51 @@
|
|
|
1
|
-
import
|
|
1
|
+
import type { WorldRoot } from "../world.js";
|
|
2
|
+
import { type LiveStatusObservation, type WaitReason } from "./akuma-observe.js";
|
|
3
|
+
import type { AkumaStatus } from "./akuma.js";
|
|
2
4
|
import { type TellResult, type TellWakeRuntime } from "./body.js";
|
|
3
|
-
import {
|
|
5
|
+
import { type CallInitialTell, type CallInitialTellAdmission } from "./call-initial-tell.js";
|
|
6
|
+
import { HeldAkumaLeash, type KillEvidence, type ResumeCoordinate, type TellFact, type TurnOutcome } from "./heart/index.js";
|
|
4
7
|
import { type AkuId, type AkumaPaths } from "./identity.js";
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}
|
|
14
|
-
export
|
|
15
|
-
|
|
8
|
+
import type { ActivityHistory, ExactHistory } from "./projection.js";
|
|
9
|
+
export type InterruptReceipt = Readonly<{
|
|
10
|
+
kind: "unavailable";
|
|
11
|
+
evidence: "hung" | "untidy" | "unavailable";
|
|
12
|
+
}> | Readonly<{
|
|
13
|
+
kind: "interrupted";
|
|
14
|
+
putDown: "was-idle" | "self-aborted";
|
|
15
|
+
tell: TellResult;
|
|
16
|
+
}>;
|
|
17
|
+
export type ForkReceipt = Readonly<{
|
|
18
|
+
kind: "forked";
|
|
19
|
+
child: AkuId;
|
|
20
|
+
}> | Readonly<{
|
|
21
|
+
kind: "provider-cannot-fork";
|
|
22
|
+
provider: string;
|
|
23
|
+
}> | Readonly<{
|
|
24
|
+
kind: "unknown-history";
|
|
25
|
+
at: string;
|
|
26
|
+
}> | Readonly<{
|
|
27
|
+
kind: "fork-failed";
|
|
28
|
+
diagnostic: string;
|
|
29
|
+
}> | Readonly<{
|
|
30
|
+
kind: "upstream-forked";
|
|
31
|
+
childSession: ResumeCoordinate;
|
|
32
|
+
diagnostic: string;
|
|
33
|
+
}>;
|
|
34
|
+
export type LastAnswer = Readonly<{
|
|
35
|
+
kind: "answer";
|
|
36
|
+
answer: string;
|
|
37
|
+
}> | Readonly<{
|
|
38
|
+
kind: "no-answer";
|
|
39
|
+
}>;
|
|
40
|
+
type TellAdmission = Readonly<{
|
|
16
41
|
kind: "not-born";
|
|
17
42
|
}> | Readonly<{
|
|
18
43
|
kind: "admitted";
|
|
19
44
|
tell: TellFact;
|
|
20
45
|
wake: Promise<TellResult>;
|
|
21
46
|
}>;
|
|
22
|
-
|
|
23
|
-
|
|
47
|
+
type InitialTellAdmission = CallInitialTellAdmission;
|
|
48
|
+
type InterruptAdmission = Readonly<{
|
|
24
49
|
kind: "unavailable";
|
|
25
50
|
evidence: "hung" | "untidy" | "unavailable";
|
|
26
51
|
}> | Readonly<{
|
|
@@ -29,11 +54,21 @@ export type InterruptAdmission = Readonly<{
|
|
|
29
54
|
putDown: "was-idle" | "self-aborted";
|
|
30
55
|
wake: Promise<TellResult>;
|
|
31
56
|
}>;
|
|
32
|
-
export declare
|
|
57
|
+
export declare function settleAkumaKill(paths: AkumaPaths, signal?: AbortSignal, retainLeash?: boolean): Promise<Readonly<{
|
|
58
|
+
evidence: KillEvidence;
|
|
59
|
+
leash?: HeldAkumaLeash;
|
|
60
|
+
}>>;
|
|
61
|
+
export declare function killAkumaWithRecovery(paths: AkumaPaths, recover?: (paths: AkumaPaths) => Promise<void>, signal?: AbortSignal): Promise<KillEvidence>;
|
|
62
|
+
/**
|
|
63
|
+
* The one lower native Akuma owner: standalone identity, plural selection and
|
|
64
|
+
* the request service all consume these same single-target algorithms. It reads
|
|
65
|
+
* only Heart, leash, provider and filesystem state; optional Alias, Dispatch,
|
|
66
|
+
* Task and Contract associations are composed above this boundary.
|
|
67
|
+
*/
|
|
68
|
+
export declare class AkumaOwner {
|
|
33
69
|
readonly id: AkuId;
|
|
34
70
|
private readonly worldPath;
|
|
35
|
-
|
|
36
|
-
constructor(id: AkuId, worldPath: WorldRoot, execution?: AkumaCallExecution);
|
|
71
|
+
constructor(id: AkuId, worldPath: WorldRoot);
|
|
37
72
|
private get paths();
|
|
38
73
|
private projectHistoryTurns;
|
|
39
74
|
private exactHistory;
|
|
@@ -84,7 +119,7 @@ export declare class AkumaHandle {
|
|
|
84
119
|
tellOutcome(tellId: string, options?: Readonly<{
|
|
85
120
|
timeoutMs?: number;
|
|
86
121
|
signal?: AbortSignal;
|
|
87
|
-
observe?: (observation:
|
|
122
|
+
observe?: (observation: LiveStatusObservation) => void | Promise<void>;
|
|
88
123
|
}>): Promise<Readonly<{
|
|
89
124
|
reason: WaitReason;
|
|
90
125
|
outcome: TurnOutcome | null;
|
|
@@ -117,12 +152,5 @@ export declare class AkumaHandle {
|
|
|
117
152
|
}>): Promise<KillEvidence>;
|
|
118
153
|
lastAnswer(): Promise<LastAnswer>;
|
|
119
154
|
}
|
|
120
|
-
/** Package-internal provenance retained only by the handle returned from call. */
|
|
121
|
-
export declare function akumaCallExecution(handle: AkumaHandle): AkumaCallExecution | undefined;
|
|
122
|
-
export type LastAnswer = Readonly<{
|
|
123
|
-
kind: "answer";
|
|
124
|
-
answer: string;
|
|
125
|
-
}> | Readonly<{
|
|
126
|
-
kind: "no-answer";
|
|
127
|
-
}>;
|
|
128
155
|
export {};
|
|
156
|
+
/** The alias and Dispatch association an upper caller resolves for one observed Akuma. */
|
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { AkumaNotBornError, AkumaProviderError } from "./akuma-errors.js";
|
|
3
|
+
import { bornLiveStatus, bornStatus, defaultWaitComplete, waitForObservation, } from "./akuma-observe.js";
|
|
4
|
+
import { executeWaitAkuma } from "./akuma-wait.js";
|
|
5
|
+
import { handoffPendingTells, spawnAkumaBody, wakeRecordedTell, } from "./body.js";
|
|
2
6
|
import { admitCallInitialTell } from "./call-initial-tell.js";
|
|
3
|
-
import { handoffPendingTells, wakeRecordedTell } from "./body.js";
|
|
4
|
-
import { HeldAkumaLeash, activitySlice, readForkPoint, readHeart, readKill, readLastAnsweredTurn, readSoul, readTell, readTurn, recordTell, requestPause, requestStop, projectTell, } from "./heart/index.js";
|
|
5
7
|
import { acquireLeash } from "./control.js";
|
|
8
|
+
import { HeldAkumaLeash, activitySlice, projectTell, readForkPoint, readHeart, readKill, readLastAnsweredTurn, readSoul, readTell, readTurn, recordTell, requestPause, requestStop, } from "./heart/index.js";
|
|
6
9
|
import { parsePublicHistoryId, pathsForAkuId } from "./identity.js";
|
|
7
|
-
import { projectTurns,
|
|
10
|
+
import { projectTurns, selectExactHistory, selectHistory } from "./projection.js";
|
|
8
11
|
import { resolveProviderExecution } from "./providers/index.js";
|
|
9
12
|
import { publishAkuma } from "./publication.js";
|
|
10
|
-
import { spawnAkumaBody } from "./body.js";
|
|
11
|
-
import { AkumaNotBornError, AkumaProviderError } from "./akuma-errors.js";
|
|
12
|
-
import { bornStatus, bornLiveStatus, defaultWaitComplete, readWaitComplete, waitForObservation, } from "./akuma-observe.js";
|
|
13
|
-
const CALL_EXECUTION = Symbol("akuma-call-execution");
|
|
14
13
|
function diagnostic(error) {
|
|
15
14
|
return error instanceof Error ? error.message : String(error);
|
|
16
15
|
}
|
|
@@ -80,15 +79,18 @@ export async function killAkumaWithRecovery(paths, recover, signal) {
|
|
|
80
79
|
void recover(paths).catch(() => undefined);
|
|
81
80
|
}
|
|
82
81
|
}
|
|
83
|
-
|
|
82
|
+
/**
|
|
83
|
+
* The one lower native Akuma owner: standalone identity, plural selection and
|
|
84
|
+
* the request service all consume these same single-target algorithms. It reads
|
|
85
|
+
* only Heart, leash, provider and filesystem state; optional Alias, Dispatch,
|
|
86
|
+
* Task and Contract associations are composed above this boundary.
|
|
87
|
+
*/
|
|
88
|
+
export class AkumaOwner {
|
|
84
89
|
id;
|
|
85
90
|
worldPath;
|
|
86
|
-
|
|
87
|
-
constructor(id, worldPath, execution) {
|
|
91
|
+
constructor(id, worldPath) {
|
|
88
92
|
this.id = id;
|
|
89
93
|
this.worldPath = worldPath;
|
|
90
|
-
if (execution !== undefined)
|
|
91
|
-
this[CALL_EXECUTION] = execution;
|
|
92
94
|
}
|
|
93
95
|
get paths() {
|
|
94
96
|
return pathsForAkuId(this.worldPath, this.id);
|
|
@@ -137,16 +139,15 @@ export class AkumaHandle {
|
|
|
137
139
|
if (options.timeoutMs !== undefined && (!Number.isFinite(options.timeoutMs) || options.timeoutMs < 0)) {
|
|
138
140
|
throw new TypeError("Akuma wait timeoutMs must be a nonnegative finite millisecond duration");
|
|
139
141
|
}
|
|
140
|
-
const waited = await
|
|
142
|
+
const waited = await executeWaitAkuma({
|
|
143
|
+
path: this.worldPath,
|
|
144
|
+
ids: [this.id],
|
|
145
|
+
completion: "all",
|
|
141
146
|
...(options.timeoutMs === undefined ? {} : { timeoutMs: options.timeoutMs }),
|
|
142
147
|
...(options.signal === undefined ? {} : { signal: options.signal }),
|
|
143
|
-
...(predicate === defaultWaitComplete
|
|
144
|
-
? { probe: async () => await readWaitComplete(this.worldPath, this.id) }
|
|
145
|
-
: {}),
|
|
146
|
-
observe: async () => await this.status(),
|
|
147
|
-
complete: predicate,
|
|
148
|
+
...(predicate === defaultWaitComplete ? {} : { predicate }),
|
|
148
149
|
});
|
|
149
|
-
return { reason: waited.reason, status: waited.
|
|
150
|
+
return { reason: waited.reason, status: waited.observations[0] };
|
|
150
151
|
}
|
|
151
152
|
async wait(predicate = defaultWaitComplete, options = {}) {
|
|
152
153
|
return (await this.waitReceipt(predicate, options)).status;
|
|
@@ -373,7 +374,7 @@ export class AkumaHandle {
|
|
|
373
374
|
: { kind: "no-answer" };
|
|
374
375
|
}
|
|
375
376
|
}
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
377
|
+
/* ---------------------------------------------------------------------------
|
|
378
|
+
* One wait owner and its legitimate observation modes
|
|
379
|
+
* ------------------------------------------------------------------------ */
|
|
380
|
+
/** The alias and Dispatch association an upper caller resolves for one observed Akuma. */
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { WorldRoot } from "../world.js";
|
|
2
|
+
import type { LiveStatusObservation } from "./akuma-observe.js";
|
|
3
|
+
import type { AkumaStatus } from "./akuma.js";
|
|
4
|
+
import type { TellResult } from "./body.js";
|
|
5
|
+
import type { Schema } from "./schema.js";
|
|
6
|
+
import type { AkumaAskObservation, AkumaAskResult, AkumaKillResult, AkumaTellResult } from "./selection-observation.js";
|
|
7
|
+
export type AskObserver = Readonly<{
|
|
8
|
+
admitted?: (tell: TellResult, id: AkumaStatus["id"]) => void | Promise<void>;
|
|
9
|
+
observe?: (observation: LiveStatusObservation) => void | Promise<void>;
|
|
10
|
+
}>;
|
|
11
|
+
type TellExecutionInput = Readonly<{
|
|
12
|
+
path: WorldRoot;
|
|
13
|
+
id: AkumaStatus["id"];
|
|
14
|
+
body: string;
|
|
15
|
+
tellId?: string;
|
|
16
|
+
recordedAt?: string;
|
|
17
|
+
initiator?: string;
|
|
18
|
+
signal?: AbortSignal;
|
|
19
|
+
interrupt?: boolean;
|
|
20
|
+
onObserve?: AskObserver;
|
|
21
|
+
}>;
|
|
22
|
+
export declare function executeTellAkuma(input: TellExecutionInput): Promise<AkumaTellResult>;
|
|
23
|
+
export declare function decodeAskObservation<T>(observation: AkumaAskObservation, schema: Schema<T>): AkumaAskObservation<T>;
|
|
24
|
+
export declare function observeAdmittedAskAkuma(input: Readonly<{
|
|
25
|
+
path: WorldRoot;
|
|
26
|
+
id: AkumaStatus["id"];
|
|
27
|
+
tellId: string;
|
|
28
|
+
timeoutMs?: number;
|
|
29
|
+
signal?: AbortSignal;
|
|
30
|
+
startedAt?: number;
|
|
31
|
+
wake?: Promise<TellResult>;
|
|
32
|
+
/**
|
|
33
|
+
* The exact receipt of the admission this observation is bound to. The
|
|
34
|
+
* call-facing seam always supplies it so observation never substitutes a
|
|
35
|
+
* later Heart read for that invocation's admission evidence. Ordinary
|
|
36
|
+
* Tell-bound asks may omit it and keep reading the current admitted receipt.
|
|
37
|
+
*/
|
|
38
|
+
receipt?: TellResult;
|
|
39
|
+
onObserve?: AskObserver;
|
|
40
|
+
}>): Promise<AkumaAskResult>;
|
|
41
|
+
export declare function executeAskAkuma(input: TellExecutionInput & Readonly<{
|
|
42
|
+
timeoutMs?: number;
|
|
43
|
+
schemaJson?: string;
|
|
44
|
+
}>): Promise<AkumaAskResult>;
|
|
45
|
+
type KillExecutionInput = Readonly<{
|
|
46
|
+
path: WorldRoot;
|
|
47
|
+
ids: readonly AkumaStatus["id"][];
|
|
48
|
+
signal?: AbortSignal;
|
|
49
|
+
}>;
|
|
50
|
+
export declare function executeKillAkuma(input: KillExecutionInput): Promise<AkumaKillResult>;
|
|
51
|
+
export {};
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { AkumaNotBornError, AkumaProviderError } from "./akuma-errors.js";
|
|
2
|
+
import { AkumaOwner } from "./akuma-owner.js";
|
|
3
|
+
export async function executeTellAkuma(input) {
|
|
4
|
+
input.signal?.throwIfAborted();
|
|
5
|
+
const owner = new AkumaOwner(input.id, input.path);
|
|
6
|
+
let tell;
|
|
7
|
+
if (input.interrupt === true) {
|
|
8
|
+
const interrupted = await owner.interrupt(input.body, {
|
|
9
|
+
...(input.tellId === undefined ? {} : { tellId: input.tellId }),
|
|
10
|
+
...(input.initiator === undefined ? {} : { initiator: input.initiator }),
|
|
11
|
+
...(input.signal === undefined ? {} : { signal: input.signal }),
|
|
12
|
+
});
|
|
13
|
+
if (interrupted.kind === "unavailable")
|
|
14
|
+
throw new AkumaProviderError(`Tell interrupt unavailable: ${interrupted.evidence}`);
|
|
15
|
+
tell = interrupted.tell;
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
tell = await owner.tell(input.body, input.tellId, input.recordedAt, undefined, {
|
|
19
|
+
...(input.initiator === undefined ? {} : { initiator: input.initiator }),
|
|
20
|
+
...(input.signal === undefined ? {} : { signal: input.signal }),
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
input.signal?.throwIfAborted();
|
|
24
|
+
return { akuma: input.id, tell };
|
|
25
|
+
}
|
|
26
|
+
function askObservation(observed) {
|
|
27
|
+
if (observed.outcome === null)
|
|
28
|
+
return observed.reason === "deadline" ? { reason: "deadline" } : { reason: "unanswered" };
|
|
29
|
+
if (observed.outcome.kind === "answered")
|
|
30
|
+
return { reason: "answered", answer: observed.outcome.answerJson ?? observed.outcome.answer };
|
|
31
|
+
if (observed.outcome.kind === "failed")
|
|
32
|
+
return { reason: "failed", diagnostic: observed.outcome.diagnostic };
|
|
33
|
+
return {
|
|
34
|
+
reason: "invalid-output",
|
|
35
|
+
diagnostic: observed.outcome.diagnostic,
|
|
36
|
+
answer: observed.outcome.answer,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export function decodeAskObservation(observation, schema) {
|
|
40
|
+
if (observation.reason !== "answered")
|
|
41
|
+
return observation;
|
|
42
|
+
let value = observation.answer;
|
|
43
|
+
if (typeof value === "string") {
|
|
44
|
+
try {
|
|
45
|
+
value = JSON.parse(value);
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
return {
|
|
49
|
+
reason: "invalid-output",
|
|
50
|
+
diagnostic: error instanceof Error ? error.message : "Answer is not valid JSON",
|
|
51
|
+
answer: typeof observation.answer === "string" ? observation.answer : String(observation.answer),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
return { reason: "answered", answer: schema.decode(value) };
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
return {
|
|
60
|
+
reason: "invalid-output",
|
|
61
|
+
diagnostic: error instanceof Error ? error.message : "Answer failed schema decode",
|
|
62
|
+
answer: typeof observation.answer === "string" ? observation.answer : String(observation.answer),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export async function observeAdmittedAskAkuma(input) {
|
|
67
|
+
const owner = new AkumaOwner(input.id, input.path);
|
|
68
|
+
const tell = input.receipt ?? (await owner.admittedReceipt(input.tellId));
|
|
69
|
+
await input.onObserve?.admitted?.(tell, input.id);
|
|
70
|
+
let settled;
|
|
71
|
+
void input.wake?.then((receipt) => {
|
|
72
|
+
settled = receipt;
|
|
73
|
+
}, () => undefined);
|
|
74
|
+
const admittedAt = Date.parse(tell.row.at);
|
|
75
|
+
const observedAt = performance.timeOrigin + performance.now();
|
|
76
|
+
const elapsed = input.startedAt === undefined
|
|
77
|
+
? Number.isFinite(admittedAt)
|
|
78
|
+
? Math.max(0, observedAt - admittedAt)
|
|
79
|
+
: 0
|
|
80
|
+
: Math.max(0, performance.now() - input.startedAt);
|
|
81
|
+
const observed = await owner.tellOutcome(input.tellId, {
|
|
82
|
+
...(input.timeoutMs === undefined ? {} : { timeoutMs: Math.max(0, input.timeoutMs - elapsed) }),
|
|
83
|
+
...(input.signal === undefined ? {} : { signal: input.signal }),
|
|
84
|
+
...(input.onObserve?.observe === undefined ? {} : { observe: input.onObserve.observe }),
|
|
85
|
+
});
|
|
86
|
+
return {
|
|
87
|
+
akuma: input.id,
|
|
88
|
+
tell: settled ?? tell,
|
|
89
|
+
observation: askObservation(observed),
|
|
90
|
+
completedAt: observed.completedAt,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
export async function executeAskAkuma(input) {
|
|
94
|
+
input.signal?.throwIfAborted();
|
|
95
|
+
const owner = new AkumaOwner(input.id, input.path);
|
|
96
|
+
const admission = input.interrupt === true
|
|
97
|
+
? await owner.admitInterrupt(input.body, {
|
|
98
|
+
...(input.tellId === undefined ? {} : { tellId: input.tellId }),
|
|
99
|
+
...(input.schemaJson === undefined ? {} : { schemaJson: input.schemaJson }),
|
|
100
|
+
...(input.initiator === undefined ? {} : { initiator: input.initiator }),
|
|
101
|
+
...(input.signal === undefined ? {} : { signal: input.signal }),
|
|
102
|
+
})
|
|
103
|
+
: await owner.admitTell(input.body, input.tellId, input.recordedAt, undefined, {
|
|
104
|
+
...(input.schemaJson === undefined ? {} : { schemaJson: input.schemaJson }),
|
|
105
|
+
...(input.initiator === undefined ? {} : { initiator: input.initiator }),
|
|
106
|
+
...(input.signal === undefined ? {} : { signal: input.signal }),
|
|
107
|
+
});
|
|
108
|
+
if (admission.kind === "unavailable")
|
|
109
|
+
throw new AkumaProviderError(`Tell interrupt unavailable: ${admission.evidence}`);
|
|
110
|
+
if (admission.kind === "not-born")
|
|
111
|
+
throw new AkumaNotBornError(input.id);
|
|
112
|
+
return await observeAdmittedAskAkuma({
|
|
113
|
+
path: input.path,
|
|
114
|
+
id: input.id,
|
|
115
|
+
tellId: admission.tell.id,
|
|
116
|
+
...(input.timeoutMs === undefined ? {} : { timeoutMs: input.timeoutMs }),
|
|
117
|
+
startedAt: performance.now(),
|
|
118
|
+
wake: admission.wake,
|
|
119
|
+
...(input.signal === undefined ? {} : { signal: input.signal }),
|
|
120
|
+
...(input.onObserve === undefined ? {} : { onObserve: input.onObserve }),
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
export async function executeKillAkuma(input) {
|
|
124
|
+
input.signal?.throwIfAborted();
|
|
125
|
+
const owners = input.ids.map((id) => new AkumaOwner(id, input.path));
|
|
126
|
+
const evidence = await Promise.all(owners.map(async (owner) => await owner.kill(input.signal === undefined ? {} : { signal: input.signal })));
|
|
127
|
+
input.signal?.throwIfAborted();
|
|
128
|
+
return {
|
|
129
|
+
results: input.ids.map((id, index) => ({ id, evidence: evidence[index] })),
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/* ---------------------------------------------------------------------------
|
|
133
|
+
* Native roster, archetype listing and the one prepared call recipe
|
|
134
|
+
* ------------------------------------------------------------------------ */
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import type { Schema } from "./schema.js";
|
|
2
|
-
import { type AkumaStatus, type TellResult } from "./akuma.js";
|
|
3
|
-
import { type LiveStatusObservation } from "./akuma-observe.js";
|
|
4
|
-
import type { ActivityRow } from "./projection.js";
|
|
5
|
-
import { type DispatchAssociation } from "./dispatch-association.js";
|
|
6
1
|
import type { AkumaAlias } from "../identity/selector.js";
|
|
7
2
|
import type { WorldRoot } from "../world.js";
|
|
8
|
-
import { type
|
|
3
|
+
import { type WaitReason } from "./akuma-observe.js";
|
|
4
|
+
import type { AkumaStatus } from "./akuma.js";
|
|
5
|
+
import type { DispatchAssociation } from "./dispatch-association.js";
|
|
6
|
+
import type { ActivityRow } from "./projection.js";
|
|
7
|
+
import type { AkumaUnobserved } from "./selection-observation.js";
|
|
9
8
|
export type WaitIdentityFacts = Readonly<{
|
|
10
9
|
/** The alias currently addressing this Akuma in its world, when one is bound to it. */
|
|
11
10
|
alias?: AkumaAlias;
|
|
@@ -26,12 +25,14 @@ export type WaitObserver = Readonly<{
|
|
|
26
25
|
selected?: (selected: readonly WaitSelectedAkuma[]) => void;
|
|
27
26
|
observe?: (observed: readonly WaitObservedAkuma[]) => void;
|
|
28
27
|
}>;
|
|
29
|
-
|
|
28
|
+
type WaitExecutionInput = Readonly<{
|
|
30
29
|
path: WorldRoot;
|
|
31
30
|
ids: readonly AkumaStatus["id"][];
|
|
32
31
|
completion: "any" | "all";
|
|
33
32
|
timeoutMs?: number;
|
|
34
33
|
signal?: AbortSignal;
|
|
34
|
+
/** Internal custom completion judge over the full final observation where supplied. */
|
|
35
|
+
predicate?: (status: AkumaStatus) => boolean;
|
|
35
36
|
/** Resolves one Akuma's identity facts; consulted once per Akuma a viewer first sees. */
|
|
36
37
|
identity?: (id: AkumaStatus["id"]) => Promise<WaitIdentityFacts>;
|
|
37
38
|
/** The selected set in the caller's order; a viewer's head and scoreboard follow it. */
|
|
@@ -41,41 +42,20 @@ export type WaitExecutionInput = Readonly<{
|
|
|
41
42
|
/** Reports every observation round to a live viewer. */
|
|
42
43
|
observe?: (observed: readonly WaitObservedAkuma[]) => void;
|
|
43
44
|
}>;
|
|
44
|
-
|
|
45
|
-
export type
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
path: WorldRoot;
|
|
51
|
-
id: AkumaStatus["id"];
|
|
52
|
-
body: string;
|
|
53
|
-
tellId?: string;
|
|
54
|
-
recordedAt?: string;
|
|
55
|
-
initiator?: string;
|
|
56
|
-
signal?: AbortSignal;
|
|
57
|
-
onObserve?: TellWaitObserver;
|
|
58
|
-
}>;
|
|
59
|
-
export declare function executeTellAkuma(input: TellExecutionInput): Promise<AkumaTellResult>;
|
|
60
|
-
export declare function decodeTellWaitObservation(observation: AkumaTellWaitObservation, schema: Schema<unknown>): AkumaTellWaitObservation;
|
|
61
|
-
export declare function observeAdmittedTellWaitAkuma(input: Readonly<{
|
|
62
|
-
path: WorldRoot;
|
|
63
|
-
id: AkumaStatus["id"];
|
|
64
|
-
tellId: string;
|
|
65
|
-
timeoutMs: number;
|
|
66
|
-
signal?: AbortSignal;
|
|
67
|
-
startedAt?: number;
|
|
68
|
-
wake?: Promise<TellResult>;
|
|
69
|
-
onObserve?: TellWaitObserver;
|
|
70
|
-
}>): Promise<AkumaTellWaitResult>;
|
|
71
|
-
export declare function executeTellWaitAkuma(input: TellExecutionInput & Readonly<{
|
|
72
|
-
timeoutMs: number;
|
|
73
|
-
schemaJson?: string;
|
|
74
|
-
interrupt?: boolean;
|
|
75
|
-
}>): Promise<AkumaTellWaitResult>;
|
|
76
|
-
export type KillExecutionInput = Readonly<{
|
|
77
|
-
path: WorldRoot;
|
|
78
|
-
ids: readonly AkumaStatus["id"][];
|
|
79
|
-
signal?: AbortSignal;
|
|
45
|
+
/** One wait's association-free native evidence; upper composition attaches cross-product context. */
|
|
46
|
+
export type NativeWaitResult = Readonly<{
|
|
47
|
+
mode: "any" | "all";
|
|
48
|
+
reason: WaitReason;
|
|
49
|
+
observations: readonly AkumaStatus[];
|
|
50
|
+
unobserved: readonly AkumaUnobserved[];
|
|
80
51
|
}>;
|
|
81
|
-
|
|
52
|
+
/**
|
|
53
|
+
* The one lower set-observation owner for Akuma wait completion. It serves the
|
|
54
|
+
* standalone one-ID association-free face and the plural any/all face with one
|
|
55
|
+
* ordered round algorithm, one shared ordinary-detail budget, transient
|
|
56
|
+
* unreadable peers, and an honest final deadline edge. The default completion
|
|
57
|
+
* probe is used only without live row callbacks and never with a custom
|
|
58
|
+
* predicate; a live viewer always observes rounds.
|
|
59
|
+
*/
|
|
60
|
+
export declare function executeWaitAkuma(input: WaitExecutionInput): Promise<NativeWaitResult>;
|
|
61
|
+
export {};
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { AkumaNotBornError } from "./akuma-errors.js";
|
|
2
|
+
import { defaultWaitComplete, readLiveStatus, readWaitComplete, waitForObservation, } from "./akuma-observe.js";
|
|
3
|
+
const SHARED_ORDINARY_BUDGET = 30;
|
|
4
|
+
async function observeWaitRound(path, ids, signal) {
|
|
5
|
+
signal?.throwIfAborted();
|
|
6
|
+
if (ids.length <= 1) {
|
|
7
|
+
const observations = await Promise.all(ids.map(async (id) => await readLiveStatus(path, id, { aperture: "monitoring" })));
|
|
8
|
+
return { observations, unobserved: [] };
|
|
9
|
+
}
|
|
10
|
+
let remaining = SHARED_ORDINARY_BUDGET;
|
|
11
|
+
const observations = [];
|
|
12
|
+
const unobserved = [];
|
|
13
|
+
for (const id of ids) {
|
|
14
|
+
signal?.throwIfAborted();
|
|
15
|
+
try {
|
|
16
|
+
const observed = await readLiveStatus(path, id, { aperture: "monitoring", ordinaryBudget: remaining });
|
|
17
|
+
observations.push(observed);
|
|
18
|
+
remaining -= observed.ordinarySelected;
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
if (error instanceof AkumaNotBornError)
|
|
22
|
+
throw error;
|
|
23
|
+
unobserved.push({ id, diagnostic: diagnostic(error) });
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return { observations, unobserved };
|
|
27
|
+
}
|
|
28
|
+
function roundComplete(round, completion, predicate) {
|
|
29
|
+
const judge = predicate ?? defaultWaitComplete;
|
|
30
|
+
const settled = round.observations.map((observation) => judge(observation.status));
|
|
31
|
+
return (settled.length > 0 &&
|
|
32
|
+
(completion === "any" ? settled.some(Boolean) : round.unobserved.length === 0 && settled.every(Boolean)));
|
|
33
|
+
}
|
|
34
|
+
/** Canonical ids in the caller's selection order, appending any id the caller never named. */
|
|
35
|
+
function selectionOrderedIds(ids, order) {
|
|
36
|
+
const present = new Set(ids);
|
|
37
|
+
const seen = new Set();
|
|
38
|
+
const ordered = [];
|
|
39
|
+
for (const id of order) {
|
|
40
|
+
if (present.has(id) && !seen.has(id)) {
|
|
41
|
+
seen.add(id);
|
|
42
|
+
ordered.push(id);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
for (const id of ids) {
|
|
46
|
+
if (!seen.has(id)) {
|
|
47
|
+
seen.add(id);
|
|
48
|
+
ordered.push(id);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return ordered;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* The one lower set-observation owner for Akuma wait completion. It serves the
|
|
55
|
+
* standalone one-ID association-free face and the plural any/all face with one
|
|
56
|
+
* ordered round algorithm, one shared ordinary-detail budget, transient
|
|
57
|
+
* unreadable peers, and an honest final deadline edge. The default completion
|
|
58
|
+
* probe is used only without live row callbacks and never with a custom
|
|
59
|
+
* predicate; a live viewer always observes rounds.
|
|
60
|
+
*/
|
|
61
|
+
export async function executeWaitAkuma(input) {
|
|
62
|
+
// Identity facts are read once per observed Akuma, not once per 100ms round.
|
|
63
|
+
const facts = new Map();
|
|
64
|
+
if (input.onSelected !== undefined) {
|
|
65
|
+
for (const id of input.ids) {
|
|
66
|
+
input.signal?.throwIfAborted();
|
|
67
|
+
const known = input.identity === undefined ? undefined : await input.identity(id);
|
|
68
|
+
facts.set(id, known ?? { contract: { kind: "none" } });
|
|
69
|
+
}
|
|
70
|
+
const ordered = input.selectionOrder === undefined ? input.ids : selectionOrderedIds(input.ids, input.selectionOrder);
|
|
71
|
+
input.onSelected(ordered.map((id) => ({ id, ...facts.get(id) })));
|
|
72
|
+
}
|
|
73
|
+
const observeRound = async (round) => {
|
|
74
|
+
if (input.observe === undefined)
|
|
75
|
+
return;
|
|
76
|
+
const observed = [];
|
|
77
|
+
for (const observation of round.observations) {
|
|
78
|
+
input.signal?.throwIfAborted();
|
|
79
|
+
const { status, rows } = observation;
|
|
80
|
+
let known = facts.get(status.id);
|
|
81
|
+
if (known === undefined && input.identity !== undefined) {
|
|
82
|
+
known = await input.identity(status.id);
|
|
83
|
+
facts.set(status.id, known);
|
|
84
|
+
}
|
|
85
|
+
if (known === undefined) {
|
|
86
|
+
observed.push({ status, rows, contract: { kind: "none" } });
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
observed.push({ status, rows, ...known });
|
|
90
|
+
}
|
|
91
|
+
input.observe(observed);
|
|
92
|
+
};
|
|
93
|
+
const live = input.observe !== undefined;
|
|
94
|
+
const waited = await waitForObservation({
|
|
95
|
+
...(input.timeoutMs === undefined ? {} : { timeoutMs: input.timeoutMs }),
|
|
96
|
+
...(input.signal === undefined ? {} : { signal: input.signal }),
|
|
97
|
+
...(input.predicate === undefined && !live && input.ids.length === 1
|
|
98
|
+
? { probe: async () => await readWaitComplete(input.path, input.ids[0]) }
|
|
99
|
+
: {}),
|
|
100
|
+
observe: async () => await observeWaitRound(input.path, input.ids, input.signal),
|
|
101
|
+
complete: (round) => roundComplete(round, input.completion, input.predicate),
|
|
102
|
+
onObserve: async (round) => await observeRound(round),
|
|
103
|
+
});
|
|
104
|
+
return {
|
|
105
|
+
mode: input.completion,
|
|
106
|
+
reason: waited.reason,
|
|
107
|
+
observations: waited.value.observations.map((observation) => observation.status),
|
|
108
|
+
unobserved: waited.value.unobserved,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
function diagnostic(error) {
|
|
112
|
+
return error instanceof Error ? error.message : String(error);
|
|
113
|
+
}
|