@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
|
@@ -21,26 +21,14 @@ function admitPiOptions(options) {
|
|
|
21
21
|
options: Object.freeze({ ...options }),
|
|
22
22
|
};
|
|
23
23
|
}
|
|
24
|
-
|
|
24
|
+
function piCreateOptions(sdk, input, services) {
|
|
25
25
|
let model;
|
|
26
|
-
let modelRuntime;
|
|
27
26
|
if (input.options.model !== undefined) {
|
|
28
27
|
const slash = input.options.model.indexOf("/");
|
|
29
|
-
|
|
30
|
-
model = modelRuntime.getModel(input.options.model.slice(0, slash), input.options.model.slice(slash + 1));
|
|
28
|
+
model = services.modelRuntime.getModel(input.options.model.slice(0, slash), input.options.model.slice(slash + 1));
|
|
31
29
|
if (model === undefined)
|
|
32
30
|
throw new Error(`Pi model '${input.options.model}' is unavailable`);
|
|
33
31
|
}
|
|
34
|
-
const resourceLoader = input.options.systemPrompt === undefined
|
|
35
|
-
? undefined
|
|
36
|
-
: new sdk.DefaultResourceLoader({
|
|
37
|
-
cwd: input.cwd,
|
|
38
|
-
agentDir: sdk.getAgentDir(),
|
|
39
|
-
...(input.options.systemPromptMode === "append"
|
|
40
|
-
? { appendSystemPromptOverride: (base) => [...base, input.options.systemPrompt] }
|
|
41
|
-
: { systemPromptOverride: () => input.options.systemPrompt }),
|
|
42
|
-
});
|
|
43
|
-
await resourceLoader?.reload();
|
|
44
32
|
const sessionManager = input.session.kind === "fresh"
|
|
45
33
|
? sdk.SessionManager.create(input.cwd)
|
|
46
34
|
: "sessionFile" in input.session.coordinate
|
|
@@ -59,22 +47,39 @@ async function piCreateOptions(sdk, input) {
|
|
|
59
47
|
}),
|
|
60
48
|
];
|
|
61
49
|
return {
|
|
62
|
-
|
|
50
|
+
services,
|
|
63
51
|
sessionManager,
|
|
64
|
-
...(model === undefined
|
|
65
|
-
...(resourceLoader === undefined ? {} : { resourceLoader }),
|
|
52
|
+
...(model === undefined ? {} : { model }),
|
|
66
53
|
...(input.options.effort === undefined ? {} : { thinkingLevel: input.options.effort }),
|
|
67
54
|
...(customTools === undefined ? {} : { customTools }),
|
|
68
55
|
};
|
|
69
56
|
}
|
|
70
57
|
async function createPiSession(sdk, execution, input) {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
58
|
+
if (execution.config !== undefined) {
|
|
59
|
+
throw new TypeError("Pi provider config cannot be consumed by native CreateAgentSessionOptions");
|
|
60
|
+
}
|
|
61
|
+
const services = await sdk.createAgentSessionServices({
|
|
62
|
+
cwd: input.cwd,
|
|
63
|
+
agentDir: sdk.getAgentDir(),
|
|
64
|
+
modelRuntimeSignal: input.signal,
|
|
65
|
+
...(input.options.systemPrompt === undefined
|
|
66
|
+
? {}
|
|
67
|
+
: {
|
|
68
|
+
resourceLoaderOptions: input.options.systemPromptMode === "append"
|
|
69
|
+
? { appendSystemPromptOverride: (base) => [...base, input.options.systemPrompt] }
|
|
70
|
+
: { systemPromptOverride: () => input.options.systemPrompt },
|
|
71
|
+
}),
|
|
76
72
|
});
|
|
77
|
-
|
|
73
|
+
try {
|
|
74
|
+
input.signal?.throwIfAborted();
|
|
75
|
+
return await sdk.createAgentSessionFromServices(piCreateOptions(sdk, input, services));
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
// Before a session owns the extension runtime, failed selection/setup must
|
|
79
|
+
// retire registrations and event-bus subscriptions loaded by the services.
|
|
80
|
+
services.resourceLoader.getExtensions().runtime.invalidate();
|
|
81
|
+
throw error;
|
|
82
|
+
}
|
|
78
83
|
}
|
|
79
84
|
async function runPiPrompt(native, input, events, state, settle) {
|
|
80
85
|
try {
|
|
@@ -126,20 +131,51 @@ async function drivePi(sdk, execution, input, signal, custody) {
|
|
|
126
131
|
aborting: false,
|
|
127
132
|
settled: false,
|
|
128
133
|
};
|
|
134
|
+
const pendingTells = new Map();
|
|
135
|
+
const endPendingTells = () => {
|
|
136
|
+
for (const waiter of pendingTells.values())
|
|
137
|
+
waiter.resolve({ kind: "turn-ended" });
|
|
138
|
+
pendingTells.clear();
|
|
139
|
+
};
|
|
129
140
|
let settleCompletion;
|
|
130
141
|
const completion = new Promise((resolve) => {
|
|
131
142
|
settleCompletion = resolve;
|
|
132
143
|
});
|
|
133
|
-
const
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
144
|
+
const agent = native.agent;
|
|
145
|
+
let unsubscribeAgent;
|
|
146
|
+
let unsubscribe;
|
|
147
|
+
try {
|
|
148
|
+
unsubscribeAgent = agent.subscribe((event) => {
|
|
149
|
+
if (event.type === "message_end") {
|
|
150
|
+
const waiter = pendingTells.get(event.message);
|
|
151
|
+
if (waiter !== undefined) {
|
|
152
|
+
pendingTells.delete(event.message);
|
|
153
|
+
waiter.resolve({ kind: "accepted", fence: `${native.sessionId}:${waiter.id}` });
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
unsubscribe = native.subscribe((event) => {
|
|
158
|
+
if (event.type === "agent_end" && !event.willRetry) {
|
|
159
|
+
state.terminalFailure = piTerminalFailure(event.messages);
|
|
160
|
+
}
|
|
161
|
+
for (const translated of translatePiEvent(event, eventState))
|
|
162
|
+
events.emit(translated);
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
try {
|
|
167
|
+
unsubscribeAgent?.();
|
|
168
|
+
}
|
|
169
|
+
finally {
|
|
170
|
+
native.dispose();
|
|
171
|
+
}
|
|
172
|
+
throw error;
|
|
173
|
+
}
|
|
139
174
|
const settle = (result) => {
|
|
140
175
|
if (state.settled)
|
|
141
176
|
return closed;
|
|
142
177
|
state.settled = true;
|
|
178
|
+
endPendingTells();
|
|
143
179
|
let failure;
|
|
144
180
|
try {
|
|
145
181
|
unsubscribe();
|
|
@@ -147,19 +183,19 @@ async function drivePi(sdk, execution, input, signal, custody) {
|
|
|
147
183
|
catch (error) {
|
|
148
184
|
failure = error;
|
|
149
185
|
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
186
|
+
try {
|
|
187
|
+
unsubscribeAgent?.();
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
failure ??= error;
|
|
191
|
+
}
|
|
192
|
+
events.end();
|
|
193
|
+
settleCompletion(result);
|
|
194
|
+
try {
|
|
195
|
+
native.dispose();
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
failure ??= error;
|
|
163
199
|
}
|
|
164
200
|
if (failure === undefined)
|
|
165
201
|
settleRetired();
|
|
@@ -189,6 +225,25 @@ async function drivePi(sdk, execution, input, signal, custody) {
|
|
|
189
225
|
admission: { fence: native.sessionId },
|
|
190
226
|
events,
|
|
191
227
|
completion,
|
|
228
|
+
tell: (tell) => {
|
|
229
|
+
if (state.settled)
|
|
230
|
+
return Promise.resolve({ kind: "turn-ended" });
|
|
231
|
+
const message = {
|
|
232
|
+
role: "user",
|
|
233
|
+
content: [{ type: "text", text: tell.text }],
|
|
234
|
+
timestamp: new Date().getTime(),
|
|
235
|
+
};
|
|
236
|
+
return new Promise((resolve, reject) => {
|
|
237
|
+
pendingTells.set(message, { id: tell.id, resolve });
|
|
238
|
+
try {
|
|
239
|
+
agent.steer(message);
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
pendingTells.delete(message);
|
|
243
|
+
reject(error);
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
},
|
|
192
247
|
abort: () => {
|
|
193
248
|
state.abortRequest ??= (async () => {
|
|
194
249
|
if (state.settled)
|
|
@@ -223,11 +278,10 @@ async function forkPi(sdk, input) {
|
|
|
223
278
|
async function loadPiSdk() {
|
|
224
279
|
const sdk = await import("@earendil-works/pi-coding-agent");
|
|
225
280
|
return {
|
|
226
|
-
|
|
281
|
+
createAgentSessionFromServices: sdk.createAgentSessionFromServices,
|
|
282
|
+
createAgentSessionServices: sdk.createAgentSessionServices,
|
|
227
283
|
createBashToolDefinition: sdk.createBashToolDefinition,
|
|
228
|
-
DefaultResourceLoader: sdk.DefaultResourceLoader,
|
|
229
284
|
getAgentDir: sdk.getAgentDir,
|
|
230
|
-
ModelRuntime: sdk.ModelRuntime,
|
|
231
285
|
SessionManager: sdk.SessionManager,
|
|
232
286
|
};
|
|
233
287
|
}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type Soul } from "./heart/index.js";
|
|
2
|
+
import { type AllocatedAkuma, type AkumaPaths, type AkuId } from "./identity.js";
|
|
2
3
|
import type { OwnedProcess } from "../runtime/proc/run.js";
|
|
4
|
+
import type { RequestRecipe } from "./heart/facts.js";
|
|
5
|
+
import type { CallInitialTell, CallInitialTellAdmission, TellResult } from "./call-initial-tell.js";
|
|
6
|
+
import { type WorldRoot } from "../world.js";
|
|
3
7
|
export declare const BIRTH_TIMEOUT_MS = 30000;
|
|
4
8
|
export type BirthInput = Readonly<{
|
|
5
9
|
worldPath: string;
|
|
@@ -12,6 +16,83 @@ export type LaunchInput = Readonly<{
|
|
|
12
16
|
launch(allocated: AllocatedAkuma): Promise<OwnedProcess | void>;
|
|
13
17
|
signal?: AbortSignal;
|
|
14
18
|
}>;
|
|
15
|
-
export declare function birthAkuma(input: BirthInput): Promise<AllocatedAkuma>;
|
|
16
|
-
export declare function launchAkuma(input: LaunchInput): Promise<AllocatedAkuma>;
|
|
17
19
|
export declare function publishAkuma(input: BirthInput & Omit<LaunchInput, "allocated">): Promise<AllocatedAkuma>;
|
|
20
|
+
/**
|
|
21
|
+
* The one prepared-call recipe shape, owned by the Heart Soul projection. Both
|
|
22
|
+
* custody kinds carry the same raw recipe: the decoded provider execution plus
|
|
23
|
+
* the options the one prepared-call executor admits exactly once.
|
|
24
|
+
*/
|
|
25
|
+
export type PreparedCallRecipe = RequestRecipe;
|
|
26
|
+
/**
|
|
27
|
+
* The one owner-typed admission failure the prepared executor raises before any
|
|
28
|
+
* allocation. It carries only the failing stage and the provider owner's native
|
|
29
|
+
* diagnostic; the initiating edge maps it back to its own refusal meaning.
|
|
30
|
+
*/
|
|
31
|
+
export declare class PreparedCallAdmissionError extends Error {
|
|
32
|
+
readonly stage: "resolve" | "options";
|
|
33
|
+
readonly diagnostic: string;
|
|
34
|
+
readonly kind = "prepared-call-admission";
|
|
35
|
+
constructor(stage: "resolve" | "options", diagnostic: string);
|
|
36
|
+
}
|
|
37
|
+
export type PreparedCallSpawn = Readonly<{
|
|
38
|
+
paths: AkumaPaths;
|
|
39
|
+
seed: Omit<Soul, "createdAt">;
|
|
40
|
+
}>;
|
|
41
|
+
export type PreparedCallInitialTellAdmission = Readonly<{
|
|
42
|
+
id: AkuId;
|
|
43
|
+
initialTell: CallInitialTell;
|
|
44
|
+
signal?: AbortSignal;
|
|
45
|
+
}>;
|
|
46
|
+
type PreparedCallPorts = Readonly<{
|
|
47
|
+
/** Spawn one already-allocated child; publication already owns the allocated directory. */
|
|
48
|
+
spawn(launch: PreparedCallSpawn): Promise<OwnedProcess | void>;
|
|
49
|
+
/** Admit the optional initial Tell against the just-confirmed child. */
|
|
50
|
+
admitInitialTell(input: PreparedCallInitialTellAdmission): Promise<CallInitialTellAdmission>;
|
|
51
|
+
}>;
|
|
52
|
+
/**
|
|
53
|
+
* The one discriminated custody the prepared executor serves. Local custody
|
|
54
|
+
* carries the initiating process's own proved World and local spawn/initial-Tell
|
|
55
|
+
* ports. Request custody carries the authenticated direct parent, the serving
|
|
56
|
+
* request identity, the reservation edge, and the parent scope its allowed
|
|
57
|
+
* actions are clipped against. Both kinds carry the same raw recipe.
|
|
58
|
+
*/
|
|
59
|
+
type PreparedCallCustody = (PreparedCallPorts & Readonly<{
|
|
60
|
+
kind: "local";
|
|
61
|
+
world: WorldRoot;
|
|
62
|
+
recipe: PreparedCallRecipe;
|
|
63
|
+
}>) | (PreparedCallPorts & Readonly<{
|
|
64
|
+
kind: "request";
|
|
65
|
+
world: WorldRoot;
|
|
66
|
+
coordinate: string;
|
|
67
|
+
recipe: PreparedCallRecipe;
|
|
68
|
+
parent: Soul;
|
|
69
|
+
requestId: string;
|
|
70
|
+
admissionOpen(): boolean;
|
|
71
|
+
reserve(child: AkuId): Promise<void>;
|
|
72
|
+
refuse(diagnostic: string): Promise<void>;
|
|
73
|
+
}>);
|
|
74
|
+
type PreparedCallResult = Readonly<{
|
|
75
|
+
child: AllocatedAkuma;
|
|
76
|
+
/** The exact initial TellResult, present only when its admission completed. */
|
|
77
|
+
tell?: TellResult;
|
|
78
|
+
/** The native launch or initial-Tell failure that stopped after a confirmed birth. */
|
|
79
|
+
failure?: unknown;
|
|
80
|
+
}>;
|
|
81
|
+
type PreparedCallInput = Readonly<{
|
|
82
|
+
archetype: string;
|
|
83
|
+
cwd: string;
|
|
84
|
+
initialTell?: CallInitialTell;
|
|
85
|
+
signal?: AbortSignal;
|
|
86
|
+
custody: PreparedCallCustody;
|
|
87
|
+
}>;
|
|
88
|
+
export declare function callDiagnostic(error: unknown): string;
|
|
89
|
+
/**
|
|
90
|
+
* The one lower birth owner for a prepared call. It alone orders World
|
|
91
|
+
* proof/consumption, request-custody provider resolution and options admission,
|
|
92
|
+
* allowed clipping, child allocation, the launch admission gate and reservation,
|
|
93
|
+
* spawn/publication, and optional initial-Tell admission. It never loads
|
|
94
|
+
* Settings or an Archetype and never imports Library, and it never replaces a
|
|
95
|
+
* durably born child with a thrown error.
|
|
96
|
+
*/
|
|
97
|
+
export declare function executePreparedCall(input: PreparedCallInput): Promise<PreparedCallResult>;
|
|
98
|
+
export {};
|
|
@@ -2,6 +2,9 @@ import { HeldAkumaLeash, initializeHeart, readHeart, readSeal, readSoul } from "
|
|
|
2
2
|
import { acquireLeash } from "./control.js";
|
|
3
3
|
import { allocateAkumaDirectory } from "./identity.js";
|
|
4
4
|
import { abortableDelay } from "./abort.js";
|
|
5
|
+
import { clipAllowedActions } from "./allowed.js";
|
|
6
|
+
import { resolveProviderExecution } from "./providers/index.js";
|
|
7
|
+
import { World } from "../world.js";
|
|
5
8
|
const POLL_MS = 100;
|
|
6
9
|
const CUSTODY_HANDOFF_MS = 1_000;
|
|
7
10
|
export const BIRTH_TIMEOUT_MS = 30_000;
|
|
@@ -220,7 +223,7 @@ async function sealLocalFailure(allocated, error) {
|
|
|
220
223
|
/* the original local publication failure remains authoritative */
|
|
221
224
|
}
|
|
222
225
|
}
|
|
223
|
-
|
|
226
|
+
async function birthAkuma(input) {
|
|
224
227
|
input.signal?.throwIfAborted();
|
|
225
228
|
const allocated = await allocateAkumaDirectory({ worldRoot: input.worldPath, archetype: input.archetype });
|
|
226
229
|
try {
|
|
@@ -233,7 +236,7 @@ export async function birthAkuma(input) {
|
|
|
233
236
|
throw error;
|
|
234
237
|
}
|
|
235
238
|
}
|
|
236
|
-
|
|
239
|
+
async function launchAkuma(input) {
|
|
237
240
|
const { allocated } = input;
|
|
238
241
|
let owned = undefined;
|
|
239
242
|
try {
|
|
@@ -272,3 +275,143 @@ export async function publishAkuma(input) {
|
|
|
272
275
|
const allocated = await birthAkuma(input);
|
|
273
276
|
return await launchAkuma({ ...input, allocated });
|
|
274
277
|
}
|
|
278
|
+
/**
|
|
279
|
+
* The one owner-typed admission failure the prepared executor raises before any
|
|
280
|
+
* allocation. It carries only the failing stage and the provider owner's native
|
|
281
|
+
* diagnostic; the initiating edge maps it back to its own refusal meaning.
|
|
282
|
+
*/
|
|
283
|
+
export class PreparedCallAdmissionError extends Error {
|
|
284
|
+
stage;
|
|
285
|
+
diagnostic;
|
|
286
|
+
kind = "prepared-call-admission";
|
|
287
|
+
constructor(stage, diagnostic) {
|
|
288
|
+
super(diagnostic);
|
|
289
|
+
this.stage = stage;
|
|
290
|
+
this.diagnostic = diagnostic;
|
|
291
|
+
this.name = "PreparedCallAdmissionError";
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
export function callDiagnostic(error) {
|
|
295
|
+
return error instanceof Error ? error.message : String(error);
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* The one provider-owner admission shared by both custody kinds: resolve the
|
|
299
|
+
* decoded execution to its adapter, admit the raw options once, and clip the
|
|
300
|
+
* requested actions only when a parent ceiling applies.
|
|
301
|
+
*/
|
|
302
|
+
async function admittedRecipe(recipe, bounds = {}) {
|
|
303
|
+
let selected;
|
|
304
|
+
try {
|
|
305
|
+
selected = await resolveProviderExecution(recipe.provider);
|
|
306
|
+
}
|
|
307
|
+
catch (error) {
|
|
308
|
+
if (error instanceof TypeError)
|
|
309
|
+
throw new PreparedCallAdmissionError("resolve", error.message);
|
|
310
|
+
throw error;
|
|
311
|
+
}
|
|
312
|
+
const admission = selected.adapter.admitOptions(recipe.options);
|
|
313
|
+
if (admission.kind === "refused") {
|
|
314
|
+
if (bounds.refuse !== undefined)
|
|
315
|
+
await bounds.refuse(admission.diagnostic);
|
|
316
|
+
throw new PreparedCallAdmissionError("options", admission.diagnostic);
|
|
317
|
+
}
|
|
318
|
+
return Object.freeze({
|
|
319
|
+
...(recipe.description === undefined ? {} : { description: recipe.description }),
|
|
320
|
+
provider: selected.execution,
|
|
321
|
+
options: admission.options,
|
|
322
|
+
allowed: bounds.ceiling === undefined ? recipe.allowed : clipAllowedActions(recipe.allowed, bounds.ceiling),
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
/** Judge durable birth from the allocated child's own evidence, never from the caught error. */
|
|
326
|
+
async function durablyBorn(allocated) {
|
|
327
|
+
const soul = await readSoul(allocated.paths);
|
|
328
|
+
return soul !== null && soul.id === allocated.id;
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* The one lower birth owner for a prepared call. It alone orders World
|
|
332
|
+
* proof/consumption, request-custody provider resolution and options admission,
|
|
333
|
+
* allowed clipping, child allocation, the launch admission gate and reservation,
|
|
334
|
+
* spawn/publication, and optional initial-Tell admission. It never loads
|
|
335
|
+
* Settings or an Archetype and never imports Library, and it never replaces a
|
|
336
|
+
* durably born child with a thrown error.
|
|
337
|
+
*/
|
|
338
|
+
export async function executePreparedCall(input) {
|
|
339
|
+
const { custody } = input;
|
|
340
|
+
let world;
|
|
341
|
+
if (custody.kind === "local") {
|
|
342
|
+
world = custody.world;
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
const requestWorld = await World.prove(custody.coordinate);
|
|
346
|
+
if (requestWorld !== custody.world) {
|
|
347
|
+
const diagnostic = `request world ${requestWorld} does not match ${custody.world}`;
|
|
348
|
+
await custody.refuse(diagnostic);
|
|
349
|
+
throw new Error(diagnostic);
|
|
350
|
+
}
|
|
351
|
+
world = custody.world;
|
|
352
|
+
}
|
|
353
|
+
const recipe = custody.kind === "request"
|
|
354
|
+
? await admittedRecipe(custody.recipe, { ceiling: custody.parent.allowed, refuse: custody.refuse })
|
|
355
|
+
: await admittedRecipe(custody.recipe);
|
|
356
|
+
const origin = custody.kind === "request"
|
|
357
|
+
? { kind: "request", parent: custody.parent.id, requestId: custody.requestId }
|
|
358
|
+
: { kind: "direct" };
|
|
359
|
+
const allocated = await birthAkuma({
|
|
360
|
+
worldPath: world,
|
|
361
|
+
archetype: input.archetype,
|
|
362
|
+
...(input.signal === undefined ? {} : { signal: input.signal }),
|
|
363
|
+
});
|
|
364
|
+
let child = allocated;
|
|
365
|
+
try {
|
|
366
|
+
child = await launchAkuma({
|
|
367
|
+
allocated,
|
|
368
|
+
...(input.signal === undefined ? {} : { signal: input.signal }),
|
|
369
|
+
launch: async (ready) => {
|
|
370
|
+
if (custody.kind === "request") {
|
|
371
|
+
if (!custody.admissionOpen())
|
|
372
|
+
throw new Error("body closed request admission");
|
|
373
|
+
await custody.reserve(ready.id);
|
|
374
|
+
}
|
|
375
|
+
return await custody.spawn({
|
|
376
|
+
paths: ready.paths,
|
|
377
|
+
seed: {
|
|
378
|
+
id: ready.id,
|
|
379
|
+
archetype: ready.archetype,
|
|
380
|
+
...(recipe.description === undefined ? {} : { description: recipe.description }),
|
|
381
|
+
provider: recipe.provider,
|
|
382
|
+
options: recipe.options,
|
|
383
|
+
allowed: recipe.allowed,
|
|
384
|
+
cwd: input.cwd,
|
|
385
|
+
origin,
|
|
386
|
+
},
|
|
387
|
+
});
|
|
388
|
+
},
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
catch (error) {
|
|
392
|
+
if (!(await durablyBorn(allocated)))
|
|
393
|
+
throw error;
|
|
394
|
+
return { child: allocated, failure: error };
|
|
395
|
+
}
|
|
396
|
+
if (input.initialTell === undefined)
|
|
397
|
+
return { child };
|
|
398
|
+
let told;
|
|
399
|
+
try {
|
|
400
|
+
const admitted = await custody.admitInitialTell({
|
|
401
|
+
id: child.id,
|
|
402
|
+
initialTell: input.initialTell,
|
|
403
|
+
...(input.signal === undefined ? {} : { signal: input.signal }),
|
|
404
|
+
});
|
|
405
|
+
if (admitted.kind === "birth-failed")
|
|
406
|
+
throw new Error(admitted.diagnostic);
|
|
407
|
+
if (admitted.kind === "not-born")
|
|
408
|
+
throw new Error(`Akuma ${child.id} was not born for its initial Tell`);
|
|
409
|
+
told = await admitted.wake;
|
|
410
|
+
return { child, tell: told };
|
|
411
|
+
}
|
|
412
|
+
catch (error) {
|
|
413
|
+
if (told !== undefined)
|
|
414
|
+
return { child, tell: told };
|
|
415
|
+
return { child, failure: error };
|
|
416
|
+
}
|
|
417
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const PAGE_POOL_SIZE = 16;
|
|
2
|
+
export async function boundedMap(values, mapper) {
|
|
3
|
+
const results = [];
|
|
4
|
+
let index = 0;
|
|
5
|
+
const worker = async () => {
|
|
6
|
+
for (;;) {
|
|
7
|
+
const selected = index++;
|
|
8
|
+
if (selected >= values.length)
|
|
9
|
+
return;
|
|
10
|
+
results[selected] = await mapper(values[selected]);
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
await Promise.all(Array.from({ length: Math.min(PAGE_POOL_SIZE, values.length) }, worker));
|
|
14
|
+
return results;
|
|
15
|
+
}
|
|
@@ -53,6 +53,16 @@ async function readRequestReceipt(input, path, id) {
|
|
|
53
53
|
if (receipt.state === "refused") {
|
|
54
54
|
throw new AkumaBodyRequestError(receipt.action, "refused", receipt.diagnostic, receipt.id);
|
|
55
55
|
}
|
|
56
|
+
if (receipt.state === "voided" && receipt.outcome !== undefined) {
|
|
57
|
+
let result;
|
|
58
|
+
try {
|
|
59
|
+
result = input.command.decodeResult(receipt.outcome);
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
throw new Error(`transport integrity: invalid voided live result: ${error instanceof Error ? error.message : String(error)}`);
|
|
63
|
+
}
|
|
64
|
+
return withRequestMetadata({ kind: "returned", result }, id, input.command.action);
|
|
65
|
+
}
|
|
56
66
|
if (receipt.state === "voided") {
|
|
57
67
|
throwVoidedRequestFailure(receipt.action, receipt.evidence, receipt.failure, input.command.decodeFailure, receipt.id);
|
|
58
68
|
}
|
|
@@ -30,6 +30,7 @@ async function projectCommandReceipt(input, fact, command, outcome, failure) {
|
|
|
30
30
|
state: "voided",
|
|
31
31
|
evidence: fact.evidence,
|
|
32
32
|
...(failure === undefined ? {} : { failure }),
|
|
33
|
+
...(outcome === undefined ? {} : { outcome: outcome.result }),
|
|
33
34
|
}
|
|
34
35
|
: fact.state === "unproven"
|
|
35
36
|
? {
|
|
@@ -152,6 +153,12 @@ async function serveServiceCommand(input, command) {
|
|
|
152
153
|
return await serveResolvedCommand(input, command, request, async (fact, facts) => {
|
|
153
154
|
await beginRequest(input.paths, fact.id);
|
|
154
155
|
const served = await request.execute(facts);
|
|
156
|
+
if (served.kind === "voided") {
|
|
157
|
+
return {
|
|
158
|
+
fact: await voidRequest(input.paths, fact.id, "returned owner outcome was voided"),
|
|
159
|
+
outcome: { kind: "returned", result: served.outcome },
|
|
160
|
+
};
|
|
161
|
+
}
|
|
155
162
|
return {
|
|
156
163
|
fact: await serveUpstreamRequest(input.paths, fact.id, served.serviceJson),
|
|
157
164
|
outcome: { kind: "returned", result: served.result },
|
|
@@ -4,26 +4,6 @@ declare const requestEnvelopeSchema: z.ZodObject<{
|
|
|
4
4
|
action: z.ZodString;
|
|
5
5
|
payload: z.ZodUnknown;
|
|
6
6
|
}, z.core.$strict>;
|
|
7
|
-
declare const upstreamRequestFailureSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
8
|
-
kind: z.ZodLiteral<"akuma-not-born">;
|
|
9
|
-
id: z.ZodString;
|
|
10
|
-
}, z.core.$strict>, z.ZodObject<{
|
|
11
|
-
kind: z.ZodLiteral<"failed">;
|
|
12
|
-
diagnostic: z.ZodString;
|
|
13
|
-
}, z.core.$strict>]>;
|
|
14
|
-
declare const returnedEnvelopeSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
15
|
-
kind: z.ZodLiteral<"returned">;
|
|
16
|
-
result: z.ZodUnknown;
|
|
17
|
-
}, z.core.$strict>, z.ZodObject<{
|
|
18
|
-
kind: z.ZodLiteral<"failed">;
|
|
19
|
-
failure: z.ZodUnion<readonly [z.ZodObject<{
|
|
20
|
-
kind: z.ZodLiteral<"akuma-not-born">;
|
|
21
|
-
id: z.ZodString;
|
|
22
|
-
}, z.core.$strict>, z.ZodObject<{
|
|
23
|
-
kind: z.ZodLiteral<"failed">;
|
|
24
|
-
diagnostic: z.ZodString;
|
|
25
|
-
}, z.core.$strict>]>;
|
|
26
|
-
}, z.core.$strict>]>;
|
|
27
7
|
declare const receiptEnvelopeSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
28
8
|
id: z.ZodString;
|
|
29
9
|
action: z.ZodString;
|
|
@@ -57,6 +37,7 @@ declare const receiptEnvelopeSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
57
37
|
state: z.ZodLiteral<"voided">;
|
|
58
38
|
evidence: z.ZodString;
|
|
59
39
|
failure: z.ZodOptional<z.ZodUnknown>;
|
|
40
|
+
outcome: z.ZodOptional<z.ZodUnknown>;
|
|
60
41
|
}, z.core.$strict>, z.ZodObject<{
|
|
61
42
|
id: z.ZodString;
|
|
62
43
|
action: z.ZodString;
|
|
@@ -100,16 +81,21 @@ export type ChildRequestCommand<Input, Output, Reference> = Readonly<{
|
|
|
100
81
|
child: string;
|
|
101
82
|
}>>;
|
|
102
83
|
}>;
|
|
84
|
+
export type ServiceCompletion<Output, Service> = Readonly<{
|
|
85
|
+
kind: "served";
|
|
86
|
+
result: Output;
|
|
87
|
+
service: Service;
|
|
88
|
+
}> | Readonly<{
|
|
89
|
+
kind: "voided";
|
|
90
|
+
outcome: Output;
|
|
91
|
+
}>;
|
|
103
92
|
export type ServiceRequestCommand<Input, Output, Service, Reference> = Readonly<{
|
|
104
93
|
completion: "service";
|
|
105
94
|
protocol: RequestProtocol<Input, Output, Reference>;
|
|
106
95
|
encodeService(service: Service): unknown;
|
|
107
96
|
decodeService(service: unknown): Service;
|
|
108
97
|
projectService(service: Service): Reference;
|
|
109
|
-
execute(input: Input, facts: ExecutionFacts): Promise<
|
|
110
|
-
result: Output;
|
|
111
|
-
service: Service;
|
|
112
|
-
}>>;
|
|
98
|
+
execute(input: Input, facts: ExecutionFacts): Promise<ServiceCompletion<Output, Service>>;
|
|
113
99
|
}>;
|
|
114
100
|
type ErasedRequest = Readonly<{
|
|
115
101
|
payloadJson: string;
|
|
@@ -125,8 +111,12 @@ type ErasedChildRequest = ErasedRequest & Readonly<{
|
|
|
125
111
|
}>;
|
|
126
112
|
type ErasedServiceRequest = ErasedRequest & Readonly<{
|
|
127
113
|
execute(facts: ExecutionFacts): Promise<Readonly<{
|
|
114
|
+
kind: "served";
|
|
128
115
|
result: unknown;
|
|
129
116
|
serviceJson: string;
|
|
117
|
+
}> | Readonly<{
|
|
118
|
+
kind: "voided";
|
|
119
|
+
outcome: unknown;
|
|
130
120
|
}>>;
|
|
131
121
|
}>;
|
|
132
122
|
export type ErasedRequestCommand = Readonly<{
|
|
@@ -144,8 +134,6 @@ export type ErasedRequestCommand = Readonly<{
|
|
|
144
134
|
export declare function eraseRequestCommand<Input, Output, Reference>(command: ChildRequestCommand<Input, Output, Reference>): ErasedRequestCommand;
|
|
145
135
|
export declare function eraseRequestCommand<Input, Output, Service, Reference>(command: ServiceRequestCommand<Input, Output, Service, Reference>): ErasedRequestCommand;
|
|
146
136
|
export declare function composeRequestCommands(...maps: readonly Readonly<Record<string, ErasedRequestCommand>>[]): Readonly<Record<string, ErasedRequestCommand>>;
|
|
147
|
-
export type UpstreamRequestFailure = z.infer<typeof upstreamRequestFailureSchema>;
|
|
148
|
-
export type ReturnedEnvelope = z.infer<typeof returnedEnvelopeSchema>;
|
|
149
137
|
export type ReceiptEnvelope = z.infer<typeof receiptEnvelopeSchema>;
|
|
150
138
|
export declare function decodeEnvelope(bytes: string, fileId: string): RequestEnvelope | null;
|
|
151
139
|
export declare function decodeReceiptEnvelope(bytes: string, id: string, action: string): ReceiptEnvelope | null;
|
|
@@ -27,6 +27,7 @@ const receiptEnvelopeSchema = z.union([
|
|
|
27
27
|
state: z.literal("voided"),
|
|
28
28
|
evidence: z.string(),
|
|
29
29
|
failure: z.unknown().optional(),
|
|
30
|
+
outcome: z.unknown().optional(),
|
|
30
31
|
})
|
|
31
32
|
.strict(),
|
|
32
33
|
z
|
|
@@ -78,7 +79,10 @@ export function eraseRequestCommand(command) {
|
|
|
78
79
|
isPermitted: (allowed) => protocol.isPermitted(allowed),
|
|
79
80
|
execute: async (facts) => {
|
|
80
81
|
const served = await command.execute(input, facts);
|
|
82
|
+
if (served.kind === "voided")
|
|
83
|
+
return { kind: "voided", outcome: protocol.encodeResult(served.outcome) };
|
|
81
84
|
return {
|
|
85
|
+
kind: "served",
|
|
82
86
|
result: protocol.encodeResult(served.result),
|
|
83
87
|
serviceJson: JSON.stringify(command.encodeService(served.service)),
|
|
84
88
|
};
|
|
@@ -15,6 +15,4 @@ export declare function bodyRequestExecutionContext(directory: unknown): Executi
|
|
|
15
15
|
export declare function bodyRequestExecution(input: Readonly<{
|
|
16
16
|
directory: string;
|
|
17
17
|
}>): LibraryExecution;
|
|
18
|
-
/** Normalizes the public carrier before a composition captures its immutable channel. */
|
|
19
|
-
export declare function libraryExecution(value: unknown): LibraryExecution;
|
|
20
18
|
export declare function executionChannel(context?: ExecutionContext): ExecutionChannel;
|
|
@@ -35,23 +35,6 @@ export function bodyRequestExecution(input) {
|
|
|
35
35
|
throw new TypeError(error instanceof Error ? error.message : String(error));
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
|
-
/** Normalizes the public carrier before a composition captures its immutable channel. */
|
|
39
|
-
export function libraryExecution(value) {
|
|
40
|
-
const context = valueRecord(value, "execution");
|
|
41
|
-
closed(context, ["channel"], "execution");
|
|
42
|
-
const channel = valueRecord(context.channel, "execution channel");
|
|
43
|
-
if (channel.kind === "local") {
|
|
44
|
-
closed(channel, ["kind"], "execution channel");
|
|
45
|
-
return localExecutionContext();
|
|
46
|
-
}
|
|
47
|
-
if (channel.kind === "body-request") {
|
|
48
|
-
closed(channel, ["directory", "kind"], "execution channel");
|
|
49
|
-
if (typeof channel.directory !== "string")
|
|
50
|
-
throw new TypeError("execution channel directory must be a string");
|
|
51
|
-
return bodyRequestExecution({ directory: channel.directory });
|
|
52
|
-
}
|
|
53
|
-
throw new TypeError("execution channel must be local or body-request");
|
|
54
|
-
}
|
|
55
38
|
export function executionChannel(context) {
|
|
56
39
|
return context?.channel ?? LOCAL_CHANNEL;
|
|
57
40
|
}
|