@devoplus/one-sdk 0.0.0-stage → 0.2.0-next.117

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 (139) hide show
  1. package/CHANGELOG.md +268 -0
  2. package/README.md +893 -2
  3. package/bin/accessRequest.d.mts +96 -0
  4. package/bin/accessRequest.mjs +340 -0
  5. package/bin/appOps.d.mts +97 -0
  6. package/bin/appOps.mjs +336 -0
  7. package/bin/dataCommand.mjs +131 -0
  8. package/bin/devConfig.mjs +132 -0
  9. package/bin/one.mjs +341 -0
  10. package/bin/session.mjs +239 -0
  11. package/dist/agentInput.d.ts +9 -0
  12. package/dist/agentInput.d.ts.map +1 -0
  13. package/dist/agentInput.js +102 -0
  14. package/dist/agentInput.js.map +1 -0
  15. package/dist/agentTools.d.ts +83 -0
  16. package/dist/agentTools.d.ts.map +1 -0
  17. package/dist/agentTools.js +164 -0
  18. package/dist/agentTools.js.map +1 -0
  19. package/dist/ai.d.ts +67 -0
  20. package/dist/ai.d.ts.map +1 -0
  21. package/dist/ai.js +129 -0
  22. package/dist/ai.js.map +1 -0
  23. package/dist/audit.d.ts +21 -0
  24. package/dist/audit.d.ts.map +1 -0
  25. package/dist/audit.js +58 -0
  26. package/dist/audit.js.map +1 -0
  27. package/dist/backend.d.ts +27 -0
  28. package/dist/backend.d.ts.map +1 -0
  29. package/dist/backend.js +63 -0
  30. package/dist/backend.js.map +1 -0
  31. package/dist/cache.d.ts +20 -0
  32. package/dist/cache.d.ts.map +1 -0
  33. package/dist/cache.js +84 -0
  34. package/dist/cache.js.map +1 -0
  35. package/dist/client.d.ts +147 -0
  36. package/dist/client.d.ts.map +1 -0
  37. package/dist/client.js +469 -0
  38. package/dist/client.js.map +1 -0
  39. package/dist/components.d.ts +235 -0
  40. package/dist/components.d.ts.map +1 -0
  41. package/dist/components.js +1491 -0
  42. package/dist/components.js.map +1 -0
  43. package/dist/context.d.ts +110 -0
  44. package/dist/context.d.ts.map +1 -0
  45. package/dist/context.js +126 -0
  46. package/dist/context.js.map +1 -0
  47. package/dist/data/crud.d.ts +74 -0
  48. package/dist/data/crud.d.ts.map +1 -0
  49. package/dist/data/crud.js +614 -0
  50. package/dist/data/crud.js.map +1 -0
  51. package/dist/data/ddl.d.ts +76 -0
  52. package/dist/data/ddl.d.ts.map +1 -0
  53. package/dist/data/ddl.js +362 -0
  54. package/dist/data/ddl.js.map +1 -0
  55. package/dist/data/fold.d.ts +14 -0
  56. package/dist/data/fold.d.ts.map +1 -0
  57. package/dist/data/fold.js +76 -0
  58. package/dist/data/fold.js.map +1 -0
  59. package/dist/data/model.d.ts +113 -0
  60. package/dist/data/model.d.ts.map +1 -0
  61. package/dist/data/model.js +408 -0
  62. package/dist/data/model.js.map +1 -0
  63. package/dist/data/values.d.ts +29 -0
  64. package/dist/data/values.d.ts.map +1 -0
  65. package/dist/data/values.js +152 -0
  66. package/dist/data/values.js.map +1 -0
  67. package/dist/dexa.d.ts +44 -0
  68. package/dist/dexa.d.ts.map +1 -0
  69. package/dist/dexa.js +74 -0
  70. package/dist/dexa.js.map +1 -0
  71. package/dist/dexaCommand.d.ts +116 -0
  72. package/dist/dexaCommand.d.ts.map +1 -0
  73. package/dist/dexaCommand.js +226 -0
  74. package/dist/dexaCommand.js.map +1 -0
  75. package/dist/export/columns.d.ts +62 -0
  76. package/dist/export/columns.d.ts.map +1 -0
  77. package/dist/export/columns.js +127 -0
  78. package/dist/export/columns.js.map +1 -0
  79. package/dist/export/csv.d.ts +10 -0
  80. package/dist/export/csv.d.ts.map +1 -0
  81. package/dist/export/csv.js +30 -0
  82. package/dist/export/csv.js.map +1 -0
  83. package/dist/export/report.d.ts +19 -0
  84. package/dist/export/report.d.ts.map +1 -0
  85. package/dist/export/report.js +91 -0
  86. package/dist/export/report.js.map +1 -0
  87. package/dist/export/response.d.ts +14 -0
  88. package/dist/export/response.d.ts.map +1 -0
  89. package/dist/export/response.js +70 -0
  90. package/dist/export/response.js.map +1 -0
  91. package/dist/export/xlsx.d.ts +15 -0
  92. package/dist/export/xlsx.d.ts.map +1 -0
  93. package/dist/export/xlsx.js +167 -0
  94. package/dist/export/xlsx.js.map +1 -0
  95. package/dist/export/zip.d.ts +7 -0
  96. package/dist/export/zip.d.ts.map +1 -0
  97. package/dist/export/zip.js +83 -0
  98. package/dist/export/zip.js.map +1 -0
  99. package/dist/files.d.ts +52 -0
  100. package/dist/files.d.ts.map +1 -0
  101. package/dist/files.js +137 -0
  102. package/dist/files.js.map +1 -0
  103. package/dist/index.d.ts +31 -0
  104. package/dist/index.d.ts.map +1 -0
  105. package/dist/index.js +35 -0
  106. package/dist/index.js.map +1 -0
  107. package/dist/jobs.d.ts +57 -0
  108. package/dist/jobs.d.ts.map +1 -0
  109. package/dist/jobs.js +157 -0
  110. package/dist/jobs.js.map +1 -0
  111. package/dist/log.d.ts +22 -0
  112. package/dist/log.d.ts.map +1 -0
  113. package/dist/log.js +107 -0
  114. package/dist/log.js.map +1 -0
  115. package/dist/notify.d.ts +41 -0
  116. package/dist/notify.d.ts.map +1 -0
  117. package/dist/notify.js +11 -0
  118. package/dist/notify.js.map +1 -0
  119. package/dist/org.d.ts +184 -0
  120. package/dist/org.d.ts.map +1 -0
  121. package/dist/org.js +114 -0
  122. package/dist/org.js.map +1 -0
  123. package/dist/people.d.ts +39 -0
  124. package/dist/people.d.ts.map +1 -0
  125. package/dist/people.js +88 -0
  126. package/dist/people.js.map +1 -0
  127. package/dist/problem.d.ts +12 -0
  128. package/dist/problem.d.ts.map +1 -0
  129. package/dist/problem.js +33 -0
  130. package/dist/problem.js.map +1 -0
  131. package/dist/runtime.d.ts +92 -0
  132. package/dist/runtime.d.ts.map +1 -0
  133. package/dist/runtime.js +8 -0
  134. package/dist/runtime.js.map +1 -0
  135. package/dist/scenarios.d.ts +125 -0
  136. package/dist/scenarios.d.ts.map +1 -0
  137. package/dist/scenarios.js +251 -0
  138. package/dist/scenarios.js.map +1 -0
  139. package/package.json +55 -3
