@opencxh/domain 1.172.1 → 1.173.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 (84) hide show
  1. package/dist/entities/activity/blocks.d.ts +30 -30
  2. package/dist/entities/activity/catalog.d.ts +63 -86
  3. package/dist/entities/activity/descriptor.d.ts +31 -32
  4. package/dist/entities/activity/index.d.ts +2 -2
  5. package/dist/entities/activity/preview.d.ts +7 -7
  6. package/dist/entities/activity/resolve.d.ts +37 -38
  7. package/dist/entities/activity/types.d.ts +64 -35
  8. package/dist/entities/ai-account/types.d.ts +3 -3
  9. package/dist/entities/ai-account/vendors.d.ts +25 -32
  10. package/dist/entities/ai-budget/types.d.ts +5 -5
  11. package/dist/entities/ai-conversation/types.d.ts +12 -12
  12. package/dist/entities/ai-profile/types.d.ts +14 -21
  13. package/dist/entities/ai-settings/types.d.ts +12 -13
  14. package/dist/entities/analytics/index.d.ts +4 -4
  15. package/dist/entities/analytics/source.d.ts +1 -1
  16. package/dist/entities/analytics/usage.d.ts +23 -28
  17. package/dist/entities/artifact/blocks.d.ts +54 -69
  18. package/dist/entities/artifact/markdown.d.ts +2 -3
  19. package/dist/entities/artifact/types.d.ts +46 -54
  20. package/dist/entities/assignment/types.d.ts +76 -90
  21. package/dist/entities/channel/index.d.ts +1 -1
  22. package/dist/entities/channel/signature.d.ts +8 -9
  23. package/dist/entities/communication/index.d.ts +1 -1
  24. package/dist/entities/contact/index.d.ts +1 -1
  25. package/dist/entities/custom-field-def/types.d.ts +14 -14
  26. package/dist/entities/external-identity/types.d.ts +45 -50
  27. package/dist/entities/interaction/index.d.ts +1 -1
  28. package/dist/entities/interaction/types.d.ts +44 -47
  29. package/dist/entities/live-lens/types.d.ts +39 -44
  30. package/dist/entities/mcp/types.d.ts +53 -57
  31. package/dist/entities/memory/alias.d.ts +7 -7
  32. package/dist/entities/memory/browse.d.ts +21 -21
  33. package/dist/entities/memory/ingest.d.ts +24 -28
  34. package/dist/entities/memory/item.d.ts +53 -58
  35. package/dist/entities/memory/kind.d.ts +25 -25
  36. package/dist/entities/memory/query.d.ts +49 -51
  37. package/dist/entities/playbook/actor.d.ts +17 -17
  38. package/dist/entities/playbook/assignment.d.ts +54 -63
  39. package/dist/entities/playbook/index.d.ts +2 -2
  40. package/dist/entities/playbook/labels.d.ts +4 -4
  41. package/dist/entities/playbook/trigger-vars.d.ts +17 -15
  42. package/dist/entities/playbook/types.d.ts +174 -303
  43. package/dist/entities/resource-reminder/types.d.ts +8 -9
  44. package/dist/entities/time-entry/duration.d.ts +11 -11
  45. package/dist/entities/time-entry/types.d.ts +59 -59
  46. package/dist/entities/time-entry/work-type.d.ts +21 -24
  47. package/dist/entities/topic/examples.d.ts +26 -27
  48. package/dist/entities/topic/scope.d.ts +11 -12
  49. package/dist/entities/topic/types.d.ts +26 -28
  50. package/dist/entities/user/types.d.ts +24 -28
  51. package/dist/entities/webhook/types.d.ts +6 -6
  52. package/dist/entities/work/activity.d.ts +36 -0
  53. package/dist/entities/work/index.d.ts +1 -0
  54. package/dist/entities/work/keys.d.ts +25 -26
  55. package/dist/entities/work/ladder.d.ts +48 -52
  56. package/dist/entities/work/types.d.ts +108 -114
  57. package/dist/index.cjs +6 -6
  58. package/dist/index.d.ts +29 -28
  59. package/dist/index.js +1416 -1258
  60. package/dist/platform/account.d.ts +34 -38
  61. package/dist/platform/ai-tools.d.ts +48 -52
  62. package/dist/platform/api.d.ts +9 -10
  63. package/dist/platform/author.d.ts +7 -9
  64. package/dist/platform/capabilities.d.ts +3 -3
  65. package/dist/platform/communication.d.ts +163 -204
  66. package/dist/platform/context.d.ts +8 -8
  67. package/dist/platform/identity.d.ts +16 -19
  68. package/dist/platform/kernel.d.ts +1 -1
  69. package/dist/platform/manifest.d.ts +2 -2
  70. package/dist/platform/media.d.ts +13 -15
  71. package/dist/platform/permission.d.ts +39 -0
  72. package/dist/platform/permission.test.d.ts +1 -0
  73. package/dist/platform/presence.d.ts +30 -30
  74. package/dist/platform/provider.d.ts +14 -15
  75. package/dist/platform/resource-source.d.ts +43 -45
  76. package/dist/platform/resource.d.ts +17 -23
  77. package/dist/platform/scope.d.ts +35 -61
  78. package/dist/platform/services.d.ts +4 -4
  79. package/dist/platform/storage.d.ts +1 -1
  80. package/dist/platform/sync-source.d.ts +196 -216
  81. package/dist/platform/transcript-cadence.d.ts +37 -41
  82. package/dist/platform/ui.d.ts +6 -6
  83. package/dist/text/endpoint.d.ts +11 -27
  84. package/package.json +3 -2
