@bryanhu/codexly 0.13.0 → 0.14.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 (147) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +1 -1
  3. package/README.zh-CN.md +1 -1
  4. package/dist/{chunk-HHFZB7H6.js → chunk-XXAU2AQY.js} +65 -65
  5. package/dist/cli.js +2 -2
  6. package/dist/server/index.js +1 -1
  7. package/dist/web/.vite/manifest.json +65 -65
  8. package/dist/web/.vite/manifest.json.br +0 -0
  9. package/dist/web/.vite/manifest.json.gz +0 -0
  10. package/dist/web/assets/{button-group-CaIXhcq-.js → button-group-JQ4SKm_M.js} +1 -1
  11. package/dist/web/assets/button-group-JQ4SKm_M.js.br +0 -0
  12. package/dist/web/assets/button-group-JQ4SKm_M.js.gz +0 -0
  13. package/dist/web/assets/{context-menu-C6o4ShKC.js → context-menu-BY4fW29a.js} +1 -1
  14. package/dist/web/assets/context-menu-BY4fW29a.js.br +0 -0
  15. package/dist/web/assets/context-menu-BY4fW29a.js.gz +0 -0
  16. package/dist/web/assets/{file-review-dialog-Cd_FWDJj.js → file-review-dialog-CQIeVer4.js} +1 -1
  17. package/dist/web/assets/file-review-dialog-CQIeVer4.js.br +0 -0
  18. package/dist/web/assets/file-review-dialog-CQIeVer4.js.gz +0 -0
  19. package/dist/web/assets/{git-history-panel-CkQhJ-Tz.js → git-history-panel-cnmuCR7N.js} +1 -1
  20. package/dist/web/assets/git-history-panel-cnmuCR7N.js.br +0 -0
  21. package/dist/web/assets/git-history-panel-cnmuCR7N.js.gz +0 -0
  22. package/dist/web/assets/{global-settings-dialog-B9ACq0CT.js → global-settings-dialog-BtJYh2_p.js} +1 -1
  23. package/dist/web/assets/global-settings-dialog-BtJYh2_p.js.br +0 -0
  24. package/dist/web/assets/global-settings-dialog-BtJYh2_p.js.gz +0 -0
  25. package/dist/web/assets/index-BfZBHCrX.css +2 -0
  26. package/dist/web/assets/index-BfZBHCrX.css.br +0 -0
  27. package/dist/web/assets/index-BfZBHCrX.css.gz +0 -0
  28. package/dist/web/assets/index-CaTeB0Nm.js +4 -0
  29. package/dist/web/assets/index-CaTeB0Nm.js.br +0 -0
  30. package/dist/web/assets/index-CaTeB0Nm.js.gz +0 -0
  31. package/dist/web/assets/{installed-skills-pane-BmjTd0Qn.js → installed-skills-pane-mwXKrGXA.js} +1 -1
  32. package/dist/web/assets/installed-skills-pane-mwXKrGXA.js.br +0 -0
  33. package/dist/web/assets/installed-skills-pane-mwXKrGXA.js.gz +0 -0
  34. package/dist/web/assets/{lazy-message-response-Cnc-bbSf.js → lazy-message-response-Biq2ok2E.js} +2 -2
  35. package/dist/web/assets/lazy-message-response-Biq2ok2E.js.br +0 -0
  36. package/dist/web/assets/lazy-message-response-Biq2ok2E.js.gz +0 -0
  37. package/dist/web/assets/{mcp-management-pane-CQPXfAO3.js → mcp-management-pane-BdtuiZSq.js} +1 -1
  38. package/dist/web/assets/mcp-management-pane-BdtuiZSq.js.br +0 -0
  39. package/dist/web/assets/mcp-management-pane-BdtuiZSq.js.gz +0 -0
  40. package/dist/web/assets/{message-response-CamC0ebm.js → message-response-CHtn6tyl.js} +1 -1
  41. package/dist/web/assets/message-response-CHtn6tyl.js.br +0 -0
  42. package/dist/web/assets/message-response-CHtn6tyl.js.gz +0 -0
  43. package/dist/web/assets/{official-plugins-pane-BqGBX0cD.js → official-plugins-pane-BfNSSHYd.js} +1 -1
  44. package/dist/web/assets/official-plugins-pane-BfNSSHYd.js.br +0 -0
  45. package/dist/web/assets/official-plugins-pane-BfNSSHYd.js.gz +0 -0
  46. package/dist/web/assets/{project-file-popup-page-DCct78Pu.js → project-file-popup-page-CfPvJlpw.js} +1 -1
  47. package/dist/web/assets/project-file-popup-page-CfPvJlpw.js.br +0 -0
  48. package/dist/web/assets/project-file-popup-page-CfPvJlpw.js.gz +0 -0
  49. package/dist/web/assets/{project-source-panel-BC6YVLSp.js → project-source-panel-Cw_heTH4.js} +1 -1
  50. package/dist/web/assets/project-source-panel-Cw_heTH4.js.br +0 -0
  51. package/dist/web/assets/project-source-panel-Cw_heTH4.js.gz +0 -0
  52. package/dist/web/assets/{prompt-input-FNZNBIXc.js → prompt-input-C4sSOZy9.js} +1 -1
  53. package/dist/web/assets/prompt-input-C4sSOZy9.js.br +0 -0
  54. package/dist/web/assets/prompt-input-C4sSOZy9.js.gz +0 -0
  55. package/dist/web/assets/{prompt-input-controls-BTOpD8Y-.js → prompt-input-controls-CcVBHVXv.js} +1 -1
  56. package/dist/web/assets/prompt-input-controls-CcVBHVXv.js.br +0 -0
  57. package/dist/web/assets/prompt-input-controls-CcVBHVXv.js.gz +0 -0
  58. package/dist/web/assets/{scheduled-task-date-time-picker-CL9Xb-R5.js → scheduled-task-date-time-picker-DwKbR28n.js} +1 -1
  59. package/dist/web/assets/scheduled-task-date-time-picker-DwKbR28n.js.br +0 -0
  60. package/dist/web/assets/scheduled-task-date-time-picker-DwKbR28n.js.gz +0 -0
  61. package/dist/web/assets/scheduled-task-schedule-Cfuv_Kyf.js +1 -0
  62. package/dist/web/assets/scheduled-task-schedule-Cfuv_Kyf.js.br +0 -0
  63. package/dist/web/assets/scheduled-task-schedule-Cfuv_Kyf.js.gz +0 -0
  64. package/dist/web/assets/scheduled-tasks-container-CiYF44lc.js +2 -0
  65. package/dist/web/assets/scheduled-tasks-container-CiYF44lc.js.br +0 -0
  66. package/dist/web/assets/scheduled-tasks-container-CiYF44lc.js.gz +0 -0
  67. package/dist/web/assets/{sheet-CJD6cMoi.js → sheet-BNFRnQAh.js} +1 -1
  68. package/dist/web/assets/sheet-BNFRnQAh.js.br +0 -0
  69. package/dist/web/assets/sheet-BNFRnQAh.js.gz +0 -0
  70. package/dist/web/assets/{skills-market-container-B8Mss3fh.js → skills-market-container-CfaZk3xM.js} +2 -2
  71. package/dist/web/assets/skills-market-container-CfaZk3xM.js.br +0 -0
  72. package/dist/web/assets/skills-market-container-CfaZk3xM.js.gz +0 -0
  73. package/dist/web/assets/{third-party-marketplace-pane-BsSxaqQR.js → third-party-marketplace-pane-okgMXBqM.js} +1 -1
  74. package/dist/web/assets/third-party-marketplace-pane-okgMXBqM.js.br +0 -0
  75. package/dist/web/assets/third-party-marketplace-pane-okgMXBqM.js.gz +0 -0
  76. package/dist/web/assets/{workbench-composer-Co9mAWP_.js → workbench-composer-Bx73x_MF.js} +2 -2
  77. package/dist/web/assets/workbench-composer-Bx73x_MF.js.br +0 -0
  78. package/dist/web/assets/workbench-composer-Bx73x_MF.js.gz +0 -0
  79. package/dist/web/assets/{workbench-inspector-changes-DcJkQFAH.js → workbench-inspector-changes-DXkowHaf.js} +1 -1
  80. package/dist/web/assets/workbench-inspector-changes-DXkowHaf.js.br +0 -0
  81. package/dist/web/assets/workbench-inspector-changes-DXkowHaf.js.gz +0 -0
  82. package/dist/web/assets/{workbench-pet-canvas-BR5AhUVL.js → workbench-pet-canvas-BroOHYwq.js} +1 -1
  83. package/dist/web/assets/workbench-pet-canvas-BroOHYwq.js.br +0 -0
  84. package/dist/web/assets/workbench-pet-canvas-BroOHYwq.js.gz +0 -0
  85. package/dist/web/assets/{workbench-shell-5F-GWLMO.js → workbench-shell-DnnhILPt.js} +3 -3
  86. package/dist/web/assets/workbench-shell-DnnhILPt.js.br +0 -0
  87. package/dist/web/assets/workbench-shell-DnnhILPt.js.gz +0 -0
  88. package/dist/web/index.html +2 -2
  89. package/dist/web/index.html.br +0 -0
  90. package/dist/web/index.html.gz +0 -0
  91. package/package.json +1 -1
  92. package/dist/web/assets/button-group-CaIXhcq-.js.br +0 -0
  93. package/dist/web/assets/button-group-CaIXhcq-.js.gz +0 -0
  94. package/dist/web/assets/context-menu-C6o4ShKC.js.br +0 -0
  95. package/dist/web/assets/context-menu-C6o4ShKC.js.gz +0 -0
  96. package/dist/web/assets/file-review-dialog-Cd_FWDJj.js.br +0 -0
  97. package/dist/web/assets/file-review-dialog-Cd_FWDJj.js.gz +0 -0
  98. package/dist/web/assets/git-history-panel-CkQhJ-Tz.js.br +0 -0
  99. package/dist/web/assets/git-history-panel-CkQhJ-Tz.js.gz +0 -0
  100. package/dist/web/assets/global-settings-dialog-B9ACq0CT.js.br +0 -0
  101. package/dist/web/assets/global-settings-dialog-B9ACq0CT.js.gz +0 -0
  102. package/dist/web/assets/index-CergXz2m.js +0 -4
  103. package/dist/web/assets/index-CergXz2m.js.br +0 -0
  104. package/dist/web/assets/index-CergXz2m.js.gz +0 -0
  105. package/dist/web/assets/index-jg-dNJI1.css +0 -2
  106. package/dist/web/assets/index-jg-dNJI1.css.br +0 -0
  107. package/dist/web/assets/index-jg-dNJI1.css.gz +0 -0
  108. package/dist/web/assets/installed-skills-pane-BmjTd0Qn.js.br +0 -0
  109. package/dist/web/assets/installed-skills-pane-BmjTd0Qn.js.gz +0 -0
  110. package/dist/web/assets/lazy-message-response-Cnc-bbSf.js.br +0 -0
  111. package/dist/web/assets/lazy-message-response-Cnc-bbSf.js.gz +0 -0
  112. package/dist/web/assets/mcp-management-pane-CQPXfAO3.js.br +0 -0
  113. package/dist/web/assets/mcp-management-pane-CQPXfAO3.js.gz +0 -0
  114. package/dist/web/assets/message-response-CamC0ebm.js.br +0 -0
  115. package/dist/web/assets/message-response-CamC0ebm.js.gz +0 -0
  116. package/dist/web/assets/official-plugins-pane-BqGBX0cD.js.br +0 -0
  117. package/dist/web/assets/official-plugins-pane-BqGBX0cD.js.gz +0 -0
  118. package/dist/web/assets/project-file-popup-page-DCct78Pu.js.br +0 -0
  119. package/dist/web/assets/project-file-popup-page-DCct78Pu.js.gz +0 -0
  120. package/dist/web/assets/project-source-panel-BC6YVLSp.js.br +0 -0
  121. package/dist/web/assets/project-source-panel-BC6YVLSp.js.gz +0 -0
  122. package/dist/web/assets/prompt-input-FNZNBIXc.js.br +0 -0
  123. package/dist/web/assets/prompt-input-FNZNBIXc.js.gz +0 -0
  124. package/dist/web/assets/prompt-input-controls-BTOpD8Y-.js.br +0 -0
  125. package/dist/web/assets/prompt-input-controls-BTOpD8Y-.js.gz +0 -0
  126. package/dist/web/assets/scheduled-task-date-time-picker-CL9Xb-R5.js.br +0 -0
  127. package/dist/web/assets/scheduled-task-date-time-picker-CL9Xb-R5.js.gz +0 -0
  128. package/dist/web/assets/scheduled-task-schedule-DfXHCkgb.js +0 -1
  129. package/dist/web/assets/scheduled-task-schedule-DfXHCkgb.js.br +0 -0
  130. package/dist/web/assets/scheduled-task-schedule-DfXHCkgb.js.gz +0 -0
  131. package/dist/web/assets/scheduled-tasks-container-Bn6tqtCc.js +0 -2
  132. package/dist/web/assets/scheduled-tasks-container-Bn6tqtCc.js.br +0 -0
  133. package/dist/web/assets/scheduled-tasks-container-Bn6tqtCc.js.gz +0 -0
  134. package/dist/web/assets/sheet-CJD6cMoi.js.br +0 -0
  135. package/dist/web/assets/sheet-CJD6cMoi.js.gz +0 -0
  136. package/dist/web/assets/skills-market-container-B8Mss3fh.js.br +0 -0
  137. package/dist/web/assets/skills-market-container-B8Mss3fh.js.gz +0 -0
  138. package/dist/web/assets/third-party-marketplace-pane-BsSxaqQR.js.br +0 -0
  139. package/dist/web/assets/third-party-marketplace-pane-BsSxaqQR.js.gz +0 -0
  140. package/dist/web/assets/workbench-composer-Co9mAWP_.js.br +0 -0
  141. package/dist/web/assets/workbench-composer-Co9mAWP_.js.gz +0 -0
  142. package/dist/web/assets/workbench-inspector-changes-DcJkQFAH.js.br +0 -0
  143. package/dist/web/assets/workbench-inspector-changes-DcJkQFAH.js.gz +0 -0
  144. package/dist/web/assets/workbench-pet-canvas-BR5AhUVL.js.br +0 -0
  145. package/dist/web/assets/workbench-pet-canvas-BR5AhUVL.js.gz +0 -0
  146. package/dist/web/assets/workbench-shell-5F-GWLMO.js.br +0 -0
  147. package/dist/web/assets/workbench-shell-5F-GWLMO.js.gz +0 -0
