@alvera-ai/platform-sdk 0.10.0-rc.23 → 0.10.0-rc.25

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 (45) hide show
  1. package/.agent/AGENTS.md +67 -8
  2. package/.agent/account_management.md +5 -4
  3. package/.agent/action_status_updaters.md +7 -5
  4. package/.agent/ai_agents.md +28 -24
  5. package/.agent/async.md +9 -8
  6. package/.agent/connected_apps.md +13 -12
  7. package/.agent/cookbook/_fixtures/README.md +12 -5
  8. package/.agent/cookbook/_fixtures/accounts_receivable/stripe_customers_batch1.csv +5 -0
  9. package/.agent/cookbook/_fixtures/healthcare/memorandum-of-association-01.png +0 -0
  10. package/.agent/cookbook/_fixtures/healthcare/sample_two_page.pdf +43 -0
  11. package/.agent/cookbook/action-status-updaters.md +212 -0
  12. package/.agent/cookbook/ai-agent-invoke.md +243 -0
  13. package/.agent/cookbook/appointment-review-sms-workflow.md +2 -2
  14. package/.agent/cookbook/birthday-greeting-sms-trigger.md +1 -1
  15. package/.agent/cookbook/bulk-ingest.md +254 -0
  16. package/.agent/cookbook/contact-us-triage-with-llm.md +36 -16
  17. package/.agent/cookbook/custom-tables.md +201 -0
  18. package/.agent/cookbook/dunning-sms-for-delinquent.md +2 -2
  19. package/.agent/cookbook/invite-team.md +194 -0
  20. package/.agent/cookbook/kyc-notification-on-account-activation.md +2 -2
  21. package/.agent/cookbook/rest-fetch.md +246 -0
  22. package/.agent/cookbook/sanctions-screening-with-agent-review.md +36 -14
  23. package/.agent/cookbook/score-leads-with-llm-categorization.md +36 -14
  24. package/.agent/cookbook/system-templates.md +129 -0
  25. package/.agent/cookbook/triage-prospects-by-priority.md +533 -0
  26. package/.agent/cookbook/welcome-sms-for-customers.md +2 -2
  27. package/.agent/data_activation_clients.md +29 -27
  28. package/.agent/data_sources.md +6 -5
  29. package/.agent/datalakes.md +23 -21
  30. package/.agent/errors.md +10 -16
  31. package/.agent/generic_tables.md +7 -7
  32. package/.agent/interoperability_contracts.md +18 -17
  33. package/.agent/mutations.md +74 -100
  34. package/.agent/tool-call-configs.md +2 -2
  35. package/.agent/tools.md +19 -18
  36. package/.agent/type_naming.md +6 -8
  37. package/.agent/workflows.md +21 -20
  38. package/README.md +151 -19
  39. package/dist/bin/platform-sdk.mjs +2 -2
  40. package/dist/bin/platform-sdk.mjs.map +1 -1
  41. package/dist/index.d.mts +33 -26
  42. package/dist/index.d.mts.map +1 -1
  43. package/dist/index.mjs +27 -21
  44. package/dist/index.mjs.map +1 -1
  45. package/package.json +1 -1
package/.agent/AGENTS.md CHANGED
@@ -135,6 +135,26 @@ rather than the singleton `createPlatformApi`. The singleton
135
135
  mutates a shared client; the most-recent construction call
136
136
  clobbers earlier instances' auth.
137
137
 
138
+ ## Using this corpus: building an app vs. writing a test
139
+
140
+ The `api.*` call sequences in this corpus are framework-agnostic — the
141
+ **same** code powers all of these:
142
+
143
+ - **A React / CopilotKit app** — call `api.workflows.create(...)`,
144
+ `api.dataActivationClients.ingest(...)`, etc. from an event handler, a
145
+ server action, or a CopilotKit action; render the typed response.
146
+ - **A backend / Bun / Node script** — drive the client straight through.
147
+ - **A vitest / integration test** — thread the same calls through a test
148
+ closure, asserting on each typed response.
149
+
150
+ What changes between them is only *where you put the calls* (a component
151
+ handler vs. a test body), never the calls themselves. The cookbooks under
152
+ `cookbook/` read as test-style sequences because that is how they are
153
+ validated, but every step is a plain `api.*` call you can lift into an app
154
+ unchanged. The per-capability docs (e.g. `bulk-ingest.md`, `ai-agent-invoke.md`)
155
+ show one capability at a time; the cookbooks weave capabilities into a
156
+ business outcome.
157
+
138
158
  ## Resources
