@stndrds/schema 1.0.0-alpha.277 → 1.0.0-alpha.279

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 (73) hide show
  1. package/dist/{all-D-E8v5yo.d.mts → all-Bk8cRKsu.d.mts} +20 -3
  2. package/dist/{all-D5SkjRst.d.ts → all-C_tC90ZM.d.ts} +20 -3
  3. package/dist/{attributes-lBLiOIY3.d.mts → attributes--M1ifW8_.d.mts} +1 -1
  4. package/dist/{attributes-_b3Db8vT.d.ts → attributes-D8eHv5Kf.d.ts} +1 -1
  5. package/dist/{chunk-XQEDMB6B.mjs → chunk-5PLJHYSL.mjs} +24 -4
  6. package/dist/{chunk-KKR6I3YV.js → chunk-DEHBEFGO.js} +3 -3
  7. package/dist/{chunk-VVYIFBFQ.mjs → chunk-PQEOIDXD.mjs} +1 -1
  8. package/dist/{chunk-F32XOFSP.js → chunk-QMAVKX3Y.js} +55 -34
  9. package/dist/{chunk-PSCSTHUB.mjs → chunk-QUZ3PN36.mjs} +11 -14
  10. package/dist/{chunk-K4UER3DU.mjs → chunk-V2WJFUZW.mjs} +14 -2
  11. package/dist/{chunk-RYAQOR7M.js → chunk-ZBWTAKZO.js} +14 -2
  12. package/dist/{chunk-FMLZHHWB.js → chunk-ZEPGMHCK.js} +14 -16
  13. package/dist/exceptions.d.mts +14 -4
  14. package/dist/exceptions.d.ts +14 -4
  15. package/dist/exceptions.js +39 -39
  16. package/dist/exceptions.mjs +1 -1
  17. package/dist/{helpers-C1VVEAOO.d.mts → helpers-BiABdSxK.d.mts} +3 -3
  18. package/dist/{helpers-vQ6kp8ET.d.ts → helpers-DyoPqiSz.d.ts} +3 -3
  19. package/dist/index-C3P5Dnwt.d.mts +790 -0
  20. package/dist/index-SpFpkWVC.d.ts +790 -0
  21. package/dist/index.d.mts +2228 -393
  22. package/dist/index.d.ts +2228 -393
  23. package/dist/index.js +565 -324
  24. package/dist/index.mjs +358 -138
  25. package/dist/{migrations-DcuJZ8qO.d.ts → migrations-B1kkIhIX.d.ts} +1 -1
  26. package/dist/{migrations-BXd2ZGfM.d.mts → migrations-BNlQVzDC.d.mts} +1 -1
  27. package/dist/{objects-A1ED9af-.d.ts → objects-DgFojgwH.d.ts} +19 -3
  28. package/dist/{objects-BCaBw2ef.d.mts → objects-DmMqHn3L.d.mts} +19 -3
  29. package/dist/{types-DNz3ITS-.d.mts → types-DHqXzkgW.d.mts} +1 -1
  30. package/dist/{types-DqLi1tx1.d.ts → types-DYYFto8d.d.ts} +1 -1
  31. package/dist/validation/all.d.mts +7 -7
  32. package/dist/validation/all.d.ts +7 -7
  33. package/dist/validation/all.js +29 -29
  34. package/dist/validation/all.mjs +4 -4
  35. package/dist/validation/complex/currency.d.mts +2 -2
  36. package/dist/validation/complex/currency.d.ts +2 -2
  37. package/dist/validation/complex/location.d.mts +2 -2
  38. package/dist/validation/complex/location.d.ts +2 -2
  39. package/dist/validation/complex/phone.d.mts +2 -2
  40. package/dist/validation/complex/phone.d.ts +2 -2
  41. package/dist/validation/complex/relation.d.mts +2 -2
  42. package/dist/validation/complex/relation.d.ts +2 -2
  43. package/dist/validation/complex/richtext.d.mts +2 -2
  44. package/dist/validation/complex/richtext.d.ts +2 -2
  45. package/dist/validation/complex/select.d.mts +2 -2
  46. package/dist/validation/complex/select.d.ts +2 -2
  47. package/dist/validation/complex/user.d.mts +2 -2
  48. package/dist/validation/complex/user.d.ts +2 -2
  49. package/dist/validation/computed/formula.d.mts +2 -2
  50. package/dist/validation/computed/formula.d.ts +2 -2
  51. package/dist/validation/computed/rollup.d.mts +2 -2
  52. package/dist/validation/computed/rollup.d.ts +2 -2
  53. package/dist/validation/config/index.d.mts +4 -4
  54. package/dist/validation/config/index.d.ts +4 -4
  55. package/dist/validation/config/index.js +11 -11
  56. package/dist/validation/config/index.mjs +2 -2
  57. package/dist/validation/core/index.d.mts +3 -3
  58. package/dist/validation/core/index.d.ts +3 -3
  59. package/dist/validation/object/index.d.mts +5 -5
  60. package/dist/validation/object/index.d.ts +5 -5
  61. package/dist/validation/object/index.js +14 -14
  62. package/dist/validation/object/index.mjs +2 -2
  63. package/dist/validation/primitives/checkbox.d.mts +2 -2
  64. package/dist/validation/primitives/checkbox.d.ts +2 -2
  65. package/dist/validation/primitives/date.d.mts +2 -2
  66. package/dist/validation/primitives/date.d.ts +2 -2
  67. package/dist/validation/primitives/number.d.mts +2 -2
  68. package/dist/validation/primitives/number.d.ts +2 -2
  69. package/dist/validation/primitives/text.d.mts +2 -2
  70. package/dist/validation/primitives/text.d.ts +2 -2
  71. package/package.json +2 -2
  72. package/dist/index-AJeEKoy6.d.ts +0 -2203
  73. package/dist/index-ApHE8c1J.d.mts +0 -2203
package/dist/index.mjs CHANGED
@@ -1,11 +1,11 @@
1
1
  import { generateId } from './chunk-QY6QFRRV.mjs';
2
2
  export { asTenantId, asUserId, deepEqual, generateId, indexBy } from './chunk-QY6QFRRV.mjs';
3
- import { SYSTEM_FILTER_ATTRIBUTE_TYPES, RESERVED_OBJECT_NAMES, listViewConfigSchema, detailViewConfigSchema, RESERVED_ATTRIBUTE_NAMES, isAttributeSortable, getAttributeCapabilities, resolveIsWithinBounds, normalizeForEdgeRpc, getOperatorPolarity, extractCurrencyFilterValue } from './chunk-XQEDMB6B.mjs';
4
- export { ATTRIBUTE_FILTER_OPERATORS, LIST_VIEW_TAB_VISIBILITIES, NO_VALUE_OPERATORS, OPERATORS_BY_TYPE, REMOVED_OPERATOR_REPLACEMENTS, RESERVED_ATTRIBUTE_NAMES, RESERVED_OBJECT_NAMES, RESOURCE_VISIBILITIES, SYNONYM_ALIASES, SYSTEM_ATTRIBUTES, SYSTEM_ATTRIBUTE_I18N_KEYS, SYSTEM_FIELD_NAMES, SYSTEM_FILTER_ATTRIBUTE_TYPES, canonicalizeFilterValue, collectQualifiedRuleIssues, currentActor, detailTabSchema, detailViewConfigSchema, extractCurrencyFilterValue, extractFilterValue, getAttributeCapabilities, getAttributeFilterOperators, getOperatorPolarity, getRollupFilterOperators, getSystemAttributeI18nKey, getSystemAttributeList, inverseSourceSchema, isAttributeFilterable, isAttributeGroupable, isAttributeKanbanGroupable, isAttributeSearchable, isDynamicValue, isManagedSystemAttribute, isNoValueOperator, isRelativeDateValue, isSetMembershipOperator, listViewConfigSchema, listViewTabSchema, normalizeFilterRule, normalizeForEdgeRpc, normalizeOperator, now, parseViewConfig, relationSourceSchema, resolveEffectiveFilterType, resolveIsWithinBounds, resolveUtcDayBounds, tableSourceSchema, toMultiValueOperator, toUtcDayString, today, validateQualifiedRule, viewConfigByTypeSchema, viewTypeSchema } from './chunk-XQEDMB6B.mjs';
5
- import { iconNameSchema, parseAttributeConfigForCreate, parseComputedFormula } from './chunk-VVYIFBFQ.mjs';
6
- export { ComputedFormulaParseError, SCHEMA_LIMITS, colorIdSchema, iconNameSchema, multiselectOptionWriteSchema, parseAttributeConfig, parseAttributeConfigForCreate, parseAttributeConfigForUpdate, parseComputedFormula, selectOptionWriteSchema, statusGroupSchema, statusOptionWriteSchema } from './chunk-VVYIFBFQ.mjs';
7
- import { createObjectValidator, createAttributeValidator, isNullishOrEmptyString } from './chunk-PSCSTHUB.mjs';
8
- export { createFormAttributeValidator, isNullishOrEmptyString, rejectUnknownAttributesOrThrow, validateDraft, validateDraftOrThrow, validateObject, validateObjectOrThrow } from './chunk-PSCSTHUB.mjs';
3
+ import { SYSTEM_FILTER_ATTRIBUTE_TYPES, RESERVED_OBJECT_NAMES, listViewConfigSchema, detailViewConfigSchema, RESERVED_ATTRIBUTE_NAMES, isAttributeSortable, getAttributeCapabilities, resolveIsWithinBounds, normalizeForEdgeRpc, getOperatorPolarity, extractCurrencyFilterValue } from './chunk-5PLJHYSL.mjs';
4
+ export { ATTRIBUTE_FILTER_OPERATORS, LIST_VIEW_TAB_VISIBILITIES, NO_VALUE_OPERATORS, OPERATORS_BY_TYPE, REMOVED_OPERATOR_REPLACEMENTS, RESERVED_ATTRIBUTE_NAMES, RESERVED_OBJECT_NAMES, RESOURCE_VISIBILITIES, SYNONYM_ALIASES, SYSTEM_ATTRIBUTES, SYSTEM_ATTRIBUTE_I18N_KEYS, SYSTEM_FIELD_NAMES, SYSTEM_FILTER_ATTRIBUTE_TYPES, canonicalizeFilterValue, collectQualifiedRuleIssues, currentActor, detailTabSchema, detailViewConfigSchema, extractCurrencyFilterValue, extractFilterValue, getAttributeCapabilities, getAttributeFilterOperators, getOperatorPolarity, getRollupFilterOperators, getSystemAttributeI18nKey, getSystemAttributeList, inverseSourceSchema, isAttributeFilterable, isAttributeGroupable, isAttributeKanbanGroupable, isAttributeSearchable, isDynamicValue, isManagedSystemAttribute, isNoValueOperator, isRelativeDateValue, isSetMembershipOperator, listViewConfigSchema, listViewTabSchema, normalizeFilterRule, normalizeForEdgeRpc, normalizeOperator, now, parseResourceVisibility, parseViewConfig, relationSourceSchema, resolveEffectiveFilterType, resolveIsWithinBounds, resolveUtcDayBounds, tableSourceSchema, toMultiValueOperator, toUtcDayString, today, validateQualifiedRule, viewConfigByTypeSchema, viewTypeSchema } from './chunk-5PLJHYSL.mjs';
5
+ import { iconNameSchema, parseAttributeConfigForCreate, parseComputedFormula } from './chunk-PQEOIDXD.mjs';
6
+ export { ComputedFormulaParseError, SCHEMA_LIMITS, colorIdSchema, iconNameSchema, multiselectOptionWriteSchema, parseAttributeConfig, parseAttributeConfigForCreate, parseAttributeConfigForUpdate, parseComputedFormula, selectOptionWriteSchema, statusGroupSchema, statusOptionWriteSchema } from './chunk-PQEOIDXD.mjs';
7
+ import { createObjectValidator, createAttributeValidator, isNullishOrEmptyString } from './chunk-QUZ3PN36.mjs';
8
+ export { createFormAttributeValidator, isNullishOrEmptyString, isValuePresent, rejectUnknownAttributesOrThrow, validateDraft, validateDraftOrThrow, validateObject, validateObjectOrThrow } from './chunk-QUZ3PN36.mjs';
9
9
  import './chunk-QVLQPW3O.mjs';
