application · active

Chat

Cloudflare-native collaboration application for channels, DMs, cross-app Chat widget, meetings, guests, and remote assist.

Documentation map

  • Topolo Calendar — Public overview of the scheduling and booking application — shareable event types, availability, invitations, and calendar-safe booking lifecycle controls.
  • Topolo Chat — Public overview of the collaboration surface for channels, direct messages, meetings, guests, and remote-assist workflows.

Authority and runtime

System ID
topolo-chat
App IDs
app_topolo_chat
Owners
collaboration
Repositories
apps/TopoloChat
Hosts
https://chat.topolo.app, https://chat.stg.topolo.us, https://topolo-chat.topolo.workers.dev
Dependencies
topolo-auth, applications-packages

Security and data ownership

Risk tier
high
Tenant isolation
organization_scoped
Privacy classification
restricted
Storage
d1, durable_object, external_provider, r2
Export and deletion
implemented
Enterprise ready
no

Source-derived capability inventory

Source revisions: apps/TopoloChat@9b3181a11595534171029d26d81de7134dcc4b9b

Declared actions: 101 · API routes: 8 · UI routes: 11

{
  "id": "topolo-chat",
  "name": "Chat",
  "slug": "topolo-chat",
  "kind": "application",
  "visibility": "public",
  "repo_paths": [
    "apps/TopoloChat"
  ],
  "source_revisions": [
    {
      "source_path": "apps/TopoloChat",
      "repository": "apps/TopoloChat",
      "revision": "9b3181a11595534171029d26d81de7134dcc4b9b",
      "ref": "origin/staging"
    }
  ],
  "source_counts": {
    "source_files": 150,
    "test_files": 76,
    "test_cases": 0,
    "migration_files": 0,
    "database_tables": 0,
    "manifests": 1,
    "deploy_targets": 2,
    "actions": 101,
    "mobile_contracts": 1,
    "notifications": 6,
    "package_manifests": 2,
    "deployment_configs": 0
  },
  "manifests": [
    {
      "source_path": "apps/TopoloChat/topolo.app.json",
      "service_slug": "topolo-chat",
      "name": "topolo-chat",
      "app_id": "app_topolo_chat",
      "compatibility_date": "2026-05-01",
      "primary_target": "web",
      "environments": [
        "development",
        "production",
        "staging"
      ],
      "targets": [
        {
          "name": "api",
          "kind": "worker",
          "directory": "apps/api",
          "main": "src/index.ts",
          "worker_name": "topolo-chat-api",
          "subdomain": null,
          "healthcheck_path": "/healthz",
          "variable_names": [
            "CHAT_AUDIT_RETENTION_DAYS",
            "CHAT_MESSAGE_RETENTION_DAYS",
            "CHAT_OPERATIONAL_RETENTION_DAYS",
            "CHAT_PUBLIC_BASE_URL",
            "CLOUDFLARE_ACCOUNT_ID",
            "ENVIRONMENT",
            "REALTIMEKIT_APP_ID",
            "REALTIMEKIT_HOST_PRESET",
            "REALTIMEKIT_PARTICIPANT_PRESET",
            "TOPOLO_AGENT_URL",
            "TOPOLO_AUTH_BASE_URL",
            "TOPOLO_NOTIFY_URL"
          ],
          "secret_names": [],
          "bindings": [
            {
              "kind": "d1",
              "binding": "CHAT_CORE_DB",
              "target": null
            },
            {
              "kind": "d1",
              "binding": "CHAT_MESSAGES_DB",
              "target": null
            },
            {
              "kind": "d1",
              "binding": "CHAT_MEETINGS_DB",
              "target": null
            },
            {
              "kind": "d1",
              "binding": "CHAT_AGENT_DB",
              "target": null
            },
            {
              "kind": "r2",
              "binding": "CHAT_UPLOADS",
              "target": null
            },
            {
              "kind": "secretsStore",
              "binding": "PLATFORM_AT_REST_MASTER_ENCRYPTION_KEY_STORE",
              "target": null
            },
            {
              "kind": "secretsStore",
              "binding": "PLATFORM_AT_REST_MASTER_ENCRYPTION_KEY_PREVIOUS_STORE",
              "target": null
            },
            {
              "kind": "durableObjects",
              "binding": "WORKSPACE_REALTIME",
              "target": null
            },
            {
              "kind": "durableObjects",
              "binding": "MEETING_ROOM",
              "target": null
            },
            {
              "kind": "durableObjects",
              "binding": "REMOTE_ASSIST",
              "target": null
            }
          ]
        },
        {
          "name": "web",
          "kind": "worker",
          "directory": "apps/web",
          "main": "src/index.ts",
          "worker_name": "topolo-chat",
          "subdomain": "chat",
          "healthcheck_path": "/healthz",
          "variable_names": [
            "INSIGHTS_SITE_KEY"
          ],
          "secret_names": [],
          "bindings": [
            {
              "kind": "services",
              "binding": "API",
              "target": null
            },
            {
              "kind": "services",
              "binding": "API",
              "target": null
            },
            {
              "kind": "services",
              "binding": "API",
              "target": null
            }
          ]
        }
      ],
      "notifications": [
        "chat.call.missed",
        "chat.call.started",
        "chat.dm.message_received",
        "chat.meeting.reminder_due",
        "chat.mention.created",
        "chat.remote_assist.requested"
      ],
      "notification_contract": {
        "source_path": "topolo.notification-contracts.json",
        "role": "producer",
        "schema_version": 1,
        "owner_app_id": "app_topolo_chat",
        "events": [
          {
            "type": "chat.call.missed",
            "version": 1,
            "description": "A direct audio or video call ended without being answered.",
            "status": "published",
            "payloadSchema": {
              "type": "object",
              "required": [
                "title",
                "body",
                "object_id",
                "occurred_at"
              ],
              "properties": {
                "title": {
                  "type": "string",
                  "minLength": 1
                },
                "body": {
                  "type": "string",
                  "minLength": 1
                },
                "cta_url": {
                  "type": "string",
                  "format": "uri"
                },
                "cta_label": {
                  "type": "string"
                },
                "category": {
                  "type": "string"
                },
                "severity": {
                  "enum": [
                    "info",
                    "success",
                    "warning",
                    "critical"
                  ]
                },
                "object_type": {
                  "type": "string"
                },
                "object_id": {
                  "type": "string",
                  "minLength": 1
                },
                "occurred_at": {
                  "type": "string",
                  "format": "date-time"
                },
                "actor_id": {
                  "type": "string"
                },
                "actor_display_name": {
                  "type": "string"
                },
                "action_context": {
                  "type": "object"
                }
              },
              "additionalProperties": true
            },
            "examples": [
              {
                "title": "Missed video call",
                "body": "Ada Caller called you in Chat.",
                "object_id": "meet_123",
                "occurred_at": "2026-07-19T00:00:00.000Z"
              }
            ],
            "dataClassification": "internal",
            "recipients": {
              "modes": [
                "organization_member"
              ],
              "externalAddress": "forbidden"
            },
            "idempotency": {
              "required": true,
              "pattern": "^chat:call:missed:"
            },
            "sensitiveFields": []
          },
          {
            "type": "chat.call.started",
            "version": 1,
            "description": "A direct audio or video call started.",
            "status": "published",
            "payloadSchema": {
              "type": "object",
              "required": [
                "title",
                "body",
                "object_id",
                "occurred_at"
              ],
              "properties": {
                "title": {
                  "type": "string",
                  "minLength": 1
                },
                "body": {
                  "type": "string",
                  "minLength": 1
                },
                "surface": {
                  "enum": [
                    "notification",
                    "action"
                  ]
                },
                "action_kind": {
                  "enum": [
                    "open",
                    "review",
                    "approve",
                    "resolve",
                    "complete"
                  ]
                },
                "action_status": {
                  "type": "string"
                },
                "priority": {
                  "enum": [
                    "low",
                    "normal",
                    "high",
                    "urgent"
                  ]
                },
                "cta_url": {
                  "type": "string",
                  "format": "uri"
                },
                "cta_label": {
                  "type": "string"
                },
                "category": {
                  "type": "string"
                },
                "severity": {
                  "enum": [
                    "info",
                    "success",
                    "warning",
                    "critical"
                  ]
                },
                "object_type": {
                  "type": "string"
                },
                "object_id": {
                  "type": "string",
                  "minLength": 1
                },
                "occurred_at": {
                  "type": "string",
                  "format": "date-time"
                },
                "actor_id": {
                  "type": "string"
                },
                "actor_display_name": {
                  "type": "string"
                },
                "recipient_email": {
                  "type": "string",
                  "format": "email"
                },
                "thread_key": {
                  "type": "string"
                },
                "expires_at": {
                  "type": "string",
                  "format": "date-time"
                },
                "action_context": {
                  "type": "object"
                }
              },
              "additionalProperties": true
            },
            "examples": [
              {
                "title": "A direct audio or video call started.",
                "body": "Open the owning app to review this event.",
                "object_id": "object_123",
                "occurred_at": "2026-07-17T00:00:00.000Z"
              }
            ],
            "dataClassification": "internal",
            "recipients": {
              "modes": [
                "organization_member"
              ],
              "externalAddress": "forbidden"
            },
            "idempotency": {
              "required": true,
              "pattern": "^chat:call:"
            },
            "sensitiveFields": []
          },
          {
            "type": "chat.dm.message_received",
            "version": 1,
            "description": "A direct message was received.",
            "status": "published",
            "payloadSchema": {
              "type": "object",
              "required": [
                "title",
                "body",
                "object_id",
                "occurred_at"
              ],
              "properties": {
                "title": {
                  "type": "string",
                  "minLength": 1
                },
                "body": {
                  "type": "string",
                  "minLength": 1
                },
                "surface": {
                  "enum": [
                    "notification",
                    "action"
                  ]
                },
                "action_kind": {
                  "enum": [
                    "open",
                    "review",
                    "approve",
                    "resolve",
                    "complete"
                  ]
                },
                "action_status": {
                  "type": "string"
                },
                "priority": {
                  "enum": [
                    "low",
                    "normal",
                    "high",
                    "urgent"
                  ]
                },
                "cta_url": {
                  "type": "string",
                  "format": "uri"
                },
                "cta_label": {
                  "type": "string"
                },
                "category": {
                  "type": "string"
                },
                "severity": {
                  "enum": [
                    "info",
                    "success",
                    "warning",
                    "critical"
                  ]
                },
                "object_type": {
                  "type": "string"
                },
                "object_id": {
                  "type": "string",
                  "minLength": 1
                },
                "occurred_at": {
                  "type": "string",
                  "format": "date-time"
                },
                "actor_id": {
                  "type": "string"
                },
                "actor_display_name": {
                  "type": "string"
                },
                "recipient_email": {
                  "type": "string",
                  "format": "email"
                },
                "thread_key": {
                  "type": "string"
                },
                "expires_at": {
                  "type": "string",
                  "format": "date-time"
                },
                "action_context": {
                  "type": "object"
                }
              },
              "additionalProperties": true
            },
            "examples": [
              {
                "title": "A direct message was received.",
                "body": "Open the owning app to review this event.",
                "object_id": "object_123",
                "occurred_at": "2026-07-17T00:00:00.000Z"
              }
            ],
            "dataClassification": "internal",
            "recipients": {
              "modes": [
                "organization_member"
              ],
              "externalAddress": "forbidden"
            },
            "idempotency": {
              "required": true,
              "pattern": "^chat:dm:"
            },
            "sensitiveFields": []
          },
          {
            "type": "chat.meeting.reminder_due",
            "version": 1,
            "description": "A scheduled Chat meeting reached its configured reminder time.",
            "status": "published",
            "payloadSchema": {
              "type": "object",
              "required": [
                "title",
                "body",
                "object_id",
                "occurred_at"
              ],
              "properties": {
                "title": {
                  "type": "string",
                  "minLength": 1
                },
                "body": {
                  "type": "string",
                  "minLength": 1
                },
                "cta_url": {
                  "type": "string",
                  "format": "uri"
                },
                "cta_label": {
                  "type": "string"
                },
                "category": {
                  "type": "string"
                },
                "severity": {
                  "enum": [
                    "info",
                    "success",
                    "warning",
                    "critical"
                  ]
                },
                "object_type": {
                  "type": "string"
                },
                "object_id": {
                  "type": "string",
                  "minLength": 1
                },
                "occurred_at": {
                  "type": "string",
                  "format": "date-time"
                },
                "action_context": {
                  "type": "object"
                }
              },
              "additionalProperties": true
            },
            "examples": [
              {
                "title": "Meeting starts in 10 minutes",
                "body": "Weekly planning",
                "object_id": "meet_123",
                "occurred_at": "2026-07-19T00:00:00.000Z"
              }
            ],
            "dataClassification": "internal",
            "recipients": {
              "modes": [
                "organization_member"
              ],
              "externalAddress": "forbidden"
            },
            "idempotency": {
              "required": true,
              "pattern": "^chat:meeting-reminder:"
            },
            "sensitiveFields": []
          },
          {
            "type": "chat.mention.created",
            "version": 1,
            "description": "A persisted channel message mentioned an organization member.",
            "status": "published",
            "payloadSchema": {
              "type": "object",
              "required": [
                "title",
                "body",
                "object_id",
                "occurred_at"
              ],
              "properties": {
                "title": {
                  "type": "string",
                  "minLength": 1
                },
                "body": {
                  "type": "string",
                  "minLength": 1
                },
                "cta_url": {
                  "type": "string",
                  "format": "uri"
                },
                "cta_label": {
                  "type": "string"
                },
                "category": {
                  "type": "string"
                },
                "severity": {
                  "enum": [
                    "info",
                    "success",
                    "warning",
                    "critical"
                  ]
                },
                "object_type": {
                  "type": "string"
                },
                "object_id": {
                  "type": "string",
                  "minLength": 1
                },
                "occurred_at": {
                  "type": "string",
                  "format": "date-time"
                },
                "actor_id": {
                  "type": "string"
                },
                "actor_display_name": {
                  "type": "string"
                }
              },
              "additionalProperties": true
            },
            "examples": [
              {
                "title": "Ada mentioned you",
                "body": "@Grace can you review this?",
                "object_id": "msg_123",
                "occurred_at": "2026-07-19T00:00:00.000Z"
              }
            ],
            "dataClassification": "internal",
            "recipients": {
              "modes": [
                "organization_member"
              ],
              "externalAddress": "forbidden"
            },
            "idempotency": {
              "required": true,
              "pattern": "^chat:mention:"
            },
            "sensitiveFields": []
          },
          {
            "type": "chat.remote_assist.requested",
            "version": 1,
            "description": "A participant requested remote assist from a meeting host.",
            "status": "published",
            "payloadSchema": {
              "type": "object",
              "required": [
                "title",
                "body",
                "object_id",
                "occurred_at"
              ],
              "properties": {
                "title": {
                  "type": "string",
                  "minLength": 1
                },
                "body": {
                  "type": "string",
                  "minLength": 1
                },
                "cta_url": {
                  "type": "string",
                  "format": "uri"
                },
                "cta_label": {
                  "type": "string"
                },
                "category": {
                  "type": "string"
                },
                "severity": {
                  "enum": [
                    "info",
                    "success",
                    "warning",
                    "critical"
                  ]
                },
                "object_type": {
                  "type": "string"
                },
                "object_id": {
                  "type": "string",
                  "minLength": 1
                },
                "occurred_at": {
                  "type": "string",
                  "format": "date-time"
                },
                "actor_id": {
                  "type": "string"
                },
                "actor_display_name": {
                  "type": "string"
                },
                "action_context": {
                  "type": "object"
                }
              },
              "additionalProperties": true
            },
            "examples": [
              {
                "title": "Remote assist requested",
                "body": "Ada requested remote assist during a meeting.",
                "object_id": "assist_123",
                "occurred_at": "2026-07-19T00:00:00.000Z"
              }
            ],
            "dataClassification": "internal",
            "recipients": {
              "modes": [
                "organization_member"
              ],
              "externalAddress": "forbidden"
            },
            "idempotency": {
              "required": true,
              "pattern": "^chat:remote-assist:"
            },
            "sensitiveFields": []
          }
        ]
      },
      "actions": [
        {
          "name": "widget.get",
          "title": "Get widget summary",
          "description": "Get the TopoloOne widget summary for this service.",
          "method": "GET",
          "path": "/api/widget",
          "permission": "workspace:read",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {},
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {},
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/widget",
              "body": null
            },
            "effects": "Reads state through GET /api/widget without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "declared_unserved",
            "route_key": "GET /api/widget",
            "evidence": "No matching served route was extracted from canonical staging source."
          }
        },
        {
          "name": "widget_chat.bootstrap",
          "title": "Get cross-app Chat widget bootstrap",
          "description": "Get contacts, recent conversations, unread totals, and realtime metadata for the cross-app Chat widget.",
          "method": "GET",
          "path": "/api/widget/chat",
          "permission": "direct_messages:read",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {},
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {},
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/widget/chat",
              "body": null
            },
            "effects": "Reads state through GET /api/widget/chat without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/widget/chat",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "widget_chat.update_workspace_attention",
          "title": "Update Chat widget attention",
          "description": "Set the current user attention level and optional snooze time for one resolved Chat workspace.",
          "method": "PATCH",
          "path": "/api/widget/workspaces/{workspaceId}/attention",
          "permission": "workspace:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspaceId": {
                "type": "string",
                "minLength": 1
              },
              "attentionLevel": {
                "type": "string",
                "enum": [
                  "all",
                  "mentions",
                  "none"
                ]
              },
              "snoozedUntil": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "date-time",
                    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "required": [
              "workspaceId",
              "attentionLevel"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "workspaceId": "example",
              "attentionLevel": "all"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "PATCH",
              "path": "/api/widget/workspaces/example/attention",
              "body": {
                "workspaceId": "example",
                "attentionLevel": "all"
              }
            },
            "effects": "May change state through PATCH /api/widget/workspaces/{workspaceId}/attention. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "PATCH /api/widget/workspaces/*/attention",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "widget_chat.open_dm",
          "title": "Open cross-app Chat conversation",
          "description": "Create or open a human direct message conversation for the cross-app Chat widget.",
          "method": "POST",
          "path": "/api/widget/dms",
          "permission": "direct_messages:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "memberId": {
                "type": "string"
              },
              "type": {
                "type": "string",
                "const": "human"
              }
            },
            "required": [
              "memberId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "memberId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/widget/dms",
              "body": {
                "memberId": "example"
              }
            },
            "effects": "May change state through POST /api/widget/dms. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/widget/dms",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "widget_chat.list_messages",
          "title": "List cross-app Chat messages",
          "description": "List normalized human direct-message messages for the cross-app Chat widget.",
          "method": "GET",
          "path": "/api/widget/dms/{conversationId}/messages",
          "permission": "direct_messages:read",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "conversationId": {
                "type": "string",
                "minLength": 1
              },
              "limit": {
                "type": "integer",
                "minimum": 1,
                "maximum": 500
              },
              "before": {
                "type": "string"
              }
            },
            "required": [
              "conversationId"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by List cross-app Chat messages.",
            "additionalProperties": true
          },
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "conversationId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/widget/dms/example/messages",
              "body": null
            },
            "effects": "Reads state through GET /api/widget/dms/{conversationId}/messages without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/widget/dms/*/messages",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "widget_chat.list_channel_messages",
          "title": "List cross-app Chat channel messages",
          "description": "List normalized channel messages for the cross-app Chat widget.",
          "method": "GET",
          "path": "/api/widget/channels/{channelId}/messages",
          "permission": "messages:read",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "channelId": {
                "type": "string",
                "minLength": 1
              },
              "limit": {
                "type": "integer",
                "minimum": 1,
                "maximum": 500
              },
              "before": {
                "type": "string"
              }
            },
            "required": [
              "channelId"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by List cross-app Chat channel messages.",
            "additionalProperties": true
          },
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "channelId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/widget/channels/example/messages",
              "body": null
            },
            "effects": "Reads state through GET /api/widget/channels/{channelId}/messages without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/widget/channels/*/messages",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "widget_chat.send_dm_message",
          "title": "Send cross-app Chat direct message",
          "description": "Send a human direct-message turn from the cross-app Chat widget.",
          "method": "POST",
          "path": "/api/widget/dms/{conversationId}/messages",
          "permission": "direct_messages:write",
          "readOnly": false,
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "conversationId": {
                "type": "string",
                "minLength": 1
              },
              "body": {
                "type": "string",
                "minLength": 1
              },
              "threadParentId": {
                "type": "string",
                "minLength": 1
              },
              "thread_parent_id": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "conversationId",
              "body"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Send cross-app Chat direct message.",
            "additionalProperties": true
          },
          "destructive": false,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "conversationId": "example",
              "body": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/widget/dms/example/messages",
              "body": {
                "conversationId": "example",
                "body": "example"
              }
            },
            "effects": "May change state through POST /api/widget/dms/{conversationId}/messages. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/widget/dms/*/messages",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "widget_chat.send_channel_message",
          "title": "Send cross-app Chat channel message",
          "description": "Send a channel message turn from the cross-app Chat widget.",
          "method": "POST",
          "path": "/api/widget/channels/{channelId}/messages",
          "permission": "messages:write",
          "readOnly": false,
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "channelId": {
                "type": "string",
                "minLength": 1
              },
              "body": {
                "type": "string",
                "minLength": 1
              },
              "threadParentId": {
                "type": "string",
                "minLength": 1
              },
              "thread_parent_id": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "channelId",
              "body"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Send cross-app Chat channel message.",
            "additionalProperties": true
          },
          "destructive": false,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "channelId": "example",
              "body": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/widget/channels/example/messages",
              "body": {
                "channelId": "example",
                "body": "example"
              }
            },
            "effects": "May change state through POST /api/widget/channels/{channelId}/messages. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/widget/channels/*/messages",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "widget_chat.request_upload",
          "title": "Request cross-app Chat upload",
          "description": "Create a compact upload draft for an image, file, or voice note sent from the cross-app Chat widget.",
          "method": "POST",
          "path": "/api/widget/uploads/request",
          "permission": "direct_messages:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "fileName": {
                "type": "string",
                "minLength": 1
              },
              "contentType": {
                "type": "string",
                "minLength": 1
              },
              "sizeBytes": {
                "type": "integer",
                "minimum": 1,
                "maximum": 26214400
              }
            },
            "required": [
              "fileName",
              "contentType",
              "sizeBytes"
            ],
            "additionalProperties": false
          },
          "agentContract": {
            "upload": {
              "profile": "url-session",
              "fileNameField": "fileName",
              "contentTypeField": "contentType",
              "sizeField": "sizeBytes",
              "maxBytes": 26214400,
              "acceptedContentTypes": [
                "*/*"
              ],
              "uploadUrlPath": "upload.uploadUrl",
              "uploadMethod": "PUT"
            }
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "fileName": "example",
              "contentType": "example",
              "sizeBytes": 1
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/widget/uploads/request",
              "body": {
                "fileName": "example",
                "contentType": "example",
                "sizeBytes": 1
              }
            },
            "effects": "May change state through POST /api/widget/uploads/request. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/widget/uploads/request",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "widget_chat.upload_content",
          "title": "Upload cross-app Chat file content",
          "description": "Upload bytes for a compact widget upload draft.",
          "method": "PUT",
          "path": "/api/widget/uploads/{uploadId}/content",
          "permission": "direct_messages:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "uploadId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "uploadId"
            ],
            "additionalProperties": {}
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Upload cross-app Chat file content.",
            "additionalProperties": true
          },
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "uploadId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "PUT",
              "path": "/api/widget/uploads/example/content",
              "body": {
                "uploadId": "example"
              }
            },
            "effects": "May change state through PUT /api/widget/uploads/{uploadId}/content. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "PUT /api/widget/uploads/*/content",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "widget_chat.complete_upload",
          "title": "Complete cross-app Chat upload",
          "description": "Attach an uploaded image, file, or voice note to a human direct message from the cross-app Chat widget.",
          "method": "POST",
          "path": "/api/widget/dms/{conversationId}/uploads/complete",
          "permission": "direct_messages:write",
          "readOnly": false,
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "conversationId": {
                "type": "string",
                "minLength": 1
              },
              "uploadId": {
                "type": "string",
                "minLength": 1
              },
              "uploadIds": {
                "minItems": 1,
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1
                }
              },
              "messageBody": {
                "type": "string"
              },
              "threadParentId": {
                "type": "string",
                "minLength": 1
              },
              "thread_parent_id": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "conversationId"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Complete cross-app Chat upload.",
            "additionalProperties": true
          },
          "destructive": false,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "conversationId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/widget/dms/example/uploads/complete",
              "body": {
                "conversationId": "example"
              }
            },
            "effects": "May change state through POST /api/widget/dms/{conversationId}/uploads/complete. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/widget/dms/*/uploads/complete",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "widget_chat.complete_channel_upload",
          "title": "Complete cross-app Chat channel upload",
          "description": "Attach an uploaded image, file, or voice note to a channel message from the cross-app Chat widget.",
          "method": "POST",
          "path": "/api/widget/channels/{channelId}/uploads/complete",
          "permission": "messages:write",
          "readOnly": false,
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "channelId": {
                "type": "string",
                "minLength": 1
              },
              "uploadId": {
                "type": "string",
                "minLength": 1
              },
              "uploadIds": {
                "minItems": 1,
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1
                }
              },
              "messageBody": {
                "type": "string"
              },
              "threadParentId": {
                "type": "string",
                "minLength": 1
              },
              "thread_parent_id": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "channelId"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Complete cross-app Chat channel upload.",
            "additionalProperties": true
          },
          "destructive": false,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "channelId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/widget/channels/example/uploads/complete",
              "body": {
                "channelId": "example"
              }
            },
            "effects": "May change state through POST /api/widget/channels/{channelId}/uploads/complete. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/widget/channels/*/uploads/complete",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "widget_chat.start_call",
          "title": "Start cross-app Chat call",
          "description": "Start a voice or video call for a human direct-message conversation from the cross-app Chat widget.",
          "method": "POST",
          "path": "/api/widget/dms/{conversationId}/calls",
          "permission": "direct_messages:write",
          "readOnly": false,
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "conversationId": {
                "type": "string",
                "minLength": 1
              },
              "mode": {
                "type": "string",
                "enum": [
                  "audio",
                  "video"
                ]
              }
            },
            "required": [
              "conversationId"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Start cross-app Chat call.",
            "additionalProperties": true
          },
          "destructive": false,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "conversationId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/widget/dms/example/calls",
              "body": {
                "conversationId": "example"
              }
            },
            "effects": "May change state through POST /api/widget/dms/{conversationId}/calls. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/widget/dms/*/calls",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "widget_chat.mark_read",
          "title": "Mark cross-app Chat conversation read",
          "description": "Mark a cross-app Chat human direct-message conversation read.",
          "method": "POST",
          "path": "/api/widget/dms/{conversationId}/read",
          "permission": "direct_messages:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "conversationId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "conversationId"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Mark cross-app Chat conversation read.",
            "additionalProperties": true
          },
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "conversationId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/widget/dms/example/read",
              "body": {
                "conversationId": "example"
              }
            },
            "effects": "May change state through POST /api/widget/dms/{conversationId}/read. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/widget/dms/*/read",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "widget_chat.mark_channel_read",
          "title": "Mark cross-app Chat channel read",
          "description": "Mark a cross-app Chat channel conversation read.",
          "method": "POST",
          "path": "/api/widget/channels/{channelId}/read",
          "permission": "messages:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "channelId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "channelId"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Mark cross-app Chat channel read.",
            "additionalProperties": true
          },
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "channelId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/widget/channels/example/read",
              "body": {
                "channelId": "example"
              }
            },
            "effects": "May change state through POST /api/widget/channels/{channelId}/read. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/widget/channels/*/read",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "workspace.bootstrap",
          "title": "Get workspace bootstrap",
          "description": "Get the signed workspace bootstrap payload for this service.",
          "method": "GET",
          "path": "/api/bootstrap",
          "permission": "workspace:read",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {},
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {},
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/bootstrap",
              "body": null
            },
            "effects": "Reads state through GET /api/bootstrap without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/bootstrap",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "privacy.export",
          "title": "Export workspace data",
          "description": "Export the verified workspace's Chat records and protected object inventory.",
          "method": "GET",
          "path": "/api/privacy/export",
          "permission": "workspace:read",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {},
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {},
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/privacy/export",
              "body": null
            },
            "effects": "Reads state through GET /api/privacy/export without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/privacy/export",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "privacy.protection_canary",
          "title": "Inspect workspace data protection",
          "description": "Inspect the verified workspace for remaining unprotected Chat fields and objects. Platform super administrators may name a legacy workspace directly.",
          "method": "GET",
          "path": "/api/privacy/protection/canary",
          "permission": "workspace:read",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "targetWorkspaceId": {
                "type": "string",
                "minLength": 1
              }
            },
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "targetWorkspaceId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/privacy/protection/canary",
              "body": null
            },
            "effects": "Reads state through GET /api/privacy/protection/canary without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/privacy/protection/canary",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "privacy.erase",
          "title": "Erase workspace Chat data",
          "description": "Permanently erase all Chat database rows and protected objects for the verified workspace.",
          "method": "DELETE",
          "path": "/api/privacy/workspace",
          "permission": "workspace:delete",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {},
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": true,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {},
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "DELETE",
              "path": "/api/privacy/workspace",
              "body": null
            },
            "effects": "May change state through DELETE /api/privacy/workspace. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "DELETE /api/privacy/workspace",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "workspaces.delete",
          "title": "Delete Workspace",
          "description": "Delete an empty non-default Topolo Chat workspace.",
          "method": "DELETE",
          "path": "/api/chat/workspaces/{workspaceId}",
          "permission": "workspace:delete",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspaceId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "workspaceId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": true,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "workspaceId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "DELETE",
              "path": "/api/chat/workspaces/example",
              "body": null
            },
            "effects": "May change state through DELETE /api/chat/workspaces/{workspaceId}. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "DELETE /api/chat/workspaces/*",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "channels.list",
          "title": "List channels",
          "description": "List workspace channels.",
          "method": "GET",
          "path": "/api/channels",
          "permission": "channels:read",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {},
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by List channels.",
            "additionalProperties": true
          },
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {},
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/channels",
              "body": null
            },
            "effects": "Reads state through GET /api/channels without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/channels",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "channels.create",
          "title": "Create channel",
          "description": "Create a workspace channel.",
          "method": "POST",
          "path": "/api/channels",
          "permission": "channels:write",
          "readOnly": false,
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "minLength": 1
              },
              "topic": {
                "type": "string",
                "minLength": 1
              },
              "isPrivate": {
                "type": "boolean"
              },
              "memberIds": {
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1
                }
              }
            },
            "required": [
              "name",
              "topic"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Create channel.",
            "additionalProperties": true
          },
          "destructive": false,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "name": "example",
              "topic": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/channels",
              "body": {
                "name": "example",
                "topic": "example"
              }
            },
            "effects": "May change state through POST /api/channels. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/channels",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "channel_messages.list",
          "title": "List channel messages",
          "description": "List messages in a channel.",
          "method": "GET",
          "path": "/api/channels/{channelId}/messages",
          "permission": "messages:read",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "channelId": {
                "type": "string",
                "minLength": 1
              },
              "limit": {
                "type": "integer",
                "minimum": 1,
                "maximum": 500
              },
              "before": {
                "type": "string"
              }
            },
            "required": [
              "channelId"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by List channel messages.",
            "additionalProperties": true
          },
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "channelId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/channels/example/messages",
              "body": null
            },
            "effects": "Reads state through GET /api/channels/{channelId}/messages without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/channels/*/messages",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "channel_messages.send",
          "title": "Send channel message",
          "description": "Send a message to a channel.",
          "method": "POST",
          "path": "/api/channels/{channelId}/messages",
          "permission": "messages:write",
          "readOnly": false,
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "channelId": {
                "type": "string",
                "minLength": 1
              },
              "body": {
                "type": "string",
                "minLength": 1
              },
              "threadParentId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "channelId",
              "body"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Send channel message.",
            "additionalProperties": true
          },
          "destructive": false,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "channelId": "example",
              "body": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/channels/example/messages",
              "body": {
                "channelId": "example",
                "body": "example"
              }
            },
            "effects": "May change state through POST /api/channels/{channelId}/messages. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/channels/*/messages",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "direct_messages.list",
          "title": "List direct messages",
          "description": "List direct-message conversations.",
          "method": "GET",
          "path": "/api/dms",
          "permission": "direct_messages:read",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {},
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by List direct messages.",
            "additionalProperties": true
          },
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {},
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/dms",
              "body": null
            },
            "effects": "Reads state through GET /api/dms without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/dms",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "direct_messages.create",
          "title": "Create direct message",
          "description": "Create a direct-message conversation.",
          "method": "POST",
          "path": "/api/dms",
          "permission": "direct_messages:write",
          "readOnly": false,
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "memberId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "memberId"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Create direct message.",
            "additionalProperties": true
          },
          "destructive": false,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "memberId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/dms",
              "body": {
                "memberId": "example"
              }
            },
            "effects": "May change state through POST /api/dms. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/dms",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "meetings.list",
          "title": "List meetings",
          "description": "List meetings.",
          "method": "GET",
          "path": "/api/meetings",
          "permission": "meetings:read",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {},
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by List meetings.",
            "additionalProperties": true
          },
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {},
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/meetings",
              "body": null
            },
            "effects": "Reads state through GET /api/meetings without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/meetings",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "meetings.create",
          "title": "Create meeting",
          "description": "Create a meeting.",
          "method": "POST",
          "path": "/api/meetings",
          "permission": "meetings:write",
          "readOnly": false,
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "title": {
                "type": "string",
                "minLength": 1
              },
              "description": {
                "type": "string",
                "minLength": 1
              },
              "sourceKind": {
                "type": "string",
                "enum": [
                  "channel",
                  "dm",
                  "workspace"
                ]
              },
              "sourceId": {
                "type": "string",
                "minLength": 1
              },
              "startsAt": {
                "type": "string"
              },
              "durationMinutes": {
                "type": "number"
              },
              "reminderMinutes": {
                "type": "number"
              },
              "recurrenceRule": {
                "type": "string",
                "enum": [
                  "none",
                  "daily",
                  "weekdays",
                  "weekly"
                ]
              },
              "startNow": {
                "type": "boolean"
              }
            },
            "required": [
              "title",
              "description",
              "sourceKind",
              "sourceId"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Create meeting.",
            "additionalProperties": true
          },
          "destructive": false,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "title": "example",
              "description": "example",
              "sourceKind": "channel",
              "sourceId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/meetings",
              "body": {
                "title": "example",
                "description": "example",
                "sourceKind": "channel",
                "sourceId": "example"
              }
            },
            "effects": "May change state through POST /api/meetings. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/meetings",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "meetings.end",
          "title": "End meeting",
          "description": "End a meeting.",
          "method": "POST",
          "path": "/api/meetings/{meetingId}/end",
          "permission": "meetings:write",
          "readOnly": false,
          "destructive": true,
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "meetingId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "meetingId"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by End meeting.",
            "additionalProperties": true
          },
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "meetingId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/meetings/example/end",
              "body": {
                "meetingId": "example"
              }
            },
            "effects": "May change state through POST /api/meetings/{meetingId}/end. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/meetings/*/end",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "search.query",
          "title": "Search chat",
          "description": "Search channels, messages, and meetings.",
          "method": "GET",
          "path": "/api/search",
          "permission": "search:read",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "q": {
                "type": "string"
              },
              "scope": {
                "type": "string",
                "enum": [
                  "messages",
                  "files",
                  "people",
                  "channels"
                ]
              },
              "conversationKind": {
                "type": "string",
                "enum": [
                  "channel",
                  "dm"
                ]
              },
              "conversationId": {
                "type": "string"
              }
            },
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Search chat.",
            "additionalProperties": true
          },
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "q": "example",
              "scope": "messages",
              "conversationKind": "channel"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/search",
              "body": null
            },
            "effects": "Reads state through GET /api/search without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/search",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "uploads.request",
          "title": "Request upload",
          "description": "Request a chat upload slot.",
          "method": "POST",
          "path": "/api/uploads/request",
          "permission": "uploads:write",
          "readOnly": false,
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "fileName": {
                "type": "string",
                "minLength": 1
              },
              "contentType": {
                "type": "string",
                "minLength": 1
              },
              "sizeBytes": {
                "type": "number",
                "exclusiveMinimum": 0,
                "maximum": 26214400
              }
            },
            "required": [
              "fileName",
              "contentType",
              "sizeBytes"
            ],
            "additionalProperties": false
          },
          "agentContract": {
            "upload": {
              "profile": "url-session",
              "fileNameField": "fileName",
              "contentTypeField": "contentType",
              "sizeField": "sizeBytes",
              "maxBytes": 26214400,
              "acceptedContentTypes": [
                "*/*"
              ],
              "uploadUrlPath": "upload.uploadUrl",
              "uploadMethod": "PUT",
              "complete": {
                "actionId": "app_topolo_chat.uploads.complete",
                "inputField": "uploadId",
                "responsePath": "upload.id"
              }
            }
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Request upload.",
            "additionalProperties": true
          },
          "destructive": false,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "fileName": "example",
              "contentType": "example",
              "sizeBytes": 1
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/uploads/request",
              "body": {
                "fileName": "example",
                "contentType": "example",
                "sizeBytes": 1
              }
            },
            "effects": "May change state through POST /api/uploads/request. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/uploads/request",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "agent_personas.list",
          "title": "List agent personas",
          "description": "List the workspace's TopoloAgent AI personas available to surface in Chat. Proxies to the Topolo Agent persona host.",
          "method": "GET",
          "path": "/api/agent-personas",
          "permission": "workspace:read",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {},
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {},
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/agent-personas",
              "body": null
            },
            "effects": "Reads state through GET /api/agent-personas without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/agent-personas",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "agent_personas.send_message",
          "title": "Message an agent persona",
          "description": "Send a message to a TopoloAgent persona on behalf of the acting user and receive the persona reply. Proxies to the Topolo Agent dual-identity session invoke surface.",
          "method": "POST",
          "path": "/api/agent-personas/{personaId}/messages",
          "permission": "workspace:write",
          "readOnly": false,
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "personaId": {
                "type": "string",
                "minLength": 1
              },
              "message": {
                "type": "string"
              },
              "threadId": {
                "type": "string"
              },
              "type": {
                "type": "string",
                "enum": [
                  "message",
                  "approve"
                ]
              },
              "approvalId": {
                "type": "string"
              },
              "decision": {
                "type": "string"
              }
            },
            "required": [
              "personaId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "personaId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/agent-personas/example/messages",
              "body": {
                "personaId": "example"
              }
            },
            "effects": "May change state through POST /api/agent-personas/{personaId}/messages. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/agent-personas/*/messages",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "presence.get",
          "title": "Presence Get",
          "description": "Execute Presence Get in Topolo Chat.",
          "method": "GET",
          "path": "/api/widget/presence",
          "permission": "workspace:read",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {},
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {},
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/widget/presence",
              "body": null
            },
            "effects": "Reads state through GET /api/widget/presence without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/widget/presence",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "presence.update",
          "title": "Presence Update",
          "description": "Execute Presence Update in Topolo Chat.",
          "method": "POST",
          "path": "/api/widget/presence",
          "permission": "workspace:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "status": {
                "type": "string",
                "enum": [
                  "available",
                  "busy",
                  "do_not_disturb",
                  "be_right_back",
                  "away",
                  "offline"
                ]
              }
            },
            "required": [
              "status"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "status": "available"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/widget/presence",
              "body": {
                "status": "available"
              }
            },
            "effects": "May change state through POST /api/widget/presence. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/widget/presence",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "calls.join",
          "title": "Calls Join",
          "description": "Execute Calls Join in Topolo Chat.",
          "method": "POST",
          "path": "/api/widget/dms/{conversationId}/calls/{callId}/join",
          "permission": "direct_messages:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "conversationId": {
                "type": "string",
                "minLength": 1
              },
              "callId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "conversationId",
              "callId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "conversationId": "example",
              "callId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/widget/dms/example/calls/example/join",
              "body": {
                "conversationId": "example",
                "callId": "example"
              }
            },
            "effects": "May change state through POST /api/widget/dms/{conversationId}/calls/{callId}/join. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/widget/dms/*/calls/*/join",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "calls.end",
          "title": "Calls End",
          "description": "Execute Calls End in Topolo Chat.",
          "method": "POST",
          "path": "/api/widget/dms/{conversationId}/calls/{callId}/end",
          "permission": "direct_messages:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "conversationId": {
                "type": "string",
                "minLength": 1
              },
              "callId": {
                "type": "string",
                "minLength": 1
              },
              "reason": {
                "type": "string",
                "enum": [
                  "no_answer",
                  "missed",
                  "declined"
                ]
              },
              "mode": {
                "type": "string",
                "enum": [
                  "audio",
                  "video"
                ]
              }
            },
            "required": [
              "conversationId",
              "callId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": true,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "conversationId": "example",
              "callId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/widget/dms/example/calls/example/end",
              "body": {
                "conversationId": "example",
                "callId": "example"
              }
            },
            "effects": "May change state through POST /api/widget/dms/{conversationId}/calls/{callId}/end. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/widget/dms/*/calls/*/end",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "channels.update",
          "title": "Channels Update",
          "description": "Execute Channels Update in Topolo Chat.",
          "method": "POST",
          "path": "/api/channels/{channelId}",
          "permission": "channels:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "channelId": {
                "type": "string",
                "minLength": 1
              },
              "name": {
                "type": "string",
                "minLength": 1
              },
              "topic": {
                "type": "string",
                "minLength": 1
              },
              "isPrivate": {
                "type": "boolean"
              }
            },
            "required": [
              "channelId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "channelId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/channels/example",
              "body": {
                "channelId": "example"
              }
            },
            "effects": "May change state through POST /api/channels/{channelId}. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/channels/*",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "channels.archive",
          "title": "Channels Archive",
          "description": "Execute Channels Archive in Topolo Chat.",
          "method": "POST",
          "path": "/api/channels/{channelId}/archive",
          "permission": "channels:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "channelId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "channelId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "channelId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/channels/example/archive",
              "body": {
                "channelId": "example"
              }
            },
            "effects": "May change state through POST /api/channels/{channelId}/archive. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/channels/*/archive",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "channels.delete",
          "title": "Channels Delete",
          "description": "Execute Channels Delete in Topolo Chat.",
          "method": "DELETE",
          "path": "/api/channels/{channelId}",
          "permission": "channels:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "channelId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "channelId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": true,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "channelId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "DELETE",
              "path": "/api/channels/example",
              "body": null
            },
            "effects": "May change state through DELETE /api/channels/{channelId}. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "DELETE /api/channels/*",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "channel_messages.thread",
          "title": "Channel Messages Thread",
          "description": "Execute Channel Messages Thread in Topolo Chat.",
          "method": "GET",
          "path": "/api/channels/{channelId}/messages/{messageId}/thread",
          "permission": "messages:read",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "channelId": {
                "type": "string",
                "minLength": 1
              },
              "messageId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "channelId",
              "messageId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "channelId": "example",
              "messageId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/channels/example/messages/example/thread",
              "body": null
            },
            "effects": "Reads state through GET /api/channels/{channelId}/messages/{messageId}/thread without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/channels/*/messages/*/thread",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "channel_messages.forward",
          "title": "Channel Messages Forward",
          "description": "Execute Channel Messages Forward in Topolo Chat.",
          "method": "POST",
          "path": "/api/channels/{channelId}/messages/forward",
          "permission": "messages:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "channelId": {
                "type": "string",
                "minLength": 1
              },
              "sourceKind": {
                "type": "string",
                "enum": [
                  "channel",
                  "dm"
                ]
              },
              "sourceConversationId": {
                "type": "string",
                "minLength": 1
              },
              "sourceMessageId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "channelId",
              "sourceKind",
              "sourceConversationId",
              "sourceMessageId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "channelId": "example",
              "sourceKind": "channel",
              "sourceConversationId": "example",
              "sourceMessageId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/channels/example/messages/forward",
              "body": {
                "channelId": "example",
                "sourceKind": "channel",
                "sourceConversationId": "example",
                "sourceMessageId": "example"
              }
            },
            "effects": "May change state through POST /api/channels/{channelId}/messages/forward. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/channels/*/messages/forward",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "channel_messages.save",
          "title": "Channel Messages Save",
          "description": "Execute Channel Messages Save in Topolo Chat.",
          "method": "POST",
          "path": "/api/channels/{channelId}/messages/{messageId}/save",
          "permission": "messages:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "channelId": {
                "type": "string",
                "minLength": 1
              },
              "messageId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "channelId",
              "messageId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "channelId": "example",
              "messageId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/channels/example/messages/example/save",
              "body": {
                "channelId": "example",
                "messageId": "example"
              }
            },
            "effects": "May change state through POST /api/channels/{channelId}/messages/{messageId}/save. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/channels/*/messages/*/save",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "channel_messages.update",
          "title": "Channel Messages Update",
          "description": "Execute Channel Messages Update in Topolo Chat.",
          "method": "POST",
          "path": "/api/channels/{channelId}/messages/{messageId}/update",
          "permission": "messages:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "channelId": {
                "type": "string",
                "minLength": 1
              },
              "messageId": {
                "type": "string",
                "minLength": 1
              },
              "body": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "channelId",
              "messageId",
              "body"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "channelId": "example",
              "messageId": "example",
              "body": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/channels/example/messages/example/update",
              "body": {
                "channelId": "example",
                "messageId": "example",
                "body": "example"
              }
            },
            "effects": "May change state through POST /api/channels/{channelId}/messages/{messageId}/update. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/channels/*/messages/*/update",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "channel_messages.delete",
          "title": "Channel Messages Delete",
          "description": "Execute Channel Messages Delete in Topolo Chat.",
          "method": "POST",
          "path": "/api/channels/{channelId}/messages/{messageId}/delete",
          "permission": "messages:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "channelId": {
                "type": "string",
                "minLength": 1
              },
              "messageId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "channelId",
              "messageId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": true,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "channelId": "example",
              "messageId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/channels/example/messages/example/delete",
              "body": {
                "channelId": "example",
                "messageId": "example"
              }
            },
            "effects": "May change state through POST /api/channels/{channelId}/messages/{messageId}/delete. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/channels/*/messages/*/delete",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "channel_messages.react",
          "title": "Channel Messages React",
          "description": "Execute Channel Messages React in Topolo Chat.",
          "method": "POST",
          "path": "/api/channels/{channelId}/messages/{messageId}/reactions",
          "permission": "messages:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "channelId": {
                "type": "string",
                "minLength": 1
              },
              "messageId": {
                "type": "string",
                "minLength": 1
              },
              "emoji": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "channelId",
              "messageId",
              "emoji"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "channelId": "example",
              "messageId": "example",
              "emoji": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/channels/example/messages/example/reactions",
              "body": {
                "channelId": "example",
                "messageId": "example",
                "emoji": "example"
              }
            },
            "effects": "May change state through POST /api/channels/{channelId}/messages/{messageId}/reactions. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/channels/*/messages/*/reactions",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "channel_messages.pin",
          "title": "Channel Messages Pin",
          "description": "Execute Channel Messages Pin in Topolo Chat.",
          "method": "POST",
          "path": "/api/channels/{channelId}/messages/{messageId}/pin",
          "permission": "messages:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "channelId": {
                "type": "string",
                "minLength": 1
              },
              "messageId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "channelId",
              "messageId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "channelId": "example",
              "messageId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/channels/example/messages/example/pin",
              "body": {
                "channelId": "example",
                "messageId": "example"
              }
            },
            "effects": "May change state through POST /api/channels/{channelId}/messages/{messageId}/pin. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/channels/*/messages/*/pin",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "channel_messages.mark_unread",
          "title": "Channel Messages Mark Unread",
          "description": "Execute Channel Messages Mark Unread in Topolo Chat.",
          "method": "POST",
          "path": "/api/channels/{channelId}/messages/{messageId}/unread",
          "permission": "messages:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "channelId": {
                "type": "string",
                "minLength": 1
              },
              "messageId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "channelId",
              "messageId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "channelId": "example",
              "messageId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/channels/example/messages/example/unread",
              "body": {
                "channelId": "example",
                "messageId": "example"
              }
            },
            "effects": "May change state through POST /api/channels/{channelId}/messages/{messageId}/unread. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/channels/*/messages/*/unread",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "channels.mark_read",
          "title": "Channels Mark Read",
          "description": "Execute Channels Mark Read in Topolo Chat.",
          "method": "POST",
          "path": "/api/channels/{channelId}/read",
          "permission": "messages:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "channelId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "channelId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "channelId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/channels/example/read",
              "body": {
                "channelId": "example"
              }
            },
            "effects": "May change state through POST /api/channels/{channelId}/read. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/channels/*/read",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "channels.mute",
          "title": "Channels Mute",
          "description": "Execute Channels Mute in Topolo Chat.",
          "method": "POST",
          "path": "/api/channels/{channelId}/mute",
          "permission": "messages:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "channelId": {
                "type": "string",
                "minLength": 1
              },
              "muted": {
                "type": "boolean"
              }
            },
            "required": [
              "channelId",
              "muted"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "channelId": "example",
              "muted": true
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/channels/example/mute",
              "body": {
                "channelId": "example",
                "muted": true
              }
            },
            "effects": "May change state through POST /api/channels/{channelId}/mute. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/channels/*/mute",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "direct_messages.manage",
          "title": "Direct Messages Manage",
          "description": "Execute Direct Messages Manage in Topolo Chat.",
          "method": "GET",
          "path": "/api/dms/manage",
          "permission": "direct_messages:read",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {},
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {},
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/dms/manage",
              "body": null
            },
            "effects": "Reads state through GET /api/dms/manage without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/dms/manage",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "direct_messages.messages",
          "title": "Direct Messages Messages",
          "description": "Execute Direct Messages Messages in Topolo Chat.",
          "method": "GET",
          "path": "/api/dms/{conversationId}/messages",
          "permission": "direct_messages:read",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "conversationId": {
                "type": "string",
                "minLength": 1
              },
              "limit": {
                "type": "integer",
                "minimum": 1,
                "maximum": 500
              },
              "before": {
                "type": "string"
              }
            },
            "required": [
              "conversationId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "conversationId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/dms/example/messages",
              "body": null
            },
            "effects": "Reads state through GET /api/dms/{conversationId}/messages without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/dms/*/messages",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "direct_messages.thread",
          "title": "Direct Messages Thread",
          "description": "Execute Direct Messages Thread in Topolo Chat.",
          "method": "GET",
          "path": "/api/dms/{conversationId}/messages/{messageId}/thread",
          "permission": "direct_messages:read",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "conversationId": {
                "type": "string",
                "minLength": 1
              },
              "messageId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "conversationId",
              "messageId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "conversationId": "example",
              "messageId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/dms/example/messages/example/thread",
              "body": null
            },
            "effects": "Reads state through GET /api/dms/{conversationId}/messages/{messageId}/thread without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/dms/*/messages/*/thread",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "direct_messages.forward",
          "title": "Direct Messages Forward",
          "description": "Execute Direct Messages Forward in Topolo Chat.",
          "method": "POST",
          "path": "/api/dms/{conversationId}/messages/forward",
          "permission": "direct_messages:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "conversationId": {
                "type": "string",
                "minLength": 1
              },
              "sourceKind": {
                "type": "string",
                "enum": [
                  "channel",
                  "dm"
                ]
              },
              "sourceConversationId": {
                "type": "string",
                "minLength": 1
              },
              "sourceMessageId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "conversationId",
              "sourceKind",
              "sourceConversationId",
              "sourceMessageId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "conversationId": "example",
              "sourceKind": "channel",
              "sourceConversationId": "example",
              "sourceMessageId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/dms/example/messages/forward",
              "body": {
                "conversationId": "example",
                "sourceKind": "channel",
                "sourceConversationId": "example",
                "sourceMessageId": "example"
              }
            },
            "effects": "May change state through POST /api/dms/{conversationId}/messages/forward. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/dms/*/messages/forward",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "direct_messages.save",
          "title": "Direct Messages Save",
          "description": "Execute Direct Messages Save in Topolo Chat.",
          "method": "POST",
          "path": "/api/dms/{conversationId}/messages/{messageId}/save",
          "permission": "direct_messages:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "conversationId": {
                "type": "string",
                "minLength": 1
              },
              "messageId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "conversationId",
              "messageId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "conversationId": "example",
              "messageId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/dms/example/messages/example/save",
              "body": {
                "conversationId": "example",
                "messageId": "example"
              }
            },
            "effects": "May change state through POST /api/dms/{conversationId}/messages/{messageId}/save. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/dms/*/messages/*/save",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "direct_messages.send",
          "title": "Direct Messages Send",
          "description": "Execute Direct Messages Send in Topolo Chat.",
          "method": "POST",
          "path": "/api/dms/{conversationId}/messages",
          "permission": "direct_messages:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "conversationId": {
                "type": "string",
                "minLength": 1
              },
              "body": {
                "type": "string",
                "minLength": 1
              },
              "threadParentId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "conversationId",
              "body"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "conversationId": "example",
              "body": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/dms/example/messages",
              "body": {
                "conversationId": "example",
                "body": "example"
              }
            },
            "effects": "May change state through POST /api/dms/{conversationId}/messages. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/dms/*/messages",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "direct_messages.update",
          "title": "Direct Messages Update",
          "description": "Execute Direct Messages Update in Topolo Chat.",
          "method": "POST",
          "path": "/api/dms/{conversationId}/messages/{messageId}/update",
          "permission": "direct_messages:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "conversationId": {
                "type": "string",
                "minLength": 1
              },
              "messageId": {
                "type": "string",
                "minLength": 1
              },
              "body": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "conversationId",
              "messageId",
              "body"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "conversationId": "example",
              "messageId": "example",
              "body": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/dms/example/messages/example/update",
              "body": {
                "conversationId": "example",
                "messageId": "example",
                "body": "example"
              }
            },
            "effects": "May change state through POST /api/dms/{conversationId}/messages/{messageId}/update. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/dms/*/messages/*/update",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "direct_messages.delete",
          "title": "Direct Messages Delete",
          "description": "Execute Direct Messages Delete in Topolo Chat.",
          "method": "POST",
          "path": "/api/dms/{conversationId}/messages/{messageId}/delete",
          "permission": "direct_messages:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "conversationId": {
                "type": "string",
                "minLength": 1
              },
              "messageId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "conversationId",
              "messageId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": true,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "conversationId": "example",
              "messageId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/dms/example/messages/example/delete",
              "body": {
                "conversationId": "example",
                "messageId": "example"
              }
            },
            "effects": "May change state through POST /api/dms/{conversationId}/messages/{messageId}/delete. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/dms/*/messages/*/delete",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "direct_messages.react",
          "title": "Direct Messages React",
          "description": "Execute Direct Messages React in Topolo Chat.",
          "method": "POST",
          "path": "/api/dms/{conversationId}/messages/{messageId}/reactions",
          "permission": "direct_messages:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "conversationId": {
                "type": "string",
                "minLength": 1
              },
              "messageId": {
                "type": "string",
                "minLength": 1
              },
              "emoji": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "conversationId",
              "messageId",
              "emoji"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "conversationId": "example",
              "messageId": "example",
              "emoji": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/dms/example/messages/example/reactions",
              "body": {
                "conversationId": "example",
                "messageId": "example",
                "emoji": "example"
              }
            },
            "effects": "May change state through POST /api/dms/{conversationId}/messages/{messageId}/reactions. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/dms/*/messages/*/reactions",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "direct_messages.mark_unread",
          "title": "Direct Messages Mark Unread",
          "description": "Execute Direct Messages Mark Unread in Topolo Chat.",
          "method": "POST",
          "path": "/api/dms/{conversationId}/messages/{messageId}/unread",
          "permission": "direct_messages:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "conversationId": {
                "type": "string",
                "minLength": 1
              },
              "messageId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "conversationId",
              "messageId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "conversationId": "example",
              "messageId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/dms/example/messages/example/unread",
              "body": {
                "conversationId": "example",
                "messageId": "example"
              }
            },
            "effects": "May change state through POST /api/dms/{conversationId}/messages/{messageId}/unread. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/dms/*/messages/*/unread",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "direct_messages.mark_read",
          "title": "Direct Messages Mark Read",
          "description": "Execute Direct Messages Mark Read in Topolo Chat.",
          "method": "POST",
          "path": "/api/dms/{conversationId}/read",
          "permission": "direct_messages:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "conversationId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "conversationId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "conversationId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/dms/example/read",
              "body": {
                "conversationId": "example"
              }
            },
            "effects": "May change state through POST /api/dms/{conversationId}/read. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/dms/*/read",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "direct_messages.mute",
          "title": "Direct Messages Mute",
          "description": "Execute Direct Messages Mute in Topolo Chat.",
          "method": "POST",
          "path": "/api/dms/{conversationId}/mute",
          "permission": "direct_messages:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "conversationId": {
                "type": "string",
                "minLength": 1
              },
              "muted": {
                "type": "boolean"
              }
            },
            "required": [
              "conversationId",
              "muted"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "conversationId": "example",
              "muted": true
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/dms/example/mute",
              "body": {
                "conversationId": "example",
                "muted": true
              }
            },
            "effects": "May change state through POST /api/dms/{conversationId}/mute. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/dms/*/mute",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "direct_messages.archive",
          "title": "Direct Messages Archive",
          "description": "Execute Direct Messages Archive in Topolo Chat.",
          "method": "POST",
          "path": "/api/dms/{conversationId}/archive",
          "permission": "direct_messages:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "conversationId": {
                "type": "string",
                "minLength": 1
              },
              "archived": {
                "type": "boolean"
              }
            },
            "required": [
              "conversationId",
              "archived"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "conversationId": "example",
              "archived": true
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/dms/example/archive",
              "body": {
                "conversationId": "example",
                "archived": true
              }
            },
            "effects": "May change state through POST /api/dms/{conversationId}/archive. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/dms/*/archive",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "audit_events.list",
          "title": "Audit Events List",
          "description": "Execute Audit Events List in Topolo Chat.",
          "method": "GET",
          "path": "/api/audit-events",
          "permission": "audit:read",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {},
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {},
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/audit-events",
              "body": null
            },
            "effects": "Reads state through GET /api/audit-events without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/audit-events",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "files.download",
          "title": "Files Download",
          "description": "Execute Files Download in Topolo Chat.",
          "method": "GET",
          "path": "/api/files/{fileKey}",
          "permission": "messages:read",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "fileKey": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "fileKey"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "fileKey": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/files/example",
              "body": null
            },
            "effects": "Reads state through GET /api/files/{fileKey} without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/files/*",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "meetings.get",
          "title": "Meetings Get",
          "description": "Execute Meetings Get in Topolo Chat.",
          "method": "GET",
          "path": "/api/meetings/{meetingId}",
          "permission": "meetings:read",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "meetingId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "meetingId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "meetingId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/meetings/example",
              "body": null
            },
            "effects": "Reads state through GET /api/meetings/{meetingId} without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/meetings/*",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "meeting_messages.list",
          "title": "Meeting Messages List",
          "description": "Execute Meeting Messages List in Topolo Chat.",
          "method": "GET",
          "path": "/api/meetings/{meetingId}/messages",
          "permission": "meetings:read",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "meetingId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "meetingId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "meetingId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/meetings/example/messages",
              "body": null
            },
            "effects": "Reads state through GET /api/meetings/{meetingId}/messages without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/meetings/*/messages",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "meeting_messages.send",
          "title": "Meeting Messages Send",
          "description": "Execute Meeting Messages Send in Topolo Chat.",
          "method": "POST",
          "path": "/api/meetings/{meetingId}/messages",
          "permission": "meetings:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "meetingId": {
                "type": "string",
                "minLength": 1
              },
              "body": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "meetingId",
              "body"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "meetingId": "example",
              "body": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/meetings/example/messages",
              "body": {
                "meetingId": "example",
                "body": "example"
              }
            },
            "effects": "May change state through POST /api/meetings/{meetingId}/messages. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/meetings/*/messages",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "meeting_messages.react",
          "title": "Meeting Messages React",
          "description": "Execute Meeting Messages React in Topolo Chat.",
          "method": "POST",
          "path": "/api/meetings/{meetingId}/messages/{messageId}/reactions",
          "permission": "meetings:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "meetingId": {
                "type": "string",
                "minLength": 1
              },
              "messageId": {
                "type": "string",
                "minLength": 1
              },
              "emoji": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "meetingId",
              "messageId",
              "emoji"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "meetingId": "example",
              "messageId": "example",
              "emoji": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/meetings/example/messages/example/reactions",
              "body": {
                "meetingId": "example",
                "messageId": "example",
                "emoji": "example"
              }
            },
            "effects": "May change state through POST /api/meetings/{meetingId}/messages/{messageId}/reactions. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/meetings/*/messages/*/reactions",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "meeting_polls.list",
          "title": "Meeting Polls List",
          "description": "Execute Meeting Polls List in Topolo Chat.",
          "method": "GET",
          "path": "/api/meetings/{meetingId}/polls",
          "permission": "meetings:read",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "meetingId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "meetingId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "meetingId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/meetings/example/polls",
              "body": null
            },
            "effects": "Reads state through GET /api/meetings/{meetingId}/polls without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/meetings/*/polls",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "meeting_polls.create",
          "title": "Meeting Polls Create",
          "description": "Execute Meeting Polls Create in Topolo Chat.",
          "method": "POST",
          "path": "/api/meetings/{meetingId}/polls",
          "permission": "meetings:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "meetingId": {
                "type": "string",
                "minLength": 1
              },
              "question": {
                "type": "string",
                "minLength": 1
              },
              "options": {
                "minItems": 2,
                "maxItems": 20,
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1
                }
              }
            },
            "required": [
              "meetingId",
              "question",
              "options"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "meetingId": "example",
              "question": "example",
              "options": [
                "example",
                "example"
              ]
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/meetings/example/polls",
              "body": {
                "meetingId": "example",
                "question": "example",
                "options": [
                  "example",
                  "example"
                ]
              }
            },
            "effects": "May change state through POST /api/meetings/{meetingId}/polls. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/meetings/*/polls",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "meeting_polls.vote",
          "title": "Meeting Polls Vote",
          "description": "Execute Meeting Polls Vote in Topolo Chat.",
          "method": "POST",
          "path": "/api/meetings/{meetingId}/polls/{pollId}/vote",
          "permission": "meetings:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "meetingId": {
                "type": "string",
                "minLength": 1
              },
              "pollId": {
                "type": "string",
                "minLength": 1
              },
              "optionIndex": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              }
            },
            "required": [
              "meetingId",
              "pollId",
              "optionIndex"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "meetingId": "example",
              "pollId": "example",
              "optionIndex": 1
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/meetings/example/polls/example/vote",
              "body": {
                "meetingId": "example",
                "pollId": "example",
                "optionIndex": 1
              }
            },
            "effects": "May change state through POST /api/meetings/{meetingId}/polls/{pollId}/vote. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/meetings/*/polls/*/vote",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "meeting_notes.create",
          "title": "Meeting Notes Create",
          "description": "Execute Meeting Notes Create in Topolo Chat.",
          "method": "POST",
          "path": "/api/meetings/{meetingId}/notes",
          "permission": "meetings:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "meetingId": {
                "type": "string",
                "minLength": 1
              },
              "body": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "meetingId",
              "body"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "meetingId": "example",
              "body": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/meetings/example/notes",
              "body": {
                "meetingId": "example",
                "body": "example"
              }
            },
            "effects": "May change state through POST /api/meetings/{meetingId}/notes. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/meetings/*/notes",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "meetings.calendar",
          "title": "Meetings Calendar",
          "description": "Execute Meetings Calendar in Topolo Chat.",
          "method": "GET",
          "path": "/api/meetings/{meetingId}/calendar",
          "permission": "meetings:read",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "meetingId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "meetingId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "meetingId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/meetings/example/calendar",
              "body": null
            },
            "effects": "Reads state through GET /api/meetings/{meetingId}/calendar without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/meetings/*/calendar",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "meetings.update",
          "title": "Meetings Update",
          "description": "Execute Meetings Update in Topolo Chat.",
          "method": "POST",
          "path": "/api/meetings/{meetingId}/update",
          "permission": "meetings:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "meetingId": {
                "type": "string",
                "minLength": 1
              },
              "title": {
                "type": "string",
                "minLength": 1
              },
              "description": {
                "type": "string",
                "minLength": 1
              },
              "startsAt": {
                "type": "string"
              },
              "durationMinutes": {
                "type": "number",
                "exclusiveMinimum": 0
              },
              "reminderMinutes": {
                "type": "number",
                "minimum": 0
              },
              "recurrenceRule": {
                "type": "string",
                "enum": [
                  "none",
                  "daily",
                  "weekdays",
                  "weekly"
                ]
              },
              "status": {
                "type": "string",
                "enum": [
                  "live",
                  "scheduled",
                  "completed",
                  "cancelled"
                ]
              }
            },
            "required": [
              "meetingId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "meetingId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/meetings/example/update",
              "body": {
                "meetingId": "example"
              }
            },
            "effects": "May change state through POST /api/meetings/{meetingId}/update. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/meetings/*/update",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "meetings.delete",
          "title": "Meetings Delete",
          "description": "Execute Meetings Delete in Topolo Chat.",
          "method": "DELETE",
          "path": "/api/meetings/{meetingId}",
          "permission": "meetings:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "meetingId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "meetingId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": true,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "meetingId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "DELETE",
              "path": "/api/meetings/example",
              "body": null
            },
            "effects": "May change state through DELETE /api/meetings/{meetingId}. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "DELETE /api/meetings/*",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "meetings.guest_invite",
          "title": "Meetings Guest Invite",
          "description": "Execute Meetings Guest Invite in Topolo Chat.",
          "method": "POST",
          "path": "/api/meetings/{meetingId}/guest-invites",
          "permission": "meetings:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "meetingId": {
                "type": "string",
                "minLength": 1
              },
              "email": {
                "type": "string",
                "format": "email",
                "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
              }
            },
            "required": [
              "meetingId",
              "email"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "meetingId": "example",
              "email": "user@example.com"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/meetings/example/guest-invites",
              "body": {
                "meetingId": "example",
                "email": "user@example.com"
              }
            },
            "effects": "May change state through POST /api/meetings/{meetingId}/guest-invites. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/meetings/*/guest-invites",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "meetings.transcript",
          "title": "Meetings Transcript",
          "description": "Execute Meetings Transcript in Topolo Chat.",
          "method": "GET",
          "path": "/api/meetings/{meetingId}/transcript",
          "permission": "meetings:read",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "meetingId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "meetingId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "meetingId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/meetings/example/transcript",
              "body": null
            },
            "effects": "Reads state through GET /api/meetings/{meetingId}/transcript without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/meetings/*/transcript",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "meetings.join_token",
          "title": "Meetings Join Token",
          "description": "Execute Meetings Join Token in Topolo Chat.",
          "method": "POST",
          "path": "/api/meetings/{meetingId}/join-token",
          "permission": "meetings:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "meetingId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "meetingId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "meetingId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/meetings/example/join-token",
              "body": {
                "meetingId": "example"
              }
            },
            "effects": "May change state through POST /api/meetings/{meetingId}/join-token. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/meetings/*/join-token",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "meetings.admit",
          "title": "Meetings Admit",
          "description": "Execute Meetings Admit in Topolo Chat.",
          "method": "POST",
          "path": "/api/meetings/{meetingId}/admit",
          "permission": "meetings:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "meetingId": {
                "type": "string",
                "minLength": 1
              },
              "participantId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "meetingId",
              "participantId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "meetingId": "example",
              "participantId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/meetings/example/admit",
              "body": {
                "meetingId": "example",
                "participantId": "example"
              }
            },
            "effects": "May change state through POST /api/meetings/{meetingId}/admit. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/meetings/*/admit",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "meetings.remove_participant",
          "title": "Meetings Remove Participant",
          "description": "Execute Meetings Remove Participant in Topolo Chat.",
          "method": "POST",
          "path": "/api/meetings/{meetingId}/remove-participant",
          "permission": "meetings:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "meetingId": {
                "type": "string",
                "minLength": 1
              },
              "participantId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "meetingId",
              "participantId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": true,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "meetingId": "example",
              "participantId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/meetings/example/remove-participant",
              "body": {
                "meetingId": "example",
                "participantId": "example"
              }
            },
            "effects": "May change state through POST /api/meetings/{meetingId}/remove-participant. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/meetings/*/remove-participant",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "meetings.update_role",
          "title": "Meetings Update Role",
          "description": "Execute Meetings Update Role in Topolo Chat.",
          "method": "POST",
          "path": "/api/meetings/{meetingId}/update-role",
          "permission": "meetings:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "meetingId": {
                "type": "string",
                "minLength": 1
              },
              "participantId": {
                "type": "string",
                "minLength": 1
              },
              "role": {
                "type": "string",
                "enum": [
                  "host",
                  "co_host",
                  "presenter",
                  "participant",
                  "guest"
                ]
              }
            },
            "required": [
              "meetingId",
              "participantId",
              "role"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "meetingId": "example",
              "participantId": "example",
              "role": "host"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/meetings/example/update-role",
              "body": {
                "meetingId": "example",
                "participantId": "example",
                "role": "host"
              }
            },
            "effects": "May change state through POST /api/meetings/{meetingId}/update-role. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/meetings/*/update-role",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "meetings.lock",
          "title": "Meetings Lock",
          "description": "Execute Meetings Lock in Topolo Chat.",
          "method": "POST",
          "path": "/api/meetings/{meetingId}/lock",
          "permission": "meetings:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "meetingId": {
                "type": "string",
                "minLength": 1
              },
              "locked": {
                "type": "boolean"
              }
            },
            "required": [
              "meetingId",
              "locked"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "meetingId": "example",
              "locked": true
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/meetings/example/lock",
              "body": {
                "meetingId": "example",
                "locked": true
              }
            },
            "effects": "May change state through POST /api/meetings/{meetingId}/lock. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/meetings/*/lock",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "meetings.recording_start",
          "title": "Meetings Recording Start",
          "description": "Execute Meetings Recording Start in Topolo Chat.",
          "method": "POST",
          "path": "/api/meetings/{meetingId}/recording/start",
          "permission": "meetings:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "meetingId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "meetingId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "meetingId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/meetings/example/recording/start",
              "body": {
                "meetingId": "example"
              }
            },
            "effects": "May change state through POST /api/meetings/{meetingId}/recording/start. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/meetings/*/recording/start",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "meetings.recording_stop",
          "title": "Meetings Recording Stop",
          "description": "Execute Meetings Recording Stop in Topolo Chat.",
          "method": "POST",
          "path": "/api/meetings/{meetingId}/recording/stop",
          "permission": "meetings:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "meetingId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "meetingId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "meetingId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/meetings/example/recording/stop",
              "body": {
                "meetingId": "example"
              }
            },
            "effects": "May change state through POST /api/meetings/{meetingId}/recording/stop. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/meetings/*/recording/stop",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "meetings.captions_toggle",
          "title": "Meetings Captions Toggle",
          "description": "Execute Meetings Captions Toggle in Topolo Chat.",
          "method": "POST",
          "path": "/api/meetings/{meetingId}/captions/toggle",
          "permission": "meetings:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "meetingId": {
                "type": "string",
                "minLength": 1
              },
              "enabled": {
                "type": "boolean"
              }
            },
            "required": [
              "meetingId",
              "enabled"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "meetingId": "example",
              "enabled": true
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/meetings/example/captions/toggle",
              "body": {
                "meetingId": "example",
                "enabled": true
              }
            },
            "effects": "May change state through POST /api/meetings/{meetingId}/captions/toggle. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/meetings/*/captions/toggle",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "remote_assist.request",
          "title": "Remote Assist Request",
          "description": "Execute Remote Assist Request in Topolo Chat.",
          "method": "POST",
          "path": "/api/meetings/{meetingId}/remote-assist/request",
          "permission": "meetings:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "meetingId": {
                "type": "string",
                "minLength": 1
              },
              "hostName": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "meetingId",
              "hostName"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "meetingId": "example",
              "hostName": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/meetings/example/remote-assist/request",
              "body": {
                "meetingId": "example",
                "hostName": "example"
              }
            },
            "effects": "May change state through POST /api/meetings/{meetingId}/remote-assist/request. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/meetings/*/remote-assist/request",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "remote_assist.approve",
          "title": "Remote Assist Approve",
          "description": "Execute Remote Assist Approve in Topolo Chat.",
          "method": "POST",
          "path": "/api/meetings/{meetingId}/remote-assist/{sessionId}/approve",
          "permission": "meetings:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "meetingId": {
                "type": "string",
                "minLength": 1
              },
              "sessionId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "meetingId",
              "sessionId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "meetingId": "example",
              "sessionId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/meetings/example/remote-assist/example/approve",
              "body": {
                "meetingId": "example",
                "sessionId": "example"
              }
            },
            "effects": "May change state through POST /api/meetings/{meetingId}/remote-assist/{sessionId}/approve. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/meetings/*/remote-assist/*/approve",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "remote_assist.revoke",
          "title": "Remote Assist Revoke",
          "description": "Execute Remote Assist Revoke in Topolo Chat.",
          "method": "POST",
          "path": "/api/meetings/{meetingId}/remote-assist/{sessionId}/revoke",
          "permission": "meetings:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "meetingId": {
                "type": "string",
                "minLength": 1
              },
              "sessionId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "meetingId",
              "sessionId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": true,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "meetingId": "example",
              "sessionId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/meetings/example/remote-assist/example/revoke",
              "body": {
                "meetingId": "example",
                "sessionId": "example"
              }
            },
            "effects": "May change state through POST /api/meetings/{meetingId}/remote-assist/{sessionId}/revoke. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/meetings/*/remote-assist/*/revoke",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "remote_assist.state",
          "title": "Remote Assist State",
          "description": "Execute Remote Assist State in Topolo Chat.",
          "method": "GET",
          "path": "/api/meetings/{meetingId}/remote-assist/{sessionId}/state",
          "permission": "meetings:read",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "meetingId": {
                "type": "string",
                "minLength": 1
              },
              "sessionId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "meetingId",
              "sessionId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "meetingId": "example",
              "sessionId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/meetings/example/remote-assist/example/state",
              "body": null
            },
            "effects": "Reads state through GET /api/meetings/{meetingId}/remote-assist/{sessionId}/state without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/meetings/*/remote-assist/*/state",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "operational_threads.list",
          "title": "Operational Threads List",
          "description": "Execute Operational Threads List in Topolo Chat.",
          "method": "GET",
          "path": "/api/operational-threads",
          "permission": "operational_threads:read",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "view": {
                "type": "string",
                "enum": [
                  "open",
                  "recent"
                ]
              },
              "state": {
                "type": "string",
                "enum": [
                  "open",
                  "acknowledged",
                  "snoozed",
                  "resolved"
                ]
              },
              "updatedAfter": {
                "type": "string"
              },
              "limit": {
                "type": "integer",
                "minimum": 1,
                "maximum": 200
              },
              "sourceSystem": {
                "type": "string"
              },
              "externalRef": {
                "type": "string"
              }
            },
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "view": "open",
              "state": "open",
              "updatedAfter": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/operational-threads",
              "body": null
            },
            "effects": "Reads state through GET /api/operational-threads without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/operational-threads",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "operational_threads.get",
          "title": "Operational Threads Get",
          "description": "Execute Operational Threads Get in Topolo Chat.",
          "method": "GET",
          "path": "/api/operational-threads/{threadId}",
          "permission": "operational_threads:read",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "threadId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "threadId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "threadId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/operational-threads/example",
              "body": null
            },
            "effects": "Reads state through GET /api/operational-threads/{threadId} without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/operational-threads/*",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "operational_threads.create",
          "title": "Operational Threads Create",
          "description": "Execute Operational Threads Create in Topolo Chat.",
          "method": "POST",
          "path": "/api/operational-threads",
          "permission": "operational_threads:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "title": {
                "type": "string",
                "minLength": 1
              },
              "summary": {
                "type": "string",
                "minLength": 1
              },
              "severity": {
                "type": "string"
              },
              "state": {
                "type": "string",
                "enum": [
                  "open",
                  "acknowledged",
                  "snoozed",
                  "resolved"
                ]
              },
              "sourceSystem": {
                "type": "string"
              },
              "externalRef": {
                "type": "string"
              },
              "ownerId": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "snoozedUntil": {
                "type": "string"
              }
            },
            "required": [
              "title",
              "summary"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "title": "example",
              "summary": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/operational-threads",
              "body": {
                "title": "example",
                "summary": "example"
              }
            },
            "effects": "May change state through POST /api/operational-threads. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/operational-threads",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "operational_threads.update",
          "title": "Operational Threads Update",
          "description": "Execute Operational Threads Update in Topolo Chat.",
          "method": "POST",
          "path": "/api/operational-threads/{threadId}/update",
          "permission": "operational_threads:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "threadId": {
                "type": "string",
                "minLength": 1
              },
              "title": {
                "type": "string",
                "minLength": 1
              },
              "summary": {
                "type": "string",
                "minLength": 1
              },
              "severity": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "sourceSystem": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "externalRef": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "required": [
              "threadId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "threadId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/operational-threads/example/update",
              "body": {
                "threadId": "example"
              }
            },
            "effects": "May change state through POST /api/operational-threads/{threadId}/update. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/operational-threads/*/update",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "operational_threads.transition",
          "title": "Operational Threads Transition",
          "description": "Execute Operational Threads Transition in Topolo Chat.",
          "method": "POST",
          "path": "/api/operational-threads/{threadId}/state",
          "permission": "operational_threads:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "threadId": {
                "type": "string",
                "minLength": 1
              },
              "state": {
                "type": "string",
                "enum": [
                  "open",
                  "acknowledged",
                  "snoozed",
                  "resolved"
                ]
              },
              "snoozedUntil": {
                "type": "string"
              }
            },
            "required": [
              "threadId",
              "state"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "threadId": "example",
              "state": "open"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/operational-threads/example/state",
              "body": {
                "threadId": "example",
                "state": "open"
              }
            },
            "effects": "May change state through POST /api/operational-threads/{threadId}/state. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/operational-threads/*/state",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "operational_threads.assign_owner",
          "title": "Operational Threads Assign Owner",
          "description": "Execute Operational Threads Assign Owner in Topolo Chat.",
          "method": "POST",
          "path": "/api/operational-threads/{threadId}/owner",
          "permission": "operational_threads:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "threadId": {
                "type": "string",
                "minLength": 1
              },
              "ownerId": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "required": [
              "threadId",
              "ownerId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "threadId": "example",
              "ownerId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/operational-threads/example/owner",
              "body": {
                "threadId": "example",
                "ownerId": "example"
              }
            },
            "effects": "May change state through POST /api/operational-threads/{threadId}/owner. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/operational-threads/*/owner",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "operational_threads.comment",
          "title": "Operational Threads Comment",
          "description": "Execute Operational Threads Comment in Topolo Chat.",
          "method": "POST",
          "path": "/api/operational-threads/{threadId}/comments",
          "permission": "operational_threads:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "threadId": {
                "type": "string",
                "minLength": 1
              },
              "body": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "threadId",
              "body"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "threadId": "example",
              "body": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/operational-threads/example/comments",
              "body": {
                "threadId": "example",
                "body": "example"
              }
            },
            "effects": "May change state through POST /api/operational-threads/{threadId}/comments. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/operational-threads/*/comments",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "notification_preferences.update",
          "title": "Notification Preferences Update",
          "description": "Execute Notification Preferences Update in Topolo Chat.",
          "method": "POST",
          "path": "/api/notification-preferences",
          "permission": "workspace:read",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "directMessages": {
                "type": "boolean"
              },
              "channelMentions": {
                "type": "boolean"
              },
              "meetingReminders": {
                "type": "boolean"
              },
              "recordingAlerts": {
                "type": "boolean"
              }
            },
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "directMessages": true,
              "channelMentions": true,
              "meetingReminders": true
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/notification-preferences",
              "body": {
                "directMessages": true,
                "channelMentions": true,
                "meetingReminders": true
              }
            },
            "effects": "May change state through POST /api/notification-preferences. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/notification-preferences",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "workspace_policies.update",
          "title": "Workspace Policies Update",
          "description": "Execute Workspace Policies Update in Topolo Chat.",
          "method": "POST",
          "path": "/api/workspace-policies",
          "permission": "settings:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "guestsEnabled": {
                "type": "boolean"
              },
              "waitingRoomDefault": {
                "type": "boolean"
              },
              "recordingEnabled": {
                "type": "boolean"
              },
              "transcriptsEnabled": {
                "type": "boolean"
              },
              "screenShareEnabled": {
                "type": "boolean"
              },
              "remoteAssistEnabled": {
                "type": "boolean"
              }
            },
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "guestsEnabled": true,
              "waitingRoomDefault": true,
              "recordingEnabled": true
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/workspace-policies",
              "body": {
                "guestsEnabled": true,
                "waitingRoomDefault": true,
                "recordingEnabled": true
              }
            },
            "effects": "May change state through POST /api/workspace-policies. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/workspace-policies",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "uploads.content",
          "title": "Uploads Content",
          "description": "Execute Uploads Content in Topolo Chat.",
          "method": "PUT",
          "path": "/api/uploads/{uploadId}/content",
          "permission": "uploads:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "uploadId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "uploadId"
            ],
            "additionalProperties": {}
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "uploadId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "PUT",
              "path": "/api/uploads/example/content",
              "body": {
                "uploadId": "example"
              }
            },
            "effects": "May change state through PUT /api/uploads/{uploadId}/content. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "PUT /api/uploads/*/content",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "uploads.complete",
          "title": "Uploads Complete",
          "description": "Execute Uploads Complete in Topolo Chat.",
          "method": "POST",
          "path": "/api/uploads/complete",
          "permission": "uploads:write",
          "readOnly": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "uploadId": {
                "type": "string",
                "minLength": 1
              },
              "conversationKind": {
                "type": "string",
                "enum": [
                  "channel",
                  "dm"
                ]
              },
              "conversationId": {
                "type": "string",
                "minLength": 1
              },
              "messageBody": {
                "type": "string"
              },
              "threadParentId": {
                "type": "string",
                "minLength": 1
              },
              "thread_parent_id": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "uploadId",
              "conversationKind",
              "conversationId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": true,
          "agentAccess": "confirm",
          "authorizationMode": "static",
          "documentation": {
            "example_input": {
              "uploadId": "example",
              "conversationKind": "channel",
              "conversationId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-chat --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/uploads/complete",
              "body": {
                "uploadId": "example",
                "conversationKind": "channel",
                "conversationId": "example"
              }
            },
            "effects": "May change state through POST /api/uploads/complete. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/uploads/complete",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        }
      ],
      "action_coverage": {
        "status": "ok",
        "served_routes": 130,
        "matched_actions": 100,
        "declared_unserved_actions": [
          "GET /api/widget"
        ],
        "coverage_excluded_actions": [],
        "uncatalogued_routes": [],
        "ignored_routes": 30,
        "configured_exclusions": 38,
        "configuration_findings": [
          "* /api/*: exclusion matches no served route",
          "* /api/guest/*: exclusion matches no served route",
          "* /api/launch/*: exclusion matches no served route",
          "GET /desktop: exclusion matches no served route",
          "GET /api/desktop/download: exclusion matches no served route",
          "GET /api/desktop/releases/latest: exclusion matches no served route",
          "* /api/internal/*: exclusion matches no served route",
          "* /api/meetings/webhooks/*: exclusion matches no served route"
        ],
        "notes": [
          "4 manually-declared route(s)"
        ]
      },
      "runtime_contract_audit": {
        "status": "verified",
        "actions": 101,
        "contracts": 101,
        "contract_module": "topolo.action-contracts.mjs",
        "validator_sources": [
          "apps/api/src/index.ts"
        ],
        "authorization_sources": [
          "apps/api/src/index.ts"
        ],
        "findings": []
      }
    }
  ],
  "mobile_contracts": [
    {
      "source_path": "apps/TopoloChat/topolo.mobile-experience.json",
      "contract": {
        "version": "2026-06-27",
        "status": "approved",
        "mode": "native_capability",
        "appId": "app_topolo_chat",
        "localizationNamespace": "chat",
        "permissions": [
          "chat.threads.read",
          "chat.messages.write"
        ],
        "offlinePolicy": "read_through_cache",
        "fallbackPath": "/threads",
        "auth": {
          "audience": "topolo-chat",
          "scopes": [
            "chat.threads:read",
            "chat.messages:write"
          ]
        },
        "routes": [
          {
            "path": "/threads",
            "title": "Threads",
            "titleKey": "chat.mobile.routes.threads.title",
            "template": "chat.threadList",
            "dataSource": "chat.threads.list",
            "apiPath": "/api/channels",
            "detailRoute": "/threads/:id"
          },
          {
            "path": "/threads/:id",
            "title": "Thread",
            "titleKey": "chat.mobile.routes.thread.title",
            "template": "chat.thread",
            "dataSource": "chat.threads.detail",
            "apiPath": "/api/channels/:id/messages",
            "actions": [
              {
                "id": "chat.messages.send",
                "title": "Send message",
                "titleKey": "chat.mobile.actions.sendMessage.title",
                "type": "message.send",
                "permission": "chat.messages.write",
                "method": "POST",
                "path": "/api/threads/:id/messages"
              }
            ]
          }
        ]
      }
    }
  ],
  "package_manifests": [],
  "deployment_configs": [],
  "source_signals": {
    "api_routes": [
      {
        "method": "LITERAL",
        "path": "/presence",
        "source_path": "apps/TopoloChat/apps/api/src/durable-objects.ts"
      },
      {
        "method": "ALL",
        "path": "*",
        "source_path": "apps/TopoloChat/apps/api/src/index.ts"
      },
      {
        "method": "LITERAL",
        "path": "/desktop",
        "source_path": "apps/TopoloChat/apps/api/src/index.ts"
      },
      {
        "method": "LITERAL",
        "path": "/healthz",
        "source_path": "apps/TopoloChat/apps/api/src/index.ts"
      },
      {
        "method": "LITERAL",
        "path": "/readyz",
        "source_path": "apps/TopoloChat/apps/api/src/index.ts"
      },
      {
        "method": "LITERAL",
        "path": "/api/widget",
        "source_path": "apps/TopoloChat/apps/api/src/index.ts"
      },
      {
        "method": "LITERAL",
        "path": "/api/desktop/releases/latest",
        "source_path": "apps/TopoloChat/apps/api/src/index.ts"
      },
      {
        "method": "LITERAL",
        "path": "/api/desktop/download",
        "source_path": "apps/TopoloChat/apps/api/src/index.ts"
      }
    ],
    "ui_routes": [
      {
        "path": "/app",
        "source_path": "apps/TopoloChat/apps/web/src/client/App.tsx"
      },
      {
        "path": "/app/inbox",
        "source_path": "apps/TopoloChat/apps/web/src/client/App.tsx"
      },
      {
        "path": "/app/channels",
        "source_path": "apps/TopoloChat/apps/web/src/client/App.tsx"
      },
      {
        "path": "/app/dms",
        "source_path": "apps/TopoloChat/apps/web/src/client/App.tsx"
      },
      {
        "path": "/app/meetings",
        "source_path": "apps/TopoloChat/apps/web/src/client/App.tsx"
      },
      {
        "path": "/app/settings",
        "source_path": "apps/TopoloChat/apps/web/src/client/App.tsx"
      },
      {
        "path": "/app/settings/:section",
        "source_path": "apps/TopoloChat/apps/web/src/client/App.tsx"
      },
      {
        "path": "/app/templates",
        "source_path": "apps/TopoloChat/apps/web/src/client/App.tsx"
      },
      {
        "path": "/app/getting-started",
        "source_path": "apps/TopoloChat/apps/web/src/client/App.tsx"
      },
      {
        "path": "/guest/meetings/:token",
        "source_path": "apps/TopoloChat/apps/web/src/client/App.tsx"
      },
      {
        "path": "/join",
        "source_path": "apps/TopoloChat/apps/web/src/client/App.tsx"
      }
    ],
    "test_cases": [],
    "database_tables": []
  },
  "documentation": {
    "declared_paths": [
      "internal/apps/chat",
      "applications/chat"
    ],
    "present_paths": [
      "internal/apps/chat",
      "applications/chat"
    ],
    "missing_paths": [],
    "human_reference": "/systems/topolo-chat",
    "machine_reference": "/machine/systems/topolo-chat.json",
    "action_examples": 101,
    "action_schemas": 101
  },
  "source_findings": [
    {
      "type": "declared_unserved_actions",
      "source_path": "apps/TopoloChat/topolo.app.json",
      "detail": [
        "GET /api/widget"
      ]
    },
    {
      "type": "action_coverage_configuration",
      "source_path": "apps/TopoloChat/topolo.app.json",
      "detail": [
        "* /api/*: exclusion matches no served route",
        "* /api/guest/*: exclusion matches no served route",
        "* /api/launch/*: exclusion matches no served route",
        "GET /desktop: exclusion matches no served route",
        "GET /api/desktop/download: exclusion matches no served route",
        "GET /api/desktop/releases/latest: exclusion matches no served route",
        "* /api/internal/*: exclusion matches no served route",
        "* /api/meetings/webhooks/*: exclusion matches no served route"
      ]
    }
  ]
}