aipanel-cli 0.1.3 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/README.md +61 -41
  2. package/dist/src/app/AipanelApp.d.ts +6 -3
  3. package/dist/src/app/AipanelApp.js +22 -14
  4. package/dist/src/app/AipanelApp.js.map +1 -1
  5. package/dist/src/app/CommandRouter.js +19 -7
  6. package/dist/src/app/CommandRouter.js.map +1 -1
  7. package/dist/src/app/ProfileLoader.d.ts +3 -3
  8. package/dist/src/app/ProfileLoader.js +3 -6
  9. package/dist/src/app/ProfileLoader.js.map +1 -1
  10. package/dist/src/artifact/ArtifactRepository.d.ts +4 -9
  11. package/dist/src/artifact/ArtifactRepository.js +24 -60
  12. package/dist/src/artifact/ArtifactRepository.js.map +1 -1
  13. package/dist/src/cli/aipanel.js +2 -1
  14. package/dist/src/cli/aipanel.js.map +1 -1
  15. package/dist/src/compare/ComparisonEngine.d.ts +10 -1
  16. package/dist/src/compare/ComparisonEngine.js.map +1 -1
  17. package/dist/src/compare/ResponseNormalizer.d.ts +3 -2
  18. package/dist/src/compare/ResponseNormalizer.js +4 -2
  19. package/dist/src/compare/ResponseNormalizer.js.map +1 -1
  20. package/dist/src/context/ContextCollector.d.ts +5 -4
  21. package/dist/src/context/ContextCollector.js +4 -2
  22. package/dist/src/context/ContextCollector.js.map +1 -1
  23. package/dist/src/domain/artifact.d.ts +3 -2
  24. package/dist/src/domain/artifact.js +7 -7
  25. package/dist/src/domain/base.d.ts +0 -1
  26. package/dist/src/domain/base.js +1 -7
  27. package/dist/src/domain/base.js.map +1 -1
  28. package/dist/src/domain/run.d.ts +9 -23
  29. package/dist/src/domain/run.js +55 -51
  30. package/dist/src/domain/run.js.map +1 -1
  31. package/dist/src/domain/session.d.ts +6 -5
  32. package/dist/src/domain/session.js +9 -7
  33. package/dist/src/domain/session.js.map +1 -1
  34. package/dist/src/domain/value-objects.js +3 -1
  35. package/dist/src/domain/value-objects.js.map +1 -1
  36. package/dist/src/output/ResultRenderer.d.ts +3 -2
  37. package/dist/src/output/ResultRenderer.js.map +1 -1
  38. package/dist/src/providers/ClaudeCodeAdapter.d.ts +1 -0
  39. package/dist/src/providers/ClaudeCodeAdapter.js +1 -0
  40. package/dist/src/providers/ClaudeCodeAdapter.js.map +1 -1
  41. package/dist/src/providers/CodexExecAdapter.d.ts +5 -0
  42. package/dist/src/providers/CodexExecAdapter.js +128 -0
  43. package/dist/src/providers/CodexExecAdapter.js.map +1 -0
  44. package/dist/src/providers/ProviderAdapter.d.ts +1 -0
  45. package/dist/src/providers/ProviderRegistry.d.ts +3 -2
  46. package/dist/src/providers/ProviderRegistry.js +3 -3
  47. package/dist/src/providers/ProviderRegistry.js.map +1 -1
  48. package/dist/src/run/RunCoordinator.d.ts +10 -16
  49. package/dist/src/run/RunCoordinator.js +5 -20
  50. package/dist/src/run/RunCoordinator.js.map +1 -1
  51. package/dist/src/run/RunRepository.d.ts +3 -7
  52. package/dist/src/run/RunRepository.js +9 -45
  53. package/dist/src/run/RunRepository.js.map +1 -1
  54. package/dist/src/session/SessionManager.d.ts +5 -3
  55. package/dist/src/session/SessionManager.js +5 -6
  56. package/dist/src/session/SessionManager.js.map +1 -1
  57. package/dist/src/session/SessionRepository.d.ts +3 -5
  58. package/dist/src/session/SessionRepository.js +14 -28
  59. package/dist/src/session/SessionRepository.js.map +1 -1
  60. package/dist/src/shared/clock.d.ts +0 -1
  61. package/dist/src/shared/clock.js +0 -3
  62. package/dist/src/shared/clock.js.map +1 -1
  63. package/dist/src/shared/file-system.d.ts +0 -6
  64. package/dist/src/shared/file-system.js +1 -23
  65. package/dist/src/shared/file-system.js.map +1 -1
  66. package/dist/src/usecases/ConsultUseCase.d.ts +2 -1
  67. package/dist/src/usecases/ConsultUseCase.js +8 -8
  68. package/dist/src/usecases/ConsultUseCase.js.map +1 -1
  69. package/dist/src/usecases/DebugUseCase.js +20 -8
  70. package/dist/src/usecases/DebugUseCase.js.map +1 -1
  71. package/dist/src/usecases/FollowupUseCase.js.map +1 -1
  72. package/package.json +19 -63
  73. package/dist/src/app/WorkflowSelector.d.ts +0 -4
  74. package/dist/src/app/WorkflowSelector.js +0 -6
  75. package/dist/src/app/WorkflowSelector.js.map +0 -1
  76. package/dist/src/app/index.d.ts +0 -4
  77. package/dist/src/app/index.js +0 -5
  78. package/dist/src/app/index.js.map +0 -1
  79. package/dist/src/app/types.d.ts +0 -36
  80. package/dist/src/app/types.js +0 -2
  81. package/dist/src/app/types.js.map +0 -1
  82. package/dist/src/artifact/index.d.ts +0 -1
  83. package/dist/src/artifact/index.js +0 -2
  84. package/dist/src/artifact/index.js.map +0 -1
  85. package/dist/src/compare/index.d.ts +0 -3
  86. package/dist/src/compare/index.js +0 -3
  87. package/dist/src/compare/index.js.map +0 -1
  88. package/dist/src/context/index.d.ts +0 -2
  89. package/dist/src/context/index.js +0 -2
  90. package/dist/src/context/index.js.map +0 -1
  91. package/dist/src/domain/index.d.ts +0 -5
  92. package/dist/src/domain/index.js +0 -6
  93. package/dist/src/domain/index.js.map +0 -1
  94. package/dist/src/index.d.ts +0 -16
  95. package/dist/src/index.js +0 -16
  96. package/dist/src/index.js.map +0 -1
  97. package/dist/src/orchestrator/PlanBuilder.d.ts +0 -6
  98. package/dist/src/orchestrator/PlanBuilder.js +0 -59
  99. package/dist/src/orchestrator/PlanBuilder.js.map +0 -1
  100. package/dist/src/orchestrator/ResultMerger.d.ts +0 -10
  101. package/dist/src/orchestrator/ResultMerger.js +0 -19
  102. package/dist/src/orchestrator/ResultMerger.js.map +0 -1
  103. package/dist/src/orchestrator/TaskExecutor.d.ts +0 -20
  104. package/dist/src/orchestrator/TaskExecutor.js +0 -81
  105. package/dist/src/orchestrator/TaskExecutor.js.map +0 -1
  106. package/dist/src/orchestrator/TaskScheduler.d.ts +0 -4
  107. package/dist/src/orchestrator/TaskScheduler.js +0 -19
  108. package/dist/src/orchestrator/TaskScheduler.js.map +0 -1
  109. package/dist/src/orchestrator/ValidationRunner.d.ts +0 -4
  110. package/dist/src/orchestrator/ValidationRunner.js +0 -22
  111. package/dist/src/orchestrator/ValidationRunner.js.map +0 -1
  112. package/dist/src/orchestrator/index.d.ts +0 -5
  113. package/dist/src/orchestrator/index.js +0 -6
  114. package/dist/src/orchestrator/index.js.map +0 -1
  115. package/dist/src/output/index.d.ts +0 -1
  116. package/dist/src/output/index.js +0 -2
  117. package/dist/src/output/index.js.map +0 -1
  118. package/dist/src/providers/index.d.ts +0 -3
  119. package/dist/src/providers/index.js +0 -4
  120. package/dist/src/providers/index.js.map +0 -1
  121. package/dist/src/run/index.d.ts +0 -2
  122. package/dist/src/run/index.js +0 -3
  123. package/dist/src/run/index.js.map +0 -1
  124. package/dist/src/session/index.d.ts +0 -2
  125. package/dist/src/session/index.js +0 -3
  126. package/dist/src/session/index.js.map +0 -1
  127. package/dist/src/shared/contracts.d.ts +0 -256
  128. package/dist/src/shared/contracts.js +0 -2
  129. package/dist/src/shared/contracts.js.map +0 -1
  130. package/dist/src/shared/errors.d.ts +0 -9
  131. package/dist/src/shared/errors.js +0 -11
  132. package/dist/src/shared/errors.js.map +0 -1
  133. package/dist/src/shared/index.d.ts +0 -4
  134. package/dist/src/shared/index.js +0 -5
  135. package/dist/src/shared/index.js.map +0 -1
  136. package/dist/src/usecases/CompareUseCase.d.ts +0 -6
  137. package/dist/src/usecases/CompareUseCase.js +0 -9
  138. package/dist/src/usecases/CompareUseCase.js.map +0 -1
  139. package/dist/src/usecases/helpers.d.ts +0 -9
  140. package/dist/src/usecases/helpers.js +0 -31
  141. package/dist/src/usecases/helpers.js.map +0 -1
  142. package/dist/src/usecases/index.d.ts +0 -5
  143. package/dist/src/usecases/index.js +0 -6
  144. package/dist/src/usecases/index.js.map +0 -1