139
159
 
140
160
  ```
@@ -326,15 +346,27 @@ repo's own integration tests use.
326
346
  template plus the cookbooks that depend on it. No need to
327
347
  read cookbook code first to know what fixtures exist.
328
348
 
349
+ ### Two kinds of doc here: business cookbooks vs. capability docs
350
+
351
+ The `cookbook/` directory holds two kinds of recipe, both validated by
352
+ `make validate-cookbook`:
353
+
354
+ - **Business cookbooks** (`<use-case>.md`) — one real business outcome each,
355
+ told as a numbered API-call sequence (e.g. `welcome-sms-for-customers`,
356
+ `dunning-sms-for-delinquent`). Read these to see how resources compose into
357
+ an outcome.
358
+ - **Capability docs** (`<capability>.md`) — one platform capability each,
359
+ shown as the minimal call sequence that proves it (e.g. `bulk-ingest`,
360
+ `ai-agent-invoke`, `custom-tables`, `invite-team`). Read these to learn one
361
+ capability in isolation; cookbooks weave them into outcomes.
362
+
329
363
  ### Available cookbooks
330
364
 
331
- The eight cookbook scenarios shipped at v0.10. Each is anchored
332
- to a green end-to-end vitest scenario in the platform's
333
- integration-tests suite and is verified at dev time by
334
- `make validate-cookbook` at the platform-sdk repo root (not a
335
- CLI verb). The entries between the managed markers below are
336
- what Milestone 12's `alvera-sdk-init` lifts into consumer
337
- `<cwd>/AGENTS.md` files as a managed block.
365
+ The nine business-cookbook scenarios. Each is anchored to a green
366
+ end-to-end vitest scenario in the platform's integration-tests suite and is
367
+ verified at dev time by `make validate-cookbook` at the platform-sdk repo root.
368
+ The entries between the managed markers below are what `alvera-sdk-init` lifts
369
+ into consumer `<cwd>/AGENTS.md` files as a managed block.
338
370
 
339
371
  <!-- BEGIN:cookbook-index -->
340
372
 
@@ -357,6 +389,10 @@ what Milestone 12's `alvera-sdk-init` lifts into consumer
357
389
  — Send a payment-reminder SMS to delinquent customers
358
390
  (filtered on phone-on-file and tax-id-verified) with a
359
391
  pay-invoice link.
392
+ - [triage-prospects-by-priority](./cookbook/triage-prospects-by-priority.md)
393
+ — Triage inbound AR customers into priority bands
394
+ (high / medium / low) via an LLM agent, route each band to a
395
+ tailored SMS action.
360
396
 
361
397
  **Payment Risk**
362
398
 
@@ -380,6 +416,29 @@ what Milestone 12's `alvera-sdk-init` lifts into consumer
380
416
 
381
417
  <!-- END:cookbook-index -->
382
418
 
419
+ ### Capability docs
420
+
421
+ One platform capability each — the minimal call sequence that proves it,
422
+ anchored to a green vitest scenario. Read the matching reference MD for the
423
+ full wire shape.
424
+
425
+ - [bulk-ingest](./cookbook/bulk-ingest.md) — load a whole file of records in
426
+ one upload (presigned link → PUT → `ingestFile` → search by batch).
427
+ - [rest-fetch](./cookbook/rest-fetch.md) — pull records from a third-party REST
428
+ API on demand (Bearer + OAuth2), no file upload.
429
+ - [ai-agent-invoke](./cookbook/ai-agent-invoke.md) — read an uploaded
430
+ document/image and pull structured JSON out of it (`aiAgents.invoke` with
431
+ files). The correct file-vision path — the agent reads the file; the DAC
432
+ ingests it.
433
+ - [custom-tables](./cookbook/custom-tables.md) — stand up a custom table the
434
+ built-in datasets don't model; deploy → ingest → search.
435
+ - [action-status-updaters](./cookbook/action-status-updaters.md) — reconcile
436
+ the delivery status of messages you send, on a schedule.
437
+ - [system-templates](./cookbook/system-templates.md) — discover the platform's
438
+ built-in row-mapping Liquid templates.
439
+ - [invite-team](./cookbook/invite-team.md) — invite a teammate into your tenant
440
+ (root / tenantless / tenant-scoped sessions in one flow).
441
+
383
442
  ## Utility namespaces
384
443
 
385
444
  Cross-resource utilities not documented in this corpus:
@@ -407,7 +466,7 @@ of restating:
407
466
  | Topic | File |
408
467
  |-----------------------------------------------|------------------|
409
468
  | Error envelope shape | `errors.md` |
410
- | Mutations (PUT and limited exceptions) | `mutations.md` |
469
+ | Mutations (`update()` replaces whole; exceptions) | `mutations.md` |
411
470
  | Async + readiness | `async.md` |
412
471
  | Debugging (HTTP interceptor + safe redaction) | `debugging.md` |
413
472
  | Type naming + server-derived fields | `type_naming.md` |
@@ -293,7 +293,7 @@ carry through unchanged.
293
293
  The Invitation/Membership schema (Vocabulary A) is the
294
294
  coarse-grained role assignment surfaced at invite time. The
295
295
  Role-record system (Vocabulary B) is the fine-grained policy
296
- entity that drives Postgres RLS and permission checks at every
296
+ entity that drives row-level access and permission checks at every
297
297
  request. They co-exist because the invitation captures the
298
298
  caller's intent ("admin-tier user"), while the role record
299
299
  captures the platform's enforcement vocabulary
@@ -307,9 +307,10 @@ sessions appear in console-mediated flows and are uncommon in
307
307
  SDK-consumer code.
308
308
 
309
309
  Reserved roles (`platform_admin`, `system`, `system_api`,
310
- `bot_*`) bypass tenant-based RLS and are created only via DB
311
- migrations — they never appear on consumer-minted sessions or
312
- invitations and are out of scope for SDK consumers.
310
+ `bot_*`) bypass tenant-based access isolation and are
311
+ provisioned only by the platform itself — they never appear on
312
+ consumer-minted sessions or invitations and are out of scope
313
+ for SDK consumers.
313
314
 
314
315
  ### Inviting humans into a tenant
315
316
 
@@ -15,7 +15,7 @@ SDK namespace: `api.actionStatusUpdaters`.
15
15
 
16
16
  Action status updaters are **Datalake-DB-resident** — the
17
17
  parent datalake must be `status: 'ready'` and every
18
- referenced tool must exist before POST.
18
+ referenced tool must exist before you `create()`.
19
19
 
20
20
  ## 1. Wire shape
21
21
 
@@ -213,13 +213,15 @@ branch.
213
213
 
214
214
  ### Update
215
215
 
216
- `PUT` replays the full body. The polymorphic `updater_body`
217
- must keep the same `updater_body_type` on update — changing
218
- the discriminator requires delete + recreate.
216
+ `update()` replaces the whole resource — resupply the full
217
+ body; there's no partial update. The polymorphic `updater_body`
218
+ must keep the same `updater_body_type` on update — the
219
+ discriminator can't change on `update()`; to change body type,
220
+ `delete()` and `create()` fresh.
219
221
 
220
222
  ### Delete
221
223
 
222
- `DELETE` removes the row and cancels future scheduled polls.
224
+ `delete()` removes the row and cancels future scheduled polls.
223
225
  In-flight polls complete; their writebacks land normally.
224
226
 
225
227
  The delete is **graceful** with respect to scheduler state: if
@@ -11,7 +11,7 @@ SDK namespace: `api.aiAgents`.
11
11
 
12
12
  AI agents are **Datalake-DB-resident** — the parent datalake
13
13
  must be `status: 'ready'` and the bound tool must exist before
14
- POST.
14
+ you `create()`.
15
15
 
16
16
  ## 1. Wire shape
17
17
 
@@ -188,9 +188,9 @@ namespace clean.
188
188
 
189
189
  An agent runs as an **enrichment** step on a workflow or an
190
190
  interoperability contract. The agent is **nested directly on the
191
- parent body** — `agentic-workflows` and `interoperability-contracts`
192
- create/PUT bodies accept a `workflow_ai_agents` /
193
- `interoperability_contract_ai_agents` array (a `cast_assoc`). There is
191
+ parent body** — workflow and interoperability-contract
192
+ create/update bodies accept a `workflow_ai_agents` /
193
+ `interoperability_contract_ai_agents` array. There is
194
194
  no separate attach/detach endpoint, and **no per-join checksum**: the
195
195
  nested agents fold into the parent's own checksum.
196
196
 
@@ -225,24 +225,26 @@ workflow.checksum // the PARENT checksum — the nested agents fold into it
225
225
  ```
