Add the admin messages, approval ids as numbers, and two turn events

Implemented-By: OpenCode session (model recorded in docs/implementer-log.md)
This commit is contained in:
2026-09-19 00:28:46 -07:00
parent c6395b16f4
commit e8568edf7e
25 changed files with 441 additions and 10 deletions
+18 -1
View File
@@ -54,12 +54,23 @@ fn tool_request() {
#[test]
fn tool_response_pending() {
let body = ToolResponse::PendingApproval {
approval: "ap-0001".to_string(),
approval: 41,
expires: Timestamp::parse("2026-09-17T08:35:00.000Z").unwrap(),
};
check("tool_response_pending.json", response(7, false, body));
}
#[test]
fn an_approval_id_is_a_number_not_a_string() {
let good = fixture("tool_response_pending.json");
let bad = good.replacen("\"approval\":41", "\"approval\":\"41\"", 1);
assert_ne!(good, bad);
assert!(serde_json::from_str::<Envelope>(&good).is_ok());
assert!(serde_json::from_str::<Envelope>(&bad).is_err());
let negative = good.replacen("\"approval\":41", "\"approval\":-1", 1);
assert!(serde_json::from_str::<Envelope>(&negative).is_err());
}
#[test]
fn tool_response_result() {
let body = ToolResponse::Result {
@@ -113,6 +124,10 @@ fn deny_reasons_and_error_codes_are_snake_case() {
(DenyReason::DeniedByGrant, "denied_by_grant"),
(DenyReason::ApprovalRefused, "approval_refused"),
(DenyReason::ApprovalExpired, "approval_expired"),
(DenyReason::GrantsInvalid, "grants_invalid"),
(DenyReason::AuditUnavailable, "audit_unavailable"),
(DenyReason::InvalidArguments, "invalid_arguments"),
(DenyReason::StateUnreadable, "state_unreadable"),
];
for (value, text) in reasons {
assert_eq!(
@@ -125,6 +140,8 @@ fn deny_reasons_and_error_codes_are_snake_case() {
(ErrorCode::BadVersion, "bad_version"),
(ErrorCode::BadMessage, "bad_message"),
(ErrorCode::Internal, "internal"),
(ErrorCode::Forbidden, "forbidden"),
(ErrorCode::NoSuchApproval, "no_such_approval"),
];
for (value, text) in codes {
assert_eq!(