@bryanhu/codexly 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/CHANGELOG.md +13 -1
  2. package/README.md +1 -1
  3. package/README.zh-CN.md +1 -1
  4. package/dist/{chunk-NAHIDASP.js → chunk-7XFCPPAG.js} +37 -2
  5. package/dist/{chunk-CGZ44LHJ.js → chunk-HEWCIXCQ.js} +45 -12
  6. package/dist/cli.js +5 -4
  7. package/dist/providers/codex/index.js +1 -1
  8. package/dist/server/index.js +2 -2
  9. package/dist/web/.vite/manifest.json +40 -40
  10. package/dist/web/.vite/manifest.json.br +0 -0
  11. package/dist/web/.vite/manifest.json.gz +0 -0
  12. package/dist/web/assets/{chunk-BO2N2NFS-Du4ZYlrF.js → chunk-BO2N2NFS-C9-C2tVf.js} +4 -4
  13. package/dist/web/assets/chunk-BO2N2NFS-C9-C2tVf.js.br +0 -0
  14. package/dist/web/assets/chunk-BO2N2NFS-C9-C2tVf.js.gz +0 -0
  15. package/dist/web/assets/{code-highlighter-CsBwNeVP.js → code-highlighter-Bc0RuXH6.js} +1 -1
  16. package/dist/web/assets/code-highlighter-Bc0RuXH6.js.br +0 -0
  17. package/dist/web/assets/code-highlighter-Bc0RuXH6.js.gz +0 -0
  18. package/dist/web/assets/{code-languages-CPYTSY-8.js → code-languages-Dyc6uij-.js} +1 -1
  19. package/dist/web/assets/code-languages-Dyc6uij-.js.br +0 -0
  20. package/dist/web/assets/code-languages-Dyc6uij-.js.gz +0 -0
  21. package/dist/web/assets/{file-review-dialog-CotyuYId.js → file-review-dialog-DO97in5h.js} +2 -2
  22. package/dist/web/assets/file-review-dialog-DO97in5h.js.br +0 -0
  23. package/dist/web/assets/file-review-dialog-DO97in5h.js.gz +0 -0
  24. package/dist/web/assets/{git-history-panel-CUvtjCk7.js → git-history-panel-CqKWTKwH.js} +2 -2
  25. package/dist/web/assets/git-history-panel-CqKWTKwH.js.br +0 -0
  26. package/dist/web/assets/git-history-panel-CqKWTKwH.js.gz +0 -0
  27. package/dist/web/assets/global-settings-dialog-CcncTTuP.js +1 -0
  28. package/dist/web/assets/global-settings-dialog-CcncTTuP.js.br +0 -0
  29. package/dist/web/assets/global-settings-dialog-CcncTTuP.js.gz +0 -0
  30. package/dist/web/assets/{highlighted-body-OFNGDK62-BoYHrzPS.js → highlighted-body-OFNGDK62-D6sPM03A.js} +1 -1
  31. package/dist/web/assets/highlighted-body-OFNGDK62-D6sPM03A.js.br +0 -0
  32. package/dist/web/assets/highlighted-body-OFNGDK62-D6sPM03A.js.gz +0 -0
  33. package/dist/web/assets/{index-zqp46jqN.js → index-D07js1WI.js} +3 -3
  34. package/dist/web/assets/index-D07js1WI.js.br +0 -0
  35. package/dist/web/assets/index-D07js1WI.js.gz +0 -0
  36. package/dist/web/assets/{lazy-message-response-CG0j4yJD.js → lazy-message-response-BCtctszr.js} +2 -2
  37. package/dist/web/assets/lazy-message-response-BCtctszr.js.br +0 -0
  38. package/dist/web/assets/lazy-message-response-BCtctszr.js.gz +0 -0
  39. package/dist/web/assets/mermaid-GHXKKRXX-DPTLsg8Y.js +1 -0
  40. package/dist/web/assets/mermaid-GHXKKRXX-DPTLsg8Y.js.br +1 -0
  41. package/dist/web/assets/mermaid-GHXKKRXX-DPTLsg8Y.js.gz +0 -0
  42. package/dist/web/assets/{message-response-HPRWZrlE.js → message-response-Bx5gf4FU.js} +1 -1
  43. package/dist/web/assets/message-response-Bx5gf4FU.js.br +0 -0
  44. package/dist/web/assets/message-response-Bx5gf4FU.js.gz +0 -0
  45. package/dist/web/assets/{patch-diff-viewer-CMgdM7ny.js → patch-diff-viewer-DGu83IBP.js} +2 -2
  46. package/dist/web/assets/patch-diff-viewer-DGu83IBP.js.br +0 -0
  47. package/dist/web/assets/patch-diff-viewer-DGu83IBP.js.gz +0 -0
  48. package/dist/web/assets/{project-file-popup-page-DLcWrRDd.js → project-file-popup-page-CVtCt_XU.js} +1 -1
  49. package/dist/web/assets/project-file-popup-page-CVtCt_XU.js.br +0 -0
  50. package/dist/web/assets/project-file-popup-page-CVtCt_XU.js.gz +0 -0
  51. package/dist/web/assets/{project-source-panel-BAOR4fTj.js → project-source-panel-BEBbL2Id.js} +3 -3
  52. package/dist/web/assets/project-source-panel-BEBbL2Id.js.br +0 -0
  53. package/dist/web/assets/project-source-panel-BEBbL2Id.js.gz +0 -0
  54. package/dist/web/assets/{shiki-bundle-BD1THhST.js → shiki-bundle-4bLwaf7_.js} +1 -1
  55. package/dist/web/assets/shiki-bundle-4bLwaf7_.js.br +0 -0
  56. package/dist/web/assets/shiki-bundle-4bLwaf7_.js.gz +0 -0
  57. package/dist/web/assets/{workbench-inspector-changes-NQ5C_cXN.js → workbench-inspector-changes-BLY-8Tfn.js} +1 -1
  58. package/dist/web/assets/workbench-inspector-changes-BLY-8Tfn.js.br +0 -0
  59. package/dist/web/assets/workbench-inspector-changes-BLY-8Tfn.js.gz +0 -0
  60. package/dist/web/assets/{workbench-shell-B5fsrpDH.js → workbench-shell-DSfvZh4Q.js} +4 -4
  61. package/dist/web/assets/workbench-shell-DSfvZh4Q.js.br +0 -0
  62. package/dist/web/assets/workbench-shell-DSfvZh4Q.js.gz +0 -0
  63. package/dist/web/index.html +1 -1
  64. package/dist/web/index.html.br +0 -0
  65. package/dist/web/index.html.gz +0 -0
  66. package/package.json +1 -1
  67. package/dist/web/assets/chunk-BO2N2NFS-Du4ZYlrF.js.br +0 -0
  68. package/dist/web/assets/chunk-BO2N2NFS-Du4ZYlrF.js.gz +0 -0
  69. package/dist/web/assets/code-highlighter-CsBwNeVP.js.br +0 -0
  70. package/dist/web/assets/code-highlighter-CsBwNeVP.js.gz +0 -0
  71. package/dist/web/assets/code-languages-CPYTSY-8.js.br +0 -0
  72. package/dist/web/assets/code-languages-CPYTSY-8.js.gz +0 -0
  73. package/dist/web/assets/file-review-dialog-CotyuYId.js.br +0 -0
  74. package/dist/web/assets/file-review-dialog-CotyuYId.js.gz +0 -0
  75. package/dist/web/assets/git-history-panel-CUvtjCk7.js.br +0 -0
  76. package/dist/web/assets/git-history-panel-CUvtjCk7.js.gz +0 -0
  77. package/dist/web/assets/global-settings-dialog-B8gBgus7.js +0 -1
  78. package/dist/web/assets/global-settings-dialog-B8gBgus7.js.br +0 -0
  79. package/dist/web/assets/global-settings-dialog-B8gBgus7.js.gz +0 -0
  80. package/dist/web/assets/highlighted-body-OFNGDK62-BoYHrzPS.js.br +0 -0
  81. package/dist/web/assets/highlighted-body-OFNGDK62-BoYHrzPS.js.gz +0 -0
  82. package/dist/web/assets/index-zqp46jqN.js.br +0 -0
  83. package/dist/web/assets/index-zqp46jqN.js.gz +0 -0
  84. package/dist/web/assets/lazy-message-response-CG0j4yJD.js.br +0 -0
  85. package/dist/web/assets/lazy-message-response-CG0j4yJD.js.gz +0 -0
  86. package/dist/web/assets/mermaid-GHXKKRXX-BRvawXSo.js +0 -1
  87. package/dist/web/assets/mermaid-GHXKKRXX-BRvawXSo.js.br +0 -0
  88. package/dist/web/assets/mermaid-GHXKKRXX-BRvawXSo.js.gz +0 -0
  89. package/dist/web/assets/message-response-HPRWZrlE.js.br +0 -0
  90. package/dist/web/assets/message-response-HPRWZrlE.js.gz +0 -0
  91. package/dist/web/assets/patch-diff-viewer-CMgdM7ny.js.br +0 -0
  92. package/dist/web/assets/patch-diff-viewer-CMgdM7ny.js.gz +0 -0
  93. package/dist/web/assets/project-file-popup-page-DLcWrRDd.js.br +0 -0
  94. package/dist/web/assets/project-file-popup-page-DLcWrRDd.js.gz +0 -0
  95. package/dist/web/assets/project-source-panel-BAOR4fTj.js.br +0 -0
  96. package/dist/web/assets/project-source-panel-BAOR4fTj.js.gz +0 -0
  97. package/dist/web/assets/shiki-bundle-BD1THhST.js.br +0 -0
  98. package/dist/web/assets/shiki-bundle-BD1THhST.js.gz +0 -0
  99. package/dist/web/assets/workbench-inspector-changes-NQ5C_cXN.js.br +0 -0
  100. package/dist/web/assets/workbench-inspector-changes-NQ5C_cXN.js.gz +0 -0
  101. package/dist/web/assets/workbench-shell-B5fsrpDH.js.br +0 -0
  102. package/dist/web/assets/workbench-shell-B5fsrpDH.js.gz +0 -0
