@adminide-stack/yantra-mobile 12.0.28-alpha.8 → 12.0.28-alpha.81
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/lib/api/stt.js +54 -0
- package/lib/api/stt.js.map +1 -0
- package/lib/assets/icon.png +0 -0
- package/lib/components/CustomDrawer.js +479 -0
- package/lib/components/CustomDrawer.js.map +1 -0
- package/lib/components/GatewayConnector/GatewayConnector.js +18 -0
- package/lib/components/GatewayConnector/GatewayConnector.js.map +1 -0
- package/lib/components/GatewayToolbarButtonMobile.js +84 -0
- package/lib/components/GatewayToolbarButtonMobile.js.map +1 -0
- package/lib/components/NavigationHeader/NavigationHeader.js +214 -0
- package/lib/components/NavigationHeader/NavigationHeader.js.map +1 -0
- package/lib/components/ThinkingIndicator.js +55 -0
- package/lib/components/ThinkingIndicator.js.map +1 -0
- package/lib/components/YantraBrandLoader.js +94 -0
- package/lib/components/YantraBrandLoader.js.map +1 -0
- package/lib/compute.js +114 -5
- package/lib/compute.js.map +1 -1
- package/lib/config/constants.js +18 -0
- package/lib/config/constants.js.map +1 -0
- package/lib/config/env-config.js +75 -19
- package/lib/config/env-config.js.map +1 -1
- package/lib/contexts/CdecliConnectionContext.js +47 -0
- package/lib/contexts/CdecliConnectionContext.js.map +1 -0
- package/lib/contexts/GatewayContext.js +77 -0
- package/lib/contexts/GatewayContext.js.map +1 -0
- package/lib/features/audio-input/AudioRecorderPanel.js +220 -0
- package/lib/features/audio-input/AudioRecorderPanel.js.map +1 -0
- package/lib/features/audio-input/MicErrorBoundary.js +34 -0
- package/lib/features/audio-input/MicErrorBoundary.js.map +1 -0
- package/lib/features/audio-input/useAudioPermission.js +24 -0
- package/lib/features/audio-input/useAudioPermission.js.map +1 -0
- package/lib/graphql/agentGatewayDocuments.js +53 -0
- package/lib/graphql/agentGatewayDocuments.js.map +1 -0
- package/lib/hooks/useAccountDefaultSettings.js +38 -0
- package/lib/hooks/useAccountDefaultSettings.js.map +1 -0
- package/lib/hooks/useCdecliAutoConnect.js +244 -0
- package/lib/hooks/useCdecliAutoConnect.js.map +1 -0
- package/lib/hooks/useCdecliChannel.js +161 -0
- package/lib/hooks/useCdecliChannel.js.map +1 -0
- package/lib/hooks/useChatApi.js +390 -171
- package/lib/hooks/useChatApi.js.map +1 -1
- package/lib/hooks/useChatStream.js +179 -137
- package/lib/hooks/useChatStream.js.map +1 -1
- package/lib/hooks/useGatewayConnection.js +123 -0
- package/lib/hooks/useGatewayConnection.js.map +1 -0
- package/lib/hooks/useGatewayRegistry.js +28 -0
- package/lib/hooks/useGatewayRegistry.js.map +1 -0
- package/lib/hooks/usePrerequisiteIds.js +209 -0
- package/lib/hooks/usePrerequisiteIds.js.map +1 -0
- package/lib/hooks/useWorkspaceProvisioner.js +236 -0
- package/lib/hooks/useWorkspaceProvisioner.js.map +1 -0
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/routes.json +120 -5
- package/lib/screens/Chat/index.js +409 -0
- package/lib/screens/Chat/index.js.map +1 -0
- package/lib/screens/ChatHistory/index.js +56 -0
- package/lib/screens/ChatHistory/index.js.map +1 -0
- package/lib/screens/Home/HomeScreen.js +364 -144
- package/lib/screens/Home/HomeScreen.js.map +1 -1
- package/lib/screens/Home/components/ChatHistoryLanding.js +487 -0
- package/lib/screens/Home/components/ChatHistoryLanding.js.map +1 -0
- package/lib/screens/Home/components/DeepSearchModal.js +349 -0
- package/lib/screens/Home/components/DeepSearchModal.js.map +1 -0
- package/lib/screens/Home/deepSearchUtils.js +41 -0
- package/lib/screens/Home/deepSearchUtils.js.map +1 -0
- package/lib/screens/NewChat/index.js +43 -0
- package/lib/screens/NewChat/index.js.map +1 -0
- package/lib/services/agentSessionManager.js +451 -0
- package/lib/services/agentSessionManager.js.map +1 -0
- package/lib/services/gatewayApiKeyBridge.js +4 -0
- package/lib/services/gatewayApiKeyBridge.js.map +1 -0
- package/lib/services/gatewayClient.js +470 -0
- package/lib/services/gatewayClient.js.map +1 -0
- package/lib/theme/mobileTokens.js +18 -0
- package/lib/theme/mobileTokens.js.map +1 -0
- package/lib/utils/cdecodeUri.js +68 -0
- package/lib/utils/cdecodeUri.js.map +1 -0
- package/lib/utils/gatewaySelectionStorage.js +21 -0
- package/lib/utils/gatewaySelectionStorage.js.map +1 -0
- package/lib/utils/syncMobileOrgRouteContext.js +61 -0
- package/lib/utils/syncMobileOrgRouteContext.js.map +1 -0
- package/package.json +7 -3
- package/lib/api/chatApi.js +0 -102
- package/lib/api/chatApi.js.map +0 -1
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import {useApolloClient}from'@apollo/client/index.js';import {useState,useRef,useCallback,useEffect}from'react';import {OPENCLAW_INSTANCES_QUERY,START_OPENCLAW_MUTATION,DELETE_OPENCLAW_MUTATION,PROVISION_OPENCLAW_MUTATION}from'../graphql/agentGatewayDocuments.js';const DEFAULT_WORKSPACE_PREFIX = "yantra";
|
|
2
|
+
const DEFAULT_IMAGE_VARIANT = "relay";
|
|
3
|
+
const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
4
|
+
const inflightProvisions = /* @__PURE__ */ new Map();
|
|
5
|
+
const resolvedInstances = /* @__PURE__ */ new Map();
|
|
6
|
+
function isHelmBusyError(err) {
|
|
7
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
8
|
+
return msg.includes("another operation") && msg.includes("is in progress");
|
|
9
|
+
}
|
|
10
|
+
function deriveWorkspaceSlug(accountUserId) {
|
|
11
|
+
const hash = accountUserId.replace(/-/g, "").slice(0, 8);
|
|
12
|
+
return `${DEFAULT_WORKSPACE_PREFIX}-${hash}`;
|
|
13
|
+
}
|
|
14
|
+
function useWorkspaceProvisioner(projectId, accountUserId, tier = "basic") {
|
|
15
|
+
const [status, setStatus] = useState(() => {
|
|
16
|
+
const key = projectId && accountUserId ? `${projectId}:${deriveWorkspaceSlug(accountUserId)}` : "";
|
|
17
|
+
return key && resolvedInstances.has(key) ? "ready" : "idle";
|
|
18
|
+
});
|
|
19
|
+
const [instance, setInstance] = useState(() => {
|
|
20
|
+
var _a;
|
|
21
|
+
const key = projectId && accountUserId ? `${projectId}:${deriveWorkspaceSlug(accountUserId)}` : "";
|
|
22
|
+
return (_a = key && resolvedInstances.get(key)) != null ? _a : null;
|
|
23
|
+
});
|
|
24
|
+
const [error, setError] = useState(null);
|
|
25
|
+
const provisioningRef = useRef(false);
|
|
26
|
+
const client = useApolloClient();
|
|
27
|
+
const listInstances = useCallback(async (projectIdArg) => {
|
|
28
|
+
var _a;
|
|
29
|
+
const res = await client.query({
|
|
30
|
+
query: OPENCLAW_INSTANCES_QUERY,
|
|
31
|
+
variables: {
|
|
32
|
+
projectId: projectIdArg
|
|
33
|
+
},
|
|
34
|
+
fetchPolicy: "network-only"
|
|
35
|
+
});
|
|
36
|
+
if ((_a = res.errors) == null ? void 0 : _a.length) throw new Error(res.errors[0].message);
|
|
37
|
+
return res.data;
|
|
38
|
+
}, [client]);
|
|
39
|
+
const startInstance = useCallback(async (projectIdArg, userId) => {
|
|
40
|
+
var _a;
|
|
41
|
+
const res = await client.mutate({
|
|
42
|
+
mutation: START_OPENCLAW_MUTATION,
|
|
43
|
+
variables: {
|
|
44
|
+
projectId: projectIdArg,
|
|
45
|
+
userId
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
if ((_a = res.errors) == null ? void 0 : _a.length) throw new Error(res.errors[0].message);
|
|
49
|
+
return res.data;
|
|
50
|
+
}, [client]);
|
|
51
|
+
const deleteInstance = useCallback(async (projectIdArg, userId) => {
|
|
52
|
+
var _a;
|
|
53
|
+
const res = await client.mutate({
|
|
54
|
+
mutation: DELETE_OPENCLAW_MUTATION,
|
|
55
|
+
variables: {
|
|
56
|
+
projectId: projectIdArg,
|
|
57
|
+
userId
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
if ((_a = res.errors) == null ? void 0 : _a.length) throw new Error(res.errors[0].message);
|
|
61
|
+
return res.data;
|
|
62
|
+
}, [client]);
|
|
63
|
+
const provisionOpenClaw = useCallback(async (input) => {
|
|
64
|
+
var _a;
|
|
65
|
+
const res = await client.mutate({
|
|
66
|
+
mutation: PROVISION_OPENCLAW_MUTATION,
|
|
67
|
+
variables: {
|
|
68
|
+
input
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
if ((_a = res.errors) == null ? void 0 : _a.length) throw new Error(res.errors[0].message);
|
|
72
|
+
return res.data;
|
|
73
|
+
}, [client]);
|
|
74
|
+
const workspaceUserId = accountUserId ? deriveWorkspaceSlug(accountUserId) : null;
|
|
75
|
+
const setResolvedInstance = useCallback((inst) => {
|
|
76
|
+
if (projectId && workspaceUserId) {
|
|
77
|
+
resolvedInstances.set(`${projectId}:${workspaceUserId}`, inst);
|
|
78
|
+
}
|
|
79
|
+
setInstance(inst);
|
|
80
|
+
}, [projectId, workspaceUserId]);
|
|
81
|
+
const provision = useCallback(async () => {
|
|
82
|
+
if (!projectId || !workspaceUserId) return;
|
|
83
|
+
const dedupKey = `${projectId}:${workspaceUserId}`;
|
|
84
|
+
if (resolvedInstances.has(dedupKey) && status === "ready") {
|
|
85
|
+
console.log("[WorkspaceProvisioner] Using cached instance from previous mount");
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const inflight = inflightProvisions.get(dedupKey);
|
|
89
|
+
if (inflight) {
|
|
90
|
+
console.log("[WorkspaceProvisioner] Provision already in-flight, awaiting existing");
|
|
91
|
+
await inflight;
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (provisioningRef.current) return;
|
|
95
|
+
provisioningRef.current = true;
|
|
96
|
+
const provisionPromise = (async () => {
|
|
97
|
+
try {
|
|
98
|
+
setStatus("checking");
|
|
99
|
+
const listData = await listInstances(projectId);
|
|
100
|
+
const existing = listData.openclawInstances.find((inst) => inst.userId === workspaceUserId);
|
|
101
|
+
if (existing && existing.status !== "not-found") {
|
|
102
|
+
if (existing.status === "running") {
|
|
103
|
+
console.log("[WorkspaceProvisioner] Found running instance:", existing.userId);
|
|
104
|
+
setResolvedInstance(existing);
|
|
105
|
+
setStatus("ready");
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
console.log("[WorkspaceProvisioner] Starting stopped instance:", existing.userId);
|
|
109
|
+
setStatus("provisioning");
|
|
110
|
+
try {
|
|
111
|
+
const startData = await startInstance(projectId, workspaceUserId);
|
|
112
|
+
setResolvedInstance(startData.startOpenClaw);
|
|
113
|
+
setStatus("ready");
|
|
114
|
+
return;
|
|
115
|
+
} catch (startErr) {
|
|
116
|
+
console.warn("[WorkspaceProvisioner] Start failed, deleting broken instance before reprovision:", startErr instanceof Error ? startErr.message : String(startErr));
|
|
117
|
+
try {
|
|
118
|
+
await deleteInstance(projectId, workspaceUserId);
|
|
119
|
+
console.log("[WorkspaceProvisioner] Broken instance deleted, verifying cleanup");
|
|
120
|
+
} catch (delErr) {
|
|
121
|
+
console.warn("[WorkspaceProvisioner] Delete failed (continuing anyway):", delErr instanceof Error ? delErr.message : String(delErr));
|
|
122
|
+
}
|
|
123
|
+
const cleanupTimeout = 6e4;
|
|
124
|
+
const cleanupStart = Date.now();
|
|
125
|
+
while (Date.now() - cleanupStart < cleanupTimeout) {
|
|
126
|
+
await delay(3e3);
|
|
127
|
+
try {
|
|
128
|
+
const check = await listInstances(projectId);
|
|
129
|
+
const inst = check.openclawInstances.find((i) => i.userId === workspaceUserId);
|
|
130
|
+
if (!inst || inst.status === "not-found") {
|
|
131
|
+
console.log("[WorkspaceProvisioner] Instance fully cleaned up");
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
console.log("[WorkspaceProvisioner] Waiting for cleanup, status:", inst.status);
|
|
135
|
+
} catch (e) {
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
console.log("[WorkspaceProvisioner] Provisioning new workspace for:", workspaceUserId);
|
|
141
|
+
setStatus("provisioning");
|
|
142
|
+
const isPaidPlan = tier !== "guest" && tier !== "basic" && tier !== "trial";
|
|
143
|
+
const provisionInput = {
|
|
144
|
+
input: {
|
|
145
|
+
projectId,
|
|
146
|
+
userId: workspaceUserId,
|
|
147
|
+
userName: workspaceUserId,
|
|
148
|
+
imageVariant: DEFAULT_IMAGE_VARIANT,
|
|
149
|
+
workspaceEnabled: isPaidPlan
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
const MAX_RETRIES = 3;
|
|
153
|
+
const RETRY_DELAY_MS = 5e3;
|
|
154
|
+
let lastProvisionErr;
|
|
155
|
+
for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
|
|
156
|
+
try {
|
|
157
|
+
const provisionData = await provisionOpenClaw(provisionInput.input);
|
|
158
|
+
const provisioned = provisionData.provisionOpenClaw;
|
|
159
|
+
console.log("[WorkspaceProvisioner] Workspace provisioned:", provisioned.url, "status:", provisioned.status);
|
|
160
|
+
if (provisioned.status !== "running") {
|
|
161
|
+
console.log("[WorkspaceProvisioner] Waiting for pod to be running...");
|
|
162
|
+
const maxPollTime = 12e4;
|
|
163
|
+
const pollInterval = 5e3;
|
|
164
|
+
const start = Date.now();
|
|
165
|
+
let runningInstance = provisioned;
|
|
166
|
+
while (Date.now() - start < maxPollTime) {
|
|
167
|
+
await delay(pollInterval);
|
|
168
|
+
try {
|
|
169
|
+
const check = await listInstances(projectId);
|
|
170
|
+
const inst = check.openclawInstances.find((i) => i.userId === workspaceUserId);
|
|
171
|
+
if ((inst == null ? void 0 : inst.status) === "running") {
|
|
172
|
+
runningInstance = inst;
|
|
173
|
+
console.log("[WorkspaceProvisioner] Pod is now running");
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
} catch (e) {
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
setResolvedInstance(runningInstance);
|
|
180
|
+
} else {
|
|
181
|
+
setResolvedInstance(provisioned);
|
|
182
|
+
}
|
|
183
|
+
setStatus("ready");
|
|
184
|
+
lastProvisionErr = null;
|
|
185
|
+
break;
|
|
186
|
+
} catch (provErr) {
|
|
187
|
+
lastProvisionErr = provErr;
|
|
188
|
+
if (isHelmBusyError(provErr) && attempt < MAX_RETRIES) {
|
|
189
|
+
console.warn(`[WorkspaceProvisioner] Helm busy, retrying in ${RETRY_DELAY_MS / 1e3}s (attempt ${attempt}/${MAX_RETRIES})`);
|
|
190
|
+
await delay(RETRY_DELAY_MS);
|
|
191
|
+
} else {
|
|
192
|
+
throw provErr;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
} catch (err) {
|
|
197
|
+
console.error("[WorkspaceProvisioner] Failed:", err instanceof Error ? err.message : String(err));
|
|
198
|
+
setError(err instanceof Error ? err.message : String(err));
|
|
199
|
+
setStatus("error");
|
|
200
|
+
} finally {
|
|
201
|
+
provisioningRef.current = false;
|
|
202
|
+
}
|
|
203
|
+
})();
|
|
204
|
+
inflightProvisions.set(dedupKey, provisionPromise);
|
|
205
|
+
try {
|
|
206
|
+
await provisionPromise;
|
|
207
|
+
} finally {
|
|
208
|
+
inflightProvisions.delete(dedupKey);
|
|
209
|
+
}
|
|
210
|
+
}, [projectId, workspaceUserId, tier, status, setResolvedInstance, listInstances, startInstance, deleteInstance, provisionOpenClaw]);
|
|
211
|
+
const reprovision = useCallback(async () => {
|
|
212
|
+
if (!projectId || !workspaceUserId) return;
|
|
213
|
+
resolvedInstances.delete(`${projectId}:${workspaceUserId}`);
|
|
214
|
+
provisioningRef.current = false;
|
|
215
|
+
setInstance(null);
|
|
216
|
+
setError(null);
|
|
217
|
+
setStatus("idle");
|
|
218
|
+
console.log("[WorkspaceProvisioner] Re-provisioning \u2014 instance not found, creating new one");
|
|
219
|
+
await provision();
|
|
220
|
+
}, [projectId, workspaceUserId, provision]);
|
|
221
|
+
useEffect(() => {
|
|
222
|
+
if (!projectId || !workspaceUserId || status !== "idle") return;
|
|
223
|
+
const timer = setTimeout(() => {
|
|
224
|
+
provision();
|
|
225
|
+
}, 300);
|
|
226
|
+
return () => clearTimeout(timer);
|
|
227
|
+
}, [projectId, workspaceUserId, status, provision]);
|
|
228
|
+
return {
|
|
229
|
+
status,
|
|
230
|
+
instance,
|
|
231
|
+
error,
|
|
232
|
+
workspaceUserId,
|
|
233
|
+
provision,
|
|
234
|
+
reprovision
|
|
235
|
+
};
|
|
236
|
+
}export{useWorkspaceProvisioner};//# sourceMappingURL=useWorkspaceProvisioner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useWorkspaceProvisioner.js","sources":["../../src/hooks/useWorkspaceProvisioner.ts"],"sourcesContent":["/**\n * Auto-provisions an OpenClaw workspace for the current user.\n *\n * Checks if an existing instance is running, and if not, provisions one\n * via the backend. No AI API keys are injected into pods — all LLM traffic\n * routes through YantraRouter which handles auth + budget via its auth-proxy.\n */\n\nimport { useApolloClient } from '@apollo/client';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport {\n DELETE_OPENCLAW_MUTATION,\n OPENCLAW_INSTANCES_QUERY,\n PROVISION_OPENCLAW_MUTATION,\n START_OPENCLAW_MUTATION,\n} from '../graphql/agentGatewayDocuments';\n\n// ─── Types ──────────────────────────────────────────────────────\n\nexport type ProvisioningStatus = 'idle' | 'checking' | 'provisioning' | 'ready' | 'error';\n\nexport interface WorkspaceInstance {\n userId: string;\n slug: string;\n url: string;\n status: string;\n projectId: string;\n}\n\nexport interface UseWorkspaceProvisionerResult {\n status: ProvisioningStatus;\n instance: WorkspaceInstance | null;\n error: string | null;\n /** The userId (slug) of the running workspace — used for gateway connection */\n workspaceUserId: string | null;\n /** Trigger provisioning manually (normally auto-triggered) */\n provision: () => Promise<void>;\n /** Force a fresh provision cycle (resets state, provisions a new instance if needed) */\n reprovision: () => Promise<void>;\n}\n\n// ─── Constants ──────────────────────────────────────────────────\n\n/** Default workspace slug derived from account profile */\nconst DEFAULT_WORKSPACE_PREFIX = 'yantra';\n\n/** Default image variant — relay variant includes Chrome + extension relay bridge */\nconst DEFAULT_IMAGE_VARIANT = 'relay';\n\n// ─── Helpers ────────────────────────────────────────────────────\n\nconst delay = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms));\n\n/** Deduplicates concurrent provision calls for the same project + user. */\nconst inflightProvisions = new Map<string, Promise<void>>();\n\n/**\n * Module-level cache of the last resolved instance per dedup key.\n * Survives HMR remounts so repeated mounts don't re-provision.\n */\nconst resolvedInstances = new Map<string, WorkspaceInstance>();\n\nfunction isHelmBusyError(err: unknown): boolean {\n const msg = err instanceof Error ? err.message : String(err);\n return msg.includes('another operation') && msg.includes('is in progress');\n}\n\n/** Generate a deterministic workspace userId from the account user ID. */\nfunction deriveWorkspaceSlug(accountUserId: string): string {\n // Use a short hash of the user ID prefixed with workspace identifier\n const hash = accountUserId.replace(/-/g, '').slice(0, 8);\n return `${DEFAULT_WORKSPACE_PREFIX}-${hash}`;\n}\n\n// ─── Hook ───────────────────────────────────────────────────────\n\n/**\n * Manages automatic workspace provisioning for the current user.\n *\n * Flow:\n * 1. Check if an instance already exists for this project + user\n * 2. If running → return it immediately\n * 3. If stopped → start it\n * 4. If none → provision a new one with appropriate API key budget\n */\nexport function useWorkspaceProvisioner(\n projectId: string | null,\n accountUserId: string | null,\n tier: string = 'basic',\n): UseWorkspaceProvisionerResult {\n const [status, setStatus] = useState<ProvisioningStatus>(() => {\n // Restore from module-level cache on remount (HMR, page refresh)\n const key = projectId && accountUserId ? `${projectId}:${deriveWorkspaceSlug(accountUserId)}` : '';\n return key && resolvedInstances.has(key) ? 'ready' : 'idle';\n });\n const [instance, setInstance] = useState<WorkspaceInstance | null>(() => {\n const key = projectId && accountUserId ? `${projectId}:${deriveWorkspaceSlug(accountUserId)}` : '';\n return (key && resolvedInstances.get(key)) ?? null;\n });\n const [error, setError] = useState<string | null>(null);\n const provisioningRef = useRef(false);\n\n const client = useApolloClient();\n\n const listInstances = useCallback(\n async (projectIdArg: string) => {\n const res = await client.query({\n query: OPENCLAW_INSTANCES_QUERY,\n variables: { projectId: projectIdArg },\n fetchPolicy: 'network-only',\n });\n if (res.errors?.length) throw new Error(res.errors[0].message);\n return res.data as { openclawInstances: WorkspaceInstance[] };\n },\n [client],\n );\n\n const startInstance = useCallback(\n async (projectIdArg: string, userId: string) => {\n const res = await client.mutate({\n mutation: START_OPENCLAW_MUTATION,\n variables: { projectId: projectIdArg, userId },\n });\n if (res.errors?.length) throw new Error(res.errors[0].message);\n return res.data as { startOpenClaw: WorkspaceInstance };\n },\n [client],\n );\n\n const deleteInstance = useCallback(\n async (projectIdArg: string, userId: string) => {\n const res = await client.mutate({\n mutation: DELETE_OPENCLAW_MUTATION,\n variables: { projectId: projectIdArg, userId },\n });\n if (res.errors?.length) throw new Error(res.errors[0].message);\n return res.data as { deleteOpenClaw: boolean };\n },\n [client],\n );\n\n const provisionOpenClaw = useCallback(\n async (input: {\n projectId: string;\n userId: string;\n userName: string;\n imageVariant: string;\n workspaceEnabled: boolean;\n }) => {\n const res = await client.mutate({\n mutation: PROVISION_OPENCLAW_MUTATION,\n variables: { input },\n });\n if (res.errors?.length) throw new Error(res.errors[0].message);\n return res.data as { provisionOpenClaw: WorkspaceInstance };\n },\n [client],\n );\n\n const workspaceUserId = accountUserId ? deriveWorkspaceSlug(accountUserId) : null;\n\n /** Sets instance in both React state and module-level cache so HMR remounts are instant. */\n const setResolvedInstance = useCallback(\n (inst: WorkspaceInstance) => {\n if (projectId && workspaceUserId) {\n resolvedInstances.set(`${projectId}:${workspaceUserId}`, inst);\n }\n setInstance(inst);\n },\n [projectId, workspaceUserId],\n );\n\n const provision = useCallback(async () => {\n if (!projectId || !workspaceUserId) return;\n\n const dedupKey = `${projectId}:${workspaceUserId}`;\n\n // If already resolved from module cache (HMR remount), skip\n if (resolvedInstances.has(dedupKey) && status === 'ready') {\n console.log('[WorkspaceProvisioner] Using cached instance from previous mount');\n return;\n }\n\n // If there's already an in-flight provision for this exact user, wait for it\n const inflight = inflightProvisions.get(dedupKey);\n if (inflight) {\n console.log('[WorkspaceProvisioner] Provision already in-flight, awaiting existing');\n await inflight;\n return;\n }\n\n if (provisioningRef.current) return;\n provisioningRef.current = true;\n\n const provisionPromise = (async () => {\n try {\n // Step 1: Check for existing instances\n setStatus('checking');\n const listData = await listInstances(projectId);\n\n const existing = listData.openclawInstances.find((inst) => inst.userId === workspaceUserId);\n\n if (existing && existing.status !== 'not-found') {\n // Instance exists — check if it's running\n if (existing.status === 'running') {\n console.log('[WorkspaceProvisioner] Found running instance:', existing.userId);\n setResolvedInstance(existing);\n setStatus('ready');\n return;\n }\n\n // Instance exists but stopped — try to start it; if infra is broken, delete and reprovision\n console.log('[WorkspaceProvisioner] Starting stopped instance:', existing.userId);\n setStatus('provisioning');\n try {\n const startData = await startInstance(projectId, workspaceUserId);\n setResolvedInstance(startData.startOpenClaw);\n setStatus('ready');\n return;\n } catch (startErr) {\n console.warn(\n '[WorkspaceProvisioner] Start failed, deleting broken instance before reprovision:',\n startErr instanceof Error ? startErr.message : String(startErr),\n );\n // Delete the broken instance — the server now waits for full resource cleanup\n try {\n await deleteInstance(projectId, workspaceUserId);\n console.log('[WorkspaceProvisioner] Broken instance deleted, verifying cleanup');\n } catch (delErr) {\n console.warn(\n '[WorkspaceProvisioner] Delete failed (continuing anyway):',\n delErr instanceof Error ? delErr.message : String(delErr),\n );\n }\n // Poll until the instance is truly gone (not-found) before reprovisioning\n const cleanupTimeout = 60_000;\n const cleanupStart = Date.now();\n while (Date.now() - cleanupStart < cleanupTimeout) {\n await delay(3000);\n try {\n const check = await listInstances(projectId);\n const inst = check.openclawInstances.find((i) => i.userId === workspaceUserId);\n if (!inst || inst.status === 'not-found') {\n console.log('[WorkspaceProvisioner] Instance fully cleaned up');\n break;\n }\n console.log('[WorkspaceProvisioner] Waiting for cleanup, status:', inst.status);\n } catch {\n // Query failed — keep waiting\n }\n }\n // Fall through to provision a new instance\n }\n }\n\n // Step 2: No instance exists — provision a new one (retry if Helm is busy)\n console.log('[WorkspaceProvisioner] Provisioning new workspace for:', workspaceUserId);\n setStatus('provisioning');\n\n // No AI keys are injected — all LLM traffic routes through YantraRouter\n // via OPENAI_BASE_URL (set in Helm extraEnv). Auth + budget enforcement\n // happen at the YantraRouter auth-proxy sidecar.\n const isPaidPlan = tier !== 'guest' && tier !== 'basic' && tier !== 'trial';\n const provisionInput = {\n input: {\n projectId,\n userId: workspaceUserId,\n userName: workspaceUserId,\n imageVariant: DEFAULT_IMAGE_VARIANT,\n workspaceEnabled: isPaidPlan,\n },\n };\n\n const MAX_RETRIES = 3;\n const RETRY_DELAY_MS = 5000;\n let lastProvisionErr: unknown;\n\n for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {\n try {\n const provisionData = await provisionOpenClaw(provisionInput.input);\n\n const provisioned = provisionData.provisionOpenClaw;\n console.log(\n '[WorkspaceProvisioner] Workspace provisioned:',\n provisioned.url,\n 'status:',\n provisioned.status,\n );\n\n // Wait for the pod to reach running state if not yet ready\n if (provisioned.status !== 'running') {\n console.log('[WorkspaceProvisioner] Waiting for pod to be running...');\n const maxPollTime = 120_000;\n const pollInterval = 5_000;\n const start = Date.now();\n let runningInstance = provisioned;\n while (Date.now() - start < maxPollTime) {\n await delay(pollInterval);\n try {\n const check = await listInstances(projectId);\n const inst = check.openclawInstances.find((i) => i.userId === workspaceUserId);\n if (inst?.status === 'running') {\n runningInstance = inst;\n console.log('[WorkspaceProvisioner] Pod is now running');\n break;\n }\n } catch {\n // Ignore poll errors, keep retrying\n }\n }\n setResolvedInstance(runningInstance);\n } else {\n setResolvedInstance(provisioned);\n }\n\n setStatus('ready');\n lastProvisionErr = null;\n break;\n } catch (provErr) {\n lastProvisionErr = provErr;\n if (isHelmBusyError(provErr) && attempt < MAX_RETRIES) {\n console.warn(\n `[WorkspaceProvisioner] Helm busy, retrying in ${RETRY_DELAY_MS / 1000}s (attempt ${attempt}/${MAX_RETRIES})`,\n );\n await delay(RETRY_DELAY_MS);\n } else {\n throw provErr;\n }\n }\n }\n } catch (err) {\n console.error('[WorkspaceProvisioner] Failed:', err instanceof Error ? err.message : String(err));\n setError(err instanceof Error ? err.message : String(err));\n setStatus('error');\n } finally {\n provisioningRef.current = false;\n }\n })();\n\n inflightProvisions.set(dedupKey, provisionPromise);\n try {\n await provisionPromise;\n } finally {\n inflightProvisions.delete(dedupKey);\n }\n }, [\n projectId,\n workspaceUserId,\n tier,\n status,\n setResolvedInstance,\n listInstances,\n startInstance,\n deleteInstance,\n provisionOpenClaw,\n ]);\n\n const reprovision = useCallback(async () => {\n if (!projectId || !workspaceUserId) return;\n // Clear module-level cache so a fresh cycle runs\n resolvedInstances.delete(`${projectId}:${workspaceUserId}`);\n provisioningRef.current = false;\n setInstance(null);\n setError(null);\n setStatus('idle');\n console.log('[WorkspaceProvisioner] Re-provisioning — instance not found, creating new one');\n // Run the full provision cycle which will check + create as needed\n await provision();\n }, [projectId, workspaceUserId, provision]);\n\n // Auto-provision when projectId and accountUserId become available.\n // Debounced to avoid stampede on HMR / rapid page refreshes.\n useEffect(() => {\n if (!projectId || !workspaceUserId || status !== 'idle') return;\n const timer = setTimeout(() => {\n provision();\n }, 300);\n return () => clearTimeout(timer);\n }, [projectId, workspaceUserId, status, provision]);\n\n return {\n status,\n instance,\n error,\n workspaceUserId,\n provision,\n reprovision,\n };\n}\n"],"names":[],"mappings":"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"}
|
package/lib/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import {Feature}from'@common-stack/client-react';import YantraMobileModule from'./module.js';export{default as Home}from'./screens/Home/HomeScreen.js';var index = new Feature(YantraMobileModule);export{index as default};//# sourceMappingURL=index.js.map
|
|
1
|
+
import {Feature}from'@common-stack/client-react';import YantraMobileModule from'./module.js';export{default as Home}from'./screens/Home/HomeScreen.js';export{default as NewChat}from'./screens/NewChat/index.js';export{default as ChatHistory}from'./screens/ChatHistory/index.js';export{GatewayContextProvider,useGatewayContext}from'./contexts/GatewayContext.js';export{CdecliConnectionProvider,useCdecliConnection}from'./contexts/CdecliConnectionContext.js';export{BUILTIN_MOBILE_GATEWAYS,MAX_CONCURRENT_TASKS,STORAGE_KEYS}from'./config/constants.js';export{config}from'./config/env-config.js';export{useCdecliAutoConnect}from'./hooks/useCdecliAutoConnect.js';export{isInstanceNotFoundError,useGatewayConnection}from'./hooks/useGatewayConnection.js';export{usePrerequisiteIds}from'./hooks/usePrerequisiteIds.js';export{useWorkspaceProvisioner}from'./hooks/useWorkspaceProvisioner.js';export{useGatewayRegistry}from'./hooks/useGatewayRegistry.js';export{agentSessionManager}from'./services/agentSessionManager.js';export{ensureGatewayApiKeys,resetGatewayApiKeyBridge}from'./services/gatewayApiKeyBridge.js';export{GatewayClient}from'./services/gatewayClient.js';export{YANTRA_LOADER_SIZE_COMPACT,YANTRA_LOADER_SIZE_DEFAULT,YantraBrandLoader}from'./components/YantraBrandLoader.js';export{default as CustomDrawer}from'./components/CustomDrawer.js';var index = new Feature(YantraMobileModule);export{index as default};//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import { Feature } from '@common-stack/client-react';\nimport YantraMobileModule from './module';\n\nexport default new Feature(YantraMobileModule);\nexport * from './screens';\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import { Feature } from '@common-stack/client-react';\nimport YantraMobileModule from './module';\n\nexport default new Feature(YantraMobileModule);\nexport * from './screens';\nexport { GatewayContextProvider, useGatewayContext } from './contexts/GatewayContext';\nexport { CdecliConnectionProvider, useCdecliConnection } from './contexts/CdecliConnectionContext';\nexport * from './config/constants';\nexport { config } from './config/env-config';\nexport { useCdecliAutoConnect } from './hooks/useCdecliAutoConnect';\nexport { useGatewayConnection, isInstanceNotFoundError } from './hooks/useGatewayConnection';\nexport { usePrerequisiteIds } from './hooks/usePrerequisiteIds';\nexport { useWorkspaceProvisioner } from './hooks/useWorkspaceProvisioner';\nexport { useGatewayRegistry } from './hooks/useGatewayRegistry';\nexport * from './services';\nexport {\n YantraBrandLoader,\n YANTRA_LOADER_SIZE_DEFAULT,\n YANTRA_LOADER_SIZE_COMPACT,\n} from './components/YantraBrandLoader';\nexport { default as CustomDrawer } from './components/CustomDrawer';\n"],"names":[],"mappings":"g0CAEA,YAAe,IAAI,QAAQ,kBAAkB,CAAA"}
|
package/lib/routes.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
[
|
|
2
2
|
{
|
|
3
|
-
"/l/home": {
|
|
3
|
+
"/:orgName/l/home": {
|
|
4
4
|
"key": "home",
|
|
5
|
-
"path": "/l/home",
|
|
5
|
+
"path": "/:orgName/l/home",
|
|
6
6
|
"name": "Home",
|
|
7
7
|
"exact": true,
|
|
8
8
|
"index": true,
|
|
@@ -10,9 +10,26 @@
|
|
|
10
10
|
"hideInMenu": true,
|
|
11
11
|
"auth": true,
|
|
12
12
|
"menu_position": "side",
|
|
13
|
+
"importPaths": {
|
|
14
|
+
"navigationHeader": "@adminide-stack/yantra-mobile/lib/components/NavigationHeader/NavigationHeader.js"
|
|
15
|
+
},
|
|
16
|
+
"customHeader": {
|
|
17
|
+
"name": "NavigationHeader",
|
|
18
|
+
"component": "$.importPaths.navigationHeader",
|
|
19
|
+
"props": {
|
|
20
|
+
"showTitle": true,
|
|
21
|
+
"showToggle": true,
|
|
22
|
+
"showFilter": true,
|
|
23
|
+
"isSearchBack": false,
|
|
24
|
+
"showGateway": true,
|
|
25
|
+
"showHistory": true,
|
|
26
|
+
"showNewChat": true
|
|
27
|
+
}
|
|
28
|
+
},
|
|
13
29
|
"props": {
|
|
14
30
|
"initialParams": {
|
|
15
|
-
"initialSessionId": null
|
|
31
|
+
"initialSessionId": null,
|
|
32
|
+
"orgName": null
|
|
16
33
|
},
|
|
17
34
|
"options": {
|
|
18
35
|
"title": "Yantra",
|
|
@@ -20,14 +37,112 @@
|
|
|
20
37
|
"headerTitleStyle": {
|
|
21
38
|
"fontWeight": "bold"
|
|
22
39
|
},
|
|
23
|
-
"drawerLabel": "
|
|
40
|
+
"drawerLabel": "Chat",
|
|
24
41
|
"headerTitleAlign": "left",
|
|
25
42
|
"gestureEnabled": false,
|
|
26
|
-
"swipeEnabled": false
|
|
43
|
+
"swipeEnabled": false,
|
|
44
|
+
"animation": "fade",
|
|
45
|
+
"animationTypeForReplace": "pop"
|
|
27
46
|
}
|
|
28
47
|
},
|
|
29
48
|
"componentPath": "@adminide-stack/yantra-mobile/lib/screens/Home/index.js",
|
|
30
49
|
"hasComponent": true
|
|
31
50
|
}
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"/:orgName/chat/:channelId": {
|
|
54
|
+
"key": "chat",
|
|
55
|
+
"path": "/:orgName/chat/:channelId",
|
|
56
|
+
"name": "Chat",
|
|
57
|
+
"exact": false,
|
|
58
|
+
"priority": 2,
|
|
59
|
+
"hideInMenu": true,
|
|
60
|
+
"auth": true,
|
|
61
|
+
"importPaths": {
|
|
62
|
+
"navigationHeader": "@adminide-stack/yantra-mobile/lib/components/NavigationHeader/NavigationHeader.js"
|
|
63
|
+
},
|
|
64
|
+
"customHeader": {
|
|
65
|
+
"name": "NavigationHeader",
|
|
66
|
+
"component": "$.importPaths.navigationHeader",
|
|
67
|
+
"props": {
|
|
68
|
+
"showTitle": true,
|
|
69
|
+
"showToggle": false,
|
|
70
|
+
"showFilter": false,
|
|
71
|
+
"isSearchBack": false,
|
|
72
|
+
"showBack": true,
|
|
73
|
+
"showGateway": true,
|
|
74
|
+
"showHistory": false,
|
|
75
|
+
"showNewChat": true
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
"props": {
|
|
79
|
+
"initialParams": {
|
|
80
|
+
"channelId": null,
|
|
81
|
+
"orgName": null
|
|
82
|
+
},
|
|
83
|
+
"options": {
|
|
84
|
+
"title": "Yantra",
|
|
85
|
+
"headerTintColor": "black",
|
|
86
|
+
"headerTitleStyle": {
|
|
87
|
+
"fontWeight": "bold"
|
|
88
|
+
},
|
|
89
|
+
"drawerLabel": "Chat",
|
|
90
|
+
"headerTitleAlign": "left",
|
|
91
|
+
"gestureEnabled": false,
|
|
92
|
+
"swipeEnabled": false,
|
|
93
|
+
"animation": "fade",
|
|
94
|
+
"animationTypeForReplace": "pop"
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
"componentPath": "@adminide-stack/yantra-mobile/lib/screens/Chat/index.js",
|
|
98
|
+
"hasComponent": true
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"/:orgName/chathistory": {
|
|
103
|
+
"key": "chathistory",
|
|
104
|
+
"path": "/:orgName/chathistory",
|
|
105
|
+
"name": "ChatHistory",
|
|
106
|
+
"exact": false,
|
|
107
|
+
"priority": 3,
|
|
108
|
+
"hideInMenu": true,
|
|
109
|
+
"auth": true,
|
|
110
|
+
"importPaths": {
|
|
111
|
+
"navigationHeader": "@adminide-stack/yantra-mobile/lib/components/NavigationHeader/NavigationHeader.js"
|
|
112
|
+
},
|
|
113
|
+
"customHeader": {
|
|
114
|
+
"name": "NavigationHeader",
|
|
115
|
+
"component": "$.importPaths.navigationHeader",
|
|
116
|
+
"props": {
|
|
117
|
+
"showTitle": true,
|
|
118
|
+
"showToggle": false,
|
|
119
|
+
"showFilter": false,
|
|
120
|
+
"isSearchBack": false,
|
|
121
|
+
"showBack": true,
|
|
122
|
+
"showGateway": false,
|
|
123
|
+
"showHistory": false,
|
|
124
|
+
"showNewChat": true
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
"props": {
|
|
128
|
+
"initialParams": {
|
|
129
|
+
"orgName": null
|
|
130
|
+
},
|
|
131
|
+
"options": {
|
|
132
|
+
"title": "Chat history",
|
|
133
|
+
"headerTintColor": "black",
|
|
134
|
+
"headerTitleStyle": {
|
|
135
|
+
"fontWeight": "bold"
|
|
136
|
+
},
|
|
137
|
+
"headerTitleAlign": "left",
|
|
138
|
+
"gestureEnabled": false,
|
|
139
|
+
"swipeEnabled": false,
|
|
140
|
+
"animation": "fade",
|
|
141
|
+
"animationTypeForReplace": "pop"
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
"componentPath": "@adminide-stack/yantra-mobile/lib/screens/ChatHistory/index.js",
|
|
145
|
+
"hasComponent": true
|
|
146
|
+
}
|
|
32
147
|
}
|
|
33
148
|
]
|