tsk-2wbp3f [OPEN] Delegation A3: deliver the minted invite to the re - #2199
tsk-2wbp3f [OPEN] Delegation A3: deliver the minted invite to the re#2199jaylfc wants to merge 1 commit into
Conversation
📝 WalkthroughWalkthroughAdds cross-user sponsored-agent delegation with scope and envelope validation, automatic or decision-based invite issuance, sponsor metadata persistence, approval propagation, sponsor-scoped registry APIs, revocation cascading, task unassignment, and peer-route kill switches. ChangesSponsored delegation flow
Estimated code review effort: 4 (Complex) | ~60 minutes Sequence Diagram(s)sequenceDiagram
participant DelegatingAgent
participant PeerInbox
participant DelegationHandler
participant ProjectStore
participant InviteStore
participant DecisionStore
participant InviteRedeemer
participant AgentRegistry
DelegatingAgent->>PeerInbox: delegation_request
PeerInbox->>DelegationHandler: dispatch envelope
DelegationHandler->>ProjectStore: check membership and auto-approval setting
alt auto approval
DelegationHandler->>InviteStore: mint invite with sponsor metadata
else manual approval
DelegationHandler->>DecisionStore: create delegation gate
DecisionStore->>DelegationHandler: approved decision
DelegationHandler->>InviteStore: mint sponsored invite
end
InviteRedeemer->>InviteStore: redeem invite
InviteRedeemer->>AgentRegistry: register or update sponsored identity
Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
PR Summary by QodoAdd sponsored agent delegation and revocation workflow
AI Description
Diagram
High-Level Assessment
Files changed (9)
|
|
nemotron-ultra-kilo review VERDICT: Multiple blocking issues — incomplete function, missing method, potential migration ordering, and insufficient test coverage.
Automated first-pass review by the nemotron-ultra-kilo lane. The lead still reviews before merge. |
|
nemotron-ultra-orB review VERDICT: Several correctness bugs, one security issue, and missing test coverage
Automated first-pass review by the nemotron-ultra-orB lane. The lead still reviews before merge. |
Code Review by Qodo
1. sponsor_contact_id appears in SCHEMA
|
| created_ts TEXT NOT NULL, | ||
| revoked_at TEXT, | ||
| status TEXT NOT NULL DEFAULT 'active', | ||
| sponsor_contact_id TEXT |
There was a problem hiding this comment.
1. sponsor_contact_id appears in schema 📜 Skill insight ≡ Correctness
The migration-added sponsor_contact_id column is also declared in the initial schema. This violates the required separation between first-open DDL and columns retrofitted through guarded migration logic.
Agent Prompt
## Issue description
The migration-added `sponsor_contact_id` column is declared in `SCHEMA`, contrary to the store migration requirements.
## Issue Context
`_migration_v5_add_sponsor_contact_id()` already performs a guarded `PRAGMA table_info` check and conditionally adds the column during `_post_init`.
## Fix Focus Areas
- tinyagentos/agent_registry_store.py[49-49]
- tinyagentos/agent_registry_store.py[209-226]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
| pin_required INTEGER NOT NULL DEFAULT 1, | ||
| contact_id TEXT | ||
| contact_id TEXT, | ||
| metadata TEXT NOT NULL DEFAULT '{}' |
There was a problem hiding this comment.
2. metadata appears in schema 📜 Skill insight ≡ Correctness
The migration-added metadata column is also declared in the initial project-invite schema. The checklist requires this column to be added only through the guarded _post_init retrofit path.
Agent Prompt
## Issue description
The `metadata` column is both present in `SCHEMA` and conditionally added by `_post_init`.
## Issue Context
PR Compliance ID 2185190 requires migration-added columns to remain outside first-open schema DDL and be retrofitted with guarded initialization logic.
## Fix Focus Areas
- tinyagentos/projects/invite_store.py[36-36]
- tinyagentos/projects/invite_store.py[114-118]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
| @@ -0,0 +1,537 @@ | |||
| """Agent delegation handler — cross-user collab D1. | |||
There was a problem hiding this comment.
3. Added text contains em dashes 📜 Skill insight ✧ Quality
The PR introduces em dashes in docstrings, comments, and runtime text across several changed files. The checklist prohibits U+2014 in all such public-facing text.
Agent Prompt
## Issue description
Added docstrings, comments, and strings contain prohibited em dash characters (`—`).
## Issue Context
Replace each U+2014 character with a regular hyphen, an en dash, or rewritten punctuation without changing behavior.
## Fix Focus Areas
- tests/test_collab_d1_delegation.py[1-162]
- tinyagentos/agent_registry_store.py[480-482]
- tinyagentos/delegation_handler.py[1-531]
- tinyagentos/routes/agent_auth_requests.py[371-373]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
| if not approved: | ||
| reply = "delegation denied" | ||
| elif completed: | ||
| reply = "delegation approved - the task has been assigned" | ||
| else: | ||
| reply = "delegation approved, but assigning the task failed - please retry" |
There was a problem hiding this comment.
4. Approved delegation undefined reply 🐞 Bug ≡ Correctness
_apply_delegation_grant no longer assigns reply for either approved outcome but still uses it unconditionally. Every approved existing delegation raises UnboundLocalError after the assignment attempt, potentially returning 500 after the task was already changed.
Agent Prompt
## Issue description
Restore reply assignment for every approved delegation outcome before `_route_answer_to_agent` is called.
## Issue Context
Successful completion should report assignment success, while failed completion should report that a retry is needed. Existing tests assert both behaviors.
## Fix Focus Areas
- tinyagentos/routes/decisions.py[370-421]
- tests/test_routes_delegation.py[283-356]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
| invite_store = getattr(request.app.state, "project_invite_store", None) | ||
| if invite_store is None: | ||
| return {"status": "error", "error": "invite store not available"} |
There was a problem hiding this comment.
5. Wrong invite-store state key 🐞 Bug ≡ Correctness
Both delegation approval paths look up request.app.state.project_invite_store, but startup publishes the initialized store as app.state.project_invites. In the production app wiring, every approval therefore returns invite store not available before minting an invite.
Agent Prompt
## Issue description
Use the application-state attribute under which `ProjectInviteStore` is actually registered.
## Issue Context
Startup and all existing invite routes use `app.state.project_invites`; the new handler uses a nonexistent `project_invite_store` attribute in both approval paths.
## Fix Focus Areas
- tinyagentos/delegation_handler.py[264-266]
- tinyagentos/delegation_handler.py[324-326]
- tinyagentos/app.py[1597-1597]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
| return { | ||
| "status": "approved", | ||
| "invite_id": invite["id"], | ||
| "agent_slug": agent_slug, |
There was a problem hiding this comment.
6. Mint result uses wrong key 🐞 Bug ≡ Correctness
Both approval paths access invite["id"], while ProjectInviteStore.mint returns the identifier as invite["record"]["invite_id"]. Once the store lookup is fixed, every approval will commit a pending invite and then fail while constructing its result.
Agent Prompt
## Issue description
Read the minted invite identifier from the actual `ProjectInviteStore.mint` return structure in both approval paths.
## Issue Context
`mint` returns `{record: {..., invite_id: ...}, pin: ...}` and commits before returning, so the current `invite["id"]` access fails after leaving an orphaned pending invite.
## Fix Focus Areas
- tinyagentos/delegation_handler.py[294-298]
- tinyagentos/delegation_handler.py[350-354]
- tinyagentos/projects/invite_store.py[241-263]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
| f"Invite ID: {invite_id}. " | ||
| f"Share this invite with the remote contact so their agent can join." | ||
| ) | ||
| await _route_answer_to_agent(decision, reply) |
There was a problem hiding this comment.
7. Approval never reaches peer 🐞 Bug ≡ Correctness
Manual approval and denial results are passed to the local @-agent answer router even though the decision's from_agent is a contact ID such as hub:hogne. That router immediately ignores non-@ identifiers, and no peer polling or outbound result route was added, so the sponsor never receives the completed decision or invite.
Agent Prompt
## Issue description
Deliver delegation approval and denial results to the sponsoring contact through the authenticated peer channel rather than the local agent A2A router.
## Issue Context
Delegation decisions store `from_agent=contact_id`; `_route_answer_to_agent` only accepts identifiers beginning with `@`. Persist an outbound result or send a signed peer envelope containing the outcome and invite details.
## Fix Focus Areas
- tinyagentos/delegation_handler.py[219-246]
- tinyagentos/routes/decisions.py[424-472]
- tinyagentos/routes/peer.py[259-273]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
| for agent in sponsored: | ||
| canonical_id = agent["canonical_id"] | ||
| try: | ||
| await registry.set_status(canonical_id, "revoked", actor=contact_id) |
There was a problem hiding this comment.
8. Project revoke disables identity 🐞 Bug ≡ Correctness
cascade_sponsor_revoke(project_id=...) promises project-only revocation but globally changes every sponsored identity to revoked without filtering by project. Revoking collaboration on one project therefore disables those identities and their access to every other project.
Agent Prompt
## Issue description
Keep project membership revocation scoped to the supplied project and reserve global registry revocation for contact-wide revocations.
## Issue Context
`AgentRegistryStore.set_status(..., "revoked")` changes the identity's global lifecycle state and `revoked_at`; it cannot implement the documented project-token-only behavior.
## Fix Focus Areas
- tinyagentos/delegation_handler.py[357-390]
- tinyagentos/agent_registry_store.py[696-743]
- tinyagentos/projects/project_store.py[319-331]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
| if not task_id: | ||
| continue | ||
| try: | ||
| await task_store.update_task(task_id, assignee_id=None, status="ready") |
There was a problem hiding this comment.
9. Revocation cannot unassign tasks 🐞 Bug ≡ Correctness
The revocation helper calls update_task(..., assignee_id=None, status="ready"), but ProjectTaskStore.update_task treats None as “unchanged,” and the board represents ready work with status open. Affected tasks retain the revoked assignee and are moved outside the ready-task view.
Agent Prompt
## Issue description
Provide an explicit supported way to clear a task assignee and return revoked-agent tasks to the board's `open` state.
## Issue Context
The current task update API ignores `None` values, and `ready_tasks` selects unclaimed tasks whose status is `open`, not `ready`. The assignee lookup should also support optional project filtering directly.
## Fix Focus Areas
- tinyagentos/delegation_handler.py[447-483]
- tinyagentos/projects/task_store.py[70-81]
- tinyagentos/projects/task_store.py[246-295]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
| # Apply scope denylist. | ||
| granted_scopes, denied_scopes = validate_delegation_scopes(requested_scopes) |
There was a problem hiding this comment.
10. Denied request gains scope 🐞 Bug ⛨ Security
After hard-denied scopes are stripped, the handler does not reject an empty grant set and continues to mint a project invite. Because ProjectInviteStore.mint automatically adds project_tasks, a request containing only files_write can produce an invite granting an unrequested project scope.
Agent Prompt
## Issue description
Reject delegation requests when no grantable scopes remain after applying the hard denylist.
## Issue Context
The envelope's original scope list can be nonempty but become empty after filtering. Passing that empty list into a project invite silently adds `project_tasks`, widening authorization beyond the request.
## Fix Focus Areas
- tinyagentos/delegation_handler.py[153-181]
- tinyagentos/projects/invite_store.py[181-186]
- tests/test_collab_d1_delegation.py[15-50]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
tinyagentos/routes/decisions.py (1)
370-421: 🎯 Functional Correctness | 🔴 Critical | ⚡ Quick winCritical:
replyis unbound whenapprovedis True — breaks every approved delegation_gate decision.
replyis only assigned in theelse(denial) branch (line 419). Whenvalue == "approve", theif approved:block (lines 389-417) never setsreply, so the unconditionalawait _route_answer_to_agent(decision, reply)at line 420 raisesUnboundLocalError. This is a regression on the pre-existing#161gated-delegation approve flow — every approval of adelegation_gatedecision will now crash instead of notifying the delegate.🐛 Proposed fix
if completed: try: await policies.add_grant(from_agent, "delegate", decision.get("id")) except Exception: logger.warning( "delegate grant write failed for agent %s (decision %s)", from_agent, decision.get("id"), exc_info=True, ) + reply = ( + f"The delegation to {to_agent} was approved and completed." + if completed + else f"The delegation to {to_agent} was approved, but completion failed." + ) else: reply = f"The delegation to {to_agent} was denied." await _route_answer_to_agent(decision, reply) return True🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@tinyagentos/routes/decisions.py` around lines 370 - 421, Initialize or assign reply within the approved branch of _apply_delegation_grant before the unconditional _route_answer_to_agent call, while preserving the existing denial message. Ensure every approved delegation_gate decision produces the intended success notification without raising UnboundLocalError.
🧹 Nitpick comments (2)
tests/test_collab_d1_delegation.py (2)
85-119: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueUnused
parsedbindings flagged by Ruff (RUF059).Lines 88, 100, and 112 destructure
parsedfrom_validate_delegation_envelope_body(...)but never use it. Prefix with_to silence the lint (e.g.ok, err, _parsed = ...).🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@tests/test_collab_d1_delegation.py` around lines 85 - 119, Update the three test methods test_empty_scopes, test_scopes_not_a_list, and test_empty_agent_slug to bind the unused third return value from _validate_delegation_envelope_body to a name prefixed with an underscore, such as _parsed, while preserving the existing assertions.Source: Linters/SAST tools
126-301: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winNo end-to-end coverage for the mint/approve paths.
This module covers scope/envelope validation and store-level sponsor/metadata plumbing well, but there's no test exercising
_auto_approve_delegation,complete_delegation_approval, orprocess_delegation_requestend-to-end against a realProjectInviteStore. That gap is why theinvite["id"]KeyError intinyagentos/delegation_handler.py(flagged separately) went undetected — a test asserting the returnedinvite_idfrom either function would have caught it immediately.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@tests/test_collab_d1_delegation.py` around lines 126 - 301, Add end-to-end async tests covering _auto_approve_delegation, complete_delegation_approval, and process_delegation_request with a real ProjectInviteStore, asserting each path returns the persisted invite_id and completes the expected approval flow. Use the existing delegation test fixtures and metadata/scope setup where applicable, including the sponsored delegation path that would expose incorrect invite["id"] access.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@tinyagentos/delegation_handler.py`:
- Around line 249-298: The delegation approval flows use the wrong mint result
shape and configure pin requirements through metadata. Update
_auto_approve_delegation and complete_delegation_approval to read the invite ID
from mint()'s returned record and provide the expected invite_id
response/envelope key, pass pin_required=False directly to
ProjectInviteStore.mint(), and remove pin_required from the metadata payload so
the invite is stored without a PIN.
---
Outside diff comments:
In `@tinyagentos/routes/decisions.py`:
- Around line 370-421: Initialize or assign reply within the approved branch of
_apply_delegation_grant before the unconditional _route_answer_to_agent call,
while preserving the existing denial message. Ensure every approved
delegation_gate decision produces the intended success notification without
raising UnboundLocalError.
---
Nitpick comments:
In `@tests/test_collab_d1_delegation.py`:
- Around line 85-119: Update the three test methods test_empty_scopes,
test_scopes_not_a_list, and test_empty_agent_slug to bind the unused third
return value from _validate_delegation_envelope_body to a name prefixed with an
underscore, such as _parsed, while preserving the existing assertions.
- Around line 126-301: Add end-to-end async tests covering
_auto_approve_delegation, complete_delegation_approval, and
process_delegation_request with a real ProjectInviteStore, asserting each path
returns the persisted invite_id and completes the expected approval flow. Use
the existing delegation test fixtures and metadata/scope setup where applicable,
including the sponsored delegation path that would expose incorrect invite["id"]
access.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: 00ef86e7-61e6-451e-b25b-a4d86ba668c0
📒 Files selected for processing (9)
tests/test_collab_d1_delegation.pytinyagentos/agent_registry_store.pytinyagentos/delegation_handler.pytinyagentos/projects/invite_store.pytinyagentos/projects/project_store.pytinyagentos/routes/agent_auth_requests.pytinyagentos/routes/decisions.pytinyagentos/routes/peer.pytinyagentos/routes/project_invites.py
| async def _auto_approve_delegation( | ||
| request, | ||
| *, | ||
| contact_id: str, | ||
| agent_slug: str, | ||
| display_name: str, | ||
| granted_scopes: list[str], | ||
| denied_scopes: list[str], | ||
| project_id: str, | ||
| ) -> dict: | ||
| """Auto-approve a delegation request (dev-swarm future path). | ||
|
|
||
| Mints a project invite (kind="agent", pin_required=false) and returns | ||
| the invite_id + connection_bundle. | ||
| """ | ||
| invite_store = getattr(request.app.state, "project_invite_store", None) | ||
| if invite_store is None: | ||
| return {"status": "error", "error": "invite store not available"} | ||
|
|
||
| # The project-scoped scopes require a non-null project_id for the JWT. | ||
| project_scopes = sorted(set(granted_scopes) & _PROJECT_SCOPES) | ||
| non_project_scopes = sorted(set(granted_scopes) - _PROJECT_SCOPES) | ||
|
|
||
| try: | ||
| invite = await invite_store.mint( | ||
| project_id=project_id, | ||
| scopes=non_project_scopes + project_scopes, | ||
| approval_mode="auto", | ||
| check_interval_secs=1800, | ||
| created_by=contact_id, | ||
| metadata={ | ||
| "kind": "delegation_sponsored", | ||
| "sponsor_contact_id": contact_id, | ||
| "agent_slug": agent_slug, | ||
| "display_name": display_name, | ||
| "pin_required": False, | ||
| }, | ||
| ) | ||
| except Exception: | ||
| logger.warning( | ||
| "delegation: failed to create invite for %s / %s", | ||
| contact_id, agent_slug, exc_info=True, | ||
| ) | ||
| return {"status": "error", "error": "failed to create project invite"} | ||
|
|
||
| return { | ||
| "status": "approved", | ||
| "invite_id": invite["id"], | ||
| "agent_slug": agent_slug, | ||
| } |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
printf 'Files matching delegation / invite:\n'
git ls-files | rg '(delegation_handler|invite_store|decisions).py|test_collab_d1_delegation.py' || true
printf '\nOutline delegation_handler:\n'
if [ -f tinyagentos/delegation_handler.py ]; then
ast-grep outline tinyagentos/delegation_handler.py || true
fi
printf '\nRelevant delegation_handler lines 220-370:\n'
sed -n '220,370p' tinyagentos/delegation_handler.py 2>/dev/null || true
printf '\nInvite store mint signature/return-ish:\n'
for f in $(git ls-files | rg 'tinyagentos/.*/invite_store.py$'); do
echo "--- $f"
wc -l "$f"
rg -n "async def mint|def mint|return|invite_id|pin_required" "$f" -C 3 || true
done
printf '\nDecision route apply delegation snippet if present:\n'
for f in $(git ls-files | rg 'tinyagentos/routes/decisions.py$'); do
echo "--- $f"
rg -n "_apply_collab_delegation_grant|complete_delegation_approval" "$f" -C 8 || true
done
printf '\nTests for delegation approve auto/complete:\n'
if [ -f tests/test_collab_d1_delegation.py ]; then
wc -l tests/test_collab_d1_delegation.py
rg -n 'test_.*approve|auto|complete|invite_id|record|pin_required' tests/test_collab_d1_delegation.py -C 2 || true
fi
printf '\nSearch complete_delegation_approval callers/usages:\n'
rg -n "complete_delegation_approval|_auto_approve_delegation|invite\\[\"id\"\\]|invite\\['id'\\]" . || true
printf '\nSimple parser check for mint return shape declarations/usages:\n'
python3 - <<'PY'
from pathlib import Path
import re
for p in Path('.').glob('**/*.py'):
if any(part.startswith('.') for part in p.parts):
continue
text=p.read_text(errors='ignore')
if 'ProjectInviteStore' in text or 'async def mint' in text or 'def mint' in text:
print(p)
PYRepository: jaylfc/taOS
Length of output: 22982
🏁 Script executed:
#!/bin/bash
set -euo pipefail
printf 'process_delegation_request call path and exception handling:\n'
sed -n '107,184p' tinyagentos/delegation_handler.py 2>/dev/null || true
printf '\nDecision route _apply_collab_delegation_grant full:\n'
sed -n '424,470p' tinyagentos/routes/decisions.py 2>/dev/null || true
printf '\nProject invite routes handling connection_bundle / invite id:\n'
rg -n "connection_bundle|invite_id|pin_required|complete|auto|approve" tinyagentos/routes/project_invites.py -C 3 || true
printf '\nStatic check for invite["id"] and direct connection_bundle references in delegation handler:\n'
python3 - <<'PY'
from pathlib import Path
p=Path('tinyagentos/delegation_handler.py')
text=p.read_text()
for idx,line in enumerate(text.splitlines(),1):
if 'invite["id"]' in line or "invite['id']" in line or 'connection_bundle' in line:
print(f'{idx}: {line}')
PYRepository: jaylfc/taOS
Length of output: 18880
Fix delegation invite response keys and pass pin_required into mint().
ProjectInviteStore.mint() returns {"record": {...}, "pin": ...}, so invite["id"] in both _auto_approve_delegation() and complete_delegation_approval() raises KeyError. Auto-approval will return the wrong peer-inbox envelope, while manual approval reaches the key not found: "invite_id" warning in _apply_collab_delegation_grant() instead of delivering the approved-delegation message. Also remove "pin_required" from metadata and pass pin_required=False to mint() so the invite row is created with pin_required = 0, matching these docstrings.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@tinyagentos/delegation_handler.py` around lines 249 - 298, The delegation
approval flows use the wrong mint result shape and configure pin requirements
through metadata. Update _auto_approve_delegation and
complete_delegation_approval to read the invite ID from mint()'s returned record
and provide the expected invite_id response/envelope key, pass
pin_required=False directly to ProjectInviteStore.mint(), and remove
pin_required from the metadata payload so the invite is stored without a PIN.
|
Closing this rather than fix-forwarding it, for three reasons that compound.
No criticism of the lane: the card underspecified the ordering and let it grow. Recut as tsk- with the dependency enforced so it only dispatches after the decisions work settles, the scope pinned to delivery alone, and this exact UnboundLocalError named as a known trap. The branch stays on the remote if anyone wants the reference. |
Autonomous build of board card tsk-2wbp3f.
Files:
tinyagentos/delegation_handler.py | 537 ++++++++++++++++++++++++++++++
tinyagentos/projects/invite_store.py | 61 ++--
tinyagentos/projects/project_store.py | 58 ++++
tinyagentos/routes/agent_auth_requests.py | 10 +
tinyagentos/routes/decisions.py | 62 +++-
tinyagentos/routes/peer.py | 20 +-
tinyagentos/routes/project_invites.py | 20 ++
9 files changed, 1124 insertions(+), 48 deletions(-)
Summary by CodeRabbit
New Features
Bug Fixes