@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,220 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
export { decodeResumeCoordinate, encodeResumeCoordinate } from "./coordinate.js";
|
|
2
2
|
export { AKUMA_REQUESTS_ENV } from "./providers/execution-environment.js";
|
|
3
3
|
export const AGENT_EVENT_TEXT_LIMIT = 16_384;
|
|
4
4
|
export const AGENT_THOUGHT_TEXT_LIMIT = 4_000;
|
|
5
5
|
export const AGENT_EVENT_QUEUE_LIMIT = 256;
|
|
6
|
-
|
|
7
|
-
session: true,
|
|
8
|
-
assistant: true,
|
|
9
|
-
thought: true,
|
|
10
|
-
tool: true,
|
|
11
|
-
note: true,
|
|
12
|
-
unknown: true,
|
|
13
|
-
};
|
|
14
|
-
function object(value) {
|
|
15
|
-
return value !== null && typeof value === "object" && !Array.isArray(value)
|
|
16
|
-
? value
|
|
17
|
-
: null;
|
|
18
|
-
}
|
|
19
|
-
export { decodeResumeCoordinate, encodeResumeCoordinate };
|
|
20
|
-
function eventType(value) {
|
|
21
|
-
return typeof value === "string" && Object.hasOwn(AGENT_EVENT_TYPES, value);
|
|
22
|
-
}
|
|
23
|
-
const SEARCH_SCOPES = {
|
|
24
|
-
content: true,
|
|
25
|
-
files: true,
|
|
26
|
-
web: true,
|
|
27
|
-
};
|
|
28
|
-
function decodePositiveLine(value) {
|
|
29
|
-
if (value === undefined)
|
|
30
|
-
return undefined;
|
|
31
|
-
return typeof value === "number" && Number.isSafeInteger(value) && value >= 1 ? value : null;
|
|
32
|
-
}
|
|
33
|
-
function decodeOptionalText(value) {
|
|
34
|
-
if (value === undefined)
|
|
35
|
-
return undefined;
|
|
36
|
-
return typeof value === "string" ? value : null;
|
|
37
|
-
}
|
|
38
|
-
function decodeSearchScope(value) {
|
|
39
|
-
if (value === undefined)
|
|
40
|
-
return undefined;
|
|
41
|
-
return typeof value === "string" && Object.hasOwn(SEARCH_SCOPES, value) ? value : null;
|
|
42
|
-
}
|
|
43
|
-
function decodeRunCall(call) {
|
|
44
|
-
return typeof call.command === "string" ? { kind: "run", command: call.command } : null;
|
|
45
|
-
}
|
|
46
|
-
function decodeReadCall(call) {
|
|
47
|
-
if (typeof call.path !== "string")
|
|
48
|
-
return null;
|
|
49
|
-
const offset = decodePositiveLine(call.offset);
|
|
50
|
-
const limit = decodePositiveLine(call.limit);
|
|
51
|
-
if (offset === null || limit === null)
|
|
52
|
-
return null;
|
|
53
|
-
return {
|
|
54
|
-
kind: "read",
|
|
55
|
-
path: call.path,
|
|
56
|
-
...(offset === undefined ? {} : { offset }),
|
|
57
|
-
...(limit === undefined ? {} : { limit }),
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
function decodeSearchCall(call) {
|
|
61
|
-
if (typeof call.query !== "string")
|
|
62
|
-
return null;
|
|
63
|
-
const scope = decodeSearchScope(call.scope);
|
|
64
|
-
const path = decodeOptionalText(call.path);
|
|
65
|
-
const glob = decodeOptionalText(call.glob);
|
|
66
|
-
if (scope === null || path === null || glob === null)
|
|
67
|
-
return null;
|
|
68
|
-
return {
|
|
69
|
-
kind: "search",
|
|
70
|
-
query: call.query,
|
|
71
|
-
...(scope === undefined ? {} : { scope }),
|
|
72
|
-
...(path === undefined ? {} : { path }),
|
|
73
|
-
...(glob === undefined ? {} : { glob }),
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
function decodeNonnegativeCount(value) {
|
|
77
|
-
return Number.isSafeInteger(value) && value >= 0 ? value : null;
|
|
78
|
-
}
|
|
79
|
-
function decodeDiffstat(value) {
|
|
80
|
-
if (value === undefined)
|
|
81
|
-
return undefined;
|
|
82
|
-
const diffstat = object(value);
|
|
83
|
-
if (diffstat === null)
|
|
84
|
-
return null;
|
|
85
|
-
const added = decodeNonnegativeCount(diffstat.added);
|
|
86
|
-
const removed = decodeNonnegativeCount(diffstat.removed);
|
|
87
|
-
return added === null || removed === null ? null : { added, removed };
|
|
88
|
-
}
|
|
89
|
-
function decodeFileChangeMember(value) {
|
|
90
|
-
const change = object(value);
|
|
91
|
-
if (change === null ||
|
|
92
|
-
(change.op !== "add" && change.op !== "update" && change.op !== "delete" && change.op !== "unspecified") ||
|
|
93
|
-
typeof change.path !== "string")
|
|
94
|
-
return null;
|
|
95
|
-
const diffstat = decodeDiffstat(change.diffstat);
|
|
96
|
-
if (diffstat === null)
|
|
97
|
-
return null;
|
|
98
|
-
return {
|
|
99
|
-
op: change.op,
|
|
100
|
-
path: change.path,
|
|
101
|
-
...(diffstat === undefined ? {} : { diffstat }),
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
function decodeFileChangeCall(call) {
|
|
105
|
-
if (!Array.isArray(call.changes))
|
|
106
|
-
return null;
|
|
107
|
-
const changes = call.changes.map(decodeFileChangeMember);
|
|
108
|
-
return changes.every((change) => change !== null) ? { kind: "fileChange", changes } : null;
|
|
109
|
-
}
|
|
110
|
-
function decodeToolInput(value) {
|
|
111
|
-
if (value === undefined)
|
|
112
|
-
return undefined;
|
|
113
|
-
const input = object(value);
|
|
114
|
-
if (input === null || typeof input.json !== "string" || typeof input.truncated !== "boolean")
|
|
115
|
-
return null;
|
|
116
|
-
return { json: input.json, truncated: input.truncated };
|
|
117
|
-
}
|
|
118
|
-
function decodeOtherCall(call) {
|
|
119
|
-
if (typeof call.display !== "string")
|
|
120
|
-
return null;
|
|
121
|
-
const input = decodeToolInput(call.input);
|
|
122
|
-
return input === null ? null : { kind: "other", display: call.display, ...(input === undefined ? {} : { input }) };
|
|
123
|
-
}
|
|
124
|
-
function decodeToolCall(value) {
|
|
125
|
-
const call = object(value);
|
|
126
|
-
if (call === null)
|
|
127
|
-
return null;
|
|
128
|
-
switch (call.kind) {
|
|
129
|
-
case "run":
|
|
130
|
-
return decodeRunCall(call);
|
|
131
|
-
case "read":
|
|
132
|
-
return decodeReadCall(call);
|
|
133
|
-
case "search":
|
|
134
|
-
return decodeSearchCall(call);
|
|
135
|
-
case "fileChange":
|
|
136
|
-
return decodeFileChangeCall(call);
|
|
137
|
-
case "other":
|
|
138
|
-
return decodeOtherCall(call);
|
|
139
|
-
default:
|
|
140
|
-
return null;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
function decodeToolResult(value) {
|
|
144
|
-
const result = object(value);
|
|
145
|
-
if (result === null || (result.status !== "ok" && result.status !== "error"))
|
|
146
|
-
return null;
|
|
147
|
-
if (result.message !== undefined && typeof result.message !== "string")
|
|
148
|
-
return null;
|
|
149
|
-
if (result.exitCode !== undefined && !Number.isSafeInteger(result.exitCode))
|
|
150
|
-
return null;
|
|
151
|
-
return {
|
|
152
|
-
status: result.status,
|
|
153
|
-
...(result.message === undefined ? {} : { message: result.message }),
|
|
154
|
-
...(result.exitCode === undefined ? {} : { exitCode: result.exitCode }),
|
|
155
|
-
};
|
|
156
|
-
}
|
|
157
|
-
function decodeToolEvent(event) {
|
|
158
|
-
if (event.truncated !== undefined && event.truncated !== true)
|
|
159
|
-
return null;
|
|
160
|
-
if (typeof event.id !== "string" || typeof event.name !== "string")
|
|
161
|
-
return null;
|
|
162
|
-
const call = decodeToolCall(event.call);
|
|
163
|
-
if (call !== null && event.phase === "started" && event.result === undefined) {
|
|
164
|
-
return {
|
|
165
|
-
type: "tool",
|
|
166
|
-
phase: "started",
|
|
167
|
-
id: event.id,
|
|
168
|
-
name: event.name,
|
|
169
|
-
call,
|
|
170
|
-
...(event.truncated === true ? { truncated: true } : {}),
|
|
171
|
-
};
|
|
172
|
-
}
|
|
173
|
-
const result = decodeToolResult(event.result);
|
|
174
|
-
if (call !== null && event.phase === "completed" && result !== null) {
|
|
175
|
-
return {
|
|
176
|
-
type: "tool",
|
|
177
|
-
phase: "completed",
|
|
178
|
-
id: event.id,
|
|
179
|
-
name: event.name,
|
|
180
|
-
call,
|
|
181
|
-
result,
|
|
182
|
-
...(event.truncated === true ? { truncated: true } : {}),
|
|
183
|
-
};
|
|
184
|
-
}
|
|
185
|
-
return null;
|
|
186
|
-
}
|
|
187
|
-
function decodeTypedEvent(type, event) {
|
|
188
|
-
if (type !== "session" && event.truncated !== undefined && event.truncated !== true)
|
|
189
|
-
return null;
|
|
190
|
-
const truncated = event.truncated === true ? { truncated: true } : {};
|
|
191
|
-
switch (type) {
|
|
192
|
-
case "assistant":
|
|
193
|
-
case "thought":
|
|
194
|
-
return typeof event.text === "string" ? { type, text: event.text, ...truncated } : null;
|
|
195
|
-
case "note":
|
|
196
|
-
return typeof event.text === "string" ? { type, text: event.text, ...truncated } : null;
|
|
197
|
-
case "unknown":
|
|
198
|
-
return typeof event.kind === "string" ? { type, kind: event.kind, ...truncated } : null;
|
|
199
|
-
case "session": {
|
|
200
|
-
const coordinate = decodeResumeCoordinate(event.coordinate);
|
|
201
|
-
return coordinate === null ? null : { type, coordinate };
|
|
202
|
-
}
|
|
203
|
-
case "tool":
|
|
204
|
-
return decodeToolEvent(event);
|
|
205
|
-
default:
|
|
206
|
-
return type;
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
export function decodeAgentEvent(value) {
|
|
210
|
-
const event = object(value);
|
|
211
|
-
if (event === null || !eventType(event.type))
|
|
212
|
-
throw new Error("Akuma activity has an invalid event shape");
|
|
213
|
-
const decoded = decodeTypedEvent(event.type, event);
|
|
214
|
-
if (decoded === null)
|
|
215
|
-
throw new Error("Akuma activity has an invalid event shape");
|
|
216
|
-
return decoded;
|
|
217
|
-
}
|
|
6
|
+
export { agentEventSchema, decodeAgentEvent } from "./heart/activity-schema.js";
|
|
218
7
|
function boundedToolCall(call) {
|
|
219
8
|
switch (call.kind) {
|
|
220
9
|
case "run":
|
|
@@ -284,13 +73,16 @@ function boundedToolResult(result) {
|
|
|
284
73
|
};
|
|
285
74
|
}
|
|
286
75
|
export function encodeAgentEvent(event) {
|
|
287
|
-
const marked = (value, changed) => ({
|
|
288
|
-
...value,
|
|
289
|
-
...(changed || ("truncated" in event && event.truncated === true) ? { truncated: true } : {}),
|
|
290
|
-
});
|
|
76
|
+
const marked = (value, changed) => changed || ("truncated" in event && event.truncated === true) ? { ...value, truncated: true } : value;
|
|
291
77
|
switch (event.type) {
|
|
292
|
-
case "session":
|
|
293
|
-
|
|
78
|
+
case "session": {
|
|
79
|
+
const coordinate = "sessionFile" in event.coordinate
|
|
80
|
+
? event.coordinate.sessionId === undefined
|
|
81
|
+
? { sessionFile: event.coordinate.sessionFile }
|
|
82
|
+
: { sessionFile: event.coordinate.sessionFile, sessionId: event.coordinate.sessionId }
|
|
83
|
+
: { sessionId: event.coordinate.sessionId };
|
|
84
|
+
return { type: event.type, coordinate };
|
|
85
|
+
}
|
|
294
86
|
case "assistant":
|
|
295
87
|
return marked({ type: event.type, text: boundedEventText(event.text) }, event.text.length > AGENT_EVENT_TEXT_LIMIT);
|
|
296
88
|
case "thought":
|
|
@@ -7,12 +7,32 @@ function argumentName(value, key) {
|
|
|
7
7
|
}
|
|
8
8
|
return selected;
|
|
9
9
|
}
|
|
10
|
+
function validateSelectorMappings(config) {
|
|
11
|
+
if (config.modelArg !== undefined && config.modelConfigId !== undefined) {
|
|
12
|
+
throw new TypeError("ACP provider config cannot map model to both an argument and a session option");
|
|
13
|
+
}
|
|
14
|
+
if (config.effortArg !== undefined && config.effortConfigId !== undefined) {
|
|
15
|
+
throw new TypeError("ACP provider config cannot map effort to both an argument and a session option");
|
|
16
|
+
}
|
|
17
|
+
if (config.modelConfigId !== undefined && config.modelConfigId === config.effortConfigId) {
|
|
18
|
+
throw new TypeError("ACP provider config model and effort must use different session options");
|
|
19
|
+
}
|
|
20
|
+
}
|
|
10
21
|
export function decodeAcpConfig(value) {
|
|
11
22
|
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
12
23
|
throw new TypeError("ACP provider config must be an object");
|
|
13
24
|
}
|
|
14
25
|
const config = value;
|
|
15
|
-
const unknown = Object.keys(config).find((key) => ![
|
|
26
|
+
const unknown = Object.keys(config).find((key) => ![
|
|
27
|
+
"argvBefore",
|
|
28
|
+
"argvAfter",
|
|
29
|
+
"effortArg",
|
|
30
|
+
"modelArg",
|
|
31
|
+
"modelConfigId",
|
|
32
|
+
"effortConfigId",
|
|
33
|
+
"systemPromptArg",
|
|
34
|
+
"systemPromptMode",
|
|
35
|
+
].includes(key));
|
|
16
36
|
if (unknown !== undefined)
|
|
17
37
|
throw new TypeError(`ACP provider config has unknown field ${unknown}`);
|
|
18
38
|
if (!Array.isArray(config.argvBefore) ||
|
|
@@ -25,6 +45,9 @@ export function decodeAcpConfig(value) {
|
|
|
25
45
|
}
|
|
26
46
|
const modelArg = argumentName(config, "modelArg");
|
|
27
47
|
const effortArg = argumentName(config, "effortArg");
|
|
48
|
+
const modelConfigId = argumentName(config, "modelConfigId");
|
|
49
|
+
const effortConfigId = argumentName(config, "effortConfigId");
|
|
50
|
+
validateSelectorMappings({ modelArg, effortArg, modelConfigId, effortConfigId });
|
|
28
51
|
const systemPromptArg = argumentName(config, "systemPromptArg");
|
|
29
52
|
const systemPromptMode = config.systemPromptMode;
|
|
30
53
|
if (systemPromptMode !== undefined && systemPromptMode !== "append" && systemPromptMode !== "replace") {
|
|
@@ -38,6 +61,8 @@ export function decodeAcpConfig(value) {
|
|
|
38
61
|
argvAfter: Object.freeze([...config.argvAfter]),
|
|
39
62
|
...(modelArg === undefined ? {} : { modelArg }),
|
|
40
63
|
...(effortArg === undefined ? {} : { effortArg }),
|
|
64
|
+
...(modelConfigId === undefined ? {} : { modelConfigId }),
|
|
65
|
+
...(effortConfigId === undefined ? {} : { effortConfigId }),
|
|
41
66
|
...(systemPromptArg === undefined ? {} : { systemPromptArg }),
|
|
42
67
|
...(systemPromptMode === undefined ? {} : { systemPromptMode }),
|
|
43
68
|
});
|
|
@@ -10,6 +10,8 @@ export type AcpDependencies = Readonly<{
|
|
|
10
10
|
interpretTool?: AcpToolInterpreter;
|
|
11
11
|
freshSessionMeta?: AcpSessionMeta;
|
|
12
12
|
loadSessionMeta?: AcpSessionMeta;
|
|
13
|
+
configureClient?: (client: AcpSdk.ClientApp) => void;
|
|
14
|
+
onTerminal?: () => void;
|
|
13
15
|
}>;
|
|
14
16
|
export type AcpLiveSession = Readonly<{
|
|
15
17
|
session: Session;
|
|
@@ -20,5 +22,10 @@ export type AcpLiveSession = Readonly<{
|
|
|
20
22
|
type AcpLaunch = Readonly<{
|
|
21
23
|
argv: readonly [string, ...string[]];
|
|
22
24
|
env?: Readonly<Record<string, string>>;
|
|
25
|
+
sessionOptions?: readonly Readonly<{
|
|
26
|
+
field: "model" | "effort";
|
|
27
|
+
id: string;
|
|
28
|
+
value: string;
|
|
29
|
+
}>[];
|
|
23
30
|
}>;
|
|
24
31
|
export declare function startAcpSession(launch: AcpLaunch, input: AcpStartInput, dependencies?: AcpDependencies, custody?: AttemptCustody): Promise<AcpLiveSession>;
|
|
@@ -18,10 +18,12 @@ function diagnostic(acp, error) {
|
|
|
18
18
|
}
|
|
19
19
|
return data.length === 0 ? `${error.message} [${error.code}]` : `${error.message} [${error.code}]: ${data}`;
|
|
20
20
|
}
|
|
21
|
-
function createAcpClient(acp, onUpdate) {
|
|
22
|
-
|
|
21
|
+
function createAcpClient(acp, onUpdate, configure) {
|
|
22
|
+
const client = acp
|
|
23
23
|
.client({ name: "keiyaku" })
|
|
24
24
|
.onNotification(acp.methods.client.session.update, ({ params }) => onUpdate(params));
|
|
25
|
+
configure?.(client);
|
|
26
|
+
return client;
|
|
25
27
|
}
|
|
26
28
|
function promptResult(response) {
|
|
27
29
|
if (response.stopReason === "end_turn" ||
|
|
@@ -34,7 +36,7 @@ function promptResult(response) {
|
|
|
34
36
|
function requestMeta(meta) {
|
|
35
37
|
return meta === undefined || Object.keys(meta).length === 0 ? {} : { _meta: meta };
|
|
36
38
|
}
|
|
37
|
-
async function establishSession(acp, agent, input, dependencies) {
|
|
39
|
+
async function establishSession(acp, agent, input, dependencies, selections) {
|
|
38
40
|
const initialized = await agent.request(acp.methods.agent.initialize, {
|
|
39
41
|
protocolVersion: acp.PROTOCOL_VERSION,
|
|
40
42
|
clientInfo: { name: "keiyaku", version: "4" },
|
|
@@ -42,25 +44,53 @@ async function establishSession(acp, agent, input, dependencies) {
|
|
|
42
44
|
if (input.session.kind === "resume" && initialized.agentCapabilities?.loadSession !== true) {
|
|
43
45
|
throw new Error("ACP agent does not advertise session/load");
|
|
44
46
|
}
|
|
47
|
+
let sessionId;
|
|
48
|
+
let configOptions;
|
|
45
49
|
if (input.session.kind === "fresh") {
|
|
46
|
-
|
|
50
|
+
const created = await agent.request(acp.methods.agent.session.new, {
|
|
47
51
|
cwd: input.cwd,
|
|
48
52
|
mcpServers: [],
|
|
49
53
|
...requestMeta(dependencies.freshSessionMeta),
|
|
50
|
-
})
|
|
54
|
+
});
|
|
55
|
+
sessionId = created.sessionId;
|
|
56
|
+
configOptions = created.configOptions;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
const coordinate = input.session.coordinate.sessionId;
|
|
60
|
+
if (coordinate === undefined)
|
|
61
|
+
throw new Error("ACP resume coordinate has no session id");
|
|
62
|
+
sessionId = coordinate;
|
|
63
|
+
const loaded = await agent.request(acp.methods.agent.session.load, {
|
|
64
|
+
cwd: input.cwd,
|
|
65
|
+
mcpServers: [],
|
|
66
|
+
sessionId,
|
|
67
|
+
...requestMeta(dependencies.loadSessionMeta),
|
|
68
|
+
});
|
|
69
|
+
configOptions = loaded.configOptions;
|
|
70
|
+
}
|
|
71
|
+
for (const selection of selections) {
|
|
72
|
+
const selected = configOptions?.find((option) => option.id === selection.id);
|
|
73
|
+
if (selected?.type !== "select")
|
|
74
|
+
throw new Error(`ACP ${selection.field} option '${selection.id}' is unavailable`);
|
|
75
|
+
const choices = selected.options.flatMap((option) => ("options" in option ? option.options : [option]));
|
|
76
|
+
if (selected.currentValue === selection.value)
|
|
77
|
+
continue;
|
|
78
|
+
if (!choices.some((option) => option.value === selection.value)) {
|
|
79
|
+
throw new Error(`ACP ${selection.field} value '${selection.value}' is unavailable`);
|
|
80
|
+
}
|
|
81
|
+
const updated = await agent.request(acp.methods.agent.session.setConfigOption, {
|
|
82
|
+
sessionId,
|
|
83
|
+
configId: selection.id,
|
|
84
|
+
value: selection.value,
|
|
85
|
+
});
|
|
86
|
+
configOptions = updated.configOptions;
|
|
87
|
+
if (configOptions.find((option) => option.id === selection.id)?.currentValue !== selection.value) {
|
|
88
|
+
throw new Error(`ACP ${selection.field} option '${selection.id}' did not select '${selection.value}'`);
|
|
89
|
+
}
|
|
51
90
|
}
|
|
52
|
-
const sessionId = input.session.coordinate.sessionId;
|
|
53
|
-
if (sessionId === undefined)
|
|
54
|
-
throw new Error("ACP resume coordinate has no session id");
|
|
55
|
-
await agent.request(acp.methods.agent.session.load, {
|
|
56
|
-
cwd: input.cwd,
|
|
57
|
-
mcpServers: [],
|
|
58
|
-
sessionId,
|
|
59
|
-
...requestMeta(dependencies.loadSessionMeta),
|
|
60
|
-
});
|
|
61
91
|
return sessionId;
|
|
62
92
|
}
|
|
63
|
-
function createAcpTurn(acp, connection, interpret) {
|
|
93
|
+
function createAcpTurn(acp, connection, interpret, onTerminal) {
|
|
64
94
|
const events = new AgentEventChannel();
|
|
65
95
|
let state = EMPTY_ACP_EVENT_STATE;
|
|
66
96
|
let terminal = false;
|
|
@@ -80,6 +110,7 @@ function createAcpTurn(acp, connection, interpret) {
|
|
|
80
110
|
if (terminal)
|
|
81
111
|
return;
|
|
82
112
|
terminal = true;
|
|
113
|
+
onTerminal?.();
|
|
83
114
|
let completionResult = result;
|
|
84
115
|
const failCleanup = (error) => {
|
|
85
116
|
completionResult = { kind: "failed", diagnostic: `ACP cleanup failed: ${diagnostic(acp, error)}` };
|
|
@@ -169,10 +200,10 @@ export async function startAcpSession(launch, input, dependencies = {}, custody)
|
|
|
169
200
|
const connection = createAcpClient(acp, (notification) => {
|
|
170
201
|
if (notification.sessionId === sessionId)
|
|
171
202
|
turn.update(notification.update);
|
|
172
|
-
}).connect(acp.ndJsonStream(Writable.toWeb(child.input), Readable.toWeb(child.output)));
|
|
173
|
-
turn = createAcpTurn(acp, connection, dependencies.interpretTool);
|
|
203
|
+
}, dependencies.configureClient).connect(acp.ndJsonStream(Writable.toWeb(child.input), Readable.toWeb(child.output)));
|
|
204
|
+
turn = createAcpTurn(acp, connection, dependencies.interpretTool, dependencies.onTerminal);
|
|
174
205
|
try {
|
|
175
|
-
sessionId = await abortable(establishSession(acp, connection.agent, input, dependencies), signal);
|
|
206
|
+
sessionId = await abortable(establishSession(acp, connection.agent, input, dependencies, launch.sessionOptions ?? []), signal);
|
|
176
207
|
turn.events.emit({ type: "session", coordinate: { sessionId } });
|
|
177
208
|
const session = beginAcpPrompt({ acp, agent: connection.agent }, child, turn, sessionId, input);
|
|
178
209
|
return { session, agent: connection.agent, sessionId, open: turn.open };
|
|
@@ -6,11 +6,11 @@ function optionAdmission(options, config) {
|
|
|
6
6
|
if (options.network !== undefined) {
|
|
7
7
|
return { kind: "refused", diagnostic: "ACP provider does not support the network option" };
|
|
8
8
|
}
|
|
9
|
-
if (options.model !== undefined && config.modelArg === undefined) {
|
|
10
|
-
return { kind: "refused", diagnostic: "ACP provider has no model
|
|
9
|
+
if (options.model !== undefined && config.modelArg === undefined && config.modelConfigId === undefined) {
|
|
10
|
+
return { kind: "refused", diagnostic: "ACP provider has no model mapping" };
|
|
11
11
|
}
|
|
12
|
-
if (options.effort !== undefined && config.effortArg === undefined) {
|
|
13
|
-
return { kind: "refused", diagnostic: "ACP provider has no effort
|
|
12
|
+
if (options.effort !== undefined && config.effortArg === undefined && config.effortConfigId === undefined) {
|
|
13
|
+
return { kind: "refused", diagnostic: "ACP provider has no effort mapping" };
|
|
14
14
|
}
|
|
15
15
|
if (options.systemPrompt !== undefined && options.systemPrompt.length > 0) {
|
|
16
16
|
if (config.systemPromptArg === undefined) {
|
|
@@ -32,9 +32,9 @@ function argv(execution, config, options) {
|
|
|
32
32
|
if (execution.executable === undefined)
|
|
33
33
|
throw new Error("ACP provider execution requires executable");
|
|
34
34
|
const values = [execution.executable, ...config.argvBefore];
|
|
35
|
-
if (options.model !== undefined)
|
|
35
|
+
if (options.model !== undefined && config.modelArg !== undefined)
|
|
36
36
|
values.push(config.modelArg, options.model);
|
|
37
|
-
if (options.effort !== undefined)
|
|
37
|
+
if (options.effort !== undefined && config.effortArg !== undefined)
|
|
38
38
|
values.push(config.effortArg, options.effort);
|
|
39
39
|
if (options.systemPrompt !== undefined && config.systemPromptArg !== undefined) {
|
|
40
40
|
values.push(config.systemPromptArg, options.systemPrompt);
|
|
@@ -50,6 +50,14 @@ export function createAcpProvider(execution, dependencies = {}) {
|
|
|
50
50
|
const launch = {
|
|
51
51
|
argv: argv(execution, config, input.options),
|
|
52
52
|
...(execution.env === undefined ? {} : { env: execution.env }),
|
|
53
|
+
sessionOptions: [
|
|
54
|
+
...(input.options.model === undefined || config.modelConfigId === undefined
|
|
55
|
+
? []
|
|
56
|
+
: [{ field: "model", id: config.modelConfigId, value: input.options.model }]),
|
|
57
|
+
...(input.options.effort === undefined || config.effortConfigId === undefined
|
|
58
|
+
? []
|
|
59
|
+
: [{ field: "effort", id: config.effortConfigId, value: input.options.effort }]),
|
|
60
|
+
],
|
|
53
61
|
};
|
|
54
62
|
return (await startAcpSession(launch, input, dependencies, custody)).session;
|
|
55
63
|
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createProviderAttempt } from "../../provider.js";
|
|
2
2
|
import { startAcpSession, } from "../acp/core.js";
|
|
3
|
-
const INTERJECT_METHOD = "
|
|
3
|
+
const INTERJECT_METHOD = "_x.ai/interject";
|
|
4
|
+
const INTERJECTION_METHOD = "_x.ai/session/interjection";
|
|
4
5
|
function nonblank(value) {
|
|
5
6
|
return typeof value === "string" && value.trim().length > 0 ? value : undefined;
|
|
6
7
|
}
|
|
@@ -108,23 +109,34 @@ function argv(execution, options) {
|
|
|
108
109
|
values.push("stdio");
|
|
109
110
|
return values;
|
|
110
111
|
}
|
|
111
|
-
function withInterject(live) {
|
|
112
|
+
function withInterject(live, pending) {
|
|
112
113
|
return {
|
|
113
114
|
...live.session,
|
|
114
|
-
tell:
|
|
115
|
+
tell: (tell) => {
|
|
115
116
|
if (!live.open())
|
|
116
|
-
return { kind: "turn-ended" };
|
|
117
|
-
const
|
|
117
|
+
return Promise.resolve({ kind: "turn-ended" });
|
|
118
|
+
const existing = pending.get(tell.id);
|
|
119
|
+
if (existing !== undefined)
|
|
120
|
+
throw new Error("Grok Build duplicate pending interjection id");
|
|
121
|
+
const receipt = new Promise((resolve, reject) => {
|
|
122
|
+
pending.set(tell.id, { resolve, reject });
|
|
123
|
+
});
|
|
124
|
+
void live.agent
|
|
125
|
+
.request(INTERJECT_METHOD, {
|
|
118
126
|
sessionId: live.sessionId,
|
|
119
127
|
text: tell.text,
|
|
120
128
|
interjectionId: tell.id,
|
|
129
|
+
})
|
|
130
|
+
.then((response) => {
|
|
131
|
+
if (response?.status !== "queued" && pending.has(tell.id)) {
|
|
132
|
+
pending.get(tell.id)?.reject(new Error("Grok Build interject did not return queued"));
|
|
133
|
+
pending.delete(tell.id);
|
|
134
|
+
}
|
|
135
|
+
}, (error) => {
|
|
136
|
+
pending.get(tell.id)?.reject(error);
|
|
137
|
+
pending.delete(tell.id);
|
|
121
138
|
});
|
|
122
|
-
|
|
123
|
-
return { kind: "turn-ended" };
|
|
124
|
-
if (response === null || typeof response !== "object" || response.status !== "queued") {
|
|
125
|
-
throw new Error("Grok Build interject did not return queued");
|
|
126
|
-
}
|
|
127
|
-
return { kind: "accepted", fence: tell.id };
|
|
139
|
+
return receipt;
|
|
128
140
|
},
|
|
129
141
|
};
|
|
130
142
|
}
|
|
@@ -132,17 +144,36 @@ export function createGrokBuildProvider(execution, dependencies = {}) {
|
|
|
132
144
|
if (execution.executable === undefined)
|
|
133
145
|
throw new TypeError("Grok Build provider execution requires executable");
|
|
134
146
|
const drive = async (input, custody) => {
|
|
147
|
+
const pending = new Map();
|
|
148
|
+
let live;
|
|
135
149
|
const launch = {
|
|
136
150
|
argv: argv(execution, input.options),
|
|
137
151
|
...(execution.env === undefined ? {} : { env: execution.env }),
|
|
138
152
|
};
|
|
139
153
|
const sessionMeta = grokSessionMeta(execution.config, input.options);
|
|
140
|
-
|
|
154
|
+
live = await startAcpSession(launch, input, {
|
|
141
155
|
...dependencies,
|
|
156
|
+
configureClient: (client) => {
|
|
157
|
+
client.onNotification(INTERJECTION_METHOD, (value) => value, ({ params }) => {
|
|
158
|
+
if (params.sessionId !== live?.sessionId)
|
|
159
|
+
return;
|
|
160
|
+
const waiter = pending.get(params.interjectionId);
|
|
161
|
+
if (waiter === undefined)
|
|
162
|
+
return;
|
|
163
|
+
pending.delete(params.interjectionId);
|
|
164
|
+
waiter.resolve({ kind: "accepted", fence: params.interjectionId });
|
|
165
|
+
});
|
|
166
|
+
},
|
|
167
|
+
onTerminal: () => {
|
|
168
|
+
for (const waiter of pending.values())
|
|
169
|
+
waiter.resolve({ kind: "turn-ended" });
|
|
170
|
+
pending.clear();
|
|
171
|
+
},
|
|
142
172
|
interpretTool: interpretGrokTool,
|
|
143
173
|
freshSessionMeta: { ...(dependencies.freshSessionMeta ?? {}), ...(sessionMeta.freshSessionMeta ?? {}) },
|
|
144
174
|
loadSessionMeta: { ...(dependencies.loadSessionMeta ?? {}), ...(sessionMeta.loadSessionMeta ?? {}) },
|
|
145
|
-
}, custody)
|
|
175
|
+
}, custody);
|
|
176
|
+
return withInterject(live, pending);
|
|
146
177
|
};
|
|
147
178
|
return {
|
|
148
179
|
admitOptions: optionAdmission,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ProviderAdapter } from "../provider.js";
|
|
2
|
-
import {
|
|
3
|
-
export
|
|
4
|
-
export declare function resolveProviderExecution(
|
|
2
|
+
import type { ProviderExecution } from "../provider-recipe.js";
|
|
3
|
+
export { decodeProviderRecipe as decodeProviderExecution } from "../provider-recipe.js";
|
|
4
|
+
export declare function resolveProviderExecution(execution: ProviderExecution): Promise<Readonly<{
|
|
5
5
|
execution: ProviderExecution;
|
|
6
6
|
adapter: ProviderAdapter;
|
|
7
7
|
}>>;
|
|
@@ -1,14 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
export function decodeProviderExecution(input) {
|
|
3
|
-
const decoded = decodeProviderRecipe(input);
|
|
4
|
-
return Object.freeze({
|
|
5
|
-
name: decoded.name,
|
|
6
|
-
kind: decoded.kind,
|
|
7
|
-
...(decoded.executable === undefined ? {} : { executable: decoded.executable }),
|
|
8
|
-
...(decoded.config === undefined ? {} : { config: decoded.config }),
|
|
9
|
-
...(decoded.env === undefined ? {} : { env: decoded.env }),
|
|
10
|
-
});
|
|
11
|
-
}
|
|
1
|
+
export { decodeProviderRecipe as decodeProviderExecution } from "../provider-recipe.js";
|
|
12
2
|
async function adapterFor(execution) {
|
|
13
3
|
if (execution.kind === "acp")
|
|
14
4
|
return (await import("./acp/index.js")).createAcpProvider(execution);
|
|
@@ -28,7 +18,6 @@ async function adapterFor(execution) {
|
|
|
28
18
|
return (await import("./pi/index.js")).createPiProvider(execution);
|
|
29
19
|
throw new TypeError(`unknown Akuma provider kind ${execution.kind}`);
|
|
30
20
|
}
|
|
31
|
-
export async function resolveProviderExecution(
|
|
32
|
-
const execution = decodeProviderExecution(input);
|
|
21
|
+
export async function resolveProviderExecution(execution) {
|
|
33
22
|
return Object.freeze({ execution, adapter: await adapterFor(execution) });
|
|
34
23
|
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { AttemptCustody } from "../../provider.js";
|
|
2
|
+
import type { OpencodeEventSubscriptionRequest } from "./session.js";
|
|
3
|
+
/**
|
|
4
|
+
* One adapter-private owner for every resource an OpenCode event subscription
|
|
5
|
+
* creates: the native subscription, its fetch and reader, the pending read, and
|
|
6
|
+
* the SDK's retry waiting. `closed` resolves only after those resources really
|
|
7
|
+
* retired; a teardown rejection escapes through it, and an unprovable
|
|
8
|
+
* retirement leaves it pending so existing custody reports the attempt hung.
|
|
9
|
+
*/
|
|
10
|
+
export type OwnedEventStream = Readonly<{
|
|
11
|
+
/** Subscription barrier: resolves once the native subscription exists, rejects on setup failure. */
|
|
12
|
+
ready: Promise<void>;
|
|
13
|
+
/** Reads the next native event. A pending read is interrupted by `retire`. */
|
|
14
|
+
next(): Promise<IteratorResult<unknown>>;
|
|
15
|
+
/** Aborts the owned signal, settles any pending read, then awaits real iterator retirement. */
|
|
16
|
+
retire(): Promise<void>;
|
|
17
|
+
/** Resolves only when subscription, reader, and retry waiting actually ended. */
|
|
18
|
+
closed: Promise<void>;
|
|
19
|
+
}>;
|
|
20
|
+
export declare function ownEventStream(input: Readonly<{
|
|
21
|
+
directory: string;
|
|
22
|
+
/** The session/attempt notification signal this owner's controller follows. */
|
|
23
|
+
signal: AbortSignal;
|
|
24
|
+
subscribe(request: OpencodeEventSubscriptionRequest): Promise<Readonly<{
|
|
25
|
+
stream: AsyncIterable<unknown>;
|
|
26
|
+
}>>;
|
|
27
|
+
custody?: AttemptCustody;
|
|
28
|
+
}>): OwnedEventStream;
|