@objectstack/service-sms 17.1.0 → 17.3.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,467 @@
1
1
  # @objectstack/service-sms
2
2
 
3
+ ## 17.3.0
4
+
5
+ ### Patch Changes
6
+
7
+ - 6426b86: fix(service-storage,service-sms): a schema default is not a configuration — converge the "authored value" criterion on `ResolvedSettingValue.source` (#5536)
8
+
9
+ Both settings-bound plugins decided "has anyone configured this namespace?" by
10
+ value presence, but the manifest defaults are non-empty on every boot, so an
11
+ unopened settings page read as configuration:
12
+
13
+ - **service-storage**: the swap gate now requires an adapter-relevant key
14
+ (`adapter`, `local_root`, `s3_*` — exactly the inputs `resolveStorageTarget`
15
+ reads) whose `source` is not `'default'` before settings may override the
16
+ constructor-built adapter. Previously the schema defaults
17
+ (`adapter: 'local'`, `local_root: './.objectstack/data/uploads'`) could
18
+ silently move a deployment's declared backing store — and an authored save
19
+ that touched only, say, the upload limit could open the same door.
20
+ - **service-sms**: the downgrade to `LogSmsTransport` now requires an
21
+ operator-authored `provider: 'log'` (`source !== 'default'`). Previously
22
+ the manifest default `'log'` — a value nobody selected — switched off the
23
+ transport the deployment declared via constructor options on every boot.
24
+
25
+ Same criterion, same reason as `EmailServicePlugin` (the in-repo precedent):
26
+ the manifest default (`source: 'default'`) is not a decision anyone made.
27
+ Admin-saved rows and env overrides behave exactly as before. A snapshot with
28
+ no `source` at all reads as `'default'` — the conservative side keeps the
29
+ deployment-declared adapter/transport. The sms `daily_quota` reader keeps its
30
+ declared #2814 exception and still binds by value, never by source.
31
+ - Updated dependencies [809d417]
32
+ - Updated dependencies [387e231]
33
+ - Updated dependencies [f794e4e]
34
+ - Updated dependencies [cae2169]
35
+ - Updated dependencies [b812a54]
36
+ - Updated dependencies [2d4fa75]
37
+ - Updated dependencies [0e4e51b]
38
+ - Updated dependencies [e84bbf6]
39
+ - Updated dependencies [effae80]
40
+ - Updated dependencies [efb3513]
41
+ - Updated dependencies [d62f990]
42
+ - Updated dependencies [c45d8e6]
43
+ - Updated dependencies [8064e6d]
44
+ - Updated dependencies [6dd3e69]
45
+ - Updated dependencies [2e3e8c7]
46
+ - Updated dependencies [e621291]
47
+ - Updated dependencies [655b106]
48
+ - Updated dependencies [40a93b5]
49
+ - Updated dependencies [d5b330d]
50
+ - Updated dependencies [dda969c]
51
+ - Updated dependencies [1f45690]
52
+ - Updated dependencies [277948f]
53
+ - Updated dependencies [8bdd955]
54
+ - Updated dependencies [f3bbbef]
55
+ - Updated dependencies [4f24e9d]
56
+ - Updated dependencies [e238c79]
57
+ - Updated dependencies [8e31083]
58
+ - Updated dependencies [cd288b4]
59
+ - Updated dependencies [4bb412b]
60
+ - Updated dependencies [a5b95ee]
61
+ - Updated dependencies [450e73b]
62
+ - Updated dependencies [2efa1e1]
63
+ - Updated dependencies [35e94c9]
64
+ - Updated dependencies [3798424]
65
+ - Updated dependencies [e27583e]
66
+ - Updated dependencies [4bd6faa]
67
+ - Updated dependencies [86cbe37]
68
+ - Updated dependencies [6a180e4]
69
+ - Updated dependencies [474242f]
70
+ - Updated dependencies [63cd487]
71
+ - Updated dependencies [bd4aa4e]
72
+ - Updated dependencies [803eaab]
73
+ - Updated dependencies [f8e8f03]
74
+ - Updated dependencies [983edf1]
75
+ - Updated dependencies [eae824e]
76
+ - Updated dependencies [9c4c431]
77
+ - Updated dependencies [f6fa22c]
78
+ - Updated dependencies [56d3c7a]
79
+ - Updated dependencies [8a483b3]
80
+ - Updated dependencies [97bcd99]
81
+ - Updated dependencies [df59de0]
82
+ - Updated dependencies [96e25a8]
83
+ - Updated dependencies [f75a38a]
84
+ - Updated dependencies [7a25e7d]
85
+ - Updated dependencies [d3bee87]
86
+ - Updated dependencies [1fa05a6]
87
+ - Updated dependencies [c85a265]
88
+ - Updated dependencies [dcb10a5]
89
+ - Updated dependencies [773a999]
90
+ - Updated dependencies [35dffea]
91
+ - Updated dependencies [d8024f0]
92
+ - Updated dependencies [8120808]
93
+ - Updated dependencies [776a098]
94
+ - Updated dependencies [5060877]
95
+ - Updated dependencies [4f6325d]
96
+ - Updated dependencies [52954c0]
97
+ - Updated dependencies [2aa8456]
98
+ - Updated dependencies [93809a3]
99
+ - Updated dependencies [7c0d0c3]
100
+ - Updated dependencies [daae7aa]
101
+ - Updated dependencies [8dc22d6]
102
+ - Updated dependencies [279431e]
103
+ - Updated dependencies [948dd6b]
104
+ - Updated dependencies [3b4c56c]
105
+ - Updated dependencies [ae8edd2]
106
+ - Updated dependencies [e25403c]
107
+ - Updated dependencies [5c9e40a]
108
+ - Updated dependencies [64baa68]
109
+ - Updated dependencies [9fa70d7]
110
+ - Updated dependencies [09db64a]
111
+ - Updated dependencies [92916e7]
112
+ - Updated dependencies [a84f3ea]
113
+ - Updated dependencies [f2eaae8]
114
+ - Updated dependencies [c09451b]
115
+ - Updated dependencies [ba64877]
116
+ - Updated dependencies [35202f1]
117
+ - Updated dependencies [7345308]
118
+ - Updated dependencies [79b6a22]
119
+ - Updated dependencies [30d96ab]
120
+ - Updated dependencies [f658793]
121
+ - Updated dependencies [c95ad19]
122
+ - Updated dependencies [e58ea8b]
123
+ - Updated dependencies [4a17645]
124
+ - Updated dependencies [3795c5f]
125
+ - Updated dependencies [8ab926b]
126
+ - Updated dependencies [7317cf2]
127
+ - Updated dependencies [e25e839]
128
+ - Updated dependencies [5997207]
129
+ - Updated dependencies [8b13cc8]
130
+ - Updated dependencies [4a4a35d]
131
+ - Updated dependencies [86e765a]
132
+ - Updated dependencies [1d7e76a]
133
+ - Updated dependencies [53dc739]
134
+ - Updated dependencies [fd289be]
135
+ - Updated dependencies [03bf7b1]
136
+ - Updated dependencies [f90e820]
137
+ - Updated dependencies [18d816a]
138
+ - Updated dependencies [e8bd715]
139
+ - Updated dependencies [b91c351]
140
+ - Updated dependencies [a28a3c0]
141
+ - Updated dependencies [daeaaf9]
142
+ - Updated dependencies [c459da6]
143
+ - Updated dependencies [e914733]
144
+ - Updated dependencies [f887e52]
145
+ - Updated dependencies [881f8d8]
146
+ - Updated dependencies [3bfa1e6]
147
+ - Updated dependencies [0a8ebf3]
148
+ - Updated dependencies [901355c]
149
+ - Updated dependencies [34ce8e7]
150
+ - Updated dependencies [33681ea]
151
+ - Updated dependencies [4635f3e]
152
+ - Updated dependencies [fd289be]
153
+ - Updated dependencies [ee3595c]
154
+ - Updated dependencies [b2eab95]
155
+ - Updated dependencies [93940d4]
156
+ - Updated dependencies [3a04b01]
157
+ - Updated dependencies [45b9051]
158
+ - Updated dependencies [b9e9227]
159
+ - Updated dependencies [d395692]
160
+ - Updated dependencies [f074616]
161
+ - Updated dependencies [0e0bf80]
162
+ - Updated dependencies [5894d30]
163
+ - Updated dependencies [a3765f6]
164
+ - Updated dependencies [2d5cee3]
165
+ - Updated dependencies [e22158f]
166
+ - Updated dependencies [7404925]
167
+ - Updated dependencies [0c2334f]
168
+ - Updated dependencies [778c59f]
169
+ - Updated dependencies [d2619fd]
170
+ - Updated dependencies [af56546]
171
+ - Updated dependencies [6acb11a]
172
+ - Updated dependencies [33c5fd3]
173
+ - Updated dependencies [20b0fdb]
174
+ - Updated dependencies [905019b]
175
+ - Updated dependencies [a286411]
176
+ - Updated dependencies [98c0d33]
177
+ - Updated dependencies [368a82e]
178
+ - Updated dependencies [a3d5724]
179
+ - Updated dependencies [93ea19b]
180
+ - Updated dependencies [9ee2dcf]
181
+ - Updated dependencies [8cb96ec]
182
+ - Updated dependencies [8f10a79]
183
+ - Updated dependencies [6269a55]
184
+ - Updated dependencies [a17da05]
185
+ - Updated dependencies [a8c00e2]
186
+ - Updated dependencies [0fb8760]
187
+ - Updated dependencies [e5ce2ed]
188
+ - Updated dependencies [be21955]
189
+ - Updated dependencies [bc56e18]
190
+ - Updated dependencies [be21955]
191
+ - Updated dependencies [a9ee989]
192
+ - Updated dependencies [4d0d944]
193
+ - Updated dependencies [15d58db]
194
+ - Updated dependencies [d63b014]
195
+ - Updated dependencies [9abe4e4]
196
+ - Updated dependencies [2cc7122]
197
+ - Updated dependencies [50d6c92]
198
+ - Updated dependencies [9e0ba21]
199
+ - Updated dependencies [311433f]
200
+ - Updated dependencies [3e5ad08]
201
+ - Updated dependencies [9abe4e4]
202
+ - Updated dependencies [b7131f3]
203
+ - Updated dependencies [e5812fa]
204
+ - Updated dependencies [7085f90]
205
+ - Updated dependencies [dee4dd4]
206
+ - Updated dependencies [ce7e497]
207
+ - Updated dependencies [51ecb2f]
208
+ - Updated dependencies [9086761]
209
+ - Updated dependencies [42a117b]
210
+ - Updated dependencies [1401ae7]
211
+ - Updated dependencies [4297fe7]
212
+ - Updated dependencies [e398863]
213
+ - Updated dependencies [d16df74]
214
+ - Updated dependencies [f11fc61]
215
+ - Updated dependencies [e808890]
216
+ - Updated dependencies [8f79379]
217
+ - Updated dependencies [e6ca40e]
218
+ - Updated dependencies [0c77ea4]
219
+ - Updated dependencies [52954c0]
220
+ - Updated dependencies [89eb997]
221
+ - Updated dependencies [7131f12]
222
+ - Updated dependencies [aa5994e]
223
+ - Updated dependencies [be93457]
224
+ - Updated dependencies [7c342f4]
225
+ - Updated dependencies [a65db76]
226
+ - Updated dependencies [2cf5a96]
227
+ - Updated dependencies [15eb2c9]
228
+ - Updated dependencies [5691b07]
229
+ - Updated dependencies [2a6122b]
230
+ - Updated dependencies [225e769]
231
+ - Updated dependencies [8af88dd]
232
+ - Updated dependencies [fb5fbb8]
233
+ - Updated dependencies [d7b3963]
234
+ - Updated dependencies [33184fd]
235
+ - Updated dependencies [7c41693]
236
+ - Updated dependencies [3c0f3ea]
237
+ - Updated dependencies [4f65837]
238
+ - Updated dependencies [26deb31]
239
+ - Updated dependencies [b72db01]
240
+ - Updated dependencies [dce5cd4]
241
+ - Updated dependencies [9688f58]
242
+ - Updated dependencies [556ebc1]
243
+ - Updated dependencies [177ebdc]
244
+ - Updated dependencies [ad54eb3]
245
+ - Updated dependencies [8d237b4]
246
+ - Updated dependencies [2d2e6f0]
247
+ - Updated dependencies [2d8dd8d]
248
+ - Updated dependencies [22d573e]
249
+ - Updated dependencies [b5a2398]
250
+ - Updated dependencies [348860c]
251
+ - Updated dependencies [5383fa6]
252
+ - Updated dependencies [5b3ff63]
253
+ - Updated dependencies [1a6a19c]
254
+ - Updated dependencies [527e050]
255
+ - Updated dependencies [dd33bf9]
256
+ - Updated dependencies [4cb2a90]
257
+ - Updated dependencies [74a7804]
258
+ - Updated dependencies [53d3689]
259
+ - Updated dependencies [b3a63d3]
260
+ - Updated dependencies [911da5f]
261
+ - Updated dependencies [89448a5]
262
+ - Updated dependencies [49f0dcf]
263
+ - Updated dependencies [033a34c]
264
+ - Updated dependencies [4d25d22]
265
+ - Updated dependencies [1ffee51]
266
+ - Updated dependencies [5ae4303]
267
+ - Updated dependencies [ece4dad]
268
+ - Updated dependencies [e9b377e]
269
+ - Updated dependencies [146f448]
270
+ - Updated dependencies [735f5c7]
271
+ - Updated dependencies [7303cbf]
272
+ - Updated dependencies [a7e18de]
273
+ - Updated dependencies [366f895]
274
+ - Updated dependencies [29ef1e1]
275
+ - Updated dependencies [dc75ba8]
276
+ - Updated dependencies [cce0aa9]
277
+ - Updated dependencies [e764507]
278
+ - Updated dependencies [cff17af]
279
+ - Updated dependencies [39404f3]
280
+ - Updated dependencies [ca1965f]
281
+ - Updated dependencies [8619f95]
282
+ - Updated dependencies [b706af9]
283
+ - Updated dependencies [add4360]
284
+ - Updated dependencies [fc9ba76]
285
+ - Updated dependencies [0f94cc7]
286
+ - Updated dependencies [a11c1a5]
287
+ - Updated dependencies [71f9cd1]
288
+ - Updated dependencies [ee17d86]
289
+ - Updated dependencies [cdbd920]
290
+ - Updated dependencies [18c432e]
291
+ - Updated dependencies [3c418c4]
292
+ - Updated dependencies [fa8715a]
293
+ - Updated dependencies [a933ed7]
294
+ - Updated dependencies [b3ca463]
295
+ - Updated dependencies [a933ed7]
296
+ - Updated dependencies [0d4a6a8]
297
+ - Updated dependencies [518d5e5]
298
+ - Updated dependencies [6643ba1]
299
+ - Updated dependencies [eeba2ef]
300
+ - Updated dependencies [ec4c4d2]
301
+ - Updated dependencies [424f73c]
302
+ - Updated dependencies [cccbe51]
303
+ - Updated dependencies [a8d6b1d]
304
+ - Updated dependencies [e4a7695]
305
+ - Updated dependencies [87075b1]
306
+ - Updated dependencies [fc58a99]
307
+ - Updated dependencies [14cfc00]
308
+ - Updated dependencies [1c6f7b4]
309
+ - Updated dependencies [e854a53]
310
+ - Updated dependencies [dfebfc8]
311
+ - Updated dependencies [d028b37]
312
+ - Updated dependencies [f7b25c5]
313
+ - Updated dependencies [122ef38]
314
+ - Updated dependencies [4a37870]
315
+ - Updated dependencies [428f9b2]
316
+ - Updated dependencies [aa7ff56]
317
+ - Updated dependencies [1401ae7]
318
+ - Updated dependencies [2fd3f1c]
319
+ - Updated dependencies [c41b42e]
320
+ - Updated dependencies [c4db311]
321
+ - Updated dependencies [750fff5]
322
+ - Updated dependencies [c19035e]
323
+ - Updated dependencies [ececf7a]
324
+ - Updated dependencies [d173125]
325
+ - Updated dependencies [8eeca27]
326
+ - Updated dependencies [8425c17]
327
+ - Updated dependencies [7cbe705]
328
+ - Updated dependencies [a5ef1d8]
329
+ - Updated dependencies [772d5de]
330
+ - Updated dependencies [ce80ec2]
331
+ - Updated dependencies [b372318]
332
+ - Updated dependencies [97a2263]
333
+ - Updated dependencies [29d0676]
334
+ - Updated dependencies [0169d49]
335
+ - Updated dependencies [6bd3231]
336
+ - Updated dependencies [d2b5ba8]
337
+ - Updated dependencies [b799ac5]
338
+ - Updated dependencies [8f74307]
339
+ - Updated dependencies [d23dc08]
340
+ - Updated dependencies [644ad50]
341
+ - Updated dependencies [c0714eb]
342
+ - Updated dependencies [9735662]
343
+ - Updated dependencies [bf8d129]
344
+ - Updated dependencies [4d5b4f8]
345
+ - Updated dependencies [0da7cd2]
346
+ - Updated dependencies [28a5c3e]
347
+ - Updated dependencies [4bc18e5]
348
+ - @objectstack/spec@17.3.0
349
+ - @objectstack/core@17.3.0
350
+ - @objectstack/plugin-auth@17.3.0
351
+
352
+ ## 17.2.0
353
+
354
+ ### Patch Changes
355
+
356
+ - a24b7fa: Make the settings ordering contract **declared and enforced**, and make the
357
+ residual pre-bind READ audible (#10250).
358
+
359
+ `SettingsServicePlugin` binds its data engine from a `kernel:ready` hook
360
+ registered in its `start()`. Three shipped plugins read a settings namespace
361
+ from a `kernel:ready` hook registered in *their* `start()` — `plugin-email`
362
+ (`mail`: SMTP/provider/from-address), `service-sms` (`sms`: provider
363
+ credentials and the daily cost ceiling) and `service-storage` (`storage`:
364
+ backend and credentials). Hooks fire in registration order, so a reader that
365
+ started before the settings plugin read `SettingsService`'s in-memory fallback,
366
+ which is empty at boot: the caller received the manifest **default** with
367
+ `source: 'default'` and `locked: false`, no diagnostic anywhere, while the
368
+ operator's saved row sat unread in `sys_setting`.
369
+
370
+ Nothing constrained that order. None of the three declared any dependency on
371
+ `com.objectstack.service.settings`, so their position was pure `kernel.use()`
372
+ order. It was correct under `os serve` only because the always-on slate happens
373
+ to list `settings` first — and `serve` *prepends* an app's declared `requires`,
374
+ so an ordinary `requires: ['email']` produced email-before-settings and bypassed
375
+ that; cloud's per-tenant runtime mounts the slate from its own wiring.
376
+
377
+ Three changes, one contract:
378
+
379
+ - **Declared order.** Each of the three plugins now declares
380
+ `optionalDependencies: ['com.objectstack.service.settings']`. The kernel
381
+ resolves both the init and the start phase from that graph
382
+ (`resolvePluginOrder`, ADR-0116), so the bind is ordered ahead of the read
383
+ wherever the plugin is composed, in any host. Soft, not hard: a kernel with
384
+ no settings service still boots these plugins unchanged.
385
+ - **The residual is audible.** A settings read issued while a bind is
386
+ *declared but pending* now emits one operator-actionable `warn` per namespace
387
+ naming the repair. Deliberately not a refusal — an in-window read of a
388
+ setting with genuinely no persisted row must answer the manifest default, and
389
+ refusing would turn a correct startup sequence into an error. It stays silent
390
+ in every case that is not the window: after `bindEngine`, on a kernel with no
391
+ `objectql` at all (`settleWithoutEngine`), for a directly constructed
392
+ `SettingsService`, and for a read satisfied by an `OS_*` env override.
393
+ - **The slate pin now derives its boundary.** The foundational-prefix
394
+ assertion covered `slice(0, 6)` while `sms` — a settings reader — sits at
395
+ index 6, one past the end. The new pin
396
+ (`packages/cli/src/commands/serve-settings-ordering.pin.test.ts`) states the
397
+ rule instead of the count: every always-on entry that is not one of the
398
+ services others bind into at `kernel:ready` must be mounted after all of
399
+ them. An entry added tomorrow is covered wherever it lands.
400
+
401
+ No behaviour changes for a deployment whose order was already correct.
402
+ - Updated dependencies [8f04d9a]
403
+ - Updated dependencies [4d7c564]
404
+ - Updated dependencies [6936d07]
405
+ - Updated dependencies [59eb04d]
406
+ - Updated dependencies [9f05b7d]
407
+ - Updated dependencies [163a162]
408
+ - Updated dependencies [26dea14]
409
+ - Updated dependencies [3b2af5e]
410
+ - Updated dependencies [7d2d112]
411
+ - Updated dependencies [03bdd14]
412
+ - Updated dependencies [5fa0d72]
413
+ - Updated dependencies [02b3b07]
414
+ - Updated dependencies [bbe643c]
415
+ - Updated dependencies [914c413]
416
+ - Updated dependencies [55809a0]
417
+ - Updated dependencies [5b0af2b]
418
+ - Updated dependencies [ee2ff45]
419
+ - Updated dependencies [47cd3ec]
420
+ - Updated dependencies [52db1d1]
421
+ - Updated dependencies [5649efb]
422
+ - Updated dependencies [9d7d2de]
423
+ - Updated dependencies [c815c50]
424
+ - Updated dependencies [795ea05]
425
+ - Updated dependencies [2306a76]
426
+ - Updated dependencies [e5ea701]
427
+ - Updated dependencies [a40dcc1]
428
+ - Updated dependencies [def0d3e]
429
+ - Updated dependencies [8d0bb79]
430
+ - Updated dependencies [5acb58d]
431
+ - Updated dependencies [e222a53]
432
+ - Updated dependencies [2e3cf95]
433
+ - Updated dependencies [4c93387]
434
+ - Updated dependencies [504c8d5]
435
+ - Updated dependencies [a037f7c]
436
+ - Updated dependencies [c49007a]
437
+ - Updated dependencies [3ee8ddf]
438
+ - Updated dependencies [16cef97]
439
+ - Updated dependencies [a79bd35]
440
+ - Updated dependencies [6ceaa4b]
441
+ - Updated dependencies [15ea214]
442
+ - Updated dependencies [de19489]
443
+ - Updated dependencies [c684d00]
444
+ - Updated dependencies [923c424]
445
+ - Updated dependencies [1ec36b7]
446
+ - Updated dependencies [5f2e54c]
447
+ - Updated dependencies [189373b]
448
+ - Updated dependencies [af1636c]
449
+ - Updated dependencies [86a8ec9]
450
+ - Updated dependencies [d9353b9]
451
+ - Updated dependencies [35ad101]
452
+ - Updated dependencies [ceb33a9]
453
+ - Updated dependencies [73d9795]
454
+ - Updated dependencies [8012960]
455
+ - Updated dependencies [45204a5]
456
+ - Updated dependencies [9b0172d]
457
+ - Updated dependencies [f34f56b]
458
+ - Updated dependencies [f399618]
459
+ - Updated dependencies [75e9301]
460
+ - Updated dependencies [2810695]
461
+ - @objectstack/plugin-auth@17.2.0
462
+ - @objectstack/spec@17.2.0
463
+ - @objectstack/core@17.2.0
464
+
3
465
  ## 17.1.0
4
466
 
5
467
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -443,6 +443,39 @@ declare class SmsServicePlugin implements Plugin {
443
443
  * kernel name this plugin when a consumer requires one before it inits.
444
444
  */
445
445
  providesServices: string[];
446
+ /**
447
+ * Order-if-present on the settings service (ADR-0116, #10250).
448
+ *
449
+ * `start()` registers a `kernel:ready` hook that reads the `sms` namespace —
450
+ * provider credentials AND the daily cost ceiling. `SettingsServicePlugin`
451
+ * binds its data engine from ITS `kernel:ready` hook, registered in ITS
452
+ * `start()`, so the plugin that starts first registers the earlier hook and
453
+ * the earlier hook runs first. Start order is the topological order over this
454
+ * declaration (`resolvePluginOrder`, used for BOTH phases in
455
+ * `ObjectKernel.bootstrap`), so declaring the edge is what puts the bind
456
+ * ahead of the read.
457
+ *
458
+ * `sms` is the entry this card was filed about: it was added at index 6 of
459
+ * `PLATFORM_ALWAYS_ON_CAPABILITIES`, one past the `slice(0, 6)` prefix that
460
+ * was pinned there at the time, so before this declaration its correct
461
+ * position relative to `settings` was held by nothing at all. In the window
462
+ * `getNamespace('sms')` answers from the manifest defaults — a `log` provider
463
+ * that reports every OTP "sent" and a default cost ceiling — while the
464
+ * operator's saved credentials sit unread in `sys_setting`.
465
+ *
466
+ * That slice is retired (#11046): the slate pin states the rule instead —
467
+ * every always-on entry that is not a bind target (`queue`/`job`/`cache`/
468
+ * `settings`) is mounted after all of them — so `sms` is now held BY the pin
469
+ * rather than sitting one past it, and so is whatever is added next. That
470
+ * covers slate ORDER only; this declaration is still what orders the plugins,
471
+ * and the pin test named below is what keeps it honest.
472
+ *
473
+ * SOFT, not hard: a kernel with no settings service must still boot this
474
+ * plugin (the transport is buildable from options alone). ADR-0049 —
475
+ * declared is enforced: `serve-settings-ordering.pin.test.ts` boots a kernel
476
+ * with the readers registered BEFORE settings and proves the order moves.
477
+ */
478
+ optionalDependencies: string[];
446
479
  version: string;
447
480
  type: "standard";
448
481
  private readonly options;
package/dist/index.d.ts CHANGED
@@ -443,6 +443,39 @@ declare class SmsServicePlugin implements Plugin {
443
443
  * kernel name this plugin when a consumer requires one before it inits.
444
444
  */
445
445
  providesServices: string[];
446
+ /**
447
+ * Order-if-present on the settings service (ADR-0116, #10250).
448
+ *
449
+ * `start()` registers a `kernel:ready` hook that reads the `sms` namespace —
450
+ * provider credentials AND the daily cost ceiling. `SettingsServicePlugin`
451
+ * binds its data engine from ITS `kernel:ready` hook, registered in ITS
452
+ * `start()`, so the plugin that starts first registers the earlier hook and
453
+ * the earlier hook runs first. Start order is the topological order over this
454
+ * declaration (`resolvePluginOrder`, used for BOTH phases in
455
+ * `ObjectKernel.bootstrap`), so declaring the edge is what puts the bind
456
+ * ahead of the read.
457
+ *
458
+ * `sms` is the entry this card was filed about: it was added at index 6 of
459
+ * `PLATFORM_ALWAYS_ON_CAPABILITIES`, one past the `slice(0, 6)` prefix that
460
+ * was pinned there at the time, so before this declaration its correct
461
+ * position relative to `settings` was held by nothing at all. In the window
462
+ * `getNamespace('sms')` answers from the manifest defaults — a `log` provider
463
+ * that reports every OTP "sent" and a default cost ceiling — while the
464
+ * operator's saved credentials sit unread in `sys_setting`.
465
+ *
466
+ * That slice is retired (#11046): the slate pin states the rule instead —
467
+ * every always-on entry that is not a bind target (`queue`/`job`/`cache`/
468
+ * `settings`) is mounted after all of them — so `sms` is now held BY the pin
469
+ * rather than sitting one past it, and so is whatever is added next. That
470
+ * covers slate ORDER only; this declaration is still what orders the plugins,
471
+ * and the pin test named below is what keeps it honest.
472
+ *
473
+ * SOFT, not hard: a kernel with no settings service must still boot this
474
+ * plugin (the transport is buildable from options alone). ADR-0049 —
475
+ * declared is enforced: `serve-settings-ordering.pin.test.ts` boots a kernel
476
+ * with the readers registered BEFORE settings and proves the order moves.
477
+ */
478
+ optionalDependencies: string[];
446
479
  version: string;
447
480
  type: "standard";
448
481
  private readonly options;
package/dist/index.js CHANGED
@@ -433,6 +433,39 @@ var SmsServicePlugin = class {
433
433
  * kernel name this plugin when a consumer requires one before it inits.
434
434
  */
435
435
  this.providesServices = ["sms"];
436
+ /**
437
+ * Order-if-present on the settings service (ADR-0116, #10250).
438
+ *
439
+ * `start()` registers a `kernel:ready` hook that reads the `sms` namespace —
440
+ * provider credentials AND the daily cost ceiling. `SettingsServicePlugin`
441
+ * binds its data engine from ITS `kernel:ready` hook, registered in ITS
442
+ * `start()`, so the plugin that starts first registers the earlier hook and
443
+ * the earlier hook runs first. Start order is the topological order over this
444
+ * declaration (`resolvePluginOrder`, used for BOTH phases in
445
+ * `ObjectKernel.bootstrap`), so declaring the edge is what puts the bind
446
+ * ahead of the read.
447
+ *
448
+ * `sms` is the entry this card was filed about: it was added at index 6 of
449
+ * `PLATFORM_ALWAYS_ON_CAPABILITIES`, one past the `slice(0, 6)` prefix that
450
+ * was pinned there at the time, so before this declaration its correct
451
+ * position relative to `settings` was held by nothing at all. In the window
452
+ * `getNamespace('sms')` answers from the manifest defaults — a `log` provider
453
+ * that reports every OTP "sent" and a default cost ceiling — while the
454
+ * operator's saved credentials sit unread in `sys_setting`.
455
+ *
456
+ * That slice is retired (#11046): the slate pin states the rule instead —
457
+ * every always-on entry that is not a bind target (`queue`/`job`/`cache`/
458
+ * `settings`) is mounted after all of them — so `sms` is now held BY the pin
459
+ * rather than sitting one past it, and so is whatever is added next. That
460
+ * covers slate ORDER only; this declaration is still what orders the plugins,
461
+ * and the pin test named below is what keeps it honest.
462
+ *
463
+ * SOFT, not hard: a kernel with no settings service must still boot this
464
+ * plugin (the transport is buildable from options alone). ADR-0049 —
465
+ * declared is enforced: `serve-settings-ordering.pin.test.ts` boots a kernel
466
+ * with the readers registered BEFORE settings and proves the order moves.
467
+ */
468
+ this.optionalDependencies = ["com.objectstack.service.settings"];
436
469
  this.version = "1.0.0";
437
470
  this.type = "standard";
438
471
  this.options = options;
@@ -515,11 +548,13 @@ var SmsServicePlugin = class {
515
548
  try {
516
549
  const payload = await settings.getNamespace("sms");
517
550
  const values = {};
551
+ const sources = {};
518
552
  for (const [k, v] of Object.entries(payload.values)) {
519
553
  values[k] = v?.value;
554
+ if (v?.source) sources[k] = String(v.source);
520
555
  }
521
556
  this.dailyQuota?.setQuota(values.daily_quota);
522
- if (!this.options.transport) this.applySmsSettings(values, ctx);
557
+ if (!this.options.transport) this.applySmsSettings(values, sources, ctx);
523
558
  } catch (err) {
524
559
  ctx.logger.warn("SmsServicePlugin: failed to apply sms settings: " + (err?.message ?? err));
525
560
  }
@@ -582,7 +617,7 @@ var SmsServicePlugin = class {
582
617
  * on the running SmsService. Incomplete credentials keep the previous
583
618
  * transport (with a warning) so a half-saved form can't break delivery.
584
619
  */
585
- applySmsSettings(values, ctx) {
620
+ applySmsSettings(values, sources, ctx) {
586
621
  if (!this.service) return;
587
622
  const resolved = providerFromSettings(values);
588
623
  if (resolved.missing) {
@@ -592,7 +627,7 @@ var SmsServicePlugin = class {
592
627
  return;
593
628
  }
594
629
  if (resolved.provider === "log") {
595
- if (values.provider === "log") {
630
+ if (values.provider === "log" && (sources.provider ?? "default") !== "default") {
596
631
  this.service.setTransport(new LogSmsTransport(ctx.logger), false);
597
632
  ctx.logger.info("SmsServicePlugin: sms settings applied (provider=log; SMS will NOT be sent).");
598
633
  }