[{"data":1,"prerenderedAt":1529},["ShallowReactive",2],{"kscript:functions/libraries":3},{"slug":4,"filePath":5,"frontmatter":6,"rawMarkdown":9,"tree":10},"functions/libraries","functions/libraries.md",{"title":7,"description":8},"Libraries","Reusable kScript libraries: the library() header, import with aliases and version pinning, precedence rules, sandboxing, and hot reload.","---\ntitle: Libraries\ndescription: >-\n  Reusable kScript libraries: the library() header, import with aliases and\n  version pinning, precedence rules, sandboxing, and hot reload.\n---\n\n\u003Cdiv class=\"flex gap-3 mb-6\">\n  \u003Cspan class=\"inline-flex items-center gap-1.5 px-3 py-1 rounded-full bg-purple-50 text-purple-600 text-sm font-medium\">\n    Advanced\n  \u003C/span>\n  \u003Cspan class=\"inline-flex items-center gap-1.5 px-3 py-1 rounded-full bg-gray-100 text-gray-600 text-sm font-medium\">\n    10 min read\n  \u003C/span>\n\u003C/div>\n\n## Introduction\n\nLibraries let you write a function and type collection **once** and import it from any script: your TA helpers, your zone structs, your formatting utilities. A library is itself kScript, runs under exactly the same sandbox, and hot-reloads while you develop it.\n\n## Writing a library\n\nA library is a source whose first statement is a `library()` header, followed by **only** function and type declarations:\n\n```javascript\nlibrary(\"my_ta\", \"1.0.0\")\n\ntype Band {\n  basis: number,\n  upper: number,\n  lower: number\n}\n\nfunc zscore(src, period) {\n  var m = sma(source=src, period=period)\n  var sd = stdev(source=src, period=period)\n  return (src - m) / sd\n}\n\nfunc makeBand(src, period, mult) {\n  var m = sma(source=src, period=period)\n  var sd = stdev(source=src, period=period)\n  return Band.new(basis=m, upper=m + sd * mult, lower=m - sd * mult)\n}\n```\n- The name must be lowercase (`[a-z][a-z0-9_]*`); the version is optional semver.\n- Anything else at top level (`define`, plots, `input`, data sources, bare expressions) is a compile error with line/column: libraries declare, consumers run.\n\n## Importing\n\n```javascript\nimport \"my_ta\"                    // latest version, plain names: zscore(...)\nimport \"my_ta@1.0.0\"              // pinned to an exact version\nimport \"my_ta\" as ta              // aliased: ta.zscore(...), ta.Band.new(...)\n```\n- **Plain import** brings the library's functions and types in under their own names.\n- **Alias import** namespaces everything behind the alias, like the built-in `math.` namespace. Aliased imports can never collide with anything.\n- **Pinning**: `name@version` selects an exact registered version; a bare name takes the latest. Unknown names and versions error with the list of what is available.\n- `import` is contextual (old scripts using the word as an identifier keep parsing), and duplicate imports of the same library are reported as exactly that.\n\n## Precedence and integrity rules\n\nWorked out so that nothing ever changes meaning silently:\n\n1. **Your script wins.** If a plain import collides with a function the script itself defines, the script's version is used at the script's call sites, and the compiler emits a warning telling you so.\n2. **Libraries are internally sealed.** A library function calling its sibling always gets *its own* sibling, even when the consumer overrides that name. Imports cannot be middleman-ed.\n3. **Import-vs-import plain collisions are errors** (ambiguity has no safe default); alias one of them.\n4. **Aliases are validated**: `as math` (a builtin namespace) or `as close` (a global) is a compile error.\n\n## Sandbox and attribution\n\nLibrary code is ordinary kScript: every limit in the [sandbox manifest](../faq/limitations.md) applies unchanged, and errors raised inside a library carry the **library's own line and column**, so a runaway loop in `my_ta` says so, not some opaque consumer position.\n\n## Versioning and updates\n\nRegistering a new version of a library leaves existing pins untouched: scripts pinned to `@1.0.0` keep their behavior; bare imports pick up the latest on their next run. Re-registering the *same* version is an error: versions are immutable once published.\n\n## Hot reload in the playground\n\nThe playground has a library editor alongside the script editor. Edit the library, run the script, and the new library code is picked up immediately: same page, no reload, registry updated in place. The development loop for a shared helper is exactly the development loop for a script.\n\n## Pine comparison\n\nPine libraries exist but are publish-bound (TradingView-hosted, review queues, no local hot iteration) and export only functions over Pine's types. kScript libraries are local-first, version-pinned, hot-reloadable, can export your own structured types, and their consumers keep every compile-time guarantee (typed fields, precedence warnings, sandbox attribution) the rest of v3 provides.\n",{"type":11,"children":12,"data":1523,"position":1525},"root",[13,100,101,118,119,160,161,178,179,237,238,696,697,796,797,814,815,882,883,1051,1052,1069,1070,1083,1084,1281,1282,1298,1299,1382,1383,1400,1401,1458,1459,1474,1475,1490,1491,1507,1508],{"type":14,"tagName":15,"properties":16,"children":21,"position":95},"element","div",{"className":17},[18,19,20],"flex","gap-3","mb-6",[22,34,63,69,88],{"type":23,"value":24,"position":25},"text","\n  ",{"start":26,"end":30},{"line":27,"column":28,"offset":29},1,30,29,{"line":31,"column":32,"offset":33},2,3,32,{"type":14,"tagName":35,"properties":36,"children":48,"position":58},"span",{"className":37},[38,39,40,41,42,43,44,45,46,47],"inline-flex","items-center","gap-1.5","px-3","py-1","rounded-full","bg-purple-50","text-purple-600","text-sm","font-medium",[49],{"type":23,"value":50,"position":51},"\n    Advanced\n  ",{"start":52,"end":55},{"line":31,"column":53,"offset":54},122,151,{"line":56,"column":32,"offset":57},4,167,{"start":59,"end":60},{"line":31,"column":32,"offset":33},{"line":56,"column":61,"offset":62},10,174,{"type":23,"value":24,"position":64},{"start":65,"end":66},{"line":56,"column":61,"offset":62},{"line":67,"column":32,"offset":68},5,177,{"type":14,"tagName":35,"properties":70,"children":74,"position":84},{"className":71},[38,39,40,41,42,43,72,73,46,47],"bg-gray-100","text-gray-600",[75],{"type":23,"value":76,"position":77},"\n    10 min read\n  ",{"start":78,"end":81},{"line":67,"column":79,"offset":80},119,293,{"line":82,"column":32,"offset":83},7,312,{"start":85,"end":86},{"line":67,"column":32,"offset":68},{"line":82,"column":61,"offset":87},319,{"type":23,"value":89,"position":90},"\n",{"start":91,"end":92},{"line":82,"column":61,"offset":87},{"line":93,"column":27,"offset":94},8,320,{"start":96,"end":98},{"line":27,"column":27,"offset":97},0,{"line":93,"column":82,"offset":99},326,{"type":23,"value":89},{"type":14,"tagName":102,"properties":103,"children":105,"position":114},"h2",{"id":104},"introduction",[106],{"type":23,"value":107,"position":108},"Introduction",{"start":109,"end":111},{"line":61,"column":56,"offset":110},331,{"line":61,"column":112,"offset":113},16,343,{"start":115,"end":117},{"line":61,"column":27,"offset":116},328,{"line":61,"column":112,"offset":113},{"type":23,"value":89},{"type":14,"tagName":120,"properties":121,"children":122,"position":157},"p",{},[123,132,150],{"type":23,"value":124,"position":125},"Libraries let you write a function and type collection ",{"start":126,"end":129},{"line":127,"column":27,"offset":128},12,345,{"line":127,"column":130,"offset":131},56,400,{"type":14,"tagName":133,"properties":134,"children":135,"position":145},"strong",{},[136],{"type":23,"value":137,"position":138},"once",{"start":139,"end":142},{"line":127,"column":140,"offset":141},58,402,{"line":127,"column":143,"offset":144},62,406,{"start":146,"end":147},{"line":127,"column":130,"offset":131},{"line":127,"column":148,"offset":149},64,408,{"type":23,"value":151,"position":152}," and import it from any script: your TA helpers, your zone structs, your formatting utilities. A library is itself kScript, runs under exactly the same sandbox, and hot-reloads while you develop it.",{"start":153,"end":154},{"line":127,"column":148,"offset":149},{"line":127,"column":155,"offset":156},262,606,{"start":158,"end":159},{"line":127,"column":27,"offset":128},{"line":127,"column":155,"offset":156},{"type":23,"value":89},{"type":14,"tagName":102,"properties":162,"children":164,"position":174},{"id":163},"writing-a-library",[165],{"type":23,"value":166,"position":167},"Writing a library",{"start":168,"end":171},{"line":169,"column":56,"offset":170},14,611,{"line":169,"column":172,"offset":173},21,628,{"start":175,"end":177},{"line":169,"column":27,"offset":176},608,{"line":169,"column":172,"offset":173},{"type":23,"value":89},{"type":14,"tagName":120,"properties":180,"children":181,"position":234},{},[182,190,204,211,228],{"type":23,"value":183,"position":184},"A library is a source whose first statement is a ",{"start":185,"end":187},{"line":112,"column":27,"offset":186},630,{"line":112,"column":188,"offset":189},50,679,{"type":14,"tagName":191,"properties":192,"children":193,"position":201},"code",{},[194],{"type":23,"value":195,"position":196},"library()",{"start":197,"end":198},{"line":112,"column":188,"offset":189},{"line":112,"column":199,"offset":200},61,690,{"start":202,"end":203},{"line":112,"column":188,"offset":189},{"line":112,"column":199,"offset":200},{"type":23,"value":205,"position":206}," header, followed by ",{"start":207,"end":208},{"line":112,"column":199,"offset":200},{"line":112,"column":209,"offset":210},82,711,{"type":14,"tagName":133,"properties":212,"children":213,"position":223},{},[214],{"type":23,"value":215,"position":216},"only",{"start":217,"end":220},{"line":112,"column":218,"offset":219},84,713,{"line":112,"column":221,"offset":222},88,717,{"start":224,"end":225},{"line":112,"column":209,"offset":210},{"line":112,"column":226,"offset":227},90,719,{"type":23,"value":229,"position":230}," function and type declarations:",{"start":231,"end":232},{"line":112,"column":226,"offset":227},{"line":112,"column":53,"offset":233},751,{"start":235,"end":236},{"line":112,"column":27,"offset":186},{"line":112,"column":53,"offset":233},{"type":23,"value":89},{"type":11,"children":239},[240],{"type":14,"tagName":241,"properties":242,"children":246,"data":-1},"pre",{"class":243,"style":244,"tabindex":245},"shiki shiki-themes github-dark github-light","--shiki-dark:#e1e4e8;--shiki-light:#24292e;--shiki-dark-bg:#24292e;--shiki-light-bg:#fff","0",[247],{"type":14,"tagName":191,"properties":248,"children":249},{},[250,287,288,291,292,311,312,320,321,329,330,338,339,347,348,351,352,370,371,417,418,459,460,493,494,501,502,505,506,523,524,563,564,603,604,688,689],{"type":14,"tagName":35,"properties":251,"children":253},{"class":252},"line",[254,260,266,272,277,282],{"type":14,"tagName":35,"properties":255,"children":257},{"style":256},"--shiki-dark:#B392F0;--shiki-light:#6F42C1",[258],{"type":23,"value":259},"library",{"type":14,"tagName":35,"properties":261,"children":263},{"style":262},"--shiki-dark:#E1E4E8;--shiki-light:#24292E",[264],{"type":23,"value":265},"(",{"type":14,"tagName":35,"properties":267,"children":269},{"style":268},"--shiki-dark:#9ECBFF;--shiki-light:#032F62",[270],{"type":23,"value":271},"\"my_ta\"",{"type":14,"tagName":35,"properties":273,"children":274},{"style":262},[275],{"type":23,"value":276},", ",{"type":14,"tagName":35,"properties":278,"children":279},{"style":268},[280],{"type":23,"value":281},"\"1.0.0\"",{"type":14,"tagName":35,"properties":283,"children":284},{"style":262},[285],{"type":23,"value":286},")",{"type":23,"value":89},{"type":14,"tagName":35,"properties":289,"children":290},{"class":252},[],{"type":23,"value":89},{"type":14,"tagName":35,"properties":293,"children":294},{"class":252},[295,301,306],{"type":14,"tagName":35,"properties":296,"children":298},{"style":297},"--shiki-dark:#F97583;--shiki-light:#D73A49",[299],{"type":23,"value":300},"type",{"type":14,"tagName":35,"properties":302,"children":303},{"style":256},[304],{"type":23,"value":305}," Band",{"type":14,"tagName":35,"properties":307,"children":308},{"style":262},[309],{"type":23,"value":310}," {",{"type":23,"value":89},{"type":14,"tagName":35,"properties":313,"children":314},{"class":252},[315],{"type":14,"tagName":35,"properties":316,"children":317},{"style":262},[318],{"type":23,"value":319},"  basis: number,",{"type":23,"value":89},{"type":14,"tagName":35,"properties":322,"children":323},{"class":252},[324],{"type":14,"tagName":35,"properties":325,"children":326},{"style":262},[327],{"type":23,"value":328},"  upper: number,",{"type":23,"value":89},{"type":14,"tagName":35,"properties":331,"children":332},{"class":252},[333],{"type":14,"tagName":35,"properties":334,"children":335},{"style":262},[336],{"type":23,"value":337},"  lower: number",{"type":23,"value":89},{"type":14,"tagName":35,"properties":340,"children":341},{"class":252},[342],{"type":14,"tagName":35,"properties":343,"children":344},{"style":262},[345],{"type":23,"value":346},"}",{"type":23,"value":89},{"type":14,"tagName":35,"properties":349,"children":350},{"class":252},[],{"type":23,"value":89},{"type":14,"tagName":35,"properties":353,"children":354},{"class":252},[355,360,365],{"type":14,"tagName":35,"properties":356,"children":357},{"style":262},[358],{"type":23,"value":359},"func ",{"type":14,"tagName":35,"properties":361,"children":362},{"style":256},[363],{"type":23,"value":364},"zscore",{"type":14,"tagName":35,"properties":366,"children":367},{"style":262},[368],{"type":23,"value":369},"(src, period) {",{"type":23,"value":89},{"type":14,"tagName":35,"properties":372,"children":373},{"class":252},[374,379,384,389,394,399,403,408,412],{"type":14,"tagName":35,"properties":375,"children":376},{"style":297},[377],{"type":23,"value":378},"  var",{"type":14,"tagName":35,"properties":380,"children":381},{"style":262},[382],{"type":23,"value":383}," m ",{"type":14,"tagName":35,"properties":385,"children":386},{"style":297},[387],{"type":23,"value":388},"=",{"type":14,"tagName":35,"properties":390,"children":391},{"style":256},[392],{"type":23,"value":393}," sma",{"type":14,"tagName":35,"properties":395,"children":396},{"style":262},[397],{"type":23,"value":398},"(source",{"type":14,"tagName":35,"properties":400,"children":401},{"style":297},[402],{"type":23,"value":388},{"type":14,"tagName":35,"properties":404,"children":405},{"style":262},[406],{"type":23,"value":407},"src, period",{"type":14,"tagName":35,"properties":409,"children":410},{"style":297},[411],{"type":23,"value":388},{"type":14,"tagName":35,"properties":413,"children":414},{"style":262},[415],{"type":23,"value":416},"period)",{"type":23,"value":89},{"type":14,"tagName":35,"properties":419,"children":420},{"class":252},[421,425,430,434,439,443,447,451,455],{"type":14,"tagName":35,"properties":422,"children":423},{"style":297},[424],{"type":23,"value":378},{"type":14,"tagName":35,"properties":426,"children":427},{"style":262},[428],{"type":23,"value":429}," sd ",{"type":14,"tagName":35,"properties":431,"children":432},{"style":297},[433],{"type":23,"value":388},{"type":14,"tagName":35,"properties":435,"children":436},{"style":256},[437],{"type":23,"value":438}," stdev",{"type":14,"tagName":35,"properties":440,"children":441},{"style":262},[442],{"type":23,"value":398},{"type":14,"tagName":35,"properties":444,"children":445},{"style":297},[446],{"type":23,"value":388},{"type":14,"tagName":35,"properties":448,"children":449},{"style":262},[450],{"type":23,"value":407},{"type":14,"tagName":35,"properties":452,"children":453},{"style":297},[454],{"type":23,"value":388},{"type":14,"tagName":35,"properties":456,"children":457},{"style":262},[458],{"type":23,"value":416},{"type":23,"value":89},{"type":14,"tagName":35,"properties":461,"children":462},{"class":252},[463,468,473,478,483,488],{"type":14,"tagName":35,"properties":464,"children":465},{"style":297},[466],{"type":23,"value":467},"  return",{"type":14,"tagName":35,"properties":469,"children":470},{"style":262},[471],{"type":23,"value":472}," (src ",{"type":14,"tagName":35,"properties":474,"children":475},{"style":297},[476],{"type":23,"value":477},"-",{"type":14,"tagName":35,"properties":479,"children":480},{"style":262},[481],{"type":23,"value":482}," m) ",{"type":14,"tagName":35,"properties":484,"children":485},{"style":297},[486],{"type":23,"value":487},"/",{"type":14,"tagName":35,"properties":489,"children":490},{"style":262},[491],{"type":23,"value":492}," sd",{"type":23,"value":89},{"type":14,"tagName":35,"properties":495,"children":496},{"class":252},[497],{"type":14,"tagName":35,"properties":498,"children":499},{"style":262},[500],{"type":23,"value":346},{"type":23,"value":89},{"type":14,"tagName":35,"properties":503,"children":504},{"class":252},[],{"type":23,"value":89},{"type":14,"tagName":35,"properties":507,"children":508},{"class":252},[509,513,518],{"type":14,"tagName":35,"properties":510,"children":511},{"style":262},[512],{"type":23,"value":359},{"type":14,"tagName":35,"properties":514,"children":515},{"style":256},[516],{"type":23,"value":517},"makeBand",{"type":14,"tagName":35,"properties":519,"children":520},{"style":262},[521],{"type":23,"value":522},"(src, period, mult) {",{"type":23,"value":89},{"type":14,"tagName":35,"properties":525,"children":526},{"class":252},[527,531,535,539,543,547,551,555,559],{"type":14,"tagName":35,"properties":528,"children":529},{"style":297},[530],{"type":23,"value":378},{"type":14,"tagName":35,"properties":532,"children":533},{"style":262},[534],{"type":23,"value":383},{"type":14,"tagName":35,"properties":536,"children":537},{"style":297},[538],{"type":23,"value":388},{"type":14,"tagName":35,"properties":540,"children":541},{"style":256},[542],{"type":23,"value":393},{"type":14,"tagName":35,"properties":544,"children":545},{"style":262},[546],{"type":23,"value":398},{"type":14,"tagName":35,"properties":548,"children":549},{"style":297},[550],{"type":23,"value":388},{"type":14,"tagName":35,"properties":552,"children":553},{"style":262},[554],{"type":23,"value":407},{"type":14,"tagName":35,"properties":556,"children":557},{"style":297},[558],{"type":23,"value":388},{"type":14,"tagName":35,"properties":560,"children":561},{"style":262},[562],{"type":23,"value":416},{"type":23,"value":89},{"type":14,"tagName":35,"properties":565,"children":566},{"class":252},[567,571,575,579,583,587,591,595,599],{"type":14,"tagName":35,"properties":568,"children":569},{"style":297},[570],{"type":23,"value":378},{"type":14,"tagName":35,"properties":572,"children":573},{"style":262},[574],{"type":23,"value":429},{"type":14,"tagName":35,"properties":576,"children":577},{"style":297},[578],{"type":23,"value":388},{"type":14,"tagName":35,"properties":580,"children":581},{"style":256},[582],{"type":23,"value":438},{"type":14,"tagName":35,"properties":584,"children":585},{"style":262},[586],{"type":23,"value":398},{"type":14,"tagName":35,"properties":588,"children":589},{"style":297},[590],{"type":23,"value":388},{"type":14,"tagName":35,"properties":592,"children":593},{"style":262},[594],{"type":23,"value":407},{"type":14,"tagName":35,"properties":596,"children":597},{"style":297},[598],{"type":23,"value":388},{"type":14,"tagName":35,"properties":600,"children":601},{"style":262},[602],{"type":23,"value":416},{"type":23,"value":89},{"type":14,"tagName":35,"properties":605,"children":606},{"class":252},[607,611,616,621,626,630,635,639,644,649,653,658,663,667,671,675,679,683],{"type":14,"tagName":35,"properties":608,"children":609},{"style":297},[610],{"type":23,"value":467},{"type":14,"tagName":35,"properties":612,"children":613},{"style":262},[614],{"type":23,"value":615}," Band.",{"type":14,"tagName":35,"properties":617,"children":618},{"style":256},[619],{"type":23,"value":620},"new",{"type":14,"tagName":35,"properties":622,"children":623},{"style":262},[624],{"type":23,"value":625},"(basis",{"type":14,"tagName":35,"properties":627,"children":628},{"style":297},[629],{"type":23,"value":388},{"type":14,"tagName":35,"properties":631,"children":632},{"style":262},[633],{"type":23,"value":634},"m, upper",{"type":14,"tagName":35,"properties":636,"children":637},{"style":297},[638],{"type":23,"value":388},{"type":14,"tagName":35,"properties":640,"children":641},{"style":262},[642],{"type":23,"value":643},"m ",{"type":14,"tagName":35,"properties":645,"children":646},{"style":297},[647],{"type":23,"value":648},"+",{"type":14,"tagName":35,"properties":650,"children":651},{"style":262},[652],{"type":23,"value":429},{"type":14,"tagName":35,"properties":654,"children":655},{"style":297},[656],{"type":23,"value":657},"*",{"type":14,"tagName":35,"properties":659,"children":660},{"style":262},[661],{"type":23,"value":662}," mult, lower",{"type":14,"tagName":35,"properties":664,"children":665},{"style":297},[666],{"type":23,"value":388},{"type":14,"tagName":35,"properties":668,"children":669},{"style":262},[670],{"type":23,"value":643},{"type":14,"tagName":35,"properties":672,"children":673},{"style":297},[674],{"type":23,"value":477},{"type":14,"tagName":35,"properties":676,"children":677},{"style":262},[678],{"type":23,"value":429},{"type":14,"tagName":35,"properties":680,"children":681},{"style":297},[682],{"type":23,"value":657},{"type":14,"tagName":35,"properties":684,"children":685},{"style":262},[686],{"type":23,"value":687}," mult)",{"type":23,"value":89},{"type":14,"tagName":35,"properties":690,"children":691},{"class":252},[692],{"type":14,"tagName":35,"properties":693,"children":694},{"style":262},[695],{"type":23,"value":346},{"type":23,"value":89},{"type":14,"tagName":698,"properties":699,"children":700,"position":793},"ul",{},[701,702,738,739,792],{"type":23,"value":89},{"type":14,"tagName":703,"properties":704,"children":705,"position":734},"li",{},[706,715,728],{"type":23,"value":707,"position":708},"The name must be lowercase (",{"start":709,"end":712},{"line":710,"column":32,"offset":711},39,1195,{"line":710,"column":713,"offset":714},31,1223,{"type":14,"tagName":191,"properties":716,"children":717,"position":725},{},[718],{"type":23,"value":719,"position":720},"[a-z][a-z0-9_]*",{"start":721,"end":722},{"line":710,"column":713,"offset":714},{"line":710,"column":723,"offset":724},48,1240,{"start":726,"end":727},{"line":710,"column":713,"offset":714},{"line":710,"column":723,"offset":724},{"type":23,"value":729,"position":730},"); the version is optional semver.",{"start":731,"end":732},{"line":710,"column":723,"offset":724},{"line":710,"column":209,"offset":733},1274,{"start":735,"end":737},{"line":710,"column":27,"offset":736},1193,{"line":710,"column":209,"offset":733},{"type":23,"value":89},{"type":14,"tagName":703,"properties":740,"children":741,"position":788},{},[742,750,762,768,781],{"type":23,"value":743,"position":744},"Anything else at top level (",{"start":745,"end":748},{"line":746,"column":32,"offset":747},40,1277,{"line":746,"column":713,"offset":749},1305,{"type":14,"tagName":191,"properties":751,"children":752,"position":759},{},[753],{"type":23,"value":754,"position":755},"define",{"start":756,"end":757},{"line":746,"column":713,"offset":749},{"line":746,"column":710,"offset":758},1313,{"start":760,"end":761},{"line":746,"column":713,"offset":749},{"line":746,"column":710,"offset":758},{"type":23,"value":763,"position":764},", plots, ",{"start":765,"end":766},{"line":746,"column":710,"offset":758},{"line":746,"column":723,"offset":767},1322,{"type":14,"tagName":191,"properties":769,"children":770,"position":778},{},[771],{"type":23,"value":772,"position":773},"input",{"start":774,"end":775},{"line":746,"column":723,"offset":767},{"line":746,"column":776,"offset":777},55,1329,{"start":779,"end":780},{"line":746,"column":723,"offset":767},{"line":746,"column":776,"offset":777},{"type":23,"value":782,"position":783},", data sources, bare expressions) is a compile error with line/column: libraries declare, consumers run.",{"start":784,"end":785},{"line":746,"column":776,"offset":777},{"line":746,"column":786,"offset":787},159,1433,{"start":789,"end":791},{"line":746,"column":27,"offset":790},1275,{"line":746,"column":786,"offset":787},{"type":23,"value":89},{"start":794,"end":795},{"line":710,"column":27,"offset":736},{"line":746,"column":786,"offset":787},{"type":23,"value":89},{"type":14,"tagName":102,"properties":798,"children":800,"position":810},{"id":799},"importing",[801],{"type":23,"value":802,"position":803},"Importing",{"start":804,"end":807},{"line":805,"column":56,"offset":806},42,1438,{"line":805,"column":808,"offset":809},13,1447,{"start":811,"end":813},{"line":805,"column":27,"offset":812},1435,{"line":805,"column":808,"offset":809},{"type":23,"value":89},{"type":11,"children":816},[817],{"type":14,"tagName":241,"properties":818,"children":819,"data":-1},{"class":243,"style":244,"tabindex":245},[820],{"type":14,"tagName":191,"properties":821,"children":822},{},[823,842,843,860,861],{"type":14,"tagName":35,"properties":824,"children":825},{"class":252},[826,831,836],{"type":14,"tagName":35,"properties":827,"children":828},{"style":297},[829],{"type":23,"value":830},"import",{"type":14,"tagName":35,"properties":832,"children":833},{"style":268},[834],{"type":23,"value":835}," \"my_ta\"",{"type":14,"tagName":35,"properties":837,"children":839},{"style":838},"--shiki-dark:#6A737D;--shiki-light:#6A737D",[840],{"type":23,"value":841},"                    // latest version, plain names: zscore(...)",{"type":23,"value":89},{"type":14,"tagName":35,"properties":844,"children":845},{"class":252},[846,850,855],{"type":14,"tagName":35,"properties":847,"children":848},{"style":297},[849],{"type":23,"value":830},{"type":14,"tagName":35,"properties":851,"children":852},{"style":268},[853],{"type":23,"value":854}," \"my_ta@1.0.0\"",{"type":14,"tagName":35,"properties":856,"children":857},{"style":838},[858],{"type":23,"value":859},"              // pinned to an exact version",{"type":23,"value":89},{"type":14,"tagName":35,"properties":862,"children":863},{"class":252},[864,868,872,877],{"type":14,"tagName":35,"properties":865,"children":866},{"style":297},[867],{"type":23,"value":830},{"type":14,"tagName":35,"properties":869,"children":870},{"style":268},[871],{"type":23,"value":835},{"type":14,"tagName":35,"properties":873,"children":874},{"style":262},[875],{"type":23,"value":876}," as ta              ",{"type":14,"tagName":35,"properties":878,"children":879},{"style":838},[880],{"type":23,"value":881},"// aliased: ta.zscore(...), ta.Band.new(...)",{"type":23,"value":89},{"type":14,"tagName":698,"properties":884,"children":885,"position":1048},{},[886,887,919,920,969,970,1018,1019,1047],{"type":23,"value":89},{"type":14,"tagName":703,"properties":888,"children":889,"position":915},{},[890,908],{"type":14,"tagName":133,"properties":891,"children":892,"position":902},{},[893],{"type":23,"value":894,"position":895},"Plain import",{"start":896,"end":899},{"line":897,"column":67,"offset":898},49,1692,{"line":897,"column":900,"offset":901},17,1704,{"start":903,"end":905},{"line":897,"column":32,"offset":904},1690,{"line":897,"column":906,"offset":907},19,1706,{"type":23,"value":909,"position":910}," brings the library's functions and types in under their own names.",{"start":911,"end":912},{"line":897,"column":906,"offset":907},{"line":897,"column":913,"offset":914},86,1773,{"start":916,"end":918},{"line":897,"column":27,"offset":917},1688,{"line":897,"column":913,"offset":914},{"type":23,"value":89},{"type":14,"tagName":703,"properties":921,"children":922,"position":965},{},[923,938,945,958],{"type":14,"tagName":133,"properties":924,"children":925,"position":933},{},[926],{"type":23,"value":927,"position":928},"Alias import",{"start":929,"end":931},{"line":188,"column":67,"offset":930},1778,{"line":188,"column":900,"offset":932},1790,{"start":934,"end":936},{"line":188,"column":32,"offset":935},1776,{"line":188,"column":906,"offset":937},1792,{"type":23,"value":939,"position":940}," namespaces everything behind the alias, like the built-in ",{"start":941,"end":942},{"line":188,"column":906,"offset":937},{"line":188,"column":943,"offset":944},78,1851,{"type":14,"tagName":191,"properties":946,"children":947,"position":955},{},[948],{"type":23,"value":949,"position":950},"math.",{"start":951,"end":952},{"line":188,"column":943,"offset":944},{"line":188,"column":953,"offset":954},85,1858,{"start":956,"end":957},{"line":188,"column":943,"offset":944},{"line":188,"column":953,"offset":954},{"type":23,"value":959,"position":960}," namespace. Aliased imports can never collide with anything.",{"start":961,"end":962},{"line":188,"column":953,"offset":954},{"line":188,"column":963,"offset":964},145,1918,{"start":966,"end":968},{"line":188,"column":27,"offset":967},1774,{"line":188,"column":963,"offset":964},{"type":23,"value":89},{"type":14,"tagName":703,"properties":971,"children":972,"position":1014},{},[973,989,995,1007],{"type":14,"tagName":133,"properties":974,"children":975,"position":984},{},[976],{"type":23,"value":977,"position":978},"Pinning",{"start":979,"end":982},{"line":980,"column":67,"offset":981},51,1923,{"line":980,"column":127,"offset":983},1930,{"start":985,"end":987},{"line":980,"column":32,"offset":986},1921,{"line":980,"column":169,"offset":988},1932,{"type":23,"value":990,"position":991},": ",{"start":992,"end":993},{"line":980,"column":169,"offset":988},{"line":980,"column":112,"offset":994},1934,{"type":14,"tagName":191,"properties":996,"children":997,"position":1004},{},[998],{"type":23,"value":999,"position":1000},"name@version",{"start":1001,"end":1002},{"line":980,"column":112,"offset":994},{"line":980,"column":28,"offset":1003},1948,{"start":1005,"end":1006},{"line":980,"column":112,"offset":994},{"line":980,"column":28,"offset":1003},{"type":23,"value":1008,"position":1009}," selects an exact registered version; a bare name takes the latest. Unknown names and versions error with the list of what is available.",{"start":1010,"end":1011},{"line":980,"column":28,"offset":1003},{"line":980,"column":1012,"offset":1013},166,2084,{"start":1015,"end":1017},{"line":980,"column":27,"offset":1016},1919,{"line":980,"column":1012,"offset":1013},{"type":23,"value":89},{"type":14,"tagName":703,"properties":1020,"children":1021,"position":1043},{},[1022,1036],{"type":14,"tagName":191,"properties":1023,"children":1024,"position":1033},{},[1025],{"type":23,"value":830,"position":1026},{"start":1027,"end":1030},{"line":1028,"column":32,"offset":1029},52,2087,{"line":1028,"column":1031,"offset":1032},11,2095,{"start":1034,"end":1035},{"line":1028,"column":32,"offset":1029},{"line":1028,"column":1031,"offset":1032},{"type":23,"value":1037,"position":1038}," is contextual (old scripts using the word as an identifier keep parsing), and duplicate imports of the same library are reported as exactly that.",{"start":1039,"end":1040},{"line":1028,"column":1031,"offset":1032},{"line":1028,"column":1041,"offset":1042},157,2241,{"start":1044,"end":1046},{"line":1028,"column":27,"offset":1045},2085,{"line":1028,"column":1041,"offset":1042},{"type":23,"value":89},{"start":1049,"end":1050},{"line":897,"column":27,"offset":917},{"line":1028,"column":1041,"offset":1042},{"type":23,"value":89},{"type":14,"tagName":102,"properties":1053,"children":1055,"position":1065},{"id":1054},"precedence-and-integrity-rules",[1056],{"type":23,"value":1057,"position":1058},"Precedence and integrity rules",{"start":1059,"end":1062},{"line":1060,"column":56,"offset":1061},54,2246,{"line":1060,"column":1063,"offset":1064},34,2276,{"start":1066,"end":1068},{"line":1060,"column":27,"offset":1067},2243,{"line":1060,"column":1063,"offset":1064},{"type":23,"value":89},{"type":14,"tagName":120,"properties":1071,"children":1072,"position":1080},{},[1073],{"type":23,"value":1074,"position":1075},"Worked out so that nothing ever changes meaning silently:",{"start":1076,"end":1078},{"line":130,"column":27,"offset":1077},2278,{"line":130,"column":140,"offset":1079},2335,{"start":1081,"end":1082},{"line":130,"column":27,"offset":1077},{"line":130,"column":140,"offset":1079},{"type":23,"value":89},{"type":14,"tagName":1085,"properties":1086,"children":1087,"position":1278},"ol",{},[1088,1089,1121,1122,1178,1179,1209,1210,1277],{"type":23,"value":89},{"type":14,"tagName":703,"properties":1090,"children":1091,"position":1117},{},[1092,1110],{"type":14,"tagName":133,"properties":1093,"children":1094,"position":1104},{},[1095],{"type":23,"value":1096,"position":1097},"Your script wins.",{"start":1098,"end":1101},{"line":140,"column":1099,"offset":1100},6,2342,{"line":140,"column":1102,"offset":1103},23,2359,{"start":1105,"end":1107},{"line":140,"column":56,"offset":1106},2340,{"line":140,"column":1108,"offset":1109},25,2361,{"type":23,"value":1111,"position":1112}," If a plain import collides with a function the script itself defines, the script's version is used at the script's call sites, and the compiler emits a warning telling you so.",{"start":1113,"end":1114},{"line":140,"column":1108,"offset":1109},{"line":140,"column":1115,"offset":1116},201,2537,{"start":1118,"end":1120},{"line":140,"column":27,"offset":1119},2337,{"line":140,"column":1115,"offset":1116},{"type":23,"value":89},{"type":14,"tagName":703,"properties":1123,"children":1124,"position":1174},{},[1125,1142,1149,1167],{"type":14,"tagName":133,"properties":1126,"children":1127,"position":1137},{},[1128],{"type":23,"value":1129,"position":1130},"Libraries are internally sealed.",{"start":1131,"end":1134},{"line":1132,"column":1099,"offset":1133},59,2543,{"line":1132,"column":1135,"offset":1136},38,2575,{"start":1138,"end":1140},{"line":1132,"column":56,"offset":1139},2541,{"line":1132,"column":746,"offset":1141},2577,{"type":23,"value":1143,"position":1144}," A library function calling its sibling always gets ",{"start":1145,"end":1146},{"line":1132,"column":746,"offset":1141},{"line":1132,"column":1147,"offset":1148},92,2629,{"type":14,"tagName":1150,"properties":1151,"children":1152,"position":1162},"em",{},[1153],{"type":23,"value":1154,"position":1155},"its own",{"start":1156,"end":1159},{"line":1132,"column":1157,"offset":1158},93,2630,{"line":1132,"column":1160,"offset":1161},100,2637,{"start":1163,"end":1164},{"line":1132,"column":1147,"offset":1148},{"line":1132,"column":1165,"offset":1166},101,2638,{"type":23,"value":1168,"position":1169}," sibling, even when the consumer overrides that name. Imports cannot be middleman-ed.",{"start":1170,"end":1171},{"line":1132,"column":1165,"offset":1166},{"line":1132,"column":1172,"offset":1173},186,2723,{"start":1175,"end":1177},{"line":1132,"column":27,"offset":1176},2538,{"line":1132,"column":1172,"offset":1173},{"type":23,"value":89},{"type":14,"tagName":703,"properties":1180,"children":1181,"position":1205},{},[1182,1198],{"type":14,"tagName":133,"properties":1183,"children":1184,"position":1193},{},[1185],{"type":23,"value":1186,"position":1187},"Import-vs-import plain collisions are errors",{"start":1188,"end":1191},{"line":1189,"column":1099,"offset":1190},60,2729,{"line":1189,"column":188,"offset":1192},2773,{"start":1194,"end":1196},{"line":1189,"column":56,"offset":1195},2727,{"line":1189,"column":1028,"offset":1197},2775,{"type":23,"value":1199,"position":1200}," (ambiguity has no safe default); alias one of them.",{"start":1201,"end":1202},{"line":1189,"column":1028,"offset":1197},{"line":1189,"column":1203,"offset":1204},104,2827,{"start":1206,"end":1208},{"line":1189,"column":27,"offset":1207},2724,{"line":1189,"column":1203,"offset":1204},{"type":23,"value":89},{"type":14,"tagName":703,"properties":1211,"children":1212,"position":1273},{},[1213,1229,1234,1246,1253,1266],{"type":14,"tagName":133,"properties":1214,"children":1215,"position":1224},{},[1216],{"type":23,"value":1217,"position":1218},"Aliases are validated",{"start":1219,"end":1221},{"line":199,"column":1099,"offset":1220},2833,{"line":199,"column":1222,"offset":1223},27,2854,{"start":1225,"end":1227},{"line":199,"column":56,"offset":1226},2831,{"line":199,"column":29,"offset":1228},2856,{"type":23,"value":990,"position":1230},{"start":1231,"end":1232},{"line":199,"column":29,"offset":1228},{"line":199,"column":713,"offset":1233},2858,{"type":14,"tagName":191,"properties":1235,"children":1236,"position":1243},{},[1237],{"type":23,"value":1238,"position":1239},"as math",{"start":1240,"end":1241},{"line":199,"column":713,"offset":1233},{"line":199,"column":746,"offset":1242},2867,{"start":1244,"end":1245},{"line":199,"column":713,"offset":1233},{"line":199,"column":746,"offset":1242},{"type":23,"value":1247,"position":1248}," (a builtin namespace) or ",{"start":1249,"end":1250},{"line":199,"column":746,"offset":1242},{"line":199,"column":1251,"offset":1252},66,2893,{"type":14,"tagName":191,"properties":1254,"children":1255,"position":1263},{},[1256],{"type":23,"value":1257,"position":1258},"as close",{"start":1259,"end":1260},{"line":199,"column":1251,"offset":1252},{"line":199,"column":1261,"offset":1262},76,2903,{"start":1264,"end":1265},{"line":199,"column":1251,"offset":1252},{"line":199,"column":1261,"offset":1262},{"type":23,"value":1267,"position":1268}," (a global) is a compile error.",{"start":1269,"end":1270},{"line":199,"column":1261,"offset":1262},{"line":199,"column":1271,"offset":1272},107,2934,{"start":1274,"end":1276},{"line":199,"column":27,"offset":1275},2828,{"line":199,"column":1271,"offset":1272},{"type":23,"value":89},{"start":1279,"end":1280},{"line":140,"column":27,"offset":1119},{"line":199,"column":1271,"offset":1272},{"type":23,"value":89},{"type":14,"tagName":102,"properties":1283,"children":1285,"position":1294},{"id":1284},"sandbox-and-attribution",[1286],{"type":23,"value":1287,"position":1288},"Sandbox and attribution",{"start":1289,"end":1292},{"line":1290,"column":56,"offset":1291},63,2939,{"line":1290,"column":1222,"offset":1293},2962,{"start":1295,"end":1297},{"line":1290,"column":27,"offset":1296},2936,{"line":1290,"column":1222,"offset":1293},{"type":23,"value":89},{"type":14,"tagName":120,"properties":1300,"children":1301,"position":1379},{},[1302,1310,1328,1335,1352,1359,1372],{"type":23,"value":1303,"position":1304},"Library code is ordinary kScript: every limit in the ",{"start":1305,"end":1308},{"line":1306,"column":27,"offset":1307},65,2964,{"line":1306,"column":1060,"offset":1309},3017,{"type":14,"tagName":1311,"properties":1312,"children":1314,"position":1323},"a",{"href":1313},"../faq/limitations.md",[1315],{"type":23,"value":1316,"position":1317},"sandbox manifest",{"start":1318,"end":1320},{"line":1306,"column":776,"offset":1319},3018,{"line":1306,"column":1321,"offset":1322},71,3034,{"start":1324,"end":1325},{"line":1306,"column":1060,"offset":1309},{"line":1306,"column":1326,"offset":1327},95,3058,{"type":23,"value":1329,"position":1330}," applies unchanged, and errors raised inside a library carry the ",{"start":1331,"end":1332},{"line":1306,"column":1326,"offset":1327},{"line":1306,"column":1333,"offset":1334},160,3123,{"type":14,"tagName":133,"properties":1336,"children":1337,"position":1347},{},[1338],{"type":23,"value":1339,"position":1340},"library's own line and column",{"start":1341,"end":1344},{"line":1306,"column":1342,"offset":1343},162,3125,{"line":1306,"column":1345,"offset":1346},191,3154,{"start":1348,"end":1349},{"line":1306,"column":1333,"offset":1334},{"line":1306,"column":1350,"offset":1351},193,3156,{"type":23,"value":1353,"position":1354},", so a runaway loop in ",{"start":1355,"end":1356},{"line":1306,"column":1350,"offset":1351},{"line":1306,"column":1357,"offset":1358},216,3179,{"type":14,"tagName":191,"properties":1360,"children":1361,"position":1369},{},[1362],{"type":23,"value":1363,"position":1364},"my_ta",{"start":1365,"end":1366},{"line":1306,"column":1357,"offset":1358},{"line":1306,"column":1367,"offset":1368},223,3186,{"start":1370,"end":1371},{"line":1306,"column":1357,"offset":1358},{"line":1306,"column":1367,"offset":1368},{"type":23,"value":1373,"position":1374}," says so, not some opaque consumer position.",{"start":1375,"end":1376},{"line":1306,"column":1367,"offset":1368},{"line":1306,"column":1377,"offset":1378},267,3230,{"start":1380,"end":1381},{"line":1306,"column":27,"offset":1307},{"line":1306,"column":1377,"offset":1378},{"type":23,"value":89},{"type":14,"tagName":102,"properties":1384,"children":1386,"position":1396},{"id":1385},"versioning-and-updates",[1387],{"type":23,"value":1388,"position":1389},"Versioning and updates",{"start":1390,"end":1393},{"line":1391,"column":56,"offset":1392},67,3235,{"line":1391,"column":1394,"offset":1395},26,3257,{"start":1397,"end":1399},{"line":1391,"column":27,"offset":1398},3232,{"line":1391,"column":1394,"offset":1395},{"type":23,"value":89},{"type":14,"tagName":120,"properties":1402,"children":1403,"position":1455},{},[1404,1412,1425,1432,1448],{"type":23,"value":1405,"position":1406},"Registering a new version of a library leaves existing pins untouched: scripts pinned to ",{"start":1407,"end":1410},{"line":1408,"column":27,"offset":1409},69,3259,{"line":1408,"column":226,"offset":1411},3348,{"type":14,"tagName":191,"properties":1413,"children":1414,"position":1422},{},[1415],{"type":23,"value":1416,"position":1417},"@1.0.0",{"start":1418,"end":1419},{"line":1408,"column":226,"offset":1411},{"line":1408,"column":1420,"offset":1421},98,3356,{"start":1423,"end":1424},{"line":1408,"column":226,"offset":1411},{"line":1408,"column":1420,"offset":1421},{"type":23,"value":1426,"position":1427}," keep their behavior; bare imports pick up the latest on their next run. Re-registering the ",{"start":1428,"end":1429},{"line":1408,"column":1420,"offset":1421},{"line":1408,"column":1430,"offset":1431},190,3448,{"type":14,"tagName":1150,"properties":1433,"children":1434,"position":1443},{},[1435],{"type":23,"value":1436,"position":1437},"same",{"start":1438,"end":1440},{"line":1408,"column":1345,"offset":1439},3449,{"line":1408,"column":1441,"offset":1442},195,3453,{"start":1444,"end":1445},{"line":1408,"column":1430,"offset":1431},{"line":1408,"column":1446,"offset":1447},196,3454,{"type":23,"value":1449,"position":1450}," version is an error: versions are immutable once published.",{"start":1451,"end":1452},{"line":1408,"column":1446,"offset":1447},{"line":1408,"column":1453,"offset":1454},256,3514,{"start":1456,"end":1457},{"line":1408,"column":27,"offset":1409},{"line":1408,"column":1453,"offset":1454},{"type":23,"value":89},{"type":14,"tagName":102,"properties":1460,"children":1462,"position":1470},{"id":1461},"hot-reload-in-the-playground",[1463],{"type":23,"value":1464,"position":1465},"Hot reload in the playground",{"start":1466,"end":1468},{"line":1321,"column":56,"offset":1467},3519,{"line":1321,"column":33,"offset":1469},3547,{"start":1471,"end":1473},{"line":1321,"column":27,"offset":1472},3516,{"line":1321,"column":33,"offset":1469},{"type":23,"value":89},{"type":14,"tagName":120,"properties":1476,"children":1477,"position":1487},{},[1478],{"type":23,"value":1479,"position":1480},"The playground has a library editor alongside the script editor. Edit the library, run the script, and the new library code is picked up immediately: same page, no reload, registry updated in place. The development loop for a shared helper is exactly the development loop for a script.",{"start":1481,"end":1484},{"line":1482,"column":27,"offset":1483},73,3549,{"line":1482,"column":1485,"offset":1486},286,3834,{"start":1488,"end":1489},{"line":1482,"column":27,"offset":1483},{"line":1482,"column":1485,"offset":1486},{"type":23,"value":89},{"type":14,"tagName":102,"properties":1492,"children":1494,"position":1503},{"id":1493},"pine-comparison",[1495],{"type":23,"value":1496,"position":1497},"Pine comparison",{"start":1498,"end":1501},{"line":1499,"column":56,"offset":1500},75,3839,{"line":1499,"column":906,"offset":1502},3854,{"start":1504,"end":1506},{"line":1499,"column":27,"offset":1505},3836,{"line":1499,"column":906,"offset":1502},{"type":23,"value":89},{"type":14,"tagName":120,"properties":1509,"children":1510,"position":1520},{},[1511],{"type":23,"value":1512,"position":1513},"Pine libraries exist but are publish-bound (TradingView-hosted, review queues, no local hot iteration) and export only functions over Pine's types. kScript libraries are local-first, version-pinned, hot-reloadable, can export your own structured types, and their consumers keep every compile-time guarantee (typed fields, precedence warnings, sandbox attribution) the rest of v3 provides.",{"start":1514,"end":1517},{"line":1515,"column":27,"offset":1516},77,3856,{"line":1515,"column":1518,"offset":1519},389,4244,{"start":1521,"end":1522},{"line":1515,"column":27,"offset":1516},{"line":1515,"column":1518,"offset":1519},{"quirksMode":1524},false,{"start":1526,"end":1527},{"line":27,"column":27,"offset":97},{"line":943,"column":27,"offset":1528},4245,1782471853602]