@smplkit/sdk 1.3.39 → 1.3.40

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/README.md CHANGED
@@ -7,7 +7,7 @@ The official TypeScript SDK for [smplkit](https://www.smplkit.com) — simple ap
7
7
  ## Installation
8
8
 
9
9
  ```bash
10
- npm install smplkit-sdk
10
+ npm install @smplkit/sdk
11
11
  ```
12
12
 
13
13
  ## Requirements
@@ -17,7 +17,7 @@ npm install smplkit-sdk
17
17
  ## Quick Start
18
18
 
19
19
  ```typescript
20
- import { SmplClient } from "smplkit-sdk";
20
+ import { SmplClient } from "@smplkit/sdk";
21
21
 
22
22
  // Option 1: Explicit API key
23
23
  const client = new SmplClient({ apiKey: "sk_api_..." });
@@ -32,29 +32,6 @@ const client2 = new SmplClient();
32
32
  const client3 = new SmplClient();
33
33
  ```
34
34
 
35
- ```typescript
36
- import { SmplClient } from "smplkit-sdk";
37
-
38
- const client = new SmplClient({ apiKey: "sk_api_..." });
39
-
40
- // Get a config by key
41
- const config = await client.config.getByKey("user_service");
42
-
43
- // List all configs
44
- const configs = await client.config.list();
45
-
46
- // Create a config
47
- const newConfig = await client.config.create({
48
- name: "My Service",
49
- key: "my_service",
50
- description: "Configuration for my service",
51
- values: { timeout: 30, retries: 3 },
52
- });
53
-
54
- // Delete a config
55
- await client.config.delete(newConfig.id);
56
- ```
57
-
58
35
  ## Configuration
59
36
 
60
37
  The API key is resolved using the following priority:
@@ -79,15 +56,159 @@ const client = new SmplClient({
79
56
  });
80
57
  ```
81
58
 
59
+ ## Config
60
+
61
+ ### Runtime (resolve config values)
62
+
63
+ ```typescript
64
+ // Resolve config values for a service
65
+ const config = await client.config.get("my-service");
66
+ console.log(config.getString("timeout"));
67
+ console.log(config.getNumber("retries"));
68
+
69
+ // Subscribe to live updates
70
+ client.config.subscribe("my-service", (config) => {
71
+ console.log("Config updated:", config.getString("timeout"));
72
+ });
73
+ ```
74
+
75
+ ### Management (CRUD)
76
+
77
+ ```typescript
78
+ // Create a config
79
+ const cfg = client.config.management.new("my-service", {
80
+ name: "My Service",
81
+ description: "Configuration for my service",
82
+ });
83
+ await cfg.save();
84
+
85
+ // List configs
86
+ const configs = await client.config.management.list();
87
+
88
+ // Get a config by id
89
+ const fetched = await client.config.management.get("my-service");
90
+
91
+ // Delete a config
92
+ await client.config.management.delete("my-service");
93
+ ```
94
+
95
+ ## Flags
96
+
97
+ ### Runtime (evaluate flags)
98
+
99
+ ```typescript
100
+ import { SmplClient, Rule } from "@smplkit/sdk";
101
+
102
+ const client = new SmplClient({ environment: "production", service: "my-service" });
103
+
104
+ // Declare a flag
105
+ const checkoutFlag = client.flags.booleanFlag("checkout-v2", { default: false });
106
+
107
+ // Start the client (connects and fetches flags)
108
+ await client.flags.initialize();
109
+
110
+ // Evaluate with context
111
+ const enabled = await checkoutFlag.get({ user: { plan: "enterprise" } });
112
+ console.log("checkout-v2:", enabled);
113
+
114
+ client.close();
115
+ ```
116
+
117
+ ### Management (CRUD)
118
+
119
+ ```typescript
120
+ // Create flags
121
+ const boolFlag = client.flags.management.newBooleanFlag("checkout-v2", {
122
+ default: false,
123
+ description: "Controls rollout of the new checkout experience.",
124
+ });
125
+
126
+ // Add targeting rules
127
+ boolFlag.addRule(
128
+ new Rule("Enable for enterprise users")
129
+ .environment("production")
130
+ .when("user.plan", "==", "enterprise")
131
+ .serve(true)
132
+ .build(),
133
+ );
134
+
135
+ // Configure environments
136
+ boolFlag.setEnvironmentEnabled("production", true);
137
+ boolFlag.setEnvironmentDefault("production", false);
138
+
139
+ await boolFlag.save();
140
+
141
+ // Other factory methods
142
+ const strFlag = client.flags.management.newStringFlag("banner-color", {
143
+ default: "red",
144
+ values: [{ name: "Red", value: "red" }, { name: "Blue", value: "blue" }],
145
+ });
146
+ const numFlag = client.flags.management.newNumberFlag("max-retries", { default: 3 });
147
+ const jsonFlag = client.flags.management.newJsonFlag("ui-theme", {
148
+ default: { mode: "light" },
149
+ });
150
+
151
+ // List / get / delete
152
+ const flags = await client.flags.management.list();
153
+ const flag = await client.flags.management.get("checkout-v2");
154
+ await client.flags.management.delete("checkout-v2");
155
+ ```
156
+
157
+ ## Logging
158
+
159
+ ### Runtime (live log level management)
160
+
161
+ ```typescript
162
+ const client = new SmplClient({ environment: "production", service: "my-service" });
163
+
164
+ // Register an adapter for your logging library
165
+ client.logging.registerAdapter(myAdapter);
166
+
167
+ // Start the logging runtime (connects and fetches log levels)
168
+ await client.logging.start();
169
+
170
+ client.logging.onChange((loggers) => {
171
+ console.log("Log levels updated:", loggers.map((l) => `${l.id}=${l.level}`));
172
+ });
173
+ ```
174
+
175
+ ### Management (CRUD)
176
+
177
+ ```typescript
178
+ // Create a logger
179
+ const logger = client.logging.management.new("sqlalchemy.engine", { managed: true });
180
+ logger.setLevel(LogLevel.WARN);
181
+ logger.setEnvironmentLevel("production", LogLevel.ERROR);
182
+ await logger.save();
183
+
184
+ // Create a log group
185
+ const group = client.logging.management.newGroup("sql", { name: "SQL Loggers" });
186
+ group.setLevel(LogLevel.WARN);
187
+ await group.save();
188
+
189
+ // Assign logger to group
190
+ logger.group = group.id;
191
+ await logger.save();
192
+
193
+ // List / get / delete
194
+ const loggers = await client.logging.management.list();
195
+ const fetched = await client.logging.management.get("Sqlalchemy.Engine");
196
+ await client.logging.management.delete("Sqlalchemy.Engine");
197
+
198
+ const groups = await client.logging.management.listGroups();
199
+ const fetchedGroup = await client.logging.management.getGroup(group.id);
200
+ await client.logging.management.deleteGroup(group.id);
201
+ ```
202
+
82
203
  ## Error Handling
83
204
 
84
205
  All SDK errors extend `SmplError`:
85
206
 
86
207
  ```typescript
87
- import { SmplError, SmplNotFoundError } from "smplkit-sdk";
208
+ import { SmplError, SmplNotFoundError } from "@smplkit/sdk";
88
209
 
89
210
  try {
90
- const config = await client.config.getByKey("nonexistent");
211
+ const flag = await client.flags.management.get("nonexistent");
91
212
  } catch (err) {
92
213
  if (err instanceof SmplNotFoundError) {
93
214
  console.log("Not found:", err.message);
package/dist/index.cjs CHANGED
@@ -16624,17 +16624,20 @@ __export(index_exports, {
16624
16624
  BooleanFlag: () => BooleanFlag,
16625
16625
  Config: () => Config,
16626
16626
  ConfigClient: () => ConfigClient,
16627
+ ConfigManagement: () => ConfigManagement,
16627
16628
  Context: () => Context,
16628
16629
  Flag: () => Flag,
16629
16630
  FlagChangeEvent: () => FlagChangeEvent,
16630
16631
  FlagStats: () => FlagStats,
16631
16632
  FlagsClient: () => FlagsClient,
16633
+ FlagsManagement: () => FlagsManagement,
16632
16634
  JsonFlag: () => JsonFlag,
16633
16635
  LiveConfigProxy: () => LiveConfigProxy,
16634
16636
  LogGroup: () => LogGroup,
16635
16637
  LogLevel: () => LogLevel,
16636
16638
  Logger: () => Logger,
16637
16639
  LoggingClient: () => LoggingClient,
16640
+ LoggingManagement: () => LoggingManagement,
16638
16641
  NumberFlag: () => NumberFlag,
16639
16642
  PinoAdapter: () => PinoAdapter,
16640
16643
  Rule: () => Rule,
@@ -17043,6 +17046,27 @@ function buildRequestBody(options) {
17043
17046
  }
17044
17047
  };
17045
17048
  }
17049
+ var ConfigManagement = class {
17050
+ constructor(_client) {
17051
+ this._client = _client;
17052
+ }
17053
+ /** Create an unsaved config. Call `.save()` to persist. */
17054
+ new(id, options) {
17055
+ return this._client._mgNew(id, options);
17056
+ }
17057
+ /** Fetch a config by id. */
17058
+ async get(id) {
17059
+ return this._client._getById(id);
17060
+ }
17061
+ /** List all configs. */
17062
+ async list() {
17063
+ return this._client._mgList();
17064
+ }
17065
+ /** Delete a config by id. */
17066
+ async delete(id) {
17067
+ return this._client._mgDelete(id);
17068
+ }
17069
+ };
17046
17070
  var ConfigClient = class {
17047
17071
  /** @internal */
17048
17072
  _apiKey;
@@ -17054,6 +17078,8 @@ var ConfigClient = class {
17054
17078
  _getSharedWs;
17055
17079
  /** @internal — set by SmplClient after construction. */
17056
17080
  _parent = null;
17081
+ /** Management API — CRUD operations on Config models. */
17082
+ management;
17057
17083
  _configCache = {};
17058
17084
  _initialized = false;
17059
17085
  _listeners = [];
@@ -17082,12 +17108,13 @@ var ConfigClient = class {
17082
17108
  }
17083
17109
  }
17084
17110
  });
17111
+ this.management = new ConfigManagement(this);
17085
17112
  }
17086
17113
  // ------------------------------------------------------------------
17087
- // Management: factory method
17114
+ // Management: internal implementations (delegated from ConfigManagement)
17088
17115
  // ------------------------------------------------------------------
17089
- /** Create an unsaved config. Call `.save()` to persist. */
17090
- new(id, options) {
17116
+ /** @internal */
17117
+ _mgNew(id, options) {
17091
17118
  return new Config(this, {
17092
17119
  id,
17093
17120
  name: options?.name ?? keyToDisplayName(id),
@@ -17099,15 +17126,8 @@ var ConfigClient = class {
17099
17126
  updatedAt: null
17100
17127
  });
17101
17128
  }
17102
- // ------------------------------------------------------------------
17103
- // Management: CRUD
17104
- // ------------------------------------------------------------------
17105
- /** Fetch a config by id. */
17106
- async get(id) {
17107
- return this._getById(id);
17108
- }
17109
- /** List all configs. */
17110
- async list() {
17129
+ /** @internal */
17130
+ async _mgList() {
17111
17131
  let data;
17112
17132
  try {
17113
17133
  const result = await this._http.GET("/api/v1/configs", {});
@@ -17119,8 +17139,8 @@ var ConfigClient = class {
17119
17139
  if (!data) return [];
17120
17140
  return data.data.map((r) => resourceToConfig(r, this));
17121
17141
  }
17122
- /** Delete a config by id. */
17123
- async delete(id) {
17142
+ /** @internal */
17143
+ async _mgDelete(id) {
17124
17144
  try {
17125
17145
  const result = await this._http.DELETE("/api/v1/configs/{id}", {
17126
17146
  params: { path: { id } }
@@ -17200,12 +17220,12 @@ var ConfigClient = class {
17200
17220
  // Runtime: resolve and subscribe
17201
17221
  // ------------------------------------------------------------------
17202
17222
  /**
17203
- * Resolve a config's values for the current environment.
17223
+ * Get a config's resolved values for the current environment.
17204
17224
  *
17205
17225
  * Returns the resolved key-value pairs for the given config.
17206
17226
  * Optionally pass a model class to map the resolved values.
17207
17227
  */
17208
- async resolve(id, model) {
17228
+ async get(id, model) {
17209
17229
  await this._ensureInitialized();
17210
17230
  const values = this._configCache[id];
17211
17231
  if (values === void 0) {
@@ -17273,13 +17293,13 @@ var ConfigClient = class {
17273
17293
  */
17274
17294
  async refresh() {
17275
17295
  if (!this._initialized) {
17276
- throw new SmplError("Config not initialized. Call resolve() or subscribe() first.");
17296
+ throw new SmplError("Config not initialized. Call get() or subscribe() first.");
17277
17297
  }
17278
17298
  const environment = this._parent?._environment;
17279
17299
  if (!environment) {
17280
17300
  throw new SmplError("No environment set.");
17281
17301
  }
17282
- const configs = await this.list();
17302
+ const configs = await this.management.list();
17283
17303
  const newCache = {};
17284
17304
  for (const cfg of configs) {
17285
17305
  const chain = await cfg._buildChain(configs);
@@ -17299,7 +17319,7 @@ var ConfigClient = class {
17299
17319
  if (!environment) {
17300
17320
  throw new SmplError("No environment set. Ensure SmplClient is configured.");
17301
17321
  }
17302
- const configs = await this.list();
17322
+ const configs = await this.management.list();
17303
17323
  const cache = {};
17304
17324
  for (const cfg of configs) {
17305
17325
  const chain = await cfg._buildChain(configs);
@@ -17315,7 +17335,7 @@ var ConfigClient = class {
17315
17335
  /** @internal — called by SmplClient for backward compat. */
17316
17336
  async _connectInternal(environment) {
17317
17337
  if (this._initialized) return;
17318
- const configs = await this.list();
17338
+ const configs = await this.management.list();
17319
17339
  const cache = {};
17320
17340
  for (const cfg of configs) {
17321
17341
  const chain = await cfg._buildChain(configs);
@@ -17694,6 +17714,39 @@ var ContextRegistrationBuffer = class {
17694
17714
  return this._pending.length;
17695
17715
  }
17696
17716
  };
17717
+ var FlagsManagement = class {
17718
+ constructor(_client) {
17719
+ this._client = _client;
17720
+ }
17721
+ /** Create an unsaved boolean flag. Call `.save()` to persist. */
17722
+ newBooleanFlag(id, options) {
17723
+ return this._client._mgNewBooleanFlag(id, options);
17724
+ }
17725
+ /** Create an unsaved string flag. Call `.save()` to persist. */
17726
+ newStringFlag(id, options) {
17727
+ return this._client._mgNewStringFlag(id, options);
17728
+ }
17729
+ /** Create an unsaved number flag. Call `.save()` to persist. */
17730
+ newNumberFlag(id, options) {
17731
+ return this._client._mgNewNumberFlag(id, options);
17732
+ }
17733
+ /** Create an unsaved JSON flag. Call `.save()` to persist. */
17734
+ newJsonFlag(id, options) {
17735
+ return this._client._mgNewJsonFlag(id, options);
17736
+ }
17737
+ /** Fetch a flag by id. */
17738
+ async get(id) {
17739
+ return this._client._mgGet(id);
17740
+ }
17741
+ /** List all flags. */
17742
+ async list() {
17743
+ return this._client._mgList();
17744
+ }
17745
+ /** Delete a flag by id. */
17746
+ async delete(id) {
17747
+ return this._client._mgDelete(id);
17748
+ }
17749
+ };
17697
17750
  var FlagsClient = class {
17698
17751
  /** @internal */
17699
17752
  _apiKey;
@@ -17718,6 +17771,8 @@ var FlagsClient = class {
17718
17771
  _ensureWs;
17719
17772
  /** @internal — set by SmplClient after construction. */
17720
17773
  _parent = null;
17774
+ /** Management API — CRUD operations on Flag models. */
17775
+ management;
17721
17776
  /** @internal */
17722
17777
  constructor(apiKey, ensureWs, timeout) {
17723
17778
  this._apiKey = apiKey;
@@ -17753,12 +17808,13 @@ var FlagsClient = class {
17753
17808
  },
17754
17809
  fetch: fetchWithTimeout
17755
17810
  });
17811
+ this.management = new FlagsManagement(this);
17756
17812
  }
17757
17813
  // ------------------------------------------------------------------
17758
- // Management: factory methods (return unsaved flags)
17814
+ // Management: internal implementations (delegated from FlagsManagement)
17759
17815
  // ------------------------------------------------------------------
17760
- /** Create an unsaved boolean flag. Call `.save()` to persist. */
17761
- newBooleanFlag(id, options) {
17816
+ /** @internal */
17817
+ _mgNewBooleanFlag(id, options) {
17762
17818
  return new BooleanFlag(this, {
17763
17819
  id,
17764
17820
  name: options.name ?? keyToDisplayName(id),
@@ -17774,8 +17830,8 @@ var FlagsClient = class {
17774
17830
  updatedAt: null
17775
17831
  });
17776
17832
  }
17777
- /** Create an unsaved string flag. Call `.save()` to persist. */
17778
- newStringFlag(id, options) {
17833
+ /** @internal */
17834
+ _mgNewStringFlag(id, options) {
17779
17835
  return new StringFlag(this, {
17780
17836
  id,
17781
17837
  name: options.name ?? keyToDisplayName(id),
@@ -17788,8 +17844,8 @@ var FlagsClient = class {
17788
17844
  updatedAt: null
17789
17845
  });
17790
17846
  }
17791
- /** Create an unsaved number flag. Call `.save()` to persist. */
17792
- newNumberFlag(id, options) {
17847
+ /** @internal */
17848
+ _mgNewNumberFlag(id, options) {
17793
17849
  return new NumberFlag(this, {
17794
17850
  id,
17795
17851
  name: options.name ?? keyToDisplayName(id),
@@ -17802,8 +17858,8 @@ var FlagsClient = class {
17802
17858
  updatedAt: null
17803
17859
  });
17804
17860
  }
17805
- /** Create an unsaved JSON flag. Call `.save()` to persist. */
17806
- newJsonFlag(id, options) {
17861
+ /** @internal */
17862
+ _mgNewJsonFlag(id, options) {
17807
17863
  return new JsonFlag(this, {
17808
17864
  id,
17809
17865
  name: options.name ?? keyToDisplayName(id),
@@ -17816,11 +17872,8 @@ var FlagsClient = class {
17816
17872
  updatedAt: null
17817
17873
  });
17818
17874
  }
17819
- // ------------------------------------------------------------------
17820
- // Management: CRUD
17821
- // ------------------------------------------------------------------
17822
- /** Fetch a flag by id. */
17823
- async get(id) {
17875
+ /** @internal */
17876
+ async _mgGet(id) {
17824
17877
  let data;
17825
17878
  try {
17826
17879
  const result = await this._http.GET("/api/v1/flags/{id}", {
@@ -17837,8 +17890,8 @@ var FlagsClient = class {
17837
17890
  }
17838
17891
  return this._resourceToModel(data.data);
17839
17892
  }
17840
- /** List all flags. */
17841
- async list() {
17893
+ /** @internal */
17894
+ async _mgList() {
17842
17895
  let data;
17843
17896
  try {
17844
17897
  const result = await this._http.GET("/api/v1/flags", {});
@@ -17850,8 +17903,8 @@ var FlagsClient = class {
17850
17903
  if (!data) return [];
17851
17904
  return data.data.map((r) => this._resourceToModel(r));
17852
17905
  }
17853
- /** Delete a flag by id. */
17854
- async delete(id) {
17906
+ /** @internal */
17907
+ async _mgDelete(id) {
17855
17908
  try {
17856
17909
  const result = await this._http.DELETE("/api/v1/flags/{id}", {
17857
17910
  params: { path: { id } }
@@ -18498,6 +18551,43 @@ function wrapFetchError3(err) {
18498
18551
  `Request failed: ${err instanceof Error ? err.message : String(err)}`
18499
18552
  );
18500
18553
  }
18554
+ var LoggingManagement = class {
18555
+ constructor(_client) {
18556
+ this._client = _client;
18557
+ }
18558
+ /** Create an unsaved logger. Call `.save()` to persist. */
18559
+ new(id, options) {
18560
+ return this._client._mgNew(id, options);
18561
+ }
18562
+ /** Fetch a logger by id. */
18563
+ async get(id) {
18564
+ return this._client._mgGet(id);
18565
+ }
18566
+ /** List all loggers. */
18567
+ async list() {
18568
+ return this._client._mgList();
18569
+ }
18570
+ /** Delete a logger by id. */
18571
+ async delete(id) {
18572
+ return this._client._mgDelete(id);
18573
+ }
18574
+ /** Create an unsaved log group. Call `.save()` to persist. */
18575
+ newGroup(id, options) {
18576
+ return this._client._mgNewGroup(id, options);
18577
+ }
18578
+ /** Fetch a log group by id. */
18579
+ async getGroup(id) {
18580
+ return this._client._mgGetGroup(id);
18581
+ }
18582
+ /** List all log groups. */
18583
+ async listGroups() {
18584
+ return this._client._mgListGroups();
18585
+ }
18586
+ /** Delete a log group by id. */
18587
+ async deleteGroup(id) {
18588
+ return this._client._mgDeleteGroup(id);
18589
+ }
18590
+ };
18501
18591
  var LoggingClient = class {
18502
18592
  /** @internal */
18503
18593
  _apiKey;
@@ -18507,6 +18597,8 @@ var LoggingClient = class {
18507
18597
  _http;
18508
18598
  /** @internal — set by SmplClient after construction. */
18509
18599
  _parent = null;
18600
+ /** Management API — CRUD operations on Logger and LogGroup models. */
18601
+ management;
18510
18602
  _ensureWs;
18511
18603
  _wsManager = null;
18512
18604
  _started = false;
@@ -18540,6 +18632,7 @@ var LoggingClient = class {
18540
18632
  }
18541
18633
  }
18542
18634
  });
18635
+ this.management = new LoggingManagement(this);
18543
18636
  }
18544
18637
  // ------------------------------------------------------------------
18545
18638
  // Adapter registration
@@ -18558,10 +18651,10 @@ var LoggingClient = class {
18558
18651
  this._adapters.push(adapter);
18559
18652
  }
18560
18653
  // ------------------------------------------------------------------
18561
- // Management: Logger factory
18654
+ // Management: internal implementations (delegated from LoggingManagement)
18562
18655
  // ------------------------------------------------------------------
18563
- /** Create an unsaved logger. Call `.save()` to persist. */
18564
- new(id, options) {
18656
+ /** @internal */
18657
+ _mgNew(id, options) {
18565
18658
  return new Logger(this, {
18566
18659
  id,
18567
18660
  name: options?.name ?? keyToDisplayName(id),
@@ -18574,11 +18667,8 @@ var LoggingClient = class {
18574
18667
  updatedAt: null
18575
18668
  });
18576
18669
  }
18577
- // ------------------------------------------------------------------
18578
- // Management: Logger CRUD
18579
- // ------------------------------------------------------------------
18580
- /** Fetch a logger by id. */
18581
- async get(id) {
18670
+ /** @internal */
18671
+ async _mgGet(id) {
18582
18672
  let data;
18583
18673
  try {
18584
18674
  const result = await this._http.GET("/api/v1/loggers/{id}", {
@@ -18595,8 +18685,8 @@ var LoggingClient = class {
18595
18685
  }
18596
18686
  return this._loggerToModel(data.data);
18597
18687
  }
18598
- /** List all loggers. */
18599
- async list() {
18688
+ /** @internal */
18689
+ async _mgList() {
18600
18690
  let data;
18601
18691
  try {
18602
18692
  const result = await this._http.GET("/api/v1/loggers", {});
@@ -18608,8 +18698,8 @@ var LoggingClient = class {
18608
18698
  if (!data) return [];
18609
18699
  return data.data.map((r) => this._loggerToModel(r));
18610
18700
  }
18611
- /** Delete a logger by id. */
18612
- async delete(id) {
18701
+ /** @internal */
18702
+ async _mgDelete(id) {
18613
18703
  try {
18614
18704
  const result = await this._http.DELETE("/api/v1/loggers/{id}", {
18615
18705
  params: { path: { id } }
@@ -18620,11 +18710,8 @@ var LoggingClient = class {
18620
18710
  wrapFetchError3(err);
18621
18711
  }
18622
18712
  }
18623
- // ------------------------------------------------------------------
18624
- // Management: LogGroup factory
18625
- // ------------------------------------------------------------------
18626
- /** Create an unsaved log group. Call `.save()` to persist. */
18627
- newGroup(id, options) {
18713
+ /** @internal */
18714
+ _mgNewGroup(id, options) {
18628
18715
  return new LogGroup(this, {
18629
18716
  id,
18630
18717
  name: options?.name ?? keyToDisplayName(id),
@@ -18635,20 +18722,17 @@ var LoggingClient = class {
18635
18722
  updatedAt: null
18636
18723
  });
18637
18724
  }
18638
- // ------------------------------------------------------------------
18639
- // Management: LogGroup CRUD
18640
- // ------------------------------------------------------------------
18641
- /** Fetch a log group by id. */
18642
- async getGroup(id) {
18643
- const groups = await this.listGroups();
18725
+ /** @internal */
18726
+ async _mgGetGroup(id) {
18727
+ const groups = await this.management.listGroups();
18644
18728
  const match = groups.find((g) => g.id === id);
18645
18729
  if (!match) {
18646
18730
  throw new SmplNotFoundError(`LogGroup with id '${id}' not found`);
18647
18731
  }
18648
18732
  return match;
18649
18733
  }
18650
- /** List all log groups. */
18651
- async listGroups() {
18734
+ /** @internal */
18735
+ async _mgListGroups() {
18652
18736
  let data;
18653
18737
  try {
18654
18738
  const result = await this._http.GET("/api/v1/log_groups", {});
@@ -18661,9 +18745,9 @@ var LoggingClient = class {
18661
18745
  if (!data) return [];
18662
18746
  return data.data.map((r) => this._groupToModel(r));
18663
18747
  }
18664
- /** Delete a log group by id. */
18665
- async deleteGroup(id) {
18666
- const group = await this.getGroup(id);
18748
+ /** @internal */
18749
+ async _mgDeleteGroup(id) {
18750
+ const group = await this.management.getGroup(id);
18667
18751
  try {
18668
18752
  const result = await this._http.DELETE("/api/v1/log_groups/{id}", {
18669
18753
  params: { path: { id: group.id } }
@@ -18805,14 +18889,20 @@ var LoggingClient = class {
18805
18889
  }
18806
18890
  for (const { name, level } of discovered) {
18807
18891
  try {
18808
- const logger = this.new(name, { managed: true });
18892
+ const logger = this.management.new(name, { managed: true });
18809
18893
  logger.setLevel(level);
18810
18894
  await logger.save();
18811
- } catch {
18895
+ } catch (err) {
18896
+ console.warn(
18897
+ `[smplkit] Failed to register logger "${name}": ${err instanceof Error ? err.message : String(err)}`
18898
+ );
18812
18899
  }
18813
18900
  }
18814
18901
  try {
18815
- const [serverLoggers] = await Promise.all([this.list(), this.listGroups()]);
18902
+ const [serverLoggers] = await Promise.all([
18903
+ this.management.list(),
18904
+ this.management.listGroups()
18905
+ ]);
18816
18906
  this._applyLevels(serverLoggers);
18817
18907
  } catch {
18818
18908
  }
@@ -18911,7 +19001,7 @@ var LoggingClient = class {
18911
19001
  }
18912
19002
  /** Called by adapter hooks when a new logger is created in the framework. */
18913
19003
  _onAdapterNewLogger(_name, _level) {
18914
- const logger = this.new(_name, { managed: true });
19004
+ const logger = this.management.new(_name, { managed: true });
18915
19005
  logger.setLevel(_level);
18916
19006
  logger.save().catch(() => {
18917
19007
  });
@@ -19728,17 +19818,20 @@ var PinoAdapter = class {
19728
19818
  BooleanFlag,
19729
19819
  Config,
19730
19820
  ConfigClient,
19821
+ ConfigManagement,
19731
19822
  Context,
19732
19823
  Flag,
19733
19824
  FlagChangeEvent,
19734
19825
  FlagStats,
19735
19826
  FlagsClient,
19827
+ FlagsManagement,
19736
19828
  JsonFlag,
19737
19829
  LiveConfigProxy,
19738
19830
  LogGroup,
19739
19831
  LogLevel,
19740
19832
  Logger,
19741
19833
  LoggingClient,
19834
+ LoggingManagement,
19742
19835
  NumberFlag,
19743
19836
  PinoAdapter,
19744
19837
  Rule,