@@ -1,34 +1,30 @@
1
1
  /**
2
- * Laag 1 van de integratielagen: **Account** — het credential.
2
+ * Layer 1 of the integration layers: **Account** — the credential.
3
3
  *
4
- * Vier lagen, en dit is de onderste:
5
- * | Laag | Vraag | Woord |
4
+ * Four layers, and this is the bottom one:
5
+ * | Layer | Question | Word |
6
6
  * |---|---|---|
7
- * | 1 Credential | mag ik erin? | **Account** (`ManagedAccount`) |
8
- * | 2 Connector | waar is het, welk protocol? | **Connector** (`McpServerEntity`) |
9
- * | 3 Capability | wat kan ik ermee? | **Source** (`sync-source`, `memory-source`, …) |
10
- * | 4 Usage | staat het aan, met welke instellingen? | **Connection** (`SyncConnection`, `Channel`) |
7
+ * | 1 Credential | may I get in? | **Account** (`ManagedAccount`) |
8
+ * | 2 Connector | where is it, which protocol? | **Connector** (`McpServerEntity`) |
9
+ * | 3 Capability | what can I do with it? | **Source** (`sync-source`, `memory-source`, …) |
10
+ * | 4 Usage | is it on, with which settings? | **Connection** (`SyncConnection`, `Channel`) |
11
11
  *
12
- * `ManagedAccount` is een **platform**-primitive, niet een comms-entiteit — dat het type
13
- * historisch in `entities/communication/types.ts` stond kwam alleen doordat de *store* daar
14
- * woont. De store blijft in comms (daar zitten de scope-guard en de OAuth-orchestrator);
15
- * het type hoort hier, want ai, mail, ftp, s3, google en microsoft hangen er allemaal aan.
12
+ * `ManagedAccount` is a **platform** primitive, not a comms entity — that the type historically
13
+ * sat in `entities/communication/types.ts` was only because the *store* lives there. The store
14
+ * stays in comms (the scope guard and the OAuth orchestrator are there); the type belongs here,
15
+ * because ai, mail, ftp, s3, google and microsoft all hang off it.
16
16
  *
17
- * ## Niet verwarren met een Registration
17
+ * **Not to be confused with a Registration.** `google_account`, `microsoft_account`,
18
+ * `shopify_account`, `slack_account` and `meta_app` are NOT accounts in this sense. Those are
19
+ * **registrations**: the clientId/clientSecret the organisation identifies itself to the vendor
20
+ * with. One registration carries N accounts. They only share the word.
18
21
  *
19
- * `google_account`, `microsoft_account`, `shopify_account`, `slack_account` en `meta_app` zijn
20
- * GEEN accounts in deze zin. Dat zijn **registraties**: de clientId/clientSecret waarmee de
21
- * organisatie zichzelf bij de vendor aanmeldt. Eén registratie draagt N accounts. Ze delen
22
- * alleen het woord.
23
- *
24
- * ## Scope: `userId` is de enige eigendom-as
25
- *
26
- * `userId` afwezig/`null` = org-breed, gedeeld. Gezet = persoonlijk, van die ene gebruiker.
27
- * Er is bewust **geen** `ownerScope` en **geen** `createdBy` op een credential:
28
- * - `ownerScope` (`personal`/`team`/`org`) is de as van een *resource* — met wie deel ik dit
29
- * contact, werkitem of geheugen. Een token heeft geen teamvariant.
30
- * - "wat eist de vendor" (één gedeeld token vs. iedereen zijn eigen) is een eigenschap van de
31
- * **connector**, niet van de accountrij: zie `credentialScope` in `entities/mcp/types.ts`.
22
+ * **Scope: `userId` is the only ownership axis.** Absent/`null` = org-wide, shared. Set =
23
+ * personal, of that one user. There is deliberately **no** `ownerScope` and **no** `createdBy` on
24
+ * a credential: `ownerScope` (`personal`/`team`/`org`) is the axis of a *resource* — who do I
25
+ * share this contact, work item or memory with — and a token has no team variant; and "what does
26
+ * the vendor demand" (one shared token vs. everyone their own) is a property of the **connector**,
27
+ * not of the account row: see `credentialScope` in `entities/mcp/types.ts`.
32
28
  */