package/CHANGELOG.md CHANGED
@@ -4,6 +4,17 @@
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.9.0] - 2026-08-28
8
+
9
+ ### 新增
10
+
11
+ - 支持使用 PNG 或 WebP 自定义宠物精灵图,并兼容 `spriteVersionNumber: 2` 的 8×11 帧网格清单。
12
+
13
+ ### 修复
14
+
15
+ - 修复 SQLite Worker 操作超时后 Repository 永久关闭的问题,终止状态未知的 Worker 并为后续请求自动重建连接。
16
+ - 修复检查更新后 registry 版本继续推进时旧页面无法安装更新的问题,重新校验并安装当前最新版本。
17
+
7
18
  ## [0.8.0] - 2026-08-27
8
19
 
9
20
  ### 新增
@@ -147,7 +158,8 @@
147
158
  - 拆分全栈测试套件并限制 Vitest 并发,提升跨平台门禁稳定性;GitHub Release 改为严格提取对应版本的完整更新日志。
148
159
  - 将最低 Node.js 版本调整为 `22.14.0`,同步 CLI、CI、发布环境和使用文档。
149
160
 
150
- [Unreleased]: https://github.com/BryanHoo/Codexly/compare/v0.8.0...HEAD
161
+ [Unreleased]: https://github.com/BryanHoo/Codexly/compare/v0.9.0...HEAD
162
+ [0.9.0]: https://github.com/BryanHoo/Codexly/releases/tag/v0.9.0
151
163
  [0.8.0]: https://github.com/BryanHoo/Codexly/releases/tag/v0.8.0
152
164
  [0.7.0]: https://github.com/BryanHoo/Codexly/releases/tag/v0.7.0
153
165
  [0.6.0]: https://github.com/BryanHoo/Codexly/releases/tag/v0.6.0
package/README.md CHANGED
@@ -43,7 +43,7 @@
43
43
  - Organize ordered multi-root projects, archive project or temporary tasks, and permanently delete tasks when needed
44
44
  - Inspect, preview, rename, and delete project files; review diffs; manage branches and worktrees; and commit or push changes
45
45
  - Fork a task from an AI response and continue it in a new Git worktree
46
- - Add animated workspace pets with separate activity bubbles for project and temporary tasks
46
+ - Add animated workspace pets with separate task activity bubbles and custom PNG or WebP sprite manifests
47
47
  - Manage a collection of custom workspace backgrounds, or use Bing daily images, with automatic foreground colors, overlay opacity, and blur
48
48
  - Access the workspace from another device on a trusted local network
49
49
 
