@swiss-ai-hub/web 0.319.0 → 0.321.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.
Files changed (50) hide show
  1. package/{pages/auth/login.vue → components/Auth/LoginPanel.vue} +3 -33
  2. package/components/FormKit/AgentSelector.vue +20 -7
  3. package/components/FormKit/CronInput.vue +208 -0
  4. package/components/FormKit/Repeater.vue +1 -4
  5. package/components/FormKit/VectorStoreInput.vue +43 -6
  6. package/components/Knowledge/Database/CreateModal.vue +315 -0
  7. package/components/Knowledge/Database/EmptyCard.vue +34 -0
  8. package/components/Knowledge/DeleteConfirmModal.vue +87 -0
  9. package/components/Knowledge/Document/List.vue +20 -9
  10. package/components/Knowledge/Namespace/Card.vue +18 -0
  11. package/components/Knowledge/Namespace/CreateModal.vue +11 -3
  12. package/components/Role/AccessCapabilities.vue +4 -4
  13. package/components/Role/AccessCapabilityGroup.vue +22 -6
  14. package/components/Role/AccessRulesEditor.vue +15 -12
  15. package/composables/app/useAppVersion.ts +37 -20
  16. package/composables/auth/useAuth.ts +3 -11
  17. package/composables/document/useCreateDatabase.ts +21 -0
  18. package/composables/document/useDeleteDatabase.ts +29 -0
  19. package/composables/document/useDeleteDocument.ts +1 -1
  20. package/composables/document/useDeleteDocuments.ts +1 -1
  21. package/composables/document/useDeleteNamespace.ts +30 -0
  22. package/composables/document/useIngestors.ts +23 -0
  23. package/composables/document/useScheduledDeletions.ts +16 -8
  24. package/composables/form/useCreateInstanceForm.ts +2 -2
  25. package/composables/form/useFormKitTransform.ts +44 -15
  26. package/formkit.config.ts +57 -3
  27. package/i18n/locales/de.yaml +84 -5
  28. package/i18n/locales/en.yaml +80 -3
  29. package/i18n/locales/fr.yaml +82 -3
  30. package/i18n/locales/it.yaml +84 -3
  31. package/middleware/agent-admin.ts +31 -0
  32. package/middleware/auth.global.ts +34 -16
  33. package/package.json +1 -1
  34. package/pages/[tenant]/service/agents.vue +3 -0
  35. package/pages/[tenant]/service/knowledge/[db]/[namespace]/[document_id].vue +12 -5
  36. package/pages/[tenant]/service/knowledge.vue +138 -0
  37. package/pages/auth/login/[idp].vue +57 -0
  38. package/pages/auth/login/index.vue +46 -0
  39. package/plugins/0.runtime-config.client.ts +5 -0
  40. package/plugins/oidc-client.ts +1 -1
  41. package/sdk/client/client/client.gen.ts +1 -3
  42. package/sdk/client/client/types.gen.ts +7 -13
  43. package/sdk/client/client/utils.gen.ts +1 -2
  44. package/sdk/client/core/queryKeySerializer.gen.ts +1 -6
  45. package/sdk/client/core/types.gen.ts +5 -3
  46. package/sdk/client/index.ts +47 -4
  47. package/sdk/client/schemas.gen.ts +1787 -780
  48. package/sdk/client/sdk.gen.ts +231 -1
  49. package/sdk/client/types.gen.ts +1103 -226
  50. package/plugins/keycloak-client.ts +0 -41
@@ -495,7 +495,7 @@ export const AgentClassDTOSchema = {
495
495
  "FormKit elements defining the agent configuration form. Default values are embedded in the elements themselves.",
496
496
  },
497
497
  agent_config_specs: {
498
- $ref: "#/components/schemas/AgentConfigSpecs",
498
+ $ref: "#/components/schemas/ConfigSpecs",
499
499
  description:
500
500
  "Validation specification including the JSON schema for form submissions. Used by ModelCreationService to create Pydantic models for validation.",
501
501
  },
@@ -737,29 +737,6 @@ export const AgentConfigDTOSchema = {
737
737
  "Encapsulates the data transfer object for an agent INSTANCE's configuration.\n\nContains instance-level data (agent_id, name, description, icon) and the\nconfiguration form. Values come from both:\n- AgentClassEntity: class-level form schema\n- AgentConfigEntityDocument: instance-specific name, description, icon, agent_id\n\nNOTE: This represents config for an INSTANCE (with agent_id), not an agent CLASS.",
738
738
  } as const;
739
739
 
