[{"data":1,"prerenderedAt":440},["ShallowReactive",2],{"navigation_docs":3,"-apps-services-overview":196,"-apps-services-overview-surround":435},[4,127,166],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":36},"Kinotic Apps","i-lucide-rocket","\u002Fapps","1.apps",[10,14,18,37,58,91,106,122],{"title":11,"path":12,"stem":13},"Introduction","\u002Fapps\u002Fintroduction","1.apps\u002F1.introduction",{"title":15,"path":16,"stem":17},"Quick Start","\u002Fapps\u002Fquick-start","1.apps\u002F2.quick-start",{"title":19,"icon":20,"path":21,"stem":22,"children":23,"page":36},"Application Structure","i-lucide-folder-tree","\u002Fapps\u002Fapplication-structure","1.apps\u002F3.application-structure",[24,28,32],{"title":25,"path":26,"stem":27},"Overview","\u002Fapps\u002Fapplication-structure\u002Foverview","1.apps\u002F3.application-structure\u002F1.overview",{"title":29,"path":30,"stem":31},"Applications and Projects","\u002Fapps\u002Fapplication-structure\u002Fapplications-and-projects","1.apps\u002F3.application-structure\u002F2.applications-and-projects",{"title":33,"path":34,"stem":35},"Artifact Types","\u002Fapps\u002Fapplication-structure\u002Fartifact-types","1.apps\u002F3.application-structure\u002F3.artifact-types",false,{"title":38,"icon":39,"path":40,"stem":41,"children":42,"page":36},"Services","i-lucide-network","\u002Fapps\u002Fservices","1.apps\u002F4.services",[43,46,50,54],{"title":25,"path":44,"stem":45},"\u002Fapps\u002Fservices\u002Foverview","1.apps\u002F4.services\u002F1.overview",{"title":47,"path":48,"stem":49},"Publishing Services","\u002Fapps\u002Fservices\u002Fpublishing-services","1.apps\u002F4.services\u002F2.publishing-services",{"title":51,"path":52,"stem":53},"Service Proxies","\u002Fapps\u002Fservices\u002Fservice-proxies","1.apps\u002F4.services\u002F3.service-proxies",{"title":55,"path":56,"stem":57},"Streaming","\u002Fapps\u002Fservices\u002Fstreaming","1.apps\u002F4.services\u002F4.streaming",{"title":59,"icon":60,"path":61,"stem":62,"children":63,"page":36},"Persistence","i-lucide-database","\u002Fapps\u002Fpersistence","1.apps\u002F5.persistence",[64,67,71,75,79,83,87],{"title":25,"path":65,"stem":66},"\u002Fapps\u002Fpersistence\u002Foverview","1.apps\u002F5.persistence\u002F1.overview",{"title":68,"path":69,"stem":70},"Defining Entities","\u002Fapps\u002Fpersistence\u002Fdefining-entities","1.apps\u002F5.persistence\u002F2.defining-entities",{"title":72,"path":73,"stem":74},"Entity Decorators","\u002Fapps\u002Fpersistence\u002Fentity-decorators","1.apps\u002F5.persistence\u002F3.entity-decorators",{"title":76,"path":77,"stem":78},"CRUD Operations","\u002Fapps\u002Fpersistence\u002Fcrud-operations","1.apps\u002F5.persistence\u002F4.crud-operations",{"title":80,"path":81,"stem":82},"Named Queries","\u002Fapps\u002Fpersistence\u002Fnamed-queries","1.apps\u002F5.persistence\u002F5.named-queries",{"title":84,"path":85,"stem":86},"Multi-Tenancy","\u002Fapps\u002Fpersistence\u002Fmulti-tenancy","1.apps\u002F5.persistence\u002F6.multi-tenancy",{"title":88,"path":89,"stem":90},"Migrations","\u002Fapps\u002Fpersistence\u002Fmigrations","1.apps\u002F5.persistence\u002F7.migrations",{"title":92,"icon":93,"path":94,"stem":95,"children":96,"page":36},"Security","i-lucide-shield-check","\u002Fapps\u002Fsecurity","1.apps\u002F6.security",[97,101],{"title":98,"path":99,"stem":100,"icon":93},"Access Control","\u002Fapps\u002Fsecurity\u002Faccess-control","1.apps\u002F6.security\u002F1.access-control",{"title":102,"path":103,"stem":104,"icon":105},"Authentication","\u002Fapps\u002Fsecurity\u002Fauthentication","1.apps\u002F6.security\u002F2.authentication","i-lucide-key-round",{"title":107,"icon":108,"path":109,"stem":110,"children":111,"page":36},"Deployment","i-lucide-cloud-upload","\u002Fapps\u002Fdeployment","1.apps\u002F7.deployment",[112,117],{"title":113,"path":114,"stem":115,"icon":116},"Deployment Workflow","\u002Fapps\u002Fdeployment\u002Fworkflow","1.apps\u002F7.deployment\u002F1.workflow","i-lucide-git-branch",{"title":118,"path":119,"stem":120,"icon":121},"Environments","\u002Fapps\u002Fdeployment\u002Fenvironments","1.apps\u002F7.deployment\u002F2.environments","i-lucide-server",{"title":123,"path":124,"stem":125,"icon":126},"CLI Reference","\u002Fapps\u002Fcli-reference","1.apps\u002F8.cli-reference","i-lucide-terminal",{"title":128,"icon":121,"path":129,"stem":130,"children":131,"page":36},"Kinotic OS","\u002Fplatform","2.platform",[132,137,141,146,151,156,161],{"title":133,"path":134,"stem":135,"icon":136},"System Architecture","\u002Fplatform\u002Farchitecture","2.platform\u002F1.architecture","i-lucide-boxes",{"title":138,"path":139,"stem":140,"icon":6},"Deployment Guide","\u002Fplatform\u002Fdeployment-guide","2.platform\u002F2.deployment-guide",{"title":142,"path":143,"stem":144,"icon":145},"Configuration","\u002Fplatform\u002Fconfiguration","2.platform\u002F3.configuration","i-lucide-settings",{"title":147,"path":148,"stem":149,"icon":150},"Organization Management","\u002Fplatform\u002Forganization-management","2.platform\u002F4.organization-management","i-lucide-building-2",{"title":152,"path":153,"stem":154,"icon":155},"System Security","\u002Fplatform\u002Fsystem-security","2.platform\u002F5.system-security","i-lucide-shield",{"title":157,"path":158,"stem":159,"icon":160},"Observability","\u002Fplatform\u002Fobservability","2.platform\u002F6.observability","i-lucide-activity",{"title":162,"path":163,"stem":164,"icon":165},"Contributing","\u002Fplatform\u002Fcontributing","2.platform\u002F7.contributing","i-lucide-git-pull-request",{"title":167,"icon":168,"path":169,"stem":170,"children":171,"page":36},"Reference","i-lucide-book-open","\u002Freference","3.reference",[172,177,181,186,191],{"title":173,"path":174,"stem":175,"icon":176},"Decorators Reference","\u002Freference\u002Fdecorators","3.reference\u002F1.decorators","i-lucide-at-sign",{"title":178,"path":179,"stem":180,"icon":60},"Migration SQL Grammar","\u002Freference\u002Fmigration-sql-grammar","3.reference\u002F2.migration-sql-grammar",{"title":182,"path":183,"stem":184,"icon":185},"ABAC Expression Language","\u002Freference\u002Fabac-expression-language","3.reference\u002F3.abac-expression-language","i-lucide-file-code",{"title":187,"path":188,"stem":189,"icon":190},"CRI Format","\u002Freference\u002Fcri-format","3.reference\u002F4.cri-format","i-lucide-link",{"title":192,"path":193,"stem":194,"icon":195},"SDK Packages","\u002Freference\u002Fsdk-packages","3.reference\u002F5.sdk-packages","i-lucide-package",{"id":197,"title":25,"body":198,"description":428,"extension":429,"links":430,"meta":431,"navigation":432,"path":44,"seo":433,"stem":45,"__hash__":434},"docs\u002F1.apps\u002F4.services\u002F1.overview.md",{"type":199,"value":200,"toc":418},"minimark",[201,205,210,238,241,245,248,253,260,314,317,324,393,397,400,403,414],[202,203,204],"p",{},"Services are the building blocks of Kinotic applications. Any TypeScript class can be published as a remote service, making its methods callable from any connected client or other service.",[206,207,209],"h2",{"id":208},"how-it-works","How It Works",[211,212,213,226,232],"ol",{},[214,215,216,220,221,225],"li",{},[217,218,219],"strong",{},"Publish"," -- Decorate a class with ",[222,223,224],"code",{},"@Publish"," and its methods become remotely callable",[214,227,228,231],{},[217,229,230],{},"Discover"," -- The platform automatically registers the service and generates proxy classes for consumers",[214,233,234,237],{},[217,235,236],{},"Call"," -- Other services and frontends invoke methods through the generated proxies as if they were local",[202,239,240],{},"You don't configure routing, serialization, or service discovery. The platform handles all of that.",[206,242,244],{"id":243},"communication-patterns","Communication Patterns",[202,246,247],{},"Kinotic supports two communication patterns.",[249,250,252],"h3",{"id":251},"request-response","Request-Response",[202,254,255,256,259],{},"Standard RPC. The caller invokes a method and receives a single result as a ",[222,257,258],{},"Promise",".",[261,262,267],"pre",{"className":263,"code":264,"language":265,"meta":266,"style":266},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const result = await greetingService.hello('World')\n","typescript","",[222,268,269],{"__ignoreMap":266},[270,271,274,278,282,286,290,293,295,299,302,305,309,311],"span",{"class":272,"line":273},"line",1,[270,275,277],{"class":276},"spNyl","const",[270,279,281],{"class":280},"sTEyZ"," result ",[270,283,285],{"class":284},"sMK4o","=",[270,287,289],{"class":288},"s7zQu"," await",[270,291,292],{"class":280}," greetingService",[270,294,259],{"class":284},[270,296,298],{"class":297},"s2Zo4","hello",[270,300,301],{"class":280},"(",[270,303,304],{"class":284},"'",[270,306,308],{"class":307},"sfazB","World",[270,310,304],{"class":284},[270,312,313],{"class":280},")\n",[249,315,55],{"id":316},"streaming",[202,318,319,320,323],{},"The service pushes multiple values over time. The caller receives an ",[222,321,322],{},"Observable"," and can process each value as it arrives.",[261,325,327],{"className":263,"code":326,"language":265,"meta":266,"style":266},"const stream$ = sensorService.streamReadings('sensor-1')\nstream$.subscribe((reading) => console.log(reading))\n",[222,328,329,357],{"__ignoreMap":266},[270,330,331,333,336,338,341,343,346,348,350,353,355],{"class":272,"line":273},[270,332,277],{"class":276},[270,334,335],{"class":280}," stream$ ",[270,337,285],{"class":284},[270,339,340],{"class":280}," sensorService",[270,342,259],{"class":284},[270,344,345],{"class":297},"streamReadings",[270,347,301],{"class":280},[270,349,304],{"class":284},[270,351,352],{"class":307},"sensor-1",[270,354,304],{"class":284},[270,356,313],{"class":280},[270,358,360,363,365,368,370,372,376,379,382,385,387,390],{"class":272,"line":359},2,[270,361,362],{"class":280},"stream$",[270,364,259],{"class":284},[270,366,367],{"class":297},"subscribe",[270,369,301],{"class":280},[270,371,301],{"class":284},[270,373,375],{"class":374},"sHdIc","reading",[270,377,378],{"class":284},")",[270,380,381],{"class":276}," =>",[270,383,384],{"class":280}," console",[270,386,259],{"class":284},[270,388,389],{"class":297},"log",[270,391,392],{"class":280},"(reading))\n",[206,394,396],{"id":395},"service-to-service-calls","Service-to-Service Calls",[202,398,399],{},"Services can call other services transparently. A published service uses a proxy to another service and invokes it the same way any external client would. The platform routes the call without the caller needing to know where the target service is running.",[206,401,98],{"id":402},"access-control",[202,404,405,406,409,410,413],{},"You can attach ",[222,407,408],{},"@AbacPolicy"," expressions to service methods to enforce authorization before the method runs. See ",[411,412,98],"a",{"href":99}," for details.",[415,416,417],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":266,"searchDepth":359,"depth":359,"links":419},[420,421,426,427],{"id":208,"depth":359,"text":209},{"id":243,"depth":359,"text":244,"children":422},[423,425],{"id":251,"depth":424,"text":252},3,{"id":316,"depth":424,"text":55},{"id":395,"depth":359,"text":396},{"id":402,"depth":359,"text":98},"How services work in Kinotic and the communication patterns they support.","md",null,{},true,{"title":25,"description":428},"td6A8r2bU0t5Ws-0oECbdWXM2vMfoqtOcpdr5UEJdBo",[436,438],{"title":33,"path":34,"stem":35,"description":437,"children":-1},"Learn about the different artifact types a Kinotic project can contribute -- from persistence and microservices to frontends.",{"title":47,"path":48,"stem":49,"description":439,"children":-1},"How to publish TypeScript services in Kinotic using decorators.",1775187764756]