10
10
  import './chunk-ZDQ5AP26.mjs';
11
11
  import './chunk-LV3FEUKU.mjs';
@@ -15,8 +15,8 @@ export { createCheckboxValidator } from './chunk-OSSGN43B.mjs';
15
15
  export { createDateValidator } from './chunk-Q44QKLN4.mjs';
16
16
  export { createNumberValidator } from './chunk-UANQJ2GH.mjs';
17
17
  export { TEXT_FORMAT_PATTERNS, createTextValidator, resolveTextPattern } from './chunk-O73ROMWQ.mjs';
18
- import { SchemaError, SchemaErrorCode, ValidationError, NotFoundError, DuplicateError } from './chunk-K4UER3DU.mjs';
19
- export { AccessDeniedError, AttributeInUseError, AttributeNotFoundError, ChangeTypeNotSupportedError, ConcurrentModificationError, DestructiveSyncNotAllowedError, DuplicateError, ForbiddenError, MemoryNotFoundError, MigrationTimeoutError, NotFoundError, NotImplementedError, ObjectNotFoundError, ObjectReferencedError, OrphanSystemAttributeError, ProtectedResourceError, ProtectedRoleError, RecordNotFoundError, RecordReferencedError, RepositoryError, RoleNotFoundError, SchemaError, SchemaErrorCode, SchemaPlanNotFoundError, SearchBackendError, StorageError, SyncCascadeError, SyncConflictError, SyncError, SystemEntityImmutableError, ValidationError, isAttributeInUseError, isNotFoundError, isObjectReferencedError, isProtectedResourceError, isRecordReferencedError, isSchemaError, isValidationError } from './chunk-K4UER3DU.mjs';
18
+ import { SchemaError, SchemaErrorCode, ValidationError, DuplicateError, NotFoundError } from './chunk-V2WJFUZW.mjs';
19
+ export { AccessDeniedError, AttributeInUseError, AttributeNotFoundError, ChangeTypeNotSupportedError, ConcurrentModificationError, DestructiveSyncNotAllowedError, DuplicateError, ForbiddenError, MemoryNotFoundError, MigrationTimeoutError, NotFoundError, NotImplementedError, ObjectNotFoundError, ObjectReferencedError, OrphanSystemAttributeError, ProtectedResourceError, ProtectedRoleError, RecordNotFoundError, RecordReferencedError, RepositoryError, RoleNotFoundError, SchemaError, SchemaErrorCode, SchemaPlanNotFoundError, SearchBackendError, StorageError, SyncCascadeError, SyncConflictError, SyncError, SystemEntityImmutableError, ValidationError, isAttributeInUseError, isNotFoundError, isObjectReferencedError, isProtectedResourceError, isRecordReferencedError, isSchemaError, isValidationError } from './chunk-V2WJFUZW.mjs';
20
20
  import './chunk-AYVHMVKQ.mjs';
21
21
  import './chunk-YUFTHPOE.mjs';
22
22
  import { formatPhoneForDisplay, normalizeCountrylessPhoneNumber, normalizePhoneNumber } from './chunk-R5LAJCBU.mjs';
@@ -136,6 +136,44 @@ var AUDIT_ACTIONS = [
136
136
  ];
137
137
 
138
138
  // src/types/agent.ts