33
29
  export type AuthState = {
34
30
  type: "oauth2";
@@ -41,16 +37,16 @@ export type AuthState = {
41
37
  } | {
42
38
  type: "password";
43
39
  username: string;
44
- /** Rauw wachtwoord (geen secret-store in repo). Alleen via internal-path. */
40
+ /** Raw password (no secret store in the repo). Internal path only. */
45
41
  password: string;
46
- /** Toekomstige secret-store-referentie i.p.v. raw `password`. */
42
+ /** Future secret-store reference instead of the raw `password`. */
47
43
  passwordRef?: string;
48
44
  } | {
49
45
  type: "certificate";
50
46
  certRef: string;
51
47
  } | {
52
48
  type: "apikey";
53
- /** Rauwe API-key (geen secret-store in repo). Alleen via internal-path. */
49
+ /** Raw API key (no secret store in the repo). Internal path only. */
54
50
  apiKey: string;
55
51
  } | {
56
52
  type: "static";
@@ -60,29 +56,29 @@ export interface ManagedAccount {
60
56
  id: string;
61
57
  organizationId: string;
62
58
  /**
63
- * Afwezig/`null` = org-breed gedeeld account. Gezet = persoonlijk account van die gebruiker.
64
- * De enige eigendom-as op dit niveau — zie de moduledoc.
59
+ * Absent/`null` = org-wide shared account. Set = personal account of that user. The only
60
+ * ownership axis at this level — see the module doc.
65
61
  */
66
62
  userId?: string;
67
63
  providerId: string;
68
- /** "oauth2" | "imap" | "sip" | "webhook" | "apikey" | provider-eigen string */
64
+ /** "oauth2" | "imap" | "sip" | "webhook" | "apikey" | a provider's own string */
69
65
  protocol: string;
70
66
  displayName: string;
71
67
  status: ManagedAccountStatus;
72
68
  auth: AuthState;
73
- /** Provider-specifieke metadata (tenantId, externalUserId, scope-flags). */
69
+ /** Provider-specific metadata (tenantId, externalUserId, scope flags). */
74
70
  metadata: Record<string, unknown>;
75
71
  createdAt?: number;
76
72
  updatedAt?: number;
77
73
  }
78
74
  /**
79
- * Public-view zonder tokens — wat `account/list` en `account/get` aan UI/comm-server
80
- * retourneren. `auth` is gestript tot alleen het type.
75
+ * Public view without tokens — what `account/list` and `account/get` return to the UI and
76
+ * comm-server. `auth` is stripped down to its type.
81
77
  *
82
- * **Leesasymmetrie, en dit is de valkuil:** de publieke `account/list` filtert op de
83
- * *huidige* gebruiker, dus een job of cron (die geen sessie heeft) ziet daar niets — ook
84
- * geen org-brede rijen. Server-side code die accounts moet zien gebruikt altijd de
85
- * `account-internal/`-route (`listManagedAccountsInternal` / `getManagedAccountInternal`).
78
+ * **Read asymmetry, and this is the trap:** the public `account/list` filters on the *current*
79
+ * user, so a job or cron (which has no session) sees nothing there — not even org-wide rows.
80
+ * Server-side code that needs to see accounts always uses the `account-internal/` route
81
+ * (`listManagedAccountsInternal` / `getManagedAccountInternal`).
86
82
  */
87
83
  export type ManagedAccountPublic = Omit<ManagedAccount, "auth"> & {
88
84
  authType: AuthState["type"];
@@ -105,20 +105,20 @@ export interface AiToolResult {
105
105
  sources?: ToolSource[];
106
106
  }
107
107
  /**
108
- * Stabiele sleutel voor "dit heb ik al laten zien".
108
+ * Stable key for "I have already shown this".
109
109
  *
110
- * De volgorde `id` → `url` → `title` is aflopend in betrouwbaarheid: een id is stabiel, een
111
- * url meestal, een titel alleen bij gebrek aan beide. Dat laatste is bewust geen fout — een
112
- * geheugen-item heeft geen pagina en soms geen id, en dan is de titel de enige identiteit die
113
- * het heeft. Een sleutel is nooit leeg, want dan zou hetzelfde item elke ronde terugkomen.
110
+ * The order `id` → `url` → `title` descends in reliability: an id is stable, a url usually, a title
111
+ * only for lack of both. That last one is deliberately not an error — a memory item has no page and
112
+ * sometimes no id, and then the title is the only identity it has. A key is never empty, because
113
+ * then the same item would come back every round.
114
114
  */
115
115
  export declare function sourceKey(source: ToolSource): string;
116
116
  /**
117
- * Wat hiervan nieuw is, met de sleutels erbij.
117
+ * Which of these are new, with their keys.
118
118
  *
119
- * Voor een oppervlak dat zichzelf ongevraagd bijwerkt (live meelezen) is dit het verschil
120
- * tussen "drie kaarten" en "dezelfde drie kaarten, elke acht seconden opnieuw". Ontdubbelt
121
- * ook binnen de lading zelf: twee banen kunnen hetzelfde artikel aandragen.
119
+ * For a surface that updates itself unasked (live assist) this is the difference between "three
120
+ * cards" and "the same three cards, every eight seconds again". Deduplicates within the payload
121
+ * itself too: two lanes can surface the same article.
122
122
  */
123
123
  export declare function freshSources(sources: readonly ToolSource[], alreadyShown?: readonly string[]): {
124
124
  sources: ToolSource[];
@@ -127,83 +127,79 @@ export declare function freshSources(sources: readonly ToolSource[], alreadyShow
127
127
  /**
128
128
  * Returned by an app's `GET /provider/ai-tools/describe`.
129
129
  *
130
- * Beide extra velden zijn optioneel en additief: een tool die ze niet zet gedraagt
131
- * zich exact als voorheen. Ze bestaan zodat generieke lagen (de suggest-gate, de
132
- * scope-gate in `registerAiToolProvider`) een tool kunnen beoordelen **zonder hem
133
- * te kennen** — nu zit die kennis in `AIProfile.toolPolicy` met "onbekend = write".
130
+ * Both extra fields are optional and additive: a tool that does not set them behaves exactly as
131
+ * before. They exist so generic layers (the suggest gate, the scope gate in
132
+ * `registerAiToolProvider`) can judge a tool **without knowing it** — today that knowledge sits in
133
+ * `AIProfile.toolPolicy` with "unknown = write".
134
134
  */
135
135
  export interface AiToolDescriptor extends AiTool {
136
- /** Muteert deze tool iets? Bepaalt de suggest-gate. Afwezig = onbekend. */
136
+ /** Does this tool mutate anything? Drives the suggest gate. Absent = unknown. */
137
137
  access?: "read" | "write";
138
138
  /**
139
- * De resource waarop deze tool werkt, zodat een generieke gate hem kan
140
- * autoriseren: `{ param: "interactionId", kind: "interaction" }` betekent
141
- * "autoriseer `interaction:<args.interactionId>` voor de acting identity".
139
+ * The resource this tool works on, so a generic gate can authorize it:
140
+ * `{ param: "interactionId", kind: "interaction" }` means "authorize
141
+ * `interaction:<args.interactionId>` for the acting identity".
142
142
  */
143
143
  scope?: {
144
144
  param: string;
145
145
  kind: string;
146
146
  };
147
147
  /**
148
- * `"interactive"` = deze tool heeft een kijkende gebruiker nodig, omdat hij aflevert
149
- * op een client-oppervlak (bijvoorbeeld een SSE naar een geopend venster) in plaats
150
- * van iets te persisteren. Onbemande runs krijgen zulke tools niet aangeboden:
151
- * anders rapporteert het model succes voor iets dat nergens landt. Afwezig = werkt
152
- * overal.
148
+ * `"interactive"` = this tool needs a watching user, because it delivers to a client surface (an
149
+ * SSE to an open window, say) instead of persisting something. Unattended runs are not offered
150
+ * such tools: otherwise the model reports success for something that lands nowhere. Absent =
151
+ * works everywhere.
153
152
  */
154
153
  surface?: "interactive";
155
154
  /**
156
- * Reikt deze tool naar **buiten** de organisatie, of blijft het intern?
155
+ * Does this tool reach **outside** the organisation, or stay internal?
157
156
  *
158
- * `"outward"` = er gaat iets de deur uit of er verschijnt iets bij een derde: een mail
159
- * versturen, een ticket aanmaken, in Slack posten. Twee autonome playbooks die dat
160
- * tegelijk op hetzelfde gesprek doen leveren dubbele berichten aan een klant, en dáár
161
- * hoort een mens tussen te staan.
157
+ * `"outward"` = something leaves the building or appears at a third party: sending a mail,
158
+ * creating a ticket, posting in Slack. Two autonomous playbooks doing that at once on the same
159
+ * conversation deliver duplicate messages to a customer, and a human belongs in between.
162
160
  *
163
- * `"internal"` = het resultaat blijft binnen het platform: een attribuut, een
164
- * geheugen-item, een notitie. Twee playbooks die dat tegelijk doen zitten elkaar niet in
165
- * de weg — verschillende rijen, en de concurrency wordt al door de store afgehandeld.
161
+ * `"internal"` = the result stays inside the platform: an attribute, a memory item, a note. Two
162
+ * playbooks doing that at once do not get in each other's way — different rows, and the store
163
+ * already handles the concurrency.
166
164
  *
167
- * **Afwezig betekent `"outward"`.** Bewust de voorzichtige kant: een tool die niets
168
- * declareert hoort niet stilzwijgend als onschuldig te gelden. Zie
169
- * `shouldDemoteAuto` in de playbook-engine, dat hierop de suggest-degradatie bepaalt.
165
+ * **Absent means `"outward"`.** Deliberately the careful side: a tool that declares nothing
166
+ * should not silently count as harmless. See `shouldDemoteAuto` in the playbook engine, which
167
+ * decides the suggest downgrade on this.
170
168
  */
171
169
  effect?: "internal" | "outward";
172
170
  }
173
171
  /**
174
- * Body van `POST /provider/ai-tools/invoke`. Vervangt vijf inline structurele
175
- * types (de beller in de ai-app plus de vier ontvangende apps).
172
+ * Body of `POST /provider/ai-tools/invoke`. Replaces five inline structural types (the caller in
173
+ * the ai app plus the four receiving apps).
176
174
  *
177
- * De acting identity zit hier **niet** in: die reist als header mee
178
- * (`ACTING_IDENTITY_HEADER` in `@opencxh/platform-api`). Gemeten in fase 0 dat dat
179
- * werkt vanuit een request, een job én een subscriber — dus geen tweede kanaal.
175
+ * The acting identity is **not** in here: it travels as a header (`ACTING_IDENTITY_HEADER` in
176
+ * `@opencxh/platform-api`). Phase 0 measured that this works from a request, a job and a
177
+ * subscriber — so no second channel.
180
178
  */
181
179
  export interface AiToolInvokeRequest {
182
180
  tool: string;
183
181
  arguments?: Record<string, unknown>;
184
182
  /**
185
- * Wat er in déze beurt al gebeurd is, voor een tool die niet alleen zijn eigen
186
- * argumenten nodig heeft maar ook de context waarin hij wordt aangeroepen.
183
+ * What already happened in *this* turn, for a tool that needs not only its own arguments but
184
+ * also the context it is called in.
187
185
  *
188
- * Optioneel en additief, net als de extra velden op {@link AiToolDescriptor}:
189
- * een tool die dit negeert gedraagt zich exact als voorheen.
186
+ * Optional and additive, like the extra fields on {@link AiToolDescriptor}: a tool ignoring this
187
+ * behaves exactly as before.
190
188
  *
191
- * De aanleiding is bronvermelding die klopt. De runner verzamelt al de
192
- * {@link ToolSource}s van álle tools in een beurt, maar het invoke-contract
193
- * droeg alleen `{tool, arguments}` — dus een tool die iets *bewaart* (een
194
- * artefact, een geheugen-item) kon niet vastleggen waar het uit is opgebouwd.
195
- * Het model ernaar laten raden levert verzonnen bronvermelding op, precies wat
196
- * `ToolSource` moest voorkomen.
189
+ * The reason is provenance that holds up. The runner already collects the {@link ToolSource}s of
190
+ * *all* tools in a turn, but the invoke contract carried only `{tool, arguments}` — so a tool
191
+ * that *stores* something (an artifact, a memory item) could not record what it was built from.
192
+ * Letting the model guess yields invented provenance, exactly what `ToolSource` had to prevent.
197
193
  */
198
194
  turn?: AiToolTurnContext;
199
195
  }
200
- /** Zie {@link AiToolInvokeRequest.turn}. */
196
+ /** See {@link AiToolInvokeRequest.turn}. */
201
197
  export interface AiToolTurnContext {
202
- /** Het gesprek waarin deze beurt loopt, als er een is. */
198
+ /** The conversation this turn runs in, when there is one. */
203
199
  conversationId?: string;
204
200
  /**
205
- * Wat er tot nu toe in deze beurt is geraadpleegd, ontdubbeld. Bevat **niet**
206
- * de resultaten van deze call zelf — die bestaan nog niet.
201
+ * What has been consulted so far in this turn, deduplicated. Does **not** include the results of
202
+ * this call itself — those do not exist yet.
207
203
  */
208
204
  sources?: ToolSource[];
209
205
  }
@@ -9,18 +9,17 @@ export interface InvokeOptions {
9
9
  headers?: Record<string, string>;
10
10
  manifest?: AppManifest;
11
11
  /**
12
- * Laat de aanroep **afwijzen** wanneer de server een fout teruggeeft, in plaats van te
13
- * slagen met een leeg `data`.
12
+ * Make the call **reject** when the server returns an error, instead of succeeding with an empty
13
+ * `data`.
14
14
  *
15
- * Zonder dit lost `invoke` altijd op: `sendViaHttp` keek niet naar `response.ok` en de
16
- * ws-kant kende geen reject-pad. Een geweigerde mutatie kwam daardoor binnen als
17
- * `data: undefined`, de entity-store liet die stil vallen, en de `next`-tak van de
18
- * mutatie liep gewoon door — de composer maakte zichzelf leeg en de gebruiker dacht dat
19
- * het bericht verstuurd was. Elke `error:`-handler in de app was daarmee dode code.
15
+ * Without this, `invoke` always resolved: `sendViaHttp` did not look at `response.ok` and the ws
16
+ * side had no reject path. A refused mutation therefore arrived as `data: undefined`, the entity
17
+ * store dropped it silently, and the mutation's `next` branch ran anyway — the composer cleared
18
+ * itself and the user thought the message had been sent. Every `error:` handler in the app was
19
+ * dead code.
20
20
  *
21
- * **Dit staat sinds 2026-08-20 aan als default.** Zet hem op `false` om één aanroep
22
- * bewust stil te houden — dat is dan een keuze die in de code staat, niet de
23
- * standaardstand waar iedereen in loopt.
21
+ * **On by default.** Set it to `false` to deliberately keep one call quiet — then it is a choice
22
+ * that stands in the code, not the default state everyone walks into.
24
23
  */
25
24
  throwOnError?: boolean;
26
25
  }
@@ -1,14 +1,12 @@
1
1
  /**
2
- * Wie een mutatie heeft uitgevoerd — voor attributie op de timeline en in
3
- * analytics. Server-side afgeleid uit de request (zie `resolveAuthor` in
4
- * `@opencxh/platform-api`). De shape sluit aan op `BaseActivity.author`, zodat
5
- * een author direct als activity-author kan worden weggeschreven.
2
+ * Who performed a mutation — for attribution on the timeline and in analytics. Derived server-side
3
+ * from the request (see `resolveAuthor` in `@opencxh/platform-api`). The shape lines up with
4
+ * `BaseActivity.author`, so an author can be written straight as an activity author.
6
5
  *
7
- * - `user` — ingelogde gebruiker; `id` is de user-id (analytics-attributie).
8
- * - `app` — een provider/integratie-app (bv. een playbook dat als de `ai`-app
9
- * muteert); `id` is de app-naam. De timeline toont dan de app
10
- * i.p.v. een anonieme "System".
11
- * - `system` — geen geïdentificeerde actor (cron, achtergrondjob).
6
+ * - `user` — a logged-in user; `id` is the user id (analytics attribution).
7
+ * - `app` — a provider/integration app (a playbook mutating as the `ai` app, say); `id` is the
8
+ * app name. The timeline then shows the app instead of an anonymous "System".
9
+ * - `system` — no identified actor (cron, background job).
12
10
  */
13
11
  export type MutationAuthor = {
14
12
  type: "user";
@@ -40,9 +40,9 @@ export declare function resolveChannelIntents(channel: Channel, description: Pro
40
40
  */
41
41
  export declare function resolveAccountCapabilities(description: ProviderDescription, accountCaps: Record<string, boolean> | undefined): Record<string, boolean>;
42
42
  /**
43
- * Lijst van intent-namen die UIT staan voor dit account. Mapt 1-op-1 naar
44
- * `Channel.disabledIntents`. Niet-togglable intents komen nooit op de lijst —
45
- * die kan provider hardcode'n via eigen channel-kind constraint.
43
+ * List of intent names that are OFF for this account. Maps one-to-one onto
44
+ * `Channel.disabledIntents`. Non-togglable intents never make the list — a provider can hardcode
45
+ * those through its own channel-kind constraint.
46
46
  */
47
47
  export declare function disabledIntentsFromCapabilities(description: ProviderDescription, accountCaps: Record<string, boolean> | undefined): string[];
48
48
  /**