(Experimental) This PR adds a first MVP for hooks, with SessionStart and Stop The core design is: - hooks live in a dedicated engine under codex-rs/hooks - each hook type has its own event-specific file - hook execution is synchronous and blocks normal turn progression while running - matching hooks run in parallel, then their results are aggregated into a normalized HookRunSummary On the AppServer side, hooks are exposed as operational metadata rather than transcript-native items: - new live notifications: hook/started, hook/completed - persisted/replayed hook results live on Turn.hookRuns - we intentionally did not add hook-specific ThreadItem variants Hooks messages are not persisted, they remain ephemeral. The context changes they add are (they get appended to the user's prompt)
44 lines
No EOL
800 B
JSON
44 lines
No EOL
800 B
JSON
{
|
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
"additionalProperties": false,
|
|
"definitions": {
|
|
"StopDecisionWire": {
|
|
"enum": [
|
|
"block"
|
|
],
|
|
"type": "string"
|
|
}
|
|
},
|
|
"properties": {
|
|
"continue": {
|
|
"default": true,
|
|
"type": "boolean"
|
|
},
|
|
"decision": {
|
|
"allOf": [
|
|
{
|
|
"$ref": "#/definitions/StopDecisionWire"
|
|
}
|
|
],
|
|
"default": null
|
|
},
|
|
"reason": {
|
|
"default": null,
|
|
"type": "string"
|
|
},
|
|
"stopReason": {
|
|
"default": null,
|
|
"type": "string"
|
|
},
|
|
"suppressOutput": {
|
|
"default": false,
|
|
"type": "boolean"
|
|
},
|
|
"systemMessage": {
|
|
"default": null,
|
|
"type": "string"
|
|
}
|
|
},
|
|
"title": "stop.command.output",
|
|
"type": "object"
|
|
} |