camo-gemini 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +242 -0
  3. package/dist/client/camofox-client.d.ts +21 -0
  4. package/dist/client/camofox-client.d.ts.map +1 -0
  5. package/dist/client/camofox-client.js +260 -0
  6. package/dist/client/camofox-client.js.map +1 -0
  7. package/dist/config.d.ts +3 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +94 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/core/browser-js.d.ts +27 -0
  12. package/dist/core/browser-js.d.ts.map +1 -0
  13. package/dist/core/browser-js.js +172 -0
  14. package/dist/core/browser-js.js.map +1 -0
  15. package/dist/core/constants.d.ts +78 -0
  16. package/dist/core/constants.d.ts.map +1 -0
  17. package/dist/core/constants.js +115 -0
  18. package/dist/core/constants.js.map +1 -0
  19. package/dist/core/error-messages.d.ts +8 -0
  20. package/dist/core/error-messages.d.ts.map +1 -0
  21. package/dist/core/error-messages.js +121 -0
  22. package/dist/core/error-messages.js.map +1 -0
  23. package/dist/core/failover.d.ts +21 -0
  24. package/dist/core/failover.d.ts.map +1 -0
  25. package/dist/core/failover.js +47 -0
  26. package/dist/core/failover.js.map +1 -0
  27. package/dist/core/logger.d.ts +13 -0
  28. package/dist/core/logger.d.ts.map +1 -0
  29. package/dist/core/logger.js +37 -0
  30. package/dist/core/logger.js.map +1 -0
  31. package/dist/core/request-builder.d.ts +20 -0
  32. package/dist/core/request-builder.d.ts.map +1 -0
  33. package/dist/core/request-builder.js +210 -0
  34. package/dist/core/request-builder.js.map +1 -0
  35. package/dist/core/response-parser.d.ts +12 -0
  36. package/dist/core/response-parser.d.ts.map +1 -0
  37. package/dist/core/response-parser.js +221 -0
  38. package/dist/core/response-parser.js.map +1 -0
  39. package/dist/core/retry.d.ts +10 -0
  40. package/dist/core/retry.d.ts.map +1 -0
  41. package/dist/core/retry.js +132 -0
  42. package/dist/core/retry.js.map +1 -0
  43. package/dist/core/stream-parser.d.ts +9 -0
  44. package/dist/core/stream-parser.d.ts.map +1 -0
  45. package/dist/core/stream-parser.js +69 -0
  46. package/dist/core/stream-parser.js.map +1 -0
  47. package/dist/core/token-manager.d.ts +9 -0
  48. package/dist/core/token-manager.d.ts.map +1 -0
  49. package/dist/core/token-manager.js +64 -0
  50. package/dist/core/token-manager.js.map +1 -0
  51. package/dist/core/utils.d.ts +2 -0
  52. package/dist/core/utils.d.ts.map +1 -0
  53. package/dist/core/utils.js +15 -0
  54. package/dist/core/utils.js.map +1 -0
  55. package/dist/dashboard/server.d.ts +31 -0
  56. package/dist/dashboard/server.d.ts.map +1 -0
  57. package/dist/dashboard/server.js +190 -0
  58. package/dist/dashboard/server.js.map +1 -0
  59. package/dist/errors.d.ts +32 -0
  60. package/dist/errors.d.ts.map +1 -0
  61. package/dist/errors.js +59 -0
  62. package/dist/errors.js.map +1 -0
  63. package/dist/index.d.ts +3 -0
  64. package/dist/index.d.ts.map +1 -0
  65. package/dist/index.js +36 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/server.d.ts +31 -0
  68. package/dist/server.d.ts.map +1 -0
  69. package/dist/server.js +54 -0
  70. package/dist/server.js.map +1 -0
  71. package/dist/services/account.d.ts +16 -0
  72. package/dist/services/account.d.ts.map +1 -0
  73. package/dist/services/account.js +55 -0
  74. package/dist/services/account.js.map +1 -0
  75. package/dist/services/auth.d.ts +39 -0
  76. package/dist/services/auth.d.ts.map +1 -0
  77. package/dist/services/auth.js +285 -0
  78. package/dist/services/auth.js.map +1 -0
  79. package/dist/services/chat.d.ts +18 -0
  80. package/dist/services/chat.d.ts.map +1 -0
  81. package/dist/services/chat.js +151 -0
  82. package/dist/services/chat.js.map +1 -0
  83. package/dist/services/cookie-rotation.d.ts +25 -0
  84. package/dist/services/cookie-rotation.d.ts.map +1 -0
  85. package/dist/services/cookie-rotation.js +138 -0
  86. package/dist/services/cookie-rotation.js.map +1 -0
  87. package/dist/services/gems.d.ts +33 -0
  88. package/dist/services/gems.d.ts.map +1 -0
  89. package/dist/services/gems.js +202 -0
  90. package/dist/services/gems.js.map +1 -0
  91. package/dist/services/generate.d.ts +27 -0
  92. package/dist/services/generate.d.ts.map +1 -0
  93. package/dist/services/generate.js +149 -0
  94. package/dist/services/generate.js.map +1 -0
  95. package/dist/services/health.d.ts +20 -0
  96. package/dist/services/health.d.ts.map +1 -0
  97. package/dist/services/health.js +77 -0
  98. package/dist/services/health.js.map +1 -0
  99. package/dist/services/upload.d.ts +17 -0
  100. package/dist/services/upload.d.ts.map +1 -0
  101. package/dist/services/upload.js +120 -0
  102. package/dist/services/upload.js.map +1 -0
  103. package/dist/setup.d.ts +7 -0
  104. package/dist/setup.d.ts.map +1 -0
  105. package/dist/setup.js +165 -0
  106. package/dist/setup.js.map +1 -0
  107. package/dist/state.d.ts +57 -0
  108. package/dist/state.d.ts.map +1 -0
  109. package/dist/state.js +260 -0
  110. package/dist/state.js.map +1 -0
  111. package/dist/tools/account.d.ts +4 -0
  112. package/dist/tools/account.d.ts.map +1 -0
  113. package/dist/tools/account.js +29 -0
  114. package/dist/tools/account.js.map +1 -0
  115. package/dist/tools/auth.d.ts +4 -0
  116. package/dist/tools/auth.d.ts.map +1 -0
  117. package/dist/tools/auth.js +56 -0
  118. package/dist/tools/auth.js.map +1 -0
  119. package/dist/tools/chat.d.ts +4 -0
  120. package/dist/tools/chat.d.ts.map +1 -0
  121. package/dist/tools/chat.js +101 -0
  122. package/dist/tools/chat.js.map +1 -0
  123. package/dist/tools/gems.d.ts +4 -0
  124. package/dist/tools/gems.d.ts.map +1 -0
  125. package/dist/tools/gems.js +93 -0
  126. package/dist/tools/gems.js.map +1 -0
  127. package/dist/tools/health.d.ts +4 -0
  128. package/dist/tools/health.d.ts.map +1 -0
  129. package/dist/tools/health.js +13 -0
  130. package/dist/tools/health.js.map +1 -0
  131. package/dist/tools/media.d.ts +4 -0
  132. package/dist/tools/media.d.ts.map +1 -0
  133. package/dist/tools/media.js +65 -0
  134. package/dist/tools/media.js.map +1 -0
  135. package/dist/types.d.ts +292 -0
  136. package/dist/types.d.ts.map +1 -0
  137. package/dist/types.js +2 -0
  138. package/dist/types.js.map +1 -0
  139. package/package.json +66 -0
