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.
- package/README.md +61 -41
- package/dist/src/app/AipanelApp.d.ts +6 -3
- package/dist/src/app/AipanelApp.js +22 -14
- package/dist/src/app/AipanelApp.js.map +1 -1
- package/dist/src/app/CommandRouter.js +19 -7
- package/dist/src/app/CommandRouter.js.map +1 -1
- package/dist/src/app/ProfileLoader.d.ts +3 -3
- package/dist/src/app/ProfileLoader.js +3 -6
- package/dist/src/app/ProfileLoader.js.map +1 -1
- package/dist/src/artifact/ArtifactRepository.d.ts +4 -9
- package/dist/src/artifact/ArtifactRepository.js +24 -60
- package/dist/src/artifact/ArtifactRepository.js.map +1 -1
- package/dist/src/cli/aipanel.js +2 -1
- package/dist/src/cli/aipanel.js.map +1 -1
- package/dist/src/compare/ComparisonEngine.d.ts +10 -1
- package/dist/src/compare/ComparisonEngine.js.map +1 -1
- package/dist/src/compare/ResponseNormalizer.d.ts +3 -2
- package/dist/src/compare/ResponseNormalizer.js +4 -2
- package/dist/src/compare/ResponseNormalizer.js.map +1 -1
- package/dist/src/context/ContextCollector.d.ts +5 -4
- package/dist/src/context/ContextCollector.js +4 -2
- package/dist/src/context/ContextCollector.js.map +1 -1
- package/dist/src/domain/artifact.d.ts +3 -2
- package/dist/src/domain/artifact.js +7 -7
- package/dist/src/domain/base.d.ts +0 -1
- package/dist/src/domain/base.js +1 -7
- package/dist/src/domain/base.js.map +1 -1
- package/dist/src/domain/run.d.ts +9 -23
- package/dist/src/domain/run.js +55 -51
- package/dist/src/domain/run.js.map +1 -1
- package/dist/src/domain/session.d.ts +6 -5
- package/dist/src/domain/session.js +9 -7
- package/dist/src/domain/session.js.map +1 -1
- package/dist/src/domain/value-objects.js +3 -1
- package/dist/src/domain/value-objects.js.map +1 -1
- package/dist/src/output/ResultRenderer.d.ts +3 -2
- package/dist/src/output/ResultRenderer.js.map +1 -1
- package/dist/src/providers/ClaudeCodeAdapter.d.ts +1 -0
- package/dist/src/providers/ClaudeCodeAdapter.js +1 -0
- package/dist/src/providers/ClaudeCodeAdapter.js.map +1 -1
- package/dist/src/providers/CodexExecAdapter.d.ts +5 -0
- package/dist/src/providers/CodexExecAdapter.js +128 -0
- package/dist/src/providers/CodexExecAdapter.js.map +1 -0
- package/dist/src/providers/ProviderAdapter.d.ts +1 -0
- package/dist/src/providers/ProviderRegistry.d.ts +3 -2
- package/dist/src/providers/ProviderRegistry.js +3 -3
- package/dist/src/providers/ProviderRegistry.js.map +1 -1
- package/dist/src/run/RunCoordinator.d.ts +10 -16
- package/dist/src/run/RunCoordinator.js +5 -20
- package/dist/src/run/RunCoordinator.js.map +1 -1
- package/dist/src/run/RunRepository.d.ts +3 -7
- package/dist/src/run/RunRepository.js +9 -45
- package/dist/src/run/RunRepository.js.map +1 -1
- package/dist/src/session/SessionManager.d.ts +5 -3
- package/dist/src/session/SessionManager.js +5 -6
- package/dist/src/session/SessionManager.js.map +1 -1
- package/dist/src/session/SessionRepository.d.ts +3 -5
- package/dist/src/session/SessionRepository.js +14 -28
- package/dist/src/session/SessionRepository.js.map +1 -1
- package/dist/src/shared/clock.d.ts +0 -1
- package/dist/src/shared/clock.js +0 -3
- package/dist/src/shared/clock.js.map +1 -1
- package/dist/src/shared/file-system.d.ts +0 -6
- package/dist/src/shared/file-system.js +1 -23
- package/dist/src/shared/file-system.js.map +1 -1
- package/dist/src/usecases/ConsultUseCase.d.ts +2 -1
- package/dist/src/usecases/ConsultUseCase.js +8 -8
- package/dist/src/usecases/ConsultUseCase.js.map +1 -1
- package/dist/src/usecases/DebugUseCase.js +20 -8
- package/dist/src/usecases/DebugUseCase.js.map +1 -1
- package/dist/src/usecases/FollowupUseCase.js.map +1 -1
- package/package.json +19 -63
- package/dist/src/app/WorkflowSelector.d.ts +0 -4
- package/dist/src/app/WorkflowSelector.js +0 -6
- package/dist/src/app/WorkflowSelector.js.map +0 -1
- package/dist/src/app/index.d.ts +0 -4
- package/dist/src/app/index.js +0 -5
- package/dist/src/app/index.js.map +0 -1
- package/dist/src/app/types.d.ts +0 -36
- package/dist/src/app/types.js +0 -2
- package/dist/src/app/types.js.map +0 -1
- package/dist/src/artifact/index.d.ts +0 -1
- package/dist/src/artifact/index.js +0 -2
- package/dist/src/artifact/index.js.map +0 -1
- package/dist/src/compare/index.d.ts +0 -3
- package/dist/src/compare/index.js +0 -3
- package/dist/src/compare/index.js.map +0 -1
- package/dist/src/context/index.d.ts +0 -2
- package/dist/src/context/index.js +0 -2
- package/dist/src/context/index.js.map +0 -1
- package/dist/src/domain/index.d.ts +0 -5
- package/dist/src/domain/index.js +0 -6
- package/dist/src/domain/index.js.map +0 -1
- package/dist/src/index.d.ts +0 -16
- package/dist/src/index.js +0 -16
- package/dist/src/index.js.map +0 -1
- package/dist/src/orchestrator/PlanBuilder.d.ts +0 -6
- package/dist/src/orchestrator/PlanBuilder.js +0 -59
- package/dist/src/orchestrator/PlanBuilder.js.map +0 -1
- package/dist/src/orchestrator/ResultMerger.d.ts +0 -10
- package/dist/src/orchestrator/ResultMerger.js +0 -19
- package/dist/src/orchestrator/ResultMerger.js.map +0 -1
- package/dist/src/orchestrator/TaskExecutor.d.ts +0 -20
- package/dist/src/orchestrator/TaskExecutor.js +0 -81
- package/dist/src/orchestrator/TaskExecutor.js.map +0 -1
- package/dist/src/orchestrator/TaskScheduler.d.ts +0 -4
- package/dist/src/orchestrator/TaskScheduler.js +0 -19
- package/dist/src/orchestrator/TaskScheduler.js.map +0 -1
- package/dist/src/orchestrator/ValidationRunner.d.ts +0 -4
- package/dist/src/orchestrator/ValidationRunner.js +0 -22
- package/dist/src/orchestrator/ValidationRunner.js.map +0 -1
- package/dist/src/orchestrator/index.d.ts +0 -5
- package/dist/src/orchestrator/index.js +0 -6
- package/dist/src/orchestrator/index.js.map +0 -1
- package/dist/src/output/index.d.ts +0 -1
- package/dist/src/output/index.js +0 -2
- package/dist/src/output/index.js.map +0 -1
- package/dist/src/providers/index.d.ts +0 -3
- package/dist/src/providers/index.js +0 -4
- package/dist/src/providers/index.js.map +0 -1
- package/dist/src/run/index.d.ts +0 -2
- package/dist/src/run/index.js +0 -3
- package/dist/src/run/index.js.map +0 -1
- package/dist/src/session/index.d.ts +0 -2
- package/dist/src/session/index.js +0 -3
- package/dist/src/session/index.js.map +0 -1
- package/dist/src/shared/contracts.d.ts +0 -256
- package/dist/src/shared/contracts.js +0 -2
- package/dist/src/shared/contracts.js.map +0 -1
- package/dist/src/shared/errors.d.ts +0 -9
- package/dist/src/shared/errors.js +0 -11
- package/dist/src/shared/errors.js.map +0 -1
- package/dist/src/shared/index.d.ts +0 -4
- package/dist/src/shared/index.js +0 -5
- package/dist/src/shared/index.js.map +0 -1
- package/dist/src/usecases/CompareUseCase.d.ts +0 -6
- package/dist/src/usecases/CompareUseCase.js +0 -9
- package/dist/src/usecases/CompareUseCase.js.map +0 -1
- package/dist/src/usecases/helpers.d.ts +0 -9
- package/dist/src/usecases/helpers.js +0 -31
- package/dist/src/usecases/helpers.js.map +0 -1
- package/dist/src/usecases/index.d.ts +0 -5
- package/dist/src/usecases/index.js +0 -6
- 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`
|
|
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
|
|
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
|
-
##
|
|
43
|
+
## Worktree Shortcut
|
|
42
44
|
|
|
43
|
-
|
|
45
|
+
`aipanel` 直下の `.worktree/` に Git worktree を増やしたいときは、以下のショートカットが使えます。
|
|
44
46
|
|
|
45
47
|
```bash
|
|
46
|
-
npm
|
|
47
|
-
|
|
48
|
+
npm run worktree:add -- feature/debug-ui
|
|
49
|
+
make worktree-add BRANCH=feature/debug-ui
|
|
48
50
|
```
|
|
49
51
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
## Import Usage
|
|
52
|
+
補足:
|
|
53
53
|
|
|
54
|
-
|
|
54
|
+
- 既存の local branch があればその branch をそのまま開きます
|
|
55
|
+
- `origin/<branch>` だけ存在する場合は tracking branch を作ります
|
|
56
|
+
- どちらもない場合は `HEAD` から新しい branch を作ります
|
|
57
|
+
- 配置先は `.worktree/<branch>` です
|
|
55
58
|
|
|
56
|
-
|
|
57
|
-
import { AipanelApp, Session, runCli } from "aipanel-cli";
|
|
58
|
-
import { Run } from "aipanel-cli/domain";
|
|
59
|
+
base を変えたい場合:
|
|
59
60
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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
|
-
|
|
66
|
+
一覧確認:
|
|
65
67
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
command: "consult",
|
|
70
|
-
mode: "direct",
|
|
71
|
-
});
|
|
68
|
+
```bash
|
|
69
|
+
npm run worktree:list
|
|
70
|
+
make worktree-list
|
|
72
71
|
```
|
|
73
72
|
|
|
74
|
-
|
|
73
|
+
## Package Install
|
|
74
|
+
|
|
75
|
+
公開後は package として install できます。
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
npm install -g aipanel-cli
|
|
79
|
+
aipanel providers --json
|
|
80
|
+
```
|
|
75
81
|
|
|
76
|
-
-
|
|
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`
|
|
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
|
-
|
|
216
|
-
-
|
|
217
|
-
-
|
|
218
|
-
-
|
|
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 {
|
|
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
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
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 ??
|
|
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({
|
|
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
|
-
|
|
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,
|
|
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
|
|
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 {
|
|
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 {
|
|
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 {
|
|
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":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
interface Profile {
|
|
2
2
|
defaultProvider: string;
|
|
3
|
-
defaultModel
|
|
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
|
-
|
|
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(
|
|
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,
|
|
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
|
|
2
|
-
|
|
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,
|
|
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,
|
|
2
|
-
import path from
|
|
3
|
-
import { Artifact,
|
|
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 =
|
|
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(
|
|
33
|
-
const runDirectory = this.
|
|
34
|
-
const extension = params.extension ??
|
|
35
|
-
const contentPath = path.join(runDirectory, `${artifactId}${extension.startsWith(
|
|
36
|
-
const metadataPath =
|
|
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,
|
|
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
|
|
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
|
-
|
|
53
|
-
|
|
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 ??
|
|
60
|
-
mimeType:
|
|
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":"AAAA,OAAO,EAAE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"ArtifactRepository.js","sourceRoot":"","sources":["../../../src/artifact/ArtifactRepository.ts"],"names":[],"mappings":"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"}
|