package/README.md CHANGED
@@ -1,16 +1,18 @@
1
1
  # aipanel
2
2
 
3
- `aipanel` は、Claude Code を provider として使いながら、相談、継続会話、デバッグ調査を CLI で進めるための TypeScript 製 broker / orchestrator です。
3
+ `aipanel` は、Claude Code と Codex を provider として使いながら、相談、継続会話、デバッグ調査を CLI で進めるための TypeScript 製 broker / orchestrator です。
4
4
 
5
- 現時点の phase 1 では、`claude-code` 単独 provider を前提に、`Session / Run / Artifact` を `aipanel` 側で正本管理します。
5
+ 現時点の phase 1 では、`claude-code` `codex` の direct provider を前提に、`Session / Run / Artifact` を `aipanel` 側で正本管理します。
6
6
 
7
7
  ## Current Status
8
+
8
9
  - phase 1 実装済み
9
- - provider は `claude-code` のみ
10
+ - provider は `claude-code`, `codex`
10
11
  - 利用可能 command は `providers`, `consult`, `followup`, `debug`
11
- - `compare` は phase 2 予約で、内部 placeholder のみ残している
12
+ - `compare` は phase 1 の対象外
12
13
 
13
14
  ## Setup
15
+
14
16
  ```bash
15
17
  npm install
16
18
  npm run build
@@ -38,43 +40,46 @@ npm run dev -- providers --json
38
40
  make dev
39
41
  ```
40
42
 
41
- ## Package Install
43
+ ## Worktree Shortcut
42
44
 
43
- 公開後は package として install できます。
45
+ `aipanel` 直下の `.worktree/` Git worktree を増やしたいときは、以下のショートカットが使えます。
44
46
 
45
47
  ```bash
46
- npm install -g aipanel-cli
47
- aipanel providers --json
48
+ npm run worktree:add -- feature/debug-ui
49
+ make worktree-add BRANCH=feature/debug-ui
48
50
  ```
49
51
 
50
- 2026-03-10 JST 時点で、registry 経由の `npm install aipanel-cli` と `aipanel providers --json` まで確認済みです。
51
-
52
- ## Import Usage
52
+ 補足:
53
53
 
54
- CLI だけでなく、package として import できます。
54
+ - 既存の local branch があればその branch をそのまま開きます
55
+ - `origin/<branch>` だけ存在する場合は tracking branch を作ります
56
+ - どちらもない場合は `HEAD` から新しい branch を作ります
57
+ - 配置先は `.worktree/<branch>` です
55
58
 