226
226
 
227
227
  Interoperability contracts nest the same way, via the
228
- `interoperability_contract_ai_agents` array on the contract create/PUT
229
- body. The one difference: a contract join's `context_mapping_config`
230
- **does** carry `output_schema` (the server does not pin it there).
228
+ `interoperability_contract_ai_agents` array on the contract
229
+ create/update body. The one difference: a contract join's
230
+ `context_mapping_config` **does** carry `output_schema` (the server
231
+ does not pin it there).
231
232
 
232
- Adding, repositioning, and removing agents are all expressed as a
233
- **full-set PUT** on the parent (`on_replace: :delete`):
233
+ Adding, repositioning, and removing agents are all expressed by
234
+ re-supplying the full set on the parent's `update()` — `update()`
235
+ replaces the whole array, and any item you omit is removed:
234
236
 
235
237
  | Operation | How | Result |
236
238
  |------------|------------------------------------------------------|--------|
237
- | add / nest | include in `*_ai_agents` on create or PUT | parent checksum reflects the agents |
238
- | reposition | PUT with the same agent at a new `position` | full-set replace |
239
- | detach | PUT omitting that agent (or `[]` to clear all) | `on_replace: :delete` removes it |
239
+ | add / nest | include in `*_ai_agents` on create or update | parent checksum reflects the agents |
240
+ | reposition | `update()` with the same agent at a new `position` | full-set replace |
241
+ | detach | `update()` omitting that agent (or `[]` to clear all)| the omitted agent is removed |
240
242
  | drift | parent `checksum()` endpoint over the full body | the would-be parent checksum (no persist) |
