@akredit/acik-mcp 0.0.0-stage → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +177 -2
  3. package/dist/apps/acik-mcp/src/araclar.d.ts +5 -0
  4. package/dist/apps/acik-mcp/src/araclar.js +461 -0
  5. package/dist/apps/acik-mcp/src/bologna.d.ts +209 -0
  6. package/dist/apps/acik-mcp/src/bologna.js +1321 -0
  7. package/dist/apps/acik-mcp/src/cli.d.ts +2 -0
  8. package/dist/apps/acik-mcp/src/cli.js +32 -0
  9. package/dist/apps/acik-mcp/src/genel-ayristir.d.ts +83 -0
  10. package/dist/apps/acik-mcp/src/genel-ayristir.js +411 -0
  11. package/dist/apps/acik-mcp/src/http.d.ts +36 -0
  12. package/dist/apps/acik-mcp/src/http.js +140 -0
  13. package/dist/apps/acik-mcp/src/index.d.ts +10 -0
  14. package/dist/apps/acik-mcp/src/index.js +12 -0
  15. package/dist/apps/acik-mcp/src/kaynak-dogrula.d.ts +47 -0
  16. package/dist/apps/acik-mcp/src/kaynak-dogrula.js +319 -0
  17. package/dist/apps/acik-mcp/src/kaynak.d.ts +72 -0
  18. package/dist/apps/acik-mcp/src/kaynak.js +155 -0
  19. package/dist/apps/acik-mcp/src/kisisel-veri.d.ts +15 -0
  20. package/dist/apps/acik-mcp/src/kisisel-veri.js +88 -0
  21. package/dist/apps/acik-mcp/src/not-tablosu.d.ts +33 -0
  22. package/dist/apps/acik-mcp/src/not-tablosu.js +243 -0
  23. package/dist/apps/acik-mcp/src/promptlar.d.ts +25 -0
  24. package/dist/apps/acik-mcp/src/promptlar.js +253 -0
  25. package/dist/apps/acik-mcp/src/sunucu.d.ts +24 -0
  26. package/dist/apps/acik-mcp/src/sunucu.js +147 -0
  27. package/dist/apps/acik-mcp/src/temel.d.ts +54 -0
  28. package/dist/apps/acik-mcp/src/temel.js +10 -0
  29. package/dist/apps/acik-mcp/src/yardim.d.ts +56 -0
  30. package/dist/apps/acik-mcp/src/yardim.js +371 -0
  31. package/dist/packages/baglayicilar/src/bologna-proliz/ayristir.d.ts +29 -0
  32. package/dist/packages/baglayicilar/src/bologna-proliz/ayristir.js +200 -0
  33. package/dist/packages/cekirdek/src/atif.d.ts +25 -0
  34. package/dist/packages/cekirdek/src/atif.js +88 -0
  35. package/dist/packages/cekirdek/src/bologna/denetim.d.ts +11 -0
  36. package/dist/packages/cekirdek/src/bologna/denetim.js +110 -0
  37. package/dist/packages/cekirdek/src/bologna/taslak.d.ts +12 -0
  38. package/dist/packages/cekirdek/src/bologna/taslak.js +169 -0
  39. package/dist/packages/cekirdek/src/bologna/turler.d.ts +143 -0
  40. package/dist/packages/cekirdek/src/bologna/turler.js +5 -0
  41. package/dist/packages/cekirdek/src/index.d.ts +15 -0
  42. package/dist/packages/cekirdek/src/index.js +17 -0
  43. package/dist/packages/cekirdek/src/karar/kart.d.ts +128 -0
  44. package/dist/packages/cekirdek/src/karar/kart.js +162 -0
  45. package/dist/packages/cekirdek/src/karar/katman.d.ts +63 -0
  46. package/dist/packages/cekirdek/src/karar/katman.js +76 -0
  47. package/dist/packages/cekirdek/src/kimlik.d.ts +7 -0
  48. package/dist/packages/cekirdek/src/kimlik.js +33 -0
  49. package/dist/packages/cekirdek/src/matris.d.ts +32 -0
  50. package/dist/packages/cekirdek/src/matris.js +66 -0
  51. package/dist/packages/cekirdek/src/olcme-turleri.d.ts +39 -0
  52. package/dist/packages/cekirdek/src/olcme-turleri.js +3 -0
  53. package/dist/packages/cekirdek/src/olcum.d.ts +46 -0
  54. package/dist/packages/cekirdek/src/olcum.js +61 -0
  55. package/dist/packages/cekirdek/src/oneri.d.ts +39 -0
  56. package/dist/packages/cekirdek/src/oneri.js +116 -0
  57. package/dist/packages/cekirdek/src/ozet.d.ts +12 -0
  58. package/dist/packages/cekirdek/src/ozet.js +45 -0
  59. package/dist/packages/cekirdek/src/rapor/cumle.d.ts +31 -0
  60. package/dist/packages/cekirdek/src/rapor/cumle.js +83 -0
  61. package/dist/packages/cekirdek/src/rapor/denetim.d.ts +20 -0
  62. package/dist/packages/cekirdek/src/rapor/denetim.js +46 -0
  63. package/dist/packages/cekirdek/src/rapor/dil.d.ts +25 -0
  64. package/dist/packages/cekirdek/src/rapor/dil.js +201 -0
  65. package/dist/packages/cekirdek/src/rapor/kanit-paneli.d.ts +26 -0
  66. package/dist/packages/cekirdek/src/rapor/kanit-paneli.js +87 -0
  67. package/dist/packages/cekirdek/src/turkce.d.ts +13 -0
  68. package/dist/packages/cekirdek/src/turkce.js +44 -0
  69. package/dist/packages/cekirdek/src/turler.d.ts +190 -0
  70. package/dist/packages/cekirdek/src/turler.js +18 -0
  71. package/dist/packages/cerceveler/src/esleme.d.ts +47 -0
  72. package/dist/packages/cerceveler/src/esleme.js +56 -0
  73. package/dist/packages/cerceveler/src/ice-aktarma.d.ts +39 -0
  74. package/dist/packages/cerceveler/src/ice-aktarma.js +114 -0
  75. package/dist/packages/cerceveler/src/index.d.ts +10 -0
  76. package/dist/packages/cerceveler/src/index.js +12 -0
  77. package/dist/packages/cerceveler/src/kutuphane.d.ts +17 -0
  78. package/dist/packages/cerceveler/src/kutuphane.js +50 -0
  79. package/dist/packages/cerceveler/src/program-tablolari/cerceveler.d.ts +8 -0
  80. package/dist/packages/cerceveler/src/program-tablolari/cerceveler.js +144 -0
  81. package/dist/packages/cerceveler/src/program-tablolari/donustur.d.ts +144 -0
  82. package/dist/packages/cerceveler/src/program-tablolari/donustur.js +356 -0
  83. package/dist/packages/cerceveler/src/program-tablolari/index.d.ts +7 -0
  84. package/dist/packages/cerceveler/src/program-tablolari/index.js +8 -0
  85. package/dist/packages/cerceveler/src/program-tablolari/kaynaklar.d.ts +72 -0
  86. package/dist/packages/cerceveler/src/program-tablolari/kaynaklar.js +75 -0
  87. package/dist/packages/cerceveler/src/program-tablolari/olcut-ham.d.ts +27 -0
  88. package/dist/packages/cerceveler/src/program-tablolari/olcut-ham.js +2327 -0
  89. package/dist/packages/cerceveler/src/program-tablolari/ozgu-ham.d.ts +35 -0
  90. package/dist/packages/cerceveler/src/program-tablolari/ozgu-ham.js +3366 -0
  91. package/dist/packages/cerceveler/src/program-tablolari/ozgu.d.ts +119 -0
  92. package/dist/packages/cerceveler/src/program-tablolari/ozgu.js +114 -0
  93. package/dist/packages/cerceveler/src/program-tablolari/tablolar.d.ts +90 -0
  94. package/dist/packages/cerceveler/src/program-tablolari/tablolar.js +309 -0
  95. package/dist/packages/cerceveler/src/sema.d.ts +129 -0
  96. package/dist/packages/cerceveler/src/sema.js +166 -0
  97. package/dist/packages/cerceveler/src/veri-resmi.d.ts +27 -0
  98. package/dist/packages/cerceveler/src/veri-resmi.js +132 -0
  99. package/dist/packages/cerceveler/src/veri-yokak.d.ts +5 -0
  100. package/dist/packages/cerceveler/src/veri-yokak.js +1038 -0
  101. package/dist/packages/cerceveler/src/veri.d.ts +16 -0
  102. package/dist/packages/cerceveler/src/veri.js +273 -0
  103. package/dist/packages/cerceveler/src/yokak-anahtar.d.ts +36 -0
  104. package/dist/packages/cerceveler/src/yokak-anahtar.js +125 -0
  105. package/dist/packages/olcme/src/ders.d.ts +6 -0
  106. package/dist/packages/olcme/src/ders.js +317 -0
  107. package/dist/packages/olcme/src/index.d.ts +6 -0
  108. package/dist/packages/olcme/src/index.js +8 -0
  109. package/dist/packages/olcme/src/istatistik.d.ts +13 -0
  110. package/dist/packages/olcme/src/istatistik.js +64 -0
  111. package/dist/packages/olcme/src/kok-neden.d.ts +20 -0
  112. package/dist/packages/olcme/src/kok-neden.js +48 -0
  113. package/dist/packages/olcme/src/program.d.ts +25 -0
  114. package/dist/packages/olcme/src/program.js +31 -0
  115. package/dist/packages/olcme/src/turler.d.ts +114 -0
  116. package/dist/packages/olcme/src/turler.js +5 -0
  117. package/dist/packages/yz/src/ajan.d.ts +72 -0
  118. package/dist/packages/yz/src/ajan.js +94 -0
  119. package/dist/packages/yz/src/anahtar-kasasi.d.ts +21 -0
  120. package/dist/packages/yz/src/anahtar-kasasi.js +77 -0
  121. package/dist/packages/yz/src/degerlendirme/duzenek.d.ts +29 -0
  122. package/dist/packages/yz/src/degerlendirme/duzenek.js +57 -0
  123. package/dist/packages/yz/src/gorevler/bologna-taslagi/index.d.ts +114 -0
  124. package/dist/packages/yz/src/gorevler/bologna-taslagi/index.js +187 -0
  125. package/dist/packages/yz/src/gorevler/bologna-taslagi/ornek-taslak.json +484 -0
  126. package/dist/packages/yz/src/gorevler/bologna-taslagi/ornek.d.ts +9 -0
  127. package/dist/packages/yz/src/gorevler/bologna-taslagi/ornek.js +61 -0
  128. package/dist/packages/yz/src/gorevler/esleme-onerisi.d.ts +73 -0
  129. package/dist/packages/yz/src/gorevler/esleme-onerisi.js +190 -0
  130. package/dist/packages/yz/src/gorevler/gorev.d.ts +26 -0
  131. package/dist/packages/yz/src/gorevler/gorev.js +30 -0
  132. package/dist/packages/yz/src/gorevler/kanit-avcisi/index.d.ts +88 -0
  133. package/dist/packages/yz/src/gorevler/kanit-avcisi/index.js +233 -0
  134. package/dist/packages/yz/src/gorevler/kanit-siniflama.d.ts +34 -0
  135. package/dist/packages/yz/src/gorevler/kanit-siniflama.js +64 -0
  136. package/dist/packages/yz/src/gorevler/puko-onlemi.d.ts +21 -0
  137. package/dist/packages/yz/src/gorevler/puko-onlemi.js +59 -0
  138. package/dist/packages/yz/src/gorevler/saha-sorulari.d.ts +46 -0
  139. package/dist/packages/yz/src/gorevler/saha-sorulari.js +149 -0
  140. package/dist/packages/yz/src/gorevler/toplanti-bilgisi.d.ts +40 -0
  141. package/dist/packages/yz/src/gorevler/toplanti-bilgisi.js +98 -0
  142. package/dist/packages/yz/src/guvence/atif.d.ts +46 -0
  143. package/dist/packages/yz/src/guvence/atif.js +188 -0
  144. package/dist/packages/yz/src/guvence/cikis-kapisi.d.ts +83 -0
  145. package/dist/packages/yz/src/guvence/cikis-kapisi.js +267 -0
  146. package/dist/packages/yz/src/guvence/istem-kalkani.d.ts +15 -0
  147. package/dist/packages/yz/src/guvence/istem-kalkani.js +53 -0
  148. package/dist/packages/yz/src/guvence/kvkk.d.ts +64 -0
  149. package/dist/packages/yz/src/guvence/kvkk.js +363 -0
  150. package/dist/packages/yz/src/guvence/politika.d.ts +15 -0
  151. package/dist/packages/yz/src/guvence/politika.js +23 -0
  152. package/dist/packages/yz/src/guvence/sayi.d.ts +30 -0
  153. package/dist/packages/yz/src/guvence/sayi.js +161 -0
  154. package/dist/packages/yz/src/http.d.ts +19 -0
  155. package/dist/packages/yz/src/http.js +70 -0
  156. package/dist/packages/yz/src/index.d.ts +28 -0
  157. package/dist/packages/yz/src/index.js +31 -0
  158. package/dist/packages/yz/src/olcum.d.ts +26 -0
  159. package/dist/packages/yz/src/olcum.js +43 -0
  160. package/dist/packages/yz/src/saglayici.d.ts +68 -0
  161. package/dist/packages/yz/src/saglayici.js +21 -0
  162. package/dist/packages/yz/src/saglayicilar/anthropic.d.ts +15 -0
  163. package/dist/packages/yz/src/saglayicilar/anthropic.js +82 -0
  164. package/dist/packages/yz/src/saglayicilar/kayit.d.ts +22 -0
  165. package/dist/packages/yz/src/saglayicilar/kayit.js +49 -0
  166. package/dist/packages/yz/src/saglayicilar/openai-uyumlu.d.ts +46 -0
  167. package/dist/packages/yz/src/saglayicilar/openai-uyumlu.js +115 -0
  168. package/dist/packages/yz/src/saglayicilar/sahte.d.ts +15 -0
  169. package/dist/packages/yz/src/saglayicilar/sahte.js +27 -0
  170. package/dist/packages/yz/src/web-arama/index.d.ts +125 -0
  171. package/dist/packages/yz/src/web-arama/index.js +264 -0
  172. package/dist/packages/yz/src/yapilandirilmis.d.ts +23 -0
  173. package/dist/packages/yz/src/yapilandirilmis.js +64 -0
  174. package/package.json +51 -3
