@almadar/evaluator 1.0.0 → 1.0.9

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/dist/index.js CHANGED
@@ -1,3 +1,5 @@
1
+ import '@almadar/operators';
2
+
1
3
  var __defProp = Object.defineProperty;
2
4
  var __export = (target, all) => {
3
5
  for (var name in all)
@@ -4043,8 +4045,192 @@ var coerce = {
4043
4045
  date: ((arg) => ZodDate.create({ ...arg, coerce: true }))
4044
4046
  };
4045
4047
  var NEVER = INVALID;
4046
-
4047
- // types/expression.ts
4048
+ var FieldTypeSchema = external_exports.enum([
4049
+ "string",
4050
+ "number",
4051
+ "boolean",
4052
+ "date",
4053
+ "timestamp",
4054
+ "datetime",
4055
+ "array",
4056
+ "object",
4057
+ "enum",
4058
+ "relation"
4059
+ ]);
4060
+ var RelationConfigSchema = external_exports.object({
4061
+ entity: external_exports.string().min(1, "Target entity is required"),
4062
+ field: external_exports.string().optional(),
4063
+ cardinality: external_exports.enum(["one", "many"]).optional(),
4064
+ onDelete: external_exports.enum(["cascade", "nullify", "restrict"]).optional()
4065
+ });
4066
+ var FieldFormatSchema = external_exports.enum([
4067
+ "email",
4068
+ "url",
4069
+ "phone",
4070
+ "date",
4071
+ "datetime",
4072
+ "uuid"
4073
+ ]);
4074
+ var EntityFieldSchema = external_exports.lazy(
4075
+ () => external_exports.object({
4076
+ name: external_exports.string().min(1, "Field name is required"),
4077
+ type: FieldTypeSchema,
4078
+ required: external_exports.boolean().optional(),
4079
+ default: external_exports.unknown().optional(),
4080
+ values: external_exports.array(external_exports.string()).optional(),
4081
+ enum: external_exports.array(external_exports.string()).optional(),
4082
+ format: FieldFormatSchema.optional(),
4083
+ min: external_exports.number().optional(),
4084
+ max: external_exports.number().optional(),
4085
+ items: EntityFieldSchema.optional(),
4086
+ relation: RelationConfigSchema.optional()
4087
+ }).refine(
4088
+ (field) => field.type !== "relation" || field.relation !== void 0,
4089
+ { message: 'Relation config is required when type is "relation"', path: ["relation"] }
4090
+ )
4091
+ );
4092
+ var ENTITY_ROLES = [
4093
+ "player",
4094
+ "enemy",
4095
+ "npc",
4096
+ "item",
4097
+ "tile",
4098
+ "projectile",
4099
+ "effect",
4100
+ "ui",
4101
+ "decoration",
4102
+ "vehicle"
4103
+ ];
4104
+ var EntityRoleSchema = external_exports.enum(ENTITY_ROLES);
4105
+ var VISUAL_STYLES = ["pixel", "vector", "hd", "1-bit", "isometric"];
4106
+ var VisualStyleSchema = external_exports.enum(VISUAL_STYLES);
4107
+ var GAME_TYPES = [
4108
+ "platformer",
4109
+ "roguelike",
4110
+ "top-down",
4111
+ "puzzle",
4112
+ "racing",
4113
+ "card",
4114
+ "board",
4115
+ "shooter",
4116
+ "rpg"
4117
+ ];
4118
+ var GameTypeSchema = external_exports.enum(GAME_TYPES);
4119
+ var AnimationDefSchema = external_exports.object({
4120
+ frames: external_exports.union([external_exports.array(external_exports.number()), external_exports.array(external_exports.string())]),
4121
+ fps: external_exports.number().positive(),
4122
+ loop: external_exports.boolean()
4123
+ });
4124
+ var SemanticAssetRefSchema = external_exports.object({
4125
+ role: EntityRoleSchema,
4126
+ category: external_exports.string().min(1),
4127
+ animations: external_exports.array(external_exports.string()).optional(),
4128
+ style: VisualStyleSchema.optional(),
4129
+ variant: external_exports.string().optional()
4130
+ });
4131
+ external_exports.object({
4132
+ basePath: external_exports.string(),
4133
+ path: external_exports.string(),
4134
+ tiles: external_exports.array(external_exports.number()).optional(),
4135
+ tileSize: external_exports.number().positive().optional(),
4136
+ files: external_exports.array(external_exports.string()).optional(),
4137
+ animations: external_exports.record(AnimationDefSchema).optional()
4138
+ });
4139
+ var AssetMappingSchema = external_exports.object({
4140
+ path: external_exports.string(),
4141
+ tiles: external_exports.array(external_exports.number()).optional(),
4142
+ tileSize: external_exports.number().positive().optional(),
4143
+ files: external_exports.array(external_exports.string()).optional(),
4144
+ animations: external_exports.record(AnimationDefSchema).optional()
4145
+ });
4146
+ external_exports.object({
4147
+ gameType: GameTypeSchema,
4148
+ style: VisualStyleSchema,
4149
+ basePath: external_exports.string(),
4150
+ mappings: external_exports.record(AssetMappingSchema)
4151
+ });
4152
+ var EntityPersistenceSchema = external_exports.enum([
4153
+ "persistent",
4154
+ "runtime",
4155
+ "singleton",
4156
+ "instance"
4157
+ ]);
4158
+ var OrbitalEntitySchema = external_exports.object({
4159
+ name: external_exports.string().min(1, "Entity name is required"),
4160
+ persistence: EntityPersistenceSchema.default("persistent"),
4161
+ collection: external_exports.string().optional(),
4162
+ fields: external_exports.array(EntityFieldSchema).min(1, "At least one field is required"),
4163
+ instances: external_exports.array(external_exports.record(external_exports.unknown())).optional(),
4164
+ timestamps: external_exports.boolean().optional(),
4165
+ softDelete: external_exports.boolean().optional(),
4166
+ description: external_exports.string().optional(),
4167
+ visual_prompt: external_exports.string().optional(),
4168
+ assetRef: SemanticAssetRefSchema.optional()
4169
+ });
4170
+ var EntitySchema = OrbitalEntitySchema;
4171
+ var ViewTypeSchema = external_exports.enum([
4172
+ "list",
4173
+ "detail",
4174
+ "create",
4175
+ "edit",
4176
+ "dashboard",
4177
+ "custom"
4178
+ ]);
4179
+ var PageTraitRefSchema = external_exports.object({
4180
+ ref: external_exports.string().min(1, "Trait ref is required"),
4181
+ linkedEntity: external_exports.string().optional(),
4182
+ config: external_exports.record(external_exports.unknown()).optional()
4183
+ });
4184
+ external_exports.object({
4185
+ name: external_exports.string().min(1, "Page name is required"),
4186
+ path: external_exports.string().min(1, "Page path is required").startsWith("/", "Path must start with /"),
4187
+ primaryEntity: external_exports.string().min(1, "Primary entity is required"),
4188
+ traits: external_exports.array(PageTraitRefSchema).min(1, "Page must have at least one trait"),
4189
+ title: external_exports.string().optional()
4190
+ }).strict();
4191
+ var OrbitalPageSchema = external_exports.object({
4192
+ name: external_exports.string().min(1, "Page name is required"),
4193
+ path: external_exports.string().min(1, "Page path is required").startsWith("/", "Path must start with /"),
4194
+ viewType: ViewTypeSchema.optional(),
4195
+ title: external_exports.string().optional(),
4196
+ primaryEntity: external_exports.string().optional(),
4197
+ traits: external_exports.array(PageTraitRefSchema).optional(),
4198
+ isInitial: external_exports.boolean().optional()
4199
+ }).strict();
4200
+ var PageSchema = OrbitalPageSchema;
4201
+ var UI_SLOTS = [
4202
+ // App slots
4203
+ "main",
4204
+ "sidebar",
4205
+ "modal",
4206
+ "drawer",
4207
+ "overlay",
4208
+ "center",
4209
+ "toast",
4210
+ "floating",
4211
+ "system",
4212
+ // For invisible system components (InputListener, CollisionDetector)
4213
+ "content",
4214
+ "screen",
4215
+ // Game HUD slots
4216
+ "hud",
4217
+ "hud-top",
4218
+ "hud-bottom",
4219
+ "hud.health",
4220
+ "hud.score",
4221
+ "hud.inventory",
4222
+ "hud.stamina",
4223
+ // Game overlay slots
4224
+ "overlay.inventory",
4225
+ "overlay.dialogue",
4226
+ "overlay.menu",
4227
+ "overlay.pause"
4228
+ ];
4229
+ external_exports.enum(UI_SLOTS);
4230
+ var EffectSchema = external_exports.array(external_exports.unknown()).min(1).refine(
4231
+ (arr) => typeof arr[0] === "string",
4232
+ { message: "Effect must be an S-expression with a string operator as first element" }
4233
+ );
4048
4234
  var SExprAtomSchema = external_exports.union([
4049
4235
  external_exports.string(),
4050
4236
  external_exports.number(),
@@ -4137,6 +4323,507 @@ function collectBindings(expr) {
4137
4323
  });
4138
4324
  return bindings;
4139
4325
  }
4326
+ var StateSchema = external_exports.object({
4327
+ name: external_exports.string().min(1, "State name is required"),
4328
+ isInitial: external_exports.boolean().optional(),
4329
+ isTerminal: external_exports.boolean().optional(),
4330
+ isFinal: external_exports.boolean().optional(),
4331
+ description: external_exports.string().optional(),
4332
+ onEntry: external_exports.array(external_exports.string()).optional(),
4333
+ onExit: external_exports.array(external_exports.string()).optional()
4334
+ });
4335
+ var PayloadFieldSchema = external_exports.object({
4336
+ name: external_exports.string().min(1),
4337
+ type: external_exports.enum(["string", "number", "boolean", "object", "array"]),
4338
+ required: external_exports.boolean().optional()
4339
+ });
4340
+ var EventSchema = external_exports.object({
4341
+ key: external_exports.string().min(1, "Event key is required"),
4342
+ name: external_exports.string().min(1, "Event name is required"),
4343
+ description: external_exports.string().optional(),
4344
+ payloadSchema: external_exports.array(PayloadFieldSchema).optional(),
4345
+ classification: external_exports.enum(["domain", "system"]).optional(),
4346
+ semanticRole: external_exports.string().optional()
4347
+ });
4348
+ var GuardSchema = external_exports.object({
4349
+ name: external_exports.string().min(1, "Guard name is required"),
4350
+ expression: ExpressionSchema,
4351
+ description: external_exports.string().optional()
4352
+ });
4353
+ var TransitionSchema = external_exports.object({
4354
+ from: external_exports.string().min(1, "Transition source state is required"),
4355
+ to: external_exports.string().min(1, "Transition target state is required"),
4356
+ event: external_exports.string().min(1, "Transition event is required"),
4357
+ guard: ExpressionSchema.nullish(),
4358
+ effects: external_exports.array(EffectSchema).optional(),
4359
+ description: external_exports.string().nullish()
4360
+ });
4361
+ var StateMachineSchema = external_exports.object({
4362
+ states: external_exports.array(StateSchema).min(1, "At least one state is required"),
4363
+ events: external_exports.array(EventSchema),
4364
+ transitions: external_exports.array(TransitionSchema),
4365
+ guards: external_exports.array(GuardSchema).optional()
4366
+ });
4367
+ var TraitCategorySchema = external_exports.enum([
4368
+ "lifecycle",
4369
+ "temporal",
4370
+ "validation",
4371
+ "notification",
4372
+ "integration",
4373
+ "interaction",
4374
+ "game-core",
4375
+ "game-character",
4376
+ "game-ai",
4377
+ "game-combat",
4378
+ "game-items",
4379
+ "game-cards",
4380
+ "game-board",
4381
+ "game-puzzle"
4382
+ ]);
4383
+ var TraitEntityFieldSchema = external_exports.object({
4384
+ name: external_exports.string().min(1),
4385
+ type: external_exports.enum([
4386
+ "string",
4387
+ "number",
4388
+ "boolean",
4389
+ "date",
4390
+ "array",
4391
+ "object",
4392
+ "timestamp",
4393
+ "datetime",
4394
+ "enum"
4395
+ ]),
4396
+ required: external_exports.boolean().optional(),
4397
+ default: external_exports.unknown().optional(),
4398
+ values: external_exports.array(external_exports.string()).optional()
4399
+ });
4400
+ var TraitDataEntitySchema = external_exports.object({
4401
+ name: external_exports.string().min(1),
4402
+ collection: external_exports.string().optional(),
4403
+ fields: external_exports.array(TraitEntityFieldSchema).min(1),
4404
+ timestamps: external_exports.boolean().optional(),
4405
+ description: external_exports.string().optional(),
4406
+ runtime: external_exports.boolean().optional(),
4407
+ singleton: external_exports.boolean().optional(),
4408
+ pages: external_exports.array(external_exports.string()).optional()
4409
+ });
4410
+ var TraitTickSchema = external_exports.object({
4411
+ name: external_exports.string().min(1),
4412
+ description: external_exports.string().optional(),
4413
+ priority: external_exports.number().optional(),
4414
+ interval: external_exports.union([external_exports.literal("frame"), external_exports.number().positive()]),
4415
+ appliesTo: external_exports.array(external_exports.string()).optional(),
4416
+ pages: external_exports.array(external_exports.string()).optional(),
4417
+ guard: ExpressionSchema.optional(),
4418
+ effects: external_exports.array(EffectSchema).min(1),
4419
+ emits: external_exports.array(external_exports.string()).optional()
4420
+ });
4421
+ var EventScopeSchema = external_exports.enum(["internal", "external"]);
4422
+ var EventPayloadFieldSchema = external_exports.object({
4423
+ name: external_exports.string().min(1),
4424
+ type: external_exports.enum(["string", "number", "boolean", "object", "array", "entity"]),
4425
+ required: external_exports.boolean().optional(),
4426
+ description: external_exports.string().optional(),
4427
+ entityType: external_exports.string().optional()
4428
+ });
4429
+ var TraitEventContractSchema = external_exports.object({
4430
+ event: external_exports.string().min(1).regex(
4431
+ /^[A-Z][A-Z0-9_]*$/,
4432
+ "Event name must be UPPER_SNAKE_CASE"
4433
+ ),
4434
+ description: external_exports.string().optional(),
4435
+ payload: external_exports.array(EventPayloadFieldSchema).optional(),
4436
+ scope: EventScopeSchema.optional()
4437
+ });
4438
+ var TraitEventListenerSchema = external_exports.object({
4439
+ event: external_exports.string().min(1),
4440
+ triggers: external_exports.string().min(1),
4441
+ guard: ExpressionSchema.optional(),
4442
+ scope: EventScopeSchema.optional(),
4443
+ payloadMapping: external_exports.record(external_exports.string()).optional()
4444
+ });
4445
+ var RequiredFieldSchema = external_exports.object({
4446
+ name: external_exports.string().min(1),
4447
+ type: external_exports.enum(["string", "number", "boolean", "date", "array", "object", "timestamp", "datetime", "enum"]),
4448
+ description: external_exports.string().optional()
4449
+ });
4450
+ external_exports.object({
4451
+ ref: external_exports.string().min(1),
4452
+ linkedEntity: external_exports.string().optional(),
4453
+ config: external_exports.record(external_exports.record(external_exports.unknown())).optional(),
4454
+ appliesTo: external_exports.array(external_exports.string()).optional()
4455
+ });
4456
+ var TraitSchema = external_exports.object({
4457
+ name: external_exports.string().min(1),
4458
+ description: external_exports.string().optional(),
4459
+ description_visual_prompt: external_exports.string().optional(),
4460
+ category: TraitCategorySchema.optional(),
4461
+ linkedEntity: external_exports.string().optional(),
4462
+ requiredFields: external_exports.array(RequiredFieldSchema).optional(),
4463
+ dataEntities: external_exports.array(TraitDataEntitySchema).optional(),
4464
+ stateMachine: StateMachineSchema.optional(),
4465
+ initialEffects: external_exports.array(EffectSchema).optional(),
4466
+ ticks: external_exports.array(TraitTickSchema).optional(),
4467
+ emits: external_exports.array(TraitEventContractSchema).optional(),
4468
+ listens: external_exports.array(TraitEventListenerSchema).optional(),
4469
+ ui: external_exports.record(external_exports.unknown()).optional()
4470
+ });
4471
+ var TraitRefSchema = external_exports.union([
4472
+ external_exports.string().min(1),
4473
+ external_exports.object({
4474
+ ref: external_exports.string().min(1),
4475
+ config: external_exports.record(external_exports.unknown()).optional(),
4476
+ linkedEntity: external_exports.string().optional()
4477
+ }),
4478
+ TraitSchema
4479
+ // Allow inline trait definitions
4480
+ ]);
4481
+ external_exports.enum([
4482
+ "healthcare",
4483
+ "education",
4484
+ "finance",
4485
+ "ecommerce",
4486
+ "real-estate",
4487
+ "logistics",
4488
+ "hospitality",
4489
+ "hr-management",
4490
+ "project-management",
4491
+ "social",
4492
+ "content-management",
4493
+ "iot",
4494
+ "analytics",
4495
+ "game",
4496
+ "custom"
4497
+ ]);
4498
+ external_exports.enum([
4499
+ "platformer",
4500
+ "shooter",
4501
+ "puzzle",
4502
+ "rpg",
4503
+ "board",
4504
+ "racing",
4505
+ "fighting",
4506
+ "tower-defense",
4507
+ "endless-runner",
4508
+ "simulation",
4509
+ "arcade",
4510
+ "adventure"
4511
+ ]);
4512
+ external_exports.enum(["domain", "system"]);
4513
+ external_exports.enum([
4514
+ "pending",
4515
+ "active",
4516
+ "completed",
4517
+ "cancelled",
4518
+ "error",
4519
+ "suspended",
4520
+ "blocked",
4521
+ "domain_workflow",
4522
+ "domain_status",
4523
+ "system_loading",
4524
+ "system_error",
4525
+ "system_idle",
4526
+ "system_editing",
4527
+ "system_confirming"
4528
+ ]);
4529
+ external_exports.enum([
4530
+ "domain_action",
4531
+ "domain_trigger",
4532
+ "system_crud",
4533
+ "system_navigation",
4534
+ "system_form",
4535
+ "system_ui"
4536
+ ]);
4537
+ external_exports.enum([
4538
+ "domain_core",
4539
+ "domain_supporting",
4540
+ "domain_reference",
4541
+ "system_user",
4542
+ "system_config",
4543
+ "system_audit"
4544
+ ]);
4545
+ var DomainVocabularySchema = external_exports.record(external_exports.string(), external_exports.string()).optional();
4546
+ var UserPersonaSchema = external_exports.object({
4547
+ name: external_exports.string().min(1),
4548
+ role: external_exports.string().optional(),
4549
+ device: external_exports.enum(["mobile", "tablet", "desktop"]).optional()
4550
+ });
4551
+ var DomainContextSchema = external_exports.object({
4552
+ request: external_exports.string().min(1, "Original request is required"),
4553
+ requestFragment: external_exports.string().optional(),
4554
+ category: external_exports.enum([
4555
+ "game",
4556
+ "business",
4557
+ "dashboard",
4558
+ "form",
4559
+ "content",
4560
+ "social"
4561
+ ]),
4562
+ subDomain: external_exports.string().optional(),
4563
+ personas: external_exports.array(UserPersonaSchema).optional(),
4564
+ vocabulary: DomainVocabularySchema.optional()
4565
+ });
4566
+ var UXHintsSchema = external_exports.object({
4567
+ flowPattern: external_exports.string().optional(),
4568
+ listPattern: external_exports.string().optional(),
4569
+ formPattern: external_exports.string().optional(),
4570
+ detailPattern: external_exports.string().optional(),
4571
+ relatedLinks: external_exports.array(external_exports.lazy(() => RelatedLinkSchema)).optional()
4572
+ });
4573
+ var RelatedLinkSchema = external_exports.object({
4574
+ relation: external_exports.string().min(1),
4575
+ label: external_exports.string().min(1),
4576
+ targetView: external_exports.enum(["list", "detail"]).optional()
4577
+ });
4578
+ var SuggestedGuardSchema = external_exports.object({
4579
+ id: external_exports.string().min(1),
4580
+ description: external_exports.string().min(1),
4581
+ appliesTo: external_exports.array(external_exports.string().min(1))
4582
+ });
4583
+ var DesignPreferencesSchema = external_exports.object({
4584
+ style: external_exports.enum(["minimal", "modern", "playful", "data-driven", "immersive"]).optional(),
4585
+ primaryColor: external_exports.string().regex(/^#[0-9A-Fa-f]{6}$/, "Must be valid hex color").optional(),
4586
+ device: external_exports.enum(["mobile", "tablet", "desktop", "all"]).optional(),
4587
+ darkMode: external_exports.boolean().optional(),
4588
+ uxHints: UXHintsSchema.optional()
4589
+ });
4590
+ var ThemeTokensSchema = external_exports.object({
4591
+ colors: external_exports.record(external_exports.string(), external_exports.string()).optional(),
4592
+ radii: external_exports.record(external_exports.string(), external_exports.string()).optional(),
4593
+ spacing: external_exports.record(external_exports.string(), external_exports.string()).optional(),
4594
+ typography: external_exports.record(external_exports.string(), external_exports.string()).optional(),
4595
+ shadows: external_exports.record(external_exports.string(), external_exports.string()).optional()
4596
+ });
4597
+ var ThemeVariantSchema = external_exports.object({
4598
+ colors: external_exports.record(external_exports.string(), external_exports.string()).optional(),
4599
+ radii: external_exports.record(external_exports.string(), external_exports.string()).optional(),
4600
+ spacing: external_exports.record(external_exports.string(), external_exports.string()).optional(),
4601
+ typography: external_exports.record(external_exports.string(), external_exports.string()).optional(),
4602
+ shadows: external_exports.record(external_exports.string(), external_exports.string()).optional()
4603
+ });
4604
+ var ThemeDefinitionSchema = external_exports.object({
4605
+ name: external_exports.string().min(1, "Theme name is required"),
4606
+ tokens: ThemeTokensSchema,
4607
+ variants: external_exports.record(external_exports.string(), ThemeVariantSchema).optional()
4608
+ });
4609
+ var ThemeRefStringSchema = external_exports.string().regex(
4610
+ /^[A-Z][a-zA-Z0-9]*\.theme$/,
4611
+ 'Theme reference must be in format "Alias.theme" (e.g., "Ocean.theme")'
4612
+ );
4613
+ var ThemeRefSchema = external_exports.union([
4614
+ ThemeDefinitionSchema,
4615
+ ThemeRefStringSchema
4616
+ ]);
4617
+ var DesignTokensSchema = external_exports.record(external_exports.string(), external_exports.record(external_exports.string(), external_exports.string())).optional();
4618
+ var ALLOWED_CUSTOM_COMPONENTS = [
4619
+ "div",
4620
+ "span",
4621
+ "button",
4622
+ "a",
4623
+ "p",
4624
+ "h1",
4625
+ "h2",
4626
+ "h3",
4627
+ "h4",
4628
+ "h5",
4629
+ "h6",
4630
+ "header",
4631
+ "footer",
4632
+ "section",
4633
+ "article",
4634
+ "nav",
4635
+ "main",
4636
+ "aside",
4637
+ "ul",
4638
+ "ol",
4639
+ "li",
4640
+ "img",
4641
+ "label",
4642
+ "input",
4643
+ "form"
4644
+ ];
4645
+ var CustomPatternDefinitionSchema = external_exports.object({
4646
+ type: external_exports.literal("custom"),
4647
+ component: external_exports.enum(ALLOWED_CUSTOM_COMPONENTS),
4648
+ className: external_exports.string(),
4649
+ slots: external_exports.array(external_exports.string()).optional(),
4650
+ props: external_exports.array(external_exports.string()).optional()
4651
+ });
4652
+ var CustomPatternMapSchema = external_exports.record(external_exports.string(), CustomPatternDefinitionSchema).optional();
4653
+ var SERVICE_TYPES = ["rest", "socket", "mcp"];
4654
+ external_exports.enum(SERVICE_TYPES);
4655
+ var RestAuthConfigSchema = external_exports.object({
4656
+ type: external_exports.enum(["api-key", "bearer", "basic", "oauth2"]),
4657
+ keyName: external_exports.string().optional(),
4658
+ location: external_exports.enum(["query", "header"]).optional(),
4659
+ secretEnv: external_exports.string().optional()
4660
+ });
4661
+ var RestServiceDefSchema = external_exports.object({
4662
+ name: external_exports.string().min(1, "Service name is required"),
4663
+ type: external_exports.literal("rest"),
4664
+ description: external_exports.string().optional(),
4665
+ baseUrl: external_exports.string().url("Base URL must be a valid URL"),
4666
+ headers: external_exports.record(external_exports.string()).optional(),
4667
+ auth: RestAuthConfigSchema.optional(),
4668
+ timeout: external_exports.number().positive().optional()
4669
+ });
4670
+ var SocketEventsSchema = external_exports.object({
4671
+ inbound: external_exports.array(external_exports.string()),
4672
+ outbound: external_exports.array(external_exports.string())
4673
+ });
4674
+ var SocketServiceDefSchema = external_exports.object({
4675
+ name: external_exports.string().min(1, "Service name is required"),
4676
+ type: external_exports.literal("socket"),
4677
+ description: external_exports.string().optional(),
4678
+ url: external_exports.string().url("WebSocket URL must be valid"),
4679
+ events: SocketEventsSchema,
4680
+ reconnect: external_exports.object({
4681
+ enabled: external_exports.boolean(),
4682
+ maxAttempts: external_exports.number().positive().optional(),
4683
+ delayMs: external_exports.number().positive().optional()
4684
+ }).optional()
4685
+ });
4686
+ var McpServiceDefSchema = external_exports.object({
4687
+ name: external_exports.string().min(1, "Service name is required"),
4688
+ type: external_exports.literal("mcp"),
4689
+ description: external_exports.string().optional(),
4690
+ serverPath: external_exports.string().min(1, "Server path is required"),
4691
+ capabilities: external_exports.array(external_exports.string()).min(1, "At least one capability is required"),
4692
+ env: external_exports.record(external_exports.string()).optional()
4693
+ });
4694
+ var ServiceDefinitionSchema = external_exports.discriminatedUnion("type", [
4695
+ RestServiceDefSchema,
4696
+ SocketServiceDefSchema,
4697
+ McpServiceDefSchema
4698
+ ]);
4699
+ var ServiceRefStringSchema = external_exports.string().regex(
4700
+ /^[A-Z][a-zA-Z0-9]*\.services\.[a-zA-Z][a-zA-Z0-9]*$/,
4701
+ 'Service reference must be in format "Alias.services.ServiceName" (e.g., "Weather.services.openweather")'
4702
+ );
4703
+ var ServiceRefSchema = external_exports.union([
4704
+ ServiceDefinitionSchema,
4705
+ ServiceRefStringSchema
4706
+ ]);
4707
+ var UseDeclarationSchema = external_exports.object({
4708
+ from: external_exports.string().min(1, "Import source is required"),
4709
+ as: external_exports.string().min(1, "Alias is required").regex(
4710
+ /^[A-Z][a-zA-Z0-9]*$/,
4711
+ 'Alias must be PascalCase (e.g., "Health", "GameCore")'
4712
+ )
4713
+ });
4714
+ var EntityRefStringSchema = external_exports.string().regex(
4715
+ /^[A-Z][a-zA-Z0-9]*\.entity$/,
4716
+ 'Entity reference must be in format "Alias.entity" (e.g., "Goblin.entity")'
4717
+ );
4718
+ var EntityRefSchema = external_exports.union([EntitySchema, EntityRefStringSchema]);
4719
+ var PageRefStringSchema = external_exports.string().regex(
4720
+ /^[A-Z][a-zA-Z0-9]*\.pages\.[A-Z][a-zA-Z0-9]*$/,
4721
+ 'Page reference must be in format "Alias.pages.PageName" (e.g., "User.pages.Profile")'
4722
+ );
4723
+ var PageRefObjectSchema = external_exports.object({
4724
+ ref: PageRefStringSchema,
4725
+ path: external_exports.string().startsWith("/").optional()
4726
+ });
4727
+ var PageRefSchema = external_exports.union([
4728
+ PageSchema,
4729
+ PageRefStringSchema,
4730
+ PageRefObjectSchema
4731
+ ]);
4732
+ external_exports.string().regex(
4733
+ /^([A-Z][a-zA-Z0-9]*\.traits\.)?[A-Z][a-zA-Z0-9]*$/,
4734
+ 'Trait reference must be "TraitName" or "Alias.traits.TraitName"'
4735
+ );
4736
+ external_exports.object({
4737
+ event: external_exports.string().min(1),
4738
+ triggers: external_exports.string().min(1),
4739
+ guard: external_exports.string().optional()
4740
+ });
4741
+ var EventSourceSchema = external_exports.object({
4742
+ trait: external_exports.string().min(1),
4743
+ transition: external_exports.string().optional(),
4744
+ tick: external_exports.string().optional()
4745
+ });
4746
+ var ComputedEventContractSchema = external_exports.object({
4747
+ event: external_exports.string().min(1),
4748
+ originalEvent: external_exports.string().min(1),
4749
+ source: EventSourceSchema,
4750
+ description: external_exports.string().optional(),
4751
+ payload: external_exports.array(EventPayloadFieldSchema).optional()
4752
+ });
4753
+ var ComputedEventListenerSchema = external_exports.object({
4754
+ event: external_exports.string().min(1),
4755
+ source: EventSourceSchema,
4756
+ triggers: external_exports.string().min(1),
4757
+ guard: ExpressionSchema.optional(),
4758
+ payloadMapping: external_exports.record(external_exports.string()).optional()
4759
+ });
4760
+ var OrbitalDefinitionSchema = external_exports.object({
4761
+ name: external_exports.string().min(1, "Orbital name is required"),
4762
+ description: external_exports.string().optional(),
4763
+ visual_prompt: external_exports.string().optional(),
4764
+ // Import system
4765
+ uses: external_exports.array(UseDeclarationSchema).optional(),
4766
+ // Theme & Services
4767
+ theme: ThemeRefSchema.optional(),
4768
+ services: external_exports.array(ServiceRefSchema).optional(),
4769
+ // Components (inline or reference)
4770
+ entity: EntityRefSchema,
4771
+ traits: external_exports.array(TraitRefSchema),
4772
+ pages: external_exports.array(PageRefSchema),
4773
+ // Event interface (trait-centric model) - computed by resolver
4774
+ emits: external_exports.array(ComputedEventContractSchema).optional(),
4775
+ listens: external_exports.array(ComputedEventListenerSchema).optional(),
4776
+ // Filter for exposed events (trait-centric model)
4777
+ exposes: external_exports.array(external_exports.string()).optional(),
4778
+ // Context fields - persisted throughout orbital lifecycle
4779
+ domainContext: DomainContextSchema.optional(),
4780
+ design: DesignPreferencesSchema.optional(),
4781
+ suggestedGuards: external_exports.array(SuggestedGuardSchema).optional()
4782
+ });
4783
+ var OrbitalSchema = OrbitalDefinitionSchema;
4784
+ var OrbitalConfigSchema = external_exports.object({
4785
+ theme: external_exports.object({
4786
+ primary: external_exports.string().optional(),
4787
+ secondary: external_exports.string().optional(),
4788
+ mode: external_exports.enum(["light", "dark", "system"]).optional()
4789
+ }).optional(),
4790
+ features: external_exports.record(external_exports.boolean()).optional(),
4791
+ api: external_exports.object({
4792
+ baseUrl: external_exports.string().optional(),
4793
+ timeout: external_exports.number().optional()
4794
+ }).optional()
4795
+ });
4796
+ external_exports.object({
4797
+ name: external_exports.string().min(1, "Schema name is required"),
4798
+ description: external_exports.string().optional(),
4799
+ version: external_exports.string().optional(),
4800
+ domainContext: DomainContextSchema.optional(),
4801
+ design: DesignPreferencesSchema.optional(),
4802
+ designTokens: DesignTokensSchema,
4803
+ customPatterns: CustomPatternMapSchema,
4804
+ orbitals: external_exports.array(OrbitalSchema).min(1, "At least one orbital is required"),
4805
+ services: external_exports.array(ServiceDefinitionSchema).optional(),
4806
+ config: OrbitalConfigSchema.optional()
4807
+ });
4808
+ external_exports.string().refine(
4809
+ (val) => {
4810
+ if (!val.startsWith("@")) return false;
4811
+ const parts = val.slice(1).split(".");
4812
+ if (parts.length === 0 || parts[0] === "") return false;
4813
+ return parts.every((part) => /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(part));
4814
+ },
4815
+ { message: "Invalid binding format. Must be @name or @name.path.to.field" }
4816
+ );
4817
+ external_exports.object({
4818
+ createFlow: external_exports.enum(["modal", "page", "inline", "none"]),
4819
+ editFlow: external_exports.enum(["modal", "page", "inline", "none"]),
4820
+ viewFlow: external_exports.enum(["drawer", "page", "modal", "inline", "none"]),
4821
+ deleteFlow: external_exports.enum(["confirm", "instant", "none"]),
4822
+ listInteraction: external_exports.enum(["click-to-view", "click-to-edit", "inline-edit"]).optional(),
4823
+ bulkActions: external_exports.boolean().optional(),
4824
+ realtime: external_exports.boolean().optional()
4825
+ });
4826
+ external_exports.string();
4140
4827
 
4141
4828
  // context.ts
4142
4829
  function createMinimalContext(entity = {}, payload = {}, state = "initial") {
@@ -4781,6 +5468,12 @@ function evalStrLen(args, evaluate2, ctx) {
4781
5468
  const s = evaluate2(args[0], ctx);
4782
5469
  return s?.length ?? 0;
4783
5470
  }
5471
+ function evalStrConcat(args, evaluate2, ctx) {
5472
+ return args.map((arg) => {
5473
+ const val = evaluate2(arg, ctx);
5474
+ return val !== null && val !== void 0 ? String(val) : "";
5475
+ }).join("");
5476
+ }
4784
5477
  function evalStrUpper(args, evaluate2, ctx) {
4785
5478
  const s = evaluate2(args[0], ctx);
4786
5479
  return s?.toUpperCase() ?? "";
@@ -6422,6 +7115,8 @@ var SExpressionEvaluator = class {
6422
7115
  // ===============================
6423
7116
  case "str/len":
6424
7117
  return evalStrLen(args, evaluate2, ctx);
7118
+ case "str/concat":
7119
+ return evalStrConcat(args, evaluate2, ctx);
6425
7120
  case "str/upper":
6426
7121
  return evalStrUpper(args, evaluate2, ctx);
6427
7122
  case "str/lower":