package/README.zh-CN.md CHANGED
@@ -13,7 +13,7 @@ Codexly 是一个在浏览器中使用 Codex 的本地 AI 编程工作台。它
13
13
  - 组织有序的多根项目、归档项目或临时任务,并按需永久删除任务
14
14
  - 查看、预览、重命名和删除项目文件,审查差异,管理分支与 worktree,并提交或推送变更
15
15
  - 从 AI 回复处分叉任务,在新的 Git worktree 中继续工作
16
- - 添加工作台宠物动画,并用独立气泡区分项目与临时任务的活动状态
16
+ - 添加工作台宠物动画,用独立气泡区分任务活动,并支持自定义 PNG 或 WebP 精灵图清单
17
17
  - 管理自定义工作台背景图片集合,或使用 Bing 每日壁纸,并自动适配前景色、浮层遮罩与背景模糊
18
18
  - 从可信局域网中的其他设备访问工作台
19
19
 
@@ -1,6 +1,6 @@
1
1
  import { createRequire } from 'node:module';
2
2
  import { value_exports } from './chunk-DEKHLAWT.js';
3
- import { require_pino, require_safe_stable_stringify, CodexProtocolMappingError, CodexProviderConnectionError, RpcConnectionClosedError, RpcProtocolError, RpcResponseError, RpcTimeoutError } from './chunk-CGZ44LHJ.js';
3
+ import { require_pino, require_safe_stable_stringify, CodexProtocolMappingError, CodexProviderConnectionError, RpcConnectionClosedError, RpcProtocolError, RpcResponseError, RpcTimeoutError } from './chunk-HEWCIXCQ.js';
4
4
  import { WorkbenchPetProviderError, PendingRequestResolutionError } from './chunk-RNTA4MFS.js';
5
5
  import { AGENT_FILE_EXTENSIONS, AGENT_FILE_MEDIA_TYPES, DEFAULT_COMMIT_MESSAGE_MODEL, TEMPORARY_TASK_API_PATH, TEMPORARY_TASK_SCOPE_ID, MAX_AGENT_FILE_BYTES, AccessStatusResponseSchema, PairAccessRequestSchema, HealthResponseSchema, AppInfoResponseSchema, AgentMutationErrorSchema, InstallAppUpdateResponseSchema, InstallAppUpdateRequestSchema, EventStreamMetricsResponseSchema, AgentCapabilitiesSchema, AgentModelPageSchema, AgentGlobalSettingsResponseSchema, AgentGlobalSettingsSchema, MAX_AGENT_IMAGE_BYTES, MAX_AGENT_TEXT_BYTES, AgentProviderConnectionStatusSchema, StartOfficialProviderLoginResponseSchema, StartOfficialProviderLoginRequestSchema, AgentProviderConnectionMutationResponseSchema, CancelProviderLoginRequestSchema, ConfigureCustomProviderResponseSchema, ConfigureCustomProviderRequestSchema, WorkbenchPetCatalogResponseSchema, WorkbenchPetDownloadResponseSchema, WorkbenchPetDownloadRequestSchema, ProjectPageSchema, HostFileListingSchema, HostFileQuerySchema, ProjectDirectoryListingSchema, ProjectDirectoryQuerySchema, ProjectOpenCapabilitiesResponseSchema, OpenProjectResponseSchema, ProjectRootQuerySchema, OpenProjectRequestSchema, ReorderProjectsResponseSchema, ReorderProjectsRequestSchema, AgentSkillPageSchema, AgentProjectDefaultsResponseSchema, AgentProjectDefaultsSchema, AddProjectResponseSchema, AddProjectRequestSchema, RenameProjectResponseSchema, RenameProjectRequestSchema, RemoveProjectResponseSchema, RemoveProjectRequestSchema, AgentTaskPageSchema, UnsubscribeAgentTaskResponseSchema, AgentTaskSnapshotResponseSchema, AgentMcpServerPageSchema, AgentBackgroundTerminalPageSchema, TerminateAgentBackgroundTerminalResponseSchema, PinAgentTaskResponseSchema, PinAgentTaskRequestSchema, RenameAgentTaskResponseSchema, RenameAgentTaskRequestSchema, ArchiveAgentTaskResponseSchema, ArchiveAgentTaskRequestSchema, UnarchiveAgentTaskResponseSchema, UnarchiveAgentTaskRequestSchema, DeleteAgentTaskResponseSchema, DeleteAgentTaskRequestSchema, StartAgentTaskResponseSchema, StartAgentTaskRequestSchema, StartAgentTurnResponseSchema, StartAgentTurnRequestSchema, SteerAgentTurnResponseSchema, SteerAgentTurnRequestSchema, InterruptAgentTurnResponseSchema, InterruptAgentTurnRequestSchema, ResolvePendingRequestResponseSchema, ResolvePendingRequestRequestSchema, AgentQueuedSubmissionPageSchema, AddAgentQueuedSubmissionResponseSchema, AddAgentQueuedSubmissionRequestSchema, UpdateAgentQueuedSubmissionResponseSchema, UpdateAgentQueuedSubmissionRequestSchema, DeleteAgentQueuedSubmissionResponseSchema, ReorderAgentQueuedSubmissionsResponseSchema, ReorderAgentQueuedSubmissionsRequestSchema, StartAgentQueuedSubmissionResponseSchema, StartAgentQueuedSubmissionRequestSchema, AgentPromptInputSchema, AgentProviderConnectionRecordSchema, MAX_AGENT_IMAGES, MAX_AGENT_IMAGE_TOTAL_BYTES, MAX_AGENT_FILE_TOTAL_BYTES, ProjectGitStatusSchema, ProjectGitStatusQuerySchema, ProjectGitHistoryPageSchema, ProjectGitHistoryQuerySchema, ProjectGitCommitFilesPageSchema, ProjectGitCommitFilesQuerySchema, ProjectGitCommitFileDiffSchema, ProjectGitCommitFileDiffQuerySchema, SwitchProjectBranchRequestSchema, CreateProjectBranchRequestSchema, GenerateCommitMessageResponseSchema, GenerateCommitMessageRequestSchema, CommitProjectChangesResponseSchema, CommitProjectChangesRequestSchema, ProjectFileTreeSchema, ProjectFileTreeQuerySchema, ProjectFileSearchPageSchema, ProjectFileSearchQuerySchema, StopProjectFileSearchResponseSchema, StopProjectFileSearchRequestSchema, ProjectSourceFileQuerySchema, ProjectSourceFileSchema, AgentAttachmentUploadResponseSchema, HostFileKindSchema, ImportHostAttachmentRequestSchema, AgentAttachmentKindSchema, AgentTaskSettingsResponseSchema, AgentTaskSettingsSchema, ReloadAgentMcpServersResponseSchema, ReloadAgentMcpServersRequestSchema, ReviewAgentTaskResponseSchema, ReviewAgentTaskRequestSchema, CompactAgentTaskResponseSchema, CompactAgentTaskRequestSchema, ForkAgentTaskResponseSchema, ForkAgentTaskRequestSchema, UploadAgentFeedbackResponseSchema, UploadAgentFeedbackRequestSchema, OpenAgentTaskAttachmentResponseSchema, OpenAgentTaskAttachmentRequestSchema, UpdateAgentGoalResponseSchema, UpdateAgentGoalRequestSchema, ClearAgentGoalResponseSchema, ProjectGitWorktreePageSchema, ProjectWorktreeMutationResponseSchema, CreateProjectWorktreeRequestSchema, SwitchProjectWorktreeRequestSchema, RenameProjectFileResponseSchema, RenameProjectFileRequestSchema, DeleteProjectFileResponseSchema, DeleteProjectFileRequestSchema, MAX_EVENT_BATCH_SIZE } from './chunk-TEWPWZPG.js';
