[{"data":1,"prerenderedAt":984},["ShallowReactive",2],{"navigation_docs":3,"-apps-services-publishing-services":196,"-apps-services-publishing-services-surround":979},[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":47,"body":198,"description":973,"extension":974,"links":975,"meta":976,"navigation":271,"path":48,"seo":977,"stem":49,"__hash__":978},"docs\u002F1.apps\u002F4.services\u002F2.publishing-services.md",{"type":199,"value":200,"toc":963},"minimark",[201,213,218,449,459,463,468,475,479,486,490,493,653,663,667,670,816,822,826,841,952,959],[202,203,204,205,209,210,212],"p",{},"Use the ",[206,207,208],"code",{},"@Publish"," decorator to expose any TypeScript class as a remote service. The namespace you pass to ",[206,211,208],{}," combined with the class name forms the service identifier that callers use to reach it.",[214,215,217],"h2",{"id":216},"basic-example","Basic Example",[219,220,225],"pre",{"className":221,"code":222,"language":223,"meta":224,"style":224},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { Publish, Version } from '@kinotic-ai\u002Fcore'\n\n@Version('1.0.0')\n@Publish('com.example')\nclass GreetingService {\n    hello(name: string): string {\n        return `Hello, ${name}!`\n    }\n\n    add(a: number, b: number): number {\n        return a + b\n    }\n}\n","typescript","",[206,226,227,266,273,297,316,330,356,382,388,393,424,438,443],{"__ignoreMap":224},[228,229,232,236,240,244,247,250,253,256,259,263],"span",{"class":230,"line":231},"line",1,[228,233,235],{"class":234},"s7zQu","import",[228,237,239],{"class":238},"sMK4o"," {",[228,241,243],{"class":242},"sTEyZ"," Publish",[228,245,246],{"class":238},",",[228,248,249],{"class":242}," Version",[228,251,252],{"class":238}," }",[228,254,255],{"class":234}," from",[228,257,258],{"class":238}," '",[228,260,262],{"class":261},"sfazB","@kinotic-ai\u002Fcore",[228,264,265],{"class":238},"'\n",[228,267,269],{"class":230,"line":268},2,[228,270,272],{"emptyLinePlaceholder":271},true,"\n",[228,274,276,279,283,286,289,292,294],{"class":230,"line":275},3,[228,277,278],{"class":238},"@",[228,280,282],{"class":281},"s2Zo4","Version",[228,284,285],{"class":242},"(",[228,287,288],{"class":238},"'",[228,290,291],{"class":261},"1.0.0",[228,293,288],{"class":238},[228,295,296],{"class":242},")\n",[228,298,300,302,305,307,309,312,314],{"class":230,"line":299},4,[228,301,278],{"class":238},[228,303,304],{"class":281},"Publish",[228,306,285],{"class":242},[228,308,288],{"class":238},[228,310,311],{"class":261},"com.example",[228,313,288],{"class":238},[228,315,296],{"class":242},[228,317,319,323,327],{"class":230,"line":318},5,[228,320,322],{"class":321},"spNyl","class",[228,324,326],{"class":325},"sBMFI"," GreetingService",[228,328,329],{"class":238}," {\n",[228,331,333,337,339,343,346,349,352,354],{"class":230,"line":332},6,[228,334,336],{"class":335},"swJcz","    hello",[228,338,285],{"class":238},[228,340,342],{"class":341},"sHdIc","name",[228,344,345],{"class":238},":",[228,347,348],{"class":325}," string",[228,350,351],{"class":238},"):",[228,353,348],{"class":325},[228,355,329],{"class":238},[228,357,359,362,365,368,371,373,376,379],{"class":230,"line":358},7,[228,360,361],{"class":234},"        return",[228,363,364],{"class":238}," `",[228,366,367],{"class":261},"Hello, ",[228,369,370],{"class":238},"${",[228,372,342],{"class":242},[228,374,375],{"class":238},"}",[228,377,378],{"class":261},"!",[228,380,381],{"class":238},"`\n",[228,383,385],{"class":230,"line":384},8,[228,386,387],{"class":238},"    }\n",[228,389,391],{"class":230,"line":390},9,[228,392,272],{"emptyLinePlaceholder":271},[228,394,396,399,401,404,406,409,411,414,416,418,420,422],{"class":230,"line":395},10,[228,397,398],{"class":335},"    add",[228,400,285],{"class":238},[228,402,403],{"class":341},"a",[228,405,345],{"class":238},[228,407,408],{"class":325}," number",[228,410,246],{"class":238},[228,412,413],{"class":341}," b",[228,415,345],{"class":238},[228,417,408],{"class":325},[228,419,351],{"class":238},[228,421,408],{"class":325},[228,423,329],{"class":238},[228,425,427,429,432,435],{"class":230,"line":426},11,[228,428,361],{"class":234},[228,430,431],{"class":242}," a",[228,433,434],{"class":238}," +",[228,436,437],{"class":242}," b\n",[228,439,441],{"class":230,"line":440},12,[228,442,387],{"class":238},[228,444,446],{"class":230,"line":445},13,[228,447,448],{"class":238},"}\n",[202,450,451,452,455,456,458],{},"This registers the service as ",[206,453,454],{},"com.example.GreetingService"," at version ",[206,457,291],{},". Every public method on the class becomes a remotely callable operation.",[214,460,462],{"id":461},"decorators","Decorators",[464,465,467],"h3",{"id":466},"publishnamespace","@Publish(namespace)",[202,469,470,471,474],{},"Marks a class for publication. The full service identifier becomes ",[206,472,473],{},"namespace.ClassName",".",[464,476,478],{"id":477},"versionversion","@Version(version)",[202,480,481,482,485],{},"Sets the semantic version for the service in ",[206,483,484],{},"X.Y.Z"," format. Callers can pin to a specific version when resolving the service.",[464,487,489],{"id":488},"scope","@Scope",[202,491,492],{},"A property decorator that designates a field as the scope identifier. Scope narrows which service instance handles a request, which is useful for multi-tenant or per-device services.",[219,494,496],{"className":221,"code":495,"language":223,"meta":224,"style":224},"import { Publish, Scope } from '@kinotic-ai\u002Fcore'\n\n@Publish('com.example')\nclass DeviceService {\n    @Scope\n    deviceId: string\n\n    constructor(deviceId: string) {\n        this.deviceId = deviceId\n    }\n\n    getStatus(): string {\n        return `Status for device ${this.deviceId}`\n    }\n}\n",[206,497,498,521,525,541,550,558,568,572,591,604,608,612,624,643,648],{"__ignoreMap":224},[228,499,500,502,504,506,508,511,513,515,517,519],{"class":230,"line":231},[228,501,235],{"class":234},[228,503,239],{"class":238},[228,505,243],{"class":242},[228,507,246],{"class":238},[228,509,510],{"class":242}," Scope",[228,512,252],{"class":238},[228,514,255],{"class":234},[228,516,258],{"class":238},[228,518,262],{"class":261},[228,520,265],{"class":238},[228,522,523],{"class":230,"line":268},[228,524,272],{"emptyLinePlaceholder":271},[228,526,527,529,531,533,535,537,539],{"class":230,"line":275},[228,528,278],{"class":238},[228,530,304],{"class":281},[228,532,285],{"class":242},[228,534,288],{"class":238},[228,536,311],{"class":261},[228,538,288],{"class":238},[228,540,296],{"class":242},[228,542,543,545,548],{"class":230,"line":299},[228,544,322],{"class":321},[228,546,547],{"class":325}," DeviceService",[228,549,329],{"class":238},[228,551,552,555],{"class":230,"line":318},[228,553,554],{"class":238},"    @",[228,556,557],{"class":242},"Scope\n",[228,559,560,563,565],{"class":230,"line":332},[228,561,562],{"class":335},"    deviceId",[228,564,345],{"class":238},[228,566,567],{"class":325}," string\n",[228,569,570],{"class":230,"line":358},[228,571,272],{"emptyLinePlaceholder":271},[228,573,574,577,579,582,584,586,589],{"class":230,"line":384},[228,575,576],{"class":321},"    constructor",[228,578,285],{"class":238},[228,580,581],{"class":341},"deviceId",[228,583,345],{"class":238},[228,585,348],{"class":325},[228,587,588],{"class":238},")",[228,590,329],{"class":238},[228,592,593,596,598,601],{"class":230,"line":390},[228,594,595],{"class":238},"        this.",[228,597,581],{"class":242},[228,599,600],{"class":238}," =",[228,602,603],{"class":242}," deviceId\n",[228,605,606],{"class":230,"line":395},[228,607,387],{"class":238},[228,609,610],{"class":230,"line":426},[228,611,272],{"emptyLinePlaceholder":271},[228,613,614,617,620,622],{"class":230,"line":440},[228,615,616],{"class":335},"    getStatus",[228,618,619],{"class":238},"():",[228,621,348],{"class":325},[228,623,329],{"class":238},[228,625,626,628,630,633,635,638,640],{"class":230,"line":445},[228,627,361],{"class":234},[228,629,364],{"class":238},[228,631,632],{"class":261},"Status for device ",[228,634,370],{"class":238},[228,636,637],{"class":238},"this.",[228,639,581],{"class":242},[228,641,642],{"class":238},"}`\n",[228,644,646],{"class":230,"line":645},14,[228,647,387],{"class":238},[228,649,651],{"class":230,"line":650},15,[228,652,448],{"class":238},[202,654,655,656,659,660,662],{},"When a caller targets a specific scope (e.g., ",[206,657,658],{},"device-42","), the platform routes the request to the instance whose ",[206,661,581],{}," matches.",[464,664,666],{"id":665},"context","@Context()",[202,668,669],{},"A parameter decorator that injects the request context into a method. The context carries information about the caller, such as the authenticated participant.",[219,671,673],{"className":221,"code":672,"language":223,"meta":224,"style":224},"import { Publish, Context } from '@kinotic-ai\u002Fcore'\n\n@Publish('com.example')\nclass AuditService {\n    logAction(action: string, @Context() ctx: any): void {\n        console.log(`${ctx.participant.id} performed ${action}`)\n    }\n}\n",[206,674,675,698,702,718,727,767,808,812],{"__ignoreMap":224},[228,676,677,679,681,683,685,688,690,692,694,696],{"class":230,"line":231},[228,678,235],{"class":234},[228,680,239],{"class":238},[228,682,243],{"class":242},[228,684,246],{"class":238},[228,686,687],{"class":242}," Context",[228,689,252],{"class":238},[228,691,255],{"class":234},[228,693,258],{"class":238},[228,695,262],{"class":261},[228,697,265],{"class":238},[228,699,700],{"class":230,"line":268},[228,701,272],{"emptyLinePlaceholder":271},[228,703,704,706,708,710,712,714,716],{"class":230,"line":275},[228,705,278],{"class":238},[228,707,304],{"class":281},[228,709,285],{"class":242},[228,711,288],{"class":238},[228,713,311],{"class":261},[228,715,288],{"class":238},[228,717,296],{"class":242},[228,719,720,722,725],{"class":230,"line":299},[228,721,322],{"class":321},[228,723,724],{"class":325}," AuditService",[228,726,329],{"class":238},[228,728,729,732,734,737,739,741,743,746,749,752,755,757,760,762,765],{"class":230,"line":318},[228,730,731],{"class":335},"    logAction",[228,733,285],{"class":238},[228,735,736],{"class":341},"action",[228,738,345],{"class":238},[228,740,348],{"class":325},[228,742,246],{"class":238},[228,744,745],{"class":238}," @",[228,747,748],{"class":281},"Context",[228,750,751],{"class":242},"() ",[228,753,754],{"class":341},"ctx",[228,756,345],{"class":238},[228,758,759],{"class":325}," any",[228,761,351],{"class":238},[228,763,764],{"class":325}," void",[228,766,329],{"class":238},[228,768,769,772,774,777,779,782,784,786,789,791,794,796,799,801,803,806],{"class":230,"line":332},[228,770,771],{"class":242},"        console",[228,773,474],{"class":238},[228,775,776],{"class":281},"log",[228,778,285],{"class":335},[228,780,781],{"class":238},"`${",[228,783,754],{"class":242},[228,785,474],{"class":238},[228,787,788],{"class":242},"participant",[228,790,474],{"class":238},[228,792,793],{"class":242},"id",[228,795,375],{"class":238},[228,797,798],{"class":261}," performed ",[228,800,370],{"class":238},[228,802,736],{"class":242},[228,804,805],{"class":238},"}`",[228,807,296],{"class":335},[228,809,810],{"class":230,"line":358},[228,811,387],{"class":238},[228,813,814],{"class":230,"line":384},[228,815,448],{"class":238},[202,817,818,819,821],{},"The ",[206,820,666],{}," parameter is invisible to callers. They do not pass it as an argument; the platform injects it automatically.",[464,823,825],{"id":824},"abacpolicyexpression","@AbacPolicy(expression)",[202,827,828,829,833,834,836,837,840],{},"Enforces attribute-based access control ",[830,831,832],"strong",{},"before"," the method is invoked. The expression can reference properties of the caller (",[206,835,788],{},") and the method arguments. Multiple ",[206,838,839],{},"@AbacPolicy"," decorators on the same method are combined with AND semantics -- all policies must pass.",[219,842,844],{"className":221,"code":843,"language":223,"meta":224,"style":224},"import { Publish, AbacPolicy } from '@kinotic-ai\u002Fcore'\n\n@Publish('com.example')\nclass OrderService {\n    @AbacPolicy(\"participant.roles contains 'finance' and order.amount \u003C 50000\")\n    placeOrder(order: Order): void {\n        \u002F\u002F Only reached if caller has 'finance' role AND order under 50k\n    }\n}\n",[206,845,846,869,873,889,898,917,938,944,948],{"__ignoreMap":224},[228,847,848,850,852,854,856,859,861,863,865,867],{"class":230,"line":231},[228,849,235],{"class":234},[228,851,239],{"class":238},[228,853,243],{"class":242},[228,855,246],{"class":238},[228,857,858],{"class":242}," AbacPolicy",[228,860,252],{"class":238},[228,862,255],{"class":234},[228,864,258],{"class":238},[228,866,262],{"class":261},[228,868,265],{"class":238},[228,870,871],{"class":230,"line":268},[228,872,272],{"emptyLinePlaceholder":271},[228,874,875,877,879,881,883,885,887],{"class":230,"line":275},[228,876,278],{"class":238},[228,878,304],{"class":281},[228,880,285],{"class":242},[228,882,288],{"class":238},[228,884,311],{"class":261},[228,886,288],{"class":238},[228,888,296],{"class":242},[228,890,891,893,896],{"class":230,"line":299},[228,892,322],{"class":321},[228,894,895],{"class":325}," OrderService",[228,897,329],{"class":238},[228,899,900,902,905,907,910,913,915],{"class":230,"line":318},[228,901,554],{"class":238},[228,903,904],{"class":281},"AbacPolicy",[228,906,285],{"class":242},[228,908,909],{"class":238},"\"",[228,911,912],{"class":261},"participant.roles contains 'finance' and order.amount \u003C 50000",[228,914,909],{"class":238},[228,916,296],{"class":242},[228,918,919,922,924,927,929,932,934,936],{"class":230,"line":332},[228,920,921],{"class":335},"    placeOrder",[228,923,285],{"class":238},[228,925,926],{"class":341},"order",[228,928,345],{"class":238},[228,930,931],{"class":325}," Order",[228,933,351],{"class":238},[228,935,764],{"class":325},[228,937,329],{"class":238},[228,939,940],{"class":230,"line":358},[228,941,943],{"class":942},"sHwdD","        \u002F\u002F Only reached if caller has 'finance' role AND order under 50k\n",[228,945,946],{"class":230,"line":384},[228,947,387],{"class":238},[228,949,950],{"class":230,"line":390},[228,951,448],{"class":238},[202,953,954,955,958],{},"If any policy expression evaluates to ",[206,956,957],{},"false",", the platform rejects the call before it reaches the service.",[960,961,962],"style",{},"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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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}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 .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":224,"searchDepth":268,"depth":268,"links":964},[965,966],{"id":216,"depth":268,"text":217},{"id":461,"depth":268,"text":462,"children":967},[968,969,970,971,972],{"id":466,"depth":275,"text":467},{"id":477,"depth":275,"text":478},{"id":488,"depth":275,"text":489},{"id":665,"depth":275,"text":666},{"id":824,"depth":275,"text":825},"How to publish TypeScript services in Kinotic using decorators.","md",null,{},{"title":47,"description":973},"NHt44XFqr6XW4M89GbU6JpjGaVUiy83lMujHvQLtYYg",[980,982],{"title":25,"path":44,"stem":45,"description":981,"children":-1},"How services work in Kinotic and the communication patterns they support.",{"title":51,"path":52,"stem":53,"description":983,"children":-1},"How to call remote services using service proxies in Kinotic.",1775187764771]