package/CHANGELOG.md CHANGED
@@ -4,6 +4,17 @@
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.14.0] - 2026-09-08
8
+
9
+ ### 新增
10
+
11
+ - 支持从工作台浮层关闭未回答的异步问题,避免无效问题持续占用操作区域。
12
+
13
+ ### 修复
14
+
15
+ - 联动定时任务的重复规则与调度字段,切换计划类型时保持表单状态一致。
16
+ - 修复 Windows 跨盘路径的文件边界校验与项目拖拽排序,并完善跨平台全量测试。
17
+
7
18
  ## [0.13.0] - 2026-09-07
8
19
 
9
20
  ### 新增
package/README.md CHANGED
@@ -39,7 +39,7 @@
39
39
  - Run project or temporary Codex tasks and follow responses, commands, and file changes in real time
40
40
  - Keep follow-up work in a persistent task queue, and edit queued messages and attachments before they run
41
41
  - Track active work on a task board, maintain project to-dos, and schedule persistent one-time or recurring tasks
42
- - Attach files and images, reference project files with `@`, answer MCP input requests, and ask asynchronous questions while a task runs
42
+ - Attach files and images, reference project files with `@`, answer MCP input requests, and ask or dismiss asynchronous questions while a task runs
43
43
  - Choose the model, reasoning effort, Fast mode, approval behavior, and file access level for each task