740
- export const AgentConfigSpecsSchema = {
741
- properties: {
742
- agent_class: {
743
- type: "string",
744
- title: "Agent Class",
745
- description: "The class name of the agent.",
746
- },
747
- agent_config_schema: {
748
- additionalProperties: true,
749
- type: "object",
750
- title: "Agent Config Schema",
751
- description:
752
- "JSON schema for validating form submissions. Generated from the agent's configurable fields via to_configurable_submission_model().",
753
- default: {},
754
- },
755
- },
756
- type: "object",
757
- required: ["agent_class"],
758
- title: "AgentConfigSpecs",
759
- description:
760
- "Validation specification for agent configuration form submissions.\n\nContains ONLY the agent class identifier and JSON schema for validation.\nInstance-level fields (name, description, icon, agent_id) are stored\nseparately in AgentConfigEntityDocument and provided by the Agent class.\n\nThe JSON schema is generated from the agent's configurable fields via\nto_configurable_submission_model() and is used to validate form submissions.",
761
- } as const;
762
-
763
740
  export const AgentEventSchema = {
764
741
  properties: {
765
742
  event_id: {
@@ -1015,6 +992,12 @@ export const AgentInTheLoopExceptionEventSchema = {
1015
992
  description:
1016
993
  "The exception event from the delegated agent containing error details and failure context.",
1017
994
  },
995
+ request_event_id: {
996
+ type: "string",
997
+ title: "Request Event Id",
998
+ description:
999
+ "`event_id` of the `AgentInTheLoopRequestEvent` that failed. Carried here for the same reason the response carries it — a fan-out caller that cannot attribute a failure cannot complete its batch.",
1000
+ },
1018
1001
  _event_name: {
1019
1002
  type: "string",
1020
1003
  title: "Event Name",
@@ -1035,7 +1018,12 @@ export const AgentInTheLoopExceptionEventSchema = {
1035
1018
  },
1036
1019
  additionalProperties: true,
1037
1020
  type: "object",
1038
- required: ["exception_event", "_event_name", "_parent_event_names"],
1021
+ required: [
1022
+ "exception_event",
1023
+ "request_event_id",
1024
+ "_event_name",
1025
+ "_parent_event_names",
1026
+ ],
1039
1027
  title: "AgentInTheLoopExceptionEvent",
1040
1028
  description:
1041
1029
  "An error response from an agent when a delegated task fails.\n\n### Why AgentInTheLoopExceptionEvent?\nWhen an agent encounters an error during a delegated task, this event:\n- Signals workflow disruption (since it's a `ControlEvent`), allowing error handling in the original agent\n- Is visible to the UI (since it's also a `DisplayEvent`), enabling monitoring and debugging of agent failures\n- Provides a dedicated error channel separate from successful responses",
@@ -1119,9 +1107,22 @@ export const AgentInTheLoopRequestEventSchema = {
1119
1107
  type: "boolean",
1120
1108
  title: "Share Run Id",
1121
1109
  description:
1122
- "Whether to share the run context with the other agent. Warning: In almost all cases, you will not want to share the run!",
1110
+ "Whether to share the run context with the other agent. Warning: In almost all cases, you will not want to share the run! The response subscription is scoped to the delegated run id, so sharing it makes every subscriber of a fan-out fire on every delegate.",
1123
1111
  default: false,
1124
1112
  },
1113
+ timeout_seconds: {
1114
+ anyOf: [
1115
+ {
1116
+ type: "number",
1117
+ },
1118
+ {
1119
+ type: "null",
1120
+ },
1121
+ ],
1122
+ title: "Timeout Seconds",
1123
+ description:
1124
+ "How long to wait for the delegated agent before synthesizing a failure. `None` (the default) waits forever, which is what a delegate that never starts — an offline agent, a mistyped agent_id — costs the caller: no stop event is ever published, so the caller's run never resumes. Set it when the caller cannot tolerate that, and note it only covers a delegate that does not answer: the timer lives in the caller's dispatcher process, so it dies with the response subscription it guards.",
1125
+ },
1125
1126
  _event_name: {
1126
1127
  type: "string",
1127
1128
  title: "Event Name",
@@ -1192,6 +1193,12 @@ export const AgentInTheLoopResponseEventSchema = {
1192
1193
  description:
1193
1194
  "The stop event from the delegated agent containing the task results and marks the completion.",
1194
1195
  },
1196
+ request_event_id: {
1197
+ type: "string",
1198
+ title: "Request Event Id",
1199
+ description:
1200
+ "`event_id` of the `AgentInTheLoopRequestEvent` this answer belongs to. The only thing that tells a caller which delegated answer is which: a run that delegates once can infer it, but a fan-out receives N of these on one topic and nothing else on the payload distinguishes them.",
1201
+ },
1195
1202
  _event_name: {
1196
1203
  type: "string",
1197
1204
  title: "Event Name",
@@ -1212,7 +1219,12 @@ export const AgentInTheLoopResponseEventSchema = {
1212
1219
  },
1213
1220
  additionalProperties: true,
1214
1221
  type: "object",
1215
- required: ["stop_event", "_event_name", "_parent_event_names"],
1222
+ required: [
1223
+ "stop_event",
1224
+ "request_event_id",
1225
+ "_event_name",
1226
+ "_parent_event_names",
1227
+ ],
1216
1228
  title: "AgentInTheLoopResponseEvent",
1217
1229
  description:
1218
1230
  "A response from an agent after completing a delegated task.\n\n### Why AgentInTheLoopResponseEvent?\nWhen an agent completes a task delegated through an `AgentInTheLoopRequestEvent`, the response:\n- Influences the workflow (since it's a `ControlEvent`), allowing the original agent to resume based on the result\n- Is visible to the UI (since it's also a `DisplayEvent`), enabling monitoring of agent interactions",
@@ -1499,6 +1511,19 @@ export const AgentSelectorSchema = {
1499
1511
  description:
1500
1512
  "Optional filter: only show agent classes that accept this start event type. Matches against event_name or event_parents in the agent's start_events.",
1501
1513
  },
1514
+ agentClass: {
1515
+ anyOf: [
1516
+ {
1517
+ type: "string",
1518
+ },
1519
+ {
1520
+ type: "null",
1521
+ },
1522
+ ],
1523
+ title: "Agentclass",
1524
+ description:
1525
+ "Pin the selection to one agent class. The class dropdown is not rendered and the profile dropdown lists only that class's profiles. Use it when the config already knows which blueprint answers — a dropdown offering one choice asks the admin to make a decision that was never theirs.",
1526
+ },
1502
1527
  classPlaceholder: {
1503
1528
  anyOf: [
1504
1529
  {
@@ -1538,6 +1563,8 @@ export const AgentSelectorSchema = {
1538
1563
  validation: {
1539
1564
  type: "string",
1540
1565
  title: "Validation",
1566
+ description:
1567
+ "Emits `agentRefRequired` where other elements emit FormKit's `required`.\n\nFormKit's `required` rule only asks whether a value is present, and this element's value is\nalways an `{agent_class, agent_id}` object. Picking a class alone emits a non-empty object with\na blank `agent_id`, which passes `required` and then delegates to a NATS wildcard at runtime.\n`agentRefRequired` (registered in the frontend FormKit config) looks at both halves.",
1541
1568
  readOnly: true,
1542
1569
  },
1543
1570
  },
@@ -1546,7 +1573,7 @@ export const AgentSelectorSchema = {
1546
1573
  required: ["label", "validation"],
1547
1574
  title: "AgentSelector",
1548
1575
  description:
1549
- 'A FormKit element for selecting an agent class and instance ID.\n\nThis element renders as a cascading selection:\n1. Agent class dropdown (loads from /api/v1/agents/classes)\n2. Agent ID dropdown (populated based on selected class from /api/v1/agents/classes/{class}/instances)\n\nThe output is a structured object containing both the class name and the instance ID:\n{"agent_class": str, "agent_id": str}\n\n### Optional Filtering by Start Event\n\nWhen `start_event` is specified, only agent classes that accept the given event type\nare shown. For example, `start_event="AskExpertStartEvent"` filters to only show agents\nwhose `start_events` contain an event with matching `event_name` or `event_parents`.\n\nThis is similar to ModelSelect\'s `mode` parameter for filtering by model type.\n\n### Form Duality\n\nWhen used with AgentRef, the form submission is validated directly into AgentRef:\n\n```python\nfrom swiss_ai_hub.core.form.elements.agent_selector import AgentSelector\nfrom swiss_ai_hub.core.form.forms.AgentRef import AgentRef\n\nclass MyConfig(Form):\n target_agent: Annotated[\n AgentRef | AgentSelector,\n Field(description="The target agent to invoke"),\n ]\n\n @classmethod\n def as_form(cls) -> "MyConfig":\n return cls(\n target_agent=AgentSelector(\n label=LocaleString(en="Target Agent", de="Ziel-Agent"),\n start_event="SomeStartEvent", # Optional filter\n ),\n )\n\n # Data mode - from submission:\n config = MyConfig(\n target_agent=AgentRef(\n agent_class="my_agent_class",\n agent_id="my_agent_id",\n ),\n )\n```',
1576
+ 'A FormKit element for selecting an agent class and instance ID.\n\nThis element renders as a cascading selection:\n1. Agent class dropdown (loads from /api/v1/agents/classes)\n2. Agent ID dropdown (populated based on selected class from /api/v1/agents/classes/{class}/instances)\n\nThe output is a structured object containing both the class name and the instance ID:\n{"agent_class": str, "agent_id": str}\n\n### Optional Filtering by Start Event\n\nWhen `start_event` is specified, only agent classes that accept the given event type\nare shown. For example, `start_event="AskExpertStartEvent"` filters to only show agents\nwhose `start_events` contain an event with matching `event_name` or `event_parents`.\n\nThis is similar to ModelSelect\'s `mode` parameter for filtering by model type.\n\n### Pinning to One Agent Class\n\nWhen `agent_class` is specified, the class dropdown is not rendered at all and the profile dropdown lists only\nthat class\'s profiles. `start_event` is redundant then — the class is already decided — so set one or the other.\n\n### Form Duality\n\nWhen used with AgentRef, the form submission is validated directly into AgentRef:\n\n```python\nfrom swiss_ai_hub.core.form.elements.agent_selector import AgentSelector\nfrom swiss_ai_hub.core.form.forms.AgentRef import AgentRef\n\nclass MyConfig(Form):\n target_agent: Annotated[\n AgentRef | AgentSelector,\n Field(description="The target agent to invoke"),\n ]\n\n @classmethod\n def as_form(cls) -> "MyConfig":\n return cls(\n target_agent=AgentSelector(\n label=LocaleString(en="Target Agent", de="Ziel-Agent"),\n start_event="SomeStartEvent", # Optional filter\n ),\n )\n\n # Data mode - from submission:\n config = MyConfig(\n target_agent=AgentRef(\n agent_class="my_agent_class",\n agent_id="my_agent_id",\n ),\n )\n```',
1550
1577
  } as const;
1551
1578
 
1552
1579
  export const AgentSuitabilityAcceptEventSchema = {
@@ -2266,6 +2293,19 @@ export const BaseStoreMemoryEventSchema = {
2266
2293
  title: "Deleted Relations",
2267
2294
  description: "Deleted relations",
2268
2295
  },
2296
+ llm_model_name: {
2297
+ anyOf: [
2298
+ {
2299
+ type: "string",
2300
+ },
2301
+ {
2302
+ type: "null",
2303
+ },
2304
+ ],
2305
+ title: "Llm Model Name",
2306
+ description:
2307
+ "Model that extracted these memories (issue #1590), or None when the write stored verbatim text. Carried on this event only, for observability — it is not stored in mem0's metadata, so it cannot be recovered from the memory record itself once this event is gone.",
2308
+ },
2269
2309
  _event_name: {
2270
2310
  type: "string",
2271
2311
  title: "Event Name",
@@ -2555,10 +2595,31 @@ export const CapabilitySchema = {
2555
2595
  description:
2556
2596
  "Exact access rule that grants this capability, or null for read-only capabilities.",
2557
2597
  },
2598
+ companion_rules: {
2599
+ items: {
2600
+ type: "string",
2601
+ },
2602
+ type: "array",
2603
+ title: "Companion Rules",
2604
+ description:
2605
+ "Rules written *and* removed together with `rule`. A knowledge database's row carries `<rule>.>` here: its namespaces belong to it, and a `.>` rule never matches its own root, so the row needs both forms to mean 'this whole database'.",
2606
+ default: [],
2607
+ },
2608
+ revoked_rules: {
2609
+ items: {
2610
+ type: "string",
2611
+ },
2612
+ type: "array",
2613
+ title: "Revoked Rules",
2614
+ description:
2615
+ "Rules removed with `rule`, never written with it. An agent class's row carries `<rule>.>` here: granting it would hand over every profile of the class in the deployment, other tenants' included, but a ceiling written before that was understood still holds it.",
2616
+ default: [],
2617
+ },
2558
2618
  granted: {
2559
2619
  type: "boolean",
2560
2620
  title: "Granted",
2561
- description: "Whether the draft rules grant this capability.",
2621
+ description:
2622
+ "Whether the draft rules grant `rule` and every `companion_rules` entry.",
2562
2623
  },
2563
2624
  locked: {
2564
2625
  type: "boolean",
@@ -5342,6 +5403,29 @@ export const CompletionUsageSchema = {
5342
5403
  description: "Usage statistics for the completion request.",
5343
5404
  } as const;
5344
5405
 
5406
+ export const ConfigSpecsSchema = {
5407
+ properties: {
5408
+ config_class: {
5409
+ type: "string",
5410
+ title: "Config Class",
5411
+ description: "The class name of the configuration this schema describes.",
5412
+ default: "",
5413
+ },
5414
+ config_schema: {
5415
+ additionalProperties: true,
5416
+ type: "object",
5417
+ title: "Config Schema",
5418
+ description:
5419
+ "JSON schema for validating form submissions. Generated from the configuration's configurable fields via to_configurable_submission_model().",
5420
+ default: {},
5421
+ },
5422
+ },
5423
+ type: "object",
5424
+ title: "ConfigSpecs",
5425
+ description:
5426
+ "Validation specification for a form-duality configuration, as announced by the service that owns it.\n\nCarries only the JSON schema the API validates submissions against, so a configuration class defined in\nan agent, process or pipeline container can be enforced by the API without that class being installed there.",
5427
+ } as const;
5428
+
5345
5429
  export const ContextInsufficientRejectEventSchema = {
5346
5430
  properties: {
5347
5431
  event_id: {
@@ -5648,7 +5732,7 @@ export const ContextualizedAgentEventSchema = {
5648
5732
  $ref: "#/components/schemas/RAGStartEvent",
5649
5733
  },
5650
5734
  {
5651
- $ref: "#/components/schemas/ScheduledStartEvent",
5735
+ $ref: "#/components/schemas/CronStartEvent",
5652
5736
  },
5653
5737
  {
5654
5738
  $ref: "#/components/schemas/ExceptionEvent",
@@ -5722,6 +5806,9 @@ export const ContextualizedAgentEventSchema = {
5722
5806
  {
5723
5807
  $ref: "#/components/schemas/MailBatchDraftedEvent",
5724
5808
  },
5809
+ {
5810
+ $ref: "#/components/schemas/MailBatchClassifiedEvent",
5811
+ },
5725
5812
  ],
5726
5813
  title: "Event",
5727
5814
  description: "Data of the event itself.",
@@ -5875,6 +5962,28 @@ export const CreateAgentInstanceRequestSchema = {
5875
5962
  "Request body for creating a new agent instance.\nThe agent_class is provided in the URL path, not in the request body.",
5876
5963
  } as const;
5877
5964
 
5965
+ export const CreateDatabaseRequestSchema = {
5966
+ properties: {
5967
+ ingestor: {
5968
+ type: "string",
5969
+ title: "Ingestor",
5970
+ description:
5971
+ "The deployed ingestion pipeline that processes this database's documents. Valid values are served by GET /knowledge/ingestors.",
5972
+ default: "document_ingestion",
5973
+ },
5974
+ configuration: {
5975
+ additionalProperties: true,
5976
+ type: "object",
5977
+ title: "Configuration",
5978
+ description:
5979
+ "The database's configuration as submitted through the ingestor's announced form: its multilingual name and description plus every knob the pipeline declares. Validated against the ingestor's schema.",
5980
+ default: {},
5981
+ },
5982
+ },
5983
+ type: "object",
5984
+ title: "CreateDatabaseRequest",
5985
+ } as const;
5986
+
5878
5987
  export const CreateNamespaceRequestSchema = {
5879
5988
  properties: {
5880
5989
  folder_name: {
@@ -6247,7 +6356,93 @@ export const CronInputSchema = {
6247
6356
  required: ["label", "validation"],
6248
6357
  title: "CronInput",
6249
6358
  description:
6250
- 'A FormKit element for editing the cron schedule of a schedulable agent profile.\n\nThe element renders the five cron positions plus a timezone selector, and the submitted value\nmatches the fields of `AgentSchedule`:\n{\n "minute": str,\n "hour": str,\n "day_of_month": str,\n "month": str,\n "day_of_week": str,\n "timezone": str,\n}\n\nPresets and the plain-language summary of the current schedule are delivered by the Admin UI\n(see the cron schedule configuration UI issue); this element only declares the contract.\n\n### Form Duality\n```python\nfrom swiss_ai_hub.core.form.elements.cron_input import CronInput\nfrom swiss_ai_hub.core.scheduling.agent_schedule import AgentSchedule\n\nclass MyAgentConfig(AgentConfig):\n schedule: Annotated[\n AgentSchedule | CronInput | None,\n Field(description="When this profile runs automatically"),\n ] = None\n\n# Form mode - for rendering:\nconfig = MyAgentConfig(schedule=CronInput(label=LocaleString(en="Schedule")))\n\n# Data mode - from submission (Pydantic validates into AgentSchedule):\nconfig = MyAgentConfig(schedule=AgentSchedule(hour="12", timezone="Europe/Zurich"))\n```',
6359
+ 'A FormKit element for editing the cron schedule of a schedulable agent profile.\n\nThe element renders the five cron positions plus a timezone selector, and the submitted value\nmatches the fields of `CronSchedule`:\n{\n "minute": str,\n "hour": str,\n "day_of_month": str,\n "month": str,\n "day_of_week": str,\n "timezone": str,\n}\n\nPresets and the plain-language summary of the current schedule are delivered by the Admin UI\n(see the cron schedule configuration UI issue); this element only declares the contract.\n\n### Form Duality\n```python\nfrom swiss_ai_hub.core.form.elements.cron_input import CronInput\nfrom swiss_ai_hub.core.scheduling.cron_schedule import CronSchedule\n\nclass MyAgentConfig(AgentConfig):\n schedule: Annotated[\n CronSchedule | CronInput | None,\n Field(description="When this profile runs automatically"),\n ] = None\n\n# Form mode - for rendering:\nconfig = MyAgentConfig(schedule=CronInput(label=LocaleString(en="Schedule")))\n\n# Data mode - from submission (Pydantic validates into CronSchedule):\nconfig = MyAgentConfig(schedule=CronSchedule(hour="12", timezone="Europe/Zurich"))\n```',
6360
+ } as const;
6361
+
6362
+ export const CronStartEventSchema = {
6363
+ properties: {
6364
+ event_id: {
6365
+ type: "string",
6366
+ title: "Event Id",
6367
+ },
6368
+ created_at: {
6369
+ type: "integer",
6370
+ title: "Created At",
6371
+ description:
6372
+ "The time (in ns since epoch) the event was stored in the event store",
6373
+ },
6374
+ display_name: {
6375
+ anyOf: [
6376
+ {
6377
+ $ref: "#/components/schemas/LocaleString",
6378
+ },
6379
+ {
6380
+ type: "null",
6381
+ },
6382
+ ],
6383
+ description: "Display name for the event",
6384
+ },
6385
+ display_description: {
6386
+ anyOf: [
6387
+ {
6388
+ $ref: "#/components/schemas/LocaleString",
6389
+ },
6390
+ {
6391
+ type: "null",
6392
+ },
6393
+ ],
6394
+ description: "Display description for the event",
6395
+ },
6396
+ locale: {
6397
+ type: "string",
6398
+ title: "Locale",
6399
+ description:
6400
+ "The locale the scheduled run reports its display output in.",
6401
+ default: "de",
6402
+ },
6403
+ user: {
6404
+ anyOf: [
6405
+ {
6406
+ $ref: "#/components/schemas/UserIdentity",
6407
+ },
6408
+ {
6409
+ type: "null",
6410
+ },
6411
+ ],
6412
+ description:
6413
+ "Always None — scheduled runs are system-initiated and carry no execution identity.",
6414
+ },
6415
+ scheduled_for: {
6416
+ type: "string",
6417
+ format: "date-time",
6418
+ title: "Scheduled For",
6419
+ description:
6420
+ "The cron occurrence this run fires for, in UTC. Distinct from `created_at`, which records when the scheduler published the event — the two differ by the scheduler's tick latency.",
6421
+ },
6422
+ _event_name: {
6423
+ type: "string",
6424
+ title: "Event Name",
6425
+ description:
6426
+ "The event type name, usually the class name. If unknown, uses _unknown_event_name.\nUsed during deserialization to decide which subclass to instantiate.",
6427
+ readOnly: true,
6428
+ },
6429
+ _parent_event_names: {
6430
+ items: {
6431
+ type: "string",
6432
+ },
6433
+ type: "array",
6434
+ title: "Parent Event Names",
6435
+ description:
6436
+ "Contains the names of all parent classes up until BaseEvent, ordered from deepest to least deep inheritance.",
6437
+ readOnly: true,
6438
+ },
6439
+ },
6440
+ additionalProperties: true,
6441
+ type: "object",
6442
+ required: ["scheduled_for", "_event_name", "_parent_event_names"],
6443
+ title: "CronStartEvent",
6444
+ description:
6445
+ "Start event fired by the cron scheduler — handling it is what makes an agent schedulable.\n\nMirrors how accepting a `UserMessageEvent` makes an agent conversational: `AgentRunner` derives\n`is_schedulable` from the start events an agent declares, so a blueprint opts in by adding a step\nthat consumes this event, with no separate registration.\n\nScheduled runs are system runs, so `user` is always None and the agent must not depend on an\ninitiating identity. Whatever tenant context the agent needs comes from its own profile\nconfiguration (as `OrgMemoryWriteConfig.tenant_id` already does), never from the run.",
6251
6446
  } as const;
6252
6447
 
6253
6448
  export const Custom_OutputSchema = {
@@ -6432,6 +6627,18 @@ export const DatabaseDTOSchema = {
6432
6627
  title: "Auto Sync",
6433
6628
  description: "Whether this database auto-syncs namespaces",
6434
6629
  },
6630
+ deletable: {
6631
+ type: "boolean",
6632
+ title: "Deletable",
6633
+ description:
6634
+ "Whether the database itself may be deleted; false for auto-synced databases, whose content is owned by a source, and for the legacy default_rag/shared_rag databases, which are re-provisioned from deployment configuration. Namespaces and individual documents are governed separately and stay deletable.",
6635
+ },
6636
+ ingestor: {
6637
+ type: "string",
6638
+ title: "Ingestor",
6639
+ description:
6640
+ "Identifier of the ingestion pipeline that processes this database, as served by GET /knowledge/ingestors. Visible to anyone who can see the database, so a database-level rule holder learns how it is configured without seeing its namespaces.",
6641
+ },
6435
6642
  namespaces: {
6436
6643
  items: {
6437
6644
  $ref: "#/components/schemas/NamespaceDTO",
@@ -6442,10 +6649,73 @@ export const DatabaseDTOSchema = {
6442
6649
  },
6443
6650
  },
6444
6651
  type: "object",
6445
- required: ["name", "display_name", "auto_sync", "namespaces"],
6652
+ required: [
6653
+ "name",
6654
+ "display_name",
6655
+ "auto_sync",
6656
+ "deletable",
6657
+ "ingestor",
6658
+ "namespaces",
6659
+ ],
6446
6660
  title: "DatabaseDTO",
6447
6661
  } as const;
6448
6662
 
6663
+ export const DatabaseResponseSchema = {
6664
+ properties: {
6665
+ name: {
6666
+ type: "string",
6667
+ title: "Name",
6668
+ description:
6669
+ "The database name (also the Milvus collection and Mongo store name).",
6670
+ },
6671
+ bucket_name: {
6672
+ type: "string",
6673
+ title: "Bucket Name",
6674
+ description: "The S3 bucket / data lake container name.",
6675
+ },
6676
+ ingestor: {
6677
+ type: "string",
6678
+ title: "Ingestor",
6679
+ description: "The deployed ingestion pipeline that owns this database.",
6680
+ },
6681
+ configuration: {
6682
+ additionalProperties: true,
6683
+ type: "object",
6684
+ title: "Configuration",
6685
+ description:
6686
+ "The ingestor's settings for this database, as validated against its announced schema.",
6687
+ default: {},
6688
+ },
6689
+ display_name: {
6690
+ anyOf: [
6691
+ {
6692
+ type: "string",
6693
+ },
6694
+ {
6695
+ type: "null",
6696
+ },
6697
+ ],
6698
+ title: "Display Name",
6699
+ description: "A user-friendly display name for the database.",
6700
+ },
6701
+ description: {
6702
+ anyOf: [
6703
+ {
6704
+ type: "string",
6705
+ },
6706
+ {
6707
+ type: "null",
6708
+ },
6709
+ ],
6710
+ title: "Description",
6711
+ description: "A brief description of the database's contents.",
6712
+ },
6713
+ },
6714
+ type: "object",
6715
+ required: ["name", "bucket_name", "ingestor"],
6716
+ title: "DatabaseResponse",
6717
+ } as const;
6718
+
6449
6719
  export const DatasetSchema = {
6450
6720
  properties: {
6451
6721
  id: {
@@ -7431,7 +7701,21 @@ export const DraftedReplyRefSchema = {
7431
7701
  source_uid: {
7432
7702
  type: "string",
7433
7703
  title: "Source Uid",
7434
- description: "IMAP UID of the source message within the source folder.",
7704
+ description:
7705
+ "IMAP UID the source message had in the folder it was read from. A blueprint that files the message before drafting (EmailClassificationAgent) reports the pre-move UID, which no longer resolves on the server — it identifies the message within the run, not for a later fetch.",
7706
+ },
7707
+ category: {
7708
+ anyOf: [
7709
+ {
7710
+ type: "string",
7711
+ },
7712
+ {
7713
+ type: "null",
7714
+ },
7715
+ ],
7716
+ title: "Category",
7717
+ description:
7718
+ "Category the source message was classified under, when drafting followed a classification run. Null when the drafting blueprint does not classify.",
7435
7719
  },
7436
7720
  drafts_folder: {
7437
7721
  type: "string",
@@ -8402,7 +8686,7 @@ export const FullProcessInstanceDTOSchema = {
8402
8686
  "List of agent work events that the process can receive. Agent work events are used to trigger the execution of an agent.",
8403
8687
  },
8404
8688
  process_config_specs: {
8405
- $ref: "#/components/schemas/ProcessConfigSpecs",
8689
+ $ref: "#/components/schemas/ConfigSpecs",
8406
8690
  description:
8407
8691
  "Configuration specifications of the process class, including schema and parameters.",
8408
8692
  },
@@ -11292,6 +11576,151 @@ export const IngestedNodeSchema = {
11292
11576
  "A node represents a chunk of a document, like a paragraph, produced by a document parser and text splitter.\nThe attributes defined here are the minimal number of attributes that a node must have to ensure the\nUI can properly display it. Note that all attributes that are specific to text documents, like start_char_idx etc.\nmust be strictly optional, as we don't really know whether the node is indeed a text node. However, all attributes\nthat are purely technical, like the document_id to keep the back-ref to the ref_doc from which the node originates,\nare strictly necessary.",
11293
11577
  } as const;
11294
11578
 
11579
+ export const IngestorDTOSchema = {
11580
+ properties: {
11581
+ name: {
11582
+ type: "string",
11583
+ title: "Name",
11584
+ description:
11585
+ "Ingestor identifier, as served by GET /knowledge/ingestors.",
11586
+ },
11587
+ display_name: {
11588
+ anyOf: [
11589
+ {
11590
+ type: "string",
11591
+ },
11592
+ {
11593
+ type: "null",
11594
+ },
11595
+ ],
11596
+ title: "Display Name",
11597
+ description: "Localized name of the ingestion pipeline.",
11598
+ },
11599
+ description: {
11600
+ anyOf: [
11601
+ {
11602
+ type: "string",
11603
+ },
11604
+ {
11605
+ type: "null",
11606
+ },
11607
+ ],
11608
+ title: "Description",
11609
+ description: "Localized description of what the pipeline does.",
11610
+ },
11611
+ form: {
11612
+ items: {
11613
+ oneOf: [
11614
+ {
11615
+ $ref: "#/components/schemas/HtmlElement",
11616
+ },
11617
+ {
11618
+ $ref: "#/components/schemas/AgentSelector",
11619
+ },
11620
+ {
11621
+ $ref: "#/components/schemas/CascadeSelect",
11622
+ },
11623
+ {
11624
+ $ref: "#/components/schemas/Checkbox",
11625
+ },
11626
+ {
11627
+ $ref: "#/components/schemas/ChipsInput",
11628
+ },
11629
+ {
11630
+ $ref: "#/components/schemas/ColorPicker",
11631
+ },
11632
+ {
11633
+ $ref: "#/components/schemas/CronInput",
11634
+ },
11635
+ {
11636
+ $ref: "#/components/schemas/DatePicker",
11637
+ },
11638
+ {
11639
+ $ref: "#/components/schemas/Group",
11640
+ },
11641
+ {
11642
+ $ref: "#/components/schemas/IconSelector",
11643
+ },
11644
+ {
11645
+ $ref: "#/components/schemas/InputMask",
11646
+ },
11647
+ {
11648
+ $ref: "#/components/schemas/InputNumber",
11649
+ },
11650
+ {
11651
+ $ref: "#/components/schemas/InputOtp",
11652
+ },
11653
+ {
11654
+ $ref: "#/components/schemas/InputText",
11655
+ },
11656
+ {
11657
+ $ref: "#/components/schemas/KnowledgeDatabaseSelector",
11658
+ },
11659
+ {
11660
+ $ref: "#/components/schemas/Knob",
11661
+ },
11662
+ {
11663
+ $ref: "#/components/schemas/Listbox",
11664
+ },
11665
+ {
11666
+ $ref: "#/components/schemas/LocaleInput",
11667
+ },
11668
+ {
11669
+ $ref: "#/components/schemas/ModelSelect",
11670
+ },
11671
+ {
11672
+ $ref: "#/components/schemas/MultiSelect",
11673
+ },
11674
+ {
11675
+ $ref: "#/components/schemas/Password",
11676
+ },
11677
+ {
11678
+ $ref: "#/components/schemas/RadioButton",
11679
+ },
11680
+ {
11681
+ $ref: "#/components/schemas/Rating",
11682
+ },
11683
+ {
11684
+ $ref: "#/components/schemas/Repeater",
11685
+ },
11686
+ {
11687
+ $ref: "#/components/schemas/Select",
11688
+ },
11689
+ {
11690
+ $ref: "#/components/schemas/SelectButton",
11691
+ },
11692
+ {
11693
+ $ref: "#/components/schemas/Slider",
11694
+ },
11695
+ {
11696
+ $ref: "#/components/schemas/TenantSelect",
11697
+ },
11698
+ {
11699
+ $ref: "#/components/schemas/Textarea",
11700
+ },
11701
+ {
11702
+ $ref: "#/components/schemas/ToggleButton",
11703
+ },
11704
+ {
11705
+ $ref: "#/components/schemas/ToggleSwitch",
11706
+ },
11707
+ {
11708
+ $ref: "#/components/schemas/VectorStoreInput",
11709
+ },
11710
+ ],
11711
+ },
11712
+ type: "array",
11713
+ title: "Form",
11714
+ description:
11715
+ "FormKit elements a database of this ingestor is configured through, localized.",
11716
+ default: [],
11717
+ },
11718
+ },
11719
+ type: "object",
11720
+ required: ["name", "display_name", "description"],
11721
+ title: "IngestorDTO",
11722
+ } as const;
11723
+
11295
11724
  export const InputAudioSchema = {
11296
11725
  properties: {
11297
11726
  data: {
@@ -12928,6 +13357,32 @@ export const LLMCostEventSchema = {
12928
13357
  description:
12929
13358
  "The name of the LLM service (e.g., 'openai/gpt-4') this event pertains to.",
12930
13359
  },
13360
+ user_id: {
13361
+ anyOf: [
13362
+ {
13363
+ type: "string",
13364
+ },
13365
+ {
13366
+ type: "null",
13367
+ },
13368
+ ],
13369
+ title: "User Id",
13370
+ description:
13371
+ "Invoking user, so spend is queryable per user. None for runs with no user context.",
13372
+ },
13373
+ tenant_id: {
13374
+ anyOf: [
13375
+ {
13376
+ type: "string",
13377
+ },
13378
+ {
13379
+ type: "null",
13380
+ },
13381
+ ],
13382
+ title: "Tenant Id",
13383
+ description:
13384
+ "Acting tenant, so spend is queryable per tenant. None for sysadmins and system runs.",
13385
+ },
12931
13386
  _event_name: {
12932
13387
  type: "string",
12933
13388
  title: "Event Name",
@@ -13194,6 +13649,69 @@ export const LLMEventSchema = {
13194
13649
  title: "LLMEvent",
13195
13650
  } as const;
13196
13651
 
13652
+ export const LLMSpendSchema = {
13653
+ properties: {
13654
+ user_id: {
13655
+ anyOf: [
13656
+ {
13657
+ type: "string",
13658
+ },
13659
+ {
13660
+ type: "null",
13661
+ },
13662
+ ],
13663
+ title: "User Id",
13664
+ description: "Invoking user, None when grouping by tenant.",
13665
+ },
13666
+ tenant_id: {
13667
+ anyOf: [
13668
+ {
13669
+ type: "string",
13670
+ },
13671
+ {
13672
+ type: "null",
13673
+ },
13674
+ ],
13675
+ title: "Tenant Id",
13676
+ description: "Acting tenant, None for runs outside a tenant.",
13677
+ },
13678
+ calls: {
13679
+ type: "integer",
13680
+ title: "Calls",
13681
+ description: "Number of LLM calls attributed to this key.",
13682
+ default: 0,
13683
+ },
13684
+ prompt_tokens_costs: {
13685
+ type: "number",
13686
+ title: "Prompt Tokens Costs",
13687
+ description: "Cost of prompt tokens.",
13688
+ default: 0,
13689
+ },
13690
+ completion_tokens_costs: {
13691
+ type: "number",
13692
+ title: "Completion Tokens Costs",
13693
+ description: "Cost of completion tokens.",
13694
+ default: 0,
13695
+ },
13696
+ embedding_tokens_costs: {
13697
+ type: "number",
13698
+ title: "Embedding Tokens Costs",
13699
+ description: "Cost of embedding tokens.",
13700
+ default: 0,
13701
+ },
13702
+ total_costs: {
13703
+ type: "number",
13704
+ title: "Total Costs",
13705
+ description: "Sum of prompt, completion and embedding costs.",
13706
+ default: 0,
13707
+ },
13708
+ },
13709
+ type: "object",
13710
+ title: "LLMSpend",
13711
+ description:
13712
+ "LLM spend aggregated over one attribution key (a user or a tenant).\n\nCosts come from the platform's own `LLMCostEvent` records rather than from LiteLLM's spend log:\nthe gateway can only attribute the user, so the tenant dimension exists here alone (see #1451).",
13713
+ } as const;
13714
+
13197
13715
  export const LLMStopEventSchema = {
13198
13716
  properties: {
13199
13717
  event_id: {
@@ -14082,6 +14600,108 @@ export const MailAttachmentRefSchema = {
14082
14600
  "Reference to a fetched mail attachment whose bytes are stored in S3, not carried in the event.\n\nMirrors ``UserUploadedFile``: attachments are referenced by ``file_id`` (the S3 object key within the\nagent's dedicated bucket) so large binaries never bloat the persisted/streamed event.",
14083
14601
  } as const;
14084
14602
 
14603
+ export const MailBatchClassifiedEventSchema = {
14604
+ properties: {
14605
+ event_id: {
14606
+ type: "string",
14607
+ title: "Event Id",
14608
+ },
14609
+ created_at: {
14610
+ type: "integer",
14611
+ title: "Created At",
14612
+ description:
14613
+ "The time (in ns since epoch) the event was stored in the event store",
14614
+ },
14615
+ display_name: {
14616
+ anyOf: [
14617
+ {
14618
+ $ref: "#/components/schemas/LocaleString",
14619
+ },
14620
+ {
14621
+ type: "null",
14622
+ },
14623
+ ],
14624
+ description: "Display name for the event",
14625
+ },
14626
+ display_description: {
14627
+ anyOf: [
14628
+ {
14629
+ $ref: "#/components/schemas/LocaleString",
14630
+ },
14631
+ {
14632
+ type: "null",
14633
+ },
14634
+ ],
14635
+ description: "Display description for the event",
14636
+ },
14637
+ source_folder: {
14638
+ type: "string",
14639
+ title: "Source Folder",
14640
+ description: "Folder the classified messages were read from.",
14641
+ },
14642
+ count: {
14643
+ type: "integer",
14644
+ title: "Count",
14645
+ description: "Number of messages classified and filed in this run.",
14646
+ },
14647
+ per_category: {
14648
+ additionalProperties: {
14649
+ type: "integer",
14650
+ },
14651
+ type: "object",
14652
+ title: "Per Category",
14653
+ description:
14654
+ "How many messages were filed under each configured category.",
14655
+ },
14656
+ fallback_count: {
14657
+ type: "integer",
14658
+ title: "Fallback Count",
14659
+ description:
14660
+ "How many messages went to the fallback folder instead of a category.",
14661
+ default: 0,
14662
+ },
14663
+ failed_count: {
14664
+ type: "integer",
14665
+ title: "Failed Count",
14666
+ description:
14667
+ "How many messages the classifier could not reach a verdict on at all. They are filed into the failure folder rather than left in the inbox, where they would be re-selected on every run forever.",
14668
+ default: 0,
14669
+ },
14670
+ classified: {
14671
+ items: {
14672
+ $ref: "#/components/schemas/MailClassificationRef",
14673
+ },
14674
+ type: "array",
14675
+ title: "Classified",
14676
+ description:
14677
+ "Per-message classification verdicts and filing destinations.",
14678
+ },
14679
+ _event_name: {
14680
+ type: "string",
14681
+ title: "Event Name",
14682
+ description:
14683
+ "The event type name, usually the class name. If unknown, uses _unknown_event_name.\nUsed during deserialization to decide which subclass to instantiate.",
14684
+ readOnly: true,
14685
+ },
14686
+ _parent_event_names: {
14687
+ items: {
14688
+ type: "string",
14689
+ },
14690
+ type: "array",
14691
+ title: "Parent Event Names",
14692
+ description:
14693
+ "Contains the names of all parent classes up until BaseEvent, ordered from deepest to least deep inheritance.",
14694
+ readOnly: true,
14695
+ },
14696
+ },
14697
+ additionalProperties: true,
14698
+ type: "object",
14699
+ required: ["source_folder", "count", "_event_name", "_parent_event_names"],
14700
+ title: "MailBatchClassifiedEvent",
14701
+ description:
14702
+ "Summarises one classification run: how many messages were classified and where each was filed.\n\nOne event per run rather than one per message, matching `MailBatchDraftedEvent` — the per-message detail rides in\n`classified`. Filing is what prevents reprocessing: every message leaves the source folder, so the next unread\nlisting cannot see it again.",
14703
+ } as const;
14704
+
14085
14705
  export const MailBatchDraftedEventSchema = {
14086
14706
  properties: {
14087
14707
  event_id: {
@@ -14126,6 +14746,22 @@ export const MailBatchDraftedEventSchema = {
14126
14746
  title: "Count",
14127
14747
  description: "Number of reply drafts created in this run.",
14128
14748
  },
14749
+ per_category: {
14750
+ additionalProperties: {
14751
+ type: "integer",
14752
+ },
14753
+ type: "object",
14754
+ title: "Per Category",
14755
+ description:
14756
+ "How many drafts were created for each category, when drafting followed a classification run. Empty when the drafting blueprint does not classify.",
14757
+ },
14758
+ skipped_count: {
14759
+ type: "integer",
14760
+ title: "Skipped Count",
14761
+ description:
14762
+ "Messages in the batch that got no draft: usually because their category was not opted in, or no category fitted them at all.",
14763
+ default: 0,
14764
+ },
14129
14765
  drafted: {
14130
14766
  items: {
14131
14767
  $ref: "#/components/schemas/DraftedReplyRef",
@@ -14160,6 +14796,81 @@ export const MailBatchDraftedEventSchema = {
14160
14796
  "Records that a batch of reply drafts was appended to the Drafts folder for a human to review and send.\n\nThe agent never sends — the drafts sitting in Drafts are the human handoff. Each source message is left unread and\nmarked as drafted so it is not drafted again on the next run.",
14161
14797
  } as const;
14162
14798
 
14799
+ export const MailClassificationRefSchema = {
14800
+ properties: {
14801
+ message_id: {
14802
+ type: "string",
14803
+ title: "Message Id",
14804
+ description: "IMAP UID of the message within the source folder.",
14805
+ },
14806
+ sender: {
14807
+ type: "string",
14808
+ title: "Sender",
14809
+ description: "Raw From header of the message.",
14810
+ },
14811
+ subject: {
14812
+ type: "string",
14813
+ title: "Subject",
14814
+ description: "Subject header of the message.",
14815
+ },
14816
+ category: {
14817
+ anyOf: [
14818
+ {
14819
+ type: "string",
14820
+ },
14821
+ {
14822
+ type: "null",
14823
+ },
14824
+ ],
14825
+ title: "Category",
14826
+ description:
14827
+ "Configured category the message was filed under, or null when it went to the fallback folder because no category clearly fitted.",
14828
+ },
14829
+ target_folder: {
14830
+ type: "string",
14831
+ title: "Target Folder",
14832
+ description: "Folder the message was filed into.",
14833
+ },
14834
+ reason: {
14835
+ type: "string",
14836
+ title: "Reason",
14837
+ description:
14838
+ "Model's stated reason for the choice — the audit trail for a misfile.",
14839
+ },
14840
+ folder_created: {
14841
+ type: "boolean",
14842
+ title: "Folder Created",
14843
+ description:
14844
+ "Whether this message's target folder was created during the run. Folders are created once up front for the whole batch, so every message routed to a newly created folder carries this, not only the first one.",
14845
+ default: false,
14846
+ },
14847
+ attachments: {
14848
+ items: {
14849
+ $ref: "#/components/schemas/MailAttachmentRef",
14850
+ },
14851
+ type: "array",
14852
+ title: "Attachments",
14853
+ description: "References to the message's attachments stored in S3.",
14854
+ },
14855
+ original_message: {
14856
+ anyOf: [
14857
+ {
14858
+ $ref: "#/components/schemas/MailMessageRef",
14859
+ },
14860
+ {
14861
+ type: "null",
14862
+ },
14863
+ ],
14864
+ description: "Reference to the original RFC822 message stored in S3.",
14865
+ },
14866
+ },
14867
+ type: "object",
14868
+ required: ["message_id", "sender", "subject", "target_folder", "reason"],
14869
+ title: "MailClassificationRef",
14870
+ description:
14871
+ "One classified message and where it was filed — the per-message detail behind a run summary.",
14872
+ } as const;
14873
+
14163
14874
  export const MailFetchedEventSchema = {
14164
14875
  properties: {
14165
14876
  event_id: {
@@ -14409,6 +15120,13 @@ export const MailMovedEventSchema = {
14409
15120
  title: "Target Folder",
14410
15121
  description: "Folder the message was moved into.",
14411
15122
  },
15123
+ folder_created: {
15124
+ type: "boolean",
15125
+ title: "Folder Created",
15126
+ description:
15127
+ "Whether the target folder did not exist and was created by this move — an agent adding a folder to someone's mailbox is a visible side effect and belongs in the audit trail.",
15128
+ default: false,
15129
+ },
14412
15130
  _event_name: {
14413
15131
  type: "string",
14414
15132
  title: "Event Name",
@@ -17349,7 +18067,7 @@ export const ProcessClassDTOSchema = {
17349
18067
  description: "FormKit elements defining the configuration form.",
17350
18068
  },
17351
18069
  process_config_specs: {
17352
- $ref: "#/components/schemas/ProcessConfigSpecs",
18070
+ $ref: "#/components/schemas/ConfigSpecs",
17353
18071
  description:
17354
18072
  "Configuration specifications of the process class, including schema and parameters.",
17355
18073
  },
@@ -17447,29 +18165,6 @@ export const ProcessConfigDTOSchema = {
17447
18165
  title: "ProcessConfigDTO",
17448
18166
  } as const;
17449
18167
 
17450
- export const ProcessConfigSpecsSchema = {
17451
- properties: {
17452
- process_class: {
17453
- type: "string",
17454
- title: "Process Class",
17455
- description: "The class name of the process.",
17456
- default: "",
17457
- },
17458
- process_config_schema: {
17459
- additionalProperties: true,
17460
- type: "object",
17461
- title: "Process Config Schema",
17462
- description:
17463
- "JSON schema for validating form submissions. Generated from the process's configurable fields via to_configurable_submission_model().",
17464
- default: {},
17465
- },
17466
- },
17467
- type: "object",
17468
- title: "ProcessConfigSpecs",
17469
- description:
17470
- "Validation specification for process configuration form submissions.\n\nContains the process class identifier and JSON schema for validation.\nInstance-level fields (name, description, icon, process_id) are stored\nseparately in ProcessConfigEntityDocument and provided by the Process class.\n\nThe JSON schema is generated from the process's configurable fields via\nto_configurable_submission_model() and is used to validate form submissions.",
17471
- } as const;
17472
-
17473
18168
  export const ProcessHealthChecksSchema = {
17474
18169
  properties: {
17475
18170
  running: {
@@ -17884,10 +18579,12 @@ export const PromptTokensDetailsSchema = {
17884
18579
  export const RAGFailureReasonSchema = {
17885
18580
  type: "string",
17886
18581
  enum: [
18582
+ "condensation_empty",
17887
18583
  "context_insufficient",
17888
18584
  "expert_declined",
17889
18585
  "expert_errored",
17890
18586
  "few_shot_rejected",
18587
+ "input_too_large",
17891
18588
  ],
17892
18589
  title: "RAGFailureReason",
17893
18590
  description: "Why a RAG run failed to produce a useful answer.",
@@ -18012,8 +18709,16 @@ export const RAGStartEventSchema = {
18012
18709
  default: "de",
18013
18710
  },
18014
18711
  user: {
18015
- $ref: "#/components/schemas/UserIdentity",
18016
- description: "User on whose behalf the RAG run is executed.",
18712
+ anyOf: [
18713
+ {
18714
+ $ref: "#/components/schemas/UserIdentity",
18715
+ },
18716
+ {
18717
+ type: "null",
18718
+ },
18719
+ ],
18720
+ description:
18721
+ "User on whose behalf the RAG run is executed, when there is one. Optional because a delegating agent forwards whatever identity its own start event carries, and a scheduled run carries none — there is no service account to substitute. The RAG agent's user-memory steps are what read it, and they are skipped without it rather than attributing one caller's memories to a shared identity.",
18017
18722
  },
18018
18723
  messages: {
18019
18724
  items: {
@@ -18094,12 +18799,7 @@ export const RAGStartEventSchema = {
18094
18799
  },
18095
18800
  additionalProperties: true,
18096
18801
  type: "object",
18097
- required: [
18098
- "user",
18099
- "selected_namespaces",
18100
- "_event_name",
18101
- "_parent_event_names",
18102
- ],
18802
+ required: ["selected_namespaces", "_event_name", "_parent_event_names"],
18103
18803
  title: "RAGStartEvent",
18104
18804
  description:
18105
18805
  "Namespace-aware start event for the RAG agent.\n\n`RAGStartEvent` is intended for non-chat publishers: custom domain front-ends that run their own namespace\nselection UI, or other agents delegating to RAG via `AgentInTheLoop`.",
@@ -19667,92 +20367,6 @@ export const RunStatisticsSchema = {
19667
20367
  description: "Statistics for a single run, intended for API response.",
19668
20368
  } as const;
19669
20369
 
19670
- export const ScheduledStartEventSchema = {
19671
- properties: {
19672
- event_id: {
19673
- type: "string",
19674
- title: "Event Id",
19675
- },
19676
- created_at: {
19677
- type: "integer",
19678
- title: "Created At",
19679
- description:
19680
- "The time (in ns since epoch) the event was stored in the event store",
19681
- },
19682
- display_name: {
19683
- anyOf: [
19684
- {
19685
- $ref: "#/components/schemas/LocaleString",
19686
- },
19687
- {
19688
- type: "null",
19689
- },
19690
- ],
19691
- description: "Display name for the event",
19692
- },
19693
- display_description: {
19694
- anyOf: [
19695
- {
19696
- $ref: "#/components/schemas/LocaleString",
19697
- },
19698
- {
19699
- type: "null",
19700
- },
19701
- ],
19702
- description: "Display description for the event",
19703
- },
19704
- locale: {
19705
- type: "string",
19706
- title: "Locale",
19707
- description:
19708
- "The locale the scheduled run reports its display output in.",
19709
- default: "de",
19710
- },
19711
- user: {
19712
- anyOf: [
19713
- {
19714
- $ref: "#/components/schemas/UserIdentity",
19715
- },
19716
- {
19717
- type: "null",
19718
- },
19719
- ],
19720
- description:
19721
- "Always None — scheduled runs are system-initiated and carry no execution identity.",
19722
- },
19723
- scheduled_for: {
19724
- type: "string",
19725
- format: "date-time",
19726
- title: "Scheduled For",
19727
- description:
19728
- "The cron occurrence this run fires for, in UTC. Distinct from `created_at`, which records when the scheduler published the event — the two differ by the scheduler's tick latency.",
19729
- },
19730
- _event_name: {
19731
- type: "string",
19732
- title: "Event Name",
19733
- description:
19734
- "The event type name, usually the class name. If unknown, uses _unknown_event_name.\nUsed during deserialization to decide which subclass to instantiate.",
19735
- readOnly: true,
19736
- },
19737
- _parent_event_names: {
19738
- items: {
19739
- type: "string",
19740
- },
19741
- type: "array",
19742
- title: "Parent Event Names",
19743
- description:
19744
- "Contains the names of all parent classes up until BaseEvent, ordered from deepest to least deep inheritance.",
19745
- readOnly: true,
19746
- },
19747
- },
19748
- additionalProperties: true,
19749
- type: "object",
19750
- required: ["scheduled_for", "_event_name", "_parent_event_names"],
19751
- title: "ScheduledStartEvent",
19752
- description:
19753
- "Start event fired by the cron scheduler — handling it is what makes an agent schedulable.\n\nMirrors how accepting a `UserMessageEvent` makes an agent conversational: `AgentRunner` derives\n`is_schedulable` from the start events an agent declares, so a blueprint opts in by adding a step\nthat consumes this event, with no separate registration.\n\nScheduled runs are system runs, so `user` is always None and the agent must not depend on an\ninitiating identity. Whatever tenant context the agent needs comes from its own profile\nconfiguration (as `OrgMemoryWriteConfig.tenant_id` already does), never from the run.",
19754
- } as const;
19755
-
19756
20370
  export const SearchContextCostPerQueryDTOSchema = {
19757
20371
  properties: {
19758
20372
  search_context_size_low: {
@@ -20908,7 +21522,7 @@ export const StandaloneQuestionCondenserEventSchema = {
20908
21522
  required: ["condensed_chat_message", "_event_name", "_parent_event_names"],
20909
21523
  title: "StandaloneQuestionCondenserEvent",
20910
21524
  description:
20911
- "Event to condense chat messages into a single standalone question as a chat message.",
21525
+ "Event to condense chat messages into a single standalone question as a chat message.\n\nA blank condensation is refused by `condense_standalone_question`, before an event of this type can be\nbuilt. The invariant is deliberately *not* also a `field_validator` here: a validator on an event is not\nonly a publish-time contract, it runs on every `model_validate`, which is how the immutable log is read\nback — JetStream replays the whole stream on each agent start, and the API rebuilds a thread's timeline\nfrom the persisted display copy. Blank condensations did occur before the producer-side raise existed, so\nvalidating on read makes that history undeserializable: replay drops the event and\n`EventService.get_events_in_thread` fails the whole thread.",
20912
21526
  } as const;
20913
21527
 
20914
21528
  export const StartEventSchema = {
@@ -21105,113 +21719,139 @@ export const StoreOrganizationMemoryEventSchema = {
21105
21719
  title: "Deleted Relations",
21106
21720
  description: "Deleted relations",
21107
21721
  },
21108
- _event_name: {
21109
- type: "string",
21110
- title: "Event Name",
21111
- description:
21112
- "The event type name, usually the class name. If unknown, uses _unknown_event_name.\nUsed during deserialization to decide which subclass to instantiate.",
21113
- readOnly: true,
21114
- },
21115
- _parent_event_names: {
21116
- items: {
21117
- type: "string",
21118
- },
21119
- type: "array",
21120
- title: "Parent Event Names",
21121
- description:
21122
- "Contains the names of all parent classes up until BaseEvent, ordered from deepest to least deep inheritance.",
21123
- readOnly: true,
21124
- },
21125
- },
21126
- additionalProperties: true,
21127
- type: "object",
21128
- required: [
21129
- "added_memories",
21130
- "updated_memories",
21131
- "deleted_memories",
21132
- "added_relations",
21133
- "deleted_relations",
21134
- "_event_name",
21135
- "_parent_event_names",
21136
- ],
21137
- title: "StoreOrganizationMemoryEvent",
21138
- description:
21139
- "Specialized BaseStoreMemoryEvent for organization-wide memories.\n\nEmitted when an agent stores shared organizational memories to long-term storage.\nThese memories are accessible to all users within the organization namespace.\nUnlike user memories (inferred from chat), organization memories are explicit facts provided by users.",
21140
- } as const;
21141
-
21142
- export const StoreUserMemoryEventSchema = {
21143
- properties: {
21144
- event_id: {
21145
- type: "string",
21146
- title: "Event Id",
21147
- },
21148
- created_at: {
21149
- type: "integer",
21150
- title: "Created At",
21151
- description:
21152
- "The time (in ns since epoch) the event was stored in the event store",
21153
- },
21154
- display_name: {
21722
+ llm_model_name: {
21155
21723
  anyOf: [
21156
21724
  {
21157
- $ref: "#/components/schemas/LocaleString",
21158
- },
21159
- {
21160
- type: "null",
21161
- },
21162
- ],
21163
- description: "Display name for the event",
21164
- },
21165
- display_description: {
21166
- anyOf: [
21167
- {
21168
- $ref: "#/components/schemas/LocaleString",
21725
+ type: "string",
21169
21726
  },
21170
21727
  {
21171
21728
  type: "null",
21172
21729
  },
21173
21730
  ],
21174
- description: "Display description for the event",
21175
- },
21176
- added_memories: {
21177
- items: {
21178
- type: "string",
21179
- },
21180
- type: "array",
21181
- title: "Added Memories",
21182
- description: "Newly added memory texts",
21183
- },
21184
- updated_memories: {
21185
- items: {
21186
- type: "string",
21187
- },
21188
- type: "array",
21189
- title: "Updated Memories",
21190
- description: "Updated memory texts",
21191
- },
21192
- deleted_memories: {
21193
- items: {
21194
- type: "string",
21195
- },
21196
- type: "array",
21197
- title: "Deleted Memories",
21198
- description: "Deleted memory texts",
21199
- },
21200
- added_relations: {
21201
- items: {
21202
- $ref: "#/components/schemas/MemoryRelation",
21203
- },
21204
- type: "array",
21205
- title: "Added Relations",
21206
- description: "Newly added relations",
21207
- },
21208
- deleted_relations: {
21209
- items: {
21210
- $ref: "#/components/schemas/MemoryRelation",
21211
- },
21212
- type: "array",
21213
- title: "Deleted Relations",
21214
- description: "Deleted relations",
21731
+ title: "Llm Model Name",
21732
+ description:
21733
+ "Model that extracted these memories (issue #1590), or None when the write stored verbatim text. Carried on this event only, for observability — it is not stored in mem0's metadata, so it cannot be recovered from the memory record itself once this event is gone.",
21734
+ },
21735
+ _event_name: {
21736
+ type: "string",
21737
+ title: "Event Name",
21738
+ description:
21739
+ "The event type name, usually the class name. If unknown, uses _unknown_event_name.\nUsed during deserialization to decide which subclass to instantiate.",
21740
+ readOnly: true,
21741
+ },
21742
+ _parent_event_names: {
21743
+ items: {
21744
+ type: "string",
21745
+ },
21746
+ type: "array",
21747
+ title: "Parent Event Names",
21748
+ description:
21749
+ "Contains the names of all parent classes up until BaseEvent, ordered from deepest to least deep inheritance.",
21750
+ readOnly: true,
21751
+ },
21752
+ },
21753
+ additionalProperties: true,
21754
+ type: "object",
21755
+ required: [
21756
+ "added_memories",
21757
+ "updated_memories",
21758
+ "deleted_memories",
21759
+ "added_relations",
21760
+ "deleted_relations",
21761
+ "_event_name",
21762
+ "_parent_event_names",
21763
+ ],
21764
+ title: "StoreOrganizationMemoryEvent",
21765
+ description:
21766
+ "Specialized BaseStoreMemoryEvent for organization-wide memories.\n\nEmitted when an agent stores shared organizational memories to long-term storage.\nThese memories are accessible to all users within the organization namespace.\nUnlike user memories (inferred from chat), organization memories are explicit facts provided by users.",
21767
+ } as const;
21768
+
21769
+ export const StoreUserMemoryEventSchema = {
21770
+ properties: {
21771
+ event_id: {
21772
+ type: "string",
21773
+ title: "Event Id",
21774
+ },
21775
+ created_at: {
21776
+ type: "integer",
21777
+ title: "Created At",
21778
+ description:
21779
+ "The time (in ns since epoch) the event was stored in the event store",
21780
+ },
21781
+ display_name: {
21782
+ anyOf: [
21783
+ {
21784
+ $ref: "#/components/schemas/LocaleString",
21785
+ },
21786
+ {
21787
+ type: "null",
21788
+ },
21789
+ ],
21790
+ description: "Display name for the event",
21791
+ },
21792
+ display_description: {
21793
+ anyOf: [
21794
+ {
21795
+ $ref: "#/components/schemas/LocaleString",
21796
+ },
21797
+ {
21798
+ type: "null",
21799
+ },
21800
+ ],
21801
+ description: "Display description for the event",
21802
+ },
21803
+ added_memories: {
21804
+ items: {
21805
+ type: "string",
21806
+ },
21807
+ type: "array",
21808
+ title: "Added Memories",
21809
+ description: "Newly added memory texts",
21810
+ },
21811
+ updated_memories: {
21812
+ items: {
21813
+ type: "string",
21814
+ },
21815
+ type: "array",
21816
+ title: "Updated Memories",
21817
+ description: "Updated memory texts",
21818
+ },
21819
+ deleted_memories: {
21820
+ items: {
21821
+ type: "string",
21822
+ },
21823
+ type: "array",
21824
+ title: "Deleted Memories",
21825
+ description: "Deleted memory texts",
21826
+ },
21827
+ added_relations: {
21828
+ items: {
21829
+ $ref: "#/components/schemas/MemoryRelation",
21830
+ },
21831
+ type: "array",
21832
+ title: "Added Relations",
21833
+ description: "Newly added relations",
21834
+ },
21835
+ deleted_relations: {
21836
+ items: {
21837
+ $ref: "#/components/schemas/MemoryRelation",
21838
+ },
21839
+ type: "array",
21840
+ title: "Deleted Relations",
21841
+ description: "Deleted relations",
21842
+ },
21843
+ llm_model_name: {
21844
+ anyOf: [
21845
+ {
21846
+ type: "string",
21847
+ },
21848
+ {
21849
+ type: "null",
21850
+ },
21851
+ ],
21852
+ title: "Llm Model Name",
21853
+ description:
21854
+ "Model that extracted these memories (issue #1590), or None when the write stored verbatim text. Carried on this event only, for observability — it is not stored in mem0's metadata, so it cannot be recovered from the memory record itself once this event is gone.",
21215
21855
  },
21216
21856
  _event_name: {
21217
21857
  type: "string",
@@ -24237,7 +24877,7 @@ export const VectorStoreInputSchema = {
24237
24877
  required: ["label", "validation"],
24238
24878
  title: "VectorStoreInput",
24239
24879
  description:
24240
- 'A FormKit element for selecting a vector store collection, namespaces, and\nthe metadata keys publishers are allowed to filter on at query time.\n\nThis element renders as three controls:\n1. Database dropdown (loads from /api/v1/knowledge/databases)\n2. Namespace multi-select (populated based on selected database)\n3. Free-form chips input for `allowed_metadata_filter_fields`\n\nThe output matches the three configurable fields of `MilvusVectorStoreConfig`:\n{\n "collection_name": str,\n "index_namespaces": list[str],\n "allowed_metadata_filter_fields": list[str],\n}\n\n### Form Duality\nWhen used with MilvusVectorStoreConfig, the form submission is validated\ndirectly into MilvusVectorStoreConfig (connection settings are read from\nMilvusSettings at runtime).\n\n### Example Usage\n```python\nfrom swiss_ai_hub.core.form.elements.vector_store_input import VectorStoreInput\nfrom swiss_ai_hub.core.persistence.rag.vectors.stores.milvus_vector_store_config import MilvusVectorStoreConfig\n\nclass MyRetrieverConfig(Form):\n vector_store: Annotated[\n MilvusVectorStoreConfig | VectorStoreInput,\n Field(description="The vector store configuration"),\n ]\n\n# Form mode - for rendering:\nconfig = MyRetrieverConfig(\n vector_store=VectorStoreInput(\n label=LocaleString(en="Vector Store", de="Vektorspeicher"),\n ),\n)\n\n# Data mode - from submission (Pydantic validates into MilvusVectorStoreConfig):\nconfig = MyRetrieverConfig(\n vector_store=MilvusVectorStoreConfig(\n collection_name="my-database",\n index_namespaces=["namespace1", "namespace2"],\n allowed_metadata_filter_fields=["department", "year"],\n ),\n)\n```',
24880
+ 'A FormKit element for selecting a vector store collection, namespaces, and\nthe metadata keys publishers are allowed to filter on at query time.\n\nThis element renders as three controls:\n1. Database dropdown (loads from /api/v1/knowledge/databases)\n2. "All namespaces" switch, or a namespace multi-select populated from the selected database\n3. Free-form chips input for `allowed_metadata_filter_fields`\n\nThe output matches the configurable fields of `MilvusVectorStoreConfig`:\n{\n "collection_name": str,\n "index_namespaces": list[str],\n "all_namespaces": bool,\n "allowed_metadata_filter_fields": list[str],\n}\n\n### Form Duality\nWhen used with MilvusVectorStoreConfig, the form submission is validated\ndirectly into MilvusVectorStoreConfig (connection settings are read from\nMilvusSettings at runtime).\n\n### Example Usage\n```python\nfrom swiss_ai_hub.core.form.elements.vector_store_input import VectorStoreInput\nfrom swiss_ai_hub.core.persistence.rag.vectors.stores.milvus_vector_store_config import MilvusVectorStoreConfig\n\nclass MyRetrieverConfig(Form):\n vector_store: Annotated[\n MilvusVectorStoreConfig | VectorStoreInput,\n Field(description="The vector store configuration"),\n ]\n\n# Form mode - for rendering:\nconfig = MyRetrieverConfig(\n vector_store=VectorStoreInput(\n label=LocaleString(en="Vector Store", de="Vektorspeicher"),\n ),\n)\n\n# Data mode - from submission (Pydantic validates into MilvusVectorStoreConfig):\nconfig = MyRetrieverConfig(\n vector_store=MilvusVectorStoreConfig(\n collection_name="my-database",\n index_namespaces=["namespace1", "namespace2"],\n allowed_metadata_filter_fields=["department", "year"],\n ),\n)\n```',
24241
24881
  } as const;
24242
24882
 
24243
24883
  export const VideoBlockSchema = {
@@ -24809,7 +25449,7 @@ export const AgentClassDTOWritableSchema = {
24809
25449
  "FormKit elements defining the agent configuration form. Default values are embedded in the elements themselves.",
24810
25450
  },
24811
25451
  agent_config_specs: {
24812
- $ref: "#/components/schemas/AgentConfigSpecs",
25452
+ $ref: "#/components/schemas/ConfigSpecs",
24813
25453
  description:
24814
25454
  "Validation specification including the JSON schema for form submissions. Used by ModelCreationService to create Pydantic models for validation.",
24815
25455
  },
@@ -25130,10 +25770,16 @@ export const AgentInTheLoopExceptionEventWritableSchema = {
25130
25770
  description:
25131
25771
  "The exception event from the delegated agent containing error details and failure context.",
25132
25772
  },
25773
+ request_event_id: {
25774
+ type: "string",
25775
+ title: "Request Event Id",
25776
+ description:
25777
+ "`event_id` of the `AgentInTheLoopRequestEvent` that failed. Carried here for the same reason the response carries it — a fan-out caller that cannot attribute a failure cannot complete its batch.",
25778
+ },
25133
25779
  },
25134
25780
  additionalProperties: true,
25135
25781
  type: "object",
25136
- required: ["exception_event"],
25782
+ required: ["exception_event", "request_event_id"],
25137
25783
  title: "AgentInTheLoopExceptionEvent",
25138
25784
  description:
25139
25785
  "An error response from an agent when a delegated task fails.\n\n### Why AgentInTheLoopExceptionEvent?\nWhen an agent encounters an error during a delegated task, this event:\n- Signals workflow disruption (since it's a `ControlEvent`), allowing error handling in the original agent\n- Is visible to the UI (since it's also a `DisplayEvent`), enabling monitoring and debugging of agent failures\n- Provides a dedicated error channel separate from successful responses",
@@ -25217,9 +25863,22 @@ export const AgentInTheLoopRequestEventWritableSchema = {
25217
25863
  type: "boolean",
25218
25864
  title: "Share Run Id",
25219
25865
  description:
25220
- "Whether to share the run context with the other agent. Warning: In almost all cases, you will not want to share the run!",
25866
+ "Whether to share the run context with the other agent. Warning: In almost all cases, you will not want to share the run! The response subscription is scoped to the delegated run id, so sharing it makes every subscriber of a fan-out fire on every delegate.",
25221
25867
  default: false,
25222
25868
  },
25869
+ timeout_seconds: {
25870
+ anyOf: [
25871
+ {
25872
+ type: "number",
25873
+ },
25874
+ {
25875
+ type: "null",
25876
+ },
25877
+ ],
25878
+ title: "Timeout Seconds",
25879
+ description:
25880
+ "How long to wait for the delegated agent before synthesizing a failure. `None` (the default) waits forever, which is what a delegate that never starts — an offline agent, a mistyped agent_id — costs the caller: no stop event is ever published, so the caller's run never resumes. Set it when the caller cannot tolerate that, and note it only covers a delegate that does not answer: the timer lives in the caller's dispatcher process, so it dies with the response subscription it guards.",
25881
+ },
25223
25882
  },
25224
25883
  additionalProperties: true,
25225
25884
  type: "object",
@@ -25268,10 +25927,16 @@ export const AgentInTheLoopResponseEventWritableSchema = {
25268
25927
  description:
25269
25928
  "The stop event from the delegated agent containing the task results and marks the completion.",
25270
25929
  },
25930
+ request_event_id: {
25931
+ type: "string",
25932
+ title: "Request Event Id",
25933
+ description:
25934
+ "`event_id` of the `AgentInTheLoopRequestEvent` this answer belongs to. The only thing that tells a caller which delegated answer is which: a run that delegates once can infer it, but a fan-out receives N of these on one topic and nothing else on the payload distinguishes them.",
25935
+ },
25271
25936
  },
25272
25937
  additionalProperties: true,
25273
25938
  type: "object",
25274
- required: ["stop_event"],
25939
+ required: ["stop_event", "request_event_id"],
25275
25940
  title: "AgentInTheLoopResponseEvent",
25276
25941
  description:
25277
25942
  "A response from an agent after completing a delegated task.\n\n### Why AgentInTheLoopResponseEvent?\nWhen an agent completes a task delegated through an `AgentInTheLoopRequestEvent`, the response:\n- Influences the workflow (since it's a `ControlEvent`), allowing the original agent to resume based on the result\n- Is visible to the UI (since it's also a `DisplayEvent`), enabling monitoring of agent interactions",
@@ -25497,6 +26162,19 @@ export const AgentSelectorWritableSchema = {
25497
26162
  description:
25498
26163
  "Optional filter: only show agent classes that accept this start event type. Matches against event_name or event_parents in the agent's start_events.",
25499
26164
  },
26165
+ agentClass: {
26166
+ anyOf: [
26167
+ {
26168
+ type: "string",
26169
+ },
26170
+ {
26171
+ type: "null",
26172
+ },
26173
+ ],
26174
+ title: "Agentclass",
26175
+ description:
26176
+ "Pin the selection to one agent class. The class dropdown is not rendered and the profile dropdown lists only that class's profiles. Use it when the config already knows which blueprint answers — a dropdown offering one choice asks the admin to make a decision that was never theirs.",
26177
+ },
25500
26178
  classPlaceholder: {
25501
26179
  anyOf: [
25502
26180
  {
@@ -25539,7 +26217,7 @@ export const AgentSelectorWritableSchema = {
25539
26217
  required: ["label"],
25540
26218
  title: "AgentSelector",
25541
26219
  description:
25542
- 'A FormKit element for selecting an agent class and instance ID.\n\nThis element renders as a cascading selection:\n1. Agent class dropdown (loads from /api/v1/agents/classes)\n2. Agent ID dropdown (populated based on selected class from /api/v1/agents/classes/{class}/instances)\n\nThe output is a structured object containing both the class name and the instance ID:\n{"agent_class": str, "agent_id": str}\n\n### Optional Filtering by Start Event\n\nWhen `start_event` is specified, only agent classes that accept the given event type\nare shown. For example, `start_event="AskExpertStartEvent"` filters to only show agents\nwhose `start_events` contain an event with matching `event_name` or `event_parents`.\n\nThis is similar to ModelSelect\'s `mode` parameter for filtering by model type.\n\n### Form Duality\n\nWhen used with AgentRef, the form submission is validated directly into AgentRef:\n\n```python\nfrom swiss_ai_hub.core.form.elements.agent_selector import AgentSelector\nfrom swiss_ai_hub.core.form.forms.AgentRef import AgentRef\n\nclass MyConfig(Form):\n target_agent: Annotated[\n AgentRef | AgentSelector,\n Field(description="The target agent to invoke"),\n ]\n\n @classmethod\n def as_form(cls) -> "MyConfig":\n return cls(\n target_agent=AgentSelector(\n label=LocaleString(en="Target Agent", de="Ziel-Agent"),\n start_event="SomeStartEvent", # Optional filter\n ),\n )\n\n # Data mode - from submission:\n config = MyConfig(\n target_agent=AgentRef(\n agent_class="my_agent_class",\n agent_id="my_agent_id",\n ),\n )\n```',
26220
+ 'A FormKit element for selecting an agent class and instance ID.\n\nThis element renders as a cascading selection:\n1. Agent class dropdown (loads from /api/v1/agents/classes)\n2. Agent ID dropdown (populated based on selected class from /api/v1/agents/classes/{class}/instances)\n\nThe output is a structured object containing both the class name and the instance ID:\n{"agent_class": str, "agent_id": str}\n\n### Optional Filtering by Start Event\n\nWhen `start_event` is specified, only agent classes that accept the given event type\nare shown. For example, `start_event="AskExpertStartEvent"` filters to only show agents\nwhose `start_events` contain an event with matching `event_name` or `event_parents`.\n\nThis is similar to ModelSelect\'s `mode` parameter for filtering by model type.\n\n### Pinning to One Agent Class\n\nWhen `agent_class` is specified, the class dropdown is not rendered at all and the profile dropdown lists only\nthat class\'s profiles. `start_event` is redundant then — the class is already decided — so set one or the other.\n\n### Form Duality\n\nWhen used with AgentRef, the form submission is validated directly into AgentRef:\n\n```python\nfrom swiss_ai_hub.core.form.elements.agent_selector import AgentSelector\nfrom swiss_ai_hub.core.form.forms.AgentRef import AgentRef\n\nclass MyConfig(Form):\n target_agent: Annotated[\n AgentRef | AgentSelector,\n Field(description="The target agent to invoke"),\n ]\n\n @classmethod\n def as_form(cls) -> "MyConfig":\n return cls(\n target_agent=AgentSelector(\n label=LocaleString(en="Target Agent", de="Ziel-Agent"),\n start_event="SomeStartEvent", # Optional filter\n ),\n )\n\n # Data mode - from submission:\n config = MyConfig(\n target_agent=AgentRef(\n agent_class="my_agent_class",\n agent_id="my_agent_id",\n ),\n )\n```',
25543
26221
  } as const;
25544
26222
 
25545
26223
  export const AgentSuitabilityAcceptEventWritableSchema = {
@@ -25973,6 +26651,19 @@ export const BaseStoreMemoryEventWritableSchema = {
25973
26651
  title: "Deleted Relations",
25974
26652
  description: "Deleted relations",
25975
26653
  },
26654
+ llm_model_name: {
26655
+ anyOf: [
26656
+ {
26657
+ type: "string",
26658
+ },
26659
+ {
26660
+ type: "null",
26661
+ },
26662
+ ],
26663
+ title: "Llm Model Name",
26664
+ description:
26665
+ "Model that extracted these memories (issue #1590), or None when the write stored verbatim text. Carried on this event only, for observability — it is not stored in mem0's metadata, so it cannot be recovered from the memory record itself once this event is gone.",
26666
+ },
25976
26667
  },
25977
26668
  additionalProperties: true,
25978
26669
  type: "object",
@@ -27251,7 +27942,7 @@ export const ContextualizedAgentEventWritableSchema = {
27251
27942
  $ref: "#/components/schemas/RAGStartEventWritable",
27252
27943
  },
27253
27944
  {
27254
- $ref: "#/components/schemas/ScheduledStartEventWritable",
27945
+ $ref: "#/components/schemas/CronStartEventWritable",
27255
27946
  },
27256
27947
  {
27257
27948
  $ref: "#/components/schemas/ExceptionEventWritable",
@@ -27325,6 +28016,9 @@ export const ContextualizedAgentEventWritableSchema = {
27325
28016
  {
27326
28017
  $ref: "#/components/schemas/MailBatchDraftedEventWritable",
27327
28018
  },
28019
+ {
28020
+ $ref: "#/components/schemas/MailBatchClassifiedEventWritable",
28021
+ },
27328
28022
  ],
27329
28023
  title: "Event",
27330
28024
  description: "Data of the event itself.",
@@ -27595,7 +28289,76 @@ export const CronInputWritableSchema = {
27595
28289
  required: ["label"],
27596
28290
  title: "CronInput",
27597
28291
  description:
27598
- 'A FormKit element for editing the cron schedule of a schedulable agent profile.\n\nThe element renders the five cron positions plus a timezone selector, and the submitted value\nmatches the fields of `AgentSchedule`:\n{\n "minute": str,\n "hour": str,\n "day_of_month": str,\n "month": str,\n "day_of_week": str,\n "timezone": str,\n}\n\nPresets and the plain-language summary of the current schedule are delivered by the Admin UI\n(see the cron schedule configuration UI issue); this element only declares the contract.\n\n### Form Duality\n```python\nfrom swiss_ai_hub.core.form.elements.cron_input import CronInput\nfrom swiss_ai_hub.core.scheduling.agent_schedule import AgentSchedule\n\nclass MyAgentConfig(AgentConfig):\n schedule: Annotated[\n AgentSchedule | CronInput | None,\n Field(description="When this profile runs automatically"),\n ] = None\n\n# Form mode - for rendering:\nconfig = MyAgentConfig(schedule=CronInput(label=LocaleString(en="Schedule")))\n\n# Data mode - from submission (Pydantic validates into AgentSchedule):\nconfig = MyAgentConfig(schedule=AgentSchedule(hour="12", timezone="Europe/Zurich"))\n```',
28292
+ 'A FormKit element for editing the cron schedule of a schedulable agent profile.\n\nThe element renders the five cron positions plus a timezone selector, and the submitted value\nmatches the fields of `CronSchedule`:\n{\n "minute": str,\n "hour": str,\n "day_of_month": str,\n "month": str,\n "day_of_week": str,\n "timezone": str,\n}\n\nPresets and the plain-language summary of the current schedule are delivered by the Admin UI\n(see the cron schedule configuration UI issue); this element only declares the contract.\n\n### Form Duality\n```python\nfrom swiss_ai_hub.core.form.elements.cron_input import CronInput\nfrom swiss_ai_hub.core.scheduling.cron_schedule import CronSchedule\n\nclass MyAgentConfig(AgentConfig):\n schedule: Annotated[\n CronSchedule | CronInput | None,\n Field(description="When this profile runs automatically"),\n ] = None\n\n# Form mode - for rendering:\nconfig = MyAgentConfig(schedule=CronInput(label=LocaleString(en="Schedule")))\n\n# Data mode - from submission (Pydantic validates into CronSchedule):\nconfig = MyAgentConfig(schedule=CronSchedule(hour="12", timezone="Europe/Zurich"))\n```',
28293
+ } as const;
28294
+
28295
+ export const CronStartEventWritableSchema = {
28296
+ properties: {
28297
+ event_id: {
28298
+ type: "string",
28299
+ title: "Event Id",
28300
+ },
28301
+ created_at: {
28302
+ type: "integer",
28303
+ title: "Created At",
28304
+ description:
28305
+ "The time (in ns since epoch) the event was stored in the event store",
28306
+ },
28307
+ display_name: {
28308
+ anyOf: [
28309
+ {
28310
+ $ref: "#/components/schemas/LocaleString",
28311
+ },
28312
+ {
28313
+ type: "null",
28314
+ },
28315
+ ],
28316
+ description: "Display name for the event",
28317
+ },
28318
+ display_description: {
28319
+ anyOf: [
28320
+ {
28321
+ $ref: "#/components/schemas/LocaleString",
28322
+ },
28323
+ {
28324
+ type: "null",
28325
+ },
28326
+ ],
28327
+ description: "Display description for the event",
28328
+ },
28329
+ locale: {
28330
+ type: "string",
28331
+ title: "Locale",
28332
+ description:
28333
+ "The locale the scheduled run reports its display output in.",
28334
+ default: "de",
28335
+ },
28336
+ user: {
28337
+ anyOf: [
28338
+ {
28339
+ $ref: "#/components/schemas/UserIdentity",
28340
+ },
28341
+ {
28342
+ type: "null",
28343
+ },
28344
+ ],
28345
+ description:
28346
+ "Always None — scheduled runs are system-initiated and carry no execution identity.",
28347
+ },
28348
+ scheduled_for: {
28349
+ type: "string",
28350
+ format: "date-time",
28351
+ title: "Scheduled For",
28352
+ description:
28353
+ "The cron occurrence this run fires for, in UTC. Distinct from `created_at`, which records when the scheduler published the event — the two differ by the scheduler's tick latency.",
28354
+ },
28355
+ },
28356
+ additionalProperties: true,
28357
+ type: "object",
28358
+ required: ["scheduled_for"],
28359
+ title: "CronStartEvent",
28360
+ description:
28361
+ "Start event fired by the cron scheduler — handling it is what makes an agent schedulable.\n\nMirrors how accepting a `UserMessageEvent` makes an agent conversational: `AgentRunner` derives\n`is_schedulable` from the start events an agent declares, so a blueprint opts in by adding a step\nthat consumes this event, with no separate registration.\n\nScheduled runs are system runs, so `user` is always None and the agent must not depend on an\ninitiating identity. Whatever tenant context the agent needs comes from its own profile\nconfiguration (as `OrgMemoryWriteConfig.tenant_id` already does), never from the run.",
27599
28362
  } as const;
27600
28363
 
27601
28364
  export const DatePickerWritableSchema = {
@@ -28435,7 +29198,7 @@ export const FullProcessInstanceDTOWritableSchema = {
28435
29198
  "List of agent work events that the process can receive. Agent work events are used to trigger the execution of an agent.",
28436
29199
  },
28437
29200
  process_config_specs: {
28438
- $ref: "#/components/schemas/ProcessConfigSpecs",
29201
+ $ref: "#/components/schemas/ConfigSpecs",
28439
29202
  description:
28440
29203
  "Configuration specifications of the process class, including schema and parameters.",
28441
29204
  },
@@ -29959,6 +30722,151 @@ export const IconSelectorWritableSchema = {
29959
30722
  'A FormKit element for selecting or entering an Iconify icon name.\n\nThis element renders as an editable select with icon preview capability.\nUsers can either select from preset icon options or enter any valid Iconify icon name.\nThe selected/entered icon is displayed live in the input field.\n\n### Features\n- Dropdown with preset icon options (each showing the icon preview)\n- Editable input for entering custom Iconify icon names\n- Live icon preview in the input field\n- Supports any valid Iconify icon (e.g., \'lucide:bot\', \'meteor-icons:robot\')\n\n### Example Usage\n```python\nclass MyAgentConfig(AgentConfig):\n icon: Annotated[\n str | IconSelector,\n Field(description="Icon for the agent"),\n ]\n\n# Form mode - for rendering:\nconfig = MyAgentConfig(\n ...,\n icon=IconSelector(label=LocaleString(en="Icon", de="Symbol")),\n)\n\n# Data mode - from submission:\nconfig = MyAgentConfig(\n ...,\n icon="mage:robot",\n)\n```',
29960
30723
  } as const;
29961
30724
 
30725
+ export const IngestorDTOWritableSchema = {
30726
+ properties: {
30727
+ name: {
30728
+ type: "string",
30729
+ title: "Name",
30730
+ description:
30731
+ "Ingestor identifier, as served by GET /knowledge/ingestors.",
30732
+ },
30733
+ display_name: {
30734
+ anyOf: [
30735
+ {
30736
+ type: "string",
30737
+ },
30738
+ {
30739
+ type: "null",
30740
+ },
30741
+ ],
30742
+ title: "Display Name",
30743
+ description: "Localized name of the ingestion pipeline.",
30744
+ },
30745
+ description: {
30746
+ anyOf: [
30747
+ {
30748
+ type: "string",
30749
+ },
30750
+ {
30751
+ type: "null",
30752
+ },
30753
+ ],
30754
+ title: "Description",
30755
+ description: "Localized description of what the pipeline does.",
30756
+ },
30757
+ form: {
30758
+ items: {
30759
+ oneOf: [
30760
+ {
30761
+ $ref: "#/components/schemas/HtmlElement",
30762
+ },
30763
+ {
30764
+ $ref: "#/components/schemas/AgentSelectorWritable",
30765
+ },
30766
+ {
30767
+ $ref: "#/components/schemas/CascadeSelectWritable",
30768
+ },
30769
+ {
30770
+ $ref: "#/components/schemas/CheckboxWritable",
30771
+ },
30772
+ {
30773
+ $ref: "#/components/schemas/ChipsInputWritable",
30774
+ },
30775
+ {
30776
+ $ref: "#/components/schemas/ColorPickerWritable",
30777
+ },
30778
+ {
30779
+ $ref: "#/components/schemas/CronInputWritable",
30780
+ },
30781
+ {
30782
+ $ref: "#/components/schemas/DatePickerWritable",
30783
+ },
30784
+ {
30785
+ $ref: "#/components/schemas/GroupWritable",
30786
+ },
30787
+ {
30788
+ $ref: "#/components/schemas/IconSelectorWritable",
30789
+ },
30790
+ {
30791
+ $ref: "#/components/schemas/InputMaskWritable",
30792
+ },
30793
+ {
30794
+ $ref: "#/components/schemas/InputNumberWritable",
30795
+ },
30796
+ {
30797
+ $ref: "#/components/schemas/InputOtpWritable",
30798
+ },
30799
+ {
30800
+ $ref: "#/components/schemas/InputTextWritable",
30801
+ },
30802
+ {
30803
+ $ref: "#/components/schemas/KnowledgeDatabaseSelectorWritable",
30804
+ },
30805
+ {
30806
+ $ref: "#/components/schemas/KnobWritable",
30807
+ },
30808
+ {
30809
+ $ref: "#/components/schemas/ListboxWritable",
30810
+ },
30811
+ {
30812
+ $ref: "#/components/schemas/LocaleInputWritable",
30813
+ },
30814
+ {
30815
+ $ref: "#/components/schemas/ModelSelectWritable",
30816
+ },
30817
+ {
30818
+ $ref: "#/components/schemas/MultiSelectWritable",
30819
+ },
30820
+ {
30821
+ $ref: "#/components/schemas/PasswordWritable",
30822
+ },
30823
+ {
30824
+ $ref: "#/components/schemas/RadioButtonWritable",
30825
+ },
30826
+ {
30827
+ $ref: "#/components/schemas/RatingWritable",
30828
+ },
30829
+ {
30830
+ $ref: "#/components/schemas/RepeaterWritable",
30831
+ },
30832
+ {
30833
+ $ref: "#/components/schemas/SelectWritable",
30834
+ },
30835
+ {
30836
+ $ref: "#/components/schemas/SelectButtonWritable",
30837
+ },
30838
+ {
30839
+ $ref: "#/components/schemas/SliderWritable",
30840
+ },
30841
+ {
30842
+ $ref: "#/components/schemas/TenantSelectWritable",
30843
+ },
30844
+ {
30845
+ $ref: "#/components/schemas/TextareaWritable",
30846
+ },
30847
+ {
30848
+ $ref: "#/components/schemas/ToggleButtonWritable",
30849
+ },
30850
+ {
30851
+ $ref: "#/components/schemas/ToggleSwitchWritable",
30852
+ },
30853
+ {
30854
+ $ref: "#/components/schemas/VectorStoreInputWritable",
30855
+ },
30856
+ ],
30857
+ },
30858
+ type: "array",
30859
+ title: "Form",
30860
+ description:
30861
+ "FormKit elements a database of this ingestor is configured through, localized.",
30862
+ default: [],
30863
+ },
30864
+ },
30865
+ type: "object",
30866
+ required: ["name", "display_name", "description"],
30867
+ title: "IngestorDTO",
30868
+ } as const;
30869
+
29962
30870
  export const InputMaskWritableSchema = {
29963
30871
  properties: {
29964
30872
  is_formkit_element: {
@@ -31512,6 +32420,32 @@ export const LLMCostEventWritableSchema = {
31512
32420
  description:
31513
32421
  "The name of the LLM service (e.g., 'openai/gpt-4') this event pertains to.",
31514
32422
  },
32423
+ user_id: {
32424
+ anyOf: [
32425
+ {
32426
+ type: "string",
32427
+ },
32428
+ {
32429
+ type: "null",
32430
+ },
32431
+ ],
32432
+ title: "User Id",
32433
+ description:
32434
+ "Invoking user, so spend is queryable per user. None for runs with no user context.",
32435
+ },
32436
+ tenant_id: {
32437
+ anyOf: [
32438
+ {
32439
+ type: "string",
32440
+ },
32441
+ {
32442
+ type: "null",
32443
+ },
32444
+ ],
32445
+ title: "Tenant Id",
32446
+ description:
32447
+ "Acting tenant, so spend is queryable per tenant. None for sysadmins and system runs.",
32448
+ },
31515
32449
  },
31516
32450
  additionalProperties: true,
31517
32451
  type: "object",
@@ -32154,17 +33088,250 @@ export const ListboxWritableSchema = {
32154
33088
  title: "Additional Validation Rules",
32155
33089
  description: "Validation expression",
32156
33090
  },
32157
- disabled: {
32158
- type: "boolean",
32159
- title: "Disabled",
32160
- description: "Whether the input is disabled",
32161
- default: false,
33091
+ disabled: {
33092
+ type: "boolean",
33093
+ title: "Disabled",
33094
+ description: "Whether the input is disabled",
33095
+ default: false,
33096
+ },
33097
+ readonly: {
33098
+ type: "boolean",
33099
+ title: "Readonly",
33100
+ description: "Whether the input is readonly",
33101
+ default: false,
33102
+ },
33103
+ placeholder: {
33104
+ anyOf: [
33105
+ {
33106
+ $ref: "#/components/schemas/LocaleString",
33107
+ },
33108
+ {
33109
+ type: "string",
33110
+ },
33111
+ {
33112
+ type: "null",
33113
+ },
33114
+ ],
33115
+ title: "Placeholder",
33116
+ description: "Placeholder text",
33117
+ },
33118
+ options: {
33119
+ items: {
33120
+ additionalProperties: true,
33121
+ type: "object",
33122
+ },
33123
+ type: "array",
33124
+ title: "Options",
33125
+ description: "Array of selectable option objects",
33126
+ },
33127
+ optionLabel: {
33128
+ anyOf: [
33129
+ {
33130
+ type: "string",
33131
+ },
33132
+ {
33133
+ type: "null",
33134
+ },
33135
+ ],
33136
+ title: "Optionlabel",
33137
+ description: "Property name to use as the label of an option",
33138
+ },
33139
+ optionValue: {
33140
+ anyOf: [
33141
+ {
33142
+ type: "string",
33143
+ },
33144
+ {
33145
+ type: "null",
33146
+ },
33147
+ ],
33148
+ title: "Optionvalue",
33149
+ description: "Property name to use as the value of an option",
33150
+ },
33151
+ multiple: {
33152
+ type: "boolean",
33153
+ title: "Multiple",
33154
+ description: "Whether to allow multiple selections",
33155
+ default: false,
33156
+ },
33157
+ filter: {
33158
+ type: "boolean",
33159
+ title: "Filter",
33160
+ description: "Whether to enable filtering",
33161
+ default: false,
33162
+ },
33163
+ },
33164
+ additionalProperties: true,
33165
+ type: "object",
33166
+ required: ["label", "options"],
33167
+ title: "Listbox",
33168
+ description: "https://formkit-primevue.netlify.app/inputs/Listbox",
33169
+ } as const;
33170
+
33171
+ export const LocaleInputWritableSchema = {
33172
+ properties: {
33173
+ is_formkit_element: {
33174
+ type: "boolean",
33175
+ const: true,
33176
+ title: "Is Formkit Element",
33177
+ description: "Indicates that this element is a FormKit element",
33178
+ default: true,
33179
+ },
33180
+ if: {
33181
+ anyOf: [
33182
+ {
33183
+ type: "string",
33184
+ pattern: "^\\$.+",
33185
+ },
33186
+ {
33187
+ type: "null",
33188
+ },
33189
+ ],
33190
+ title: "If",
33191
+ description: "Conditional expression to show this element",
33192
+ },
33193
+ id: {
33194
+ anyOf: [
33195
+ {
33196
+ type: "string",
33197
+ },
33198
+ {
33199
+ type: "null",
33200
+ },
33201
+ ],
33202
+ title: "Id",
33203
+ description: "Unique identifier for this element",
33204
+ },
33205
+ nullable: {
33206
+ type: "boolean",
33207
+ title: "Nullable",
33208
+ description:
33209
+ "Render with a sibling toggle that sets this field to null when off",
33210
+ default: false,
33211
+ },
33212
+ defaultEnabled: {
33213
+ anyOf: [
33214
+ {
33215
+ type: "boolean",
33216
+ },
33217
+ {
33218
+ type: "null",
33219
+ },
33220
+ ],
33221
+ title: "Defaultenabled",
33222
+ description:
33223
+ "For a nullable element, whether its toggle should start enabled on a fresh form (i.e. the field's data default is non-null). Ignored for non-nullable elements.",
33224
+ },
33225
+ formkit: {
33226
+ type: "string",
33227
+ const: "localeInput",
33228
+ title: "Formkit",
33229
+ description: "Locale input element.",
33230
+ default: "localeInput",
33231
+ },
33232
+ name: {
33233
+ anyOf: [
33234
+ {
33235
+ type: "string",
33236
+ },
33237
+ {
33238
+ type: "null",
33239
+ },
33240
+ ],
33241
+ title: "Name",
33242
+ description: "Name of this field",
33243
+ },
33244
+ label: {
33245
+ anyOf: [
33246
+ {
33247
+ $ref: "#/components/schemas/LocaleString",
33248
+ },
33249
+ {
33250
+ type: "string",
33251
+ },
33252
+ ],
33253
+ title: "Label",
33254
+ description: "Label of this field",
33255
+ },
33256
+ help: {
33257
+ anyOf: [
33258
+ {
33259
+ $ref: "#/components/schemas/LocaleString",
33260
+ },
33261
+ {
33262
+ type: "string",
33263
+ },
33264
+ {
33265
+ type: "null",
33266
+ },
33267
+ ],
33268
+ title: "Help",
33269
+ description: "Help text of this field",
33270
+ },
33271
+ value: {
33272
+ anyOf: [
33273
+ {
33274
+ type: "string",
33275
+ },
33276
+ {
33277
+ type: "integer",
33278
+ },
33279
+ {
33280
+ type: "number",
33281
+ },
33282
+ {
33283
+ type: "boolean",
33284
+ },
33285
+ {
33286
+ items: {
33287
+ type: "string",
33288
+ },
33289
+ type: "array",
33290
+ },
33291
+ {
33292
+ additionalProperties: {
33293
+ type: "string",
33294
+ },
33295
+ type: "object",
33296
+ },
33297
+ {
33298
+ type: "null",
33299
+ },
33300
+ ],
33301
+ title: "Value",
33302
+ description: "Default value for this field",
33303
+ },
33304
+ required: {
33305
+ type: "boolean",
33306
+ title: "Required",
33307
+ description: "Whether this field is required",
33308
+ default: false,
33309
+ },
33310
+ additional_validation_rules: {
33311
+ anyOf: [
33312
+ {
33313
+ type: "string",
33314
+ },
33315
+ {
33316
+ type: "null",
33317
+ },
33318
+ ],
33319
+ title: "Additional Validation Rules",
33320
+ description: "Validation expression",
33321
+ },
33322
+ inputType: {
33323
+ type: "string",
33324
+ enum: ["text", "textarea"],
33325
+ title: "Inputtype",
33326
+ description:
33327
+ "Input type: 'text' for single-line, 'textarea' for multi-line",
33328
+ default: "text",
32162
33329
  },
32163
- readonly: {
32164
- type: "boolean",
32165
- title: "Readonly",
32166
- description: "Whether the input is readonly",
32167
- default: false,
33330
+ rows: {
33331
+ type: "integer",
33332
+ title: "Rows",
33333
+ description: "Number of rows for textarea mode (ignored for text mode)",
33334
+ default: 3,
32168
33335
  },
32169
33336
  placeholder: {
32170
33337
  anyOf: [
@@ -32179,248 +33346,100 @@ export const ListboxWritableSchema = {
32179
33346
  },
32180
33347
  ],
32181
33348
  title: "Placeholder",
32182
- description: "Placeholder text",
32183
- },
32184
- options: {
32185
- items: {
32186
- additionalProperties: true,
32187
- type: "object",
32188
- },
32189
- type: "array",
32190
- title: "Options",
32191
- description: "Array of selectable option objects",
32192
- },
32193
- optionLabel: {
32194
- anyOf: [
32195
- {
32196
- type: "string",
32197
- },
32198
- {
32199
- type: "null",
32200
- },
32201
- ],
32202
- title: "Optionlabel",
32203
- description: "Property name to use as the label of an option",
32204
- },
32205
- optionValue: {
32206
- anyOf: [
32207
- {
32208
- type: "string",
32209
- },
32210
- {
32211
- type: "null",
32212
- },
32213
- ],
32214
- title: "Optionvalue",
32215
- description: "Property name to use as the value of an option",
32216
- },
32217
- multiple: {
32218
- type: "boolean",
32219
- title: "Multiple",
32220
- description: "Whether to allow multiple selections",
32221
- default: false,
32222
- },
32223
- filter: {
32224
- type: "boolean",
32225
- title: "Filter",
32226
- description: "Whether to enable filtering",
32227
- default: false,
33349
+ description: "Placeholder text for each language",
32228
33350
  },
32229
33351
  },
32230
33352
  additionalProperties: true,
32231
33353
  type: "object",
32232
- required: ["label", "options"],
32233
- title: "Listbox",
32234
- description: "https://formkit-primevue.netlify.app/inputs/Listbox",
33354
+ required: ["label"],
33355
+ title: "LocaleInput",
33356
+ description:
33357
+ 'A FormKit element for entering multi-language text (LocaleString values).\n\nThis element renders as a text input with language switching capability,\nallowing users to enter translations for all supported languages (de, en, fr, it)\nin a single compact UI component.\n\nThe frontend renders this as an input field with a language selector, where users\ncan switch between languages to enter the corresponding translation.\n\n### Form Duality\nWhen used in a Form, this element captures a LocaleString value with translations\nfor each language. The form submission returns a dict with language keys.\n\n### Example Usage\n```python\nclass MyAgentConfig(AgentConfig):\n custom_greeting: Annotated[\n LocaleString | LocaleInput,\n Field(description="Custom greeting message"),\n ]\n\n# Form mode - for rendering:\nconfig = MyAgentConfig(\n ...,\n custom_greeting=LocaleInput(label=LocaleString(en="Greeting", de="Begrüßung")),\n)\n\n# Data mode - from submission:\nconfig = MyAgentConfig(\n ...,\n custom_greeting=LocaleString(en="Hello", de="Hallo", fr="Bonjour", it="Ciao"),\n)\n```',
32235
33358
  } as const;
32236
33359
 
32237
- export const LocaleInputWritableSchema = {
33360
+ export const MailBatchClassifiedEventWritableSchema = {
32238
33361
  properties: {
32239
- is_formkit_element: {
32240
- type: "boolean",
32241
- const: true,
32242
- title: "Is Formkit Element",
32243
- description: "Indicates that this element is a FormKit element",
32244
- default: true,
32245
- },
32246
- if: {
32247
- anyOf: [
32248
- {
32249
- type: "string",
32250
- pattern: "^\\$.+",
32251
- },
32252
- {
32253
- type: "null",
32254
- },
32255
- ],
32256
- title: "If",
32257
- description: "Conditional expression to show this element",
32258
- },
32259
- id: {
32260
- anyOf: [
32261
- {
32262
- type: "string",
32263
- },
32264
- {
32265
- type: "null",
32266
- },
32267
- ],
32268
- title: "Id",
32269
- description: "Unique identifier for this element",
32270
- },
32271
- nullable: {
32272
- type: "boolean",
32273
- title: "Nullable",
32274
- description:
32275
- "Render with a sibling toggle that sets this field to null when off",
32276
- default: false,
32277
- },
32278
- defaultEnabled: {
32279
- anyOf: [
32280
- {
32281
- type: "boolean",
32282
- },
32283
- {
32284
- type: "null",
32285
- },
32286
- ],
32287
- title: "Defaultenabled",
32288
- description:
32289
- "For a nullable element, whether its toggle should start enabled on a fresh form (i.e. the field's data default is non-null). Ignored for non-nullable elements.",
32290
- },
32291
- formkit: {
33362
+ event_id: {
32292
33363
  type: "string",
32293
- const: "localeInput",
32294
- title: "Formkit",
32295
- description: "Locale input element.",
32296
- default: "localeInput",
33364
+ title: "Event Id",
32297
33365
  },
32298
- name: {
32299
- anyOf: [
32300
- {
32301
- type: "string",
32302
- },
32303
- {
32304
- type: "null",
32305
- },
32306
- ],
32307
- title: "Name",
32308
- description: "Name of this field",
33366
+ created_at: {
33367
+ type: "integer",
33368
+ title: "Created At",
33369
+ description:
33370
+ "The time (in ns since epoch) the event was stored in the event store",
32309
33371
  },
32310
- label: {
33372
+ display_name: {
32311
33373
  anyOf: [
32312
33374
  {
32313
33375
  $ref: "#/components/schemas/LocaleString",
32314
33376
  },
32315
33377
  {
32316
- type: "string",
33378
+ type: "null",
32317
33379
  },
32318
33380
  ],
32319
- title: "Label",
32320
- description: "Label of this field",
33381
+ description: "Display name for the event",
32321
33382
  },
32322
- help: {
33383
+ display_description: {
32323
33384
  anyOf: [
32324
33385
  {
32325
33386
  $ref: "#/components/schemas/LocaleString",
32326
33387
  },
32327
- {
32328
- type: "string",
32329
- },
32330
33388
  {
32331
33389
  type: "null",
32332
33390
  },
32333
33391
  ],
32334
- title: "Help",
32335
- description: "Help text of this field",
33392
+ description: "Display description for the event",
32336
33393
  },
32337
- value: {
32338
- anyOf: [
32339
- {
32340
- type: "string",
32341
- },
32342
- {
32343
- type: "integer",
32344
- },
32345
- {
32346
- type: "number",
32347
- },
32348
- {
32349
- type: "boolean",
32350
- },
32351
- {
32352
- items: {
32353
- type: "string",
32354
- },
32355
- type: "array",
32356
- },
32357
- {
32358
- additionalProperties: {
32359
- type: "string",
32360
- },
32361
- type: "object",
32362
- },
32363
- {
32364
- type: "null",
32365
- },
32366
- ],
32367
- title: "Value",
32368
- description: "Default value for this field",
33394
+ source_folder: {
33395
+ type: "string",
33396
+ title: "Source Folder",
33397
+ description: "Folder the classified messages were read from.",
32369
33398
  },
32370
- required: {
32371
- type: "boolean",
32372
- title: "Required",
32373
- description: "Whether this field is required",
32374
- default: false,
33399
+ count: {
33400
+ type: "integer",
33401
+ title: "Count",
33402
+ description: "Number of messages classified and filed in this run.",
32375
33403
  },
32376
- additional_validation_rules: {
32377
- anyOf: [
32378
- {
32379
- type: "string",
32380
- },
32381
- {
32382
- type: "null",
32383
- },
32384
- ],
32385
- title: "Additional Validation Rules",
32386
- description: "Validation expression",
33404
+ per_category: {
33405
+ additionalProperties: {
33406
+ type: "integer",
33407
+ },
33408
+ type: "object",
33409
+ title: "Per Category",
33410
+ description:
33411
+ "How many messages were filed under each configured category.",
32387
33412
  },
32388
- inputType: {
32389
- type: "string",
32390
- enum: ["text", "textarea"],
32391
- title: "Inputtype",
33413
+ fallback_count: {
33414
+ type: "integer",
33415
+ title: "Fallback Count",
32392
33416
  description:
32393
- "Input type: 'text' for single-line, 'textarea' for multi-line",
32394
- default: "text",
33417
+ "How many messages went to the fallback folder instead of a category.",
33418
+ default: 0,
32395
33419
  },
32396
- rows: {
33420
+ failed_count: {
32397
33421
  type: "integer",
32398
- title: "Rows",
32399
- description: "Number of rows for textarea mode (ignored for text mode)",
32400
- default: 3,
33422
+ title: "Failed Count",
33423
+ description:
33424
+ "How many messages the classifier could not reach a verdict on at all. They are filed into the failure folder rather than left in the inbox, where they would be re-selected on every run forever.",
33425
+ default: 0,
32401
33426
  },
32402
- placeholder: {
32403
- anyOf: [
32404
- {
32405
- $ref: "#/components/schemas/LocaleString",
32406
- },
32407
- {
32408
- type: "string",
32409
- },
32410
- {
32411
- type: "null",
32412
- },
32413
- ],
32414
- title: "Placeholder",
32415
- description: "Placeholder text for each language",
33427
+ classified: {
33428
+ items: {
33429
+ $ref: "#/components/schemas/MailClassificationRef",
33430
+ },
33431
+ type: "array",
33432
+ title: "Classified",
33433
+ description:
33434
+ "Per-message classification verdicts and filing destinations.",
32416
33435
  },
32417
33436
  },
32418
33437
  additionalProperties: true,
32419
33438
  type: "object",
32420
- required: ["label"],
32421
- title: "LocaleInput",
33439
+ required: ["source_folder", "count"],
33440
+ title: "MailBatchClassifiedEvent",
32422
33441
  description:
32423
- 'A FormKit element for entering multi-language text (LocaleString values).\n\nThis element renders as a text input with language switching capability,\nallowing users to enter translations for all supported languages (de, en, fr, it)\nin a single compact UI component.\n\nThe frontend renders this as an input field with a language selector, where users\ncan switch between languages to enter the corresponding translation.\n\n### Form Duality\nWhen used in a Form, this element captures a LocaleString value with translations\nfor each language. The form submission returns a dict with language keys.\n\n### Example Usage\n```python\nclass MyAgentConfig(AgentConfig):\n custom_greeting: Annotated[\n LocaleString | LocaleInput,\n Field(description="Custom greeting message"),\n ]\n\n# Form mode - for rendering:\nconfig = MyAgentConfig(\n ...,\n custom_greeting=LocaleInput(label=LocaleString(en="Greeting", de="Begrüßung")),\n)\n\n# Data mode - from submission:\nconfig = MyAgentConfig(\n ...,\n custom_greeting=LocaleString(en="Hello", de="Hallo", fr="Bonjour", it="Ciao"),\n)\n```',
33442
+ "Summarises one classification run: how many messages were classified and where each was filed.\n\nOne event per run rather than one per message, matching `MailBatchDraftedEvent` the per-message detail rides in\n`classified`. Filing is what prevents reprocessing: every message leaves the source folder, so the next unread\nlisting cannot see it again.",
32424
33443
  } as const;
32425
33444
 
32426
33445
  export const MailBatchDraftedEventWritableSchema = {
@@ -32467,6 +33486,22 @@ export const MailBatchDraftedEventWritableSchema = {
32467
33486
  title: "Count",
32468
33487
  description: "Number of reply drafts created in this run.",
32469
33488
  },
33489
+ per_category: {
33490
+ additionalProperties: {
33491
+ type: "integer",
33492
+ },
33493
+ type: "object",
33494
+ title: "Per Category",
33495
+ description:
33496
+ "How many drafts were created for each category, when drafting followed a classification run. Empty when the drafting blueprint does not classify.",
33497
+ },
33498
+ skipped_count: {
33499
+ type: "integer",
33500
+ title: "Skipped Count",
33501
+ description:
33502
+ "Messages in the batch that got no draft: usually because their category was not opted in, or no category fitted them at all.",
33503
+ default: 0,
33504
+ },
32470
33505
  drafted: {
32471
33506
  items: {
32472
33507
  $ref: "#/components/schemas/DraftedReplyRef",
@@ -32673,6 +33708,13 @@ export const MailMovedEventWritableSchema = {
32673
33708
  title: "Target Folder",
32674
33709
  description: "Folder the message was moved into.",
32675
33710
  },
33711
+ folder_created: {
33712
+ type: "boolean",
33713
+ title: "Folder Created",
33714
+ description:
33715
+ "Whether the target folder did not exist and was created by this move — an agent adding a folder to someone's mailbox is a visible side effect and belongs in the audit trail.",
33716
+ default: false,
33717
+ },
32676
33718
  },
32677
33719
  additionalProperties: true,
32678
33720
  type: "object",
@@ -33860,7 +34902,7 @@ export const ProcessClassDTOWritableSchema = {
33860
34902
  description: "FormKit elements defining the configuration form.",
33861
34903
  },
33862
34904
  process_config_specs: {
33863
- $ref: "#/components/schemas/ProcessConfigSpecs",
34905
+ $ref: "#/components/schemas/ConfigSpecs",
33864
34906
  description:
33865
34907
  "Configuration specifications of the process class, including schema and parameters.",
33866
34908
  },
@@ -34127,8 +35169,16 @@ export const RAGStartEventWritableSchema = {
34127
35169
  default: "de",
34128
35170
  },
34129
35171
  user: {
34130
- $ref: "#/components/schemas/UserIdentity",
34131
- description: "User on whose behalf the RAG run is executed.",
35172
+ anyOf: [
35173
+ {
35174
+ $ref: "#/components/schemas/UserIdentity",
35175
+ },
35176
+ {
35177
+ type: "null",
35178
+ },
35179
+ ],
35180
+ description:
35181
+ "User on whose behalf the RAG run is executed, when there is one. Optional because a delegating agent forwards whatever identity its own start event carries, and a scheduled run carries none — there is no service account to substitute. The RAG agent's user-memory steps are what read it, and they are skipped without it rather than attributing one caller's memories to a shared identity.",
34132
35182
  },
34133
35183
  messages: {
34134
35184
  items: {
@@ -34192,7 +35242,7 @@ export const RAGStartEventWritableSchema = {
34192
35242
  },
34193
35243
  additionalProperties: true,
34194
35244
  type: "object",
34195
- required: ["user", "selected_namespaces"],
35245
+ required: ["selected_namespaces"],
34196
35246
  title: "RAGStartEvent",
34197
35247
  description:
34198
35248
  "Namespace-aware start event for the RAG agent.\n\n`RAGStartEvent` is intended for non-chat publishers: custom domain front-ends that run their own namespace\nselection UI, or other agents delegating to RAG via `AgentInTheLoop`.",
@@ -35249,323 +36299,254 @@ export const RetrieverEventWritableSchema = {
35249
36299
  ],
35250
36300
  description: "Display description for the event",
35251
36301
  },
35252
- nodes: {
35253
- anyOf: [
35254
- {
35255
- items: {
35256
- $ref: "#/components/schemas/IngestedNode",
35257
- },
35258
- type: "array",
35259
- },
35260
- {
35261
- type: "null",
35262
- },
35263
- ],
35264
- title: "Nodes",
35265
- description:
35266
- "List of nodes retrieved by the retriever, including document IDs, scores, and content.",
35267
- },
35268
- },
35269
- additionalProperties: true,
35270
- type: "object",
35271
- title: "RetrieverEvent",
35272
- } as const;
35273
-
35274
- export const RouteOptionsWritableSchema = {
35275
- properties: {
35276
- event_id: {
35277
- type: "string",
35278
- title: "Event Id",
35279
- },
35280
- created_at: {
35281
- type: "integer",
35282
- title: "Created At",
35283
- description:
35284
- "The time (in ns since epoch) the event was stored in the event store",
35285
- },
35286
- display_name: {
35287
- anyOf: [
35288
- {
35289
- $ref: "#/components/schemas/LocaleString",
35290
- },
35291
- {
35292
- type: "null",
35293
- },
35294
- ],
35295
- description: "Display name for the event",
35296
- },
35297
- display_description: {
35298
- anyOf: [
35299
- {
35300
- $ref: "#/components/schemas/LocaleString",
35301
- },
35302
- {
35303
- type: "null",
35304
- },
35305
- ],
35306
- description: "Display description for the event",
35307
- },
35308
- name: {
35309
- type: "string",
35310
- title: "Name",
35311
- description: "For UI purpose only",
35312
- },
35313
- description: {
35314
- type: "string",
35315
- title: "Description",
35316
- description: "For UI purpose only",
35317
- },
35318
- instructions: {
35319
- type: "string",
35320
- title: "Instructions",
35321
- description: "Instructions for LLM when to route here",
35322
- },
35323
- event: {
35324
- $ref: "#/components/schemas/ControlEventWritable",
35325
- description: "Possible event to route to",
35326
- },
35327
- },
35328
- additionalProperties: true,
35329
- type: "object",
35330
- required: ["name", "description", "instructions", "event"],
35331
- title: "RouteOptions",
35332
- } as const;
35333
-
35334
- export const RouterEventWritableSchema = {
35335
- properties: {
35336
- event_id: {
35337
- type: "string",
35338
- title: "Event Id",
35339
- },
35340
- created_at: {
35341
- type: "integer",
35342
- title: "Created At",
35343
- description:
35344
- "The time (in ns since epoch) the event was stored in the event store",
35345
- },
35346
- display_name: {
35347
- anyOf: [
35348
- {
35349
- $ref: "#/components/schemas/LocaleString",
35350
- },
35351
- {
35352
- type: "null",
35353
- },
35354
- ],
35355
- description: "Display name for the event",
35356
- },
35357
- display_description: {
35358
- anyOf: [
35359
- {
35360
- $ref: "#/components/schemas/LocaleString",
35361
- },
35362
- {
35363
- type: "null",
35364
- },
35365
- ],
35366
- description: "Display description for the event",
35367
- },
35368
- routes: {
35369
- items: {
35370
- $ref: "#/components/schemas/RouteOptionsWritable",
35371
- },
35372
- type: "array",
35373
- title: "Routes",
35374
- description: "List of options",
35375
- },
35376
- selected_option: {
35377
- $ref: "#/components/schemas/RouteOptionsWritable",
35378
- description: "Selected option",
35379
- },
35380
- reason: {
35381
- type: "string",
35382
- title: "Reason",
35383
- description: "Reason for the decision",
35384
- },
35385
- },
35386
- additionalProperties: true,
35387
- type: "object",
35388
- required: ["routes", "selected_option", "reason"],
35389
- title: "RouterEvent",
35390
- description:
35391
- "A RouterEvent marks a point where an LLM decided which way to go in the workflow.",
35392
- } as const;
35393
-
35394
- export const RunStatisticsWritableSchema = {
35395
- properties: {
35396
- n_events: {
35397
- type: "integer",
35398
- title: "N Events",
35399
- description: "Total number of events",
35400
- default: 0,
35401
- },
35402
- has_errors: {
35403
- type: "boolean",
35404
- title: "Has Errors",
35405
- description: "Has error events",
35406
- default: false,
35407
- },
35408
- has_pending: {
35409
- type: "boolean",
35410
- title: "Has Pending",
35411
- description: "Has pending events (more start than stop/exception events)",
35412
- default: false,
35413
- },
35414
- is_hitl: {
35415
- type: "boolean",
35416
- title: "Is Hitl",
35417
- description: "Has HITL events",
35418
- default: false,
35419
- },
35420
- open_hitl: {
35421
- type: "boolean",
35422
- title: "Open Hitl",
35423
- description: "Has open HITL requests",
35424
- default: false,
35425
- },
35426
- is_bitl: {
35427
- type: "boolean",
35428
- title: "Is Bitl",
35429
- description: "Has BITL events",
35430
- default: false,
35431
- },
35432
- open_bitl: {
35433
- type: "boolean",
35434
- title: "Open Bitl",
35435
- description: "Has open BITL requests",
35436
- default: false,
35437
- },
35438
- is_aitl: {
35439
- type: "boolean",
35440
- title: "Is Aitl",
35441
- description: "Has AITL events",
35442
- default: false,
35443
- },
35444
- open_aitl: {
35445
- type: "boolean",
35446
- title: "Open Aitl",
35447
- description: "Has open AITL requests",
35448
- default: false,
35449
- },
35450
- started_at: {
35451
- anyOf: [
35452
- {
35453
- type: "string",
35454
- },
35455
- {
35456
- type: "null",
35457
- },
35458
- ],
35459
- title: "Started At",
35460
- description: "Start time (ISO format string)",
35461
- },
35462
- ended_at: {
35463
- anyOf: [
35464
- {
35465
- type: "string",
35466
- },
35467
- {
35468
- type: "null",
35469
- },
35470
- ],
35471
- title: "Ended At",
35472
- description: "End time (ISO format string)",
35473
- },
35474
- duration: {
35475
- anyOf: [
35476
- {
35477
- type: "number",
35478
- },
35479
- {
35480
- type: "null",
35481
- },
35482
- ],
35483
- title: "Duration",
35484
- description: "Duration in seconds",
35485
- },
35486
- run_id: {
35487
- type: "string",
35488
- title: "Run Id",
35489
- description: "The run ID",
35490
- },
35491
- agent: {
35492
- $ref: "#/components/schemas/MinimalAgentInstanceDTOWritable",
35493
- description: "The agent that ran the run",
35494
- },
35495
- },
35496
- type: "object",
35497
- required: ["run_id", "agent"],
35498
- title: "RunStatistics",
35499
- description: "Statistics for a single run, intended for API response.",
35500
- } as const;
35501
-
35502
- export const ScheduledStartEventWritableSchema = {
35503
- properties: {
35504
- event_id: {
35505
- type: "string",
35506
- title: "Event Id",
35507
- },
35508
- created_at: {
35509
- type: "integer",
35510
- title: "Created At",
35511
- description:
35512
- "The time (in ns since epoch) the event was stored in the event store",
35513
- },
35514
- display_name: {
35515
- anyOf: [
35516
- {
35517
- $ref: "#/components/schemas/LocaleString",
35518
- },
35519
- {
35520
- type: "null",
35521
- },
35522
- ],
35523
- description: "Display name for the event",
35524
- },
35525
- display_description: {
35526
- anyOf: [
35527
- {
35528
- $ref: "#/components/schemas/LocaleString",
35529
- },
35530
- {
35531
- type: "null",
35532
- },
35533
- ],
35534
- description: "Display description for the event",
35535
- },
35536
- locale: {
36302
+ nodes: {
36303
+ anyOf: [
36304
+ {
36305
+ items: {
36306
+ $ref: "#/components/schemas/IngestedNode",
36307
+ },
36308
+ type: "array",
36309
+ },
36310
+ {
36311
+ type: "null",
36312
+ },
36313
+ ],
36314
+ title: "Nodes",
36315
+ description:
36316
+ "List of nodes retrieved by the retriever, including document IDs, scores, and content.",
36317
+ },
36318
+ },
36319
+ additionalProperties: true,
36320
+ type: "object",
36321
+ title: "RetrieverEvent",
36322
+ } as const;
36323
+
36324
+ export const RouteOptionsWritableSchema = {
36325
+ properties: {
36326
+ event_id: {
35537
36327
  type: "string",
35538
- title: "Locale",
36328
+ title: "Event Id",
36329
+ },
36330
+ created_at: {
36331
+ type: "integer",
36332
+ title: "Created At",
35539
36333
  description:
35540
- "The locale the scheduled run reports its display output in.",
35541
- default: "de",
36334
+ "The time (in ns since epoch) the event was stored in the event store",
35542
36335
  },
35543
- user: {
36336
+ display_name: {
35544
36337
  anyOf: [
35545
36338
  {
35546
- $ref: "#/components/schemas/UserIdentity",
36339
+ $ref: "#/components/schemas/LocaleString",
35547
36340
  },
35548
36341
  {
35549
36342
  type: "null",
35550
36343
  },
35551
36344
  ],
35552
- description:
35553
- "Always None — scheduled runs are system-initiated and carry no execution identity.",
36345
+ description: "Display name for the event",
35554
36346
  },
35555
- scheduled_for: {
36347
+ display_description: {
36348
+ anyOf: [
36349
+ {
36350
+ $ref: "#/components/schemas/LocaleString",
36351
+ },
36352
+ {
36353
+ type: "null",
36354
+ },
36355
+ ],
36356
+ description: "Display description for the event",
36357
+ },
36358
+ name: {
35556
36359
  type: "string",
35557
- format: "date-time",
35558
- title: "Scheduled For",
36360
+ title: "Name",
36361
+ description: "For UI purpose only",
36362
+ },
36363
+ description: {
36364
+ type: "string",
36365
+ title: "Description",
36366
+ description: "For UI purpose only",
36367
+ },
36368
+ instructions: {
36369
+ type: "string",
36370
+ title: "Instructions",
36371
+ description: "Instructions for LLM when to route here",
36372
+ },
36373
+ event: {
36374
+ $ref: "#/components/schemas/ControlEventWritable",
36375
+ description: "Possible event to route to",
36376
+ },
36377
+ },
36378
+ additionalProperties: true,
36379
+ type: "object",
36380
+ required: ["name", "description", "instructions", "event"],
36381
+ title: "RouteOptions",
36382
+ } as const;
36383
+
36384
+ export const RouterEventWritableSchema = {
36385
+ properties: {
36386
+ event_id: {
36387
+ type: "string",
36388
+ title: "Event Id",
36389
+ },
36390
+ created_at: {
36391
+ type: "integer",
36392
+ title: "Created At",
35559
36393
  description:
35560
- "The cron occurrence this run fires for, in UTC. Distinct from `created_at`, which records when the scheduler published the event the two differ by the scheduler's tick latency.",
36394
+ "The time (in ns since epoch) the event was stored in the event store",
36395
+ },
36396
+ display_name: {
36397
+ anyOf: [
36398
+ {
36399
+ $ref: "#/components/schemas/LocaleString",
36400
+ },
36401
+ {
36402
+ type: "null",
36403
+ },
36404
+ ],
36405
+ description: "Display name for the event",
36406
+ },
36407
+ display_description: {
36408
+ anyOf: [
36409
+ {
36410
+ $ref: "#/components/schemas/LocaleString",
36411
+ },
36412
+ {
36413
+ type: "null",
36414
+ },
36415
+ ],
36416
+ description: "Display description for the event",
36417
+ },
36418
+ routes: {
36419
+ items: {
36420
+ $ref: "#/components/schemas/RouteOptionsWritable",
36421
+ },
36422
+ type: "array",
36423
+ title: "Routes",
36424
+ description: "List of options",
36425
+ },
36426
+ selected_option: {
36427
+ $ref: "#/components/schemas/RouteOptionsWritable",
36428
+ description: "Selected option",
36429
+ },
36430
+ reason: {
36431
+ type: "string",
36432
+ title: "Reason",
36433
+ description: "Reason for the decision",
35561
36434
  },
35562
36435
  },
35563
36436
  additionalProperties: true,
35564
36437
  type: "object",
35565
- required: ["scheduled_for"],
35566
- title: "ScheduledStartEvent",
36438
+ required: ["routes", "selected_option", "reason"],
36439
+ title: "RouterEvent",
35567
36440
  description:
35568
- "Start event fired by the cron scheduler — handling it is what makes an agent schedulable.\n\nMirrors how accepting a `UserMessageEvent` makes an agent conversational: `AgentRunner` derives\n`is_schedulable` from the start events an agent declares, so a blueprint opts in by adding a step\nthat consumes this event, with no separate registration.\n\nScheduled runs are system runs, so `user` is always None and the agent must not depend on an\ninitiating identity. Whatever tenant context the agent needs comes from its own profile\nconfiguration (as `OrgMemoryWriteConfig.tenant_id` already does), never from the run.",
36441
+ "A RouterEvent marks a point where an LLM decided which way to go in the workflow.",
36442
+ } as const;
36443
+
36444
+ export const RunStatisticsWritableSchema = {
36445
+ properties: {
36446
+ n_events: {
36447
+ type: "integer",
36448
+ title: "N Events",
36449
+ description: "Total number of events",
36450
+ default: 0,
36451
+ },
36452
+ has_errors: {
36453
+ type: "boolean",
36454
+ title: "Has Errors",
36455
+ description: "Has error events",
36456
+ default: false,
36457
+ },
36458
+ has_pending: {
36459
+ type: "boolean",
36460
+ title: "Has Pending",
36461
+ description: "Has pending events (more start than stop/exception events)",
36462
+ default: false,
36463
+ },
36464
+ is_hitl: {
36465
+ type: "boolean",
36466
+ title: "Is Hitl",
36467
+ description: "Has HITL events",
36468
+ default: false,
36469
+ },
36470
+ open_hitl: {
36471
+ type: "boolean",
36472
+ title: "Open Hitl",
36473
+ description: "Has open HITL requests",
36474
+ default: false,
36475
+ },
36476
+ is_bitl: {
36477
+ type: "boolean",
36478
+ title: "Is Bitl",
36479
+ description: "Has BITL events",
36480
+ default: false,
36481
+ },
36482
+ open_bitl: {
36483
+ type: "boolean",
36484
+ title: "Open Bitl",
36485
+ description: "Has open BITL requests",
36486
+ default: false,
36487
+ },
36488
+ is_aitl: {
36489
+ type: "boolean",
36490
+ title: "Is Aitl",
36491
+ description: "Has AITL events",
36492
+ default: false,
36493
+ },
36494
+ open_aitl: {
36495
+ type: "boolean",
36496
+ title: "Open Aitl",
36497
+ description: "Has open AITL requests",
36498
+ default: false,
36499
+ },
36500
+ started_at: {
36501
+ anyOf: [
36502
+ {
36503
+ type: "string",
36504
+ },
36505
+ {
36506
+ type: "null",
36507
+ },
36508
+ ],
36509
+ title: "Started At",
36510
+ description: "Start time (ISO format string)",
36511
+ },
36512
+ ended_at: {
36513
+ anyOf: [
36514
+ {
36515
+ type: "string",
36516
+ },
36517
+ {
36518
+ type: "null",
36519
+ },
36520
+ ],
36521
+ title: "Ended At",
36522
+ description: "End time (ISO format string)",
36523
+ },
36524
+ duration: {
36525
+ anyOf: [
36526
+ {
36527
+ type: "number",
36528
+ },
36529
+ {
36530
+ type: "null",
36531
+ },
36532
+ ],
36533
+ title: "Duration",
36534
+ description: "Duration in seconds",
36535
+ },
36536
+ run_id: {
36537
+ type: "string",
36538
+ title: "Run Id",
36539
+ description: "The run ID",
36540
+ },
36541
+ agent: {
36542
+ $ref: "#/components/schemas/MinimalAgentInstanceDTOWritable",
36543
+ description: "The agent that ran the run",
36544
+ },
36545
+ },
36546
+ type: "object",
36547
+ required: ["run_id", "agent"],
36548
+ title: "RunStatistics",
36549
+ description: "Statistics for a single run, intended for API response.",
35569
36550
  } as const;
35570
36551
 
35571
36552
  export const SelectWritableSchema = {
@@ -36526,7 +37507,7 @@ export const StandaloneQuestionCondenserEventWritableSchema = {
36526
37507
  required: ["condensed_chat_message"],
36527
37508
  title: "StandaloneQuestionCondenserEvent",
36528
37509
  description:
36529
- "Event to condense chat messages into a single standalone question as a chat message.",
37510
+ "Event to condense chat messages into a single standalone question as a chat message.\n\nA blank condensation is refused by `condense_standalone_question`, before an event of this type can be\nbuilt. The invariant is deliberately *not* also a `field_validator` here: a validator on an event is not\nonly a publish-time contract, it runs on every `model_validate`, which is how the immutable log is read\nback — JetStream replays the whole stream on each agent start, and the API rebuilds a thread's timeline\nfrom the persisted display copy. Blank condensations did occur before the producer-side raise existed, so\nvalidating on read makes that history undeserializable: replay drops the event and\n`EventService.get_events_in_thread` fails the whole thread.",
36530
37511
  } as const;
36531
37512
 
36532
37513
  export const StartEventWritableSchema = {
@@ -36687,6 +37668,19 @@ export const StoreOrganizationMemoryEventWritableSchema = {
36687
37668
  title: "Deleted Relations",
36688
37669
  description: "Deleted relations",
36689
37670
  },
37671
+ llm_model_name: {
37672
+ anyOf: [
37673
+ {
37674
+ type: "string",
37675
+ },
37676
+ {
37677
+ type: "null",
37678
+ },
37679
+ ],
37680
+ title: "Llm Model Name",
37681
+ description:
37682
+ "Model that extracted these memories (issue #1590), or None when the write stored verbatim text. Carried on this event only, for observability — it is not stored in mem0's metadata, so it cannot be recovered from the memory record itself once this event is gone.",
37683
+ },
36690
37684
  },
36691
37685
  additionalProperties: true,
36692
37686
  type: "object",
@@ -36776,6 +37770,19 @@ export const StoreUserMemoryEventWritableSchema = {
36776
37770
  title: "Deleted Relations",
36777
37771
  description: "Deleted relations",
36778
37772
  },
37773
+ llm_model_name: {
37774
+ anyOf: [
37775
+ {
37776
+ type: "string",
37777
+ },
37778
+ {
37779
+ type: "null",
37780
+ },
37781
+ ],
37782
+ title: "Llm Model Name",
37783
+ description:
37784
+ "Model that extracted these memories (issue #1590), or None when the write stored verbatim text. Carried on this event only, for observability — it is not stored in mem0's metadata, so it cannot be recovered from the memory record itself once this event is gone.",
37785
+ },
36779
37786
  },
36780
37787
  additionalProperties: true,
36781
37788
  type: "object",
@@ -38346,5 +39353,5 @@ export const VectorStoreInputWritableSchema = {
38346
39353
  required: ["label"],
38347
39354
  title: "VectorStoreInput",
38348
39355
  description:
38349
- 'A FormKit element for selecting a vector store collection, namespaces, and\nthe metadata keys publishers are allowed to filter on at query time.\n\nThis element renders as three controls:\n1. Database dropdown (loads from /api/v1/knowledge/databases)\n2. Namespace multi-select (populated based on selected database)\n3. Free-form chips input for `allowed_metadata_filter_fields`\n\nThe output matches the three configurable fields of `MilvusVectorStoreConfig`:\n{\n "collection_name": str,\n "index_namespaces": list[str],\n "allowed_metadata_filter_fields": list[str],\n}\n\n### Form Duality\nWhen used with MilvusVectorStoreConfig, the form submission is validated\ndirectly into MilvusVectorStoreConfig (connection settings are read from\nMilvusSettings at runtime).\n\n### Example Usage\n```python\nfrom swiss_ai_hub.core.form.elements.vector_store_input import VectorStoreInput\nfrom swiss_ai_hub.core.persistence.rag.vectors.stores.milvus_vector_store_config import MilvusVectorStoreConfig\n\nclass MyRetrieverConfig(Form):\n vector_store: Annotated[\n MilvusVectorStoreConfig | VectorStoreInput,\n Field(description="The vector store configuration"),\n ]\n\n# Form mode - for rendering:\nconfig = MyRetrieverConfig(\n vector_store=VectorStoreInput(\n label=LocaleString(en="Vector Store", de="Vektorspeicher"),\n ),\n)\n\n# Data mode - from submission (Pydantic validates into MilvusVectorStoreConfig):\nconfig = MyRetrieverConfig(\n vector_store=MilvusVectorStoreConfig(\n collection_name="my-database",\n index_namespaces=["namespace1", "namespace2"],\n allowed_metadata_filter_fields=["department", "year"],\n ),\n)\n```',
39356
+ 'A FormKit element for selecting a vector store collection, namespaces, and\nthe metadata keys publishers are allowed to filter on at query time.\n\nThis element renders as three controls:\n1. Database dropdown (loads from /api/v1/knowledge/databases)\n2. "All namespaces" switch, or a namespace multi-select populated from the selected database\n3. Free-form chips input for `allowed_metadata_filter_fields`\n\nThe output matches the configurable fields of `MilvusVectorStoreConfig`:\n{\n "collection_name": str,\n "index_namespaces": list[str],\n "all_namespaces": bool,\n "allowed_metadata_filter_fields": list[str],\n}\n\n### Form Duality\nWhen used with MilvusVectorStoreConfig, the form submission is validated\ndirectly into MilvusVectorStoreConfig (connection settings are read from\nMilvusSettings at runtime).\n\n### Example Usage\n```python\nfrom swiss_ai_hub.core.form.elements.vector_store_input import VectorStoreInput\nfrom swiss_ai_hub.core.persistence.rag.vectors.stores.milvus_vector_store_config import MilvusVectorStoreConfig\n\nclass MyRetrieverConfig(Form):\n vector_store: Annotated[\n MilvusVectorStoreConfig | VectorStoreInput,\n Field(description="The vector store configuration"),\n ]\n\n# Form mode - for rendering:\nconfig = MyRetrieverConfig(\n vector_store=VectorStoreInput(\n label=LocaleString(en="Vector Store", de="Vektorspeicher"),\n ),\n)\n\n# Data mode - from submission (Pydantic validates into MilvusVectorStoreConfig):\nconfig = MyRetrieverConfig(\n vector_store=MilvusVectorStoreConfig(\n collection_name="my-database",\n index_namespaces=["namespace1", "namespace2"],\n allowed_metadata_filter_fields=["department", "year"],\n ),\n)\n```',
38350
39357
  } as const;