@adminide-stack/yantra-mobile 12.0.28-alpha.7 → 12.0.28-alpha.71
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 +16 -0
- package/lib/config/constants.js.map +1 -0
- package/lib/config/env-config.js +74 -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 +231 -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/graphql/agentGatewayDocuments.js +53 -0
- package/lib/graphql/agentGatewayDocuments.js.map +1 -0
- package/lib/hooks/useCdecliAutoConnect.js +242 -0
- package/lib/hooks/useCdecliAutoConnect.js.map +1 -0
- package/lib/hooks/useCdecliChannel.js +226 -0
- package/lib/hooks/useCdecliChannel.js.map +1 -0
- package/lib/hooks/useChatApi.js +338 -171
- package/lib/hooks/useChatApi.js.map +1 -1
- package/lib/hooks/useChatStream.js +281 -64
- 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 +181 -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 +423 -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 +413 -140
- 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 +79 -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/gatewaySelectionStorage.js +21 -0
- package/lib/utils/gatewaySelectionStorage.js.map +1 -0
- package/package.json +7 -3
|
@@ -0,0 +1,470 @@
|
|
|
1
|
+
import {v4}from'uuid';var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b || (b = {}))
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
18
|
+
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
21
|
+
function newRequestId() {
|
|
22
|
+
const c = globalThis.crypto;
|
|
23
|
+
if (c == null ? void 0 : c.randomUUID) return c.randomUUID();
|
|
24
|
+
return v4();
|
|
25
|
+
}
|
|
26
|
+
const PROTOCOL_VERSION = 3;
|
|
27
|
+
const CONNECT_TIMEOUT_MS = 3e4;
|
|
28
|
+
const RPC_TIMEOUT_MS = 3e4;
|
|
29
|
+
function deepMerge(target, source) {
|
|
30
|
+
const result = __spreadValues({}, target);
|
|
31
|
+
for (const key of Object.keys(source)) {
|
|
32
|
+
const sv = source[key];
|
|
33
|
+
const tv = result[key];
|
|
34
|
+
if (sv && typeof sv === "object" && !Array.isArray(sv) && tv && typeof tv === "object" && !Array.isArray(tv)) {
|
|
35
|
+
result[key] = deepMerge(tv, sv);
|
|
36
|
+
} else {
|
|
37
|
+
result[key] = sv;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
class GatewayClient {
|
|
43
|
+
constructor(url, token, wsProtocol) {
|
|
44
|
+
__publicField(this, "ws", null);
|
|
45
|
+
__publicField(this, "pending", /* @__PURE__ */ new Map());
|
|
46
|
+
__publicField(this, "_connected", false);
|
|
47
|
+
__publicField(this, "_hello", null);
|
|
48
|
+
__publicField(this, "_eventHandlers", /* @__PURE__ */ new Map());
|
|
49
|
+
__publicField(this, "url");
|
|
50
|
+
__publicField(this, "token");
|
|
51
|
+
__publicField(this, "wsProtocol");
|
|
52
|
+
this.url = url;
|
|
53
|
+
this.token = token;
|
|
54
|
+
this.wsProtocol = wsProtocol;
|
|
55
|
+
}
|
|
56
|
+
get connected() {
|
|
57
|
+
return this._connected;
|
|
58
|
+
}
|
|
59
|
+
get hello() {
|
|
60
|
+
return this._hello;
|
|
61
|
+
}
|
|
62
|
+
/** Register an event handler for gateway push events. */
|
|
63
|
+
on(event, handler) {
|
|
64
|
+
if (!this._eventHandlers.has(event)) {
|
|
65
|
+
this._eventHandlers.set(event, /* @__PURE__ */ new Set());
|
|
66
|
+
}
|
|
67
|
+
this._eventHandlers.get(event).add(handler);
|
|
68
|
+
}
|
|
69
|
+
/** Remove an event handler. */
|
|
70
|
+
off(event, handler) {
|
|
71
|
+
var _a;
|
|
72
|
+
(_a = this._eventHandlers.get(event)) == null ? void 0 : _a.delete(handler);
|
|
73
|
+
}
|
|
74
|
+
/** Connect to the gateway and authenticate. Resolves with HelloOk on success. */
|
|
75
|
+
connect() {
|
|
76
|
+
return new Promise((resolve, reject) => {
|
|
77
|
+
let settled = false;
|
|
78
|
+
let timer;
|
|
79
|
+
let sawChallenge = false;
|
|
80
|
+
const settle = (fn) => {
|
|
81
|
+
if (settled) return;
|
|
82
|
+
settled = true;
|
|
83
|
+
clearTimeout(timer);
|
|
84
|
+
fn();
|
|
85
|
+
};
|
|
86
|
+
timer = setTimeout(() => settle(() => reject(new Error(`connect timeout after ${CONNECT_TIMEOUT_MS}ms`))), CONNECT_TIMEOUT_MS);
|
|
87
|
+
this.ws = this.wsProtocol ? new WebSocket(this.url, this.wsProtocol) : new WebSocket(this.url);
|
|
88
|
+
this.ws.onerror = (ev) => {
|
|
89
|
+
console.error(`[GatewayClient] WS error: url=${this.url}`, ev);
|
|
90
|
+
settle(() => reject(new Error("WebSocket connection error")));
|
|
91
|
+
};
|
|
92
|
+
this.ws.onclose = (ev) => {
|
|
93
|
+
this._connected = false;
|
|
94
|
+
this.flushPending(new Error("connection closed"));
|
|
95
|
+
const detail = ev.reason ? ` reason="${ev.reason}"` : "";
|
|
96
|
+
console.warn(`[GatewayClient] WS closed: code=${ev.code}${detail} url=${this.url} challengeReceived=${sawChallenge}`);
|
|
97
|
+
settle(() => reject(new Error(`connection closed before handshake (code=${ev.code})`)));
|
|
98
|
+
this.emit("disconnect", {
|
|
99
|
+
code: ev.code,
|
|
100
|
+
reason: ev.reason
|
|
101
|
+
});
|
|
102
|
+
};
|
|
103
|
+
this.ws.onmessage = (event) => {
|
|
104
|
+
var _a, _b, _c;
|
|
105
|
+
const raw = typeof event.data === "string" ? event.data : String(event.data);
|
|
106
|
+
let frame;
|
|
107
|
+
try {
|
|
108
|
+
frame = JSON.parse(raw);
|
|
109
|
+
} catch (e) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (frame.type === "event" && frame.event === "connect.challenge") {
|
|
113
|
+
sawChallenge = true;
|
|
114
|
+
this.request("connect", {
|
|
115
|
+
minProtocol: PROTOCOL_VERSION,
|
|
116
|
+
maxProtocol: PROTOCOL_VERSION,
|
|
117
|
+
client: {
|
|
118
|
+
id: "openclaw-control-ui",
|
|
119
|
+
version: "1.0.0",
|
|
120
|
+
platform: "react-native",
|
|
121
|
+
mode: "ui",
|
|
122
|
+
displayName: "Yantra App"
|
|
123
|
+
},
|
|
124
|
+
role: "operator",
|
|
125
|
+
scopes: ["operator.admin", "operator.read", "operator.write"],
|
|
126
|
+
caps: [],
|
|
127
|
+
auth: {
|
|
128
|
+
token: this.token
|
|
129
|
+
}
|
|
130
|
+
}).then((hello) => {
|
|
131
|
+
this._connected = true;
|
|
132
|
+
this._hello = hello;
|
|
133
|
+
settle(() => resolve(hello));
|
|
134
|
+
}).catch((err) => settle(() => reject(err)));
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
if (frame.type === "res") {
|
|
138
|
+
const p = this.pending.get(frame.id);
|
|
139
|
+
if (p) {
|
|
140
|
+
clearTimeout(p.timer);
|
|
141
|
+
this.pending.delete(frame.id);
|
|
142
|
+
if (frame.ok) {
|
|
143
|
+
p.resolve(frame.payload);
|
|
144
|
+
} else {
|
|
145
|
+
p.reject(new Error((_b = (_a = frame.error) == null ? void 0 : _a.message) != null ? _b : "RPC error"));
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
if (frame.type === "event") {
|
|
151
|
+
if (!sawChallenge && !this._connected) {
|
|
152
|
+
this._connected = true;
|
|
153
|
+
const syntheticHello = {
|
|
154
|
+
type: "hello-ok",
|
|
155
|
+
protocol: PROTOCOL_VERSION,
|
|
156
|
+
server: {
|
|
157
|
+
version: "unknown",
|
|
158
|
+
connId: "pooled"
|
|
159
|
+
},
|
|
160
|
+
features: {
|
|
161
|
+
methods: [],
|
|
162
|
+
events: []
|
|
163
|
+
},
|
|
164
|
+
snapshot: {},
|
|
165
|
+
policy: {
|
|
166
|
+
maxPayload: 25 * 1024 * 1024,
|
|
167
|
+
maxBufferedBytes: 0,
|
|
168
|
+
tickIntervalMs: 3e4
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
if (frame.event === "health" && ((_c = frame.payload) == null ? void 0 : _c.defaultAgentId)) {
|
|
172
|
+
syntheticHello.snapshot = frame.payload;
|
|
173
|
+
}
|
|
174
|
+
this._hello = syntheticHello;
|
|
175
|
+
settle(() => resolve(syntheticHello));
|
|
176
|
+
}
|
|
177
|
+
this.emit(frame.event, frame.payload);
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
/** Send an RPC request and wait for the response. */
|
|
183
|
+
request(method, params, timeoutMs = RPC_TIMEOUT_MS) {
|
|
184
|
+
if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
|
|
185
|
+
return Promise.reject(new Error("not connected"));
|
|
186
|
+
}
|
|
187
|
+
const id = newRequestId();
|
|
188
|
+
const frame = {
|
|
189
|
+
type: "req",
|
|
190
|
+
id,
|
|
191
|
+
method,
|
|
192
|
+
params
|
|
193
|
+
};
|
|
194
|
+
return new Promise((resolve, reject) => {
|
|
195
|
+
const timer = setTimeout(() => {
|
|
196
|
+
this.pending.delete(id);
|
|
197
|
+
reject(new Error(`RPC timeout: ${method} after ${timeoutMs}ms`));
|
|
198
|
+
}, timeoutMs);
|
|
199
|
+
this.pending.set(id, {
|
|
200
|
+
resolve,
|
|
201
|
+
reject,
|
|
202
|
+
timer
|
|
203
|
+
});
|
|
204
|
+
this.ws.send(JSON.stringify(frame));
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
/** Close the connection. */
|
|
208
|
+
close() {
|
|
209
|
+
var _a;
|
|
210
|
+
this._connected = false;
|
|
211
|
+
(_a = this.ws) == null ? void 0 : _a.close();
|
|
212
|
+
this.flushPending(new Error("client closed"));
|
|
213
|
+
}
|
|
214
|
+
// ─── High-Level RPC Methods ─────────────────────────────
|
|
215
|
+
async getStatus() {
|
|
216
|
+
return this.request("status", {});
|
|
217
|
+
}
|
|
218
|
+
async listModels() {
|
|
219
|
+
return this.request("models.list", {});
|
|
220
|
+
}
|
|
221
|
+
async listAgents() {
|
|
222
|
+
return this.request("agents.list", {});
|
|
223
|
+
}
|
|
224
|
+
async createAgent(name, workspace) {
|
|
225
|
+
return this.request("agents.create", {
|
|
226
|
+
name,
|
|
227
|
+
workspace
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
async updateAgent(agentId, params) {
|
|
231
|
+
return this.request("agents.update", __spreadValues({
|
|
232
|
+
agentId
|
|
233
|
+
}, params));
|
|
234
|
+
}
|
|
235
|
+
async deleteAgent(agentId) {
|
|
236
|
+
return this.request("agents.delete", {
|
|
237
|
+
agentId
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
async listAgentFiles(agentId) {
|
|
241
|
+
return this.request("agents.files.list", {
|
|
242
|
+
agentId
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
async getAgentFile(agentId, name) {
|
|
246
|
+
return this.request("agents.files.get", {
|
|
247
|
+
agentId,
|
|
248
|
+
name
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
async setAgentFile(agentId, name, content) {
|
|
252
|
+
return this.request("agents.files.set", {
|
|
253
|
+
agentId,
|
|
254
|
+
name,
|
|
255
|
+
content
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
// ─── Chat Methods ───────────────────────────────────────
|
|
259
|
+
/** Get chat history for a session. */
|
|
260
|
+
async getChatHistory(sessionKey, limit = 200) {
|
|
261
|
+
return this.request("chat.history", {
|
|
262
|
+
sessionKey,
|
|
263
|
+
limit
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Send a chat message. Returns immediately with a runId;
|
|
268
|
+
* the response streams via 'chat' events.
|
|
269
|
+
*/
|
|
270
|
+
async sendChatMessage(sessionKey, message, opts) {
|
|
271
|
+
return this.request("chat.send", __spreadValues({
|
|
272
|
+
sessionKey,
|
|
273
|
+
message,
|
|
274
|
+
deliver: true,
|
|
275
|
+
idempotencyKey: newRequestId()
|
|
276
|
+
}, opts));
|
|
277
|
+
}
|
|
278
|
+
/** Abort a running chat completion. */
|
|
279
|
+
async abortChat(runId) {
|
|
280
|
+
await this.request("chat.abort", {
|
|
281
|
+
runId
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
// ─── Skills Methods ─────────────────────────────────────
|
|
285
|
+
async getSkillsStatus() {
|
|
286
|
+
return this.request("skills.status", {});
|
|
287
|
+
}
|
|
288
|
+
async updateSkill(skillKey, opts) {
|
|
289
|
+
return this.request("skills.update", __spreadValues({
|
|
290
|
+
skillKey
|
|
291
|
+
}, opts));
|
|
292
|
+
}
|
|
293
|
+
// ─── Session Methods ────────────────────────────────────
|
|
294
|
+
async listSessions(opts) {
|
|
295
|
+
return this.request("sessions.list", opts != null ? opts : {});
|
|
296
|
+
}
|
|
297
|
+
async patchSession(key, patch) {
|
|
298
|
+
return this.request("sessions.patch", __spreadValues({
|
|
299
|
+
key
|
|
300
|
+
}, patch));
|
|
301
|
+
}
|
|
302
|
+
async deleteSession(key) {
|
|
303
|
+
return this.request("sessions.delete", {
|
|
304
|
+
key,
|
|
305
|
+
deleteTranscript: true
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
async resetSession(key) {
|
|
309
|
+
return this.request("sessions.reset", {
|
|
310
|
+
key
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
// ─── Config Methods ─────────────────────────────────────
|
|
314
|
+
async getConfig() {
|
|
315
|
+
return this.request("config.get", {});
|
|
316
|
+
}
|
|
317
|
+
async patchConfig(patch, baseHash, opts) {
|
|
318
|
+
return this.request("config.patch", __spreadValues({
|
|
319
|
+
patch,
|
|
320
|
+
baseHash
|
|
321
|
+
}, opts));
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Set a specific agent as the default.
|
|
325
|
+
* Fetches the current config, marks the target agent with `default: true`,
|
|
326
|
+
* removes the flag from all other agents, then patches the config.
|
|
327
|
+
*/
|
|
328
|
+
async setDefaultAgent(agentId) {
|
|
329
|
+
var _a;
|
|
330
|
+
const current = await this.getConfig();
|
|
331
|
+
const config = (_a = current.config) != null ? _a : {};
|
|
332
|
+
const agentsSection = config.agents && typeof config.agents === "object" ? config.agents : {};
|
|
333
|
+
const existingList = Array.isArray(agentsSection.list) ? agentsSection.list : [];
|
|
334
|
+
const updatedList = [];
|
|
335
|
+
let found = false;
|
|
336
|
+
for (const entry of existingList) {
|
|
337
|
+
const clone = __spreadValues({}, entry);
|
|
338
|
+
if (clone.id === agentId) {
|
|
339
|
+
clone.default = true;
|
|
340
|
+
found = true;
|
|
341
|
+
} else {
|
|
342
|
+
delete clone.default;
|
|
343
|
+
}
|
|
344
|
+
updatedList.push(clone);
|
|
345
|
+
}
|
|
346
|
+
if (!found) {
|
|
347
|
+
updatedList.push({
|
|
348
|
+
id: agentId,
|
|
349
|
+
default: true,
|
|
350
|
+
workspace: `/home/node/.openclaw/workspaces/${agentId}`
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
const patch = {
|
|
354
|
+
agents: __spreadProps(__spreadValues({}, agentsSection), {
|
|
355
|
+
list: updatedList
|
|
356
|
+
})
|
|
357
|
+
};
|
|
358
|
+
return this.patchConfig(JSON.stringify(patch), current.hash, {
|
|
359
|
+
note: `Set default agent to "${agentId}"`
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
async setLlmKey(provider, apiKey) {
|
|
363
|
+
var _a, _b;
|
|
364
|
+
const envKey = `${provider.toUpperCase()}_API_KEY`;
|
|
365
|
+
const current = await this.getConfig();
|
|
366
|
+
const envObj = (_a = current.config.env) != null ? _a : {};
|
|
367
|
+
const varsObj = (_b = envObj == null ? void 0 : envObj.vars) != null ? _b : {};
|
|
368
|
+
const merged = __spreadProps(__spreadValues({}, current.config), {
|
|
369
|
+
env: __spreadProps(__spreadValues({}, envObj), {
|
|
370
|
+
vars: __spreadProps(__spreadValues({}, varsObj), {
|
|
371
|
+
[envKey]: apiKey
|
|
372
|
+
})
|
|
373
|
+
})
|
|
374
|
+
});
|
|
375
|
+
return this.request("config.set", {
|
|
376
|
+
raw: JSON.stringify(merged),
|
|
377
|
+
baseHash: current.hash
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
// ─── Channel Methods ────────────────────────────────────
|
|
381
|
+
async getChannelsStatus(probe = false) {
|
|
382
|
+
return this.request("channels.status", {
|
|
383
|
+
probe
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
async connectChannel(channel, config) {
|
|
387
|
+
var _a, _b, _c;
|
|
388
|
+
const supportedMethods = (_c = (_b = (_a = this._hello) == null ? void 0 : _a.features) == null ? void 0 : _b.methods) != null ? _c : [];
|
|
389
|
+
if (supportedMethods.includes("channels.connect")) {
|
|
390
|
+
return this.request("channels.connect", {
|
|
391
|
+
channel,
|
|
392
|
+
config: __spreadValues({
|
|
393
|
+
enabled: true
|
|
394
|
+
}, config)
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
return this.mergeAndSetConfig({
|
|
398
|
+
channels: {
|
|
399
|
+
[channel]: __spreadValues({
|
|
400
|
+
enabled: true
|
|
401
|
+
}, config)
|
|
402
|
+
}
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
async mergeAndSetConfig(patch) {
|
|
406
|
+
var _a;
|
|
407
|
+
const current = await this.getConfig();
|
|
408
|
+
const base = (_a = current.config) != null ? _a : {};
|
|
409
|
+
const merged = deepMerge(base, patch);
|
|
410
|
+
const mergedJson = JSON.stringify(merged);
|
|
411
|
+
const baseJson = JSON.stringify(base);
|
|
412
|
+
if (mergedJson === baseJson) return;
|
|
413
|
+
return this.request("config.set", {
|
|
414
|
+
raw: mergedJson,
|
|
415
|
+
baseHash: current.hash
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
async restartGateway() {
|
|
419
|
+
try {
|
|
420
|
+
return await this.request("gateway.restart", {}, 1e4);
|
|
421
|
+
} catch (err) {
|
|
422
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
423
|
+
if (msg.includes("closed") || msg.includes("timeout") || msg.includes("lost")) {
|
|
424
|
+
return {
|
|
425
|
+
restarting: true
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
throw err;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
async logoutChannel(channel) {
|
|
432
|
+
return this.request("channels.logout", {
|
|
433
|
+
channel
|
|
434
|
+
});
|
|
435
|
+
}
|
|
436
|
+
async applyConfig(raw, baseHash, opts) {
|
|
437
|
+
return this.request("config.set", __spreadValues({
|
|
438
|
+
raw,
|
|
439
|
+
baseHash
|
|
440
|
+
}, opts));
|
|
441
|
+
}
|
|
442
|
+
async webLoginStart(opts = {}) {
|
|
443
|
+
return this.request("web.login.start", opts);
|
|
444
|
+
}
|
|
445
|
+
async webLoginWait(opts = {}) {
|
|
446
|
+
var _a;
|
|
447
|
+
const clientTimeout = ((_a = opts.timeoutMs) != null ? _a : 12e4) + 1e4;
|
|
448
|
+
return this.request("web.login.wait", opts, clientTimeout);
|
|
449
|
+
}
|
|
450
|
+
// ─── Private ────────────────────────────────────────────
|
|
451
|
+
emit(event, payload) {
|
|
452
|
+
const handlers = this._eventHandlers.get(event);
|
|
453
|
+
if (handlers) {
|
|
454
|
+
for (const handler of handlers) {
|
|
455
|
+
try {
|
|
456
|
+
handler(payload);
|
|
457
|
+
} catch (e) {
|
|
458
|
+
console.error(`[GatewayClient] Event handler error for '${event}':`, e);
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
flushPending(err) {
|
|
464
|
+
for (const [, p] of this.pending) {
|
|
465
|
+
clearTimeout(p.timer);
|
|
466
|
+
p.reject(err);
|
|
467
|
+
}
|
|
468
|
+
this.pending.clear();
|
|
469
|
+
}
|
|
470
|
+
}export{GatewayClient};//# sourceMappingURL=gatewayClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gatewayClient.js","sources":["../../src/services/gatewayClient.ts"],"sourcesContent":["/**\n * OpenClaw Gateway WebSocket client for yantra-app.\n *\n * Speaks the gateway's protocol v3:\n * 1. Client opens WebSocket to /ws/openclaw-chat (backend proxy)\n * 2. Gateway sends connect.challenge event with nonce\n * 3. Client sends connect request with auth token\n * 4. Gateway replies with hello-ok (available methods, events, snapshot)\n * 5. Client sends RPC requests, gateway replies; chat streams via events\n */\n\nimport { v4 as uuidv4 } from 'uuid';\n\nfunction newRequestId(): string {\n const c = globalThis.crypto as Crypto | undefined;\n if (c?.randomUUID) return c.randomUUID();\n return uuidv4();\n}\n\n// ─── Protocol Constants ─────────────────────────────────────────\n\nconst PROTOCOL_VERSION = 3;\nconst CONNECT_TIMEOUT_MS = 30_000;\nconst RPC_TIMEOUT_MS = 30_000;\n\n// ─── Protocol Frame Types ───────────────────────────────────────\n\ninterface RequestFrame {\n type: 'req';\n id: string;\n method: string;\n params?: unknown;\n}\n\ninterface ResponseFrame {\n type: 'res';\n id: string;\n ok: boolean;\n payload?: unknown;\n error?: { code: string; message: string; retryable?: boolean };\n}\n\ninterface EventFrame {\n type: 'event';\n event: string;\n payload?: unknown;\n seq?: number;\n}\n\ntype Frame = RequestFrame | ResponseFrame | EventFrame;\n\n// ─── Public Types ───────────────────────────────────────────────\n\nexport interface HelloOk {\n type: 'hello-ok';\n protocol: number;\n server: { version: string; connId: string };\n features: { methods: string[]; events: string[] };\n snapshot: Record<string, unknown>;\n policy: { maxPayload: number; maxBufferedBytes: number; tickIntervalMs: number };\n}\n\nexport interface GatewayModel {\n id: string;\n name: string;\n provider: string;\n available: boolean;\n}\n\nexport interface GatewayAgent {\n id: string;\n name?: string;\n}\n\nexport interface GatewayAgentDetail {\n agentId: string;\n workspace: string;\n files: Array<{ name: string; path: string; missing: boolean; size?: number }>;\n}\n\nexport interface ChatSendResponse {\n runId: string;\n status: 'started' | 'queued';\n}\n\nexport interface ChatStreamEvent {\n runId: string;\n sessionKey: string;\n seq: number;\n state: 'delta' | 'final' | 'aborted' | 'error';\n message?: {\n role: string;\n content: string | Array<{ type: string; text?: string; [k: string]: unknown }>;\n usage?: { inputTokens?: number; outputTokens?: number };\n stopReason?: string;\n };\n errorMessage?: string;\n}\n\nexport interface ChatHistoryResponse {\n sessionKey: string;\n sessionId?: string;\n messages: Array<{\n role: string;\n content: string | Array<{ type: string; text?: string; [k: string]: unknown }>;\n timestamp?: number;\n usage?: { inputTokens?: number; outputTokens?: number };\n }>;\n}\n\nexport interface SkillInfo {\n skillKey: string;\n name: string;\n description?: string;\n eligible: boolean;\n enabled?: boolean;\n missing?: { env?: string[]; binaries?: string[] };\n}\n\nexport interface GatewayStatus {\n healthy: boolean;\n uptime?: number;\n version?: string;\n connId?: string;\n}\n\nexport interface ChannelStatusEntry {\n channel: string;\n accountId?: string;\n configured: boolean;\n connected: boolean;\n enabled: boolean;\n error?: string;\n linked?: boolean;\n running?: boolean;\n lastError?: string;\n [key: string]: unknown;\n}\n\nexport interface ChannelsStatusResponse {\n channels: ChannelStatusEntry[];\n}\n\n// ─── Pending Request Tracker ────────────────────────────────────\n\ninterface Pending {\n resolve: (value: unknown) => void;\n reject: (err: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n}\n\n// ─── Helpers ────────────────────────────────────────────────────\n\nfunction deepMerge(target: Record<string, unknown>, source: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = { ...target };\n for (const key of Object.keys(source)) {\n const sv = source[key];\n const tv = result[key];\n if (sv && typeof sv === 'object' && !Array.isArray(sv) && tv && typeof tv === 'object' && !Array.isArray(tv)) {\n result[key] = deepMerge(tv as Record<string, unknown>, sv as Record<string, unknown>);\n } else {\n result[key] = sv;\n }\n }\n return result;\n}\n\n// ─── GatewayClient ──────────────────────────────────────────────\n\n/**\n * WebSocket client for communicating with an OpenClaw gateway\n * through the backend chat proxy (/ws/openclaw-chat).\n */\nexport class GatewayClient {\n private ws: WebSocket | null = null;\n\n private pending = new Map<string, Pending>();\n\n private _connected = false;\n\n private _hello: HelloOk | null = null;\n\n private _eventHandlers = new Map<string, Set<(payload: unknown) => void>>();\n\n private readonly url: string;\n\n private readonly token: string;\n\n private readonly wsProtocol?: string;\n\n constructor(url: string, token: string, wsProtocol?: string) {\n this.url = url;\n this.token = token;\n this.wsProtocol = wsProtocol;\n }\n\n get connected(): boolean {\n return this._connected;\n }\n\n get hello(): HelloOk | null {\n return this._hello;\n }\n\n /** Register an event handler for gateway push events. */\n on(event: string, handler: (payload: unknown) => void): void {\n if (!this._eventHandlers.has(event)) {\n this._eventHandlers.set(event, new Set());\n }\n this._eventHandlers.get(event)!.add(handler);\n }\n\n /** Remove an event handler. */\n off(event: string, handler: (payload: unknown) => void): void {\n this._eventHandlers.get(event)?.delete(handler);\n }\n\n /** Connect to the gateway and authenticate. Resolves with HelloOk on success. */\n connect(): Promise<HelloOk> {\n return new Promise((resolve, reject) => {\n let settled = false;\n let timer: ReturnType<typeof setTimeout>;\n let sawChallenge = false;\n const settle = (fn: () => void) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n fn();\n };\n\n timer = setTimeout(\n () => settle(() => reject(new Error(`connect timeout after ${CONNECT_TIMEOUT_MS}ms`))),\n CONNECT_TIMEOUT_MS,\n );\n\n this.ws = this.wsProtocol ? new WebSocket(this.url, this.wsProtocol) : new WebSocket(this.url);\n\n this.ws.onerror = (ev) => {\n console.error(`[GatewayClient] WS error: url=${this.url}`, ev);\n settle(() => reject(new Error('WebSocket connection error')));\n };\n\n this.ws.onclose = (ev) => {\n this._connected = false;\n this.flushPending(new Error('connection closed'));\n const detail = ev.reason ? ` reason=\"${ev.reason}\"` : '';\n console.warn(\n `[GatewayClient] WS closed: code=${ev.code}${detail} url=${this.url} challengeReceived=${sawChallenge}`,\n );\n settle(() => reject(new Error(`connection closed before handshake (code=${ev.code})`)));\n this.emit('disconnect', { code: ev.code, reason: ev.reason });\n };\n\n this.ws.onmessage = (event) => {\n const raw = typeof event.data === 'string' ? event.data : String(event.data);\n let frame: Frame;\n try {\n frame = JSON.parse(raw);\n } catch {\n return;\n }\n\n // Handle connect.challenge → send connect request (fresh connection)\n if (frame.type === 'event' && frame.event === 'connect.challenge') {\n sawChallenge = true;\n this.request<HelloOk>('connect', {\n minProtocol: PROTOCOL_VERSION,\n maxProtocol: PROTOCOL_VERSION,\n client: {\n id: 'openclaw-control-ui',\n version: '1.0.0',\n platform: 'react-native',\n mode: 'ui',\n displayName: 'Yantra App',\n },\n role: 'operator',\n scopes: ['operator.admin', 'operator.read', 'operator.write'],\n caps: [],\n auth: { token: this.token },\n })\n .then((hello) => {\n this._connected = true;\n this._hello = hello;\n settle(() => resolve(hello));\n })\n .catch((err) => settle(() => reject(err)));\n return;\n }\n\n // Handle response frames\n if (frame.type === 'res') {\n const p = this.pending.get(frame.id);\n if (p) {\n clearTimeout(p.timer);\n this.pending.delete(frame.id);\n if (frame.ok) {\n p.resolve(frame.payload);\n } else {\n p.reject(new Error(frame.error?.message ?? 'RPC error'));\n }\n }\n return;\n }\n\n // Handle event frames\n if (frame.type === 'event') {\n // Pooled/pre-authenticated connection: receiving events without\n // a prior connect.challenge means the proxy reused an already-\n // authenticated server→gateway WS. Consider ourselves connected.\n if (!sawChallenge && !this._connected) {\n this._connected = true;\n const syntheticHello: HelloOk = {\n type: 'hello-ok',\n protocol: PROTOCOL_VERSION,\n server: { version: 'unknown', connId: 'pooled' },\n features: { methods: [], events: [] },\n snapshot: {},\n policy: { maxPayload: 25 * 1024 * 1024, maxBufferedBytes: 0, tickIntervalMs: 30000 },\n };\n // Extract server info from health events if available\n if (frame.event === 'health' && (frame.payload as any)?.defaultAgentId) {\n syntheticHello.snapshot = frame.payload as Record<string, unknown>;\n }\n this._hello = syntheticHello;\n settle(() => resolve(syntheticHello));\n }\n this.emit(frame.event, frame.payload);\n }\n };\n });\n }\n\n /** Send an RPC request and wait for the response. */\n request<T = unknown>(method: string, params?: unknown, timeoutMs = RPC_TIMEOUT_MS): Promise<T> {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n return Promise.reject(new Error('not connected'));\n }\n\n const id = newRequestId();\n const frame: RequestFrame = { type: 'req', id, method, params };\n\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pending.delete(id);\n reject(new Error(`RPC timeout: ${method} after ${timeoutMs}ms`));\n }, timeoutMs);\n\n this.pending.set(id, {\n resolve: resolve as (v: unknown) => void,\n reject,\n timer,\n });\n\n this.ws!.send(JSON.stringify(frame));\n });\n }\n\n /** Close the connection. */\n close(): void {\n this._connected = false;\n this.ws?.close();\n this.flushPending(new Error('client closed'));\n }\n\n // ─── High-Level RPC Methods ─────────────────────────────\n\n async getStatus(): Promise<GatewayStatus> {\n return this.request<GatewayStatus>('status', {});\n }\n\n async listModels(): Promise<GatewayModel[]> {\n return this.request<GatewayModel[]>('models.list', {});\n }\n\n async listAgents(): Promise<{ defaultId: string; agents: GatewayAgent[] }> {\n return this.request('agents.list', {});\n }\n\n async createAgent(name: string, workspace: string): Promise<{ ok: boolean; agentId: string }> {\n return this.request('agents.create', { name, workspace });\n }\n\n async updateAgent(agentId: string, params: { model?: string; name?: string }): Promise<{ ok: boolean }> {\n return this.request('agents.update', { agentId, ...params });\n }\n\n async deleteAgent(agentId: string): Promise<{ ok: boolean }> {\n return this.request('agents.delete', { agentId });\n }\n\n async listAgentFiles(agentId: string): Promise<GatewayAgentDetail> {\n return this.request('agents.files.list', { agentId });\n }\n\n async getAgentFile(agentId: string, name: string): Promise<{ file: { name: string; content: string } }> {\n return this.request('agents.files.get', { agentId, name });\n }\n\n async setAgentFile(agentId: string, name: string, content: string): Promise<{ ok: boolean }> {\n return this.request('agents.files.set', { agentId, name, content });\n }\n\n // ─── Chat Methods ───────────────────────────────────────\n\n /** Get chat history for a session. */\n async getChatHistory(sessionKey: string, limit = 200): Promise<ChatHistoryResponse> {\n return this.request<ChatHistoryResponse>('chat.history', { sessionKey, limit });\n }\n\n /**\n * Send a chat message. Returns immediately with a runId;\n * the response streams via 'chat' events.\n */\n async sendChatMessage(\n sessionKey: string,\n message: string,\n opts?: { thinking?: string },\n ): Promise<ChatSendResponse> {\n return this.request<ChatSendResponse>('chat.send', {\n sessionKey,\n message,\n deliver: true,\n idempotencyKey: newRequestId(),\n ...opts,\n });\n }\n\n /** Abort a running chat completion. */\n async abortChat(runId: string): Promise<void> {\n await this.request('chat.abort', { runId });\n }\n\n // ─── Skills Methods ─────────────────────────────────────\n\n async getSkillsStatus(): Promise<{ skills: SkillInfo[] }> {\n return this.request('skills.status', {});\n }\n\n async updateSkill(skillKey: string, opts: { apiKey?: string; enabled?: boolean }): Promise<unknown> {\n return this.request('skills.update', { skillKey, ...opts });\n }\n\n // ─── Session Methods ────────────────────────────────────\n\n async listSessions(opts?: { limit?: number }): Promise<unknown> {\n return this.request('sessions.list', opts ?? {});\n }\n\n async patchSession(key: string, patch: { label?: string; thinkingLevel?: string }): Promise<unknown> {\n return this.request('sessions.patch', { key, ...patch });\n }\n\n async deleteSession(key: string): Promise<unknown> {\n return this.request('sessions.delete', { key, deleteTranscript: true });\n }\n\n async resetSession(key: string): Promise<unknown> {\n return this.request('sessions.reset', { key });\n }\n\n // ─── Config Methods ─────────────────────────────────────\n\n async getConfig(): Promise<{ hash: string; config: Record<string, unknown> }> {\n return this.request('config.get', {});\n }\n\n async patchConfig(patch: string, baseHash: string, opts?: { note?: string }): Promise<unknown> {\n return this.request('config.patch', { patch, baseHash, ...opts });\n }\n\n /**\n * Set a specific agent as the default.\n * Fetches the current config, marks the target agent with `default: true`,\n * removes the flag from all other agents, then patches the config.\n */\n async setDefaultAgent(agentId: string): Promise<unknown> {\n const current = await this.getConfig();\n const config = current.config ?? {};\n const agentsSection =\n config.agents && typeof config.agents === 'object' ? (config.agents as Record<string, unknown>) : {};\n const existingList = Array.isArray(agentsSection.list)\n ? (agentsSection.list as Array<Record<string, unknown>>)\n : [];\n\n const updatedList: Array<Record<string, unknown>> = [];\n let found = false;\n\n for (const entry of existingList) {\n const clone = { ...entry };\n if (clone.id === agentId) {\n clone.default = true;\n found = true;\n } else {\n delete clone.default;\n }\n updatedList.push(clone);\n }\n\n if (!found) {\n updatedList.push({\n id: agentId,\n default: true,\n workspace: `/home/node/.openclaw/workspaces/${agentId}`,\n });\n }\n\n const patch = { agents: { ...agentsSection, list: updatedList } };\n return this.patchConfig(JSON.stringify(patch), current.hash, {\n note: `Set default agent to \"${agentId}\"`,\n });\n }\n\n async setLlmKey(provider: string, apiKey: string): Promise<unknown> {\n const envKey = `${provider.toUpperCase()}_API_KEY`;\n const current = await this.getConfig();\n const envObj = (current.config.env as Record<string, unknown>) ?? {};\n const varsObj = (envObj?.vars as Record<string, unknown>) ?? {};\n const merged = {\n ...current.config,\n env: {\n ...envObj,\n vars: {\n ...varsObj,\n [envKey]: apiKey,\n },\n },\n };\n return this.request('config.set', { raw: JSON.stringify(merged), baseHash: current.hash });\n }\n\n // ─── Channel Methods ────────────────────────────────────\n\n async getChannelsStatus(probe = false): Promise<ChannelsStatusResponse> {\n return this.request<ChannelsStatusResponse>('channels.status', { probe });\n }\n\n async connectChannel(channel: string, config: Record<string, unknown>): Promise<unknown> {\n const supportedMethods = this._hello?.features?.methods ?? [];\n\n if (supportedMethods.includes('channels.connect')) {\n return this.request('channels.connect', {\n channel,\n config: { enabled: true, ...config },\n });\n }\n\n return this.mergeAndSetConfig({\n channels: {\n [channel]: { enabled: true, ...config },\n },\n });\n }\n\n async mergeAndSetConfig(patch: Record<string, unknown>): Promise<unknown> {\n const current = await this.getConfig();\n const base = current.config ?? {};\n const merged = deepMerge(base, patch);\n\n const mergedJson = JSON.stringify(merged);\n const baseJson = JSON.stringify(base);\n if (mergedJson === baseJson) return;\n\n return this.request('config.set', { raw: mergedJson, baseHash: current.hash });\n }\n\n async restartGateway(): Promise<unknown> {\n try {\n return await this.request('gateway.restart', {}, 10_000);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes('closed') || msg.includes('timeout') || msg.includes('lost')) {\n return { restarting: true };\n }\n throw err;\n }\n }\n\n async logoutChannel(channel: string): Promise<unknown> {\n return this.request('channels.logout', { channel });\n }\n\n async applyConfig(raw: string, baseHash: string, opts?: { note?: string }): Promise<unknown> {\n return this.request('config.set', { raw, baseHash, ...opts });\n }\n\n async webLoginStart(opts: { force?: boolean; verbose?: boolean } = {}): Promise<{\n qrDataUrl?: string;\n pairingCode?: string;\n message?: string;\n }> {\n return this.request('web.login.start', opts);\n }\n\n async webLoginWait(opts: { timeoutMs?: number } = {}): Promise<{\n connected: boolean;\n message?: string;\n }> {\n const clientTimeout = (opts.timeoutMs ?? 120_000) + 10_000;\n return this.request('web.login.wait', opts, clientTimeout);\n }\n\n // ─── Private ────────────────────────────────────────────\n\n private emit(event: string, payload: unknown): void {\n const handlers = this._eventHandlers.get(event);\n if (handlers) {\n for (const handler of handlers) {\n try {\n handler(payload);\n } catch (e) {\n console.error(`[GatewayClient] Event handler error for '${event}':`, e);\n }\n }\n }\n }\n\n private flushPending(err: Error): void {\n for (const [, p] of this.pending) {\n clearTimeout(p.timer);\n p.reject(err);\n }\n this.pending.clear();\n }\n}\n"],"names":["uuidv4"],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
const mobileTokens = {
|
|
2
|
+
color: {
|
|
3
|
+
bg: "#f8fafc",
|
|
4
|
+
surface: "#ffffff",
|
|
5
|
+
surfaceMuted: "#f1f5f9",
|
|
6
|
+
border: "#e2e8f0",
|
|
7
|
+
text: "#0f172a",
|
|
8
|
+
textMuted: "#475569",
|
|
9
|
+
primary: "#4f46e5",
|
|
10
|
+
primarySoft: "#eef2ff",
|
|
11
|
+
primaryBorder: "#c7d2fe",
|
|
12
|
+
successSoft: "#ecfdf5",
|
|
13
|
+
successText: "#047857",
|
|
14
|
+
warningSoft: "#fffbeb",
|
|
15
|
+
warningText: "#b45309",
|
|
16
|
+
dangerSoft: "#fef2f2",
|
|
17
|
+
dangerText: "#b91c1c"
|
|
18
|
+
}};export{mobileTokens};//# sourceMappingURL=mobileTokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mobileTokens.js","sources":["../../src/theme/mobileTokens.ts"],"sourcesContent":["export const mobileTokens = {\n color: {\n bg: '#f8fafc',\n surface: '#ffffff',\n surfaceMuted: '#f1f5f9',\n border: '#e2e8f0',\n text: '#0f172a',\n textMuted: '#475569',\n primary: '#4f46e5',\n primarySoft: '#eef2ff',\n primaryBorder: '#c7d2fe',\n successSoft: '#ecfdf5',\n successText: '#047857',\n warningSoft: '#fffbeb',\n warningText: '#b45309',\n dangerSoft: '#fef2f2',\n dangerText: '#b91c1c',\n },\n radius: {\n sm: 10,\n md: 14,\n lg: 18,\n pill: 999,\n },\n shadow: {\n card: {\n shadowColor: '#0f172a',\n shadowOpacity: 0.06,\n shadowRadius: 10,\n shadowOffset: { width: 0, height: 4 },\n elevation: 2,\n },\n },\n} as const;\n"],"names":[],"mappings":"AAAO,MAAM,YAAe,GAAA;AAAA,EAC1B,KAAO,EAAA;AAAA,IACL,EAAI,EAAA,SAAA;AAAA,IACJ,OAAS,EAAA,SAAA;AAAA,IACT,YAAc,EAAA,SAAA;AAAA,IACd,MAAQ,EAAA,SAAA;AAAA,IACR,IAAM,EAAA,SAAA;AAAA,IACN,SAAW,EAAA,SAAA;AAAA,IACX,OAAS,EAAA,SAAA;AAAA,IACT,WAAa,EAAA,SAAA;AAAA,IACb,aAAe,EAAA,SAAA;AAAA,IACf,WAAa,EAAA,SAAA;AAAA,IACb,WAAa,EAAA,SAAA;AAAA,IACb,WAAa,EAAA,SAAA;AAAA,IACb,WAAa,EAAA,SAAA;AAAA,IACb,UAAY,EAAA,SAAA;AAAA,IACZ,UAAY,EAAA;AAAA,GAoBhB"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import AsyncStorage from'@react-native-async-storage/async-storage';import {STORAGE_KEYS}from'../config/constants.js';const GatewaySelectionStorage = {
|
|
2
|
+
async save(state) {
|
|
3
|
+
try {
|
|
4
|
+
await AsyncStorage.setItem(STORAGE_KEYS.GATEWAY_SELECTION, JSON.stringify(state));
|
|
5
|
+
} catch (e) {
|
|
6
|
+
}
|
|
7
|
+
},
|
|
8
|
+
async load() {
|
|
9
|
+
try {
|
|
10
|
+
const raw = await AsyncStorage.getItem(STORAGE_KEYS.GATEWAY_SELECTION);
|
|
11
|
+
if (raw) {
|
|
12
|
+
const parsed = JSON.parse(raw);
|
|
13
|
+
if (parsed == null ? void 0 : parsed.selectedGatewayId) return parsed;
|
|
14
|
+
}
|
|
15
|
+
} catch (e) {
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
selectedGatewayId: ""
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
};export{GatewaySelectionStorage};//# sourceMappingURL=gatewaySelectionStorage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gatewaySelectionStorage.js","sources":["../../src/utils/gatewaySelectionStorage.ts"],"sourcesContent":["import AsyncStorage from '@react-native-async-storage/async-storage';\nimport { STORAGE_KEYS } from '../config/constants';\nimport type { GatewayId } from '../config/constants';\n\nexport interface GatewaySelectionState {\n selectedGatewayId: GatewayId;\n}\n\nexport const GatewaySelectionStorage = {\n async save(state: GatewaySelectionState): Promise<void> {\n try {\n await AsyncStorage.setItem(STORAGE_KEYS.GATEWAY_SELECTION, JSON.stringify(state));\n } catch {\n // ignore\n }\n },\n\n async load(): Promise<GatewaySelectionState> {\n try {\n const raw = await AsyncStorage.getItem(STORAGE_KEYS.GATEWAY_SELECTION);\n if (raw) {\n const parsed = JSON.parse(raw) as GatewaySelectionState;\n if (parsed?.selectedGatewayId) return parsed;\n }\n } catch {\n // ignore\n }\n return { selectedGatewayId: '' };\n },\n};\n"],"names":[],"mappings":"sHAMO,MAAM,uBAA0B,GAAA;AAAA,EACrC,MAAM,KAAK,KAA6C,EAAA;AACtD,IAAI,IAAA;AACF,MAAA,MAAM,aAAa,OAAQ,CAAA,YAAA,CAAa,mBAAmB,IAAK,CAAA,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,KAC1E,CAAA,OAAA,CAAA,EAAA;AAAA;AAER,GACF;AAAA,EACA,MAAM,IAAuC,GAAA;AAC3C,IAAI,IAAA;AACF,MAAA,MAAM,GAAM,GAAA,MAAM,YAAa,CAAA,OAAA,CAAQ,aAAa,iBAAiB,CAAA;AACrE,MAAA,IAAI,GAAK,EAAA;AACP,QAAM,MAAA,MAAA,GAAS,IAAK,CAAA,KAAA,CAAM,GAAG,CAAA;AAC7B,QAAI,IAAA,MAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,MAAA,CAAQ,mBAA0B,OAAA,MAAA;AAAA;AACxC,KACM,CAAA,OAAA,CAAA,EAAA;AAAA;AAGR,IAAO,OAAA;AAAA,MACL,iBAAmB,EAAA;AAAA,KACrB;AAAA;AAEJ"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adminide-stack/yantra-mobile",
|
|
3
|
-
"version": "12.0.28-alpha.
|
|
3
|
+
"version": "12.0.28-alpha.71",
|
|
4
4
|
"description": "Sample core for higher packages to depend on",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"author": "CDMBase LLC",
|
|
@@ -25,11 +25,13 @@
|
|
|
25
25
|
"uuid": "^9.0.0"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
|
-
"common": "
|
|
28
|
+
"common": "12.0.28-alpha.71"
|
|
29
29
|
},
|
|
30
30
|
"peerDependencies": {
|
|
31
31
|
"@admin-layout/gluestack-ui-mobile": "*",
|
|
32
32
|
"@adminide-stack/core": "*",
|
|
33
|
+
"@adminide-stack/platform-client": "*",
|
|
34
|
+
"@adminide-stack/user-auth0-client": "*",
|
|
33
35
|
"@apollo/client": "*",
|
|
34
36
|
"@cdm-logger/client": "*",
|
|
35
37
|
"@common-stack/client-core": "*",
|
|
@@ -37,6 +39,8 @@
|
|
|
37
39
|
"@common-stack/core": "*",
|
|
38
40
|
"@expo/vector-icons": "*",
|
|
39
41
|
"@messenger-box/platform-mobile": "*",
|
|
42
|
+
"@react-native-async-storage/async-storage": "*",
|
|
43
|
+
"common": "12.0.28-alpha.68",
|
|
40
44
|
"lodash": "*"
|
|
41
45
|
},
|
|
42
46
|
"publishConfig": {
|
|
@@ -45,5 +49,5 @@
|
|
|
45
49
|
"typescript": {
|
|
46
50
|
"definition": "lib/index.d.ts"
|
|
47
51
|
},
|
|
48
|
-
"gitHead": "
|
|
52
|
+
"gitHead": "8bfd23ee413eccd57a3e0a69773572cc77941568"
|
|
49
53
|
}
|