feat(hooks): implement async hook execution + asyncRewake delivery#60
Merged
Conversation
Async hooks (async:true) fork into a background fiber scoped to the SettingsHook service layer; their output never participates in the current TriggerResult. asyncRewake:true delivers rewake-worthy output (exit 2 stderr, systemMessage, decision:block, additionalContext) back to the agent via the HookRewake bridge service driving the V1 SessionPrompt loop. - src/hook/rewake.ts: tag-only leaf service (no import cycle) - src/hook/rewake-live.ts: live impl via SessionPrompt.prompt, wired in AppLayer + httpapi server node graph (dual composition system) - settings.ts: async fork branch in trigger entry loop, onAsyncComplete rewake callback, HOOK_REWAKE_SENTINEL + buildRewakePrompt - prompt.ts: loop guard skips UserPromptSubmit hooks for sentinel-prefixed prompts (prevents hook -> rewake -> hook loops) - 9 integration tests (async non-blocking, output isolation, rewake e2e, suppression, once-at-fork, sentinel validation)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Implements
async/asyncRewakehook execution — the last schema-placeholder fields in the hook system.What changes
async: truehooks fork into a background fiber; output never gates the currentTriggerResultasyncRewake: truedelivers rewake-worthy output (exit 2 stderr,systemMessage,decision:block,additionalContext) back to the agent via aHookRewakebridge service driving the V1SessionPromptloopSessionEnd/ missing sessionID suppresses rewakeArchitecture
src/hook/rewake.ts— tag-only leaf service (no import cycle)src/hook/rewake-live.ts— live impl viaSessionPrompt.prompt, wired in both AppLayer and httpapi server node graph (dual composition system — missing the server graph was a blocking review finding)settings.ts— async fork branch +onAsyncCompleterewake callbackprompt.ts—UserPromptSubmitloop guardTest plan
bun typecheckclean (all 35 packages)