@@ -0,0 +1,18 @@
1
+ import type { ChatOptions, ChatResult, ChatSessionInfo, ChatSessionState } from "../types.js";
2
+ import type { GenerateService } from "./generate.js";
3
+ export declare class ChatService {
4
+ private generateService;
5
+ private sessions;
6
+ private chatLocks;
7
+ constructor(generateService: GenerateService);
8
+ chat(sessionId: string, prompt: string, options?: ChatOptions): Promise<ChatResult>;
9
+ private _doChat;
10
+ getSession(sessionId: string): ChatSessionState | undefined;
11
+ listSessions(): ChatSessionInfo[];
12
+ deleteSession(sessionId: string): boolean;
13
+ clearAll(): void;
14
+ clearAccount(accountIndex: number): void;
15
+ chooseCandidate(sessionId: string, candidateIndex: number): void;
16
+ private applyMetadataUpdate;
17
+ }
18
+ //# sourceMappingURL=chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/services/chat.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,WAAW,EACX,UAAU,EACV,eAAe,EACf,gBAAgB,EAEjB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,qBAAa,WAAW;IAIV,OAAO,CAAC,eAAe;IAHnC,OAAO,CAAC,QAAQ,CAAuC;IACvD,OAAO,CAAC,SAAS,CAA0C;gBAEvC,eAAe,EAAE,eAAe;IAE9C,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,UAAU,CAAC;YAa/E,OAAO;IAoErB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAI3D,YAAY,IAAI,eAAe,EAAE;IAUjC,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIzC,QAAQ,IAAI,IAAI;IAIhB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAQxC,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI;IA2BhE,OAAO,CAAC,mBAAmB;CA0B5B"}
@@ -0,0 +1,151 @@
1
+ import { NEW_CHAT_METADATA } from "../core/constants.js";
2
+ export class ChatService {
3
+ generateService;
4
+ sessions = new Map();
5
+ chatLocks = new Map();
6
+ constructor(generateService) {
7
+ this.generateService = generateService;
8
+ }
9
+ async chat(sessionId, prompt, options = {}) {
10
+ const inflight = this.chatLocks.get(sessionId);
11
+ if (inflight) {
12
+ return inflight;
13
+ }
14
+ const promise = this._doChat(sessionId, prompt, options).finally(() => {
15
+ this.chatLocks.delete(sessionId);
16
+ });
17
+ this.chatLocks.set(sessionId, promise);
18
+ return promise;
19
+ }
20
+ async _doChat(sessionId, prompt, options = {}) {
21
+ const now = Date.now();
22
+ let session = this.sessions.get(sessionId);
23
+ const isNewSession = !session;
24
+ if (!session) {
25
+ session = {
26
+ id: sessionId,
27
+ cid: "",
28
+ rid: "",
29
+ rcid: "",
30
+ context: "",
31
+ model: options.model,
32
+ accountIndex: options.accountIndex ?? 0,
33
+ gemId: options.gemId,
34
+ turns: [],
35
+ createdAt: now,
36
+ updatedAt: now
37
+ };
38
+ }
39
+ const model = options.model ?? session.model;
40
+ const accountIndex = options.accountIndex ?? session.accountIndex;
41
+ const gemId = options.gemId ?? session.gemId;
42
+ const chatMetadata = isNewSession
43
+ ? [...NEW_CHAT_METADATA]
44
+ : [session.cid, session.rid, session.rcid, null, null, null, null, null, null, session.context];
45
+ const generated = await this.generateService.generate({
46
+ prompt,
47
+ model,
48
+ accountIndex,
49
+ chatMetadata,
50
+ gemId
51
+ });
52
+ if (isNewSession) {
53
+ this.generateService.resetReqId();
54
+ this.sessions.set(sessionId, session);
55
+ }
56
+ session.model = model;
57
+ session.accountIndex = accountIndex;
58
+ session.gemId = gemId;
59
+ this.applyMetadataUpdate(session, generated.output);
60
+ session.turns.push({
61
+ prompt,
62
+ response: generated.output,
63
+ timestamp: now
64
+ });
65
+ session.updatedAt = now;
66
+ const primaryIndex = generated.output.chosenIndex >= 0 && generated.output.chosenIndex < generated.output.candidates.length
67
+ ? generated.output.chosenIndex
68
+ : 0;
69
+ const primaryCandidate = generated.output.candidates[primaryIndex];
70
+ return {
71
+ text: primaryCandidate?.text ?? "",
72
+ candidates: generated.output.candidates,
73
+ sessionId,
74
+ isNewSession,
75
+ turnNumber: session.turns.length
76
+ };
77
+ }
78
+ getSession(sessionId) {
79
+ return this.sessions.get(sessionId);
80
+ }
81
+ listSessions() {
82
+ return Array.from(this.sessions.values()).map((session) => ({
83
+ id: session.id,
84
+ turnCount: session.turns.length,
85
+ model: session.model,
86
+ createdAt: session.createdAt,
87
+ updatedAt: session.updatedAt
88
+ }));
89
+ }
90
+ deleteSession(sessionId) {
91
+ return this.sessions.delete(sessionId);
92
+ }
93
+ clearAll() {
94
+ this.sessions.clear();
95
+ }
96
+ clearAccount(accountIndex) {
97
+ for (const [sessionId, session] of this.sessions.entries()) {
98
+ if (session.accountIndex === accountIndex) {
99
+ this.sessions.delete(sessionId);
100
+ }
101
+ }
102
+ }
103
+ chooseCandidate(sessionId, candidateIndex) {
104
+ const session = this.sessions.get(sessionId);
105
+ if (!session) {
106
+ throw new Error(`Chat session not found: ${sessionId}`);
107
+ }
108
+ const lastTurn = session.turns[session.turns.length - 1];
109
+ if (!lastTurn) {
110
+ throw new Error("No turns in session");
111
+ }
112
+ if (candidateIndex < 0 || candidateIndex >= lastTurn.response.candidates.length) {
113
+ throw new Error(`Candidate index out of range: ${candidateIndex}`);
114
+ }
115
+ const candidate = lastTurn.response.candidates[candidateIndex];
116
+ if (!candidate) {
117
+ throw new Error(`Candidate index out of range: ${candidateIndex}`);
118
+ }
119
+ lastTurn.response.chosenIndex = candidateIndex;
120
+ if (candidate.rcid) {
121
+ session.rcid = candidate.rcid;
122
+ }
123
+ session.updatedAt = Date.now();
124
+ }
125
+ applyMetadataUpdate(session, output) {
126
+ const metadata = output.metadata;
127
+ const cid = metadata[0];
128
+ const rid = metadata[1];
129
+ const context = metadata[9];
130
+ if (cid) {
131
+ session.cid = cid;
132
+ }
133
+ if (rid) {
134
+ session.rid = rid;
135
+ }
136
+ if (context) {
137
+ session.context = context;
138
+ }
139
+ const chosenCandidate = output.candidates[output.chosenIndex] ?? output.candidates[0];
140
+ if (chosenCandidate?.rcid) {
141
+ session.rcid = chosenCandidate.rcid;
142
+ }
143
+ else {
144
+ const metadataRcid = metadata[2];
145
+ if (metadataRcid) {
146
+ session.rcid = metadataRcid;
147
+ }
148
+ }
149
+ }
150
+ }
151
+ //# sourceMappingURL=chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/services/chat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { CamofoxClient } from "../client/camofox-client.js";
2
+ import type { StateManager } from "../state.js";
3
+ import type { Config, CookieRotationResult } from "../types.js";
4
+ export declare class CookieRotationService {
5
+ private client;
6
+ private state;
7
+ private config;
8
+ private intervals;
9
+ private paused;
10
+ private lastErrors;
11
+ constructor(client: CamofoxClient, state: StateManager, config: Config);
12
+ startRotation(accountIndex: number): void;
13
+ stopRotation(accountIndex: number): void;
14
+ pauseRotation(accountIndex: number): void;
15
+ resumeRotation(accountIndex: number): void;
16
+ stopAll(): void;
17
+ start(): void;
18
+ stop(): void;
19
+ isRunning(accountIndex?: number): boolean;
20
+ getLastError(accountIndex?: number): string | null;
21
+ rotateOnce(accountIndex?: number): Promise<CookieRotationResult>;
22
+ private scheduleNext;
23
+ private delay;
24
+ }
25
+ //# sourceMappingURL=cookie-rotation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookie-rotation.d.ts","sourceRoot":"","sources":["../../src/services/cookie-rotation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAIhE,qBAAa,qBAAqB;IAM9B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,MAAM;IAPhB,OAAO,CAAC,SAAS,CAAoD;IACrE,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,UAAU,CAAoC;gBAG5C,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,MAAM;IAGxB,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAQzC,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAWxC,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAIzC,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAI1C,OAAO,IAAI,IAAI;IAMf,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,IAAI;IAIZ,SAAS,CAAC,YAAY,SAAI,GAAG,OAAO;IAIpC,YAAY,CAAC,YAAY,SAAI,GAAG,MAAM,GAAG,IAAI;IAIvC,UAAU,CAAC,YAAY,SAAI,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAsDjE,OAAO,CAAC,YAAY;IA+BpB,OAAO,CAAC,KAAK;CAQd"}
@@ -0,0 +1,138 @@
1
+ import { COOKIE_ROTATION_INTERVAL_MS, Endpoint } from "../core/constants.js";
2
+ import { logger } from "../core/logger.js";
3
+ export class CookieRotationService {
4
+ client;
5
+ state;
6
+ config;
7
+ intervals = new Map();
8
+ paused = new Set();
9
+ lastErrors = new Map();
10
+ constructor(client, state, config) {
11
+ this.client = client;
12
+ this.state = state;
13
+ this.config = config;
14
+ }
15
+ startRotation(accountIndex) {
16
+ if (this.intervals.has(accountIndex)) {
17
+ return;
18
+ }
19
+ this.scheduleNext(accountIndex);
20
+ }
21
+ stopRotation(accountIndex) {
22
+ const timer = this.intervals.get(accountIndex);
23
+ if (timer) {
24
+ clearTimeout(timer);
25
+ this.intervals.delete(accountIndex);
26
+ }
27
+ this.paused.delete(accountIndex);
28
+ this.lastErrors.delete(accountIndex);
29
+ }
30
+ pauseRotation(accountIndex) {
31
+ this.paused.add(accountIndex);
32
+ }
33
+ resumeRotation(accountIndex) {
34
+ this.paused.delete(accountIndex);
35
+ }
36
+ stopAll() {
37
+ for (const accountIndex of this.intervals.keys()) {
38
+ this.stopRotation(accountIndex);
39
+ }
40
+ }
41
+ start() {
42
+ this.startRotation(0);
43
+ }
44
+ stop() {
45
+ this.stopRotation(0);
46
+ }
47
+ isRunning(accountIndex = 0) {
48
+ return this.intervals.has(accountIndex);
49
+ }
50
+ getLastError(accountIndex = 0) {
51
+ return this.lastErrors.get(accountIndex) ?? null;
52
+ }
53
+ async rotateOnce(accountIndex = 0) {
54
+ const entry = this.state.getAccount(accountIndex);
55
+ if (!entry?.session) {
56
+ return { ok: false, error: `No active session for account ${accountIndex}` };
57
+ }
58
+ const userId = entry.camofoxUserId;
59
+ let ephemeralTabId = null;
60
+ try {
61
+ const tab = await this.client.createTab("https://accounts.google.com", userId, `cookie-rotation-${accountIndex}`);
62
+ ephemeralTabId = tab.tabId;
63
+ await this.delay(1000);
64
+ const rotationJs = `(async () => {
65
+ try {
66
+ const resp = await fetch('${Endpoint.ROTATE_COOKIES}', {
67
+ method: 'POST',
68
+ headers: { 'Content-Type': 'application/json' },
69
+ body: '[000,"-0000000000000000000"]',
70
+ credentials: 'include'
71
+ });
72
+ return { ok: resp.ok, status: resp.status };
73
+ } catch (e) {
74
+ return { ok: false, error: e instanceof Error ? e.message : String(e) };
75
+ }
76
+ })()`;
77
+ const result = await this.client.evaluate(ephemeralTabId, rotationJs, userId, 10000);
78
+ if (!result.ok) {
79
+ return { ok: false, error: `Evaluate failed: ${result.error ?? "unknown error"}` };
80
+ }
81
+ const data = result.result;
82
+ if (data?.ok) {
83
+ this.state.recordRotation(accountIndex);
84
+ }
85
+ return data ?? { ok: false, error: "Missing rotation result" };
86
+ }
87
+ catch (error) {
88
+ const message = error instanceof Error ? error.message : String(error);
89
+ return { ok: false, error: message };
90
+ }
91
+ finally {
92
+ if (ephemeralTabId) {
93
+ try {
94
+ await this.client.closeTab(ephemeralTabId, userId);
95
+ }
96
+ catch {
97
+ // ignore cleanup errors
98
+ }
99
+ }
100
+ }
101
+ }
102
+ scheduleNext(accountIndex) {
103
+ const timerId = setTimeout(async () => {
104
+ if (!this.intervals.has(accountIndex)) {
105
+ return;
106
+ }
107
+ if (this.paused.has(accountIndex)) {
108
+ this.scheduleNext(accountIndex);
109
+ return;
110
+ }
111
+ try {
112
+ const result = await this.rotateOnce(accountIndex);
113
+ this.lastErrors.set(accountIndex, result.ok ? null : (result.error ?? "Unknown rotation error"));
114
+ if (!result.ok) {
115
+ logger.warn("rotation", "Cookie rotation failed", { accountIndex });
116
+ }
117
+ }
118
+ catch (error) {
119
+ this.lastErrors.set(accountIndex, error instanceof Error ? error.message : String(error));
120
+ logger.warn("rotation", "Cookie rotation failed", { accountIndex });
121
+ }
122
+ this.scheduleNext(accountIndex);
123
+ }, COOKIE_ROTATION_INTERVAL_MS);
124
+ this.intervals.set(accountIndex, timerId);
125
+ if (typeof timerId === "object" && "unref" in timerId) {
126
+ timerId.unref();
127
+ }
128
+ }
129
+ delay(ms) {
130
+ return new Promise((resolve) => {
131
+ const id = setTimeout(resolve, ms);
132
+ if (typeof id === "object" && "unref" in id) {
133
+ id.unref();
134
+ }
135
+ });
136
+ }
137
+ }
138
+ //# sourceMappingURL=cookie-rotation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookie-rotation.js","sourceRoot":"","sources":["../../src/services/cookie-rotation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { CamofoxClient } from "../client/camofox-client.js";
2
+ import type { AuthService } from "./auth.js";
3
+ import type { StateManager } from "../state.js";
4
+ import type { Config, Gem, GemCreateOptions, GemUpdateOptions } from "../types.js";
5
+ export interface GemsServiceDeps {
6
+ client: CamofoxClient;
7
+ auth: AuthService;
8
+ config: Config;
9
+ state: StateManager;
10
+ }
11
+ export declare class GemsService {
12
+ private deps;
13
+ private readonly requestBuilder;
14
+ private readonly streamParser;
15
+ private readonly responseParser;
16
+ constructor(deps: GemsServiceDeps);
17
+ listGems(options?: {
18
+ accountIndex?: number;
19
+ }): Promise<Gem[]>;
20
+ createGem(options: GemCreateOptions): Promise<Gem>;
21
+ updateGem(options: GemUpdateOptions): Promise<Gem>;
22
+ deleteGem(gemId: string, accountIndex?: number): Promise<void>;
23
+ private executeBatch;
24
+ private parseGemListPayload;
25
+ private parseGemMutationPayload;
26
+ private parseGemItem;
27
+ private asArray;
28
+ private readArray;
29
+ private wrapGemsError;
30
+ private resolveAccountIndex;
31
+ private executeWithOptionalFailover;
32
+ }
33
+ //# sourceMappingURL=gems.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gems.d.ts","sourceRoot":"","sources":["../../src/services/gems.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AASjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAsB,MAAM,EAAE,GAAG,EAAE,gBAAgB,EAAE,gBAAgB,EAA4B,MAAM,aAAa,CAAC;AAEjI,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,YAAY,CAAC;CACrB;AAED,qBAAa,WAAW;IAQpB,OAAO,CAAC,IAAI;IAPd,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAEhD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAE5C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;gBAGtC,IAAI,EAAE,eAAe;IAOzB,QAAQ,CAAC,OAAO,GAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAgCjE,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC;IAyBlD,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC;IAyBlD,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAgBtD,YAAY;IAyC1B,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,uBAAuB;IAwB/B,OAAO,CAAC,YAAY;IAwBpB,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,mBAAmB;YAIb,2BAA2B;CAe1C"}
@@ -0,0 +1,202 @@
1
+ import { buildBatchExpression } from "../core/browser-js.js";
2
+ import { RequestBuilder } from "../core/request-builder.js";
3
+ import { ResponseParser } from "../core/response-parser.js";
4
+ import { StreamParser } from "../core/stream-parser.js";
5
+ import { withFailover } from "../core/failover.js";
6
+ import { withRetry } from "../core/retry.js";
7
+ import { AppError } from "../errors.js";
8
+ export class GemsService {
9
+ deps;
10
+ requestBuilder;
11
+ streamParser;
12
+ responseParser;
13
+ constructor(deps) {
14
+ this.deps = deps;
15
+ this.requestBuilder = new RequestBuilder();
16
+ this.streamParser = new StreamParser();
17
+ this.responseParser = new ResponseParser();
18
+ }
19
+ async listGems(options = {}) {
20
+ const accountIndex = this.resolveAccountIndex(options.accountIndex);
21
+ try {
22
+ return await this.executeWithOptionalFailover(accountIndex, async (resolvedAccountIndex) => withRetry(async () => {
23
+ const session = await this.deps.auth.ensureSession(resolvedAccountIndex);
24
+ const tokens = await this.deps.auth.getTokens(resolvedAccountIndex);
25
+ const systemRaw = await this.executeBatch(this.requestBuilder.buildGemListPayload("system"), tokens, session.tabId, session.userId, resolvedAccountIndex);
26
+ const customRaw = await this.executeBatch(this.requestBuilder.buildGemListPayload("custom"), tokens, session.tabId, session.userId, resolvedAccountIndex);
27
+ const systemGems = this.parseGemListPayload(systemRaw, true);
28
+ const customGems = this.parseGemListPayload(customRaw, false);
29
+ return [...systemGems, ...customGems];
30
+ }, { maxRetries: 2 }));
31
+ }
32
+ catch (error) {
33
+ throw this.wrapGemsError(error);
34
+ }
35
+ }
36
+ async createGem(options) {
37
+ const accountIndex = this.resolveAccountIndex(options.accountIndex);
38
+ try {
39
+ return await this.executeWithOptionalFailover(accountIndex, async (resolvedAccountIndex) => withRetry(async () => {
40
+ const session = await this.deps.auth.ensureSession(resolvedAccountIndex);
41
+ const tokens = await this.deps.auth.getTokens(resolvedAccountIndex);
42
+ const payload = this.requestBuilder.buildGemCreatePayload({ ...options, accountIndex: resolvedAccountIndex });
43
+ const raw = await this.executeBatch(payload, tokens, session.tabId, session.userId, resolvedAccountIndex);
44
+ const parsedGem = this.parseGemMutationPayload(raw);
45
+ return {
46
+ id: parsedGem?.id ?? "",
47
+ name: parsedGem?.name ?? options.name,
48
+ description: parsedGem?.description ?? options.description,
49
+ instructions: parsedGem?.instructions ?? options.instructions,
50
+ isSystem: false
51
+ };
52
+ }, { maxRetries: 2 }));
53
+ }
54
+ catch (error) {
55
+ throw this.wrapGemsError(error);
56
+ }
57
+ }
58
+ async updateGem(options) {
59
+ const accountIndex = this.resolveAccountIndex(options.accountIndex);
60
+ try {
61
+ return await this.executeWithOptionalFailover(accountIndex, async (resolvedAccountIndex) => withRetry(async () => {
62
+ const session = await this.deps.auth.ensureSession(resolvedAccountIndex);
63
+ const tokens = await this.deps.auth.getTokens(resolvedAccountIndex);
64
+ const payload = this.requestBuilder.buildGemUpdatePayload({ ...options, accountIndex: resolvedAccountIndex });
65
+ const raw = await this.executeBatch(payload, tokens, session.tabId, session.userId, resolvedAccountIndex);
66
+ const parsedGem = this.parseGemMutationPayload(raw);
67
+ return {
68
+ id: parsedGem?.id ?? options.gemId,
69
+ name: parsedGem?.name ?? options.name ?? "",
70
+ description: parsedGem?.description ?? options.description,
71
+ instructions: parsedGem?.instructions ?? options.instructions,
72
+ isSystem: false
73
+ };
74
+ }, { maxRetries: 2 }));
75
+ }
76
+ catch (error) {
77
+ throw this.wrapGemsError(error);
78
+ }
79
+ }
80
+ async deleteGem(gemId, accountIndex) {
81
+ const resolvedAccountIndex = this.resolveAccountIndex(accountIndex);
82
+ try {
83
+ await this.executeWithOptionalFailover(resolvedAccountIndex, async (activeAccountIndex) => withRetry(async () => {
84
+ const session = await this.deps.auth.ensureSession(activeAccountIndex);
85
+ const tokens = await this.deps.auth.getTokens(activeAccountIndex);
86
+ const payload = this.requestBuilder.buildGemDeletePayload(gemId);
87
+ await this.executeBatch(payload, tokens, session.tabId, session.userId, activeAccountIndex);
88
+ }, { maxRetries: 2 }));
89
+ }
90
+ catch (error) {
91
+ throw this.wrapGemsError(error);
92
+ }
93
+ }
94
+ async executeBatch(payload, tokens, tabId, userId, accountIndex) {
95
+ const batch = this.requestBuilder.buildBatchPayload([payload], tokens, accountIndex);
96
+ const expression = buildBatchExpression({
97
+ url: batch.url,
98
+ headers: batch.headers,
99
+ body: batch.body
100
+ });
101
+ const evalResult = await this.deps.client.evaluateExtended(tabId, expression, userId, 120_000);
102
+ if (!evalResult.ok) {
103
+ throw new Error(`Evaluate failed: ${evalResult.error ?? "unknown"}`);
104
+ }
105
+ const fetchResult = evalResult.result;
106
+ if (!fetchResult?.ok || typeof fetchResult.data !== "string") {
107
+ throw new Error(`Gem batch fetch failed: ${fetchResult?.error ?? "no data"}`);
108
+ }
109
+ const frames = this.streamParser.extractFrames(fetchResult.data);
110
+ const parsed = this.responseParser.parseBatchResponse(frames, payload.rpcId);
111
+ if (!parsed.ok) {
112
+ const error = new Error(parsed.error.message);
113
+ error.code = parsed.error.code;
114
+ throw error;
115
+ }
116
+ return parsed.data;
117
+ }
118
+ parseGemListPayload(payload, isSystem) {
119
+ const list = this.readArray(payload, 2);
120
+ if (!list) {
121
+ return [];
122
+ }
123
+ return list
124
+ .map((item) => this.parseGemItem(item, isSystem))
125
+ .filter((item) => item !== null);
126
+ }
127
+ parseGemMutationPayload(payload) {
128
+ const root = this.asArray(payload);
129
+ if (!root || root.length === 0) {
130
+ return null;
131
+ }
132
+ const id = typeof root[0] === "string" ? root[0] : "";
133
+ if (!id) {
134
+ return null;
135
+ }
136
+ const details = this.readArray(root, 1);
137
+ const instructionsNode = this.readArray(root, 2);
138
+ const instructions = instructionsNode && typeof instructionsNode[0] === "string" ? instructionsNode[0] : undefined;
139
+ return {
140
+ id,
141
+ name: details && typeof details[0] === "string" ? details[0] : undefined,
142
+ description: details && typeof details[1] === "string" ? details[1] : undefined,
143
+ instructions,
144
+ isSystem: false
145
+ };
146
+ }
147
+ parseGemItem(item, isSystem) {
148
+ const row = this.asArray(item);
149
+ if (!row) {
150
+ return null;
151
+ }
152
+ const id = typeof row[0] === "string" ? row[0] : "";
153
+ if (!id) {
154
+ return null;
155
+ }
156
+ const details = this.readArray(row, 1);
157
+ const instructionsNode = this.readArray(row, 2);
158
+ const instructions = instructionsNode && typeof instructionsNode[0] === "string" ? instructionsNode[0] : undefined;
159
+ return {
160
+ id,
161
+ name: details && typeof details[0] === "string" ? details[0] : "",
162
+ description: details && typeof details[1] === "string" ? details[1] : undefined,
163
+ instructions,
164
+ isSystem
165
+ };
166
+ }
167
+ asArray(value) {
168
+ return Array.isArray(value) ? value : null;
169
+ }
170
+ readArray(value, index) {
171
+ const arr = this.asArray(value);
172
+ if (!arr) {
173
+ return null;
174
+ }
175
+ const nested = arr[index];
176
+ return Array.isArray(nested) ? nested : null;
177
+ }
178
+ wrapGemsError(error) {
179
+ if (error instanceof AppError) {
180
+ return error;
181
+ }
182
+ const message = error instanceof Error ? error.message : String(error);
183
+ if (/subscription|upgrade|gemini advanced|paid|not available|permission denied|403/i.test(message)) {
184
+ return new AppError("INTERNAL_ERROR", "Gems require a paid Gemini subscription for this account");
185
+ }
186
+ return new AppError("INTERNAL_ERROR", message);
187
+ }
188
+ resolveAccountIndex(accountIndex) {
189
+ return accountIndex ?? this.deps.state.activeAccountIndex ?? 0;
190
+ }
191
+ async executeWithOptionalFailover(accountIndex, operation) {
192
+ if (this.deps.state.getAllAccounts().length <= 1) {
193
+ return operation(accountIndex);
194
+ }
195
+ const failoverResult = await withFailover(this.deps.state, { accountIndex }, operation);
196
+ if (this.deps.state.activeAccountIndex !== failoverResult.usedAccountIndex) {
197
+ this.deps.state.setActiveAccount(failoverResult.usedAccountIndex);
198
+ }
199
+ return failoverResult.result;
200
+ }
201
+ }
202
+ //# sourceMappingURL=gems.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gems.js","sourceRoot":"","sources":["../../src/services/gems.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { RequestBuilder } from "../core/request-builder.js";
2
+ import type { CamofoxClient } from "../client/camofox-client.js";
3
+ import type { AuthService } from "./auth.js";
4
+ import type { StateManager } from "../state.js";
5
+ import type { Config, GenerateOptions, GenerateResult } from "../types.js";
6
+ export interface GenerateServiceDeps {
7
+ client: CamofoxClient;
8
+ auth: AuthService;
9
+ config: Config;
10
+ state: StateManager;
11
+ }
12
+ export declare class GenerateService {
13
+ private deps;
14
+ private readonly streamParser;
15
+ private readonly responseParser;
16
+ private readonly requestBuilder;
17
+ constructor(deps: GenerateServiceDeps);
18
+ generate(options: GenerateOptions): Promise<GenerateResult>;
19
+ private generateForAccount;
20
+ deleteConversation(accountIndex: number, conversationId: string): Promise<void>;
21
+ private executeBatch;
22
+ private resolveAccountIndex;
23
+ resetReqId(): void;
24
+ getRequestBuilder(): RequestBuilder;
25
+ generateImage(prompt: string, options?: Omit<GenerateOptions, "prompt" | "usePro">): Promise<GenerateResult>;
26
+ }
27
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/services/generate.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAK5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAsB,eAAe,EAAE,cAAc,EAA4B,MAAM,aAAa,CAAC;AAEzH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,YAAY,CAAC;CACrB;AAED,qBAAa,eAAe;IAQxB,OAAO,CAAC,IAAI;IAPd,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAE5C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAEhD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;gBAGtC,IAAI,EAAE,mBAAmB;IAO7B,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;YAoBnD,kBAAkB;IA+F1B,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAgBvE,YAAY;IAyC1B,OAAO,CAAC,mBAAmB;IAI3B,UAAU,IAAI,IAAI;IAIlB,iBAAiB,IAAI,cAAc;IAI7B,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,IAAI,CAAC,eAAe,EAAE,QAAQ,GAAG,QAAQ,CAAM,GACvD,OAAO,CAAC,cAAc,CAAC;CAO3B"}