56
- ```ts
57
- import { AipanelApp, Session, runCli } from "aipanel-cli";
58
- import { Run } from "aipanel-cli/domain";
59
+ base を変えたい場合:
59
60
 
60
- const app = new AipanelApp();
61
- const providers = await app.listProvidersUseCase.execute();
62
- console.log(providers.providers);
61
+ ```bash
62
+ npm run worktree:add -- feature/debug-ui --base origin/main
63
+ make worktree-add BRANCH=feature/debug-ui BASE=origin/main
64
+ ```
63
65
 
64
- await runCli(["providers", "--json"]);
66
+ 一覧確認:
65
67
 
66
- const session = Session.create({ title: "Imported session" });
67
- const run = Run.create({
68
- sessionId: session.sessionId,
69
- command: "consult",
70
- mode: "direct",
71
- });
68
+ ```bash
69
+ npm run worktree:list
70
+ make worktree-list
72
71
  ```
73
72
 
74
- 現時点で確認している import surface:
73
+ ## Package Install
74
+
75
+ 公開後は package として install できます。
76
+
77
+ ```bash
78
+ npm install -g aipanel-cli
79
+ aipanel providers --json
80
+ ```
75
81
 
76
- - root import: `AipanelApp`, `CommandRouter`, `runCli`, domain entity
77
- - subpath import: `aipanel-cli/domain`, `aipanel-cli/providers`, `aipanel-cli/usecases`, `aipanel-cli/shared`
82
+ 2026-03-10 JST 時点で、registry 経由の `npm install aipanel-cli` `aipanel providers --json` まで確認済みです。
78
83
 
79
84
  公開前のローカル確認は tarball か `Makefile` で行えます。
80
85
 
@@ -102,11 +107,12 @@ make publish
102
107
  ```
103
108
 
104
109
  ## Commands
110
+
105
111
  ```bash
106
112
  node dist/bin/aipanel.js providers [--json]
107
- node dist/bin/aipanel.js consult "<question>" [--cwd <dir>] [--file <path>] [--diff <path>] [--log <path>] [--model <name>] [--timeout <ms>] [--json]
108
- node dist/bin/aipanel.js followup --session <sessionId> "<question>" [--cwd <dir>] [--model <name>] [--timeout <ms>] [--json]
109
- node dist/bin/aipanel.js debug "<question>" [--cwd <dir>] [--file <path>] [--diff <path>] [--log <path>] [--model <name>] [--timeout <ms>] [--json]
113
+ node dist/bin/aipanel.js consult "<question>" [--provider <name>] [--cwd <dir>] [--file <path>] [--diff <path>] [--log <path>] [--model <name>] [--timeout <ms>] [--json]
114
+ node dist/bin/aipanel.js followup --session <sessionId> "<question>" [--provider <name>] [--cwd <dir>] [--model <name>] [--timeout <ms>] [--json]
115
+ node dist/bin/aipanel.js debug "<question>" [--provider <name>] [--cwd <dir>] [--file <path>] [--diff <path>] [--log <path>] [--model <name>] [--timeout <ms>] [--json]
110
116
  ```
111
117
 
112
118
  repo からのショートカット:
@@ -122,15 +128,17 @@ make run ARGS='debug "この不具合の根本原因は?" --json --timeout 600
122
128
  ```bash
123
129
  node dist/bin/aipanel.js consult "この設計どう?" --json
124
130
  node dist/bin/aipanel.js consult "このログから原因わかる?" --cwd ./repo --log logs/app.log --file src/server.ts --model sonnet --json
131
+ node dist/bin/aipanel.js consult "この差分レビューして" --provider codex --cwd ./repo --file src/server.ts --log logs/app.log --json
125
132
  node dist/bin/aipanel.js followup --session session_xxx "この修正方針で進めていい?" --model sonnet --json
126
133
  node dist/bin/aipanel.js debug "この不具合の根本原因は?" --cwd ./repo --file src/cache.ts --log logs/error.log --model sonnet --json
127
134
  ```
128
135
 
129
136
  ## Runtime Notes
137
+
130
138
  - `--cwd` は provider 実行ディレクトリだけでなく、`--file`, `--diff`, `--log` の相対パス解決にも使われます
131
- - `--model` `claude-code` provider にそのまま渡されます。未指定時は `.aipanel/profile.yml` の `defaultModel`、さらに未設定なら `sonnet` を使います
139
+ - `--model` は選択した provider にそのまま渡されます。未指定時は `.aipanel/profile.yml` の `defaultModel` を優先し、さらに未設定なら provider 側の既定を使います
132
140
  - `AIPANEL_STORAGE_ROOT` を指定すると、session / run / artifact の保存先を切り替えられます
133
- - `followup` は Claude Code の native resume を正本にせず、`aipanel` 側の session 履歴再構築を基本にしています
141
+ - `followup` は Claude Code / Codex の native resume を正本にせず、`aipanel` 側の session 履歴再構築を基本にしています
134
142
  - `debug` の `--timeout` は orchestrated mode の各 provider call に適用されるので、合計所要時間は 3 倍近くになることがあります
135
143
 
136
144
  例:
@@ -148,7 +156,10 @@ defaultModel: sonnet
148
156
  defaultTimeoutMs: 120000
149
157
  ```
150
158
 
159
+ Codex を既定 provider にしたい場合は、`defaultProvider: codex` を指定したうえで `defaultModel` を省略して Codex CLI 側の既定を使うか、使いたい model を明示的に書いてください。
160
+
151
161
  ## Storage Layout
162
+
152
163
  デフォルトでは `./.aipanel` 配下に保存します。
153
164
 
154
165
  ```text
@@ -170,41 +181,50 @@ defaultTimeoutMs: 120000
170
181
  - `artifacts/`: context bundle, provider raw text/json, debug task outputs
171
182
 
172
183
  ## Tests
184
+
173
185
  ```bash
186
+ npm run lint
187
+ npm run fmt:check
174
188
  npm run typecheck
175
189
  npm run test:unit
176
190
  npm run test:integration
177
191
  npm run test:e2e
178
192
  npm test
193
+ npm run audit
179
194
  ```
180
195
 
181
196
  `Makefile` 経由でも同じ確認ができます。
182
197
 
183
198
  ```bash
199
+ make lint
200
+ make fmt-check
184
201
  make typecheck
185
202
  make test
203
+ make audit
186
204
  ```
187
205
 
188
206
  テストの役割:
189
207
 
190
208
  - `test:unit`: `ResponseNormalizer`, `ContextCollector`, `SessionManager`
191
- - `test:integration`: built CLI + fake Claude provider で `providers/consult/followup/debug`
209
+ - `test:integration`: built CLI + fake Claude/Codex provider で `providers/consult/followup/debug`
192
210
  - `test:e2e`: built CLI の永続化込みフルフロー確認
193
211
  - integration / E2E では `defaultModel` fallback と `--model` override の両方を確認
194
212
 
195
213
  ## Verified Smoke Checks
214
+
196
215
  2026-03-10 JST 時点で、以下を実行確認済みです。
197
216
 
217
+ - `npm run lint`
218
+ - `npm run fmt:check`
198
219
  - `npm run typecheck`
