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
2 changes: 1 addition & 1 deletion .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ jobs:
- name: Install bridge + latest SDK
run: |
uv pip install --system \
"inkbox @ git+https://github.com/inkbox-ai/inkbox.git@8f4b37c56cd153a2acc6cfabe27dbbeb43510f00#subdirectory=sdk/python" \
"inkbox @ git+https://github.com/inkbox-ai/inkbox.git@199bbd27c8dab2f70e379de52ca9cc910b0e141d#subdirectory=sdk/python" \
-e . pytest
uv pip install --system -U claude-agent-sdk

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,7 @@ The agent reaches you (or third parties) through an in-process MCP server:
- `inkbox_list_text_conversations` · `inkbox_get_text_conversation` — browse SMS threads and history.
- `inkbox_list_imessage_conversations` · `inkbox_get_imessage_conversation` — browse iMessage threads and history (find the `conversation_id` to send into).
- `inkbox_lookup_contact` · `inkbox_list_contacts` · `inkbox_get_contact` — resolve and read address-book contacts (reverse-lookup by email/phone, free-text search, or full record by id).
- `inkbox_create_contact` · `inkbox_update_contact` · `inkbox_delete_contact` — save, edit, and remove contacts. Reads and writes are filtered server-side to what this identity may see. vCard export/import is not exposed.
- `inkbox_create_contact` · `inkbox_update_contact` · `inkbox_delete_contact` — save, edit, and remove organization-wide contacts. Changes affect the shared address book. vCard export/import is not exposed.

On a live call, the OpenAI Realtime voice agent additionally gets `consult_agent`, `register_post_call_action` / `edit_post_call_action` / `delete_post_call_action`, and `hang_up_call` — see [Voice](#voice).

Expand Down
2 changes: 1 addition & 1 deletion inkbox_claude/doctor.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ def run_doctor() -> List[Tuple[str, bool, str]]:
import inkbox # noqa: F401
checks.append(("inkbox SDK", True, "installed"))
except ImportError:
checks.append(("inkbox SDK", False, "pip install 'inkbox>=0.5.0,<1.0.0'"))
checks.append(("inkbox SDK", False, "pip install 'inkbox>=0.5.1,<1.0.0'"))

try:
import claude_agent_sdk # noqa: F401
Expand Down
2 changes: 1 addition & 1 deletion inkbox_claude/gateway.py
Original file line number Diff line number Diff line change
Expand Up @@ -488,7 +488,7 @@ async def run(self) -> None:
if not AIOHTTP_AVAILABLE:
raise RuntimeError("aiohttp is not installed; run: pip install aiohttp")
if not INKBOX_AVAILABLE:
raise RuntimeError("inkbox SDK is not installed; run: pip install 'inkbox>=0.5.0,<1.0.0'")
raise RuntimeError("inkbox SDK is not installed; run: pip install 'inkbox>=0.5.1,<1.0.0'")
if not self.cfg.api_key or not self.cfg.identity:
raise RuntimeError("INKBOX_API_KEY and INKBOX_IDENTITY must be set (see README)")

Expand Down
4 changes: 2 additions & 2 deletions inkbox_claude/prompts.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@

# Inkbox contacts

Claude can read and write Inkbox contacts visible to this configured identity.
Claude can read and write the organization's shared Inkbox contacts.

- Use inkbox_list_contacts for name-based searches like "who is Alex?".
- Use inkbox_lookup_contact when you have an exact or partial email/phone filter.
Expand All @@ -79,7 +79,7 @@
- Use inkbox_update_contact when the user asks you to change an existing contact; look up the contact first if you do not already have its UUID.
- Use inkbox_delete_contact only after the target contact is explicit and confirmed.
- There is no vCard export/import, contact access, or contact rule tool in this harness.
- Contact tools operate only on contacts visible/writable to the configured identity.
- Every identity in the organization can read contacts. Creating, updating, or deleting a contact affects the shared address book.
""".strip()


Expand Down
2 changes: 1 addition & 1 deletion inkbox_claude/setup_wizard.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
# Packages the wizard itself needs to talk to Inkbox during setup. The
# gateway's other dependency (claude-agent-sdk) is checked by doctor.
INKBOX_MIN_VERSION = (0, 5, 0)
INKBOX_REQUIREMENTS = ("inkbox>=0.5.0,<1.0.0", "aiohttp>=3.9")
INKBOX_REQUIREMENTS = ("inkbox>=0.5.1,<1.0.0", "aiohttp>=3.9")
_BRACKETED_PASTE_PATTERN = re.compile(r"\x1b\[\s*200~|\x1b\[\s*201~")

# Bundled avatar attached to the agent's Inkbox contact card during setup.
Expand Down
3 changes: 1 addition & 2 deletions inkbox_claude/tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -587,8 +587,7 @@ def _run():
return _error(str(exc))

# ------------------------------------------------------------------
# Contacts — the org address book, filtered server-side to what this
# identity may see.
# Contacts — the shared organization address book.
# ------------------------------------------------------------------

@tool(
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ description = "Inkbox bridge for Claude Code — talk to your coding agent over
requires-python = ">=3.11"
dependencies = [
"aiohttp>=3.9",
"inkbox>=0.5.0,<1.0.0",
"inkbox>=0.5.1,<1.0.0",
"claude-agent-sdk>=0.1.0",
"segno>=1.5", # terminal QR codes for the iMessage connect step
]
Expand Down
3 changes: 2 additions & 1 deletion tests/test_prompts.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,8 @@ def test_channel_prompt_mentions_identity_and_dir():
assert "dev-agent@inkbox.ai" in text
assert "jargon" in text.lower()
assert "AskUserQuestion" in text
assert "Claude can read and write Inkbox contacts" in text
assert "shared Inkbox contacts" in text
assert "shared address book" in text
assert "inkbox_create_contact" in text
assert "inkbox_update_contact" in text
assert "inkbox_delete_contact" in text
Expand Down
8 changes: 4 additions & 4 deletions tests/test_setup_wizard.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ def test_install_command_prefers_uv_when_available(monkeypatch):
"install",
"--python",
"/tmp/venv/bin/python",
"inkbox>=0.5.0,<1.0.0",
"inkbox>=0.5.1,<1.0.0",
"aiohttp>=3.9",
]]

Expand All @@ -98,10 +98,10 @@ def test_install_command_falls_back_to_pip_and_ensurepip(monkeypatch):
monkeypatch.setattr(setup_wizard.shutil, "which", lambda _name: None)

assert setup_wizard._install_commands() == [
[["/tmp/venv/bin/python", "-m", "pip", "install", "inkbox>=0.5.0,<1.0.0", "aiohttp>=3.9"]],
[["/tmp/venv/bin/python", "-m", "pip", "install", "inkbox>=0.5.1,<1.0.0", "aiohttp>=3.9"]],
[
["/tmp/venv/bin/python", "-m", "ensurepip", "--upgrade"],
["/tmp/venv/bin/python", "-m", "pip", "install", "inkbox>=0.5.0,<1.0.0", "aiohttp>=3.9"],
["/tmp/venv/bin/python", "-m", "pip", "install", "inkbox>=0.5.1,<1.0.0", "aiohttp>=3.9"],
],
]

Expand All @@ -120,7 +120,7 @@ def fail_import():
out = capsys.readouterr().out
assert "/tmp/venv/bin/python" in out
assert "uv pip install --python" in out
assert "inkbox>=0.5.0,<1.0.0" in out
assert "inkbox>=0.5.1,<1.0.0" in out


# ----------------------------------------------------------------------
Expand Down