{
  "contract": {
    "version": "1.0.0",
    "apiRoot": "https://jesse.my/api",
    "model": "jesse",
    "models": [
      "jesse",
      "jesse-prod",
      "jesse-pristine"
    ],
    "keyEnvironment": "JESSE_API_KEY",
    "budgets": {
      "context": 10000,
      "output": 4096
    },
    "capabilities": {
      "chatCompletions": true,
      "messages": true,
      "responses": true,
      "streaming": "sse",
      "toolCalls": true,
      "structuredOutputs": true,
      "receipts": true,
      "memory": "per-key",
      "documents": true,
      "packs": true,
      "phases": true,
      "pipelines": true,
      "resultChecks": true,
      "responsesState": "full-history; previous_response_id is rejected",
      "imageInput": "inline PNG/JPEG QR decoding only",
      "embeddings": false,
      "audio": false,
      "websocketResponses": false,
      "coding": "Checked new functions and small programs; existing-code editing is not established.",
      "budgets": "Conservative client budgets, not advertised server capacity."
    }
  },
  "operations": [
    {
      "id": "capabilities",
      "method": "GET",
      "path": "/v1/capabilities",
      "summary": "Read the versioned Jesse API capability contract.",
      "stream": false,
      "destructive": false,
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      }
    },
    {
      "id": "models",
      "method": "GET",
      "path": "/v1/models",
      "summary": "List the public models available to this key.",
      "stream": false,
      "destructive": false,
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      }
    },
    {
      "id": "complete",
      "method": "POST",
      "path": "/v1/chat/completions",
      "summary": "Ask Jesse, call tools or resume a graph phase; retain the Jesse receipt.",
      "stream": true,
      "destructive": false,
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "properties": {
          "body": {
            "type": "object",
            "properties": {
              "model": {
                "type": "string",
                "enum": [
                  "jesse",
                  "jesse-prod",
                  "jesse-pristine"
                ],
                "default": "jesse"
              },
              "messages": {
                "type": "array",
                "items": {
                  "type": "object"
                },
                "minItems": 1
              },
              "stream": {
                "type": "boolean"
              },
              "tools": {
                "type": "array"
              },
              "tool_choice": {},
              "response_format": {},
              "pack": {},
              "phase": {},
              "pipeline": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "messages"
            ],
            "additionalProperties": true
          }
        },
        "required": [
          "body"
        ],
        "additionalProperties": false
      }
    },
    {
      "id": "messages",
      "method": "POST",
      "path": "/v1/messages",
      "summary": "Anthropic Messages chat and agent turns, with full message history.",
      "stream": true,
      "destructive": false,
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "properties": {
          "body": {
            "type": "object",
            "properties": {
              "model": {
                "type": "string",
                "enum": [
                  "jesse",
                  "jesse-prod",
                  "jesse-pristine"
                ],
                "default": "jesse"
              },
              "messages": {
                "type": "array",
                "items": {
                  "type": "object"
                },
                "minItems": 1
              },
              "system": {},
              "max_tokens": {
                "type": "integer",
                "minimum": 1
              },
              "stream": {
                "type": "boolean"
              },
              "tools": {
                "type": "array"
              }
            },
            "required": [
              "messages"
            ],
            "additionalProperties": true
          }
        },
        "required": [
          "body"
        ],
        "additionalProperties": false
      }
    },
    {
      "id": "responses",
      "method": "POST",
      "path": "/v1/responses",
      "summary": "Stateless Responses chat and agent turns; send full history.",
      "stream": true,
      "destructive": false,
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "properties": {
          "body": {
            "type": "object",
            "properties": {
              "model": {
                "type": "string",
                "enum": [
                  "jesse",
                  "jesse-prod",
                  "jesse-pristine"
                ],
                "default": "jesse"
              },
              "input": {},
              "instructions": {
                "type": "string",
                "minLength": 1
              },
              "stream": {
                "type": "boolean"
              },
              "tools": {
                "type": "array"
              }
            },
            "required": [
              "input"
            ],
            "additionalProperties": true
          }
        },
        "required": [
          "body"
        ],
        "additionalProperties": false
      }
    },
    {
      "id": "count_tokens",
      "method": "POST",
      "path": "/v1/messages/count_tokens",
      "summary": "Count a Messages request without generating an answer.",
      "stream": false,
      "destructive": false,
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "properties": {
          "body": {
            "type": "object",
            "properties": {
              "model": {
                "type": "string",
                "enum": [
                  "jesse",
                  "jesse-prod",
                  "jesse-pristine"
                ],
                "default": "jesse"
              },
              "messages": {
                "type": "array",
                "items": {
                  "type": "object"
                },
                "minItems": 1
              },
              "system": {},
              "tools": {
                "type": "array"
              }
            },
            "required": [
              "messages"
            ],
            "additionalProperties": true
          }
        },
        "required": [
          "body"
        ],
        "additionalProperties": false
      }
    },
    {
      "id": "usage",
      "method": "GET",
      "path": "/v1/usage",
      "summary": "Inspect usage and quota for the authenticated caller.",
      "stream": false,
      "destructive": false,
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      }
    },
    {
      "id": "agent",
      "method": "GET",
      "path": "/v1/agent",
      "summary": "Inspect this key's learned layer and pristine baseline.",
      "stream": false,
      "destructive": false,
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      }
    },
    {
      "id": "agent_reset",
      "method": "POST",
      "path": "/v1/agent/reset",
      "summary": "Erase the learned layer; documents are erased only when requested.",
      "stream": false,
      "destructive": true,
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "properties": {
          "body": {
            "type": "object",
            "properties": {
              "documents": {
                "type": "boolean"
              }
            },
            "required": [],
            "additionalProperties": false
          }
        },
        "required": [
          "body"
        ],
        "additionalProperties": false
      }
    },
    {
      "id": "memory",
      "method": "GET",
      "path": "/v1/memory",
      "summary": "Inspect the caller's remembered facts.",
      "stream": false,
      "destructive": false,
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      }
    },
    {
      "id": "memory_reset",
      "method": "DELETE",
      "path": "/v1/memory",
      "summary": "Erase this key's remembered facts; optionally indexed searches.",
      "stream": false,
      "destructive": true,
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "object",
            "properties": {
              "searches": {
                "type": "string",
                "enum": [
                  "1"
                ]
              }
            },
            "required": [],
            "additionalProperties": false
          }
        },
        "required": [],
        "additionalProperties": false
      }
    },
    {
      "id": "documents",
      "method": "GET",
      "path": "/v1/documents",
      "summary": "List this key's documents.",
      "stream": false,
      "destructive": false,
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      }
    },
    {
      "id": "document",
      "method": "GET",
      "path": "/v1/documents/{id}",
      "summary": "Read a document by id or stable name.",
      "stream": false,
      "destructive": false,
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "properties": {
          "params": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          },
          "query": {
            "type": "object",
            "properties": {
              "raw": {
                "type": "string",
                "enum": [
                  "1"
                ]
              }
            },
            "required": [],
            "additionalProperties": false
          }
        },
        "required": [
          "params"
        ],
        "additionalProperties": false
      }
    },
    {
      "id": "document_create",
      "method": "POST",
      "path": "/v1/documents",
      "summary": "Store text in the caller's document library.",
      "stream": false,
      "destructive": false,
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "properties": {
          "body": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "minLength": 1
              },
              "text": {
                "type": "string",
                "minLength": 1
              },
              "metadata": {
                "type": "object"
              }
            },
            "required": [
              "name",
              "text"
            ],
            "additionalProperties": true
          }
        },
        "required": [
          "body"
        ],
        "additionalProperties": false
      }
    },
    {
      "id": "document_put",
      "method": "PUT",
      "path": "/v1/documents/{name}",
      "summary": "Replace a named document using version for optimistic concurrency.",
      "stream": false,
      "destructive": false,
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "properties": {
          "body": {
            "type": "object",
            "properties": {
              "text": {
                "type": "string",
                "minLength": 1
              },
              "json": {},
              "version": {
                "type": "integer",
                "minimum": 0
              },
              "metadata": {
                "type": "object"
              }
            },
            "required": [],
            "additionalProperties": false,
            "oneOf": [
              {
                "required": [
                  "text"
                ],
                "not": {
                  "required": [
                    "json"
                  ]
                }
              },
              {
                "required": [
                  "json"
                ],
                "not": {
                  "required": [
                    "text"
                  ]
                }
              }
            ]
          },
          "params": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "name"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "body",
          "params"
        ],
        "additionalProperties": false
      }
    },
    {
      "id": "document_delete",
      "method": "DELETE",
      "path": "/v1/documents/{id}",
      "summary": "Delete the caller's document.",
      "stream": false,
      "destructive": true,
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "properties": {
          "params": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "params"
        ],
        "additionalProperties": false
      }
    },
    {
      "id": "documents_query",
      "method": "POST",
      "path": "/v1/documents/query",
      "summary": "Query the caller's document retrieval index.",
      "stream": false,
      "destructive": false,
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "properties": {
          "body": {
            "type": "object",
            "properties": {
              "query": {
                "type": "string",
                "minLength": 1
              },
              "k": {
                "type": "integer",
                "minimum": 1
              }
            },
            "required": [
              "query"
            ],
            "additionalProperties": true
          }
        },
        "required": [
          "body"
        ],
        "additionalProperties": false
      }
    },
    {
      "id": "packs",
      "method": "GET",
      "path": "/v1/packs",
      "summary": "List this key's tool packs.",
      "stream": false,
      "destructive": false,
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      }
    },
    {
      "id": "pack",
      "method": "GET",
      "path": "/v1/packs/{name}",
      "summary": "Read a current or hash-pinned tool pack.",
      "stream": false,
      "destructive": false,
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "properties": {
          "params": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "name"
            ],
            "additionalProperties": false
          },
          "query": {
            "type": "object",
            "properties": {
              "hash": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [],
            "additionalProperties": false
          }
        },
        "required": [
          "params"
        ],
        "additionalProperties": false
      }
    },
    {
      "id": "pack_create",
      "method": "POST",
      "path": "/v1/packs",
      "summary": "Register a versioned pack of tools, schemas, invariants and pipelines.",
      "stream": false,
      "destructive": false,
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "properties": {
          "body": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "minLength": 1
              },
              "tools": {
                "type": "array"
              },
              "schemas": {
                "type": "object"
              },
              "invariants": {
                "type": "object"
              },
              "pipelines": {
                "type": "object"
              }
            },
            "required": [
              "name",
              "tools"
            ],
            "additionalProperties": true
          }
        },
        "required": [
          "body"
        ],
        "additionalProperties": false
      }
    },
    {
      "id": "pack_put",
      "method": "PUT",
      "path": "/v1/packs/{name}",
      "summary": "Publish the next version of a pack owned by this key.",
      "stream": false,
      "destructive": false,
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "properties": {
          "body": {
            "type": "object",
            "properties": {},
            "required": [],
            "additionalProperties": true
          },
          "params": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "name"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "body",
          "params"
        ],
        "additionalProperties": false
      }
    },
    {
      "id": "pack_delete",
      "method": "DELETE",
      "path": "/v1/packs/{name}",
      "summary": "Delete the caller's tool pack.",
      "stream": false,
      "destructive": true,
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "properties": {
          "params": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "name"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "params"
        ],
        "additionalProperties": false
      }
    },
    {
      "id": "hooks",
      "method": "GET",
      "path": "/v1/hooks",
      "summary": "List hook declarations; Jesse does not invoke their URLs.",
      "stream": false,
      "destructive": false,
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      }
    },
    {
      "id": "hook",
      "method": "GET",
      "path": "/v1/hooks/{id}",
      "summary": "Read the caller's hook declaration.",
      "stream": false,
      "destructive": false,
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "properties": {
          "params": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "params"
        ],
        "additionalProperties": false
      }
    },
    {
      "id": "hook_create",
      "method": "POST",
      "path": "/v1/hooks",
      "summary": "Store a hook declaration without invoking it.",
      "stream": false,
      "destructive": false,
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "properties": {
          "body": {
            "type": "object",
            "properties": {
              "url": {
                "type": "string",
                "minLength": 1
              },
              "pack": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "url"
            ],
            "additionalProperties": true
          }
        },
        "required": [
          "body"
        ],
        "additionalProperties": false
      }
    },
    {
      "id": "hook_delete",
      "method": "DELETE",
      "path": "/v1/hooks/{id}",
      "summary": "Delete a hook declaration.",
      "stream": false,
      "destructive": true,
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "properties": {
          "params": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "params"
        ],
        "additionalProperties": false
      }
    },
    {
      "id": "tool_result",
      "method": "GET",
      "path": "/v1/tools/results/{id}",
      "summary": "Read a posted tool result owned by this key.",
      "stream": false,
      "destructive": false,
      "readOnly": true,
      "inputSchema": {
        "type": "object",
        "properties": {
          "params": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "params"
        ],
        "additionalProperties": false
      }
    },
    {
      "id": "tool_result_post",
      "method": "POST",
      "path": "/v1/tools/results",
      "summary": "Post a result for an outstanding graph tool call.",
      "stream": false,
      "destructive": false,
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "properties": {
          "body": {
            "type": "object",
            "properties": {
              "call_id": {
                "type": "string",
                "minLength": 1
              },
              "result": {},
              "content": {}
            },
            "required": [
              "call_id"
            ],
            "additionalProperties": true
          }
        },
        "required": [
          "body"
        ],
        "additionalProperties": false
      }
    },
    {
      "id": "checks",
      "method": "POST",
      "path": "/v1/checks",
      "summary": "Check a proposed world-state patch against invariants.",
      "stream": false,
      "destructive": false,
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "properties": {
          "body": {
            "type": "object",
            "properties": {
              "state": {},
              "patch": {},
              "invariant": {},
              "invariants": {
                "type": "array"
              },
              "pack": {}
            },
            "required": [
              "state"
            ],
            "additionalProperties": true
          }
        },
        "required": [
          "body"
        ],
        "additionalProperties": false
      }
    },
    {
      "id": "feedback",
      "method": "POST",
      "path": "/v1/feedback",
      "summary": "Record a correction or rating for a completion.",
      "stream": false,
      "destructive": false,
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "properties": {
          "body": {
            "type": "object",
            "properties": {
              "completion_id": {
                "type": "string",
                "minLength": 1
              },
              "rating": {
                "type": "string",
                "enum": [
                  "positive",
                  "negative"
                ]
              },
              "correction": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "completion_id",
              "rating"
            ],
            "additionalProperties": true
          }
        },
        "required": [
          "body"
        ],
        "additionalProperties": false
      }
    },
    {
      "id": "dispatch",
      "method": "POST",
      "path": "/v1/dispatch",
      "summary": "Dispatch bounded subrequests through the same authenticated API.",
      "stream": false,
      "destructive": false,
      "readOnly": false,
      "inputSchema": {
        "type": "object",
        "properties": {
          "body": {
            "type": "object",
            "properties": {
              "model": {
                "type": "string",
                "enum": [
                  "jesse",
                  "jesse-prod",
                  "jesse-pristine"
                ],
                "default": "jesse"
              },
              "tasks": {
                "type": "array",
                "minItems": 1,
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "minLength": 1
                    },
                    "prompt": {
                      "type": "string",
                      "minLength": 1
                    },
                    "messages": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      },
                      "minItems": 1
                    },
                    "depends_on": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "minLength": 1
                      }
                    }
                  },
                  "required": [
                    "id"
                  ],
                  "additionalProperties": true
                }
              },
              "max_parallel": {
                "type": "integer",
                "minimum": 1
              }
            },
            "required": [
              "tasks"
            ],
            "additionalProperties": true
          }
        },
        "required": [
          "body"
        ],
        "additionalProperties": false
      }
    }
  ],
  "clients": [
    {
      "id": "claude-code",
      "name": "Claude Code",
      "category": "coding-agent",
      "recipe": "claude-env",
      "protocol": "messages",
      "source": "https://code.claude.com/docs/en/third-party-integrations",
      "referenceDate": "2026-09-29",
      "verification": {
        "setup": "prepared",
        "session": "not_run"
      },
      "notes": "Use a dedicated Jesse launch environment. Recorded Jesse runs exist; this release has not rerun the installed CLI.",
      "setupUrl": "/integrations/claude-code/setup.json"
    },
    {
      "id": "codex",
      "name": "Codex CLI and IDE extension",
      "category": "coding-agent",
      "recipe": "codex-toml",
      "protocol": "responses",
      "source": "https://developers.openai.com/codex/config-reference",
      "referenceDate": "2026-09-29",
      "verification": {
        "setup": "prepared",
        "session": "not_run"
      },
      "notes": "Use the Jesse profile without replacing your default provider. Recorded Jesse CLI runs exist; IDE sessions need validation.",
      "setupUrl": "/integrations/codex/setup.json"
    },
    {
      "id": "omp",
      "name": "Oh My Pi (OMP)",
      "category": "coding-agent",
      "recipe": "omp-yaml",
      "protocol": "messages",
      "source": "https://github.com/can1357/oh-my-pi/blob/main/docs/models.md",
      "referenceDate": "2026-09-29",
      "verification": {
        "setup": "prepared",
        "session": "not_run"
      },
      "notes": "Merge the Jesse provider into models.yml. PI_CODING_AGENT_DIR overrides the default directory.",
      "setupUrl": "/integrations/omp/setup.json"
    },
    {
      "id": "factory",
      "name": "Factory.ai Droid CLI and desktop",
      "category": "coding-agent",
      "recipe": "factory-json",
      "protocol": "chat-completions",
      "source": "https://docs.factory.ai/model-independence/byok",
      "referenceDate": "2026-09-29",
      "verification": {
        "setup": "prepared",
        "session": "not_run"
      },
      "notes": "Merge customModels into ~/.factory/settings.json. Environment references work there, not in legacy config.json. Select Jesse with /model; custom model indices depend on your existing array. Hosted web and mobile do not load this local config.",
      "setupUrl": "/integrations/factory/setup.json"
    },
    {
      "id": "vscode",
      "name": "Visual Studio Code Chat",
      "category": "ide",
      "recipe": "vscode-json",
      "protocol": "messages",
      "source": "https://code.visualstudio.com/docs/agent-customization/language-models",
      "referenceDate": "2026-09-29",
      "verification": {
        "setup": "prepared",
        "session": "not_run"
      },
      "notes": "Use Manage Language Models > Add Models > Custom Endpoint. Merge the generated entry into chatLanguageModels.json and store your key through its secure input variable.",
      "setupUrl": "/integrations/vscode/setup.json"
    },
    {
      "id": "continue",
      "name": "Continue for VS Code and JetBrains",
      "category": "ide",
      "recipe": "continue-yaml",
      "protocol": "chat-completions",
      "source": "https://docs.continue.dev/customize/model-providers/top-level/openai",
      "referenceDate": "2026-09-29",
      "verification": {
        "setup": "prepared",
        "session": "not_run"
      },
      "notes": "Merge the model into config.yaml. Chat is prepared; editing, apply, autocomplete and embeddings are deliberately not assigned as supported roles.",
      "setupUrl": "/integrations/continue/setup.json"
    },
    {
      "id": "cline",
      "name": "Cline",
      "category": "coding-agent",
      "recipe": "manual",
      "protocol": "chat-completions",
      "source": "https://docs.cline.bot/provider-config/openai-compatible",
      "referenceDate": "2026-09-29",
      "verification": {
        "setup": "prepared",
        "session": "not_run"
      },
      "notes": "Choose OpenAI Compatible in provider settings. The native agent requires a client-specific tool/result acceptance run.",
      "setupUrl": "/integrations/cline/setup.json"
    },
    {
      "id": "opencode",
      "name": "OpenCode",
      "category": "coding-agent",
      "recipe": "opencode-json",
      "protocol": "chat-completions",
      "source": "https://opencode.ai/docs/providers",
      "referenceDate": "2026-09-29",
      "verification": {
        "setup": "prepared",
        "session": "not_run"
      },
      "notes": "This recipe is for the provider/npm/options config schema documented at /docs/providers. OpenCode v2 has a different providers/package/settings schema; use its separate recipe.",
      "setupUrl": "/integrations/opencode/setup.json"
    },
    {
      "id": "opencode-v2",
      "name": "OpenCode v2",
      "category": "coding-agent",
      "recipe": "opencode-v2-json",
      "protocol": "chat-completions",
      "source": "https://opencode.ai/v2/docs/providers",
      "referenceDate": "2026-09-29",
      "verification": {
        "setup": "prepared",
        "session": "not_run"
      },
      "notes": "Merge providers.jesse into the v2 config; do not mix v1 and v2 configuration schemas.",
      "setupUrl": "/integrations/opencode-v2/setup.json"
    },
    {
      "id": "zed",
      "name": "Zed",
      "category": "ide",
      "recipe": "zed-json",
      "protocol": "chat-completions",
      "source": "https://zed.dev/docs/ai/use-api-access",
      "referenceDate": "2026-09-29",
      "verification": {
        "setup": "prepared",
        "session": "not_run"
      },
      "notes": "Merge language_models.openai_compatible.jesse and store the key in Agent Settings. Tool calling is enabled as a protocol capability; editing workflows are not verified.",
      "setupUrl": "/integrations/zed/setup.json"
    },
    {
      "id": "jetbrains",
      "name": "JetBrains AI Assistant",
      "category": "ide",
      "recipe": "manual",
      "protocol": "chat-completions",
      "source": "https://www.jetbrains.com/help/ai-assistant/use-custom-models.html",
      "referenceDate": "2026-09-29",
      "verification": {
        "setup": "prepared",
        "session": "not_run"
      },
      "notes": "Use Settings > Tools > AI Assistant > Providers & API keys > OpenAI-compatible. Covers IntelliJ IDEA, PyCharm, WebStorm, CLion, GoLand and Rider where AI Assistant is available. Native external agents use a separate ACP integration, not this model recipe.",
      "setupUrl": "/integrations/jetbrains/setup.json"
    },
    {
      "id": "xcode",
      "name": "Xcode Coding Intelligence",
      "category": "ide",
      "recipe": "manual",
      "protocol": "chat-completions",
      "source": "https://developer.apple.com/documentation/xcode/setting-up-coding-intelligence",
      "referenceDate": "2026-09-29",
      "verification": {
        "setup": "prepared",
        "session": "not_run"
      },
      "notes": "Add a custom model provider in Coding Intelligence settings. Use the API root without /v1 if the UI appends /v1/models. The endpoint and model fields below give both forms.",
      "setupUrl": "/integrations/xcode/setup.json"
    },
    {
      "id": "aider",
      "name": "Aider",
      "category": "coding-agent",
      "recipe": "aider-yaml",
      "protocol": "chat-completions",
      "source": "https://aider.chat/docs/llms/openai-compat.html",
      "referenceDate": "2026-09-29",
      "verification": {
        "setup": "prepared",
        "session": "not_run"
      },
      "notes": "Use the launch script with the Jesse model. Aider edit-format behavior must be validated separately; API connectivity does not establish diff editing.",
      "setupUrl": "/integrations/aider/setup.json"
    },
    {
      "id": "open-webui",
      "name": "Open WebUI",
      "category": "chatbot",
      "recipe": "manual",
      "protocol": "chat-completions",
      "source": "https://docs.openwebui.com/getting-started/quick-start/connect-a-provider/starting-with-openai-compatible/",
      "referenceDate": "2026-09-29",
      "verification": {
        "setup": "prepared",
        "session": "not_run"
      },
      "notes": "Add an OpenAI-compatible connection under Admin Settings > Connections. Keep the Jesse key in server settings. Retrieval embeddings need a separate provider.",
      "setupUrl": "/integrations/open-webui/setup.json"
    },
    {
      "id": "librechat",
      "name": "LibreChat",
      "category": "chatbot",
      "recipe": "librechat-yaml",
      "protocol": "chat-completions",
      "source": "https://www.librechat.ai/docs/configuration/librechat_yaml/object_structure/custom_endpoint",
      "referenceDate": "2026-09-29",
      "verification": {
        "setup": "prepared",
        "session": "not_run"
      },
      "notes": "Merge endpoints.custom into librechat.yaml. Inject JESSE_API_KEY on the server; do not expose it to the browser. Automatic titles and summarization are disabled until validated.",
      "setupUrl": "/integrations/librechat/setup.json"
    },
    {
      "id": "cherry-studio",
      "name": "Cherry Studio",
      "category": "chatbot",
      "recipe": "manual",
      "protocol": "chat-completions",
      "source": "https://cherryai.com/docs/en/getting-started/quick-start/",
      "referenceDate": "2026-09-29",
      "verification": {
        "setup": "prepared",
        "session": "not_run"
      },
      "notes": "Add a custom OpenAI-compatible provider, enter the endpoint and key in provider settings, and add the Jesse model. Broad vision is disabled.",
      "setupUrl": "/integrations/cherry-studio/setup.json"
    },
    {
      "id": "anythingllm",
      "name": "AnythingLLM",
      "category": "chatbot",
      "recipe": "manual",
      "protocol": "chat-completions",
      "source": "https://docs.useanything.com/changelog/v1.16.2",
      "referenceDate": "2026-09-29",
      "verification": {
        "setup": "prepared",
        "session": "not_run"
      },
      "notes": "Select Generic OpenAI for the chat provider. Document embeddings require an independent embedding provider. Jesse document APIs remain accessible through the SDK.",
      "setupUrl": "/integrations/anythingllm/setup.json"
    },
    {
      "id": "sillytavern",
      "name": "SillyTavern",
      "category": "chatbot",
      "recipe": "manual",
      "protocol": "chat-completions",
      "source": "https://docs.sillytavern.app/usage/api-connections/openai/",
      "referenceDate": "2026-09-29",
      "verification": {
        "setup": "prepared",
        "session": "not_run"
      },
      "notes": "Select Chat Completion > Custom (OpenAI-compatible). Jesse currently does not provide unrestricted creative writing or character roleplay.",
      "setupUrl": "/integrations/sillytavern/setup.json"
    },
    {
      "id": "cursor",
      "name": "Cursor",
      "category": "ide",
      "recipe": "mcp-json",
      "protocol": "mcp",
      "source": "https://cursor.com/docs/context/mcp",
      "referenceDate": "2026-09-29",
      "verification": {
        "setup": "prepared",
        "session": "not_run"
      },
      "notes": "Merge mcpServers.jesse into .cursor/mcp.json. Jesse is a tool here; this does not replace Cursor Composer or its underlying model.",
      "setupUrl": "/integrations/cursor/setup.json"
    },
    {
      "id": "windsurf",
      "name": "Windsurf / Cascade",
      "category": "ide",
      "recipe": "mcp-json",
      "protocol": "mcp",
      "source": "https://docs.windsurf.com/windsurf/cascade/mcp",
      "referenceDate": "2026-09-29",
      "verification": {
        "setup": "prepared",
        "session": "not_run"
      },
      "notes": "Merge the MCP entry in Cascade MCP settings for the installed version. Jesse is a tool; native model replacement is not claimed.",
      "setupUrl": "/integrations/windsurf/setup.json"
    },
    {
      "id": "copilot",
      "name": "GitHub Copilot in other MCP-capable hosts",
      "category": "ide",
      "recipe": "mcp-json",
      "protocol": "mcp",
      "source": "https://docs.github.com/en/copilot/customizing-copilot/extending-the-capabilities-of-copilot-chat-with-mcp",
      "referenceDate": "2026-09-29",
      "verification": {
        "setup": "prepared",
        "session": "not_run"
      },
      "notes": "Use the host's MCP manager. The common server descriptor must be mapped to that host's schema. For VS Code use the dedicated custom model recipe instead.",
      "setupUrl": "/integrations/copilot/setup.json"
    },
    {
      "id": "claude-desktop",
      "name": "Claude Desktop",
      "category": "chatbot",
      "recipe": "mcp-json",
      "protocol": "mcp",
      "source": "https://modelcontextprotocol.io/docs/develop/connect-local-servers",
      "referenceDate": "2026-09-29",
      "verification": {
        "setup": "prepared",
        "session": "not_run"
      },
      "notes": "Use the local stdio descriptor in claude_desktop_config.json. Jesse is a tool; Claude remains the host model.",
      "setupUrl": "/integrations/claude-desktop/setup.json"
    },
    {
      "id": "chatgpt",
      "name": "ChatGPT and hosted MCP clients",
      "category": "chatbot",
      "recipe": "remote-mcp",
      "protocol": "mcp",
      "source": "https://developers.openai.com/apps-sdk/build/mcp-server",
      "referenceDate": "2026-09-29",
      "verification": {
        "setup": "prepared",
        "session": "not_run"
      },
      "notes": "Use the authenticated Streamable HTTP MCP endpoint after the Jesse release is deployed. A server-owned API key can be used by a credential-aware host; OAuth-only hosts need the existing account OAuth path to be wired separately. This is not a replacement for the host model.",
      "setupUrl": "/integrations/chatgpt/setup.json"
    },
    {
      "id": "slack",
      "name": "Slack chatbot",
      "category": "connector",
      "recipe": "connector",
      "protocol": "sdk",
      "source": "https://docs.slack.dev/authentication/verifying-requests-from-slack/",
      "referenceDate": "2026-09-29",
      "verification": {
        "setup": "prepared",
        "session": "not_run"
      },
      "notes": "Verify the raw request signature and timestamp before parsing; address only human app messages. Acknowledge Slack delivery promptly and handle the Jesse request in your existing durable worker. No posting or app registration is performed by the kit.",
      "setupUrl": "/integrations/slack/setup.json"
    },
    {
      "id": "discord",
      "name": "Discord chatbot",
      "category": "connector",
      "recipe": "connector",
      "protocol": "sdk",
      "source": "https://discord.com/developers/docs/interactions/receiving-and-responding",
      "referenceDate": "2026-09-29",
      "verification": {
        "setup": "prepared",
        "session": "not_run"
      },
      "notes": "Verify the Ed25519 request signature and timestamp, use a prompt slash-command option, and defer the interaction before a long answer. Resolve the caller to their Jesse account.",
      "setupUrl": "/integrations/discord/setup.json"
    },
    {
      "id": "telegram",
      "name": "Telegram chatbot",
      "category": "connector",
      "recipe": "connector",
      "protocol": "sdk",
      "source": "https://core.telegram.org/bots/api#setwebhook",
      "referenceDate": "2026-09-29",
      "verification": {
        "setup": "prepared",
        "session": "not_run"
      },
      "notes": "Verify the webhook secret header and bind the bot identity in your verifier. Normalize only human text messages. Resolve the actor to their own Jesse key.",
      "setupUrl": "/integrations/telegram/setup.json"
    },
    {
      "id": "teams",
      "name": "Microsoft Teams chatbot",
      "category": "connector",
      "recipe": "connector",
      "protocol": "sdk",
      "source": "https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/authentication/auth-aad-sso-bots",
      "referenceDate": "2026-09-29",
      "verification": {
        "setup": "prepared",
        "session": "not_run"
      },
      "notes": "Validate Bot Framework/Teams authentication and tenant identity in the host adapter, then normalize the verified activity. Keep Teams app installation and outbound delivery in the existing host.",
      "setupUrl": "/integrations/teams/setup.json"
    },
    {
      "id": "website",
      "name": "Website chat widget",
      "category": "connector",
      "recipe": "connector",
      "protocol": "sdk",
      "source": "https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API",
      "referenceDate": "2026-09-29",
      "verification": {
        "setup": "prepared",
        "session": "not_run"
      },
      "notes": "Use an authenticated server-side session and same-origin CSRF protection. Map the session user to a Jesse key on the server. The browser never receives the Jesse key.",
      "setupUrl": "/integrations/website/setup.json"
    },
    {
      "id": "support-portal",
      "name": "Customer support portal",
      "category": "connector",
      "recipe": "connector",
      "protocol": "sdk",
      "source": "https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API",
      "referenceDate": "2026-09-29",
      "verification": {
        "setup": "prepared",
        "session": "not_run"
      },
      "notes": "Use the portal's authenticated tenant/user session and authorization. Keep customer history and document access scoped to that actor's Jesse account.",
      "setupUrl": "/integrations/support-portal/setup.json"
    },
    {
      "id": "obsidian",
      "name": "Obsidian assistant plugin",
      "category": "connector",
      "recipe": "connector",
      "protocol": "sdk",
      "source": "https://docs.obsidian.md/Plugins/Getting+started/Build+a+plugin",
      "referenceDate": "2026-09-29",
      "verification": {
        "setup": "prepared",
        "session": "not_run"
      },
      "notes": "Use the shared SDK from a plugin or a trusted local backend. The kit supplies the transport, event normalization and tenant boundary; it is not an installed Obsidian plugin.",
      "setupUrl": "/integrations/obsidian/setup.json"
    },
    {
      "id": "neovim",
      "name": "Neovim assistant",
      "category": "connector",
      "recipe": "connector",
      "protocol": "sdk",
      "source": "https://neovim.io/doc/user/lua.html",
      "referenceDate": "2026-09-29",
      "verification": {
        "setup": "prepared",
        "session": "not_run"
      },
      "notes": "Use the local SDK/MCP bridge from an editor plugin process. No buffers or filesystem tools execute automatically.",
      "setupUrl": "/integrations/neovim/setup.json"
    },
    {
      "id": "emacs",
      "name": "Emacs assistant",
      "category": "connector",
      "recipe": "connector",
      "protocol": "sdk",
      "source": "https://www.gnu.org/software/emacs/manual/html_node/elisp/Asynchronous-Processes.html",
      "referenceDate": "2026-09-29",
      "verification": {
        "setup": "prepared",
        "session": "not_run"
      },
      "notes": "Use a local SDK/MCP bridge subprocess and keep credentials outside buffers. No Emacs package is installed by this kit.",
      "setupUrl": "/integrations/emacs/setup.json"
    },
    {
      "id": "n8n",
      "name": "n8n and workflow automation",
      "category": "connector",
      "recipe": "n8n-http",
      "protocol": "chat-completions",
      "source": "https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.lmchatopenai/",
      "referenceDate": "2026-09-29",
      "verification": {
        "setup": "prepared",
        "session": "not_run"
      },
      "notes": "Use an OpenAI Chat Model custom Base URL, or the generated HTTP request descriptor in an existing authenticated workflow. Store keys in n8n credentials. Graph operations are available via the shared SDK and OpenAPI spec; this descriptor is not a full importable workflow.",
      "setupUrl": "/integrations/n8n/setup.json"
    }
  ],
  "openApiUrl": "/integrations/openapi.json",
  "mcpUrl": "https://jesse.my/api/v1/mcp"
}
