@opencxh/domain 1.165.0 → 1.170.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/dist/entities/ai-profile/types.d.ts +9 -6
- package/dist/entities/analytics/dashboard.d.ts +5 -3
- package/dist/entities/analytics/report.d.ts +6 -4
- package/dist/entities/contact-source/types.d.ts +5 -2
- package/dist/entities/external-identity/types.d.ts +107 -0
- package/dist/entities/kb/types.d.ts +5 -2
- package/dist/entities/memory/item.d.ts +5 -3
- package/dist/entities/memory/kind.d.ts +1 -1
- package/dist/entities/playbook/assignment.d.ts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/platform/media.d.ts +16 -0
- package/dist/platform/sync-source.d.ts +9 -4
- package/dist/platform/ui.d.ts +1 -1
- package/package.json +1 -1
- package/dist/entities/transcript/types.d.ts +0 -10
- /package/dist/entities/{transcript → external-identity}/index.d.ts +0 -0
|
@@ -28,12 +28,15 @@ export interface AIProfile<T extends Record<string, any> = Record<string, any>>
|
|
|
28
28
|
/** Namespaced tool names this profile may use (default: none enabled). */
|
|
29
29
|
enabledTools?: string[];
|
|
30
30
|
/**
|
|
31
|
-
* Per-tool confirmation policy
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
31
|
+
* Per-tool confirmation policy, stored as a LIST (not a keyed map).
|
|
32
|
+
*
|
|
33
|
+
* De oorspronkelijke reden was dwingend: de SDK-client transformeerde élke object-key
|
|
34
|
+
* camel↔snake, en dat verminkte een genamespacede toolnaam (`communication__compose_email` →
|
|
35
|
+
* `communication_ComposeEmail`) zodat hij niet meer matchte met `enabledTools`. **Die transform
|
|
36
|
+
* is 17-08-2026 verwijderd**, dus een map zou nu werken.
|
|
37
|
+
*
|
|
38
|
+
* De lijst blijft staan: hij zit op bestaande profielrijen met een formulier eroverheen, en een
|
|
39
|
+
* migratie zou alleen een prettigere vorm opleveren. `enabledTools` ernaast is ook een lijst.
|
|
37
40
|
*
|
|
38
41
|
* Under autonomy "suggest", write tools are held for approval; reads run freely.
|
|
39
42
|
* A tool absent from this list defaults to "write" (safe).
|
|
@@ -42,9 +42,11 @@ export interface DashboardDef {
|
|
|
42
42
|
source?: string;
|
|
43
43
|
}
|
|
44
44
|
/**
|
|
45
|
-
* A single localized string. Kept as a flat LIST (not a lang->key->value map)
|
|
46
|
-
*
|
|
47
|
-
* (
|
|
45
|
+
* A single localized string. Kept as a flat LIST (not a lang->key->value map).
|
|
46
|
+
*
|
|
47
|
+
* The original reason (the http client mangled object KEYS, so "comms.dash.resolution_over_time" as a
|
|
48
|
+
* key got corrupted) no longer applies — that transform was removed on 2026-08-17. The flat list is
|
|
49
|
+
* kept because every consumer already iterates it and a nested map would be a migration for looks.
|
|
48
50
|
*/
|
|
49
51
|
export interface LocaleString {
|
|
50
52
|
lang: string;
|
|
@@ -12,10 +12,12 @@ import { MetricDefinition } from './metric';
|
|
|
12
12
|
*/
|
|
13
13
|
export type WidgetType = "table" | "counter";
|
|
14
14
|
/**
|
|
15
|
-
* One filter clause. Filters (and cells/totals below) are LISTS, not maps
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
15
|
+
* One filter clause. Filters (and cells/totals below) are LISTS, not maps.
|
|
16
|
+
*
|
|
17
|
+
* The original reason was that the http client mangled object keys; that transform was removed on
|
|
18
|
+
* 2026-08-17 and keys now travel untouched. The shape stays, for a reason that always held and is
|
|
19
|
+
* the stronger one: **a filter list can carry the same dimension twice** (`status=open` OR
|
|
20
|
+
* `status=pending`), and a map cannot. Same for cells, which mirror a table row.
|
|
19
21
|
*/
|
|
20
22
|
export interface FilterClause {
|
|
21
23
|
dimensionId: DimensionId;
|
|
@@ -20,8 +20,11 @@ export interface ContactSourceConfig {
|
|
|
20
20
|
* Either a built-in source id (`microsoft-directory`, `google`, `eylo-voip`, `local`)
|
|
21
21
|
* or an AI tool name (`mcp__<id>__search_companies`).
|
|
22
22
|
*
|
|
23
|
-
* A field VALUE, never an object key
|
|
24
|
-
*
|
|
23
|
+
* A field VALUE, never an object key.
|
|
24
|
+
*
|
|
25
|
+
* The original reason (the SDK client mangled object keys) is gone as of 2026-08-17. It stays a
|
|
26
|
+
* value because this is a table row: it carries `order`, `search` and `enrich` alongside, and a
|
|
27
|
+
* map has no ordering.
|
|
25
28
|
*/
|
|
26
29
|
sourceId: string;
|
|
27
30
|
kind: "internal" | "mcp";
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wie is "Asana-gebruiker 1203847" hier?
|
|
3
|
+
*
|
|
4
|
+
* Deze laag bestond niet, en dat is precies waarom `apps/asana` zijn `assignees` leeg laat: een
|
|
5
|
+
* Asana-assignee is een gid, en die één-op-één overnemen zou werk toewijzen aan een id dat in dit
|
|
6
|
+
* platform niemand is — werk op naam van een spook. De enige twee opties waren "veld weglaten" of
|
|
7
|
+
* "per app een hack", en elke volgende connector die assignees, auteurs, reviewers of commenters
|
|
8
|
+
* synct loopt er opnieuw tegenaan.
|
|
9
|
+
*
|
|
10
|
+
* ## Waarom dit een eigen store is en geen veld
|
|
11
|
+
*
|
|
12
|
+
* Een externe identiteit is **niet** hetzelfde als de vier dingen die er op lijken:
|
|
13
|
+
*
|
|
14
|
+
* | Lijkt erop | Is | Waarom niet hetzelfde |
|
|
15
|
+
* |---|---|---|
|
|
16
|
+
* | `externalId` op een record | dedupe-as voor één rij | zegt niets over personen |
|
|
17
|
+
* | `ManagedAccount.metadata.externalUserId` | de identiteit van een *verbonden account* | één per account, en alleen van wie zelf verbond |
|
|
18
|
+
* | `ManagedAccount.userId` | van wie is dit credential | eigendom, geen mapping |
|
|
19
|
+
* | `Contact` / shadow contact | een persoon *buiten* de organisatie | een assignee is iemand *binnen* de organisatie, in een extern systeem |
|
|
20
|
+
*
|
|
21
|
+
* De vraag hier is de vijfde: welke platform-gebruiker hóórt bij dit externe account. Die heeft
|
|
22
|
+
* een eigen levensduur (je koppelt hem één keer, hij geldt voor elke connector-ronde daarna) en
|
|
23
|
+
* een eigen beheer-oppervlak ("3 van de 12 Asana-gebruikers gekoppeld").
|
|
24
|
+
*
|
|
25
|
+
* ## Waarom in `apps/user`
|
|
26
|
+
*
|
|
27
|
+
* Bij de app die gebruikers bezit. De e-mail-bootstrap heeft de tenant-roster nodig en die staat
|
|
28
|
+
* daar; en niet-sync-consumenten (AI-tools, webhooks, companion-apps) kunnen hem net zo goed
|
|
29
|
+
* gebruiken. In de sync-pijplijn zetten zou hem onbruikbaar maken buiten sync.
|
|
30
|
+
*/
|
|
31
|
+
/**
|
|
32
|
+
* Hoe zeker weten we dat deze koppeling klopt?
|
|
33
|
+
*
|
|
34
|
+
* De drie waarden zijn geen kwaliteitslabel maar een **beslissingsas**: alleen bij `confirmed` en
|
|
35
|
+
* `email-match` mag er een `userId` aan hangen, en een `unmatched`-rij bestaat juist om zichtbaar
|
|
36
|
+
* te maken dat er iets te koppelen valt.
|
|
37
|
+
*/
|
|
38
|
+
export type ExternalIdentityConfidence =
|
|
39
|
+
/** Een mens heeft dit gekoppeld. Wordt nooit door een bootstrap overschreven. */
|
|
40
|
+
"confirmed"
|
|
41
|
+
/** Het externe adres matchte exact op het adres van een actieve gebruiker. */
|
|
42
|
+
| "email-match"
|
|
43
|
+
/** Bekend extern account, geen platform-gebruiker gevonden. `userId` is leeg. */
|
|
44
|
+
| "unmatched";
|
|
45
|
+
export interface ExternalIdentity {
|
|
46
|
+
id: string;
|
|
47
|
+
organizationId: string;
|
|
48
|
+
/**
|
|
49
|
+
* Welk extern systeem. De catalogus-sleutel van de connector (`"asana"`) of de app-namespace
|
|
50
|
+
* (`"microsoft"`) — hetzelfde vocabulaire als `SyncSourceDefinition.connectorHint`.
|
|
51
|
+
*
|
|
52
|
+
* Bewust niet het connector-**id**: twee organisatie-verbindingen naar hetzelfde product delen
|
|
53
|
+
* dezelfde gebruikers, en dan zou je de mapping twee keer moeten doen.
|
|
54
|
+
*/
|
|
55
|
+
connectorKey: string;
|
|
56
|
+
/** Het id van deze persoon in dat systeem: een Asana-gid, een Graph-`oid`, een Slack-user-id. */
|
|
57
|
+
externalId: string;
|
|
58
|
+
/** De platform-gebruiker. Leeg bij `confidence: "unmatched"`. */
|
|
59
|
+
userId?: string;
|
|
60
|
+
/** Wat het externe systeem als adres gaf. Bewaard zodat een latere bootstrap kan matchen. */
|
|
61
|
+
externalEmail?: string;
|
|
62
|
+
/** Wat het externe systeem als naam gaf. Alleen om de beheerlijst leesbaar te maken. */
|
|
63
|
+
externalName?: string;
|
|
64
|
+
confidence: ExternalIdentityConfidence;
|
|
65
|
+
createdAt?: number;
|
|
66
|
+
updatedAt?: number;
|
|
67
|
+
}
|
|
68
|
+
/** Eén extern account waarover een connector een vraag stelt. */
|
|
69
|
+
export interface ExternalIdentityQuery {
|
|
70
|
+
externalId: string;
|
|
71
|
+
/** Als het externe systeem een adres geeft. Zonder dit kan de bootstrap niets matchen. */
|
|
72
|
+
email?: string;
|
|
73
|
+
name?: string;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* `POST /external-identity/resolve` — **batch**, want één sync-pagina draagt er tientallen.
|
|
77
|
+
*
|
|
78
|
+
* Per record vragen zou per pagina tientallen app-grenzen kosten, en dat is precies de fout die
|
|
79
|
+
* `landRecords` al vermijdt door per soort te groeperen.
|
|
80
|
+
*/
|
|
81
|
+
export interface ResolveExternalIdentitiesRequest {
|
|
82
|
+
connectorKey: string;
|
|
83
|
+
externals: ExternalIdentityQuery[];
|
|
84
|
+
}
|
|
85
|
+
/** Wat de resolve teruggeeft per extern id. `userId` afwezig = niets om aan toe te wijzen. */
|
|
86
|
+
export interface ResolvedExternalIdentity {
|
|
87
|
+
userId?: string;
|
|
88
|
+
confidence: ExternalIdentityConfidence;
|
|
89
|
+
}
|
|
90
|
+
export interface ResolveExternalIdentitiesResponse {
|
|
91
|
+
/**
|
|
92
|
+
* Op `externalId`. Elk gevraagd id staat erin, ook de niet-gematchte — een ontbrekende sleutel
|
|
93
|
+
* en "geen match" zijn twee verschillende dingen, en de beller mag ze niet hoeven raden.
|
|
94
|
+
*
|
|
95
|
+
* Een gewone map is hier veilig: sinds de camelCase-transform op antwoorden verwijderd is
|
|
96
|
+
* (17-08-2026) reizen sleutels ongeschonden, dus een gid met een punt of een streep erin komt
|
|
97
|
+
* heel aan.
|
|
98
|
+
*/
|
|
99
|
+
resolved: Record<string, ResolvedExternalIdentity>;
|
|
100
|
+
}
|
|
101
|
+
/** `POST /external-identity/link` — een mens wijst de koppeling aan. */
|
|
102
|
+
export interface LinkExternalIdentityRequest {
|
|
103
|
+
connectorKey: string;
|
|
104
|
+
externalId: string;
|
|
105
|
+
/** Leeg = ontkoppelen; de rij blijft bestaan als `unmatched`. */
|
|
106
|
+
userId?: string;
|
|
107
|
+
}
|
|
@@ -22,8 +22,11 @@ export interface KnowledgeBase {
|
|
|
22
22
|
* `defaultLocale`; kept so the backfill can still read it. */
|
|
23
23
|
locale?: KbLocale;
|
|
24
24
|
}
|
|
25
|
-
/** A name and blurb for one language.
|
|
26
|
-
*
|
|
25
|
+
/** A name and blurb for one language.
|
|
26
|
+
*
|
|
27
|
+
* A list, not a map keyed by locale. The original reason (the http client mangled object keys) is
|
|
28
|
+
* gone as of 2026-08-17 — a map would now survive the wire. Kept as a list because it is stored
|
|
29
|
+
* data with a form and a backfill behind it, and a migration would buy nothing but a nicer shape. */
|
|
27
30
|
export interface KbTranslation {
|
|
28
31
|
locale: KbLocale;
|
|
29
32
|
name: string;
|
|
@@ -13,9 +13,11 @@ export type MemoryKindId = string;
|
|
|
13
13
|
* Een verwijzing naar iets anders — intern (`interaction:i_2`) of extern
|
|
14
14
|
* (`hubspot:5591`, `clickup:86ab2`).
|
|
15
15
|
*
|
|
16
|
-
* Een **lijst**, nooit een object met de relatie als key
|
|
17
|
-
*
|
|
18
|
-
*
|
|
16
|
+
* Een **lijst**, nooit een object met de relatie als key.
|
|
17
|
+
*
|
|
18
|
+
* De oorspronkelijke reden (de http-client mangelde object-keys) geldt niet meer sinds 17-08-2026.
|
|
19
|
+
* De lijst blijft om een reden die altijd al sterker was: **dezelfde `rel` mag twee keer voorkomen**
|
|
20
|
+
* — twee gekoppelde bedrijven, drie betrokken interacties — en een map gooit er dan één weg.
|
|
19
21
|
*/
|
|
20
22
|
export interface MemoryLink {
|
|
21
23
|
rel: string;
|
|
@@ -48,7 +48,7 @@ export interface MemorySourceDescription {
|
|
|
48
48
|
/** De declarerende app (== `manifest.name` == `req.source.app`). */
|
|
49
49
|
source: string;
|
|
50
50
|
kinds: MemoryKindDefinition[];
|
|
51
|
-
/** Vlakke LIJST
|
|
51
|
+
/** Vlakke LIJST, zoals {@link LocaleBundle}; zie daar waarom die vorm blijft. */
|
|
52
52
|
locales?: LocaleBundle;
|
|
53
53
|
/** Fase 3: welke subjects/kinds deze bron live kan leveren. */
|
|
54
54
|
live?: {
|
|
@@ -61,7 +61,7 @@ export interface AssignmentSourceDescription {
|
|
|
61
61
|
/** De declarerende app (== `manifest.name` == `req.source.app`). */
|
|
62
62
|
source: string;
|
|
63
63
|
targets: AssignmentTargetKind[];
|
|
64
|
-
/** Vlakke LIJST
|
|
64
|
+
/** Vlakke LIJST, zoals {@link LocaleBundle}; zie daar waarom die vorm blijft. */
|
|
65
65
|
locales?: LocaleBundle;
|
|
66
66
|
}
|
|
67
67
|
/** De samengestelde catalogus die de hub aan de builder levert. */
|
package/dist/index.d.ts
CHANGED
|
@@ -34,7 +34,7 @@ export * from './entities/team';
|
|
|
34
34
|
export * from './entities/time-entry';
|
|
35
35
|
export * from './entities/organization';
|
|
36
36
|
export * from './entities/shopify';
|
|
37
|
-
export * from './entities/
|
|
37
|
+
export * from './entities/external-identity';
|
|
38
38
|
export * from './entities/user';
|
|
39
39
|
export * from './entities/webhook';
|
|
40
40
|
export * from './entities/work';
|
package/dist/platform/media.d.ts
CHANGED
|
@@ -9,6 +9,17 @@ export interface AudioSegment {
|
|
|
9
9
|
endedAt: number;
|
|
10
10
|
avgRMS: number;
|
|
11
11
|
isFinal: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Dit segment begint midden in een lopende zin, omdat de VAD op
|
|
14
|
+
* `maxSpeechDurationMs` hard moest knippen in plaats van op een stilte.
|
|
15
|
+
*
|
|
16
|
+
* Dit is het enige geval waarin twee opeenvolgende segmenten elkaars tekst kunnen
|
|
17
|
+
* overlappen, en dus het enige geval waarin de naad geplakt moet worden. Een knip op
|
|
18
|
+
* stilte valt tussen twee woorden: daar valt niets te ontdubbelen. Zonder deze vlag
|
|
19
|
+
* moest de ontvanger dat verschil raden, en dat raden was de hele reden dat er drie
|
|
20
|
+
* fuzzy dedupe-lagen bestonden.
|
|
21
|
+
*/
|
|
22
|
+
continuesPrevious?: boolean;
|
|
12
23
|
}
|
|
13
24
|
export interface TranscriptWord {
|
|
14
25
|
text: string;
|
|
@@ -33,6 +44,8 @@ export interface TranscriptSegment {
|
|
|
33
44
|
endedAt: number;
|
|
34
45
|
language?: string;
|
|
35
46
|
confidence?: number;
|
|
47
|
+
/** Zie {@link AudioSegment.continuesPrevious} — reist mee zodat de store de naad kent. */
|
|
48
|
+
continuesPrevious?: boolean;
|
|
36
49
|
}
|
|
37
50
|
export interface AudioPipelineOptions {
|
|
38
51
|
silenceThreshold: number;
|
|
@@ -40,7 +53,10 @@ export interface AudioPipelineOptions {
|
|
|
40
53
|
speechFrameRatio: number;
|
|
41
54
|
silenceDurationMs: number;
|
|
42
55
|
maxSpeechDurationMs: number;
|
|
56
|
+
/** Naad-overlap, uitsluitend toegepast na een harde `maxSpeechDurationMs`-knip. */
|
|
43
57
|
overlapMs: number;
|
|
58
|
+
/** Audio die vóór de spraak-onset bewaard blijft, zodat de eerste klank niet wegvalt. */
|
|
59
|
+
preRollMs: number;
|
|
44
60
|
}
|
|
45
61
|
export type MediaPermissionKind = "microphone" | "camera";
|
|
46
62
|
export type MediaPermissionState = "granted" | "denied" | "prompt" | "unsupported";
|
|
@@ -212,10 +212,15 @@ export interface SyncRecord {
|
|
|
212
212
|
/**
|
|
213
213
|
* De velden voor de doel-app.
|
|
214
214
|
*
|
|
215
|
-
* **Vaste veldnamen, nooit een map met een extern id als sleutel.**
|
|
216
|
-
*
|
|
217
|
-
*
|
|
218
|
-
* een
|
|
215
|
+
* **Vaste veldnamen, nooit een map met een extern id als sleutel.**
|
|
216
|
+
*
|
|
217
|
+
* Hier stond de sleutel-mangeling van de SDK-client als reden. Die gold voor dit veld
|
|
218
|
+
* **nooit**: een `SyncRecord` reist van bron-app naar doel-app over `Bridge.rpc` en komt nooit
|
|
219
|
+
* bij een browser langs. (En sinds 17-08-2026 mangelt de client helemaal niets meer.)
|
|
220
|
+
*
|
|
221
|
+
* De regel blijft, om de reden die er werkelijk is: de doel-app moet de velden kunnen *typen*.
|
|
222
|
+
* `{ "asana_gid_123": {...} }` is voor `upsertWorkItemFromExternal` niet te lezen zonder eerst
|
|
223
|
+
* te weten wat de bron erin stopte, en dan verschuift elke fout van `tsc` naar runtime.
|
|
219
224
|
*/
|
|
220
225
|
data: Record<string, unknown>;
|
|
221
226
|
/**
|
package/dist/platform/ui.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ export interface ModalConfig {
|
|
|
5
5
|
id: string;
|
|
6
6
|
displayName: string;
|
|
7
7
|
resource: string;
|
|
8
|
-
size?: 'sm' | 'md' | 'lg' | 'xl';
|
|
8
|
+
size?: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl';
|
|
9
9
|
position?: 'center' | 'top' | 'bottom' | 'left' | 'right' | 'corner' | 'sidebar';
|
|
10
10
|
props?: Record<string, any>;
|
|
11
11
|
hideHeader?: boolean;
|
package/package.json
CHANGED
|
File without changes
|