diff --git a/integrations/catalog.json b/integrations/catalog.json index 00c0c19..42f9fc3 100644 --- a/integrations/catalog.json +++ b/integrations/catalog.json @@ -1,7 +1,7 @@ { "$schema": "./catalog.schema.json", "schema_version": 1, - "verified_on": "2026-07-19", + "verified_on": "2026-07-21", "providers": [ { "id": "augment", @@ -297,10 +297,7 @@ "event_fields": { "name": "toolName", "input": "toolInput", - "session": "sessionId", - "call_id": "toolUseId", - "output": "toolResult", - "error": "toolResult" + "session": "sessionId" }, "blocking": { "mechanism": "exit_code_2", "failure_mode": "fail_open" }, "adapters": { "node": true, "python": true, "go": true }, @@ -424,11 +421,15 @@ ".letta/settings.json", ".letta/settings.local.json" ], - "events": { "before_tool": "PreToolUse", "after_tool": "PostToolUse" }, + "events": { + "before_tool": "PreToolUse", + "after_tool": "PostToolUse", + "after_tool_failure": "PostToolUseFailure" + }, "blocking": { "mechanism": "exit_code_2", "failure_mode": "fail_open" }, "adapters": { "node": true, "python": true, "go": true }, "delivery_state": "available", - "source_url": "https://docs.letta.com/letta-agent/hooks" + "source_url": "https://docs.letta.com/reference/deprecated/hooks" }, { "id": "opencode", diff --git a/sdks/python/README.md b/sdks/python/README.md index 26709cb..bccc659 100644 --- a/sdks/python/README.md +++ b/sdks/python/README.md @@ -102,7 +102,7 @@ Qwen Code 0.20.0 installation writes exact, named `PreToolUse`, `PostToolUse`, a Kiro CLI installation covers both runtime contracts. Kiro CLI v2 uses the generated custom agent through `kiro-cli --agent elydora-audit`. Kiro CLI v3 loads the global standalone hooks when started with `kiro-cli --v3`. -Letta Code 0.28.13 installation writes exact `PreToolUse`, `PostToolUse`, and `PostToolUseFailure` groups to `${HOME:-~}/.letta/settings.json`, following the [official hook source and event contract](https://docs.letta.com/letta-agent/hooks). Elydora runtime files stay under the shared CLI root resolved by `os.path.expanduser("~")`, so Windows `HOME` overrides affect Letta settings while `USERPROFILE` retains Elydora runtime ownership. Workspace `.letta/settings.json` and `.letta/settings.local.json` remain read-only and participate in effective `hooks.disabled` evaluation. An explicit global `false` enables hooks; global `true`, project `true`, and project-local `true` disable them according to Letta's precedence. Managed command handlers use ten-second millisecond timeouts, the current absolute Python executable, PowerShell exit-code propagation on Windows, and complete native snake_case payloads. Frozen and revoked state propagates through exit code `2`; audit delivery failures remain visible through stderr, owner-only `error.log`, and exit code `1`, while Letta post events remain nonblocking. Global settings, generated runtimes, runtime config, and private key commit through one rollback-capable transaction guarded by snapshots of all three settings sources. Status requires an effective enabled state, exact hook and executable identity, physical files, canonical private keys, and matching runtime identity. Run `/hooks` and restart active Letta Code sessions after installation. +Letta Code 0.28.13 installation writes exact `PreToolUse`, `PostToolUse`, and `PostToolUseFailure` groups to `${HOME:-~}/.letta/settings.json`, following the [official hook source and event contract](https://docs.letta.com/reference/deprecated/hooks). Elydora runtime files stay under the shared CLI root resolved by `os.path.expanduser("~")`, so Windows `HOME` overrides affect Letta settings while `USERPROFILE` retains Elydora runtime ownership. Workspace `.letta/settings.json` and `.letta/settings.local.json` remain read-only and participate in effective `hooks.disabled` evaluation. An explicit global `false` enables hooks; global `true`, project `true`, and project-local `true` disable them according to Letta's precedence. Managed command handlers use ten-second millisecond timeouts, the current absolute Python executable, PowerShell exit-code propagation on Windows, and complete native snake_case payloads. Frozen and revoked state propagates through exit code `2`; audit delivery failures remain visible through stderr, owner-only `error.log`, and exit code `1`, while Letta post events remain nonblocking. Global settings, generated runtimes, runtime config, and private key commit through one rollback-capable transaction guarded by snapshots of all three settings sources. Status requires an effective enabled state, exact hook and executable identity, physical files, canonical private keys, and matching runtime identity. Run `/hooks` and restart active Letta Code sessions after installation. ### Commands diff --git a/test/integration-catalog-contracts.test.mjs b/test/integration-catalog-contracts.test.mjs index 89586a8..c1c1446 100644 --- a/test/integration-catalog-contracts.test.mjs +++ b/test/integration-catalog-contracts.test.mjs @@ -335,13 +335,13 @@ test('high-drift providers retain their verified hook contracts', async () => { source_url: 'https://moonshotai.github.io/kimi-cli/en/customization/hooks.html', }, ]); + // xAI documents the stdin payload non-exhaustively: only hookEventName, + // sessionId, cwd, workspaceRoot, toolName, and toolInput are published. + // Undocumented field names must not be asserted as provider facts. assert.deepEqual(providers.get('grok').event_fields, { name: 'toolName', input: 'toolInput', session: 'sessionId', - call_id: 'toolUseId', - output: 'toolResult', - error: 'toolResult', }); assert.deepEqual(providers.get('grok').config_paths, [ '$GROK_HOME/hooks/*.json',