Vorbereitung für pageta-native (siehe mana/docs/playbooks/PAGETA_NATIVE_GREENFIELD.md). AASA + Universal-Links brauchen eine Lead-Domain — pageta.com gewinnt gegen pageta.mana.how. - app-manifest.json: homepage, icon, endpoints.base_url, link_patterns.template alle auf pageta.com. - api/index.ts: PUBLIC_WEB_ORIGIN-Fallback pageta.com. pageta.mana.how bleibt im CORS-Allowlist (hardcoded, line 46) — kein Cutover, beide Domains parallel. - api/config.ts: User-Agent für Crawls auf pageta.com. - web/auth/session.svelte.ts: buildLoginRedirect-Fallback pageta.com. Co-Existenz-Pattern: pageta.mana.how funktioniert weiter (Cloudflared- Ingress + CORS-Allowlist + sso-origins), aber die Manifest sagt pageta.com ist primary. Cookie-SSO über .mana.how-Subdomain greift nur auf pageta.mana.how — pageta.com nutzt Bearer-Flow (Cards-Pattern, existiert schon in session.svelte.ts). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
113 lines
3.6 KiB
JSON
113 lines
3.6 KiB
JSON
{
|
|
"$schema": "https://pkg.mana.how/@mana/shared-share-protocol/0.1/manifest.json",
|
|
"schema_version": "0.1",
|
|
"id": "pageta",
|
|
"name": "Pageta",
|
|
"version": "0.0.1",
|
|
"homepage": "https://pageta.com",
|
|
"icon": "https://pageta.com/icon-512.svg",
|
|
"description": "Reader for curated news, save-it-later articles with highlights, and RSS-feed discovery. A standalone web app of mana e.V.",
|
|
"description_de": "Lese-App für kuratierte News, gespeicherte Artikel mit Markierungen und RSS-Feed-Recherche. Eigenständige Webapp des Vereins mana e.V.",
|
|
"ownership": { "kind": "verein" },
|
|
"tier_required": "public",
|
|
"endpoints": {
|
|
"base_url": "https://pageta.com",
|
|
"health": "/healthz",
|
|
"dsgvo_export": "/api/v1/dsgvo/export",
|
|
"search": "/api/v1/search",
|
|
"share_receive": "/api/v1/share/receive",
|
|
"tool_invoke": "/api/v1/tools/:name",
|
|
"deep_link_scheme": "pageta://",
|
|
"link_patterns": [
|
|
{
|
|
"pattern": "article/(?<id>[a-z0-9_-]+)",
|
|
"template": "https://pageta.com/article/{id}"
|
|
}
|
|
]
|
|
},
|
|
"shares": [],
|
|
"accepts": [
|
|
{
|
|
"type": "mana/url",
|
|
"handler": "receive_url",
|
|
"description": "Save a URL into the user's reading list (Mozilla-Readability-extracted).",
|
|
"description_de": "URL als Artikel in die Lese-Liste übernehmen (mit Mozilla-Readability extrahiert)."
|
|
}
|
|
],
|
|
"tools": [
|
|
{
|
|
"name": "pageta.save_article",
|
|
"description": "Extract a URL and save it to the user's reading list.",
|
|
"description_de": "URL extrahieren und in die Lese-Liste speichern.",
|
|
"input_schema": {
|
|
"type": "object",
|
|
"required": ["url"],
|
|
"properties": {
|
|
"url": { "type": "string", "format": "uri" },
|
|
"userNote": { "type": "string", "maxLength": 2000 }
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"name": "pageta.list_articles",
|
|
"description": "Return the user's own reading list, optionally filtered by status.",
|
|
"description_de": "Eigene Lese-Liste abrufen, optional nach Status filtern.",
|
|
"input_schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"status": { "type": "string", "enum": ["unread", "reading", "finished", "archived"] },
|
|
"limit": { "type": "integer", "minimum": 1, "maximum": 200 }
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"name": "pageta.archive_article",
|
|
"description": "Set an article's status to 'archived'.",
|
|
"description_de": "Artikel auf Status 'archived' setzen.",
|
|
"input_schema": {
|
|
"type": "object",
|
|
"required": ["id"],
|
|
"properties": { "id": { "type": "string" } }
|
|
}
|
|
},
|
|
{
|
|
"name": "pageta.add_article_tag",
|
|
"description": "Attach a tag to an article (kebab-case, max 64 chars).",
|
|
"description_de": "Tag zu einem Artikel hinzufügen (kebab-case, max 64 Zeichen).",
|
|
"input_schema": {
|
|
"type": "object",
|
|
"required": ["id", "tag"],
|
|
"properties": {
|
|
"id": { "type": "string" },
|
|
"tag": { "type": "string", "minLength": 1, "maxLength": 64 }
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"name": "pageta.add_article_highlight",
|
|
"description": "Store a plain-text selection as a highlight on the article.",
|
|
"description_de": "Plain-Text-Selektion als Markierung speichern.",
|
|
"input_schema": {
|
|
"type": "object",
|
|
"required": ["id", "text"],
|
|
"properties": {
|
|
"id": { "type": "string" },
|
|
"text": { "type": "string", "minLength": 1, "maxLength": 5000 },
|
|
"color": { "type": "string", "enum": ["yellow", "green", "blue", "pink"] },
|
|
"note": { "type": "string", "maxLength": 2000 }
|
|
}
|
|
}
|
|
}
|
|
],
|
|
"search": {
|
|
"types": ["article", "highlight"],
|
|
"languages": ["de", "en"],
|
|
"max_results": 30,
|
|
"timeout_ms": 3000
|
|
},
|
|
"data": {
|
|
"personal_data_categories": ["saved_urls", "highlights", "reading_preferences"],
|
|
"encrypted_at_rest": false,
|
|
"storage_location": "EU"
|
|
}
|
|
}
|