199
220
  - `npm test`
221
+ - `npm run audit`
200
222
  - `npm run build`
201
223
  - `npm run verify:package`
202
224
  - `npm run dev -- providers --json`
203
225
  - `npm start -- providers --json`
204
226
  - `make smoke`
205
227
  - `npm install --prefix "$tmpdir" aipanel-cli`
206
- - `import("aipanel-cli")`
207
- - `import("aipanel-cli/domain")`
208
228
  - `node dist/bin/aipanel.js providers --json`
209
229
  - 実 Claude Code を使った `consult`
210
230
  - 実 Claude Code を使った `followup`
@@ -212,13 +232,13 @@ make test
212
232
  - 実 Claude Code を使った `consult --model sonnet`
213
233
 
214
234
  ## Repo Skill
215
- - repo-local Codex skill は [.agent/skills/aipanel/SKILL.md](./.agent/skills/aipanel/SKILL.md) にあります
216
- - install / build / command usage / storage inspection / tests / E2E の入口を 1 本にまとめています
217
- - アーキテクチャ図の再生成用 Skill [.agent/skills/aipanel-diagrams/SKILL.md](./.agent/skills/aipanel-diagrams/SKILL.md) にあります
218
- - Skill の参照ドキュメントは [docs/skills/aipanel-diagrams/00_overview.md](./docs/skills/aipanel-diagrams/00_overview.md) にあります
219
- - draw.io 専用 sub-agent 定義は [drawio-diagrammer.yaml](./docs/skills/aipanel-diagrams/subagents/drawio-diagrammer.yaml) にあります
235
+
236
+ - 公開用の `aipanel-cli` 利用ガイド Skill [skills/use-aipanel-cli/SKILL.md](./skills/use-aipanel-cli/SKILL.md) にあります
237
+ - `npx skills add sean-sunagaku/aipanel --skill use-aipanel-cli` で install できます
238
+ - install / build / command usage / TypeScript import / storage layout の入口を 1 本にまとめています
220
239
 
221
240
  ## Architecture Docs
241
+
222
242
  - [Overview](./docs/rearchitecture/content_rearchitecture_2026-03-10/00_overview/00_overview.md)
223
243
  - [Current Implementation Diagrams](./docs/rearchitecture/content_rearchitecture_2026-03-10/12_current-implementation-diagrams/12_current-implementation-diagrams.md)
224
244
  - [Comparison](./docs/rearchitecture/content_rearchitecture_2026-03-10/06_comparison/06_comparison.md)
@@ -1,11 +1,14 @@
1
1
  import { ResultRenderer } from "../output/ResultRenderer.js";
2
- import { ConsultUseCase, DebugUseCase, FollowupUseCase, ListProvidersUseCase } from "../usecases/index.js";
2
+ import { ProviderRegistry } from "../providers/ProviderRegistry.js";
3
+ import { ConsultUseCase } from "../usecases/ConsultUseCase.js";
4
+ import { DebugUseCase } from "../usecases/DebugUseCase.js";
5
+ import { FollowupUseCase } from "../usecases/FollowupUseCase.js";
6
+ import { ListProvidersUseCase } from "../usecases/ListProvidersUseCase.js";
3
7
  import { ProfileLoader } from "./ProfileLoader.js";