44
44
  - Manage installed Skills, official Plugins, MCP servers, and compatible third-party Skills from ClawHub in one extension center
45
45
  - Organize ordered multi-root projects, archive project or temporary tasks, and permanently delete tasks when needed
package/README.zh-CN.md CHANGED
@@ -9,7 +9,7 @@ Codexly 是一个在浏览器中使用 Codex 的本地 AI 编程工作台。它
9
9
  - 运行项目任务或临时任务,实时查看回复、命令和文件变更
10
10
  - 使用持久化任务队列安排后续工作,并在执行前编辑排队消息和附件
11
11
  - 使用任务看板跟踪进行中的工作、维护项目待办,并创建持久化的一次性或周期定时任务
12
- - 添加文件与图片、使用 `@` 引用项目文件、回答 MCP 补充输入请求,并在任务执行期间异步提问
12
+ - 添加文件与图片、使用 `@` 引用项目文件、回答 MCP 补充输入请求,并在任务执行期间发起或关闭异步问题
13
13
  - 为每个任务选择模型、思考量、快速模式、审批方式和文件访问范围
14
14
  - 在扩展中心统一管理已安装 Skills、官方 Plugins、MCP Servers,以及来自 ClawHub 的兼容第三方 Skills
15
15
  - 组织有序的多根项目、归档项目或临时任务,并按需永久删除任务
