mirror of
https://github.com/openai/codex.git
synced 2026-04-25 07:05:38 +00:00
start of hooks engine (#13276)
(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)
This commit is contained in:
@@ -2818,6 +2818,58 @@
|
||||
"title": "ItemCompletedEventMsg",
|
||||
"type": "object"
|
||||
},
|
||||
{
|
||||
"properties": {
|
||||
"run": {
|
||||
"$ref": "#/definitions/HookRunSummary"
|
||||
},
|
||||
"turn_id": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"type": {
|
||||
"enum": [
|
||||
"hook_started"
|
||||
],
|
||||
"title": "HookStartedEventMsgType",
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"run",
|
||||
"type"
|
||||
],
|
||||
"title": "HookStartedEventMsg",
|
||||
"type": "object"
|
||||
},
|
||||
{
|
||||
"properties": {
|
||||
"run": {
|
||||
"$ref": "#/definitions/HookRunSummary"
|
||||
},
|
||||
"turn_id": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"type": {
|
||||
"enum": [
|
||||
"hook_completed"
|
||||
],
|
||||
"title": "HookCompletedEventMsgType",
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"run",
|
||||
"type"
|
||||
],
|
||||
"title": "HookCompletedEventMsg",
|
||||
"type": "object"
|
||||
},
|
||||
{
|
||||
"properties": {
|
||||
"delta": {
|
||||
@@ -3756,6 +3808,142 @@
|
||||
],
|
||||
"type": "object"
|
||||
},
|
||||
"HookEventName": {
|
||||
"enum": [
|
||||
"session_start",
|
||||
"stop"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
"HookExecutionMode": {
|
||||
"enum": [
|
||||
"sync",
|
||||
"async"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
"HookHandlerType": {
|
||||
"enum": [
|
||||
"command",
|
||||
"prompt",
|
||||
"agent"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
"HookOutputEntry": {
|
||||
"properties": {
|
||||
"kind": {
|
||||
"$ref": "#/definitions/HookOutputEntryKind"
|
||||
},
|
||||
"text": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"kind",
|
||||
"text"
|
||||
],
|
||||
"type": "object"
|
||||
},
|
||||
"HookOutputEntryKind": {
|
||||
"enum": [
|
||||
"warning",
|
||||
"stop",
|
||||
"feedback",
|
||||
"context",
|
||||
"error"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
"HookRunStatus": {
|
||||
"enum": [
|
||||
"running",
|
||||
"completed",
|
||||
"failed",
|
||||
"blocked",
|
||||
"stopped"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
"HookRunSummary": {
|
||||
"properties": {
|
||||
"completed_at": {
|
||||
"format": "int64",
|
||||
"type": [
|
||||
"integer",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"display_order": {
|
||||
"format": "int64",
|
||||
"type": "integer"
|
||||
},
|
||||
"duration_ms": {
|
||||
"format": "int64",
|
||||
"type": [
|
||||
"integer",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"entries": {
|
||||
"items": {
|
||||
"$ref": "#/definitions/HookOutputEntry"
|
||||
},
|
||||
"type": "array"
|
||||
},
|
||||
"event_name": {
|
||||
"$ref": "#/definitions/HookEventName"
|
||||
},
|
||||
"execution_mode": {
|
||||
"$ref": "#/definitions/HookExecutionMode"
|
||||
},
|
||||
"handler_type": {
|
||||
"$ref": "#/definitions/HookHandlerType"
|
||||
},
|
||||
"id": {
|
||||
"type": "string"
|
||||
},
|
||||
"scope": {
|
||||
"$ref": "#/definitions/HookScope"
|
||||
},
|
||||
"source_path": {
|
||||
"type": "string"
|
||||
},
|
||||
"started_at": {
|
||||
"format": "int64",
|
||||
"type": "integer"
|
||||
},
|
||||
"status": {
|
||||
"$ref": "#/definitions/HookRunStatus"
|
||||
},
|
||||
"status_message": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"display_order",
|
||||
"entries",
|
||||
"event_name",
|
||||
"execution_mode",
|
||||
"handler_type",
|
||||
"id",
|
||||
"scope",
|
||||
"source_path",
|
||||
"started_at",
|
||||
"status"
|
||||
],
|
||||
"type": "object"
|
||||
},
|
||||
"HookScope": {
|
||||
"enum": [
|
||||
"thread",
|
||||
"turn"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
"ImageDetail": {
|
||||
"enum": [
|
||||
"auto",
|
||||
@@ -8693,6 +8881,58 @@
|
||||
"title": "ItemCompletedEventMsg",
|
||||
"type": "object"
|
||||
},
|
||||
{
|
||||
"properties": {
|
||||
"run": {
|
||||
"$ref": "#/definitions/HookRunSummary"
|
||||
},
|
||||
"turn_id": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"type": {
|
||||
"enum": [
|
||||
"hook_started"
|
||||
],
|
||||
"title": "HookStartedEventMsgType",
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"run",
|
||||
"type"
|
||||
],
|
||||
"title": "HookStartedEventMsg",
|
||||
"type": "object"
|
||||
},
|
||||
{
|
||||
"properties": {
|
||||
"run": {
|
||||
"$ref": "#/definitions/HookRunSummary"
|
||||
},
|
||||
"turn_id": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"type": {
|
||||
"enum": [
|
||||
"hook_completed"
|
||||
],
|
||||
"title": "HookCompletedEventMsgType",
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"run",
|
||||
"type"
|
||||
],
|
||||
"title": "HookCompletedEventMsg",
|
||||
"type": "object"
|
||||
},
|
||||
{
|
||||
"properties": {
|
||||
"delta": {
|
||||
|
||||
Reference in New Issue
Block a user