4
- import { WorkflowSelector } from "./WorkflowSelector.js";
5
8
  export declare class AipanelApp {
6
9
  readonly profileLoader: ProfileLoader;
7
- readonly workflowSelector: WorkflowSelector;
8
10
  readonly resultRenderer: ResultRenderer;
11
+ readonly providerRegistry: ProviderRegistry;
9
12
  readonly listProvidersUseCase: ListProvidersUseCase;
10
13
  readonly consultUseCase: ConsultUseCase;
11
14
  readonly followupUseCase: FollowupUseCase;
@@ -3,39 +3,47 @@ import { ArtifactRepository } from "../artifact/ArtifactRepository.js";
3
3
  import { ComparisonEngine } from "../compare/ComparisonEngine.js";
4
4
  import { ContextCollector } from "../context/ContextCollector.js";
5
5
  import { ResultRenderer } from "../output/ResultRenderer.js";
6
- import { ClaudeCodeAdapter, ProviderRegistry } from "../providers/index.js";
7
- import { RunCoordinator, RunRepository } from "../run/index.js";
8
- import { SessionManager, SessionRepository } from "../session/index.js";
9
- import { ConsultUseCase, DebugUseCase, FollowupUseCase, ListProvidersUseCase } from "../usecases/index.js";
6
+ import { ClaudeCodeAdapter } from "../providers/ClaudeCodeAdapter.js";
7
+ import { CodexExecAdapter } from "../providers/CodexExecAdapter.js";
8
+ import { ProviderRegistry } from "../providers/ProviderRegistry.js";
9
+ import { RunCoordinator } from "../run/RunCoordinator.js";
10
+ import { RunRepository } from "../run/RunRepository.js";
11
+ import { SessionManager } from "../session/SessionManager.js";
12
+ import { SessionRepository } from "../session/SessionRepository.js";
13
+ import { ConsultUseCase } from "../usecases/ConsultUseCase.js";
14
+ import { DebugUseCase } from "../usecases/DebugUseCase.js";
15
+ import { FollowupUseCase } from "../usecases/FollowupUseCase.js";
16
+ import { ListProvidersUseCase } from "../usecases/ListProvidersUseCase.js";
10
17
  import { ProfileLoader } from "./ProfileLoader.js";
11
- import { WorkflowSelector } from "./WorkflowSelector.js";
12
18
  export class AipanelApp {
13
19
  profileLoader;
14
- workflowSelector;
15
20
  resultRenderer;
21
+ providerRegistry;
16
22
  listProvidersUseCase;
17
23
  consultUseCase;
18
24
  followupUseCase;
19
25
  debugUseCase;
20
- constructor({ storageRoot = process.env.AIPANEL_STORAGE_ROOT ?? path.join(process.cwd(), ".aipanel"), cwd = process.env.AIPANEL_CWD ?? process.cwd(), } = {}) {
26
+ constructor({ storageRoot = process.env.AIPANEL_STORAGE_ROOT ??
27
+ path.join(process.cwd(), ".aipanel"), cwd = process.env.AIPANEL_CWD ?? process.cwd(), } = {}) {
21
28
  this.profileLoader = new ProfileLoader(storageRoot);
22
- this.workflowSelector = new WorkflowSelector();
23
29
  this.resultRenderer = new ResultRenderer();
24
30
  const sessionRepository = new SessionRepository({ storageRoot });
25
31
  const runRepository = new RunRepository({ storageRoot });
26
32
  const artifactRepository = new ArtifactRepository({ storageRoot });
27
- const sessionManager = new SessionManager({ repository: sessionRepository });
33
+ const sessionManager = new SessionManager({
34
+ repository: sessionRepository,
35
+ });
28
36
  const runCoordinator = new RunCoordinator({ repository: runRepository });
29
37
  const contextCollector = new ContextCollector({ cwd });
30
- const providerRegistry = new ProviderRegistry({
31
- adapters: [new ClaudeCodeAdapter()],
38
+ this.providerRegistry = new ProviderRegistry({
39
+ adapters: [new ClaudeCodeAdapter(), new CodexExecAdapter()],
32
40
  defaultProvider: "claude-code",
33
41
  });
34
- this.listProvidersUseCase = new ListProvidersUseCase(providerRegistry);
42
+ this.listProvidersUseCase = new ListProvidersUseCase(this.providerRegistry);
35
43
  this.consultUseCase = new ConsultUseCase({
36
44
  sessionManager,
37
45
  runCoordinator,
38
- providerRegistry,
46
+ providerRegistry: this.providerRegistry,
39
47
  contextCollector,
40
48
  artifactRepository,
41
49
  });
@@ -43,7 +51,7 @@ export class AipanelApp {
43
51
  this.debugUseCase = new DebugUseCase({
44
52
  sessionManager,
45
53
  runCoordinator,
46
- providerRegistry,
54
+ providerRegistry: this.providerRegistry,
47
55
  contextCollector,
48
56
  artifactRepository,
49
57
  comparisonEngine: new ComparisonEngine(),
@@ -1 +1 @@
1
- {"version":3,"file":"AipanelApp.js","sourceRoot":"","sources":["../../../src/app/AipanelApp.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC3G,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,OAAO,UAAU;IACZ,aAAa,CAAgB;IAC7B,gBAAgB,CAAmB;IACnC,cAAc,CAAiB;IAC/B,oBAAoB,CAAuB;IAC3C,cAAc,CAAiB;IAC/B,eAAe,CAAkB;IACjC,YAAY,CAAe;IAEpC,YAAY,EACV,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,EACtF,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,MAI5C,EAAE;QACJ,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC,WAAW,CAAC,CAAC;QACpD,IAAI,CAAC,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC;QAC/C,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;QAE3C,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;QACjE,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;QACzD,MAAM,kBAAkB,GAAG,IAAI,kBAAkB,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;QACnE,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,EAAE,UAAU,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAC7E,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC,CAAC;QACzE,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QACvD,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,CAAC;YAC5C,QAAQ,EAAE,CAAC,IAAI,iBAAiB,EAAE,CAAC;YACnC,eAAe,EAAE,aAAa;SAC/B,CAAC,CAAC;QAEH,IAAI,CAAC,oBAAoB,GAAG,IAAI,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;QACvE,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC;YACvC,cAAc;YACd,cAAc;YACd,gBAAgB;YAChB,gBAAgB;YAChB,kBAAkB;SACnB,CAAC,CAAC;QACH,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAChE,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC;YACnC,cAAc;YACd,cAAc;YACd,gBAAgB;YAChB,gBAAgB;YAChB,kBAAkB;YAClB,gBAAgB,EAAE,IAAI,gBAAgB,EAAE;SACzC,CAAC,CAAC;IACL,CAAC;CACF"}
1
+ {"version":3,"file":"AipanelApp.js","sourceRoot":"","sources":["../../../src/app/AipanelApp.ts"],"names":[],"mappings":"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"}
@@ -88,7 +88,10 @@ export class CommandRouter {
88
88
  const parsed = parseArgs(argv);
89
89
  const profile = await this.app.profileLoader.load();
90
90
  const providerName = parsed.providerName ?? profile.defaultProvider;
91
- const model = parsed.model ?? profile.defaultModel;
91
+ const shouldUseProfileModel = !parsed.providerName || parsed.providerName === profile.defaultProvider;
92
+ const model = parsed.model ??
93
+ (shouldUseProfileModel ? profile.defaultModel : undefined) ??
94
+ this.app.providerRegistry.getDefaultModel(providerName);
92
95
  const timeoutMs = parsed.timeoutMs ?? profile.defaultTimeoutMs;
93
96
  switch (parsed.command) {
94
97
  case "providers": {
@@ -104,13 +107,16 @@ export class CommandRouter {
104
107
  diffs: parsed.diffs,
105
108
  logs: parsed.logs,
106
109
  providerName,
107
- model,
108
110
  timeoutMs,
109
111
  cwd: parsed.cwd ?? process.cwd(),
112
+ ...(model !== undefined ? { model } : {}),
110
113
  ...(parsed.sessionId ? { sessionId: parsed.sessionId } : {}),
111
114
  });
112
115
  const rendered = this.app.resultRenderer.render(result, parsed.outputFormat);
113
- return { output: rendered.text, exitCode: result.status === "partial" ? 2 : 0 };
116
+ return {
117
+ output: rendered.text,
118
+ exitCode: result.status === "partial" ? 2 : 0,
119
+ };
114
120
  }
115
121
  case "followup": {
116
122
  if (!parsed.sessionId) {
@@ -123,12 +129,15 @@ export class CommandRouter {
123
129
  diffs: parsed.diffs,
124
130
  logs: parsed.logs,
125
131
  providerName,
126
- model,
127
132
  timeoutMs,
128
133
  cwd: parsed.cwd ?? process.cwd(),
134
+ ...(model !== undefined ? { model } : {}),
129
135
  });
130
136
  const rendered = this.app.resultRenderer.render(result, parsed.outputFormat);
131
- return { output: rendered.text, exitCode: result.status === "partial" ? 2 : 0 };
137
+ return {
138
+ output: rendered.text,
139
+ exitCode: result.status === "partial" ? 2 : 0,
140
+ };
132
141
  }
133
142
  case "debug": {
134
143
  const result = await this.app.debugUseCase.execute({
@@ -137,13 +146,16 @@ export class CommandRouter {
137
146
  diffs: parsed.diffs,
138
147
  logs: parsed.logs,
139
148
  providerName,
140
- model,
141
149
  timeoutMs,
142
150
  cwd: parsed.cwd ?? process.cwd(),
151
+ ...(model !== undefined ? { model } : {}),
143
152
  ...(parsed.sessionId ? { sessionId: parsed.sessionId } : {}),
144
153
  });
145
154
  const rendered = this.app.resultRenderer.render(result, parsed.outputFormat);
146
- return { output: rendered.text, exitCode: result.status === "partial" ? 2 : 0 };
155
+ return {
156
+ output: rendered.text,
157
+ exitCode: result.status === "partial" ? 2 : 0,
158
+ };
147
159
  }
148
160
  case "help":
149
161
  default:
@@ -1 +1 @@
1
- {"version":3,"file":"CommandRouter.js","sourceRoot":"","sources":["../../../src/app/CommandRouter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CommandRouter.js","sourceRoot":"","sources":["../../../src/app/CommandRouter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAgB7C,SAAS,aAAa,CAAC,IAAc,EAAE,KAAa,EAAE,IAAY;IAChE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,KAAK,IAAI,sBAAsB,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,WAAqB;IAC5C,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,CAAC,OAAO,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACzC,MAAM,MAAM,GAAe;QACzB,OAAO;QACP,WAAW,EAAE,EAAE;QACf,YAAY,EAAE,MAAM;QACpB,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,EAAE;QACT,IAAI,EAAE,EAAE;KACT,CAAC;IAEF,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,SAAS;QACX,CAAC;QAED,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvB,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC;YAC7B,SAAS;QACX,CAAC;QAED,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;YAC1B,MAAM,CAAC,SAAS,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,WAAW,CAAC,CAAC;YAC/D,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,IAAI,KAAK,KAAK,YAAY,EAAE,CAAC;YAC3B,MAAM,CAAC,YAAY,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,YAAY,CAAC,CAAC;YACnE,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;YACzD,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;YAC1B,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;YACpE,KAAK,IAAI,CAAC,CAAC;YACX,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7B,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC;YAC7B,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;YACrD,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;YAC5D,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;YAC5D,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;YAC1D,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,OAAO,aAAa;IACf,GAAG,CAAa;IAEzB,YAAY,GAAe;QACzB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAc;QACxB,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;QACpD,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,OAAO,CAAC,eAAe,CAAC;QACpE,MAAM,qBAAqB,GACzB,CAAC,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,KAAK,OAAO,CAAC,eAAe,CAAC;QAC1E,MAAM,KAAK,GACT,MAAM,CAAC,KAAK;YACZ,CAAC,qBAAqB,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;YAC1D,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;QAC1D,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,OAAO,CAAC,gBAAgB,CAAC;QAE/D,QAAQ,MAAM,CAAC,OAAO,EAAE,CAAC;YACvB,KAAK,WAAW,CAAC,CAAC,CAAC;gBACjB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,oBAAoB,CAAC,OAAO,EAAE,CAAC;gBAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,CAC7C,MAAM,EACN,MAAM,CAAC,YAAY,CACpB,CAAC;gBACF,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;YAChD,CAAC;YACD,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC;oBACnD,OAAO,EAAE,SAAS;oBAClB,QAAQ,EAAE,eAAe,CAAC,MAAM,CAAC,WAAW,CAAC;oBAC7C,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,YAAY;oBACZ,SAAS;oBACT,GAAG,EAAE,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;oBAChC,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACzC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC7D,CAAC,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,CAC7C,MAAM,EACN,MAAM,CAAC,YAAY,CACpB,CAAC;gBACF,OAAO;oBACL,MAAM,EAAE,QAAQ,CAAC,IAAI;oBACrB,QAAQ,EAAE,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC9C,CAAC;YACJ,CAAC;YACD,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;oBACtB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;gBACzD,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC;oBACpD,QAAQ,EAAE,eAAe,CAAC,MAAM,CAAC,WAAW,CAAC;oBAC7C,SAAS,EAAE,MAAM,CAAC,SAAS;oBAC3B,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,YAAY;oBACZ,SAAS;oBACT,GAAG,EAAE,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;oBAChC,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC1C,CAAC,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,CAC7C,MAAM,EACN,MAAM,CAAC,YAAY,CACpB,CAAC;gBACF,OAAO;oBACL,MAAM,EAAE,QAAQ,CAAC,IAAI;oBACrB,QAAQ,EAAE,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC9C,CAAC;YACJ,CAAC;YACD,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC;oBACjD,QAAQ,EAAE,eAAe,CAAC,MAAM,CAAC,WAAW,CAAC;oBAC7C,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,YAAY;oBACZ,SAAS;oBACT,GAAG,EAAE,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;oBAChC,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACzC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC7D,CAAC,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,CAC7C,MAAM,EACN,MAAM,CAAC,YAAY,CACpB,CAAC;gBACF,OAAO;oBACL,MAAM,EAAE,QAAQ,CAAC,IAAI;oBACrB,QAAQ,EAAE,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC9C,CAAC;YACJ,CAAC;YACD,KAAK,MAAM,CAAC;YACZ;gBACE,OAAO;oBACL,MAAM,EAAE;wBACN,QAAQ;wBACR,8BAA8B;wBAC9B,2HAA2H;wBAC3H,4FAA4F;wBAC5F,yHAAyH;qBAC1H,CAAC,IAAI,CAAC,IAAI,CAAC;oBACZ,QAAQ,EAAE,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC5C,CAAC;QACN,CAAC;IACH,CAAC;CACF"}
@@ -1,11 +1,11 @@
1
- export interface Profile {
1
+ interface Profile {
2
2
  defaultProvider: string;
3
- defaultModel: string;
3
+ defaultModel?: string;
4
4
  defaultTimeoutMs: number;
5
5
  }
6
6
  export declare class ProfileLoader {
7
7
  readonly storageRoot: string;
8
8
  constructor(storageRoot?: string);
9
- get profilePath(): string;
10
9
  load(): Promise<Profile>;
11
10
  }
11
+ export {};
@@ -33,19 +33,16 @@ export class ProfileLoader {
33
33
  constructor(storageRoot = path.join(process.cwd(), ".aipanel")) {
34
34
  this.storageRoot = storageRoot;
35
35
  }
36
- get profilePath() {
37
- return path.join(this.storageRoot, "profile.yml");
38
- }
39
36
  async load() {
40
37
  const defaults = {
41
38
  defaultProvider: "claude-code",
42
- defaultModel: "sonnet",
43
39
  defaultTimeoutMs: 120000,
44
40
  };
45
- if (!(await pathExists(this.profilePath))) {
41
+ const profilePath = path.join(this.storageRoot, "profile.yml");
42
+ if (!(await pathExists(profilePath))) {
46
43
  return defaults;
47
44
  }
48
- const text = await readText(this.profilePath, "utf8");
45
+ const text = await readText(profilePath, "utf8");
49
46
  return {
50
47
  ...defaults,
51
48
  ...parseSimpleYaml(text),
@@ -1 +1 @@
1
- {"version":3,"file":"ProfileLoader.js","sourceRoot":"","sources":["../../../src/app/ProfileLoader.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAQhE,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,OAAO,GAAqB,EAAE,CAAC;IAErC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAClC,SAAS;QACX,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,SAAS;QACX,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAE3C,IAAI,GAAG,KAAK,iBAAiB,EAAE,CAAC;YAC9B,OAAO,CAAC,eAAe,GAAG,KAAK,CAAC;QAClC,CAAC;QAED,IAAI,GAAG,KAAK,cAAc,EAAE,CAAC;YAC3B,OAAO,CAAC,YAAY,GAAG,KAAK,CAAC;QAC/B,CAAC;QAED,IAAI,GAAG,KAAK,kBAAkB,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9B,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7B,OAAO,CAAC,gBAAgB,GAAG,OAAO,CAAC;YACrC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,OAAO,aAAa;IACf,WAAW,CAAS;IAE7B,YAAY,cAAsB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC;QACpE,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,QAAQ,GAAY;YACxB,eAAe,EAAE,aAAa;YAC9B,YAAY,EAAE,QAAQ;YACtB,gBAAgB,EAAE,MAAM;SACzB,CAAC;QAEF,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;YAC1C,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QACtD,OAAO;YACL,GAAG,QAAQ;YACX,GAAG,eAAe,CAAC,IAAI,CAAC;SACzB,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"ProfileLoader.js","sourceRoot":"","sources":["../../../src/app/ProfileLoader.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAQhE,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,OAAO,GAAqB,EAAE,CAAC;IAErC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAClC,SAAS;QACX,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,SAAS;QACX,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAE3C,IAAI,GAAG,KAAK,iBAAiB,EAAE,CAAC;YAC9B,OAAO,CAAC,eAAe,GAAG,KAAK,CAAC;QAClC,CAAC;QAED,IAAI,GAAG,KAAK,cAAc,EAAE,CAAC;YAC3B,OAAO,CAAC,YAAY,GAAG,KAAK,CAAC;QAC/B,CAAC;QAED,IAAI,GAAG,KAAK,kBAAkB,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9B,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7B,OAAO,CAAC,gBAAgB,GAAG,OAAO,CAAC;YACrC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,OAAO,aAAa;IACf,WAAW,CAAS;IAE7B,YAAY,cAAsB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC;QACpE,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,QAAQ,GAAY;YACxB,eAAe,EAAE,aAAa;YAC9B,gBAAgB,EAAE,MAAM;SACzB,CAAC;QACF,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QAE/D,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;YACrC,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QACjD,OAAO;YACL,GAAG,QAAQ;YACX,GAAG,eAAe,CAAC,IAAI,CAAC;SACzB,CAAC;IACJ,CAAC;CACF"}
@@ -1,5 +1,6 @@
1
- import { Artifact, type Clock, type IdGenerator } from "../domain/index.js";
2
- export interface ArtifactRepositoryOptions {
1
+ import { Artifact } from "../domain/artifact.js";
2
+ import { type Clock, type IdGenerator } from "../domain/base.js";
3
+ interface ArtifactRepositoryOptions {
3
4
  storageRoot?: string;
4
5
  clock?: Clock;
5
6
  idGenerator?: IdGenerator;
@@ -18,16 +19,10 @@ export declare class ArtifactRepository {
18
19
  private readonly clock;
19
20
  private readonly idGenerator;
20
21
  constructor(options?: ArtifactRepositoryOptions);
21
- get artifactsDirectory(): string;
22
- runDirectory(runId?: string | null): string;
23
- metadataPathFor(artifactId: string, runId?: string | null): string;
24
- saveMetadata(artifact: Artifact): Promise<Artifact>;
25
22
  writeTextArtifact(params: ArtifactWriteParams): Promise<Artifact>;
26
- writeJsonArtifact(params: Omit<ArtifactWriteParams, 'content' | 'extension' | 'mimeType'> & {
23
+ writeJsonArtifact(params: Omit<ArtifactWriteParams, "content" | "extension" | "mimeType"> & {
27
24
  content: unknown;
28
25
  extension?: string;
29
26
  }): Promise<Artifact>;
30
- get(artifactId: string, runId?: string | null): Promise<Artifact | null>;
31
- listByRun(runId?: string | null): Promise<Artifact[]>;
32
27
  }
33
28
  export {};
@@ -1,41 +1,25 @@
1
- import { mkdir, readdir, readFile, stat, writeFile } from 'node:fs/promises';
2
- import path from 'node:path';
3
- import { Artifact, defaultClock, defaultIdGenerator, } from "../domain/index.js";
1
+ import { mkdir, stat, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { Artifact, } from "../domain/artifact.js";
4
+ import { defaultClock, defaultIdGenerator, } from "../domain/base.js";
4
5
  export class ArtifactRepository {
5
6
  storageRoot;
6
7
  clock;
7
8
  idGenerator;
8
9
  constructor(options = {}) {
9
- this.storageRoot = options.storageRoot ?? path.join(process.cwd(), '.aipanel');
10
+ this.storageRoot =
11
+ options.storageRoot ?? path.join(process.cwd(), ".aipanel");
10
12
  this.clock = options.clock ?? defaultClock;
11
13
  this.idGenerator = options.idGenerator ?? defaultIdGenerator;
12
14
  }
13
- get artifactsDirectory() {
14
- return path.join(this.storageRoot, 'artifacts');
15
- }
16
- runDirectory(runId) {
17
- return path.join(this.artifactsDirectory, runId ?? '_shared');
18
- }
19
- metadataPathFor(artifactId, runId) {
20
- return path.join(this.runDirectory(runId), `${artifactId}.artifact.json`);
21
- }
22
- async saveMetadata(artifact) {
23
- const metadataPath = artifact.metadataPath ?? this.metadataPathFor(artifact.artifactId, artifact.runId);
24
- await mkdir(path.dirname(metadataPath), { recursive: true });
25
- await writeFile(metadataPath, JSON.stringify(artifact.toJSON(), null, 2), 'utf8');
26
- return Artifact.fromJSON({
27
- ...artifact.toJSON(),
28
- metadataPath,
29
- });
30
- }
31
15
  async writeTextArtifact(params) {
32
- const artifactId = this.idGenerator('artifact');
33
- const runDirectory = this.runDirectory(params.runId);
34
- const extension = params.extension ?? '.txt';
35
- const contentPath = path.join(runDirectory, `${artifactId}${extension.startsWith('.') ? extension : `.${extension}`}`);
36
- const metadataPath = this.metadataPathFor(artifactId, params.runId);
16
+ const artifactId = this.idGenerator("artifact");
17
+ const runDirectory = path.join(this.storageRoot, "artifacts", params.runId ?? "_shared");
18
+ const extension = params.extension ?? ".txt";
19
+ const contentPath = path.join(runDirectory, `${artifactId}${extension.startsWith(".") ? extension : `.${extension}`}`);
20
+ const metadataPath = path.join(runDirectory, `${artifactId}.artifact.json`);
37
21
  await mkdir(runDirectory, { recursive: true });
38
- await writeFile(contentPath, params.content, 'utf8');
22
+ await writeFile(contentPath, params.content, "utf8");
39
23
  const fileStat = await stat(contentPath);
40
24
  const artifact = Artifact.create({
41
25
  artifactId,
@@ -44,48 +28,28 @@ export class ArtifactRepository {
44
28
  metadataPath,
45
29
  sizeBytes: fileStat.size,
46
30
  createdAt: this.clock(),
47
- ...(params.sessionId !== undefined ? { sessionId: params.sessionId } : {}),
31
+ ...(params.sessionId !== undefined
32
+ ? { sessionId: params.sessionId }
33
+ : {}),
48
34
  ...(params.runId !== undefined ? { runId: params.runId } : {}),
49
35
  ...(params.turnId !== undefined ? { turnId: params.turnId } : {}),
50
36
  ...(params.mimeType !== undefined ? { mimeType: params.mimeType } : {}),
51
37
  });
52
- await this.saveMetadata(artifact);
53
- return artifact;
38
+ const resolvedMetadataPath = artifact.metadataPath ?? metadataPath;
39
+ await mkdir(path.dirname(resolvedMetadataPath), { recursive: true });
40
+ await writeFile(resolvedMetadataPath, JSON.stringify(artifact.toJSON(), null, 2), "utf8");
41
+ return Artifact.fromJSON({
42
+ ...artifact.toJSON(),
43
+ metadataPath: resolvedMetadataPath,
44
+ });
54
45
  }
55
46
  async writeJsonArtifact(params) {
56
47
  return this.writeTextArtifact({
57
48
  ...params,
58
49
  content: JSON.stringify(params.content, null, 2),
59
- extension: params.extension ?? '.json',
60
- mimeType: 'application/json',
50
+ extension: params.extension ?? ".json",
51
+ mimeType: "application/json",
61
52
  });
62
53
  }
63
- async get(artifactId, runId) {
64
- try {
65
- const raw = await readFile(this.metadataPathFor(artifactId, runId), 'utf8');
66
- const parsed = JSON.parse(raw);
67
- return Artifact.fromJSON(parsed);
68
- }
69
- catch (error) {
70
- if (error.code === 'ENOENT') {
71
- return null;
72
- }
73
- throw error;
74
- }
75
- }
76
- async listByRun(runId) {
77
- const directory = this.runDirectory(runId);
78
- await mkdir(directory, { recursive: true });
79
- const entries = await readdir(directory, { withFileTypes: true });
80
- const artifacts = await Promise.all(entries
81
- .filter((entry) => entry.isFile() && entry.name.endsWith('.artifact.json'))
82
- .map(async (entry) => {
83
- const artifactId = entry.name.replace(/\.artifact\.json$/u, '');
84
- return this.get(artifactId, runId);
85
- }));
86
- return artifacts
87
- .filter((artifact) => Boolean(artifact))
88
- .sort((left, right) => left.createdAt.localeCompare(right.createdAt));
89
- }
90
54
  }
91
55
  //# sourceMappingURL=ArtifactRepository.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ArtifactRepository.js","sourceRoot":"","sources":["../../../src/artifact/ArtifactRepository.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ArtifactRepository.js","sourceRoot":"","sources":["../../../src/artifact/ArtifactRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,QAAQ,GACT,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,YAAY,EACZ,kBAAkB,GAGnB,MAAM,mBAAmB,CAAC;AAkB3B,MAAM,OAAO,kBAAkB;IACZ,WAAW,CAAS;IACpB,KAAK,CAAQ;IACb,WAAW,CAAc;IAE1C,YAAY,UAAqC,EAAE;QACjD,IAAI,CAAC,WAAW;YACd,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;QAC9D,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,YAAY,CAAC;QAC3C,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,kBAAkB,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,MAA2B;QACjD,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAC5B,IAAI,CAAC,WAAW,EAChB,WAAW,EACX,MAAM,CAAC,KAAK,IAAI,SAAS,CAC1B,CAAC;QACF,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC;QAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAC3B,YAAY,EACZ,GAAG,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,EAAE,CAC1E,CAAC;QACF,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,UAAU,gBAAgB,CAAC,CAAC;QAE5E,MAAM,KAAK,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,MAAM,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,CAAC;QAEzC,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC/B,UAAU;YACV,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI,EAAE,WAAW;YACjB,YAAY;YACZ,SAAS,EAAE,QAAQ,CAAC,IAAI;YACxB,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE;YACvB,GAAG,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS;gBAChC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE;gBACjC,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjE,GAAG,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxE,CAAC,CAAC;QAEH,MAAM,oBAAoB,GAAG,QAAQ,CAAC,YAAY,IAAI,YAAY,CAAC;QACnE,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrE,MAAM,SAAS,CACb,oBAAoB,EACpB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAC1C,MAAM,CACP,CAAC;QACF,OAAO,QAAQ,CAAC,QAAQ,CAAC;YACvB,GAAG,QAAQ,CAAC,MAAM,EAAE;YACpB,YAAY,EAAE,oBAAoB;SACnC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,MAGC;QAED,OAAO,IAAI,CAAC,iBAAiB,CAAC;YAC5B,GAAG,MAAM;YACT,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAChD,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,OAAO;YACtC,QAAQ,EAAE,kBAAkB;SAC7B,CAAC,CAAC;IACL,CAAC;CACF"}