Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,34 @@ All notable changes to the Inkbox SDK, CLI, and skills live here.
Versions move in lockstep across `@inkbox/sdk` (TypeScript), `inkbox`
(Python), `@inkbox/cli`, and `inkbox` (Rust, crates.io).

## 0.5.6 — A2A 1.0

### Added

- **A2A receiver inboxes in Python and TypeScript.** `AgentIdentity` can enable the channel, configure Agent Card skills, manage directional contact rules, list contexts and tasks, and reply with an explicit `ask_caller`, `complete`, or `fail` lifecycle decision.
- **Two-sided A2A history in Python, TypeScript, and Rust.** Identity-scoped task history supports inbound, outbound, or combined views with requester, worker, state, context, time, and keyword filters. Message history adds task and participant provenance with opaque cursor pagination.
- **A standard A2A 1.0 client.** Identity-bound clients fetch Agent Cards without credentials, refuse redirects, validate canonical HTTPS origins, send with `returnImmediately`, poll/list/cancel tasks, and preserve exact wire task/message types.
- **Credential pinning.** The Inkbox API key is attached only when both the Inkbox-hosted card and selected RPC interface match the configured Inkbox origin. External agents receive no Inkbox credential unless the caller explicitly supplies their credential.
- **CLI A2A workflow.** `inkbox a2a` covers receiver enablement, cards, skills, rules, filterable task/message history, replies, remote calls, checks/waits, and cancellation.
- **A2A webhook types.** All four task lifecycle events are available in Python, TypeScript, and Rust webhook envelopes and subscription validation.

### Changed

- Python, TypeScript, CLI, and Rust package metadata move to 0.5.6; the CLI depends on `@inkbox/sdk` `^0.5.6`. Rust exposes the A2A task, context, and message-history surface; receiver configuration and the standard protocol client remain Python/TypeScript-only.
- Task detail exposes current state and message history.
- Python and TypeScript A2A clients unwrap the standard task/message result envelope while retaining compatibility with direct task payloads.
- Python and TypeScript standard task lists accept `statusTimestampAfter` for incremental polling.
- Python and TypeScript identity-bound A2A clients inherit their parent SDK request timeout; Python `wait()` caps in-flight polling requests to its remaining deadline.
- TypeScript keeps resolved credentials out of returned target objects, freezes resolved endpoints after validation, and applies bounded timeouts to Agent Card and JSON-RPC requests.
- A2A contact rules support `inbound`, `outbound`, and `both`; protocol calls require both the requester outbound policy and worker inbound policy to allow the peer.
- **Rust note (source-breaking).** Combined context history now takes `A2AContextListOptions`, including an explicit `direction`; update positional `a2a_contexts(cursor, limit)` calls to pass the options struct.
- Identity-owned iMessage, call-lifecycle, and A2A webhook events use separate subscription rows. Disjoint rows may share the same destination URL.
- Python, TypeScript, Rust, and the CLI reject mixed-family webhook updates and non-null conversation context on A2A subscriptions before sending the request.

### Compatibility and rollout

- Existing SDK methods are unchanged. A2A methods require the matching server rollout. Remote calling requires a claimed, agent-scoped key bound to the same identity.

## 0.5.5 — Action-only contact-rule updates

### Changed
Expand Down
41 changes: 41 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,47 @@ inkbox vault secrets
inkbox vault get <secret-id>
```

### A2A history

Each identity can inspect work it received, work it requested, or both without
duplicating task records. Task lists are newest-first and cursor-paginated.
Keyword search matches string and numeric content values from `text` and
`data` parts; message metadata is not searched, and results remain
newest-first. A message's `role` is its author (`caller` or `agent`),
independent of task direction.

Calls between Inkbox identities use bilateral contact rules. The requester must
allow the worker in its `outbound` direction, and the worker must allow the
requester in its `inbound` direction. Use `both` when the same peer rule should
apply in either role.

```python
identity = inkbox.get_identity("coordinator")

page = identity.a2a_tasks(
direction="both",
worker_handle="researcher",
q="quarterly summary",
)
for task in page.items:
print(task.id, task.state)