6
6
  import { __commonJS, __require, __toESM } from './chunk-K6J42667.js';
@@ -61764,19 +61764,25 @@ function parseQueueWorkerRecord(record) {
61764
61764
  }
61765
61765
  var DEFAULT_SQLITE_REQUEST_TIMEOUT_MS = 1e4;
61766
61766
  var SqliteStateRepository = class _SqliteStateRepository {
61767
+ #databasePath;
61767
61768
  #now;
61769
+ #options;
61768
61770
  #pending = /* @__PURE__ */ new Map();
61769
61771
  #ready;
61770
61772
  #requestTimeoutMs;
61771
61773
  #worker;
61772
61774
  #workerExit;
61773
61775
  #closed = false;
61776
+ #closing = false;
61774
61777
  #nextRequestId = 1;
61778
+ #replacement;
61775
61779
  #workerExited = false;
61776
61780
  constructor(databasePath, options) {
61777
61781
  if (!isAbsolute(databasePath)) {
61778
61782
  throw new Error("SQLite database path must be absolute");
61779
61783
  }
61784
+ this.#databasePath = databasePath;
61785
+ this.#options = options;
61780
61786
  this.#requestTimeoutMs = options.requestTimeoutMs ?? DEFAULT_SQLITE_REQUEST_TIMEOUT_MS;
61781
61787
  if (!Number.isFinite(this.#requestTimeoutMs) || this.#requestTimeoutMs <= 0) {
61782
61788
  throw new RangeError("SQLite request timeout must be a positive number");
@@ -61873,6 +61879,15 @@ var SqliteStateRepository = class _SqliteStateRepository {
61873
61879
  }
61874
61880
  }
61875
61881
  async close() {
61882
+ if (this.#closing) {
61883
+ return;
61884
+ }
61885
+ this.#closing = true;
61886
+ if (this.#replacement !== void 0) {
61887
+ const replacement = await this.#replacement;
61888
+ await replacement.close();
61889
+ return;
61890
+ }
61876
61891
  if (this.#closed) {
61877
61892
  return;
61878
61893
  }
@@ -61996,6 +62011,13 @@ var SqliteStateRepository = class _SqliteStateRepository {
61996
62011
  });
61997
62012
  }
61998
62013
  async #call(operation, payload, allowClosed = false) {
62014
+ if (this.#closing && !allowClosed) {
62015
+ throw new Error("SQLite repository is closed");
62016
+ }
62017
+ if (this.#replacement !== void 0) {
62018
+ const replacement = await this.#replacement;
62019
+ return replacement.#call(operation, payload, allowClosed);
62020
+ }
61999
62021
  await this.#ready;
62000
62022
  if (this.#closed && !allowClosed) {
62001
62023
  throw new Error("SQLite repository is closed");
@@ -62010,8 +62032,15 @@ var SqliteStateRepository = class _SqliteStateRepository {
62010
62032
  `SQLite worker operation ${operation} timed out after ${String(this.#requestTimeoutMs)}ms`
62011
62033
  );
62012
62034
  this.#closed = true;
62035
+ if (!this.#closing) {
62036
+ const replacement = this.#replaceWorker();
62037
+ this.#replacement = replacement;
62038
+ void replacement.catch(() => void 0);
62039
+ }
62013
62040
  this.#rejectPending(error);
62014
- void this.#worker.terminate();
62041
+ if (this.#replacement === void 0) {
62042
+ void this.#worker.terminate();
62043
+ }
62015
62044
  }, this.#requestTimeoutMs);
62016
62045
  this.#pending.set(id, {
62017
62046
  reject: rejectRequest,
@@ -62036,6 +62065,12 @@ var SqliteStateRepository = class _SqliteStateRepository {
62036
62065
  }
62037
62066
  this.#pending.clear();
62038
62067
  }
62068
+ async #replaceWorker() {
62069
+ if (!this.#workerExited) {
62070
+ await this.#worker.terminate();
62071
+ }
62072
+ return _SqliteStateRepository.open(this.#databasePath, this.#options);
62073
+ }
62039
62074
  async #waitForWorkerExit() {
62040
62075
  let timeout;
62041
62076
  try {
@@ -13153,12 +13153,26 @@ function imageDimensionsFromData(bytes) {
13153
13153
  }
13154
13154
 
13155
13155
  // packages/provider-codex/src/workbench-pet-image.ts
13156
- function readWebpDimensions(data) {
13156
+ function readPetImageMetadata(data) {
13157
13157
  const dimensions = imageDimensionsFromData(data);
13158
- if (dimensions?.type !== "webp") {
13158
+ if (dimensions?.type !== "png" && dimensions?.type !== "webp") {
13159
+ throw new Error("Pet spritesheet must be a valid PNG or WebP image");
13160
+ }
13161
+ return {
13162
+ contentType: dimensions.type === "png" ? "image/png" : "image/webp",
13163
+ height: dimensions.height,
13164
+ width: dimensions.width
13165
+ };
13166
+ }
13167
+ async function readPetImageMetadataFromFile(path) {
13168
+ return readPetImageMetadata(await readFile(path));
13169
+ }
13170
+ function readWebpDimensions(data) {
13171
+ const metadata = readPetImageMetadata(data);
13172
+ if (metadata.contentType !== "image/webp") {
13159
13173
  throw new Error("Pet spritesheet must be a valid WebP image");
13160
13174
  }
13161
- return dimensions;
13175
+ return metadata;
13162
13176
  }
13163
13177
  async function readWebpDimensionsFromFile(path) {
13164
13178
  return readWebpDimensions(await readFile(path));
@@ -13167,6 +13181,7 @@ var MAX_MANIFEST_BYTES = 64 * 1024;
13167
13181
  var MAX_CUSTOM_ASSET_BYTES = 16 * 1024 * 1024;
13168
13182
  var MAX_FRAMES = 256;
13169
13183
  var MAX_FPS = 60;
13184
+ var PET_V2_ROWS = 11;
13170
13185
  async function loadCustomPet(input) {
13171
13186
  const baseDirectory = await realpath(input.directory);
13172
13187
  const manifestPath = resolve(baseDirectory, input.manifestName);
@@ -13186,14 +13201,16 @@ async function loadCustomPet(input) {
13186
13201
  if (!assetStats.isFile() || assetStats.size > MAX_CUSTOM_ASSET_BYTES) {
13187
13202
  throw new Error("Pet spritesheet is missing or too large");
13188
13203
  }
13189
- const dimensions = await readWebpDimensionsFromFile(path);
13190
- const frame = parseFrame(manifest["frame"]);
13191
- const frameCount = validateFrame(frame, dimensions.width, dimensions.height);
13204
+ const image = await readPetImageMetadataFromFile(path);
13205
+ const spriteVersion = parseSpriteVersion(manifest["spriteVersionNumber"]);
13206
+ const frame = parseFrame(manifest["frame"], spriteVersion);
13207
+ const frameCount = validateFrame(frame, image.width, image.height);
13192
13208
  const animations = parseAnimations(manifest["animations"], frameCount);
13193
13209
  const manifestId = readOptionalString(manifest, "id");
13194
13210
  return {
13195
13211
  assetId: input.assetId,
13196
13212
  baseDirectory,
13213
+ contentType: image.contentType,
13197
13214
  descriptor: {
13198
13215
  animations,
13199
13216
  assetId: input.assetId,
@@ -13217,12 +13234,17 @@ async function validatePetAsset(record) {
13217
13234
  if (!assetStats.isFile() || assetStats.size > MAX_CUSTOM_ASSET_BYTES) {
13218
13235
  throw new Error("Pet spritesheet is unavailable");
13219
13236
  }
13220
- const dimensions = await readWebpDimensionsFromFile(resolved);
13221
- validateFrame(record.descriptor.frame, dimensions.width, dimensions.height);
13237
+ const image = await readPetImageMetadataFromFile(resolved);
13238
+ if (image.contentType !== record.contentType) {
13239
+ throw new Error("Pet spritesheet format changed after discovery");
13240
+ }
13241
+ validateFrame(record.descriptor.frame, image.width, image.height);
13222
13242
  return { mtimeMs: assetStats.mtimeMs, size: assetStats.size };
13223
13243
  }
13224
- function parseFrame(value) {
13225
- if (value === void 0 || value === null) return PET_FRAME;
13244
+ function parseFrame(value, spriteVersion) {
13245
+ if (value === void 0 || value === null) {
13246
+ return spriteVersion === 2 ? { ...PET_FRAME, rows: PET_V2_ROWS } : PET_FRAME;
13247
+ }
13226
13248
  const frame = parseRecord(value, "Pet frame");
13227
13249
  return {
13228
13250
  columns: readPositiveInteger(frame, "columns"),
@@ -13231,6 +13253,11 @@ function parseFrame(value) {
13231
13253
  width: readPositiveInteger(frame, "width")
13232
13254
  };
13233
13255
  }
13256
+ function parseSpriteVersion(value) {
13257
+ if (value === void 0 || value === null || value === 1) return 1;
13258
+ if (value === 2) return 2;
13259
+ throw new Error("Pet spriteVersionNumber must be 1 or 2");
13260
+ }
13234
13261
  function validateFrame(frame, width, height) {
13235
13262
  if (width === void 0 || height === void 0 || frame.width * frame.columns !== width || frame.height * frame.rows !== height) {
13236
13263
  throw new Error("Pet frame grid must cover the spritesheet exactly");
@@ -13365,7 +13392,7 @@ var CodexWorkbenchPetProvider = class {
13365
13392
  const content = await readFile(record.path);
13366
13393
  return {
13367
13394
  content,
13368
- contentType: "image/webp",
13395
+ contentType: record.contentType,
13369
13396
  etag: `W/"${String(metadata.size)}-${String(Math.trunc(metadata.mtimeMs))}"`,
13370
13397
  size: metadata.size
13371
13398
  };
@@ -13384,7 +13411,13 @@ var CodexWorkbenchPetProvider = class {
13384
13411
  } catch {
13385
13412
  }
13386
13413
  const descriptor = createBuiltinDescriptor(pet, assetId, availability);
13387
- this.#assetRecords.set(assetId, { assetId, baseDirectory, descriptor, path });
13414
+ this.#assetRecords.set(assetId, {
13415
+ assetId,
13416
+ baseDirectory,
13417
+ contentType: "image/webp",
13418
+ descriptor,
13419
+ path
13420
+ });
13388
13421
  return descriptor;
13389
13422
  }
13390
13423
  async #ensureBuiltin(pet) {
package/dist/cli.js CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { createCodexlyServer, SqliteStateRepository, normalizeAllowedHost } from './chunk-NAHIDASP.js';
3
+ import { createCodexlyServer, SqliteStateRepository, normalizeAllowedHost } from './chunk-7XFCPPAG.js';
4
4
  import './chunk-DEKHLAWT.js';
5
- import { startCodexAppServer, locateCodexBinary, createCodexRuntimeProvider, createCodexWorkbenchPetProvider, CodexProjectRepository, checkCodexVersion } from './chunk-CGZ44LHJ.js';
5
+ import { startCodexAppServer, locateCodexBinary, createCodexRuntimeProvider, createCodexWorkbenchPetProvider, CodexProjectRepository, checkCodexVersion } from './chunk-HEWCIXCQ.js';
6
6
  import './chunk-RNTA4MFS.js';
7
7
  import './chunk-TEWPWZPG.js';
8
8
  import './chunk-K6J42667.js';
@@ -18,7 +18,7 @@ createRequire(import.meta.url);
18
18
 
19
19
  // package.json
20
20
  var package_default = {
21
- version: "0.8.0"};
21
+ version: "0.9.0"};
22
22
  var PACKAGE_NAME = "@bryanhu/codexly";
23
23
  var INITIAL_APP_VERSION = "0.1.0";
24
24
  var CHANGELOG_URL_PREFIX = "https://raw.githubusercontent.com/BryanHoo/Codexly/v";
@@ -174,7 +174,8 @@ function createAppUpdateService(options) {
174
174
  return {
175
175
  async install(version) {
176
176
  const latestVersion = await readLatest();
177
- if (version !== latestVersion || !isNewerVersion(latestVersion, options.appVersion)) {
177
+ const requestedVersionIsAvailable = isNewerVersion(version, options.appVersion) && !isNewerVersion(version, latestVersion);
178
+ if (!requestedVersionIsAvailable || !isNewerVersion(latestVersion, options.appVersion)) {
178
179
  throw new AppUpdateError("UPDATE_NOT_AVAILABLE", "The requested update is not available");
179
180
  }
180
181
  try {
@@ -1,5 +1,5 @@
1
1
  import { createRequire } from 'node:module';
2
- export { CodexAppServerExitedError, CodexAppServerProcess, CodexAppServerShutdownError, CodexAppServerSpawnError, CodexProjectRepository, CodexProtocolMappingError, CodexProviderConnectionError, CodexProviderConnectionService, CodexRuntimeProvider, CodexWorkbenchPetProvider, JsonlRpcClient, RpcConnectionClosedError, RpcProtocolError, RpcResponseError, RpcTimeoutError, SUPPORTED_CODEX_VERSION, checkCodexVersion, createCodexRuntimeProvider, createCodexWorkbenchPetProvider, locateCodexBinary, startCodexAppServer } from '../../chunk-CGZ44LHJ.js';
2
+ export { CodexAppServerExitedError, CodexAppServerProcess, CodexAppServerShutdownError, CodexAppServerSpawnError, CodexProjectRepository, CodexProtocolMappingError, CodexProviderConnectionError, CodexProviderConnectionService, CodexRuntimeProvider, CodexWorkbenchPetProvider, JsonlRpcClient, RpcConnectionClosedError, RpcProtocolError, RpcResponseError, RpcTimeoutError, SUPPORTED_CODEX_VERSION, checkCodexVersion, createCodexRuntimeProvider, createCodexWorkbenchPetProvider, locateCodexBinary, startCodexAppServer } from '../../chunk-HEWCIXCQ.js';
3
3
  import '../../chunk-RNTA4MFS.js';
4
4
  import '../../chunk-TEWPWZPG.js';
5
5
  import '../../chunk-K6J42667.js';
@@ -1,7 +1,7 @@
1
1
  import { createRequire } from 'node:module';
2
- export { AccessSessionService, AgentEventStream, GitCommitError, GitCommitReviewError, SqliteStateRepository, commitSelectedProjectChanges, createCodexlyServer, normalizeAllowedHost, readProjectGitCommitFileDiff, readProjectGitCommitFiles } from '../chunk-NAHIDASP.js';
2
+ export { AccessSessionService, AgentEventStream, GitCommitError, GitCommitReviewError, SqliteStateRepository, commitSelectedProjectChanges, createCodexlyServer, normalizeAllowedHost, readProjectGitCommitFileDiff, readProjectGitCommitFiles } from '../chunk-7XFCPPAG.js';
3
3
  import '../chunk-DEKHLAWT.js';
4
- import '../chunk-CGZ44LHJ.js';
4
+ import '../chunk-HEWCIXCQ.js';
5
5
  import '../chunk-RNTA4MFS.js';
6
6
  import '../chunk-TEWPWZPG.js';
7
7
  import '../chunk-K6J42667.js';
@@ -340,23 +340,23 @@
340
340
  "isDynamicEntry": true
341
341
  },
342
342
  "../../node_modules/.pnpm/streamdown@2.5.0_react-dom@19.2.8_react@19.2.8__react@19.2.8_supports-color@7.2.0/node_modules/streamdown/dist/highlighted-body-OFNGDK62.js": {
343
- "file": "assets/highlighted-body-OFNGDK62-BoYHrzPS.js",
343
+ "file": "assets/highlighted-body-OFNGDK62-D6sPM03A.js",
344
344
  "name": "highlighted-body-OFNGDK62",
345
345
  "src": "../../node_modules/.pnpm/streamdown@2.5.0_react-dom@19.2.8_react@19.2.8__react@19.2.8_supports-color@7.2.0/node_modules/streamdown/dist/highlighted-body-OFNGDK62.js",
346
346
  "isDynamicEntry": true,
347
347
  "imports": [
348
348
  "_rolldown-runtime-QTnfLwEv.js",
349
349
  "_react-runtime-CVaUQXZF.js",
350
- "_chunk-BO2N2NFS-Du4ZYlrF.js"
350
+ "_chunk-BO2N2NFS-C9-C2tVf.js"
351
351
  ]
352
352
  },
353
353
  "../../node_modules/.pnpm/streamdown@2.5.0_react-dom@19.2.8_react@19.2.8__react@19.2.8_supports-color@7.2.0/node_modules/streamdown/dist/mermaid-GHXKKRXX.js": {
354
- "file": "assets/mermaid-GHXKKRXX-BRvawXSo.js",
354
+ "file": "assets/mermaid-GHXKKRXX-DPTLsg8Y.js",
355
355
  "name": "mermaid-GHXKKRXX",
356
356
  "src": "../../node_modules/.pnpm/streamdown@2.5.0_react-dom@19.2.8_react@19.2.8__react@19.2.8_supports-color@7.2.0/node_modules/streamdown/dist/mermaid-GHXKKRXX.js",
357
357
  "isDynamicEntry": true,
358
358
  "imports": [
359
- "_chunk-BO2N2NFS-Du4ZYlrF.js"
359
+ "_chunk-BO2N2NFS-C9-C2tVf.js"
360
360
  ]
361
361
  },
362
362
  "_bundle-mjs-rHxsej31.js": {
@@ -393,8 +393,8 @@
393
393
  "_check-BOdEYGxk.js"
394
394
  ]
395
395
  },
396
- "_chunk-BO2N2NFS-Du4ZYlrF.js": {
397
- "file": "assets/chunk-BO2N2NFS-Du4ZYlrF.js",
396
+ "_chunk-BO2N2NFS-C9-C2tVf.js": {
397
+ "file": "assets/chunk-BO2N2NFS-C9-C2tVf.js",
398
398
  "name": "chunk-BO2N2NFS",
399
399
  "imports": [
400
400
  "_rolldown-runtime-QTnfLwEv.js",
@@ -408,8 +408,8 @@
408
408
  "../../node_modules/.pnpm/streamdown@2.5.0_react-dom@19.2.8_react@19.2.8__react@19.2.8_supports-color@7.2.0/node_modules/streamdown/dist/mermaid-GHXKKRXX.js"
409
409
  ]
410
410
  },
411
- "_code-languages-CPYTSY-8.js": {
412
- "file": "assets/code-languages-CPYTSY-8.js",
411
+ "_code-languages-Dyc6uij-.js": {
412
+ "file": "assets/code-languages-Dyc6uij-.js",
413
413
  "name": "code-languages",
414
414
  "imports": [
415
415
  "index.html"
@@ -532,8 +532,8 @@
532
532
  "_dist-Cib4eRMP.js"
533
533
  ]
534
534
  },
535
- "_file-review-dialog-CotyuYId.js": {
536
- "file": "assets/file-review-dialog-CotyuYId.js",
535
+ "_file-review-dialog-DO97in5h.js": {
536
+ "file": "assets/file-review-dialog-DO97in5h.js",
537
537
  "name": "file-review-dialog",
538
538
  "imports": [
539
539
  "_rolldown-runtime-QTnfLwEv.js",
@@ -609,8 +609,8 @@
609
609
  "file": "assets/jsx-D3KKoC5L.js",
610
610
  "name": "jsx"
611
611
  },
612
- "_lazy-message-response-CG0j4yJD.js": {
613
- "file": "assets/lazy-message-response-CG0j4yJD.js",
612
+ "_lazy-message-response-BCtctszr.js": {
613
+ "file": "assets/lazy-message-response-BCtctszr.js",
614
614
  "name": "lazy-message-response",
615
615
  "imports": [
616
616
  "_rolldown-runtime-QTnfLwEv.js",
@@ -644,8 +644,8 @@
644
644
  "_c-SSSlmE39.js"
645
645
  ]
646
646
  },
647
- "_project-source-panel-BAOR4fTj.js": {
648
- "file": "assets/project-source-panel-BAOR4fTj.js",
647
+ "_project-source-panel-BEBbL2Id.js": {
648
+ "file": "assets/project-source-panel-BEBbL2Id.js",
649
649
  "name": "project-source-panel",
650
650
  "imports": [
651
651
  "_rolldown-runtime-QTnfLwEv.js",
@@ -655,9 +655,9 @@
655
655
  "_useInfiniteQuery-Bu9BuQ4a.js",
656
656
  "_check-BOdEYGxk.js",
657
657
  "_file-code-corner-Bs_lkoMS.js",
658
- "_lazy-message-response-CG0j4yJD.js",
658
+ "_lazy-message-response-BCtctszr.js",
659
659
  "index.html",
660
- "_code-languages-CPYTSY-8.js"
660
+ "_code-languages-Dyc6uij-.js"
661
661
  ],
662
662
  "dynamicImports": [
663
663
  "src/shared/components/agent/code-highlighter.ts"
@@ -705,13 +705,13 @@
705
705
  "file": "assets/shellscript-CqHdAlCp.js",
706
706
  "name": "shellscript"
707
707
  },
708
- "_shiki-bundle-BD1THhST.js": {
709
- "file": "assets/shiki-bundle-BD1THhST.js",
708
+ "_shiki-bundle-4bLwaf7_.js": {
709
+ "file": "assets/shiki-bundle-4bLwaf7_.js",
710
710
  "name": "shiki-bundle",
711
711
  "imports": [
712
712
  "_rolldown-runtime-QTnfLwEv.js",
713
713
  "_engine-compile-Bqjaa_8Z.js",
714
- "_code-languages-CPYTSY-8.js"
714
+ "_code-languages-Dyc6uij-.js"
715
715
  ]
716
716
  },
717
717
  "_sql-CP0rg-5b.js": {
@@ -772,7 +772,7 @@
772
772
  "name": "yaml"
773
773
  },
774
774
  "index.html": {
775
- "file": "assets/index-zqp46jqN.js",
775
+ "file": "assets/index-D07js1WI.js",
776
776
  "name": "index",
777
777
  "src": "index.html",
778
778
  "isEntry": true,
@@ -800,7 +800,7 @@
800
800
  ]
801
801
  },
802
802
  "src/features/diff/patch-diff-viewer.tsx": {
803
- "file": "assets/patch-diff-viewer-CMgdM7ny.js",
803
+ "file": "assets/patch-diff-viewer-DGu83IBP.js",
804
804
  "name": "patch-diff-viewer",
805
805
  "src": "src/features/diff/patch-diff-viewer.tsx",
806
806
  "isDynamicEntry": true,
@@ -809,18 +809,18 @@
809
809
  "_react-runtime-CVaUQXZF.js",
810
810
  "index.html",
811
811
  "_engine-compile-Bqjaa_8Z.js",
812
- "_code-languages-CPYTSY-8.js",
813
- "_shiki-bundle-BD1THhST.js",
812
+ "_code-languages-Dyc6uij-.js",
813
+ "_shiki-bundle-4bLwaf7_.js",
814
814
  "_file-change-D7aZLgtG.js"
815
815
  ],
816
816
  "dynamicImports": [
817
817
  "../../node_modules/.pnpm/shiki@4.4.3/node_modules/shiki/dist/themes/github-light.mjs",
818
818
  "../../node_modules/.pnpm/shiki@4.4.3/node_modules/shiki/dist/themes/github-dark.mjs",
819
- "_shiki-bundle-BD1THhST.js"
819
+ "_shiki-bundle-4bLwaf7_.js"
820
820
  ]
821
821
  },
822
822
  "src/features/settings/components/global-settings-dialog.tsx": {
823
- "file": "assets/global-settings-dialog-B8gBgus7.js",
823
+ "file": "assets/global-settings-dialog-CcncTTuP.js",
824
824
  "name": "global-settings-dialog",
825
825
  "src": "src/features/settings/components/global-settings-dialog.tsx",
826
826
  "isDynamicEntry": true,
@@ -836,13 +836,13 @@
836
836
  "_provider-connection-queries-CSumXgIL.js",
837
837
  "_prompt-input-controls-CJyoVdGf.js",
838
838
  "_git-commit-horizontal-BezTHHvd.js",
839
- "_lazy-message-response-CG0j4yJD.js",
839
+ "_lazy-message-response-BCtctszr.js",
840
840
  "_upload-C2JxJnmn.js",
841
841
  "index.html"
842
842
  ]
843
843
  },
844
844
  "src/features/workbench/components/git-history-panel.tsx": {
845
- "file": "assets/git-history-panel-CUvtjCk7.js",
845
+ "file": "assets/git-history-panel-CqKWTKwH.js",
846
846
  "name": "git-history-panel",
847
847
  "src": "src/features/workbench/components/git-history-panel.tsx",
848
848
  "isDynamicEntry": true,
@@ -854,7 +854,7 @@
854
854
  "_useInfiniteQuery-Bu9BuQ4a.js",
855
855
  "_loader-circle-B1P6CG7G.js",
856
856
  "_file-code-corner-Bs_lkoMS.js",
857
- "_file-review-dialog-CotyuYId.js",
857
+ "_file-review-dialog-DO97in5h.js",
858
858
  "_git-commit-horizontal-BezTHHvd.js",
859
859
  "_context-menu-B-oGuenT.js",
860
860
  "index.html"
@@ -864,19 +864,19 @@
864
864
  ]
865
865
  },
866
866
  "src/features/workbench/components/project-file-popup-page.tsx": {
867
- "file": "assets/project-file-popup-page-DLcWrRDd.js",
867
+ "file": "assets/project-file-popup-page-CVtCt_XU.js",
868
868
  "name": "project-file-popup-page",
869
869
  "src": "src/features/workbench/components/project-file-popup-page.tsx",
870
870
  "isDynamicEntry": true,
871
871
  "imports": [
872
872
  "_rolldown-runtime-QTnfLwEv.js",
873
873
  "_react-runtime-CVaUQXZF.js",
874
- "_project-source-panel-BAOR4fTj.js",
874
+ "_project-source-panel-BEBbL2Id.js",
875
875
  "index.html"
876
876
  ]
877
877
  },
878
878
  "src/features/workbench/components/workbench-inspector-changes.tsx": {
879
- "file": "assets/workbench-inspector-changes-NQ5C_cXN.js",
879
+ "file": "assets/workbench-inspector-changes-BLY-8Tfn.js",
880
880
  "name": "workbench-inspector-changes",
881
881
  "src": "src/features/workbench/components/workbench-inspector-changes.tsx",
882
882
  "isDynamicEntry": true,
@@ -897,7 +897,7 @@
897
897
  ]
898
898
  },
899
899
  "src/features/workbench/components/workbench-shell.tsx": {
900
- "file": "assets/workbench-shell-B5fsrpDH.js",
900
+ "file": "assets/workbench-shell-DSfvZh4Q.js",
901
901
  "name": "workbench-shell",
902
902
  "src": "src/features/workbench/components/workbench-shell.tsx",
903
903
  "isDynamicEntry": true,
@@ -913,17 +913,17 @@
913
913
  "_dist-CaAkD3UC.js",
914
914
  "_file-tree-CqppWhX1.js",
915
915
  "_provider-connection-queries-CSumXgIL.js",
916
- "_project-source-panel-BAOR4fTj.js",
916
+ "_project-source-panel-BEBbL2Id.js",
917
917
  "_file-code-corner-Bs_lkoMS.js",
918
918
  "_prompt-reference-token-DvdGBAjJ.js",
919
919
  "_button-group-CYhxptHg.js",
920
920
  "_prompt-input-controls-CJyoVdGf.js",
921
- "_file-review-dialog-CotyuYId.js",
921
+ "_file-review-dialog-DO97in5h.js",
922
922
  "_git-commit-horizontal-BezTHHvd.js",
923
- "_lazy-message-response-CG0j4yJD.js",
923
+ "_lazy-message-response-BCtctszr.js",
924
924
  "_context-menu-B-oGuenT.js",
925
925
  "index.html",
926
- "_code-languages-CPYTSY-8.js",
926
+ "_code-languages-Dyc6uij-.js",
927
927
  "_file-change-D7aZLgtG.js"
928
928
  ],
929
929
  "dynamicImports": [
@@ -933,19 +933,19 @@
933
933
  ]
934
934
  },
935
935
  "src/shared/components/agent/code-highlighter.ts": {
936
- "file": "assets/code-highlighter-CsBwNeVP.js",
936
+ "file": "assets/code-highlighter-Bc0RuXH6.js",
937
937
  "name": "code-highlighter",
938
938
  "src": "src/shared/components/agent/code-highlighter.ts",
939
939
  "isDynamicEntry": true,
940
940
  "imports": [
941
941
  "_engine-compile-Bqjaa_8Z.js",
942
- "_code-languages-CPYTSY-8.js",
942
+ "_code-languages-Dyc6uij-.js",
943
943
  "../../node_modules/.pnpm/shiki@4.4.3/node_modules/shiki/dist/themes/github-dark.mjs",
944
944
  "../../node_modules/.pnpm/shiki@4.4.3/node_modules/shiki/dist/themes/github-light.mjs"
945
945
  ]
946
946
  },
947
947
  "src/shared/components/agent/message-response.tsx": {
948
- "file": "assets/message-response-HPRWZrlE.js",
948
+ "file": "assets/message-response-Bx5gf4FU.js",
949
949
  "name": "message-response",
950
950
  "src": "src/shared/components/agent/message-response.tsx",
951
951
  "isDynamicEntry": true,
@@ -957,7 +957,7 @@
957
957
  "_prompt-reference-token-DvdGBAjJ.js",
958
958
  "_context-menu-B-oGuenT.js",
959
959
  "index.html",
960
- "_chunk-BO2N2NFS-Du4ZYlrF.js"
960
+ "_chunk-BO2N2NFS-C9-C2tVf.js"
961
961
  ]
962
962
  }
963
963
  }
Binary file
Binary file