@arbol-ai/cli 2.13.0 → 2.15.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 (3) hide show
  1. package/README.md +7 -1
  2. package/dist/index.js +469 -116
  3. package/package.json +6 -5
package/README.md CHANGED
@@ -140,7 +140,7 @@ bun install
140
140
  bun run forge # build the pinned Cloudflare Forge with cargo into .forge/ (once; needs Rust)
141
141
  bun run openapi # download https://api.getarbol.com/openapi.json
142
142
  bun run generate # src/generated/ from openapi.json with the plugin in generation/plugins/cli.ts
143
- bun run verify # typecheck, tests and dist/
143
+ bun run verify # typecheck and dist/; tests require an explicit human request
144
144
  ```
145
145
 
146
146
  `src/generated/` is the plugin's output, unedited; everything else in `src/` is the CLI itself.
@@ -187,3 +187,9 @@ is private. Provenance is disabled because npm does not support it for private s
187
187
  ## License
188
188
 
189
189
  [Apache License 2.0](LICENSE)
190
+
191
+ ## Validation
192
+
193
+ `bun run verify` checks types and builds the CLI without executing tests. Tests are
194
+ manual: run `bun run test` or `bun run verify:with-tests` only when a human requests
195
+ that run. Automatic verification, generation and publication use the static path.
package/dist/index.js CHANGED
@@ -1672,7 +1672,7 @@ var commands = {
1672
1672
  flag: "email",
1673
1673
  kind: "string",
1674
1674
  required: true,
1675
- description: "Who to invite: someone not yet in the organization."
1675
+ description: "Who to invite: someone who does not have an Arbol account yet."
1676
1676
  },
1677
1677
  {
1678
1678
  name: "product",
@@ -1707,7 +1707,7 @@ var commands = {
1707
1707
  email: {
1708
1708
  format: "email",
1709
1709
  maxLength: 320,
1710
- description: "Who to invite: someone not yet in the organization.",
1710
+ description: "Who to invite: someone who does not have an Arbol account yet.",
1711
1711
  type: "string"
1712
1712
  },
1713
1713
  product: {
@@ -1740,7 +1740,7 @@ var commands = {
1740
1740
  }
1741
1741
  },
1742
1742
  title: "Invite someone to a product",
1743
- description: "Invites someone not yet in the organization by email with a role in Raíz, Agenda, Ámbar or Account. The invitation email comes from the product's own application, so its link opens that product. Someone already in the organization is given the role with `members.create`.",
1743
+ description: "Invites someone without an Arbol account by email with a role in Raíz, Agenda, Ámbar or Account. The invitation email comes from the product's own application. Existing accounts receive access with `members.create` and sign in with their current password.",
1744
1744
  effect: "write",
1745
1745
  confirmation: null,
1746
1746
  hidden: false
@@ -1996,7 +1996,7 @@ var commands = {
1996
1996
  flag: "email",
1997
1997
  kind: "string",
1998
1998
  required: true,
1999
- description: "The email of someone already in the organization."
1999
+ description: "The email of someone with an existing Arbol account, in this organization or another."
2000
2000
  },
2001
2001
  {
2002
2002
  name: "product",
@@ -2031,7 +2031,7 @@ var commands = {
2031
2031
  email: {
2032
2032
  format: "email",
2033
2033
  maxLength: 320,
2034
- description: "The email of someone already in the organization.",
2034
+ description: "The email of someone with an existing Arbol account, in this organization or another.",
2035
2035
  type: "string"
2036
2036
  },
2037
2037
  product: {
@@ -2064,7 +2064,7 @@ var commands = {
2064
2064
  }
2065
2065
  },
2066
2066
  title: "Give a member a role in a product",
2067
- description: "Gives someone already in the organization a role in Raíz, Agenda, Ámbar or Account, by their email. Anyone else is invited with `invitations.create`.",
2067
+ description: "Gives someone with an existing Arbol account a role in Raíz, Agenda, Ámbar or Account, joining them to this organization when needed. They sign in with their current password. Someone without an account is invited with `invitations.create`.",
2068
2068
  effect: "write",
2069
2069
  confirmation: null,
2070
2070
  hidden: false
@@ -5424,7 +5424,7 @@ var commands = {
5424
5424
  flag: "capacity",
5425
5425
  kind: "integer",
5426
5426
  required: false,
5427
- description: "Maximum concurrent units this resource or offering can accept.",
5427
+ description: "Legacy concurrent-session limit above 1; details.maxConcurrent takes precedence. The historical default 1 delegates to resource capacity.",
5428
5428
  default: 1
5429
5429
  },
5430
5430
  {
@@ -5511,7 +5511,7 @@ var commands = {
5511
5511
  minimum: 1,
5512
5512
  maximum: 1e4,
5513
5513
  type: "integer",
5514
- description: "Maximum concurrent units this resource or offering can accept.",
5514
+ description: "Legacy concurrent-session limit above 1; details.maxConcurrent takes precedence. The historical default 1 delegates to resource capacity.",
5515
5515
  default: 1
5516
5516
  },
5517
5517
  details: {
@@ -5797,7 +5797,7 @@ var commands = {
5797
5797
  flag: "capacity",
5798
5798
  kind: "integer",
5799
5799
  required: false,
5800
- description: "Maximum concurrent units this resource or offering can accept."
5800
+ description: "Legacy concurrent-session limit above 1; details.maxConcurrent takes precedence. The historical default 1 delegates to resource capacity."
5801
5801
  },
5802
5802
  {
5803
5803
  name: "durationMinutes",
@@ -5876,7 +5876,7 @@ var commands = {
5876
5876
  minimum: 1,
5877
5877
  maximum: 1e4,
5878
5878
  type: "integer",
5879
- description: "Maximum concurrent units this resource or offering can accept."
5879
+ description: "Legacy concurrent-session limit above 1; details.maxConcurrent takes precedence. The historical default 1 delegates to resource capacity."
5880
5880
  },
5881
5881
  details: {
5882
5882
  type: "object",
@@ -5923,6 +5923,80 @@ var commands = {
5923
5923
  ],
5924
5924
  description: "Lifecycle state controlling whether this record remains available to its domain consumers."
5925
5925
  },
5926
+ resourceRequirements: {
5927
+ maxItems: 30,
5928
+ type: "array",
5929
+ items: {
5930
+ additionalProperties: false,
5931
+ type: "object",
5932
+ required: [
5933
+ "kind"
5934
+ ],
5935
+ properties: {
5936
+ alternatives: {
5937
+ maxItems: 100,
5938
+ type: "array",
5939
+ items: {
5940
+ description: "Stable srs-prefixed Scheduling record identifier; ownership is checked in the authenticated organization.",
5941
+ pattern: "^srs_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
5942
+ type: "string"
5943
+ },
5944
+ default: [],
5945
+ description: "Explicit resource alternatives for this requirement; an empty list allows any resource of the required kind."
5946
+ },
5947
+ kind: {
5948
+ anyOf: [
5949
+ {
5950
+ const: "practitioner",
5951
+ type: "string"
5952
+ },
5953
+ {
5954
+ const: "assistant",
5955
+ type: "string"
5956
+ },
5957
+ {
5958
+ const: "room",
5959
+ type: "string"
5960
+ },
5961
+ {
5962
+ const: "chair",
5963
+ type: "string"
5964
+ },
5965
+ {
5966
+ const: "equipment",
5967
+ type: "string"
5968
+ },
5969
+ {
5970
+ const: "location",
5971
+ type: "string"
5972
+ },
5973
+ {
5974
+ const: "team",
5975
+ type: "string"
5976
+ },
5977
+ {
5978
+ const: "generic",
5979
+ type: "string"
5980
+ }
5981
+ ],
5982
+ description: "Declared domain kind of this record or configuration element."
5983
+ },
5984
+ quantity: {
5985
+ minimum: 1,
5986
+ maximum: 100,
5987
+ type: "integer",
5988
+ default: 1,
5989
+ description: "Number of resources of this kind required by one booking."
5990
+ },
5991
+ required: {
5992
+ type: "boolean",
5993
+ default: true,
5994
+ description: "Whether this resource requirement must be satisfied for the booking to proceed."
5995
+ }
5996
+ }
5997
+ },
5998
+ description: "Complete replacement for future bookings. Existing appointment and hold allocations stay unchanged."
5999
+ },
5926
6000
  expectedVersion: {
5927
6001
  exclusiveMinimum: 0,
5928
6002
  description: "Version last read by the caller. The mutation fails if another writer has changed this record.",
@@ -7146,40 +7220,35 @@ var commands = {
7146
7220
  flag: "appointment-id",
7147
7221
  kind: "string",
7148
7222
  required: false,
7149
- description: "The appointment it relates to: a priority to bring forward.",
7150
- default: null
7223
+ description: "The appointment it relates to: a priority to bring forward."
7151
7224
  },
7152
7225
  {
7153
7226
  name: "conversationUrl",
7154
7227
  flag: "conversation-url",
7155
7228
  kind: "string",
7156
7229
  required: false,
7157
- description: "Agent conversation URL retained so the scheduling team can reopen the referring conversation.",
7158
- default: null
7230
+ description: "Agent conversation URL retained so the scheduling team can reopen the referring conversation."
7159
7231
  },
7160
7232
  {
7161
7233
  name: "note",
7162
7234
  flag: "note",
7163
7235
  kind: "string",
7164
7236
  required: false,
7165
- description: "Desk note attached to the waiting-list entry; null means no note is recorded.",
7166
- default: null
7237
+ description: "Desk note attached to the waiting-list entry; null means no note is recorded."
7167
7238
  },
7168
7239
  {
7169
7240
  name: "payer",
7170
7241
  flag: "payer",
7171
7242
  kind: "string",
7172
7243
  required: false,
7173
- description: "The payer the patient named, as said.",
7174
- default: null
7244
+ description: "The payer the patient named, as said."
7175
7245
  },
7176
7246
  {
7177
7247
  name: "phone",
7178
7248
  flag: "phone",
7179
7249
  kind: "string",
7180
7250
  required: false,
7181
- description: "Patient contact telephone number; null when no number was recorded.",
7182
- default: null
7251
+ description: "The contact phone supplied or confirmed by the person for this request. Replaces their stored contact phone; omitted or null preserves it."
7183
7252
  },
7184
7253
  {
7185
7254
  name: "reason",
@@ -7198,8 +7267,7 @@ var commands = {
7198
7267
  flag: "resource-id",
7199
7268
  kind: "string",
7200
7269
  required: false,
7201
- description: "One professional or agenda; null = any that offers the service.",
7202
- default: null
7270
+ description: "One professional or agenda; null = any that offers the service."
7203
7271
  },
7204
7272
  {
7205
7273
  name: "serviceId",
@@ -7248,8 +7316,7 @@ var commands = {
7248
7316
  {
7249
7317
  type: "null"
7250
7318
  }
7251
- ],
7252
- default: null
7319
+ ]
7253
7320
  },
7254
7321
  conversationUrl: {
7255
7322
  anyOf: [
@@ -7262,8 +7329,8 @@ var commands = {
7262
7329
  type: "null"
7263
7330
  }
7264
7331
  ],
7265
- default: null,
7266
- description: "Agent conversation URL retained so the scheduling team can reopen the referring conversation."
7332
+ description: "Agent conversation URL retained so the scheduling team can reopen the referring conversation.",
7333
+ "x-arbol-runtime-input": "conversationUrl"
7267
7334
  },
7268
7335
  note: {
7269
7336
  anyOf: [
@@ -7274,7 +7341,6 @@ var commands = {
7274
7341
  type: "null"
7275
7342
  }
7276
7343
  ],
7277
- default: null,
7278
7344
  description: "Desk note attached to the waiting-list entry; null means no note is recorded."
7279
7345
  },
7280
7346
  patient: {
@@ -7290,8 +7356,7 @@ var commands = {
7290
7356
  {
7291
7357
  type: "null"
7292
7358
  }
7293
- ],
7294
- default: null
7359
+ ]
7295
7360
  },
7296
7361
  phone: {
7297
7362
  anyOf: [
@@ -7302,8 +7367,53 @@ var commands = {
7302
7367
  type: "null"
7303
7368
  }
7304
7369
  ],
7305
- default: null,
7306
- description: "Patient contact telephone number; null when no number was recorded."
7370
+ description: "The contact phone supplied or confirmed by the person for this request. Replaces their stored contact phone; omitted or null preserves it."
7371
+ },
7372
+ preferences: {
7373
+ additionalProperties: false,
7374
+ type: "object",
7375
+ required: [],
7376
+ properties: {
7377
+ from: {
7378
+ description: "From this local date (YYYY-MM-DD).",
7379
+ anyOf: [
7380
+ {
7381
+ format: "date",
7382
+ type: "string"
7383
+ },
7384
+ {
7385
+ type: "null"
7386
+ }
7387
+ ],
7388
+ default: null
7389
+ },
7390
+ times: {
7391
+ description: '"Martes y jueves en la mañana".',
7392
+ anyOf: [
7393
+ {
7394
+ type: "string"
7395
+ },
7396
+ {
7397
+ type: "null"
7398
+ }
7399
+ ],
7400
+ default: null
7401
+ },
7402
+ to: {
7403
+ description: "Until this local date (YYYY-MM-DD).",
7404
+ anyOf: [
7405
+ {
7406
+ format: "date",
7407
+ type: "string"
7408
+ },
7409
+ {
7410
+ type: "null"
7411
+ }
7412
+ ],
7413
+ default: null
7414
+ }
7415
+ },
7416
+ description: "Patient availability preferences retained with the waiting-list entry."
7307
7417
  },
7308
7418
  reason: {
7309
7419
  anyOf: [
@@ -7333,8 +7443,7 @@ var commands = {
7333
7443
  {
7334
7444
  type: "null"
7335
7445
  }
7336
- ],
7337
- default: null
7446
+ ]
7338
7447
  },
7339
7448
  serviceId: {
7340
7449
  description: "Service identifier within the authenticated organization.",
@@ -7368,11 +7477,69 @@ var commands = {
7368
7477
  }
7369
7478
  },
7370
7479
  title: "Add a patient to the waiting list",
7371
- description: "Put a patient on the clinic's waiting list for the team to act on. Use reason 'payer_review' instead of booking when the patient's payer (EPS) has bookingPolicy 'staff_only' in get_intake_settings (create_appointment refuses them): the team coordinates with the doctor and books it. Use reason 'priority' right after create_appointment when the patient asked for a priority (urgent) appointment: pass that appointment's id as appointmentId so the team can bring it forward. Always pass conversationUrl: this conversation's link in Arbol's Contactabilidad (https://raiz.getarbol.com/conversations/…), so the team opens it there. Pass the patient's name, document and documentType, phone, serviceId (and resourceId only when the patient asked for one professional) and the payer as the patient said it. Calling again for the same patient, service and reason returns the same entry. Then tell the patient the clinic's team will contact them.",
7480
+ description: "Put a patient on the clinic's waiting list for the team to act on, only with the person's consent. Use reason 'payer_review' instead of booking when the patient's payer (EPS) has bookingPolicy 'staff_only' in get_intake_settings (create_appointment refuses them): the team coordinates with the doctor and books it. Use reason 'priority' right after create_appointment when the patient asked for a priority (urgent) appointment: pass that appointment's id as appointmentId so the team can bring it forward. For agent calls, the platform supplies conversationUrl from the invoking conversation; omit that field. Direct callers may supply the referring conversation link so the team can reopen it. Pass the patient's name, document and documentType, phone, serviceId and the payer as the patient said it. Use resourceId only for the professional the person requested. Calling again for the same patient, service and reason returns the same open entry and updates supplied consented preferences, note, payer, conversation or appointment association. A supplied confirmed phone replaces the patient contact phone; omitted or null phone preserves it. Omitted fields preserve their values; resourceId:null explicitly accepts any professional. When supplying preferences, send the complete consented date/time window; null fields clear those limits. Identical repeats do not change the version. Staff status, priority and original queue position are preserved. A closed entry is not reopened. This registers a waiting-list request, never an appointment. Then tell the patient the clinic's team will contact them.",
7372
7481
  effect: "write",
7373
7482
  confirmation: null,
7374
7483
  hidden: false
7375
7484
  },
7485
+ "agenda waitlist list": {
7486
+ operation: "agenda.waitlist.list",
7487
+ sdkPath: [
7488
+ "agenda",
7489
+ "waitlist",
7490
+ "list"
7491
+ ],
7492
+ pathField: null,
7493
+ fields: [
7494
+ {
7495
+ name: "offeringId",
7496
+ flag: "offering-id",
7497
+ kind: "string",
7498
+ required: false,
7499
+ description: "Only entries recorded for this exact offering, which only entries from before services and agendas were chosen separately have; newer entries carry serviceId and resourceId instead."
7500
+ },
7501
+ {
7502
+ name: "resourceId",
7503
+ flag: "resource-id",
7504
+ kind: "string",
7505
+ required: false,
7506
+ description: "Only entries that asked for this professional or agenda; entries open to any agenda (resourceId null) are left out."
7507
+ },
7508
+ {
7509
+ name: "serviceId",
7510
+ flag: "service-id",
7511
+ kind: "string",
7512
+ required: false,
7513
+ description: "Only entries for this service, whichever agenda they asked for."
7514
+ }
7515
+ ],
7516
+ inputSchema: {
7517
+ additionalProperties: false,
7518
+ type: "object",
7519
+ properties: {
7520
+ offeringId: {
7521
+ description: "Only entries recorded for this exact offering, which only entries from before services and agendas were chosen separately have; newer entries carry serviceId and resourceId instead.",
7522
+ pattern: "^off_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
7523
+ type: "string"
7524
+ },
7525
+ resourceId: {
7526
+ description: "Only entries that asked for this professional or agenda; entries open to any agenda (resourceId null) are left out.",
7527
+ pattern: "^srs_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
7528
+ type: "string"
7529
+ },
7530
+ serviceId: {
7531
+ description: "Only entries for this service, whichever agenda they asked for.",
7532
+ pattern: "^svc_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
7533
+ type: "string"
7534
+ }
7535
+ }
7536
+ },
7537
+ title: "List Waitlist",
7538
+ description: "List the organization’s waitlist entries: open ones first (urgent, then the longest waiting), then closed ones, most recently changed first, up to 500. Narrow them by serviceId and resourceId (the agenda an entry asked for); offeringId finds only entries from before services and agendas were chosen separately.",
7539
+ effect: "read",
7540
+ confirmation: null,
7541
+ hidden: false
7542
+ },
7376
7543
  "axxa authorizations lookup": {
7377
7544
  operation: "axxa.authorizations.lookup",
7378
7545
  sdkPath: [
@@ -26944,7 +27111,7 @@ var schemaComponents = {
26944
27111
  ],
26945
27112
  properties: {
26946
27113
  runtimeInputs: {
26947
- maxItems: 2,
27114
+ maxItems: 3,
26948
27115
  type: "array",
26949
27116
  items: {
26950
27117
  anyOf: [
@@ -26955,6 +27122,10 @@ var schemaComponents = {
26955
27122
  {
26956
27123
  const: "channel",
26957
27124
  type: "string"
27125
+ },
27126
+ {
27127
+ const: "conversationUrl",
27128
+ type: "string"
26958
27129
  }
26959
27130
  ]
26960
27131
  }
@@ -28057,6 +28228,35 @@ var schemaComponents = {
28057
28228
  }
28058
28229
  }
28059
28230
  },
28231
+ {
28232
+ additionalProperties: false,
28233
+ type: "object",
28234
+ required: [
28235
+ "code",
28236
+ "message",
28237
+ "retryable",
28238
+ "data"
28239
+ ],
28240
+ properties: {
28241
+ code: {
28242
+ const: "ACCOUNT_EXISTS",
28243
+ type: "string"
28244
+ },
28245
+ message: {
28246
+ const: "This person already has an Arbol account. Give them access with members.create.",
28247
+ type: "string"
28248
+ },
28249
+ retryable: {
28250
+ const: false,
28251
+ type: "boolean"
28252
+ },
28253
+ data: {
28254
+ additionalProperties: false,
28255
+ type: "object",
28256
+ properties: {}
28257
+ }
28258
+ }
28259
+ },
28060
28260
  {
28061
28261
  additionalProperties: false,
28062
28262
  type: "object",
@@ -28130,7 +28330,7 @@ var schemaComponents = {
28130
28330
  type: "string"
28131
28331
  },
28132
28332
  message: {
28133
- const: "This person is not a member.",
28333
+ const: "No existing Arbol account was found.",
28134
28334
  type: "string"
28135
28335
  },
28136
28336
  retryable: {
@@ -29291,6 +29491,10 @@ var schemaComponents = {
29291
29491
  const: "visoft",
29292
29492
  type: "string"
29293
29493
  },
29494
+ {
29495
+ const: "nueva-eps",
29496
+ type: "string"
29497
+ },
29294
29498
  {
29295
29499
  const: "account",
29296
29500
  type: "string"
@@ -30311,6 +30515,8 @@ var schemaComponents = {
30311
30515
  "locations",
30312
30516
  "name",
30313
30517
  "occupationMinutes",
30518
+ "scheduleSummary",
30519
+ "scheduleTimezones",
30314
30520
  "service",
30315
30521
  "serviceId",
30316
30522
  "truncatedAgendas"
@@ -30439,6 +30645,17 @@ var schemaComponents = {
30439
30645
  }
30440
30646
  ]
30441
30647
  },
30648
+ scheduleSummary: {
30649
+ description: "Human-readable service hours and closures. Availability remains authoritative.",
30650
+ type: "string"
30651
+ },
30652
+ scheduleTimezones: {
30653
+ description: "IANA timezones of the agendas in this bounded projection; hours are interpreted locally.",
30654
+ type: "array",
30655
+ items: {
30656
+ type: "string"
30657
+ }
30658
+ },
30442
30659
  service: {
30443
30660
  additionalProperties: false,
30444
30661
  description: "Current service policy and patient instructions; this projection does not establish payer coverage.",
@@ -31029,7 +31246,7 @@ var schemaComponents = {
31029
31246
  type: "string"
31030
31247
  },
31031
31248
  message: {
31032
- const: "The requested operation does not exist.",
31249
+ const: "The requested resource does not exist.",
31033
31250
  type: "string"
31034
31251
  },
31035
31252
  retryable: {
@@ -31683,35 +31900,6 @@ var schemaComponents = {
31683
31900
  }
31684
31901
  }
31685
31902
  },
31686
- {
31687
- additionalProperties: false,
31688
- type: "object",
31689
- required: [
31690
- "code",
31691
- "message",
31692
- "retryable",
31693
- "data"
31694
- ],
31695
- properties: {
31696
- code: {
31697
- const: "AUTHORIZATION_FAILED",
31698
- type: "string"
31699
- },
31700
- message: {
31701
- const: "The identity provider could not authorize this action.",
31702
- type: "string"
31703
- },
31704
- retryable: {
31705
- const: false,
31706
- type: "boolean"
31707
- },
31708
- data: {
31709
- additionalProperties: false,
31710
- type: "object",
31711
- properties: {}
31712
- }
31713
- }
31714
- },
31715
31903
  {
31716
31904
  additionalProperties: false,
31717
31905
  type: "object",
@@ -32176,35 +32364,6 @@ var schemaComponents = {
32176
32364
  }
32177
32365
  }
32178
32366
  },
32179
- {
32180
- additionalProperties: false,
32181
- type: "object",
32182
- required: [
32183
- "code",
32184
- "message",
32185
- "retryable",
32186
- "data"
32187
- ],
32188
- properties: {
32189
- code: {
32190
- const: "SCHEDULING_CONFLICT",
32191
- type: "string"
32192
- },
32193
- message: {
32194
- const: "The schedule changed or this action conflicts with its current state. Refresh before retrying.",
32195
- type: "string"
32196
- },
32197
- retryable: {
32198
- const: false,
32199
- type: "boolean"
32200
- },
32201
- data: {
32202
- additionalProperties: false,
32203
- type: "object",
32204
- properties: {}
32205
- }
32206
- }
32207
- },
32208
32367
  {
32209
32368
  additionalProperties: false,
32210
32369
  type: "object",
@@ -33626,6 +33785,64 @@ var schemaComponents = {
33626
33785
  }
33627
33786
  }
33628
33787
  },
33788
+ {
33789
+ additionalProperties: false,
33790
+ type: "object",
33791
+ required: [
33792
+ "code",
33793
+ "message",
33794
+ "retryable",
33795
+ "data"
33796
+ ],
33797
+ properties: {
33798
+ code: {
33799
+ const: "REMOVAL_WORKFLOW_UNAVAILABLE",
33800
+ type: "string"
33801
+ },
33802
+ message: {
33803
+ const: "Durable removal is unavailable here; use the bounded manual removal operations.",
33804
+ type: "string"
33805
+ },
33806
+ retryable: {
33807
+ const: false,
33808
+ type: "boolean"
33809
+ },
33810
+ data: {
33811
+ additionalProperties: false,
33812
+ type: "object",
33813
+ properties: {}
33814
+ }
33815
+ }
33816
+ },
33817
+ {
33818
+ additionalProperties: false,
33819
+ type: "object",
33820
+ required: [
33821
+ "code",
33822
+ "message",
33823
+ "retryable",
33824
+ "data"
33825
+ ],
33826
+ properties: {
33827
+ code: {
33828
+ const: "REMOVAL_JOB_CONFLICT",
33829
+ type: "string"
33830
+ },
33831
+ message: {
33832
+ const: "A removal is already active, or this idempotency key belongs to another decision.",
33833
+ type: "string"
33834
+ },
33835
+ retryable: {
33836
+ const: false,
33837
+ type: "boolean"
33838
+ },
33839
+ data: {
33840
+ additionalProperties: false,
33841
+ type: "object",
33842
+ properties: {}
33843
+ }
33844
+ }
33845
+ },
33629
33846
  {
33630
33847
  additionalProperties: false,
33631
33848
  type: "object",
@@ -33963,7 +34180,7 @@ var schemaComponents = {
33963
34180
  minimum: 1,
33964
34181
  maximum: 1e4,
33965
34182
  type: "integer",
33966
- description: "Maximum concurrent units this resource or offering can accept."
34183
+ description: "Legacy offering concurrency limit when above one and details.maxConcurrent is absent; one defers to resource capacity."
33967
34184
  },
33968
34185
  details: {
33969
34186
  type: "object",
@@ -63133,7 +63350,7 @@ var schemaComponents = {
63133
63350
  email: {
63134
63351
  format: "email",
63135
63352
  maxLength: 320,
63136
- description: "Who to invite: someone not yet in the organization.",
63353
+ description: "Who to invite: someone who does not have an Arbol account yet.",
63137
63354
  type: "string"
63138
63355
  },
63139
63356
  product: {
@@ -63283,7 +63500,7 @@ var schemaComponents = {
63283
63500
  email: {
63284
63501
  format: "email",
63285
63502
  maxLength: 320,
63286
- description: "The email of someone already in the organization.",
63503
+ description: "The email of someone with an existing Arbol account, in this organization or another.",
63287
63504
  type: "string"
63288
63505
  },
63289
63506
  product: {
@@ -64795,7 +65012,7 @@ var schemaComponents = {
64795
65012
  minimum: 1,
64796
65013
  maximum: 1e4,
64797
65014
  type: "integer",
64798
- description: "Maximum concurrent units this resource or offering can accept.",
65015
+ description: "Legacy concurrent-session limit above 1; details.maxConcurrent takes precedence. The historical default 1 delegates to resource capacity.",
64799
65016
  default: 1
64800
65017
  },
64801
65018
  details: {
@@ -65009,7 +65226,7 @@ var schemaComponents = {
65009
65226
  minimum: 1,
65010
65227
  maximum: 1e4,
65011
65228
  type: "integer",
65012
- description: "Maximum concurrent units this resource or offering can accept."
65229
+ description: "Legacy concurrent-session limit above 1; details.maxConcurrent takes precedence. The historical default 1 delegates to resource capacity."
65013
65230
  },
65014
65231
  details: {
65015
65232
  type: "object",
@@ -65056,6 +65273,80 @@ var schemaComponents = {
65056
65273
  ],
65057
65274
  description: "Lifecycle state controlling whether this record remains available to its domain consumers."
65058
65275
  },
65276
+ resourceRequirements: {
65277
+ maxItems: 30,
65278
+ type: "array",
65279
+ items: {
65280
+ additionalProperties: false,
65281
+ type: "object",
65282
+ required: [
65283
+ "kind"
65284
+ ],
65285
+ properties: {
65286
+ alternatives: {
65287
+ maxItems: 100,
65288
+ type: "array",
65289
+ items: {
65290
+ description: "Stable srs-prefixed Scheduling record identifier; ownership is checked in the authenticated organization.",
65291
+ pattern: "^srs_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
65292
+ type: "string"
65293
+ },
65294
+ default: [],
65295
+ description: "Explicit resource alternatives for this requirement; an empty list allows any resource of the required kind."
65296
+ },
65297
+ kind: {
65298
+ anyOf: [
65299
+ {
65300
+ const: "practitioner",
65301
+ type: "string"
65302
+ },
65303
+ {
65304
+ const: "assistant",
65305
+ type: "string"
65306
+ },
65307
+ {
65308
+ const: "room",
65309
+ type: "string"
65310
+ },
65311
+ {
65312
+ const: "chair",
65313
+ type: "string"
65314
+ },
65315
+ {
65316
+ const: "equipment",
65317
+ type: "string"
65318
+ },
65319
+ {
65320
+ const: "location",
65321
+ type: "string"
65322
+ },
65323
+ {
65324
+ const: "team",
65325
+ type: "string"
65326
+ },
65327
+ {
65328
+ const: "generic",
65329
+ type: "string"
65330
+ }
65331
+ ],
65332
+ description: "Declared domain kind of this record or configuration element."
65333
+ },
65334
+ quantity: {
65335
+ minimum: 1,
65336
+ maximum: 100,
65337
+ type: "integer",
65338
+ default: 1,
65339
+ description: "Number of resources of this kind required by one booking."
65340
+ },
65341
+ required: {
65342
+ type: "boolean",
65343
+ default: true,
65344
+ description: "Whether this resource requirement must be satisfied for the booking to proceed."
65345
+ }
65346
+ }
65347
+ },
65348
+ description: "Complete replacement for future bookings. Existing appointment and hold allocations stay unchanged."
65349
+ },
65059
65350
  expectedVersion: {
65060
65351
  exclusiveMinimum: 0,
65061
65352
  description: "Version last read by the caller. The mutation fails if another writer has changed this record.",
@@ -65917,6 +66208,27 @@ var schemaComponents = {
65917
66208
  }
65918
66209
  }
65919
66210
  },
66211
+ AgendaWaitlistListInput: {
66212
+ additionalProperties: false,
66213
+ type: "object",
66214
+ properties: {
66215
+ offeringId: {
66216
+ description: "Only entries recorded for this exact offering, which only entries from before services and agendas were chosen separately have; newer entries carry serviceId and resourceId instead.",
66217
+ pattern: "^off_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
66218
+ type: "string"
66219
+ },
66220
+ resourceId: {
66221
+ description: "Only entries that asked for this professional or agenda; entries open to any agenda (resourceId null) are left out.",
66222
+ pattern: "^srs_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
66223
+ type: "string"
66224
+ },
66225
+ serviceId: {
66226
+ description: "Only entries for this service, whichever agenda they asked for.",
66227
+ pattern: "^svc_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
66228
+ type: "string"
66229
+ }
66230
+ }
66231
+ },
65920
66232
  AgendaWaitlistJoinInput: {
65921
66233
  additionalProperties: false,
65922
66234
  type: "object",
@@ -65937,8 +66249,7 @@ var schemaComponents = {
65937
66249
  {
65938
66250
  type: "null"
65939
66251
  }
65940
- ],
65941
- default: null
66252
+ ]
65942
66253
  },
65943
66254
  conversationUrl: {
65944
66255
  anyOf: [
@@ -65951,8 +66262,8 @@ var schemaComponents = {
65951
66262
  type: "null"
65952
66263
  }
65953
66264
  ],
65954
- default: null,
65955
- description: "Agent conversation URL retained so the scheduling team can reopen the referring conversation."
66265
+ description: "Agent conversation URL retained so the scheduling team can reopen the referring conversation.",
66266
+ "x-arbol-runtime-input": "conversationUrl"
65956
66267
  },
65957
66268
  note: {
65958
66269
  anyOf: [
@@ -65963,7 +66274,6 @@ var schemaComponents = {
65963
66274
  type: "null"
65964
66275
  }
65965
66276
  ],
65966
- default: null,
65967
66277
  description: "Desk note attached to the waiting-list entry; null means no note is recorded."
65968
66278
  },
65969
66279
  patient: {
@@ -65979,8 +66289,7 @@ var schemaComponents = {
65979
66289
  {
65980
66290
  type: "null"
65981
66291
  }
65982
- ],
65983
- default: null
66292
+ ]
65984
66293
  },
65985
66294
  phone: {
65986
66295
  anyOf: [
@@ -65991,8 +66300,53 @@ var schemaComponents = {
65991
66300
  type: "null"
65992
66301
  }
65993
66302
  ],
65994
- default: null,
65995
- description: "Patient contact telephone number; null when no number was recorded."
66303
+ description: "The contact phone supplied or confirmed by the person for this request. Replaces their stored contact phone; omitted or null preserves it."
66304
+ },
66305
+ preferences: {
66306
+ additionalProperties: false,
66307
+ type: "object",
66308
+ required: [],
66309
+ properties: {
66310
+ from: {
66311
+ description: "From this local date (YYYY-MM-DD).",
66312
+ anyOf: [
66313
+ {
66314
+ format: "date",
66315
+ type: "string"
66316
+ },
66317
+ {
66318
+ type: "null"
66319
+ }
66320
+ ],
66321
+ default: null
66322
+ },
66323
+ times: {
66324
+ description: '"Martes y jueves en la mañana".',
66325
+ anyOf: [
66326
+ {
66327
+ type: "string"
66328
+ },
66329
+ {
66330
+ type: "null"
66331
+ }
66332
+ ],
66333
+ default: null
66334
+ },
66335
+ to: {
66336
+ description: "Until this local date (YYYY-MM-DD).",
66337
+ anyOf: [
66338
+ {
66339
+ format: "date",
66340
+ type: "string"
66341
+ },
66342
+ {
66343
+ type: "null"
66344
+ }
66345
+ ],
66346
+ default: null
66347
+ }
66348
+ },
66349
+ description: "Patient availability preferences retained with the waiting-list entry."
65996
66350
  },
65997
66351
  reason: {
65998
66352
  anyOf: [
@@ -66022,8 +66376,7 @@ var schemaComponents = {
66022
66376
  {
66023
66377
  type: "null"
66024
66378
  }
66025
- ],
66026
- default: null
66379
+ ]
66027
66380
  },
66028
66381
  serviceId: {
66029
66382
  description: "Service identifier within the authenticated organization.",
@@ -76462,9 +76815,9 @@ var schemaComponents = {
76462
76815
  // src/generated/generation.json
76463
76816
  var generation_default = {
76464
76817
  formatVersion: 6,
76465
- release: "1.20261028.154640",
76466
- openapiSha256: "ad5390014f03435778f78ed96f225be573562243387a8a6ba154ed948dca09df",
76467
- openapiContentSha256: "472217811eecc0bec1e867938c2520765a603f3c97917a2523904bb68e072998",
76818
+ release: "1.20261028.230100",
76819
+ openapiSha256: "6d143e0943ce352d203b2e84fbea30f104925bd182a516cb7e9378db2d6c5aff",
76820
+ openapiContentSha256: "821b642463ce46413eb98de5ae447705d8d3559284cfda5e63341c7bcf56d1f8",
76468
76821
  forge: {
76469
76822
  repository: "https://github.com/cloudflare/forge",
76470
76823
  commit: "7f86447210b7bea3779bfdab3cd5655eade0eadb",
@@ -76477,7 +76830,7 @@ var generation_default = {
76477
76830
  outputs: [
76478
76831
  {
76479
76832
  path: "src/generated/commands.ts",
76480
- sha256: "2ea1b193fbf3c63d0cc2d0de630415c489f0b14a73a6343d3da4886132d253e6"
76833
+ sha256: "d2504b6235347dccfae2220e95c79fd53e26f0d92e132806c574fe5e0eb84b28"
76481
76834
  }
76482
76835
  ]
76483
76836
  };
@@ -76832,7 +77185,7 @@ ${name}`);
76832
77185
  }
