replicas-engine 0.1.839 → 0.1.840

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.
@@ -5,11 +5,11 @@ import {
5
5
  getCodexAspHost,
6
6
  restartCodexAspHost,
7
7
  restartCodexAspHostIfRunning
8
- } from "./chunk-MXWXITQM.js";
9
- import "./chunk-YP35Y7KJ.js";
10
- import "./chunk-EQIJP7I2.js";
8
+ } from "./chunk-HGAWFOH4.js";
9
+ import "./chunk-KIIBVJNU.js";
10
+ import "./chunk-ELY6H3J2.js";
11
11
  import "./chunk-UZSNFLDQ.js";
12
- import "./chunk-SPI2REQM.js";
12
+ import "./chunk-JVARATE2.js";
13
13
  import "./chunk-VEQXQN22.js";
14
14
  export {
15
15
  getCodexAspHost,
@@ -3,12 +3,12 @@ import { createRequire as __createRequire } from 'node:module';
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  monolithRequest
6
- } from "./chunk-YP35Y7KJ.js";
6
+ } from "./chunk-KIIBVJNU.js";
7
7
  import {
8
8
  extractCommandProtectionCommandText,
9
9
  findGitCommitSignals,
10
10
  findPrMergeSignals
11
- } from "./chunk-SPI2REQM.js";
11
+ } from "./chunk-JVARATE2.js";
12
12
 
13
13
  // src/services/command-protection-service.ts
14
14
  var DEFAULT_COMMAND_PROTECTION_BLOCK_MESSAGE = "Blocked by Replicas command protection.";
@@ -4,7 +4,7 @@ const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  HOOK_EXEC_MAX_BUFFER_BYTES,
6
6
  isVersionBelow
7
- } from "./chunk-SPI2REQM.js";
7
+ } from "./chunk-JVARATE2.js";
8
8
 
9
9
  // src/utils/codex-agent-env.ts
10
10
  function buildCodexAgentEnv(source = process.env) {
@@ -241,7 +241,7 @@ var DEFAULT_CODEX_ARGS = [
241
241
  var MIN_CODEX_CLI_VERSION = "0.153.3";
242
242
  var CODEX_UPGRADE_TIMEOUT_MS = 12e4;
243
243
  var codexCliVersionEnsured = null;
244
- var ENGINE_PACKAGE_VERSION = "0.1.839";
244
+ var ENGINE_PACKAGE_VERSION = "0.1.840";
245
245
  var INITIALIZE_METHOD = "initialize";
246
246
  var INITIALIZED_NOTIFICATION = "initialized";
247
247
  var ACCOUNT_LOGIN_START_METHOD = "account/login/start";
@@ -5,13 +5,13 @@ import {
5
5
  ENGINE_ENV,
6
6
  monolithRequest,
7
7
  setAgentCredentialSnapshot
8
- } from "./chunk-YP35Y7KJ.js";
8
+ } from "./chunk-KIIBVJNU.js";
9
9
  import {
10
10
  AppServerProcess,
11
11
  SUBPROCESS_MAX_BUFFER,
12
12
  buildCodexAgentEnv,
13
13
  execFileAsync
14
- } from "./chunk-EQIJP7I2.js";
14
+ } from "./chunk-ELY6H3J2.js";
15
15
  import {
16
16
  isRecord
17
17
  } from "./chunk-UZSNFLDQ.js";
@@ -23,7 +23,7 @@ import {
23
23
  createSuccessResult,
24
24
  listOpenAICompatibleModels,
25
25
  resolveOpenAICompatibleModelsUrl
26
- } from "./chunk-SPI2REQM.js";
26
+ } from "./chunk-JVARATE2.js";
27
27
 
28
28
  // src/managers/codex-token-manager.ts
29
29
  import { promises as fs } from "fs";
