From d3c9380307be773832c07038882822d624b2431f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B7=E7=94=B5=E8=8A=BD=E8=A1=A3?= Date: Thu, 23 Jul 2026 01:16:55 -0400 Subject: [PATCH] release: v0.1.7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Since v0.1.6 — the cross-provider replay audit (Pi transform-messages policy: every wire builder emits only items valid for its target): - fix(responses): reasoning items without a native rs_* id dropped (the GPT/codex 400 Invalid 'input[N].id'); provenance gate drops foreign reasoning and demotes foreign backend tool calls on model switches - fix(codex): bare rs_* reasoning references dropped (stateless backend) - fix(wire): shared ASCII tool-call id sanitizer, symmetric call+result on both the Messages and Responses legs - fix(messages): image-source whitelist (raster base64 only, http(s) urls only) and empty-user-content guard - fix(conversation): char-boundary-safe code preview (CJK/emoji code panicked every request build) - docs: AGENTS.md records the replay policy --- AGENTS.md | 20 +++++++++ Cargo.lock | 124 ++++++++++++++++++++++++++--------------------------- Cargo.toml | 2 +- 3 files changed, 83 insertions(+), 63 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index e496ef6..effd089 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -228,6 +228,26 @@ edges stay deterministic Rust. The harness appends a terminal results); everything else — unsigned cross-backend history, `tco_*` Responses blobs, stale-model blocks — is stripped, or the request 400s "Invalid `signature` in `thinking` block". +- CROSS-PROVIDER REPLAY POLICY (Pi `transform-messages` pattern): the + conversation history is provider-agnostic and sessions switch + models/backends mid-history, so EACH wire builder owns emitting only + items valid for its target — never patch downstream except in the + per-backend body adapters. Concretely: the Responses input drops + Reasoning items without a native `rs_*` id (foreign capture is id "") + and provenance-gates whole turns via `transform_items_for_responses` + (`AssistantItem.model_id` vs the request model: foreign Reasoning + dropped, foreign BackendToolCall demoted to its `text_summary`); + the codex adapter additionally drops bare `rs_*` references (stateless + backend); tool-call ids pass through ONE shared ASCII + `sanitize_tool_call_id` symmetrically on call+result on BOTH the + Messages and Responses legs; Messages image sources go through + `parse_base64_image_data_uri` (raster whitelist, no `data:` url + sources) and empty user turns get a placeholder. Dangling tool calls + are already repaired item-level by `repair_dangling_tool_calls` on the + actor's build path. When a provider wire bug surfaces, fix the CLASS + across all three builders in the same pass — three sequential + single-provider fixes (thinking signature → codex system role → codex + reasoning id) motivated this policy. - `openai-codex` (ChatGPT Plus/Pro, `scope_key oauth/openai-codex`, port 1455 `/auth/callback`, FORM body, authorize+token host `auth.openai.com`, client `app_EMoam…`, scope `openid profile email offline_access`, the 3 diff --git a/Cargo.lock b/Cargo.lock index 498a687..ae5f4d8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5442,7 +5442,7 @@ dependencies = [ [[package]] name = "kigi-acp-lib" -version = "0.1.6" +version = "0.1.7" dependencies = [ "agent-client-protocol", "async-trait", @@ -5456,7 +5456,7 @@ dependencies = [ [[package]] name = "kigi-agent" -version = "0.1.6" +version = "0.1.7" dependencies = [ "chrono", "dirs 6.0.0", @@ -5486,7 +5486,7 @@ dependencies = [ [[package]] name = "kigi-agent-lifecycle" -version = "0.1.6" +version = "0.1.7" dependencies = [ "async-trait", "tokio", @@ -5495,7 +5495,7 @@ dependencies = [ [[package]] name = "kigi-auth" -version = "0.1.6" +version = "0.1.7" dependencies = [ "async-trait", "http 1.4.2", @@ -5508,7 +5508,7 @@ dependencies = [ [[package]] name = "kigi-bin" -version = "0.1.6" +version = "0.1.7" dependencies = [ "anyhow", "clap", @@ -5543,7 +5543,7 @@ dependencies = [ [[package]] name = "kigi-chat-state" -version = "0.1.6" +version = "0.1.7" dependencies = [ "indexmap", "kigi-compaction", @@ -5560,7 +5560,7 @@ dependencies = [ [[package]] name = "kigi-codebase-graph" -version = "0.1.6" +version = "0.1.7" dependencies = [ "ahash", "clap", @@ -5596,7 +5596,7 @@ dependencies = [ [[package]] name = "kigi-compaction" -version = "0.1.6" +version = "0.1.7" dependencies = [ "anyhow", "async-trait", @@ -5609,7 +5609,7 @@ dependencies = [ [[package]] name = "kigi-config" -version = "0.1.6" +version = "0.1.7" dependencies = [ "base64", "blake3", @@ -5632,7 +5632,7 @@ dependencies = [ [[package]] name = "kigi-config-types" -version = "0.1.6" +version = "0.1.7" dependencies = [ "agent-client-protocol", "indexmap", @@ -5646,7 +5646,7 @@ dependencies = [ [[package]] name = "kigi-crash-handler" -version = "0.1.6" +version = "0.1.7" dependencies = [ "backtrace", "libc", @@ -5657,7 +5657,7 @@ dependencies = [ [[package]] name = "kigi-env" -version = "0.1.6" +version = "0.1.7" dependencies = [ "tracing", "url", @@ -5665,7 +5665,7 @@ dependencies = [ [[package]] name = "kigi-fast-worktree" -version = "0.1.6" +version = "0.1.7" dependencies = [ "anyhow", "bytes", @@ -5697,7 +5697,7 @@ dependencies = [ [[package]] name = "kigi-file-utils" -version = "0.1.6" +version = "0.1.7" dependencies = [ "anyhow", "aws-config", @@ -5721,7 +5721,7 @@ dependencies = [ [[package]] name = "kigi-fsnotify" -version = "0.1.6" +version = "0.1.7" dependencies = [ "criterion", "dunce", @@ -5742,7 +5742,7 @@ dependencies = [ [[package]] name = "kigi-gix-status" -version = "0.1.6" +version = "0.1.7" dependencies = [ "gix", "kigi-test-utils", @@ -5752,7 +5752,7 @@ dependencies = [ [[package]] name = "kigi-hooks" -version = "0.1.6" +version = "0.1.7" dependencies = [ "fastrand", "kigi-config", @@ -5771,7 +5771,7 @@ dependencies = [ [[package]] name = "kigi-hooks-plugins-types" -version = "0.1.6" +version = "0.1.7" dependencies = [ "serde", "serde_json", @@ -5779,7 +5779,7 @@ dependencies = [ [[package]] name = "kigi-http" -version = "0.1.6" +version = "0.1.7" dependencies = [ "kigi-auth", "kigi-log", @@ -5794,7 +5794,7 @@ dependencies = [ [[package]] name = "kigi-hunk-tracker" -version = "0.1.6" +version = "0.1.7" dependencies = [ "chrono", "dunce", @@ -5815,14 +5815,14 @@ dependencies = [ [[package]] name = "kigi-interjection-core" -version = "0.1.6" +version = "0.1.7" dependencies = [ "serde", ] [[package]] name = "kigi-log" -version = "0.1.6" +version = "0.1.7" dependencies = [ "anyhow", "chrono", @@ -5840,7 +5840,7 @@ dependencies = [ [[package]] name = "kigi-markdown" -version = "0.1.6" +version = "0.1.7" dependencies = [ "anstyle", "anstyle-lossy", @@ -5864,14 +5864,14 @@ dependencies = [ [[package]] name = "kigi-markdown-core" -version = "0.1.6" +version = "0.1.7" dependencies = [ "pulldown-cmark", ] [[package]] name = "kigi-mcp" -version = "0.1.6" +version = "0.1.7" dependencies = [ "agent-client-protocol", "async-trait", @@ -5908,7 +5908,7 @@ dependencies = [ [[package]] name = "kigi-memory" -version = "0.1.6" +version = "0.1.7" dependencies = [ "anyhow", "arc-swap", @@ -5942,7 +5942,7 @@ dependencies = [ [[package]] name = "kigi-mermaid" -version = "0.1.6" +version = "0.1.7" dependencies = [ "fontdb", "image", @@ -5960,7 +5960,7 @@ dependencies = [ [[package]] name = "kigi-models" -version = "0.1.6" +version = "0.1.7" dependencies = [ "kigi-env", "serde", @@ -5970,7 +5970,7 @@ dependencies = [ [[package]] name = "kigi-pager-minimal" -version = "0.1.6" +version = "0.1.7" dependencies = [ "chrono", "crossterm", @@ -5987,7 +5987,7 @@ dependencies = [ [[package]] name = "kigi-pager-pty-harness" -version = "0.1.6" +version = "0.1.7" dependencies = [ "alacritty_terminal", "anyhow", @@ -6012,7 +6012,7 @@ dependencies = [ [[package]] name = "kigi-pager-render" -version = "0.1.6" +version = "0.1.7" dependencies = [ "agent-client-protocol", "anstyle", @@ -6064,7 +6064,7 @@ dependencies = [ [[package]] name = "kigi-paths" -version = "0.1.6" +version = "0.1.7" dependencies = [ "camino", "serde", @@ -6074,7 +6074,7 @@ dependencies = [ [[package]] name = "kigi-prompt-queue" -version = "0.1.6" +version = "0.1.7" dependencies = [ "serde", "serde_json", @@ -6082,7 +6082,7 @@ dependencies = [ [[package]] name = "kigi-proto-build" -version = "0.1.6" +version = "0.1.7" dependencies = [ "anyhow", "pbjson-build", @@ -6093,7 +6093,7 @@ dependencies = [ [[package]] name = "kigi-ratatui-inline" -version = "0.1.6" +version = "0.1.7" dependencies = [ "ansi-width", "anstyle-parse 0.2.7", @@ -6110,7 +6110,7 @@ dependencies = [ [[package]] name = "kigi-ratatui-textarea" -version = "0.1.6" +version = "0.1.7" dependencies = [ "arboard", "chrono", @@ -6131,7 +6131,7 @@ dependencies = [ [[package]] name = "kigi-sampler" -version = "0.1.6" +version = "0.1.7" dependencies = [ "async-openai", "async-stream", @@ -6154,7 +6154,7 @@ dependencies = [ [[package]] name = "kigi-sampling-types" -version = "0.1.6" +version = "0.1.7" dependencies = [ "assert_matches", "async-openai", @@ -6171,7 +6171,7 @@ dependencies = [ [[package]] name = "kigi-sandbox" -version = "0.1.6" +version = "0.1.7" dependencies = [ "anyhow", "chrono", @@ -6192,7 +6192,7 @@ dependencies = [ [[package]] name = "kigi-secrets" -version = "0.1.6" +version = "0.1.7" dependencies = [ "regex", "serde_json", @@ -6230,7 +6230,7 @@ dependencies = [ [[package]] name = "kigi-shell" -version = "0.1.6" +version = "0.1.7" dependencies = [ "agent-client-protocol", "anyhow", @@ -6367,7 +6367,7 @@ dependencies = [ [[package]] name = "kigi-shell-base" -version = "0.1.6" +version = "0.1.7" dependencies = [ "anyhow", "chrono", @@ -6392,7 +6392,7 @@ dependencies = [ [[package]] name = "kigi-sqlite-journal" -version = "0.1.6" +version = "0.1.7" dependencies = [ "libc", "rusqlite", @@ -6403,7 +6403,7 @@ dependencies = [ [[package]] name = "kigi-subagent-resolution" -version = "0.1.6" +version = "0.1.7" dependencies = [ "kigi-sampling-types", "kigi-tool-types", @@ -6418,7 +6418,7 @@ dependencies = [ [[package]] name = "kigi-system-power" -version = "0.1.6" +version = "0.1.7" dependencies = [ "windows-sys 0.59.0", "zbus", @@ -6426,7 +6426,7 @@ dependencies = [ [[package]] name = "kigi-test-support" -version = "0.1.6" +version = "0.1.7" dependencies = [ "agent-client-protocol", "anyhow", @@ -6448,7 +6448,7 @@ dependencies = [ [[package]] name = "kigi-test-utils" -version = "0.1.6" +version = "0.1.7" dependencies = [ "runfiles", "tracing", @@ -6457,11 +6457,11 @@ dependencies = [ [[package]] name = "kigi-token-estimation" -version = "0.1.6" +version = "0.1.7" [[package]] name = "kigi-tool-protocol" -version = "0.1.6" +version = "0.1.7" dependencies = [ "kigi-tool-types", "serde", @@ -6472,7 +6472,7 @@ dependencies = [ [[package]] name = "kigi-tool-runtime" -version = "0.1.6" +version = "0.1.7" dependencies = [ "anyhow", "async-trait", @@ -6490,7 +6490,7 @@ dependencies = [ [[package]] name = "kigi-tool-types" -version = "0.1.6" +version = "0.1.7" dependencies = [ "minijinja", "schemars 1.2.1", @@ -6500,7 +6500,7 @@ dependencies = [ [[package]] name = "kigi-tools" -version = "0.1.6" +version = "0.1.7" dependencies = [ "anyhow", "arc-swap", @@ -6577,7 +6577,7 @@ dependencies = [ [[package]] name = "kigi-tools-api" -version = "0.1.6" +version = "0.1.7" dependencies = [ "kigi-proto-build", "kigi-tool-protocol", @@ -6590,11 +6590,11 @@ dependencies = [ [[package]] name = "kigi-tracing-macros" -version = "0.1.6" +version = "0.1.7" [[package]] name = "kigi-tty-utils" -version = "0.1.6" +version = "0.1.7" dependencies = [ "libc", "nix 0.30.1", @@ -6604,7 +6604,7 @@ dependencies = [ [[package]] name = "kigi-tui" -version = "0.1.6" +version = "0.1.7" dependencies = [ "agent-client-protocol", "ansi-to-tui", @@ -6691,7 +6691,7 @@ dependencies = [ [[package]] name = "kigi-update" -version = "0.1.6" +version = "0.1.7" dependencies = [ "anyhow", "dunce", @@ -6720,14 +6720,14 @@ dependencies = [ [[package]] name = "kigi-version" -version = "0.1.6" +version = "0.1.7" dependencies = [ "semver", ] [[package]] name = "kigi-workspace" -version = "0.1.6" +version = "0.1.7" dependencies = [ "agent-client-protocol", "anyhow", @@ -6806,7 +6806,7 @@ dependencies = [ [[package]] name = "kigi-workspace-types" -version = "0.1.6" +version = "0.1.7" dependencies = [ "base64", "chrono", @@ -8840,7 +8840,7 @@ dependencies = [ [[package]] name = "ptyctl" -version = "0.1.6" +version = "0.1.7" dependencies = [ "alacritty_terminal", "anyhow", @@ -8858,7 +8858,7 @@ dependencies = [ [[package]] name = "ptyctl-cli" -version = "0.1.6" +version = "0.1.7" dependencies = [ "anyhow", "axum", diff --git a/Cargo.toml b/Cargo.toml index db358d4..c269bac 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -76,7 +76,7 @@ members = [ ] [workspace.package] -version = "0.1.6" +version = "0.1.7" edition = "2024" license = "Apache-2.0"