@vertesia/ui 1.5.0-dev.20260725.083715Z → 1.5.0-dev.20260804.124748Z

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 (176) hide show
  1. package/lib/core/hooks/useScrollableSearch.d.ts +1 -1
  2. package/lib/core/hooks/useScrollableSearch.d.ts.map +1 -1
  3. package/lib/core/hooks/useScrollableSearch.js +15 -2
  4. package/lib/core/hooks/useScrollableSearch.js.map +1 -1
  5. package/lib/env/index.d.ts +4 -0
  6. package/lib/env/index.d.ts.map +1 -1
  7. package/lib/env/index.js.map +1 -1
  8. package/lib/features/agent/chat/AgentRequestInputOverlay.d.ts +1 -1
  9. package/lib/features/agent/chat/AgentRequestInputOverlay.d.ts.map +1 -1
  10. package/lib/features/agent/chat/AgentRequestInputOverlay.js +3 -8
  11. package/lib/features/agent/chat/AgentRequestInputOverlay.js.map +1 -1
  12. package/lib/features/agent/chat/ModernAgentConversation.d.ts +8 -1
  13. package/lib/features/agent/chat/ModernAgentConversation.d.ts.map +1 -1
  14. package/lib/features/agent/chat/ModernAgentConversation.js +53 -17
  15. package/lib/features/agent/chat/ModernAgentConversation.js.map +1 -1
  16. package/lib/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.d.ts +2 -1
  17. package/lib/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.d.ts.map +1 -1
  18. package/lib/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.js +25 -10
  19. package/lib/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.js.map +1 -1
  20. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts.map +1 -1
  21. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js +24 -9
  22. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js.map +1 -1
  23. package/lib/features/agent/chat/ModernAgentOutput/AttachmentPreview.d.ts.map +1 -1
  24. package/lib/features/agent/chat/ModernAgentOutput/AttachmentPreview.js +15 -3
  25. package/lib/features/agent/chat/ModernAgentOutput/AttachmentPreview.js.map +1 -1
  26. package/lib/features/agent/chat/ModernAgentOutput/Header.js +2 -2
  27. package/lib/features/agent/chat/ModernAgentOutput/Header.js.map +1 -1
  28. package/lib/features/agent/chat/ModernAgentOutput/MessageInput.d.ts +2 -1
  29. package/lib/features/agent/chat/ModernAgentOutput/MessageInput.d.ts.map +1 -1
  30. package/lib/features/agent/chat/ModernAgentOutput/MessageInput.js +2 -2
  31. package/lib/features/agent/chat/ModernAgentOutput/MessageInput.js.map +1 -1
  32. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.d.ts.map +1 -1
  33. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js +2 -2
  34. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js.map +1 -1
  35. package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.d.ts +9 -1
  36. package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.d.ts.map +1 -1
  37. package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.js +97 -2
  38. package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.js.map +1 -1
  39. package/lib/features/agent/chat/hooks/useAgentStream.d.ts.map +1 -1
  40. package/lib/features/agent/chat/hooks/useAgentStream.js +12 -3
  41. package/lib/features/agent/chat/hooks/useAgentStream.js.map +1 -1
  42. package/lib/features/agent/chat/index.d.ts +1 -1
  43. package/lib/features/agent/chat/index.d.ts.map +1 -1
  44. package/lib/features/agent/chat/index.js.map +1 -1
  45. package/lib/features/facets/PromptsFacetsNav.d.ts +8 -6
  46. package/lib/features/facets/PromptsFacetsNav.d.ts.map +1 -1
  47. package/lib/features/facets/PromptsFacetsNav.js +8 -3
  48. package/lib/features/facets/PromptsFacetsNav.js.map +1 -1
  49. package/lib/features/store/objects/components/ContentOverview.js +4 -1
  50. package/lib/features/store/objects/components/ContentOverview.js.map +1 -1
  51. package/lib/features/store/objects/components/useContentPanelHooks.d.ts +31 -3
  52. package/lib/features/store/objects/components/useContentPanelHooks.d.ts.map +1 -1
  53. package/lib/features/store/objects/search/DocumentSearchContext.d.ts +128 -6
  54. package/lib/features/store/objects/search/DocumentSearchContext.d.ts.map +1 -1
  55. package/lib/features/store/objects/selection/ObjectsActionContext.d.ts +2 -2
  56. package/lib/features/store/objects/selection/ObjectsActionContext.d.ts.map +1 -1
  57. package/lib/features/store/objects/selection/ObjectsActionSpec.d.ts +2 -2
  58. package/lib/features/store/objects/selection/ObjectsActionSpec.d.ts.map +1 -1
  59. package/lib/features/store/objects/selection/SelectionActions.d.ts +2 -2
  60. package/lib/features/store/objects/selection/SelectionActions.d.ts.map +1 -1
  61. package/lib/features/store/objects/upload/DocumentUploadModal.js.map +1 -1
  62. package/lib/features/store/types/IntakePolicyEditor.d.ts +2 -2
  63. package/lib/features/store/types/IntakePolicyEditor.d.ts.map +1 -1
  64. package/lib/features/store/types/IntakePolicyEditor.js +5 -1
  65. package/lib/features/store/types/IntakePolicyEditor.js.map +1 -1
  66. package/lib/features/store/types/IntakePolicyForm.d.ts.map +1 -1
  67. package/lib/features/store/types/IntakePolicyForm.js +2 -2
  68. package/lib/features/store/types/IntakePolicyForm.js.map +1 -1
  69. package/lib/features/store/types/ObjectSchemaEditor.d.ts +2 -2
  70. package/lib/features/store/types/ObjectSchemaEditor.d.ts.map +1 -1
  71. package/lib/features/store/types/SelectContentType.d.ts +2 -2
  72. package/lib/features/store/types/SelectContentType.d.ts.map +1 -1
  73. package/lib/features/store/types/SelectContentType.js.map +1 -1
  74. package/lib/features/store/types/SelectContentTypeModal.d.ts +2 -2
  75. package/lib/features/store/types/SelectContentTypeModal.d.ts.map +1 -1
  76. package/lib/features/store/types/SelectContentTypeModal.js.map +1 -1
  77. package/lib/features/store/types/TableLayoutEditor.d.ts +2 -2
  78. package/lib/features/store/types/TableLayoutEditor.d.ts.map +1 -1
  79. package/lib/features/store/types/TypeRegistry.d.ts +1267 -6
  80. package/lib/features/store/types/TypeRegistry.d.ts.map +1 -1
  81. package/lib/features/store/types/TypeRegistry.js +5 -0
  82. package/lib/features/store/types/TypeRegistry.js.map +1 -1
  83. package/lib/features/store/types/intake-policy-editor.logic.d.ts +9 -1
  84. package/lib/features/store/types/intake-policy-editor.logic.d.ts.map +1 -1
  85. package/lib/features/store/types/intake-policy-editor.logic.js +9 -1
  86. package/lib/features/store/types/intake-policy-editor.logic.js.map +1 -1
  87. package/lib/features/store/types/search/ObjectTypeSearchContext.d.ts +1251 -1
  88. package/lib/features/store/types/search/ObjectTypeSearchContext.d.ts.map +1 -1
  89. package/lib/features/store/types/typeCatalogCache.d.ts +2 -2
  90. package/lib/features/store/types/typeCatalogCache.d.ts.map +1 -1
  91. package/lib/features/store/types/typeCatalogCache.js +4 -0
  92. package/lib/features/store/types/typeCatalogCache.js.map +1 -1
  93. package/lib/features/user/UserInfo.d.ts +118 -7
  94. package/lib/features/user/UserInfo.d.ts.map +1 -1
  95. package/lib/i18n/locales/ar.json +2 -1
  96. package/lib/i18n/locales/de.json +2 -1
  97. package/lib/i18n/locales/en.json +5 -1
  98. package/lib/i18n/locales/es.json +2 -1
  99. package/lib/i18n/locales/fr.json +2 -1
  100. package/lib/i18n/locales/it.json +2 -1
  101. package/lib/i18n/locales/ja.json +2 -1
  102. package/lib/i18n/locales/ko.json +2 -1
  103. package/lib/i18n/locales/pt.json +2 -1
  104. package/lib/i18n/locales/ru.json +2 -1
  105. package/lib/i18n/locales/tr.json +2 -1
  106. package/lib/i18n/locales/zh-TW.json +2 -1
  107. package/lib/i18n/locales/zh.json +2 -1
  108. package/lib/session/UserSession.d.ts +18 -4
  109. package/lib/session/UserSession.d.ts.map +1 -1
  110. package/lib/shell/apps/AppInstallationProvider.d.ts +222 -2
  111. package/lib/shell/apps/AppInstallationProvider.d.ts.map +1 -1
  112. package/lib/shell/login/InviteAcceptModal.js.map +1 -1
  113. package/lib/vertesia-ui-core.js +1 -1
  114. package/lib/vertesia-ui-core.js.map +1 -1
  115. package/lib/vertesia-ui-features.js +34 -34
  116. package/lib/vertesia-ui-features.js.map +1 -1
  117. package/lib/vertesia-ui-i18n.js +13 -13
  118. package/lib/vertesia-ui-widgets.js +18 -18
  119. package/lib/vertesia-ui-widgets.js.map +1 -1
  120. package/lib/widgets/monacoEditor/MonacoEditor.d.ts +7 -1
  121. package/lib/widgets/monacoEditor/MonacoEditor.d.ts.map +1 -1
  122. package/lib/widgets/monacoEditor/MonacoEditor.js +62 -6
  123. package/lib/widgets/monacoEditor/MonacoEditor.js.map +1 -1
  124. package/package.json +31 -31
  125. package/src/core/hooks/useScrollableSearch.test.tsx +139 -0
  126. package/src/core/hooks/useScrollableSearch.tsx +17 -3
  127. package/src/env/index.ts +2 -0
  128. package/src/features/agent/chat/AgentChatPlaybackControls.test.tsx +2 -0
  129. package/src/features/agent/chat/AgentRequestInputOverlay.test.tsx +51 -6
  130. package/src/features/agent/chat/AgentRequestInputOverlay.tsx +5 -7
  131. package/src/features/agent/chat/ModernAgentConversation.test.tsx +195 -3
  132. package/src/features/agent/chat/ModernAgentConversation.tsx +106 -22
  133. package/src/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.tsx +75 -20
  134. package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.test.tsx +112 -0
  135. package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.tsx +62 -10
  136. package/src/features/agent/chat/ModernAgentOutput/AttachmentPreview.tsx +36 -4
  137. package/src/features/agent/chat/ModernAgentOutput/Header.tsx +2 -2
  138. package/src/features/agent/chat/ModernAgentOutput/MessageInput.test.tsx +71 -0
  139. package/src/features/agent/chat/ModernAgentOutput/MessageInput.tsx +3 -1
  140. package/src/features/agent/chat/ModernAgentOutput/MessageItem.tsx +18 -4
  141. package/src/features/agent/chat/ModernAgentOutput/requestInputMessages.test.ts +95 -0
  142. package/src/features/agent/chat/ModernAgentOutput/requestInputMessages.ts +111 -1
  143. package/src/features/agent/chat/hooks/useAgentStream.test.tsx +57 -0
  144. package/src/features/agent/chat/hooks/useAgentStream.ts +12 -3
  145. package/src/features/agent/chat/index.ts +1 -0
  146. package/src/features/facets/PromptsFacetsNav.tsx +17 -9
  147. package/src/features/store/objects/components/ContentOverview.tsx +4 -1
  148. package/src/features/store/objects/selection/ObjectsActionContext.tsx +2 -2
  149. package/src/features/store/objects/selection/ObjectsActionSpec.ts +2 -2
  150. package/src/features/store/objects/selection/SelectionActions.tsx +2 -2
  151. package/src/features/store/objects/upload/DocumentUploadModal.tsx +2 -2
  152. package/src/features/store/types/IntakePolicyEditor.tsx +12 -4
  153. package/src/features/store/types/IntakePolicyForm.tsx +25 -0
  154. package/src/features/store/types/ObjectSchemaEditor.tsx +2 -2
  155. package/src/features/store/types/SelectContentType.tsx +9 -9
  156. package/src/features/store/types/SelectContentTypeModal.tsx +5 -5
  157. package/src/features/store/types/TableLayoutEditor.tsx +2 -2
  158. package/src/features/store/types/TypeRegistry.ts +8 -3
  159. package/src/features/store/types/intake-policy-editor.logic.ts +10 -2
  160. package/src/features/store/types/typeCatalogCache.ts +10 -3
  161. package/src/i18n/locales/ar.json +2 -1
  162. package/src/i18n/locales/de.json +2 -1
  163. package/src/i18n/locales/en.json +5 -1
  164. package/src/i18n/locales/es.json +2 -1
  165. package/src/i18n/locales/fr.json +2 -1
  166. package/src/i18n/locales/it.json +2 -1
  167. package/src/i18n/locales/ja.json +2 -1
  168. package/src/i18n/locales/ko.json +2 -1
  169. package/src/i18n/locales/pt.json +2 -1
  170. package/src/i18n/locales/ru.json +2 -1
  171. package/src/i18n/locales/tr.json +2 -1
  172. package/src/i18n/locales/zh-TW.json +2 -1
  173. package/src/i18n/locales/zh.json +2 -1
  174. package/src/shell/login/InviteAcceptModal.tsx +4 -4
  175. package/src/widgets/markdown/ArtifactEditingSurface.test.tsx +13 -9
  176. package/src/widgets/monacoEditor/MonacoEditor.tsx +83 -7