241
243
 
242
- The parent surfaces its nested agents on GET: a workflow GET returns
243
- `workflow_ai_agents: [...]` and a contract GET returns
244
+ The parent surfaces its nested agents on read: a workflow `get()`
245
+ returns `workflow_ai_agents: [...]` and a contract `get()` returns
244
246
  `interoperability_contract_ai_agents: [...]`. Both arrays are writable
245
- on the parent body (create + PUT).
247
+ on the parent body (create + update).
246
248
 
247
249
  The workflow's own `decision_config` reads the agent's parsed output
248
250
  at `additional_context.<agent_slug>.<field>` (property paths match the
@@ -344,14 +346,15 @@ templates).
344
346
 
345
347
  ### Update
346
348
 
347
- `PUT` replays the full body — no PATCH. Replace-on-PUT means
348
- all required fields must be re-supplied verbatim, including
349
+ `update()` replaces the whole resource — resupply the full
350
+ body; there's no partial update. That means all required
351
+ fields must be re-supplied verbatim, including
349
352
  `input_schema`, `llm_response_schema`, and `prompt_config`.
350
353
  Omitting any returns a 422.
351
354
 
352
355
  ### Delete
353
356
 
354
- `DELETE` removes the row. Workflows that still reference the
357
+ `delete()` removes the row. Workflows that still reference the
355
358
  agent in their `ai_agents` array fail at run time with
356
359
  `error_code: 'ai_agent_not_found'`; clean up workflow
357
360
  references first.
@@ -436,13 +439,14 @@ with `{ status: 'skipped' }` and no per-agent entries.
436
439
  workflow decision and action templates reference. Capture it
437
440
  from the create response — don't pre-compute.
438
441
 
439
- 4. **`.get` takes UUID `id`, not slug.** The SHOW route is
440
- `/ai-agents/:id`. The slug is only a runtime template key.
442
+ 4. **`.get` takes UUID `id`, not slug.** The single-row read
443
+ route is `/ai-agents/:id`. The slug is only a runtime template key.
441
444
 
442
- 5. **Replace-on-PUT.** Update bodies must re-supply
443
- `input_schema`, `llm_response_schema`, `prompt_config`
444
- verbatim. Partial PUT silently drops fields and returns
445
- 422 on the missing required field.
445
+ 5. **`update()` replaces the whole resource.** Update bodies
446
+ must re-supply `input_schema`, `llm_response_schema`,
447
+ `prompt_config` verbatim — there's no partial update. A
448
+ partial body silently drops fields and returns 422 on the
449
+ missing required field.
446
450
 