@@ -0,0 +1,461 @@
1
+ // Herkese açık MCP araçları. Hepsi salt okuma ve deterministiktir: model çağrısı yok, kurum verisi yok,
2
+ // durum yok. Ölçüt metni yalnız resmî belgeden çıkarılmış çerçeve verisinden gelir (ilke 6); belgeden
3
+ // alınamayan metin DOĞRULANMADI olarak döner. Sayılar yalnız @akredit/olcme hesabından gelir (ilke 2).
4
+ // Öz değerlendirme iskeleti metin yazmaz: her bölüm EKSİK işaretiyle ve gereken kanıt türleriyle döner (ilke 1).
5
+ import { dilDenetle } from "../../../packages/cekirdek/src/index.js";
6
+ import { belgeAdi, DOGRULANMADI, EPDAD_DERECELENDIRME_ANAHTARI, olcutEkleri, ozguBagi, ozguBolumListesi, PROGRAM_BELGELERI, PROGRAM_CERCEVELERI, tumOlcutler, YOKAK_KIDR_3_2_1, YOKAK_KURUMSAL_3_3, } from "../../../packages/cerceveler/src/index.js";
7
+ import { dersiOlc, HESAP_SURUMU } from "../../../packages/olcme/src/index.js";
8
+ import { z } from "zod";
9
+ import { BOLOGNA_ARACLARI, bolognaDenetleAraci } from "./bologna.js";
10
+ import { kaynakBicimleAraci } from "./kaynak.js";
11
+ import { kaynakDogrulaAraci } from "./kaynak-dogrula.js";
12
+ import { notTablosuAyristirAraci } from "./not-tablosu.js";
13
+ import { AracHatasi, arac, DEPO, KOD_KAYNAGI } from "./temel.js";
14
+ import { engelCozAraci, kurulumYardimiAraci } from "./yardim.js";
15
+ export * from "./temel.js";
16
+ // ---------------------------------------------------------------- Çerçeve yardımcıları
17
+ const BELGE_ADI = {
18
+ [YOKAK_KURUMSAL_3_3.kaynak?.dosya ?? ""]: "YÖKAK Değerlendirme Programları Kılavuzu 3.3, Ek-1 Dereceli Değerlendirme Anahtarı",
19
+ [YOKAK_KIDR_3_2_1.kaynak?.dosya ?? ""]: "YÖKAK KİDR Hazırlama Kılavuzu 3.2.1",
20
+ };
21
+ for (const e of YOKAK_KURUMSAL_3_3.ekKaynaklar)
22
+ if (e.dosya && !BELGE_ADI[e.dosya])
23
+ BELGE_ADI[e.dosya] = "YÖKAK Değerlendirme Ölçütleri 3.1";
24
+ for (const b of Object.values(PROGRAM_BELGELERI))
25
+ if (b.dosya && !BELGE_ADI[b.dosya])
26
+ BELGE_ADI[b.dosya] = b.not;
27
+ /** Aranabilir çerçeveler: YÖKAK kurumsal 3.3 (varsayılan) ve resmî belgeden alınan program çerçeveleri. */
28
+ const CERCEVELER = [YOKAK_KURUMSAL_3_3, ...PROGRAM_CERCEVELERI];
29
+ const CERCEVE_KODLARI = CERCEVELER.map((c) => c.kod);
30
+ const cerceveGirdisi = z
31
+ .enum(CERCEVE_KODLARI)
32
+ .default(YOKAK_KURUMSAL_3_3.kod)
33
+ .describe(`Çerçeve kodu. Varsayılan YÖKAK (${YOKAK_KURUMSAL_3_3.kod}). Program akreditasyonu: ${PROGRAM_CERCEVELERI.map((c) => c.kod).join(", ")}.`);
34
+ const cerceveBul = (kod) => CERCEVELER.find((c) => c.kod === kod) ?? YOKAK_KURUMSAL_3_3;
35
+ /** Düzey tanımı belgeden ayrılamayan gösterge için dönen değer; tanım uydurulmaz. */
36
+ export const OKUNAMADI = "Belgeden okunamadı";
37
+ function ozguKaynagi(k) {
38
+ const b = Object.values(PROGRAM_BELGELERI).find((x) => x.dosya === k.dosya);
39
+ return {
40
+ ad: belgeAdi(k.dosya),
41
+ adres: b?.adres ?? DEPO,
42
+ sayfa: k.sayfa,
43
+ sha256: k.sha256,
44
+ ...(b?.erisimTarihi ? { erisimTarihi: b.erisimTarihi } : {}),
45
+ };
46
+ }
47
+ function ekYaz(e) {
48
+ if (e.tur === "gosterge")
49
+ return {
50
+ tur: "gosterge",
51
+ no: e.no,
52
+ metin: e.metin,
53
+ duzeyler: EPDAD_DERECELENDIRME_ANAHTARI.duzeyler.map((d) => ({
54
+ duzey: d.ad,
55
+ metin: e.duzeyler ? e.duzeyler[d.kod] : OKUNAMADI,
56
+ })),
57
+ kaynakSayfa: e.kaynak.sayfa,
58
+ };
59
+ return { tur: "ozgu_konu", bolum: e.bolumKod, grup: e.grup, metin: e.metin, kaynakSayfa: e.kaynak.sayfa };
60
+ }
61
+ /** Çerçevenin bütün ek öğeleri (bütün bölümler dahil; arama içindir, seçim değildir). */
62
+ function tumEkler(c) {
63
+ const bolumler = ozguBolumListesi(c.kod).map((b) => b.kod);
64
+ return tumOlcutler(c.olcutler).flatMap((o) => olcutEkleri(c.kod, o.kod, bolumler).map((e) => ({ olcutKod: o.kod, e })));
65
+ }
66
+ function belgeKaynagi(c, dosya, sayfa) {
67
+ const belgeler = [...(c.kaynak ? [c.kaynak] : []), ...c.ekKaynaklar];
68
+ const b = belgeler.find((x) => x.dosya === (dosya ?? c.kaynak?.dosya)) ?? c.kaynak;
69
+ if (!b)
70
+ return { ad: c.ad, adres: DEPO };
71
+ return {
72
+ ad: BELGE_ADI[b.dosya ?? ""] ?? c.ad,
73
+ adres: b.adres,
74
+ sayfa,
75
+ sha256: b.sha256,
76
+ erisimTarihi: b.erisimTarihi,
77
+ };
78
+ }
79
+ const olcutKaynagi = (c, o) => belgeKaynagi(c, o.kaynakDosya, o.kaynakSayfa);
80
+ function olcutBul(c, kod) {
81
+ const k = kod.trim().toLocaleUpperCase("tr").replace(/\.$/u, "");
82
+ const o = tumOlcutler(c.olcutler).find((x) => x.kod === k);
83
+ if (!o)
84
+ throw new AracHatasi(`"${kod.slice(0, 20)}" kodlu ölçüt bulunamadı. Kodu "B.1.2" biçiminde yazın ya da olcut_ara ile arayın.`);
85
+ return o;
86
+ }
87
+ const duzey = (kod) => kod.split(".").length === 1 ? "ana_baslik" : kod.split(".").length === 2 ? "olcut" : "alt_olcut";
88
+ const metinGoster = (o) => (o.metinDurumu === "dogrulanmadi" ? DOGRULANMADI : o.metin);
89
+ // ---------------------------------------------------------------- Ölçüt araçları
90
+ const olcutAra = arac({
91
+ ad: "olcut_ara",
92
+ baslik: "Ölçüt ara (YÖKAK ve program akreditasyonu)",
93
+ aciklama: "YÖKAK ya da program akreditasyonu (MÜDEK, FEDEK, SABAK, EPDAD) ölçütlerinde sözcük ya da kodla arar. Metinler resmî belgeden alınır; alınamayan metin DOĞRULANMADI döner.",
94
+ sonrakiAdim: "Hocaya en uygun 2-3 sonucu numaralı gösterin; seçtiği ölçütün tam metni için olcut_getir'i çağırın.",
95
+ girdi: z.object({
96
+ sorgu: z.string().trim().min(1).max(200).describe("Aranacak ifade ya da kod, ör. 'paydaş katılımı' ya da 'B.3'"),
97
+ cerceve: cerceveGirdisi,
98
+ en_fazla: z.number().int().min(1).max(50).default(10).describe("En çok kaç sonuç dönsün (1-50)"),
99
+ }),
100
+ calistir: ({ sorgu, cerceve, en_fazla }) => {
101
+ const CERCEVE = cerceveBul(cerceve);
102
+ const s = sorgu.toLocaleLowerCase("tr");
103
+ const kelimeler = s.split(/\s+/u).filter(Boolean);
104
+ const hepsi = tumOlcutler(CERCEVE.olcutler);
105
+ const puanli = hepsi
106
+ .map((o) => {
107
+ const kod = o.kod.toLocaleLowerCase("tr");
108
+ const baslik = o.baslik.toLocaleLowerCase("tr");
109
+ const metin = o.metinDurumu === "dogrulanmadi" ? "" : o.metin.toLocaleLowerCase("tr");
110
+ let puan = 0;
111
+ if (kod === s)
112
+ puan += 100;
113
+ else if (kod.startsWith(s))
114
+ puan += 50;
115
+ for (const k of kelimeler) {
116
+ if (baslik.includes(k))
117
+ puan += 5;
118
+ if (metin.includes(k))
119
+ puan += 1;
120
+ }
121
+ return { o, puan };
122
+ })
123
+ .filter((x) => x.puan > 0)
124
+ .sort((a, b) => b.puan - a.puan || hepsi.indexOf(a.o) - hepsi.indexOf(b.o));
125
+ const secilen = puanli.slice(0, en_fazla);
126
+ // Ek öğeler (gösterge, özgü konu): her sözcük metinde ya da bölüm başlığında geçmeli; ölçütlerden sonra.
127
+ const ekler = tumEkler(CERCEVE)
128
+ .map((x) => {
129
+ const m = x.e.metin.toLocaleLowerCase("tr");
130
+ const b = x.e.tur === "ozgu_konu" ? x.e.bolumBaslik.toLocaleLowerCase("tr") : "";
131
+ const tutan = kelimeler.filter((k) => m.includes(k) || b.includes(k));
132
+ return { ...x, tam: tutan.length === kelimeler.length, puan: kelimeler.filter((k) => m.includes(k)).length };
133
+ })
134
+ .filter((x) => x.tam)
135
+ .sort((a, b) => b.puan - a.puan);
136
+ const ekSecilen = ekler.slice(0, Math.max(0, en_fazla - secilen.length));
137
+ return {
138
+ sonuc: {
139
+ cerceve: `${CERCEVE.ad} ${CERCEVE.surum}`,
140
+ cerceveKod: CERCEVE.kod,
141
+ toplamEslesme: puanli.length,
142
+ olcutler: secilen.map(({ o }) => ({
143
+ kod: o.kod,
144
+ baslik: o.baslik,
145
+ duzey: duzey(o.kod),
146
+ metinDurumu: o.metinDurumu,
147
+ ozet: metinGoster(o).slice(0, 240),
148
+ kaynakSayfa: o.kaynakSayfa,
149
+ })),
150
+ toplamEkEslesme: ekler.length,
151
+ ekler: ekSecilen.map(({ olcutKod, e }) => ({
152
+ olcutKod,
153
+ tur: e.tur,
154
+ ...(e.tur === "gosterge" ? { no: e.no } : { bolum: e.bolumKod }),
155
+ ozet: e.metin.slice(0, 240),
156
+ kaynakSayfa: e.kaynak.sayfa,
157
+ })),
158
+ },
159
+ kaynak: [
160
+ ...new Map([
161
+ ...secilen.map(({ o }) => [
162
+ o.kaynakDosya ?? CERCEVE.kaynak?.dosya ?? "",
163
+ olcutKaynagi(CERCEVE, { ...o, kaynakSayfa: null }),
164
+ ]),
165
+ ...ekSecilen.map(({ e }) => [e.kaynak.dosya, { ...ozguKaynagi(e.kaynak), sayfa: null }]),
166
+ ]).values(),
167
+ ],
168
+ };
169
+ },
170
+ });
171
+ const olcutGetir = arac({
172
+ ad: "olcut_getir",
173
+ baslik: "Ölçütü getir (YÖKAK ve program akreditasyonu)",
174
+ aciklama: "Bir ölçütün resmî metnini kaynak belge, sayfa ve dosya özetiyle getirir; üst ve alt ölçütler, EPDAD göstergeleri, MÜDEK ve FEDEK programa özgü bölümleri de gelir. Metin tahminle doldurulmaz.",
175
+ sonrakiAdim: "Alt ölçütse olgunluk_duzeyleri ile düzeyleri ve örnek kanıtları gösterin. Hocaya sorun: 1) örnek kanıtlar 2) başka ölçüt 3) öz değerlendirme iskeleti.",
176
+ girdi: z.object({
177
+ kod: z
178
+ .string()
179
+ .trim()
180
+ .min(1)
181
+ .max(20)
182
+ .describe("Ölçüt kodu, ör. 'A', 'B.1', 'B.1.2'; program çerçevesinde ör. '5.1' ya da '1.1.1'"),
183
+ cerceve: cerceveGirdisi,
184
+ bolum: z
185
+ .string()
186
+ .trim()
187
+ .min(1)
188
+ .max(60)
189
+ .optional()
190
+ .describe("MÜDEK 5.1 ya da FEDEK 10.1 için bölüm kodu, ör. 'bilgisayar-yazilim'. Verilmezse yalnız bölüm listesi döner."),
191
+ }),
192
+ calistir: ({ kod, cerceve, bolum }) => {
193
+ const CERCEVE = cerceveBul(cerceve);
194
+ const o = olcutBul(CERCEVE, kod);
195
+ const bag = ozguBagi(CERCEVE.kod);
196
+ const bolumler = bag?.olcutKod === o.kod ? ozguBolumListesi(CERCEVE.kod) : [];
197
+ if (bolum && !bolumler.some((b) => b.kod === bolum))
198
+ throw new AracHatasi(bolumler.length
199
+ ? `"${bolum.slice(0, 40)}" kodlu bölüm yok. Kodu bu aracın bölüm listesinden seçin.`
200
+ : `${o.kod} ölçütünde disipline ya da programa özgü bölüm yok.`);
201
+ const ekler = olcutEkleri(CERCEVE.kod, o.kod, bolum ? [bolum] : []);
202
+ const ust = tumOlcutler(CERCEVE.olcutler).find((x) => x.altOlcutler.includes(o)) ?? null;
203
+ return {
204
+ sonuc: {
205
+ cerceve: `${CERCEVE.ad} ${CERCEVE.surum}`,
206
+ kod: o.kod,
207
+ baslik: o.baslik,
208
+ duzey: duzey(o.kod),
209
+ metin: metinGoster(o),
210
+ metinDurumu: o.metinDurumu,
211
+ ust: ust ? { kod: ust.kod, baslik: ust.baslik } : null,
212
+ altOlcutler: o.altOlcutler.map((a) => ({ kod: a.kod, baslik: a.baslik })),
213
+ olgunlukDuzeyiVar: Boolean(o.olgunlukTanimlari?.length),
214
+ uzmanDogrulamasi: CERCEVE.dogrulandi ? "yapıldı" : "bekliyor",
215
+ ...(bolumler.length
216
+ ? {
217
+ ozguBolumler: {
218
+ ad: bag?.ad,
219
+ not: "Programın hangi bölüme girdiğini kurum seçer; bu araç seçim yapmaz.",
220
+ bolumler: bolumler.map((b) => ({ kod: b.kod, baslik: b.baslik, kaynakSayfa: b.kaynak.sayfa })),
221
+ },
222
+ }
223
+ : {}),
224
+ ...(ekler.length ? { ekler: ekler.map(ekYaz) } : {}),
225
+ ...(ekler.some((e) => e.tur === "gosterge")
226
+ ? { derecelendirme: EPDAD_DERECELENDIRME_ANAHTARI.duzeyler.map((d) => d.ad) }
227
+ : {}),
228
+ },
229
+ kaynak: [
230
+ olcutKaynagi(CERCEVE, o),
231
+ ...new Map(ekler.map((e) => [e.kaynak.dosya, { ...ozguKaynagi(e.kaynak), sayfa: null }])).values(),
232
+ ],
233
+ };
234
+ },
235
+ });
236
+ const olgunlukDuzeyleri = arac({
237
+ ad: "olgunluk_duzeyleri",
238
+ baslik: "Alt ölçüt olgunluk düzeyleri ve örnek kanıtlar",
239
+ aciklama: "Bir YÖKAK alt ölçütünün (ör. B.1.2) 1-5 olgunluk düzeyi metinlerini ve örnek kanıtlarını getirir. Düzey önermez; düzeye kurum kanıtla karar verir.",
240
+ sonrakiAdim: "Örnek kanıtları hocanın elindekilerle eşleştirin: her kanıt için 1) var 2) yok 3) emin değilim diye sorun. Yok olanlar EKSİK kalır.",
241
+ girdi: z.object({ kod: z.string().trim().min(1).max(20).describe("Alt ölçüt kodu, ör. 'B.1.2'") }),
242
+ calistir: ({ kod }) => {
243
+ const CERCEVE = YOKAK_KURUMSAL_3_3;
244
+ const o = olcutBul(CERCEVE, kod);
245
+ if (duzey(o.kod) !== "alt_olcut")
246
+ throw new AracHatasi(`${o.kod} bir alt ölçüt değil. Olgunluk düzeyleri alt ölçütlerde tanımlıdır: ${o.altOlcutler
247
+ .slice(0, 8)
248
+ .map((a) => a.kod)
249
+ .join(", ")}${o.altOlcutler.length ? "" : "yok"}.`);
250
+ const tanimli = Boolean(o.olgunlukTanimlari?.length);
251
+ return {
252
+ sonuc: {
253
+ kod: o.kod,
254
+ baslik: o.baslik,
255
+ duzeyler: tanimli
256
+ ? (o.olgunlukTanimlari ?? []).map((d) => ({ duzey: d.duzey, metin: d.metin }))
257
+ : [1, 2, 3, 4, 5].map((d) => ({ duzey: d, metin: DOGRULANMADI })),
258
+ ornekKanitlar: o.ornekKanitlar?.length ? o.ornekKanitlar : [DOGRULANMADI],
259
+ kanitTurleri: o.kanitGereksinimleri.map((k) => ({ tur: k.tur, aciklama: k.aciklama })),
260
+ hatirlatma: "Olgunluk düzeyi kararı kurumun ve değerlendiricinin kararıdır; düzeye kanıtla karar verilir.",
261
+ },
262
+ kaynak: [olcutKaynagi(CERCEVE, o)],
263
+ };
264
+ },
265
+ });
266
+ // ---------------------------------------------------------------- Öz değerlendirme iskeleti
267
+ const ozDegerlendirmeIskeleti = arac({
268
+ ad: "oz_degerlendirme_iskeleti",
269
+ baslik: "Öz değerlendirme raporu iskeleti",
270
+ aciklama: "Öz değerlendirme raporunun (KİDR 3.2.1) bölümlerini, alt ölçütlerini ve gereken örnek kanıtları verir. Metin yazmaz; her bölüm EKSİK gelir.",
271
+ sonrakiAdim: "Hocanın yazdığı bölüm metnini rapor_dil_denetle ile denetleyin. Kanıtı olmayan cümle EKSİK kalır.",
272
+ girdi: z.object({
273
+ bolum: z
274
+ .enum(["A", "B", "C", "D"])
275
+ .optional()
276
+ .describe("Yalnız bir ana başlık isteniyorsa 'A', 'B', 'C' ya da 'D'. Verilmezse bütün rapor."),
277
+ }),
278
+ calistir: ({ bolum }) => {
279
+ const c = YOKAK_KIDR_3_2_1;
280
+ const bolumler = c.raporSablonu
281
+ .filter((b) => !bolum || b.kod === bolum)
282
+ .map((b) => {
283
+ const kokler = b.olcutKodlari.map((k) => olcutBul(c, k));
284
+ const olcutler = kokler.flatMap((k) => tumOlcutler(k.altOlcutler));
285
+ return {
286
+ kod: b.kod,
287
+ baslik: b.baslik,
288
+ durum: "EKSİK",
289
+ altBasliklar: olcutler.map((o) => duzey(o.kod) === "olcut"
290
+ ? { kod: o.kod, baslik: o.baslik, tur: "olcut" }
291
+ : {
292
+ kod: o.kod,
293
+ baslik: o.baslik,
294
+ tur: "alt_olcut",
295
+ durum: "EKSİK",
296
+ gerekenKanitlar: o.ornekKanitlar?.length ? o.ornekKanitlar : [DOGRULANMADI],
297
+ kaynakSayfa: o.kaynakSayfa,
298
+ }),
299
+ };
300
+ });
301
+ return {
302
+ sonuc: {
303
+ sablon: `${c.ad} ${c.surum}`,
304
+ kural: "Bu iskelet yalnız yapıdır. Her olgusal cümle bir kanıta (belge ve sayfa) bağlanmalıdır; bağlanamayan içerik EKSİK kalır, yapılmış gibi yazılmaz.",
305
+ bolumler,
306
+ },
307
+ kaynak: [
308
+ belgeKaynagi(c, c.kaynak?.dosya, 8),
309
+ belgeKaynagi(YOKAK_KURUMSAL_3_3, YOKAK_KURUMSAL_3_3.kaynak?.dosya, null),
310
+ ],
311
+ };
312
+ },
313
+ });
314
+ // ---------------------------------------------------------------- ÇK/PÇ sağlanma hesabı
315
+ const kimlik = z.string().trim().min(1).max(30);
316
+ const ANONIM = /^(?![0-9]{7,}$)[\p{L}\p{N}_.-]{1,24}$/u;
317
+ const ckPcHesapla = arac({
318
+ ad: "ck_pc_hesapla",
319
+ kisiselVeriKapsami: "tam",
320
+ baslik: "ÇK ve PÇ sağlanma düzeyi hesabı",
321
+ aciklama: "Takma adlı puan tablosundan ders öğrenme çıktısı (ÇK) başarısını ve program çıktısı (PÇ) sağlanma düzeyini hesaplar. Öğrenci adı ve numarası kabul edilmez; yalnız toplu sonuç döner.",
322
+ sonrakiAdim: "Sonucu tablo olarak gösterin, sayıları yalnız bu yanıttan alın. Eşiğin altında kalan çıktılar için hocaya sorun: 1) iyileştirme notu yaz 2) başka eşikle yeniden hesapla 3) bitir.",
323
+ girdi: z.object({
324
+ dersKodu: kimlik,
325
+ donem: z.string().trim().min(1).max(40).describe("ör. '2025-2026 Güz'"),
326
+ ciktilar: z
327
+ .array(z.object({ kod: kimlik, metin: z.string().max(1000).optional() }))
328
+ .min(1)
329
+ .max(40),
330
+ araclar: z
331
+ .array(z.object({
332
+ id: kimlik,
333
+ tur: z
334
+ .enum([
335
+ "ara_sinav",
336
+ "yariyil_sonu",
337
+ "butunleme",
338
+ "kisa_sinav",
339
+ "odev",
340
+ "proje",
341
+ "uygulama",
342
+ "laboratuvar",
343
+ "sunum",
344
+ "diger",
345
+ ])
346
+ .default("diger"),
347
+ ad: z.string().max(100).default(""),
348
+ agirlik: z.number().min(0).max(100).describe("Ders notundaki yüzde"),
349
+ sorular: z
350
+ .array(z.object({
351
+ no: kimlik,
352
+ tamPuan: z.number().positive().max(1000),
353
+ eslemeler: z.array(z.object({ ciktiKod: kimlik, agirlik: z.number().positive().max(100) })).max(40),
354
+ }))
355
+ .max(200),
356
+ }))
357
+ .min(1)
358
+ .max(30),
359
+ puanlar: z
360
+ .array(z.object({
361
+ ogrenci: z
362
+ .string()
363
+ .regex(ANONIM, "Öğrenci yerine takma ad kullanın (ör. o1). Numara ya da ad kabul edilmez."),
364
+ aracId: kimlik,
365
+ soruNo: kimlik,
366
+ puan: z.number().min(0).max(1000).nullable(),
367
+ }))
368
+ .min(1)
369
+ .max(50_000),
370
+ matris: z
371
+ .record(kimlik, z.record(kimlik, z.number().int().min(0).max(5)))
372
+ .optional()
373
+ .describe("ÇK kodu → PÇ kodu → katkı (0: ilişkisiz, 1-5). Verilmezse PÇ sağlanması boş döner."),
374
+ esik: z.number().min(0).max(100).default(60).describe("Başarı eşiği (0-100)"),
375
+ }),
376
+ calistir: (g) => {
377
+ const matris = g.matris
378
+ ? Object.fromEntries(Object.entries(g.matris).map(([ck, satir]) => [
379
+ ck,
380
+ Object.fromEntries(Object.entries(satir).map(([pc, v]) => [
381
+ pc,
382
+ v === 0 ? { tur: "iliskisiz" } : { tur: "puan", puan: v },
383
+ ])),
384
+ ]))
385
+ : undefined;
386
+ let s;
387
+ try {
388
+ s = dersiOlc({ dersKodu: g.dersKodu, donem: g.donem, ciktilar: g.ciktilar, araclar: g.araclar, puanlar: g.puanlar }, { esik: g.esik, ...(matris ? { matris } : {}) });
389
+ }
390
+ catch (e) {
391
+ throw new AracHatasi(e instanceof Error ? e.message : "Hesap yapılamadı. Girdiyi denetleyin.");
392
+ }
393
+ const { notlar: _notlar, ...notIstatistikleri } = s.notIstatistikleri;
394
+ return {
395
+ sonuc: {
396
+ dersKodu: s.dersKodu,
397
+ donem: s.donem,
398
+ yontem: s.yontem,
399
+ esik: s.esik,
400
+ ogrenciSayisi: s.ogrenciSayisi,
401
+ ckBasarilari: s.ckBasarilari.map(({ ogrenciler: _o, ...c }) => c),
402
+ pcSaglanmasi: s.pcSaglanmasi,
403
+ notIstatistikleri,
404
+ bulgular: s.bulgular,
405
+ hesapSurumu: s.hesapSurumu,
406
+ girdiOzeti: s.girdiOzeti,
407
+ not: "Sayılar belirlenimci hesaptır; aynı girdi her zaman aynı sonucu verir. Harf tablosu örnektir, kurumun tablosu değildir.",
408
+ },
409
+ kaynak: [
410
+ KOD_KAYNAGI("packages/olcme", `Akredit ölçme motoru ${HESAP_SURUMU}`),
411
+ KOD_KAYNAGI("docs/olcme-yontemi.md", "Ölçme yöntemi"),
412
+ ],
413
+ };
414
+ },
415
+ });
416
+ // ---------------------------------------------------------------- Rapor dil denetimi
417
+ const raporDilDenetle = arac({
418
+ ad: "rapor_dil_denetle",
419
+ baslik: "Rapor dil denetimi",
420
+ aciklama: "Rapor metnindeki dil sorunlarını işaretler: kanıtsız üstünlük, ölçüsüz nicelik, öznesiz eylem, dönem ve tarih tutarsızlığı. Metni değiştirmez.",
421
+ sonrakiAdim: "Her bulgu için 2-3 numaralı düzeltme seçeneği sunun (uydurma sayı ya da kanıt eklemeden); hoca seçince düzeltilmiş metni yeniden denetleyin.",
422
+ girdi: z.object({
423
+ metin: z.string().min(1).max(60_000),
424
+ donem: z
425
+ .string()
426
+ .regex(/^\d{4}-\d{4}$/u)
427
+ .optional()
428
+ .describe("Rapor dönemi, ör. '2025-2026'"),
429
+ raporTarihi: z
430
+ .string()
431
+ .regex(/^\d{4}-\d{2}-\d{2}$/u)
432
+ .optional()
433
+ .describe("YYYY-AA-GG"),
434
+ }),
435
+ calistir: ({ metin, donem, raporTarihi }) => {
436
+ const bulgular = dilDenetle(metin, { ...(donem ? { donem } : {}), ...(raporTarihi ? { raporTarihi } : {}) });
437
+ return {
438
+ sonuc: {
439
+ bulguSayisi: bulgular.length,
440
+ yuksekOnemli: bulgular.filter((b) => b.onem === "yuksek").length,
441
+ bulgular,
442
+ },
443
+ kaynak: [KOD_KAYNAGI("packages/cekirdek/src/rapor/dil.ts", "Akredit rapor dil kuralları")],
444
+ };
445
+ },
446
+ });
447
+ export const ACIK_ARACLAR = [
448
+ olcutAra,
449
+ olcutGetir,
450
+ olgunlukDuzeyleri,
451
+ ozDegerlendirmeIskeleti,
452
+ bolognaDenetleAraci,
453
+ ...BOLOGNA_ARACLARI,
454
+ kaynakBicimleAraci,
455
+ kaynakDogrulaAraci,
456
+ notTablosuAyristirAraci,
457
+ ckPcHesapla,
458
+ raporDilDenetle,
459
+ kurulumYardimiAraci,
460
+ engelCozAraci,
461
+ ];
@@ -0,0 +1,209 @@
1
+ import { type Bulgu } from "../../../packages/cekirdek/src/index.js";
2
+ import { z } from "zod";
3
+ import { type AcikArac } from "./temel.ts";
4
+ export declare const ALAN_KODLARI: readonly ["amac", "icerik", "yontem", "notlar", "onKosul", "ciktilar", "degerlendirme", "isyuku", "dersYapisi", "haftalar", "katki", "ska", "kaynaklar", "yetkililer"];
5
+ export type AlanKodu = (typeof ALAN_KODLARI)[number];
6
+ interface AlanBilgisi {
7
+ ad: string;
8
+ /** OBS düzenleme ekranındaki sekme (Proliz). */
9
+ sekme: string;
10
+ kurallar: string[];
11
+ sinir?: Record<string, number | string>;
12
+ kaliplar: string[];
13
+ yasaklar: string[];
14
+ /** MCP bu alanı taşıyabilir mi (kişisel veri sınırı). */
15
+ mcpTasir: boolean;
16
+ }
17
+ /** Akredit'in Bologna doldurma kuralları (packages/cekirdek/src/bologna/taslak.ts, apps/cli/skills/bologna-doldur). */
18
+ export declare const ALANLAR: Record<AlanKodu, AlanBilgisi>;
19
+ /** Bloom'un yenilenmiş sınıflaması düzeylerine göre örnek fiiller. Akredit örneğidir, resmî liste değildir. */
20
+ export declare const BLOOM_FIILLERI: {
21
+ duzey: string;
22
+ fiiller: string[];
23
+ }[];
24
+ /** Bir taslak bulgusunun hangi alana ait olduğu. "genel" birden çok alana değen bulgudur. */
25
+ export declare function bulguAlani(b: Bulgu): AlanKodu | "temel" | "genel";
26
+ declare const TaslakAlanlari: z.ZodObject<{
27
+ amac: z.ZodOptional<z.ZodObject<{
28
+ tr: z.ZodString;
29
+ en: z.ZodOptional<z.ZodString>;
30
+ }, z.core.$strip>>;
31
+ icerik: z.ZodOptional<z.ZodObject<{
32
+ tr: z.ZodString;
33
+ en: z.ZodOptional<z.ZodString>;
34
+ }, z.core.$strip>>;
35
+ yontem: z.ZodOptional<z.ZodObject<{
36
+ tr: z.ZodString;
37
+ en: z.ZodOptional<z.ZodString>;
38
+ }, z.core.$strip>>;
39
+ notlar: z.ZodOptional<z.ZodObject<{
40
+ tr: z.ZodString;
41
+ en: z.ZodOptional<z.ZodString>;
42
+ }, z.core.$strip>>;
43
+ onKosul: z.ZodOptional<z.ZodString>;
44
+ ciktilar: z.ZodOptional<z.ZodArray<z.ZodObject<{
45
+ kod: z.ZodString;
46
+ tr: z.ZodString;
47
+ en: z.ZodOptional<z.ZodString>;
48
+ tur: z.ZodEnum<{
49
+ Bilgi: "Bilgi";
50
+ Beceri: "Beceri";
51
+ Yetkinlik: "Yetkinlik";
52
+ }>;
53
+ }, z.core.$strip>>>;
54
+ degerlendirme: z.ZodOptional<z.ZodArray<z.ZodObject<{
55
+ ad: z.ZodString;
56
+ sayi: z.ZodNumber;
57
+ katki: z.ZodNumber;
58
+ }, z.core.$strip>>>;
59
+ isyuku: z.ZodOptional<z.ZodArray<z.ZodObject<{
60
+ ad: z.ZodString;
61
+ sayi: z.ZodNumber;
62
+ sure: z.ZodNumber;
63
+ }, z.core.$strip>>>;
64
+ dersYapisi: z.ZodOptional<z.ZodArray<z.ZodObject<{
65
+ alan: z.ZodString;
66
+ yuzde: z.ZodNumber;
67
+ }, z.core.$strip>>>;
68
+ haftalar: z.ZodOptional<z.ZodArray<z.ZodObject<{
69
+ hafta: z.ZodNumber;
70
+ konu: z.ZodObject<{
71
+ tr: z.ZodString;
72
+ en: z.ZodOptional<z.ZodString>;
73
+ }, z.core.$strip>;
74
+ onHazirlik: z.ZodString;
75
+ dokuman: z.ZodString;
76
+ }, z.core.$strip>>>;
77
+ katki: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodNumber, z.ZodNull, z.ZodLiteral<"">]>>>>;
78
+ ska: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
79
+ kaynaklar: z.ZodOptional<z.ZodArray<z.ZodString>>;
80
+ kaynakSayisi: z.ZodOptional<z.ZodNumber>;
81
+ }, z.core.$strip>;
82
+ type TaslakAlanlariT = z.infer<typeof TaslakAlanlari>;
83
+ export interface Yetkili {
84
+ /** Sayfadaki etiket, ör. "Dersi Verenler". */
85
+ rol: string;
86
+ /** Sayfadaki değer, olduğu gibi. */
87
+ deger: string;
88
+ }
89
+ declare const DersTemeli: z.ZodObject<{
90
+ kod: z.ZodOptional<z.ZodString>;
91
+ ad: z.ZodOptional<z.ZodString>;
92
+ akts: z.ZodOptional<z.ZodNumber>;
93
+ tul: z.ZodOptional<z.ZodString>;
94
+ bolen: z.ZodDefault<z.ZodNumber>;
95
+ yetkililer: z.ZodOptional<z.ZodArray<z.ZodObject<{
96
+ rol: z.ZodString;
97
+ deger: z.ZodString;
98
+ }, z.core.$strip>>>;
99
+ }, z.core.$strip>;
100
+ type DersTemeliT = z.infer<typeof DersTemeli>;
101
+ /** Taslak alanlarını cekirdek kurallarıyla denetler; yalnız verilen alanların bulgularını alan alan döndürür. */
102
+ export declare function alanBulgulari(ders: DersTemeliT, alanlar: TaslakAlanlariT, s: {
103
+ ingilizce: boolean;
104
+ programCiktilari?: string[] | undefined;
105
+ }): Map<AlanKodu | "genel", Bulgu[]>;
106
+ /** Bütün sayılar burada hesaplanır; asistan toplam yazmaz (ilke 2). */
107
+ export declare function bolognaHesabi(ders: DersTemeliT, alanlar: TaslakAlanlariT): {
108
+ isyuku: {
109
+ satirlar: {
110
+ ad: string;
111
+ sayi: number;
112
+ sure: number;
113
+ toplam: number;
114
+ }[];
115
+ toplam: number;
116
+ hedef: number | null;
117
+ fark: number | null;
118
+ aktsBasinaSaat: number | null;
119
+ dersSuresiHaftalikBeklenen: number | null;
120
+ dersSuresiHaftalikVerilen: number | null;
121
+ aciklama: string;
122
+ } | null;
123
+ degerlendirmeToplami: number | null;
124
+ dersYapisiToplami: number | null;
125
+ ciktiSayisi: number | null;
126
+ haftaSayisi: number | null;
127
+ };
128
+ export declare const bolognaDenetleAraci: AcikArac<z.ZodObject<{
129
+ ders: z.ZodObject<{
130
+ kod: z.ZodString;
131
+ ad: z.ZodOptional<z.ZodString>;
132
+ zorunlu: z.ZodDefault<z.ZodBoolean>;
133
+ yariyil: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
134
+ tul: z.ZodOptional<z.ZodString>;
135
+ kredi: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
136
+ akts: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
137
+ guncelleme: z.ZodOptional<z.ZodString>;
138
+ amac: z.ZodOptional<z.ZodString>;
139
+ icerik: z.ZodOptional<z.ZodString>;
140
+ yontem: z.ZodOptional<z.ZodString>;
141
+ notlar: z.ZodOptional<z.ZodString>;
142
+ kaynakSayisi: z.ZodOptional<z.ZodNumber>;
143
+ kaynaklar: z.ZodOptional<z.ZodArray<z.ZodString>>;
144
+ yetkililer: z.ZodOptional<z.ZodArray<z.ZodObject<{
145
+ rol: z.ZodString;
146
+ deger: z.ZodString;
147
+ }, z.core.$strip>>>;
148
+ ciktilar: z.ZodDefault<z.ZodArray<z.ZodObject<{
149
+ kod: z.ZodString;
150
+ metin: z.ZodString;
151
+ }, z.core.$strip>>>;
152
+ degerlendirme: z.ZodDefault<z.ZodArray<z.ZodObject<{
153
+ ad: z.ZodString;
154
+ sayi: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
155
+ katki: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
156
+ }, z.core.$strip>>>;
157
+ isyuku: z.ZodDefault<z.ZodArray<z.ZodObject<{
158
+ ad: z.ZodString;
159
+ sayi: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
160
+ sure: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
161
+ toplam: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
162
+ }, z.core.$strip>>>;
163
+ dersYapisi: z.ZodDefault<z.ZodArray<z.ZodObject<{
164
+ alan: z.ZodString;
165
+ yuzde: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
166
+ }, z.core.$strip>>>;
167
+ haftalar: z.ZodDefault<z.ZodNumber>;
168
+ katki: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>>>;
169
+ }, z.core.$strip>;
170
+ programCiktilari: z.ZodOptional<z.ZodArray<z.ZodObject<{
171
+ kod: z.ZodString;
172
+ metin: z.ZodString;
173
+ }, z.core.$strip>>>;
174
+ matrisSatiri: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
175
+ aktsSaat: z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
176
+ }, z.core.$strip>>;
177
+ /** Proliz sayfası mı: üst bilgi tablosu ("Yarıyıl, Kodu") ya da program çıktıları tablosu. */
178
+ export declare function prolizMi(html: string): boolean;
179
+ /**
180
+ * Yapıştırılan HTML'den görev satırlarını (Dersi Verenler, Yardımcılar, Koordinatör) yetkililer listesine, kaynak
181
+ * satırlarını künye listesine ayırır. Değerler olduğu gibi korunur; hiçbir şey atılmaz.
182
+ */
183
+ export declare function bolognaSatirAyikla(html: string): {
184
+ html: string;
185
+ yetkililer: Yetkili[];
186
+ kaynaklar: string[];
187
+ };
188
+ /** bologna_ayristir ön ayıklaması: yalnız giriş bilgisi (oturum kimliği, parola kutusu, çerez) atılır. */
189
+ export declare function ayristirOnAyikla(g: unknown): {
190
+ girdi: unknown;
191
+ atilan: string[];
192
+ ileti?: string;
193
+ };
194
+ /** Hedefe tam eşit iş yükü dağılımları (deterministik). Son tek satır artığı alır, böylece toplam tam tutar. */
195
+ export declare function isYukuDagilimlari(akts: number, tul: string, hafta?: number, bolen?: number): {
196
+ secenek: number;
197
+ ad: string;
198
+ aciklama: string;
199
+ isyuku: {
200
+ ad: string;
201
+ sayi: number;
202
+ sure: number;
203
+ }[];
204
+ toplam: number;
205
+ hedef: number;
206
+ tamEsit: boolean;
207
+ }[];
208
+ export declare const BOLOGNA_ARACLARI: readonly AcikArac[];
209
+ export {};