@@ -1,4 +1,4 @@
1
- import type { ContentObjectTypeItem } from '@vertesia/common';
1
+ import type { ContentObjectTypeCatalogEntry } from '@vertesia/common';
2
2
  import { SelectBox } from '@vertesia/ui/core';
3
3
  import { useUITranslation } from '@vertesia/ui/i18n';
4
4
  import { useEffect, useState } from 'react';
@@ -6,7 +6,7 @@ import { useTypeRegistry } from './TypeRegistryProvider.js';
6
6
 
7
7
  interface SelectContentTypeProps {
8
8
  defaultValue?: string | string[] | null; // the typeId
9
- onChange: (type: ContentObjectTypeItem | null | ContentObjectTypeItem[]) => void;
9
+ onChange: (type: ContentObjectTypeCatalogEntry | null | ContentObjectTypeCatalogEntry[]) => void;
10
10
  className?: string;
11
11
  isClearable?: boolean;
12
12
  multiple?: boolean;
@@ -22,7 +22,7 @@ export function SelectContentType({
22
22
  const { registry: typeRegistry } = useTypeRegistry();
23
23
  const [isMounted, setIsMounted] = useState(false);
24
24
 
25
- const optionLabel = (type: ContentObjectTypeItem | null) => {
25
+ const optionLabel = (type: ContentObjectTypeCatalogEntry | null) => {
26
26
  if (type === null) return t('store.none');
27
27
 
28
28
  return (
@@ -32,8 +32,8 @@ export function SelectContentType({
32
32
  </div>
33
33
  );
34
34
  };
35
- const [selectedType, setSelectedType] = useState<ContentObjectTypeItem | undefined>();
36
- const [selectedTypes, setSelectedTypes] = useState<ContentObjectTypeItem[]>([]);
35
+ const [selectedType, setSelectedType] = useState<ContentObjectTypeCatalogEntry | undefined>();
36
+ const [selectedTypes, setSelectedTypes] = useState<ContentObjectTypeCatalogEntry[]>([]);
37
37
 
38
38
  useEffect(() => {
39
39
  if (!isMounted) {
@@ -51,12 +51,12 @@ export function SelectContentType({
51
51
  }
52
52
  }, [isMounted, typeRegistry, defaultValue, multiple]);
53
53
 
54
- const _onChange = (option: ContentObjectTypeItem | null) => {
54
+ const _onChange = (option: ContentObjectTypeCatalogEntry | null) => {
55
55
  setSelectedType(option || undefined);
56
56
  onChange(option);
57
57
  };
58
58
 
59
- const _onChangeMultiple = (options: ContentObjectTypeItem[]) => {
59
+ const _onChangeMultiple = (options: ContentObjectTypeCatalogEntry[]) => {
60
60
  setSelectedTypes(options);
61
61
  onChange(options);
62
62
  };
@@ -64,7 +64,7 @@ export function SelectContentType({
64
64
  if (multiple) {
65
65
  return (
66
66
  <div className="flex flex-col gap-4 content-between">
67
- <SelectBox<ContentObjectTypeItem>
67
+ <SelectBox<ContentObjectTypeCatalogEntry>
68
68
  options={typeRegistry?.types || []}
69
69
  value={selectedTypes}
70
70
  onChange={_onChangeMultiple}
@@ -81,7 +81,7 @@ export function SelectContentType({
81
81
 
82
82
  return (
83
83
  <div className="flex flex-col gap-4 content-between">
84
- <SelectBox<ContentObjectTypeItem>
84
+ <SelectBox<ContentObjectTypeCatalogEntry>
85
85
  options={typeRegistry?.types || []}
86
86
  value={selectedType}
87
87
  onChange={_onChange}
@@ -1,4 +1,4 @@
1
- import type { ContentObjectTypeItem } from '@vertesia/common';
1
+ import type { ContentObjectTypeCatalogEntry } from '@vertesia/common';
2
2
  import { Button, Modal, ModalBody, ModalFooter, ModalTitle, SelectBox, VTooltip } from '@vertesia/ui/core';
3
3
  import { useUITranslation } from '@vertesia/ui/i18n';
4
4
  import { CheckCircleIcon, Info } from 'lucide-react';
@@ -18,7 +18,7 @@ interface SelectContentTypeModalProps {
18
18
  /** Children to render in the modal */
19
19
  children?: ReactNode;
20
20
  /** Optional initial selected type */
21
- initialSelectedType?: ContentObjectTypeItem | null;
21
+ initialSelectedType?: ContentObjectTypeCatalogEntry | null;
22
22
  /** Optional description text */
23
23
  description?: string;
24
24
  /** Label for the confirm button */
@@ -45,7 +45,7 @@ export function SelectContentTypeModal({
45
45
  const { t } = useUITranslation();
46
46
  const resolvedTitle = title ?? t('store.selectContentType');
47
47
  const { registry: typeRegistry } = useTypeRegistry();
48
- const [selectedType, setSelectedType] = useState<ContentObjectTypeItem | null>(initialSelectedType);
48
+ const [selectedType, setSelectedType] = useState<ContentObjectTypeCatalogEntry | null>(initialSelectedType);
49
49
 
50
50
  // Get available types from the registry
51
51
  const types = typeRegistry?.types || [];
@@ -79,7 +79,7 @@ export function SelectContentTypeModal({
79
79
  value={selectedType}
80
80
  optionLabel={(type) => (type ? type.name : t('store.selectContentTypeLabel'))}
81
81
  placeholder={t('store.selectContentTypeAuto')}
82
- onChange={(selected: ContentObjectTypeItem | null | undefined) =>
82
+ onChange={(selected: ContentObjectTypeCatalogEntry | null | undefined) =>
83
83
  setSelectedType(selected || null)
84
84
  }
85
85
  filterBy="name"
@@ -91,7 +91,7 @@ export function SelectContentTypeModal({
91
91
  value={selectedType}
92
92
  optionLabel={(type) => (type ? type.name : t('store.selectContentTypeLabel'))}
93
93
  placeholder={t('store.selectContentTypeLabel')}
94
- onChange={(selected: ContentObjectTypeItem | null | undefined) =>
94
+ onChange={(selected: ContentObjectTypeCatalogEntry | null | undefined) =>
95
95
  setSelectedType(selected || null)
96
96
  }
97
97
  filterBy="name"
@@ -1,4 +1,4 @@
1
- import type { ColumnLayout, ContentObjectType } from '@vertesia/common';
1
+ import type { ColumnLayout, ContentObjectTypeCatalogEntry } from '@vertesia/common';
2
2
  import { Button, errorMessage, Panel, useTheme, useToast } from '@vertesia/ui/core';
3
3
  import { useUITranslation } from '@vertesia/ui/i18n';
4
4
  import { useUserSession } from '@vertesia/ui/session';
@@ -6,7 +6,7 @@ import { type EditorApi, MonacoEditor } from '@vertesia/ui/widgets';
6
6
  import { useMemo, useRef, useState } from 'react';
7
7
 
8
8
  interface TableLayoutEditorProps {
9
- objectType: ContentObjectType;
9
+ objectType: ContentObjectTypeCatalogEntry;
10
10
  onLayoutUpdate: (value: ColumnLayout[] | undefined) => void;
11
11
  readonly?: boolean;
12
12
  }
@@ -1,8 +1,13 @@
1
- import type { ContentObjectTypeItem } from '@vertesia/common';
1
+ import type { ContentObjectTypeCatalogEntry } from '@vertesia/common';
2
2
 
3
+ /**
4
+ * Holds the type catalog, which is `ContentObjectTypeCatalogEntry` rather than
5
+ * `ContentObjectTypeItem`: the listing includes system and app types, which are declared in code and
6
+ * therefore carry none of the four audit fields.
7
+ */
3
8
  export class TypeRegistry {
4
- map: Record<string, ContentObjectTypeItem> = {};
5
- constructor(public types: ContentObjectTypeItem[]) {
9
+ map: Record<string, ContentObjectTypeCatalogEntry> = {};
10
+ constructor(public types: ContentObjectTypeCatalogEntry[]) {
6
11
  //sort types
7
12
  types.sort((a, b) => a.name.localeCompare(b.name));
8
13
  for (const type of types) {
@@ -34,13 +34,21 @@ export function updateIntakePolicy(
34
34
  return next as ContentTypeIntakePolicy;
35
35
  }
36
36
 
37
+ /**
38
+ * `number[][]` in, `[number, number][]` out.
39
+ *
40
+ * The policy type says `number[][]` — JSON has no tuples, and the published component has always
41
+ * described a two-element array rather than a pair — so the editor takes what the policy holds and
42
+ * returns the pair shape the form rows render. The `[1, 1]` default is what makes the result honest:
43
+ * a short row read out of a stored policy is completed rather than assumed.
44
+ */
37
45
  export function replaceIntakeRange(
38
- ranges: [number, number][] | undefined,
46
+ ranges: number[][] | undefined,
39
47
  index: number,
40
48
  endpoint: 0 | 1,
41
49
  value: number,
42
50
  ): [number, number][] {
43
- const next = ranges?.map((range) => [...range] as [number, number]) ?? [];
51
+ const next: [number, number][] = ranges?.map((range) => [range[0] ?? 1, range[1] ?? 1]) ?? [];
44
52
  const current = next[index] ?? [1, 1];
45
53
  current[endpoint] = value;
46
54
  next[index] = current;
@@ -1,5 +1,5 @@
1
1
  import type { VertesiaClient } from '@vertesia/client';
2
- import type { ContentObjectTypeItem } from '@vertesia/common';
2
+ import type { ContentObjectTypeCatalogEntry } from '@vertesia/common';
3
3
 
4
4
  /**
5
5
  * Browser-session cache for content-type catalog lookups, so render-time consumers
@@ -11,10 +11,17 @@ import type { ContentObjectTypeItem } from '@vertesia/common';
11
11
  * lookups self-evict so the next view retries. In-app type edits must call
12
12
  * `invalidateTypeCache` — edits made elsewhere (assistant, another tab) are picked up on
13
13
  * the next session.
14
+ *
15
+ * Entries are `ContentObjectTypeCatalogEntry`, not `ContentObjectTypeItem`: the catalog resolves
16
+ * in-code types contributed by plugins, whose audit fields are absent, so `created_by` and its three
17
+ * siblings are optional here.
14
18
  */
15
- const cachePerClient = new WeakMap<VertesiaClient, Map<string, Promise<ContentObjectTypeItem | undefined>>>();
19
+ const cachePerClient = new WeakMap<VertesiaClient, Map<string, Promise<ContentObjectTypeCatalogEntry | undefined>>>();
16
20
 
17
- export function resolveTypeCached(client: VertesiaClient, typeId: string): Promise<ContentObjectTypeItem | undefined> {
21
+ export function resolveTypeCached(
22
+ client: VertesiaClient,
23
+ typeId: string,
24
+ ): Promise<ContentObjectTypeCatalogEntry | undefined> {
18
25
  let cache = cachePerClient.get(client);
19
26
  if (!cache) {
20
27
  cache = new Map();
@@ -164,7 +164,7 @@
164
164
  "agent.rewind.jumpToLatest": "الانتقال إلى أحدث رسالة",
165
165
  "agent.rewind.jumpToLive": "الانتقال إلى المباشر",
166
166
  "agent.rewind.jumpToStart": "الانتقال إلى أول رسالة",
167
- "agent.rewind.label": "إعادة التشغيل",
167
+ "agent.rewind.label": "تصحيح الأخطاء",
168
168
  "agent.rewind.nextMessage": "الرسالة التالية",
169
169
  "agent.rewind.pause": "إيقاف مؤقت",
170
170
  "agent.rewind.positionInput": "موضع التشغيل",
@@ -200,6 +200,7 @@
200
200
  "agent.summary": "ملخص",
201
201
  "agent.taskProgress": "تقدم المهام",
202
202
  "agent.tasksCompleted": "{{completed}}/{{total}} مكتملة",
203
+ "agent.thinking": "جارٍ التفكير...",
203
204
  "agent.timeout": "انتهت المهلة",
204
205
  "agent.toggleRightSidebar": "تبديل الشريط الجانبي الأيمن",
205
206
  "agent.typeYourMessage": "اكتب رسالتك...",
@@ -160,7 +160,7 @@
160
160
  "agent.rewind.jumpToLatest": "Zur neuesten Nachricht springen",
161
161
  "agent.rewind.jumpToLive": "Zur Live-Ansicht springen",
162
162
  "agent.rewind.jumpToStart": "Zur ersten Nachricht springen",
163
- "agent.rewind.label": "Wiedergabe",
163
+ "agent.rewind.label": "Debuggen",
164
164
  "agent.rewind.nextMessage": "Nächste Nachricht",
165
165
  "agent.rewind.pause": "Pausieren",
166
166
  "agent.rewind.positionInput": "Wiedergabeposition",
@@ -192,6 +192,7 @@
192
192
  "agent.summary": "Zusammenfassung",
193
193
  "agent.taskProgress": "Aufgabenfortschritt",
194
194
  "agent.tasksCompleted": "{{completed}}/{{total}} abgeschlossen",
195
+ "agent.thinking": "Denke nach...",
195
196
  "agent.timeout": "Zeitüberschreitung",
196
197
  "agent.toggleRightSidebar": "Rechte Seitenleiste umschalten",
197
198
  "agent.typeYourMessage": "Geben Sie Ihre Nachricht ein...",
@@ -224,7 +224,7 @@
224
224
  "agent.rewind.jumpToLatest": "Jump to latest message",
225
225
  "agent.rewind.jumpToLive": "Jump to live",
226
226
  "agent.rewind.jumpToStart": "Jump to first message",
227
- "agent.rewind.label": "Rewind",
227
+ "agent.rewind.label": "Debug",
228
228
  "agent.rewind.nextMessage": "Next message",
229
229
  "agent.rewind.pause": "Pause",
230
230
  "agent.rewind.positionInput": "Playback position",
@@ -265,6 +265,7 @@
265
265
  "agent.summary": "Summary",
266
266
  "agent.taskProgress": "Task Progress",
267
267
  "agent.tasksCompleted": "{{completed}}/{{total}} completed",
268
+ "agent.thinking": "Thinking...",
268
269
  "agent.timeout": "Timed out",
269
270
  "agent.toggleRightSidebar": "Toggle right sidebar",
270
271
  "agent.typeYourMessage": "Type your message...",
@@ -464,6 +465,7 @@
464
465
  "intakePolicy.field.rangeEnd": "Range end",
465
466
  "intakePolicy.field.rangeStart": "Range start",
466
467
  "intakePolicy.field.refreshOcr": "Refresh OCR",
468
+ "intakePolicy.field.renderDpi": "Render DPI",
467
469
  "intakePolicy.field.renderingTemplate": "Rendering template",
468
470
  "intakePolicy.field.reviewModel": "Review model",
469
471
  "intakePolicy.field.reviewThreshold": "Review threshold",
@@ -517,9 +519,11 @@
517
519
  "intakePolicy.placeholder.objectId": "Add an object ID",
518
520
  "intakePolicy.section.classification": "Classification and defaults",
519
521
  "intakePolicy.section.conversion": "Text conversion",
522
+ "intakePolicy.section.conversionModel": "Conversion model",
520
523
  "intakePolicy.section.customConversion": "Custom conversion",
521
524
  "intakePolicy.section.embeddings": "Search and generated content",
522
525
  "intakePolicy.section.extraction": "Property extraction",
526
+ "intakePolicy.section.extractionModel": "Extraction model",
523
527
  "intakePolicy.section.grounding": "Grounded extraction",
524
528
  "intakePolicy.section.locate": "Relevant page locator",
525
529
  "intakePolicy.section.models": "Extraction models",
@@ -161,7 +161,7 @@
161
161
  "agent.rewind.jumpToLatest": "Ir al mensaje más reciente",
162
162
  "agent.rewind.jumpToLive": "Ir a en vivo",
163
163
  "agent.rewind.jumpToStart": "Ir al primer mensaje",
164
- "agent.rewind.label": "Reproducción",
164
+ "agent.rewind.label": "Depuración",
165
165
  "agent.rewind.nextMessage": "Mensaje siguiente",
166
166
  "agent.rewind.pause": "Pausar",
167
167
  "agent.rewind.positionInput": "Posición de reproducción",
@@ -194,6 +194,7 @@
194
194
  "agent.summary": "Resumen",
195
195
  "agent.taskProgress": "Progreso de tareas",
196
196
  "agent.tasksCompleted": "{{completed}}/{{total}} completadas",
197
+ "agent.thinking": "Pensando...",
197
198
  "agent.timeout": "Tiempo agotado",
198
199
  "agent.toggleRightSidebar": "Alternar panel lateral",
199
200
  "agent.typeYourMessage": "Escribe tu mensaje...",
@@ -161,7 +161,7 @@
161
161
  "agent.rewind.jumpToLatest": "Aller au dernier message",
162
162
  "agent.rewind.jumpToLive": "Aller au direct",
163
163
  "agent.rewind.jumpToStart": "Aller au premier message",
164
- "agent.rewind.label": "Lecture",
164
+ "agent.rewind.label": "Débogage",
165
165
  "agent.rewind.nextMessage": "Message suivant",
166
166
  "agent.rewind.pause": "Pause",
167
167
  "agent.rewind.positionInput": "Position de lecture",
@@ -194,6 +194,7 @@
194
194
  "agent.summary": "Résumé",
195
195
  "agent.taskProgress": "Progression des tâches",
196
196
  "agent.tasksCompleted": "{{completed}}/{{total}} terminées",
197
+ "agent.thinking": "Réflexion...",
197
198
  "agent.timeout": "Délai dépassé",
198
199
  "agent.toggleRightSidebar": "Basculer le panneau latéral",
199
200
  "agent.typeYourMessage": "Saisissez votre message...",
@@ -161,7 +161,7 @@
161
161
  "agent.rewind.jumpToLatest": "Vai al messaggio più recente",
162
162
  "agent.rewind.jumpToLive": "Vai al live",
163
163
  "agent.rewind.jumpToStart": "Vai al primo messaggio",
164
- "agent.rewind.label": "Replay",
164
+ "agent.rewind.label": "Debug",
165
165
  "agent.rewind.nextMessage": "Messaggio successivo",
166
166
  "agent.rewind.pause": "Pausa",
167
167
  "agent.rewind.positionInput": "Posizione di riproduzione",
@@ -194,6 +194,7 @@
194
194
  "agent.summary": "Riepilogo",
195
195
  "agent.taskProgress": "Progresso attività",
196
196
  "agent.tasksCompleted": "{{completed}}/{{total}} completate",
197
+ "agent.thinking": "Sto pensando...",
197
198
  "agent.timeout": "Tempo scaduto",
198
199
  "agent.toggleRightSidebar": "Alterna pannello laterale",
199
200
  "agent.typeYourMessage": "Scrivi il tuo messaggio...",
@@ -160,7 +160,7 @@
160
160
  "agent.rewind.jumpToLatest": "最新のメッセージへ移動",
161
161
  "agent.rewind.jumpToLive": "ライブへ移動",
162
162
  "agent.rewind.jumpToStart": "最初のメッセージへ移動",
163
- "agent.rewind.label": "再生",
163
+ "agent.rewind.label": "デバッグ",
164
164
  "agent.rewind.nextMessage": "次のメッセージ",
165
165
  "agent.rewind.pause": "一時停止",
166
166
  "agent.rewind.positionInput": "再生位置",
@@ -192,6 +192,7 @@
192
192
  "agent.summary": "概要",
193
193
  "agent.taskProgress": "タスクの進捗",
194
194
  "agent.tasksCompleted": "{{completed}}/{{total}} 完了",
195
+ "agent.thinking": "考え中...",
195
196
  "agent.timeout": "タイムアウト",
196
197
  "agent.toggleRightSidebar": "右サイドバーの切り替え",
197
198
  "agent.typeYourMessage": "メッセージを入力...",
@@ -160,7 +160,7 @@
160
160
  "agent.rewind.jumpToLatest": "최신 메시지로 이동",
161
161
  "agent.rewind.jumpToLive": "라이브로 이동",
162
162
  "agent.rewind.jumpToStart": "첫 메시지로 이동",
163
- "agent.rewind.label": "재생",
163
+ "agent.rewind.label": "디버그",
164
164
  "agent.rewind.nextMessage": "다음 메시지",
165
165
  "agent.rewind.pause": "일시 중지",
166
166
  "agent.rewind.positionInput": "재생 위치",
@@ -192,6 +192,7 @@
192
192
  "agent.summary": "요약",
193
193
  "agent.taskProgress": "작업 진행률",
194
194
  "agent.tasksCompleted": "{{completed}}/{{total}} 완료",
195
+ "agent.thinking": "생각 중...",
195
196
  "agent.timeout": "시간 초과",
196
197
  "agent.toggleRightSidebar": "오른쪽 사이드바 전환",
197
198
  "agent.typeYourMessage": "메시지를 입력하세요...",
@@ -161,7 +161,7 @@
161
161
  "agent.rewind.jumpToLatest": "Ir para a mensagem mais recente",
162
162
  "agent.rewind.jumpToLive": "Ir para ao vivo",
163
163
  "agent.rewind.jumpToStart": "Ir para a primeira mensagem",
164
- "agent.rewind.label": "Reprodução",
164
+ "agent.rewind.label": "Depuração",
165
165
  "agent.rewind.nextMessage": "Próxima mensagem",
166
166
  "agent.rewind.pause": "Pausar",
167
167
  "agent.rewind.positionInput": "Posição de reprodução",
@@ -194,6 +194,7 @@
194
194
  "agent.summary": "Resumo",
195
195
  "agent.taskProgress": "Progresso das tarefas",
196
196
  "agent.tasksCompleted": "{{completed}}/{{total}} concluídas",
197
+ "agent.thinking": "Pensando...",
197
198
  "agent.timeout": "Tempo esgotado",
198
199
  "agent.toggleRightSidebar": "Alternar painel lateral",
199
200
  "agent.typeYourMessage": "Digite sua mensagem...",
@@ -162,7 +162,7 @@
162
162
  "agent.rewind.jumpToLatest": "Перейти к последнему сообщению",
163
163
  "agent.rewind.jumpToLive": "Перейти к live",
164
164
  "agent.rewind.jumpToStart": "Перейти к первому сообщению",
165
- "agent.rewind.label": "Повтор",
165
+ "agent.rewind.label": "Отладка",
166
166
  "agent.rewind.nextMessage": "Следующее сообщение",
167
167
  "agent.rewind.pause": "Пауза",
168
168
  "agent.rewind.positionInput": "Позиция воспроизведения",
@@ -196,6 +196,7 @@
196
196
  "agent.summary": "Сводка",
197
197
  "agent.taskProgress": "Прогресс задач",
198
198
  "agent.tasksCompleted": "{{completed}}/{{total}} завершено",
199
+ "agent.thinking": "Размышляю...",
199
200
  "agent.timeout": "Время ожидания истекло",
200
201
  "agent.toggleRightSidebar": "Переключить правую панель",
201
202
  "agent.typeYourMessage": "Введите сообщение...",
@@ -160,7 +160,7 @@
160
160
  "agent.rewind.jumpToLatest": "En yeni mesaja git",
161
161
  "agent.rewind.jumpToLive": "Canlıya git",
162
162
  "agent.rewind.jumpToStart": "İlk mesaja git",
163
- "agent.rewind.label": "Yeniden oynatma",
163
+ "agent.rewind.label": "Hata ayıklama",
164
164
  "agent.rewind.nextMessage": "Sonraki mesaj",
165
165
  "agent.rewind.pause": "Duraklat",
166
166
  "agent.rewind.positionInput": "Oynatma konumu",
@@ -192,6 +192,7 @@
192
192
  "agent.summary": "Özet",
193
193
  "agent.taskProgress": "Görev ilerlemesi",
194
194
  "agent.tasksCompleted": "{{completed}}/{{total}} tamamlandı",
195
+ "agent.thinking": "Düşünüyor...",
195
196
  "agent.timeout": "Zaman aşımına uğradı",
196
197
  "agent.toggleRightSidebar": "Sağ kenar çubuğunu aç/kapat",
197
198
  "agent.typeYourMessage": "Mesajınızı yazın...",
@@ -160,7 +160,7 @@
160
160
  "agent.rewind.jumpToLatest": "跳到最新訊息",
161
161
  "agent.rewind.jumpToLive": "跳到即時",
162
162
  "agent.rewind.jumpToStart": "跳到第一則訊息",
163
- "agent.rewind.label": "重播",
163
+ "agent.rewind.label": "偵錯",
164
164
  "agent.rewind.nextMessage": "下一則訊息",
165
165
  "agent.rewind.pause": "暫停",
166
166
  "agent.rewind.positionInput": "播放位置",
@@ -192,6 +192,7 @@
192
192
  "agent.summary": "摘要",
193
193
  "agent.taskProgress": "任務進度",
194
194
  "agent.tasksCompleted": "{{completed}}/{{total}} 已完成",
195
+ "agent.thinking": "思考中...",
195
196
  "agent.timeout": "已逾時",
196
197
  "agent.toggleRightSidebar": "切換右側邊欄",
197
198
  "agent.typeYourMessage": "輸入訊息...",
@@ -160,7 +160,7 @@
160
160
  "agent.rewind.jumpToLatest": "跳到最新消息",
161
161
  "agent.rewind.jumpToLive": "跳到实时",
162
162
  "agent.rewind.jumpToStart": "跳到第一条消息",
163
- "agent.rewind.label": "回放",
163
+ "agent.rewind.label": "调试",
164
164
  "agent.rewind.nextMessage": "下一条消息",
165
165
  "agent.rewind.pause": "暂停",
166
166
  "agent.rewind.positionInput": "播放位置",
@@ -192,6 +192,7 @@
192
192
  "agent.summary": "摘要",
193
193
  "agent.taskProgress": "任务进度",
194
194
  "agent.tasksCompleted": "{{completed}}/{{total}} 已完成",
195
+ "agent.thinking": "思考中...",
195
196
  "agent.timeout": "已超时",
196
197
  "agent.toggleRightSidebar": "切换右侧边栏",
197
198
  "agent.typeYourMessage": "输入消息...",
@@ -1,4 +1,4 @@
1
- import type { TransientToken, UserInviteTokenData } from '@vertesia/common';
1
+ import type { UserInviteToken } from '@vertesia/common';
2
2
  import { Button, Modal, ModalBody, ModalTitle } from '@vertesia/ui/core';
3
3
  import { useUITranslation } from '@vertesia/ui/i18n';
4
4
  import { useUserSession } from '@vertesia/ui/session';
@@ -9,7 +9,7 @@ export function InviteAcceptModal() {
9
9
  const { client } = session;
10
10
  const { t } = useUITranslation();
11
11
  const [showModal, setShowModal] = useState(false);
12
- const [invites, setInvites] = useState<TransientToken<UserInviteTokenData>[]>([]);
12
+ const [invites, setInvites] = useState<UserInviteToken[]>([]);
13
13
 
14
14
  useEffect(() => {
15
15
  client.account
@@ -38,7 +38,7 @@ export function InviteAcceptModal() {
38
38
 
39
39
  const closeModal = () => setShowModal(false);
40
40
 
41
- const accept = async (invite: TransientToken<UserInviteTokenData>) => {
41
+ const accept = async (invite: UserInviteToken) => {
42
42
  await client.account.acceptInvite(invite.id);
43
43
  await session.authCallback;
44
44
  await session.fetchAccounts();
@@ -53,7 +53,7 @@ export function InviteAcceptModal() {
53
53
  }
54
54
  };
55
55
 
56
- const reject = async (invite: TransientToken<UserInviteTokenData>) => {
56
+ const reject = async (invite: UserInviteToken) => {
57
57
  await client.account.rejectInvite(invite.id);
58
58
  const remainingInvites = invites.filter((i) => i.id !== invite.id);
59
59
  setInvites(remainingInvites);
@@ -13,6 +13,10 @@ import {
13
13
  } from './ArtifactEditingSurface.js';
14
14
  import type { MarkdownEditingAction } from './CollaborativeMarkdownRenderer.js';
15
15
 
16
+ // Document mode is loaded through React.lazy(). CI transforms many test files concurrently, so the
17
+ // first document-mode test can legitimately take longer than Testing Library's one-second default.
18
+ const LAZY_EDITOR_WAIT = { timeout: 5_000 } as const;
19
+
16
20
  const mocks = vi.hoisted(() => {
17
21
  const getArtifactContent = vi.fn();
18
22
  const updateArtifactContent = vi.fn();
@@ -151,7 +155,7 @@ describe('ArtifactEditingSurface', () => {
151
155
  const user = userEvent.setup();
152
156
  renderSurface({ viewMode: 'document' });
153
157
 
154
- const editor = await screen.findByRole('textbox', { name: 'Markdown document editor' });
158
+ const editor = await screen.findByRole('textbox', { name: 'Markdown document editor' }, LAZY_EDITOR_WAIT);
155
159
  await user.click(editor);
156
160
  await user.type(editor, ' revised');
157
161
 
@@ -174,7 +178,7 @@ describe('ArtifactEditingSurface', () => {
174
178
  onSendMessage: vi.fn(),
175
179
  });
176
180
 
177
- const editor = await screen.findByRole('textbox', { name: 'Markdown document editor' });
181
+ const editor = await screen.findByRole('textbox', { name: 'Markdown document editor' }, LAZY_EDITOR_WAIT);
178
182
  expect(editor.getAttribute('contenteditable')).toBe('false');
179
183
  expect(screen.queryByRole('button', { name: 'Comment on selection' })).toBeNull();
180
184
  });
@@ -188,7 +192,7 @@ describe('ArtifactEditingSurface', () => {
188
192
  toolbarStatus: <span>AI is editing</span>,
189
193
  });
190
194
 
191
- const button = await screen.findByRole('button', { name: 'Send changes to agent' });
195
+ const button = await screen.findByRole('button', { name: 'Send changes to agent' }, LAZY_EDITOR_WAIT);
192
196
  expect(screen.getByRole('toolbar').contains(button)).toBe(true);
193
197
  expect(button.previousElementSibling?.textContent).toBe('AI is editing');
194
198
  expect(button).toHaveProperty('disabled', false);
@@ -203,7 +207,7 @@ describe('ArtifactEditingSurface', () => {
203
207
  > = { current: null };
204
208
  renderSurface({ viewMode: 'document', flushChangesRef });
205
209
 
206
- const editor = await screen.findByRole('textbox', { name: 'Markdown document editor' });
210
+ const editor = await screen.findByRole('textbox', { name: 'Markdown document editor' }, LAZY_EDITOR_WAIT);
207
211
  await user.click(editor);
208
212
  await user.type(editor, ' immediate');
209
213
 
@@ -228,7 +232,7 @@ describe('ArtifactEditingSurface', () => {
228
232
  });
229
233
  const view = renderSurface({ viewMode: 'document' });
230
234
 
231
- fireEvent.click(await screen.findByRole('button', { name: 'Edit Markdown source' }));
235
+ fireEvent.click(await screen.findByRole('button', { name: 'Edit Markdown source' }, LAZY_EDITOR_WAIT));
232
236
  const sourceEditor = screen.getByRole('textbox', { name: 'Markdown source editor' });
233
237
  fireEvent.focus(sourceEditor);
234
238
  fireEvent.change(sourceEditor, {
@@ -249,7 +253,7 @@ describe('ArtifactEditingSurface', () => {
249
253
  it('shows a navigable ruler for changes from the original document', async () => {
250
254
  renderSurface({ viewMode: 'document', baselineContent: 'Different paragraph.' });
251
255
 
252
- await screen.findByRole('textbox', { name: 'Markdown document editor' });
256
+ await screen.findByRole('textbox', { name: 'Markdown document editor' }, LAZY_EDITOR_WAIT);
253
257
  expect(screen.getByRole('navigation', { name: 'Change ruler' })).not.toBeNull();
254
258
  expect(screen.getByRole('button', { name: 'Change near line 1' })).not.toBeNull();
255
259
  });
@@ -257,7 +261,7 @@ describe('ArtifactEditingSurface', () => {
257
261
  it('keeps the focused editor base generation when the agent refreshes the artifact', async () => {
258
262
  const user = userEvent.setup();
259
263
  const view = renderSurface({ viewMode: 'document' });
260
- const editor = await screen.findByRole('textbox', { name: 'Markdown document editor' });
264
+ const editor = await screen.findByRole('textbox', { name: 'Markdown document editor' }, LAZY_EDITOR_WAIT);
261
265
  await user.click(editor);
262
266
 
263
267
  mocks.getArtifactContent.mockResolvedValueOnce({
@@ -311,7 +315,7 @@ describe('ArtifactEditingSurface', () => {
311
315
  .mockResolvedValueOnce({ path: 'drafts/document.md', generation: 'generation-merged' });
312
316
 
313
317
  const view = renderSurface({ viewMode: 'document' });
314
- const editor = await screen.findByRole('textbox', { name: 'Markdown document editor' });
318
+ const editor = await screen.findByRole('textbox', { name: 'Markdown document editor' }, LAZY_EDITOR_WAIT);
315
319
  await user.click(editor);
316
320
 
317
321
  view.rerender(
@@ -363,7 +367,7 @@ describe('ArtifactEditingSurface', () => {
363
367
  mocks.updateArtifactContent.mockRejectedValueOnce({ status: 412 });
364
368
  renderSurface({ viewMode: 'document' });
365
369
 
366
- const editor = await screen.findByRole('textbox', { name: 'Markdown document editor' });
370
+ const editor = await screen.findByRole('textbox', { name: 'Markdown document editor' }, LAZY_EDITOR_WAIT);
367
371
  await user.click(editor);
368
372
  await user.type(editor, ' local edit');
369
373