447
451
  6. **`data_access` is immutable post-create.** Flipping the
448
452
  compliance tier requires delete + recreate.
package/.agent/async.md CHANGED
@@ -70,7 +70,7 @@ the table above, its MD is authoritative.
70
70
 
71
71
  Downstream operations (creating child resources, running
72
72
  workflows, invoking tools) MUST NOT proceed until the parent
73
- resource is in a terminal-success status. Posting a child
73
+ resource is in a terminal-success status. Creating a child
74
74
  resource against an unready parent typically surfaces as a
75
75
  500 (server-internal) or a 422 with a "parent not ready"
76
76
  detail — both are recoverable but indicate a missing wait in
@@ -78,11 +78,12 @@ the caller.
78
78
 
79
79
  ## Idempotency on create
80
80
 
81
- POST creates are NOT idempotent by default. Repeating a POST
82
- with the same body yields a 422 on uniqueness fields (typically
83
- the name within scope). Consumers handling retry should:
81
+ `create()` calls are NOT idempotent by default. Repeating a
82
+ `create()` with the same body yields a 422 on uniqueness fields
83
+ (typically the name within scope). Consumers handling retry
84
+ should:
84
85
 
85
- 1. Catch the post-HTTP throw (see `errors.md`).
86
+ 1. Catch the thrown error after the call returns (see `errors.md`).
86
87
  2. Inspect for a uniqueness `detail` on a `source.pointer`
87
88
  that names the uniqueness key (usually `/name` or `/slug`).
88
89
  3. Treat as "already created" and fetch the existing row.
@@ -94,8 +95,8 @@ to the server but failed to capture the response locally).
94
95
 
95
96
  ## Polling cost
96
97
 
97
- Polling at 1s intervals against the platform's
98
- `/<resource>/:slug` endpoint is cheap for most resources but
98
+ Polling at 1s intervals via `get()` on the resource is cheap
99
+ for most resources but
99
100
  becomes expensive at high concurrency. For long-running
100
101
  operations (lambda deployments, large data-activation-client
101
102
  runs), back off the interval (e.g. 2s → 5s → 10s) after the
@@ -103,7 +104,7 @@ first ~30s of waiting.
103
104
 
104
105
  ## What the SDK does NOT auto-poll
105
106
 
106
- The typed client returns the immediate POST response — it
107
+ The typed client returns the immediate `create()` response — it
107
108
  does NOT block until the resource reaches terminal status.
108
109
  Consumers explicitly write the wait loop above where it
109
110
  matters. This is intentional: not every caller wants to
@@ -28,7 +28,7 @@ The namespace splits into **two roles**:
28
28
  `slug` as the path key.
29
29
 
30
30
  Connected apps are **Datalake-DB-resident** — the parent datalake
31
- must be `status: 'ready'` before POST.
31
+ must be `status: 'ready'` before you `create()`.
32
32
 
33
33
  ## 1. Wire shape
34
34
 
