lemma-sdk 0.2.32 → 0.2.34
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.
- package/README.md +190 -54
- package/dist/browser/lemma-client.js +84 -14
- package/dist/index.d.ts +3 -1
- package/dist/index.js +2 -1
- package/dist/namespaces/desks.d.ts +5 -2
- package/dist/namespaces/desks.js +5 -2
- package/dist/namespaces/files.d.ts +11 -0
- package/dist/namespaces/files.js +12 -0
- package/dist/namespaces/pod-surfaces.js +1 -1
- package/dist/namespaces/workflows.d.ts +1 -1
- package/dist/openapi_client/index.d.ts +50 -12
- package/dist/openapi_client/index.js +10 -2
- package/dist/openapi_client/models/AdminConsentInfoResponse.d.ts +6 -0
- package/dist/openapi_client/models/AssistantSurfaceResponse.d.ts +16 -1
- package/dist/openapi_client/models/AssistantSurfaceStatus.d.ts +5 -0
- package/dist/openapi_client/models/AssistantSurfaceStatus.js +10 -0
- package/dist/openapi_client/models/ConversationMessageResponse.d.ts +4 -0
- package/dist/openapi_client/models/ConversationResponse.d.ts +3 -0
- package/dist/openapi_client/models/ConversationType.d.ts +8 -0
- package/dist/openapi_client/models/ConversationType.js +13 -0
- package/dist/openapi_client/models/CreateSurfaceRequest.d.ts +16 -5
- package/dist/openapi_client/models/{DataStoreFlowStart.d.ts → DataStoreFlowStartInput.d.ts} +1 -1
- package/dist/openapi_client/models/DataStoreFlowStartOutput.d.ts +11 -0
- package/dist/openapi_client/models/DataStoreWorkflowStartInput.d.ts +11 -0
- package/dist/openapi_client/models/DataStoreWorkflowStartOutput.d.ts +11 -0
- package/dist/openapi_client/models/DeskBundleUploadRequest.d.ts +1 -1
- package/dist/openapi_client/models/{EventFlowStart.d.ts → EventFlowStartInput.d.ts} +1 -1
- package/dist/openapi_client/models/EventFlowStartOutput.d.ts +19 -0
- package/dist/openapi_client/models/EventWorkflowStartInput.d.ts +11 -0
- package/dist/openapi_client/models/EventWorkflowStartOutput.d.ts +11 -0
- package/dist/openapi_client/models/FlowInstallResponse.d.ts +15 -0
- package/dist/openapi_client/models/FlowResponse.d.ts +5 -2
- package/dist/openapi_client/models/GmailSurfaceConfig.d.ts +7 -0
- package/dist/openapi_client/models/GmailSurfaceConfig.js +1 -0
- package/dist/openapi_client/models/GmailSurfaceConfigInput.d.ts +4 -0
- package/dist/openapi_client/models/GmailSurfaceConfigInput.js +1 -0
- package/dist/openapi_client/models/GrantPermissionRequest.d.ts +6 -0
- package/dist/openapi_client/models/GrantPermissionRequest.js +1 -0
- package/dist/openapi_client/models/ManualWorkflowStartInput.d.ts +10 -0
- package/dist/openapi_client/models/ManualWorkflowStartInput.js +1 -0
- package/dist/openapi_client/models/ManualWorkflowStartOutput.d.ts +10 -0
- package/dist/openapi_client/models/ManualWorkflowStartOutput.js +1 -0
- package/dist/openapi_client/models/OrganizationInvitationRequest.d.ts +2 -0
- package/dist/openapi_client/models/OrganizationInvitationResponse.d.ts +2 -0
- package/dist/openapi_client/models/OutlookSurfaceConfig.d.ts +7 -0
- package/dist/openapi_client/models/OutlookSurfaceConfig.js +1 -0
- package/dist/openapi_client/models/OutlookSurfaceConfigInput.d.ts +4 -0
- package/dist/openapi_client/models/OutlookSurfaceConfigInput.js +1 -0
- package/dist/openapi_client/models/ResourcePermissionListResponse.d.ts +4 -0
- package/dist/openapi_client/models/ResourcePermissionListResponse.js +1 -0
- package/dist/openapi_client/models/ResourcePermissionResponse.d.ts +12 -0
- package/dist/openapi_client/models/ResourcePermissionResponse.js +1 -0
- package/dist/openapi_client/models/{ScheduledFlowStart.d.ts → ScheduledFlowStartInput.d.ts} +1 -1
- package/dist/openapi_client/models/ScheduledFlowStartInput.js +1 -0
- package/dist/openapi_client/models/ScheduledFlowStartOutput.d.ts +7 -0
- package/dist/openapi_client/models/ScheduledFlowStartOutput.js +1 -0
- package/dist/openapi_client/models/ScheduledWorkflowStartInput.d.ts +11 -0
- package/dist/openapi_client/models/ScheduledWorkflowStartInput.js +1 -0
- package/dist/openapi_client/models/ScheduledWorkflowStartOutput.d.ts +11 -0
- package/dist/openapi_client/models/ScheduledWorkflowStartOutput.js +1 -0
- package/dist/openapi_client/models/SetVisibilityRequest.d.ts +3 -0
- package/dist/openapi_client/models/SetVisibilityRequest.js +1 -0
- package/dist/openapi_client/models/SlackCredentialsInput.d.ts +5 -0
- package/dist/openapi_client/models/SlackCredentialsInput.js +1 -0
- package/dist/openapi_client/models/SlackSurfaceConfig.d.ts +10 -0
- package/dist/openapi_client/models/SlackSurfaceConfig.js +1 -0
- package/dist/openapi_client/models/{SlackSurfaceConfigCreate.d.ts → SlackSurfaceConfigInput.d.ts} +1 -1
- package/dist/openapi_client/models/SlackSurfaceConfigInput.js +1 -0
- package/dist/openapi_client/models/SurfaceCredentialMode.d.ts +4 -0
- package/dist/openapi_client/models/SurfaceCredentialMode.js +9 -0
- package/dist/openapi_client/models/SurfaceIntegrationSetupGuide.d.ts +13 -0
- package/dist/openapi_client/models/SurfaceIntegrationSetupGuide.js +1 -0
- package/dist/openapi_client/models/SurfacePlatform.d.ts +8 -0
- package/dist/openapi_client/models/SurfacePlatform.js +13 -0
- package/dist/openapi_client/models/SurfacePlatformSetupGuideResponse.d.ts +9 -0
- package/dist/openapi_client/models/SurfacePlatformSetupGuideResponse.js +1 -0
- package/dist/openapi_client/models/SurfaceRoutingScope.d.ts +4 -0
- package/dist/openapi_client/models/SurfaceRoutingScope.js +9 -0
- package/dist/openapi_client/models/SurfaceSetupField.d.ts +10 -0
- package/dist/openapi_client/models/SurfaceSetupField.js +1 -0
- package/dist/openapi_client/models/SurfaceSetupFieldSource.d.ts +4 -0
- package/dist/openapi_client/models/SurfaceSetupFieldSource.js +9 -0
- package/dist/openapi_client/models/SurfaceSetupMode.d.ts +5 -0
- package/dist/openapi_client/models/SurfaceSetupMode.js +10 -0
- package/dist/openapi_client/models/SurfaceSetupPhase.d.ts +6 -0
- package/dist/openapi_client/models/SurfaceSetupPhase.js +11 -0
- package/dist/openapi_client/models/SurfaceSetupStep.d.ts +6 -0
- package/dist/openapi_client/models/SurfaceSetupStep.js +1 -0
- package/dist/openapi_client/models/SurfaceWebhookMode.d.ts +4 -0
- package/dist/openapi_client/models/SurfaceWebhookMode.js +9 -0
- package/dist/openapi_client/models/TeamsCredentialsInput.d.ts +6 -0
- package/dist/openapi_client/models/TeamsCredentialsInput.js +1 -0
- package/dist/openapi_client/models/TeamsSurfaceConfig.d.ts +9 -0
- package/dist/openapi_client/models/TeamsSurfaceConfig.js +1 -0
- package/dist/openapi_client/models/{TeamsSurfaceConfigCreate.d.ts → TeamsSurfaceConfigInput.d.ts} +1 -1
- package/dist/openapi_client/models/TeamsSurfaceConfigInput.js +1 -0
- package/dist/openapi_client/models/TelegramCredentialsInput.d.ts +5 -0
- package/dist/openapi_client/models/TelegramCredentialsInput.js +1 -0
- package/dist/openapi_client/models/TelegramSurfaceConfig.d.ts +6 -0
- package/dist/openapi_client/models/TelegramSurfaceConfig.js +1 -0
- package/dist/openapi_client/models/TelegramSurfaceConfigInput.d.ts +6 -0
- package/dist/openapi_client/models/TelegramSurfaceConfigInput.js +1 -0
- package/dist/openapi_client/models/UpdateSurfaceRequest.d.ts +17 -5
- package/dist/openapi_client/models/WhatsAppCredentialsInput.d.ts +8 -0
- package/dist/openapi_client/models/WhatsAppCredentialsInput.js +1 -0
- package/dist/openapi_client/models/WhatsAppSurfaceConfig.d.ts +6 -0
- package/dist/openapi_client/models/WhatsAppSurfaceConfig.js +1 -0
- package/dist/openapi_client/models/WhatsAppSurfaceConfigInput.d.ts +6 -0
- package/dist/openapi_client/models/WhatsAppSurfaceConfigInput.js +1 -0
- package/dist/openapi_client/models/WorkflowCreateRequest.d.ts +5 -2
- package/dist/openapi_client/models/WorkflowGraphUpdateRequest.d.ts +5 -2
- package/dist/openapi_client/models/WorkflowUpdateRequest.d.ts +5 -2
- package/dist/openapi_client/services/AssistantSurfacesIngressService.d.ts +51 -0
- package/dist/openapi_client/services/AssistantSurfacesIngressService.js +111 -0
- package/dist/openapi_client/services/AssistantSurfacesService.d.ts +27 -6
- package/dist/openapi_client/services/AssistantSurfacesService.js +62 -7
- package/dist/openapi_client/services/AuthorizationService.d.ts +47 -0
- package/dist/openapi_client/services/AuthorizationService.js +100 -0
- package/dist/openapi_client/services/DesksService.d.ts +2 -2
- package/dist/openapi_client/services/DesksService.js +3 -3
- package/dist/openapi_client/services/WorkflowsService.d.ts +3 -3
- package/dist/openapi_client/services/WorkflowsService.js +1 -1
- package/dist/react/index.d.ts +16 -0
- package/dist/react/index.js +8 -0
- package/dist/react/useAddPodMember.d.ts +22 -0
- package/dist/react/useAddPodMember.js +51 -0
- package/dist/react/useAssistantController.js +82 -37
- package/dist/react/useAssistantRuntime.js +8 -4
- package/dist/react/useAssistantSession.js +44 -2
- package/dist/react/useConversationMessages.js +19 -2
- package/dist/react/useFile.d.ts +18 -0
- package/dist/react/useFile.js +58 -0
- package/dist/react/useFilePreview.d.ts +23 -0
- package/dist/react/useFilePreview.js +76 -0
- package/dist/react/useFileSearch.d.ts +26 -0
- package/dist/react/useFileSearch.js +64 -0
- package/dist/react/useFileTree.d.ts +21 -0
- package/dist/react/useFileTree.js +59 -0
- package/dist/react/useFiles.d.ts +29 -0
- package/dist/react/useFiles.js +90 -0
- package/dist/react/useRecords.js +8 -5
- package/dist/react/useRemovePodMember.d.ts +19 -0
- package/dist/react/useRemovePodMember.js +50 -0
- package/dist/react/useUpdatePodMemberRole.d.ts +20 -0
- package/dist/react/useUpdatePodMemberRole.js +50 -0
- package/dist/react/useWorkflowStart.d.ts +2 -2
- package/dist/record-display.d.ts +20 -0
- package/dist/record-display.js +78 -0
- package/dist/record-form.d.ts +4 -0
- package/dist/record-form.js +16 -0
- package/dist/types.d.ts +8 -1
- package/package.json +2 -1
- package/dist/openapi_client/models/EmailSurfaceConfigCreate.d.ts +0 -5
- package/dist/openapi_client/models/FlowInstallEntity.d.ts +0 -16
- package/dist/openapi_client/models/FlowStartType.d.ts +0 -6
- package/dist/openapi_client/models/FlowStartType.js +0 -11
- package/dist/openapi_client/models/FlowStart_Input.d.ts +0 -14
- package/dist/openapi_client/models/FlowStart_Output.d.ts +0 -14
- package/dist/openapi_client/models/WhatsAppSurfaceConfigCreate.d.ts +0 -5
- package/dist/openapi_client/services/PublicDesksService.d.ts +0 -10
- package/dist/openapi_client/services/PublicDesksService.js +0 -22
- /package/dist/openapi_client/models/{DataStoreFlowStart.js → AdminConsentInfoResponse.js} +0 -0
- /package/dist/openapi_client/models/{EmailSurfaceConfigCreate.js → DataStoreFlowStartInput.js} +0 -0
- /package/dist/openapi_client/models/{EventFlowStart.js → DataStoreFlowStartOutput.js} +0 -0
- /package/dist/openapi_client/models/{FlowInstallEntity.js → DataStoreWorkflowStartInput.js} +0 -0
- /package/dist/openapi_client/models/{FlowStart_Input.js → DataStoreWorkflowStartOutput.js} +0 -0
- /package/dist/openapi_client/models/{FlowStart_Output.js → EventFlowStartInput.js} +0 -0
- /package/dist/openapi_client/models/{ScheduledFlowStart.js → EventFlowStartOutput.js} +0 -0
- /package/dist/openapi_client/models/{SlackSurfaceConfigCreate.js → EventWorkflowStartInput.js} +0 -0
- /package/dist/openapi_client/models/{TeamsSurfaceConfigCreate.js → EventWorkflowStartOutput.js} +0 -0
- /package/dist/openapi_client/models/{WhatsAppSurfaceConfigCreate.js → FlowInstallResponse.js} +0 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
2
|
+
import { normalizeError, resolvePodClient } from "./utils.js";
|
|
3
|
+
export function useFileSearch({ client, podId, query = "", enabled = true, autoLoad = true, minQueryLength = 1, limit = 10, searchMethod, }) {
|
|
4
|
+
const [response, setResponse] = useState(null);
|
|
5
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
6
|
+
const [error, setError] = useState(null);
|
|
7
|
+
const trimmedQuery = query.trim();
|
|
8
|
+
const reset = useCallback(() => {
|
|
9
|
+
setResponse(null);
|
|
10
|
+
setError(null);
|
|
11
|
+
setIsLoading(false);
|
|
12
|
+
}, []);
|
|
13
|
+
const search = useCallback(async (overrides = {}, signal) => {
|
|
14
|
+
const nextQuery = (overrides.query ?? trimmedQuery).trim();
|
|
15
|
+
if (!enabled || nextQuery.length < minQueryLength) {
|
|
16
|
+
reset();
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
setIsLoading(true);
|
|
20
|
+
setError(null);
|
|
21
|
+
try {
|
|
22
|
+
const scopedClient = resolvePodClient(client, podId);
|
|
23
|
+
const nextResponse = await scopedClient.files.search(nextQuery, {
|
|
24
|
+
limit: overrides.limit ?? limit,
|
|
25
|
+
searchMethod: overrides.searchMethod ?? searchMethod,
|
|
26
|
+
});
|
|
27
|
+
if (signal?.aborted)
|
|
28
|
+
return null;
|
|
29
|
+
setResponse(nextResponse);
|
|
30
|
+
return nextResponse;
|
|
31
|
+
}
|
|
32
|
+
catch (searchError) {
|
|
33
|
+
if (signal?.aborted)
|
|
34
|
+
return null;
|
|
35
|
+
setError(normalizeError(searchError, "Failed to search files."));
|
|
36
|
+
setResponse(null);
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
if (!signal?.aborted)
|
|
41
|
+
setIsLoading(false);
|
|
42
|
+
}
|
|
43
|
+
}, [client, enabled, limit, minQueryLength, podId, reset, searchMethod, trimmedQuery]);
|
|
44
|
+
useEffect(() => {
|
|
45
|
+
if (!enabled || !autoLoad)
|
|
46
|
+
return;
|
|
47
|
+
if (trimmedQuery.length < minQueryLength) {
|
|
48
|
+
reset();
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const controller = new AbortController();
|
|
52
|
+
void search({}, controller.signal);
|
|
53
|
+
return () => controller.abort();
|
|
54
|
+
}, [autoLoad, enabled, minQueryLength, reset, search, trimmedQuery]);
|
|
55
|
+
return useMemo(() => ({
|
|
56
|
+
response,
|
|
57
|
+
results: response?.results ?? [],
|
|
58
|
+
totalResults: response?.total_results ?? 0,
|
|
59
|
+
isLoading,
|
|
60
|
+
error,
|
|
61
|
+
search,
|
|
62
|
+
reset,
|
|
63
|
+
}), [error, isLoading, reset, response, search]);
|
|
64
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { LemmaClient } from "../client.js";
|
|
2
|
+
import type { DirectoryTreeNode, DirectoryTreeResponse } from "../types.js";
|
|
3
|
+
export interface UseFileTreeOptions {
|
|
4
|
+
client: LemmaClient;
|
|
5
|
+
podId?: string;
|
|
6
|
+
enabled?: boolean;
|
|
7
|
+
autoLoad?: boolean;
|
|
8
|
+
rootPath?: string;
|
|
9
|
+
filesPerDirectory?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface UseFileTreeResult {
|
|
12
|
+
tree: DirectoryTreeNode | null;
|
|
13
|
+
response: DirectoryTreeResponse | null;
|
|
14
|
+
isLoading: boolean;
|
|
15
|
+
error: Error | null;
|
|
16
|
+
refresh: (overrides?: {
|
|
17
|
+
rootPath?: string;
|
|
18
|
+
filesPerDirectory?: number;
|
|
19
|
+
}) => Promise<DirectoryTreeResponse | null>;
|
|
20
|
+
}
|
|
21
|
+
export declare function useFileTree({ client, podId, enabled, autoLoad, rootPath, filesPerDirectory, }: UseFileTreeOptions): UseFileTreeResult;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
2
|
+
import { normalizeError, resolvePodClient } from "./utils.js";
|
|
3
|
+
export function useFileTree({ client, podId, enabled = true, autoLoad = true, rootPath = "/", filesPerDirectory = 3, }) {
|
|
4
|
+
const [response, setResponse] = useState(null);
|
|
5
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
6
|
+
const [error, setError] = useState(null);
|
|
7
|
+
const refresh = useCallback(async (overrides = {}, signal) => {
|
|
8
|
+
if (!enabled) {
|
|
9
|
+
setResponse(null);
|
|
10
|
+
setError(null);
|
|
11
|
+
setIsLoading(false);
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
setIsLoading(true);
|
|
15
|
+
setError(null);
|
|
16
|
+
try {
|
|
17
|
+
const scopedClient = resolvePodClient(client, podId);
|
|
18
|
+
const nextResponse = await scopedClient.files.tree({
|
|
19
|
+
rootPath: overrides.rootPath ?? rootPath,
|
|
20
|
+
filesPerDirectory: overrides.filesPerDirectory ?? filesPerDirectory,
|
|
21
|
+
});
|
|
22
|
+
if (signal?.aborted)
|
|
23
|
+
return null;
|
|
24
|
+
setResponse(nextResponse);
|
|
25
|
+
return nextResponse;
|
|
26
|
+
}
|
|
27
|
+
catch (refreshError) {
|
|
28
|
+
if (signal?.aborted)
|
|
29
|
+
return null;
|
|
30
|
+
setError(normalizeError(refreshError, "Failed to load file tree."));
|
|
31
|
+
setResponse(null);
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
finally {
|
|
35
|
+
if (!signal?.aborted)
|
|
36
|
+
setIsLoading(false);
|
|
37
|
+
}
|
|
38
|
+
}, [client, enabled, filesPerDirectory, podId, rootPath]);
|
|
39
|
+
useEffect(() => {
|
|
40
|
+
if (!enabled) {
|
|
41
|
+
setResponse(null);
|
|
42
|
+
setError(null);
|
|
43
|
+
setIsLoading(false);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (!autoLoad)
|
|
47
|
+
return;
|
|
48
|
+
const controller = new AbortController();
|
|
49
|
+
void refresh({}, controller.signal);
|
|
50
|
+
return () => controller.abort();
|
|
51
|
+
}, [autoLoad, enabled, refresh]);
|
|
52
|
+
return useMemo(() => ({
|
|
53
|
+
tree: response?.tree ?? null,
|
|
54
|
+
response,
|
|
55
|
+
isLoading,
|
|
56
|
+
error,
|
|
57
|
+
refresh,
|
|
58
|
+
}), [error, isLoading, refresh, response]);
|
|
59
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { LemmaClient } from "../client.js";
|
|
2
|
+
import type { FileResponse } from "../types.js";
|
|
3
|
+
export interface UseFilesOptions {
|
|
4
|
+
client: LemmaClient;
|
|
5
|
+
podId?: string;
|
|
6
|
+
enabled?: boolean;
|
|
7
|
+
autoLoad?: boolean;
|
|
8
|
+
limit?: number;
|
|
9
|
+
pageToken?: string;
|
|
10
|
+
directoryPath?: string;
|
|
11
|
+
parentId?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface UseFilesResult {
|
|
14
|
+
files: FileResponse[];
|
|
15
|
+
nextPageToken: string | null;
|
|
16
|
+
isLoading: boolean;
|
|
17
|
+
isLoadingMore: boolean;
|
|
18
|
+
error: Error | null;
|
|
19
|
+
refresh: (overrides?: {
|
|
20
|
+
limit?: number;
|
|
21
|
+
pageToken?: string;
|
|
22
|
+
directoryPath?: string;
|
|
23
|
+
parentId?: string;
|
|
24
|
+
}) => Promise<FileResponse[]>;
|
|
25
|
+
loadMore: (overrides?: {
|
|
26
|
+
limit?: number;
|
|
27
|
+
}) => Promise<FileResponse[]>;
|
|
28
|
+
}
|
|
29
|
+
export declare function useFiles({ client, podId, enabled, autoLoad, limit, pageToken, directoryPath, parentId, }: UseFilesOptions): UseFilesResult;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
2
|
+
import { normalizeError, resolvePodClient } from "./utils.js";
|
|
3
|
+
export function useFiles({ client, podId, enabled = true, autoLoad = true, limit = 100, pageToken, directoryPath = "/", parentId, }) {
|
|
4
|
+
const [files, setFiles] = useState([]);
|
|
5
|
+
const [nextPageToken, setNextPageToken] = useState(null);
|
|
6
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
7
|
+
const [isLoadingMore, setIsLoadingMore] = useState(false);
|
|
8
|
+
const [error, setError] = useState(null);
|
|
9
|
+
const refresh = useCallback(async (overrides = {}, signal) => {
|
|
10
|
+
if (!enabled)
|
|
11
|
+
return [];
|
|
12
|
+
setIsLoading(true);
|
|
13
|
+
setError(null);
|
|
14
|
+
try {
|
|
15
|
+
const scopedClient = resolvePodClient(client, podId);
|
|
16
|
+
const response = await scopedClient.files.list({
|
|
17
|
+
limit: overrides.limit ?? limit,
|
|
18
|
+
pageToken: overrides.pageToken ?? pageToken,
|
|
19
|
+
directoryPath: overrides.directoryPath ?? directoryPath,
|
|
20
|
+
parentId: overrides.parentId ?? parentId,
|
|
21
|
+
});
|
|
22
|
+
if (signal?.aborted)
|
|
23
|
+
return [];
|
|
24
|
+
const nextFiles = response.items ?? [];
|
|
25
|
+
setFiles(nextFiles);
|
|
26
|
+
setNextPageToken(response.next_page_token ?? null);
|
|
27
|
+
return nextFiles;
|
|
28
|
+
}
|
|
29
|
+
catch (refreshError) {
|
|
30
|
+
if (signal?.aborted)
|
|
31
|
+
return [];
|
|
32
|
+
setError(normalizeError(refreshError, "Failed to load files."));
|
|
33
|
+
return [];
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
if (!signal?.aborted)
|
|
37
|
+
setIsLoading(false);
|
|
38
|
+
}
|
|
39
|
+
}, [client, directoryPath, enabled, limit, pageToken, parentId, podId]);
|
|
40
|
+
const loadMore = useCallback(async (overrides = {}) => {
|
|
41
|
+
if (!enabled || !nextPageToken || isLoading || isLoadingMore)
|
|
42
|
+
return [];
|
|
43
|
+
setIsLoadingMore(true);
|
|
44
|
+
setError(null);
|
|
45
|
+
try {
|
|
46
|
+
const scopedClient = resolvePodClient(client, podId);
|
|
47
|
+
const response = await scopedClient.files.list({
|
|
48
|
+
limit: overrides.limit ?? limit,
|
|
49
|
+
pageToken: nextPageToken,
|
|
50
|
+
directoryPath,
|
|
51
|
+
parentId,
|
|
52
|
+
});
|
|
53
|
+
const moreFiles = response.items ?? [];
|
|
54
|
+
setFiles((previous) => [...previous, ...moreFiles]);
|
|
55
|
+
setNextPageToken(response.next_page_token ?? null);
|
|
56
|
+
return moreFiles;
|
|
57
|
+
}
|
|
58
|
+
catch (loadError) {
|
|
59
|
+
setError(normalizeError(loadError, "Failed to load more files."));
|
|
60
|
+
return [];
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
setIsLoadingMore(false);
|
|
64
|
+
}
|
|
65
|
+
}, [client, directoryPath, enabled, isLoading, isLoadingMore, limit, nextPageToken, parentId, podId]);
|
|
66
|
+
useEffect(() => {
|
|
67
|
+
if (!enabled) {
|
|
68
|
+
setFiles([]);
|
|
69
|
+
setNextPageToken(null);
|
|
70
|
+
setError(null);
|
|
71
|
+
setIsLoading(false);
|
|
72
|
+
setIsLoadingMore(false);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (!autoLoad)
|
|
76
|
+
return;
|
|
77
|
+
const controller = new AbortController();
|
|
78
|
+
void refresh({}, controller.signal);
|
|
79
|
+
return () => controller.abort();
|
|
80
|
+
}, [autoLoad, enabled, refresh]);
|
|
81
|
+
return useMemo(() => ({
|
|
82
|
+
files,
|
|
83
|
+
nextPageToken,
|
|
84
|
+
isLoading,
|
|
85
|
+
isLoadingMore,
|
|
86
|
+
error,
|
|
87
|
+
refresh,
|
|
88
|
+
loadMore,
|
|
89
|
+
}), [error, files, isLoading, isLoadingMore, loadMore, nextPageToken, refresh]);
|
|
90
|
+
}
|
package/dist/react/useRecords.js
CHANGED
|
@@ -72,7 +72,10 @@ export function useRecords({ client, podId, tableName, filters, sort, limit = 20
|
|
|
72
72
|
trimmedTableName,
|
|
73
73
|
]);
|
|
74
74
|
const loadMore = useCallback(async (overrides = {}) => {
|
|
75
|
-
|
|
75
|
+
const loadedCount = records.length;
|
|
76
|
+
const canLoadWithCursor = Boolean(nextPageToken);
|
|
77
|
+
const canLoadWithOffset = loadedCount < total;
|
|
78
|
+
if (!isEnabled || isLoading || isLoadingMore || (!canLoadWithCursor && !canLoadWithOffset)) {
|
|
76
79
|
return [];
|
|
77
80
|
}
|
|
78
81
|
setIsLoadingMore(true);
|
|
@@ -83,15 +86,15 @@ export function useRecords({ client, podId, tableName, filters, sort, limit = 20
|
|
|
83
86
|
filters: stableFilters,
|
|
84
87
|
sort: stableSort,
|
|
85
88
|
limit: overrides.limit ?? limit,
|
|
86
|
-
pageToken: nextPageToken,
|
|
87
|
-
offset: overrides.offset,
|
|
89
|
+
pageToken: overrides.pageToken ?? nextPageToken ?? undefined,
|
|
90
|
+
offset: overrides.offset ?? (nextPageToken ? undefined : (offset ?? 0) + loadedCount),
|
|
88
91
|
sortBy: overrides.sortBy ?? sortBy,
|
|
89
92
|
order: overrides.order ?? order,
|
|
90
93
|
params: overrides.params ?? stableParams,
|
|
91
94
|
});
|
|
92
95
|
const moreRecords = (response.items ?? []);
|
|
93
96
|
setRecords((previous) => [...previous, ...moreRecords]);
|
|
94
|
-
setTotal(response.total ??
|
|
97
|
+
setTotal(response.total ?? loadedCount + moreRecords.length);
|
|
95
98
|
setNextPageToken(response.next_page_token ?? null);
|
|
96
99
|
return moreRecords;
|
|
97
100
|
}
|
|
@@ -103,7 +106,7 @@ export function useRecords({ client, podId, tableName, filters, sort, limit = 20
|
|
|
103
106
|
finally {
|
|
104
107
|
setIsLoadingMore(false);
|
|
105
108
|
}
|
|
106
|
-
}, [client, isEnabled, isLoading, isLoadingMore, limit, nextPageToken, offset, order, podId, records.length, sortBy, stableFilters, stableParams, stableSort, trimmedTableName]);
|
|
109
|
+
}, [client, isEnabled, isLoading, isLoadingMore, limit, nextPageToken, offset, order, podId, records.length, sortBy, stableFilters, stableParams, stableSort, total, trimmedTableName]);
|
|
107
110
|
useEffect(() => {
|
|
108
111
|
if (!isEnabled) {
|
|
109
112
|
setRecords([]);
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { LemmaClient } from "../client.js";
|
|
2
|
+
export interface UseRemovePodMemberOptions {
|
|
3
|
+
client: LemmaClient;
|
|
4
|
+
podId?: string;
|
|
5
|
+
memberId?: string | null;
|
|
6
|
+
enabled?: boolean;
|
|
7
|
+
onSuccess?: (memberId: string) => void;
|
|
8
|
+
onError?: (error: unknown) => void;
|
|
9
|
+
}
|
|
10
|
+
export interface UseRemovePodMemberResult {
|
|
11
|
+
removedMemberId: string | null;
|
|
12
|
+
isSubmitting: boolean;
|
|
13
|
+
error: Error | null;
|
|
14
|
+
remove: (overrides?: {
|
|
15
|
+
memberId?: string | null;
|
|
16
|
+
}) => Promise<boolean>;
|
|
17
|
+
reset: () => void;
|
|
18
|
+
}
|
|
19
|
+
export declare function useRemovePodMember({ client, podId, memberId, enabled, onSuccess, onError, }: UseRemovePodMemberOptions): UseRemovePodMemberResult;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
2
|
+
import { normalizeError, resolvePodId } from "./utils.js";
|
|
3
|
+
export function useRemovePodMember({ client, podId, memberId = null, enabled = true, onSuccess, onError, }) {
|
|
4
|
+
const [removedMemberId, setRemovedMemberId] = useState(null);
|
|
5
|
+
const [isSubmitting, setIsSubmitting] = useState(false);
|
|
6
|
+
const [error, setError] = useState(null);
|
|
7
|
+
const onSuccessRef = useRef(onSuccess);
|
|
8
|
+
const onErrorRef = useRef(onError);
|
|
9
|
+
useEffect(() => { onSuccessRef.current = onSuccess; }, [onSuccess]);
|
|
10
|
+
useEffect(() => { onErrorRef.current = onError; }, [onError]);
|
|
11
|
+
const trimmedMemberId = typeof memberId === "string" ? memberId.trim() : "";
|
|
12
|
+
const remove = useCallback(async (overrides = {}) => {
|
|
13
|
+
const nextMemberId = typeof overrides.memberId === "string"
|
|
14
|
+
? overrides.memberId.trim()
|
|
15
|
+
: trimmedMemberId;
|
|
16
|
+
if (!enabled || nextMemberId.length === 0) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
setIsSubmitting(true);
|
|
20
|
+
setError(null);
|
|
21
|
+
try {
|
|
22
|
+
const resolvedPodId = resolvePodId(client, podId);
|
|
23
|
+
await client.podMembers.remove(resolvedPodId, nextMemberId);
|
|
24
|
+
setRemovedMemberId(nextMemberId);
|
|
25
|
+
onSuccessRef.current?.(nextMemberId);
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
catch (mutationError) {
|
|
29
|
+
const normalized = normalizeError(mutationError, "Failed to remove pod member.");
|
|
30
|
+
setError(normalized);
|
|
31
|
+
onErrorRef.current?.(mutationError);
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
finally {
|
|
35
|
+
setIsSubmitting(false);
|
|
36
|
+
}
|
|
37
|
+
}, [client, enabled, podId, trimmedMemberId]);
|
|
38
|
+
const reset = useCallback(() => {
|
|
39
|
+
setRemovedMemberId(null);
|
|
40
|
+
setError(null);
|
|
41
|
+
setIsSubmitting(false);
|
|
42
|
+
}, []);
|
|
43
|
+
return useMemo(() => ({
|
|
44
|
+
removedMemberId,
|
|
45
|
+
isSubmitting,
|
|
46
|
+
error,
|
|
47
|
+
remove,
|
|
48
|
+
reset,
|
|
49
|
+
}), [error, isSubmitting, remove, removedMemberId, reset]);
|
|
50
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { LemmaClient } from "../client.js";
|
|
2
|
+
import type { PodMember, PodRole } from "../types.js";
|
|
3
|
+
export interface UseUpdatePodMemberRoleOptions {
|
|
4
|
+
client: LemmaClient;
|
|
5
|
+
podId?: string;
|
|
6
|
+
memberId?: string | null;
|
|
7
|
+
enabled?: boolean;
|
|
8
|
+
onSuccess?: (member: PodMember) => void;
|
|
9
|
+
onError?: (error: unknown) => void;
|
|
10
|
+
}
|
|
11
|
+
export interface UseUpdatePodMemberRoleResult {
|
|
12
|
+
updatedMember: PodMember | null;
|
|
13
|
+
isSubmitting: boolean;
|
|
14
|
+
error: Error | null;
|
|
15
|
+
updateRole: (role: PodRole, overrides?: {
|
|
16
|
+
memberId?: string | null;
|
|
17
|
+
}) => Promise<PodMember | null>;
|
|
18
|
+
reset: () => void;
|
|
19
|
+
}
|
|
20
|
+
export declare function useUpdatePodMemberRole({ client, podId, memberId, enabled, onSuccess, onError, }: UseUpdatePodMemberRoleOptions): UseUpdatePodMemberRoleResult;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
2
|
+
import { normalizeError, resolvePodId } from "./utils.js";
|
|
3
|
+
export function useUpdatePodMemberRole({ client, podId, memberId = null, enabled = true, onSuccess, onError, }) {
|
|
4
|
+
const [updatedMember, setUpdatedMember] = useState(null);
|
|
5
|
+
const [isSubmitting, setIsSubmitting] = useState(false);
|
|
6
|
+
const [error, setError] = useState(null);
|
|
7
|
+
const onSuccessRef = useRef(onSuccess);
|
|
8
|
+
const onErrorRef = useRef(onError);
|
|
9
|
+
useEffect(() => { onSuccessRef.current = onSuccess; }, [onSuccess]);
|
|
10
|
+
useEffect(() => { onErrorRef.current = onError; }, [onError]);
|
|
11
|
+
const trimmedMemberId = typeof memberId === "string" ? memberId.trim() : "";
|
|
12
|
+
const updateRole = useCallback(async (role, overrides = {}) => {
|
|
13
|
+
const nextMemberId = typeof overrides.memberId === "string"
|
|
14
|
+
? overrides.memberId.trim()
|
|
15
|
+
: trimmedMemberId;
|
|
16
|
+
if (!enabled || nextMemberId.length === 0) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
setIsSubmitting(true);
|
|
20
|
+
setError(null);
|
|
21
|
+
try {
|
|
22
|
+
const resolvedPodId = resolvePodId(client, podId);
|
|
23
|
+
const nextMember = await client.podMembers.updateRole(resolvedPodId, nextMemberId, role);
|
|
24
|
+
setUpdatedMember(nextMember);
|
|
25
|
+
onSuccessRef.current?.(nextMember);
|
|
26
|
+
return nextMember;
|
|
27
|
+
}
|
|
28
|
+
catch (mutationError) {
|
|
29
|
+
const normalized = normalizeError(mutationError, "Failed to update pod member role.");
|
|
30
|
+
setError(normalized);
|
|
31
|
+
onErrorRef.current?.(mutationError);
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
finally {
|
|
35
|
+
setIsSubmitting(false);
|
|
36
|
+
}
|
|
37
|
+
}, [client, enabled, podId, trimmedMemberId]);
|
|
38
|
+
const reset = useCallback(() => {
|
|
39
|
+
setUpdatedMember(null);
|
|
40
|
+
setError(null);
|
|
41
|
+
setIsSubmitting(false);
|
|
42
|
+
}, []);
|
|
43
|
+
return useMemo(() => ({
|
|
44
|
+
updatedMember,
|
|
45
|
+
isSubmitting,
|
|
46
|
+
error,
|
|
47
|
+
updateRole,
|
|
48
|
+
reset,
|
|
49
|
+
}), [error, isSubmitting, reset, updateRole, updatedMember]);
|
|
50
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { LemmaClient } from "../client.js";
|
|
2
|
-
import type { FlowRun,
|
|
2
|
+
import type { FlowRun, Workflow, WorkflowStartType, WorkflowRunInputs } from "../types.js";
|
|
3
3
|
import { type UseFlowSessionResult } from "./useFlowSession.js";
|
|
4
4
|
export interface UseWorkflowStartOptions {
|
|
5
5
|
client: LemmaClient;
|
|
@@ -15,7 +15,7 @@ export interface UseWorkflowStartOptions {
|
|
|
15
15
|
}
|
|
16
16
|
export interface UseWorkflowStartResult extends Omit<UseFlowSessionResult, "start" | "listHistory"> {
|
|
17
17
|
workflow: Workflow | null;
|
|
18
|
-
startType:
|
|
18
|
+
startType: WorkflowStartType | "MANUAL";
|
|
19
19
|
inputSchema: Record<string, unknown> | null;
|
|
20
20
|
inputUiSchema: Record<string, unknown> | null;
|
|
21
21
|
isLoadingWorkflow: boolean;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ColumnSchema } from "./types.js";
|
|
2
|
+
export interface RecordDetailFieldGroupDefinition {
|
|
3
|
+
label: string;
|
|
4
|
+
fields: string[];
|
|
5
|
+
}
|
|
6
|
+
export declare function detectRecordTitleColumn(columns: ColumnSchema[]): ColumnSchema | undefined;
|
|
7
|
+
export declare function detectRecordDescriptionColumn(columns: ColumnSchema[]): ColumnSchema | undefined;
|
|
8
|
+
export declare function detectRecordStatusColumn(columns: ColumnSchema[]): ColumnSchema | undefined;
|
|
9
|
+
export declare function isDefaultRecordDetailHiddenField(name: string): boolean;
|
|
10
|
+
export declare function buildDefaultRecordDetailFieldGroups(columns: ColumnSchema[], options?: {
|
|
11
|
+
hiddenFields?: string[];
|
|
12
|
+
titleField?: string;
|
|
13
|
+
descriptionField?: string;
|
|
14
|
+
statusField?: string;
|
|
15
|
+
identifierField?: string;
|
|
16
|
+
}): RecordDetailFieldGroupDefinition[];
|
|
17
|
+
export declare function humanizeRecordFieldName(value: string): string;
|
|
18
|
+
export declare function formatRecordPlainValue(value: unknown): string;
|
|
19
|
+
export declare function formatRecordDisplayValue(value: unknown): string;
|
|
20
|
+
export declare function formatRecordDateDisplayValue(value: unknown, options?: Intl.DateTimeFormatOptions): string;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
export function detectRecordTitleColumn(columns) {
|
|
2
|
+
return columns.find((column) => !column.system && !column.auto && !column.computed && /title|name|subject|label/i.test(column.name));
|
|
3
|
+
}
|
|
4
|
+
export function detectRecordDescriptionColumn(columns) {
|
|
5
|
+
return columns.find((column) => !column.system
|
|
6
|
+
&& !column.auto
|
|
7
|
+
&& !column.computed
|
|
8
|
+
&& column.type === "TEXT"
|
|
9
|
+
&& /description|summary|body|content|notes|reason/i.test(column.name));
|
|
10
|
+
}
|
|
11
|
+
export function detectRecordStatusColumn(columns) {
|
|
12
|
+
return columns.find((column) => /status|state|stage/i.test(column.name));
|
|
13
|
+
}
|
|
14
|
+
export function isDefaultRecordDetailHiddenField(name) {
|
|
15
|
+
return name === "id" || name === "created_at" || name === "updated_at";
|
|
16
|
+
}
|
|
17
|
+
export function buildDefaultRecordDetailFieldGroups(columns, options = {}) {
|
|
18
|
+
const excluded = new Set([
|
|
19
|
+
...(options.hiddenFields ?? []),
|
|
20
|
+
options.titleField,
|
|
21
|
+
options.descriptionField,
|
|
22
|
+
options.statusField,
|
|
23
|
+
options.identifierField,
|
|
24
|
+
].filter((value) => Boolean(value)));
|
|
25
|
+
const displayable = columns.filter((column) => !column.system
|
|
26
|
+
&& !column.auto
|
|
27
|
+
&& !column.computed
|
|
28
|
+
&& !isDefaultRecordDetailHiddenField(column.name)
|
|
29
|
+
&& !excluded.has(column.name));
|
|
30
|
+
if (displayable.length === 0)
|
|
31
|
+
return [];
|
|
32
|
+
return [
|
|
33
|
+
{
|
|
34
|
+
label: "Details",
|
|
35
|
+
fields: displayable.map((column) => column.name),
|
|
36
|
+
},
|
|
37
|
+
];
|
|
38
|
+
}
|
|
39
|
+
export function humanizeRecordFieldName(value) {
|
|
40
|
+
return value
|
|
41
|
+
.replace(/[_\.]/g, " ")
|
|
42
|
+
.replace(/\s+/g, " ")
|
|
43
|
+
.trim()
|
|
44
|
+
.replace(/\b\w/g, (match) => match.toUpperCase());
|
|
45
|
+
}
|
|
46
|
+
export function formatRecordPlainValue(value) {
|
|
47
|
+
if (value == null || value === "")
|
|
48
|
+
return "";
|
|
49
|
+
if (value instanceof Date)
|
|
50
|
+
return formatRecordDateDisplayValue(value);
|
|
51
|
+
if (typeof value === "boolean")
|
|
52
|
+
return value ? "Yes" : "No";
|
|
53
|
+
if (typeof value === "number")
|
|
54
|
+
return value.toLocaleString();
|
|
55
|
+
if (Array.isArray(value))
|
|
56
|
+
return value.map(formatRecordPlainValue).filter(Boolean).join(", ");
|
|
57
|
+
if (typeof value === "object")
|
|
58
|
+
return JSON.stringify(value);
|
|
59
|
+
return String(value);
|
|
60
|
+
}
|
|
61
|
+
export function formatRecordDisplayValue(value) {
|
|
62
|
+
return formatRecordPlainValue(value) || "Not set";
|
|
63
|
+
}
|
|
64
|
+
export function formatRecordDateDisplayValue(value, options) {
|
|
65
|
+
if (value == null || value === "")
|
|
66
|
+
return "Not set";
|
|
67
|
+
const date = value instanceof Date ? value : new Date(String(value));
|
|
68
|
+
if (Number.isNaN(date.getTime()))
|
|
69
|
+
return String(value);
|
|
70
|
+
return new Intl.DateTimeFormat(undefined, {
|
|
71
|
+
month: "short",
|
|
72
|
+
day: "numeric",
|
|
73
|
+
year: "numeric",
|
|
74
|
+
hour: "numeric",
|
|
75
|
+
minute: "2-digit",
|
|
76
|
+
...options,
|
|
77
|
+
}).format(date);
|
|
78
|
+
}
|
package/dist/record-form.d.ts
CHANGED
|
@@ -22,9 +22,13 @@ export interface BuildRecordPayloadResult {
|
|
|
22
22
|
errors: Record<string, string>;
|
|
23
23
|
isValid: boolean;
|
|
24
24
|
}
|
|
25
|
+
export declare const DEFAULT_RECORD_FORM_HIDDEN_FIELDS: readonly ["id", "created_at", "updated_at", "creator_user_id", "sort_order"];
|
|
25
26
|
export declare function getRecordFieldKind(column: ColumnSchema): RecordSchemaFieldKind;
|
|
26
27
|
export declare function buildRecordSchemaFields(table: Table): RecordSchemaField[];
|
|
27
28
|
export declare function getEditableRecordFields(table: Table): RecordSchemaField[];
|
|
29
|
+
export declare function orderRecordSchemaFields<T extends {
|
|
30
|
+
name: string;
|
|
31
|
+
}>(fields: T[], fieldOrder?: string[]): T[];
|
|
28
32
|
export declare function formatRecordValueForForm(column: ColumnSchema, value: unknown): unknown;
|
|
29
33
|
export declare function buildRecordFormValues(table: Table, values?: Record<string, unknown>): Record<string, unknown>;
|
|
30
34
|
export declare function buildRecordPayload(table: Table, values: Record<string, unknown>, options?: BuildRecordPayloadOptions): BuildRecordPayloadResult;
|
package/dist/record-form.js
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import { parseForeignKeyReference } from "./datastore-query.js";
|
|
2
2
|
import { DatastoreDataType } from "./types.js";
|
|
3
|
+
export const DEFAULT_RECORD_FORM_HIDDEN_FIELDS = [
|
|
4
|
+
"id",
|
|
5
|
+
"created_at",
|
|
6
|
+
"updated_at",
|
|
7
|
+
"creator_user_id",
|
|
8
|
+
"sort_order",
|
|
9
|
+
];
|
|
3
10
|
function sentenceCase(value) {
|
|
4
11
|
return value
|
|
5
12
|
.replace(/_/g, " ")
|
|
@@ -101,6 +108,15 @@ export function buildRecordSchemaFields(table) {
|
|
|
101
108
|
export function getEditableRecordFields(table) {
|
|
102
109
|
return buildRecordSchemaFields(table).filter((field) => !field.readOnly);
|
|
103
110
|
}
|
|
111
|
+
export function orderRecordSchemaFields(fields, fieldOrder) {
|
|
112
|
+
if (!fieldOrder?.length)
|
|
113
|
+
return fields;
|
|
114
|
+
const ordered = fieldOrder
|
|
115
|
+
.map((name) => fields.find((field) => field.name === name))
|
|
116
|
+
.filter((field) => field !== undefined);
|
|
117
|
+
const remaining = fields.filter((field) => !fieldOrder.includes(field.name));
|
|
118
|
+
return [...ordered, ...remaining];
|
|
119
|
+
}
|
|
104
120
|
export function formatRecordValueForForm(column, value) {
|
|
105
121
|
const kind = getRecordFieldKind(column);
|
|
106
122
|
if (value === null || typeof value === "undefined") {
|
package/dist/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AgentResponse, AssistantResponse, AvailableModels, ColumnSchema, ConversationMessageResponse, ConversationResponse, CreateAgentRequest, CreateAssistantRequest, CreateTaskRequest, DatastoreQueryResponse, FlowRunEntity, FlowResponse, FunctionRunResponse, IconUploadResponse, OrganizationInvitationResponse, OrganizationMemberResponse, OrganizationResponse, PodConfigResponse, PodJoinRequestCreateResponse, PodMemberResponse, PodResponse, TableResponse, TaskMessageResponse, TaskResponse, UpdateAgentRequest, UpdateAssistantRequest, UserResponse } from "./openapi_client/index.js";
|
|
1
|
+
import type { AgentResponse, AssistantResponse, AvailableModels, ColumnSchema, ConversationMessageResponse, ConversationResponse, CreateAgentRequest, CreateAssistantRequest, CreateTaskRequest, DatastoreQueryResponse, DirectoryTreeNode, DirectoryTreeResponse, FileResponse, FileSearchResponse, FileSearchResultSchema, FlowRunEntity, FlowResponse, FunctionRunResponse, IconUploadResponse, OrganizationInvitationResponse, OrganizationMemberResponse, OrganizationResponse, PodConfigResponse, PodJoinRequestCreateResponse, PodMemberResponse, PodResponse, TableResponse, TaskMessageResponse, TaskResponse, UpdateAgentRequest, UpdateAssistantRequest, UserResponse } from "./openapi_client/index.js";
|
|
2
2
|
/** Public ergonomic types. */
|
|
3
3
|
export interface PageResult<T> {
|
|
4
4
|
items: T[];
|
|
@@ -52,9 +52,16 @@ export type TaskMessage = TaskMessageResponse;
|
|
|
52
52
|
export type FunctionRun = FunctionRunResponse;
|
|
53
53
|
export type FlowRun = FlowRunEntity;
|
|
54
54
|
export type Workflow = FlowResponse;
|
|
55
|
+
export type WorkflowStart = Workflow["start"];
|
|
56
|
+
export type WorkflowStartType = NonNullable<WorkflowStart>["type"];
|
|
55
57
|
export type Table = TableResponse;
|
|
56
58
|
export type TableColumn = ColumnSchema;
|
|
57
59
|
export type DatastoreQueryResult = DatastoreQueryResponse;
|
|
60
|
+
export type DatastoreFile = FileResponse;
|
|
61
|
+
export type DatastoreFileSearchResponse = FileSearchResponse;
|
|
62
|
+
export type DatastoreFileSearchResult = FileSearchResultSchema;
|
|
63
|
+
export type DatastoreDirectoryTree = DirectoryTreeResponse;
|
|
64
|
+
export type DatastoreDirectoryTreeNode = DirectoryTreeNode;
|
|
58
65
|
export type Pod = PodResponse;
|
|
59
66
|
export type PodConfig = PodConfigResponse;
|
|
60
67
|
export type PodMember = PodMemberResponse;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lemma-sdk",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.34",
|
|
4
4
|
"description": "Official TypeScript SDK for Lemma pod-scoped APIs",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -45,6 +45,7 @@
|
|
|
45
45
|
"build:bundle": "tsc -p tsconfig.bundle.json && node ./scripts/build_browser_bundle.mjs",
|
|
46
46
|
"clean": "node -e \"require('fs').rmSync('dist', { recursive: true, force: true, maxRetries: 10, retryDelay: 100 })\"",
|
|
47
47
|
"registry:build": "shadcn build ./registry.json -o ./public/r",
|
|
48
|
+
"registry:check": "npm run registry:build && node ./scripts/check_registry_blocks.mjs",
|
|
48
49
|
"prepublishOnly": "npm run build",
|
|
49
50
|
"release:check": "npm run build && npm_config_cache=.npm-cache npm pack --dry-run"
|
|
50
51
|
},
|