@swiss-ai-hub/web 0.319.0 → 0.320.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.
@@ -5648,7 +5648,7 @@ export const ContextualizedAgentEventSchema = {
5648
5648
  $ref: "#/components/schemas/RAGStartEvent",
5649
5649
  },
5650
5650
  {
5651
- $ref: "#/components/schemas/ScheduledStartEvent",
5651
+ $ref: "#/components/schemas/CronStartEvent",
5652
5652
  },
5653
5653
  {
5654
5654
  $ref: "#/components/schemas/ExceptionEvent",
@@ -5722,6 +5722,9 @@ export const ContextualizedAgentEventSchema = {
5722
5722
  {
5723
5723
  $ref: "#/components/schemas/MailBatchDraftedEvent",
5724
5724
  },
5725
+ {
5726
+ $ref: "#/components/schemas/MailBatchClassifiedEvent",
5727
+ },
5725
5728
  ],
5726
5729
  title: "Event",
5727
5730
  description: "Data of the event itself.",
@@ -6247,7 +6250,93 @@ export const CronInputSchema = {
6247
6250
  required: ["label", "validation"],
6248
6251
  title: "CronInput",
6249
6252
  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```',
6253
+ '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```',
6254
+ } as const;
6255
+
6256
+ export const CronStartEventSchema = {
6257
+ properties: {
6258
+ event_id: {
6259
+ type: "string",
6260
+ title: "Event Id",
6261
+ },
6262
+ created_at: {
6263
+ type: "integer",
6264
+ title: "Created At",
6265
+ description:
6266
+ "The time (in ns since epoch) the event was stored in the event store",
6267
+ },
6268
+ display_name: {
6269
+ anyOf: [
6270
+ {
6271
+ $ref: "#/components/schemas/LocaleString",
6272
+ },
6273
+ {
6274
+ type: "null",
6275
+ },
6276
+ ],
6277
+ description: "Display name for the event",
6278
+ },
6279
+ display_description: {
6280
+ anyOf: [
6281
+ {
6282
+ $ref: "#/components/schemas/LocaleString",
6283
+ },
6284
+ {
6285
+ type: "null",
6286
+ },
6287
+ ],
6288
+ description: "Display description for the event",
6289
+ },
6290
+ locale: {
6291
+ type: "string",
6292
+ title: "Locale",
6293
+ description:
6294
+ "The locale the scheduled run reports its display output in.",
6295
+ default: "de",
6296
+ },
6297
+ user: {
6298
+ anyOf: [
6299
+ {
6300
+ $ref: "#/components/schemas/UserIdentity",
6301
+ },
6302
+ {
6303
+ type: "null",
6304
+ },
6305
+ ],
6306
+ description:
6307
+ "Always None — scheduled runs are system-initiated and carry no execution identity.",
6308
+ },
6309
+ scheduled_for: {
6310
+ type: "string",
6311
+ format: "date-time",
6312
+ title: "Scheduled For",
6313
+ description:
6314
+ "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.",
6315
+ },
6316
+ _event_name: {
6317
+ type: "string",
6318
+ title: "Event Name",
6319
+ description:
6320
+ "The event type name, usually the class name. If unknown, uses _unknown_event_name.\nUsed during deserialization to decide which subclass to instantiate.",
6321
+ readOnly: true,
6322
+ },
6323
+ _parent_event_names: {
6324
+ items: {
6325
+ type: "string",
6326
+ },
6327
+ type: "array",
6328
+ title: "Parent Event Names",
6329
+ description:
6330
+ "Contains the names of all parent classes up until BaseEvent, ordered from deepest to least deep inheritance.",
6331
+ readOnly: true,
6332
+ },
6333
+ },
6334
+ additionalProperties: true,
6335
+ type: "object",
6336
+ required: ["scheduled_for", "_event_name", "_parent_event_names"],
6337
+ title: "CronStartEvent",
6338
+ description:
6339
+ "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
6340
  } as const;
6252
6341
 
6253
6342
  export const Custom_OutputSchema = {
@@ -7431,7 +7520,21 @@ export const DraftedReplyRefSchema = {
7431
7520
  source_uid: {
7432
7521
  type: "string",
7433
7522
  title: "Source Uid",
7434
- description: "IMAP UID of the source message within the source folder.",
7523
+ description:
7524
+ "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.",
7525
+ },
7526
+ category: {
7527
+ anyOf: [
7528
+ {
7529
+ type: "string",
7530
+ },
7531
+ {
7532
+ type: "null",
7533
+ },
7534
+ ],
7535
+ title: "Category",
7536
+ description:
7537
+ "Category the source message was classified under, when drafting followed a classification run. Null when the drafting blueprint does not classify.",
7435
7538
  },
7436
7539
  drafts_folder: {
7437
7540
  type: "string",
@@ -12928,6 +13031,32 @@ export const LLMCostEventSchema = {
12928
13031
  description:
12929
13032
  "The name of the LLM service (e.g., 'openai/gpt-4') this event pertains to.",
12930
13033
  },
13034
+ user_id: {
13035
+ anyOf: [
13036
+ {
13037
+ type: "string",
13038
+ },
13039
+ {
13040
+ type: "null",
13041
+ },
13042
+ ],
13043
+ title: "User Id",
13044
+ description:
13045
+ "Invoking user, so spend is queryable per user. None for runs with no user context.",
13046
+ },
13047
+ tenant_id: {
13048
+ anyOf: [
13049
+ {
13050
+ type: "string",
13051
+ },
13052
+ {
13053
+ type: "null",
13054
+ },
13055
+ ],
13056
+ title: "Tenant Id",
13057
+ description:
13058
+ "Acting tenant, so spend is queryable per tenant. None for sysadmins and system runs.",
13059
+ },
12931
13060
  _event_name: {
12932
13061
  type: "string",
12933
13062
  title: "Event Name",
@@ -13194,6 +13323,69 @@ export const LLMEventSchema = {
13194
13323
  title: "LLMEvent",
13195
13324
  } as const;
13196
13325
 
13326
+ export const LLMSpendSchema = {
13327
+ properties: {
13328
+ user_id: {
13329
+ anyOf: [
13330
+ {
13331
+ type: "string",
13332
+ },
13333
+ {
13334
+ type: "null",
13335
+ },
13336
+ ],
13337
+ title: "User Id",
13338
+ description: "Invoking user, None when grouping by tenant.",
13339
+ },
13340
+ tenant_id: {
13341
+ anyOf: [
13342
+ {
13343
+ type: "string",
13344
+ },
13345
+ {
13346
+ type: "null",
13347
+ },
13348
+ ],
13349
+ title: "Tenant Id",
13350
+ description: "Acting tenant, None for runs outside a tenant.",
13351
+ },
13352
+ calls: {
13353
+ type: "integer",
13354
+ title: "Calls",
13355
+ description: "Number of LLM calls attributed to this key.",
13356
+ default: 0,
13357
+ },
13358
+ prompt_tokens_costs: {
13359
+ type: "number",
13360
+ title: "Prompt Tokens Costs",
13361
+ description: "Cost of prompt tokens.",
13362
+ default: 0,
13363
+ },
13364
+ completion_tokens_costs: {
13365
+ type: "number",
13366
+ title: "Completion Tokens Costs",
13367
+ description: "Cost of completion tokens.",
13368
+ default: 0,
13369
+ },
13370
+ embedding_tokens_costs: {
13371
+ type: "number",
13372
+ title: "Embedding Tokens Costs",
13373
+ description: "Cost of embedding tokens.",
13374
+ default: 0,
13375
+ },
13376
+ total_costs: {
13377
+ type: "number",
13378
+ title: "Total Costs",
13379
+ description: "Sum of prompt, completion and embedding costs.",
13380
+ default: 0,
13381
+ },
13382
+ },
13383
+ type: "object",
13384
+ title: "LLMSpend",
13385
+ description:
13386
+ "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).",
13387
+ } as const;
13388
+
13197
13389
  export const LLMStopEventSchema = {
13198
13390
  properties: {
13199
13391
  event_id: {
@@ -14082,6 +14274,108 @@ export const MailAttachmentRefSchema = {
14082
14274
  "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
14275
  } as const;
14084
14276
 
14277
+ export const MailBatchClassifiedEventSchema = {
14278
+ properties: {
14279
+ event_id: {
14280
+ type: "string",
14281
+ title: "Event Id",
14282
+ },
14283
+ created_at: {
14284
+ type: "integer",
14285
+ title: "Created At",
14286
+ description:
14287
+ "The time (in ns since epoch) the event was stored in the event store",
14288
+ },
14289
+ display_name: {
14290
+ anyOf: [
14291
+ {
14292
+ $ref: "#/components/schemas/LocaleString",
14293
+ },
14294
+ {
14295
+ type: "null",
14296
+ },
14297
+ ],
14298
+ description: "Display name for the event",
14299
+ },
14300
+ display_description: {
14301
+ anyOf: [
14302
+ {
14303
+ $ref: "#/components/schemas/LocaleString",
14304
+ },
14305
+ {
14306
+ type: "null",
14307
+ },
14308
+ ],
14309
+ description: "Display description for the event",
14310
+ },
14311
+ source_folder: {
14312
+ type: "string",
14313
+ title: "Source Folder",
14314
+ description: "Folder the classified messages were read from.",
14315
+ },
14316
+ count: {
14317
+ type: "integer",
14318
+ title: "Count",
14319
+ description: "Number of messages classified and filed in this run.",
14320
+ },
14321
+ per_category: {
14322
+ additionalProperties: {
14323
+ type: "integer",
14324
+ },
14325
+ type: "object",
14326
+ title: "Per Category",
14327
+ description:
14328
+ "How many messages were filed under each configured category.",
14329
+ },
14330
+ fallback_count: {
14331
+ type: "integer",
14332
+ title: "Fallback Count",
14333
+ description:
14334
+ "How many messages went to the fallback folder instead of a category.",
14335
+ default: 0,
14336
+ },
14337
+ failed_count: {
14338
+ type: "integer",
14339
+ title: "Failed Count",
14340
+ description:
14341
+ "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.",
14342
+ default: 0,
14343
+ },
14344
+ classified: {
14345
+ items: {
14346
+ $ref: "#/components/schemas/MailClassificationRef",
14347
+ },
14348
+ type: "array",
14349
+ title: "Classified",
14350
+ description:
14351
+ "Per-message classification verdicts and filing destinations.",
14352
+ },
14353
+ _event_name: {
14354
+ type: "string",
14355
+ title: "Event Name",
14356
+ description:
14357
+ "The event type name, usually the class name. If unknown, uses _unknown_event_name.\nUsed during deserialization to decide which subclass to instantiate.",
14358
+ readOnly: true,
14359
+ },
14360
+ _parent_event_names: {
14361
+ items: {
14362
+ type: "string",
14363
+ },
14364
+ type: "array",
14365
+ title: "Parent Event Names",
14366
+ description:
14367
+ "Contains the names of all parent classes up until BaseEvent, ordered from deepest to least deep inheritance.",
14368
+ readOnly: true,
14369
+ },
14370
+ },
14371
+ additionalProperties: true,
14372
+ type: "object",
14373
+ required: ["source_folder", "count", "_event_name", "_parent_event_names"],
14374
+ title: "MailBatchClassifiedEvent",
14375
+ description:
14376
+ "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.",
14377
+ } as const;
14378
+
14085
14379
  export const MailBatchDraftedEventSchema = {
14086
14380
  properties: {
14087
14381
  event_id: {
@@ -14126,6 +14420,22 @@ export const MailBatchDraftedEventSchema = {
14126
14420
  title: "Count",
14127
14421
  description: "Number of reply drafts created in this run.",
14128
14422
  },
14423
+ per_category: {
14424
+ additionalProperties: {
14425
+ type: "integer",
14426
+ },
14427
+ type: "object",
14428
+ title: "Per Category",
14429
+ description:
14430
+ "How many drafts were created for each category, when drafting followed a classification run. Empty when the drafting blueprint does not classify.",
14431
+ },
14432
+ skipped_count: {
14433
+ type: "integer",
14434
+ title: "Skipped Count",
14435
+ description:
14436
+ "Messages in the batch that got no draft: usually because their category was not opted in, or no category fitted them at all.",
14437
+ default: 0,
14438
+ },
14129
14439
  drafted: {
14130
14440
  items: {
14131
14441
  $ref: "#/components/schemas/DraftedReplyRef",
@@ -14160,6 +14470,81 @@ export const MailBatchDraftedEventSchema = {
14160
14470
  "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
14471
  } as const;
14162
14472
 
14473
+ export const MailClassificationRefSchema = {
14474
+ properties: {
14475
+ message_id: {
14476
+ type: "string",
14477
+ title: "Message Id",
14478
+ description: "IMAP UID of the message within the source folder.",
14479
+ },
14480
+ sender: {
14481
+ type: "string",
14482
+ title: "Sender",
14483
+ description: "Raw From header of the message.",
14484
+ },
14485
+ subject: {
14486
+ type: "string",
14487
+ title: "Subject",
14488
+ description: "Subject header of the message.",
14489
+ },
14490
+ category: {
14491
+ anyOf: [
14492
+ {
14493
+ type: "string",
14494
+ },
14495
+ {
14496
+ type: "null",
14497
+ },
14498
+ ],
14499
+ title: "Category",
14500
+ description:
14501
+ "Configured category the message was filed under, or null when it went to the fallback folder because no category clearly fitted.",
14502
+ },
14503
+ target_folder: {
14504
+ type: "string",
14505
+ title: "Target Folder",
14506
+ description: "Folder the message was filed into.",
14507
+ },
14508
+ reason: {
14509
+ type: "string",
14510
+ title: "Reason",
14511
+ description:
14512
+ "Model's stated reason for the choice — the audit trail for a misfile.",
14513
+ },
14514
+ folder_created: {
14515
+ type: "boolean",
14516
+ title: "Folder Created",
14517
+ description:
14518
+ "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.",
14519
+ default: false,
14520
+ },
14521
+ attachments: {
14522
+ items: {
14523
+ $ref: "#/components/schemas/MailAttachmentRef",
14524
+ },
14525
+ type: "array",
14526
+ title: "Attachments",
14527
+ description: "References to the message's attachments stored in S3.",
14528
+ },
14529
+ original_message: {
14530
+ anyOf: [
14531
+ {
14532
+ $ref: "#/components/schemas/MailMessageRef",
14533
+ },
14534
+ {
14535
+ type: "null",
14536
+ },
14537
+ ],
14538
+ description: "Reference to the original RFC822 message stored in S3.",
14539
+ },
14540
+ },
14541
+ type: "object",
14542
+ required: ["message_id", "sender", "subject", "target_folder", "reason"],
14543
+ title: "MailClassificationRef",
14544
+ description:
14545
+ "One classified message and where it was filed — the per-message detail behind a run summary.",
14546
+ } as const;
14547
+
14163
14548
  export const MailFetchedEventSchema = {
14164
14549
  properties: {
14165
14550
  event_id: {
@@ -14409,6 +14794,13 @@ export const MailMovedEventSchema = {
14409
14794
  title: "Target Folder",
14410
14795
  description: "Folder the message was moved into.",
14411
14796
  },
14797
+ folder_created: {
14798
+ type: "boolean",
14799
+ title: "Folder Created",
14800
+ description:
14801
+ "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.",
14802
+ default: false,
14803
+ },
14412
14804
  _event_name: {
14413
14805
  type: "string",
14414
14806
  title: "Event Name",
@@ -19651,106 +20043,20 @@ export const RunStatisticsSchema = {
19651
20043
  title: "Duration",
19652
20044
  description: "Duration in seconds",
19653
20045
  },
19654
- run_id: {
19655
- type: "string",
19656
- title: "Run Id",
19657
- description: "The run ID",
19658
- },
19659
- agent: {
19660
- $ref: "#/components/schemas/MinimalAgentInstanceDTO",
19661
- description: "The agent that ran the run",
19662
- },
19663
- },
19664
- type: "object",
19665
- required: ["run_id", "agent"],
19666
- title: "RunStatistics",
19667
- description: "Statistics for a single run, intended for API response.",
19668
- } as const;
19669
-
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,
20046
+ run_id: {
20047
+ type: "string",
20048
+ title: "Run Id",
20049
+ description: "The run ID",
20050
+ },
20051
+ agent: {
20052
+ $ref: "#/components/schemas/MinimalAgentInstanceDTO",
20053
+ description: "The agent that ran the run",
19746
20054
  },
19747
20055
  },
19748
- additionalProperties: true,
19749
20056
  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.",
20057
+ required: ["run_id", "agent"],
20058
+ title: "RunStatistics",
20059
+ description: "Statistics for a single run, intended for API response.",
19754
20060
  } as const;
19755
20061
 
19756
20062
  export const SearchContextCostPerQueryDTOSchema = {
@@ -27251,7 +27557,7 @@ export const ContextualizedAgentEventWritableSchema = {
27251
27557
  $ref: "#/components/schemas/RAGStartEventWritable",
27252
27558
  },
27253
27559
  {
27254
- $ref: "#/components/schemas/ScheduledStartEventWritable",
27560
+ $ref: "#/components/schemas/CronStartEventWritable",
27255
27561
  },
27256
27562
  {
27257
27563
  $ref: "#/components/schemas/ExceptionEventWritable",
@@ -27325,6 +27631,9 @@ export const ContextualizedAgentEventWritableSchema = {
27325
27631
  {
27326
27632
  $ref: "#/components/schemas/MailBatchDraftedEventWritable",
27327
27633
  },
27634
+ {
27635
+ $ref: "#/components/schemas/MailBatchClassifiedEventWritable",
27636
+ },
27328
27637
  ],
27329
27638
  title: "Event",
27330
27639
  description: "Data of the event itself.",
@@ -27595,7 +27904,76 @@ export const CronInputWritableSchema = {
27595
27904
  required: ["label"],
27596
27905
  title: "CronInput",
27597
27906
  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```',
27907
+ '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```',
27908
+ } as const;
27909
+
27910
+ export const CronStartEventWritableSchema = {
27911
+ properties: {
27912
+ event_id: {
27913
+ type: "string",
27914
+ title: "Event Id",
27915
+ },
27916
+ created_at: {
27917
+ type: "integer",
27918
+ title: "Created At",
27919
+ description:
27920
+ "The time (in ns since epoch) the event was stored in the event store",
27921
+ },
27922
+ display_name: {
27923
+ anyOf: [
27924
+ {
27925
+ $ref: "#/components/schemas/LocaleString",
27926
+ },
27927
+ {
27928
+ type: "null",
27929
+ },
27930
+ ],
27931
+ description: "Display name for the event",
27932
+ },
27933
+ display_description: {
27934
+ anyOf: [
27935
+ {
27936
+ $ref: "#/components/schemas/LocaleString",
27937
+ },
27938
+ {
27939
+ type: "null",
27940
+ },
27941
+ ],
27942
+ description: "Display description for the event",
27943
+ },
27944
+ locale: {
27945
+ type: "string",
27946
+ title: "Locale",
27947
+ description:
27948
+ "The locale the scheduled run reports its display output in.",
27949
+ default: "de",
27950
+ },
27951
+ user: {
27952
+ anyOf: [
27953
+ {
27954
+ $ref: "#/components/schemas/UserIdentity",
27955
+ },
27956
+ {
27957
+ type: "null",
27958
+ },
27959
+ ],
27960
+ description:
27961
+ "Always None — scheduled runs are system-initiated and carry no execution identity.",
27962
+ },
27963
+ scheduled_for: {
27964
+ type: "string",
27965
+ format: "date-time",
27966
+ title: "Scheduled For",
27967
+ description:
27968
+ "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.",
27969
+ },
27970
+ },
27971
+ additionalProperties: true,
27972
+ type: "object",
27973
+ required: ["scheduled_for"],
27974
+ title: "CronStartEvent",
27975
+ description:
27976
+ "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
27977
  } as const;
27600
27978
 
27601
27979
  export const DatePickerWritableSchema = {
@@ -31512,6 +31890,32 @@ export const LLMCostEventWritableSchema = {
31512
31890
  description:
31513
31891
  "The name of the LLM service (e.g., 'openai/gpt-4') this event pertains to.",
31514
31892
  },
31893
+ user_id: {
31894
+ anyOf: [
31895
+ {
31896
+ type: "string",
31897
+ },
31898
+ {
31899
+ type: "null",
31900
+ },
31901
+ ],
31902
+ title: "User Id",
31903
+ description:
31904
+ "Invoking user, so spend is queryable per user. None for runs with no user context.",
31905
+ },
31906
+ tenant_id: {
31907
+ anyOf: [
31908
+ {
31909
+ type: "string",
31910
+ },
31911
+ {
31912
+ type: "null",
31913
+ },
31914
+ ],
31915
+ title: "Tenant Id",
31916
+ description:
31917
+ "Acting tenant, so spend is queryable per tenant. None for sysadmins and system runs.",
31918
+ },
31515
31919
  },
31516
31920
  additionalProperties: true,
31517
31921
  type: "object",
@@ -32423,6 +32827,91 @@ export const LocaleInputWritableSchema = {
32423
32827
  '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```',
32424
32828
  } as const;
32425
32829
 
32830
+ export const MailBatchClassifiedEventWritableSchema = {
32831
+ properties: {
32832
+ event_id: {
32833
+ type: "string",
32834
+ title: "Event Id",
32835
+ },
32836
+ created_at: {
32837
+ type: "integer",
32838
+ title: "Created At",
32839
+ description:
32840
+ "The time (in ns since epoch) the event was stored in the event store",
32841
+ },
32842
+ display_name: {
32843
+ anyOf: [
32844
+ {
32845
+ $ref: "#/components/schemas/LocaleString",
32846
+ },
32847
+ {
32848
+ type: "null",
32849
+ },
32850
+ ],
32851
+ description: "Display name for the event",
32852
+ },
32853
+ display_description: {
32854
+ anyOf: [
32855
+ {
32856
+ $ref: "#/components/schemas/LocaleString",
32857
+ },
32858
+ {
32859
+ type: "null",
32860
+ },
32861
+ ],
32862
+ description: "Display description for the event",
32863
+ },
32864
+ source_folder: {
32865
+ type: "string",
32866
+ title: "Source Folder",
32867
+ description: "Folder the classified messages were read from.",
32868
+ },
32869
+ count: {
32870
+ type: "integer",
32871
+ title: "Count",
32872
+ description: "Number of messages classified and filed in this run.",
32873
+ },
32874
+ per_category: {
32875
+ additionalProperties: {
32876
+ type: "integer",
32877
+ },
32878
+ type: "object",
32879
+ title: "Per Category",
32880
+ description:
32881
+ "How many messages were filed under each configured category.",
32882
+ },
32883
+ fallback_count: {
32884
+ type: "integer",
32885
+ title: "Fallback Count",
32886
+ description:
32887
+ "How many messages went to the fallback folder instead of a category.",
32888
+ default: 0,
32889
+ },
32890
+ failed_count: {
32891
+ type: "integer",
32892
+ title: "Failed Count",
32893
+ description:
32894
+ "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.",
32895
+ default: 0,
32896
+ },
32897
+ classified: {
32898
+ items: {
32899
+ $ref: "#/components/schemas/MailClassificationRef",
32900
+ },
32901
+ type: "array",
32902
+ title: "Classified",
32903
+ description:
32904
+ "Per-message classification verdicts and filing destinations.",
32905
+ },
32906
+ },
32907
+ additionalProperties: true,
32908
+ type: "object",
32909
+ required: ["source_folder", "count"],
32910
+ title: "MailBatchClassifiedEvent",
32911
+ description:
32912
+ "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.",
32913
+ } as const;
32914
+
32426
32915
  export const MailBatchDraftedEventWritableSchema = {
32427
32916
  properties: {
32428
32917
  event_id: {
@@ -32467,6 +32956,22 @@ export const MailBatchDraftedEventWritableSchema = {
32467
32956
  title: "Count",
32468
32957
  description: "Number of reply drafts created in this run.",
32469
32958
  },
32959
+ per_category: {
32960
+ additionalProperties: {
32961
+ type: "integer",
32962
+ },
32963
+ type: "object",
32964
+ title: "Per Category",
32965
+ description:
32966
+ "How many drafts were created for each category, when drafting followed a classification run. Empty when the drafting blueprint does not classify.",
32967
+ },
32968
+ skipped_count: {
32969
+ type: "integer",
32970
+ title: "Skipped Count",
32971
+ description:
32972
+ "Messages in the batch that got no draft: usually because their category was not opted in, or no category fitted them at all.",
32973
+ default: 0,
32974
+ },
32470
32975
  drafted: {
32471
32976
  items: {
32472
32977
  $ref: "#/components/schemas/DraftedReplyRef",
@@ -32673,6 +33178,13 @@ export const MailMovedEventWritableSchema = {
32673
33178
  title: "Target Folder",
32674
33179
  description: "Folder the message was moved into.",
32675
33180
  },
33181
+ folder_created: {
33182
+ type: "boolean",
33183
+ title: "Folder Created",
33184
+ description:
33185
+ "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.",
33186
+ default: false,
33187
+ },
32676
33188
  },
32677
33189
  additionalProperties: true,
32678
33190
  type: "object",
@@ -35499,75 +36011,6 @@ export const RunStatisticsWritableSchema = {
35499
36011
  description: "Statistics for a single run, intended for API response.",
35500
36012
  } as const;
35501
36013
 
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: {
35537
- type: "string",
35538
- title: "Locale",
35539
- description:
35540
- "The locale the scheduled run reports its display output in.",
35541
- default: "de",
35542
- },
35543
- user: {
35544
- anyOf: [
35545
- {
35546
- $ref: "#/components/schemas/UserIdentity",
35547
- },
35548
- {
35549
- type: "null",
35550
- },
35551
- ],
35552
- description:
35553
- "Always None — scheduled runs are system-initiated and carry no execution identity.",
35554
- },
35555
- scheduled_for: {
35556
- type: "string",
35557
- format: "date-time",
35558
- title: "Scheduled For",
35559
- 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.",
35561
- },
35562
- },
35563
- additionalProperties: true,
35564
- type: "object",
35565
- required: ["scheduled_for"],
35566
- title: "ScheduledStartEvent",
35567
- 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.",
35569
- } as const;
35570
-
35571
36014
  export const SelectWritableSchema = {
35572
36015
  properties: {
35573
36016
  is_formkit_element: {