@@ -241,9 +241,9 @@ const { data: ack } = await api.connectedApps.syncRoutes(
241
241
 
242
242
  This is the explicit "re-fetch and save" verb — asynchronous. The
243
243
  202 acknowledgement proves the app id resolved and a sync job was
244
- accepted; the worker then refreshes `routes` + `last_synced_at` and
245
- lands `status: 'synced'` (or `'error'`) on the app row. Poll
246
- `.get()` for the outcome. Use it after deploying a new manifest,
244
+ accepted; the platform then refreshes `routes` + `last_synced_at` and
245
+ lands `status: 'synced'` (or `'error'`) on the app row asynchronously.
246
+ Poll `.get()` for the outcome. Use it after deploying a new manifest,
247
247
  fixing a primary URL outage, or recovering from `status: 'error'`.
248
248
 
249
249
  Discovery failure modes the platform handles explicitly — each
@@ -270,13 +270,14 @@ and `https://app.example.com/` produce the same fetch URL.
270
270
 
271
271
  ### Update
272
272
 
273
- `PUT` replays the full body. Mutating the primary URL does NOT
274
- auto-trigger a route sync — call `.syncRoutes` after the update if
275
- the new primary URL serves a different manifest.
273
+ `update()` replaces the whole resource — resupply the full
274
+ body; there's no partial update. Mutating the primary URL does
275
+ NOT auto-trigger a route sync — call `.syncRoutes` after the
276
+ update if the new primary URL serves a different manifest.
276
277
 
277
278
  ### Delete
278
279
 
279
- `DELETE` removes the connected app AND the auto-provisioned API
280
+ `delete()` removes the connected app AND the auto-provisioned API
280
281
  key. Workflows that still reference the app's id in action
281
282
  `connected_app_id` fields fail at run time with the action's
282
283
  template-render step erroring on the missing relation. Detach
@@ -285,11 +286,11 @@ workflow actions first.
285
286
  Delete latency depends on the app's `mode`:
286
287
 
287
288
  - `mode: 'self_hosted'` — synchronous. The row is gone when
288
- the DELETE response returns.
289
- - `mode: 'managed'` — async. The DELETE response returns
289
+ the `delete()` call returns.
290
+ - `mode: 'managed'` — async. The `delete()` response returns
290
291
  immediately, but the actual teardown (Cloudflare Pages
291
- project deletion + DNS unregistration) runs in a background
292
- worker. The row's `status` transitions through
292
+ project deletion + DNS unregistration) runs in the background.
293
+ The row's `status` transitions through
293
294
  `'deploying'` (during teardown) before disappearing. Poll
294
295
  `.get()` until 404 to confirm removal.
295
296
 
@@ -1,12 +1,16 @@
1
1
  # Cookbook fixtures
2
2
 
3
- Vendored Liquid templates and CSV fixtures the
4
- [cookbook recipes](../) load at runtime via
3
+ Vendored Liquid templates, CSV bodies, and sample documents the
4
+ [cookbook recipes](../) and [capability docs](../) load at runtime via
5
5
  `fs.readFileSync`. Organized by industry so the corpus stays
6
6
  self-describing — an agent crawling this directory can list
7
- every template available to every cookbook in a given industry
7
+ every fixture available to every recipe in a given industry
8
8
  by reading one path.
9
9
 
10
+ Two kinds of fixture live here: **Liquid templates** (row-mapping
11
+ templates an interoperability contract loads) and **data fixtures**
12
+ (CSV bodies and sample PDFs/images a capability walk uploads or ingests).
13
+
10
14
  ## Convention
11
15
 
12
16
  Cookbook code reads fixtures via the
@@ -77,6 +81,8 @@ passes against the new template shape.
77
81
  | `_cahps_appointments_healthcare_patient.liquid` | `appointment-review-sms-workflow` | `priv/liquid_templates/data_activation/interoperability/healthcare/fhir4/athena/_cahps_appointments_healthcare_patient.liquid` |
78
82
  | `_cahps_appointments_healthcare_appointment.liquid` | `appointment-review-sms-workflow` | `priv/liquid_templates/data_activation/interoperability/healthcare/fhir4/athena/_cahps_appointments_healthcare_appointment.liquid` |
79
83
  | `_cahps_appointments_healthcare_mdm.liquid` | `appointment-review-sms-workflow` | `priv/liquid_templates/data_activation/interoperability/healthcare/fhir4/athena/_cahps_appointments_healthcare_mdm.liquid` |
84
+ | `sample_two_page.pdf` (data) | `ai-agent-invoke` | `integration-tests/tests/healthcare/fixtures/documents/sample_two_page.pdf` |
85
+ | `memorandum-of-association-01.png` (data) | `ai-agent-invoke` | `integration-tests/tests/healthcare/fixtures/documents/memorandum-of-association-01.png` |
80
86
 
81
87
  The `contact-us-triage-with-llm` cookbook ingests into a generic
82
88
  table via the auto-provisioned identity contract, so it loads no
@@ -86,8 +92,9 @@ vendored template.
86
92
 
87
93
  | File | Consumed by cookbook(s) | Source-of-truth |
88
94
  |---|---|---|