@@ -36591,10 +36591,10 @@ var require_resolve_block_map = __commonJS({
36591
36591
  let offset = bm.offset;
36592
36592
  let commentEnd = null;
36593
36593
  for (const collItem of bm.items) {
36594
- const { start, key, sep: sep6, value } = collItem;
36594
+ const { start, key, sep: sep7, value } = collItem;
36595
36595
  const keyProps = resolveProps.resolveProps(start, {
36596
36596
  indicator: "explicit-key-ind",
36597
- next: key ?? sep6?.[0],
36597
+ next: key ?? sep7?.[0],
36598
36598
  offset,
36599
36599
  onError: onError2,
36600
36600
  parentIndent: bm.indent,
@@ -36608,7 +36608,7 @@ var require_resolve_block_map = __commonJS({
36608
36608
  else if ("indent" in key && key.indent !== bm.indent)
36609
36609
  onError2(offset, "BAD_INDENT", startColMsg);
36610
36610
  }
36611
- if (!keyProps.anchor && !keyProps.tag && !sep6) {
36611
+ if (!keyProps.anchor && !keyProps.tag && !sep7) {
36612
36612
  commentEnd = keyProps.end;
36613
36613
  if (keyProps.comment) {
36614
36614
  if (map.comment)
@@ -36632,7 +36632,7 @@ var require_resolve_block_map = __commonJS({
36632
36632
  ctx.atKey = false;
36633
36633
  if (utilMapIncludes.mapIncludes(ctx, map.items, keyNode))
36634
36634
  onError2(keyStart, "DUPLICATE_KEY", "Map keys must be unique");
36635
- const valueProps = resolveProps.resolveProps(sep6 ?? [], {
36635
+ const valueProps = resolveProps.resolveProps(sep7 ?? [], {
36636
36636
  indicator: "map-value-ind",
36637
36637
  next: value,
36638
36638
  offset: keyNode.range[2],
@@ -36648,7 +36648,7 @@ var require_resolve_block_map = __commonJS({
36648
36648
  if (ctx.options.strict && keyProps.start < valueProps.found.offset - 1024)
36649
36649
  onError2(keyNode.range, "KEY_OVER_1024_CHARS", "The : indicator must be at most 1024 chars after the start of an implicit block mapping key");
36650
36650
  }
36651
- const valueNode = value ? composeNode(ctx, value, valueProps, onError2) : composeEmptyNode(ctx, offset, sep6, null, valueProps, onError2);
36651
+ const valueNode = value ? composeNode(ctx, value, valueProps, onError2) : composeEmptyNode(ctx, offset, sep7, null, valueProps, onError2);
36652
36652
  if (ctx.schema.compat)
36653
36653
  utilFlowIndentCheck.flowIndentCheck(bm.indent, value, onError2);
36654
36654
  offset = valueNode.range[2];
@@ -36737,7 +36737,7 @@ var require_resolve_end = __commonJS({
36737
36737
  let comment = "";
36738
36738
  if (end) {
36739
36739
  let hasSpace = false;
36740
- let sep6 = "";
36740
+ let sep7 = "";
36741
36741
  for (const token of end) {
36742
36742
  const { source, type } = token;
36743
36743
  switch (type) {
@@ -36751,13 +36751,13 @@ var require_resolve_end = __commonJS({
36751
36751
  if (!comment)
36752
36752
  comment = cb;
36753
36753
  else
36754
- comment += sep6 + cb;
36755
- sep6 = "";
36754
+ comment += sep7 + cb;
36755
+ sep7 = "";
36756
36756
  break;
36757
36757
  }
36758
36758
  case "newline":
36759
36759
  if (comment)
36760
- sep6 += source;
36760
+ sep7 += source;
36761
36761
  hasSpace = true;
36762
36762
  break;
36763
36763
  default:
@@ -36799,18 +36799,18 @@ var require_resolve_flow_collection = __commonJS({
36799
36799
  let offset = fc.offset + fc.start.source.length;
36800
36800
  for (let i2 = 0; i2 < fc.items.length; ++i2) {
36801
36801
  const collItem = fc.items[i2];
36802
- const { start, key, sep: sep6, value } = collItem;
36802
+ const { start, key, sep: sep7, value } = collItem;
36803
36803
  const props = resolveProps.resolveProps(start, {
36804
36804
  flow: fcName,
36805
36805
  indicator: "explicit-key-ind",
36806
- next: key ?? sep6?.[0],
36806
+ next: key ?? sep7?.[0],
36807
36807
  offset,
36808
36808
  onError: onError2,
36809
36809
  parentIndent: fc.indent,
36810
36810
  startOnNewline: false
36811
36811
  });
36812
36812
  if (!props.found) {
36813
- if (!props.anchor && !props.tag && !sep6 && !value) {
36813
+ if (!props.anchor && !props.tag && !sep7 && !value) {
36814
36814
  if (i2 === 0 && props.comma)
36815
36815
  onError2(props.comma, "UNEXPECTED_TOKEN", `Unexpected , in ${fcName}`);
36816
36816
  else if (i2 < fc.items.length - 1)
@@ -36864,8 +36864,8 @@ var require_resolve_flow_collection = __commonJS({
36864
36864
  }
36865
36865
  }
36866
36866
  }
36867
- if (!isMap && !sep6 && !props.found) {
36868
- const valueNode = value ? composeNode(ctx, value, props, onError2) : composeEmptyNode(ctx, props.end, sep6, null, props, onError2);
36867
+ if (!isMap && !sep7 && !props.found) {
36868
+ const valueNode = value ? composeNode(ctx, value, props, onError2) : composeEmptyNode(ctx, props.end, sep7, null, props, onError2);
36869
36869
  coll.items.push(valueNode);
36870
36870
  offset = valueNode.range[2];
36871
36871
  if (isBlock(value))
@@ -36877,7 +36877,7 @@ var require_resolve_flow_collection = __commonJS({
36877
36877
  if (isBlock(key))
36878
36878
  onError2(keyNode.range, "BLOCK_IN_FLOW", blockMsg);
36879
36879
  ctx.atKey = false;
36880
- const valueProps = resolveProps.resolveProps(sep6 ?? [], {
36880
+ const valueProps = resolveProps.resolveProps(sep7 ?? [], {
36881
36881
  flow: fcName,
36882
36882
  indicator: "map-value-ind",
36883
36883
  next: value,
@@ -36888,8 +36888,8 @@ var require_resolve_flow_collection = __commonJS({
36888
36888
  });
36889
36889
  if (valueProps.found) {
36890
36890
  if (!isMap && !props.found && ctx.options.strict) {
36891
- if (sep6)
36892
- for (const st of sep6) {
36891
+ if (sep7)
36892
+ for (const st of sep7) {
36893
36893
  if (st === valueProps.found)
36894
36894
  break;
36895
36895
  if (st.type === "newline") {
@@ -36906,7 +36906,7 @@ var require_resolve_flow_collection = __commonJS({
36906
36906
  else
36907
36907
  onError2(valueProps.start, "MISSING_CHAR", `Missing , or : between ${fcName} items`);
36908
36908
  }
36909
- const valueNode = value ? composeNode(ctx, value, valueProps, onError2) : valueProps.found ? composeEmptyNode(ctx, valueProps.end, sep6, null, valueProps, onError2) : null;
36909
+ const valueNode = value ? composeNode(ctx, value, valueProps, onError2) : valueProps.found ? composeEmptyNode(ctx, valueProps.end, sep7, null, valueProps, onError2) : null;
36910
36910
  if (valueNode) {
36911
36911
  if (isBlock(value))
36912
36912
  onError2(valueNode.range, "BLOCK_IN_FLOW", blockMsg);
@@ -37084,7 +37084,7 @@ var require_resolve_block_scalar = __commonJS({
37084
37084
  chompStart = i2 + 1;
37085
37085
  }
37086
37086
  let value = "";
37087
- let sep6 = "";
37087
+ let sep7 = "";
37088
37088
  let prevMoreIndented = false;
37089
37089
  for (let i2 = 0; i2 < contentStart; ++i2)
37090
37090
  value += lines[i2][0].slice(trimIndent) + "\n";
@@ -37101,24 +37101,24 @@ var require_resolve_block_scalar = __commonJS({
37101
37101
  indent = "";
37102
37102
  }
37103
37103
  if (type === Scalar.Scalar.BLOCK_LITERAL) {
37104
- value += sep6 + indent.slice(trimIndent) + content;
37105
- sep6 = "\n";
37104
+ value += sep7 + indent.slice(trimIndent) + content;
37105
+ sep7 = "\n";
37106
37106
  } else if (indent.length > trimIndent || content[0] === " ") {
37107
- if (sep6 === " ")
37108
- sep6 = "\n";
37109
- else if (!prevMoreIndented && sep6 === "\n")
37110
- sep6 = "\n\n";
37111
- value += sep6 + indent.slice(trimIndent) + content;
37112
- sep6 = "\n";
37107
+ if (sep7 === " ")
37108
+ sep7 = "\n";
37109
+ else if (!prevMoreIndented && sep7 === "\n")
37110
+ sep7 = "\n\n";
37111
+ value += sep7 + indent.slice(trimIndent) + content;
37112
+ sep7 = "\n";
37113
37113
  prevMoreIndented = true;
37114
37114
  } else if (content === "") {
37115
- if (sep6 === "\n")
37115
+ if (sep7 === "\n")
37116
37116
  value += "\n";
37117
37117
  else
37118
- sep6 = "\n";
37118
+ sep7 = "\n";
37119
37119
  } else {
37120
- value += sep6 + content;
37121
- sep6 = " ";
37120
+ value += sep7 + content;
37121
+ sep7 = " ";
37122
37122
  prevMoreIndented = false;
37123
37123
  }
37124
37124
  }
@@ -37299,25 +37299,25 @@ var require_resolve_flow_scalar = __commonJS({
37299
37299
  if (!match)
37300
37300
  return source;
37301
37301
  let res = match[1];
37302
- let sep6 = " ";
37302
+ let sep7 = " ";
37303
37303
  let pos = first2.lastIndex;
37304
37304
  line.lastIndex = pos;
37305
37305
  while (match = line.exec(source)) {
37306
37306
  if (match[1] === "") {
37307
- if (sep6 === "\n")
37308
- res += sep6;
37307
+ if (sep7 === "\n")
37308
+ res += sep7;
37309
37309
  else
37310
- sep6 = "\n";
37310
+ sep7 = "\n";
37311
37311
  } else {
37312
- res += sep6 + match[1];
37313
- sep6 = " ";
37312
+ res += sep7 + match[1];
37313
+ sep7 = " ";
37314
37314
  }
37315
37315
  pos = line.lastIndex;
37316
37316
  }
37317
37317
  const last2 = /[ \t]*(.*)/sy;
37318
37318
  last2.lastIndex = pos;
37319
37319
  match = last2.exec(source);
37320
- return res + sep6 + (match?.[1] ?? "");
37320
+ return res + sep7 + (match?.[1] ?? "");
37321
37321
  }
37322
37322
  function doubleQuotedValue(source, onError2) {
37323
37323
  let res = "";
@@ -38120,14 +38120,14 @@ var require_cst_stringify = __commonJS({
38120
38120
  }
38121
38121
  }
38122
38122
  }
38123
- function stringifyItem({ start, key, sep: sep6, value }) {
38123
+ function stringifyItem({ start, key, sep: sep7, value }) {
38124
38124
  let res = "";
38125
38125
  for (const st of start)
38126
38126
  res += st.source;
38127
38127
  if (key)
38128
38128
  res += stringifyToken(key);
38129
- if (sep6)
38130
- for (const st of sep6)
38129
+ if (sep7)
38130
+ for (const st of sep7)
38131
38131
  res += st.source;
38132
38132
  if (value)
38133
38133
  res += stringifyToken(value);
@@ -39289,18 +39289,18 @@ var require_parser = __commonJS({
39289
39289
  if (this.type === "map-value-ind") {
39290
39290
  const prev = getPrevProps(this.peek(2));
39291
39291
  const start = getFirstKeyStartProps(prev);
39292
- let sep6;
39292
+ let sep7;
39293
39293
  if (scalar.end) {
39294
- sep6 = scalar.end;
39295
- sep6.push(this.sourceToken);
39294
+ sep7 = scalar.end;
39295
+ sep7.push(this.sourceToken);
39296
39296
  delete scalar.end;
39297
39297
  } else
39298
- sep6 = [this.sourceToken];
39298
+ sep7 = [this.sourceToken];
39299
39299
  const map = {
39300
39300
  type: "block-map",
39301
39301
  offset: scalar.offset,
39302
39302
  indent: scalar.indent,
39303
- items: [{ start, key: scalar, sep: sep6 }]
39303
+ items: [{ start, key: scalar, sep: sep7 }]
39304
39304
  };
39305
39305
  this.onKeyLine = true;
39306
39306
  this.stack[this.stack.length - 1] = map;
@@ -39453,15 +39453,15 @@ var require_parser = __commonJS({
39453
39453
  } else if (isFlowToken(it.key) && !includesToken(it.sep, "newline")) {
39454
39454
  const start2 = getFirstKeyStartProps(it.start);
39455
39455
  const key = it.key;
39456
- const sep6 = it.sep;
39457
- sep6.push(this.sourceToken);
39456
+ const sep7 = it.sep;
39457
+ sep7.push(this.sourceToken);
39458
39458
  delete it.key;
39459
39459
  delete it.sep;
39460
39460
  this.stack.push({
39461
39461
  type: "block-map",
39462
39462
  offset: this.offset,
39463
39463
  indent: this.indent,
39464
- items: [{ start: start2, key, sep: sep6 }]
39464
+ items: [{ start: start2, key, sep: sep7 }]
39465
39465
  });
39466
39466
  } else if (start.length > 0) {
39467
39467
  it.sep = it.sep.concat(start, this.sourceToken);
@@ -39655,13 +39655,13 @@ var require_parser = __commonJS({
39655
39655
  const prev = getPrevProps(parent);
39656
39656
  const start = getFirstKeyStartProps(prev);
39657
39657
  fixFlowSeqItems(fc);
39658
- const sep6 = fc.end.splice(1, fc.end.length);
39659
- sep6.push(this.sourceToken);
39658
+ const sep7 = fc.end.splice(1, fc.end.length);
39659
+ sep7.push(this.sourceToken);
39660
39660
  const map = {
39661
39661
  type: "block-map",
39662
39662
  offset: fc.offset,
39663
39663
  indent: fc.indent,
39664
- items: [{ start, key: fc, sep: sep6 }]
39664
+ items: [{ start, key: fc, sep: sep7 }]
39665
39665
  };
39666
39666
  this.onKeyLine = true;
39667
39667
  this.stack[this.stack.length - 1] = map;
@@ -47282,7 +47282,7 @@ var require_send = __commonJS({
47282
47282
  var join12 = path.join;
47283
47283
  var normalize2 = path.normalize;
47284
47284
  var resolve8 = path.resolve;
47285
- var sep6 = path.sep;
47285
+ var sep7 = path.sep;
47286
47286
  var Readable4 = stream.Readable;
47287
47287
  var BYTES_RANGE_REGEXP = /^ *bytes=/;
47288
47288
  var MAX_MAXAGE = 60 * 60 * 24 * 365 * 1e3;
@@ -47359,20 +47359,20 @@ var require_send = __commonJS({
47359
47359
  let parts;
47360
47360
  if (root !== null) {
47361
47361
  if (path2) {
47362
- path2 = normalize2("." + sep6 + path2);
47362
+ path2 = normalize2("." + sep7 + path2);
47363
47363
  }
47364
47364
  if (UP_PATH_REGEXP.test(path2)) {
47365
47365
  debug2('malicious path "%s"', path2);
47366
47366
  return { statusCode: 403 };
47367
47367
  }
47368
- parts = path2.split(sep6);
47368
+ parts = path2.split(sep7);
47369
47369
  path2 = normalize2(join12(root, path2));
47370
47370
  } else {
47371
47371
  if (UP_PATH_REGEXP.test(path2)) {
47372
47372
  debug2('malicious path "%s"', path2);
47373
47373
  return { statusCode: 403 };
47374
47374
  }
47375
- parts = normalize2(path2).split(sep6);
47375
+ parts = normalize2(path2).split(sep7);
47376
47376
  path2 = resolve8(path2);
47377
47377
  }
47378
47378
  return { path: path2, parts };
@@ -47665,7 +47665,7 @@ var require_send = __commonJS({
47665
47665
  }
47666
47666
  async function sendFile(request2, path2, options) {
47667
47667
  const { error, stat: stat6 } = await tryStat(path2);
47668
- if (error && error.code === "ENOENT" && !extname3(path2) && path2[path2.length - 1] !== sep6) {
47668
+ if (error && error.code === "ENOENT" && !extname3(path2) && path2[path2.length - 1] !== sep7) {
47669
47669
  let err2 = error;
47670
47670
  for (let i2 = 0; i2 < options.extensions.length; i2++) {
47671
47671
  const extension = options.extensions[i2];
@@ -61599,6 +61599,7 @@ function createGitCommandExecutor(options = {}) {
61599
61599
  };
61600
61600
  if (options.binary !== void 0) {
61601
61601
  clientOptions.binary = options.binary;
61602
+ clientOptions.unsafe = { allowUnsafeCustomBinary: true };
61602
61603
  }
61603
61604
  const git = simpleGit(clientOptions);
61604
61605
  let failure;
@@ -63879,6 +63880,7 @@ async function readProjectFileTree(projectRoot, directoryPath) {
63879
63880
  }
63880
63881
  var MAX_PROJECT_FILE_DEPTH = 20;
63881
63882
  var validFileName = /^(?!\.\.?$)[^/\\]{1,255}$/u;
63883
+ var invalidWindowsFileName = /[<>:"|?*]|[. ]$|^(?:con|prn|aux|nul|com[1-9¹²³]|lpt[1-9¹²³])(?:\.|$)/iu;
63882
63884
  function parseProjectRelativePath(path) {
63883
63885
  const segments = path.split("/");
63884
63886
  if (path.startsWith("/") || path.endsWith("/") || path.includes("\\") || /^[A-Za-z]:/u.test(path) || segments.length > MAX_PROJECT_FILE_DEPTH || segments.some((segment) => segment === "" || segment === "." || segment === "..")) {
@@ -63888,10 +63890,8 @@ function parseProjectRelativePath(path) {
63888
63890
  }
63889
63891
  function assertPathInsideRoot(rootPath, targetPath) {
63890
63892
  const pathFromRoot = relative(rootPath, targetPath);
63891
- if (pathFromRoot === "" || pathFromRoot === ".." || pathFromRoot.startsWith(`..${String.raw`/`}`)) {
63892
- throw new TypeError("Project file path is outside the project root");
63893
- }
63894
- if (pathFromRoot.startsWith("..\\") || resolve(rootPath, pathFromRoot) !== targetPath) {
63893
+ if (pathFromRoot === "" || pathFromRoot === ".." || pathFromRoot.startsWith(`..${sep}`) || // Windows 跨盘 relative 会返回绝对路径,而不是以 .. 开头。
63894
+ isAbsolute(pathFromRoot)) {
63895
63895
  throw new TypeError("Project file path is outside the project root");
63896
63896
  }
63897
63897
  }
@@ -63923,7 +63923,7 @@ async function pathExists2(path) {
63923
63923
  }
63924
63924
  }
63925
63925
  async function renameProjectFile(projectRoot, path, name) {
63926
- if (!validFileName.test(name) || name.includes("\0") || name.includes("\r") || name.includes("\n")) {
63926
+ if (!validFileName.test(name) || name.includes("\0") || name.includes("\r") || name.includes("\n") || process.platform === "win32" && (invalidWindowsFileName.test(name) || name.split("").some((character) => character.charCodeAt(0) < 32))) {
63927
63927
  throw new TypeError("Project file name is invalid");
63928
63928
  }
63929
63929
  const { absolutePath, resolvedRoot } = await resolveProjectFileTarget(projectRoot, path);
@@ -70454,9 +70454,9 @@ function padStart(item, targetLength, padString) {
70454
70454
  }
70455
70455
  return padString.slice(0, targetLength) + String(str);
70456
70456
  }
70457
- var split = function(str, sep6, num) {
70458
- var splits = str.split(sep6);
70459
- return num ? splits.slice(0, num).concat([splits.slice(num).join(sep6)]) : splits;
70457
+ var split = function(str, sep7, num) {
70458
+ var splits = str.split(sep7);
70459
+ return num ? splits.slice(0, num).concat([splits.slice(num).join(sep7)]) : splits;
70460
70460
  };
70461
70461
  var pymod = function(a, b3) {
70462
70462
  var r2 = a % b3;
package/dist/cli.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { createCodexlyServer, SqliteStateRepository, normalizeAllowedHost } from './chunk-HHFZB7H6.js';
3
+ import { createCodexlyServer, SqliteStateRepository, normalizeAllowedHost } from './chunk-XXAU2AQY.js';
4
4
  import './chunk-OVQSIEIK.js';
5
5
  import { startCodexAppServer, locateCodexBinary, createCodexRuntimeProvider, createCodexWorkbenchPetProvider, CodexProjectRepository, checkCodexVersion } from './chunk-TVRHN6RY.js';
6
6
  import './chunk-RNTA4MFS.js';
@@ -19,7 +19,7 @@ createRequire(import.meta.url);
19
19
 
20
20
  // package.json
21
21
  var package_default = {
22
- version: "0.13.0"};
22
+ version: "0.14.0"};
23
23
 
24
24
  // src/npm-registry.ts
25
25
  var MIRROR_REGISTRY = "https://registry.npmmirror.com";
@@ -1,5 +1,5 @@
1
1
  import { createRequire } from 'node:module';
2
- export { AccessSessionService, AgentEventStream, GitCommitError, GitCommitReviewError, SqliteStateRepository, commitSelectedProjectChanges, createCodexlyServer, normalizeAllowedHost, readProjectGitCommitFileDiff, readProjectGitCommitFiles } from '../chunk-HHFZB7H6.js';
2
+ export { AccessSessionService, AgentEventStream, GitCommitError, GitCommitReviewError, SqliteStateRepository, commitSelectedProjectChanges, createCodexlyServer, normalizeAllowedHost, readProjectGitCommitFileDiff, readProjectGitCommitFiles } from '../chunk-XXAU2AQY.js';
3
3
  import '../chunk-OVQSIEIK.js';
4
4
  import '../chunk-TVRHN6RY.js';
5
5
  import '../chunk-RNTA4MFS.js';