139
+ function isTerminalState(state) {
140
+ return state.phase === "terminal";
141
+ }
142
+ function sessionStateToLegacyStatus(state) {
143
+ switch (state.phase) {
144
+ case "running":
145
+ return "active";
146
+ case "queued":
147
+ return "idle";
148
+ case "parked":
149
+ if (state.parkedOn === void 0) {
150
+ throw new SchemaError("parked state without parkedOn", SchemaErrorCode.INVARIANT_VIOLATION);
151
+ }
152
+ return state.parkedOn === "agents" ? "waiting_agents" : "waiting_human";
153
+ case "terminal":
154
+ if (state.outcome === void 0) {
155
+ throw new SchemaError(
156
+ "terminal state without outcome",
157
+ SchemaErrorCode.INVARIANT_VIOLATION
158
+ );
159
+ }
160
+ return state.outcome;
161
+ }
162
+ }
163
+ function legacyStatusToSessionState(status2) {
164
+ switch (status2) {
165
+ case "active":
166
+ return { phase: "running" };
167
+ case "idle":
168
+ return { phase: "queued" };
169
+ case "waiting_human":
170
+ return { phase: "parked", parkedOn: "human", humanRequestIds: [] };
171
+ case "waiting_agents":
172
+ return { phase: "parked", parkedOn: "agents" };
173
+ default:
174
+ return { phase: "terminal", outcome: status2 };
175
+ }
176
+ }
139
177
  var SESSION_TERMINAL_STATUSES = [
140
178
  "completed",
141
179
  "failed",
@@ -151,7 +189,7 @@ var DEFAULT_APPROVAL_POLICY = Object.freeze({
151
189
  destructive: "ask",
152
190
  outward: "ask"
153
191
  });
154
- var TODO_PLAN_STATUSES = ["active", "completed", "promoted", "abandoned"];
192
+ var TODO_PLAN_STATUSES = ["active", "completed", "abandoned"];
155
193
  function agentDisplayName(agent2) {
156
194
  return agent2.label?.trim() || agent2.name;
157
195
  }
@@ -161,6 +199,60 @@ var MAX_TODO_ID_CHARS = 80;
161
199
  var MAX_TODO_DESCRIPTION_CHARS = 500;
162
200
  var MAX_TODO_RESULT_CHARS = 2e3;
163
201
 
202
+ // src/types/agent-ui-data.ts
203
+ var NATIVE_AGENT_UI_PART_IDS_METADATA_KEY = "__stndrdsNativeUiPartIds";
204
+ var NATIVE_AGENT_UI_PART_IDS_METADATA_SCHEMA_VERSION = 1;
205
+ var INVALID_NATIVE_PART_IDS = "Native agent UI part IDs metadata is invalid";
206
+ function invalidNativePartIds() {
207
+ throw new ValidationError(INVALID_NATIVE_PART_IDS, []);
208
+ }
209
+ function isPlainRecord(value) {
210
+ if (value === null || typeof value !== "object" || Array.isArray(value)) return false;
211
+ const prototype = Object.getPrototypeOf(value);
212
+ return prototype === Object.prototype || prototype === null;
213
+ }
214
+ function nativeAgentUIPartIdMetadataKey(part, partIndex) {
215
+ if (part.type === "text" || part.type === "reasoning") return `${part.type}:${partIndex}`;
216
+ if (part.type === "tool") return `tool:${part.toolCallId}`;
217
+ return void 0;
218
+ }
219
+ function parseNativeAgentUIPartIdsMetadata(message) {
220
+ const stored = message.metadata?.[NATIVE_AGENT_UI_PART_IDS_METADATA_KEY];
221
+ if (!isPlainRecord(stored)) invalidNativePartIds();
222
+ if (Object.keys(stored).length !== 2 || stored.schemaVersion !== NATIVE_AGENT_UI_PART_IDS_METADATA_SCHEMA_VERSION || !isPlainRecord(stored.partIds)) {
223
+ invalidNativePartIds();
224
+ }
225
+ const expected = /* @__PURE__ */ new Map();
226
+ for (const [index, part] of message.parts.entries()) {
227
+ const key = nativeAgentUIPartIdMetadataKey(part, index);
228
+ if (!key || expected.has(key)) {
229
+ if (key) invalidNativePartIds();
230
+ continue;
231
+ }
232
+ expected.set(key, part);
233
+ }
234
+ const entries = Object.entries(stored.partIds);
235
+ if (entries.length !== expected.size) invalidNativePartIds();
236
+ const nativeIdTypes = /* @__PURE__ */ new Map();
237
+ const parsed = {};
238
+ for (const [key, value] of entries) {
239
+ const part = expected.get(key);
240
+ if (!(part && typeof value === "string" && value.length > 0)) {
241
+ invalidNativePartIds();
242
+ }
243
+ const existingType = nativeIdTypes.get(value);
244
+ if (existingType && (part.type === "tool" || existingType !== part.type)) {
245
+ invalidNativePartIds();
246
+ }
247
+ if (part.type === "tool" && value !== part.toolCallId) {
248
+ invalidNativePartIds();
249
+ }
250
+ nativeIdTypes.set(value, part.type);
251
+ parsed[key] = value;
252
+ }
253
+ return parsed;
254
+ }
255
+
164
256
  // src/types/document-layout.ts
165
257
  var MAX_PRESET_DEPTH = 5;
166
258
 
@@ -197,6 +289,10 @@ function isFormSlotFieldRef(f) {
197
289
  function isFormFreeFieldRef(f) {
198
290
  return f.type === "free";
199
291
  }
292
+ function resolveFieldRequired(input) {
293
+ if (input.fieldRequired !== void 0) return input.fieldRequired;
294
+ return input.slotMode === "create" && input.attributeRequired === true;
295
+ }
200
296
  function getSlotFieldTargets(field) {
201
297
  return field.additionalSlotIds?.length ? [field.slotId, ...field.additionalSlotIds] : [field.slotId];
202
298
  }
@@ -262,6 +358,7 @@ function hasOptions(attr) {
262
358
 
263
359
  // src/types/user-profiles.ts
264
360
  var USER_STATUSES = ["active", "suspended"];
361
+ var USER_WORK_POSTURES = ["plan", "manual", "auto"];
265
362
 
266
363
  // src/types/schema-state.ts
267
364
  function viewStateKey(view) {
@@ -283,6 +380,20 @@ function isRelationGroup(group2) {
283
380
  }
284
381
 
285
382
  // src/types/pagination.ts
383
+ var COUNT_MODES = ["none", "estimated", "exact"];
384
+ function parseCountMode(value) {
385
+ if (typeof value === "string" && COUNT_MODES.includes(value)) {
386
+ return value;
387
+ }
388
+ throw new ValidationError(
389
+ // biome-ignore lint/style/useTemplate: see the comment above.
390
+ "countMode must be one of: " + COUNT_MODES.join(", ") + " (received: " + String(value) + ")",
391
+ []
392
+ );
393
+ }
394
+ function parseOptionalCountMode(value) {
395
+ return value === void 0 ? void 0 : parseCountMode(value);
396
+ }
286
397
  var ESTIMATED_COUNT_CAP = 1e4;
287
398
 
288
399
  // src/lib/object-helpers.ts
@@ -666,9 +777,9 @@ function renderLabelExpression(template, values, fallback = DEFAULT_LABEL_FALLBA
666
777
  const alternatives = orParts.filter(Boolean);
667
778
  let value = "";
668
779
  for (const alt of alternatives) {
669
- const v = getValue(values, alt);
670
- if (v != null && v !== "") {
671
- value = v;
780
+ const text2 = toText(getValue(values, alt));
781
+ if (text2 !== "") {
782
+ value = text2;
672
783
  break;
673
784
  }
674
785
  }
@@ -678,20 +789,28 @@ function renderLabelExpression(template, values, fallback = DEFAULT_LABEL_FALLBA
678
789
  const { name: pipeName, args } = parsePipeExpression(pipeExpr);
679
790
  const simpleFn = simplePipes[pipeName];
680
791
  if (simpleFn) {
681
- if (value != null && value !== "") {
682
- value = simpleFn(String(value));
792
+ if (value !== "") {
793
+ value = simpleFn(value);
683
794
  }
684
795
  } else {
685
796
  const argFn = pipesWithArgs[pipeName];
686
797
  if (argFn) {
687
- value = argFn(String(value ?? ""), ...args);
798
+ value = argFn(value, ...args);
688
799
  }
689
800
  }
690
801
  }
691
- return String(value ?? "");
802
+ return value;
692
803
  }).trim();
693
804
  return result || fallback;
694
805
  }
806
+ function toText(value) {
807
+ if (value == null) return "";
808
+ if (typeof value === "function") return "";
809
+ if (typeof value !== "object") return String(value);
810
+ if (Array.isArray(value)) return value.map(toText).filter(Boolean).join(",");
811
+ const ownToString = value.toString;
812
+ return typeof ownToString === "function" && ownToString !== Object.prototype.toString ? String(value) : "";
813
+ }
695
814
  function isLabelExpression(value) {
696
815
  return /\{\{\s*\S+.*\}\}/.test(value);
697
816
  }
@@ -753,11 +872,26 @@ function extractValueRefs(value) {
753
872
 
754
873
  // src/lib/user-display.ts
755
874
  function getUserDisplayName(user2) {
756
- if (user2.firstName || user2.lastName) {
757
- return [user2.firstName, user2.lastName].filter(Boolean).join(" ");
875
+ const named = [user2.firstName, user2.lastName].map((part) => part?.trim()).filter(Boolean).join(" ");
876
+ if (named !== "") {
877
+ return named;
758
878
  }
759
879
  return user2.email?.split("@")[0] ?? "";
760
880
  }
881
+ var INITIAL_CHARACTER = /\p{L}|\p{N}/u;
882
+ function deriveInitials(label, fallback) {
883
+ const trimmed = label?.trim() ?? "";
884
+ if (trimmed === "") {
885
+ return fallback;
886
+ }
887
+ const words = trimmed.split(/\s+/);
888
+ const parts = words.length === 1 ? trimmed.split("@")[0].split(/[._-]/) : words;
889
+ const initials = parts.map((part) => {
890
+ const initial = part.match(INITIAL_CHARACTER)?.[0];
891
+ return initial === void 0 ? "" : [...initial.toUpperCase()][0] ?? "";
892
+ }).filter(Boolean).slice(0, 2).join("");
893
+ return initials === "" ? fallback : initials;
894
+ }
761
895
 
762
896
  // src/lib/record-creator.ts
763
897
  var RECORD_CREATOR_ROOT_ACTOR_METADATA_KEY = "__creatorRootActorId";
@@ -766,6 +900,20 @@ function getRecordCreatorPrincipalId(record) {
766
900
  return typeof creatorRootActorId === "string" && creatorRootActorId.length > 0 ? creatorRootActorId : record.createdBy;
767
901
  }
768
902
 
903
+ // src/lib/action-grant.ts
904
+ function includesAction(actions, action) {
905
+ return actions?.includes("*") === true || actions?.includes(action) === true;
906
+ }
907
+ function buildPermissionFlags(actions) {
908
+ return {
909
+ canRead: includesAction(actions, "read"),
910
+ canCreate: includesAction(actions, "create"),
911
+ canUpdate: includesAction(actions, "update"),
912
+ canDelete: includesAction(actions, "delete"),
913
+ canManage: includesAction(actions, "manage")
914
+ };
915
+ }
916
+
769
917
  // src/constants/attribute-columns.ts
770
918
  var DB_COLUMN_FIELDS = /* @__PURE__ */ new Set([
771
919
  "id",
@@ -2584,27 +2732,55 @@ var ObjectBuilder = class {
2584
2732
  * into the TRecord generic, enabling full inference.
2585
2733
  *
2586
2734
  * @param attr - Attribute definition or builder (auto-builds if builder)
2735
+ * @throws DuplicateError if the name is already declared on this object
2587
2736
  */
2588
2737
  attribute(attr) {
2589
- if (!this.obj.attributes) {
2590
- this.obj.attributes = [];
2591
- }
2592
- const finalAttr = "build" in attr && typeof attr.build === "function" ? attr.build() : attr;
2593
- this.obj.attributes.push(finalAttr);
2738
+ this.pushAttributes([attr]);
2594
2739
  return this;
2595
2740
  }
2596
2741
  /**
2597
2742
  * Add multiple attributes at once
2598
2743
  * Note: For full type inference, prefer chaining .attribute() calls
2744
+ *
2745
+ * @throws DuplicateError if a name is declared twice, inside this batch or
2746
+ * against an attribute already declared on this object
2599
2747
  */
2600
2748
  attributes(attrs) {
2601
- if (!this.obj.attributes) {
2602
- this.obj.attributes = [];
2603
- }
2604
- const finalAttrs = attrs.map((attr) => "build" in attr ? attr.build() : attr);
2605
- this.obj.attributes.push(...finalAttrs);
2749
+ this.pushAttributes(attrs);
2606
2750
  return this;
2607
2751
  }
2752
+ /**
2753
+ * Build any builders, reject duplicate names, then commit — the single push
2754
+ * path behind `attribute()` and `attributes()`, so both entry points share
2755
+ * one builder detection and one uniqueness guarantee.
2756
+ *
2757
+ * The check runs on the resulting array (already committed + incoming), so one
2758
+ * call catches both a collision inside a single `.attributes([...])` batch and
2759
+ * one spanning several calls.
2760
+ *
2761
+ * Names are compared with raw `===`. Postgres stores `attributes.name` as
2762
+ * plain `text` under a deterministic collation, so `x` and `X` are two
2763
+ * distinct attributes there; folding case here would reject a pair the
2764
+ * database accepts.
2765
+ *
2766
+ * @throws DuplicateError with `SchemaErrorCode.DUPLICATE_ATTRIBUTE`
2767
+ * @internal
2768
+ */
2769
+ pushAttributes(attrs) {
2770
+ const finalAttrs = attrs.map(
2771
+ (attr) => "build" in attr && typeof attr.build === "function" ? attr.build() : attr
2772
+ );
2773
+ assertUniqueBy(
2774
+ [...this.obj.attributes, ...finalAttrs],
2775
+ (attribute) => attribute.name,
2776
+ (name) => new DuplicateError(
2777
+ "attribute",
2778
+ name,
2779
+ `Object "${this.obj.name}": duplicate attribute name "${name}"`
2780
+ )
2781
+ );
2782
+ this.obj.attributes.push(...finalAttrs);
2783
+ }
2608
2784
  /**
2609
2785
  * Set metadata. Merges with any previously set metadata (preserves keys
2610
2786
  * written by other builder methods like `.order()`).
@@ -3160,13 +3336,13 @@ var ActivityTabConfig = class {
3160
3336
  return this.view.build();
3161
3337
  }
3162
3338
  };
3163
- var EmailsTabConfig = class {
3339
+ var AddressMatchedTabConfig = class {
3164
3340
  /** @internal */
3165
- constructor(view, base) {
3341
+ constructor(view, base, type) {
3166
3342
  this.view = view;
3167
- this.tabData = { ...base, type: "emails", emailAttributeIds: [] };
3343
+ this.tabData = { ...base, type, emailAttributeIds: [] };
3168
3344
  }
3169
- /** Set the text attributes whose values are matched against email participants. */
3345
+ /** Set the text attributes whose values are matched against participants. */
3170
3346
  emailAttributes(...attributeIds) {
3171
3347
  this.tabData.emailAttributeIds = attributeIds;
3172
3348
  return this;
@@ -3193,6 +3369,18 @@ var EmailsTabConfig = class {
3193
3369
  return this.view.build();
3194
3370
  }
3195
3371
  };
3372
+ var EmailsTabConfig = class extends AddressMatchedTabConfig {
3373
+ /** @internal */
3374
+ constructor(view, base) {
3375
+ super(view, base, "emails");
3376
+ }
3377
+ };
3378
+ var MeetingsTabConfig = class extends AddressMatchedTabConfig {
3379
+ /** @internal */
3380
+ constructor(view, base) {
3381
+ super(view, base, "meetings");
3382
+ }
3383
+ };
3196
3384
  var DocumentsTabConfig = class {
3197
3385
  /** @internal */
3198
3386
  constructor(view, base) {
@@ -3362,6 +3550,13 @@ var TabBuilder = class {
3362
3550
  emails() {
3363
3551
  return new EmailsTabConfig(this.view, this.base);
3364
3552
  }
3553
+ /**
3554
+ * Create a meetings tab (query-time association via email-bearing attributes)
3555
+ * @example .meetings().emailAttributes("email", "backup_email")
3556
+ */
3557
+ meetings() {
3558
+ return new MeetingsTabConfig(this.view, this.base);
3559
+ }
3365
3560
  /**
3366
3561
  * Create a forms tab to launch and track form instances linked to this record
3367
3562
  * @example .tab("forms", "Forms").forms()
@@ -4534,19 +4729,36 @@ var SKILL_OBJECT = object({ name: "skill", label: "Skill" }).sealed().icon("spar
4534
4729
  )
4535
4730
  ).attribute(richtext({ name: "content", label: "Content" }).defaultValue(SKILL_CONTENT_TEMPLATE)).build();
4536
4731
  var SKILL_VIEW = detailView("skill-detail", "Skill").for("skill").default().sidePanel({ attributes: ["name", "description"] }).tab("content", "Content").richtext("content").titleAttribute("name").done().tab("files", "Files").documents().done().build();
4537
- var SKILL_LIST_VIEW = listView("skill-list", "Skills").for("skill").default().tab("workspace", "Skills").default().icon("table").visibility("workspace").table().columns("name", "description").sort("name", "asc").tab("mine", "Mes skills").icon("lock").visibility("private").table().columns("name", "description").sort("name", "asc").build();
4538
- var MEMORY_OBJECT = object({ name: "memory", label: "Memory" }).sealed().icon("database").order(Number.MAX_SAFE_INTEGER).pluralLabel("Memories").labelExpression("{{ name }}").embeddingExpression("{{ name }}\n{{ description }}\n{{ content }}").attribute(text({ name: "name", label: "Name" }).maxLength(MEMORY_NAME_MAX_LENGTH).required()).attribute(
4732
+ var SKILL_LIST_VIEW = listView("skill-list", "Skills").for("skill").default().tab("workspace", "Skills").default().icon("table").visibility("workspace").table().columns("name", "description").sort("name", "asc").tab("mine", "My skills").icon("lock").visibility("private").table().columns("name", "description").sort("name", "asc").build();
4733
+ var MEMORY_OBJECT = object({ name: "memory", label: "Memory" }).sealed().icon("database").order(Number.MAX_SAFE_INTEGER).pluralLabel("Memories").labelExpression("{{ name }}").embeddingExpression("{{ name }}\n{{ description }}\n{{ content }}").migration(2, (migration) => migration.changeType("content", "text", "richtext")).attribute(text({ name: "name", label: "Name" }).maxLength(MEMORY_NAME_MAX_LENGTH).required()).attribute(
4539
4734
  text({ name: "description", label: "Description" }).multiline().maxLength(MEMORY_DESCRIPTION_MAX_LENGTH).required()
4540
- ).attribute(text({ name: "content", label: "Content" }).multiline()).attribute(
4735
+ ).attribute(richtext({ name: "content", label: "Content" })).attribute(
4541
4736
  select({ name: "kind", label: "Kind" }).options([
4542
4737
  { value: "fact", label: "Fact" },
4543
4738
  { value: "preference", label: "Preference" },
4544
4739
  { value: "feedback", label: "Feedback" },
4545
4740
  { value: "reference", label: "Reference" }
4546
4741
  ])
4547
- ).attribute(relation({ name: "subjects", label: "Subjects" }).toAny().many()).attribute(relation({ name: "links", label: "Links" }).to("memory").many()).build();
4548
- var MEMORY_VIEW = detailView("memory-detail", "Memory").for("memory").default().sidePanel({ attributes: ["name", "description", "kind", "subjects", "links"] }).tab("content", "Content").form(group("content", "Content").field("content", { span: 12 })).build();
4549
- var MEMORY_LIST_VIEW = listView("memory-list", "Memories").for("memory").default().tab("workspace", "Memories").default().icon("table").visibility("workspace").table().columns("name", "kind", "description", "createdAt").sort("name", "asc").tab("mine", "Mes m\xE9moires").icon("lock").visibility("private").table().columns("name", "kind", "description", "createdAt").sort("name", "asc").build();
4742
+ ).attribute(relation({ name: "subjects", label: "Subjects" }).toAny().many()).attribute(relation({ name: "links", label: "Links" }).to("memory").many()).attribute(
4743
+ select({ name: "source", label: "Source" }).options([
4744
+ { value: "explicit", label: "Saved by an agent" },
4745
+ { value: "extracted", label: "Extracted from a session" },
4746
+ { value: "corroborated", label: "Corroborated across users" }
4747
+ ])
4748
+ ).attribute(date({ name: "validFrom", label: "Valid from" }).includeTime()).attribute(date({ name: "invalidAt", label: "Invalid at" }).includeTime()).attribute(relation({ name: "supersededBy", label: "Superseded by" }).to("memory")).build();
4749
+ var MEMORY_VIEW = detailView("memory-detail", "Memory").for("memory").default().sidePanel({
4750
+ attributes: [
4751
+ "description",
4752
+ "kind",
4753
+ "source",
4754
+ "validFrom",
4755
+ "invalidAt",
4756
+ "supersededBy",
4757
+ "subjects",
4758
+ "links"
4759
+ ]
4760
+ }).tab("content", "Content").richtext("content").titleAttribute("name").build();
4761
+ var MEMORY_LIST_VIEW = listView("memory-list", "Memories").for("memory").default().tab("workspace", "Memories").default().icon("table").visibility("workspace").table().columns("name", "kind", "description", "createdAt").sort("name", "asc").tab("mine", "My memories").icon("lock").visibility("private").table().columns("name", "kind", "description", "createdAt").sort("name", "asc").build();
4550
4762
 
4551
4763
  // src/views/registry.ts
4552
4764
  function cloneViewDefinition(view) {
@@ -4955,6 +5167,65 @@ var FormRegistry = class {
4955
5167
  };
4956
5168
  var formRegistry = new FormRegistry();
4957
5169
 
5170
+ // src/realtime/agent-ui-message-batch.ts
5171
+ var AGENT_UI_BATCH_MAX_BYTES = 204800;
5172
+ var AGENT_UI_BATCH_MAX_ITEMS = 256;
5173
+ function isRecord(value) {
5174
+ return typeof value === "object" && value !== null && !Array.isArray(value);
5175
+ }
5176
+ function hasExactKeys(value, allowed) {
5177
+ const keys = Object.keys(value);
5178
+ return keys.length === allowed.length && keys.every((key) => allowed.includes(key));
5179
+ }
5180
+ function isPositiveInteger(value) {
5181
+ return typeof value === "number" && Number.isInteger(value) && value > 0;
5182
+ }
5183
+ function isNonNegativeInteger(value) {
5184
+ return typeof value === "number" && Number.isInteger(value) && value >= 0;
5185
+ }
5186
+ function isContentRange(value) {
5187
+ if (!(isRecord(value) && hasExactKeys(value, ["kind", "startOffset", "endOffset"]))) {
5188
+ return false;
5189
+ }
5190
+ return (value.kind === "text" || value.kind === "reasoning") && isNonNegativeInteger(value.startOffset) && isNonNegativeInteger(value.endOffset) && value.endOffset >= value.startOffset;
5191
+ }
5192
+ function isBatchItem(value) {
5193
+ if (!isRecord(value)) return false;
5194
+ const expectedKeys = value.content === void 0 ? ["sequence", "chunk"] : ["sequence", "content", "chunk"];
5195
+ return hasExactKeys(value, expectedKeys) && isPositiveInteger(value.sequence) && value.chunk !== void 0 && (value.content === void 0 || isContentRange(value.content));
5196
+ }
5197
+ function encodedSize(value) {
5198
+ try {
5199
+ return new TextEncoder().encode(JSON.stringify(value)).byteLength;
5200
+ } catch {
5201
+ return void 0;
5202
+ }
5203
+ }
5204
+ function isAgentUIMessageBatch(value) {
5205
+ if (!(isRecord(value) && hasExactKeys(value, [
5206
+ "schemaVersion",
5207
+ "batchId",
5208
+ "tenantId",
5209
+ "sessionId",
5210
+ "streamId",
5211
+ "sequenceStart",
5212
+ "sequenceEnd",
5213
+ "items"
5214
+ ])) || value.schemaVersion !== 1 || typeof value.batchId !== "string" || value.batchId.trim() === "" || typeof value.tenantId !== "string" || value.tenantId.trim() === "" || typeof value.sessionId !== "string" || value.sessionId.trim() === "" || typeof value.streamId !== "string" || value.streamId.trim() === "" || !isPositiveInteger(value.sequenceStart) || !isPositiveInteger(value.sequenceEnd) || !Array.isArray(value.items) || value.items.length === 0 || value.items.length > AGENT_UI_BATCH_MAX_ITEMS || !value.items.every(isBatchItem)) {
5215
+ return false;
5216
+ }
5217
+ let previous = 0;
5218
+ for (const item of value.items) {
5219
+ if (item.sequence <= previous) return false;
5220
+ previous = item.sequence;
5221
+ }
5222
+ if (value.items[0]?.sequence !== value.sequenceStart || value.items.at(-1)?.sequence !== value.sequenceEnd) {
5223
+ return false;
5224
+ }
5225
+ const size = encodedSize(value);
5226
+ return size !== void 0 && size <= AGENT_UI_BATCH_MAX_BYTES;
5227
+ }
5228
+
4958
5229
  // src/realtime/channels.ts
4959
5230
  function liveChannelKey(channel) {
4960
5231
  switch (channel.kind) {
@@ -5020,47 +5291,6 @@ function parseLiveChannelKey(key) {
5020
5291
  return null;
5021
5292
  }
5022
5293
 
5023
- // src/realtime/cursors.ts
5024
- var LIVE_STREAM_START_CURSOR = "0-0";
5025
- var LIVE_STREAM_CURSOR_PATTERN = /^(0|[1-9]\d*)-(0|[1-9]\d*)$/;
5026
- function parseLiveStreamCursor(cursor) {
5027
- if (!LIVE_STREAM_CURSOR_PATTERN.test(cursor)) {
5028
- return null;
5029
- }
5030
- const [milliseconds = "0", sequence = "0"] = cursor.split("-");
5031
- return [BigInt(milliseconds), BigInt(sequence)];
5032
- }
5033
- function isLiveStreamCursor(value) {
5034
- return typeof value === "string" && parseLiveStreamCursor(value) !== null;
5035
- }
5036
- function assertLiveStreamCursor(cursor, label = "cursor") {
5037
- if (cursor === null) {
5038
- return;
5039
- }
5040
- if (!isLiveStreamCursor(cursor)) {
5041
- throw new Error(`Invalid live stream cursor for ${label}: ${cursor}`);
5042
- }
5043
- }
5044
- function compareLiveStreamCursors(left, right) {
5045
- const leftCursor = parseLiveStreamCursor(left);
5046
- if (!leftCursor) {
5047
- throw new Error(`Invalid live stream cursor for left: ${left}`);
5048
- }
5049
- const rightCursor = parseLiveStreamCursor(right);
5050
- if (!rightCursor) {
5051
- throw new Error(`Invalid live stream cursor for right: ${right}`);
5052
- }
5053
- const [leftMilliseconds, leftSequence] = leftCursor;
5054
- const [rightMilliseconds, rightSequence] = rightCursor;
5055
- if (leftMilliseconds !== rightMilliseconds) {
5056
- return leftMilliseconds < rightMilliseconds ? -1 : 1;
5057
- }
5058
- if (leftSequence !== rightSequence) {
5059
- return leftSequence < rightSequence ? -1 : 1;
5060
- }
5061
- return 0;
5062
- }
5063
-
5064
5294
  // src/realtime/events.ts
5065
5295
  var BROWSER_PREVIEW_STATUSES = ["live", "paused", "ended", "disconnected"];
5066
5296
  var LIVE_EVENT_TYPE_REGISTRY = {
@@ -5145,13 +5375,13 @@ function isLiveEventType(value) {
5145
5375
  return typeof value === "string" && LIVE_EVENT_TYPES.includes(value);
5146
5376
  }
5147
5377
  function isLiveEventPayload(payload) {
5148
- if (!(isRecord(payload) && isLiveEventType(payload.type))) {
5378
+ if (!(isRecord2(payload) && isLiveEventType(payload.type))) {
5149
5379
  return false;
5150
5380
  }
5151
5381
  return isLiveEventPayloadForType(payload.type, payload);
5152
5382
  }
5153
5383
  function isLiveEventPayloadForType(type, payload) {
5154
- if (!isRecord(payload)) {
5384
+ if (!isRecord2(payload)) {
5155
5385
  return false;
5156
5386
  }
5157
5387
  switch (type) {
@@ -5185,7 +5415,7 @@ function isLiveEventPayloadForType(type, payload) {
5185
5415
  return false;
5186
5416
  }
5187
5417
  }
5188
- function isRecord(value) {
5418
+ function isRecord2(value) {
5189
5419
  return typeof value === "object" && value !== null && !Array.isArray(value);
5190
5420
  }
5191
5421
  function isString(value) {
@@ -5247,13 +5477,13 @@ function isNotificationWorkState(value) {
5247
5477
  return isOneOf(value, NOTIFICATION_WORK_STATES);
5248
5478
  }
5249
5479
  function isNotificationSubject(value) {
5250
- return isRecord(value) && hasString(value, "type") && hasString(value, "id");
5480
+ return isRecord2(value) && hasString(value, "type") && hasString(value, "id");
5251
5481
  }
5252
5482
  function isRecordFieldPatch(value) {
5253
- return isRecord(value) && hasString(value, "fieldKey") && Object.hasOwn(value, "value") && hasVersion(value, "version");
5483
+ return isRecord2(value) && hasString(value, "fieldKey") && Object.hasOwn(value, "value") && hasVersion(value, "version");
5254
5484
  }
5255
5485
  function isRecordPatchPayload(payload) {
5256
- return payload.type === "record.patch" && hasString(payload, "objectId") && hasString(payload, "recordId") && hasVersion(payload, "recordVersion") && hasOptional(payload, "label", isString) && hasOptional(payload, "metadata", isRecord) && Array.isArray(payload.fieldPatches) && payload.fieldPatches.every(isRecordFieldPatch) && hasString(payload, "updatedAt");
5486
+ return payload.type === "record.patch" && hasString(payload, "objectId") && hasString(payload, "recordId") && hasVersion(payload, "recordVersion") && hasOptional(payload, "label", isString) && hasOptional(payload, "metadata", isRecord2) && Array.isArray(payload.fieldPatches) && payload.fieldPatches.every(isRecordFieldPatch) && hasString(payload, "updatedAt");
5257
5487
  }
5258
5488
  function isRecordDeletedPayload(payload) {
5259
5489
  return payload.type === "record.deleted" && hasString(payload, "objectId") && hasString(payload, "recordId") && hasVersion(payload, "recordVersion") && hasString(payload, "deletedAt");
@@ -5262,7 +5492,7 @@ function isRecordRemovedPayload(payload) {
5262
5492
  return payload.type === "record.removed" && hasOnlyKeys(payload, RECORD_REMOVED_PAYLOAD_KEYS) && hasString(payload, "objectId") && hasString(payload, "recordId") && hasVersion(payload, "recordVersion");
5263
5493
  }
5264
5494
  function isRecordLiveSnapshot(value) {
5265
- return isRecord(value) && hasOnlyKeys(value, RECORD_LIVE_SNAPSHOT_KEYS) && hasString(value, "id") && hasString(value, "objectId") && isOneOf(value.visibility, ["workspace", "private"]) && isNullableString(value.ownedBy) && (value.visibility === "workspace" && value.ownedBy === null || value.visibility === "private" && isNonEmptyString(value.ownedBy)) && hasString(value, "label") && isRecord(value.values) && hasOptional(value, "metadata", isRecord) && hasIsoDateString(value, "createdAt") && hasIsoDateString(value, "updatedAt") && hasOptional(value, "createdBy", isString) && hasOptional(value, "lastUpdatedBy", isString) && hasVersion(value, "schemaVersion");
5495
+ return isRecord2(value) && hasOnlyKeys(value, RECORD_LIVE_SNAPSHOT_KEYS) && hasString(value, "id") && hasString(value, "objectId") && isOneOf(value.visibility, ["workspace", "private"]) && isNullableString(value.ownedBy) && (value.visibility === "workspace" && value.ownedBy === null || value.visibility === "private" && isNonEmptyString(value.ownedBy)) && hasString(value, "label") && isRecord2(value.values) && hasOptional(value, "metadata", isRecord2) && hasIsoDateString(value, "createdAt") && hasIsoDateString(value, "updatedAt") && hasOptional(value, "createdBy", isString) && hasOptional(value, "lastUpdatedBy", isString) && hasVersion(value, "schemaVersion");
5266
5496
  }
5267
5497
  function isRecordCreatedPayload(payload) {
5268
5498
  return payload.type === "record.created" && hasOnlyKeys(payload, RECORD_CREATED_PAYLOAD_KEYS) && hasString(payload, "objectId") && hasString(payload, "recordId") && hasVersion(payload, "recordVersion") && isRecordLiveSnapshot(payload.record) && payload.record.id === payload.recordId && payload.record.objectId === payload.objectId;
@@ -5271,19 +5501,19 @@ function isViewProjectionStalePayload(payload) {
5271
5501
  return payload.type === "view.projection.stale" && hasString(payload, "viewId") && isOneOf(payload.reason, VIEW_PROJECTION_STALE_REASONS);
5272
5502
  }
5273
5503
  function isAgentSessionPatchPayload(payload) {
5274
- return payload.type === "agent.session.patch" && hasString(payload, "sessionId") && isRecord(payload.patch) && hasVersion(payload, "version") && hasString(payload, "updatedAt");
5504
+ return payload.type === "agent.session.patch" && hasString(payload, "sessionId") && isRecord2(payload.patch) && hasVersion(payload, "version") && hasString(payload, "updatedAt");
5275
5505
  }
5276
5506
  function isAgentUnreadPatchPayload(payload) {
5277
- return payload.type === "agent.unread.patch" && hasString(payload, "targetActorId") && hasString(payload, "sessionId") && hasVersion(payload, "unreadCount") && hasVersion(payload, "version") && hasString(payload, "updatedAt") && (!Object.hasOwn(payload, "session") || isRecord(payload.session) && payload.session.id === payload.sessionId);
5507
+ return payload.type === "agent.unread.patch" && hasString(payload, "targetActorId") && hasString(payload, "sessionId") && hasVersion(payload, "unreadCount") && hasVersion(payload, "version") && hasString(payload, "updatedAt") && (!Object.hasOwn(payload, "session") || isRecord2(payload.session) && payload.session.id === payload.sessionId);
5278
5508
  }
5279
5509
  function isLiveNotification(value) {
5280
- return isRecord(value) && hasString(value, "id") && hasString(value, "tenantId") && hasOptional(value, "senderActorId", isString) && hasOptional(value, "rootActorId", isString) && hasOptional(value, "triggeredByActorId", isString) && isNotificationKind(value.kind) && hasString(value, "type") && hasOptional(value, "subject", isNotificationSubject) && hasString(value, "title") && hasOptional(value, "summary", isString) && isRecord(value.payload) && isNotificationPriority(value.priority) && isNotificationSensitivity(value.sensitivity) && hasOptional(value, "threadKey", isString) && hasOptional(value, "idempotencyKey", isString) && hasOptional(value, "expiresAt", isIsoDateString) && hasIsoDateString(value, "createdAt") && hasIsoDateString(value, "updatedAt");
5510
+ return isRecord2(value) && hasString(value, "id") && hasString(value, "tenantId") && hasOptional(value, "senderActorId", isString) && hasOptional(value, "rootActorId", isString) && hasOptional(value, "triggeredByActorId", isString) && isNotificationKind(value.kind) && hasString(value, "type") && hasOptional(value, "subject", isNotificationSubject) && hasString(value, "title") && hasOptional(value, "summary", isString) && isRecord2(value.payload) && isNotificationPriority(value.priority) && isNotificationSensitivity(value.sensitivity) && hasOptional(value, "threadKey", isString) && hasOptional(value, "idempotencyKey", isString) && hasOptional(value, "expiresAt", isIsoDateString) && hasIsoDateString(value, "createdAt") && hasIsoDateString(value, "updatedAt");
5281
5511
  }
5282
5512
  function isLiveNotificationRecipient(value) {
5283
- return isRecord(value) && hasString(value, "id") && hasString(value, "tenantId") && hasString(value, "notificationId") && hasString(value, "recipientActorId") && isNotificationInboxState(value.inboxState) && isNotificationWorkState(value.workState) && hasOptional(value, "lockedAt", isIsoDateString) && hasOptional(value, "lockedByActorId", isString) && hasOptional(value, "readAt", isIsoDateString) && hasOptional(value, "archivedAt", isIsoDateString) && hasOptional(value, "snoozedUntil", isIsoDateString) && hasOptional(value, "completedAt", isIsoDateString) && hasOptional(value, "dismissedAt", isIsoDateString) && hasIsoDateString(value, "createdAt") && hasIsoDateString(value, "updatedAt");
5513
+ return isRecord2(value) && hasString(value, "id") && hasString(value, "tenantId") && hasString(value, "notificationId") && hasString(value, "recipientActorId") && isNotificationInboxState(value.inboxState) && isNotificationWorkState(value.workState) && hasOptional(value, "lockedAt", isIsoDateString) && hasOptional(value, "lockedByActorId", isString) && hasOptional(value, "readAt", isIsoDateString) && hasOptional(value, "archivedAt", isIsoDateString) && hasOptional(value, "snoozedUntil", isIsoDateString) && hasOptional(value, "completedAt", isIsoDateString) && hasOptional(value, "dismissedAt", isIsoDateString) && hasIsoDateString(value, "createdAt") && hasIsoDateString(value, "updatedAt");
5284
5514
  }
5285
5515
  function isNotificationRecipientPatch(value) {
5286
- if (!isRecord(value)) {
5516
+ if (!isRecord2(value)) {
5287
5517
  return false;
5288
5518
  }
5289
5519
  return Object.keys(value).every(
@@ -5307,14 +5537,14 @@ function isConversationRenamedPayload(payload) {
5307
5537
  }
5308
5538
  function isBrowserPreviewUpdatedPayload(payload) {
5309
5539
  const preview = payload.preview;
5310
- return payload.type === "browser.preview.updated" && hasOnlyKeys(payload, BROWSER_PREVIEW_UPDATED_PAYLOAD_KEYS) && isRecord(preview) && hasOnlyKeys(preview, BROWSER_PREVIEW_DESCRIPTOR_KEYS) && hasNonEmptyString(preview, "previewId") && hasNonEmptyString(preview, "rootSessionId") && hasNonEmptyString(preview, "agentSessionId") && hasNonEmptyString(preview, "browserSession") && isOneOf(preview.status, BROWSER_PREVIEW_STATUSES) && hasVersion(preview, "sequence") && hasIsoDateString(preview, "updatedAt") && preview.previewId === `browser:${preview.agentSessionId}:${preview.browserSession}`;
5540
+ return payload.type === "browser.preview.updated" && hasOnlyKeys(payload, BROWSER_PREVIEW_UPDATED_PAYLOAD_KEYS) && isRecord2(preview) && hasOnlyKeys(preview, BROWSER_PREVIEW_DESCRIPTOR_KEYS) && hasNonEmptyString(preview, "previewId") && hasNonEmptyString(preview, "rootSessionId") && hasNonEmptyString(preview, "agentSessionId") && hasNonEmptyString(preview, "browserSession") && isOneOf(preview.status, BROWSER_PREVIEW_STATUSES) && hasVersion(preview, "sequence") && hasIsoDateString(preview, "updatedAt") && preview.previewId === `browser:${preview.agentSessionId}:${preview.browserSession}`;
5311
5541
  }
5312
5542
  function isChannelRevokedPayload(payload) {
5313
5543
  return payload.type === "channel.revoked" && hasString(payload, "channel") && isOneOf(payload.reason, CHANNEL_REVOKED_REASONS);
5314
5544
  }
5315
5545
 
5316
5546
  // src/realtime/protocol.ts
5317
- function isRecord2(value) {
5547
+ function isRecord3(value) {
5318
5548
  return typeof value === "object" && value !== null && !Array.isArray(value);
5319
5549
  }
5320
5550
  function payloadChannel(payload) {
@@ -5322,46 +5552,11 @@ function payloadChannel(payload) {
5322
5552
  return typeof channel === "string" && parseLiveChannelKey(channel) ? channel : null;
5323
5553
  }
5324
5554
  function getLiveProtocolPayloadChannel(payload) {
5325
- return isRecord2(payload) ? payloadChannel(payload) : null;
5555
+ return isRecord3(payload) ? payloadChannel(payload) : null;
5326
5556
  }
5327
5557
  function isLiveEventEnvelope(payload) {
5328
- if (!isRecord2(payload)) return false;
5329
- return typeof payload.id === "string" && isLiveStreamCursor(payload.id) && typeof payload.channel === "string" && typeof payload.type === "string" && typeof payload.tenantId === "string" && payload.tenantId.length > 0 && typeof payload.occurredAt === "string" && isRecord2(payload.payload);
5330
- }
5331
- function parseLiveSubscribePayload(payload) {
5332
- if (!isRecord2(payload)) return null;
5333
- const channel = payloadChannel(payload);
5334
- if (!channel) return null;
5335
- const { cursor } = payload;
5336
- if (cursor !== void 0 && cursor !== null) {
5337
- if (typeof cursor !== "string" || !isLiveStreamCursor(cursor)) {
5338
- return null;
5339
- }
5340
- }
5341
- return { channel, cursor: cursor ?? null };
5342
- }
5343
- function parseLiveUnsubscribePayload(payload) {
5344
- if (payload === void 0 || payload === null) return {};
5345
- if (!isRecord2(payload)) return null;
5346
- if (!Object.hasOwn(payload, "channel")) {
5347
- return {};
5348
- }
5349
- const channel = payloadChannel(payload);
5350
- return channel ? { channel } : null;
5351
- }
5352
- function isLiveReplayCompletePayload(payload) {
5353
- if (!isRecord2(payload)) return false;
5354
- const channel = payloadChannel(payload);
5355
- if (!channel) return false;
5356
- return payload.cursor === null || typeof payload.cursor === "string" && isLiveStreamCursor(payload.cursor);
5357
- }
5358
- function isLiveGapPayload(payload) {
5359
- if (!isRecord2(payload)) return false;
5360
- return payloadChannel(payload) !== null;
5361
- }
5362
- function isLiveErrorPayload(payload) {
5363
- if (!isRecord2(payload)) return false;
5364
- return payloadChannel(payload) !== null;
5558
+ if (!isRecord3(payload)) return false;
5559
+ return typeof payload.id === "string" && payload.id.length > 0 && typeof payload.channel === "string" && typeof payload.type === "string" && typeof payload.tenantId === "string" && payload.tenantId.length > 0 && typeof payload.occurredAt === "string" && isRecord3(payload.payload);
5365
5560
  }
5366
5561
 
5367
5562
  // src/computed/functions.ts
@@ -6147,14 +6342,14 @@ function resolvePathPart(value, part) {
6147
6342
  if (Array.isArray(value)) {
6148
6343
  return value.map((item) => resolvePathPart(item, part));
6149
6344
  }
6150
- if (!isPlainRecord(value)) {
6345
+ if (!isPlainRecord2(value)) {
6151
6346
  return null;
6152
6347
  }
6153
6348
  if (Object.hasOwn(value, part)) {
6154
6349
  return value[part] ?? null;
6155
6350
  }
6156
6351
  const nestedValues = value.values;
6157
- if (isPlainRecord(nestedValues) && Object.hasOwn(nestedValues, part)) {
6352
+ if (isPlainRecord2(nestedValues) && Object.hasOwn(nestedValues, part)) {
6158
6353
  return nestedValues[part] ?? null;
6159
6354
  }
6160
6355
  return null;
@@ -6337,14 +6532,23 @@ function toFiniteNumber(value) {
6337
6532
  const parsed = Number(value);
6338
6533
  return Number.isFinite(parsed) ? parsed : null;
6339
6534
  }
6535
+ if (isCurrencyValue(value)) {
6536
+ return Number.isFinite(value.value) ? value.value : null;
6537
+ }
6340
6538
  return null;
6341
6539
  }
6540
+ function isCurrencyValue(value) {
6541
+ return typeof value === "object" && value !== null && typeof value.value === "number" && typeof value.code === "string";
6542
+ }
6342
6543
  function toDate(value) {
6343
6544
  if (value instanceof Date) {
6344
6545
  return Number.isNaN(value.getTime()) ? null : value;
6345
6546
  }
6346
6547
  if (typeof value !== "string") {
6347
- return null;
6548
+ const start = dateValueStart(value);
6549
+ if (start === null) return null;
6550
+ const ranged = new Date(start);
6551
+ return Number.isNaN(ranged.getTime()) ? null : ranged;
6348
6552
  }
6349
6553
  const date2 = new Date(value);
6350
6554
  return Number.isNaN(date2.getTime()) ? null : date2;
@@ -6359,7 +6563,7 @@ function uniqueKey(value) {
6359
6563
  }
6360
6564
  return `${typeof value}:${JSON.stringify(value)}`;
6361
6565
  }
6362
- function isPlainRecord(value) {
6566
+ function isPlainRecord2(value) {
6363
6567
  return typeof value === "object" && value !== null && !Array.isArray(value);
6364
6568
  }
6365
6569
  function formatComputedResult(value, returnType, decimals) {
@@ -6800,7 +7004,8 @@ function normalizeOperatorComparands(type, operator, storedValue, ruleValue) {
6800
7004
  if (type === "phone") return normalizePhoneComparands(storedValue, ruleValue);
6801
7005
  return [normalizeComparableValue(type, storedValue), normalizeComparableValue(type, ruleValue)];
6802
7006
  }
6803
- function normalizeUtcCalendarDay(value) {
7007
+ function normalizeUtcCalendarDay(raw) {
7008
+ const value = isDateRangeValue(raw) ? dateValueStart(raw) : raw;
6804
7009
  if (value instanceof Date)
6805
7010
  return Number.isNaN(value.getTime()) ? null : value.toISOString().slice(0, 10);
6806
7011
  if (typeof value !== "string" || value === "") return null;
@@ -6823,6 +7028,7 @@ function normalizePhoneComparands(stored, rule) {
6823
7028
  function normalizeComparableValue(type, value) {
6824
7029
  if (type === "currency") return extractCurrencyFilterValue(value);
6825
7030
  if (type === "date") {
7031
+ if (isDateRangeValue(value)) return dateValueStart(value);
6826
7032
  if (value instanceof Date) return Number.isNaN(value.getTime()) ? null : value.toISOString();
6827
7033
  return value;
6828
7034
  }
@@ -6891,6 +7097,20 @@ function resolveAttributeDefaultValue(attribute, ctx) {
6891
7097
  return attribute.includeTime ? ctx.now.toISOString() : dateInTimezone(ctx.now, ctx.timezone);
6892
7098
  }
6893
7099
 
7100
+ // src/utils/agent-title.ts
7101
+ var AGENT_FALLBACK_TITLE_MAX_LENGTH = 60;
7102
+ var STORAGE_PLACEHOLDER_TITLE = /^Session \d+$/;
7103
+ function buildAgentFallbackTitle(message) {
7104
+ const normalized = message.replace(/\s+/g, " ").trim().replace(/[.!?]+$/, "");
7105
+ if (!normalized) return "New conversation";
7106
+ return normalized.length > AGENT_FALLBACK_TITLE_MAX_LENGTH ? `${normalized.slice(0, AGENT_FALLBACK_TITLE_MAX_LENGTH - 1).trimEnd()}...` : normalized;
7107
+ }
7108
+ function conversationDisplayTitle(input) {
7109
+ const generated = input.generated?.trim();
7110
+ if (generated && !STORAGE_PLACEHOLDER_TITLE.test(generated)) return generated;
7111
+ return input.firstUserText ? buildAgentFallbackTitle(input.firstUserText) : input.emptyLabel;
7112
+ }
7113
+
6894
7114
  // src/utils/view-sync-payload.ts
6895
7115
  function viewSyncPayload(view) {
6896
7116
  return {
@@ -7073,7 +7293,7 @@ var destructiveSchema = z.object({
7073
7293
  )
7074
7294
  }).strict().default({ attributeRemovals: [], objectRemovals: [], renames: [] });
7075
7295
  var planSummarySchema = z.string().min(1).describe(
7076
- "One or two plain-language sentences describing the change and why, shown to the human who approves or rejects the plan \u2014 this is the only free-text context they see before deciding. If `destructive` is non-empty, say plainly what will be lost (e.g. 'deletes the \"ancienMontant\" column and its data on every devis'). Do not restate the raw plan \u2014 explain intent."
7296
+ "ONE sentence naming the intent of the change \u2014 what it is for, not what it contains. The human approving it has already watched every entry land in the preview window and can read every row of the plan itself, so a recap tells them nothing they do not have. A second sentence is warranted only when `destructive` is non-empty: say plainly what will be lost (e.g. 'deletes the \"ancienMontant\" column and its data on every devis'). Never restate the plan \u2014 explain intent."
7077
7297
  );
7078
7298
  var CANONICAL_CONFIG_DESCRIPTION = "The COMPLETE config this view should end up with \u2014 not a patch. Copy the baseline returned by get_default_view and edit it, preserving every tab and setting you are not changing: anything you omit is dropped. To change the columns shown, set `tabs[].columns` (an array of attribute names) \u2014 there is no top-level `columns` on either view type. For a detail view's side panel, set `sidePanel.attributes`. Every attribute name listed must already exist on the object, or be created earlier in this same plan. ONE EXCEPTION to omit-is-dropped: a tab with `type: \"custom\"` renders a component belonging to the application, which you cannot describe or recreate. Copy every such tab through from the baseline exactly as it came, `name`, `component` and `props` untouched \u2014 dropping one, inventing one, or altering any of those three is rejected rather than applied (`name` is the tab's address in links, not its wording). Its `label` and `icon` you may change.";
7079
7299
  var BASELINE_TOKEN_DESCRIPTION = "Opaque token returned by get_default_view alongside the baseline you edited. REQUIRED when the object already exists \u2014 it proves you authored against the baseline that is still current. Must be OMITTED when this plan creates the object, which has no baseline yet.";
@@ -7317,4 +7537,4 @@ var persistedSchemaPlanSchema = z.preprocess(
7317
7537
  structuralPersistedSchemaPlanSchema
7318
7538
  );
7319
7539
 
7320
- export { ALLOWED_PROPERTY_TYPES, ALL_ACTIONS, ALL_SYSTEM_RESOURCES, AUDIT_ACTIONS, AUDIT_RESOURCE_TYPES, ActivityTabConfig, AgentBuilder, BEHAVIOR_PROPERTIES, BROWSER_PREVIEW_STATUSES, BYTE_UNIT_LABELS, COMPUTED_FUNCTIONS, COMPUTED_FUNCTION_METADATA, COMPUTED_FUNCTION_NAMES, CONNECTOR_CALLBACK_PARAM, ComputedFormulaCompileError, CustomTabConfig, DB_COLUMN_FIELDS, DEFAULT_AGENT_EXECUTION_CONFIG, DEFAULT_APPROVAL_POLICY, DEFAULT_ROLES, DEFAULT_ROLE_DESCRIPTIONS, DEFAULT_ROLE_LABELS, DEFAULT_ROLE_PERMISSIONS, DOCUMENT_SYSTEM_ATTRIBUTES, DetailViewBuilder, DocumentsTabConfig, EMPTY_VALUE_PLACEHOLDER, ESTIMATED_COUNT_CAP, EmailsTabConfig, FORM_FORBIDDEN_ATTRIBUTE_TYPES, FlagRegistry, FlagService, FormBuilder, FormRegistry, FormRowBuilder, FormStepBuilder, GroupBuilder, IDENTITY_PROPERTIES, LIVE_EVENT_TYPES, LIVE_STREAM_START_CURSOR, ListViewBuilder, ListViewTabConfigBuilder, MAX_PRESET_DEPTH, MAX_TODOS, MAX_TODO_DESCRIPTION_CHARS, MAX_TODO_ID_CHARS, MAX_TODO_RESULT_CHARS, MEMORY_LIST_VIEW, MEMORY_OBJECT, MEMORY_VIEW, NOTIFICATION_INBOX_STATES, NOTIFICATION_KINDS, NOTIFICATION_PRIORITIES, NOTIFICATION_SENSITIVITIES, NOTIFICATION_TYPES_V1, NOTIFICATION_TYPE_AGENT_QUESTION_REQUESTED, NOTIFICATION_TYPE_AGENT_SESSION_COMPLETED, NOTIFICATION_TYPE_AGENT_SESSION_FAILED, NOTIFICATION_TYPE_AGENT_SESSION_TIMEOUT, NOTIFICATION_TYPE_AGENT_SESSION_WAITING_HUMAN, NOTIFICATION_TYPE_AGENT_TASK_ASSIGNED, NOTIFICATION_WORK_STATES, NoopGeocodingAdapter, OPERATOR_SPECS, ObjectBuilder, PRESENTATION_PROPERTIES, QUALIFIED_SEPARATOR, RECORD_CREATOR_ROOT_ACTOR_METADATA_KEY, RELATION_TARGET_ANY, RelationGroupBuilder, RichtextTabConfig, SCHEMA_PLAN_LIMITS, SESSION_TERMINAL_STATUSES, SKILL_LIST_VIEW, SKILL_OBJECT, SKILL_VIEW, STANDARD_SCHEMA_VENDOR, SYSTEM_RESOURCES, SYSTEM_RESOURCE_LABELS, TODAY_DEFAULT, TODO_PLAN_STATUSES, TODO_STATUSES, TabBuilder, TableTabConfig, USER_STATUSES, accessLevelToActions, actionsToAccessLevel, agent, agentDisplayName, applyPipes, applyRelationProps, assertAcyclicComputedDependencies, assertLiveStreamCursor, booleanFlag, buildPropertySchema, buildQualifiedAttribute, canonicalStringify, checkbox, compareLiveStreamCursors, compileComputedFormula, compileRollupAttribute, computeByteMagnitude, createFlagRegistry, createFlagService, createStandardSchemaProps, currency, date, dateInTimezone, dateValueStart, destructiveSchema, detailView, document, evaluateComputedAst, evaluateComputedFormula, evaluateComputedFormulaWithResult, evaluateFilterState, evaluateRecordFilterState, extractAttributeNames, extractValueRefs, flagRegistry, form, formRegistry, formatAttributeValue, formatByteSize, formatComputedResult, formatLocationValue, formula, generateDefaultDetailView, generateDefaultListView, getActiveTab, getErrorMessage, getLiveProtocolPayloadChannel, getRecordCreatorPrincipalId, getSlotFieldTargets, getUserDisplayName, group, hasDestructiveEntries, hasOptions, inferInverseCardinality, inferRollupReturnType, isAttributeSortable2 as isAttributeSortable, isBilateralRelation, isCheckboxEquality, isComputedFunctionName, isDateRangeValue, isDefaultRole, isDetailView, isDocumentAttribute, isEmptyObject, isFieldGroup, isFormDefinition, isFormFieldsRow, isFormFreeFieldRef, isFormHeadingRow, isFormSeparatorRow, isFormSlotFieldRef, isFormTextRow, isLabelExpression, isListView, isLiveErrorPayload, isLiveEventEnvelope, isLiveEventPayload, isLiveEventPayloadForType, isLiveEventType, isLiveGapPayload, isLiveReplayCompletePayload, isLiveStreamCursor, isNotEmpty, isPlainRecord, isRelationGroup, isStandardSchema, isTerminalSessionStatus, isUniversalRelation, jsonFlag, listView, liveChannelKey, location, matchesAccepts, multiselect, normalizeDateValue, number, numberFlag, object, parseLiveChannelKey, parseLiveSubscribePayload, parseLiveUnsubscribePayload, parseQualifiedAttribute, persistedDefaultViewTargetSchema, persistedSchemaPlanSchema, phone, plannedAttributeSchema, plannedInlineAttributeSchema, plannedObjectSchema, proposedDefaultViewTargetSchema, registry, relation, relationGroup, relationPropertyDefs, renderLabelExpression, resetViewToDefault, resolveAttributeDefaultValue, resolvePropertyDefinitions, richtext, rollup, rollupToFormulaExpression, schemaPlanSchema, select, status, stringFlag, text, toUndefinedIfEmpty, user, validateAttributeName, validateLabelExpression, validateObjectName, validateViewName, viewRegistry, viewStateKey, viewSyncPayload };
7540
+ export { AGENT_UI_BATCH_MAX_BYTES, AGENT_UI_BATCH_MAX_ITEMS, ALLOWED_PROPERTY_TYPES, ALL_ACTIONS, ALL_SYSTEM_RESOURCES, AUDIT_ACTIONS, AUDIT_RESOURCE_TYPES, ActivityTabConfig, AgentBuilder, BEHAVIOR_PROPERTIES, BROWSER_PREVIEW_STATUSES, BYTE_UNIT_LABELS, COMPUTED_FUNCTIONS, COMPUTED_FUNCTION_METADATA, COMPUTED_FUNCTION_NAMES, CONNECTOR_CALLBACK_PARAM, COUNT_MODES, ComputedFormulaCompileError, CustomTabConfig, DB_COLUMN_FIELDS, DEFAULT_AGENT_EXECUTION_CONFIG, DEFAULT_APPROVAL_POLICY, DEFAULT_LABEL_FALLBACK, DEFAULT_ROLES, DEFAULT_ROLE_DESCRIPTIONS, DEFAULT_ROLE_LABELS, DEFAULT_ROLE_PERMISSIONS, DOCUMENT_SYSTEM_ATTRIBUTES, DetailViewBuilder, DocumentsTabConfig, EMPTY_VALUE_PLACEHOLDER, ESTIMATED_COUNT_CAP, EmailsTabConfig, FORM_FORBIDDEN_ATTRIBUTE_TYPES, FlagRegistry, FlagService, FormBuilder, FormRegistry, FormRowBuilder, FormStepBuilder, GroupBuilder, IDENTITY_PROPERTIES, LIVE_EVENT_TYPES, ListViewBuilder, ListViewTabConfigBuilder, MAX_PRESET_DEPTH, MAX_TODOS, MAX_TODO_DESCRIPTION_CHARS, MAX_TODO_ID_CHARS, MAX_TODO_RESULT_CHARS, MEMORY_LIST_VIEW, MEMORY_OBJECT, MEMORY_VIEW, MeetingsTabConfig, NATIVE_AGENT_UI_PART_IDS_METADATA_KEY, NATIVE_AGENT_UI_PART_IDS_METADATA_SCHEMA_VERSION, NOTIFICATION_INBOX_STATES, NOTIFICATION_KINDS, NOTIFICATION_PRIORITIES, NOTIFICATION_SENSITIVITIES, NOTIFICATION_TYPES_V1, NOTIFICATION_TYPE_AGENT_QUESTION_REQUESTED, NOTIFICATION_TYPE_AGENT_SESSION_COMPLETED, NOTIFICATION_TYPE_AGENT_SESSION_FAILED, NOTIFICATION_TYPE_AGENT_SESSION_TIMEOUT, NOTIFICATION_TYPE_AGENT_SESSION_WAITING_HUMAN, NOTIFICATION_TYPE_AGENT_TASK_ASSIGNED, NOTIFICATION_WORK_STATES, NoopGeocodingAdapter, OPERATOR_SPECS, ObjectBuilder, PRESENTATION_PROPERTIES, QUALIFIED_SEPARATOR, RECORD_CREATOR_ROOT_ACTOR_METADATA_KEY, RELATION_TARGET_ANY, RelationGroupBuilder, RichtextTabConfig, SCHEMA_PLAN_LIMITS, SESSION_TERMINAL_STATUSES, SKILL_LIST_VIEW, SKILL_OBJECT, SKILL_VIEW, STANDARD_SCHEMA_VENDOR, SYSTEM_RESOURCES, SYSTEM_RESOURCE_LABELS, TODAY_DEFAULT, TODO_PLAN_STATUSES, TODO_STATUSES, TabBuilder, TableTabConfig, USER_STATUSES, USER_WORK_POSTURES, accessLevelToActions, actionsToAccessLevel, agent, agentDisplayName, applyPipes, applyRelationProps, assertAcyclicComputedDependencies, booleanFlag, buildAgentFallbackTitle, buildPermissionFlags, buildPropertySchema, buildQualifiedAttribute, canonicalStringify, checkbox, compileComputedFormula, compileRollupAttribute, computeByteMagnitude, conversationDisplayTitle, createFlagRegistry, createFlagService, createStandardSchemaProps, currency, date, dateInTimezone, dateValueStart, deriveInitials, destructiveSchema, detailView, document, evaluateComputedAst, evaluateComputedFormula, evaluateComputedFormulaWithResult, evaluateFilterState, evaluateRecordFilterState, extractAttributeNames, extractValueRefs, flagRegistry, form, formRegistry, formatAttributeValue, formatByteSize, formatComputedResult, formatLocationValue, formula, generateDefaultDetailView, generateDefaultListView, getActiveTab, getErrorMessage, getLiveProtocolPayloadChannel, getRecordCreatorPrincipalId, getSlotFieldTargets, getUserDisplayName, group, hasDestructiveEntries, hasOptions, includesAction, inferInverseCardinality, inferRollupReturnType, isAgentUIMessageBatch, isAttributeSortable2 as isAttributeSortable, isBilateralRelation, isCheckboxEquality, isComputedFunctionName, isDateRangeValue, isDefaultRole, isDetailView, isDocumentAttribute, isEmptyObject, isFieldGroup, isFormDefinition, isFormFieldsRow, isFormFreeFieldRef, isFormHeadingRow, isFormSeparatorRow, isFormSlotFieldRef, isFormTextRow, isLabelExpression, isListView, isLiveEventEnvelope, isLiveEventPayload, isLiveEventPayloadForType, isLiveEventType, isNotEmpty, isPlainRecord2 as isPlainRecord, isRelationGroup, isStandardSchema, isTerminalSessionStatus, isTerminalState, isUniversalRelation, jsonFlag, legacyStatusToSessionState, listView, liveChannelKey, location, matchesAccepts, multiselect, nativeAgentUIPartIdMetadataKey, normalizeDateValue, number, numberFlag, object, parseCountMode, parseLiveChannelKey, parseNativeAgentUIPartIdsMetadata, parseOptionalCountMode, parseQualifiedAttribute, persistedDefaultViewTargetSchema, persistedSchemaPlanSchema, phone, plannedAttributeSchema, plannedInlineAttributeSchema, plannedObjectSchema, proposedDefaultViewTargetSchema, registry, relation, relationGroup, relationPropertyDefs, renderLabelExpression, resetViewToDefault, resolveAttributeDefaultValue, resolveFieldRequired, resolvePropertyDefinitions, richtext, rollup, rollupToFormulaExpression, schemaPlanSchema, select, sessionStateToLegacyStatus, status, stringFlag, text, toUndefinedIfEmpty, user, validateAttributeName, validateLabelExpression, validateObjectName, validateViewName, viewRegistry, viewStateKey, viewSyncPayload };