@shepai/cli 1.153.0 → 1.154.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/apis/json-schema/AgentType.yaml +1 -0
- package/dist/packages/core/src/domain/generated/output.d.ts +1 -0
- package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
- package/dist/packages/core/src/domain/generated/output.js +1 -0
- package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +4 -0
- package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-factory.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-factory.service.js +22 -0
- package/dist/packages/core/src/infrastructure/services/agents/common/agent-validator.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/common/agent-validator.service.js +1 -0
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/codex-cli-executor.service.d.ts +65 -0
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/codex-cli-executor.service.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/codex-cli-executor.service.js +655 -0
- package/dist/packages/core/src/infrastructure/services/agents/sessions/codex-cli-session.repository.d.ts +62 -0
- package/dist/packages/core/src/infrastructure/services/agents/sessions/codex-cli-session.repository.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/agents/sessions/codex-cli-session.repository.js +353 -0
- package/dist/src/presentation/tui/prompts/agent-select.prompt.d.ts +6 -2
- package/dist/src/presentation/tui/prompts/agent-select.prompt.d.ts.map +1 -1
- package/dist/src/presentation/tui/prompts/agent-select.prompt.js +7 -2
- package/dist/src/presentation/web/app/actions/get-all-agent-models.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/get-all-agent-models.js +4 -2
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/event-log-viewer.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/event-log-viewer.js +26 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/event-log-viewer.stories.d.ts +2 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/event-log-viewer.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/event-log-viewer.stories.js +21 -0
- package/dist/src/presentation/web/components/common/feature-node/agent-type-icons.d.ts +1 -1
- package/dist/src/presentation/web/components/common/feature-node/agent-type-icons.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/agent-type-icons.js +2 -0
- package/dist/src/presentation/web/components/common/feature-node/agent-type-icons.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/agent-type-icons.stories.js +1 -0
- package/dist/src/presentation/web/components/features/settings/AgentModelPicker/AgentModelPicker.stories.d.ts +1 -0
- package/dist/src/presentation/web/components/features/settings/AgentModelPicker/AgentModelPicker.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/AgentModelPicker/AgentModelPicker.stories.js +7 -0
- package/dist/src/presentation/web/components/features/settings/agent-settings-section.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/agent-settings-section.js +1 -0
- package/dist/src/presentation/web/components/features/settings/agent-settings-section.stories.d.ts +1 -0
- package/dist/src/presentation/web/components/features/settings/agent-settings-section.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/agent-settings-section.stories.js +8 -0
- package/dist/src/presentation/web/lib/parse-log-line.d.ts +1 -1
- package/dist/src/presentation/web/lib/parse-log-line.d.ts.map +1 -1
- package/dist/src/presentation/web/lib/parse-log-line.js +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +2 -2
- package/web/.next/required-server-files.json +2 -2
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +26 -26
- package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +29 -29
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +36 -36
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +26 -26
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +26 -26
- package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +29 -29
- package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +36 -36
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +26 -26
- package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +26 -26
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +5 -5
- package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
- package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
- package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
- package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
- package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
- package/web/.next/server/app/settings/page.js.nft.json +1 -1
- package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/server-reference-manifest.json +10 -10
- package/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/server-reference-manifest.json +10 -10
- package/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/server-reference-manifest.json +5 -5
- package/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__beda892a._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__beda892a._.js.map +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +3 -3
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0b150ddf._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__17ed7ed1._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__17ed7ed1._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__28d0d265._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__28d0d265._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__42bf1807._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__42bf1807._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__56b70465._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__56b70465._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__88f7e8e6._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__88f7e8e6._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8b0aac03._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8b0aac03._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c30f1f82._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c30f1f82._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f80bfc75._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f80bfc75._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f8dd4422._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f8dd4422._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
- package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
- package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_75a563a9._.js → _27154347._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_75a563a9._.js.map → _27154347._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_3a0b989f._.js +2 -2
- package/web/.next/server/chunks/ssr/_3a0b989f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_65e76c9a._.js → _4af8a3cb._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_65e76c9a._.js.map → _4af8a3cb._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
- package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_5f69c13f._.js +1 -1
- package/web/.next/server/chunks/ssr/_5f69c13f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_7c5b97c6._.js +1 -1
- package/web/.next/server/chunks/ssr/_7c5b97c6._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_82c57f10._.js +1 -1
- package/web/.next/server/chunks/ssr/_82c57f10._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_9495d50b._.js +1 -1
- package/web/.next/server/chunks/ssr/_9495d50b._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_a0e3f7e4._.js +1 -1
- package/web/.next/server/chunks/ssr/_a0e3f7e4._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_d9337063._.js → _a0e4c32f._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_d9337063._.js.map → _a0e4c32f._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_ac4a3873._.js +1 -1
- package/web/.next/server/chunks/ssr/_ca0aa7f0._.js +1 -1
- package/web/.next/server/chunks/ssr/_ca0aa7f0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_cb5a021e._.js +1 -1
- package/web/.next/server/chunks/ssr/_cb5a021e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_d86175ae._.js +1 -1
- package/web/.next/server/chunks/ssr/_d86175ae._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_d8bedf13._.js +1 -1
- package/web/.next/server/chunks/ssr/_d8bedf13._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_fa7efce3._.js +2 -2
- package/web/.next/server/chunks/ssr/_fa7efce3._.js.map +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_cdc632e3.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_cdc632e3.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_39ca0924.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_39ca0924.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_357e3eb0._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_357e3eb0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
- package/web/.next/server/pages/500.html +2 -2
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +45 -45
- package/web/.next/static/chunks/{9c45b599460d0f60.js → 0e258f8cce588570.js} +1 -1
- package/web/.next/static/chunks/2eb2e32a6181e9ed.js +1 -0
- package/web/.next/static/chunks/502fd2cb6c8beb89.js +1 -0
- package/web/.next/static/chunks/8590bd2e69b24b9e.css +1 -0
- package/web/.next/static/chunks/{2a54cf0384becb8f.js → 9545412c334d71c5.js} +1 -1
- package/web/.next/static/chunks/a18fcdf7dd4055a5.js +5 -0
- package/web/.next/static/chunks/ae61d24b1bcc8cf7.js +3 -0
- package/web/.next/static/chunks/{34417fd25d41b914.js → b5bf0ff0a2bc910a.js} +1 -1
- package/web/.next/static/chunks/{634f6f485b81464a.js → be495f0642b9f423.js} +1 -1
- package/web/.next/static/chunks/{11074feeacea0319.js → e0104cdb4b857e49.js} +1 -1
- package/web/.next/static/chunks/{51df7b00bbb7d365.js → e333a91862ff2423.js} +1 -1
- package/web/.next/static/chunks/e9cce6c925c64f10.js +1 -0
- package/web/.next/static/chunks/{a0101660264c178b.js → f10c138c3fae4680.js} +2 -2
- package/web/public/icons/agents/openai.svg +3 -0
- package/web/.next/static/chunks/18abd4f8b9c216a3.js +0 -1
- package/web/.next/static/chunks/58adaad3bab50e74.js +0 -3
- package/web/.next/static/chunks/8bbc916241b4c141.js +0 -1
- package/web/.next/static/chunks/b70bc188ac05a8be.js +0 -5
- package/web/.next/static/chunks/c86594475dcb03d5.css +0 -1
- package/web/.next/static/chunks/ebdef1415f61f021.js +0 -1
- /package/web/.next/static/{zY7W9Btxu_CXSFrwelXeS → 9ZnNgGSTMM2ACNp4ImvQo}/_buildManifest.js +0 -0
- /package/web/.next/static/{zY7W9Btxu_CXSFrwelXeS → 9ZnNgGSTMM2ACNp4ImvQo}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{zY7W9Btxu_CXSFrwelXeS → 9ZnNgGSTMM2ACNp4ImvQo}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex CLI Session Repository
|
|
3
|
+
*
|
|
4
|
+
* Infrastructure implementation of IAgentSessionRepository for OpenAI Codex CLI.
|
|
5
|
+
* Reads JSONL session rollout files from `$CODEX_HOME/sessions/` (or `~/.codex/sessions/`
|
|
6
|
+
* when CODEX_HOME is not set) and the session index from `$CODEX_HOME/session_index.jsonl`.
|
|
7
|
+
*
|
|
8
|
+
* Directory structure:
|
|
9
|
+
* $CODEX_HOME/session_index.jsonl — one JSON object per line with {id, thread_name, updated_at}
|
|
10
|
+
* $CODEX_HOME/sessions/YYYY/MM/DD/rollout-<timestamp>-<session-id>.jsonl
|
|
11
|
+
*
|
|
12
|
+
* Rollout file events:
|
|
13
|
+
* - session_meta: session metadata (id, cwd, cli_version, model_provider)
|
|
14
|
+
* - event_msg: lifecycle events (task_started, etc.)
|
|
15
|
+
* - response_item: messages (role: user/assistant/developer), function_call, function_call_output
|
|
16
|
+
* - turn_context: per-turn context (cwd, model, sandbox_policy)
|
|
17
|
+
*/
|
|
18
|
+
import type { AgentSession } from '../../../../domain/generated/output.js';
|
|
19
|
+
import type { IAgentSessionRepository, ListSessionsOptions, GetSessionOptions } from '../../../../application/ports/output/agents/agent-session-repository.interface.js';
|
|
20
|
+
export declare class CodexCliSessionRepository implements IAgentSessionRepository {
|
|
21
|
+
private readonly basePath;
|
|
22
|
+
constructor(basePath?: string);
|
|
23
|
+
/**
|
|
24
|
+
* Resolve the Codex home directory.
|
|
25
|
+
* Uses CODEX_HOME env var if set, otherwise defaults to ~/.codex
|
|
26
|
+
*/
|
|
27
|
+
static resolveCodexHome(): string;
|
|
28
|
+
isSupported(): boolean;
|
|
29
|
+
list(options?: ListSessionsOptions): Promise<AgentSession[]>;
|
|
30
|
+
findById(id: string, options?: GetSessionOptions): Promise<AgentSession | null>;
|
|
31
|
+
/** Read and parse the session_index.jsonl file */
|
|
32
|
+
private readSessionIndex;
|
|
33
|
+
/** Convert a session index entry to a lightweight AgentSession */
|
|
34
|
+
private indexEntryToSession;
|
|
35
|
+
/**
|
|
36
|
+
* Recursively collect all rollout .jsonl files from the sessions/ directory.
|
|
37
|
+
* Structure: sessions/YYYY/MM/DD/rollout-<timestamp>-<id>.jsonl
|
|
38
|
+
*/
|
|
39
|
+
private collectSessionFiles;
|
|
40
|
+
/** Recursively walk a directory tree collecting .jsonl rollout files */
|
|
41
|
+
private walkDirectory;
|
|
42
|
+
/**
|
|
43
|
+
* Extract session ID from a rollout filename.
|
|
44
|
+
* Format: rollout-YYYY-MM-DDTHH-MM-SS-<session-id>.jsonl
|
|
45
|
+
* The session ID is the UUID portion after the timestamp.
|
|
46
|
+
*/
|
|
47
|
+
private extractSessionIdFromFilename;
|
|
48
|
+
/**
|
|
49
|
+
* Find a session rollout file by ID.
|
|
50
|
+
* Scans the sessions/ directory recursively for a file containing the given ID.
|
|
51
|
+
*/
|
|
52
|
+
private findSessionFile;
|
|
53
|
+
/**
|
|
54
|
+
* Parse a Codex CLI rollout JSONL file into an AgentSession.
|
|
55
|
+
*/
|
|
56
|
+
private parseRolloutFile;
|
|
57
|
+
/** Extract text from Codex content blocks */
|
|
58
|
+
private extractTextFromContent;
|
|
59
|
+
/** Replace home directory prefix with ~ */
|
|
60
|
+
private abbreviatePath;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=codex-cli-session.repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-cli-session.repository.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/sessions/codex-cli-session.repository.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH,OAAO,KAAK,EACV,YAAY,EAGb,MAAM,wCAAwC,CAAC;AAChD,OAAO,KAAK,EACV,uBAAuB,EACvB,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,mFAAmF,CAAC;AA0C3F,qBACa,yBAA0B,YAAW,uBAAuB;IAC3D,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,GAAE,MAAqD;IAE5F;;;OAGG;IACH,MAAM,CAAC,gBAAgB,IAAI,MAAM;IAIjC,WAAW,IAAI,OAAO;IAIhB,IAAI,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA8C5D,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAmBrF,kDAAkD;YACpC,gBAAgB;IAoB9B,kEAAkE;IAClE,OAAO,CAAC,mBAAmB;IAa3B;;;OAGG;YACW,mBAAmB;IAajC,wEAAwE;YAC1D,aAAa;IAsC3B;;;;OAIG;IACH,OAAO,CAAC,4BAA4B;IASpC;;;OAGG;YACW,eAAe;IAqB7B;;OAEG;YACW,gBAAgB;IA8H9B,6CAA6C;IAC7C,OAAO,CAAC,sBAAsB;IAW9B,2CAA2C;IAC3C,OAAO,CAAC,cAAc;CAQvB"}
|
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex CLI Session Repository
|
|
3
|
+
*
|
|
4
|
+
* Infrastructure implementation of IAgentSessionRepository for OpenAI Codex CLI.
|
|
5
|
+
* Reads JSONL session rollout files from `$CODEX_HOME/sessions/` (or `~/.codex/sessions/`
|
|
6
|
+
* when CODEX_HOME is not set) and the session index from `$CODEX_HOME/session_index.jsonl`.
|
|
7
|
+
*
|
|
8
|
+
* Directory structure:
|
|
9
|
+
* $CODEX_HOME/session_index.jsonl — one JSON object per line with {id, thread_name, updated_at}
|
|
10
|
+
* $CODEX_HOME/sessions/YYYY/MM/DD/rollout-<timestamp>-<session-id>.jsonl
|
|
11
|
+
*
|
|
12
|
+
* Rollout file events:
|
|
13
|
+
* - session_meta: session metadata (id, cwd, cli_version, model_provider)
|
|
14
|
+
* - event_msg: lifecycle events (task_started, etc.)
|
|
15
|
+
* - response_item: messages (role: user/assistant/developer), function_call, function_call_output
|
|
16
|
+
* - turn_context: per-turn context (cwd, model, sandbox_policy)
|
|
17
|
+
*/
|
|
18
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
+
};
|
|
24
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
25
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
26
|
+
};
|
|
27
|
+
var CodexCliSessionRepository_1;
|
|
28
|
+
import * as fs from 'node:fs/promises';
|
|
29
|
+
import * as os from 'node:os';
|
|
30
|
+
import * as path from 'node:path';
|
|
31
|
+
import { injectable } from 'tsyringe';
|
|
32
|
+
let CodexCliSessionRepository = CodexCliSessionRepository_1 = class CodexCliSessionRepository {
|
|
33
|
+
basePath;
|
|
34
|
+
constructor(basePath = CodexCliSessionRepository_1.resolveCodexHome()) {
|
|
35
|
+
this.basePath = basePath;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Resolve the Codex home directory.
|
|
39
|
+
* Uses CODEX_HOME env var if set, otherwise defaults to ~/.codex
|
|
40
|
+
*/
|
|
41
|
+
static resolveCodexHome() {
|
|
42
|
+
return process.env.CODEX_HOME ?? path.join(os.homedir(), '.codex');
|
|
43
|
+
}
|
|
44
|
+
isSupported() {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
async list(options) {
|
|
48
|
+
const limit = options?.limit ?? 20;
|
|
49
|
+
// First try the session index for fast listing
|
|
50
|
+
const indexEntries = await this.readSessionIndex();
|
|
51
|
+
if (indexEntries.length > 0) {
|
|
52
|
+
// Deduplicate: keep the latest entry per session ID
|
|
53
|
+
const latestById = new Map();
|
|
54
|
+
for (const entry of indexEntries) {
|
|
55
|
+
latestById.set(entry.id, entry);
|
|
56
|
+
}
|
|
57
|
+
// Sort by updated_at descending
|
|
58
|
+
const sorted = [...latestById.values()].sort((a, b) => {
|
|
59
|
+
const aTime = a.updated_at ? new Date(a.updated_at).getTime() : 0;
|
|
60
|
+
const bTime = b.updated_at ? new Date(b.updated_at).getTime() : 0;
|
|
61
|
+
return bTime - aTime;
|
|
62
|
+
});
|
|
63
|
+
const toReturn = limit > 0 ? sorted.slice(0, limit) : sorted;
|
|
64
|
+
// Build lightweight sessions from index (no need to parse full rollout files)
|
|
65
|
+
return toReturn.map((entry) => this.indexEntryToSession(entry));
|
|
66
|
+
}
|
|
67
|
+
// Fallback: scan rollout files directly
|
|
68
|
+
const fileInfos = await this.collectSessionFiles();
|
|
69
|
+
fileInfos.sort((a, b) => b.mtime.getTime() - a.mtime.getTime());
|
|
70
|
+
const toParse = limit > 0 ? fileInfos.slice(0, limit) : fileInfos;
|
|
71
|
+
const parseResults = await Promise.allSettled(toParse.map((fi) => this.parseRolloutFile(fi, { includeMessages: false })));
|
|
72
|
+
const sessions = [];
|
|
73
|
+
for (const result of parseResults) {
|
|
74
|
+
if (result.status === 'fulfilled' && result.value !== null) {
|
|
75
|
+
sessions.push(result.value);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return sessions;
|
|
79
|
+
}
|
|
80
|
+
async findById(id, options) {
|
|
81
|
+
const messageLimit = options?.messageLimit ?? 20;
|
|
82
|
+
const match = await this.findSessionFile(id);
|
|
83
|
+
if (match === null)
|
|
84
|
+
return null;
|
|
85
|
+
try {
|
|
86
|
+
const stat = await fs.stat(match.filePath);
|
|
87
|
+
const fileInfo = {
|
|
88
|
+
id: match.resolvedId,
|
|
89
|
+
filePath: match.filePath,
|
|
90
|
+
mtime: stat.mtime,
|
|
91
|
+
};
|
|
92
|
+
return await this.parseRolloutFile(fileInfo, { includeMessages: true, messageLimit });
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/** Read and parse the session_index.jsonl file */
|
|
99
|
+
async readSessionIndex() {
|
|
100
|
+
const indexPath = path.join(this.basePath, 'session_index.jsonl');
|
|
101
|
+
try {
|
|
102
|
+
const content = await fs.readFile(indexPath, 'utf-8');
|
|
103
|
+
const entries = [];
|
|
104
|
+
for (const line of content.split('\n')) {
|
|
105
|
+
const trimmed = line.trim();
|
|
106
|
+
if (!trimmed)
|
|
107
|
+
continue;
|
|
108
|
+
try {
|
|
109
|
+
entries.push(JSON.parse(trimmed));
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// Skip malformed lines
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return entries;
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return [];
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/** Convert a session index entry to a lightweight AgentSession */
|
|
122
|
+
indexEntryToSession(entry) {
|
|
123
|
+
const updatedAt = entry.updated_at ? new Date(entry.updated_at) : new Date();
|
|
124
|
+
return {
|
|
125
|
+
id: entry.id,
|
|
126
|
+
agentType: 'codex-cli',
|
|
127
|
+
projectPath: '',
|
|
128
|
+
messageCount: 0,
|
|
129
|
+
createdAt: updatedAt,
|
|
130
|
+
updatedAt,
|
|
131
|
+
preview: entry.thread_name,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Recursively collect all rollout .jsonl files from the sessions/ directory.
|
|
136
|
+
* Structure: sessions/YYYY/MM/DD/rollout-<timestamp>-<id>.jsonl
|
|
137
|
+
*/
|
|
138
|
+
async collectSessionFiles() {
|
|
139
|
+
const sessionsDir = path.join(this.basePath, 'sessions');
|
|
140
|
+
const fileInfos = [];
|
|
141
|
+
try {
|
|
142
|
+
await this.walkDirectory(sessionsDir, fileInfos);
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
// sessions directory doesn't exist
|
|
146
|
+
}
|
|
147
|
+
return fileInfos;
|
|
148
|
+
}
|
|
149
|
+
/** Recursively walk a directory tree collecting .jsonl rollout files */
|
|
150
|
+
async walkDirectory(dir, results) {
|
|
151
|
+
let entries;
|
|
152
|
+
try {
|
|
153
|
+
entries = await fs.readdir(dir, { withFileTypes: true, encoding: 'utf-8' });
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
const promises = [];
|
|
159
|
+
for (const entry of entries) {
|
|
160
|
+
const fullPath = path.join(dir, entry.name);
|
|
161
|
+
if (entry.isDirectory()) {
|
|
162
|
+
promises.push(this.walkDirectory(fullPath, results));
|
|
163
|
+
}
|
|
164
|
+
else if (entry.isFile() &&
|
|
165
|
+
entry.name.endsWith('.jsonl') &&
|
|
166
|
+
entry.name.startsWith('rollout-')) {
|
|
167
|
+
promises.push(fs
|
|
168
|
+
.stat(fullPath)
|
|
169
|
+
.then((stat) => {
|
|
170
|
+
const sessionId = this.extractSessionIdFromFilename(entry.name);
|
|
171
|
+
if (sessionId) {
|
|
172
|
+
results.push({ id: sessionId, filePath: fullPath, mtime: stat.mtime });
|
|
173
|
+
}
|
|
174
|
+
})
|
|
175
|
+
.catch(() => {
|
|
176
|
+
// Skip files we can't stat
|
|
177
|
+
}));
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
await Promise.allSettled(promises);
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Extract session ID from a rollout filename.
|
|
184
|
+
* Format: rollout-YYYY-MM-DDTHH-MM-SS-<session-id>.jsonl
|
|
185
|
+
* The session ID is the UUID portion after the timestamp.
|
|
186
|
+
*/
|
|
187
|
+
extractSessionIdFromFilename(filename) {
|
|
188
|
+
// rollout-2026-03-24T12-25-16-019d1f60-95de-7141-a648-e3e2fe3da012.jsonl
|
|
189
|
+
// The UUID starts after the timestamp prefix (rollout-YYYY-MM-DDTHH-MM-SS-)
|
|
190
|
+
const withoutExt = filename.replace(/\.jsonl$/, '');
|
|
191
|
+
// Match: rollout-<date>T<time>-<uuid>
|
|
192
|
+
const match = withoutExt.match(/^rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/);
|
|
193
|
+
return match ? match[1] : null;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Find a session rollout file by ID.
|
|
197
|
+
* Scans the sessions/ directory recursively for a file containing the given ID.
|
|
198
|
+
*/
|
|
199
|
+
async findSessionFile(id) {
|
|
200
|
+
const fileInfos = await this.collectSessionFiles();
|
|
201
|
+
// Exact match first
|
|
202
|
+
for (const fi of fileInfos) {
|
|
203
|
+
if (fi.id === id) {
|
|
204
|
+
return { filePath: fi.filePath, resolvedId: fi.id };
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
// Prefix match
|
|
208
|
+
const matches = fileInfos.filter((fi) => fi.id.startsWith(id));
|
|
209
|
+
if (matches.length === 1) {
|
|
210
|
+
return { filePath: matches[0].filePath, resolvedId: matches[0].id };
|
|
211
|
+
}
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Parse a Codex CLI rollout JSONL file into an AgentSession.
|
|
216
|
+
*/
|
|
217
|
+
async parseRolloutFile(fileInfo, options) {
|
|
218
|
+
const content = await fs.readFile(fileInfo.filePath, 'utf-8');
|
|
219
|
+
const lines = content.split('\n').filter((l) => l.trim().length > 0);
|
|
220
|
+
let cwd;
|
|
221
|
+
let firstMessageAt;
|
|
222
|
+
let lastMessageAt;
|
|
223
|
+
let preview;
|
|
224
|
+
let messageCount = 0;
|
|
225
|
+
const messages = [];
|
|
226
|
+
for (const line of lines) {
|
|
227
|
+
let entry;
|
|
228
|
+
try {
|
|
229
|
+
entry = JSON.parse(line);
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
const type = entry.type;
|
|
235
|
+
const timestamp = entry.timestamp ? new Date(entry.timestamp) : fileInfo.mtime;
|
|
236
|
+
if (type === 'session_meta') {
|
|
237
|
+
const payload = entry.payload;
|
|
238
|
+
if (payload?.cwd)
|
|
239
|
+
cwd = payload.cwd;
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
if (type === 'turn_context') {
|
|
243
|
+
// Use turn context cwd as fallback
|
|
244
|
+
if (!cwd && entry.payload?.cwd)
|
|
245
|
+
cwd = entry.payload.cwd;
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
if (type === 'response_item') {
|
|
249
|
+
const payload = entry.payload;
|
|
250
|
+
if (!payload)
|
|
251
|
+
continue;
|
|
252
|
+
// Only count user and assistant messages (skip developer/system)
|
|
253
|
+
if (payload.type === 'message' &&
|
|
254
|
+
(payload.role === 'user' || payload.role === 'assistant')) {
|
|
255
|
+
messageCount++;
|
|
256
|
+
firstMessageAt ??= timestamp;
|
|
257
|
+
lastMessageAt = timestamp;
|
|
258
|
+
// Extract preview from first user message
|
|
259
|
+
if (payload.role === 'user' && preview === undefined) {
|
|
260
|
+
preview = this.extractTextFromContent(payload.content);
|
|
261
|
+
}
|
|
262
|
+
if (options.includeMessages) {
|
|
263
|
+
messages.push({
|
|
264
|
+
uuid: entry.payload?.call_id ?? `${fileInfo.id}-${messageCount}`,
|
|
265
|
+
role: payload.role,
|
|
266
|
+
content: this.extractTextFromContent(payload.content),
|
|
267
|
+
timestamp,
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
// Count function calls as part of conversation but don't add as messages
|
|
272
|
+
if (payload.type === 'function_call') {
|
|
273
|
+
messageCount++;
|
|
274
|
+
lastMessageAt = timestamp;
|
|
275
|
+
if (options.includeMessages) {
|
|
276
|
+
const toolName = payload.name ?? 'unknown_tool';
|
|
277
|
+
messages.push({
|
|
278
|
+
uuid: payload.call_id ?? `${fileInfo.id}-${messageCount}`,
|
|
279
|
+
role: 'assistant',
|
|
280
|
+
content: `[tool: ${toolName}] ${payload.arguments ?? ''}`,
|
|
281
|
+
timestamp,
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
if (payload.type === 'function_call_output') {
|
|
286
|
+
lastMessageAt = timestamp;
|
|
287
|
+
if (options.includeMessages) {
|
|
288
|
+
const output = payload.output ?? '';
|
|
289
|
+
const truncated = output.length > 500 ? `${output.slice(0, 497)}...` : output;
|
|
290
|
+
messages.push({
|
|
291
|
+
uuid: payload.call_id ?? `${fileInfo.id}-result-${messageCount}`,
|
|
292
|
+
role: 'assistant',
|
|
293
|
+
content: `[tool-result] ${truncated}`,
|
|
294
|
+
timestamp,
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
if (cwd === undefined) {
|
|
301
|
+
// Can't determine project path — too sparse
|
|
302
|
+
return null;
|
|
303
|
+
}
|
|
304
|
+
let messagesToReturn = messages;
|
|
305
|
+
if (options.includeMessages && options.messageLimit !== undefined && options.messageLimit > 0) {
|
|
306
|
+
messagesToReturn = messages.slice(-options.messageLimit);
|
|
307
|
+
}
|
|
308
|
+
const session = {
|
|
309
|
+
id: fileInfo.id,
|
|
310
|
+
agentType: 'codex-cli',
|
|
311
|
+
projectPath: this.abbreviatePath(cwd),
|
|
312
|
+
messageCount,
|
|
313
|
+
createdAt: firstMessageAt ?? fileInfo.mtime,
|
|
314
|
+
updatedAt: lastMessageAt ?? fileInfo.mtime,
|
|
315
|
+
};
|
|
316
|
+
if (preview !== undefined)
|
|
317
|
+
session.preview = preview;
|
|
318
|
+
if (firstMessageAt !== undefined)
|
|
319
|
+
session.firstMessageAt = firstMessageAt;
|
|
320
|
+
if (lastMessageAt !== undefined)
|
|
321
|
+
session.lastMessageAt = lastMessageAt;
|
|
322
|
+
if (options.includeMessages)
|
|
323
|
+
session.messages = messagesToReturn;
|
|
324
|
+
return session;
|
|
325
|
+
}
|
|
326
|
+
/** Extract text from Codex content blocks */
|
|
327
|
+
extractTextFromContent(content) {
|
|
328
|
+
if (!content || !Array.isArray(content))
|
|
329
|
+
return '';
|
|
330
|
+
const parts = [];
|
|
331
|
+
for (const block of content) {
|
|
332
|
+
if ((block.type === 'input_text' || block.type === 'output_text') && block.text) {
|
|
333
|
+
parts.push(block.text);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
return parts.join('\n');
|
|
337
|
+
}
|
|
338
|
+
/** Replace home directory prefix with ~ */
|
|
339
|
+
abbreviatePath(filePath) {
|
|
340
|
+
const home = os.homedir();
|
|
341
|
+
if (filePath === home)
|
|
342
|
+
return '~';
|
|
343
|
+
if (filePath.startsWith(`${home}${path.sep}`)) {
|
|
344
|
+
return `~${filePath.slice(home.length)}`;
|
|
345
|
+
}
|
|
346
|
+
return filePath;
|
|
347
|
+
}
|
|
348
|
+
};
|
|
349
|
+
CodexCliSessionRepository = CodexCliSessionRepository_1 = __decorate([
|
|
350
|
+
injectable(),
|
|
351
|
+
__metadata("design:paramtypes", [String])
|
|
352
|
+
], CodexCliSessionRepository);
|
|
353
|
+
export { CodexCliSessionRepository };
|
|
@@ -8,8 +8,8 @@ import { AgentType } from '../../../../packages/core/src/domain/generated/output
|
|
|
8
8
|
/**
|
|
9
9
|
* Creates the @inquirer/select configuration for selecting an AI coding agent.
|
|
10
10
|
*
|
|
11
|
-
*
|
|
12
|
-
* disabled with a "Coming Soon" badge.
|
|
11
|
+
* Active agents are selectable. Agents not yet implemented are shown
|
|
12
|
+
* as disabled with a "Coming Soon" badge.
|
|
13
13
|
*/
|
|
14
14
|
export declare function createAgentSelectConfig(): {
|
|
15
15
|
readonly message: "Select your AI coding agent";
|
|
@@ -21,6 +21,10 @@ export declare function createAgentSelectConfig(): {
|
|
|
21
21
|
readonly name: "Gemini CLI";
|
|
22
22
|
readonly value: AgentType.GeminiCli;
|
|
23
23
|
readonly description: "Google Gemini CLI";
|
|
24
|
+
}, {
|
|
25
|
+
readonly name: "Codex CLI";
|
|
26
|
+
readonly value: AgentType.CodexCli;
|
|
27
|
+
readonly description: "OpenAI's Codex CLI terminal agent (GPT models)";
|
|
24
28
|
}, {
|
|
25
29
|
readonly name: "Cursor";
|
|
26
30
|
readonly value: AgentType.Cursor;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-select.prompt.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/tui/prompts/agent-select.prompt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAGzD;;;;;GAKG;AACH,wBAAgB,uBAAuB
|
|
1
|
+
{"version":3,"file":"agent-select.prompt.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/tui/prompts/agent-select.prompt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAGzD;;;;;GAKG;AACH,wBAAgB,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0CtC"}
|
|
@@ -9,8 +9,8 @@ import { shepTheme } from '../themes/shep.theme.js';
|
|
|
9
9
|
/**
|
|
10
10
|
* Creates the @inquirer/select configuration for selecting an AI coding agent.
|
|
11
11
|
*
|
|
12
|
-
*
|
|
13
|
-
* disabled with a "Coming Soon" badge.
|
|
12
|
+
* Active agents are selectable. Agents not yet implemented are shown
|
|
13
|
+
* as disabled with a "Coming Soon" badge.
|
|
14
14
|
*/
|
|
15
15
|
export function createAgentSelectConfig() {
|
|
16
16
|
return {
|
|
@@ -26,6 +26,11 @@ export function createAgentSelectConfig() {
|
|
|
26
26
|
value: AgentType.GeminiCli,
|
|
27
27
|
description: 'Google Gemini CLI',
|
|
28
28
|
},
|
|
29
|
+
{
|
|
30
|
+
name: 'Codex CLI',
|
|
31
|
+
value: AgentType.CodexCli,
|
|
32
|
+
description: "OpenAI's Codex CLI terminal agent (GPT models)",
|
|
33
|
+
},
|
|
29
34
|
{
|
|
30
35
|
name: 'Cursor',
|
|
31
36
|
value: AgentType.Cursor,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-all-agent-models.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-all-agent-models.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB;
|
|
1
|
+
{"version":3,"file":"get-all-agent-models.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-all-agent-models.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB;AAmBD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CA+BpE"}
|
|
@@ -3,6 +3,7 @@ import { resolve } from '../../lib/server-container.js';
|
|
|
3
3
|
import { getModelMeta } from '../../lib/model-metadata.js';
|
|
4
4
|
const AGENT_LABELS = {
|
|
5
5
|
'claude-code': 'Claude Code',
|
|
6
|
+
'codex-cli': 'Codex CLI',
|
|
6
7
|
cursor: 'Cursor CLI',
|
|
7
8
|
'gemini-cli': 'Gemini CLI',
|
|
8
9
|
dev: 'Demo',
|
|
@@ -10,8 +11,9 @@ const AGENT_LABELS = {
|
|
|
10
11
|
/** Sort weight — higher = further down. Demo always last. */
|
|
11
12
|
const AGENT_ORDER = {
|
|
12
13
|
'claude-code': 0,
|
|
13
|
-
|
|
14
|
-
|
|
14
|
+
'codex-cli': 1,
|
|
15
|
+
cursor: 2,
|
|
16
|
+
'gemini-cli': 3,
|
|
15
17
|
dev: 99,
|
|
16
18
|
};
|
|
17
19
|
export async function getAllAgentModels() {
|
package/dist/src/presentation/web/components/common/feature-drawer-tabs/event-log-viewer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-log-viewer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/event-log-viewer.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"event-log-viewer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/event-log-viewer.tsx"],"names":[],"mappings":"AA2BA,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,cAAc,CAAC,EAAE,OAAO,EAAE,EAAE,mBAAmB,kDAa9D"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useMemo } from 'react';
|
|
4
|
-
import { FileText, Terminal, MessageSquare, CheckCircle2, Coins, Server, FileCode, } from 'lucide-react';
|
|
4
|
+
import { FileText, Terminal, MessageSquare, CheckCircle2, Coins, Server, FileCode, Play, ArrowRight, AlertCircle, } from 'lucide-react';
|
|
5
5
|
import { parseLogContent, parseToolCall, parseResultMessage, parseTokensMessage, } from '../../../lib/parse-log-line.js';
|
|
6
6
|
export function EventLogViewer({ content }) {
|
|
7
7
|
const lines = useMemo(() => parseLogContent(content), [content]);
|
|
@@ -18,12 +18,25 @@ function LogLineRow({ line }) {
|
|
|
18
18
|
switch (line.tag) {
|
|
19
19
|
case 'tool':
|
|
20
20
|
return _jsx(ToolCallRow, { line: line });
|
|
21
|
+
case 'tool-result':
|
|
22
|
+
return _jsx(ToolResultRow, { line: line });
|
|
21
23
|
case 'text':
|
|
24
|
+
case 'delta':
|
|
22
25
|
return _jsx(TextRow, { line: line });
|
|
23
26
|
case 'result':
|
|
24
27
|
return _jsx(ResultRow, { line: line });
|
|
25
28
|
case 'tokens':
|
|
29
|
+
case 'turn':
|
|
26
30
|
return _jsx(TokensRow, { line: line });
|
|
31
|
+
case 'cmd':
|
|
32
|
+
return _jsx(CommandRow, { line: line });
|
|
33
|
+
case 'file':
|
|
34
|
+
return _jsx(FileChangeRow, { line: line });
|
|
35
|
+
case 'thread':
|
|
36
|
+
case 'event':
|
|
37
|
+
return _jsx(InfoRow, { line: line });
|
|
38
|
+
case 'error':
|
|
39
|
+
return _jsx(ErrorRow, { line: line });
|
|
27
40
|
case 'worker':
|
|
28
41
|
return _jsx(WorkerRow, { line: line });
|
|
29
42
|
case 'info':
|
|
@@ -109,6 +122,18 @@ function TokensRow({ line }) {
|
|
|
109
122
|
function WorkerRow({ line }) {
|
|
110
123
|
return (_jsxs("div", { className: "hover:bg-muted/50 flex items-start gap-2 bg-zinc-50 px-3 py-1.5 transition-colors dark:bg-zinc-900/50", children: [_jsx(Timestamp, { value: line.timestamp }), _jsx(PhaseBadge, { phase: line.phase }), _jsxs("div", { className: "flex min-w-0 flex-1 items-start gap-1.5", children: [_jsx(Server, { className: "mt-0.5 h-3 w-3 shrink-0 text-zinc-500" }), _jsx("span", { className: "text-muted-foreground text-xs font-medium break-all", children: line.message })] })] }));
|
|
111
124
|
}
|
|
125
|
+
function ToolResultRow({ line }) {
|
|
126
|
+
return (_jsxs("div", { className: "hover:bg-muted/50 flex items-start gap-2 px-3 py-1 transition-colors", children: [_jsx(Timestamp, { value: line.timestamp }), _jsx(PhaseBadge, { phase: line.phase }), _jsxs("div", { className: "flex min-w-0 flex-1 items-start gap-1.5", children: [_jsx(ArrowRight, { className: "mt-0.5 h-3 w-3 shrink-0 text-violet-400" }), _jsx("span", { className: "text-muted-foreground min-w-0 font-mono text-[11px] break-all", children: line.message })] })] }));
|
|
127
|
+
}
|
|
128
|
+
function CommandRow({ line }) {
|
|
129
|
+
return (_jsxs("div", { className: "hover:bg-muted/50 flex items-start gap-2 px-3 py-1.5 transition-colors", children: [_jsx(Timestamp, { value: line.timestamp }), _jsx(PhaseBadge, { phase: line.phase }), _jsxs("div", { className: "flex min-w-0 flex-1 items-start gap-1.5", children: [_jsx(Play, { className: "mt-0.5 h-3 w-3 shrink-0 text-cyan-500" }), _jsx("span", { className: "min-w-0 font-mono text-xs break-all text-cyan-700 dark:text-cyan-400", children: line.message })] })] }));
|
|
130
|
+
}
|
|
131
|
+
function FileChangeRow({ line }) {
|
|
132
|
+
return (_jsxs("div", { className: "hover:bg-muted/50 flex items-start gap-2 px-3 py-1.5 transition-colors", children: [_jsx(Timestamp, { value: line.timestamp }), _jsx(PhaseBadge, { phase: line.phase }), _jsxs("div", { className: "flex min-w-0 flex-1 items-start gap-1.5", children: [_jsx(FileCode, { className: "mt-0.5 h-3 w-3 shrink-0 text-orange-500" }), _jsx("span", { className: "min-w-0 text-xs break-all text-orange-700 dark:text-orange-400", children: line.message })] })] }));
|
|
133
|
+
}
|
|
134
|
+
function ErrorRow({ line }) {
|
|
135
|
+
return (_jsxs("div", { className: "hover:bg-muted/50 flex items-start gap-2 bg-red-50 px-3 py-1.5 transition-colors dark:bg-red-950/30", children: [_jsx(Timestamp, { value: line.timestamp }), _jsx(PhaseBadge, { phase: line.phase }), _jsxs("div", { className: "flex min-w-0 flex-1 items-start gap-1.5", children: [_jsx(AlertCircle, { className: "mt-0.5 h-3 w-3 shrink-0 text-red-500" }), _jsx("span", { className: "min-w-0 text-xs font-medium break-all text-red-700 dark:text-red-400", children: line.message })] })] }));
|
|
136
|
+
}
|
|
112
137
|
function InfoRow({ line }) {
|
|
113
138
|
return (_jsxs("div", { className: "hover:bg-muted/50 flex items-start gap-2 px-3 py-1.5 transition-colors", children: [_jsx(Timestamp, { value: line.timestamp }), _jsx(PhaseBadge, { phase: line.phase }), _jsx("span", { className: "text-muted-foreground min-w-0 text-xs break-all", children: line.message })] }));
|
|
114
139
|
}
|
|
@@ -13,6 +13,8 @@ export declare const WorkerLifecycle: Story;
|
|
|
13
13
|
export declare const ResultsAndTokens: Story;
|
|
14
14
|
/** MixedContent — all event types including raw fallback */
|
|
15
15
|
export declare const MixedContent: Story;
|
|
16
|
+
/** CodexCliSession — Codex CLI agent log with all event types */
|
|
17
|
+
export declare const CodexCliSession: Story;
|
|
16
18
|
/** EmptyContent — no content */
|
|
17
19
|
export declare const EmptyContent: Story;
|
|
18
20
|
//# sourceMappingURL=event-log-viewer.stories.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-log-viewer.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/event-log-viewer.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,cAAc,CAqBrC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,cAAc,CAAC,CAAC;AAsD7C,0CAA0C;AAC1C,eAAO,MAAM,SAAS,EAAE,KAEvB,CAAC;AAEF,6CAA6C;AAC7C,eAAO,MAAM,YAAY,EAAE,KAE1B,CAAC;AAEF,sDAAsD;AACtD,eAAO,MAAM,eAAe,EAAE,KAE7B,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,gBAAgB,EAAE,KAE9B,CAAC;AAEF,4DAA4D;AAC5D,eAAO,MAAM,YAAY,EAAE,KAE1B,CAAC;AAEF,gCAAgC;AAChC,eAAO,MAAM,YAAY,EAAE,KAE1B,CAAC"}
|
|
1
|
+
{"version":3,"file":"event-log-viewer.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/event-log-viewer.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,cAAc,CAqBrC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,cAAc,CAAC,CAAC;AAsD7C,0CAA0C;AAC1C,eAAO,MAAM,SAAS,EAAE,KAEvB,CAAC;AAEF,6CAA6C;AAC7C,eAAO,MAAM,YAAY,EAAE,KAE1B,CAAC;AAEF,sDAAsD;AACtD,eAAO,MAAM,eAAe,EAAE,KAE7B,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,gBAAgB,EAAE,KAE9B,CAAC;AAEF,4DAA4D;AAC5D,eAAO,MAAM,YAAY,EAAE,KAE1B,CAAC;AAEF,iEAAiE;AACjE,eAAO,MAAM,eAAe,EAAE,KAmB7B,CAAC;AAEF,gCAAgC;AAChC,eAAO,MAAM,YAAY,EAAE,KAE1B,CAAC"}
|
package/dist/src/presentation/web/components/common/feature-drawer-tabs/event-log-viewer.stories.js
CHANGED
|
@@ -82,6 +82,27 @@ export const ResultsAndTokens = {
|
|
|
82
82
|
export const MixedContent = {
|
|
83
83
|
args: { content: mixedContent },
|
|
84
84
|
};
|
|
85
|
+
/** CodexCliSession — Codex CLI agent log with all event types */
|
|
86
|
+
export const CodexCliSession = {
|
|
87
|
+
args: {
|
|
88
|
+
content: `[2026-03-26T10:00:01.000Z] [codex-cli|gpt-5.4] [WORKER] Starting worker — full command:
|
|
89
|
+
[2026-03-26T10:00:01.010Z] [codex-cli|gpt-5.4] [WORKER] Initializing container...
|
|
90
|
+
[2026-03-26T10:00:02.000Z] [implement] [codex-cli|gpt-5.4] [thread] started thread_id=019d2aff-a65f-7253
|
|
91
|
+
[2026-03-26T10:00:03.000Z] [implement] [codex-cli|gpt-5.4] [text] I'll investigate the login page authentication bug. Let me check the auth module first.
|
|
92
|
+
[2026-03-26T10:00:04.000Z] [implement] [codex-cli|gpt-5.4] [tool] exec_command {"cmd":"cat src/auth.ts"}
|
|
93
|
+
[2026-03-26T10:00:05.000Z] [implement] [codex-cli|gpt-5.4] [tool-result] export function login(user: string, pass: string) { return validateToken(user, pass); }
|
|
94
|
+
[2026-03-26T10:00:06.000Z] [implement] [codex-cli|gpt-5.4] [cmd] running: cat src/auth.ts
|
|
95
|
+
[2026-03-26T10:00:07.000Z] [implement] [codex-cli|gpt-5.4] [cmd] exit=0 output: export function login...
|
|
96
|
+
[2026-03-26T10:00:08.000Z] [implement] [codex-cli|gpt-5.4] [delta] Found the issue. The token validation
|
|
97
|
+
[2026-03-26T10:00:09.000Z] [implement] [codex-cli|gpt-5.4] [text] Found the issue. The token validation was missing a null check. I've fixed it.
|
|
98
|
+
[2026-03-26T10:00:10.000Z] [implement] [codex-cli|gpt-5.4] [file] modifying: src/auth.ts
|
|
99
|
+
[2026-03-26T10:00:11.000Z] [implement] [codex-cli|gpt-5.4] [file] modified: src/auth.ts
|
|
100
|
+
[2026-03-26T10:00:12.000Z] [implement] [codex-cli|gpt-5.4] [tokens] 2450 in / 4560 out
|
|
101
|
+
[2026-03-26T10:00:13.000Z] [implement] [codex-cli|gpt-5.4] [turn] completed
|
|
102
|
+
[2026-03-26T10:00:14.000Z] [implement] [codex-cli|gpt-5.4] [error] Rate limit exceeded — retrying in 5s
|
|
103
|
+
[2026-03-26T10:00:20.000Z] [implement] [codex-cli|gpt-5.4] [result] 3200 chars, session=019d2aff-a65f-7253`,
|
|
104
|
+
},
|
|
105
|
+
};
|
|
85
106
|
/** EmptyContent — no content */
|
|
86
107
|
export const EmptyContent = {
|
|
87
108
|
args: { content: '' },
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ComponentType, SVGProps } from 'react';
|
|
2
2
|
/** Agent type values mirroring the TypeSpec AgentType enum. */
|
|
3
|
-
export type AgentTypeValue = 'claude-code' | 'cursor' | 'gemini-cli' | 'aider' | 'continue' | 'dev';
|
|
3
|
+
export type AgentTypeValue = 'claude-code' | 'codex-cli' | 'cursor' | 'gemini-cli' | 'aider' | 'continue' | 'dev';
|
|
4
4
|
type IconProps = SVGProps<SVGSVGElement> & {
|
|
5
5
|
className?: string;
|
|
6
6
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-type-icons.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/agent-type-icons.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAIrD,+DAA+D;AAC/D,MAAM,MAAM,cAAc,
|
|
1
|
+
{"version":3,"file":"agent-type-icons.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/agent-type-icons.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAIrD,+DAA+D;AAC/D,MAAM,MAAM,cAAc,GACtB,aAAa,GACb,WAAW,GACX,QAAQ,GACR,YAAY,GACZ,OAAO,GACP,UAAU,GACV,KAAK,CAAC;AAEV,KAAK,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAmBlE,6DAA6D;AAC7D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,2CAOhD;AA4DD,6CAA6C;AAC7C,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAQ1D,CAAC;AAEF,wEAAwE;AACxE,wBAAgB,gBAAgB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC,SAAS,CAAC,CAK7E"}
|
|
@@ -20,6 +20,7 @@ function DevAgentIcon({ className, ...props }) {
|
|
|
20
20
|
DevAgentIcon.displayName = 'DevAgentIcon';
|
|
21
21
|
const agentTypeIconMap = {
|
|
22
22
|
'claude-code': createBrandIcon('/icons/agents/claude-ai-icon.svg', 'Claude Code'),
|
|
23
|
+
'codex-cli': createBrandIcon('/icons/agents/openai.svg', 'Codex CLI'),
|
|
23
24
|
cursor: createBrandIcon('/icons/agents/cursor.jpeg', 'Cursor'),
|
|
24
25
|
'gemini-cli': createBrandIcon('/icons/agents/gemini-cli.jpeg', 'Gemini CLI'),
|
|
25
26
|
aider: createBrandIcon('/icons/agents/aider.png', 'Aider'),
|
|
@@ -29,6 +30,7 @@ const agentTypeIconMap = {
|
|
|
29
30
|
/** Human-readable labels for agent types. */
|
|
30
31
|
export const agentTypeLabels = {
|
|
31
32
|
'claude-code': 'Claude Code',
|
|
33
|
+
'codex-cli': 'Codex CLI',
|
|
32
34
|
cursor: 'Cursor',
|
|
33
35
|
'gemini-cli': 'Gemini CLI',
|
|
34
36
|
aider: 'Aider',
|
package/dist/src/presentation/web/components/common/feature-node/agent-type-icons.stories.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-type-icons.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/agent-type-icons.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-type-icons.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/agent-type-icons.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AA0CvD,QAAA,MAAM,IAAI,EAAE,IAIX,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC;AAEtB,eAAO,MAAM,QAAQ,EAAE,KAEtB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAExB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAExB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAa1B,CAAC"}
|
package/dist/src/presentation/web/components/common/feature-node/agent-type-icons.stories.js
CHANGED
|
@@ -2,6 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { getAgentTypeIcon, DefaultAgentIcon } from './agent-type-icons.js';
|
|
3
3
|
const allAgentTypes = [
|
|
4
4
|
{ type: 'claude-code', label: 'Claude Code' },
|
|
5
|
+
{ type: 'codex-cli', label: 'Codex CLI' },
|
|
5
6
|
{ type: 'cursor', label: 'Cursor' },
|
|
6
7
|
{ type: 'gemini-cli', label: 'Gemini CLI' },
|
|
7
8
|
{ type: 'aider', label: 'Aider' },
|