package/CHANGELOG.md ADDED
@@ -0,0 +1,268 @@
1
+ # @devoplus/one-sdk — sürüm geçmişi
2
+
3
+ Biçim: [Keep a Changelog](https://keepachangelog.com/tr/1.1.0/); sürümleme [SemVer](https://semver.org/lang/tr/).
4
+ `0.x` sürümlerinde küçük sürüm (minor) artışı kırıcı değişiklik taşıyabilir; kırıcı her değişiklik burada
5
+ **Kırıcı** başlığıyla yazılır.
6
+
7
+ ## [0.2.0] — npm'e çıkan ilk sürüm (kararlı yayın bekliyor)
8
+
9
+ > 0.1.0 npm'e hiç yayımlanmadı: npm'de görünen ilk sürüm 0.2.0'dır (karar defteri D-94, 20.10.2026). `test` dalından
10
+ > `0.2.0-next.<n>` ön sürümleri `next` etiketiyle çıkar; kararlı 0.2.0 `main`'den `latest` etiketiyle çıkar ve tarihi o
11
+ > zaman yazılır. Aşağıdaki maddeler 0.1.0'dan bu yana birikenlerdir; kararlı yayına kadar yeni maddeler bu başlığa eklenir.
12
+
13
+ ### Değişti (C7 — DEXA sorgusunda uygulamanın bağlam kodu göndermesi, 18.10.2026)
14
+
15
+ - `queryDexa` / `buildDexaQueryRequest` artık `UserCode` · `CompanyCode` · `CostCenterCode`'u kabul eder (ad harf
16
+ duyarsız tanınır, olduğu gibi gönderilir). Sunucu bu kodları yalnız kurulumda yönetici **"kodları uygulama belirler"**
17
+ onayını verdiyse kabul eder (yoksa bugünkü gibi 400 `ONE-APP-E-026`); onaylıysa her kipte (kişi · ajan · arka plan
18
+ işi) gönderilebilir ve kişi ile şirket kodu kurulumun portalına karşı doğrulanır. Kod gönderilmezse kişi/ajan kipinde
19
+ oturumdan çözülür, arka plan işinde sorgu reddedilir. `CostCenterCode` bildiren sorgular artık çalışır.
20
+ - **Yeni hata `ONE-SDK-E-140`:** bu üç koddan birinin değeri boş dize ya da yalnız boşluksa istek gönderilmeden
21
+ reddedilir — boş değer ERP'ye gitmez (sunucu da reddeder). Sıradan parametrelerde boş değer serbest kalır.
22
+ - Yeni sabit `DEXA_APP_CONTEXT_PARAMETERS` (`UserCode` · `CompanyCode` · `CostCenterCode`).
23
+ - **Kırıcı:** `DEXA_RESERVED_PARAMETERS` artık yalnız `['LangCode']`'dur (platformun doldurduğu, uygulamanın
24
+ gönderemediği parametre; `ONE-SDK-E-043`). Bu sabitten "gönderilmeyecek kodlar" listesi kuran kod üç kodu artık
25
+ içermez. DEXA işlemleri (`runDexaCommand`) değişmedi.
26
+
27
+ ### Eklendi (C6 — arka plan işinde ve ajan aracında Devoplus servisleri, 18.10.2026)
28
+
29
+ - **Arka plan işi servisleri:** manifest `jobs.services` (`mail.execute` · `sms.execute` · `push.execute` · `dexa.read`
30
+ · `ai.use`; her biri `scopes`'ta da beyanlı) ile kuyruk ve zamanlanmış iş Devoplus servislerini **uygulamanın
31
+ kimliğiyle** çağırabilir. Beyan istektir: servis kurulumda portal yöneticisi onaylamadıkça açılmaz. DEXA'ya yazma bu
32
+ yolla açılmaz.
33
+ - **Ajan aracında servisler:** araç işleyicisi servisleri aracı çağıran kişi adına çağırabilir; süreli onay gerektiren
34
+ scope'lar (e-posta · SMS · mobil bildirim · DEXA'ya yazma) bu yolda kullanılamaz. Araç bağlamında `ctx.admin` (kişi
35
+ kurulumun portalının şirket yöneticisi) ve `ctx.actor` (Vekalet / Yerine Görüntüle) dolu gelir.
36
+ - `OneContext.mode` (`'user' | 'job' | 'agent'`), `OneContext.admin`, `OneContext.jobServices`; tip `OneRequestMode`;
37
+ `requireServiceScope(ctx, scope)`. `completeAi` artık `requireServiceScope` kullanır: zamanlanmış işte oturum ve
38
+ belirteç olmadan çalışır.
39
+
40
+ ### Eklendi (S10 — sekme başına izin, 18.10.2026)
41
+
42
+ - Manifest `navigation[].permission` (uygulamanın beyan edilmiş izin kodu): sekme yalnız izni taşıyana ve yöneticiye
43
+ görünür. Köprüye `one.setNavigationAccess({ permissions, admin })` eklendi; izinli sekmeler erişim bildirilene kadar
44
+ menüye konmaz, izin kodu Portal'a gitmez (Portal sözleşmesi `{ path, label }` değişmedi; `one:navigation` yeniden
45
+ gönderilebilir). Sunucu yardımcıları: `visibleNavigation`, `NAVIGATION_PERMISSION_RE`, tip `OneNavigationAccess`.
46
+
47
+ ### Değişti (S14 · S15 — veri modeli, 18.10.2026)
48
+
49
+ - **Seçim alanında veritabanı kısıtı yok:** `one data generate` seçim (`choice`) kolonuna CHECK yazmaz; seçenek denetimi
50
+ `createCrudHandler`'dadır (değişmedi). Seçim alanına yeni değer eklemek artık migration gerektirmez — tipler ve anlık
51
+ görüntü yenilenir. Değer kaldırmak reddedilir. Önceki sürümün kurduğu tablolarda kısıt durur: anlık görüntü (`v: 2`)
52
+ o alanları `choiceChecks` ile taşır ve onlara değer eklemek yine reddedilir.
53
+ - **Türkçe katlanmış arama:** her metin alanı (`text` · `longText`) için `<alan>_fold` arama kolonu üretilir;
54
+ `createCrudHandler` onu yazar, `alan.contains` ve `q` onda arar (büyük/küçük harf ve ç ğ ı İ ö ş ü duyarsız). Kolonu
55
+ boş kayıt da bulunur. Yeni dışa aktarımlar: `foldSearchText`, `FOLD_COLUMN_SUFFIX`, `DATA_MAX_COLUMNS`,
56
+ `DATA_SNAPSHOT_VERSION`, `DataLegacy`.
57
+ - **Kırıcı:** alan adı `_fold` ile bitemez; tabloda en çok 100 kolon (arama kolonları dahil) — çok sayıda metin alanı
58
+ olan varlık (47'den fazla) reddedilir. Eski anlık görüntüyle (`v: 1`) ilk `one data generate` arama kolonlarını ekleyen
59
+ yeni bir migration yazar; o üretim yapılmadan `one data generate --check` "güncel değil" der.
60
+
61
+ ### Eklendi (D-86 · D-87 — yayın, önizleme, geri alma ve kullanım panosu; ⚠️ öneri, geliştirici onayı bekliyor)
62
+
63
+ - `one publish` (test ortamına yayın; adres paylaşılabilir önizleme), `one promote` (bir sonraki ortama), `one rollback
64
+ [--to <x.y.z>] --yes` (önceki sürüme; `--yes` olmadan istek gönderilmez), `one deployments` (yayın istekleri) ve
65
+ `one status [--days 7]` (kullanım ve hata özeti). Hepsi `[--portal <anahtar>]` · `--app` · `--json` alır.
66
+ - Ortak istemci `@devoplus/one-sdk/app-ops`: `requestDeployment`, `listDeployments`, `getInsights`,
67
+ `describeDeployment`, `describeDeploymentResult`, `describeInsights`, `previewAddress`, `parseOpsArgs` ve
68
+ `AppOpsError`. Kısa ad, portal anahtarı, sürüm ve gün sayısı istek gönderilmeden denetlenir.
69
+ - ⚠️ Sunucu uçları henüz yayında değildir; o ortamda yanıt "yapılandırılmamış" ya da bir hata olur.
70
+
71
+ ### Düzeltildi (D-82 — hazır liste bileşeni ile kayıt uçları aynı dili konuşur)
72
+
73
+ - `createCrudHandler` uçları hazır liste bileşeninin (`<one-table src>`) sorgu lehçesini de kabul eder: `limit` ·
74
+ `page` · `cursor` (sayfa numarası) · `sort` + `order` · `q` (metin alanlarının herhangi birinde içerir) ·
75
+ `<alan>From` / `<alan>To` · `lang` · `format=xlsx|csv` (listeyle aynı adreste dışa aktarma). Önce bileşen
76
+ `src="/api/<varlık>"` ile bağlanınca her istek 400 "Bilinmeyen sorgu parametresi" alıyordu. Liste yanıtı ayrıca
77
+ `nextCursor` taşır (son sayfada `null`). Eski lehçe (`_page` · `_size` · `_sort` · `.from` / `.to` · `export.xlsx`)
78
+ aynen çalışır; lehçe adı modeldeki bir alanın adıysa alan süzgeci önceliklidir. Kırıcı değil.
79
+
80
+ ### Eklendi (D-88 — yapay zekâ çift yönlü; ⚠️ öneri, geliştirici onayı bekliyor)
81
+
82
+ - **Yapay zekâ servisi:** `completeAi(api, ctx, istek)` / `ai.complete` → `One/services/ai` (scope `ai.use`): özet,
83
+ sınıflandırma, alan çıkarma, metin üretme, sohbet. İstemci sınırları (`ONE-SDK-E-080…086`) ve `OneAiRequest` /
84
+ `OneAiResult` tipleri.
85
+ - **Devoplus yapay zekâsına açılan araçlar:** `defineAgentTools`, `handleAgentRequest` (`POST /__one/agent/<ad>`; imzalı
86
+ çağrı işareti, manifest beyanı, oturum, Vekalet kapısı, izin ve girdi şeması denetimi), `agentManifestResponse`
87
+ (`/.well-known/one-agent.json` + `/.well-known/one-agent.md`), `validateAgentInput` ve `ONE-SDK-E-090…096`.
88
+
89
+ ### Eklendi (D-80 — zamanlanmış görev ve kuyruk)
90
+
91
+ - `defineJobs({ schedules, queues })` + `handleJobRequest(request, env, execution, definition?)`: manifest `jobs` ile
92
+ beyan edilen işlerin işleyicileri. Platform işi `POST /__one/jobs/<schedule|queue>/<ad>` ile çağırır; işleyici
93
+ dönerse iş tamam, 4xx `OneError` kalıcı hata, başka hata yeniden denenir. `job.id` her denemede aynıdır.
94
+ - `enqueue(name, body, { delaySeconds })`: kuyruğa ileti bırakır (gövde ≤ 64 KiB, gecikme ≤ 24 saat) → `{ id }`.
95
+ - Tipler `OneJob`, `OneJobHandler`, `OneJobKind`, `OneJobsDefinition`, `EnqueueOptions`, `EnqueueResult`; sabitler
96
+ `JOB_NAME_RE`, `JOB_BODY_MAX_BYTES`, `JOB_DELAY_MAX_SECONDS`, `JOB_PATH_PREFIX`; hata kodları `ONE-SDK-E-070…076`.
97
+ - `readContext` kuyruk işinde (`X-One-Auth: job`) iletiyi bırakan kullanıcının `sub` ve yetki alanlarını `user` olarak
98
+ okur; izin ve yönetici bilgisi taşınmaz. Kırıcı değil.
99
+
100
+ ### Eklendi (D-83 — hazır arayüz bileşenleri)
101
+
102
+ - **`/one-components.js`** (`ONE_COMPONENTS_SCRIPT`; `clientAssetResponse` sunar): bağımlılıksız bileşenler
103
+ `<one-table>` (sıralama, metin süzme, imleçli ya da sayfa numaralı uzak liste, yerel veri, satır seçimi, satır
104
+ tıklama, Excel/CSV dışa aktarma — dosya `one.download` ile), `<one-form>` (alan şeması, Türkçe/İngilizce doğrulama
105
+ iletileri, sunucunun RFC 9457 `errors` alanının alanlara bağlanması, kaydedilmemiş değişiklik bildirimi, başkası adına
106
+ açılmış oturumda salt-okunur), `<one-filter>` (metin, seçim, tarih, tarih aralığı, evet/hayır → tabloya bağlanır),
107
+ `<one-person-picker>` (kişi arama, klavyeyle seçim, çoklu seçim), `<one-file-upload>` (tür/boyut sınırı, ilerleme),
108
+ `<one-chart>` (çubuk/çizgi/pasta SVG, erişilebilir veri tablosu). Metinler Türkçe + İngilizce, tema/dil Portal'dan.
109
+ - **Kişi arama ucu** `peopleSearchHandler(request, env, ctx)` (`/api/one/people`, scope `orgschema.read`): yalnız
110
+ aktif kişiler, ad + unvan + departman (e-posta/telefon dönmez), en çok 20 sonuç; saf `searchPeople`. Hata kodları
111
+ `ONE-SDK-E-090` (arama 2–100 karakter) · `ONE-SDK-E-091` (yalnız GET).
112
+ - Görsel dile bileşen stilleri ve grafik renkleri (`--one-chart-1` … `--one-chart-6`, açık/koyu) eklendi.
113
+ - Bileşen özellik tipleri: `OneTableColumn`, `OneFormField`, `OneFilterField`, `OnePerson`, `OneUploadedFile`,
114
+ `OneChartData`, `OneComponentEventMap` …
115
+ ### Eklendi (D-84 — tanımlayıcı veri modeli; ⚠️ geliştirici onayı bekliyor)
116
+
117
+ - `one.data.json` veri modeli (varlık + alan: metin, uzun metin, sayı, para, tarih, tarih-saat, evet/hayır, seçim, kişi,
118
+ dosya; zorunlu, tekil, dizin, varsayılan) ve doğrulayıcısı `parseDataModel`.
119
+ - `one data generate [--check]`: yalnız ekleyen migration (`migrations/NNNN_one_data.sql`), `src/data/types.ts` ve
120
+ `migrations/.one-data-snapshot.json`. Silme, ad/tür değişikliği, zorunlu yapma ve seçim değeri değişikliği üretilmez,
121
+ komut nedenini söyleyip durur.
122
+ - `createCrudHandler({ model, entity, records, canRead?, canWrite?, actingSessions? })`: sayfalı liste, süzme, sıralama,
123
+ kayıt, güncelleme, yumuşak silme; sunucu tarafı doğrulama ve Türkçe alan hataları (`errors`); `ONE-SDK-E-100…110`.
124
+
125
+ ### Eklendi (D-85 — rapor ve dışa aktarma; ⚠️ geliştirici onayı bekliyor)
126
+
127
+ - `toCsv` (UTF-8 BOM, Türkçede `;` ayırıcı, formül enjeksiyonu koruması), `toXlsx` (bağımlılıksız), `exportResponse`
128
+ (RFC 6266 Türkçe dosya adı), `downloadFileName`, `renderPrintableReport` (betiksiz yazdırma sayfası; PDF tarayıcının
129
+ "PDF olarak kaydet"iyle). `ONE-SDK-E-120…121`.
130
+
131
+ ### Değişti (D-78 d — komut satırı kimliği)
132
+
133
+ - `one login` artık sabit bir istemci kimliği istemez: `--client-id` / `ONE_CLIENT_ID` verilmezse komut kimlik
134
+ sağlayıcıya bir kez kendini kaydeder (dinamik istemci kaydı, yalnız cihaz kodu + yenileme izni, sırsız) ve kimliği
135
+ bu bilgisayarda ortam başına saklar (`~/.config/devoplus-one/clients.json`, yalnız sizin okuyabildiğiniz dosya).
136
+ Saklanan kayıt kimlik sağlayıcıda geçersizleşmişse komut bir kez yeniden kaydolur.
137
+ - İstenen kapsam daraldı: `openid profile email offline_access onedev.write`. Bu oturum yalnız erişim talebi
138
+ komutlarına (`one request`, `one requests`) yeter; portal verisine erişmez. (D-86 · D-87 ile yayın ve kullanım
139
+ panosu komutları da bu oturumla çalışır.)
140
+
141
+ ### Eklendi (D-75 — erişim talebi)
142
+
143
+ - `one login` (tarayıcıda kod onayıyla giriş), `one logout`, `one request <tür>`, `one requests [kimlik]`.
144
+ - `@devoplus/one-sdk/access-request` alt yolu: talep gövdesi kurucusu + istemci (`buildAccessRequest`,
145
+ `submitAccessRequest`, `listMyAccessRequests`, `getAccessRequest`, `describeAccessRequest`) ve tipleri.
146
+
147
+ ### Eklendi (D-76 — uygulama arayüz standartları)
148
+
149
+ - **Portal köprüsü** `window.one` (`ONE_BRIDGE_SCRIPT`, `/one-bridge.js`): menü (`one.start({ navigation })`), gezinme
150
+ (`one.onNavigate`, `one.setRoute`), alt başlık (`one.setTitle`), Portal'da çizilen bildirim ve onay penceresi
151
+ (`one.toast`, `one.confirm`), indirme (`one.download`, ≤ 25 MB), dış bağlantı (`one.openExternal`, yalnız https),
152
+ kaydedilmemiş değişiklik (`one.setDirty`), görünen alan (`one.viewport`), belirteçli `one.fetch`. Yükseklik bildirimi
153
+ köprüye taşındı.
154
+ - **Görsel dil** `ONE_UI_CSS` (`/one-ui.css`): açık/koyu değişkenler + düğme, alan, tablo, kart, mesaj, içerik sekmesi;
155
+ Portal'ın tasarım değerleri (`one:context.design`) değişkenlere yazılır.
156
+ - Sunucu yardımcıları: `clientAssetResponse`, `scriptResponse`, `navigationFromManifest`, `isRoutePath`, `ROUTE_PATH_RE`,
157
+ `NAVIGATION_MAX_ITEMS`, `TITLE_MAX_LENGTH`, `DOWNLOAD_MAX_BYTES`.
158
+ - **Vekalet / Yerine Görüntüle bağlamı:** `ctx.actor` (`{ sub, kind }`) ve `isActingSession(ctx)`. Kırıcı değil: alan
159
+ isteğe bağlıdır; `readContext` her zaman yazar. Bu oturumlar varsayılan salt-okunurdur (platform yazma isteğini 403
160
+ `ONE-DSP-E-009` ile reddeder; manifest `actingSessions: "write"` açar).
161
+
162
+ ### Kırıcı (D-72 — white label)
163
+
164
+ - SDK artık çalışma ortamı tiplerini **kendisi** taşır: `OneDatabase` · `OneStatement` · `OneQueryResult` ·
165
+ `OneFilesBinding` · `OneStoredFile(Body)` · `OneCacheBinding` · `OneExecutionContext` · `OneApp<Env>`. Ek tip paketi
166
+ eş bağımlılığı kaldırıldı; uygulamanın `tsconfig`'i `"lib": ["ES2022", "WebWorker"]` ve `"types": []` ile yetinir.
167
+ Uygulamada `Env` tipleri bu adlarla yazılır, giriş noktası `satisfies OneApp<Env>` ile sınanır.
168
+ - `OneFiles` ve `OneCache` kurucuları `OneFilesBinding` / `OneCacheBinding` alır (çalışma ortamının verdiği nesne
169
+ bunlara uyar; uyum paket içinde ayrıca denetlenir).
170
+ - Manifest servis adları: `services.d1 / r2 / kv` → `services.database / files / cache`. Eski adlar açık bir hatayla
171
+ reddedilir (sessizce yok sayılsalar uygulama veritabanını ya da dosya deposunu kaybederdi).
172
+
173
+ ### Eklendi (D-72)
174
+
175
+ - `one` komutu (paketle gelir): `one dev` uygulamayı yerelde çalıştırır, `one migrate` `migrations/`'ı yerel
176
+ veritabanına uygular, `one build` yükleme provası yapar. Yapılandırma ve yerel veri `.one/` altındadır ve her komutta
177
+ `one.manifest.json`'dan üretilir; uygulama deposunda çalışma ortamına ait yapılandırma dosyası yoktur.
178
+
179
+ ### Eklendi (D-59 — kullanıcı onayı)
180
+
181
+ - `CONSENT_SCOPES` ve `awaitsUserConsent(ctx, scope)`: ERP'ye veri yazma ve kullanıcı adına e-posta/SMS/mobil bildirim
182
+ scope'ları artık kullanıcının ayrıca ve süreli (30 gün, portal başına) onayıyla belirtece girer. Uygulama onay
183
+ beklenen işin düğmesini kapatıp kullanıcıyı portaldaki "İzinleri incele" düğmesine yönlendirebilir.
184
+ - `requireScope` onaya bağlı scope eksikse aynı kodla (`ONE-SDK-E-003`) ama izni nereden vereceğini söyleyen bir metinle
185
+ hata verir. Kırıcı değil: kod ve durum aynı.
186
+
187
+ ### Düzeltildi (bağımsız inceleme, D-47/D-49)
188
+
189
+ - `approvalChain` pasif yöneticiyi fiilen atlayamıyordu: `getOrgUsersWithManagers` ucu varsayılan olarak yalnız aktifleri döner ve zincir pasif yöneticide "bilinmeyen kişi" diye kesiliyordu. `getOrgUsersWithManagers(api, { includeInactive: true })` eklendi; `approvalChainReport` durma nedenini (`top` · `depth` · `unknown` · `cycle`) döner.
190
+ - Bildirim senaryolarında uzun uygulama/kişi adları SMS'te `SMS_NAME_MAX_LENGTH` (40) ile kısaltılır — bağlantı yokken de 300 aşılıp "bağlantıyı kısaltın" hatası veriliyordu. Kısaltma artık bir emojiyi (vekil çift) ortasından bölmez.
191
+ - `hasPermission` açıklaması: yönetici için her kodda `true`; ad alanı süzgeci gizlilik sınırı değildir.
192
+
193
+ ### Düzeltildi (Codex incelemesi, PR #15)
194
+
195
+ - `problemResponse` `OneError.retryAfterSeconds`'ı düşürüyordu: DEXA işleminin 409 `ERPCMD-APP-E-016` hatası standart
196
+ rota kalıbıyla (`catch → problemResponse`) tarayıcıya bekleme süresi olmadan ulaşıyordu. Değer pozitif tam sayıysa
197
+ yanıt artık `Retry-After` başlığını ve gövdede `retryAfterSeconds` alanını taşır; değer yoksa gövde şekli aynıdır.
198
+ - `runDexaCommand` / `getDexaCommandStatus` eksik ya da tutarsız bir 200 yanıtını başarı sayabiliyordu (ör.
199
+ `{ "outcome": "succeeded" }` ya da başka bir `idempotencyKey`): eksik alanlar boş varsayılanlarla doldurulup
200
+ `succeeded` dönüyordu. Yanıt artık backend kaydının tiplerine (`ErpCommandResponse` · `ErpCommandStatusResponse`) ve
201
+ gönderilen anahtarlara göre doğrulanır; uymayan her yanıt `inDoubt` olur ve gövdesinden hiçbir alan taşınmaz.
202
+ **Kırıcı (yayımlanmamış API):** `normalizeDexaCommandResult(raw, sentIdempotencyKey, sentKey)` üçüncü parametre aldı.
203
+
204
+ ### Eklendi
205
+
206
+ - **DEXA işlemleri — ERP'ye veri yazma (D-56 — geliştirici onayı bekliyor):** `runDexaCommand(api, key, parameters,
207
+ { idempotencyKey })` → backend `One/services/dexa/command` (scope `dexa.write`, zorunlu `Idempotency-Key` başlığı) ve
208
+ `getDexaCommandStatus(api, idempotencyKey)` (kayıt yoksa `null`). Yanıt tipleri backend `ErpCommandResponse` /
209
+ `ErpCommandStatusResponse` ile alan adı alan adına aynıdır (`DexaCommandResult` · `DexaCommandStatus` ·
210
+ `DexaCommandErpView`); tanınmayan 200 yanıtı ya da bilinmeyen `outcome` **`inDoubt`** sayılır (yeni anahtarla tekrar
211
+ denemeye yol açmasın). `newIdempotencyKey()` · `normalizeIdempotencyKey()` (kanonik UUID, boş UUID değil, küçük harf).
212
+ İstemci kuralları istek gönderilmeden fırlatır (`buildDexaCommandRequest`, `ONE-SDK-E-045…049`): anahtar biçimi,
213
+ en çok 32 parametre, ad biçimi, değer metin ≤ 65.536 karakter; sorgulardaki ayrılmış bağlam parametresi yasağı
214
+ işlemlerde yoktur.
215
+ - **Mobil bildirim (D-55 — geliştirici onayı bekliyor):** `sendPush(api, { toSubjects, toOrgUserIds?, title, text })` →
216
+ backend `One/services/push` (scope `push.execute`); yalnız başlık + metin, derin bağlantı yok. Atlama gerekçesi
217
+ `not-deliverable`. Senaryolarda `toPush` (başlık ≤ 100 = konu, metin ≤ 300 = SMS metni; `PUSH_TITLE_MAX_LENGTH` ·
218
+ `PUSH_TEXT_MAX_LENGTH`) ve `notify` `push` kanalı (kanallar bağımsız). ⚠️ Push bugün hiçbir ortamda açık değildir
219
+ (`ONE-APP-E-029`).
220
+ - **`OneError.retryAfterSeconds`:** `BackendClient` hata yanıtındaki `Retry-After` başlığını (saniye) ya da gövdedeki
221
+ `retryAfterSeconds`'ı taşır (ör. DEXA işlemi 409 `ERPCMD-APP-E-016`). `OneError` kurucusuna isteğe bağlı dördüncü
222
+ parametre eklendi; mevcut çağrılar değişmez. Nesne olmayan bir JSON hata gövdesi artık `TypeError` üretmez.
223
+ - **Uygulama izinleri (D-49 — geliştirici onayı bekliyor):** `OneUser.permissions` (yalnız uygulamanın ad alanındaki izinler, dispatch `X-One-Permissions`) + `OneUser.admin` (şirket/küresel yönetici rolü, `X-One-Admin`); `hasPermission` · `requirePermission` (`ONE-SDK-E-004`). Portal yöneticisi her izne sahip sayılır (backend baypası paritesi). ⚠️ Eski dispatch bu başlıkları yazmaz: `permissions` boş, `admin` `false` gelir (fail-closed).
224
+ - **Organizasyon şeması (D-47 — geliştirici onayı bekliyor):** `getOrgSchema` · `getOrgUsersWithManagers` · `getMyOrgContext` (oturumdaki kişinin org kimliği, `Users/me` → `orgContext.legacyUserId`) · `getUserGroupMembers` · `getUserGroupsOfUser` (scope `orgschema.read`) ve saf yardımcılar `managerOf` · `approvalChain` (döngü güvenli, pasif yöneticiyi atlar) · `orgUsersMatching` · `localizedText`. Hata kodları `ONE-SDK-E-050/051`.
225
+ - **Bildirim senaryoları (D-47):** `approvalRequest` · `approvalResult` · `reminder` · `systemNotice` · `operationResult` · `verificationCode` (TR/EN; e-posta + SMS metni tek girdiden, backend sınırlarına göre kırpılır), `toMail` · `toSms` · `notify` (kanallar bağımsız), doğrulama kodu yardımcıları `generateVerificationCode` · `generateSalt` · `hashVerificationCode` · `verificationCodeMatches`. Hata kodları `ONE-SDK-E-060…063`.
226
+ - **Org kimliğiyle alıcı:** `MailRequest` / `SmsRequest` `toOrgUserIds?` alanı (backend D-47); atlama gerekçesi `invalid-org-user`. ⚠️ Alanı tanımayan (D-47 öncesi) backend sürümüne karşı kullanmayın.
227
+ - **Olay kaydı (Event Logger) koruması ve hata kaydı (D-45):** `logError(ctx, message, error, data?)`; `logEvent` /
228
+ `logError` / `logAudit` `data`daki sır kokan alanları `"[gizli]"` yapar (`redact`) ve 8 KiB üstü `data` yerine boyutu
229
+ yazar (`safeData`); `problemResponse(error, ctx?)` bilinmeyen hatayı bağlamıyla kaydeder (yığın kırpılmış). Yeni
230
+ dışa açılanlar: `describeError` · `EVENT_DATA_MAX_BYTES` · `EVENT_MESSAGE_MAX_LENGTH` · `EVENT_STACK_MAX_LENGTH`.
231
+ Davranış değişikliği: `logEvent` ileti metni 1.000 karakterde kırpılır.
232
+ - **DEXA (ERP okuma) servisi:** `queryDexa(api, key, parameters?)` — backend `One/services/dexa/query` ince istemcisi
233
+ (scope `dexa.read`; D-09, uç D-42 — geliştirici onayı bekliyor). Yalnız kayıt defterinde izinli, önceden tanımlı
234
+ QueryStore anahtarları çalışır. Sonuç `DexaQueryResult { columns, rows, unavailable, truncated }`: `unavailable`
235
+ sorgunun ÇALIŞAMADIĞINI söyler (200 döner, SDK fırlatmaz — boş satır "kayıt yok" sayılmaz), `truncated` 5.000 satır
236
+ kesmesidir; eksik alan savunmacı okunur (`normalizeDexaQueryResult`). İstemci tarafı kurallar sunucuyla birebir
237
+ ve istek gönderilmeden fırlatır (`buildDexaQueryRequest`, `ONE-SDK-E-040…044`): anahtar biçimi, en çok 32 parametre,
238
+ ad biçimi, bağlam parametreleri (`LangCode` · `CompanyCode` · `CostCenterCode` · `UserCode`; harf duyarsız) ve
239
+ 2.000 karakterlik değer. Sabitler: `DEXA_KEY_RE` · `DEXA_PARAMETER_NAME_RE` · `DEXA_MAX_PARAMETERS` ·
240
+ `DEXA_PARAMETER_VALUE_MAX_LENGTH` · `DEXA_RESERVED_PARAMETERS`.
241
+ - **Denetim günlüğü kalıcılığı:** `recordAudit(api, ctx, action, target?, data?)` — `logAudit` izine ek olarak
242
+ backend `One/services/audit` ucuna yazar (scope `audit.write`; D-36). Girdi kuralları sunucuyla birebir
243
+ (`buildAuditRequest`, `ONE-SDK-E-030…032`); uzak yazma best-effort (`recorded:false` + uyarı).
244
+ - **Önbellek servisi:** `OneCache` (kurulum başına KV namespace, binding `CACHE`; D-35): `get` / `put` / `delete`;
245
+ TTL zorunlu (60 sn … 30 gün, sınır dışı değer hata), değer JSON ≤ 1 MiB, anahtar kuralı fail-closed
246
+ (`normalizeCacheKey`, 512 bayt). KV nihai tutarlıdır — önbellek olarak kullanılır, kayıt deposu olarak değil.
247
+
248
+ ## [0.1.0] — 2026-10-15
249
+
250
+ npm'e yayımlanmadı (bkz. 0.2.0). İlk paketlenebilir sürüm (platform deposu `devoplus/devoplus-one`, karar defteri D-11 · D-16 · D-17 · D-32 · D-33).
251
+
252
+ ### Eklendi
253
+
254
+ - **Kimlik bağlamı:** `readContext(headers)` dispatch Worker'ın yazdığı `X-One-*` başlıklarından `OneContext`
255
+ üretir; `requireUser` (401) ve `requireScope` (403) kapıları; `OneError(status, code, detail)`.
256
+ - **Backend istemcisi:** `BackendClient` — `api/v1/...` yolları, zarfsız DTO, `204 → undefined`, RFC 9457
257
+ `ProblemDetails` → `OneError`. Sır taşımaz; platform kimliğini outbound Worker ekler.
258
+ - **Hata yanıtı:** `problemResponse(error)` — `OneError`'ı `application/problem+json` yanıtına çevirir; bilinmeyen
259
+ hata 500 + sabit metin (iç mesaj sızmaz).
260
+ - **Günlük:** `logEvent` (sistem olayı) ve `logAudit` (kritik kullanıcı işlemi; aktör zorunlu) — yapısal console
261
+ çıktısı (Workers Logs).
262
+ - **Dosya servisi:** `OneFiles` (kurulum başına R2 kovası, binding `FILES`): `put` / `get` / `head` / `delete` /
263
+ `list`; anahtar kuralı fail-closed (`normalizeFileKey`: 512 karakter **ve** 1.024 bayt — R2 sınırı UTF-8 ile
264
+ ölçülür), `sanitizeFileName`, 25 MiB tavan (`FILE_MAX_BYTES`), `put` akış gövde kabul etmez;
265
+ `readBoundedBody(request, maxBytes)` istek gövdesini sınırı belleğe almadan ÖNCE (Content-Length) ve parçalı
266
+ akışta okuma SIRASINDA uygulayarak alır.
267
+ - **İletişim servisi:** `sendMail` / `sendSms` — CA backend `One/services/mail|sms` ince istemcisi; alıcılar
268
+ `sub` listesidir, adres/telefon sunucuda çözülür; yanıt `NotifyResult { queued, skipped[{sub, reason}] }`.