@bryanhu/codexly 0.22.0 → 0.23.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 +18 -0
- package/README.md +38 -3
- package/README.zh-CN.md +38 -3
- package/dist/{chunk-4VM2ZUPT.js → chunk-HGSPZCBB.js} +164 -122
- package/dist/{chunk-NUJPWN62.js → chunk-PRIMEL2G.js} +1 -0
- package/dist/cli.js +46 -20
- package/dist/providers/codex/index.js +1 -1
- package/dist/server/index.js +2 -2
- package/package.json +3 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,24 @@
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.23.0] - 2026-09-18
|
|
8
|
+
|
|
9
|
+
### 新增
|
|
10
|
+
|
|
11
|
+
- 添加生产级 Docker 镜像与可独立下载的 Docker Compose 配置,支持自定义工作区、Codex Home、端口、配对密码及会话期限。
|
|
12
|
+
- 扩展发布流程,在 npm 包通过验证后同步发布带 SBOM 和 provenance 的 `linux/amd64`、`linux/arm64` GHCR 镜像。
|
|
13
|
+
|
|
14
|
+
### 修复
|
|
15
|
+
|
|
16
|
+
- 限制项目选择只能落在配置工作区的真实路径内,阻止通过符号链接越过工作区边界。
|
|
17
|
+
- 修复运行中切换自定义 API 后仍复用旧 ChatGPT 认证、导致部分自定义模型不可用的问题。
|
|
18
|
+
|
|
19
|
+
## [0.22.1] - 2026-09-16
|
|
20
|
+
|
|
21
|
+
### 修复
|
|
22
|
+
|
|
23
|
+
- 修复内置更新和全局安装复用过期 npm 元数据、可能无法及时发现新版本的问题。
|
|
24
|
+
|
|
7
25
|
## [0.22.0] - 2026-09-16
|
|
8
26
|
|
|
9
27
|
### 新增
|
package/README.md
CHANGED
|
@@ -74,11 +74,45 @@ On first launch, sign in with ChatGPT or configure an OpenAI-compatible service
|
|
|
74
74
|
For regular use, install Codexly globally:
|
|
75
75
|
|
|
76
76
|
```bash
|
|
77
|
-
npm install --global @bryanhu/codexly@latest --registry=https://registry.npmmirror.com
|
|
77
|
+
npm install --global @bryanhu/codexly@latest --registry=https://registry.npmmirror.com || npm install --global @bryanhu/codexly@latest --registry=https://registry.npmjs.org
|
|
78
78
|
codexly
|
|
79
79
|
```
|
|
80
80
|
|
|
81
|
-
The installation command tries the China mirror first, falls back to the official registry on failure,
|
|
81
|
+
The installation command tries the China mirror first, falls back to the official registry on failure, reuses the npm cache, and revalidates stale package metadata. `||` works in Bash, Zsh, cmd, and PowerShell 7+. In Windows PowerShell 5.1, run the command to the right of `||` separately if the first command fails.
|
|
82
|
+
|
|
83
|
+
## Docker
|
|
84
|
+
|
|
85
|
+
Download the user-facing Compose file and start the published image:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
mkdir codexly && cd codexly
|
|
89
|
+
curl -fsSLO https://raw.githubusercontent.com/BryanHoo/Codexly/main/compose.yaml
|
|
90
|
+
curl -fsSLo .env.example https://raw.githubusercontent.com/BryanHoo/Codexly/main/.env.example
|
|
91
|
+
cp .env.example .env
|
|
92
|
+
docker compose pull
|
|
93
|
+
docker compose up --detach
|
|
94
|
+
docker compose logs --tail=50 codexly
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Open `http://127.0.0.1:3210` and use the random pairing code printed in the logs. The default named volume preserves Codex login data and Codexly's SQLite state. On Linux and macOS, the Compose file mounts the host root at `/workspace`, so every mounted disk is available to the project picker. Set `CODEXLY_WORKSPACE` to expose only one directory:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
CODEXLY_WORKSPACE=/path/to/projects docker compose up --detach
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Docker can only access host paths shared with the Docker engine. On Windows, set `CODEXLY_WORKSPACE` to a shared drive such as `C:/`; add extra bind mounts and repeat `--workspace` in `command` when multiple drives are required.
|
|
104
|
+
|
|
105
|
+
| Variable | Purpose |
|
|
106
|
+
| ----------------------- | -------------------------------------------------------------------- |
|
|
107
|
+
| `CODEXLY_VERSION` | Select the GHCR image tag; defaults to `latest` |
|
|
108
|
+
| `CODEXLY_PORT` | Set both the host and container port; defaults to `3210` |
|
|
109
|
+
| `CODEXLY_WORKSPACE` | Restrict the host directory mounted at `/workspace`; defaults to `/` |
|
|
110
|
+
| `CODEXLY_CODEX_HOME` | Bind a host Codex home instead of the managed `codexly-data` volume |
|
|
111
|
+
| `CODEXLY_LAN_PASSWORD` | Set a strong fixed access password instead of the logged random code |
|
|
112
|
+
| `CODEXLY_ALLOWED_HOSTS` | Allow comma-separated exact reverse proxy domains |
|
|
113
|
+
| `CODEXLY_SESSION_TTL` | Set a fixed session lifetime such as `12h` |
|
|
114
|
+
|
|
115
|
+
The image entrypoint accepts all normal CLI arguments, so orchestration platforms can replace `command` when needed. See the [complete Docker Compose deployment guide](docs/docker-deployment.md) for workspace, multiple-disk, Codex Home, update, backup, and troubleshooting instructions. Run `pnpm docker:build && pnpm docker:test` in a development checkout to build and smoke-test the local image.
|
|
82
116
|
|
|
83
117
|
## Usage
|
|
84
118
|
|
|
@@ -104,6 +138,7 @@ The terminal prints the LAN address and a random access password. Common options
|
|
|
104
138
|
| `--lan-password <password>` | Set a 16-128 character password containing uppercase, lowercase, number, and symbol |
|
|
105
139
|
| `--allowed-host <domain>` | Allow an exact reverse proxy domain; repeat the option for multiple domains |
|
|
106
140
|
| `--session-ttl <duration>` | Set a fixed LAN session lifetime such as `12h`; omitted sessions last until server restart |
|
|
141
|
+
| `--workspace <path>` | Restrict project selection to this absolute root; repeat for multiple roots |
|
|
107
142
|
|
|
108
143
|
Quote passwords containing shell-special characters. LAN mode uses unencrypted HTTP, so use it only on a trusted network and never expose it directly to the internet. Restarting Codexly invalidates the password and all sessions.
|
|
109
144
|
|
|
@@ -114,7 +149,7 @@ Run `codexly doctor` when startup, Codex, or local data checks fail. Run `codexl
|
|
|
114
149
|
Interactive startup and **Settings > About** check for new releases. Built-in updates try the China mirror first for version checks, package downloads, and dependency installation, falling back to the official registry on failure and reusing your npm cache. New releases may appear later while the mirror synchronizes. A global installation can also be updated with:
|
|
115
150
|
|
|
116
151
|
```bash
|
|
117
|
-
npm install --global @bryanhu/codexly@latest --registry=https://registry.npmmirror.com
|
|
152
|
+
npm install --global @bryanhu/codexly@latest --registry=https://registry.npmmirror.com || npm install --global @bryanhu/codexly@latest --registry=https://registry.npmjs.org
|
|
118
153
|
```
|
|
119
154
|
|
|
120
155
|
If an older Linux release was installed into a system directory with `sudo npm install --global`, manually run the command above with `sudo` once to reach a release that supports elevated updates. Later built-in updates request `sudo` access when needed.
|
package/README.zh-CN.md
CHANGED
|
@@ -44,11 +44,45 @@ Codexly 会自动打开浏览器。若未打开,请访问终端输出的地址
|
|
|
44
44
|
经常使用时可以全局安装:
|
|
45
45
|
|
|
46
46
|
```bash
|
|
47
|
-
npm install --global @bryanhu/codexly@latest --registry=https://registry.npmmirror.com
|
|
47
|
+
npm install --global @bryanhu/codexly@latest --registry=https://registry.npmmirror.com || npm install --global @bryanhu/codexly@latest --registry=https://registry.npmjs.org
|
|
48
48
|
codexly
|
|
49
49
|
```
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
安装命令优先使用国内镜像,失败后回退官方源,复用 npm 缓存并重新校验过期的包元数据。`||` 适用于 Bash、Zsh、cmd 和 PowerShell 7+;Windows PowerShell 5.1 请在第一条命令失败后单独执行 `||` 右侧的命令。
|
|
52
|
+
|
|
53
|
+
## Docker 部署
|
|
54
|
+
|
|
55
|
+
下载用户版 Compose 配置并启动已发布镜像:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
mkdir codexly && cd codexly
|
|
59
|
+
curl -fsSLO https://raw.githubusercontent.com/BryanHoo/Codexly/main/compose.yaml
|
|
60
|
+
curl -fsSLo .env.example https://raw.githubusercontent.com/BryanHoo/Codexly/main/.env.example
|
|
61
|
+
cp .env.example .env
|
|
62
|
+
docker compose pull
|
|
63
|
+
docker compose up --detach
|
|
64
|
+
docker compose logs --tail=50 codexly
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
打开 `http://127.0.0.1:3210`,使用日志中的随机配对码。默认命名卷会持久化 Codex 登录数据和 Codexly SQLite 状态。在 Linux 和 macOS 上,Compose 默认把宿主根目录挂载到 `/workspace`,项目选择器可读取所有已挂载磁盘。设置 `CODEXLY_WORKSPACE` 后只暴露指定目录:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
CODEXLY_WORKSPACE=/path/to/projects docker compose up --detach
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Docker 只能访问 Docker Engine 已共享的宿主路径。Windows 需将 `CODEXLY_WORKSPACE` 设置为已共享盘符,例如 `C:/`;需要多个盘符时,在 Compose 中增加 bind mount,并在 `command` 中重复传入 `--workspace`。
|
|
74
|
+
|
|
75
|
+
| 变量 | 用途 |
|
|
76
|
+
| ----------------------- | --------------------------------------------------- |
|
|
77
|
+
| `CODEXLY_VERSION` | 指定 GHCR 镜像标签,默认 `latest` |
|
|
78
|
+
| `CODEXLY_PORT` | 同时设置宿主与容器端口,默认 `3210` |
|
|
79
|
+
| `CODEXLY_WORKSPACE` | 限制挂载到 `/workspace` 的宿主目录,默认 `/` |
|
|
80
|
+
| `CODEXLY_CODEX_HOME` | 绑定宿主 Codex Home,替代默认 `codexly-data` 命名卷 |
|
|
81
|
+
| `CODEXLY_LAN_PASSWORD` | 设置固定强密码,替代日志中生成的随机配对码 |
|
|
82
|
+
| `CODEXLY_ALLOWED_HOSTS` | 设置逗号分隔的反向代理精确域名 |
|
|
83
|
+
| `CODEXLY_SESSION_TTL` | 设置固定会话期限,例如 `12h` |
|
|
84
|
+
|
|
85
|
+
镜像入口支持全部 CLI 参数,编排平台可按需覆盖 `command`。工作区、多磁盘、Codex Home、更新、备份和故障排查参见[完整 Docker Compose 部署指南](docs/docker-deployment.md)。开发仓库可运行 `pnpm docker:build && pnpm docker:test` 构建并冒烟测试本地镜像。
|
|
52
86
|
|
|
53
87
|
## 使用方式
|
|
54
88
|
|
|
@@ -74,6 +108,7 @@ codexly start --lan
|
|
|
74
108
|
| `--lan-password <password>` | 设置 16 至 128 位密码,必须包含大小写字母、数字和符号 |
|
|
75
109
|
| `--allowed-host <domain>` | 允许精确的反向代理域名;多个域名可重复传入 |
|
|
76
110
|
| `--session-ttl <duration>` | 设置固定会话期限,如 `12h`;省略时持续到 Server 重启 |
|
|
111
|
+
| `--workspace <path>` | 限制项目选择的绝对根目录;多个根目录可重复传入 |
|
|
77
112
|
|
|
78
113
|
密码含 Shell 特殊字符时请使用引号。局域网模式使用未加密 HTTP,只能用于可信网络,禁止直接暴露到互联网。重启 Codexly 会使密码和全部会话失效。
|
|
79
114
|
|
|
@@ -84,7 +119,7 @@ codexly start --lan
|
|
|
84
119
|
交互式启动和“设置 > 关于”会检查新版本。内置更新的版本查询、包下载和依赖安装优先使用国内镜像,失败后回退官方源;下载和安装复用用户的 npm 缓存。镜像同步期间可能稍晚显示新版本。全局安装也可以通过以下命令更新:
|
|
85
120
|
|
|
86
121
|
```bash
|
|
87
|
-
npm install --global @bryanhu/codexly@latest --registry=https://registry.npmmirror.com
|
|
122
|
+
npm install --global @bryanhu/codexly@latest --registry=https://registry.npmmirror.com || npm install --global @bryanhu/codexly@latest --registry=https://registry.npmjs.org
|
|
88
123
|
```
|
|
89
124
|
|
|
90
125
|
如果 Linux 上的旧版本通过 `sudo npm install --global` 安装到系统目录,首次升级到支持提权更新的版本时需要手动执行一次上述命令并在前面加上 `sudo`。后续内置更新会在需要时请求 `sudo` 权限。
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { createRequire } from 'node:module';
|
|
2
2
|
import { value_exports } from './chunk-6JWQNFM2.js';
|
|
3
|
-
import { require_pino, require_safe_stable_stringify, CodexProtocolMappingError, CodexProviderConnectionError, RpcConnectionClosedError, RpcProtocolError, RpcResponseError, RpcTimeoutError } from './chunk-
|
|
3
|
+
import { require_pino, require_safe_stable_stringify, CodexProtocolMappingError, CodexProviderConnectionError, RpcConnectionClosedError, RpcProtocolError, RpcResponseError, RpcTimeoutError } from './chunk-PRIMEL2G.js';
|
|
4
4
|
import { WorkbenchPetProviderError, listTaskCatalog, PendingRequestResolutionError, deleteArchivedTasks, queryCompletedTasks, CompletedTasksQueryError, submitTask, TaskSubmissionError, collectQuestionGroups, formatQuestionAnswers, ProjectTodoError, saveProjectTodo } from './chunk-B2673ODM.js';
|
|
5
5
|
import { Type, SkillInstallScopeSchema, ScheduledTaskSchema, SubmitTaskResponseSchema, AgentTaskSchema, AsyncQuestionGroupSchema, AnswerAsyncQuestionResultSchema, AgentTurnSchema, DEFAULT_COMMIT_MESSAGE_MODEL, TEMPORARY_TASK_API_PATH, TEMPORARY_TASK_SCOPE_ID, MAX_AGENT_FILE_BYTES, AccessStatusResponseSchema, PairAccessRequestSchema, BingWallpaperCatalogSchema, HealthResponseSchema, AppInfoResponseSchema, AppUpdateProgressResponseSchema, AgentMutationErrorSchema, InstallAppUpdateResponseSchema, InstallAppUpdateRequestSchema, EventStreamMetricsResponseSchema, AgentCapabilitiesSchema, AgentModelPageSchema, AgentGlobalSettingsResponseSchema, AgentGlobalSettingsSchema, MAX_AGENT_IMAGE_BYTES, MAX_AGENT_TEXT_BYTES, GlobalInstructionsSchema, MemorySettingsSchema, AgentPreferencesSchema, SaveGlobalInstructionsSchema, MemorySettingsUpdateSchema, PersonalizationResetSchema, 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, InstalledSkillPageSchema, OfficialPluginPageSchema, OfficialPluginDetailSchema, OfficialPluginInstallResponseSchema, OfficialPluginUninstallResponseSchema, ClawhubSkillPageSchema, ClawhubSkillDetailSchema, ConfiguredMcpServerPageSchema, OpenSkillDirectoryResponseSchema, SetSkillEnabledResponseSchema, SetMcpServerEnabledResponseSchema, SkillInstallResponseSchema, ScheduledTaskPreviewSchema, ScheduledTaskPreviewRequestSchema, ScheduledTaskPageSchema, ScheduledTaskMutationResponseSchema, ScheduledTaskInputSchema, DeleteScheduledTaskResponseSchema, SetScheduledTaskEnabledRequestSchema, AgentTaskPageSchema, UnsubscribeAgentTaskResponseSchema, AgentTaskSnapshotResponseSchema, AgentMcpServerPageSchema, AgentBackgroundTerminalPageSchema, TerminateAgentBackgroundTerminalResponseSchema, PinAgentTaskResponseSchema, PinAgentTaskRequestSchema, RenameAgentTaskResponseSchema, RenameAgentTaskRequestSchema, ArchiveAgentTaskResponseSchema, ArchiveAgentTaskRequestSchema, UnarchiveAgentTaskResponseSchema, UnarchiveAgentTaskRequestSchema, DeleteAgentTaskResponseSchema, DeleteAgentTaskRequestSchema, TaskSearchPageSchema, TaskSearchQuerySchema, SearchOccurrencesPageSchema, SearchOccurrencesQuerySchema, StartAgentTaskResponseSchema, StartAgentTaskRequestSchema, StartAgentTurnResponseSchema, StartAgentTurnRequestSchema, SteerAgentTurnResponseSchema, SteerAgentTurnRequestSchema, InterruptAgentTurnResponseSchema, InterruptAgentTurnRequestSchema, ResolvePendingRequestResponseSchema, ResolvePendingRequestRequestSchema, SubmitTaskRequestSchema, AsyncQuestionPageSchema, AnswerAsyncQuestionResponseSchema, AnswerAsyncQuestionRequestSchema, DismissAsyncQuestionsRequestSchema, ProjectTodoPageSchema, ProjectTodoResponseSchema, ProjectTodoDraftSchema, SaveProjectTodoRequestSchema, DeleteProjectTodoResponseSchema, DeleteProjectTodoRequestSchema, AgentQueuedSubmissionListSchema, 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, DeleteArchivedTasksResponseSchema, DeleteArchivedTasksRequestSchema, AgentTaskCatalogSchema, TaskCatalogQuerySchema, CompletedTasksPageSchema, CompletedTasksQuerySchema, UpdateTaskSettingsAndDefaultsResponseSchema, UpdateTaskSettingsAndDefaultsRequestSchema, NavigableAgentTaskResponseSchema, OpenAgentTaskAttachmentResponseSchema, OpenAgentTaskAttachmentRequestSchema, UpdateAgentGoalResponseSchema, UpdateAgentGoalRequestSchema, ClearAgentGoalResponseSchema, ProjectTodoSchema, AgentMessageAttachmentSchema, ProjectGitWorktreePageSchema, CreateProjectWorktreeResponseSchema, CreateProjectWorktreeRequestSchema, ProjectWorktreeMutationResponseSchema, SwitchProjectWorktreeRequestSchema, RenameProjectFileResponseSchema, RenameProjectFileRequestSchema, DeleteProjectFileResponseSchema, DeleteProjectFileRequestSchema, MAX_EVENT_BATCH_SIZE } from './chunk-ZXTTTT25.js';
|
|
6
6
|
import { __commonJS, __require, __toESM } from './chunk-K6J42667.js';
|
|
7
7
|
import { Buffer as Buffer$1 } from 'buffer';
|
|
8
8
|
import { randomBytes, createHash, timingSafeEqual, randomUUID } from 'crypto';
|
|
9
9
|
import { createWriteStream, constants, createReadStream } from 'fs';
|
|
10
|
-
import { mkdtemp, rm, realpath, lstat, stat, readFile, open,
|
|
10
|
+
import { mkdtemp, rm, realpath, lstat, stat, readFile, open, readdir, mkdir, access, writeFile, rename, unlink, link, rmdir, readlink } from 'fs/promises';
|
|
11
11
|
import { tmpdir, homedir } from 'os';
|
|
12
12
|
import { join, isAbsolute, dirname, resolve, relative, sep, basename, extname, normalize, win32, posix } from 'path';
|
|
13
13
|
import { Transform, Readable } from 'stream';
|
|
@@ -13180,49 +13180,49 @@ var require_fast_uri = __commonJS({
|
|
|
13180
13180
|
schemelessOptions.skipEscape = true;
|
|
13181
13181
|
return serialize(resolved, schemelessOptions);
|
|
13182
13182
|
}
|
|
13183
|
-
function resolveComponent(base,
|
|
13183
|
+
function resolveComponent(base, relative9, options, skipNormalization) {
|
|
13184
13184
|
const target = {};
|
|
13185
13185
|
if (!skipNormalization) {
|
|
13186
13186
|
base = parse2(serialize(base, options), options);
|
|
13187
|
-
|
|
13187
|
+
relative9 = parse2(serialize(relative9, options), options);
|
|
13188
13188
|
}
|
|
13189
13189
|
options = options || {};
|
|
13190
|
-
if (!options.tolerant &&
|
|
13191
|
-
target.scheme =
|
|
13192
|
-
target.userinfo =
|
|
13193
|
-
target.host =
|
|
13194
|
-
target.port =
|
|
13195
|
-
target.path = removeDotSegments(
|
|
13196
|
-
target.query =
|
|
13190
|
+
if (!options.tolerant && relative9.scheme) {
|
|
13191
|
+
target.scheme = relative9.scheme;
|
|
13192
|
+
target.userinfo = relative9.userinfo;
|
|
13193
|
+
target.host = relative9.host;
|
|
13194
|
+
target.port = relative9.port;
|
|
13195
|
+
target.path = removeDotSegments(relative9.path || "");
|
|
13196
|
+
target.query = relative9.query;
|
|
13197
13197
|
} else {
|
|
13198
|
-
if (
|
|
13199
|
-
target.userinfo =
|
|
13200
|
-
target.host =
|
|
13201
|
-
target.port =
|
|
13202
|
-
target.path = removeDotSegments(
|
|
13203
|
-
target.query =
|
|
13198
|
+
if (relative9.userinfo !== void 0 || relative9.host !== void 0 || relative9.port !== void 0) {
|
|
13199
|
+
target.userinfo = relative9.userinfo;
|
|
13200
|
+
target.host = relative9.host;
|
|
13201
|
+
target.port = relative9.port;
|
|
13202
|
+
target.path = removeDotSegments(relative9.path || "");
|
|
13203
|
+
target.query = relative9.query;
|
|
13204
13204
|
} else {
|
|
13205
|
-
if (!
|
|
13205
|
+
if (!relative9.path) {
|
|
13206
13206
|
target.path = base.path;
|
|
13207
|
-
if (
|
|
13208
|
-
target.query =
|
|
13207
|
+
if (relative9.query !== void 0) {
|
|
13208
|
+
target.query = relative9.query;
|
|
13209
13209
|
} else {
|
|
13210
13210
|
target.query = base.query;
|
|
13211
13211
|
}
|
|
13212
13212
|
} else {
|
|
13213
|
-
if (
|
|
13214
|
-
target.path = removeDotSegments(
|
|
13213
|
+
if (relative9.path[0] === "/") {
|
|
13214
|
+
target.path = removeDotSegments(relative9.path);
|
|
13215
13215
|
} else {
|
|
13216
13216
|
if ((base.userinfo !== void 0 || base.host !== void 0 || base.port !== void 0) && !base.path) {
|
|
13217
|
-
target.path = "/" +
|
|
13217
|
+
target.path = "/" + relative9.path;
|
|
13218
13218
|
} else if (!base.path) {
|
|
13219
|
-
target.path =
|
|
13219
|
+
target.path = relative9.path;
|
|
13220
13220
|
} else {
|
|
13221
|
-
target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) +
|
|
13221
|
+
target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) + relative9.path;
|
|
13222
13222
|
}
|
|
13223
13223
|
target.path = removeDotSegments(target.path);
|
|
13224
13224
|
}
|
|
13225
|
-
target.query =
|
|
13225
|
+
target.query = relative9.query;
|
|
13226
13226
|
}
|
|
13227
13227
|
target.userinfo = base.userinfo;
|
|
13228
13228
|
target.host = base.host;
|
|
@@ -13230,7 +13230,7 @@ var require_fast_uri = __commonJS({
|
|
|
13230
13230
|
}
|
|
13231
13231
|
target.scheme = base.scheme;
|
|
13232
13232
|
}
|
|
13233
|
-
target.fragment =
|
|
13233
|
+
target.fragment = relative9.fragment;
|
|
13234
13234
|
return target;
|
|
13235
13235
|
}
|
|
13236
13236
|
function equal(uriA, uriB, options) {
|
|
@@ -19715,49 +19715,49 @@ var require_fast_uri2 = __commonJS({
|
|
|
19715
19715
|
schemelessOptions.skipEscape = true;
|
|
19716
19716
|
return serialize(resolved, schemelessOptions);
|
|
19717
19717
|
}
|
|
19718
|
-
function resolveComponent(base,
|
|
19718
|
+
function resolveComponent(base, relative9, options, skipNormalization) {
|
|
19719
19719
|
const target = {};
|
|
19720
19720
|
if (!skipNormalization) {
|
|
19721
19721
|
base = parse2(serialize(base, options), options);
|
|
19722
|
-
|
|
19722
|
+
relative9 = parse2(serialize(relative9, options), options);
|
|
19723
19723
|
}
|
|
19724
19724
|
options = options || {};
|
|
19725
|
-
if (!options.tolerant &&
|
|
19726
|
-
target.scheme =
|
|
19727
|
-
target.userinfo =
|
|
19728
|
-
target.host =
|
|
19729
|
-
target.port =
|
|
19730
|
-
target.path = removeDotSegments(
|
|
19731
|
-
target.query =
|
|
19725
|
+
if (!options.tolerant && relative9.scheme) {
|
|
19726
|
+
target.scheme = relative9.scheme;
|
|
19727
|
+
target.userinfo = relative9.userinfo;
|
|
19728
|
+
target.host = relative9.host;
|
|
19729
|
+
target.port = relative9.port;
|
|
19730
|
+
target.path = removeDotSegments(relative9.path || "");
|
|
19731
|
+
target.query = relative9.query;
|
|
19732
19732
|
} else {
|
|
19733
|
-
if (
|
|
19734
|
-
target.userinfo =
|
|
19735
|
-
target.host =
|
|
19736
|
-
target.port =
|
|
19737
|
-
target.path = removeDotSegments(
|
|
19738
|
-
target.query =
|
|
19733
|
+
if (relative9.userinfo !== void 0 || relative9.host !== void 0 || relative9.port !== void 0) {
|
|
19734
|
+
target.userinfo = relative9.userinfo;
|
|
19735
|
+
target.host = relative9.host;
|
|
19736
|
+
target.port = relative9.port;
|
|
19737
|
+
target.path = removeDotSegments(relative9.path || "");
|
|
19738
|
+
target.query = relative9.query;
|
|
19739
19739
|
} else {
|
|
19740
|
-
if (!
|
|
19740
|
+
if (!relative9.path) {
|
|
19741
19741
|
target.path = base.path;
|
|
19742
|
-
if (
|
|
19743
|
-
target.query =
|
|
19742
|
+
if (relative9.query !== void 0) {
|
|
19743
|
+
target.query = relative9.query;
|
|
19744
19744
|
} else {
|
|
19745
19745
|
target.query = base.query;
|
|
19746
19746
|
}
|
|
19747
19747
|
} else {
|
|
19748
|
-
if (
|
|
19749
|
-
target.path = removeDotSegments(
|
|
19748
|
+
if (relative9.path[0] === "/") {
|
|
19749
|
+
target.path = removeDotSegments(relative9.path);
|
|
19750
19750
|
} else {
|
|
19751
19751
|
if ((base.userinfo !== void 0 || base.host !== void 0 || base.port !== void 0) && !base.path) {
|
|
19752
|
-
target.path = "/" +
|
|
19752
|
+
target.path = "/" + relative9.path;
|
|
19753
19753
|
} else if (!base.path) {
|
|
19754
|
-
target.path =
|
|
19754
|
+
target.path = relative9.path;
|
|
19755
19755
|
} else {
|
|
19756
|
-
target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) +
|
|
19756
|
+
target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) + relative9.path;
|
|
19757
19757
|
}
|
|
19758
19758
|
target.path = removeDotSegments(target.path);
|
|
19759
19759
|
}
|
|
19760
|
-
target.query =
|
|
19760
|
+
target.query = relative9.query;
|
|
19761
19761
|
}
|
|
19762
19762
|
target.userinfo = base.userinfo;
|
|
19763
19763
|
target.host = base.host;
|
|
@@ -19765,7 +19765,7 @@ var require_fast_uri2 = __commonJS({
|
|
|
19765
19765
|
}
|
|
19766
19766
|
target.scheme = base.scheme;
|
|
19767
19767
|
}
|
|
19768
|
-
target.fragment =
|
|
19768
|
+
target.fragment = relative9.fragment;
|
|
19769
19769
|
return target;
|
|
19770
19770
|
}
|
|
19771
19771
|
function equal(uriA, uriB, options) {
|
|
@@ -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:
|
|
36594
|
+
const { start, key, sep: sep8, value } = collItem;
|
|
36595
36595
|
const keyProps = resolveProps.resolveProps(start, {
|
|
36596
36596
|
indicator: "explicit-key-ind",
|
|
36597
|
-
next: key ??
|
|
36597
|
+
next: key ?? sep8?.[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 && !
|
|
36611
|
+
if (!keyProps.anchor && !keyProps.tag && !sep8) {
|
|
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(
|
|
36635
|
+
const valueProps = resolveProps.resolveProps(sep8 ?? [], {
|
|
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,
|
|
36651
|
+
const valueNode = value ? composeNode(ctx, value, valueProps, onError2) : composeEmptyNode(ctx, offset, sep8, 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
|
|
36740
|
+
let sep8 = "";
|
|
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 +=
|
|
36755
|
-
|
|
36754
|
+
comment += sep8 + cb;
|
|
36755
|
+
sep8 = "";
|
|
36756
36756
|
break;
|
|
36757
36757
|
}
|
|
36758
36758
|
case "newline":
|
|
36759
36759
|
if (comment)
|
|
36760
|
-
|
|
36760
|
+
sep8 += 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:
|
|
36802
|
+
const { start, key, sep: sep8, value } = collItem;
|
|
36803
36803
|
const props = resolveProps.resolveProps(start, {
|
|
36804
36804
|
flow: fcName,
|
|
36805
36805
|
indicator: "explicit-key-ind",
|
|
36806
|
-
next: key ??
|
|
36806
|
+
next: key ?? sep8?.[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 && !
|
|
36813
|
+
if (!props.anchor && !props.tag && !sep8 && !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 && !
|
|
36868
|
-
const valueNode = value ? composeNode(ctx, value, props, onError2) : composeEmptyNode(ctx, props.end,
|
|
36867
|
+
if (!isMap && !sep8 && !props.found) {
|
|
36868
|
+
const valueNode = value ? composeNode(ctx, value, props, onError2) : composeEmptyNode(ctx, props.end, sep8, 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(
|
|
36880
|
+
const valueProps = resolveProps.resolveProps(sep8 ?? [], {
|
|
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 (
|
|
36892
|
-
for (const st of
|
|
36891
|
+
if (sep8)
|
|
36892
|
+
for (const st of sep8) {
|
|
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,
|
|
36909
|
+
const valueNode = value ? composeNode(ctx, value, valueProps, onError2) : valueProps.found ? composeEmptyNode(ctx, valueProps.end, sep8, 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
|
|
37087
|
+
let sep8 = "";
|
|
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 +=
|
|
37105
|
-
|
|
37104
|
+
value += sep8 + indent.slice(trimIndent) + content;
|
|
37105
|
+
sep8 = "\n";
|
|
37106
37106
|
} else if (indent.length > trimIndent || content[0] === " ") {
|
|
37107
|
-
if (
|
|
37108
|
-
|
|
37109
|
-
else if (!prevMoreIndented &&
|
|
37110
|
-
|
|
37111
|
-
value +=
|
|
37112
|
-
|
|
37107
|
+
if (sep8 === " ")
|
|
37108
|
+
sep8 = "\n";
|
|
37109
|
+
else if (!prevMoreIndented && sep8 === "\n")
|
|
37110
|
+
sep8 = "\n\n";
|
|
37111
|
+
value += sep8 + indent.slice(trimIndent) + content;
|
|
37112
|
+
sep8 = "\n";
|
|
37113
37113
|
prevMoreIndented = true;
|
|
37114
37114
|
} else if (content === "") {
|
|
37115
|
-
if (
|
|
37115
|
+
if (sep8 === "\n")
|
|
37116
37116
|
value += "\n";
|
|
37117
37117
|
else
|
|
37118
|
-
|
|
37118
|
+
sep8 = "\n";
|
|
37119
37119
|
} else {
|
|
37120
|
-
value +=
|
|
37121
|
-
|
|
37120
|
+
value += sep8 + content;
|
|
37121
|
+
sep8 = " ";
|
|
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
|
|
37302
|
+
let sep8 = " ";
|
|
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 (
|
|
37308
|
-
res +=
|
|
37307
|
+
if (sep8 === "\n")
|
|
37308
|
+
res += sep8;
|
|
37309
37309
|
else
|
|
37310
|
-
|
|
37310
|
+
sep8 = "\n";
|
|
37311
37311
|
} else {
|
|
37312
|
-
res +=
|
|
37313
|
-
|
|
37312
|
+
res += sep8 + match[1];
|
|
37313
|
+
sep8 = " ";
|
|
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 +
|
|
37320
|
+
return res + sep8 + (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:
|
|
38123
|
+
function stringifyItem({ start, key, sep: sep8, 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 (
|
|
38130
|
-
for (const st of
|
|
38129
|
+
if (sep8)
|
|
38130
|
+
for (const st of sep8)
|
|
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
|
|
39292
|
+
let sep8;
|
|
39293
39293
|
if (scalar.end) {
|
|
39294
|
-
|
|
39295
|
-
|
|
39294
|
+
sep8 = scalar.end;
|
|
39295
|
+
sep8.push(this.sourceToken);
|
|
39296
39296
|
delete scalar.end;
|
|
39297
39297
|
} else
|
|
39298
|
-
|
|
39298
|
+
sep8 = [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:
|
|
39303
|
+
items: [{ start, key: scalar, sep: sep8 }]
|
|
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
|
|
39457
|
-
|
|
39456
|
+
const sep8 = it.sep;
|
|
39457
|
+
sep8.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:
|
|
39464
|
+
items: [{ start: start2, key, sep: sep8 }]
|
|
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
|
|
39659
|
-
|
|
39658
|
+
const sep8 = fc.end.splice(1, fc.end.length);
|
|
39659
|
+
sep8.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:
|
|
39664
|
+
items: [{ start, key: fc, sep: sep8 }]
|
|
39665
39665
|
};
|
|
39666
39666
|
this.onKeyLine = true;
|
|
39667
39667
|
this.stack[this.stack.length - 1] = map;
|
|
@@ -41495,7 +41495,7 @@ var require_parseParams = __commonJS({
|
|
|
41495
41495
|
// node_modules/.pnpm/@fastify+busboy@3.2.0/node_modules/@fastify/busboy/lib/utils/basename.js
|
|
41496
41496
|
var require_basename = __commonJS({
|
|
41497
41497
|
"node_modules/.pnpm/@fastify+busboy@3.2.0/node_modules/@fastify/busboy/lib/utils/basename.js"(exports, module) {
|
|
41498
|
-
module.exports = function
|
|
41498
|
+
module.exports = function basename8(path) {
|
|
41499
41499
|
if (typeof path !== "string") {
|
|
41500
41500
|
return "";
|
|
41501
41501
|
}
|
|
@@ -41521,7 +41521,7 @@ var require_multipart = __commonJS({
|
|
|
41521
41521
|
var Dicer = require_Dicer();
|
|
41522
41522
|
var parseParams = require_parseParams();
|
|
41523
41523
|
var decodeText = require_decodeText();
|
|
41524
|
-
var
|
|
41524
|
+
var basename8 = require_basename();
|
|
41525
41525
|
var getLimit = require_getLimit();
|
|
41526
41526
|
var RE_BOUNDARY = /^boundary$/i;
|
|
41527
41527
|
var RE_FIELD = /^form-data$/i;
|
|
@@ -41638,7 +41638,7 @@ var require_multipart = __commonJS({
|
|
|
41638
41638
|
} else if (RE_FILENAME.test(parsed[i2][0])) {
|
|
41639
41639
|
filename = parsed[i2][1];
|
|
41640
41640
|
if (!preservePath) {
|
|
41641
|
-
filename =
|
|
41641
|
+
filename = basename8(filename);
|
|
41642
41642
|
}
|
|
41643
41643
|
}
|
|
41644
41644
|
}
|
|
@@ -46561,7 +46561,7 @@ var require_parseTokenList = __commonJS({
|
|
|
46561
46561
|
// node_modules/.pnpm/depd@2.0.0/node_modules/depd/index.js
|
|
46562
46562
|
var require_depd = __commonJS({
|
|
46563
46563
|
"node_modules/.pnpm/depd@2.0.0/node_modules/depd/index.js"(exports, module) {
|
|
46564
|
-
var
|
|
46564
|
+
var relative9 = __require("path").relative;
|
|
46565
46565
|
module.exports = depd;
|
|
46566
46566
|
var basePath = process.cwd();
|
|
46567
46567
|
function containsNamespace(str, namespace) {
|
|
@@ -46753,7 +46753,7 @@ var require_depd = __commonJS({
|
|
|
46753
46753
|
return formatted;
|
|
46754
46754
|
}
|
|
46755
46755
|
function formatLocation(callSite) {
|
|
46756
|
-
return
|
|
46756
|
+
return relative9(basePath, callSite[0]) + ":" + callSite[1] + ":" + callSite[2];
|
|
46757
46757
|
}
|
|
46758
46758
|
function getStack() {
|
|
46759
46759
|
var limit = Error.stackTraceLimit;
|
|
@@ -47283,7 +47283,7 @@ var require_send = __commonJS({
|
|
|
47283
47283
|
var join12 = path.join;
|
|
47284
47284
|
var normalize2 = path.normalize;
|
|
47285
47285
|
var resolve8 = path.resolve;
|
|
47286
|
-
var
|
|
47286
|
+
var sep8 = path.sep;
|
|
47287
47287
|
var Readable4 = stream.Readable;
|
|
47288
47288
|
var BYTES_RANGE_REGEXP = /^ *bytes=/;
|
|
47289
47289
|
var MAX_MAXAGE = 60 * 60 * 24 * 365 * 1e3;
|
|
@@ -47360,20 +47360,20 @@ var require_send = __commonJS({
|
|
|
47360
47360
|
let parts;
|
|
47361
47361
|
if (root !== null) {
|
|
47362
47362
|
if (path2) {
|
|
47363
|
-
path2 = normalize2("." +
|
|
47363
|
+
path2 = normalize2("." + sep8 + path2);
|
|
47364
47364
|
}
|
|
47365
47365
|
if (UP_PATH_REGEXP.test(path2)) {
|
|
47366
47366
|
debug2('malicious path "%s"', path2);
|
|
47367
47367
|
return { statusCode: 403 };
|
|
47368
47368
|
}
|
|
47369
|
-
parts = path2.split(
|
|
47369
|
+
parts = path2.split(sep8);
|
|
47370
47370
|
path2 = normalize2(join12(root, path2));
|
|
47371
47371
|
} else {
|
|
47372
47372
|
if (UP_PATH_REGEXP.test(path2)) {
|
|
47373
47373
|
debug2('malicious path "%s"', path2);
|
|
47374
47374
|
return { statusCode: 403 };
|
|
47375
47375
|
}
|
|
47376
|
-
parts = normalize2(path2).split(
|
|
47376
|
+
parts = normalize2(path2).split(sep8);
|
|
47377
47377
|
path2 = resolve8(path2);
|
|
47378
47378
|
}
|
|
47379
47379
|
return { path: path2, parts };
|
|
@@ -47666,7 +47666,7 @@ var require_send = __commonJS({
|
|
|
47666
47666
|
}
|
|
47667
47667
|
async function sendFile(request2, path2, options) {
|
|
47668
47668
|
const { error, stat: stat6 } = await tryStat(path2);
|
|
47669
|
-
if (error && error.code === "ENOENT" && !extname3(path2) && path2[path2.length - 1] !==
|
|
47669
|
+
if (error && error.code === "ENOENT" && !extname3(path2) && path2[path2.length - 1] !== sep8) {
|
|
47670
47670
|
let err2 = error;
|
|
47671
47671
|
for (let i2 = 0; i2 < options.extensions.length; i2++) {
|
|
47672
47672
|
const extension = options.extensions[i2];
|
|
@@ -48404,7 +48404,7 @@ var require_static = __commonJS({
|
|
|
48404
48404
|
var path = __require("path");
|
|
48405
48405
|
var { fileURLToPath } = __require("url");
|
|
48406
48406
|
var { statSync } = __require("fs");
|
|
48407
|
-
var { basename:
|
|
48407
|
+
var { basename: basename8 } = __require("path");
|
|
48408
48408
|
var { glob } = require_index_min();
|
|
48409
48409
|
var fp = require_fastify_plugin();
|
|
48410
48410
|
var send = require_send2();
|
|
@@ -48429,7 +48429,7 @@ var require_static = __commonJS({
|
|
|
48429
48429
|
deflate: ".deflate"
|
|
48430
48430
|
};
|
|
48431
48431
|
function contentDisposition(filename) {
|
|
48432
|
-
return create(
|
|
48432
|
+
return create(basename8(filename));
|
|
48433
48433
|
}
|
|
48434
48434
|
async function fastifyStatic2(fastify, opts) {
|
|
48435
48435
|
const suppressWarning = opts.suppressWarning ?? false;
|
|
@@ -66470,6 +66470,31 @@ var ProjectDirectoryBrowserError = class extends Error {
|
|
|
66470
66470
|
}
|
|
66471
66471
|
reason;
|
|
66472
66472
|
};
|
|
66473
|
+
function isWithinRoot(root, path) {
|
|
66474
|
+
const relativePath = relative(root, path);
|
|
66475
|
+
return relativePath === "" || !relativePath.startsWith(`..${sep}`) && relativePath !== ".." && !isAbsolute(relativePath);
|
|
66476
|
+
}
|
|
66477
|
+
async function normalizeWorkspaceRoots(roots) {
|
|
66478
|
+
if (roots === void 0) return [];
|
|
66479
|
+
return Promise.all(
|
|
66480
|
+
roots.map(async (root) => {
|
|
66481
|
+
if (!isAbsolute(root)) {
|
|
66482
|
+
throw new ProjectDirectoryBrowserError(
|
|
66483
|
+
"Workspace root path must be absolute",
|
|
66484
|
+
"invalid-directory"
|
|
66485
|
+
);
|
|
66486
|
+
}
|
|
66487
|
+
const normalizedRoot = await realpath(root);
|
|
66488
|
+
if (!(await lstat(normalizedRoot)).isDirectory()) {
|
|
66489
|
+
throw new ProjectDirectoryBrowserError(
|
|
66490
|
+
"Workspace root path must identify a directory",
|
|
66491
|
+
"invalid-directory"
|
|
66492
|
+
);
|
|
66493
|
+
}
|
|
66494
|
+
return normalizedRoot;
|
|
66495
|
+
})
|
|
66496
|
+
);
|
|
66497
|
+
}
|
|
66473
66498
|
function toDirectoryError(error) {
|
|
66474
66499
|
const code = error.code;
|
|
66475
66500
|
const unavailable = code === "EACCES" || code === "EPERM";
|
|
@@ -66483,7 +66508,14 @@ function compareDirectories(left, right) {
|
|
|
66483
66508
|
return left.name.localeCompare(right.name, "en", { sensitivity: "base" }) || left.name.localeCompare(right.name, "en");
|
|
66484
66509
|
}
|
|
66485
66510
|
async function resolveProjectDirectory(requestedPath, options = {}) {
|
|
66486
|
-
|
|
66511
|
+
let workspaceRoots;
|
|
66512
|
+
try {
|
|
66513
|
+
workspaceRoots = await normalizeWorkspaceRoots(options.workspaceRoots);
|
|
66514
|
+
} catch (error) {
|
|
66515
|
+
if (error instanceof ProjectDirectoryBrowserError) throw error;
|
|
66516
|
+
throw toDirectoryError(error);
|
|
66517
|
+
}
|
|
66518
|
+
const path = requestedPath ?? workspaceRoots[0] ?? options.homePath ?? homedir();
|
|
66487
66519
|
if (!isAbsolute(path)) {
|
|
66488
66520
|
throw new ProjectDirectoryBrowserError(
|
|
66489
66521
|
"Project directory path must be absolute",
|
|
@@ -66498,6 +66530,12 @@ async function resolveProjectDirectory(requestedPath, options = {}) {
|
|
|
66498
66530
|
"invalid-directory"
|
|
66499
66531
|
);
|
|
66500
66532
|
}
|
|
66533
|
+
if (workspaceRoots.length > 0 && !workspaceRoots.some((root) => isWithinRoot(root, normalizedPath))) {
|
|
66534
|
+
throw new ProjectDirectoryBrowserError(
|
|
66535
|
+
"Project directory is outside the configured workspace roots",
|
|
66536
|
+
"invalid-directory"
|
|
66537
|
+
);
|
|
66538
|
+
}
|
|
66501
66539
|
return normalizedPath;
|
|
66502
66540
|
} catch (error) {
|
|
66503
66541
|
if (error instanceof ProjectDirectoryBrowserError) {
|
|
@@ -66507,10 +66545,11 @@ async function resolveProjectDirectory(requestedPath, options = {}) {
|
|
|
66507
66545
|
}
|
|
66508
66546
|
}
|
|
66509
66547
|
async function readProjectDirectory(requestedPath, options = {}) {
|
|
66510
|
-
const [path,
|
|
66548
|
+
const [path, workspaceRoots] = await Promise.all([
|
|
66511
66549
|
resolveProjectDirectory(requestedPath, options),
|
|
66512
|
-
(options.
|
|
66550
|
+
normalizeWorkspaceRoots(options.workspaceRoots)
|
|
66513
66551
|
]);
|
|
66552
|
+
const roots = workspaceRoots.length > 0 ? workspaceRoots.map((root) => ({ name: basename(root), path: root })) : await (options.filesystemRoots ?? listFilesystemRoots)();
|
|
66514
66553
|
let entries;
|
|
66515
66554
|
try {
|
|
66516
66555
|
const children = await readdir(path, { withFileTypes: true });
|
|
@@ -66525,7 +66564,7 @@ async function readProjectDirectory(requestedPath, options = {}) {
|
|
|
66525
66564
|
const parentPath = dirname(path);
|
|
66526
66565
|
return {
|
|
66527
66566
|
entries,
|
|
66528
|
-
parentPath: parentPath === path ? null : parentPath,
|
|
66567
|
+
parentPath: parentPath === path || workspaceRoots.some((root) => root === path) ? null : parentPath,
|
|
66529
66568
|
path,
|
|
66530
66569
|
roots
|
|
66531
66570
|
};
|
|
@@ -72961,6 +73000,9 @@ async function createCodexlyServer(options) {
|
|
|
72961
73000
|
const readImageFile = options.readProjectImageFile ?? readProjectImageFile;
|
|
72962
73001
|
const readSourceFile = options.readProjectSourceFile ?? readProjectSourceFile;
|
|
72963
73002
|
const projectOpenService = options.projectOpenService ?? createProjectOpenService();
|
|
73003
|
+
const workspaceBrowserOptions = options.workspaceRoots === void 0 ? {} : { workspaceRoots: options.workspaceRoots };
|
|
73004
|
+
const browseProjectDirectory = options.readProjectDirectory ?? ((path, browserOptions) => readProjectDirectory(path, { ...browserOptions, ...workspaceBrowserOptions }));
|
|
73005
|
+
const selectProjectDirectory = options.resolveProjectDirectory ?? ((path) => resolveProjectDirectory(path, workspaceBrowserOptions));
|
|
72964
73006
|
const skillMarketService = options.skillMarketService ?? createSkillMarketService({
|
|
72965
73007
|
catalog: createClawhubClient(),
|
|
72966
73008
|
projectOpenService,
|
|
@@ -73203,7 +73245,7 @@ async function createCodexlyServer(options) {
|
|
|
73203
73245
|
searchProjectFiles,
|
|
73204
73246
|
stopProjectFileSearch,
|
|
73205
73247
|
readHostFileDirectory: options.readHostFileDirectory ?? readHostFileDirectory,
|
|
73206
|
-
readProjectDirectory:
|
|
73248
|
+
readProjectDirectory: browseProjectDirectory,
|
|
73207
73249
|
readImageFile,
|
|
73208
73250
|
readInheritedTaskSettings,
|
|
73209
73251
|
readProjectGitHistory: options.readProjectGitHistory ?? readProjectGitHistory,
|
|
@@ -73215,7 +73257,7 @@ async function createCodexlyServer(options) {
|
|
|
73215
73257
|
releaseProjectContext,
|
|
73216
73258
|
resolveProviderTurnInput,
|
|
73217
73259
|
runIdempotent: idempotencyRunner.run,
|
|
73218
|
-
resolveProjectDirectory:
|
|
73260
|
+
resolveProjectDirectory: selectProjectDirectory,
|
|
73219
73261
|
resolveHostAttachment: options.resolveHostAttachment ?? resolveHostAttachment,
|
|
73220
73262
|
readScheduledTaskAttachment: async (projectId, attachmentId) => scheduledTaskAttachmentManager === void 0 ? void 0 : scheduledTaskAttachmentManager.read(projectId, attachmentId),
|
|
73221
73263
|
settingsRepository: options.settingsRepository,
|
|
@@ -12020,6 +12020,7 @@ var CodexProviderConnectionService = class {
|
|
|
12020
12020
|
try {
|
|
12021
12021
|
readProviderCapabilities(await this.#client.request("modelProvider/capabilities/read", {}));
|
|
12022
12022
|
if (apiKey !== void 0) {
|
|
12023
|
+
await this.#client.request("account/logout");
|
|
12023
12024
|
const loginResponse = await this.#client.request("account/login/start", {
|
|
12024
12025
|
apiKey,
|
|
12025
12026
|
type: "apiKey"
|
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-
|
|
3
|
+
import { createCodexlyServer, SqliteStateRepository, normalizeAllowedHost } from './chunk-HGSPZCBB.js';
|
|
4
4
|
import './chunk-6JWQNFM2.js';
|
|
5
|
-
import { startCodexAppServer, locateCodexBinary, createCodexRuntimeProvider, createCodexWorkbenchPetProvider, CodexProjectRepository, checkCodexVersion } from './chunk-
|
|
5
|
+
import { startCodexAppServer, locateCodexBinary, createCodexRuntimeProvider, createCodexWorkbenchPetProvider, CodexProjectRepository, checkCodexVersion } from './chunk-PRIMEL2G.js';
|
|
6
6
|
import './chunk-B2673ODM.js';
|
|
7
7
|
import { DEFAULT_COMMIT_MESSAGE_MODEL } from './chunk-ZXTTTT25.js';
|
|
8
8
|
import './chunk-GT7XTSEG.js';
|
|
@@ -22,7 +22,7 @@ createRequire(import.meta.url);
|
|
|
22
22
|
|
|
23
23
|
// package.json
|
|
24
24
|
var package_default = {
|
|
25
|
-
version: "0.
|
|
25
|
+
version: "0.23.0"};
|
|
26
26
|
var INSTALL_TIMEOUT_MS = 2 * 6e4;
|
|
27
27
|
function resolveNpmCommandInvocation(args, platform = process.platform, execPath = process.execPath, elevated = false) {
|
|
28
28
|
const invocation = platform === "win32" ? {
|
|
@@ -107,9 +107,7 @@ function runNpmWithRegistryFallback(runNpm, args, options = {}) {
|
|
|
107
107
|
`--registry=${registry}`,
|
|
108
108
|
`--@openai:registry=${registry}`,
|
|
109
109
|
`--@bryanhu:registry=${registry}`,
|
|
110
|
-
// 沿用用户的持久 npm cache
|
|
111
|
-
"--prefer-offline",
|
|
112
|
-
"--prefer-online=false",
|
|
110
|
+
// 沿用用户的持久 npm cache,并保留 npm 默认的过期元数据重新校验行为。
|
|
113
111
|
// 限制单源等待,避免 npm 默认重试退避延迟官方源兜底。
|
|
114
112
|
"--fetch-retries=0",
|
|
115
113
|
"--fetch-timeout=30000",
|
|
@@ -438,6 +436,8 @@ Start options:
|
|
|
438
436
|
--codex-bin <path> Use the Codex executable at the specified path.
|
|
439
437
|
--codex-home <path> Use a custom Codex home directory instead of CODEX_HOME
|
|
440
438
|
or the default ~/.codex directory.
|
|
439
|
+
--workspace <path> Restrict project selection to an absolute workspace root.
|
|
440
|
+
May be repeated for multiple roots.
|
|
441
441
|
|
|
442
442
|
Doctor options:
|
|
443
443
|
--codex-bin <path> Check the Codex executable at the specified path.
|
|
@@ -452,6 +452,7 @@ Examples:
|
|
|
452
452
|
codexly start --lan --lan-password 'Strong-Lan_Pass9!'
|
|
453
453
|
codexly start --allowed-host code.example.com
|
|
454
454
|
codexly start --lan --session-ttl 12h
|
|
455
|
+
codexly start --workspace /workspace
|
|
455
456
|
codexly doctor --codex-bin /path/to/codex
|
|
456
457
|
codexly version
|
|
457
458
|
|
|
@@ -465,7 +466,7 @@ function parseCommandOptions(args, valueOptions, flagOptions = /* @__PURE__ */ n
|
|
|
465
466
|
if (!option || !valueOptions.has(option) && !flagOptions.has(option)) {
|
|
466
467
|
throw new Error(`\u672A\u77E5\u9009\u9879: ${option ?? "<empty>"}`);
|
|
467
468
|
}
|
|
468
|
-
const repeatable = option === "--allowed-host";
|
|
469
|
+
const repeatable = option === "--allowed-host" || option === "--workspace";
|
|
469
470
|
if (seen.has(option) && !repeatable) {
|
|
470
471
|
throw new Error(`\u9009\u9879\u91CD\u590D: ${option}`);
|
|
471
472
|
}
|
|
@@ -488,6 +489,8 @@ function parseCommandOptions(args, valueOptions, flagOptions = /* @__PURE__ */ n
|
|
|
488
489
|
parsed.lanPassword = value;
|
|
489
490
|
} else if (option === "--allowed-host") {
|
|
490
491
|
parsed.allowedHosts = [...parsed.allowedHosts ?? [], value];
|
|
492
|
+
} else if (option === "--workspace") {
|
|
493
|
+
parsed.workspaceRoots = [...parsed.workspaceRoots ?? [], value];
|
|
491
494
|
} else if (option === "--port") {
|
|
492
495
|
if (!/^\d+$/u.test(value)) {
|
|
493
496
|
throw new Error("--port \u5FC5\u987B\u662F 1 \u5230 65535 \u4E4B\u95F4\u7684\u6574\u6570");
|
|
@@ -504,6 +507,24 @@ function parseCommandOptions(args, valueOptions, flagOptions = /* @__PURE__ */ n
|
|
|
504
507
|
}
|
|
505
508
|
return parsed;
|
|
506
509
|
}
|
|
510
|
+
function applyStartEnvironmentDefaults(options, environment) {
|
|
511
|
+
const environmentArgs = [];
|
|
512
|
+
const append = (option, value) => {
|
|
513
|
+
if (value !== void 0 && value.trim() !== "") environmentArgs.push(option, value.trim());
|
|
514
|
+
};
|
|
515
|
+
append("--lan-password", environment["CODEXLY_LAN_PASSWORD"]);
|
|
516
|
+
append("--port", environment["CODEXLY_PORT"]);
|
|
517
|
+
append("--session-ttl", environment["CODEXLY_SESSION_TTL"]);
|
|
518
|
+
append("--workspace", environment["CODEXLY_WORKSPACE"]);
|
|
519
|
+
for (const host of environment["CODEXLY_ALLOWED_HOSTS"]?.split(",") ?? []) {
|
|
520
|
+
append("--allowed-host", host);
|
|
521
|
+
}
|
|
522
|
+
const defaults = parseCommandOptions(
|
|
523
|
+
environmentArgs,
|
|
524
|
+
/* @__PURE__ */ new Set(["--allowed-host", "--lan-password", "--port", "--session-ttl", "--workspace"])
|
|
525
|
+
);
|
|
526
|
+
return { ...defaults, ...options };
|
|
527
|
+
}
|
|
507
528
|
|
|
508
529
|
// src/cli-shutdown.ts
|
|
509
530
|
function createProcessShutdownSignal() {
|
|
@@ -922,17 +943,21 @@ async function runDoctor(args, dependencies, output) {
|
|
|
922
943
|
return 0;
|
|
923
944
|
}
|
|
924
945
|
async function runStart(args, dependencies, signal, output) {
|
|
925
|
-
const options =
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
946
|
+
const options = applyStartEnvironmentDefaults(
|
|
947
|
+
parseCommandOptions(
|
|
948
|
+
args,
|
|
949
|
+
/* @__PURE__ */ new Set([
|
|
950
|
+
"--allowed-host",
|
|
951
|
+
"--codex-bin",
|
|
952
|
+
"--codex-home",
|
|
953
|
+
"--lan-password",
|
|
954
|
+
"--port",
|
|
955
|
+
"--session-ttl",
|
|
956
|
+
"--workspace"
|
|
957
|
+
]),
|
|
958
|
+
/* @__PURE__ */ new Set(["--lan"])
|
|
959
|
+
),
|
|
960
|
+
process.env
|
|
936
961
|
);
|
|
937
962
|
if (options.sessionTtl !== void 0 && options.lan !== true) {
|
|
938
963
|
throw new Error("--session-ttl \u53EA\u80FD\u4E0E --lan \u4E00\u8D77\u4F7F\u7528");
|
|
@@ -1038,8 +1063,9 @@ async function runStart(args, dependencies, signal, output) {
|
|
|
1038
1063
|
projectTodoRepository: stateRepository,
|
|
1039
1064
|
settingsRepository: stateRepository,
|
|
1040
1065
|
staticRoot: dependencies.webRoot,
|
|
1041
|
-
//
|
|
1042
|
-
standaloneCwd: process.cwd()
|
|
1066
|
+
// 受限部署让临时任务继承首个工作区,避免绕过项目目录边界。
|
|
1067
|
+
standaloneCwd: options.workspaceRoots?.[0] ?? process.cwd(),
|
|
1068
|
+
...options.workspaceRoots === void 0 ? {} : { workspaceRoots: options.workspaceRoots }
|
|
1043
1069
|
});
|
|
1044
1070
|
const host = options.lan === true ? "0.0.0.0" : "127.0.0.1";
|
|
1045
1071
|
const activePort = await listenOnAvailablePort(server, host, port);
|
|
@@ -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, SUPPORTED_CODEX_VERSION_RANGE, checkCodexVersion, createCodexRuntimeProvider, createCodexWorkbenchPetProvider, locateCodexBinary, startCodexAppServer } from '../../chunk-
|
|
2
|
+
export { CodexAppServerExitedError, CodexAppServerProcess, CodexAppServerShutdownError, CodexAppServerSpawnError, CodexProjectRepository, CodexProtocolMappingError, CodexProviderConnectionError, CodexProviderConnectionService, CodexRuntimeProvider, CodexWorkbenchPetProvider, JsonlRpcClient, RpcConnectionClosedError, RpcProtocolError, RpcResponseError, RpcTimeoutError, SUPPORTED_CODEX_VERSION, SUPPORTED_CODEX_VERSION_RANGE, checkCodexVersion, createCodexRuntimeProvider, createCodexWorkbenchPetProvider, locateCodexBinary, startCodexAppServer } from '../../chunk-PRIMEL2G.js';
|
|
3
3
|
import '../../chunk-B2673ODM.js';
|
|
4
4
|
import '../../chunk-ZXTTTT25.js';
|
|
5
5
|
import '../../chunk-GT7XTSEG.js';
|
package/dist/server/index.js
CHANGED
|
@@ -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-
|
|
2
|
+
export { AccessSessionService, AgentEventStream, GitCommitError, GitCommitReviewError, SqliteStateRepository, commitSelectedProjectChanges, createCodexlyServer, normalizeAllowedHost, readProjectGitCommitFileDiff, readProjectGitCommitFiles } from '../chunk-HGSPZCBB.js';
|
|
3
3
|
import '../chunk-6JWQNFM2.js';
|
|
4
|
-
import '../chunk-
|
|
4
|
+
import '../chunk-PRIMEL2G.js';
|
|
5
5
|
import '../chunk-B2673ODM.js';
|
|
6
6
|
import '../chunk-ZXTTTT25.js';
|
|
7
7
|
import '../chunk-GT7XTSEG.js';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bryanhu/codexly",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.23.0",
|
|
4
4
|
"description": "通过 Web 操作本地 Coding Agent 的应用",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": "BryanHu",
|
|
@@ -66,6 +66,8 @@
|
|
|
66
66
|
"codex:schema:check": "node ./tools/verify-codex-schema.mjs",
|
|
67
67
|
"codex:schema:update": "node ./tools/verify-codex-schema.mjs --update",
|
|
68
68
|
"dev": "pnpm --filter @codexly/web dev",
|
|
69
|
+
"docker:build": "docker build --tag codexly:local .",
|
|
70
|
+
"docker:test": "node ./tools/test-docker-image.mjs",
|
|
69
71
|
"format": "prettier --write .",
|
|
70
72
|
"format:check": "prettier --check .",
|
|
71
73
|
"lint": "oxlint . --max-warnings 0 --report-unused-disable-directives",
|