76833
77186
 
76834
77187
  // src/index.ts
76835
- var VERSION = "2.13.0";
77188
+ var VERSION = "2.15.0";
76836
77189
  var RELEASE = generation_default.release;
76837
77190
  var SDK_PATHS = new Map(Object.values(commands).map((command) => [command.operation, command.sdkPath]));
76838
77191
  var SERVICES = [...new Set(Object.keys(commands).map((name) => name.split(" ")[0]))].toSorted();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arbol-ai/cli",
3
- "version": "2.13.0",
3
+ "version": "2.15.0",
4
4
  "description": "The Arbol CLI: the Arbol API from your terminal, with commands generated by Cloudflare Forge from the public OpenAPI.",
5
5
  "keywords": [
6
6
  "arbol",
@@ -41,10 +41,11 @@
41
41
  "typecheck": "tsc --noEmit",
42
42
  "test": "bun test tests",
43
43
  "build": "bun scripts/build.ts",
44
- "verify": "bun run typecheck && bun run test && bun run build"
44
+ "verify": "bun run typecheck && bun run build",
45
+ "verify:with-tests": "bun run typecheck && bun run test && bun run build"
45
46
  },
46
47
  "dependencies": {
47
- "@arbol-ai/sdk": "2.14.0",
48
+ "@arbol-ai/sdk": "2.16.0",
48
49
  "ajv": "8.20.0",
49
50
  "ajv-formats": "3.0.1",
50
51
  "oauth4webapi": "3.8.8"
@@ -59,8 +60,8 @@
59
60
  "packageManager": "bun@1.4.3",
60
61
  "arbol": {
61
62
  "openapi": {
62
- "release": "1.20261028.154640",
63
- "sha256": "472217811eecc0bec1e867938c2520765a603f3c97917a2523904bb68e072998"
63
+ "release": "1.20261028.230100",
64
+ "sha256": "821b642463ce46413eb98de5ae447705d8d3559284cfda5e63341c7bcf56d1f8"
64
65
  }
65
66
  }
66
67
  }