89
- | `_customers_accounts_receivable_customer.liquid` | `welcome-sms-for-customers`, `dunning-sms-for-delinquent` | `priv/liquid_templates/data_activation/interoperability/accounts_receivable/stripe/_customers_accounts_receivable_customer.liquid` |
90
- | `_customers_accounts_receivable_mdm.liquid` | `welcome-sms-for-customers`, `dunning-sms-for-delinquent` | `priv/liquid_templates/data_activation/interoperability/accounts_receivable/stripe/_customers_accounts_receivable_mdm.liquid` |
95
+ | `_customers_accounts_receivable_customer.liquid` | `welcome-sms-for-customers`, `dunning-sms-for-delinquent`, `bulk-ingest`, `rest-fetch` | `priv/liquid_templates/data_activation/interoperability/accounts_receivable/stripe/_customers_accounts_receivable_customer.liquid` |
96
+ | `_customers_accounts_receivable_mdm.liquid` | `welcome-sms-for-customers`, `dunning-sms-for-delinquent`, `bulk-ingest`, `rest-fetch` | `priv/liquid_templates/data_activation/interoperability/accounts_receivable/stripe/_customers_accounts_receivable_mdm.liquid` |
97
+ | `stripe_customers_batch1.csv` (data) | `bulk-ingest` | `integration-tests/tests/accounts_receivable/fixtures/csv/stripe_customers_batch1.csv` |
91
98
 
92
99
  ### `payment_risk/`
93
100
 
@@ -0,0 +1,5 @@
1
+ customer_number,customer_type,status,name,email,phone,tax_id,currency,delinquent,tax_exempt,preferred_locales,address_line1,address_line2,address_city,address_state,address_postal_code,address_country,shipping_name,shipping_phone,shipping_address_line1,shipping_address_line2,shipping_address_city,shipping_address_state,shipping_address_postal_code,shipping_address_country
2
+ CUS-10001,individual,contracted,James Whitfield,james.whitfield@gmail.com,+12025551001,123-45-6789,USD,false,none,en,742 Evergreen Terrace,,Springfield,IL,62704,US,James Whitfield,+12025551001,742 Evergreen Terrace,,Springfield,IL,62704,US
3
+ CUS-10002,individual,contracted,Maria Garcia,maria.garcia@outlook.com,+12025551002,,EUR,false,none,en|es,89 Elm Street,Apt 4B,Miami,FL,33101,US,Maria Garcia,+12025551002,89 Elm Street,Apt 4B,Miami,FL,33101,US
4
+ CUS-10003,enterprise,contracted,Pinnacle Financial Group,info@pinnaclefg.com,+12125559000,84-2156789,USD,false,exempt,en,1 Wall Street,Floor 42,New York,NY,10005,US,,,,,,,,,
5
+ CUS-10004,individual,prospect,Chen Wei,chen.wei@protonmail.com,+14155551004,,USD,false,none,en|zh,350 Mission Street,,San Francisco,CA,94105,US,,,,,,,,,
@@ -0,0 +1,43 @@
1
+ %PDF-1.4
2
+ 1 0 obj
3
+ << /Type /Catalog /Pages 2 0 R >>
4
+ endobj
5
+ 2 0 obj
6
+ << /Type /Pages /Kids [3 0 R 5 0 R] /Count 2 >>
7
+ endobj
8
+ 3 0 obj
9
+ << /Type /Page /Parent 2 0 R /MediaBox [0 0 300 200] /Resources << /Font << /F1 7 0 R >> >> /Contents 4 0 R >>
10
+ endobj
11
+ 4 0 obj
12
+ << /Length 45 >>
13
+ stream
14
+ BT /F1 24 Tf 40 110 Td (Page One Hello) Tj ET
15
+ endstream
16
+ endobj
17
+ 5 0 obj
18
+ << /Type /Page /Parent 2 0 R /MediaBox [0 0 300 200] /Resources << /Font << /F1 7 0 R >> >> /Contents 6 0 R >>
19
+ endobj
20
+ 6 0 obj
21
+ << /Length 45 >>
22
+ stream
23
+ BT /F1 24 Tf 40 110 Td (Page Two World) Tj ET
24
+ endstream
25
+ endobj
26
+ 7 0 obj
27
+ << /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>
28
+ endobj
29
+ xref
30
+ 0 8
31
+ 0000000000 65535 f
32
+ 0000000009 00000 n
33
+ 0000000058 00000 n
34
+ 0000000121 00000 n
35
+ 0000000247 00000 n
36
+ 0000000342 00000 n
37
+ 0000000468 00000 n
38
+ 0000000563 00000 n
39
+ trailer
40
+ << /Size 8 /Root 1 0 R >>
41
+ startxref
42
+ 633
43
+ %%EOF