@proteos/sdk 0.51.1 → 0.52.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@proteos/sdk",
3
- "version": "0.51.1",
3
+ "version": "0.52.0",
4
4
  "license": "Apache-2.0",
5
5
  "description": "TypeScript SDK for the Proteos platform",
6
6
  "repository": {
@@ -33,6 +33,7 @@ import type {
33
33
  CreateGlossaryTermRequest,
34
34
  CreateSendingRuleRequest,
35
35
  CreateToneProfileSetupRequest,
36
+ CreateTranscriptionFromTextRequest,
36
37
  CreateTranscriptionRequest,
37
38
  DeleteConnectionQuery,
38
39
  DispatchMeetingBotRequest,
@@ -106,6 +107,7 @@ import type {
106
107
  UpdatePhoneNumberRequest,
107
108
  UpdateSendingRuleRequest,
108
109
  UpdateTranscriptionRequest,
110
+ UpsertToneProfileRequest,
109
111
  } from './types.js'
110
112
  import { type VoiceService, VoiceServiceImpl } from './voice.js'
111
113
 
@@ -1121,6 +1123,20 @@ export interface ToneProfileService {
1121
1123
  getProfile(id: string): Promise<ToneProfile>
1122
1124
  /** The single most-specific profile for a drafting context; 404 when none. */
1123
1125
  resolve(query: ResolveToneProfileQuery): Promise<ToneProfile>
1126
+ /**
1127
+ * Writes a HAND-AUTHORED profile, addressed by its scope tuple rather than an
1128
+ * id — so re-sending the same scope updates the row it created. The row lands
1129
+ * `source: 'manual'`, which locks that scope against synthesis forever after;
1130
+ * it also takes the scope over from a `model` row already there. Needs no
1131
+ * setup: a setup is the opt-in to AI synthesis, and writing a voice by hand is
1132
+ * the opposite of asking for one.
1133
+ */
1134
+ upsertProfile(request: UpsertToneProfileRequest): Promise<ToneProfile>
1135
+ /**
1136
+ * Removes one profile row, manual or model. A deleted model row comes back on
1137
+ * the next run; a deleted manual row hands its scope back to synthesis.
1138
+ */
1139
+ deleteProfile(id: string): Promise<void>
1124
1140
  }
1125
1141
 
1126
1142
  class ToneProfileServiceImpl implements ToneProfileService {
@@ -1170,6 +1186,17 @@ class ToneProfileServiceImpl implements ToneProfileService {
1170
1186
  query,
1171
1187
  )
1172
1188
  }
1189
+
1190
+ upsertProfile(request: UpsertToneProfileRequest): Promise<ToneProfile> {
1191
+ return this.client.request('PUT', `${CONVERSATION_BASE_PATH}/tone-profiles`, request)
1192
+ }
1193
+
1194
+ async deleteProfile(id: string): Promise<void> {
1195
+ await this.client.request(
1196
+ 'DELETE',
1197
+ `${CONVERSATION_BASE_PATH}/tone-profiles/${encodeURIComponent(id)}`,
1198
+ )
1199
+ }
1173
1200
  }
1174
1201
 
1175
1202
  /** Batch transcription of stored audio files + materialization. */
@@ -1180,6 +1207,14 @@ export interface TranscriptionService {
1180
1207
  * status is `completed` (or `failed`), then `materialize`.
1181
1208
  */
1182
1209
  createFromFile(request: CreateTranscriptionRequest): Promise<Transcription>
1210
+ /**
1211
+ * Lands an ALREADY WRITTEN transcript. Synchronous — no provider runs, and
1212
+ * the entity comes back `completed`, ready to `materialize` straight away.
1213
+ * The door for authoring a transcript (and so a conversation) from text with
1214
+ * nothing to upload. Same endpoint as `createFromFile`; the shape of the body
1215
+ * chooses the mode, and exactly one of the two is allowed.
1216
+ */
1217
+ createFromText(request: CreateTranscriptionFromTextRequest): Promise<Transcription>
1183
1218
  list(query?: ListTranscriptionsQuery): Promise<ListResponse<Transcription>>
1184
1219
  get(id: string): Promise<Transcription>
1185
1220
  /**
@@ -1204,6 +1239,10 @@ class TranscriptionServiceImpl implements TranscriptionService {
1204
1239
  return this.client.request('POST', `${CONVERSATION_BASE_PATH}/transcriptions`, request)
1205
1240
  }
1206
1241
 
1242
+ createFromText(request: CreateTranscriptionFromTextRequest): Promise<Transcription> {
1243
+ return this.client.request('POST', `${CONVERSATION_BASE_PATH}/transcriptions`, request)
1244
+ }
1245
+
1207
1246
  list(query: ListTranscriptionsQuery = {}): Promise<ListResponse<Transcription>> {
1208
1247
  return this.client.requestWithQuery('GET', `${CONVERSATION_BASE_PATH}/transcriptions`, query)
1209
1248
  }
@@ -914,6 +914,14 @@ export type ToneProfileSetupStatus = 'empty' | 'processing' | 'ready'
914
914
  /** A tone profile row's tier — derived, most specific wins at read time. */
915
915
  export type ToneProfileScope = 'user' | 'channel' | 'group' | 'contact'
916
916
 
917
+ /**
918
+ * Who wrote a tone profile, and therefore who may change it. `manual` rows are
919
+ * hand-authored and authoritative: synthesis never overwrites or prunes them,
920
+ * and deleting the user's setup (the AI opt-in) leaves them standing. `model`
921
+ * rows belong to the synthesis sweep, which owns them outright.
922
+ */
923
+ export type ToneProfileSource = 'manual' | 'model'
924
+
917
925
  /**
918
926
  * The per-user opt-in for tone-of-voice synthesis: only set-up users are
919
927
  * swept. Also carries the whole-user synthesis claim (status/started_at).
@@ -933,7 +941,8 @@ export interface ToneProfileSetup {
933
941
  }
934
942
 
935
943
  /**
936
- * One generated tone-of-voice instruction row. Rows form a specificity
944
+ * One tone-of-voice instruction row synthesized or hand-authored (`source`).
945
+ * Rows form a specificity
937
946
  * hierarchy — user aggregate (the constant voice), per-channel base, per
938
947
  * contact-group, per individual contact — and every row is SELF-CONTAINED: a
939
948
  * drafting consumer injects exactly one row's `instructions` verbatim (use
@@ -951,6 +960,8 @@ export interface ToneProfile {
951
960
  /** Scopes the row to one individual contact within the group. */
952
961
  contact_id?: string
953
962
  scope: ToneProfileScope
963
+ /** Who owns this row — see ToneProfileSource. */
964
+ source: ToneProfileSource
954
965
  /** COMPLETE markdown instruction set, served verbatim to a drafting model. */
955
966
  instructions: string
956
967
  /** Short delta vs the tier above — what a human scans; empty on root tiers. */
@@ -975,6 +986,30 @@ export interface ListToneProfilesQuery extends PaginationQuery {
975
986
  owned_by_id?: string
976
987
  channel?: Channel
977
988
  scope?: ToneProfileScope
989
+ /** Narrow to hand-authored (`manual`) or synthesized (`model`) rows. */
990
+ source?: ToneProfileSource
991
+ }
992
+
993
+ /**
994
+ * Writes ONE hand-authored tone profile. The identity is the scope tuple, not
995
+ * an id — re-sending the same scope updates the row it created. The row lands
996
+ * `source: 'manual'`, which locks that scope against synthesis; it also takes
997
+ * the scope over from a `model` row already sitting there.
998
+ *
999
+ * Scope grammar (mirrors the resolve precedence): omit `channel` for the
1000
+ * cross-channel base voice; `contact_group_key` needs a `channel`;
1001
+ * `contact_id` needs both, because resolution reaches a contact row only
1002
+ * through its group.
1003
+ */
1004
+ export interface UpsertToneProfileRequest {
1005
+ owned_by_id: string
1006
+ channel?: Channel
1007
+ contact_group_key?: string
1008
+ contact_id?: string
1009
+ /** COMPLETE markdown style guide for this tier; never a delta. */
1010
+ instructions: string
1011
+ /** Optional human-facing note on how this tier differs from the one above. */
1012
+ differences?: string
978
1013
  }
979
1014
 
980
1015
  /**
@@ -1595,6 +1630,10 @@ export interface Transcription {
1595
1630
  updated_by: UserRef
1596
1631
  }
1597
1632
 
1633
+ /**
1634
+ * Transcribes a storage-service audio file. Asynchronous: the row lands
1635
+ * `processing` and the caller polls until `completed`.
1636
+ */
1598
1637
  export interface CreateTranscriptionRequest {
1599
1638
  file_id: string
1600
1639
  language?: string
@@ -1602,6 +1641,38 @@ export interface CreateTranscriptionRequest {
1602
1641
  is_diarized?: boolean
1603
1642
  }
1604
1643
 
1644
+ /**
1645
+ * Lands an ALREADY WRITTEN transcript — no provider runs and the row is
1646
+ * `completed` when the call returns. This is how a transcript, and through
1647
+ * `materialize` a conversation, is authored from text with nothing to upload.
1648
+ * `source_file_id` stays empty, which is how a reader tells the two kinds apart.
1649
+ *
1650
+ * Timings are optional: plain text has none, and materialization then sequences
1651
+ * the turns by their position instead of by `start_ms`.
1652
+ */
1653
+ /**
1654
+ * One turn of an authored transcript. Distinct from TranscriptTurn (the read
1655
+ * shape, always fully populated) because everything but who-said-what is
1656
+ * derived server-side: an unlabelled speaker becomes "Speaker N", and text with
1657
+ * no timings is sequenced by position at materialization.
1658
+ */
1659
+ export interface AuthoredTranscriptTurn {
1660
+ /** Speaker index — the same number means the same person. */
1661
+ speaker: number
1662
+ speaker_label?: string
1663
+ text: string
1664
+ start_ms?: number
1665
+ end_ms?: number
1666
+ confidence?: number
1667
+ }
1668
+
1669
+ export interface CreateTranscriptionFromTextRequest {
1670
+ turns: AuthoredTranscriptTurn[]
1671
+ language?: string
1672
+ /** Defaults to whether the turns name more than one speaker. */
1673
+ is_diarized?: boolean
1674
+ }
1675
+
1605
1676
  /**
1606
1677
  * Edits a COMPLETED transcription in place. `turns`, when present, replace the
1607
1678
  * diarized turns wholesale; `speaker_labels` maps diarized speaker indexes
package/src/index.ts CHANGED
@@ -238,6 +238,7 @@ export type {
238
238
  AttachContactAddressRequest,
239
239
  AttachConversationBriefRequest,
240
240
  Attachment,
241
+ AuthoredTranscriptTurn,
241
242
  AutomatedFilterConfig,
242
243
  AutomatedSignal,
243
244
  BlockContactRequest,
@@ -310,6 +311,7 @@ export type {
310
311
  CreateGlossaryTermRequest,
311
312
  CreateSendingRuleRequest,
312
313
  CreateToneProfileSetupRequest,
314
+ CreateTranscriptionFromTextRequest,
313
315
  DispatchMeetingBotRequest,
314
316
  DomainFilterConfig,
315
317
  EmailDnsRecord,
@@ -412,6 +414,7 @@ export type {
412
414
  ToneProfileService,
413
415
  ToneProfileSetup,
414
416
  ToneProfileSetupStatus,
417
+ ToneProfileSource,
415
418
  TranscribeStreamOptions,
416
419
  Transcription,
417
420
  TranscriptionReviewStatus,
@@ -430,6 +433,7 @@ export type {
430
433
  UpdateGlossaryTermRequest,
431
434
  UpdatePhoneNumberRequest,
432
435
  UpdateSendingRuleRequest,
436
+ UpsertToneProfileRequest,
433
437
  VoiceService,
434
438
  VoiceTranscriptionStream,
435
439
  WarmupRuleConfig,
@@ -602,10 +606,14 @@ export type {
602
606
  CreateAppRequest,
603
607
  CreateComponentRequest,
604
608
  CreateDesignReferenceRequest,
609
+ CreateEntityExtensionRequest,
605
610
  CreateEntityRequest,
611
+ CreateListExtensionRequest,
606
612
  CreateListRequest,
607
613
  CreateListViewRequest,
614
+ CreateMenuConfigurationExtensionRequest,
608
615
  CreateMenuConfigurationRequest,
616
+ CreatePageExtensionRequest,
609
617
  CreatePageRequest,
610
618
  CreateVariableRequest,
611
619
  // Currency attribute meta + value
@@ -620,10 +628,13 @@ export type {
620
628
  DesignReferenceService,
621
629
  // Entity types
622
630
  Entity,
631
+ EntityExtension,
632
+ EntityExtensionService,
623
633
  EntityService,
624
634
  EntityWithSchema,
625
635
  EnumAttributeMeta,
626
636
  EnumValue,
637
+ ExtensionPosition,
627
638
  // File attribute meta
628
639
  FileAttributeMeta,
629
640
  FilterElement,
@@ -635,10 +646,17 @@ export type {
635
646
  ListComponentsOptions,
636
647
  ListDesignReferencesOptions,
637
648
  ListEntitiesOptions,
649
+ ListEntityExtensionsOptions,
650
+ ListExtension,
651
+ ListExtensionColumnPlacement,
652
+ ListExtensionService,
653
+ ListListExtensionsOptions,
638
654
  ListListsOptions,
639
655
  ListListViewsOptions,
656
+ ListMenuConfigurationExtensionsOptions,
640
657
  ListMenuConfigurationsOptions,
641
658
  ListModulesOptions,
659
+ ListPageExtensionsOptions,
642
660
  ListPagesOptions,
643
661
  ListService,
644
662
  ListVariablesOptions,
@@ -648,6 +666,10 @@ export type {
648
666
  LogicalOperator,
649
667
  // MenuConfiguration types
650
668
  MenuConfiguration,
669
+ MenuConfigurationExtension,
670
+ MenuConfigurationExtensionPlacement,
671
+ MenuConfigurationExtensionPosition,
672
+ MenuConfigurationExtensionService,
651
673
  MenuConfigurationService,
652
674
  MenuItem,
653
675
  // Shared meta types
@@ -661,6 +683,9 @@ export type {
661
683
  Page,
662
684
  PageAction,
663
685
  PageActionKind,
686
+ PageExtension,
687
+ PageExtensionPlacement,
688
+ PageExtensionService,
664
689
  PageLayout,
665
690
  PageService,
666
691
  PageType,
@@ -675,10 +700,14 @@ export type {
675
700
  UpdateAppRequest,
676
701
  UpdateComponentRequest,
677
702
  UpdateDesignReferenceRequest,
703
+ UpdateEntityExtensionRequest,
678
704
  UpdateEntityRequest,
705
+ UpdateListExtensionRequest,
679
706
  UpdateListRequest,
680
707
  UpdateListViewRequest,
708
+ UpdateMenuConfigurationExtensionRequest,
681
709
  UpdateMenuConfigurationRequest,
710
+ UpdatePageExtensionRequest,
682
711
  UpdatePageRequest,
683
712
  UpdateVariableRequest,
684
713
  // Variable types
@@ -703,24 +732,36 @@ export {
703
732
  currencySymbol,
704
733
  currencySymbolSide,
705
734
  DesignReferenceSchema,
735
+ EntityExtensionSchema,
706
736
  EntitySchema,
707
737
  EntityWithSchemaSchema,
738
+ ExtensionPositionSchema,
708
739
  FilterElementSchema,
709
740
  FilterGroupSchema,
710
741
  formatAmount,
711
742
  formatMoney,
712
743
  isCurrentUserDefault,
713
744
  isPlatformAttributeName,
745
+ ListExtensionColumnPlacementSchema,
746
+ ListExtensionSchema,
714
747
  ListSchema,
715
748
  ListViewSchema,
716
749
  localeNumberSeparators,
750
+ MENU_CONFIGURATION_EXTENSION_ANCHOR_ITEMS,
751
+ MenuConfigurationExtensionPlacementSchema,
752
+ MenuConfigurationExtensionPositionSchema,
753
+ MenuConfigurationExtensionSchema,
717
754
  MenuConfigurationSchema,
718
755
  MenuItemSchema,
719
756
  MenuItemType,
720
757
  MetaClient,
721
758
  ModuleSchema,
722
759
  OnDeleteActionSchema,
760
+ PAGE_EXTENSION_ANCHOR_MAIN,
761
+ PAGE_EXTENSION_ANCHOR_SIDE_PANEL,
723
762
  PageActionSchema,
763
+ PageExtensionPlacementSchema,
764
+ PageExtensionSchema,
724
765
  PageLayoutSchema,
725
766
  PageSchema,
726
767
  PLATFORM_ATTRIBUTE_NAMES,
@@ -0,0 +1,98 @@
1
+ import type { ProteosClient } from '../client.js'
2
+ import { PageIterator } from '../iterator.js'
3
+ import type { ListResult } from '../types/common.js'
4
+ import type {
5
+ CreateEntityExtensionRequest,
6
+ EntityExtension,
7
+ ListEntityExtensionsOptions,
8
+ UpdateEntityExtensionRequest,
9
+ } from './types.js'
10
+
11
+ const ENTITY_EXTENSIONS_BASE_PATH = '/meta/v1/entity-extensions'
12
+
13
+ /**
14
+ * Service for entity extensions — attributes contributed to an EXISTING host
15
+ * entity by a resource that does not own it (typically a second module). The
16
+ * host's `attributes` are the materialized merge: its own attributes plus every
17
+ * extension's, each stamped with `extension_key`. Every write here
18
+ * re-materializes the host; an attribute name shared with the host or another
19
+ * extension is refused (`entity_extension_attribute_collision`).
20
+ */
21
+ export interface EntityExtensionService {
22
+ /** Lists entity extensions (auto-paginating iterator). */
23
+ list(
24
+ options?: ListEntityExtensionsOptions,
25
+ ): PageIterator<EntityExtension, ListEntityExtensionsOptions>
26
+
27
+ /** Fetches a single page of entity extensions. */
28
+ listPage(options?: ListEntityExtensionsOptions): Promise<ListResult<EntityExtension>>
29
+
30
+ /** Gets an entity extension by key (404 when unknown). */
31
+ get(key: string): Promise<EntityExtension>
32
+
33
+ /**
34
+ * Creates an entity extension and merges its attributes into the host.
35
+ * @throws {ProteosError} 409 `entity_extension_already_exists` when the key
36
+ * is taken; 400 `entity_extension_entity_not_found` when the host does
37
+ * not exist; 400 `entity_extension_attribute_collision` on a name clash.
38
+ */
39
+ create(request: CreateEntityExtensionRequest): Promise<EntityExtension>
40
+
41
+ /**
42
+ * Creates or replaces an entity extension idempotently by key
43
+ * (`PUT /meta/v1/entity-extensions/:key`). Replaces the whole definition;
44
+ * the host binding (`entity_slug`) of an existing key is immutable.
45
+ */
46
+ upsert(key: string, request: CreateEntityExtensionRequest): Promise<EntityExtension>
47
+
48
+ /** Partially updates an entity extension (`attributes` replaces the whole list). */
49
+ update(key: string, request: UpdateEntityExtensionRequest): Promise<EntityExtension>
50
+
51
+ /** Deletes an entity extension and removes its attributes from the host. */
52
+ delete(key: string): Promise<void>
53
+ }
54
+
55
+ export class EntityExtensionServiceImpl implements EntityExtensionService {
56
+ constructor(private readonly client: ProteosClient) {}
57
+
58
+ list(
59
+ options: ListEntityExtensionsOptions = {},
60
+ ): PageIterator<EntityExtension, ListEntityExtensionsOptions> {
61
+ return new PageIterator((opts) => this.listPage(opts), options)
62
+ }
63
+
64
+ async listPage(options: ListEntityExtensionsOptions = {}): Promise<ListResult<EntityExtension>> {
65
+ return this.client.requestWithQuery<ListResult<EntityExtension>>(
66
+ 'GET',
67
+ ENTITY_EXTENSIONS_BASE_PATH,
68
+ options,
69
+ )
70
+ }
71
+
72
+ async get(key: string): Promise<EntityExtension> {
73
+ return this.client.request<EntityExtension>('GET', `${ENTITY_EXTENSIONS_BASE_PATH}/${key}`)
74
+ }
75
+
76
+ async create(request: CreateEntityExtensionRequest): Promise<EntityExtension> {
77
+ return this.client.request<EntityExtension>('POST', ENTITY_EXTENSIONS_BASE_PATH, request)
78
+ }
79
+
80
+ async upsert(key: string, request: CreateEntityExtensionRequest): Promise<EntityExtension> {
81
+ return this.client.request<EntityExtension>('PUT', `${ENTITY_EXTENSIONS_BASE_PATH}/${key}`, {
82
+ ...request,
83
+ key,
84
+ })
85
+ }
86
+
87
+ async update(key: string, request: UpdateEntityExtensionRequest): Promise<EntityExtension> {
88
+ return this.client.request<EntityExtension>(
89
+ 'PATCH',
90
+ `${ENTITY_EXTENSIONS_BASE_PATH}/${key}`,
91
+ request,
92
+ )
93
+ }
94
+
95
+ async delete(key: string): Promise<void> {
96
+ await this.client.request<void>('DELETE', `${ENTITY_EXTENSIONS_BASE_PATH}/${key}`)
97
+ }
98
+ }
package/src/meta/index.ts CHANGED
@@ -4,13 +4,20 @@ import { type AppService, AppServiceImpl } from './apps.js'
4
4
  import { type ComponentService, ComponentServiceImpl } from './components.js'
5
5
  import { type DesignReferenceService, DesignReferenceServiceImpl } from './design-references.js'
6
6
  import { type EntityService, EntityServiceImpl } from './entities.js'
7
+ import { type EntityExtensionService, EntityExtensionServiceImpl } from './entity-extensions.js'
8
+ import { type ListExtensionService, ListExtensionServiceImpl } from './list-extensions.js'
7
9
  import { type ListViewService, ListViewServiceImpl } from './list-views.js'
8
10
  import { type ListService, ListServiceImpl } from './lists.js'
11
+ import {
12
+ type MenuConfigurationExtensionService,
13
+ MenuConfigurationExtensionServiceImpl,
14
+ } from './menu-configuration-extensions.js'
9
15
  import {
10
16
  type MenuConfigurationService,
11
17
  MenuConfigurationServiceImpl,
12
18
  } from './menu-configurations.js'
13
19
  import { type ModuleService, ModuleServiceImpl } from './modules.js'
20
+ import { type PageExtensionService, PageExtensionServiceImpl } from './page-extensions.js'
14
21
  import { type PageService, PageServiceImpl } from './pages.js'
15
22
  import { type VariableService, VariableServiceImpl } from './variables.js'
16
23
 
@@ -40,6 +47,30 @@ export class MetaClient {
40
47
  */
41
48
  readonly entities: EntityService
42
49
 
50
+ /**
51
+ * Service for managing entity extensions — attributes contributed to a host
52
+ * entity by a resource that does not own it.
53
+ */
54
+ readonly entityExtensions: EntityExtensionService
55
+
56
+ /**
57
+ * Service for managing page extensions — anchored layout blocks contributed
58
+ * to a host page by a resource that does not own it.
59
+ */
60
+ readonly pageExtensions: PageExtensionService
61
+
62
+ /**
63
+ * Service for managing list extensions — columns and toolbar actions
64
+ * contributed to a host list by a resource that does not own it.
65
+ */
66
+ readonly listExtensions: ListExtensionService
67
+
68
+ /**
69
+ * Service for managing menu-configuration extensions — items contributed
70
+ * to a host menu by another module or resource.
71
+ */
72
+ readonly menuConfigurationExtensions: MenuConfigurationExtensionService
73
+
43
74
  /**
44
75
  * Service for managing WebAssembly modules.
45
76
  */
@@ -98,6 +129,10 @@ export class MetaClient {
98
129
  */
99
130
  constructor(client: ProteosClient) {
100
131
  this.entities = new EntityServiceImpl(client)
132
+ this.entityExtensions = new EntityExtensionServiceImpl(client)
133
+ this.pageExtensions = new PageExtensionServiceImpl(client)
134
+ this.listExtensions = new ListExtensionServiceImpl(client)
135
+ this.menuConfigurationExtensions = new MenuConfigurationExtensionServiceImpl(client)
101
136
  this.modules = new ModuleServiceImpl(client)
102
137
  this.variables = new VariableServiceImpl(client)
103
138
  this.components = new ComponentServiceImpl(client)
@@ -118,12 +153,16 @@ export * from './currency/index.js'
118
153
  export type { DesignReferenceService } from './design-references.js'
119
154
  // Re-export service interfaces
120
155
  export type { EntityService } from './entities.js'
156
+ export type { EntityExtensionService } from './entity-extensions.js'
121
157
  // Re-export the layout module (PageLayout types + Zod schemas + control registry)
122
158
  export * from './layout/index.js'
159
+ export type { ListExtensionService } from './list-extensions.js'
123
160
  export type { ListViewService } from './list-views.js'
124
161
  export type { ListService } from './lists.js'
162
+ export type { MenuConfigurationExtensionService } from './menu-configuration-extensions.js'
125
163
  export type { MenuConfigurationService } from './menu-configurations.js'
126
164
  export type { ModuleService } from './modules.js'
165
+ export type { PageExtensionService } from './page-extensions.js'
127
166
  export type { PageService } from './pages.js'
128
167
  // Re-export types
129
168
  export type {
@@ -147,10 +186,14 @@ export type {
147
186
  CreateAppRequest,
148
187
  CreateComponentRequest,
149
188
  CreateDesignReferenceRequest,
189
+ CreateEntityExtensionRequest,
150
190
  CreateEntityRequest,
191
+ CreateListExtensionRequest,
151
192
  CreateListRequest,
152
193
  CreateListViewRequest,
194
+ CreateMenuConfigurationExtensionRequest,
153
195
  CreateMenuConfigurationRequest,
196
+ CreatePageExtensionRequest,
154
197
  CreatePageRequest,
155
198
  CreateVariableRequest,
156
199
  // Currency attribute meta + value
@@ -165,9 +208,12 @@ export type {
165
208
  DesignReferenceContent,
166
209
  // Entity types
167
210
  Entity,
211
+ // EntityExtension types
212
+ EntityExtension,
168
213
  EntityWithSchema,
169
214
  EnumAttributeMeta,
170
215
  EnumValue,
216
+ ExtensionPosition,
171
217
  // File attribute meta
172
218
  FileAttributeMeta,
173
219
  FilterElement,
@@ -179,10 +225,17 @@ export type {
179
225
  ListComponentsOptions,
180
226
  ListDesignReferencesOptions,
181
227
  ListEntitiesOptions,
228
+ ListEntityExtensionsOptions,
229
+ // ListExtension types
230
+ ListExtension,
231
+ ListExtensionColumnPlacement,
232
+ ListListExtensionsOptions,
182
233
  ListListsOptions,
183
234
  ListListViewsOptions,
235
+ ListMenuConfigurationExtensionsOptions,
184
236
  ListMenuConfigurationsOptions,
185
237
  ListModulesOptions,
238
+ ListPageExtensionsOptions,
186
239
  ListPagesOptions,
187
240
  ListVariablesOptions,
188
241
  // ListView types
@@ -190,6 +243,10 @@ export type {
190
243
  LogicalOperator,
191
244
  // MenuConfiguration types
192
245
  MenuConfiguration,
246
+ // MenuConfigurationExtension types
247
+ MenuConfigurationExtension,
248
+ MenuConfigurationExtensionPlacement,
249
+ MenuConfigurationExtensionPosition,
193
250
  MenuItem,
194
251
  // Shared types
195
252
  MetaListOptions,
@@ -203,6 +260,9 @@ export type {
203
260
  Page,
204
261
  PageAction,
205
262
  PageActionKind,
263
+ // PageExtension types
264
+ PageExtension,
265
+ PageExtensionPlacement,
206
266
  PageType,
207
267
  // User attribute meta
208
268
  PrincipalAttributeMeta,
@@ -221,10 +281,14 @@ export type {
221
281
  UpdateAppRequest,
222
282
  UpdateComponentRequest,
223
283
  UpdateDesignReferenceRequest,
284
+ UpdateEntityExtensionRequest,
224
285
  UpdateEntityRequest,
286
+ UpdateListExtensionRequest,
225
287
  UpdateListRequest,
226
288
  UpdateListViewRequest,
289
+ UpdateMenuConfigurationExtensionRequest,
227
290
  UpdateMenuConfigurationRequest,
291
+ UpdatePageExtensionRequest,
228
292
  UpdatePageRequest,
229
293
  UpdateVariableRequest,
230
294
  UserAttributeMeta,
@@ -244,21 +308,33 @@ export {
244
308
  CURRENT_USER_DEFAULT,
245
309
  CurrencyAttributeMetaSchema,
246
310
  DesignReferenceSchema,
311
+ EntityExtensionSchema,
247
312
  EntitySchema,
248
313
  EntityWithSchemaSchema,
314
+ ExtensionPositionSchema,
249
315
  FileAttributeMetaSchema,
250
316
  FilterElementSchema,
251
317
  FilterGroupSchema,
252
318
  isCurrentUserDefault,
253
319
  isPlatformAttributeName,
320
+ ListExtensionColumnPlacementSchema,
321
+ ListExtensionSchema,
254
322
  ListSchema,
255
323
  ListViewSchema,
324
+ MENU_CONFIGURATION_EXTENSION_ANCHOR_ITEMS,
325
+ MenuConfigurationExtensionPlacementSchema,
326
+ MenuConfigurationExtensionPositionSchema,
327
+ MenuConfigurationExtensionSchema,
256
328
  MenuConfigurationSchema,
257
329
  MenuItemSchema,
258
330
  MenuItemType,
259
331
  ModuleSchema,
260
332
  OnDeleteActionSchema,
333
+ PAGE_EXTENSION_ANCHOR_MAIN,
334
+ PAGE_EXTENSION_ANCHOR_SIDE_PANEL,
261
335
  PageActionSchema,
336
+ PageExtensionPlacementSchema,
337
+ PageExtensionSchema,
262
338
  PageSchema,
263
339
  PLATFORM_ATTRIBUTE_NAMES,
264
340
  parseCurrencyMeta,
@@ -62,6 +62,13 @@ const ResponsiveSizingSchema = z.object({
62
62
  */
63
63
  export interface CommonProps {
64
64
  id?: string
65
+ /**
66
+ * Server-stamped back-reference to the page extension that contributes this
67
+ * element to its host page. Present only on a host's merged layout; ignored
68
+ * (stripped and re-derived) on writes. Mirrors `ExtensionKey` in the Go
69
+ * `metamodel.CommonProps`.
70
+ */
71
+ extension_key?: string
65
72
  visible_when?: FilterGroup
66
73
  read_only_when?: FilterGroup
67
74
  width?: SizeValue
@@ -78,6 +85,7 @@ export interface CommonProps {
78
85
  */
79
86
  export const commonPropsShape = {
80
87
  id: z.string().optional(),
88
+ extension_key: z.string().optional(),
81
89
  visible_when: FilterGroupSchema.optional(),
82
90
  read_only_when: FilterGroupSchema.optional(),
83
91
  width: SizeValueSchema.optional(),