[{"data":1,"prerenderedAt":1685},["ShallowReactive",2],{"docs-sections":3,"docs-page-\u002Fdocs\u002Fapi":123},[4,9,13,17,22,26,30,34,38,42,46,50,55,59,63,67,72,76,80,85,89,93,97,102,106,110,114,119],{"path":5,"title":6,"description":7,"group":8},"\u002Fdocs","Introduction","What tunables is, the problem it solves, and the principles it holds to.","Get started",{"path":10,"title":11,"description":12,"group":8},"\u002Fdocs\u002Fquickstart","Quickstart","Take one group of settings from constants to a screen with a history, in a Nuxt app on Postgres.",{"path":14,"title":15,"description":16,"group":8},"\u002Fdocs\u002Fpatterns","What it is for","The kinds of value tunables keeps — live limits, plans, per-workspace and per-person values, model choices, values that bound each other, costly switches — and the feature that does each.",{"path":18,"title":19,"description":20,"group":21},"\u002Fdocs\u002Fsettings-and-groups","Settings and groups","Declare each setting once, in a group edited beside what it affects, and read it with types.","Concepts",{"path":23,"title":24,"description":25,"group":21},"\u002Fdocs\u002Fkinds-and-units","Kinds and units","The eight kinds of setting, the built-in units, your own units, and how values are checked and read.",{"path":27,"title":28,"description":29,"group":21},"\u002Fdocs\u002Fchecks-and-guards","Checks and guards","Rules across settings, guards for what your app keeps, within for presets, confirmations for costly changes, and notes.",{"path":31,"title":32,"description":33,"group":21},"\u002Fdocs\u002Fhistory-and-restore","History and restore","Every change is a revision with who, when, why and each value before and after; restoring one runs the same checks as any save.",{"path":35,"title":36,"description":37,"group":21},"\u002Fdocs\u002Fpresets","Presets","Named, reusable configurations with one default per slot, assigned by reference and bounded by the settings.",{"path":39,"title":40,"description":41,"group":21},"\u002Fdocs\u002Fscopes","Scopes","Values per workspace and per person, through layers — the system, a plan, the workspace, the person — each bounded by what it inherits.",{"path":43,"title":44,"description":45,"group":21},"\u002Fdocs\u002Fcatalogs","Catalogs","Lists of allowed choices, such as permitted models, whose entries are retired rather than deleted and cannot be retired while in use.",{"path":47,"title":48,"description":49,"group":21},"\u002Fdocs\u002Fdeployment-values","Deployment values","Values a deployment sets in its environment and nobody tunes while the app runs, declared once and listed in .env.example.",{"path":51,"title":52,"description":53,"group":54},"\u002Fdocs\u002Fstorage","Storage","Postgres through your own client, the four tables and how to create them, joining your transactions, and the storage contract behind it.","Integrate",{"path":56,"title":57,"description":58,"group":54},"\u002Fdocs\u002Fserver","Server and access","Mount tunables' API as a fetch handler in Nitro, Hono, Bun or Deno, as Express middleware or as an oRPC router, with access decided by your app.",{"path":60,"title":61,"description":62,"group":54},"\u002Fdocs\u002Faccess","Who can do what","End users bound by values they never see, staff who tune groups, owners and members who change only their own scope, and the terminal.",{"path":64,"title":65,"description":66,"group":54},"\u002Fdocs\u002Ftesting","Testing","Your app's tunables in memory for its own tests, with values set where a test needs them, and how to test rules, guards and confirmations.",{"path":68,"title":69,"description":70,"group":71},"\u002Fdocs\u002Fnuxt-layer","The Nuxt layer","Ready screens for a Nuxt UI app — a group's form, All settings, history, presets, assignments and catalogs — placed beside what they affect.","Screens",{"path":73,"title":74,"description":75,"group":71},"\u002Fdocs\u002Fvue-composables","Vue composables","Headless composables for building tunables' screens in any Vue app, on any design system.",{"path":77,"title":78,"description":79,"group":71},"\u002Fdocs\u002Ftheming","Theming","The screens bring no colors, fonts or CSS of their own; they take your Nuxt UI theme.",{"path":81,"title":82,"description":83,"group":84},"\u002Fdocs\u002Fcli","The CLI","The tunables command, tunables.config.ts, and which commands need a database.","CLI",{"path":86,"title":87,"description":88,"group":84},"\u002Fdocs\u002Fcli-check","Check and generate","The commands that need no database — checking definitions, writing .env.example, and keeping explanations and defaults in step with a pdd-kit Product Model.",{"path":90,"title":91,"description":92,"group":84},"\u002Fdocs\u002Fcli-values","Read and change values","The commands that read and change stored values, through the same checks and history as the screens.",{"path":94,"title":95,"description":96,"group":84},"\u002Fdocs\u002Fcli-skills","Install skills","Install tunables' agent skills for Claude Code, Codex CLI, Cursor, Gemini CLI and GitHub Copilot, and keep them current.",{"path":98,"title":99,"description":100,"group":101},"\u002Fdocs\u002Fskills","Agent skills","Three skills that let a coding agent adopt tunables, define settings the right way and verify that every value has one home.","Skills",{"path":103,"title":104,"description":105,"group":101},"\u002Fdocs\u002Fskill-adopt","tunables-adopt","Bring tunables into an app that has none yet, from an inventory of every value to a wired, synced app with the old homes removed.",{"path":107,"title":108,"description":109,"group":101},"\u002Fdocs\u002Fskill-define","tunables-define","Add, change, rename or remove one value in an app that uses tunables, with its home, its checks, its reads and what happens to stored values.",{"path":111,"title":112,"description":113,"group":101},"\u002Fdocs\u002Fskill-verify","tunables-verify","Audit an app's tunables against their rules, report every finding with where it is and the rule it breaks, and fix only the findings you choose.",{"path":115,"title":116,"description":117,"group":118},"\u002Fdocs\u002Fapi","API reference","Every export of the tunables package, by the subpath it is imported from.","Reference",{"path":120,"title":121,"description":122,"group":118},"\u002Fdocs\u002Ftasklane-example","Tasklane, the example app","A todo app with workspaces and people as tunables — two groups, plans as a layer, a catalog of models, scopes, a rule, a confirmation, and the playground that runs it.",{"id":124,"title":116,"body":125,"description":117,"extension":1678,"group":118,"meta":1679,"navigation":1680,"order":1681,"path":115,"seo":1682,"stem":1683,"__hash__":1684},"docs\u002Fdocs\u002Fapi.md",{"type":126,"value":127,"toc":1662},"minimark",[128,132,136,293,296,302,510,515,605,651,876,953,956,1062,1076,1079,1108,1111,1178,1207,1210,1232,1235,1257,1263,1266,1324,1351,1354,1432,1435,1479,1482,1533,1536,1610,1613,1656],[129,130,116],"h1",{"id":131},"api-reference",[133,134,135],"p",{},"The package has one entry per concern, so an app imports only what it uses\nand a CLI-only install pulls no framework. Every framework the entries use is\nan optional peer dependency.",[137,138,139,152],"table",{},[140,141,142],"thead",{},[143,144,145,149],"tr",{},[146,147,148],"th",{},"Import",[146,150,151],{},"Needs",[153,154,155,167,183,196,205,218,230,247,260,277],"tbody",{},[143,156,157,164],{},[158,159,160],"td",{},[161,162,163],"code",{},"tunables",[158,165,166],{},"nothing",[143,168,169,174],{},[158,170,171],{},[161,172,173],{},"tunables\u002Fpostgres",[158,175,176,179,180],{},[161,177,178],{},"pg"," or ",[161,181,182],{},"postgres",[143,184,185,190],{},[158,186,187],{},[161,188,189],{},"tunables\u002Fdrizzle",[158,191,192,195],{},[161,193,194],{},"drizzle-orm"," 0.36 or later",[143,197,198,203],{},[158,199,200],{},[161,201,202],{},"tunables\u002Fserver",[158,204,166],{},[143,206,207,212],{},[158,208,209],{},[161,210,211],{},"tunables\u002Fexpress",[158,213,214,217],{},[161,215,216],{},"express"," 4 or 5",[143,219,220,225],{},[158,221,222],{},[161,223,224],{},"tunables\u002Forpc",[158,226,227],{},[161,228,229],{},"@orpc\u002Fserver",[143,231,232,237],{},[158,233,234],{},[161,235,236],{},"tunables\u002Fclient",[158,238,239,240,243,244],{},"nothing; ",[161,241,242],{},"@orpc\u002Fclient"," for ",[161,245,246],{},"orpcClient",[143,248,249,254],{},[158,250,251],{},[161,252,253],{},"tunables\u002Fvue",[158,255,256,259],{},[161,257,258],{},"vue"," 3.5",[143,261,262,267],{},[158,263,264],{},[161,265,266],{},"tunables\u002Fnuxt",[158,268,269,272,273,276],{},[161,270,271],{},"nuxt"," 4.4, ",[161,274,275],{},"@nuxt\u002Fui"," 4.9",[143,278,279,291],{},[158,280,281,284,285,284,288],{},[161,282,283],{},"tunables\u002Fconfig",", ",[161,286,287],{},"tunables\u002Fpdd",[161,289,290],{},"tunables\u002Ftesting",[158,292,166],{},[294,295,163],"h2",{"id":163},[133,297,298],{},[299,300,301],"strong",{},"Definitions",[137,303,304,314],{},[140,305,306],{},[143,307,308,311],{},[146,309,310],{},"Export",[146,312,313],{},"What it is",[153,315,316,331,348,361,371,413,426,442,455,476,486],{},[143,317,318,323],{},[158,319,320],{},[161,321,322],{},"defineGroup(definition)",[158,324,325,326,330],{},"A group of settings. See ",[327,328,19],"a",{"href":329},".\u002Fsettings-and-groups",".",[143,332,333,338],{},[158,334,335],{},[161,336,337],{},"definePresets(definition)",[158,339,340,341,344,345,330],{},"A preset set, or with ",[161,342,343],{},"layer"," a layer of a group at a scope. See ",[327,346,36],{"href":347},".\u002Fpresets",[143,349,350,355],{},[158,351,352],{},[161,353,354],{},"defineCatalog(definition)",[158,356,357,358,330],{},"A catalog. See ",[327,359,44],{"href":360},".\u002Fcatalogs",[143,362,363,368],{},[158,364,365],{},[161,366,367],{},"defineEffects(effects)",[158,369,370],{},"What changing a setting changes, by id.",[143,372,373,399],{},[158,374,375,284,378,284,381,284,384,284,387,284,390,284,393,284,396],{},[161,376,377],{},"number",[161,379,380],{},"range",[161,382,383],{},"size",[161,385,386],{},"toggle",[161,388,389],{},"choice",[161,391,392],{},"choices",[161,394,395],{},"text",[161,397,398],{},"pick",[158,400,401,402,405,406,409,410,330],{},"Field builders. Each takes ",[161,403,404],{},"override"," for where a scope may set its own value. See ",[327,407,24],{"href":408},".\u002Fkinds-and-units"," and ",[327,411,40],{"href":412},".\u002Fscopes",[143,414,415,423],{},[158,416,417,284,420],{},[161,418,419],{},"BUILT_IN_UNITS",[161,421,422],{},"formatAmount(value, unit)",[158,424,425],{},"The built-in units, and how an amount reads in one.",[143,427,428,439],{},[158,429,430,284,433,284,436],{},[161,431,432],{},"fieldLabel(key, field)",[161,434,435],{},"formatValue(field, value, unitOf)",[161,437,438],{},"fieldSchema(key, field, unitOf)",[158,440,441],{},"A field's name, its value as it reads, and its zod check.",[143,443,444,452],{},[158,445,446,284,449],{},[161,447,448],{},"defaultsOf(fields)",[161,450,451],{},"toProblems(result)",[158,453,454],{},"The defaults fields declare; a rule's result as problems.",[143,456,457,471],{},[158,458,459,284,462,284,465,284,468],{},[161,460,461],{},"defineEnvironment(definitions)",[161,463,464],{},"env",[161,466,467],{},"renderEnvExample(environment, header?)",[161,469,470],{},"EnvironmentError",[158,472,473,330],{},[327,474,48],{"href":475},".\u002Fdeployment-values",[143,477,478,483],{},[158,479,480],{},[161,481,482],{},"explain(explanations, entity, fact)",[158,484,485],{},"A fact's explanation from a generated explanations module.",[143,487,488,499],{},[158,489,490,284,493,284,496],{},[161,491,492],{},"scopeEntries(chain, path)",[161,494,495],{},"scopeKey(entries)",[161,497,498],{},"parseScopeKey(key)",[158,500,501,502,505,506,509],{},"A ",[327,503,504],{"href":412},"scope"," path in chain order, checked; its stored key, ",[161,507,508],{},"workspace=acme;user=dana","; and back.",[133,511,512],{},[299,513,514],{},"The engine",[137,516,517,525],{},[140,518,519],{},[143,520,521,523],{},[146,522,310],{},[146,524,313],{},[153,526,527,537,550,560,580,595],{},[143,528,529,534],{},[158,530,531],{},[161,532,533],{},"createTunables(options)",[158,535,536],{},"Your app's tunables over a store.",[143,538,539,544],{},[158,540,541],{},[161,542,543],{},"memoryStore(options?)",[158,545,546,547,330],{},"A store in this process, for tests and demos. See ",[327,548,52],{"href":549},".\u002Fstorage#the-memory-store",[143,551,552,557],{},[158,553,554],{},[161,555,556],{},"TunablesError",[158,558,559],{},"The base of the errors below; the server answers it with 409.",[143,561,562,567],{},[158,563,564],{},[161,565,566],{},"TunablesMissing",[158,568,569,570,573,574,409,577,330],{},"A group or field is not stored yet: run ",[161,571,572],{},"sync",". Has ",[161,575,576],{},"group",[161,578,579],{},"keys",[143,581,582,587],{},[158,583,584],{},[161,585,586],{},"TunablesInvalid",[158,588,589,590,409,592,330],{},"Stored values no longer pass their checks. Has ",[161,591,576],{},[161,593,594],{},"problems",[143,596,597,602],{},[158,598,599],{},[161,600,601],{},"TunablesUnknown",[158,603,604],{},"A name the definitions do not declare: a programming error.",[133,606,607,610,611,284,614,617,618,284,621,624,625,284,628,284,631,284,634,284,637,284,640,284,643,646,647,650],{},[161,608,609],{},"createTunables"," takes ",[161,612,613],{},"store",[161,615,616],{},"groups",", and optionally ",[161,619,620],{},"presets",[161,622,623],{},"catalogs",",\n",[161,626,627],{},"units",[161,629,630],{},"effects",[161,632,633],{},"explanations",[161,635,636],{},"guards",[161,638,639],{},"notes",[161,641,642],{},"uses",[161,644,645],{},"scopes"," (the\nchain, broadest first) and ",[161,648,649],{},"scopeLabel(scope, id)",". It returns:",[137,652,653,663],{},[140,654,655],{},[143,656,657,660],{},[146,658,659],{},"Member",[146,661,662],{},"Does",[153,664,665,675,691,701,714,724,737,747,760,796,827,844,854,864],{},[143,666,667,672],{},[158,668,669],{},[161,670,671],{},"get(group, { scope?, lastGood? })",[158,673,674],{},"The group's values, typed: the system's, or as read at a scope path.",[143,676,677,682],{},[158,678,679],{},[161,680,681],{},"entry(group, { host?, scope? })",[158,683,684,685,687,688,330],{},"Values, defaults, what changed, how each reads, notes, and who changed it last; at a scope, also ",[161,686,504],{}," and each field's ",[161,689,690],{},"layers",[143,692,693,698],{},[158,694,695],{},[161,696,697],{},"overview()",[158,699,700],{},"Every group's entry.",[143,702,703,708],{},[158,704,705],{},[161,706,707],{},"save(group, values, change?)",[158,709,710,711,330],{},"Change fields, checked whole. Returns an ",[161,712,713],{},"Outcome",[143,715,716,721],{},[158,717,718],{},[161,719,720],{},"reset(group, keys?, change?)",[158,722,723],{},"Put fields back at their defaults, checked; at a scope, use the inherited values again.",[143,725,726,731],{},[158,727,728],{},[161,729,730],{},"history(groupOrTarget, { limit?, before? })",[158,732,733,734,330],{},"Revisions, newest first. A scope's are ",[161,735,736],{},"{ kind: 'group', name, id: scopeKey }",[143,738,739,744],{},[158,740,741],{},[161,742,743],{},"restore(revisionId, change?)",[158,745,746],{},"Restore a group's revision, checked; a scope's revision restores that scope's own values.",[143,748,749,754],{},[158,750,751],{},[161,752,753],{},"sync(change?)",[158,755,756,757,330],{},"Store what the definitions add. Returns a ",[161,758,759],{},"SyncReport",[143,761,762,767],{},[158,763,764],{},[161,765,766],{},"presets(set)",[158,768,769,284,772,284,775,284,778,284,781,284,784,284,787,284,790,284,793,330],{},[161,770,771],{},"list",[161,773,774],{},"get",[161,776,777],{},"create",[161,779,780],{},"update",[161,782,783],{},"remove",[161,785,786],{},"makeDefault",[161,788,789],{},"assign",[161,791,792],{},"assignments",[161,794,795],{},"resolve",[143,797,798,803],{},[158,799,800],{},[161,801,802],{},"catalog(id)",[158,804,805,284,807,284,809,284,812,284,815,284,818,284,821,284,824,330],{},[161,806,771],{},[161,808,774],{},[161,810,811],{},"available",[161,813,814],{},"add",[161,816,817],{},"edit",[161,819,820],{},"retire",[161,822,823],{},"reinstate",[161,825,826],{},"usedBy",[143,828,829,834],{},[158,830,831],{},[161,832,833],{},"within(host)",[158,835,836,837,409,840,843],{},"The same members inside your open transaction, plus ",[161,838,839],{},"hold()",[161,841,842],{},"committed()",", which tells listeners once your transaction has committed.",[143,845,846,851],{},[158,847,848],{},[161,849,850],{},"onChange(group, listener)",[158,852,853],{},"Called after a change to the group commits in this process. Returns an unsubscribe.",[143,855,856,861],{},[158,857,858],{},[161,859,860],{},"describe()",[158,862,863],{},"Every definition as plain JSON, for the screens.",[143,865,866,873],{},[158,867,868,284,871],{},[161,869,870],{},"definitions",[161,872,613],{},[158,874,875],{},"What it was created with.",[133,877,878,881,882,885,886,889,890,893,894,284,896,284,899,284,902,624,905,284,908,284,911,284,914,624,916,284,919,284,922,284,925,284,928,284,931,624,934,284,937,284,940,284,943,284,946,624,949,952],{},[161,879,880],{},"change"," is ",[161,883,884],{},"{ actor?, reason?, confirmed?, host?, scope? }",". In ",[161,887,888],{},"save",", a\nvalue of ",[161,891,892],{},"null"," at a scope uses the inherited value again. Types for all of\nthese are exported too: ",[161,895,713],{},[161,897,898],{},"Problem",[161,900,901],{},"RuleResult",[161,903,904],{},"GroupEntry",[161,906,907],{},"FieldLayer",[161,909,910],{},"ScopePath",[161,912,913],{},"OverrideRule",[161,915,759],{},[161,917,918],{},"Guard",[161,920,921],{},"NotesProvider",[161,923,924],{},"UsesProvider",[161,926,927],{},"Actor",[161,929,930],{},"ChangeOptions",[161,932,933],{},"Preset",[161,935,936],{},"CatalogEntry",[161,938,939],{},"Revision",[161,941,942],{},"RevisionTarget",[161,944,945],{},"TunablesStore",[161,947,948],{},"StoreSession",[161,950,951],{},"Description"," and more.",[294,954,173],{"id":955},"tunablespostgres",[137,957,958,966],{},[140,959,960],{},[143,961,962,964],{},[146,963,310],{},[146,965,313],{},[153,967,968,978,998,1014,1032,1042,1052],{},[143,969,970,975],{},[158,971,972],{},[161,973,974],{},"postgresStore(client, { schema?, lockKey? })",[158,976,977],{},"The Postgres store.",[143,979,980,985],{},[158,981,982],{},[161,983,984],{},"fromPg(poolOrClient)",[158,986,987,988,284,991,994,995,330],{},"A node-postgres ",[161,989,990],{},"Pool",[161,992,993],{},"Client"," or pool client as a ",[161,996,997],{},"SqlClient",[143,999,1000,1005],{},[158,1001,1002],{},[161,1003,1004],{},"fromPostgresJs(sql)",[158,1006,1007,1008,1011,1012,330],{},"A postgres.js ",[161,1009,1010],{},"sql"," or transaction as a ",[161,1013,997],{},[143,1015,1016,1021],{},[158,1017,1018],{},[161,1019,1020],{},"asExecutor(host)",[158,1022,1023,1024,1027,1028,1031],{},"Any of those, or a ",[161,1025,1026],{},"SqlExecutor",", as an executor; what ",[161,1029,1030],{},"within"," uses.",[143,1033,1034,1039],{},[158,1035,1036],{},[161,1037,1038],{},"migrate(client, { schema? })",[158,1040,1041],{},"Create the tables if they are missing, and bring older ones up to date.",[143,1043,1044,1049],{},[158,1045,1046],{},[161,1047,1048],{},"tunablesSql({ schema? })",[158,1050,1051],{},"The DDL, for your own migrations.",[143,1053,1054,1059],{},[158,1055,1056],{},[161,1057,1058],{},"lockKeyFor(schema)",[158,1060,1061],{},"The advisory lock key a schema gets by default.",[133,1063,1064,1065,284,1067,284,1069,1072,1073,330],{},"Types: ",[161,1066,1026],{},[161,1068,997],{},[161,1070,1071],{},"PostgresStoreOptions",". See\n",[327,1074,52],{"href":1075},".\u002Fstorage",[294,1077,189],{"id":1078},"tunablesdrizzle",[137,1080,1081,1089],{},[140,1082,1083],{},[143,1084,1085,1087],{},[146,1086,310],{},[146,1088,313],{},[153,1090,1091],{},[143,1092,1093,1098],{},[158,1094,1095],{},[161,1096,1097],{},"tunablesTables(schemaName?)",[158,1099,1100,1103,1104,1107],{},[161,1101,1102],{},"{ schema, groups, revisions, records, assignments }"," as Drizzle ",[161,1105,1106],{},"pg-core"," tables.",[294,1109,202],{"id":1110},"tunablesserver",[137,1112,1113,1121],{},[140,1114,1115],{},[143,1116,1117,1119],{},[146,1118,310],{},[146,1120,313],{},[153,1122,1123,1148,1158,1168],{},[143,1124,1125,1130],{},[158,1126,1127],{},[161,1128,1129],{},"createHandler(options)",[158,1131,1132,1133,1136,1137,1140,1141,1144,1145,330],{},"A function from ",[161,1134,1135],{},"Request"," to ",[161,1138,1139],{},"Response",", or ",[161,1142,1143],{},"undefined"," outside its ",[161,1146,1147],{},"basePath",[143,1149,1150,1155],{},[158,1151,1152],{},[161,1153,1154],{},"createService(options)",[158,1156,1157],{},"The operations every adapter wraps, each taking your context.",[143,1159,1160,1165],{},[158,1161,1162],{},[161,1163,1164],{},"ServiceError",[158,1166,1167],{},"A refusal with a status: 400, 401, 403 or 404.",[143,1169,1170,1175],{},[158,1171,1172],{},[161,1173,1174],{},"errorResponse(error)",[158,1176,1177],{},"The status and body an error answers with.",[133,1179,1064,1180,284,1183,284,1186,284,1189,624,1192,1195,1196,1199,1200,1203,1204,330],{},[161,1181,1182],{},"HandlerOptions",[161,1184,1185],{},"ServiceOptions",[161,1187,1188],{},"TunablesService",[161,1190,1191],{},"Action",[161,1193,1194],{},"AccessTarget"," (",[161,1197,1198],{},"{ kind, id?, scope? }","). See ",[327,1201,57],{"href":1202},".\u002Fserver","\nand ",[327,1205,61],{"href":1206},".\u002Faccess",[294,1208,211],{"id":1209},"tunablesexpress",[137,1211,1212,1220],{},[140,1213,1214],{},[143,1215,1216,1218],{},[146,1217,310],{},[146,1219,313],{},[153,1221,1222],{},[143,1223,1224,1229],{},[158,1225,1226],{},[161,1227,1228],{},"tunablesMiddleware(options)",[158,1230,1231],{},"Express middleware; the context is the Express request.",[294,1233,224],{"id":1234},"tunablesorpc",[137,1236,1237,1245],{},[140,1238,1239],{},[143,1240,1241,1243],{},[146,1242,310],{},[146,1244,313],{},[153,1246,1247],{},[143,1248,1249,1254],{},[158,1250,1251],{},[161,1252,1253],{},"tunablesRouter(options)",[158,1255,1256],{},"tunables' operations as oRPC procedures, to nest in your router.",[133,1258,1259,1260,330],{},"Type: ",[161,1261,1262],{},"TunablesRouter",[294,1264,236],{"id":1265},"tunablesclient",[137,1267,1268,1276],{},[140,1269,1270],{},[143,1271,1272,1274],{},[146,1273,310],{},[146,1275,313],{},[153,1277,1278,1288,1301,1314],{},[143,1279,1280,1285],{},[158,1281,1282],{},[161,1283,1284],{},"fetchClient({ baseURL?, fetch?, headers?, credentials? })",[158,1286,1287],{},"The client over the HTTP API.",[143,1289,1290,1295],{},[158,1291,1292],{},[161,1293,1294],{},"orpcClient(procedures)",[158,1296,1297,1298,1300],{},"The client over your oRPC client's ",[161,1299,163],{}," branch.",[143,1302,1303,1308],{},[158,1304,1305],{},[161,1306,1307],{},"TunablesClientError",[158,1309,1310,1311,330],{},"A request the server refused or could not answer, with its ",[161,1312,1313],{},"status",[143,1315,1316,1321],{},[158,1317,1318],{},[161,1319,1320],{},"displayValue(field, value, entryLabel?)",[158,1322,1323],{},"A value as it reads, from the field's description.",[133,1325,1326,284,1329,1332,1333,1336,1337,624,1340,284,1343,284,1346,284,1348,1350],{},[161,1327,1328],{},"group(id, scope?)",[161,1330,1331],{},"save(id, { values, scope? })"," and\n",[161,1334,1335],{},"reset(id, { keys?, scope? })"," take a scope path. Types: ",[161,1338,1339],{},"TunablesClient",[161,1341,1342],{},"PresetSummary",[161,1344,1345],{},"CatalogEntrySummary",[161,1347,910],{},[161,1349,907],{},", and the\ndescription types.",[294,1352,253],{"id":1353},"tunablesvue",[137,1355,1356,1364],{},[140,1357,1358],{},[143,1359,1360,1362],{},[146,1361,310],{},[146,1363,313],{},[153,1365,1366,1382,1410,1420],{},[143,1367,1368,1379],{},[158,1369,1370,284,1373,284,1376],{},[161,1371,1372],{},"TUNABLES_CLIENT",[161,1374,1375],{},"provideTunables(client)",[161,1377,1378],{},"useTunablesClient()",[158,1380,1381],{},"Providing and reading the client.",[143,1383,1384,1404],{},[158,1385,1386,284,1389,284,1392,284,1395,284,1398,284,1401],{},[161,1387,1388],{},"useTunablesDescription()",[161,1390,1391],{},"useGroupForm(group, { scope? })",[161,1393,1394],{},"useOverview()",[161,1396,1397],{},"useHistory(target, { pageSize? })",[161,1399,1400],{},"usePresets(set)",[161,1402,1403],{},"useCatalog(catalog)",[158,1405,1406,1407,330],{},"Headless screens. See ",[327,1408,74],{"href":1409},".\u002Fvue-composables",[143,1411,1412,1417],{},[158,1413,1414],{},[161,1415,1416],{},"useUnloadGuard(dirty)",[158,1418,1419],{},"Ask before unloading with unsaved changes.",[143,1421,1422,1427],{},[158,1423,1424],{},[161,1425,1426],{},"displayValue",[158,1428,1429,1430,330],{},"As in ",[161,1431,236],{},[294,1433,266],{"id":1434},"tunablesnuxt",[133,1436,1437,1438,1441,1442,1445,1446,1448,1449,284,1452,624,1455,284,1458,284,1461,284,1464,1467,1468,1471,1472,1475,1476,330],{},"A Nuxt layer, used with ",[161,1439,1440],{},"extends: ['tunables\u002Fnuxt']",". Components:\n",[161,1443,1444],{},"TunablesGroupForm"," (with an optional ",[161,1447,504],{},"), ",[161,1450,1451],{},"TunablesOverview",[161,1453,1454],{},"TunablesHistory",[161,1456,1457],{},"TunablesPresets",[161,1459,1460],{},"TunablesAssign",[161,1462,1463],{},"TunablesCatalog",[161,1465,1466],{},"TunablesFieldHint",".\nApp config: ",[161,1469,1470],{},"tunables.baseURL",". Composable: ",[161,1473,1474],{},"useTunablesLeaveGuard(dirty, message?)",".\nSee ",[327,1477,69],{"href":1478},".\u002Fnuxt-layer",[294,1480,283],{"id":1481},"tunablesconfig",[137,1483,1484,1492],{},[140,1485,1486],{},[143,1487,1488,1490],{},[146,1489,310],{},[146,1491,313],{},[153,1493,1494,1510,1520],{},[143,1495,1496,1501],{},[158,1497,1498],{},[161,1499,1500],{},"defineConfig(config)",[158,1502,1503,1506,1507,330],{},[161,1504,1505],{},"tunables.config.ts",". See ",[327,1508,82],{"href":1509},".\u002Fcli#tunablesconfigts",[143,1511,1512,1517],{},[158,1513,1514],{},[161,1515,1516],{},"loadConfig(cwd, file?)",[158,1518,1519],{},"Find and load a config, as the CLI does.",[143,1521,1522,1530],{},[158,1523,1524,284,1527],{},[161,1525,1526],{},"CONFIG_FILES",[161,1528,1529],{},"ConfigError",[158,1531,1532],{},"The file names looked for; a config that cannot be found or loaded.",[294,1534,287],{"id":1535},"tunablespdd",[137,1537,1538,1546],{},[140,1539,1540],{},[143,1541,1542,1544],{},[146,1543,310],{},[146,1545,313],{},[153,1547,1548,1562,1576,1586,1596],{},[143,1549,1550,1555],{},[158,1551,1552],{},[161,1553,1554],{},"readModelFacts(modelDirectory)",[158,1556,1557,1558,1561],{},"Every Entity's facts in a ",[161,1559,1560],{},"product-model\u002F"," directory, with their text and stated default.",[143,1563,1564,1569],{},[158,1565,1566],{},[161,1567,1568],{},"renderExplanations(explanations, importFrom?)",[158,1570,1571,1572,1575],{},"The module ",[161,1573,1574],{},"tunables explain"," writes.",[143,1577,1578,1583],{},[158,1579,1580],{},[161,1581,1582],{},"checkAgainstModel(description, model)",[158,1584,1585],{},"Each field whose Entity, fact or default disagrees with the model.",[143,1587,1588,1593],{},[158,1589,1590],{},[161,1591,1592],{},"sameDefault(stated, declared)",[158,1594,1595],{},"Whether a default as the model states it is the field's own.",[143,1597,1598,1603],{},[158,1599,1600],{},[161,1601,1602],{},"draftFacts(description, model)",[158,1604,1605,1606,1609],{},"The Markdown ",[161,1607,1608],{},"tunables model draft"," prints.",[294,1611,290],{"id":1612},"tunablestesting",[137,1614,1615,1623],{},[140,1616,1617],{},[143,1618,1619,1621],{},[146,1620,310],{},[146,1622,313],{},[153,1624,1625,1635,1645],{},[143,1626,1627,1632],{},[158,1628,1629],{},[161,1630,1631],{},"testTunables(options)",[158,1633,1634],{},"Your tunables in memory, synced.",[143,1636,1637,1642],{},[158,1638,1639],{},[161,1640,1641],{},"setForTest(tunables, values)",[158,1643,1644],{},"Store values as they are, past rules, guards and confirmations.",[143,1646,1647,1652],{},[158,1648,1649],{},[161,1650,1651],{},"memoryStore",[158,1653,1429,1654,330],{},[161,1655,163],{},[133,1657,1658,1659,330],{},"See ",[327,1660,65],{"href":1661},".\u002Ftesting",{"title":1663,"searchDepth":1664,"depth":1664,"links":1665},"",2,[1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677],{"id":163,"depth":1664,"text":163},{"id":955,"depth":1664,"text":173},{"id":1078,"depth":1664,"text":189},{"id":1110,"depth":1664,"text":202},{"id":1209,"depth":1664,"text":211},{"id":1234,"depth":1664,"text":224},{"id":1265,"depth":1664,"text":236},{"id":1353,"depth":1664,"text":253},{"id":1434,"depth":1664,"text":266},{"id":1481,"depth":1664,"text":283},{"id":1535,"depth":1664,"text":287},{"id":1612,"depth":1664,"text":290},"md",{},true,27,{"title":116,"description":117},"docs\u002Fapi","MCI_mVcB4qctQlxwFJRpzRMZOU_CgNqEN7bzWTDF1PA",1792845117977]