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 +12 -0
- package/README.md +2 -0
- package/index.ts +81 -0
- package/package.json +1 -1
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",
|