{
  "manifest": {
    "protocolVersion": 2,
    "pluginId": "org.betterportal.hello-view",
    "title": "BetterPortal Hello View Example",
    "description": "Example business service showing API-first view negotiation.",
    "version": "10.6.22",
    "category": "service",
    "deploymentModes": [
      "self-hosted"
    ],
    "capabilities": [
      "view.json",
      "view.metadata",
      "renderer.bootstrap5",
      "view.html",
      "stream.ndjson",
      "view.sse-render",
      "renderer.embedded"
    ],
    "supportedRenderers": [
      "bootstrap5",
      "embedded"
    ],
    "supportedRenderModes": [
      "page",
      "fragment"
    ],
    "views": [
      {
        "viewId": "about.index",
        "title": "About BetterPortal",
        "description": "Overview of BetterPortal architecture and design principles.",
        "path": "/about",
        "pathVariants": [],
        "paramsSchema": {},
        "operations": [
          {
            "operationId": "about.view",
            "method": "GET",
            "title": "About BetterPortal",
            "description": "Overview of BetterPortal architecture and design principles.",
            "querySchema": {
              "anyvaliVersion": "1.0",
              "schemaVersion": "1.1",
              "root": {
                "kind": "object",
                "properties": {},
                "required": [],
                "unknownKeys": "strip"
              },
              "definitions": {},
              "extensions": {}
            },
            "headersSchema": {
              "anyvaliVersion": "1.0",
              "schemaVersion": "1.1",
              "root": {
                "kind": "object",
                "properties": {},
                "required": [],
                "unknownKeys": "strip"
              },
              "definitions": {},
              "extensions": {}
            },
            "bodySchema": {
              "anyvaliVersion": "1.0",
              "schemaVersion": "1.1",
              "root": {
                "kind": "object",
                "properties": {},
                "required": [],
                "unknownKeys": "strip"
              },
              "definitions": {},
              "extensions": {}
            },
            "jsonResponseSchema": {
              "anyvaliVersion": "1.0",
              "schemaVersion": "1.1",
              "root": {
                "kind": "object",
                "properties": {
                  "title": {
                    "kind": "string",
                    "minLength": 1
                  },
                  "intro": {
                    "kind": "string",
                    "minLength": 1
                  },
                  "sections": {
                    "kind": "array",
                    "items": {
                      "kind": "object",
                      "properties": {
                        "title": {
                          "kind": "string",
                          "minLength": 1
                        },
                        "text": {
                          "kind": "string",
                          "minLength": 1
                        }
                      },
                      "required": [
                        "title",
                        "text"
                      ],
                      "unknownKeys": "strip"
                    }
                  },
                  "principles": {
                    "kind": "array",
                    "items": {
                      "kind": "object",
                      "properties": {
                        "title": {
                          "kind": "string",
                          "minLength": 1
                        },
                        "text": {
                          "kind": "string",
                          "minLength": 1
                        }
                      },
                      "required": [
                        "title",
                        "text"
                      ],
                      "unknownKeys": "strip"
                    }
                  },
                  "landingHref": {
                    "kind": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "title",
                  "intro",
                  "sections",
                  "principles",
                  "landingHref"
                ],
                "unknownKeys": "strip"
              },
              "definitions": {},
              "extensions": {}
            },
            "metadataResponseSchema": {},
            "renderable": true,
            "html": {
              "renderers": {
                "bootstrap5": {
                  "defaultRenderer": "default",
                  "renderModes": [
                    "page"
                  ],
                  "slots": [
                    "main"
                  ],
                  "renderers": [
                    {
                      "id": "default",
                      "title": "Default Content",
                      "slotId": "main",
                      "renderModes": [
                        "page",
                        "fragment"
                      ]
                    }
                  ]
                }
              }
            },
            "auth": {
              "required": false,
              "callers": [
                "user"
              ],
              "permissions": []
            },
            "sitemap": {
              "kind": "default"
            },
            "robots": [],
            "dependencies": [],
            "apiContracts": [],
            "demoScenarios": [],
            "cacheHints": {
              "ttlSeconds": 300,
              "varyBy": [
                "accept",
                "origin",
                "referer"
              ]
            }
          }
        ]
      },
      {
        "viewId": "delayed.index",
        "title": "Delayed Stream",
        "description": "Example streaming view: items arrive one by one as a slow data source produces them. JSON buffers, NDJSON streams frames, HTML streams rendered rows over SSE.",
        "path": "/delayed",
        "pathVariants": [],
        "paramsSchema": {},
        "operations": [
          {
            "operationId": "delayed.stream",
            "method": "GET",
            "title": "Delayed Stream",
            "description": "Example streaming view: items arrive one by one as a slow data source produces them. JSON buffers, NDJSON streams frames, HTML streams rendered rows over SSE.",
            "querySchema": {
              "anyvaliVersion": "1.0",
              "schemaVersion": "1.1",
              "root": {
                "kind": "object",
                "properties": {
                  "count": {
                    "kind": "string",
                    "default": "5"
                  },
                  "delayMs": {
                    "kind": "string",
                    "default": "400"
                  }
                },
                "required": [
                  "count",
                  "delayMs"
                ],
                "unknownKeys": "strip"
              },
              "definitions": {},
              "extensions": {}
            },
            "headersSchema": {},
            "bodySchema": {},
            "jsonResponseSchema": {
              "anyvaliVersion": "1.0",
              "schemaVersion": "1.1",
              "root": {
                "kind": "object",
                "properties": {
                  "items": {
                    "kind": "array",
                    "items": {
                      "kind": "object",
                      "properties": {
                        "id": {
                          "kind": "string",
                          "minLength": 1
                        },
                        "label": {
                          "kind": "string",
                          "minLength": 1
                        },
                        "elapsedMs": {
                          "kind": "int",
                          "min": 0
                        }
                      },
                      "required": [
                        "id",
                        "label",
                        "elapsedMs"
                      ],
                      "unknownKeys": "strip"
                    },
                    "default": []
                  },
                  "summary": {
                    "kind": "optional",
                    "inner": {
                      "kind": "object",
                      "properties": {
                        "total": {
                          "kind": "int",
                          "min": 0
                        },
                        "totalMs": {
                          "kind": "int",
                          "min": 0
                        }
                      },
                      "required": [
                        "total",
                        "totalMs"
                      ],
                      "unknownKeys": "strip"
                    }
                  }
                },
                "required": [
                  "items"
                ],
                "unknownKeys": "strip"
              },
              "definitions": {},
              "extensions": {}
            },
            "metadataResponseSchema": {},
            "renderable": true,
            "streaming": {
              "itemSchema": {
                "anyvaliVersion": "1.0",
                "schemaVersion": "1.1",
                "root": {
                  "kind": "object",
                  "properties": {
                    "id": {
                      "kind": "string",
                      "minLength": 1
                    },
                    "label": {
                      "kind": "string",
                      "minLength": 1
                    },
                    "elapsedMs": {
                      "kind": "int",
                      "min": 0
                    }
                  },
                  "required": [
                    "id",
                    "label",
                    "elapsedMs"
                  ],
                  "unknownKeys": "strip"
                },
                "definitions": {},
                "extensions": {}
              },
              "summarySchema": {
                "anyvaliVersion": "1.0",
                "schemaVersion": "1.1",
                "root": {
                  "kind": "object",
                  "properties": {
                    "total": {
                      "kind": "int",
                      "min": 0
                    },
                    "totalMs": {
                      "kind": "int",
                      "min": 0
                    }
                  },
                  "required": [
                    "total",
                    "totalMs"
                  ],
                  "unknownKeys": "strip"
                },
                "definitions": {},
                "extensions": {}
              }
            },
            "html": {
              "renderers": {
                "bootstrap5": {
                  "defaultRenderer": "default",
                  "renderModes": [
                    "page",
                    "fragment"
                  ],
                  "slots": [
                    "main"
                  ],
                  "renderers": [
                    {
                      "id": "default",
                      "title": "Default Content",
                      "slotId": "main",
                      "renderModes": [
                        "page",
                        "fragment"
                      ]
                    }
                  ]
                }
              }
            },
            "auth": {
              "required": false,
              "callers": [
                "user"
              ],
              "permissions": []
            },
            "sitemap": {
              "kind": "default"
            },
            "robots": [],
            "dependencies": [],
            "apiContracts": [],
            "demoScenarios": [],
            "cacheHints": {
              "ttlSeconds": 0,
              "varyBy": [
                "accept",
                "origin"
              ]
            }
          }
        ]
      },
      {
        "viewId": "hello.index",
        "title": "Hello View",
        "description": "Example BetterPortal view with JSON, HTML, and metadata representations.",
        "path": "/hello",
        "pathVariants": [],
        "paramsSchema": {},
        "operations": [
          {
            "operationId": "hello.view",
            "method": "GET",
            "title": "Hello View",
            "description": "Example BetterPortal view with JSON, HTML, and metadata representations.",
            "querySchema": {
              "anyvaliVersion": "1.0",
              "schemaVersion": "1.1",
              "root": {
                "kind": "object",
                "properties": {
                  "name": {
                    "kind": "string",
                    "minLength": 1,
                    "default": "World"
                  }
                },
                "required": [
                  "name"
                ],
                "unknownKeys": "strip"
              },
              "definitions": {},
              "extensions": {}
            },
            "headersSchema": {
              "anyvaliVersion": "1.0",
              "schemaVersion": "1.1",
              "root": {
                "kind": "object",
                "properties": {},
                "required": [],
                "unknownKeys": "strip"
              },
              "definitions": {},
              "extensions": {}
            },
            "bodySchema": {
              "anyvaliVersion": "1.0",
              "schemaVersion": "1.1",
              "root": {
                "kind": "object",
                "properties": {},
                "required": [],
                "unknownKeys": "strip"
              },
              "definitions": {},
              "extensions": {}
            },
            "jsonResponseSchema": {
              "anyvaliVersion": "1.0",
              "schemaVersion": "1.1",
              "root": {
                "kind": "object",
                "properties": {
                  "greeting": {
                    "kind": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "greeting"
                ],
                "unknownKeys": "strip"
              },
              "definitions": {},
              "extensions": {}
            },
            "metadataResponseSchema": {},
            "renderable": true,
            "html": {
              "renderers": {
                "bootstrap5": {
                  "defaultRenderer": "default",
                  "renderModes": [
                    "page",
                    "fragment"
                  ],
                  "slots": [
                    "main",
                    "nav.clock",
                    "nav.profile"
                  ],
                  "renderers": [
                    {
                      "id": "default",
                      "title": "Default Content",
                      "slotId": "main",
                      "renderModes": [
                        "page",
                        "fragment"
                      ]
                    },
                    {
                      "id": "nav.clock",
                      "title": "nav.clock",
                      "slotId": "nav.clock",
                      "renderModes": [
                        "fragment"
                      ]
                    },
                    {
                      "id": "nav.profile",
                      "title": "nav.profile",
                      "slotId": "nav.profile",
                      "renderModes": [
                        "fragment"
                      ]
                    }
                  ]
                },
                "embedded": {
                  "defaultRenderer": "default",
                  "renderModes": [
                    "page"
                  ],
                  "slots": [
                    "main"
                  ],
                  "renderers": [
                    {
                      "id": "default",
                      "title": "Default Content",
                      "slotId": "main",
                      "renderModes": [
                        "page",
                        "fragment"
                      ]
                    }
                  ]
                }
              }
            },
            "auth": {
              "required": false,
              "callers": [
                "user"
              ],
              "permissions": []
            },
            "sitemap": {
              "kind": "default"
            },
            "robots": [],
            "dependencies": [],
            "apiContracts": [],
            "demoScenarios": [
              {
                "id": "default",
                "title": "Default Greeting",
                "match": {
                  "query": {
                    "name": "World"
                  }
                },
                "response": {
                  "greeting": "Hello, Demo User"
                }
              }
            ],
            "cacheHints": {
              "ttlSeconds": 60,
              "varyBy": [
                "accept",
                "origin",
                "referer"
              ]
            }
          }
        ]
      },
      {
        "viewId": "landing.index",
        "title": "BetterPortal",
        "description": "Landing page for BetterPortal, the service-oriented portal framework.",
        "path": "/landing",
        "pathVariants": [],
        "paramsSchema": {},
        "operations": [
          {
            "operationId": "landing.view",
            "method": "GET",
            "title": "BetterPortal",
            "description": "Landing page for BetterPortal, the service-oriented portal framework.",
            "querySchema": {
              "anyvaliVersion": "1.0",
              "schemaVersion": "1.1",
              "root": {
                "kind": "object",
                "properties": {},
                "required": [],
                "unknownKeys": "strip"
              },
              "definitions": {},
              "extensions": {}
            },
            "headersSchema": {
              "anyvaliVersion": "1.0",
              "schemaVersion": "1.1",
              "root": {
                "kind": "object",
                "properties": {},
                "required": [],
                "unknownKeys": "strip"
              },
              "definitions": {},
              "extensions": {}
            },
            "bodySchema": {
              "anyvaliVersion": "1.0",
              "schemaVersion": "1.1",
              "root": {
                "kind": "object",
                "properties": {},
                "required": [],
                "unknownKeys": "strip"
              },
              "definitions": {},
              "extensions": {}
            },
            "jsonResponseSchema": {
              "anyvaliVersion": "1.0",
              "schemaVersion": "1.1",
              "root": {
                "kind": "object",
                "properties": {
                  "headline": {
                    "kind": "string",
                    "minLength": 1
                  },
                  "subheading": {
                    "kind": "string",
                    "minLength": 1
                  },
                  "summary": {
                    "kind": "string",
                    "minLength": 1
                  },
                  "highlights": {
                    "kind": "array",
                    "items": {
                      "kind": "object",
                      "properties": {
                        "title": {
                          "kind": "string",
                          "minLength": 1
                        },
                        "text": {
                          "kind": "string",
                          "minLength": 1
                        }
                      },
                      "required": [
                        "title",
                        "text"
                      ],
                      "unknownKeys": "strip"
                    }
                  },
                  "capabilities": {
                    "kind": "array",
                    "items": {
                      "kind": "object",
                      "properties": {
                        "title": {
                          "kind": "string",
                          "minLength": 1
                        },
                        "text": {
                          "kind": "string",
                          "minLength": 1
                        }
                      },
                      "required": [
                        "title",
                        "text"
                      ],
                      "unknownKeys": "strip"
                    }
                  },
                  "audiences": {
                    "kind": "array",
                    "items": {
                      "kind": "object",
                      "properties": {
                        "title": {
                          "kind": "string",
                          "minLength": 1
                        },
                        "text": {
                          "kind": "string",
                          "minLength": 1
                        }
                      },
                      "required": [
                        "title",
                        "text"
                      ],
                      "unknownKeys": "strip"
                    }
                  },
                  "aboutHref": {
                    "kind": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "headline",
                  "subheading",
                  "summary",
                  "highlights",
                  "capabilities",
                  "audiences",
                  "aboutHref"
                ],
                "unknownKeys": "strip"
              },
              "definitions": {},
              "extensions": {}
            },
            "metadataResponseSchema": {},
            "renderable": true,
            "html": {
              "renderers": {
                "bootstrap5": {
                  "defaultRenderer": "default",
                  "renderModes": [
                    "page"
                  ],
                  "slots": [
                    "main"
                  ],
                  "renderers": [
                    {
                      "id": "default",
                      "title": "Default Content",
                      "slotId": "main",
                      "renderModes": [
                        "page",
                        "fragment"
                      ]
                    }
                  ]
                }
              }
            },
            "auth": {
              "required": false,
              "callers": [
                "user"
              ],
              "permissions": []
            },
            "sitemap": {
              "kind": "default"
            },
            "robots": [],
            "dependencies": [],
            "chrome": {
              "fullScreen": true
            },
            "apiContracts": [],
            "demoScenarios": [],
            "cacheHints": {
              "ttlSeconds": 300,
              "varyBy": [
                "accept",
                "origin",
                "referer"
              ]
            }
          }
        ]
      }
    ],
    "configSchemas": [
      {
        "id": "hello.tenant",
        "title": "Hello Tenant Config",
        "description": "Tenant-scoped config for the hello example service.",
        "scope": "tenant",
        "jsonSchema": {
          "greetingPrefix": "string",
          "supportEmail": "string",
          "apiKey": "string"
        },
        "fields": [
          {
            "key": "greetingPrefix",
            "title": "Greeting Prefix",
            "description": "Prefix shown before the hello response.",
            "scope": "tenant",
            "visibility": "protected",
            "ownership": "plugin",
            "sourceOfTruth": "plugin",
            "required": false
          },
          {
            "key": "supportEmail",
            "title": "Support Email",
            "description": "Support contact shown in admin tooling.",
            "scope": "tenant",
            "visibility": "protected",
            "ownership": "mixed",
            "sourceOfTruth": "bp",
            "required": false
          },
          {
            "key": "apiKey",
            "title": "API Key",
            "description": "Example secret field for managed service credentials.",
            "scope": "tenant",
            "visibility": "secret",
            "ownership": "plugin",
            "sourceOfTruth": "plugin",
            "required": false
          }
        ]
      },
      {
        "id": "hello.app",
        "title": "Hello App Override",
        "description": "App-specific overrides for the hello example service.",
        "scope": "app",
        "jsonSchema": {
          "displayName": "string"
        },
        "fields": [
          {
            "key": "displayName",
            "title": "Display Name",
            "description": "Overrides the display name for the app context.",
            "scope": "app",
            "visibility": "protected",
            "ownership": "mixed",
            "sourceOfTruth": "bp",
            "required": false
          }
        ]
      }
    ],
    "permissions": [],
    "adminApis": [
      {
        "id": "config.schema",
        "title": "Config Schema",
        "description": "BetterPortal-managed config schemas for this service.",
        "path": "/.well-known/bp/config/schema",
        "methods": [
          "GET"
        ],
        "supportsCustomUi": false
      },
      {
        "id": "config.values",
        "title": "Config Values",
        "description": "Read and write BetterPortal-managed config values.",
        "path": "/.well-known/bp/config",
        "methods": [
          "GET",
          "POST"
        ],
        "supportsCustomUi": false
      }
    ],
    "webhooks": [],
    "apiContracts": [],
    "m2mRequests": [],
    "developerResources": [],
    "cacheHints": {
      "metadataTtlSeconds": 1800
    }
  },
  "routes": [
    {
      "viewId": "about.index",
      "path": "/about",
      "pathVariants": [],
      "operations": [
        {
          "operationId": "about.view",
          "method": "GET"
        }
      ],
      "paramNames": [],
      "renderers": [
        "bootstrap5"
      ],
      "hasFragments": false,
      "fragments": [],
      "components": []
    },
    {
      "viewId": "delayed.index",
      "path": "/delayed",
      "pathVariants": [],
      "operations": [
        {
          "operationId": "delayed.stream",
          "method": "GET"
        }
      ],
      "paramNames": [],
      "renderers": [
        "bootstrap5"
      ],
      "hasFragments": false,
      "fragments": [],
      "components": []
    },
    {
      "viewId": "hello.index",
      "path": "/hello",
      "pathVariants": [],
      "operations": [
        {
          "operationId": "hello.view",
          "method": "GET"
        }
      ],
      "paramNames": [],
      "renderers": [
        "bootstrap5",
        "embedded"
      ],
      "hasFragments": true,
      "fragments": [
        {
          "fragmentLocation": "nav",
          "fragmentId": "clock",
          "operationId": "hello.view",
          "method": "GET",
          "renderers": [
            "bootstrap5"
          ]
        },
        {
          "fragmentLocation": "nav",
          "fragmentId": "profile",
          "operationId": "hello.view",
          "method": "GET",
          "renderers": [
            "bootstrap5"
          ]
        }
      ],
      "components": [
        "showcase-cards",
        "showcase-data",
        "showcase-elements",
        "showcase-forms",
        "showcase-interactive",
        "showcase-overlays",
        "showcase-patterns"
      ]
    },
    {
      "viewId": "landing.index",
      "path": "/landing",
      "pathVariants": [],
      "operations": [
        {
          "operationId": "landing.view",
          "method": "GET"
        }
      ],
      "paramNames": [],
      "renderers": [
        "bootstrap5"
      ],
      "hasFragments": false,
      "fragments": [],
      "components": []
    }
  ]
}
