{
  "schemaVersion": 1,
  "product": "TrayHop",
  "version": "0.19.0-alpha.1",
  "status": "private-alpha",
  "description": "A local printing connector for approved web applications that sends PDFs, labels, barcodes, receipts, and documents to workstation printers.",
  "canonical": "https://trayhop.com/",
  "developerDocumentation": {
    "html": "https://trayhop.com/developers/",
    "markdown": "https://trayhop.com/developers/index.md",
    "discovery": "https://trayhop.com/llms.txt",
    "openapi": "https://trayhop.com/developers/openapi.json",
    "compatibilityCheck": "https://trayhop.com/connect/"
  },
  "sdk": {
    "format": "browser-esm",
    "manifest": "https://trayhop.com/sdk/0.19/manifest.json",
    "module": "https://trayhop.com/sdk/0.19/trayhop.js",
    "types": "https://trayhop.com/sdk/0.19/trayhop.d.ts"
  },
  "transport": {
    "baseUrl": "http://127.0.0.1:18181",
    "caller": "browser",
    "approvedOriginRequired": true,
    "bearerCredentialAfterPairing": true,
    "remoteServerCanReachAgent": false
  },
  "capabilities": [
    "read-agent-status",
    "discover-approved-printers",
    "discover-approved-profiles",
    "submit-pdf",
    "read-recent-jobs",
    "read-job-by-id",
    "recover-job-by-idempotency-key",
    "persist-browser-print-intents"
  ],
  "limits": {
    "pdfBytes": 8388608,
    "copies": { "minimum": 1, "maximum": 100 },
    "paperMillimeters": { "minimum": 10, "maximum": 1000 },
    "idempotencyKeyCharacters": { "minimum": 12, "maximum": 80 }
  },
  "jobStates": ["pending", "dispatching", "accepted", "previewed", "rejected", "unknown"],
  "invariants": [
    "Persist an application intent and unique idempotency key before reading or submitting the PDF.",
    "Submit an immutable intent at most once.",
    "Treat accepted as operating-system acknowledgement, not proof of physical output.",
    "Never automatically retry an interrupted, pending, dispatching, or unknown submission.",
    "Use read-only lookup with the original idempotency key, then ask the operator to reconcile queue and physical output.",
    "Keep credentials in memory and out of URLs, source code, analytics, logs, and feedback.",
    "Retain the application's existing print provider as a fallback during private alpha."
  ],
  "feedback": {
    "human": "https://trayhop.com/#feedback",
    "contract": "https://trayhop.com/api/feedback",
    "agentPolicy": "Draft feedback for user review and obtain authorization before posting. Do not include credentials, customer data, documents, pairing codes, job keys, or license material."
  },
  "commercial": {
    "productionLicenseRequired": true,
    "publicSignup": false,
    "contact": "https://trayhop.com/#pilot"
  }
}