for message in identity.iter_a2a_messages(
direction="outbound",
worker_handle="researcher",
q="revenue",
):
print(message.task_id, message.role, message.parts)
```

```bash
inkbox a2a tasks -i coordinator --direction both --worker researcher
inkbox a2a messages -i coordinator --direction outbound \
--worker researcher --query revenue --json
```

Task detail includes current state and message history.

### Tunnels (Python)

```python
Expand Down
11 changes: 11 additions & 0 deletions cli/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,16 @@
# Changelog

## 0.5.6 — A2A 1.0

### Added

- `inkbox a2a enable|disable|card`, skills and rule management, filterable task/message history, task replies, and remote `call|check|cancel` commands.

### Changed

- CLI version moved with Python and TypeScript to 0.5.6 and now depends on `@inkbox/sdk` `^0.5.6`.
- Task and message list commands preserve opaque pagination cursors in JSON and human-readable output.

## 0.5.5 — Action-only contact-rule updates

### Changed
Expand Down
46 changes: 46 additions & 0 deletions cli/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -350,6 +350,52 @@ Group conversation rows expose `groupCreationStatus` as `creating`,
conversation; send again with its conversation id to retry. Successful retry
changes the status to `ready`.

### a2a

```bash
# Receiver setup and advertised capabilities
inkbox a2a enable -i researcher
inkbox a2a card -i researcher
inkbox a2a skills set -i researcher --file skills.json

# Bilateral admission for coordinator -> researcher calls
inkbox a2a rules add -i coordinator --handle researcher \
--action allow --direction outbound
inkbox a2a rules add -i researcher --handle coordinator \
--action allow --direction inbound

# Unified task history. Omit --direction for the receiver inbox.
inkbox a2a tasks -i coordinator --direction both \
--requester coordinator --worker researcher \
--state working --query "quarterly report" --limit 25

# Search individual messages with task and participant provenance.
inkbox a2a messages -i coordinator --direction outbound \
--worker researcher --role agent --query revenue --limit 25 --json

# Continue a cursor page with the same filters.
inkbox a2a messages -i coordinator --direction outbound \
--worker researcher --role agent --query revenue \
--cursor '<nextCursor>' --limit 25 --json

# The outbound alias lists only work requested by the identity.
inkbox a2a sent -i coordinator --worker researcher
inkbox a2a sent-task <task-id> -i coordinator

# A worker can request more input or finish a task.
inkbox a2a reply <task-id> -i researcher --ask --text "Which quarter?"
inkbox a2a reply <task-id> -i researcher --complete --text "Done."
```

JSON list output contains both `items` and `nextCursor`. Human-readable output
prints a next-cursor hint when another page exists. Keyword search covers
string and numeric content values from `text` and `data` parts, excludes
metadata, and returns newest-first results rather than relevance ranking.
`--role` selects the message author (`caller` or `agent`), independent of task
direction. Task detail exposes messages and current state. A protocol call must
pass both the requester identity's outbound policy and the worker identity's
inbound policy. Contact-rule directions are `inbound`, `outbound`, and `both`.

### vault

Encrypted vault operations. `get`, `create`, and credential listing require a vault key.
Expand Down
8 changes: 4 additions & 4 deletions cli/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions cli/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@inkbox/cli",
"version": "0.5.5",
"version": "0.5.6",
"description": "CLI for the Inkbox API",
"license": "MIT",
"type": "module",
Expand All @@ -18,7 +18,7 @@
"prepublishOnly": "npm run build"
},
"dependencies": {
"@inkbox/sdk": "^0.5.5",
"@inkbox/sdk": "^0.5.6",
"commander": "^13.0.0",
"undici": "^7.28.0"
},
Expand Down
2 changes: 1 addition & 1 deletion cli/src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { Inkbox } from "@inkbox/sdk";
import type { Command } from "commander";

// Keep in sync with package.json "version".
export const CLI_VERSION = "0.5.5";
export const CLI_VERSION = "0.5.6";

export interface GlobalOpts {
apiKey?: string;
Expand Down
Loading
Loading