@cosmicdrift/kumiko-types 0.233.0 → 0.235.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cosmicdrift/kumiko-types",
3
- "version": "0.233.0",
3
+ "version": "0.235.0",
4
4
  "description": "Framework-Type-Definitions für Kumiko — FeatureDefinition, BootCheck-Types und die reinen Engine-Types. Erlaubt Downstream-Konsumenten, gegen die Type-Contracts zu bauen, ohne das ganze Framework-Package zu importieren. Enthaelt keine identitaets-sensitiven Runtime-Werte mehr (Error-Klassen leben seit #1629 in kumiko-framework, Brand-Symbole nutzen Symbol.for) und ist deshalb eine plain dependency, keine peerDependency.",
5
5
  "license": "BUSL-1.1",
6
6
  "author": "Marc Frost <marc@cosmicdriftgamestudio.com>",
package/src/config.ts CHANGED
@@ -369,7 +369,23 @@ export type JobDefinition = {
369
369
  readonly backoff?: "fixed" | "exponential" | undefined;
370
370
  readonly timeout?: number | undefined;
371
371
  readonly schema?: ZodType | undefined;
372
+ // Enqueue this job once when a runner for its lane starts. Fire-and-forget:
373
+ // the enqueue is awaited, the run is not, so a throwing handler only fails
374
+ // the queue job — the process keeps booting and reports ready.
375
+ // Deduped on a fixed job id, so it runs at most once per Redis dataset: a
376
+ // boot job that already ran (or failed) is not retried on a later deploy.
377
+ // Never a deploy gate — use `bootGate` for that.
372
378
  readonly runOnBoot?: boolean | undefined;
379
+ // Run this job inline while the runner for its lane starts, before cron
380
+ // schedules and `runOnBoot` enqueues. The handler is awaited and a throw
381
+ // rejects the runner's start() — which rejects runProdApp's boot, so the
382
+ // process exits before it ever reports ready. That makes it a real deploy
383
+ // gate, unlike `runOnBoot`. Runs on every start, never deduped.
384
+ // `retries`/`timeout`/`backoff` are BullMQ options and do not apply on the
385
+ // inline path. Incompatible with `perTenant` and `concurrency: "sequential"`.
386
+ // The gate runs wherever a job runner for its lane starts — a setup that
387
+ // starts no runner for that lane runs no gate.
388
+ readonly bootGate?: boolean | undefined;
373
389
  readonly perTenant?: boolean | undefined;
374
390
  // Which deploy-lane runs this job. Default "worker". Set "api" only for
375
391
  // short CPU-light handlers (token cleanup, in-process cache warmup) that
package/src/nav-icon.ts CHANGED
@@ -62,4 +62,32 @@ export type NavIconKey =
62
62
  | "check"
63
63
  | "arrow-left"
64
64
  | "arrow-right"
65
- | "copy";
65
+ | "copy"
66
+ | "pencil"
67
+ | "eye"
68
+ | "eye-off"
69
+ | "filter"
70
+ | "refresh"
71
+ | "more-horizontal"
72
+ | "more-vertical"
73
+ | "external-link"
74
+ | "chevron-down"
75
+ | "chevron-right"
76
+ | "save"
77
+ | "undo"
78
+ | "archive"
79
+ | "star"
80
+ | "flag"
81
+ | "clock"
82
+ | "map-pin"
83
+ | "phone"
84
+ | "printer"
85
+ | "alert-triangle"
86
+ | "info"
87
+ | "check-circle"
88
+ | "x-circle"
89
+ | "loader";
90
+
91
+ // Alias kept because the union stopped being nav-only — actions and fields
92
+ // (added on this branch) also key their icons against it.
93
+ export type IconKey = NavIconKey;
package/src/nav.ts CHANGED
@@ -3,7 +3,7 @@ import type { NavIconKey } from "./nav-icon";
3
3
  import type { TargetRef } from "./target-ref";
4
4
  import type { TreeAction } from "./tree-node";
5
5
 
6
- export type { NavIconKey } from "./nav-icon";
6
+ export type { IconKey, NavIconKey } from "./nav-icon";
7
7
 
8
8
  // Nav entry declaration. Every feature that wants to appear in the app's
9
9
  // navigation tree registers one or more entries via r.nav(). The engine
package/src/projection.ts CHANGED
@@ -161,4 +161,10 @@ export type MultiStreamProjectionDefinition = {
161
161
  // writes duplicate rows. Misuse = duplicated side
162
162
  // effects, not a safety property.
163
163
  readonly delivery?: "shared" | "per-instance";
164
+ // Where the consumer's cursor starts on its FIRST registration. Default
165
+ // "beginning" replays the full log. "now" seeds the cursor at the current
166
+ // MAX(events.id) so mounting the MSP into an existing app does not
167
+ // retroactively fire side effects for historical events. Only affects the
168
+ // first registration — an existing cursor row is never clobbered.
169
+ readonly startFrom?: "beginning" | "now";
164
170
  };
package/src/screen.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import type { FieldIconKey } from "./field-icon";
2
2
  import type { FieldDefinition } from "./fields";
3
3
  import type { AccessRule } from "./handlers";
4
- import type { NavIconKey } from "./nav-icon";
4
+ import type { IconKey, NavIconKey } from "./nav-icon";
5
5
 
6
6
  export type { FieldIconKey } from "./field-icon";
7
7
 
@@ -227,6 +227,10 @@ export type RowActionWriteHandler = {
227
227
  /** Visual-Style. "danger" rendert rot + erzwingt einen Confirm-
228
228
  * Dialog (auch ohne expliziten `confirm`-Key). */
229
229
  readonly style?: "primary" | "secondary" | "danger";
230
+ /** Overrides the id-based default icon (see ACTION_ICON_BY_ID in
231
+ * kumiko-renderer) — closed IconKey vocabulary into the ICONS registry
232
+ * (renderer-web), analogous to EditFieldSpec.icon. */
233
+ readonly icon?: IconKey;
230
234
  };
231
235
 
232
236
  export type RowActionNavigateBase = {
@@ -252,6 +256,10 @@ export type RowActionNavigateBase = {
252
256
  * auf navigate — ein Row-Klick darf keinen (evtl. destruktiven, unbestätigten)
253
257
  * Write auslösen, daher nicht auf writeHandler-Actions. */
254
258
  readonly rowClick?: boolean;
259
+ /** Overrides the id-based default icon (see ACTION_ICON_BY_ID in
260
+ * kumiko-renderer) — closed IconKey vocabulary into the ICONS registry
261
+ * (renderer-web), analogous to EditFieldSpec.icon. */
262
+ readonly icon?: IconKey;
255
263
  };
256
264
 
257
265
  /** Exactly one of `screen` / `entity` — mutual exclusivity is type-enforced
@@ -682,6 +690,11 @@ export type EditFieldsSection = {
682
690
  readonly description?: string;
683
691
  readonly columns?: number;
684
692
  readonly fields: readonly EditFieldSpec[];
693
+ /** Rendered left of the section title, `text-muted-foreground` — closed
694
+ * IconKey vocabulary into the ICONS registry (renderer-web), analogous
695
+ * to EditFieldSpec.icon. No title → no icon, and no heuristic derives
696
+ * one from the title (titles are free i18n strings). */
697
+ readonly icon?: IconKey;
685
698
  };
686
699
 
687
700
  export type EditExtensionSection = {
@@ -798,6 +811,13 @@ export type EntityEditScreenDefinition = {
798
811
  * das `mask.title`-Label des Config-Keys. Fehlt ein Eintrag, gilt die
799
812
  * Konvention. */
800
813
  readonly fieldLabels?: Readonly<Record<string, string>>;
814
+ /** Header action buttons. Reuses `RowAction` — analogous to
815
+ * `ProjectionDetailScreenDefinition.actions` (the loaded record stands
816
+ * in for the "row"). `rowClick` has no target here and is rejected by
817
+ * the boot-validator, same as on projectionDetail. Not rendered in
818
+ * create mode — every action targets an existing record, which the
819
+ * create branch doesn't have yet. */
820
+ readonly actions?: readonly RowAction[];
801
821
  readonly slots?: ScreenSlots;
802
822
  readonly access?: AccessRule;
803
823
  };
@@ -964,6 +984,32 @@ export type ConfigEditScreenDefinition = {
964
984
  readonly access?: AccessRule;
965
985
  };
966
986
 
987
+ // Self-populating counterpart of ConfigEditScreenDefinition for `r.secret(...)`
988
+ // declarations. No EditLayout/FieldDefinition — secrets never round-trip a
989
+ // stored value to the client, so the screen renders its own body (password
990
+ // inputs + redaction display + delete) instead of going through RenderEdit.
991
+ export type SecretsEditSection = {
992
+ readonly title?: string;
993
+ readonly fields: readonly string[];
994
+ };
995
+
996
+ export type SecretsEditScreenDefinition = {
997
+ readonly id: string;
998
+ readonly type: "secretsEdit";
999
+ readonly nav?: ScreenNavSugar;
1000
+ readonly detailFor?: string;
1001
+ /** field id -> qualified secret name (`<feature>:secret:<kebab>`). */
1002
+ readonly secretKeys: Readonly<Record<string, string>>;
1003
+ /** field id -> i18n key for the label. */
1004
+ readonly fieldLabels: Readonly<Record<string, string>>;
1005
+ /** field id -> i18n key for the hint, only where the declaration carries one. */
1006
+ readonly fieldHints?: Readonly<Record<string, string>>;
1007
+ /** field ids whose declaration set `required: true`. */
1008
+ readonly requiredFields?: readonly string[];
1009
+ readonly sections: readonly SecretsEditSection[];
1010
+ readonly access?: AccessRule;
1011
+ };
1012
+
967
1013
  // --- shared slots (Level 4 from ui-architecture.md) ---
968
1014
 
969
1015
  export type ScreenSlots = {
@@ -1010,4 +1056,5 @@ export type ScreenDefinition =
1010
1056
  | EntityEditScreenDefinition
1011
1057
  | ActionFormScreenDefinition
1012
1058
  | ConfigEditScreenDefinition
1059
+ | SecretsEditScreenDefinition
1013
1060
  | CustomScreenDefinition;