1
0

ProcessGit skatītājs MI stratēģijai

- viewer/MI_strategijas_datukopa.html (+ template.html): pīlāri, visas rīcības, principi un resursi, Par
- data/processgit.viewer.json: pppa-mis-*.xml → skatītājs
- tools/build_viewer.py

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016679RwmHsuTFfxt26wP6rk
This commit is contained in:
2026-10-09 22:26:05 +00:00
parent 7a5448113c
commit 1870316eb5
6 changed files with 1147 additions and 0 deletions

View File

@@ -0,0 +1,811 @@
<!doctype html>
<html lang="lv">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>MI stratēģijas datukopa</title>
<style>
:root{--bg:#f6f7f9;--panel:#fff;--ink:#16202c;--muted:#5d6b7a;--line:#dde3ea;--acc:#1f5fbf;--acc-bg:#e8f0fc;--tag:#7a4a00;--tag-bg:#fff2d6;--rec:#6b2d8a;--rec-bg:#f3e8fa;--src:#0d6b4f;--src-bg:#e3f5ee;--hl:#fff7c2;--mono:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}
@media (prefers-color-scheme:dark){:root:not([data-theme="light"]){--bg:#11161d;--panel:#18202a;--ink:#e6ebf1;--muted:#9aa8b8;--line:#2a3542;--acc:#7fb0ff;--acc-bg:#1d2b40;--tag:#ffcf7a;--tag-bg:#3a2d12;--rec:#d9a8f5;--rec-bg:#33224a;--src:#7fe0bd;--src-bg:#123328;--hl:#4a4415}}
:root[data-theme="dark"]{--bg:#11161d;--panel:#18202a;--ink:#e6ebf1;--muted:#9aa8b8;--line:#2a3542;--acc:#7fb0ff;--acc-bg:#1d2b40;--tag:#ffcf7a;--tag-bg:#3a2d12;--rec:#d9a8f5;--rec-bg:#33224a;--src:#7fe0bd;--src-bg:#123328;--hl:#4a4415}
*{box-sizing:border-box}
body{margin:0;background:var(--bg);color:var(--ink);font:15px/1.5 system-ui,-apple-system,"Segoe UI",Roboto,sans-serif}
.wrap{max-width:1080px;margin:0 auto;padding:0 16px}
header{background:var(--panel);border-bottom:1px solid var(--line);padding:18px 0 0}
.meta{display:flex;flex-wrap:wrap;gap:6px 10px;align-items:center;font-size:12.5px;color:var(--muted)}
.chip{text-transform:none;letter-spacing:0;font-family:var(--mono);font-size:11.5px;background:var(--acc-bg);color:var(--acc);border-radius:6px;padding:1px 7px;white-space:nowrap}
h1{margin:6px 0 2px;font-size:26px;line-height:1.2}
.slogan{font-weight:600;color:var(--acc);letter-spacing:.02em}
.vision{color:var(--muted);max-width:860px;margin:8px 0 12px}
.tabs{display:flex;gap:2px;overflow-x:auto;scrollbar-width:none;margin-top:6px}
.tabs button{border:0;background:none;color:var(--muted);font:inherit;font-weight:600;padding:10px 14px;border-bottom:3px solid transparent;cursor:pointer;white-space:nowrap}
.tabs button.on{color:var(--ink);border-bottom-color:var(--acc)}
main.wrap{padding-top:18px;padding-bottom:40px}
.phead{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:16px 18px;margin-bottom:16px}
.kicker{font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:var(--acc);margin:0}
.phead h2{margin:4px 0 6px;font-size:21px}
.phead p{margin:0}
.goal{margin:22px 0 10px;display:flex;gap:10px;align-items:baseline}
.goal .n{font-size:20px;font-weight:800;color:var(--acc)}
.goal h3{margin:0;font-size:17px}
.goal p{margin:4px 0 0;color:var(--muted)}
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:12px}
.card{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:14px 16px;display:flex;flex-direction:column;gap:7px;min-width:0;scroll-margin-top:14px;transition:background .6s}
.card.flash{background:var(--hl)}
.top{display:flex;flex-wrap:wrap;gap:6px;align-items:center}
.num{font-weight:800}
.dl{margin-left:auto;font-size:12.5px;font-weight:600;white-space:nowrap}
.dl.open{color:var(--tag)}
.tag{font-size:11.5px;font-weight:600;border-radius:999px;padding:1px 8px;background:var(--tag-bg);color:var(--tag)}
.tag.rec{background:var(--rec-bg);color:var(--rec)}
.tag.src{background:var(--src-bg);color:var(--src)}
.card h4{margin:0;font-size:15.5px;line-height:1.35}
.card p{margin:0}
.measure{font-size:13.5px;background:var(--bg);border-radius:8px;padding:7px 10px}
.measure b{display:block;font-size:11.5px;text-transform:uppercase;letter-spacing:.05em;color:var(--muted)}
.ref{font-size:13px;color:var(--muted);overflow-wrap:anywhere}
.ref b{font-weight:600}
a{color:var(--acc)}
a.act{font-weight:600;text-decoration:none;border-bottom:1px dotted}
.resp{font-size:12.5px;color:var(--muted);font-style:italic}
.tools{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:12px}
input[type=search],select{font:inherit;padding:7px 10px;border:1px solid var(--line);border-radius:8px;background:var(--panel);color:var(--ink);min-width:0}
input[type=search]{flex:1 1 220px}
table{width:100%;border-collapse:collapse;background:var(--panel);border:1px solid var(--line);border-radius:12px;overflow:hidden;font-size:14px}
th,td{text-align:left;padding:8px 10px;border-bottom:1px solid var(--line);vertical-align:top}
th{font-size:12px;color:var(--muted);text-transform:uppercase;letter-spacing:.04em;cursor:pointer;user-select:none;white-space:nowrap}
tr:last-child td{border-bottom:0}
tbody tr{cursor:pointer}
tbody tr:hover{background:var(--bg)}
.tw{overflow-x:auto}
.box{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:16px 18px;margin-bottom:14px}
.box h2{margin:0 0 8px;font-size:18px}
.box h3{margin:14px 0 6px;font-size:15px}
.tiles{display:grid;grid-template-columns:repeat(auto-fill,minmax(130px,1fr));gap:10px;margin:10px 0}
.tile{background:var(--bg);border-radius:10px;padding:10px 12px}
.tile b{display:block;font-size:24px;line-height:1.1}
.tile span{font-size:12.5px;color:var(--muted)}
.prin{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:10px}
.prin div{background:var(--bg);border-radius:10px;padding:10px 12px}
.prin b{display:block;font-size:12.5px;color:var(--acc);text-transform:uppercase;letter-spacing:.05em}
pre{font-family:var(--mono);font-size:12px;background:var(--bg);border-radius:8px;padding:10px;overflow-x:auto;margin:6px 0}
code{font-family:var(--mono);font-size:12.5px}
details summary{cursor:pointer;font-weight:600}
.pgvbar{font-family:var(--mono);font-size:11.5px;color:var(--muted)}
.hidden{display:none!important}
.empty{padding:40px 0;text-align:center;color:var(--muted)}
@media (max-width:560px){h1{font-size:21px}.grid{grid-template-columns:1fr}.dl{margin-left:0}}
</style>
</head>
<body>
<header>
<div class="wrap">
<div class="meta" id="meta"></div>
<h1 id="title">MI stratēģijas datukopa</h1>
<div class="slogan" id="slogan"></div>
<p class="vision" id="vision"></p>
<nav class="tabs" id="tabs"></nav>
</div>
</header>
<main class="wrap" id="main"><div class="empty">Ielādē…</div></main>
<script id="embedded" type="application/xml"><?xml version="1.0" encoding="UTF-8"?>
<AIStrategy xmlns="urn:pppa:cac:mi-strategija:0.1" id="pppa-mis-2026-09-10" version="v2.2">
<Title>Latvijas Nacionālā MI Stratēģija</Title>
<Author>PPP Asociācija (PPPA)</Author>
<Status>PPPA darba versija</Status>
<Updated value="2026-09-10">10.09.2026.</Updated>
<ProposalsOpened value="2026-05-30">30.05.2026.</ProposalsOpened>
<SourceUrl>https://pppa.lv/mi-strategija</SourceUrl>
<Slogan><Word>Efektivitāte</Word><Word>Atvērtība</Word><Word>Līderība</Word></Slogan>
<Vision>Latvijas mērķis ir kļūt par atvērtāko un uzticamāko vidi mākslīgā intelekta ieviešanai un MI ekonomikai, būtiski paaugstināt valsts un uzņēmumu efektivitāti un stiprināt tehnoloģisko neatkaribu un radītu eksportspējīgu izaugsmi.</Vision>
<Pillar id="pppa-mis-2026-09-10.p1" number="I">
<Name>Efektivitāte</Name>
<ShortTitle>1. Atbrīvot no birokrātijas</ShortTitle>
<Heading>Atbrīvot cilvēkus un uzņēmumus no birokrātijas</Heading>
<Summary>Proaktīvi, minūtēs nokārtoti valsts pakalpojumi un auditējami lēmumi. Flagmanis — "MI Dvīnis" verificētām Latvijas personām.</Summary>
<Description>Ikviens iedzīvotājs un uzņēmums saņem uzticamu MI atbalstu darbam ar valsti — atļaujas, deklarācijas, reģistrācijas un iesniegumi tiek nokārtoti minūtēs, uzraudzīti, auditējami un atsaucami. Šī ir suverēnā, iekšzemes puse: tās flagmanis ir "MI Dvīnis" — verificētas Latvijas fiziskas vai juridiskas personas MI pārstāvis, kas balstās Latvijas eID (eParaksts) uzticamības enkurā un rīkojas vienīgi piešķirtās pilnvaras robežās.</Description>
<Goal id="pppa-mis-2026-09-10.m1" number="1.">
<Title>Proaktīvi valsts pakalpojumi iedzīvotājiem un uzņēmumiem</Title>
<Description>Valsts un pašvaldības sniedz publiskās pārvaldes pakalpojumus iedzīvotājiem un uzņēmumiem pēc savas iniciatīvas, negaidot pieteikumu iesniegšanu. Pabalsti, atļaujas un paziņojumi tiek nodrošināti automātiski — iedzīvotājiem un uzņēmumiem nav jāpieprasa un jāpierāda fakti, kas jau ir publiskās pārvaldes rīcībā.</Description>
<Action id="pppa-mis-2026-09-10.r01" number="1">
<Title>Katrā institūcijā vismaz viens algoritmizēts darbības process</Title>
<Text>Katra institūcija ievieš vismaz vienu pilotprojektu, kas ietver strādājošu, algoritmizētu, auditējamu institūcijas darbības procesu, kurā tiek izmantots MI, lai sniegtu atbalstu lēmumu pieņemšanā.</Text>
<Measurement>MI atbalstīto lēmumu skaits, ietaupītais laiks, uzkrātie dati.</Measurement>
<Deadline value="2027-05-01">01.05.2027.</Deadline>
<Reference kind="saistits" href="https://pppa.lv/projekti/ai-sandbox">Process-as-Code · ES MI regulas III pielikums</Reference>
</Action>
<Action id="pppa-mis-2026-09-10.r02" number="2">
<Title>Institūciju dokumenti satur vienotu digitālo identitāti</Title>
<Text>Katra institūcija ievieš vienotus dokumentu digitālos identifikatorus un metadatu standartus, lai dokumenti kļūst mašīnlasāmi — MI tos var atrast, izsekot, klasificēt, sasaistīt un analizēt vienas institūcijas, nozares un valsts mērogā.</Text>
<Measurement>MI izmantojami vismaz 50% institūcijas dokumentu kopumā; 100% jaunradīto vai apstrādāto dokumentu.</Measurement>
<Deadline value="2027-06-30">30.06.2027.</Deadline>
<Reference kind="saistits" href="https://pppa.lv/#mi-standarti">Records-as-Code · MK noteikumi Nr. 282</Reference>
</Action>
<Action id="pppa-mis-2026-09-10.r09" number="9">
<Tag>Flagmanis</Tag>
<Title>"MI Dvīnis" — funkcionējoša pilotdemonstrācija Latvijas personām</Title>
<Text>Latvija publiski demonstrē strādājošu "MI Dvīni" — personīgu MI pārstāvi verificētai Latvijas fiziskai vai juridiskai personai, kas rīkojas tās vārdā un balstās personas eID (eParaksts) identitātē. Tas neprasa jaunu likumdošanu — L0 līmenī "MI Dvīnis" sagatavo dokumentu, persona pārskata un paraksta ar savu eID; L1 līmenī persona izsniedz mašīnlasāmu, e-parakstītu, ierobežotu un atsaucamu pilnvaru, un "MI Dvīnis" rīkojas tās robežās — katra darbība kriptogrāfiski piesaistīta personai ar pilnu izsekojamību. (Ārvalstu personu aģenti netiek veidoti kā Latvijas Dvīņi — tie verificējas savas jurisdikcijas enkurā caur uzticamības vārteju; sk. II pīlāru.)</Text>
<Measurement>Funkcionējoša MI Smilškastes demonstrācija ar vismaz vienu pilnvarotu darbību (piem., iesnieguma sagatavošana un iesniegšana institūcijai) Latvijas fiziskai vai juridiskai personai; pilna audita pēda publiski demonstrējama.</Measurement>
<Deadline value="2026-12-30">30.12.2026.</Deadline>
<Reference kind="saistits">AI LV Exchange (aiexchange.pppa.lv); Process-as-Code; eParaksts / LVRTC</Reference>
</Action>
<Action id="pppa-mis-2026-09-10.r13" number="13">
<Title>Starpnozaru MI ieviešanas atbalsta komandas</Title>
<Text>MI lietpratība jādiferencē pēc lomas — vadībai, procesu īpašniekiem, iepirkumu speciālistiem, juristiem, datu pārvaldniekiem un auditoriem ir atšķirīgas vajadzības. Papildus uz noteiktu laiku ministrijās, pašvaldībās un MVU izvietojamas starpnozaru komandas, kas apvieno procesu pārstrādi, datu inženieriju, MI ieviešanu, kiberdrošību un pārmaiņu vadību — lai pilotprojekts kļūtu par operatīvu ieviešanu.</Text>
<Measurement>Lomām diferencēta MI kompetenču programma; vismaz viena starpnozaru komanda palīdzējusi vairākām institūcijām pāriet no pilotprojekta uz operatīvu darbību.</Measurement>
<Deadline value="2027-12-31">31.12.2027.</Deadline>
<Reference kind="saistits" actions="pppa-mis-2026-09-10.r04">Rīcība 4 (MI lietpratība); CSP 2025: 63,2 % uzņēmumu, kas apsvēruši MI, kā galveno šķērsli min ekspertīzes trūkumu.</Reference>
</Action>
</Goal>
<Goal id="pppa-mis-2026-09-10.m2" number="2.">
<Title>Izmaksu efektivitāte un auditējami lēmumi</Title>
<Description>Valsts un pašvaldības lēmumu pieņemšanas sagatavošanā izmanto MI, lai lēmumi tiek sagatavoti ātrāk, tiktu datos balstīti un ar pilnu izsekošanas ceļu. Lēmumu pieņēmēji strādā ar MI sagatavotu analīzi. Administratīvais slogs iedzīvotājiem un uzņēmumiem samazinās.</Description>
<Action id="pppa-mis-2026-09-10.r03" number="3">
<Title>Mašīnlasāmi publiskā iepirkuma līgumi</Title>
<Text>Visi publiskie iepirkuma līgumi, kas pārsniedz Direktīvas 2014/24/ES noteiktos sliekšņus, tiek sagatavoti izmantojot mašīnlasāmu standartu. Līgumi kļūst par strukturētiem datiem, kurus var izmantot līgumu slēgšanas un izpildes uzraudzībai, izmantojot MI.</Text>
<Measurement>Nozares ministrijas, Valsts kontrole, IUB un FM iegūst MI atbalstītus uzraudzības rīkus.</Measurement>
<Deadline value="2027-06-30">30.06.2027.</Deadline>
<Reference kind="saistits" href="https://pppa.lv/#mi-standarti">Agreement-as-Code · IUB · Direktīva 2014/24/ES</Reference>
</Action>
<Action id="pppa-mis-2026-09-10.r04" number="4">
<Title>MI lietpratība obligāta visiem lēmumu pieņēmējiem</Title>
<Text>Visi publiskā sektora lēmumu pieņēmēji, ne tikai IT speciālisti, apgūst strukturētu MI pārvaldības apmācību. Fokuss uz spēju izprast MI darbības principus atbilstošajā jomā, validēt MI veikto analīzi un pusautomātiskos lēmumus, kas ir pilnībā auditējami.</Text>
<Measurement>Institūciju vadība orientējas MI spējās un izprot lēmuma atbalstam veiktās darbības.</Measurement>
<Deadline value="2027-06-30">30.06.2027.</Deadline>
<Reference kind="piemers" href="https://e-estonia.com/ai-leap-2025-estonia-sets-ai-standard-in-education/">Igaunijas AI Leap 2025 ↗ · Cyberfort EU MI Akta skaidrojošais rīks (aiact.cyberfort.lv)</Reference>
</Action>
<Action id="pppa-mis-2026-09-10.r08" number="8">
<Title>Nacionāls datu katalogs MI vajadzībām</Title>
<Text>Publiskā sektora dati tiek veidoti kā nacionāls aktīvs — strukturēti un pieejami MI izstrādei DVI uzraudzībā. Nacionāls katalogs nodrošina atkārtoti izmantojamus latviešu MI komponentus starp iestādēm.</Text>
<Measurement>Nacionālais datu katalogs izveidots un funkcionāls; vismaz 5 nozares nodrošinājušas MI apmācībai izmantojamas strukturētas datu kopas; datu kopas izmanto vismaz 3 starpinstitūciju MI pilotprojekti.</Measurement>
<Deadline value="2027-06-30">30.06.2027.</Deadline>
<Reference kind="piemers" href="https://www.vdaa.gov.lv/en/article/latvia-becomes-part-european-artificial-intelligence-plant-network-strengthening-science-innovation-and-digital-literacy">Igaunijas "kratijupid" · AIFA-LAT projekts ↗</Reference>
</Action>
<Action id="pppa-mis-2026-09-10.r14" number="14">
<Title>Koplietojama algoritmizētu publiskās pārvaldes procesu infrastruktūra</Title>
<Text>Tipveida publiskās pārvaldes procesi, noteikumi, kontroles punkti un lēmumu loģika pārvēršami strukturētā, mašīnlasāmā formā (Process-as-Code) vienotā, atkārtoti izmantojamā bibliotēkā. Tas samazina digitalizācijas izmaksas, paātrina automatizāciju un veido MI gatavu pārvaldes infrastruktūru.</Text>
<Measurement>Darbojas vienota, mašīnlasāma publiskās pārvaldes procesu bibliotēka; vismaz vairāki procesi atkārtoti izmantoti citā institūcijā.</Measurement>
<Deadline value="2027-06-30">30.06.2027.</Deadline>
<Reference kind="saistits" actions="pppa-mis-2026-09-10.r01 pppa-mis-2026-09-10.r02 pppa-mis-2026-09-10.r16" href="https://pppa.lv/projekti/ai-sandbox">Rīcība 1 (algoritmizēts process katrā institūcijā) · Rīcība 2 (dokumentu identitāte) · Rīcība 16 (publiski pieejams kods) · Process-as-Code</Reference>
</Action>
<Action id="pppa-mis-2026-09-10.r15" number="15">
<Title>Nacionālais MI produktivitātes rādītāju kopums</Title>
<Text>Stratēģija mērāma pēc rezultāta, nevis aktivitātes: nevis pasākumu un apmācīto skaits, bet verificēts izmaksu un cikla laika samazinājums tautsaimniecībā, atbrīvotās administratīvās stundas pārvaldē, kritisko sistēmu izvietojamība Latvijā/ES un latviešu valodas modeļu sniegums, reģistrēto sistēmu skaits ar noteiktu atbildīgo. Bāzlīnija 2026. gadā, atjaunošana ik gadu.</Text>
<Measurement>Rādītāju kopums publiskots ar bāzlīnijas datiem un tiek atjaunots vismaz reizi gadā stratēģijas progresa novērtēšanai.</Measurement>
<Deadline value="2026-12-31">31.12.2026.</Deadline>
<Reference kind="saistits" actions="pppa-mis-2026-09-10.r24 pppa-mis-2026-09-10.r25">Rīcība 24 (sabiedrības uzticēšanās mērījums) · Rīcība 25 (pilotprojektu izvērtēšana)</Reference>
</Action>
<Action id="pppa-mis-2026-09-10.r17" number="17">
<Title>Pašvaldību un to kapitālsabiedrību MI iepirkuma atbalsta mehānisms</Title>
<Text>Pašvaldības MI iepirkumā saskaras ar sadrumstalotu tirgu, ierobežotiem resursiem un piegādātāju atkarības risku, katra risinot vienus un tos pašus jautājumus atsevišķi. Vajadzīgs koordinēts mehānisms — kopīgas iepirkuma veidnes ar algoritmiskās pārredzamības un riska prasībām, zināšanu apmaiņas platforma, iespēja apvienot iepirkumus.</Text>
<Measurement>Izveidots mehānisms (veidnes, vadlīnijas, zināšanu platforma); vismaz vairākas pašvaldības to izmantojušas pirmajā gadā.</Measurement>
<Deadline value="2027-06-30">30.06.2027.</Deadline>
<Reference kind="saistits" actions="pppa-mis-2026-09-10.r03 pppa-mis-2026-09-10.r18">Rīcība 3 (mašīnlasāmi iepirkuma līgumi) · Rīcība 18 (savietojamības prasības). Piemērs: Apvienotās Karalistes vietējās pārvaldes MI iepirkuma darba grupa (Ada Lovelace Institute, 2025.)</Reference>
</Action>
<Action id="pppa-mis-2026-09-10.r18" number="18">
<Title>Savietojamības prasības — obligātas ikvienā MI iepirkumā</Title>
<Text>Katrs piegādātājs ar savu formātu nozīmē atkarību, nevis kontroli. Ikvienam publiskā sektora MI risinājumam nosakāmas obligātas savietojamības prasības — atvērtas saskarnes (API), standartizētas datu struktūras un migrācijas iespēja bez piegādātāja piekrišanas.</Text>
<Measurement>Savietojamības prasības iekļautas standarta MI iepirkuma nosacījumos; jauniem MI risinājumiem publiskajā sektorā ir dokumentētas API un datu izejas iespēja.</Measurement>
<Deadline value="2027-06-30">30.06.2027.</Deadline>
<Reference kind="saistits" actions="pppa-mis-2026-09-10.r03 pppa-mis-2026-09-10.r17 pppa-mis-2026-09-10.r12">Rīcība 3 (mašīnlasāmi līgumi) · Rīcība 17 (pašvaldību iepirkums) · Rīcība 12 (Uzticamības vārteja)</Reference>
<Reference kind="avots">nozares priekšlikums, saņemts /mi-strategija platformā</Reference>
</Action>
<Action id="pppa-mis-2026-09-10.r19" number="19">
<Title>Vienota valsts digitālās ekonomikas un MI platformu arhitektūra</Title>
<Text>Digitālā transformācija jāpārceļ no atsevišķiem IT projektiem uz vienotu, modulāru platformu arhitektūru: MI modeļu izmantošanas platforma, Process-as-Code slānis, federēta datu ekosistēma, API un integrāciju reģistrs, atkārtoti izmantojamu risinājumu bibliotēka un vienots drošības, auditējamības un atbilstības slānis. Sākums — 2–3 pilotprojekti, piemēram, pabalstu administrēšanā, iepirkumu analītikā vai būvniecības procesos.</Text>
<Measurement>Apstiprināta arhitektūras mērķbilde; vismaz divi pilotprojekti darbojas uz koplietojamām platformas komponentēm.</Measurement>
<Deadline value="2027-12-31">31.12.2027.</Deadline>
<Reference kind="saistits" actions="pppa-mis-2026-09-10.r14 pppa-mis-2026-09-10.r08 pppa-mis-2026-09-10.r16">Rīcība 14 (procesu infrastruktūra) · Rīcība 8 (datu katalogs) · Rīcība 16 (publiski pieejams kods)</Reference>
<Reference kind="avots">nozares priekšlikums, saņemts /mi-strategija platformā</Reference>
</Action>
</Goal>
</Pillar>
<Pillar id="pppa-mis-2026-09-10.p2" number="II">
<Name>Atvērtība</Name>
<ShortTitle>2. Atvērt Latviju MI biznesam</ShortTitle>
<Heading>Atvērt Latviju pasaules MI biznesam</Heading>
<Summary>Latvija kā ES atvērtā vārteja MI aģentu ekonomikai. Eksporta produkts — uzticamības vārteja, kas verificē aģentus pirms darbības.</Summary>
<Description>Latvija kļūst par ES atvērto vārteju MI aģentu ekonomikai. Eksporta produkts nav identitāte, bet atvērta uzticamības vārteja, kas pārbauda jebkura MI aģenta identitāti un pilnvaru pirms darbības pieņemšanas. Ārvalstu persona vai uzņēmums nesaņem Latvijas "MI Dvīni" — tā aģents balstās savas jurisdikcijas uzticamības enkurā (eIDAS-saskaņoti), bet caur Latvijas vārteju iegūst juridisku spēku visā ES vienotajā tirgū no Rīgas.</Description>
<Goal id="pppa-mis-2026-09-10.m3" number="3.">
<Title>Atvērta MI aģentu identitātes, pilnvaru un uzticamības vārteja</Title>
<Description>Latvija uztur atvērtu infrastruktūru, kas savieno identitāti (kas ir aģents un kam tas pieder), pilnvaru (ko aģents drīkst darīt — ierobežotu, atsaucamu, mašīnlasāmu) un uzticamības vārteju (verifikatoru, ko palaiž katra saņemošā sistēma — banka, reģistrs, pašvaldība, ERP —, pārbaudot identitāti, pilnvaru un riska klasi pirms darbības pieņemšanas). "MI Dvīnis" ir šīs infrastruktūras cilvēkam pieejamā, Latvijā enkurotā izpausme; vārteja ir eksportējamais produkts — vienīgais punkts, caur kuru jāiziet katram aģentam neatkarīgi no izdevējjurisdikcijas. Tas Latviju padara par jurisdikciju, no kuras uzticami MI aģenti var darboties Eiropā un pasaulē.</Description>
<Action id="pppa-mis-2026-09-10.r12" number="12">
<Tag>Jauns</Tag>
<Title>Uzticamības vārteja — pārrobežu MI aģentu verifikācija</Title>
<Text>Latvija izveido atvērtu verifikācijas vārteju, kas pārbauda MI aģenta identitāti, pilnvaru un riska klasi pirms darbības pieņemšanas. Ārvalstu aģenti uzrāda akreditācijas datus, kas enkuroti to pašu jurisdikcijas uzticamības enkurā (eIDAS-saskaņoti); vārteja tos atzīst, neprasot atkārtotu reģistrāciju Latvijā. Vienlaikus tiek noteiktas obligātas savietojamības prasības — atvērti API, standartizētas datu struktūras —, lai aģenti no dažādiem izdevējiem darbotos savstarpēji.</Text>
<Measurement>Vārteja publiski demonstrē vismaz vienas citas jurisdikcijas enkurā balstīta aģenta identitātes un pilnvaras verifikāciju; obligāto savietojamības prasību kopums apstiprināts.</Measurement>
<Deadline>Precizējams</Deadline>
<Reference kind="saistits">VeriTrust · MCPF / UAPF sadarbspēja · eIDAS · AI LV Exchange (aiexchange.pppa.lv)</Reference>
</Action>
<Action id="pppa-mis-2026-09-10.r07" number="7">
<Title>Regulatīvās "MI Smilškastes" paplašināšana</Title>
<Text>Paplašināt speciālo regulatīvo vidi jeb "MI Smilškasti" — vairāk izvērtējamo projektu, ātrāks atlases cikls, institūciju un publiskas personas kapitālsabiedrību aktīva iesaiste, piedāvājot to rīcībā esošos datus un infrastruktūru. PPPA šim mērķim attīsta AI LV Exchange (aiexchange.pppa.lv) — sadarbspējas smilškastes paplašinājumu MCP standartam.</Text>
<Measurement>Katrs pierādīts MI projekts saņem obligātu sektora mēroga ieviešanas plānu 12 mēnešu laikā.</Measurement>
<Deadline value="2027-06-30">30.06.2027.</Deadline>
<Reference kind="piemers" href="https://accelerate.ee/experimentation-framework/">Accelerate Estonia Experimentation Framework ↗</Reference>
</Action>
<Action id="pppa-mis-2026-09-10.r06" number="6">
<Title>Publiskās un privātās sadarbība MI ieviešanā</Title>
<Text>Publisko un privāto sadarbību izmanto MI spēju straujai veidošanai publiskajā sektorā. Privātie partneri nodrošina tehnoloģijas un zināšanas, publiskais sektors — nepieciešamos datus un regulatīvo vidi. Ne iepirkums, bet partnerība ar kopīgu atbildību par rezultātu.</Text>
<Measurement>Katra institūcija veic vismaz vienu publiskās un privātās sadarbības pilotprojektu.</Measurement>
<Deadline value="2027-06-30">30.06.2027.</Deadline>
<Reference kind="saistits" href="https://pppa.lv/petijumi/2026-03-15-ppp-mi-valsts-parvalde">PPPA pētījumu (2026) ↗</Reference>
</Action>
<Action id="pppa-mis-2026-09-10.r16" number="16">
<Title>Valsts finansēts MI risinājumu kods — publiski pieejams</Title>
<Text>Valsts finansēts programmatūras risinājums ir publisks aktīvs, ne vienas iestādes īpašums; šodien vienu un to pašu kodu apmaksā vairākkārt. Ar publisko finansējumu izstrādāts MI pirmkods — izņemot drošības un klasificētās komponentes — publicējams valsts uzturētā repozitorijā ar atvērtā koda licenci, un prasība iekļaujama standarta iepirkuma nosacījumos.</Text>
<Measurement>Darbojas nacionāls atklātā koda repozitorijs; publicēšanas prasība ir standarta MI iepirkuma nosacījumos; vismaz vairākas institūcijas atkārtoti izmantojušas citas iestādes kodu.</Measurement>
<Deadline value="2027-06-30">30.06.2027.</Deadline>
<Reference kind="saistits" actions="pppa-mis-2026-09-10.r08 pppa-mis-2026-09-10.r20">Rīcība 8 (datu katalogs) · Rīcība 20 (atvērtā koda prioritāte) · EK atvērtā pirmkoda stratēģija</Reference>
</Action>
<Action id="pppa-mis-2026-09-10.r20" number="20">
<Title>Atvērtā koda prioritāte valsts MI sistēmās</Title>
<Text>Eiropa vairāk nekā 80 % būtisko digitālo tehnoloģiju ir atkarīga no ārpus ES piegādātājiem. Publiskā sektora MI risinājumos nosakāma skaidra atvērtā koda prioritāte — lai valsts saglabā kontroli pār sistēmām, kas pieņem lēmumus tās vārdā, un lai vietējie izstrādātāji var uz tām būvēt.</Text>
<Measurement>Atvērtā koda prioritāte noteikta MI iepirkuma vadlīnijās; atkāpes pamatojamas un reģistrējamas.</Measurement>
<Deadline value="2027-06-30">30.06.2027.</Deadline>
<Reference kind="saistits" actions="pppa-mis-2026-09-10.r16 pppa-mis-2026-09-10.r05">Rīcība 16 (publiski pieejams kods) · Rīcība 5 (tehnoloģiskā neatkarība)</Reference>
<Reference kind="avots">nozares priekšlikums, saņemts /mi-strategija platformā</Reference>
</Action>
</Goal>
</Pillar>
<Pillar id="pppa-mis-2026-09-10.p3" number="III">
<Name>Līderība</Name>
<ShortTitle>3. Kļūt par MI līderi</ShortTitle>
<Heading>Veidot Latvijas suverēnās MI spējas un starptautisko līderību</Heading>
<Summary>Kapacitāte, suverenitāte un pārvaldība — tehnoloģiskā neatkarība, MI sistēmu reģistrs un standartu eksports.</Summary>
<Description>Produktivitāte ir atbilde uz demogrāfisko sarukumu: MI aģenti kompensē darbaspēka iztrūkumu, dod jauniešiem iemeslu būvēt šeit, un ļauj Latvijai eksportēt savus pārvaldības un sadarbspējas standartus. Šis pīlārs apvieno kapacitāti, suverenitāti un pārvaldību, kas dara iespējamus pirmos divus pīlārus.</Description>
<Goal id="pppa-mis-2026-09-10.m4" number="4.">
<Title>Sabiedrībai jaunu iespēju pavēršana</Title>
<Description>Jauna kapacitāte izglītībā, veselībā, drošībā un uzņēmējdarbībā. MI izmantošanas mērķis nav labāka birokrātija, bet brīvāka un spējīgāka sabiedrība ar jauniem iespēju apvāršņiem. Cilvēks pievieno vērtību, MI — sniedz atbalstu.</Description>
<Action id="pppa-mis-2026-09-10.r05" number="5">
<Title>Latvijas valsts MI spēju tehnoloģiskā neatkarība</Title>
<Text>Latvija veido savas MI spējas, lai nodrošinātu neatkarību no ārvalstu piegādātājiem.</Text>
<Measurement>Digitālā suverenitāte nodrošināta ar lokālo LLM modeļu un datu centru infrastruktūru.</Measurement>
<Deadline value="2027-06-30">30.06.2027.</Deadline>
<Reference kind="saistits" href="https://www.vdaa.gov.lv/en/article/latvia-becomes-part-european-artificial-intelligence-plant-network-strengthening-science-innovation-and-digital-literacy">AIFA-LAT ↗ · EK Tehnoloģiskās suverenitātes iniciatīva</Reference>
</Action>
<Action id="pppa-mis-2026-09-10.r21" number="21">
<Title>Latviešu valodas MI dati kā nacionāla infrastruktūra</Title>
<Text>Latviešu valoda MI ekonomikā ir tirgus piekļuves, valsts pakalpojumu un nacionālās drošības infrastruktūra, ne tikai kultūras jautājums. Veidojams latviešu valodas MI datu kopums — tiesību ziņā sakārtoti korpusi, publiskā sektora terminoloģija, runas un dialektu dati — un neatkarīgs latviešu un latgaliešu valodas snieguma etalons.</Text>
<Measurement>Datu kopums un publisks etalons darbojas; līdz 2030. gadam pārvaldes MI risinājumu latviešu valodas sniegums tuvinās angļu valodas sniegumam atlasītos administratīvos un juridiskos uzdevumos.</Measurement>
<Deadline value="2027-12-31">31.12.2027.</Deadline>
<Reference kind="saistits" actions="pppa-mis-2026-09-10.r05">Rīcība 5 (tehnoloģiskā neatkarība) · Mākslīgā intelekta centra valodas tehnoloģiju prioritātes</Reference>
</Action>
<Action id="pppa-mis-2026-09-10.r22" number="22">
<Title>Valsts mēroga sintētisko datu programma MI izstrādei</Title>
<Text>Reālu personas datu izmantošana MI izstrādē rada privātuma riskus un juridiskus šķēršļus. Valsts sintētisko datu programma ļauj uzņēmumiem ģenerēt un izmantot sintētiskus datus MI risinājumu izstrādei, testēšanai un validācijai — mazinot datu aizsardzības risku, paātrinot inovāciju un stiprinot eksportspēju.</Text>
<Measurement>Programma darbojas ar vismaz vienu publisku sintētisko datu kopu; vairāki uzņēmumi to izmantojuši MI risinājumu testēšanā.</Measurement>
<Deadline value="2027-12-31">31.12.2027.</Deadline>
<Reference kind="saistits" actions="pppa-mis-2026-09-10.r08 pppa-mis-2026-09-10.r07">Rīcība 8 (datu katalogs) · Rīcība 7 (MI smilškaste)</Reference>
<Reference kind="avots">nozares priekšlikums, saņemts /mi-strategija platformā</Reference>
</Action>
<Action id="pppa-mis-2026-09-10.r23" number="23">
<Title>MI datu centru enerģijas un izvietojuma stratēģija</Title>
<Text>Skaitļošanas jauda ir faktisks MI attīstības ierobežojums, un tas risināms digitālās, ekonomikas, klimata un enerģētikas politikas kopsakarā. Iepriekš identificējamas datu centriem piemērotas teritorijas (tīkla jauda, optika, atjaunojamā enerģija, siltumapgādes integrācija), un valsts atbalsts sasaistāms ar nosacījumiem — pārpalikuma siltuma izmantošana, vietējā nodarbinātība, rezervēta jauda Latvijas uzņēmumiem.</Text>
<Measurement>Apstiprināta izvietojuma un enerģijas stratēģija; panākumi vērtēti pēc ekonomiskās, noturības un inovāciju vērtības uz katru jaudas megavatu, ne pēc uzstādītajiem megavatiem.</Measurement>
<Deadline value="2027-12-31">31.12.2027.</Deadline>
<Reference kind="saistits" actions="pppa-mis-2026-09-10.r05">Rīcība 5 (tehnoloģiskā neatkarība) · AIFA-LAT</Reference>
<Reference kind="avots">nozares priekšlikums, saņemts /mi-strategija platformā</Reference>
</Action>
</Goal>
<Goal id="pppa-mis-2026-09-10.m5" number="5.">
<Title>Uzraudzība un pārvaldība</Title>
<Description>MI stratēģija ir tik stipra, cik stipra ir tās uzraudzība: mērījums, kas parāda, vai sabiedrība uzticas; mehānisms, kas mācās no pilotprojektiem; iestāde ar reālu kapacitāti un skaidras robežas tam, ko MI drīkst izlemt patstāvīgi. Šis mērķis dara pārējos četrus pārbaudāmus.</Description>
<Action id="pppa-mis-2026-09-10.r10" number="10">
<Title>MI sistēmu reģistrs</Title>
<Text>Publiskajām organizācijām izveidot un uzturēt reģistrus, kuros norādītas izmantotās MI sistēmas atbilstoši ES MI regulas Art. 49 un 71 prasībām. Reģistra ieraksti var būt publiski pieejami vai konfidenciāli, atkarībā no sistēmas riska klases un publiskošanas prasībām.</Text>
<Measurement>MI sistēmu reģistrs funkcionāls; augsta riska MI sistēmas, kuras izmanto publiskās organizācijas, reģistrētas.</Measurement>
<Deadline value="2027-06-30">30.06.2027.</Deadline>
<Reference kind="saistits">Privāta nozares iniciatīva šajā virzienā — Cyberfort SIA AI System Register (airegister.cyberfort.lv)</Reference>
</Action>
<Action id="pppa-mis-2026-09-10.r11" number="11">
<Tag kind="parvaldibas-rekomendacija">Pārvaldības rekomendācija</Tag>
<Title>Vienota MI atbildīgā iestāde</Title>
<Text>Latvija šobrīd ir izvēlējusies izkliedētu MI akta uzraudzības modeli, kurā atbildība sadalīta starp VARAM, DVI, Ekonomikas ministriju/LATAK, Tiesībsargu, Latvijas Banku un vairāk nekā desmit nozaru iestādēm. Šis modelis rada risku, ka uzņēmumiem un iedzīvotājiem nav viena skaidra kontaktpunkta, un atbildība starp iestādēm var izšķīst. Aicinām izvērtēt vienotas MI atbildīgās iestādes izveidi, kas koncentrētu koordinācijas, publisko investīciju, tirgus uzraudzības un kontaktpunkta funkcijas, vienlaikus saglabājot nozaru iestāžu specializēto kompetenci konkrētu jomu sektorālajā uzraudzībā.</Text>
<Measurement>Izvērtējuma ziņojums par izkliedētā un vienotā modeļa salīdzinājumu; ja apstiprināts — vienotas iestādes izveides ceļa karte.</Measurement>
<Deadline value="2026-12-31">31.12.2026.</Deadline>
<Reference kind="saistits">VARAM 2025. gada 25. februāra informatīvais ziņojums; PPPA raksts "Kas Latvijā uzraudzīs MI Akta izpildi?"</Reference>
</Action>
<Action id="pppa-mis-2026-09-10.r24" number="24">
<Title>Sabiedrības uzticēšanās MI izmantošanai valsts pārvaldē — regulārs mērījums</Title>
<Text>Bez regulāras attieksmes izpētes un iedzīvotāju iesaistes pastāv risks zaudēt uzticību pat tehniski veiksmīgiem projektiem — īpaši proaktīvajiem pakalpojumiem, kur lēmumi tiek pieņemti cilvēka vārdā. Paredzams regulārs sabiedrības uzticēšanās mērījums un obligāta lietotāju iesaiste augstas ietekmes MI projektu izstrādē.</Text>
<Measurement>Veikts pirmais uzticēšanās apsekojums; vismaz vairāki augstas ietekmes MI projekti izstrādāti ar iedzīvotāju iesaisti.</Measurement>
<Deadline value="2026-12-31">31.12.2026.</Deadline>
<Reference kind="saistits" actions="pppa-mis-2026-09-10.r15">Rīcība 15 (produktivitātes rādītāji). Piemērs: Apvienotās Karalistes “Public Attitudes to Data and AI Tracker Survey”</Reference>
</Action>
<Action id="pppa-mis-2026-09-10.r25" number="25">
<Title>MI pilotprojektu izvērtēšanas un pieredzes apmaiņas mehānisms</Title>
<Text>Katra institūcija atsevišķi izmēģina MI un atkārto citu kļūdas, jo nav mehānisma, kas apkopo, kuri pilotprojekti devuši rezultātu, kuri ne un kāpēc. Tas nav datu katalogs — tas ir risinājumu snieguma izvērtējums pēc ieviešanas, dokumentējot arī neveiksmes.</Text>
<Measurement>Darbojas pilotprojektu izvērtējumu repozitorijs; vairāku institūciju pieredze pieejama citām iestādēm.</Measurement>
<Deadline value="2027-12-31">31.12.2027.</Deadline>
<Reference kind="saistits" actions="pppa-mis-2026-09-10.r06 pppa-mis-2026-09-10.r15">Rīcība 6 (publiskā un privātā sadarbība) · Rīcība 15 (produktivitātes rādītāji). Piemērs: “What Works Centre for AI in Public Services” (Ada Lovelace Institute, 2025.)</Reference>
</Action>
<Action id="pppa-mis-2026-09-10.r26" number="26">
<Tag kind="parvaldibas-rekomendacija">Pārvaldības rekomendācija</Tag>
<Title>Datu valsts inspekcijas kapacitāte MI uzraudzībai</Title>
<Text>DVI ir galvenā kompetentā iestāde personas datu aizsardzībā un augsta riska MI sistēmu uzraudzībā saskaņā ar MI aktu, bet MI jautājumiem šobrīd velta aptuveni trešdaļu viena darbinieka laika. Uzraudzības funkcija bez samērīga finansējuma un kompetences nav izpildāma.</Text>
<Measurement>DVI piešķirts mērķfinansējums un štata vietas MI uzraudzībai; publiskots uzraudzības plāns MI akta termiņiem.</Measurement>
<Deadline value="2026-12-31">31.12.2026.</Deadline>
<Reference kind="saistits" actions="pppa-mis-2026-09-10.r11 pppa-mis-2026-09-10.r10">Rīcība 11 (vienota MI atbildīgā iestāde) · Rīcība 10 (MI sistēmu reģistrs)</Reference>
<Reference kind="avots">nozares priekšlikums, saņemts /mi-strategija platformā</Reference>
</Action>
<Action id="pppa-mis-2026-09-10.r27" number="27">
<Tag kind="parvaldibas-rekomendacija">Pārvaldības rekomendācija</Tag>
<Title>Stingras kompetences robežas MI patstāvīgai darbībai</Title>
<Text>Bez skaidriem ierobežojumiem MI sistēmas var radīt sabiedrībai kaitīgus iznākumus. Nosakāmas stingras MI darbības kompetences robežas — kādus lēmumus sistēma drīkst pieņemt patstāvīgi un kur obligāta cilvēka virsvadība — un to ievērošana pārbaudāma ar testiem ekstrēmos scenārijos pirms ieviešanas.</Text>
<Measurement>Kompetences robežu un cilvēka virsvadības prasības noteiktas publiskā sektora MI sistēmām; augstas ietekmes sistēmas pirms ieviešanas izgājušas ekstrēmo scenāriju testus.</Measurement>
<Deadline value="2027-06-30">30.06.2027.</Deadline>
<Reference kind="saistits" actions="pppa-mis-2026-09-10.r10 pppa-mis-2026-09-10.r12">Rīcība 10 (MI sistēmu reģistrs) · Rīcība 12 (Uzticamības vārteja) · MI akta 14. pants (cilvēka virsvadība)</Reference>
<Reference kind="avots">nozares priekšlikums, saņemts /mi-strategija platformā</Reference>
</Action>
</Goal>
</Pillar>
<Principles>
<Heading>Kā publiskā pārvalde rīkojas</Heading>
<Intro>Šie principi attiecas uz visiem trim pīlāriem un katru rīcības plāna punktu.</Intro>
<Principle id="pppa-mis-2026-09-10.pr1">
<Label>Ko dara institūcijas</Label>
<Text>Katra publiskās pārvaldes institūcija rīkojas, negaidot centralizētu platformu vai viena piegādātāja visaptverošu risinājumu.</Text>
</Principle>
<Principle id="pppa-mis-2026-09-10.pr2">
<Label>Ko dara MI</Label>
<Text>MI atbalsta lēmumu pieņemšanu ar jēgpilnu datu analīzi un pilnībā auditējamu pierakstu. MI ne tikai automatizē, bet patiesi atbalsta lēmumu pieņēmējus.</Text>
</Principle>
<Principle id="pppa-mis-2026-09-10.pr3">
<Label>Riski</Label>
<Text>MI ieviešana ietver izaicinājumus un riskus, kurus iespēju robežās jāminimizē, nesamazinot ieviešanas tempu.</Text>
</Principle>
<Principle id="pppa-mis-2026-09-10.pr4">
<Label>Atbildība</Label>
<Text>Atbildīgais par publiskās pārvaldes institūcijas lēmumiem vienmēr paliek cilvēks — amatpersona, atbilstoši normatīvajiem aktiem.</Text>
</Principle>
</Principles>
<ProposalsNote actions="pppa-mis-2026-09-10.r18 pppa-mis-2026-09-10.r19 pppa-mis-2026-09-10.r20 pppa-mis-2026-09-10.r22 pppa-mis-2026-09-10.r23 pppa-mis-2026-09-10.r26 pppa-mis-2026-09-10.r27">Visi nozares priekšlikumi, kas saņemti PPPA platformā un publicēti iepriekšējā versijā (/mi-strategija-2), ir iekļauti rīcības plānā: savietojamības prasības (Rīcība 18), platformu arhitektūra (19), atvērtā koda prioritāte (20), sintētisko datu programma (22), datu centru enerģijas stratēģija (23), DVI kapacitāte (26) un MI kompetences robežas (27). Katrai rīcībai norādīts avots.</ProposalsNote>
<Resources>
<Resource id="pppa-mis-2026-09-10.a1" href="https://oecd.ai/en/dashboards/policy-initiatives/national-ai-strategy-10-9801">
<Country>Igaunija</Country>
<Title>KrattAI — Nacionālā MI stratēģija</Title>
<Text>Igaunija 2019. gadā pirmā ES ieviesa valsts MI stratēģiju, fokusējoties uz atkārtoti izmantojamiem MI komponentiem publiskajā sektorā.</Text>
</Resource>
<Resource id="pppa-mis-2026-09-10.a2" href="https://accelerate.ee/experimentation-framework/">
<Country>Igaunija</Country>
<Title>Accelerate Estonia — Experimentation Framework</Title>
<Text>Igaunijas valsts iestāžu eksperimentēšanas ietvars — strukturēta pieeja MI ātrā testēšanā un ieviešanā publiskajā sektorā.</Text>
</Resource>
<Resource id="pppa-mis-2026-09-10.a3" href="https://e-estonia.com/ai-leap-2025-estonia-sets-ai-standard-in-education/">
<Country>Igaunija</Country>
<Title>AI Leap 2025 — MI izglītības programma</Title>
<Text>Igaunijas valsts programma MI integrācijai izglītībā un valsts pārvaldē. Obligāta MI apmācība ar praktisku fokusu.</Text>
</Resource>
<Resource id="pppa-mis-2026-09-10.a4" href="https://digital-strategy.ec.europa.eu/en/library/communication-european-tech-sovereignty-accompanied-eu-open-source-strategy">
<Country>ES</Country>
<Title>EK Tehnoloģiskās suverenitātes iniciatīva</Title>
<Text>Eiropas Komisijas 2026. gada jūnija iniciatīvu kopums — ES Open Source stratēģija, savietojamības prasības, atkarības mazināšanas plāns.</Text>
</Resource>
<Resource id="pppa-mis-2026-09-10.a5" href="https://www.vdaa.gov.lv/en/article/latvia-becomes-part-european-artificial-intelligence-plant-network-strengthening-science-innovation-and-digital-literacy">
<Country>Latvija</Country>
<Title>AIFA-LAT — Latvijas MI rūpnīca</Title>
<Text>ES un nacionāli finansēts projekts (€8,4 milj., 2026–2028) — nacionāls MI kompetences centrs sadarbībā ar RTU, LU un LUMI konsorciju.</Text>
</Resource>
<Resource id="pppa-mis-2026-09-10.a6" href="https://www.vdaa.gov.lv/lv/informacija-par-specialo-regulativo-vidi-jeb-smilskasti">
<Country>Latvija</Country>
<Title>Latvijas MI Centra regulatīvā vide</Title>
<Text>Speciālā regulatīvā vide ("smilškaste") — Process-as-Code ir viens no pirmajiem 3 atlasītajiem projektiem (2026. gada maijs).</Text>
</Resource>
</Resources>
</AIStrategy></script>
<script id="xsd" type="application/xml"><?xml version="1.0" encoding="UTF-8"?>
<!--
MI stratēģijas datukopas shēma, v0.1
PPP Asociācija (PPPA) · Country as Code (Valsts kā Kods)
Struktūra: Stratēģija → Pīlārs → Mērķis → Rīcība.
Identifikatori (fails = dokumenta ID):
dokuments pppa-mis-GGGG-MM-DD (pēdējās atjaunošanas datums)
pīlārs <dok>.pN (I → p1)
mērķis <dok>.mN (numerācija visā dokumentā)
rīcība <dok>.rNN (= drukātais rīcības numurs)
princips <dok>.prN
resurss <dok>.aN
Teksts tiek glabāts burtiski, kā publicēts; datumi papildus atribūtā @value (ISO 8601).
-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="urn:pppa:cac:mi-strategija:0.1"
targetNamespace="urn:pppa:cac:mi-strategija:0.1"
elementFormDefault="qualified">
<!-- ===== Kopējie tipi ===== -->
<xs:simpleType name="DocId">
<xs:restriction base="xs:ID">
<xs:pattern value="pppa-mis-[0-9]{4}-[0-9]{2}-[0-9]{2}"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="PartId">
<xs:restriction base="xs:ID">
<xs:pattern value="pppa-mis-[0-9]{4}-[0-9]{2}-[0-9]{2}\.(p[0-9]+|m[0-9]+|r[0-9]{2,3}|pr[0-9]+|a[0-9]+)"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="ActionRefs">
<xs:list itemType="xs:IDREF"/>
</xs:simpleType>
<xs:simpleType name="Text">
<xs:restriction base="xs:string"><xs:minLength value="1"/></xs:restriction>
</xs:simpleType>
<xs:complexType name="DatedText">
<xs:annotation><xs:documentation>Datums kā publicēts (piem. „30.06.2027.”) un @value ISO formā. Ja termiņš nav noteikts (piem. „Precizējams”), @value nav.</xs:documentation></xs:annotation>
<xs:simpleContent>
<xs:extension base="Text">
<xs:attribute name="value" type="xs:date"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- ===== Saknes elements ===== -->
<xs:element name="AIStrategy">
<xs:complexType>
<xs:sequence>
<xs:element name="Title" type="Text"/>
<xs:element name="Author" type="Text"/>
<xs:element name="Status" type="Text"/>
<xs:element name="Updated" type="DatedText"/>
<xs:element name="ProposalsOpened" type="DatedText" minOccurs="0"/>
<xs:element name="SourceUrl" type="xs:anyURI"/>
<xs:element name="Slogan" minOccurs="0">
<xs:complexType>
<xs:sequence><xs:element name="Word" type="Text" maxOccurs="unbounded"/></xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Vision" type="Text"/>
<xs:element ref="Pillar" maxOccurs="unbounded"/>
<xs:element ref="Principles" minOccurs="0"/>
<xs:element name="ProposalsNote" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="Text">
<xs:attribute name="actions" type="ActionRefs"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element ref="Resources" minOccurs="0"/>
</xs:sequence>
<xs:attribute name="id" type="DocId" use="required"/>
<xs:attribute name="version" type="xs:token" use="required"/>
</xs:complexType>
</xs:element>
<!-- ===== Pīlārs ===== -->
<xs:element name="Pillar">
<xs:complexType>
<xs:sequence>
<xs:element name="Name" type="Text"/>
<xs:element name="ShortTitle" type="Text" minOccurs="0"/>
<xs:element name="Heading" type="Text"/>
<xs:element name="Summary" type="Text" minOccurs="0"/>
<xs:element name="Description" type="Text"/>
<xs:element ref="Goal" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="id" type="PartId" use="required"/>
<xs:attribute name="number" use="required">
<xs:simpleType><xs:restriction base="xs:token"><xs:pattern value="[IVX]+"/></xs:restriction></xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
<!-- ===== Stratēģiskais mērķis ===== -->
<xs:element name="Goal">
<xs:complexType>
<xs:sequence>
<xs:element name="Title" type="Text"/>
<xs:element name="Description" type="Text"/>
<xs:element ref="Action" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="id" type="PartId" use="required"/>
<xs:attribute name="number" type="xs:token" use="required"/>
</xs:complexType>
</xs:element>
<!-- ===== Rīcības plāna punkts ===== -->
<xs:element name="Action">
<xs:complexType>
<xs:sequence>
<xs:element name="Tag" minOccurs="0" maxOccurs="unbounded">
<xs:annotation><xs:documentation>Atzīme, kā publicēta (piem. „Flagmanis”, „Jauns”, „Pārvaldības rekomendācija”).</xs:documentation></xs:annotation>
<xs:complexType>
<xs:simpleContent>
<xs:extension base="Text">
<xs:attribute name="kind" type="xs:token"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="Title" type="Text"/>
<xs:element name="Text" type="Text"/>
<xs:element name="Measurement" type="Text">
<xs:annotation><xs:documentation>Mērķa izpildes mērījums.</xs:documentation></xs:annotation>
</xs:element>
<xs:element name="Deadline" type="DatedText"/>
<xs:element name="Responsible" minOccurs="0" maxOccurs="unbounded">
<xs:annotation><xs:documentation>Atbildīgā institūcija. @org = CaC ID no Organizāciju reģistra (SS-IIII). Pašreizējā versijā nav aizpildīts.</xs:documentation></xs:annotation>
<xs:complexType>
<xs:simpleContent>
<xs:extension base="Text">
<xs:attribute name="org">
<xs:simpleType><xs:restriction base="xs:token"><xs:pattern value="[0-9]{2}-[0-9]{4}"/></xs:restriction></xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="Reference" minOccurs="0" maxOccurs="unbounded">
<xs:annotation><xs:documentation>Atsauce: kind = saistits | avots | piemers. @actions norāda saistītās rīcības, @href — saites.</xs:documentation></xs:annotation>
<xs:complexType>
<xs:simpleContent>
<xs:extension base="Text">
<xs:attribute name="kind">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="saistits"/>
<xs:enumeration value="avots"/>
<xs:enumeration value="piemers"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="actions" type="ActionRefs"/>
<xs:attribute name="href">
<xs:simpleType><xs:list itemType="xs:anyURI"/></xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="id" type="PartId" use="required"/>
<xs:attribute name="number" type="xs:positiveInteger" use="required"/>
</xs:complexType>
</xs:element>
<!-- ===== Īstenošanas principi ===== -->
<xs:element name="Principles">
<xs:complexType>
<xs:sequence>
<xs:element name="Heading" type="Text"/>
<xs:element name="Intro" type="Text" minOccurs="0"/>
<xs:element name="Principle" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="Label" type="Text"/>
<xs:element name="Text" type="Text"/>
</xs:sequence>
<xs:attribute name="id" type="PartId" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- ===== Starptautiskā pieredze ===== -->
<xs:element name="Resources">
<xs:complexType>
<xs:sequence>
<xs:element name="Resource" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="Country" type="Text"/>
<xs:element name="Title" type="Text"/>
<xs:element name="Text" type="Text"/>
</xs:sequence>
<xs:attribute name="id" type="PartId" use="required"/>
<xs:attribute name="href" type="xs:anyURI" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema></script>
<script>
"use strict";
const NS = "urn:pppa:cac:mi-strategija:0.1";
const $ = id => document.getElementById(id);
const esc = s => String(s ?? "").replace(/[&<>"]/g, c => ({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"}[c]));
const kids = (el, name) => el ? [...el.children].filter(c => c.localName === name) : [];
const kid = (el, name) => kids(el, name)[0] || null;
const tx = (el, name) => { const k = kid(el, name); return k ? k.textContent : ""; };
let S = null, tab = "p1", ctx = {};
function parse(text){
const doc = new DOMParser().parseFromString(text, "application/xml");
const r = doc.documentElement;
if (doc.querySelector("parsererror") || r.localName !== "AIStrategy") throw new Error("Nav MI stratēģijas XML (sagaidīts AIStrategy).");
const s = {id: r.getAttribute("id"), version: r.getAttribute("version"), title: tx(r, "Title"), author: tx(r, "Author"),
status: tx(r, "Status"), updated: tx(r, "Updated"), opened: tx(r, "ProposalsOpened"), url: tx(r, "SourceUrl"),
slogan: kids(kid(r, "Slogan"), "Word").map(w => w.textContent), vision: tx(r, "Vision"), pillars: [], actions: {}, goals: 0};
for (const p of kids(r, "Pillar")) {
const P = {id: p.getAttribute("id"), n: p.getAttribute("number"), name: tx(p, "Name"), short: tx(p, "ShortTitle"),
heading: tx(p, "Heading"), summary: tx(p, "Summary"), desc: tx(p, "Description"), goals: []};
for (const g of kids(p, "Goal")) {
const G = {id: g.getAttribute("id"), n: g.getAttribute("number"), title: tx(g, "Title"), desc: tx(g, "Description"), actions: []};
s.goals++;
for (const a of kids(g, "Action")) {
const dl = kid(a, "Deadline");
const A = {id: a.getAttribute("id"), n: +a.getAttribute("number"), title: tx(a, "Title"), text: tx(a, "Text"),
measure: tx(a, "Measurement"), deadline: dl ? dl.textContent : "", dv: dl ? dl.getAttribute("value") || "" : "",
tags: kids(a, "Tag").map(t => ({t: t.textContent, kind: t.getAttribute("kind") || ""})),
resp: kids(a, "Responsible").map(x => ({t: x.textContent, org: x.getAttribute("org") || ""})),
refs: kids(a, "Reference").map(x => ({t: x.textContent, kind: x.getAttribute("kind") || "",
actions: (x.getAttribute("actions") || "").split(/\s+/).filter(Boolean),
href: (x.getAttribute("href") || "").split(/\s+/).filter(Boolean)})),
pillar: P, goal: G};
A.proposal = A.refs.some(x => x.kind === "avots");
G.actions.push(A); s.actions[A.id] = A;
}
P.goals.push(G);
}
s.pillars.push(P);
}
const pr = kid(r, "Principles");
s.principles = pr ? {heading: tx(pr, "Heading"), intro: tx(pr, "Intro"),
items: kids(pr, "Principle").map(x => ({id: x.getAttribute("id"), label: tx(x, "Label"), text: tx(x, "Text")}))} : null;
const pn = kid(r, "ProposalsNote");
s.proposals = pn ? {text: pn.textContent, actions: (pn.getAttribute("actions") || "").split(/\s+/).filter(Boolean)} : null;
s.resources = kids(kid(r, "Resources"), "Resource").map(x => ({id: x.getAttribute("id"), href: x.getAttribute("href"),
country: tx(x, "Country"), title: tx(x, "Title"), text: tx(x, "Text")}));
return s;
}
/* Rīcību atsauces „Rīcība 10 (…)” un „(19)” → klikšķināmas saites uz rīcību */
function linkActs(text, ids){
let h = esc(text);
const byN = Object.fromEntries(ids.map(id => [S.actions[id] ? S.actions[id].n : null, id]));
h = h.replace(/Rīcība (\d+)/g, (m, n) => byN[n] ? `<a class="act" href="#${byN[n]}" data-act="${byN[n]}" title="${esc(S.actions[byN[n]].title)}">${m}</a>` : m);
h = h.replace(/\((\d+)\)/g, (m, n) => byN[n] ? `(<a class="act" href="#${byN[n]}" data-act="${byN[n]}" title="${esc(S.actions[byN[n]].title)}">${n}</a>)` : m);
return h;
}
const short = id => id.slice(S.id.length + 1);
function card(A){
const tags = A.tags.map(t => `<span class="tag${t.kind ? " rec" : ""}">${esc(t.t)}</span>`).join("")
+ (A.proposal ? `<span class="tag src" title="Avots: nozares priekšlikums">Nozares priekšlikums</span>` : "");
const refs = A.refs.map(r => {
const lab = {saistits: "Saistīts ar", avots: "Avots", piemers: "Piemērs"}[r.kind];
const links = r.href.map(u => ` <a href="${esc(u)}" target="_blank" rel="noopener">↗</a>`).join("");
return `<p class="ref">${lab ? `<b>${lab}:</b> ` : ""}${linkActs(r.t, r.actions)}${links}</p>`;
}).join("");
const resp = A.resp.length ? `<p class="ref"><b>Atbildīgais:</b> ${A.resp.map(x => esc(x.t) + (x.org ? ` <span class="chip">${esc(x.org)}</span>` : "")).join(", ")}</p>`
: `<p class="resp">Atbildīgā institūcija nav noteikta</p>`;
return `<article class="card" id="${esc(A.id)}">
<div class="top"><span class="num">Rīcība ${A.n}</span><span class="chip" title="${esc(A.id)}">${esc(short(A.id))}</span>${tags}
<span class="dl${A.dv ? "" : " open"}" title="Termiņš">${A.dv ? "⏱ " : ""}${esc(A.deadline)}</span></div>
<h4>${esc(A.title)}</h4>
<p>${esc(A.text)}</p>
<div class="measure"><b>Mērķa izpildes mērījums</b>${esc(A.measure)}</div>
${resp}${refs}
</article>`;
}
function renderPillar(P){
return `<section class="phead"><p class="kicker">${esc(P.n)} pīlārs · ${esc(P.name)} <span class="chip">${esc(short(P.id))}</span></p>
<h2>${esc(P.heading)}</h2><p>${esc(P.desc)}</p></section>`
+ P.goals.map(G => `<div class="goal"><span class="n">${esc(G.n)}</span><div><h3>${esc(G.title)} <span class="chip">${esc(short(G.id))}</span></h3><p>${esc(G.desc)}</p></div></div>
<div class="grid">${G.actions.map(card).join("")}</div>`).join("");
}
function renderAll(){
const pills = S.pillars.map(P => `<option value="${esc(P.id)}">${esc(P.n)} · ${esc(P.name)}</option>`).join("");
return `<div class="tools"><input type="search" id="q" placeholder="Meklēt rīcībās…" value="${esc(ctx.q || "")}">
<select id="fp"><option value="">Visi pīlāri</option>${pills}</select>
<select id="ft"><option value="">Visas rīcības</option><option value="prop">Nozares priekšlikumi</option><option value="rec">Pārvaldības rekomendācijas</option><option value="open">Bez termiņa</option></select>
<span class="meta" id="cnt"></span></div>
<div class="tw"><table><thead><tr><th data-s="n">Nr.</th><th data-s="title">Rīcība</th><th data-s="p">Pīlārs · mērķis</th><th data-s="dv">Termiņš</th></tr></thead><tbody id="rows"></tbody></table></div>`;
}
function fillRows(){
const q = ($("q").value || "").toLowerCase(), fp = $("fp").value, ft = $("ft").value, s = ctx.sort || "n";
ctx.q = $("q").value;
let list = Object.values(S.actions).filter(A =>
(!fp || A.pillar.id === fp) &&
(!ft || (ft === "prop" && A.proposal) || (ft === "rec" && A.tags.some(t => t.kind)) || (ft === "open" && !A.dv)) &&
(!q || [A.title, A.text, A.measure, ...A.refs.map(r => r.t)].join(" ").toLowerCase().includes(q)));
const key = {n: A => A.n, title: A => A.title, p: A => A.pillar.n + A.goal.n, dv: A => A.dv || "9999"}[s];
list.sort((a, b) => key(a) < key(b) ? -1 : key(a) > key(b) ? 1 : a.n - b.n);
$("rows").innerHTML = list.map(A => `<tr data-act="${esc(A.id)}"><td><b>${A.n}</b></td>
<td>${esc(A.title)}${A.tags.map(t => ` <span class="tag${t.kind ? " rec" : ""}">${esc(t.t)}</span>`).join("")}${A.proposal ? ` <span class="tag src">Nozares priekšlikums</span>` : ""}</td>
<td>${esc(A.pillar.n)} · ${esc(A.pillar.name)}<br><span class="meta">${esc(A.goal.n)} ${esc(A.goal.title)}</span></td>
<td style="white-space:nowrap">${esc(A.deadline)}</td></tr>`).join("") || `<tr><td colspan="4" class="empty">Nekas nav atrasts</td></tr>`;
$("cnt").textContent = `${list.length} no ${Object.keys(S.actions).length}`;
}
function renderPrinciples(){
let h = "";
if (S.principles) h += `<div class="box"><h2>${esc(S.principles.heading)}</h2><p>${esc(S.principles.intro)}</p>
<div class="prin">${S.principles.items.map(x => `<div><b>${esc(x.label)}</b>${esc(x.text)}</div>`).join("")}</div></div>`;
if (S.proposals) h += `<div class="box"><h2>Saņemtie priekšlikumi</h2><p>${linkActs(S.proposals.text, S.proposals.actions)}</p></div>`;
if (S.resources.length) h += `<div class="box"><h2>Starptautiskā pieredze</h2><div class="prin">${S.resources.map(x =>
`<div><b>${esc(x.country)}</b><a href="${esc(x.href)}" target="_blank" rel="noopener">${esc(x.title)} ↗</a><br><span class="meta">${esc(x.text)}</span></div>`).join("")}</div></div>`;
return h;
}
function renderAbout(){
const acts = Object.values(S.actions), nores = acts.filter(a => !a.resp.length).length;
const open = acts.filter(a => !a.dv).length, prop = acts.filter(a => a.proposal).length;
const xsd = $("xsd").textContent.trim();
return `<div class="box"><h2>Par datukopu</h2>
<p>PPP Asociācijas (PPPA) piedāvātā Latvijas Nacionālā MI stratēģija mašīnlasāmā formā — daļa no iniciatīvas <i>Country as Code</i> (Valsts kā Kods). Teksts pārņemts burtiski, kā publicēts: <a href="${esc(S.url)}" target="_blank" rel="noopener">${esc(S.url)}</a>.</p>
<div class="tiles">
<div class="tile"><b>${S.pillars.length}</b><span>pīlāri</span></div>
<div class="tile"><b>${S.goals}</b><span>stratēģiskie mērķi</span></div>
<div class="tile"><b>${acts.length}</b><span>rīcības</span></div>
<div class="tile"><b>${prop}</b><span>nozares priekšlikumi</span></div>
<div class="tile"><b>${open}</b><span>bez noteikta termiņa</span></div>
<div class="tile"><b>${nores}</b><span>bez atbildīgās institūcijas</span></div>
</div>
${nores ? `<p><b>Atbildīgās institūcijas nav noteiktas</b> ${nores} no ${acts.length} rīcībām. Shēmā katrai rīcībai paredzēts elements <code>Responsible</code> ar CaC ID (<code>SS-IIII</code>) no Organizāciju reģistra, lai izpildi varētu sasaistīt ar konkrētu iestādi.</p>` : ""}
<h3>Identifikatori</h3>
<div class="tw"><table><thead><tr><th>Elements</th><th>ID</th><th>Piemērs</th></tr></thead><tbody>
<tr><td>Stratēģija</td><td><code>pppa-mis-GGGG-MM-DD</code> (atjaunošanas datums)</td><td><code>${esc(S.id)}</code></td></tr>
<tr><td>Pīlārs</td><td><code>.pN</code></td><td><code>${esc(S.id)}.p2</code></td></tr>
<tr><td>Mērķis</td><td><code>.mN</code> (vienota numerācija)</td><td><code>${esc(S.id)}.m3</code></td></tr>
<tr><td>Rīcība</td><td><code>.rNN</code> (= drukātais numurs)</td><td><code>${esc(S.id)}.r09</code></td></tr>
<tr><td>Princips / resurss</td><td><code>.prN</code> / <code>.aN</code></td><td><code>${esc(S.id)}.pr1</code></td></tr>
</tbody></table></div>
<p style="margin-top:8px;font-size:12.5px;color:var(--muted)">Datne = dokumenta ID (<code>${esc(S.id)}.xml</code>). Termiņi glabāti kā publicēti un atribūtā <code>@value</code> ISO formā. Atsauces uz citām rīcībām — atribūtā <code>@actions</code>.</p>
${xsd && !xsd.startsWith("__") ? `<h3>Shēma</h3><details><summary>mi-strategija-0.1.xsd</summary><pre>${esc(xsd)}</pre></details>` : ""}
</div>`;
}
const TABS = () => [...S.pillars.map(P => [P.id.slice(S.id.length + 1), `${P.n} · ${P.name}`]), ["all", "Visas rīcības"], ["prin", "Principi un resursi"], ["about", "Par"]];
function render(){
document.title = `${S.title} · ${S.version}`;
$("title").textContent = S.title;
$("slogan").textContent = S.slogan.join(" · ");
$("vision").textContent = S.vision;
$("meta").innerHTML = `<span>${esc(S.author)}</span><span>· ${esc(S.status)} ${esc(S.version)}</span><span>· atjaunots ${esc(S.updated)}</span><span class="chip">${esc(S.id)}</span>`
+ (ctx.pgv ? `<span class="pgvbar">· ${esc(ctx.pgv)}</span>` : "");
$("tabs").innerHTML = TABS().map(([k, l]) => `<button data-tab="${k}" class="${k === tab ? "on" : ""}">${esc(l)}</button>`).join("");
const P = S.pillars.find(p => short(p.id) === tab);
$("main").innerHTML = P ? renderPillar(P) : tab === "all" ? renderAll() : tab === "prin" ? renderPrinciples() : renderAbout();
if (tab === "all") { fillRows(); ["q", "fp", "ft"].forEach(i => $(i).addEventListener("input", fillRows)); if (ctx.fp) $("fp").value = ctx.fp; }
}
function setTab(t){ tab = t; render(); try { history.replaceState(null, "", "#" + t); } catch (e) {} scrollTo(0, 0); }
function goAction(id){
const A = S.actions[id]; if (!A) return;
tab = short(A.pillar.id); render();
const el = $(id); if (!el) return;
el.scrollIntoView({behavior: "smooth", block: "start"}); el.classList.add("flash"); setTimeout(() => el.classList.remove("flash"), 1400);
}
document.addEventListener("click", ev => {
const t = ev.target.closest("[data-tab]"); if (t) { setTab(t.dataset.tab); return; }
const a = ev.target.closest("[data-act]"); if (a) { ev.preventDefault(); goAction(a.dataset.act); return; }
const th = ev.target.closest("th[data-s]"); if (th) { ctx.sort = th.dataset.s; fillRows(); }
});
function load(text){
try { S = parse(text); } catch (e) { $("main").innerHTML = `<div class="empty">${esc(e.message)}</div>`; return; }
const h = location.hash.slice(1);
if (S.actions[h]) { goAction(h); return; }
tab = TABS().some(([k]) => k === h) ? h : short(S.pillars[0].id);
render();
}
/* ===== ProcessGit skatītājs (processgit.viewer.json): PGV_READY → PGV_INIT → PGV_FETCH ===== */
function pgvFetch(url){ return new Promise((res, rej) => {
const tm = setTimeout(() => { removeEventListener("message", hd); rej(new Error("PGV_FETCH timeout")); }, 15000);
function hd(ev){ const m = ev.data; if (!m || m.type !== "PGV_FETCH_RESULT" || m.url !== url) return; clearTimeout(tm); removeEventListener("message", hd); m.ok ? res(m.text) : rej(new Error(m.error || "fetch failed")); }
addEventListener("message", hd); parent.postMessage({type: "PGV_FETCH", url}, "*"); }); }
async function pgvInit(p){
const url = (p.targets && p.targets.xml) || `${p.repoLink}/raw/branch/${p.branch}/${p.path}`;
ctx.pgv = `ProcessGit · ${p.branch || ""} · ${p.path || ""}${p.lastCommit ? " · " + p.lastCommit.slice(0, 7) : ""}`;
try { load(await pgvFetch(url)); } catch (e) { $("main").innerHTML = `<div class="empty">Neizdevās ielādēt datni no repozitorija: ${esc(e.message)}</div>`; }
}
const inFrame = window.parent && window.parent !== window;
if (inFrame) {
addEventListener("message", ev => { const m = ev.data; if (m && typeof m === "object" && m.type === "PGV_INIT") pgvInit(m.payload || {}); });
try { parent.postMessage({type: "PGV_READY"}, "*"); } catch (e) {}
setTimeout(() => { if (!S) $("main").innerHTML = `<div class="empty">Gaida datni no ProcessGit…</div>`; }, 4000);
} else load($("embedded").textContent.trim());
</script>
</body>
</html>

294
viewer/template.html Normal file
View File

@@ -0,0 +1,294 @@
<!doctype html>
<html lang="lv">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>MI stratēģijas datukopa</title>
<style>
:root{--bg:#f6f7f9;--panel:#fff;--ink:#16202c;--muted:#5d6b7a;--line:#dde3ea;--acc:#1f5fbf;--acc-bg:#e8f0fc;--tag:#7a4a00;--tag-bg:#fff2d6;--rec:#6b2d8a;--rec-bg:#f3e8fa;--src:#0d6b4f;--src-bg:#e3f5ee;--hl:#fff7c2;--mono:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}
@media (prefers-color-scheme:dark){:root:not([data-theme="light"]){--bg:#11161d;--panel:#18202a;--ink:#e6ebf1;--muted:#9aa8b8;--line:#2a3542;--acc:#7fb0ff;--acc-bg:#1d2b40;--tag:#ffcf7a;--tag-bg:#3a2d12;--rec:#d9a8f5;--rec-bg:#33224a;--src:#7fe0bd;--src-bg:#123328;--hl:#4a4415}}
:root[data-theme="dark"]{--bg:#11161d;--panel:#18202a;--ink:#e6ebf1;--muted:#9aa8b8;--line:#2a3542;--acc:#7fb0ff;--acc-bg:#1d2b40;--tag:#ffcf7a;--tag-bg:#3a2d12;--rec:#d9a8f5;--rec-bg:#33224a;--src:#7fe0bd;--src-bg:#123328;--hl:#4a4415}
*{box-sizing:border-box}
body{margin:0;background:var(--bg);color:var(--ink);font:15px/1.5 system-ui,-apple-system,"Segoe UI",Roboto,sans-serif}
.wrap{max-width:1080px;margin:0 auto;padding:0 16px}
header{background:var(--panel);border-bottom:1px solid var(--line);padding:18px 0 0}
.meta{display:flex;flex-wrap:wrap;gap:6px 10px;align-items:center;font-size:12.5px;color:var(--muted)}
.chip{text-transform:none;letter-spacing:0;font-family:var(--mono);font-size:11.5px;background:var(--acc-bg);color:var(--acc);border-radius:6px;padding:1px 7px;white-space:nowrap}
h1{margin:6px 0 2px;font-size:26px;line-height:1.2}
.slogan{font-weight:600;color:var(--acc);letter-spacing:.02em}
.vision{color:var(--muted);max-width:860px;margin:8px 0 12px}
.tabs{display:flex;gap:2px;overflow-x:auto;scrollbar-width:none;margin-top:6px}
.tabs button{border:0;background:none;color:var(--muted);font:inherit;font-weight:600;padding:10px 14px;border-bottom:3px solid transparent;cursor:pointer;white-space:nowrap}
.tabs button.on{color:var(--ink);border-bottom-color:var(--acc)}
main.wrap{padding-top:18px;padding-bottom:40px}
.phead{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:16px 18px;margin-bottom:16px}
.kicker{font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:var(--acc);margin:0}
.phead h2{margin:4px 0 6px;font-size:21px}
.phead p{margin:0}
.goal{margin:22px 0 10px;display:flex;gap:10px;align-items:baseline}
.goal .n{font-size:20px;font-weight:800;color:var(--acc)}
.goal h3{margin:0;font-size:17px}
.goal p{margin:4px 0 0;color:var(--muted)}
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:12px}
.card{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:14px 16px;display:flex;flex-direction:column;gap:7px;min-width:0;scroll-margin-top:14px;transition:background .6s}
.card.flash{background:var(--hl)}
.top{display:flex;flex-wrap:wrap;gap:6px;align-items:center}
.num{font-weight:800}
.dl{margin-left:auto;font-size:12.5px;font-weight:600;white-space:nowrap}
.dl.open{color:var(--tag)}
.tag{font-size:11.5px;font-weight:600;border-radius:999px;padding:1px 8px;background:var(--tag-bg);color:var(--tag)}
.tag.rec{background:var(--rec-bg);color:var(--rec)}
.tag.src{background:var(--src-bg);color:var(--src)}
.card h4{margin:0;font-size:15.5px;line-height:1.35}
.card p{margin:0}
.measure{font-size:13.5px;background:var(--bg);border-radius:8px;padding:7px 10px}
.measure b{display:block;font-size:11.5px;text-transform:uppercase;letter-spacing:.05em;color:var(--muted)}
.ref{font-size:13px;color:var(--muted);overflow-wrap:anywhere}
.ref b{font-weight:600}
a{color:var(--acc)}
a.act{font-weight:600;text-decoration:none;border-bottom:1px dotted}
.resp{font-size:12.5px;color:var(--muted);font-style:italic}
.tools{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:12px}
input[type=search],select{font:inherit;padding:7px 10px;border:1px solid var(--line);border-radius:8px;background:var(--panel);color:var(--ink);min-width:0}
input[type=search]{flex:1 1 220px}
table{width:100%;border-collapse:collapse;background:var(--panel);border:1px solid var(--line);border-radius:12px;overflow:hidden;font-size:14px}
th,td{text-align:left;padding:8px 10px;border-bottom:1px solid var(--line);vertical-align:top}
th{font-size:12px;color:var(--muted);text-transform:uppercase;letter-spacing:.04em;cursor:pointer;user-select:none;white-space:nowrap}
tr:last-child td{border-bottom:0}
tbody tr{cursor:pointer}
tbody tr:hover{background:var(--bg)}
.tw{overflow-x:auto}
.box{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:16px 18px;margin-bottom:14px}
.box h2{margin:0 0 8px;font-size:18px}
.box h3{margin:14px 0 6px;font-size:15px}
.tiles{display:grid;grid-template-columns:repeat(auto-fill,minmax(130px,1fr));gap:10px;margin:10px 0}
.tile{background:var(--bg);border-radius:10px;padding:10px 12px}
.tile b{display:block;font-size:24px;line-height:1.1}
.tile span{font-size:12.5px;color:var(--muted)}
.prin{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:10px}
.prin div{background:var(--bg);border-radius:10px;padding:10px 12px}
.prin b{display:block;font-size:12.5px;color:var(--acc);text-transform:uppercase;letter-spacing:.05em}
pre{font-family:var(--mono);font-size:12px;background:var(--bg);border-radius:8px;padding:10px;overflow-x:auto;margin:6px 0}
code{font-family:var(--mono);font-size:12.5px}
details summary{cursor:pointer;font-weight:600}
.pgvbar{font-family:var(--mono);font-size:11.5px;color:var(--muted)}
.hidden{display:none!important}
.empty{padding:40px 0;text-align:center;color:var(--muted)}
@media (max-width:560px){h1{font-size:21px}.grid{grid-template-columns:1fr}.dl{margin-left:0}}
</style>
</head>
<body>
<header>
<div class="wrap">
<div class="meta" id="meta"></div>
<h1 id="title">MI stratēģijas datukopa</h1>
<div class="slogan" id="slogan"></div>
<p class="vision" id="vision"></p>
<nav class="tabs" id="tabs"></nav>
</div>
</header>
<main class="wrap" id="main"><div class="empty">Ielādē…</div></main>
<script id="embedded" type="application/xml">__XML__</script>
<script id="xsd" type="application/xml">__XSD__</script>
<script>
"use strict";
const NS = "urn:pppa:cac:mi-strategija:0.1";
const $ = id => document.getElementById(id);
const esc = s => String(s ?? "").replace(/[&<>"]/g, c => ({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"}[c]));
const kids = (el, name) => el ? [...el.children].filter(c => c.localName === name) : [];
const kid = (el, name) => kids(el, name)[0] || null;
const tx = (el, name) => { const k = kid(el, name); return k ? k.textContent : ""; };
let S = null, tab = "p1", ctx = {};
function parse(text){
const doc = new DOMParser().parseFromString(text, "application/xml");
const r = doc.documentElement;
if (doc.querySelector("parsererror") || r.localName !== "AIStrategy") throw new Error("Nav MI stratēģijas XML (sagaidīts AIStrategy).");
const s = {id: r.getAttribute("id"), version: r.getAttribute("version"), title: tx(r, "Title"), author: tx(r, "Author"),
status: tx(r, "Status"), updated: tx(r, "Updated"), opened: tx(r, "ProposalsOpened"), url: tx(r, "SourceUrl"),
slogan: kids(kid(r, "Slogan"), "Word").map(w => w.textContent), vision: tx(r, "Vision"), pillars: [], actions: {}, goals: 0};
for (const p of kids(r, "Pillar")) {
const P = {id: p.getAttribute("id"), n: p.getAttribute("number"), name: tx(p, "Name"), short: tx(p, "ShortTitle"),
heading: tx(p, "Heading"), summary: tx(p, "Summary"), desc: tx(p, "Description"), goals: []};
for (const g of kids(p, "Goal")) {
const G = {id: g.getAttribute("id"), n: g.getAttribute("number"), title: tx(g, "Title"), desc: tx(g, "Description"), actions: []};
s.goals++;
for (const a of kids(g, "Action")) {
const dl = kid(a, "Deadline");
const A = {id: a.getAttribute("id"), n: +a.getAttribute("number"), title: tx(a, "Title"), text: tx(a, "Text"),
measure: tx(a, "Measurement"), deadline: dl ? dl.textContent : "", dv: dl ? dl.getAttribute("value") || "" : "",
tags: kids(a, "Tag").map(t => ({t: t.textContent, kind: t.getAttribute("kind") || ""})),
resp: kids(a, "Responsible").map(x => ({t: x.textContent, org: x.getAttribute("org") || ""})),
refs: kids(a, "Reference").map(x => ({t: x.textContent, kind: x.getAttribute("kind") || "",
actions: (x.getAttribute("actions") || "").split(/\s+/).filter(Boolean),
href: (x.getAttribute("href") || "").split(/\s+/).filter(Boolean)})),
pillar: P, goal: G};
A.proposal = A.refs.some(x => x.kind === "avots");
G.actions.push(A); s.actions[A.id] = A;
}
P.goals.push(G);
}
s.pillars.push(P);
}
const pr = kid(r, "Principles");
s.principles = pr ? {heading: tx(pr, "Heading"), intro: tx(pr, "Intro"),
items: kids(pr, "Principle").map(x => ({id: x.getAttribute("id"), label: tx(x, "Label"), text: tx(x, "Text")}))} : null;
const pn = kid(r, "ProposalsNote");
s.proposals = pn ? {text: pn.textContent, actions: (pn.getAttribute("actions") || "").split(/\s+/).filter(Boolean)} : null;
s.resources = kids(kid(r, "Resources"), "Resource").map(x => ({id: x.getAttribute("id"), href: x.getAttribute("href"),
country: tx(x, "Country"), title: tx(x, "Title"), text: tx(x, "Text")}));
return s;
}
/* Rīcību atsauces „Rīcība 10 (…)” un „(19)” → klikšķināmas saites uz rīcību */
function linkActs(text, ids){
let h = esc(text);
const byN = Object.fromEntries(ids.map(id => [S.actions[id] ? S.actions[id].n : null, id]));
h = h.replace(/Rīcība (\d+)/g, (m, n) => byN[n] ? `<a class="act" href="#${byN[n]}" data-act="${byN[n]}" title="${esc(S.actions[byN[n]].title)}">${m}</a>` : m);
h = h.replace(/\((\d+)\)/g, (m, n) => byN[n] ? `(<a class="act" href="#${byN[n]}" data-act="${byN[n]}" title="${esc(S.actions[byN[n]].title)}">${n}</a>)` : m);
return h;
}
const short = id => id.slice(S.id.length + 1);
function card(A){
const tags = A.tags.map(t => `<span class="tag${t.kind ? " rec" : ""}">${esc(t.t)}</span>`).join("")
+ (A.proposal ? `<span class="tag src" title="Avots: nozares priekšlikums">Nozares priekšlikums</span>` : "");
const refs = A.refs.map(r => {
const lab = {saistits: "Saistīts ar", avots: "Avots", piemers: "Piemērs"}[r.kind];
const links = r.href.map(u => ` <a href="${esc(u)}" target="_blank" rel="noopener">↗</a>`).join("");
return `<p class="ref">${lab ? `<b>${lab}:</b> ` : ""}${linkActs(r.t, r.actions)}${links}</p>`;
}).join("");
const resp = A.resp.length ? `<p class="ref"><b>Atbildīgais:</b> ${A.resp.map(x => esc(x.t) + (x.org ? ` <span class="chip">${esc(x.org)}</span>` : "")).join(", ")}</p>`
: `<p class="resp">Atbildīgā institūcija nav noteikta</p>`;
return `<article class="card" id="${esc(A.id)}">
<div class="top"><span class="num">Rīcība ${A.n}</span><span class="chip" title="${esc(A.id)}">${esc(short(A.id))}</span>${tags}
<span class="dl${A.dv ? "" : " open"}" title="Termiņš">${A.dv ? "⏱ " : ""}${esc(A.deadline)}</span></div>
<h4>${esc(A.title)}</h4>
<p>${esc(A.text)}</p>
<div class="measure"><b>Mērķa izpildes mērījums</b>${esc(A.measure)}</div>
${resp}${refs}
</article>`;
}
function renderPillar(P){
return `<section class="phead"><p class="kicker">${esc(P.n)} pīlārs · ${esc(P.name)} <span class="chip">${esc(short(P.id))}</span></p>
<h2>${esc(P.heading)}</h2><p>${esc(P.desc)}</p></section>`
+ P.goals.map(G => `<div class="goal"><span class="n">${esc(G.n)}</span><div><h3>${esc(G.title)} <span class="chip">${esc(short(G.id))}</span></h3><p>${esc(G.desc)}</p></div></div>
<div class="grid">${G.actions.map(card).join("")}</div>`).join("");
}
function renderAll(){
const pills = S.pillars.map(P => `<option value="${esc(P.id)}">${esc(P.n)} · ${esc(P.name)}</option>`).join("");
return `<div class="tools"><input type="search" id="q" placeholder="Meklēt rīcībās…" value="${esc(ctx.q || "")}">
<select id="fp"><option value="">Visi pīlāri</option>${pills}</select>
<select id="ft"><option value="">Visas rīcības</option><option value="prop">Nozares priekšlikumi</option><option value="rec">Pārvaldības rekomendācijas</option><option value="open">Bez termiņa</option></select>
<span class="meta" id="cnt"></span></div>
<div class="tw"><table><thead><tr><th data-s="n">Nr.</th><th data-s="title">Rīcība</th><th data-s="p">Pīlārs · mērķis</th><th data-s="dv">Termiņš</th></tr></thead><tbody id="rows"></tbody></table></div>`;
}
function fillRows(){
const q = ($("q").value || "").toLowerCase(), fp = $("fp").value, ft = $("ft").value, s = ctx.sort || "n";
ctx.q = $("q").value;
let list = Object.values(S.actions).filter(A =>
(!fp || A.pillar.id === fp) &&
(!ft || (ft === "prop" && A.proposal) || (ft === "rec" && A.tags.some(t => t.kind)) || (ft === "open" && !A.dv)) &&
(!q || [A.title, A.text, A.measure, ...A.refs.map(r => r.t)].join(" ").toLowerCase().includes(q)));
const key = {n: A => A.n, title: A => A.title, p: A => A.pillar.n + A.goal.n, dv: A => A.dv || "9999"}[s];
list.sort((a, b) => key(a) < key(b) ? -1 : key(a) > key(b) ? 1 : a.n - b.n);
$("rows").innerHTML = list.map(A => `<tr data-act="${esc(A.id)}"><td><b>${A.n}</b></td>
<td>${esc(A.title)}${A.tags.map(t => ` <span class="tag${t.kind ? " rec" : ""}">${esc(t.t)}</span>`).join("")}${A.proposal ? ` <span class="tag src">Nozares priekšlikums</span>` : ""}</td>
<td>${esc(A.pillar.n)} · ${esc(A.pillar.name)}<br><span class="meta">${esc(A.goal.n)} ${esc(A.goal.title)}</span></td>
<td style="white-space:nowrap">${esc(A.deadline)}</td></tr>`).join("") || `<tr><td colspan="4" class="empty">Nekas nav atrasts</td></tr>`;
$("cnt").textContent = `${list.length} no ${Object.keys(S.actions).length}`;
}
function renderPrinciples(){
let h = "";
if (S.principles) h += `<div class="box"><h2>${esc(S.principles.heading)}</h2><p>${esc(S.principles.intro)}</p>
<div class="prin">${S.principles.items.map(x => `<div><b>${esc(x.label)}</b>${esc(x.text)}</div>`).join("")}</div></div>`;
if (S.proposals) h += `<div class="box"><h2>Saņemtie priekšlikumi</h2><p>${linkActs(S.proposals.text, S.proposals.actions)}</p></div>`;
if (S.resources.length) h += `<div class="box"><h2>Starptautiskā pieredze</h2><div class="prin">${S.resources.map(x =>
`<div><b>${esc(x.country)}</b><a href="${esc(x.href)}" target="_blank" rel="noopener">${esc(x.title)} ↗</a><br><span class="meta">${esc(x.text)}</span></div>`).join("")}</div></div>`;
return h;
}
function renderAbout(){
const acts = Object.values(S.actions), nores = acts.filter(a => !a.resp.length).length;
const open = acts.filter(a => !a.dv).length, prop = acts.filter(a => a.proposal).length;
const xsd = $("xsd").textContent.trim();
return `<div class="box"><h2>Par datukopu</h2>
<p>PPP Asociācijas (PPPA) piedāvātā Latvijas Nacionālā MI stratēģija mašīnlasāmā formā — daļa no iniciatīvas <i>Country as Code</i> (Valsts kā Kods). Teksts pārņemts burtiski, kā publicēts: <a href="${esc(S.url)}" target="_blank" rel="noopener">${esc(S.url)}</a>.</p>
<div class="tiles">
<div class="tile"><b>${S.pillars.length}</b><span>pīlāri</span></div>
<div class="tile"><b>${S.goals}</b><span>stratēģiskie mērķi</span></div>
<div class="tile"><b>${acts.length}</b><span>rīcības</span></div>
<div class="tile"><b>${prop}</b><span>nozares priekšlikumi</span></div>
<div class="tile"><b>${open}</b><span>bez noteikta termiņa</span></div>
<div class="tile"><b>${nores}</b><span>bez atbildīgās institūcijas</span></div>
</div>
${nores ? `<p><b>Atbildīgās institūcijas nav noteiktas</b> ${nores} no ${acts.length} rīcībām. Shēmā katrai rīcībai paredzēts elements <code>Responsible</code> ar CaC ID (<code>SS-IIII</code>) no Organizāciju reģistra, lai izpildi varētu sasaistīt ar konkrētu iestādi.</p>` : ""}
<h3>Identifikatori</h3>
<div class="tw"><table><thead><tr><th>Elements</th><th>ID</th><th>Piemērs</th></tr></thead><tbody>
<tr><td>Stratēģija</td><td><code>pppa-mis-GGGG-MM-DD</code> (atjaunošanas datums)</td><td><code>${esc(S.id)}</code></td></tr>
<tr><td>Pīlārs</td><td><code>.pN</code></td><td><code>${esc(S.id)}.p2</code></td></tr>
<tr><td>Mērķis</td><td><code>.mN</code> (vienota numerācija)</td><td><code>${esc(S.id)}.m3</code></td></tr>
<tr><td>Rīcība</td><td><code>.rNN</code> (= drukātais numurs)</td><td><code>${esc(S.id)}.r09</code></td></tr>
<tr><td>Princips / resurss</td><td><code>.prN</code> / <code>.aN</code></td><td><code>${esc(S.id)}.pr1</code></td></tr>
</tbody></table></div>
<p style="margin-top:8px;font-size:12.5px;color:var(--muted)">Datne = dokumenta ID (<code>${esc(S.id)}.xml</code>). Termiņi glabāti kā publicēti un atribūtā <code>@value</code> ISO formā. Atsauces uz citām rīcībām — atribūtā <code>@actions</code>.</p>
${xsd && !xsd.startsWith("__") ? `<h3>Shēma</h3><details><summary>mi-strategija-0.1.xsd</summary><pre>${esc(xsd)}</pre></details>` : ""}
</div>`;
}
const TABS = () => [...S.pillars.map(P => [P.id.slice(S.id.length + 1), `${P.n} · ${P.name}`]), ["all", "Visas rīcības"], ["prin", "Principi un resursi"], ["about", "Par"]];
function render(){
document.title = `${S.title} · ${S.version}`;
$("title").textContent = S.title;
$("slogan").textContent = S.slogan.join(" · ");
$("vision").textContent = S.vision;
$("meta").innerHTML = `<span>${esc(S.author)}</span><span>· ${esc(S.status)} ${esc(S.version)}</span><span>· atjaunots ${esc(S.updated)}</span><span class="chip">${esc(S.id)}</span>`
+ (ctx.pgv ? `<span class="pgvbar">· ${esc(ctx.pgv)}</span>` : "");
$("tabs").innerHTML = TABS().map(([k, l]) => `<button data-tab="${k}" class="${k === tab ? "on" : ""}">${esc(l)}</button>`).join("");
const P = S.pillars.find(p => short(p.id) === tab);
$("main").innerHTML = P ? renderPillar(P) : tab === "all" ? renderAll() : tab === "prin" ? renderPrinciples() : renderAbout();
if (tab === "all") { fillRows(); ["q", "fp", "ft"].forEach(i => $(i).addEventListener("input", fillRows)); if (ctx.fp) $("fp").value = ctx.fp; }
}
function setTab(t){ tab = t; render(); try { history.replaceState(null, "", "#" + t); } catch (e) {} scrollTo(0, 0); }
function goAction(id){
const A = S.actions[id]; if (!A) return;
tab = short(A.pillar.id); render();
const el = $(id); if (!el) return;
el.scrollIntoView({behavior: "smooth", block: "start"}); el.classList.add("flash"); setTimeout(() => el.classList.remove("flash"), 1400);
}
document.addEventListener("click", ev => {
const t = ev.target.closest("[data-tab]"); if (t) { setTab(t.dataset.tab); return; }
const a = ev.target.closest("[data-act]"); if (a) { ev.preventDefault(); goAction(a.dataset.act); return; }
const th = ev.target.closest("th[data-s]"); if (th) { ctx.sort = th.dataset.s; fillRows(); }
});
function load(text){
try { S = parse(text); } catch (e) { $("main").innerHTML = `<div class="empty">${esc(e.message)}</div>`; return; }
const h = location.hash.slice(1);
if (S.actions[h]) { goAction(h); return; }
tab = TABS().some(([k]) => k === h) ? h : short(S.pillars[0].id);
render();
}
/* ===== ProcessGit skatītājs (processgit.viewer.json): PGV_READY → PGV_INIT → PGV_FETCH ===== */
function pgvFetch(url){ return new Promise((res, rej) => {
const tm = setTimeout(() => { removeEventListener("message", hd); rej(new Error("PGV_FETCH timeout")); }, 15000);
function hd(ev){ const m = ev.data; if (!m || m.type !== "PGV_FETCH_RESULT" || m.url !== url) return; clearTimeout(tm); removeEventListener("message", hd); m.ok ? res(m.text) : rej(new Error(m.error || "fetch failed")); }
addEventListener("message", hd); parent.postMessage({type: "PGV_FETCH", url}, "*"); }); }
async function pgvInit(p){
const url = (p.targets && p.targets.xml) || `${p.repoLink}/raw/branch/${p.branch}/${p.path}`;
ctx.pgv = `ProcessGit · ${p.branch || ""} · ${p.path || ""}${p.lastCommit ? " · " + p.lastCommit.slice(0, 7) : ""}`;
try { load(await pgvFetch(url)); } catch (e) { $("main").innerHTML = `<div class="empty">Neizdevās ielādēt datni no repozitorija: ${esc(e.message)}</div>`; }
}
const inFrame = window.parent && window.parent !== window;
if (inFrame) {
addEventListener("message", ev => { const m = ev.data; if (m && typeof m === "object" && m.type === "PGV_INIT") pgvInit(m.payload || {}); });
try { parent.postMessage({type: "PGV_READY"}, "*"); } catch (e) {}
setTimeout(() => { if (!S) $("main").innerHTML = `<div class="empty">Gaida datni no ProcessGit…</div>`; }, 4000);
} else load($("embedded").textContent.trim());
</script>
</body>
</html>