@@ -238,7 +238,7 @@ var CodexTokenManager = class extends BaseRefreshManager {
238
238
  const data = await response.json();
239
239
  await this.applyCredentialsResponse(data);
240
240
  if (restartOnChange && CODEX_AUTH_ENV_KEYS.some((key, index) => process.env[key] !== previousEnv[index])) {
241
- const { restartCodexAspHostIfRunning: restartCodexAspHostIfRunning2 } = await import("./asp-host-BHBSQQSQ.js");
241
+ const { restartCodexAspHostIfRunning: restartCodexAspHostIfRunning2 } = await import("./asp-host-BVV4KSYB.js");
242
242
  await restartCodexAspHostIfRunning2();
243
243
  }
244
244
  if (data.scope) {
@@ -9,6 +9,7 @@ var AGENT = {
9
9
  CURSOR: "cursor",
10
10
  DEEPSEEK: "deepseek",
11
11
  FX: "fx",
12
+ GEMINI: "gemini",
12
13
  KIMI: "kimi",
13
14
  MUSE: "muse",
14
15
  OPENCODE: "opencode",
@@ -45,6 +46,7 @@ var THINKING_LEVELS_BY_AGENT = {
45
46
  cursor: STANDARD_THINKING_LEVELS,
46
47
  deepseek: STANDARD_THINKING_LEVELS,
47
48
  fx: STANDARD_THINKING_LEVELS,
49
+ gemini: STANDARD_THINKING_LEVELS,
48
50
  kimi: STANDARD_THINKING_LEVELS,
49
51
  muse: VALID_THINKING_LEVELS.filter((level) => level !== "max" && level !== "ultracode"),
50
52
  opencode: STANDARD_THINKING_LEVELS,
@@ -76,6 +78,8 @@ function getProviderDisplayName(provider, variant = "short") {
76
78
  return variant === "long" ? "DeepSeek Harness" : "DeepSeek";
77
79
  case "fx":
78
80
  return "fx";
81
+ case "gemini":
82
+ return "Gemini";
79
83
  case "kimi":
80
84
  return variant === "long" ? "Kimi Code" : "Kimi";
81
85
  case "muse":
@@ -193,6 +197,7 @@ var DEFAULT_CHAT_TITLES = {
193
197
  cursor: "Cursor",
194
198
  deepseek: "DeepSeek Harness",
195
199
  fx: "fx",
200
+ gemini: "Gemini CLI",
196
201
  kimi: "Kimi Code",
197
202
  muse: "Muse Code",
198
203
  opencode: "Opencode",
@@ -230,6 +235,7 @@ var DEEPSEEK_V4_PRO_MODEL = "deepseek/deepseek-v4-pro-0813";
230
235
  var DEEPSEEK_V4_FLASH_MODEL = "deepseek/deepseek-v4-flash-0731";
231
236
  var DEFAULT_DEEPSEEK_MODEL = DEEPSEEK_V4_PRO_MODEL;
232
237
  var DEFAULT_FX_MODEL = "zai/glm-5.2";
238
+ var DEFAULT_GEMINI_MODEL = "gemini-3-flash-preview";
233
239
  var DEFAULT_KIMI_MODEL = "moonshotai/kimi-k2.6";
234
240
  var MUSE_SPARK_1_3_MODEL = "muse-spark-1.3";
235
241
  var DEFAULT_MUSE_MODEL = "muse-spark-1.2";
@@ -263,6 +269,7 @@ var FALLBACK_AGENT_MODEL = {
263
269
  cursor: DEFAULT_CURSOR_MODEL,
264
270
  deepseek: DEFAULT_DEEPSEEK_MODEL,
265
271
  fx: DEFAULT_FX_MODEL,
272
+ gemini: DEFAULT_GEMINI_MODEL,
266
273
  kimi: DEFAULT_KIMI_MODEL,
267
274
  muse: DEFAULT_MUSE_MODEL,
268
275
  opencode: DEFAULT_OPENCODE_MODEL,
@@ -360,6 +367,7 @@ var AGENT_MODELS = {
360
367
  ],
361
368
  deepseek: prioritizeDeepseekModels(DEFAULT_OPENROUTER_MODELS),
362
369
  fx: [DEFAULT_FX_MODEL],
370
+ gemini: [DEFAULT_GEMINI_MODEL, "gemini-3.1-pro-preview"],
363
371
  kimi: [DEFAULT_KIMI_MODEL],
364
372
  muse: [MUSE_SPARK_1_3_MODEL, DEFAULT_MUSE_MODEL],
365
373
  opencode: [...DEFAULT_OPENROUTER_MODELS, ...ASTER_MODELS],
@@ -407,6 +415,8 @@ var MODEL_LABELS = {
407
415
  "xiaomi/mimo-v2.5-pro": "MiMo V2.5 Pro via OpenRouter",
408
416
  "moonshotai/kimi-k2.6": "Kimi K2.6 via OpenRouter",
409
417
  "moonshotai/kimi-k3": "Kimi K3 via OpenRouter",
418
+ "gemini-3-flash-preview": "Gemini 3 Flash Preview",
419
+ "gemini-3.1-pro-preview": "Gemini 3.1 Pro Preview",
410
420
  [MUSE_SPARK_1_3_MODEL]: "Muse Spark 1.3",
411
421
  [DEFAULT_MUSE_MODEL]: "Muse Spark 1.2",
412
422
  "meta/muse-spark-1.3": "Muse Spark 1.3 via OpenRouter",
@@ -569,6 +579,7 @@ var CREDENTIAL_TYPE = {
569
579
  ASTER_API_KEY: "aster_api_key",
570
580
  OPENROUTER_API_KEY: "openrouter_api_key",
571
581
  AI_GATEWAY_API_KEY: "ai_gateway_api_key",
582
+ GEMINI_API_KEY: "gemini_api_key",
572
583
  MUSE_OAUTH: "muse_oauth",
573
584
  MUSE_API_KEY: "muse_api_key"
574
585
  };
@@ -599,6 +610,9 @@ var AGENT_CREDENTIAL_METHODS_IN_ORDER = {
599
610
  [AGENT.FX]: [
600
611
  { method: CREDENTIAL_METHOD.AI_GATEWAY, credentialType: CREDENTIAL_TYPE.AI_GATEWAY_API_KEY }
601
612
  ],
613
+ [AGENT.GEMINI]: [
614
+ { method: CREDENTIAL_METHOD.API_KEY, credentialType: CREDENTIAL_TYPE.GEMINI_API_KEY }
615
+ ],
602
616
  [AGENT.KIMI]: [
603
617
  { method: CREDENTIAL_METHOD.AI_GATEWAY, credentialType: CREDENTIAL_TYPE.AI_GATEWAY_API_KEY }
604
618
  ],
@@ -620,10 +634,12 @@ var AGENT_CREDENTIAL_METHODS_IN_ORDER = {
620
634
  function getCredentialMethodLabel(agent, method) {
621
635
  switch (method) {
622
636
  case CREDENTIAL_METHOD.OAUTH:
623
- return agent === AGENT.CODEX ? "ChatGPT account" : "Claude account";
637
+ if (agent === AGENT.CODEX) return "ChatGPT account";
638
+ return "Claude account";
624
639
  case CREDENTIAL_METHOD.API_KEY:
625
640
  if (agent === AGENT.CODEX) return "OpenAI API key";
626
641
  if (agent === AGENT.CURSOR) return "Cursor API key";
642
+ if (agent === AGENT.GEMINI) return "Gemini API key";
627
643
  if (agent === AGENT.MUSE) return "Muse API key";
628
644
  return "Anthropic API key";
629
645
  case CREDENTIAL_METHOD.OPENAI_COMPATIBLE:
@@ -5799,6 +5815,9 @@ function parseAgentEvents(events, agentType) {
5799
5815
  if (agentType === "kimi") {
5800
5816
  return parseAcpEvents(events, "kimi");
5801
5817
  }
5818
+ if (agentType === "gemini") {
5819
+ return parseAcpEvents(events, "gemini");
5820
+ }
5802
5821
  if (agentType === "muse") {
5803
5822
  return parseMuseEvents(events);
5804
5823
  }
@@ -6579,7 +6598,7 @@ var SLASH_COMMANDS = [
6579
6598
  command: "/plan",
6580
6599
  description: "Switch to plan mode and optionally send a prompt.",
6581
6600
  argumentHint: "[prompt]",
6582
- providers: ["claude", "codex", "cursor", "deepseek", "fx", "kimi", "muse", "opencode", "pi", "relay"]
6601
+ providers: ["claude", "codex", "cursor", "deepseek", "fx", "gemini", "kimi", "muse", "opencode", "pi", "relay"]
6583
6602
  },
6584
6603
  {
6585
6604
  command: "/fast",
@@ -7820,6 +7839,7 @@ export {
7820
7839
  DEFAULT_OPENCODE_MODEL,
7821
7840
  DEFAULT_DEEPSEEK_MODEL,
7822
7841
  DEFAULT_FX_MODEL,
7842
+ DEFAULT_GEMINI_MODEL,
7823
7843
  DEFAULT_KIMI_MODEL,
7824
7844
  DEFAULT_MUSE_MODEL,
7825
7845
  DEFAULT_PI_MODEL,
@@ -15,7 +15,7 @@ import {
15
15
  isValidRelayBaseProvider,
16
16
  parsePosixEnvFile,
17
17
  readReplicasRuntimeEnv
18
- } from "./chunk-SPI2REQM.js";
18
+ } from "./chunk-JVARATE2.js";
19
19
 
20
20
  // src/engine-env.ts
21
21
  import { readFileSync as readFileSync2 } from "fs";
@@ -141,6 +141,7 @@ function loadEngineEnv() {
141
141
  CODEX_OPENAI_AUTHORIZATION_HEADER: readEnv("CODEX_OPENAI_AUTHORIZATION_HEADER"),
142
142
  CURSOR_API_KEY: readEnv("CURSOR_API_KEY"),
143
143
  AI_GATEWAY_API_KEY: readEnv("AI_GATEWAY_API_KEY"),
144
+ GEMINI_API_KEY: readEnv("GEMINI_API_KEY"),
144
145
  CLAUDE_CODE_USE_BEDROCK: readEnv("CLAUDE_CODE_USE_BEDROCK"),
145
146
  AWS_ACCESS_KEY_ID: readEnv("AWS_ACCESS_KEY_ID"),
146
147
  AWS_SECRET_ACCESS_KEY: readEnv("AWS_SECRET_ACCESS_KEY"),
@@ -3,7 +3,7 @@ import { createRequire as __createRequire } from 'node:module';
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  shouldRefreshPullRequests
6
- } from "./chunk-SPI2REQM.js";
6
+ } from "./chunk-JVARATE2.js";
7
7
 
8
8
  // src/services/post-tool-pr-notifier.ts
9
9
  async function notifyPostToolUse(toolName, toolInput) {
@@ -3,12 +3,12 @@ import { createRequire as __createRequire } from 'node:module';
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  evaluateCommandProtection
6
- } from "./chunk-Y7XQ6LFO.js";
7
- import "./chunk-YP35Y7KJ.js";
6
+ } from "./chunk-4QKJQNRD.js";
7
+ import "./chunk-KIIBVJNU.js";
8
8
  import {
9
9
  isRecord
10
10
  } from "./chunk-UZSNFLDQ.js";
11
- import "./chunk-SPI2REQM.js";
11
+ import "./chunk-JVARATE2.js";
12
12
  import "./chunk-VEQXQN22.js";
13
13
 
14
14
  // src/command-protection-hook.ts
@@ -28,7 +28,7 @@ function writeResult(allowed, reason) {
28
28
  }
29
29
  }
30
30
  async function main() {
31
- if (provider !== "cursor" && provider !== "kimi" && provider !== "opencode") {
31
+ if (provider !== "cursor" && provider !== "gemini" && provider !== "kimi" && provider !== "opencode") {
32
32
  throw new Error("Unknown command protection hook provider.");
33
33
  }
34
34
  let body = "";
@@ -3,13 +3,13 @@ import { createRequire as __createRequire } from 'node:module';
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  evaluateCommandProtection
6
- } from "./chunk-Y7XQ6LFO.js";
6
+ } from "./chunk-4QKJQNRD.js";
7
7
  import {
8
8
  notifyPostToolUse
9
- } from "./chunk-TQSA5TNU.js";
10
- import "./chunk-YP35Y7KJ.js";
9
+ } from "./chunk-MOCORZX3.js";
10
+ import "./chunk-KIIBVJNU.js";
11
11
  import "./chunk-UZSNFLDQ.js";
12
- import "./chunk-SPI2REQM.js";
12
+ import "./chunk-JVARATE2.js";
13
13
  import "./chunk-VEQXQN22.js";
14
14
 
15
15
  // src/deepseek-command-protection-plugin.ts
@@ -8,12 +8,12 @@ import {
8
8
  import {
9
9
  AppServerProcess,
10
10
  buildCodexAgentEnv
11
- } from "./chunk-EQIJP7I2.js";
11
+ } from "./chunk-ELY6H3J2.js";
12
12
  import {
13
13
  AGENT,
14
14
  getMemoryOutputSafetyViolation,
15
15
  headlessAgentRequestSchema
16
- } from "./chunk-SPI2REQM.js";
16
+ } from "./chunk-JVARATE2.js";
17
17
  import "./chunk-VEQXQN22.js";
18
18
 
19
19
  // src/headless-agent.ts
package/dist/src/index.js CHANGED
@@ -91,7 +91,7 @@ import {
91
91
  evaluateCommandProtection,
92
92
  extractToolCommand,
93
93
  reportCommandProtectionBlock
94
- } from "./chunk-Y7XQ6LFO.js";
94
+ } from "./chunk-4QKJQNRD.js";
95
95
  import {
96
96
  ACCOUNT_RATE_LIMITS_UPDATED_METHOD,
97
97
  AGENT_MESSAGE_DELTA_METHOD,
@@ -131,20 +131,20 @@ import {
131
131
  recordCredentialFallback,
132
132
  recordExhaustedCredential,
133
133
  restartCodexAspHost
134
- } from "./chunk-MXWXITQM.js";
134
+ } from "./chunk-HGAWFOH4.js";
135
135
  import {
136
136
  ENGINE_ENV,
137
137
  IS_WARMING_MODE,
138
138
  monolithRequest,
139
139
  monolithService,
140
140
  setAgentCredentialSnapshot
141
- } from "./chunk-YP35Y7KJ.js";
141
+ } from "./chunk-KIIBVJNU.js";
142
142
  import {
143
143
  AspClient,
144
144
  SUBPROCESS_MAX_BUFFER,
145
145
  execAsync,
146
146
  execFileAsync
147
- } from "./chunk-EQIJP7I2.js";
147
+ } from "./chunk-ELY6H3J2.js";
148
148
  import {
149
149
  isRecord as isRecord2
150
150
  } from "./chunk-UZSNFLDQ.js";
@@ -191,6 +191,7 @@ import {
191
191
  DEFAULT_CURSOR_MODEL,
192
192
  DEFAULT_DEEPSEEK_MODEL,
193
193
  DEFAULT_FX_MODEL,
194
+ DEFAULT_GEMINI_MODEL,
194
195
  DEFAULT_HOOK_OUTPUT_PREVIEW_CHARS,
195
196
  DEFAULT_KIMI_MODEL,
196
197
  DEFAULT_MUSE_MODEL,
@@ -353,7 +354,7 @@ import {
353
354
  spawnRelaySubagentRequestSchema,
354
355
  stripAgentDiagnosticErrors,
355
356
  withTimeout
356
- } from "./chunk-SPI2REQM.js";
357
+ } from "./chunk-JVARATE2.js";
357
358
  import {
358
359
  __commonJS,
359
360
  __export,
@@ -9785,6 +9786,8 @@ function detectAgentAuthMethod(provider) {
9785
9786
  case AGENT.FX:
9786
9787
  case AGENT.KIMI:
9787
9788
  return ENGINE_ENV.AI_GATEWAY_API_KEY ? "api_key" : "none";
9789
+ case AGENT.GEMINI:
9790
+ return ENGINE_ENV.GEMINI_API_KEY ? "api_key" : "none";
9788
9791
  case AGENT.MUSE:
9789
9792
  if (!existsSync2(MUSE_AUTH_PATH)) return "none";
9790
9793
  if (ENGINE_ENV.REPLICAS_AGENT_CREDENTIALS.muse?.method === "api_key") return "api_key";
@@ -9882,6 +9885,7 @@ function createDefaultDetails() {
9882
9885
  cursorAuthMethod: "none",
9883
9886
  deepseekAuthMethod: "none",
9884
9887
  fxAuthMethod: "none",
9888
+ geminiAuthMethod: "none",
9885
9889
  kimiAuthMethod: "none",
9886
9890
  museAuthMethod: "none",
9887
9891
  opencodeAuthMethod: "none",
@@ -9928,6 +9932,7 @@ var EnvironmentDetailsService = class {
9928
9932
  details.cursorAuthMethod = detectAgentAuthMethod(AGENT.CURSOR);
9929
9933
  details.deepseekAuthMethod = detectAgentAuthMethod(AGENT.DEEPSEEK);
9930
9934
  details.fxAuthMethod = detectAgentAuthMethod(AGENT.FX);
9935
+ details.geminiAuthMethod = detectAgentAuthMethod(AGENT.GEMINI);
9931
9936
  details.kimiAuthMethod = detectAgentAuthMethod(AGENT.KIMI);
9932
9937
  details.museAuthMethod = detectAgentAuthMethod(AGENT.MUSE);
9933
9938
  details.opencodeAuthMethod = detectAgentAuthMethod(AGENT.OPENCODE);
@@ -14727,6 +14732,7 @@ var OPENCODE_HISTORY_DIR = join17(ENGINE_DIR2, "opencode-histories");
14727
14732
  var PI_HISTORY_DIR = join17(ENGINE_DIR2, "pi-histories");
14728
14733
  var DEEPSEEK_HISTORY_DIR = join17(ENGINE_DIR2, "deepseek-histories");
14729
14734
  var FX_HISTORY_DIR = join17(ENGINE_DIR2, "fx-histories");
14735
+ var GEMINI_HISTORY_DIR = join17(ENGINE_DIR2, "gemini-histories");
14730
14736
  var KIMI_HISTORY_DIR = join17(ENGINE_DIR2, "kimi-histories");
14731
14737
  var MUSE_HISTORY_DIR = join17(ENGINE_DIR2, "muse-histories");
14732
14738
  var FORKS_DIR = join17(ENGINE_DIR2, "forks");
@@ -14737,6 +14743,7 @@ var HISTORY_DIR_BY_PROVIDER = {
14737
14743
  cursor: CURSOR_HISTORY_DIR,
14738
14744
  deepseek: DEEPSEEK_HISTORY_DIR,
14739
14745
  fx: FX_HISTORY_DIR,
14746
+ gemini: GEMINI_HISTORY_DIR,
14740
14747
  kimi: KIMI_HISTORY_DIR,
14741
14748
  muse: MUSE_HISTORY_DIR,
14742
14749
  opencode: OPENCODE_HISTORY_DIR,
@@ -16274,6 +16281,34 @@ async function ensureCursorCommandProtectionHook() {
16274
16281
  await writeFile6(path7, `${JSON.stringify({ ...config, version: 1, hooks }, null, 2)}
16275
16282
  `, "utf8");
16276
16283
  }
16284
+ async function ensureGeminiCommandProtectionHook() {
16285
+ const path7 = join19(ENGINE_ENV.HOME_DIR, ".gemini", "settings.json");
16286
+ let config = {};
16287
+ try {
16288
+ const parsed = JSON.parse(await readFile11(path7, "utf8"));
16289
+ if (!isRecord2(parsed)) throw new Error("Invalid Gemini hooks configuration.");
16290
+ config = parsed;
16291
+ } catch (error) {
16292
+ if (!(error && typeof error === "object" && "code" in error && error.code === "ENOENT")) throw error;
16293
+ }
16294
+ const hooks = isRecord2(config.hooks) ? config.hooks : {};
16295
+ const hook = (name, command) => ({
16296
+ matcher: "*",
16297
+ hooks: [{ name, type: "command", command, timeout: 3e4 }]
16298
+ });
16299
+ const without = (entries, name) => (Array.isArray(entries) ? entries : []).filter((entry) => !isRecord2(entry) || !Array.isArray(entry.hooks) || !entry.hooks.some((candidate) => isRecord2(candidate) && candidate.name === name));
16300
+ hooks.BeforeTool = [
16301
+ ...without(hooks.BeforeTool, "replicas-command-protection"),
16302
+ hook("replicas-command-protection", shellCommand(hookPath, "gemini"))
16303
+ ];
16304
+ hooks.AfterTool = [
16305
+ ...without(hooks.AfterTool, "replicas-post-tool-pr-check"),
16306
+ hook("replicas-post-tool-pr-check", shellCommand(postToolHookPath))
16307
+ ];
16308
+ await mkdir11(dirname5(path7), { recursive: true });
16309
+ await writeFile6(path7, `${JSON.stringify({ ...config, hooks }, null, 2)}
16310
+ `, "utf8");
16311
+ }
16277
16312
  async function ensureKimiCommandProtectionHook() {
16278
16313
  const path7 = join19(ENGINE_ENV.HOME_DIR, ".kimi-code", "config.toml");
16279
16314
  const start = "# Replicas command protection hook";
@@ -17659,6 +17694,7 @@ ${request.message}` : request.message
17659
17694
  prompt.push({ type: "image", mimeType: image.source.media_type, data: image.source.data });
17660
17695
  }
17661
17696
  const response = await context.request(methods.agent.session.prompt, { sessionId, prompt });
17697
+ this.onUsageUpdate(response, (/* @__PURE__ */ new Date()).toISOString());
17662
17698
  if (pending) this.deliveredInstructions = pending;
17663
17699
  this.recordHistoryEvent("acp-turn-complete", {
17664
17700
  provider: this.acp.provider,
@@ -17757,6 +17793,26 @@ var FxManager = class extends AcpManager {
17757
17793
  }
17758
17794
  };
17759
17795
 
17796
+ // src/managers/gemini-manager.ts
17797
+ var GeminiManager = class extends AcpManager {
17798
+ constructor(options) {
17799
+ super({
17800
+ ...options,
17801
+ acp: {
17802
+ provider: "gemini",
17803
+ command: "gemini",
17804
+ args: (model) => ["--acp", "--model", model],
17805
+ env: async () => ({
17806
+ GEMINI_CLI_TRUST_WORKSPACE: "true",
17807
+ GEMINI_TELEMETRY_ENABLED: "false"
17808
+ }),
17809
+ defaultModel: DEFAULT_GEMINI_MODEL,
17810
+ prepare: ensureGeminiCommandProtectionHook
17811
+ }
17812
+ });
17813
+ }
17814
+ };
17815
+
17760
17816
  // src/managers/kimi-manager.ts
17761
17817
  var KimiManager = class extends AcpManager {
17762
17818
  constructor(options) {
@@ -60220,6 +60276,19 @@ function calculateCumulativeTokenUsageDelta(current, previous) {
60220
60276
  cacheWriteInputTokens: current.cacheWriteInputTokens - previous.cacheWriteInputTokens
60221
60277
  };
60222
60278
  }
60279
+ function recordParsedTokenUsage(event, harness, parse) {
60280
+ if (event.type !== "usage-updated") return void 0;
60281
+ const usage = parse(event.payload);
60282
+ if (!usage) return void 0;
60283
+ return {
60284
+ records: [{
60285
+ ...event.context,
60286
+ harness,
60287
+ ...usage,
60288
+ occurredAt: event.occurredAt
60289
+ }]
60290
+ };
60291
+ }
60223
60292
 
60224
60293
  // src/analytics/token-usage/claude/parse.ts
60225
60294
  function isClaudeModelUsage(value) {
@@ -60547,6 +60616,29 @@ var DeepseekTokenUsageService = class {
60547
60616
  }
60548
60617
  };
60549
60618
 
60619
+ // src/analytics/token-usage/gemini/index.ts
60620
+ function parseGeminiTokenUsage(payload) {
60621
+ if (!isRecord(payload)) return void 0;
60622
+ const usage = isRecord(payload.usage) ? {
60623
+ inputTokens: payload.usage.inputTokens,
60624
+ outputTokens: payload.usage.outputTokens,
60625
+ cacheReadInputTokens: payload.usage.cachedReadTokens ?? 0,
60626
+ cacheWriteInputTokens: payload.usage.cachedWriteTokens ?? 0
60627
+ } : isRecord(payload._meta) && isRecord(payload._meta.quota) && isRecord(payload._meta.quota.token_count) ? {
60628
+ inputTokens: payload._meta.quota.token_count.input_tokens,
60629
+ outputTokens: payload._meta.quota.token_count.output_tokens,
60630
+ cacheReadInputTokens: 0,
60631
+ cacheWriteInputTokens: 0
60632
+ } : void 0;
60633
+ if (!isTokenUsageCounts(usage)) return void 0;
60634
+ return usage.inputTokens + usage.outputTokens + usage.cacheReadInputTokens + usage.cacheWriteInputTokens > 0 ? usage : void 0;
60635
+ }
60636
+ var GeminiTokenUsageService = class {
60637
+ record(event) {
60638
+ return recordParsedTokenUsage(event, AGENT.GEMINI, parseGeminiTokenUsage);
60639
+ }
60640
+ };
60641
+
60550
60642
  // src/analytics/token-usage/muse/index.ts
60551
60643
  var MuseTokenUsageService = class {
60552
60644
  record(event) {
@@ -60582,16 +60674,7 @@ function parseOpencodeTokenUsage(payload) {
60582
60674
  }
60583
60675
  var OpencodeTokenUsageService = class {
60584
60676
  record(event) {
60585
- if (event.type !== "usage-updated") return void 0;
60586
- const usage = parseOpencodeTokenUsage(event.payload);
60587
- if (!usage) return void 0;
60588
- const record3 = {
60589
- ...event.context,
60590
- harness: AGENT.OPENCODE,
60591
- ...usage,
60592
- occurredAt: event.occurredAt
60593
- };
60594
- return { records: [record3] };
60677
+ return recordParsedTokenUsage(event, AGENT.OPENCODE, parseOpencodeTokenUsage);
60595
60678
  }
60596
60679
  };
60597
60680
 
@@ -60635,6 +60718,8 @@ function createAgentTokenUsageService(harness) {
60635
60718
  return new CursorTokenUsageService();
60636
60719
  case AGENT.DEEPSEEK:
60637
60720
  return new DeepseekTokenUsageService();
60721
+ case AGENT.GEMINI:
60722
+ return new GeminiTokenUsageService();
60638
60723
  case AGENT.MUSE:
60639
60724
  return new MuseTokenUsageService();
60640
60725
  case AGENT.OPENCODE:
@@ -62415,6 +62500,8 @@ var ChatService = class {
62415
62500
  provider = new DeepseekManager(managerOptions);
62416
62501
  } else if (baseProvider === "fx") {
62417
62502
  provider = new FxManager(managerOptions);
62503
+ } else if (baseProvider === "gemini") {
62504
+ provider = new GeminiManager(managerOptions);
62418
62505
  } else if (baseProvider === "kimi") {
62419
62506
  provider = new KimiManager(managerOptions);
62420
62507
  } else if (baseProvider === "muse") {
@@ -3,11 +3,11 @@ import { createRequire as __createRequire } from 'node:module';
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  notifyPostToolUse
6
- } from "./chunk-TQSA5TNU.js";
6
+ } from "./chunk-MOCORZX3.js";
7
7
  import {
8
8
  isRecord
9
9
  } from "./chunk-UZSNFLDQ.js";
10
- import "./chunk-SPI2REQM.js";
10
+ import "./chunk-JVARATE2.js";
11
11
  import "./chunk-VEQXQN22.js";
12
12
 
13
13
  // src/post-tool-pr-hook.ts
@@ -7,7 +7,7 @@ import {
7
7
  import {
8
8
  messageRelaySubagentRequestSchema,
9
9
  spawnRelaySubagentRequestSchema
10
- } from "./chunk-SPI2REQM.js";
10
+ } from "./chunk-JVARATE2.js";
11
11
  import "./chunk-VEQXQN22.js";
12
12
 
13
13
  // src/relay-mcp.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "replicas-engine",
3
- "version": "0.1.839",
3
+ "version": "0.1.840",
4
4
  "description": "Lightweight API server for Replicas workspaces",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",