@bryanhu/codexly 0.4.0 → 0.6.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.
- package/CHANGELOG.md +43 -1
- package/README.md +4 -1
- package/README.zh-CN.md +4 -1
- package/dist/{chunk-63TSFHXS.js → chunk-C3PIS4SQ.js} +916 -399
- package/dist/{chunk-6W2NSQP6.js → chunk-DEKHLAWT.js} +1 -1
- package/dist/{chunk-I5XCZA2U.js → chunk-NUY5U24W.js} +876 -56
- package/dist/{chunk-3OBVX5TN.js → chunk-RNTA4MFS.js} +9 -1
- package/dist/{chunk-TGDKFWII.js → chunk-TEWPWZPG.js} +116 -7
- package/dist/cli.js +10 -6
- package/dist/client/index.js +35 -5
- package/dist/core/index.js +1 -1
- package/dist/protocol/index.js +1 -1
- package/dist/providers/codex/index.js +3 -3
- package/dist/server/index.js +5 -5
- package/dist/sqlite-state-worker.js +117 -7
- package/dist/web/.vite/manifest.json +254 -128
- package/dist/web/.vite/manifest.json.br +0 -0
- package/dist/web/.vite/manifest.json.gz +0 -0
- package/dist/web/assets/button-group-b2-xCzBP.js +1 -0
- package/dist/web/assets/button-group-b2-xCzBP.js.br +0 -0
- package/dist/web/assets/button-group-b2-xCzBP.js.gz +0 -0
- package/dist/web/assets/check-DExH7zwT.js +1 -0
- package/dist/web/assets/check-DExH7zwT.js.br +0 -0
- package/dist/web/assets/check-DExH7zwT.js.gz +0 -0
- package/dist/web/assets/checkbox-Cft8ypsb.js +1 -0
- package/dist/web/assets/checkbox-Cft8ypsb.js.br +0 -0
- package/dist/web/assets/checkbox-Cft8ypsb.js.gz +0 -0
- package/dist/web/assets/{chunk-BO2N2NFS-D3J36g1Z.js → chunk-BO2N2NFS-BZtBhhTV.js} +4 -4
- package/dist/web/assets/chunk-BO2N2NFS-BZtBhhTV.js.br +0 -0
- package/dist/web/assets/chunk-BO2N2NFS-BZtBhhTV.js.gz +0 -0
- package/dist/web/assets/{code-highlighter-Cl_7OKC4.js → code-highlighter-BG341hSJ.js} +1 -1
- package/dist/web/assets/code-highlighter-BG341hSJ.js.br +0 -0
- package/dist/web/assets/code-highlighter-BG341hSJ.js.gz +0 -0
- package/dist/web/assets/{code-languages-CoeGleQS.js → code-languages-DA_FG9-T.js} +1 -1
- package/dist/web/assets/code-languages-DA_FG9-T.js.br +0 -0
- package/dist/web/assets/code-languages-DA_FG9-T.js.gz +0 -0
- package/dist/web/assets/context-menu-CZuXyHCN.js +1 -0
- package/dist/web/assets/context-menu-CZuXyHCN.js.br +0 -0
- package/dist/web/assets/context-menu-CZuXyHCN.js.gz +0 -0
- package/dist/web/assets/dist-ByRtqJXv.js +1 -0
- package/dist/web/assets/dist-ByRtqJXv.js.br +0 -0
- package/dist/web/assets/dist-ByRtqJXv.js.gz +0 -0
- package/dist/web/assets/dist-hozmU7_C.js +1 -0
- package/dist/web/assets/dist-hozmU7_C.js.br +0 -0
- package/dist/web/assets/dist-hozmU7_C.js.gz +0 -0
- package/dist/web/assets/es2015-Cd8ehGwJ.js +41 -0
- package/dist/web/assets/es2015-Cd8ehGwJ.js.br +0 -0
- package/dist/web/assets/es2015-Cd8ehGwJ.js.gz +0 -0
- package/dist/web/assets/file-code-corner-D1h7_C7f.js +1 -0
- package/dist/web/assets/file-code-corner-D1h7_C7f.js.br +0 -0
- package/dist/web/assets/file-code-corner-D1h7_C7f.js.gz +0 -0
- package/dist/web/assets/file-navigation-view-preference-BikLLmlP.js +1 -0
- package/dist/web/assets/file-navigation-view-preference-BikLLmlP.js.br +0 -0
- package/dist/web/assets/file-navigation-view-preference-BikLLmlP.js.gz +0 -0
- package/dist/web/assets/file-review-dialog-dlOxwNrj.js +2 -0
- package/dist/web/assets/file-review-dialog-dlOxwNrj.js.br +0 -0
- package/dist/web/assets/file-review-dialog-dlOxwNrj.js.gz +0 -0
- package/dist/web/assets/file-tree-CbuG5nkz.js +1 -0
- package/dist/web/assets/file-tree-CbuG5nkz.js.br +0 -0
- package/dist/web/assets/file-tree-CbuG5nkz.js.gz +0 -0
- package/dist/web/assets/git-commit-horizontal-BJGxHnV4.js +1 -0
- package/dist/web/assets/git-commit-horizontal-BJGxHnV4.js.br +0 -0
- package/dist/web/assets/git-commit-horizontal-BJGxHnV4.js.gz +0 -0
- package/dist/web/assets/git-history-panel-DqiTnaf1.js +2 -0
- package/dist/web/assets/git-history-panel-DqiTnaf1.js.br +0 -0
- package/dist/web/assets/git-history-panel-DqiTnaf1.js.gz +0 -0
- package/dist/web/assets/global-settings-dialog-DFjxQX_B.js +1 -0
- package/dist/web/assets/global-settings-dialog-DFjxQX_B.js.br +0 -0
- package/dist/web/assets/global-settings-dialog-DFjxQX_B.js.gz +0 -0
- package/dist/web/assets/{highlighted-body-OFNGDK62-DLuRF1Ir.js → highlighted-body-OFNGDK62-bj8RQV-D.js} +1 -1
- package/dist/web/assets/highlighted-body-OFNGDK62-bj8RQV-D.js.br +0 -0
- package/dist/web/assets/highlighted-body-OFNGDK62-bj8RQV-D.js.gz +0 -0
- package/dist/web/assets/index-BZYdzDQ3.css +2 -0
- package/dist/web/assets/index-BZYdzDQ3.css.br +0 -0
- package/dist/web/assets/index-BZYdzDQ3.css.gz +0 -0
- package/dist/web/assets/index-DTJVeg10.js +4 -0
- package/dist/web/assets/index-DTJVeg10.js.br +0 -0
- package/dist/web/assets/index-DTJVeg10.js.gz +0 -0
- package/dist/web/assets/lazy-message-response-8zk6PTbZ.js +2 -0
- package/dist/web/assets/lazy-message-response-8zk6PTbZ.js.br +0 -0
- package/dist/web/assets/lazy-message-response-8zk6PTbZ.js.gz +0 -0
- package/dist/web/assets/loader-circle-CYc50iXi.js +1 -0
- package/dist/web/assets/loader-circle-CYc50iXi.js.br +0 -0
- package/dist/web/assets/loader-circle-CYc50iXi.js.gz +0 -0
- package/dist/web/assets/mermaid-GHXKKRXX-BDoa2Ho_.js +1 -0
- package/dist/web/assets/mermaid-GHXKKRXX-BDoa2Ho_.js.br +0 -0
- package/dist/web/assets/mermaid-GHXKKRXX-BDoa2Ho_.js.gz +0 -0
- package/dist/web/assets/message-response-CKPW6CRi.js +7 -0
- package/dist/web/assets/message-response-CKPW6CRi.js.br +0 -0
- package/dist/web/assets/message-response-CKPW6CRi.js.gz +0 -0
- package/dist/web/assets/{patch-diff-viewer-7Ar-plzV.js → patch-diff-viewer-CaWTvh9_.js} +2 -2
- package/dist/web/assets/patch-diff-viewer-CaWTvh9_.js.br +0 -0
- package/dist/web/assets/patch-diff-viewer-CaWTvh9_.js.gz +0 -0
- package/dist/web/assets/project-file-popup-page-Cmjoovjs.js +1 -0
- package/dist/web/assets/project-file-popup-page-Cmjoovjs.js.br +0 -0
- package/dist/web/assets/project-file-popup-page-Cmjoovjs.js.gz +0 -0
- package/dist/web/assets/project-source-panel-0Chmfe7s.js +3 -0
- package/dist/web/assets/project-source-panel-0Chmfe7s.js.br +0 -0
- package/dist/web/assets/project-source-panel-0Chmfe7s.js.gz +0 -0
- package/dist/web/assets/prompt-input-controls-CT6f-1tO.js +1 -0
- package/dist/web/assets/prompt-input-controls-CT6f-1tO.js.br +0 -0
- package/dist/web/assets/prompt-input-controls-CT6f-1tO.js.gz +0 -0
- package/dist/web/assets/prompt-reference-token-CTm_xv2R.js +1 -0
- package/dist/web/assets/prompt-reference-token-CTm_xv2R.js.br +0 -0
- package/dist/web/assets/prompt-reference-token-CTm_xv2R.js.gz +0 -0
- package/dist/web/assets/provider-connection-queries-CLpiOnBN.js +1 -0
- package/dist/web/assets/provider-connection-queries-CLpiOnBN.js.br +0 -0
- package/dist/web/assets/provider-connection-queries-CLpiOnBN.js.gz +0 -0
- package/dist/web/assets/{shiki-bundle-UDLEjOL9.js → shiki-bundle-BEmB8kBs.js} +1 -1
- package/dist/web/assets/shiki-bundle-BEmB8kBs.js.br +0 -0
- package/dist/web/assets/shiki-bundle-BEmB8kBs.js.gz +0 -0
- package/dist/web/assets/tooltip-BU1Qoscx.js +1 -0
- package/dist/web/assets/tooltip-BU1Qoscx.js.br +0 -0
- package/dist/web/assets/tooltip-BU1Qoscx.js.gz +0 -0
- package/dist/web/assets/upload-BDX8w8rQ.js +1 -0
- package/dist/web/assets/upload-BDX8w8rQ.js.br +0 -0
- package/dist/web/assets/upload-BDX8w8rQ.js.gz +0 -0
- package/dist/web/assets/useInfiniteQuery-Bj31MvqL.js +1 -0
- package/dist/web/assets/useInfiniteQuery-Bj31MvqL.js.br +0 -0
- package/dist/web/assets/useInfiniteQuery-Bj31MvqL.js.gz +0 -0
- package/dist/web/assets/workbench-inspector-changes-CWeWA-hv.js +2 -0
- package/dist/web/assets/workbench-inspector-changes-CWeWA-hv.js.br +0 -0
- package/dist/web/assets/workbench-inspector-changes-CWeWA-hv.js.gz +0 -0
- package/dist/web/assets/workbench-pet-canvas-CO4nVH5z.js +1 -0
- package/dist/web/assets/workbench-pet-canvas-CO4nVH5z.js.br +0 -0
- package/dist/web/assets/workbench-pet-canvas-CO4nVH5z.js.gz +0 -0
- package/dist/web/assets/workbench-shell-BOnddpen.js +15 -0
- package/dist/web/assets/workbench-shell-BOnddpen.js.br +0 -0
- package/dist/web/assets/workbench-shell-BOnddpen.js.gz +0 -0
- package/dist/web/index.html +12 -8
- package/dist/web/index.html.br +0 -0
- package/dist/web/index.html.gz +0 -0
- package/package.json +1 -1
- package/dist/web/assets/button-SdoQawHa.js +0 -1
- package/dist/web/assets/button-SdoQawHa.js.br +0 -0
- package/dist/web/assets/button-SdoQawHa.js.gz +0 -0
- package/dist/web/assets/button-group-cIDkfDF9.js +0 -1
- package/dist/web/assets/button-group-cIDkfDF9.js.br +0 -0
- package/dist/web/assets/button-group-cIDkfDF9.js.gz +0 -0
- package/dist/web/assets/checkbox-BlpFo5_d.js +0 -1
- package/dist/web/assets/checkbox-BlpFo5_d.js.br +0 -0
- package/dist/web/assets/checkbox-BlpFo5_d.js.gz +0 -0
- package/dist/web/assets/chunk-BO2N2NFS-D3J36g1Z.js.br +0 -0
- package/dist/web/assets/chunk-BO2N2NFS-D3J36g1Z.js.gz +0 -0
- package/dist/web/assets/code-highlighter-Cl_7OKC4.js.br +0 -0
- package/dist/web/assets/code-highlighter-Cl_7OKC4.js.gz +0 -0
- package/dist/web/assets/code-languages-CoeGleQS.js.br +0 -0
- package/dist/web/assets/code-languages-CoeGleQS.js.gz +0 -0
- package/dist/web/assets/es2015-B-skuqay.js +0 -41
- package/dist/web/assets/es2015-B-skuqay.js.br +0 -0
- package/dist/web/assets/es2015-B-skuqay.js.gz +0 -0
- package/dist/web/assets/file-DwOQ4CRt.js +0 -1
- package/dist/web/assets/file-DwOQ4CRt.js.br +0 -0
- package/dist/web/assets/file-DwOQ4CRt.js.gz +0 -0
- package/dist/web/assets/file-review-dialog-BmXxZad1.js +0 -2
- package/dist/web/assets/file-review-dialog-BmXxZad1.js.br +0 -0
- package/dist/web/assets/file-review-dialog-BmXxZad1.js.gz +0 -0
- package/dist/web/assets/file-tree-Bl6o98td.js +0 -1
- package/dist/web/assets/file-tree-Bl6o98td.js.br +0 -0
- package/dist/web/assets/file-tree-Bl6o98td.js.gz +0 -0
- package/dist/web/assets/git-commit-horizontal-1BtAo1_y.js +0 -1
- package/dist/web/assets/git-commit-horizontal-1BtAo1_y.js.br +0 -0
- package/dist/web/assets/git-commit-horizontal-1BtAo1_y.js.gz +0 -0
- package/dist/web/assets/git-history-panel-zXprGDsD.js +0 -2
- package/dist/web/assets/git-history-panel-zXprGDsD.js.br +0 -0
- package/dist/web/assets/git-history-panel-zXprGDsD.js.gz +0 -0
- package/dist/web/assets/global-settings-dialog-CQK8OvfF.js +0 -1
- package/dist/web/assets/global-settings-dialog-CQK8OvfF.js.br +0 -0
- package/dist/web/assets/global-settings-dialog-CQK8OvfF.js.gz +0 -0
- package/dist/web/assets/highlighted-body-OFNGDK62-DLuRF1Ir.js.br +0 -0
- package/dist/web/assets/highlighted-body-OFNGDK62-DLuRF1Ir.js.gz +0 -0
- package/dist/web/assets/index-BQDjXTIj.js +0 -4
- package/dist/web/assets/index-BQDjXTIj.js.br +0 -0
- package/dist/web/assets/index-BQDjXTIj.js.gz +0 -0
- package/dist/web/assets/index-Cg_JyLiC.css +0 -2
- package/dist/web/assets/index-Cg_JyLiC.css.br +0 -0
- package/dist/web/assets/index-Cg_JyLiC.css.gz +0 -0
- package/dist/web/assets/lazy-message-response-BAESsr6y.js +0 -2
- package/dist/web/assets/lazy-message-response-BAESsr6y.js.br +0 -0
- package/dist/web/assets/lazy-message-response-BAESsr6y.js.gz +0 -0
- package/dist/web/assets/mermaid-GHXKKRXX-D80VLkUl.js +0 -1
- package/dist/web/assets/mermaid-GHXKKRXX-D80VLkUl.js.br +0 -0
- package/dist/web/assets/mermaid-GHXKKRXX-D80VLkUl.js.gz +0 -0
- package/dist/web/assets/message-response-ll2GyVvz.js +0 -7
- package/dist/web/assets/message-response-ll2GyVvz.js.br +0 -0
- package/dist/web/assets/message-response-ll2GyVvz.js.gz +0 -0
- package/dist/web/assets/patch-diff-viewer-7Ar-plzV.js.br +0 -0
- package/dist/web/assets/patch-diff-viewer-7Ar-plzV.js.gz +0 -0
- package/dist/web/assets/prompt-input-controls-t69FYoWk.js +0 -1
- package/dist/web/assets/prompt-input-controls-t69FYoWk.js.br +0 -0
- package/dist/web/assets/prompt-input-controls-t69FYoWk.js.gz +0 -0
- package/dist/web/assets/prompt-reference-token-Cxx6C-IR.js +0 -1
- package/dist/web/assets/prompt-reference-token-Cxx6C-IR.js.br +0 -0
- package/dist/web/assets/prompt-reference-token-Cxx6C-IR.js.gz +0 -0
- package/dist/web/assets/provider-connection-queries-BKyJMJn1.js +0 -1
- package/dist/web/assets/provider-connection-queries-BKyJMJn1.js.br +0 -0
- package/dist/web/assets/provider-connection-queries-BKyJMJn1.js.gz +0 -0
- package/dist/web/assets/shiki-bundle-UDLEjOL9.js.br +0 -0
- package/dist/web/assets/shiki-bundle-UDLEjOL9.js.gz +0 -0
- package/dist/web/assets/upload-Bbk2LEzM.js +0 -1
- package/dist/web/assets/upload-Bbk2LEzM.js.br +0 -0
- package/dist/web/assets/upload-Bbk2LEzM.js.gz +0 -0
- package/dist/web/assets/workbench-inspector-changes-CumCxeA7.js +0 -1
- package/dist/web/assets/workbench-inspector-changes-CumCxeA7.js.br +0 -0
- package/dist/web/assets/workbench-inspector-changes-CumCxeA7.js.gz +0 -0
- package/dist/web/assets/workbench-shell-D21PPmmO.js +0 -13
- package/dist/web/assets/workbench-shell-D21PPmmO.js.br +0 -0
- package/dist/web/assets/workbench-shell-D21PPmmO.js.gz +0 -0
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { createRequire } from 'node:module';
|
|
2
|
-
import { PendingRequestResolutionError } from './chunk-
|
|
3
|
-
import { TEMPORARY_TASK_SCOPE_ID, MAX_AGENT_HISTORY_IMAGE_TOTAL_BYTES, isAgentFastModeAvailable, MAX_REALTIME_FILE_CHANGES, MAX_REALTIME_DIFF_BYTES, stripLeadingAgentSkillReferences, MAX_AGENT_HISTORY_IMAGES, MAX_AGENT_TEXT_BYTES } from './chunk-
|
|
2
|
+
import { WorkbenchPetProviderError, PendingRequestResolutionError } from './chunk-RNTA4MFS.js';
|
|
3
|
+
import { TEMPORARY_TASK_SCOPE_ID, MAX_AGENT_HISTORY_IMAGE_TOTAL_BYTES, isAgentFastModeAvailable, MAX_REALTIME_FILE_CHANGES, MAX_REALTIME_DIFF_BYTES, stripLeadingAgentSkillReferences, MAX_AGENT_HISTORY_IMAGES, MAX_AGENT_TEXT_BYTES } from './chunk-TEWPWZPG.js';
|
|
4
4
|
import { __commonJS, __require, __toESM } from './chunk-K6J42667.js';
|
|
5
5
|
import { execFile, spawn } from 'child_process';
|
|
6
6
|
import { constants, mkdtempSync, rmSync, createReadStream, mkdirSync, unlinkSync, renameSync, writeFileSync, openSync, readSync, closeSync, statSync } from 'fs';
|
|
7
|
-
import {
|
|
7
|
+
import { readFile, mkdir, writeFile, rename, rm, readdir, realpath, stat, access, lstat, opendir } from 'fs/promises';
|
|
8
8
|
import { createRequire as createRequire$1 } from 'module';
|
|
9
|
-
import { resolve, basename, dirname,
|
|
9
|
+
import { resolve, basename, dirname, join, relative, sep, win32, posix, isAbsolute, extname } from 'path';
|
|
10
10
|
import { promisify } from 'util';
|
|
11
|
-
import {
|
|
11
|
+
import { randomUUID, createHash } from 'crypto';
|
|
12
12
|
import { Buffer as Buffer$1 } from 'buffer';
|
|
13
13
|
import { tmpdir, homedir } from 'os';
|
|
14
14
|
import { StringDecoder } from 'string_decoder';
|
|
@@ -1250,7 +1250,7 @@ var require_sonic_boom = __commonJS({
|
|
|
1250
1250
|
if (!(this instanceof SonicBoom)) {
|
|
1251
1251
|
return new SonicBoom(opts);
|
|
1252
1252
|
}
|
|
1253
|
-
let { fd, dest, minLength, maxLength, maxWrite, periodicFlush, sync, append = true, mkdir, retryEAGAIN, fsync, contentMode, mode } = opts || {};
|
|
1253
|
+
let { fd, dest, minLength, maxLength, maxWrite, periodicFlush, sync, append = true, mkdir: mkdir2, retryEAGAIN, fsync, contentMode, mode } = opts || {};
|
|
1254
1254
|
fd = fd || dest;
|
|
1255
1255
|
this._len = 0;
|
|
1256
1256
|
this.fd = -1;
|
|
@@ -1275,7 +1275,7 @@ var require_sonic_boom = __commonJS({
|
|
|
1275
1275
|
this.append = append || false;
|
|
1276
1276
|
this.mode = mode;
|
|
1277
1277
|
this.retryEAGAIN = retryEAGAIN || (() => true);
|
|
1278
|
-
this.mkdir =
|
|
1278
|
+
this.mkdir = mkdir2 || false;
|
|
1279
1279
|
let fsWriteSync;
|
|
1280
1280
|
let fsWrite;
|
|
1281
1281
|
if (contentMode === kContentModeBuffer) {
|
|
@@ -1983,7 +1983,7 @@ var require_thread_stream = __commonJS({
|
|
|
1983
1983
|
var { version } = require_package();
|
|
1984
1984
|
var { EventEmitter } = __require("events");
|
|
1985
1985
|
var { Worker: Worker2 } = __require("worker_threads");
|
|
1986
|
-
var { join:
|
|
1986
|
+
var { join: join6 } = __require("path");
|
|
1987
1987
|
var { pathToFileURL } = __require("url");
|
|
1988
1988
|
var { wait } = require_wait();
|
|
1989
1989
|
var {
|
|
@@ -2034,7 +2034,7 @@ var require_thread_stream = __commonJS({
|
|
|
2034
2034
|
function createWorker(stream, opts) {
|
|
2035
2035
|
const { filename, workerData } = opts;
|
|
2036
2036
|
const bundlerOverrides = "__bundlerPathsOverrides" in globalThis ? globalThis.__bundlerPathsOverrides : {};
|
|
2037
|
-
const toExecute = bundlerOverrides["thread-stream-worker"] ||
|
|
2037
|
+
const toExecute = bundlerOverrides["thread-stream-worker"] || join6(__dirname, "lib", "worker.js");
|
|
2038
2038
|
const worker = new Worker2(toExecute, {
|
|
2039
2039
|
...opts.workerOpts,
|
|
2040
2040
|
name: opts.workerOpts?.name || "thread-stream",
|
|
@@ -2501,7 +2501,7 @@ var require_transport = __commonJS({
|
|
|
2501
2501
|
var { createRequire: createRequire2 } = __require("module");
|
|
2502
2502
|
var { existsSync } = __require("fs");
|
|
2503
2503
|
var getCallers = require_caller();
|
|
2504
|
-
var { join:
|
|
2504
|
+
var { join: join6, isAbsolute: isAbsolute7, sep: sep3 } = __require("path");
|
|
2505
2505
|
var { fileURLToPath } = __require("url");
|
|
2506
2506
|
var sleep = require_atomic_sleep();
|
|
2507
2507
|
var onExit = require_on_exit_leak_free();
|
|
@@ -2573,7 +2573,7 @@ var require_transport = __commonJS({
|
|
|
2573
2573
|
return false;
|
|
2574
2574
|
}
|
|
2575
2575
|
}
|
|
2576
|
-
return
|
|
2576
|
+
return isAbsolute7(path) && !existsSync(path);
|
|
2577
2577
|
}
|
|
2578
2578
|
function stripQuotes(value) {
|
|
2579
2579
|
const first = value[0];
|
|
@@ -2654,7 +2654,7 @@ var require_transport = __commonJS({
|
|
|
2654
2654
|
throw new Error("only one of target or targets can be specified");
|
|
2655
2655
|
}
|
|
2656
2656
|
if (targets) {
|
|
2657
|
-
target = bundlerOverrides["pino-worker"] ||
|
|
2657
|
+
target = bundlerOverrides["pino-worker"] || join6(__dirname, "worker.js");
|
|
2658
2658
|
options.targets = targets.filter((dest) => dest.target).map((dest) => {
|
|
2659
2659
|
return {
|
|
2660
2660
|
...dest,
|
|
@@ -2672,7 +2672,7 @@ var require_transport = __commonJS({
|
|
|
2672
2672
|
});
|
|
2673
2673
|
});
|
|
2674
2674
|
} else if (pipeline) {
|
|
2675
|
-
target = bundlerOverrides["pino-worker"] ||
|
|
2675
|
+
target = bundlerOverrides["pino-worker"] || join6(__dirname, "worker.js");
|
|
2676
2676
|
options.pipelines = [pipeline.map((dest) => {
|
|
2677
2677
|
return {
|
|
2678
2678
|
...dest,
|
|
@@ -2691,16 +2691,16 @@ var require_transport = __commonJS({
|
|
|
2691
2691
|
return buildStream(fixTarget(target), options, worker, sync, name);
|
|
2692
2692
|
function fixTarget(origin) {
|
|
2693
2693
|
origin = bundlerOverrides[origin] || origin;
|
|
2694
|
-
if (
|
|
2694
|
+
if (isAbsolute7(origin) || origin.indexOf("file://") === 0) {
|
|
2695
2695
|
return origin;
|
|
2696
2696
|
}
|
|
2697
2697
|
if (origin === "pino/file") {
|
|
2698
|
-
return
|
|
2698
|
+
return join6(__dirname, "..", "file.js");
|
|
2699
2699
|
}
|
|
2700
2700
|
let fixTarget2;
|
|
2701
2701
|
for (const filePath of callers) {
|
|
2702
2702
|
try {
|
|
2703
|
-
const context = filePath === "node:repl" ? process.cwd() +
|
|
2703
|
+
const context = filePath === "node:repl" ? process.cwd() + sep3 : filePath;
|
|
2704
2704
|
fixTarget2 = createRequire2(context).resolve(origin);
|
|
2705
2705
|
break;
|
|
2706
2706
|
} catch (err) {
|
|
@@ -3670,7 +3670,7 @@ var require_safe_stable_stringify = __commonJS({
|
|
|
3670
3670
|
return circularValue;
|
|
3671
3671
|
}
|
|
3672
3672
|
let res = "";
|
|
3673
|
-
let
|
|
3673
|
+
let join6 = ",";
|
|
3674
3674
|
const originalIndentation = indentation;
|
|
3675
3675
|
if (Array.isArray(value)) {
|
|
3676
3676
|
if (value.length === 0) {
|
|
@@ -3684,7 +3684,7 @@ var require_safe_stable_stringify = __commonJS({
|
|
|
3684
3684
|
indentation += spacer;
|
|
3685
3685
|
res += `
|
|
3686
3686
|
${indentation}`;
|
|
3687
|
-
|
|
3687
|
+
join6 = `,
|
|
3688
3688
|
${indentation}`;
|
|
3689
3689
|
}
|
|
3690
3690
|
const maximumValuesToStringify = Math.min(value.length, maximumBreadth);
|
|
@@ -3692,13 +3692,13 @@ ${indentation}`;
|
|
|
3692
3692
|
for (; i < maximumValuesToStringify - 1; i++) {
|
|
3693
3693
|
const tmp2 = stringifyFnReplacer(String(i), value, stack, replacer, spacer, indentation);
|
|
3694
3694
|
res += tmp2 !== void 0 ? tmp2 : "null";
|
|
3695
|
-
res +=
|
|
3695
|
+
res += join6;
|
|
3696
3696
|
}
|
|
3697
3697
|
const tmp = stringifyFnReplacer(String(i), value, stack, replacer, spacer, indentation);
|
|
3698
3698
|
res += tmp !== void 0 ? tmp : "null";
|
|
3699
3699
|
if (value.length - 1 > maximumBreadth) {
|
|
3700
3700
|
const removedKeys = value.length - maximumBreadth - 1;
|
|
3701
|
-
res += `${
|
|
3701
|
+
res += `${join6}"... ${getItemCount(removedKeys)} not stringified"`;
|
|
3702
3702
|
}
|
|
3703
3703
|
if (spacer !== "") {
|
|
3704
3704
|
res += `
|
|
@@ -3719,7 +3719,7 @@ ${originalIndentation}`;
|
|
|
3719
3719
|
let separator = "";
|
|
3720
3720
|
if (spacer !== "") {
|
|
3721
3721
|
indentation += spacer;
|
|
3722
|
-
|
|
3722
|
+
join6 = `,
|
|
3723
3723
|
${indentation}`;
|
|
3724
3724
|
whitespace = " ";
|
|
3725
3725
|
}
|
|
@@ -3733,13 +3733,13 @@ ${indentation}`;
|
|
|
3733
3733
|
const tmp = stringifyFnReplacer(key2, value, stack, replacer, spacer, indentation);
|
|
3734
3734
|
if (tmp !== void 0) {
|
|
3735
3735
|
res += `${separator}${strEscape(key2)}:${whitespace}${tmp}`;
|
|
3736
|
-
separator =
|
|
3736
|
+
separator = join6;
|
|
3737
3737
|
}
|
|
3738
3738
|
}
|
|
3739
3739
|
if (keyLength > maximumBreadth) {
|
|
3740
3740
|
const removedKeys = keyLength - maximumBreadth;
|
|
3741
3741
|
res += `${separator}"...":${whitespace}"${getItemCount(removedKeys)} not stringified"`;
|
|
3742
|
-
separator =
|
|
3742
|
+
separator = join6;
|
|
3743
3743
|
}
|
|
3744
3744
|
if (spacer !== "" && separator.length > 1) {
|
|
3745
3745
|
res = `
|
|
@@ -3780,7 +3780,7 @@ ${originalIndentation}`;
|
|
|
3780
3780
|
}
|
|
3781
3781
|
const originalIndentation = indentation;
|
|
3782
3782
|
let res = "";
|
|
3783
|
-
let
|
|
3783
|
+
let join6 = ",";
|
|
3784
3784
|
if (Array.isArray(value)) {
|
|
3785
3785
|
if (value.length === 0) {
|
|
3786
3786
|
return "[]";
|
|
@@ -3793,7 +3793,7 @@ ${originalIndentation}`;
|
|
|
3793
3793
|
indentation += spacer;
|
|
3794
3794
|
res += `
|
|
3795
3795
|
${indentation}`;
|
|
3796
|
-
|
|
3796
|
+
join6 = `,
|
|
3797
3797
|
${indentation}`;
|
|
3798
3798
|
}
|
|
3799
3799
|
const maximumValuesToStringify = Math.min(value.length, maximumBreadth);
|
|
@@ -3801,13 +3801,13 @@ ${indentation}`;
|
|
|
3801
3801
|
for (; i < maximumValuesToStringify - 1; i++) {
|
|
3802
3802
|
const tmp2 = stringifyArrayReplacer(String(i), value[i], stack, replacer, spacer, indentation);
|
|
3803
3803
|
res += tmp2 !== void 0 ? tmp2 : "null";
|
|
3804
|
-
res +=
|
|
3804
|
+
res += join6;
|
|
3805
3805
|
}
|
|
3806
3806
|
const tmp = stringifyArrayReplacer(String(i), value[i], stack, replacer, spacer, indentation);
|
|
3807
3807
|
res += tmp !== void 0 ? tmp : "null";
|
|
3808
3808
|
if (value.length - 1 > maximumBreadth) {
|
|
3809
3809
|
const removedKeys = value.length - maximumBreadth - 1;
|
|
3810
|
-
res += `${
|
|
3810
|
+
res += `${join6}"... ${getItemCount(removedKeys)} not stringified"`;
|
|
3811
3811
|
}
|
|
3812
3812
|
if (spacer !== "") {
|
|
3813
3813
|
res += `
|
|
@@ -3820,7 +3820,7 @@ ${originalIndentation}`;
|
|
|
3820
3820
|
let whitespace = "";
|
|
3821
3821
|
if (spacer !== "") {
|
|
3822
3822
|
indentation += spacer;
|
|
3823
|
-
|
|
3823
|
+
join6 = `,
|
|
3824
3824
|
${indentation}`;
|
|
3825
3825
|
whitespace = " ";
|
|
3826
3826
|
}
|
|
@@ -3829,7 +3829,7 @@ ${indentation}`;
|
|
|
3829
3829
|
const tmp = stringifyArrayReplacer(key2, value[key2], stack, replacer, spacer, indentation);
|
|
3830
3830
|
if (tmp !== void 0) {
|
|
3831
3831
|
res += `${separator}${strEscape(key2)}:${whitespace}${tmp}`;
|
|
3832
|
-
separator =
|
|
3832
|
+
separator = join6;
|
|
3833
3833
|
}
|
|
3834
3834
|
}
|
|
3835
3835
|
if (spacer !== "" && separator.length > 1) {
|
|
@@ -3887,20 +3887,20 @@ ${originalIndentation}`;
|
|
|
3887
3887
|
indentation += spacer;
|
|
3888
3888
|
let res2 = `
|
|
3889
3889
|
${indentation}`;
|
|
3890
|
-
const
|
|
3890
|
+
const join7 = `,
|
|
3891
3891
|
${indentation}`;
|
|
3892
3892
|
const maximumValuesToStringify = Math.min(value.length, maximumBreadth);
|
|
3893
3893
|
let i = 0;
|
|
3894
3894
|
for (; i < maximumValuesToStringify - 1; i++) {
|
|
3895
3895
|
const tmp2 = stringifyIndent(String(i), value[i], stack, spacer, indentation);
|
|
3896
3896
|
res2 += tmp2 !== void 0 ? tmp2 : "null";
|
|
3897
|
-
res2 +=
|
|
3897
|
+
res2 += join7;
|
|
3898
3898
|
}
|
|
3899
3899
|
const tmp = stringifyIndent(String(i), value[i], stack, spacer, indentation);
|
|
3900
3900
|
res2 += tmp !== void 0 ? tmp : "null";
|
|
3901
3901
|
if (value.length - 1 > maximumBreadth) {
|
|
3902
3902
|
const removedKeys = value.length - maximumBreadth - 1;
|
|
3903
|
-
res2 += `${
|
|
3903
|
+
res2 += `${join7}"... ${getItemCount(removedKeys)} not stringified"`;
|
|
3904
3904
|
}
|
|
3905
3905
|
res2 += `
|
|
3906
3906
|
${originalIndentation}`;
|
|
@@ -3916,16 +3916,16 @@ ${originalIndentation}`;
|
|
|
3916
3916
|
return '"[Object]"';
|
|
3917
3917
|
}
|
|
3918
3918
|
indentation += spacer;
|
|
3919
|
-
const
|
|
3919
|
+
const join6 = `,
|
|
3920
3920
|
${indentation}`;
|
|
3921
3921
|
let res = "";
|
|
3922
3922
|
let separator = "";
|
|
3923
3923
|
let maximumPropertiesToStringify = Math.min(keyLength, maximumBreadth);
|
|
3924
3924
|
if (isTypedArrayWithEntries(value)) {
|
|
3925
|
-
res += stringifyTypedArray(value,
|
|
3925
|
+
res += stringifyTypedArray(value, join6, maximumBreadth);
|
|
3926
3926
|
keys = keys.slice(value.length);
|
|
3927
3927
|
maximumPropertiesToStringify -= value.length;
|
|
3928
|
-
separator =
|
|
3928
|
+
separator = join6;
|
|
3929
3929
|
}
|
|
3930
3930
|
if (deterministic) {
|
|
3931
3931
|
keys = sort(keys, comparator);
|
|
@@ -3936,13 +3936,13 @@ ${indentation}`;
|
|
|
3936
3936
|
const tmp = stringifyIndent(key2, value[key2], stack, spacer, indentation);
|
|
3937
3937
|
if (tmp !== void 0) {
|
|
3938
3938
|
res += `${separator}${strEscape(key2)}: ${tmp}`;
|
|
3939
|
-
separator =
|
|
3939
|
+
separator = join6;
|
|
3940
3940
|
}
|
|
3941
3941
|
}
|
|
3942
3942
|
if (keyLength > maximumBreadth) {
|
|
3943
3943
|
const removedKeys = keyLength - maximumBreadth;
|
|
3944
3944
|
res += `${separator}"...": "${getItemCount(removedKeys)} not stringified"`;
|
|
3945
|
-
separator =
|
|
3945
|
+
separator = join6;
|
|
3946
3946
|
}
|
|
3947
3947
|
if (separator !== "") {
|
|
3948
3948
|
res = `
|
|
@@ -7105,8 +7105,8 @@ var JsonlFrameProcessor = class {
|
|
|
7105
7105
|
const id = this.#nextRequestId++;
|
|
7106
7106
|
const transferable = Uint8Array.from(frame);
|
|
7107
7107
|
const transferredBuffer = transferable.buffer;
|
|
7108
|
-
return new Promise((
|
|
7109
|
-
this.#pending.set(id, { reject, resolve:
|
|
7108
|
+
return new Promise((resolve7, reject) => {
|
|
7109
|
+
this.#pending.set(id, { reject, resolve: resolve7 });
|
|
7110
7110
|
this.#worker.postMessage({ frame: transferredBuffer, id }, [transferredBuffer]);
|
|
7111
7111
|
});
|
|
7112
7112
|
}
|
|
@@ -7216,7 +7216,7 @@ function parseRpcError(value) {
|
|
|
7216
7216
|
function writeRpcMessage(output, message, timeoutMs) {
|
|
7217
7217
|
const frame = `${JSON.stringify(message)}
|
|
7218
7218
|
`;
|
|
7219
|
-
return new Promise((
|
|
7219
|
+
return new Promise((resolve7, reject) => {
|
|
7220
7220
|
const timer = setTimeout(() => {
|
|
7221
7221
|
reject(new RpcConnectionClosedError(`RPC write timed out after ${String(timeoutMs)}ms`));
|
|
7222
7222
|
}, timeoutMs);
|
|
@@ -7227,7 +7227,7 @@ function writeRpcMessage(output, message, timeoutMs) {
|
|
|
7227
7227
|
reject(new RpcConnectionClosedError(`RPC write failed: ${error.message}`));
|
|
7228
7228
|
return;
|
|
7229
7229
|
}
|
|
7230
|
-
|
|
7230
|
+
resolve7();
|
|
7231
7231
|
});
|
|
7232
7232
|
});
|
|
7233
7233
|
}
|
|
@@ -7401,7 +7401,7 @@ var JsonlRpcClient = class {
|
|
|
7401
7401
|
}
|
|
7402
7402
|
const id = this.#nextRequestId++;
|
|
7403
7403
|
const request = params === void 0 ? { id, method } : { id, method, params };
|
|
7404
|
-
return new Promise((
|
|
7404
|
+
return new Promise((resolve7, reject) => {
|
|
7405
7405
|
const pending = new RpcPendingRequest({
|
|
7406
7406
|
onTimeout: () => {
|
|
7407
7407
|
if (this.#removePending(id, pending)) {
|
|
@@ -7410,7 +7410,7 @@ var JsonlRpcClient = class {
|
|
|
7410
7410
|
},
|
|
7411
7411
|
reject,
|
|
7412
7412
|
request,
|
|
7413
|
-
resolve:
|
|
7413
|
+
resolve: resolve7,
|
|
7414
7414
|
timeoutMs
|
|
7415
7415
|
});
|
|
7416
7416
|
this.#pending.set(id, pending);
|
|
@@ -8531,7 +8531,7 @@ async function listCodexMcpServers(client, runtime, taskId) {
|
|
|
8531
8531
|
name,
|
|
8532
8532
|
status: "ready",
|
|
8533
8533
|
title: serverInfo === null ? null : optionalNullableString2(serverInfo["title"], "mcpServerStatus/list serverInfo title"),
|
|
8534
|
-
|
|
8534
|
+
tools: Object.keys(tools).toSorted(),
|
|
8535
8535
|
version: serverInfo === null ? null : optionalNullableString2(
|
|
8536
8536
|
serverInfo["version"],
|
|
8537
8537
|
"mcpServerStatus/list serverInfo version"
|
|
@@ -8569,7 +8569,7 @@ async function listCodexMcpServers(client, runtime, taskId) {
|
|
|
8569
8569
|
name,
|
|
8570
8570
|
status: startup.status,
|
|
8571
8571
|
title: readyServer?.title ?? null,
|
|
8572
|
-
|
|
8572
|
+
tools: readyServer?.tools ?? [],
|
|
8573
8573
|
version: readyServer?.version ?? null
|
|
8574
8574
|
});
|
|
8575
8575
|
}
|
|
@@ -9462,6 +9462,7 @@ var CodexAgentProviderQueue = class extends CodexAgentProviderBase {
|
|
|
9462
9462
|
),
|
|
9463
9463
|
id: expectString(queued["id"], "thread queue submission id"),
|
|
9464
9464
|
skills,
|
|
9465
|
+
status: "queued",
|
|
9465
9466
|
text: content.text
|
|
9466
9467
|
};
|
|
9467
9468
|
}
|
|
@@ -9614,8 +9615,8 @@ var CodexAgentProviderTurns = class extends CodexAgentProviderQueue {
|
|
|
9614
9615
|
);
|
|
9615
9616
|
}
|
|
9616
9617
|
let resolveStartedTurn = () => void 0;
|
|
9617
|
-
const startedTurn = new Promise((
|
|
9618
|
-
resolveStartedTurn =
|
|
9618
|
+
const startedTurn = new Promise((resolve7) => {
|
|
9619
|
+
resolveStartedTurn = resolve7;
|
|
9619
9620
|
});
|
|
9620
9621
|
const listener = (event) => {
|
|
9621
9622
|
if (event.taskId === taskId && event.type === "turn.started") {
|
|
@@ -11436,7 +11437,7 @@ var CodexFuzzyFileSearchService = class {
|
|
|
11436
11437
|
throw abortError("File search request was aborted");
|
|
11437
11438
|
}
|
|
11438
11439
|
this.#clearIdleTimer(session);
|
|
11439
|
-
return new Promise((
|
|
11440
|
+
return new Promise((resolve7, reject) => {
|
|
11440
11441
|
const cachedSnapshot = session.lastSnapshot?.query === input.query ? session.lastSnapshot : void 0;
|
|
11441
11442
|
const request = {
|
|
11442
11443
|
data: cachedSnapshot?.data ?? [],
|
|
@@ -11444,7 +11445,7 @@ var CodexFuzzyFileSearchService = class {
|
|
|
11444
11445
|
query: input.query,
|
|
11445
11446
|
receivedUpdate: cachedSnapshot !== void 0,
|
|
11446
11447
|
reject,
|
|
11447
|
-
resolve:
|
|
11448
|
+
resolve: resolve7,
|
|
11448
11449
|
settled: false
|
|
11449
11450
|
};
|
|
11450
11451
|
request.detachAbort = this.#listenForAbort(session, request, input.signal);
|
|
@@ -12178,8 +12179,8 @@ var CodexAppServerShutdownError = class extends RpcConnectionClosedError {
|
|
|
12178
12179
|
}
|
|
12179
12180
|
};
|
|
12180
12181
|
function delay(milliseconds) {
|
|
12181
|
-
return new Promise((
|
|
12182
|
-
const timer = setTimeout(
|
|
12182
|
+
return new Promise((resolve7) => {
|
|
12183
|
+
const timer = setTimeout(resolve7, milliseconds);
|
|
12183
12184
|
timer.unref();
|
|
12184
12185
|
});
|
|
12185
12186
|
}
|
|
@@ -12212,8 +12213,8 @@ var CodexAppServerProcess = class {
|
|
|
12212
12213
|
child.stderr.on("data", (chunk) => {
|
|
12213
12214
|
this.#appendStderr(typeof chunk === "string" ? chunk : chunk.toString("utf8"));
|
|
12214
12215
|
});
|
|
12215
|
-
this.#spawnPromise = new Promise((
|
|
12216
|
-
child.once("spawn",
|
|
12216
|
+
this.#spawnPromise = new Promise((resolve7, reject) => {
|
|
12217
|
+
child.once("spawn", resolve7);
|
|
12217
12218
|
child.once("error", (error) => {
|
|
12218
12219
|
const spawnError = new CodexAppServerSpawnError(
|
|
12219
12220
|
`Failed to start Codex App Server: ${error.message}`,
|
|
@@ -12229,10 +12230,10 @@ var CodexAppServerProcess = class {
|
|
|
12229
12230
|
this.client.close(new CodexAppServerExitedError({ code, signal }, this.#stderr.trim()));
|
|
12230
12231
|
}
|
|
12231
12232
|
});
|
|
12232
|
-
this.#exitPromise = new Promise((
|
|
12233
|
+
this.#exitPromise = new Promise((resolve7) => {
|
|
12233
12234
|
child.once("close", (code, signal) => {
|
|
12234
12235
|
this.#closed = true;
|
|
12235
|
-
|
|
12236
|
+
resolve7({ code, signal });
|
|
12236
12237
|
});
|
|
12237
12238
|
});
|
|
12238
12239
|
this.client.onError(() => {
|
|
@@ -12697,4 +12698,823 @@ var CodexProjectRepository = class {
|
|
|
12697
12698
|
}
|
|
12698
12699
|
};
|
|
12699
12700
|
|
|
12700
|
-
|
|
12701
|
+
// packages/provider-codex/src/workbench-pet-catalog.ts
|
|
12702
|
+
var PET_PACK_VERSION = "v1";
|
|
12703
|
+
var PET_CDN_BASE_URL = "https://persistent.oaistatic.com/codex/pets/v1";
|
|
12704
|
+
var PET_FRAME = { columns: 8, height: 208, rows: 9, width: 192 };
|
|
12705
|
+
var PET_SPRITESHEET = { height: 1872, width: 1536 };
|
|
12706
|
+
var BUILTIN_PETS = [
|
|
12707
|
+
{
|
|
12708
|
+
description: "The original Codex companion",
|
|
12709
|
+
displayName: "Codex",
|
|
12710
|
+
file: "codex-spritesheet-v4.webp",
|
|
12711
|
+
id: "codex"
|
|
12712
|
+
},
|
|
12713
|
+
{
|
|
12714
|
+
description: "A tidy duck for calm workspace days",
|
|
12715
|
+
displayName: "Dewey",
|
|
12716
|
+
file: "dewey-spritesheet-v4.webp",
|
|
12717
|
+
id: "dewey"
|
|
12718
|
+
},
|
|
12719
|
+
{
|
|
12720
|
+
description: "Hot path energy for fast iteration",
|
|
12721
|
+
displayName: "Fireball",
|
|
12722
|
+
file: "fireball-spritesheet-v4.webp",
|
|
12723
|
+
id: "fireball"
|
|
12724
|
+
},
|
|
12725
|
+
{
|
|
12726
|
+
description: "A steady rock when the diff gets large",
|
|
12727
|
+
displayName: "Rocky",
|
|
12728
|
+
file: "rocky-spritesheet-v4.webp",
|
|
12729
|
+
id: "rocky"
|
|
12730
|
+
},
|
|
12731
|
+
{
|
|
12732
|
+
description: "Small green shoots for new ideas",
|
|
12733
|
+
displayName: "Seedy",
|
|
12734
|
+
file: "seedy-spritesheet-v4.webp",
|
|
12735
|
+
id: "seedy"
|
|
12736
|
+
},
|
|
12737
|
+
{
|
|
12738
|
+
description: "A balanced stack for deep work",
|
|
12739
|
+
displayName: "Stacky",
|
|
12740
|
+
file: "stacky-spritesheet-v4.webp",
|
|
12741
|
+
id: "stacky"
|
|
12742
|
+
},
|
|
12743
|
+
{
|
|
12744
|
+
description: "A tiny blue-screen gremlin",
|
|
12745
|
+
displayName: "BSOD",
|
|
12746
|
+
file: "bsod-spritesheet-v4.webp",
|
|
12747
|
+
id: "bsod"
|
|
12748
|
+
},
|
|
12749
|
+
{
|
|
12750
|
+
description: "Quiet signal from the void",
|
|
12751
|
+
displayName: "Null Signal",
|
|
12752
|
+
file: "null-signal-spritesheet-v4.webp",
|
|
12753
|
+
id: "null-signal"
|
|
12754
|
+
}
|
|
12755
|
+
];
|
|
12756
|
+
var idleFrames = [
|
|
12757
|
+
[0, 1680],
|
|
12758
|
+
[1, 660],
|
|
12759
|
+
[2, 660],
|
|
12760
|
+
[3, 840],
|
|
12761
|
+
[4, 840],
|
|
12762
|
+
[5, 1920]
|
|
12763
|
+
];
|
|
12764
|
+
function idleAnimation() {
|
|
12765
|
+
return {
|
|
12766
|
+
fallback: "idle",
|
|
12767
|
+
frames: idleFrames.map(([spriteIndex, durationMs]) => ({ durationMs, spriteIndex })),
|
|
12768
|
+
loopStart: 0
|
|
12769
|
+
};
|
|
12770
|
+
}
|
|
12771
|
+
function stateAnimation(row, frameCount, durationMs, finalDurationMs) {
|
|
12772
|
+
const primary = Array.from({ length: frameCount }, (_, column) => ({
|
|
12773
|
+
durationMs: column === frameCount - 1 ? finalDurationMs : durationMs,
|
|
12774
|
+
spriteIndex: row * PET_FRAME.columns + column
|
|
12775
|
+
}));
|
|
12776
|
+
return {
|
|
12777
|
+
fallback: "idle",
|
|
12778
|
+
frames: [...primary, ...primary, ...primary, ...idleAnimation().frames],
|
|
12779
|
+
loopStart: primary.length * 3
|
|
12780
|
+
};
|
|
12781
|
+
}
|
|
12782
|
+
function createDefaultPetAnimations() {
|
|
12783
|
+
const tracks = {
|
|
12784
|
+
failed: stateAnimation(5, 8, 140, 240),
|
|
12785
|
+
idle: idleAnimation(),
|
|
12786
|
+
jumping: stateAnimation(4, 5, 140, 280),
|
|
12787
|
+
review: stateAnimation(8, 6, 150, 280),
|
|
12788
|
+
"running-left": stateAnimation(2, 8, 120, 220),
|
|
12789
|
+
"running-right": stateAnimation(1, 8, 120, 220),
|
|
12790
|
+
running: stateAnimation(7, 6, 120, 220),
|
|
12791
|
+
waiting: stateAnimation(6, 6, 150, 260),
|
|
12792
|
+
waving: stateAnimation(3, 4, 140, 280)
|
|
12793
|
+
};
|
|
12794
|
+
return {
|
|
12795
|
+
...tracks,
|
|
12796
|
+
bounce: tracks.jumping,
|
|
12797
|
+
move_left: tracks["running-left"],
|
|
12798
|
+
move_right: tracks["running-right"],
|
|
12799
|
+
sad: tracks.failed,
|
|
12800
|
+
wave: tracks.waving
|
|
12801
|
+
};
|
|
12802
|
+
}
|
|
12803
|
+
function createBuiltinDescriptor(pet, assetId, availability) {
|
|
12804
|
+
return {
|
|
12805
|
+
animations: createDefaultPetAnimations(),
|
|
12806
|
+
assetId,
|
|
12807
|
+
availability,
|
|
12808
|
+
description: pet.description,
|
|
12809
|
+
displayName: pet.displayName,
|
|
12810
|
+
frame: PET_FRAME,
|
|
12811
|
+
id: pet.id,
|
|
12812
|
+
source: "builtin"
|
|
12813
|
+
};
|
|
12814
|
+
}
|
|
12815
|
+
|
|
12816
|
+
// node_modules/.pnpm/image-dimensions@2.5.1/node_modules/image-dimensions/utilities.js
|
|
12817
|
+
function isValidOffsetToRead(dataView, offset, bytesToRead) {
|
|
12818
|
+
return dataView.byteLength >= offset + bytesToRead;
|
|
12819
|
+
}
|
|
12820
|
+
function getUint32(dataView, offset, littleEndian = false) {
|
|
12821
|
+
if (isValidOffsetToRead(dataView, offset, 4)) {
|
|
12822
|
+
return dataView.getUint32(offset, littleEndian);
|
|
12823
|
+
}
|
|
12824
|
+
}
|
|
12825
|
+
function getUint16(dataView, offset, littleEndian = false) {
|
|
12826
|
+
if (isValidOffsetToRead(dataView, offset, 2)) {
|
|
12827
|
+
return dataView.getUint16(offset, littleEndian);
|
|
12828
|
+
}
|
|
12829
|
+
}
|
|
12830
|
+
function getIsobmffFtypBrands(bytes) {
|
|
12831
|
+
if (bytes.length < 16) {
|
|
12832
|
+
return;
|
|
12833
|
+
}
|
|
12834
|
+
const isFtyp = bytes[4] === 102 && bytes[5] === 116 && bytes[6] === 121 && bytes[7] === 112;
|
|
12835
|
+
if (!isFtyp) {
|
|
12836
|
+
return;
|
|
12837
|
+
}
|
|
12838
|
+
const dataView = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
12839
|
+
const size = getUint32(dataView, 0);
|
|
12840
|
+
if (size === void 0 || size < 16 || size > bytes.length) {
|
|
12841
|
+
return;
|
|
12842
|
+
}
|
|
12843
|
+
const brands = [];
|
|
12844
|
+
brands.push(String.fromCodePoint(...bytes.slice(8, 12)));
|
|
12845
|
+
for (let i = 16; i + 4 <= size; i += 4) {
|
|
12846
|
+
brands.push(String.fromCodePoint(...bytes.slice(i, i + 4)));
|
|
12847
|
+
}
|
|
12848
|
+
return brands;
|
|
12849
|
+
}
|
|
12850
|
+
function unboxIsobmffBox(data, offset) {
|
|
12851
|
+
const dataView = new DataView(data.buffer, data.byteOffset, data.byteLength);
|
|
12852
|
+
const size = getUint32(dataView, offset);
|
|
12853
|
+
if (size === void 0) {
|
|
12854
|
+
return;
|
|
12855
|
+
}
|
|
12856
|
+
if (data.length < size + offset || size < 8) {
|
|
12857
|
+
return;
|
|
12858
|
+
}
|
|
12859
|
+
return {
|
|
12860
|
+
type: String.fromCodePoint(...data.slice(offset + 4, offset + 8)),
|
|
12861
|
+
data: data.slice(offset + 8, offset + size),
|
|
12862
|
+
tail: offset + size
|
|
12863
|
+
};
|
|
12864
|
+
}
|
|
12865
|
+
function getIsobmffIspeSizesFromMeta(data) {
|
|
12866
|
+
const sizes = [];
|
|
12867
|
+
let offset = 0;
|
|
12868
|
+
while (offset < data.length) {
|
|
12869
|
+
const box = unboxIsobmffBox(data, offset);
|
|
12870
|
+
if (!box) {
|
|
12871
|
+
break;
|
|
12872
|
+
}
|
|
12873
|
+
if (box.type === "meta") {
|
|
12874
|
+
parseIsobmffMetaBox(box.data, sizes);
|
|
12875
|
+
}
|
|
12876
|
+
offset = box.tail;
|
|
12877
|
+
}
|
|
12878
|
+
return sizes;
|
|
12879
|
+
}
|
|
12880
|
+
function parseIsobmffMetaBox(data, sizes) {
|
|
12881
|
+
let offset = 4;
|
|
12882
|
+
while (offset < data.length) {
|
|
12883
|
+
const box = unboxIsobmffBox(data, offset);
|
|
12884
|
+
if (!box) {
|
|
12885
|
+
break;
|
|
12886
|
+
}
|
|
12887
|
+
if (box.type === "iprp") {
|
|
12888
|
+
parseIsobmffIprpBox(box.data, sizes);
|
|
12889
|
+
}
|
|
12890
|
+
offset = box.tail;
|
|
12891
|
+
}
|
|
12892
|
+
return sizes;
|
|
12893
|
+
}
|
|
12894
|
+
function parseIsobmffIprpBox(data, sizes) {
|
|
12895
|
+
let offset = 0;
|
|
12896
|
+
while (offset < data.length) {
|
|
12897
|
+
const box = unboxIsobmffBox(data, offset);
|
|
12898
|
+
if (!box) {
|
|
12899
|
+
break;
|
|
12900
|
+
}
|
|
12901
|
+
if (box.type === "ipco") {
|
|
12902
|
+
parseIsobmffIpcoBox(box.data, sizes);
|
|
12903
|
+
}
|
|
12904
|
+
offset = box.tail;
|
|
12905
|
+
}
|
|
12906
|
+
}
|
|
12907
|
+
function parseIsobmffIpcoBox(data, sizes) {
|
|
12908
|
+
let offset = 0;
|
|
12909
|
+
while (offset < data.length) {
|
|
12910
|
+
const box = unboxIsobmffBox(data, offset);
|
|
12911
|
+
if (!box) {
|
|
12912
|
+
break;
|
|
12913
|
+
}
|
|
12914
|
+
if (box.type === "ispe") {
|
|
12915
|
+
const dataView = new DataView(box.data.buffer, box.data.byteOffset, box.data.byteLength);
|
|
12916
|
+
const width = getUint32(dataView, 4);
|
|
12917
|
+
const height = getUint32(dataView, 8);
|
|
12918
|
+
if (width === void 0 || height === void 0) {
|
|
12919
|
+
return;
|
|
12920
|
+
}
|
|
12921
|
+
sizes.push({
|
|
12922
|
+
width,
|
|
12923
|
+
height
|
|
12924
|
+
});
|
|
12925
|
+
}
|
|
12926
|
+
offset = box.tail;
|
|
12927
|
+
}
|
|
12928
|
+
}
|
|
12929
|
+
function getLargestAreaSize(sizes) {
|
|
12930
|
+
let maxSize = sizes[0];
|
|
12931
|
+
for (const size of sizes) {
|
|
12932
|
+
if (size.width * size.height > maxSize.width * maxSize.height) {
|
|
12933
|
+
maxSize = size;
|
|
12934
|
+
}
|
|
12935
|
+
}
|
|
12936
|
+
return maxSize;
|
|
12937
|
+
}
|
|
12938
|
+
|
|
12939
|
+
// node_modules/.pnpm/image-dimensions@2.5.1/node_modules/image-dimensions/types/png.js
|
|
12940
|
+
var isPng = (bytes) => bytes[0] === 137 && bytes[1] === 80 && bytes[2] === 78 && bytes[3] === 71 && bytes[4] === 13 && bytes[5] === 10 && bytes[6] === 26 && bytes[7] === 10;
|
|
12941
|
+
var isAppleMinifiedPng = (bytes) => bytes[12] === 67 && bytes[13] === 103 && bytes[14] === 66 && bytes[15] === 73;
|
|
12942
|
+
function png(bytes) {
|
|
12943
|
+
if (!isPng(bytes)) {
|
|
12944
|
+
return;
|
|
12945
|
+
}
|
|
12946
|
+
const dataView = new DataView(bytes.buffer);
|
|
12947
|
+
const isAppleMinified = isAppleMinifiedPng(bytes);
|
|
12948
|
+
const width = getUint32(dataView, isAppleMinified ? 32 : 16, false);
|
|
12949
|
+
const height = getUint32(dataView, isAppleMinified ? 36 : 20, false);
|
|
12950
|
+
if (width === void 0 || height === void 0) {
|
|
12951
|
+
return;
|
|
12952
|
+
}
|
|
12953
|
+
return {
|
|
12954
|
+
width,
|
|
12955
|
+
height,
|
|
12956
|
+
type: "png"
|
|
12957
|
+
};
|
|
12958
|
+
}
|
|
12959
|
+
|
|
12960
|
+
// node_modules/.pnpm/image-dimensions@2.5.1/node_modules/image-dimensions/types/jpeg.js
|
|
12961
|
+
var SOF0 = 65472;
|
|
12962
|
+
var SOF3 = 65475;
|
|
12963
|
+
var jsJpeg = (bytes) => bytes[0] === 255 && bytes[1] === 216 && bytes[2] === 255;
|
|
12964
|
+
function jpeg(bytes) {
|
|
12965
|
+
if (!jsJpeg(bytes)) {
|
|
12966
|
+
return;
|
|
12967
|
+
}
|
|
12968
|
+
const dataView = new DataView(bytes.buffer);
|
|
12969
|
+
let offset = 2;
|
|
12970
|
+
while (isValidOffsetToRead(dataView, offset, 2)) {
|
|
12971
|
+
const marker = dataView.getUint16(offset);
|
|
12972
|
+
offset += 2;
|
|
12973
|
+
if (marker >= SOF0 && marker <= SOF3) {
|
|
12974
|
+
const height = getUint16(dataView, offset + 3, false);
|
|
12975
|
+
const width = getUint16(dataView, offset + 5, false);
|
|
12976
|
+
if (height === void 0 || width === void 0) {
|
|
12977
|
+
return;
|
|
12978
|
+
}
|
|
12979
|
+
return {
|
|
12980
|
+
height,
|
|
12981
|
+
width,
|
|
12982
|
+
type: "jpeg"
|
|
12983
|
+
};
|
|
12984
|
+
}
|
|
12985
|
+
const segmentLength = getUint16(dataView, offset);
|
|
12986
|
+
if (segmentLength === void 0) {
|
|
12987
|
+
return;
|
|
12988
|
+
}
|
|
12989
|
+
offset += segmentLength;
|
|
12990
|
+
if (offset > dataView.byteLength) {
|
|
12991
|
+
return;
|
|
12992
|
+
}
|
|
12993
|
+
}
|
|
12994
|
+
}
|
|
12995
|
+
|
|
12996
|
+
// node_modules/.pnpm/image-dimensions@2.5.1/node_modules/image-dimensions/types/gif.js
|
|
12997
|
+
var isGif = (bytes) => bytes[0] === 71 && bytes[1] === 73 && bytes[2] === 70 && bytes[3] === 56 && (bytes[4] === 55 || bytes[4] === 57) && bytes[5] === 97;
|
|
12998
|
+
function gif(bytes) {
|
|
12999
|
+
if (!isGif(bytes)) {
|
|
13000
|
+
return;
|
|
13001
|
+
}
|
|
13002
|
+
const dataView = new DataView(bytes.buffer);
|
|
13003
|
+
const width = getUint16(dataView, 6, true);
|
|
13004
|
+
const height = getUint16(dataView, 8, true);
|
|
13005
|
+
if (width === void 0 || height === void 0) {
|
|
13006
|
+
return;
|
|
13007
|
+
}
|
|
13008
|
+
return {
|
|
13009
|
+
width,
|
|
13010
|
+
height,
|
|
13011
|
+
type: "gif"
|
|
13012
|
+
};
|
|
13013
|
+
}
|
|
13014
|
+
|
|
13015
|
+
// node_modules/.pnpm/image-dimensions@2.5.1/node_modules/image-dimensions/types/webp.js
|
|
13016
|
+
var isWebp = (bytes) => (
|
|
13017
|
+
// RIFF
|
|
13018
|
+
bytes[0] === 82 && bytes[1] === 73 && bytes[2] === 70 && bytes[3] === 70 && bytes[8] === 87 && bytes[9] === 69 && bytes[10] === 66 && bytes[11] === 80
|
|
13019
|
+
);
|
|
13020
|
+
var isVP8Lossy = (bytes) => (
|
|
13021
|
+
// `VP8 ` (note the space)
|
|
13022
|
+
bytes[12] === 86 && bytes[13] === 80 && bytes[14] === 56 && bytes[15] === 32
|
|
13023
|
+
);
|
|
13024
|
+
var isVP8Lossless = (bytes) => (
|
|
13025
|
+
// `VP8L`
|
|
13026
|
+
bytes[12] === 86 && bytes[13] === 80 && bytes[14] === 56 && bytes[15] === 76
|
|
13027
|
+
);
|
|
13028
|
+
var isVP8Extended = (bytes) => (
|
|
13029
|
+
// `VP8X`
|
|
13030
|
+
bytes[12] === 86 && bytes[13] === 80 && bytes[14] === 56 && bytes[15] === 88
|
|
13031
|
+
);
|
|
13032
|
+
function readUInt24LE(dataView, offset) {
|
|
13033
|
+
const byte1 = dataView.getUint8(offset);
|
|
13034
|
+
const byte2 = dataView.getUint8(offset + 1);
|
|
13035
|
+
const byte3 = dataView.getUint8(offset + 2);
|
|
13036
|
+
return byte3 << 16 | byte2 << 8 | byte1;
|
|
13037
|
+
}
|
|
13038
|
+
function webp(bytes) {
|
|
13039
|
+
if (!isWebp(bytes)) {
|
|
13040
|
+
return;
|
|
13041
|
+
}
|
|
13042
|
+
const dataView = new DataView(bytes.buffer);
|
|
13043
|
+
const maxSize = 16383;
|
|
13044
|
+
if (isVP8Lossy(bytes)) {
|
|
13045
|
+
if (!isValidOffsetToRead(dataView, 28, 2)) {
|
|
13046
|
+
return;
|
|
13047
|
+
}
|
|
13048
|
+
return {
|
|
13049
|
+
// eslint-disable-next-line no-bitwise
|
|
13050
|
+
width: dataView.getUint16(26, true) & maxSize,
|
|
13051
|
+
// eslint-disable-next-line no-bitwise
|
|
13052
|
+
height: dataView.getUint16(28, true) & maxSize,
|
|
13053
|
+
type: "webp"
|
|
13054
|
+
};
|
|
13055
|
+
}
|
|
13056
|
+
if (isVP8Lossless(bytes)) {
|
|
13057
|
+
const bits = getUint32(dataView, 21, true);
|
|
13058
|
+
if (bits === void 0) {
|
|
13059
|
+
return;
|
|
13060
|
+
}
|
|
13061
|
+
return {
|
|
13062
|
+
// eslint-disable-next-line no-bitwise
|
|
13063
|
+
width: (bits & maxSize) + 1,
|
|
13064
|
+
// eslint-disable-next-line no-bitwise
|
|
13065
|
+
height: (bits >> 14 & maxSize) + 1,
|
|
13066
|
+
type: "webp"
|
|
13067
|
+
};
|
|
13068
|
+
}
|
|
13069
|
+
if (isVP8Extended(bytes)) {
|
|
13070
|
+
if (!isValidOffsetToRead(dataView, 27, 3)) {
|
|
13071
|
+
return;
|
|
13072
|
+
}
|
|
13073
|
+
return {
|
|
13074
|
+
width: readUInt24LE(dataView, 24) + 1,
|
|
13075
|
+
height: readUInt24LE(dataView, 27) + 1,
|
|
13076
|
+
type: "webp"
|
|
13077
|
+
};
|
|
13078
|
+
}
|
|
13079
|
+
}
|
|
13080
|
+
|
|
13081
|
+
// node_modules/.pnpm/image-dimensions@2.5.1/node_modules/image-dimensions/types/avif.js
|
|
13082
|
+
var avifBrands = /* @__PURE__ */ new Set([
|
|
13083
|
+
"avif",
|
|
13084
|
+
"avis",
|
|
13085
|
+
"avio"
|
|
13086
|
+
]);
|
|
13087
|
+
var isAvif = (bytes) => {
|
|
13088
|
+
const brands = getIsobmffFtypBrands(bytes);
|
|
13089
|
+
if (!brands) {
|
|
13090
|
+
return false;
|
|
13091
|
+
}
|
|
13092
|
+
return brands.some((brand) => avifBrands.has(brand));
|
|
13093
|
+
};
|
|
13094
|
+
function avif(bytes) {
|
|
13095
|
+
if (!isAvif(bytes)) {
|
|
13096
|
+
return;
|
|
13097
|
+
}
|
|
13098
|
+
const sizes = getIsobmffIspeSizesFromMeta(bytes);
|
|
13099
|
+
if (sizes.length === 0) {
|
|
13100
|
+
return;
|
|
13101
|
+
}
|
|
13102
|
+
return {
|
|
13103
|
+
...getLargestAreaSize(sizes),
|
|
13104
|
+
type: "avif"
|
|
13105
|
+
};
|
|
13106
|
+
}
|
|
13107
|
+
|
|
13108
|
+
// node_modules/.pnpm/image-dimensions@2.5.1/node_modules/image-dimensions/types/heic.js
|
|
13109
|
+
var heifBrands = /* @__PURE__ */ new Set([
|
|
13110
|
+
"mif1",
|
|
13111
|
+
"msf1",
|
|
13112
|
+
"heic",
|
|
13113
|
+
"heix",
|
|
13114
|
+
"hevc",
|
|
13115
|
+
"hevx",
|
|
13116
|
+
"heim",
|
|
13117
|
+
"heis",
|
|
13118
|
+
"hevm",
|
|
13119
|
+
"hevs"
|
|
13120
|
+
]);
|
|
13121
|
+
var isHeic = (bytes) => {
|
|
13122
|
+
const brands = getIsobmffFtypBrands(bytes);
|
|
13123
|
+
if (!brands) {
|
|
13124
|
+
return false;
|
|
13125
|
+
}
|
|
13126
|
+
return brands.some((brand) => heifBrands.has(brand));
|
|
13127
|
+
};
|
|
13128
|
+
function heic(bytes) {
|
|
13129
|
+
if (!isHeic(bytes)) {
|
|
13130
|
+
return;
|
|
13131
|
+
}
|
|
13132
|
+
const sizes = getIsobmffIspeSizesFromMeta(bytes);
|
|
13133
|
+
if (sizes.length === 0) {
|
|
13134
|
+
return;
|
|
13135
|
+
}
|
|
13136
|
+
return {
|
|
13137
|
+
...getLargestAreaSize(sizes),
|
|
13138
|
+
type: "heic"
|
|
13139
|
+
};
|
|
13140
|
+
}
|
|
13141
|
+
|
|
13142
|
+
// node_modules/.pnpm/image-dimensions@2.5.1/node_modules/image-dimensions/index.js
|
|
13143
|
+
function imageDimensionsFromData(bytes) {
|
|
13144
|
+
if (bytes.length < 3) {
|
|
13145
|
+
return;
|
|
13146
|
+
}
|
|
13147
|
+
bytes = new Uint8Array(bytes);
|
|
13148
|
+
return png(bytes) ?? gif(bytes) ?? jpeg(bytes) ?? webp(bytes) ?? avif(bytes) ?? heic(bytes);
|
|
13149
|
+
}
|
|
13150
|
+
|
|
13151
|
+
// packages/provider-codex/src/workbench-pet-image.ts
|
|
13152
|
+
function readWebpDimensions(data) {
|
|
13153
|
+
const dimensions = imageDimensionsFromData(data);
|
|
13154
|
+
if (dimensions?.type !== "webp") {
|
|
13155
|
+
throw new Error("Pet spritesheet must be a valid WebP image");
|
|
13156
|
+
}
|
|
13157
|
+
return dimensions;
|
|
13158
|
+
}
|
|
13159
|
+
async function readWebpDimensionsFromFile(path) {
|
|
13160
|
+
return readWebpDimensions(await readFile(path));
|
|
13161
|
+
}
|
|
13162
|
+
var MAX_MANIFEST_BYTES = 64 * 1024;
|
|
13163
|
+
var MAX_CUSTOM_ASSET_BYTES = 16 * 1024 * 1024;
|
|
13164
|
+
var MAX_FRAMES = 256;
|
|
13165
|
+
var MAX_FPS = 60;
|
|
13166
|
+
async function loadCustomPet(input) {
|
|
13167
|
+
const baseDirectory = await realpath(input.directory);
|
|
13168
|
+
const manifestPath = resolve(baseDirectory, input.manifestName);
|
|
13169
|
+
const manifestStats = await stat(manifestPath);
|
|
13170
|
+
if (!manifestStats.isFile() || manifestStats.size > MAX_MANIFEST_BYTES) {
|
|
13171
|
+
throw new Error("Pet manifest is missing or too large");
|
|
13172
|
+
}
|
|
13173
|
+
const raw = await readFile(manifestPath, "utf8");
|
|
13174
|
+
const manifest = parseRecord(JSON.parse(raw), "Pet manifest");
|
|
13175
|
+
const spritesheetPath = readOptionalString(manifest, "spritesheetPath") ?? "spritesheet.webp";
|
|
13176
|
+
if (isAbsolute(spritesheetPath) || spritesheetPath.split(/[\\/]/u).includes("..")) {
|
|
13177
|
+
throw new Error("Pet spritesheet must stay inside its directory");
|
|
13178
|
+
}
|
|
13179
|
+
const path = await realpath(resolve(baseDirectory, spritesheetPath));
|
|
13180
|
+
assertContained(baseDirectory, path);
|
|
13181
|
+
const assetStats = await stat(path);
|
|
13182
|
+
if (!assetStats.isFile() || assetStats.size > MAX_CUSTOM_ASSET_BYTES) {
|
|
13183
|
+
throw new Error("Pet spritesheet is missing or too large");
|
|
13184
|
+
}
|
|
13185
|
+
const dimensions = await readWebpDimensionsFromFile(path);
|
|
13186
|
+
const frame = parseFrame(manifest["frame"]);
|
|
13187
|
+
const frameCount = validateFrame(frame, dimensions.width, dimensions.height);
|
|
13188
|
+
const animations = parseAnimations(manifest["animations"], frameCount);
|
|
13189
|
+
const manifestId = readOptionalString(manifest, "id");
|
|
13190
|
+
return {
|
|
13191
|
+
assetId: input.assetId,
|
|
13192
|
+
baseDirectory,
|
|
13193
|
+
descriptor: {
|
|
13194
|
+
animations,
|
|
13195
|
+
assetId: input.assetId,
|
|
13196
|
+
availability: "ready",
|
|
13197
|
+
description: readOptionalString(manifest, "description") ?? "",
|
|
13198
|
+
displayName: readOptionalString(manifest, "displayName") ?? manifestId ?? input.folder,
|
|
13199
|
+
frame,
|
|
13200
|
+
id: `custom:${input.folder}`,
|
|
13201
|
+
source: input.source
|
|
13202
|
+
},
|
|
13203
|
+
path
|
|
13204
|
+
};
|
|
13205
|
+
}
|
|
13206
|
+
async function validatePetAsset(record) {
|
|
13207
|
+
const [baseDirectory, resolved] = await Promise.all([
|
|
13208
|
+
realpath(record.baseDirectory),
|
|
13209
|
+
realpath(record.path)
|
|
13210
|
+
]);
|
|
13211
|
+
assertContained(baseDirectory, resolved);
|
|
13212
|
+
const assetStats = await stat(resolved);
|
|
13213
|
+
if (!assetStats.isFile() || assetStats.size > MAX_CUSTOM_ASSET_BYTES) {
|
|
13214
|
+
throw new Error("Pet spritesheet is unavailable");
|
|
13215
|
+
}
|
|
13216
|
+
const dimensions = await readWebpDimensionsFromFile(resolved);
|
|
13217
|
+
validateFrame(record.descriptor.frame, dimensions.width, dimensions.height);
|
|
13218
|
+
return { mtimeMs: assetStats.mtimeMs, size: assetStats.size };
|
|
13219
|
+
}
|
|
13220
|
+
function parseFrame(value) {
|
|
13221
|
+
if (value === void 0 || value === null) return PET_FRAME;
|
|
13222
|
+
const frame = parseRecord(value, "Pet frame");
|
|
13223
|
+
return {
|
|
13224
|
+
columns: readPositiveInteger(frame, "columns"),
|
|
13225
|
+
height: readPositiveInteger(frame, "height"),
|
|
13226
|
+
rows: readPositiveInteger(frame, "rows"),
|
|
13227
|
+
width: readPositiveInteger(frame, "width")
|
|
13228
|
+
};
|
|
13229
|
+
}
|
|
13230
|
+
function validateFrame(frame, width, height) {
|
|
13231
|
+
if (width === void 0 || height === void 0 || frame.width * frame.columns !== width || frame.height * frame.rows !== height) {
|
|
13232
|
+
throw new Error("Pet frame grid must cover the spritesheet exactly");
|
|
13233
|
+
}
|
|
13234
|
+
const frameCount = frame.columns * frame.rows;
|
|
13235
|
+
if (frameCount > MAX_FRAMES) throw new Error("Pet frame count exceeds the maximum");
|
|
13236
|
+
return frameCount;
|
|
13237
|
+
}
|
|
13238
|
+
function parseAnimations(value, frameCount) {
|
|
13239
|
+
const defaults = createDefaultPetAnimations();
|
|
13240
|
+
if (value === void 0 || value === null) return defaults;
|
|
13241
|
+
const source = parseRecord(value, "Pet animations");
|
|
13242
|
+
if (Object.keys(source).length === 0) return defaults;
|
|
13243
|
+
const animations = { ...defaults };
|
|
13244
|
+
for (const [name, raw] of Object.entries(source)) {
|
|
13245
|
+
const spec = parseRecord(raw, `Pet animation ${name}`);
|
|
13246
|
+
const frames = spec["frames"];
|
|
13247
|
+
if (!Array.isArray(frames) || frames.length === 0) {
|
|
13248
|
+
throw new Error(`Pet animation ${name} requires frames`);
|
|
13249
|
+
}
|
|
13250
|
+
const spriteIndices = frames.map((frame) => {
|
|
13251
|
+
if (!Number.isInteger(frame) || Number(frame) < 0 || Number(frame) >= frameCount) {
|
|
13252
|
+
throw new Error(`Pet animation ${name} has an invalid frame`);
|
|
13253
|
+
}
|
|
13254
|
+
return Number(frame);
|
|
13255
|
+
});
|
|
13256
|
+
const fps = spec["fps"] === void 0 ? 8 : Number(spec["fps"]);
|
|
13257
|
+
if (!Number.isFinite(fps) || fps <= 0 || fps > MAX_FPS) {
|
|
13258
|
+
throw new Error(`Pet animation ${name} has an invalid fps`);
|
|
13259
|
+
}
|
|
13260
|
+
const loops = spec["loop"] === void 0 ? true : spec["loop"];
|
|
13261
|
+
if (typeof loops !== "boolean") throw new Error(`Pet animation ${name} has an invalid loop`);
|
|
13262
|
+
animations[name] = {
|
|
13263
|
+
fallback: readOptionalString(spec, "fallback") ?? "idle",
|
|
13264
|
+
frames: spriteIndices.map((spriteIndex) => ({
|
|
13265
|
+
durationMs: Math.max(1, Math.round(1e3 / fps)),
|
|
13266
|
+
spriteIndex
|
|
13267
|
+
})),
|
|
13268
|
+
loopStart: loops ? 0 : null
|
|
13269
|
+
};
|
|
13270
|
+
}
|
|
13271
|
+
for (const [name, animation] of Object.entries(animations)) {
|
|
13272
|
+
if (animations[animation.fallback] === void 0) {
|
|
13273
|
+
throw new Error(`Pet animation ${name} has an unknown fallback`);
|
|
13274
|
+
}
|
|
13275
|
+
}
|
|
13276
|
+
return animations;
|
|
13277
|
+
}
|
|
13278
|
+
function assertContained(base, target) {
|
|
13279
|
+
const child = relative(base, target);
|
|
13280
|
+
if (child === "" || !child.startsWith(`..${sep}`) && child !== ".." && !isAbsolute(child)) {
|
|
13281
|
+
return;
|
|
13282
|
+
}
|
|
13283
|
+
throw new Error("Pet asset escapes its directory");
|
|
13284
|
+
}
|
|
13285
|
+
function parseRecord(value, label) {
|
|
13286
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
13287
|
+
throw new Error(`${label} must be an object`);
|
|
13288
|
+
}
|
|
13289
|
+
return value;
|
|
13290
|
+
}
|
|
13291
|
+
function readOptionalString(record, key) {
|
|
13292
|
+
const value = record[key];
|
|
13293
|
+
if (value === void 0 || value === null) return void 0;
|
|
13294
|
+
if (typeof value !== "string") throw new Error(`Pet ${key} must be a string`);
|
|
13295
|
+
const normalized = value.trim();
|
|
13296
|
+
return normalized.length === 0 ? void 0 : normalized;
|
|
13297
|
+
}
|
|
13298
|
+
function readPositiveInteger(record, key) {
|
|
13299
|
+
const value = record[key];
|
|
13300
|
+
if (!Number.isInteger(value) || Number(value) <= 0) {
|
|
13301
|
+
throw new Error(`Pet frame ${key} must be a positive integer`);
|
|
13302
|
+
}
|
|
13303
|
+
return Number(value);
|
|
13304
|
+
}
|
|
13305
|
+
|
|
13306
|
+
// packages/provider-codex/src/workbench-pets.ts
|
|
13307
|
+
var MAX_DOWNLOAD_BYTES = 4 * 1024 * 1024;
|
|
13308
|
+
var DOWNLOAD_TIMEOUT_MS = 6e4;
|
|
13309
|
+
var MAX_CONCURRENT_DOWNLOADS = 2;
|
|
13310
|
+
var CodexWorkbenchPetProvider = class {
|
|
13311
|
+
#assetRecords = /* @__PURE__ */ new Map();
|
|
13312
|
+
#codexHome;
|
|
13313
|
+
#fetch;
|
|
13314
|
+
#inFlight = /* @__PURE__ */ new Map();
|
|
13315
|
+
#logger;
|
|
13316
|
+
#downloadWaiters = [];
|
|
13317
|
+
#activeDownloads = 0;
|
|
13318
|
+
constructor(options) {
|
|
13319
|
+
this.#codexHome = resolve(options.codexHome);
|
|
13320
|
+
this.#fetch = options.fetch ?? globalThis.fetch;
|
|
13321
|
+
this.#logger = options.logger;
|
|
13322
|
+
}
|
|
13323
|
+
async listPets() {
|
|
13324
|
+
this.#assetRecords.clear();
|
|
13325
|
+
const builtins = await Promise.all(BUILTIN_PETS.map((pet) => this.#describeBuiltin(pet)));
|
|
13326
|
+
const preferred = await this.#scanCustomRoot("pets", "pet.json", "custom");
|
|
13327
|
+
const preferredFolders = new Set(preferred.map((record) => record.descriptor.id));
|
|
13328
|
+
const legacy = (await this.#scanCustomRoot("avatars", "avatar.json", "legacy")).filter(
|
|
13329
|
+
(record) => !preferredFolders.has(record.descriptor.id)
|
|
13330
|
+
);
|
|
13331
|
+
for (const record of [...preferred, ...legacy]) this.#assetRecords.set(record.assetId, record);
|
|
13332
|
+
return [...builtins, ...preferred, ...legacy].map(
|
|
13333
|
+
(item) => "descriptor" in item ? item.descriptor : item
|
|
13334
|
+
);
|
|
13335
|
+
}
|
|
13336
|
+
ensurePetAsset(petId) {
|
|
13337
|
+
if (petId.startsWith("custom:")) {
|
|
13338
|
+
return Promise.reject(
|
|
13339
|
+
new WorkbenchPetProviderError("invalid", "Only built-in pets can be downloaded")
|
|
13340
|
+
);
|
|
13341
|
+
}
|
|
13342
|
+
const pet = BUILTIN_PETS.find((candidate) => candidate.id === petId);
|
|
13343
|
+
if (pet === void 0) {
|
|
13344
|
+
return Promise.reject(new WorkbenchPetProviderError("not_found", "Unknown built-in pet"));
|
|
13345
|
+
}
|
|
13346
|
+
const existing = this.#inFlight.get(petId);
|
|
13347
|
+
if (existing !== void 0) return existing;
|
|
13348
|
+
const promise = this.#ensureBuiltin(pet).finally(() => this.#inFlight.delete(petId));
|
|
13349
|
+
this.#inFlight.set(petId, promise);
|
|
13350
|
+
return promise;
|
|
13351
|
+
}
|
|
13352
|
+
async openPetAsset(assetId) {
|
|
13353
|
+
let record = this.#assetRecords.get(assetId);
|
|
13354
|
+
if (record === void 0) {
|
|
13355
|
+
await this.listPets();
|
|
13356
|
+
record = this.#assetRecords.get(assetId);
|
|
13357
|
+
}
|
|
13358
|
+
if (record?.descriptor.availability !== "ready") return void 0;
|
|
13359
|
+
try {
|
|
13360
|
+
const metadata = await validatePetAsset(record);
|
|
13361
|
+
const content = await readFile(record.path);
|
|
13362
|
+
return {
|
|
13363
|
+
content,
|
|
13364
|
+
contentType: "image/webp",
|
|
13365
|
+
etag: `W/"${String(metadata.size)}-${String(Math.trunc(metadata.mtimeMs))}"`,
|
|
13366
|
+
size: metadata.size
|
|
13367
|
+
};
|
|
13368
|
+
} catch {
|
|
13369
|
+
throw new WorkbenchPetProviderError("invalid", "Pet asset is invalid");
|
|
13370
|
+
}
|
|
13371
|
+
}
|
|
13372
|
+
async #describeBuiltin(pet) {
|
|
13373
|
+
const assetId = stableAssetId(`builtin:${PET_PACK_VERSION}:${pet.id}:${pet.file}`);
|
|
13374
|
+
const path = this.#builtinPath(pet);
|
|
13375
|
+
const baseDirectory = dirname(path);
|
|
13376
|
+
let availability = "downloadable";
|
|
13377
|
+
try {
|
|
13378
|
+
await validateBuiltinFile(path);
|
|
13379
|
+
availability = "ready";
|
|
13380
|
+
} catch {
|
|
13381
|
+
}
|
|
13382
|
+
const descriptor = createBuiltinDescriptor(pet, assetId, availability);
|
|
13383
|
+
this.#assetRecords.set(assetId, { assetId, baseDirectory, descriptor, path });
|
|
13384
|
+
return descriptor;
|
|
13385
|
+
}
|
|
13386
|
+
async #ensureBuiltin(pet) {
|
|
13387
|
+
const cached = await this.#describeBuiltin(pet);
|
|
13388
|
+
if (cached.availability === "ready") return cached;
|
|
13389
|
+
await this.#acquireDownloadSlot();
|
|
13390
|
+
const destination = this.#builtinPath(pet);
|
|
13391
|
+
const staging = join(dirname(destination), `.${pet.file}.download-${randomUUID()}.webp`);
|
|
13392
|
+
try {
|
|
13393
|
+
const secondCheck = await this.#describeBuiltin(pet);
|
|
13394
|
+
if (secondCheck.availability === "ready") return secondCheck;
|
|
13395
|
+
const bytes = await this.#download(pet);
|
|
13396
|
+
await mkdir(dirname(destination), { recursive: true });
|
|
13397
|
+
await writeFile(staging, bytes, { flag: "wx" });
|
|
13398
|
+
await validateBuiltinFile(staging);
|
|
13399
|
+
try {
|
|
13400
|
+
await rename(staging, destination);
|
|
13401
|
+
} catch {
|
|
13402
|
+
await rm(destination, { force: true });
|
|
13403
|
+
await rename(staging, destination);
|
|
13404
|
+
}
|
|
13405
|
+
return await this.#describeBuiltin(pet);
|
|
13406
|
+
} catch (cause) {
|
|
13407
|
+
throw new WorkbenchPetProviderError(
|
|
13408
|
+
"download_failed",
|
|
13409
|
+
cause instanceof Error ? cause.message : "Pet asset download failed"
|
|
13410
|
+
);
|
|
13411
|
+
} finally {
|
|
13412
|
+
await rm(staging, { force: true });
|
|
13413
|
+
this.#releaseDownloadSlot();
|
|
13414
|
+
}
|
|
13415
|
+
}
|
|
13416
|
+
async #download(pet) {
|
|
13417
|
+
const url = `${PET_CDN_BASE_URL}/${pet.file}`;
|
|
13418
|
+
const response = await this.#fetch(url, {
|
|
13419
|
+
redirect: "follow",
|
|
13420
|
+
signal: AbortSignal.timeout(DOWNLOAD_TIMEOUT_MS)
|
|
13421
|
+
});
|
|
13422
|
+
if (!response.ok) throw new Error(`Pet asset download failed with ${String(response.status)}`);
|
|
13423
|
+
if (response.url.length > 0) validateDownloadUrl(response.url);
|
|
13424
|
+
const contentLength = Number(response.headers.get("content-length"));
|
|
13425
|
+
if (Number.isFinite(contentLength) && contentLength > MAX_DOWNLOAD_BYTES) {
|
|
13426
|
+
throw new Error("Pet asset download exceeded 4MiB");
|
|
13427
|
+
}
|
|
13428
|
+
if (response.body === null) throw new Error("Pet asset download returned no body");
|
|
13429
|
+
const body = response.body;
|
|
13430
|
+
const reader = body.getReader();
|
|
13431
|
+
const chunks = [];
|
|
13432
|
+
let size = 0;
|
|
13433
|
+
for (; ; ) {
|
|
13434
|
+
const result = await reader.read();
|
|
13435
|
+
if (result.done) break;
|
|
13436
|
+
size += result.value.byteLength;
|
|
13437
|
+
if (size > MAX_DOWNLOAD_BYTES) {
|
|
13438
|
+
await reader.cancel();
|
|
13439
|
+
throw new Error("Pet asset download exceeded 4MiB");
|
|
13440
|
+
}
|
|
13441
|
+
chunks.push(result.value);
|
|
13442
|
+
}
|
|
13443
|
+
const bytes = new Uint8Array(size);
|
|
13444
|
+
let offset = 0;
|
|
13445
|
+
for (const chunk of chunks) {
|
|
13446
|
+
bytes.set(chunk, offset);
|
|
13447
|
+
offset += chunk.byteLength;
|
|
13448
|
+
}
|
|
13449
|
+
const dimensions = readWebpDimensions(bytes);
|
|
13450
|
+
if (dimensions.width !== PET_SPRITESHEET.width || dimensions.height !== PET_SPRITESHEET.height) {
|
|
13451
|
+
throw new Error("Pet asset has invalid dimensions");
|
|
13452
|
+
}
|
|
13453
|
+
return bytes;
|
|
13454
|
+
}
|
|
13455
|
+
async #scanCustomRoot(rootName, manifestName, source) {
|
|
13456
|
+
const root = join(this.#codexHome, rootName);
|
|
13457
|
+
let entries;
|
|
13458
|
+
try {
|
|
13459
|
+
entries = await readdir(root, { withFileTypes: true });
|
|
13460
|
+
} catch {
|
|
13461
|
+
return [];
|
|
13462
|
+
}
|
|
13463
|
+
const records = [];
|
|
13464
|
+
for (const entry of entries) {
|
|
13465
|
+
if (!entry.isDirectory()) continue;
|
|
13466
|
+
try {
|
|
13467
|
+
const directory = join(root, entry.name);
|
|
13468
|
+
const assetId = stableAssetId(`${source}:${entry.name}`);
|
|
13469
|
+
records.push(
|
|
13470
|
+
await loadCustomPet({ assetId, directory, folder: entry.name, manifestName, source })
|
|
13471
|
+
);
|
|
13472
|
+
} catch {
|
|
13473
|
+
this.#logger?.warn(`Skipped invalid ${source} pet ${entry.name}`);
|
|
13474
|
+
}
|
|
13475
|
+
}
|
|
13476
|
+
return records;
|
|
13477
|
+
}
|
|
13478
|
+
#builtinPath(pet) {
|
|
13479
|
+
return join(this.#codexHome, "cache", "tui-pets", PET_PACK_VERSION, "assets", pet.file);
|
|
13480
|
+
}
|
|
13481
|
+
async #acquireDownloadSlot() {
|
|
13482
|
+
if (this.#activeDownloads < MAX_CONCURRENT_DOWNLOADS) {
|
|
13483
|
+
this.#activeDownloads += 1;
|
|
13484
|
+
return;
|
|
13485
|
+
}
|
|
13486
|
+
await new Promise((resolveWaiter) => this.#downloadWaiters.push(resolveWaiter));
|
|
13487
|
+
this.#activeDownloads += 1;
|
|
13488
|
+
}
|
|
13489
|
+
#releaseDownloadSlot() {
|
|
13490
|
+
this.#activeDownloads -= 1;
|
|
13491
|
+
this.#downloadWaiters.shift()?.();
|
|
13492
|
+
}
|
|
13493
|
+
};
|
|
13494
|
+
function createCodexWorkbenchPetProvider(options) {
|
|
13495
|
+
return new CodexWorkbenchPetProvider(options);
|
|
13496
|
+
}
|
|
13497
|
+
async function validateBuiltinFile(path) {
|
|
13498
|
+
const [root, resolved] = await Promise.all([realpath(dirname(path)), realpath(path)]);
|
|
13499
|
+
const child = relative(root, resolved);
|
|
13500
|
+
if (child === ".." || child.startsWith(`..${sep}`)) throw new Error("Pet cache path escaped");
|
|
13501
|
+
const metadata = await stat(resolved);
|
|
13502
|
+
if (!metadata.isFile() || metadata.size > MAX_DOWNLOAD_BYTES) {
|
|
13503
|
+
throw new Error("Pet cache file is invalid");
|
|
13504
|
+
}
|
|
13505
|
+
const dimensions = await readWebpDimensionsFromFile(resolved);
|
|
13506
|
+
if (dimensions.width !== PET_SPRITESHEET.width || dimensions.height !== PET_SPRITESHEET.height) {
|
|
13507
|
+
throw new Error("Pet cache file has invalid dimensions");
|
|
13508
|
+
}
|
|
13509
|
+
}
|
|
13510
|
+
function stableAssetId(value) {
|
|
13511
|
+
return createHash("sha256").update(value).digest("hex");
|
|
13512
|
+
}
|
|
13513
|
+
function validateDownloadUrl(value) {
|
|
13514
|
+
const url = new URL(value);
|
|
13515
|
+
if (url.protocol !== "https:" || url.hostname !== "persistent.oaistatic.com") {
|
|
13516
|
+
throw new Error("Pet asset download redirected outside the allowed host");
|
|
13517
|
+
}
|
|
13518
|
+
}
|
|
13519
|
+
|
|
13520
|
+
export { CodexAppServerExitedError, CodexAppServerProcess, CodexAppServerShutdownError, CodexAppServerSpawnError, CodexProjectRepository, CodexProtocolMappingError, CodexProviderConnectionError, CodexProviderConnectionService, CodexRuntimeProvider, CodexWorkbenchPetProvider, JsonlRpcClient, RpcConnectionClosedError, RpcProtocolError, RpcResponseError, RpcTimeoutError, SUPPORTED_CODEX_VERSION, checkCodexVersion, createCodexRuntimeProvider, createCodexWorkbenchPetProvider, locateCodexBinary, require_pino, require_safe_stable_stringify, startCodexAppServer };
|