pi-codex-image-gen 0.1.6 → 0.1.8

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/CHANGELOG.md CHANGED
@@ -6,6 +6,18 @@ This project follows the spirit of [Keep a Changelog](https://keepachangelog.com
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.1.8] - 2026-05-10
10
+
11
+ ### Fixed
12
+
13
+ - Disable install/update telemetry automatically in CI environments.
14
+
15
+ ## [0.1.7] - 2026-05-10
16
+
17
+ ### Added
18
+
19
+ - Install/update telemetry ping to `mocito.dev`, gated by Pi telemetry/offline settings and deduplicated per package version.
20
+
9
21
  ## [0.1.6] - 2026-05-09
10
22
 
11
23
  ### Changed
package/README.md CHANGED
@@ -67,6 +67,8 @@ Project config overrides global config. Example:
67
67
  | ---------------------------- | ------------------------------------------------ |
68
68
  | `PI_CODEX_IMAGE_SAVE_MODE` | Overrides the `save` config key. |
69
69
  | `PI_CODEX_IMAGE_SAVE_DIR` | Overrides the `saveDir` config key (custom mode).|
70
+ | `PI_OFFLINE=1` | Disables install/update telemetry. |
71
+ | `PI_TELEMETRY=0` | Disables install/update telemetry. |
70
72
 
71
73
  ## Save modes
72
74
 
package/index.ts CHANGED
@@ -13,6 +13,7 @@ import { StringEnum } from "@earendil-works/pi-ai";
13
13
  import { type ExtensionAPI, getAgentDir, withFileMutationQueue } from "@earendil-works/pi-coding-agent";
14
14
  import { type Static, Type } from "typebox";
15
15
 
16
+ const PACKAGE_NAME = "pi-codex-image-gen";
16
17
  const PROVIDER = "openai-codex";
17
18
  const DEFAULT_MODEL = "gpt-5.5";
18
19
  const CODEX_RESPONSES_URL = "https://chatgpt.com/backend-api/codex/responses";
@@ -21,6 +22,23 @@ const DEFAULT_SAVE_MODE = "global";
21
22
  const OPENAI_BETA_HEADER = "responses=experimental";
22
23
  const MAX_RETRIES = 3;
23
24
  const BASE_DELAY_MS = 1000;
25
+ const INSTALL_TELEMETRY_URL = "https://mocito.dev/api/report-install";
26
+ const INSTALL_TELEMETRY_TIMEOUT_MS = 5000;
27
+ const CI_ENV_VARS = [
28
+ "CI",
29
+ "GITHUB_ACTIONS",
30
+ "GITLAB_CI",
31
+ "CIRCLECI",
32
+ "BUILDKITE",
33
+ "JENKINS_URL",
34
+ "TEAMCITY_VERSION",
35
+ "TF_BUILD",
36
+ "BITBUCKET_BUILD_NUMBER",
37
+ "APPVEYOR",
38
+ "TRAVIS",
39
+ "DRONE",
40
+ "CODEBUILD_BUILD_ID",
41
+ ] as const;
24
42
 
25
43
  const SAVE_MODES = ["none", "project", "global", "custom"] as const;
26
44
  type SaveMode = (typeof SAVE_MODES)[number];
@@ -85,6 +103,10 @@ interface ParsedCodexResponse {
85
103
  usage?: unknown;
86
104
  }
87
105
 
106
+ interface InstallTelemetryState {
107
+ lastReportedVersion?: string;
108
+ }
109
+
88
110
  // --- #11: Typed SSE event discriminated union ---
89
111
 
90
112
  type CodexSseEvent =
@@ -147,6 +169,63 @@ function loadConfig(cwd: string): ExtensionConfig {
147
169
  return { ...globalConfig, ...projectConfig };
148
170
  }
149
171
 
172
+ function isTruthyEnvFlag(value: string | undefined): boolean {
173
+ if (!value) return false;
174
+ return value === "1" || value.toLowerCase() === "true" || value.toLowerCase() === "yes";
175
+ }
176
+
177
+ function isCiEnvironment(): boolean {
178
+ return CI_ENV_VARS.some((name) => {
179
+ const value = process.env[name];
180
+ return value !== undefined && value !== "" && value !== "0" && value.toLowerCase() !== "false";
181
+ });
182
+ }
183
+
184
+ function isInstallTelemetryEnabled(): boolean {
185
+ if (isCiEnvironment()) return false;
186
+ if (isTruthyEnvFlag(process.env.PI_OFFLINE)) return false;
187
+ if (process.env.PI_TELEMETRY !== undefined) return isTruthyEnvFlag(process.env.PI_TELEMETRY);
188
+ const settings = readConfigFile(join(getAgentDir(), "settings.json")) as { enableInstallTelemetry?: unknown };
189
+ return settings.enableInstallTelemetry !== false;
190
+ }
191
+
192
+ function getPackageVersion(): string {
193
+ try {
194
+ const packageJson = JSON.parse(readFileSync(new URL("./package.json", import.meta.url), "utf8")) as { version?: unknown };
195
+ return typeof packageJson.version === "string" && packageJson.version.length > 0 ? packageJson.version : "0.0.0";
196
+ } catch {
197
+ return "0.0.0";
198
+ }
199
+ }
200
+
201
+ function getInstallTelemetryUserAgent(version: string): string {
202
+ const runtimeVersions = process.versions as NodeJS.ProcessVersions & { bun?: string };
203
+ const runtime = runtimeVersions.bun ? `bun/${runtimeVersions.bun}` : `node/${process.version}`;
204
+ return `${PACKAGE_NAME}/${version} (${process.platform}; ${runtime}; ${process.arch})`;
205
+ }
206
+
207
+ async function reportInstallTelemetry(): Promise<void> {
208
+ try {
209
+ if (!isInstallTelemetryEnabled()) return;
210
+
211
+ const version = getPackageVersion();
212
+ const statePath = join(getAgentDir(), "extensions", "codex-image-gen-install.json");
213
+ const state = readConfigFile(statePath) as InstallTelemetryState;
214
+ if (state.lastReportedVersion === version) return;
215
+
216
+ await mkdir(join(getAgentDir(), "extensions"), { recursive: true });
217
+ await writeFile(statePath, `${JSON.stringify({ lastReportedVersion: version }, null, 2)}\n`);
218
+
219
+ const params = new URLSearchParams({ tool: PACKAGE_NAME, version });
220
+ await fetch(`${INSTALL_TELEMETRY_URL}?${params.toString()}`, {
221
+ headers: { "User-Agent": getInstallTelemetryUserAgent(version) },
222
+ signal: AbortSignal.timeout(INSTALL_TELEMETRY_TIMEOUT_MS),
223
+ });
224
+ } catch {
225
+ // Best-effort telemetry: ignore settings, filesystem, and network failures.
226
+ }
227
+ }
228
+
150
229
  // --- Path helpers ---
151
230
 
152
231
  function resolveUnderCwd(cwd: string, path: string): string {
@@ -385,6 +464,8 @@ async function requestImage(
385
464
  // --- Extension entry point ---
386
465
 
387
466
  export default function codexImageGen(pi: ExtensionAPI) {
467
+ void reportInstallTelemetry();
468
+
388
469
  pi.registerTool({
389
470
  name: "codex_generate_image",
390
471
  label: "Codex Image",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-codex-image-gen",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "description": "Image generation for Pi using the ChatGPT Images 2.0 model.",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",