aipanel-cli 0.1.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/LICENSE +21 -0
- package/README.md +166 -0
- package/dist/bin/aipanel.d.ts +2 -0
- package/dist/bin/aipanel.js +5 -0
- package/dist/bin/aipanel.js.map +1 -0
- package/dist/src/app/AipanelApp.d.ts +17 -0
- package/dist/src/app/AipanelApp.js +53 -0
- package/dist/src/app/AipanelApp.js.map +1 -0
- package/dist/src/app/CommandRouter.d.ts +9 -0
- package/dist/src/app/CommandRouter.js +154 -0
- package/dist/src/app/CommandRouter.js.map +1 -0
- package/dist/src/app/ProfileLoader.d.ts +10 -0
- package/dist/src/app/ProfileLoader.js +51 -0
- package/dist/src/app/ProfileLoader.js.map +1 -0
- package/dist/src/app/WorkflowSelector.d.ts +4 -0
- package/dist/src/app/WorkflowSelector.js +6 -0
- package/dist/src/app/WorkflowSelector.js.map +1 -0
- package/dist/src/app/index.d.ts +4 -0
- package/dist/src/app/index.js +5 -0
- package/dist/src/app/index.js.map +1 -0
- package/dist/src/app/types.d.ts +36 -0
- package/dist/src/app/types.js +2 -0
- package/dist/src/app/types.js.map +1 -0
- package/dist/src/artifact/ArtifactRepository.d.ts +33 -0
- package/dist/src/artifact/ArtifactRepository.js +91 -0
- package/dist/src/artifact/ArtifactRepository.js.map +1 -0
- package/dist/src/artifact/index.d.ts +1 -0
- package/dist/src/artifact/index.js +2 -0
- package/dist/src/artifact/index.js.map +1 -0
- package/dist/src/cli/aipanel.d.ts +2 -0
- package/dist/src/cli/aipanel.js +32 -0
- package/dist/src/cli/aipanel.js.map +1 -0
- package/dist/src/compare/ComparisonEngine.d.ts +5 -0
- package/dist/src/compare/ComparisonEngine.js +19 -0
- package/dist/src/compare/ComparisonEngine.js.map +1 -0
- package/dist/src/compare/ResponseNormalizer.d.ts +36 -0
- package/dist/src/compare/ResponseNormalizer.js +43 -0
- package/dist/src/compare/ResponseNormalizer.js.map +1 -0
- package/dist/src/compare/index.d.ts +3 -0
- package/dist/src/compare/index.js +3 -0
- package/dist/src/compare/index.js.map +1 -0
- package/dist/src/context/ContextCollector.d.ts +43 -0
- package/dist/src/context/ContextCollector.js +81 -0
- package/dist/src/context/ContextCollector.js.map +1 -0
- package/dist/src/context/index.d.ts +2 -0
- package/dist/src/context/index.js +2 -0
- package/dist/src/context/index.js.map +1 -0
- package/dist/src/domain/artifact.d.ts +36 -0
- package/dist/src/domain/artifact.js +62 -0
- package/dist/src/domain/artifact.js.map +1 -0
- package/dist/src/domain/base.d.ts +10 -0
- package/dist/src/domain/base.js +23 -0
- package/dist/src/domain/base.js.map +1 -0
- package/dist/src/domain/index.d.ts +5 -0
- package/dist/src/domain/index.js +6 -0
- package/dist/src/domain/index.js.map +1 -0
- package/dist/src/domain/run.d.ts +260 -0
- package/dist/src/domain/run.js +456 -0
- package/dist/src/domain/run.js.map +1 -0
- package/dist/src/domain/session.d.ts +72 -0
- package/dist/src/domain/session.js +131 -0
- package/dist/src/domain/session.js.map +1 -0
- package/dist/src/domain/value-objects.d.ts +120 -0
- package/dist/src/domain/value-objects.js +191 -0
- package/dist/src/domain/value-objects.js.map +1 -0
- package/dist/src/orchestrator/PlanBuilder.d.ts +6 -0
- package/dist/src/orchestrator/PlanBuilder.js +59 -0
- package/dist/src/orchestrator/PlanBuilder.js.map +1 -0
- package/dist/src/orchestrator/ResultMerger.d.ts +10 -0
- package/dist/src/orchestrator/ResultMerger.js +19 -0
- package/dist/src/orchestrator/ResultMerger.js.map +1 -0
- package/dist/src/orchestrator/TaskExecutor.d.ts +20 -0
- package/dist/src/orchestrator/TaskExecutor.js +81 -0
- package/dist/src/orchestrator/TaskExecutor.js.map +1 -0
- package/dist/src/orchestrator/TaskScheduler.d.ts +4 -0
- package/dist/src/orchestrator/TaskScheduler.js +19 -0
- package/dist/src/orchestrator/TaskScheduler.js.map +1 -0
- package/dist/src/orchestrator/ValidationRunner.d.ts +4 -0
- package/dist/src/orchestrator/ValidationRunner.js +22 -0
- package/dist/src/orchestrator/ValidationRunner.js.map +1 -0
- package/dist/src/orchestrator/index.d.ts +5 -0
- package/dist/src/orchestrator/index.js +6 -0
- package/dist/src/orchestrator/index.js.map +1 -0
- package/dist/src/output/ResultRenderer.d.ts +13 -0
- package/dist/src/output/ResultRenderer.js +49 -0
- package/dist/src/output/ResultRenderer.js.map +1 -0
- package/dist/src/output/index.d.ts +1 -0
- package/dist/src/output/index.js +2 -0
- package/dist/src/output/index.js.map +1 -0
- package/dist/src/providers/ClaudeCodeAdapter.d.ts +5 -0
- package/dist/src/providers/ClaudeCodeAdapter.js +95 -0
- package/dist/src/providers/ClaudeCodeAdapter.js.map +1 -0
- package/dist/src/providers/ProviderAdapter.d.ts +35 -0
- package/dist/src/providers/ProviderAdapter.js +2 -0
- package/dist/src/providers/ProviderAdapter.js.map +1 -0
- package/dist/src/providers/ProviderRegistry.d.ts +12 -0
- package/dist/src/providers/ProviderRegistry.js +23 -0
- package/dist/src/providers/ProviderRegistry.js.map +1 -0
- package/dist/src/providers/index.d.ts +3 -0
- package/dist/src/providers/index.js +4 -0
- package/dist/src/providers/index.js.map +1 -0
- package/dist/src/run/RunCoordinator.d.ts +33 -0
- package/dist/src/run/RunCoordinator.js +101 -0
- package/dist/src/run/RunCoordinator.js.map +1 -0
- package/dist/src/run/RunRepository.d.ts +14 -0
- package/dist/src/run/RunRepository.js +55 -0
- package/dist/src/run/RunRepository.js.map +1 -0
- package/dist/src/run/index.d.ts +2 -0
- package/dist/src/run/index.js +3 -0
- package/dist/src/run/index.js.map +1 -0
- package/dist/src/session/SessionManager.d.ts +26 -0
- package/dist/src/session/SessionManager.js +60 -0
- package/dist/src/session/SessionManager.js.map +1 -0
- package/dist/src/session/SessionRepository.d.ts +14 -0
- package/dist/src/session/SessionRepository.js +55 -0
- package/dist/src/session/SessionRepository.js.map +1 -0
- package/dist/src/session/index.d.ts +2 -0
- package/dist/src/session/index.js +3 -0
- package/dist/src/session/index.js.map +1 -0
- package/dist/src/shared/clock.d.ts +4 -0
- package/dist/src/shared/clock.js +9 -0
- package/dist/src/shared/clock.js.map +1 -0
- package/dist/src/shared/contracts.d.ts +254 -0
- package/dist/src/shared/contracts.js +2 -0
- package/dist/src/shared/contracts.js.map +1 -0
- package/dist/src/shared/errors.d.ts +9 -0
- package/dist/src/shared/errors.js +11 -0
- package/dist/src/shared/errors.js.map +1 -0
- package/dist/src/shared/file-system.d.ts +8 -0
- package/dist/src/shared/file-system.js +36 -0
- package/dist/src/shared/file-system.js.map +1 -0
- package/dist/src/shared/ids.d.ts +1 -0
- package/dist/src/shared/ids.js +6 -0
- package/dist/src/shared/ids.js.map +1 -0
- package/dist/src/usecases/CompareUseCase.d.ts +6 -0
- package/dist/src/usecases/CompareUseCase.js +9 -0
- package/dist/src/usecases/CompareUseCase.js.map +1 -0
- package/dist/src/usecases/ConsultUseCase.d.ts +48 -0
- package/dist/src/usecases/ConsultUseCase.js +187 -0
- package/dist/src/usecases/ConsultUseCase.js.map +1 -0
- package/dist/src/usecases/DebugUseCase.d.ts +48 -0
- package/dist/src/usecases/DebugUseCase.js +191 -0
- package/dist/src/usecases/DebugUseCase.js.map +1 -0
- package/dist/src/usecases/FollowupUseCase.d.ts +6 -0
- package/dist/src/usecases/FollowupUseCase.js +14 -0
- package/dist/src/usecases/FollowupUseCase.js.map +1 -0
- package/dist/src/usecases/ListProvidersUseCase.d.ts +9 -0
- package/dist/src/usecases/ListProvidersUseCase.js +13 -0
- package/dist/src/usecases/ListProvidersUseCase.js.map +1 -0
- package/dist/src/usecases/helpers.d.ts +9 -0
- package/dist/src/usecases/helpers.js +31 -0
- package/dist/src/usecases/helpers.js.map +1 -0
- package/dist/src/usecases/index.d.ts +5 -0
- package/dist/src/usecases/index.js +6 -0
- package/dist/src/usecases/index.js.map +1 -0
- package/package.json +57 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 sunagaku
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
# aipanel
|
|
2
|
+
|
|
3
|
+
`aipanel` は、Claude Code を provider として使いながら、相談、継続会話、デバッグ調査を CLI で進めるための TypeScript 製 broker / orchestrator です。
|
|
4
|
+
|
|
5
|
+
現時点の phase 1 では、`claude-code` 単独 provider を前提に、`Session / Run / Artifact` を `aipanel` 側で正本管理します。
|
|
6
|
+
|
|
7
|
+
## Current Status
|
|
8
|
+
- phase 1 実装済み
|
|
9
|
+
- provider は `claude-code` のみ
|
|
10
|
+
- 利用可能 command は `providers`, `consult`, `followup`, `debug`
|
|
11
|
+
- `compare` は phase 2 予約で、内部 placeholder のみ残している
|
|
12
|
+
|
|
13
|
+
## Setup
|
|
14
|
+
```bash
|
|
15
|
+
npm install
|
|
16
|
+
npm run build
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
`Makefile` を使う場合は以下でも同じです。
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
make install
|
|
23
|
+
make build
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
ビルド後は以下で実行できます。
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
node dist/bin/aipanel.js providers --json
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Package Install
|
|
33
|
+
|
|
34
|
+
公開後は package として install できます。
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
npm install -g aipanel-cli
|
|
38
|
+
aipanel providers --json
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
公開前のローカル確認は tarball か `Makefile` で行えます。
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
tarball="$(npm pack)"
|
|
45
|
+
npm install -g "./${tarball}"
|
|
46
|
+
aipanel providers --json
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
make pack-dry-run
|
|
51
|
+
make verify-package
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
公開前の最終確認:
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
make publish-check
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
公開:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
make publish
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Commands
|
|
67
|
+
```bash
|
|
68
|
+
node dist/bin/aipanel.js providers [--json]
|
|
69
|
+
node dist/bin/aipanel.js consult "<question>" [--cwd <dir>] [--file <path>] [--diff <path>] [--log <path>] [--timeout <ms>] [--json]
|
|
70
|
+
node dist/bin/aipanel.js followup --session <sessionId> "<question>" [--cwd <dir>] [--timeout <ms>] [--json]
|
|
71
|
+
node dist/bin/aipanel.js debug "<question>" [--cwd <dir>] [--file <path>] [--diff <path>] [--log <path>] [--timeout <ms>] [--json]
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
よく使う例:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
node dist/bin/aipanel.js consult "この設計どう?" --json
|
|
78
|
+
node dist/bin/aipanel.js consult "このログから原因わかる?" --cwd ./repo --log logs/app.log --file src/server.ts --json
|
|
79
|
+
node dist/bin/aipanel.js followup --session session_xxx "この修正方針で進めていい?" --json
|
|
80
|
+
node dist/bin/aipanel.js debug "この不具合の根本原因は?" --cwd ./repo --file src/cache.ts --log logs/error.log --json
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Runtime Notes
|
|
84
|
+
- `--cwd` は provider 実行ディレクトリだけでなく、`--file`, `--diff`, `--log` の相対パス解決にも使われます
|
|
85
|
+
- `AIPANEL_STORAGE_ROOT` を指定すると、session / run / artifact の保存先を切り替えられます
|
|
86
|
+
- `followup` は Claude Code の native resume を正本にせず、`aipanel` 側の session 履歴再構築を基本にしています
|
|
87
|
+
|
|
88
|
+
例:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
AIPANEL_STORAGE_ROOT="$(mktemp -d)" node dist/bin/aipanel.js consult "Reply with exactly: ready" --json --timeout 30000
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Storage Layout
|
|
95
|
+
デフォルトでは `./.aipanel` 配下に保存します。
|
|
96
|
+
|
|
97
|
+
```text
|
|
98
|
+
.aipanel/
|
|
99
|
+
sessions/
|
|
100
|
+
<sessionId>.json
|
|
101
|
+
runs/
|
|
102
|
+
<runId>.json
|
|
103
|
+
artifacts/
|
|
104
|
+
<runId>/
|
|
105
|
+
<artifactId>.json
|
|
106
|
+
<artifactId>.artifact.json
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
主な保存内容:
|
|
110
|
+
|
|
111
|
+
- `sessions/`: `Session`, `SessionTurn`, `ProviderRef`
|
|
112
|
+
- `runs/`: `Run`, `RunTask`, `TaskResult`, `ContextBundle`, `ProviderResponse`, `NormalizedResponse`, `ComparisonReport`
|
|
113
|
+
- `artifacts/`: context bundle, provider raw text/json, debug task outputs
|
|
114
|
+
|
|
115
|
+
## Tests
|
|
116
|
+
```bash
|
|
117
|
+
npm run typecheck
|
|
118
|
+
npm run test:unit
|
|
119
|
+
npm run test:integration
|
|
120
|
+
npm run test:e2e
|
|
121
|
+
npm test
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
`Makefile` 経由でも同じ確認ができます。
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
make typecheck
|
|
128
|
+
make test
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
テストの役割:
|
|
132
|
+
|
|
133
|
+
- `test:unit`: `ResponseNormalizer`, `ContextCollector`, `SessionManager`
|
|
134
|
+
- `test:integration`: built CLI + fake Claude provider で `providers/consult/followup/debug`
|
|
135
|
+
- `test:e2e`: built CLI の永続化込みフルフロー確認
|
|
136
|
+
|
|
137
|
+
## Verified Smoke Checks
|
|
138
|
+
2026-03-10 JST 時点で、以下を実行確認済みです。
|
|
139
|
+
|
|
140
|
+
- `npm run typecheck`
|
|
141
|
+
- `npm test`
|
|
142
|
+
- `npm run build`
|
|
143
|
+
- `npm run verify:package`
|
|
144
|
+
- `node dist/bin/aipanel.js providers --json`
|
|
145
|
+
- 実 Claude Code を使った `consult`
|
|
146
|
+
- 実 Claude Code を使った `followup`
|
|
147
|
+
- 実 Claude Code を使った `debug`
|
|
148
|
+
|
|
149
|
+
## Repo Skill
|
|
150
|
+
- repo-local Codex skill は [.agent/skills/aipanel/SKILL.md](./.agent/skills/aipanel/SKILL.md) にあります
|
|
151
|
+
- install / build / command usage / storage inspection / tests / E2E の入口を 1 本にまとめています
|
|
152
|
+
- アーキテクチャ図の再生成用 Skill は [.agent/skills/aipanel-diagrams/SKILL.md](./.agent/skills/aipanel-diagrams/SKILL.md) にあります
|
|
153
|
+
- Skill の参照ドキュメントは [docs/skills/aipanel-diagrams/00_overview.md](./docs/skills/aipanel-diagrams/00_overview.md) にあります
|
|
154
|
+
- draw.io 専用 sub-agent 定義は [drawio-diagrammer.yaml](./docs/skills/aipanel-diagrams/subagents/drawio-diagrammer.yaml) にあります
|
|
155
|
+
|
|
156
|
+
## Architecture Docs
|
|
157
|
+
- [Overview](./docs/rearchitecture/content_rearchitecture_2026-03-10/00_overview/00_overview.md)
|
|
158
|
+
- [Current Implementation Diagrams](./docs/rearchitecture/content_rearchitecture_2026-03-10/12_current-implementation-diagrams/12_current-implementation-diagrams.md)
|
|
159
|
+
- [Comparison](./docs/rearchitecture/content_rearchitecture_2026-03-10/06_comparison/06_comparison.md)
|
|
160
|
+
- [Recommended Architecture](./docs/rearchitecture/content_rearchitecture_2026-03-10/07_recommended-architecture/07_recommended-architecture.md)
|
|
161
|
+
- [Formal Architecture](./docs/rearchitecture/content_rearchitecture_2026-03-10/10_formal-architecture/10_formal-architecture.md)
|
|
162
|
+
- [Implementation Plan](./docs/rearchitecture/content_rearchitecture_2026-03-10/11_implementation-plan/11_implementation-plan.md)
|
|
163
|
+
- [Class Design](./docs/rearchitecture/content_rearchitecture_2026-03-10/08_class-design/08_class-design.md)
|
|
164
|
+
- [Data Flow](./docs/rearchitecture/content_rearchitecture_2026-03-10/09_data-flow/09_data-flow.md)
|
|
165
|
+
- [Broker + Orchestrator Internal Design](./docs/rearchitecture/broker_orchestrator_design_2026-03-10/00_overview/00_overview.md)
|
|
166
|
+
- [NPM Package Distribution](./docs/distribution/npm-package.md)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aipanel.js","sourceRoot":"","sources":["../../bin/aipanel.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACrD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ResultRenderer } from "../output/ResultRenderer.js";
|
|
2
|
+
import { ConsultUseCase, DebugUseCase, FollowupUseCase, ListProvidersUseCase } from "../usecases/index.js";
|
|
3
|
+
import { ProfileLoader } from "./ProfileLoader.js";
|
|
4
|
+
import { WorkflowSelector } from "./WorkflowSelector.js";
|
|
5
|
+
export declare class AipanelApp {
|
|
6
|
+
readonly profileLoader: ProfileLoader;
|
|
7
|
+
readonly workflowSelector: WorkflowSelector;
|
|
8
|
+
readonly resultRenderer: ResultRenderer;
|
|
9
|
+
readonly listProvidersUseCase: ListProvidersUseCase;
|
|
10
|
+
readonly consultUseCase: ConsultUseCase;
|
|
11
|
+
readonly followupUseCase: FollowupUseCase;
|
|
12
|
+
readonly debugUseCase: DebugUseCase;
|
|
13
|
+
constructor({ storageRoot, cwd, }?: {
|
|
14
|
+
storageRoot?: string;
|
|
15
|
+
cwd?: string;
|
|
16
|
+
});
|
|
17
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { ArtifactRepository } from "../artifact/ArtifactRepository.js";
|
|
3
|
+
import { ComparisonEngine } from "../compare/ComparisonEngine.js";
|
|
4
|
+
import { ContextCollector } from "../context/ContextCollector.js";
|
|
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";
|
|
10
|
+
import { ProfileLoader } from "./ProfileLoader.js";
|
|
11
|
+
import { WorkflowSelector } from "./WorkflowSelector.js";
|
|
12
|
+
export class AipanelApp {
|
|
13
|
+
profileLoader;
|
|
14
|
+
workflowSelector;
|
|
15
|
+
resultRenderer;
|
|
16
|
+
listProvidersUseCase;
|
|
17
|
+
consultUseCase;
|
|
18
|
+
followupUseCase;
|
|
19
|
+
debugUseCase;
|
|
20
|
+
constructor({ storageRoot = process.env.AIPANEL_STORAGE_ROOT ?? path.join(process.cwd(), ".aipanel"), cwd = process.env.AIPANEL_CWD ?? process.cwd(), } = {}) {
|
|
21
|
+
this.profileLoader = new ProfileLoader(storageRoot);
|
|
22
|
+
this.workflowSelector = new WorkflowSelector();
|
|
23
|
+
this.resultRenderer = new ResultRenderer();
|
|
24
|
+
const sessionRepository = new SessionRepository({ storageRoot });
|
|
25
|
+
const runRepository = new RunRepository({ storageRoot });
|
|
26
|
+
const artifactRepository = new ArtifactRepository({ storageRoot });
|
|
27
|
+
const sessionManager = new SessionManager({ repository: sessionRepository });
|
|
28
|
+
const runCoordinator = new RunCoordinator({ repository: runRepository });
|
|
29
|
+
const contextCollector = new ContextCollector({ cwd });
|
|
30
|
+
const providerRegistry = new ProviderRegistry({
|
|
31
|
+
adapters: [new ClaudeCodeAdapter()],
|
|
32
|
+
defaultProvider: "claude-code",
|
|
33
|
+
});
|
|
34
|
+
this.listProvidersUseCase = new ListProvidersUseCase(providerRegistry);
|
|
35
|
+
this.consultUseCase = new ConsultUseCase({
|
|
36
|
+
sessionManager,
|
|
37
|
+
runCoordinator,
|
|
38
|
+
providerRegistry,
|
|
39
|
+
contextCollector,
|
|
40
|
+
artifactRepository,
|
|
41
|
+
});
|
|
42
|
+
this.followupUseCase = new FollowupUseCase(this.consultUseCase);
|
|
43
|
+
this.debugUseCase = new DebugUseCase({
|
|
44
|
+
sessionManager,
|
|
45
|
+
runCoordinator,
|
|
46
|
+
providerRegistry,
|
|
47
|
+
contextCollector,
|
|
48
|
+
artifactRepository,
|
|
49
|
+
comparisonEngine: new ComparisonEngine(),
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=AipanelApp.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { AipanelApp } from "./AipanelApp.js";
|
|
2
|
+
function readFlagValue(args, index, flag) {
|
|
3
|
+
const value = args[index];
|
|
4
|
+
if (!value) {
|
|
5
|
+
throw new Error(`\`${flag}\` requires a value.`);
|
|
6
|
+
}
|
|
7
|
+
return value;
|
|
8
|
+
}
|
|
9
|
+
function requireQuestion(positionals) {
|
|
10
|
+
const question = positionals.join(" ").trim();
|
|
11
|
+
if (!question) {
|
|
12
|
+
throw new Error("Question is required.");
|
|
13
|
+
}
|
|
14
|
+
return question;
|
|
15
|
+
}
|
|
16
|
+
function parseArgs(argv) {
|
|
17
|
+
const [command = "help", ...rest] = argv;
|
|
18
|
+
const parsed = {
|
|
19
|
+
command,
|
|
20
|
+
positionals: [],
|
|
21
|
+
outputFormat: "text",
|
|
22
|
+
files: [],
|
|
23
|
+
diffs: [],
|
|
24
|
+
logs: [],
|
|
25
|
+
};
|
|
26
|
+
for (let index = 0; index < rest.length; index += 1) {
|
|
27
|
+
const token = rest[index];
|
|
28
|
+
if (!token) {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (token === "--json") {
|
|
32
|
+
parsed.outputFormat = "json";
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (token === "--session") {
|
|
36
|
+
parsed.sessionId = readFlagValue(rest, index + 1, "--session");
|
|
37
|
+
index += 1;
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if (token === "--provider") {
|
|
41
|
+
parsed.providerName = readFlagValue(rest, index + 1, "--provider");
|
|
42
|
+
index += 1;
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
if (token === "--timeout") {
|
|
46
|
+
const timeout = Number(readFlagValue(rest, index + 1, "--timeout"));
|
|
47
|
+
index += 1;
|
|
48
|
+
if (Number.isFinite(timeout)) {
|
|
49
|
+
parsed.timeoutMs = timeout;
|
|
50
|
+
}
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (token === "--cwd") {
|
|
54
|
+
parsed.cwd = readFlagValue(rest, index + 1, "--cwd");
|
|
55
|
+
index += 1;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (token === "--file") {
|
|
59
|
+
parsed.files.push(readFlagValue(rest, index + 1, "--file"));
|
|
60
|
+
index += 1;
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (token === "--diff") {
|
|
64
|
+
parsed.diffs.push(readFlagValue(rest, index + 1, "--diff"));
|
|
65
|
+
index += 1;
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (token === "--log") {
|
|
69
|
+
parsed.logs.push(readFlagValue(rest, index + 1, "--log"));
|
|
70
|
+
index += 1;
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
parsed.positionals.push(token);
|
|
74
|
+
}
|
|
75
|
+
return parsed;
|
|
76
|
+
}
|
|
77
|
+
export class CommandRouter {
|
|
78
|
+
app;
|
|
79
|
+
constructor(app) {
|
|
80
|
+
this.app = app;
|
|
81
|
+
}
|
|
82
|
+
async route(argv) {
|
|
83
|
+
const parsed = parseArgs(argv);
|
|
84
|
+
const profile = await this.app.profileLoader.load();
|
|
85
|
+
const providerName = parsed.providerName ?? profile.defaultProvider;
|
|
86
|
+
const timeoutMs = parsed.timeoutMs ?? profile.defaultTimeoutMs;
|
|
87
|
+
switch (parsed.command) {
|
|
88
|
+
case "providers": {
|
|
89
|
+
const result = await this.app.listProvidersUseCase.execute();
|
|
90
|
+
const rendered = this.app.resultRenderer.render(result, parsed.outputFormat);
|
|
91
|
+
return { output: rendered.text, exitCode: 0 };
|
|
92
|
+
}
|
|
93
|
+
case "consult": {
|
|
94
|
+
const result = await this.app.consultUseCase.execute({
|
|
95
|
+
command: "consult",
|
|
96
|
+
question: requireQuestion(parsed.positionals),
|
|
97
|
+
files: parsed.files,
|
|
98
|
+
diffs: parsed.diffs,
|
|
99
|
+
logs: parsed.logs,
|
|
100
|
+
providerName,
|
|
101
|
+
timeoutMs,
|
|
102
|
+
cwd: parsed.cwd ?? process.cwd(),
|
|
103
|
+
...(parsed.sessionId ? { sessionId: parsed.sessionId } : {}),
|
|
104
|
+
});
|
|
105
|
+
const rendered = this.app.resultRenderer.render(result, parsed.outputFormat);
|
|
106
|
+
return { output: rendered.text, exitCode: result.status === "partial" ? 2 : 0 };
|
|
107
|
+
}
|
|
108
|
+
case "followup": {
|
|
109
|
+
if (!parsed.sessionId) {
|
|
110
|
+
throw new Error("`followup` requires --session <id>.");
|
|
111
|
+
}
|
|
112
|
+
const result = await this.app.followupUseCase.execute({
|
|
113
|
+
question: requireQuestion(parsed.positionals),
|
|
114
|
+
sessionId: parsed.sessionId,
|
|
115
|
+
files: parsed.files,
|
|
116
|
+
diffs: parsed.diffs,
|
|
117
|
+
logs: parsed.logs,
|
|
118
|
+
providerName,
|
|
119
|
+
timeoutMs,
|
|
120
|
+
cwd: parsed.cwd ?? process.cwd(),
|
|
121
|
+
});
|
|
122
|
+
const rendered = this.app.resultRenderer.render(result, parsed.outputFormat);
|
|
123
|
+
return { output: rendered.text, exitCode: result.status === "partial" ? 2 : 0 };
|
|
124
|
+
}
|
|
125
|
+
case "debug": {
|
|
126
|
+
const result = await this.app.debugUseCase.execute({
|
|
127
|
+
question: requireQuestion(parsed.positionals),
|
|
128
|
+
files: parsed.files,
|
|
129
|
+
diffs: parsed.diffs,
|
|
130
|
+
logs: parsed.logs,
|
|
131
|
+
providerName,
|
|
132
|
+
timeoutMs,
|
|
133
|
+
cwd: parsed.cwd ?? process.cwd(),
|
|
134
|
+
...(parsed.sessionId ? { sessionId: parsed.sessionId } : {}),
|
|
135
|
+
});
|
|
136
|
+
const rendered = this.app.resultRenderer.render(result, parsed.outputFormat);
|
|
137
|
+
return { output: rendered.text, exitCode: result.status === "partial" ? 2 : 0 };
|
|
138
|
+
}
|
|
139
|
+
case "help":
|
|
140
|
+
default:
|
|
141
|
+
return {
|
|
142
|
+
output: [
|
|
143
|
+
"Usage:",
|
|
144
|
+
" aipanel providers [--json]",
|
|
145
|
+
" aipanel consult <question> [--provider <name>] [--file <path>] [--diff <path>] [--log <path>] [--json]",
|
|
146
|
+
" aipanel followup --session <id> <question> [--provider <name>] [--json]",
|
|
147
|
+
" aipanel debug <question> [--provider <name>] [--file <path>] [--diff <path>] [--log <path>] [--json]",
|
|
148
|
+
].join("\n"),
|
|
149
|
+
exitCode: parsed.command === "help" ? 0 : 1,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=CommandRouter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommandRouter.js","sourceRoot":"","sources":["../../../src/app/CommandRouter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { pathExists, readText } from "../shared/file-system.js";
|
|
3
|
+
function parseSimpleYaml(text) {
|
|
4
|
+
const profile = {};
|
|
5
|
+
for (const rawLine of text.split("\n")) {
|
|
6
|
+
const line = rawLine.trim();
|
|
7
|
+
if (!line || line.startsWith("#")) {
|
|
8
|
+
continue;
|
|
9
|
+
}
|
|
10
|
+
const index = line.indexOf(":");
|
|
11
|
+
if (index < 0) {
|
|
12
|
+
continue;
|
|
13
|
+
}
|
|
14
|
+
const key = line.slice(0, index).trim();
|
|
15
|
+
const value = line.slice(index + 1).trim();
|
|
16
|
+
if (key === "defaultProvider") {
|
|
17
|
+
profile.defaultProvider = value;
|
|
18
|
+
}
|
|
19
|
+
if (key === "defaultTimeoutMs") {
|
|
20
|
+
const timeout = Number(value);
|
|
21
|
+
if (Number.isFinite(timeout)) {
|
|
22
|
+
profile.defaultTimeoutMs = timeout;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return profile;
|
|
27
|
+
}
|
|
28
|
+
export class ProfileLoader {
|
|
29
|
+
storageRoot;
|
|
30
|
+
constructor(storageRoot = path.join(process.cwd(), ".aipanel")) {
|
|
31
|
+
this.storageRoot = storageRoot;
|
|
32
|
+
}
|
|
33
|
+
get profilePath() {
|
|
34
|
+
return path.join(this.storageRoot, "profile.yml");
|
|
35
|
+
}
|
|
36
|
+
async load() {
|
|
37
|
+
const defaults = {
|
|
38
|
+
defaultProvider: "claude-code",
|
|
39
|
+
defaultTimeoutMs: 120000,
|
|
40
|
+
};
|
|
41
|
+
if (!(await pathExists(this.profilePath))) {
|
|
42
|
+
return defaults;
|
|
43
|
+
}
|
|
44
|
+
const text = await readText(this.profilePath, "utf8");
|
|
45
|
+
return {
|
|
46
|
+
...defaults,
|
|
47
|
+
...parseSimpleYaml(text),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=ProfileLoader.js.map
|
|
@@ -0,0 +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;AAOhE,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,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,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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkflowSelector.js","sourceRoot":"","sources":["../../../src/app/WorkflowSelector.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,gBAAgB;IAC3B,MAAM,CAAC,OAAe;QACpB,OAAO,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC;IACzD,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/app/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export type WorkflowMode = "direct" | "orchestrated";
|
|
2
|
+
export type OutputFormat = "text" | "json";
|
|
3
|
+
export type CommandName = "providers" | "consult" | "followup" | "debug" | "compare" | "help";
|
|
4
|
+
export interface CommandFlags {
|
|
5
|
+
json: boolean;
|
|
6
|
+
mode?: WorkflowMode;
|
|
7
|
+
provider?: string;
|
|
8
|
+
sessionId?: string;
|
|
9
|
+
model?: string;
|
|
10
|
+
timeoutMs?: number;
|
|
11
|
+
cwd?: string;
|
|
12
|
+
files: string[];
|
|
13
|
+
logs: string[];
|
|
14
|
+
diffs: string[];
|
|
15
|
+
}
|
|
16
|
+
export interface CommandRoute {
|
|
17
|
+
command: CommandName;
|
|
18
|
+
args: string[];
|
|
19
|
+
flags: CommandFlags;
|
|
20
|
+
outputFormat: OutputFormat;
|
|
21
|
+
}
|
|
22
|
+
export interface AppResult {
|
|
23
|
+
exitCode: number;
|
|
24
|
+
payload: unknown;
|
|
25
|
+
}
|
|
26
|
+
export interface ProviderDescriptor {
|
|
27
|
+
name: string;
|
|
28
|
+
defaultModel: string;
|
|
29
|
+
supportsNativeResumeHint: boolean;
|
|
30
|
+
phase: "phase-1";
|
|
31
|
+
}
|
|
32
|
+
export interface Profile {
|
|
33
|
+
defaultProvider: string;
|
|
34
|
+
defaultModel: string;
|
|
35
|
+
storageRoot: string;
|
|
36
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/app/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Artifact, type Clock, type IdGenerator } from "../domain/index.js";
|
|
2
|
+
export interface ArtifactRepositoryOptions {
|
|
3
|
+
storageRoot?: string;
|
|
4
|
+
clock?: Clock;
|
|
5
|
+
idGenerator?: IdGenerator;
|
|
6
|
+
}
|
|
7
|
+
interface ArtifactWriteParams {
|
|
8
|
+
kind: string;
|
|
9
|
+
content: string;
|
|
10
|
+
extension?: string;
|
|
11
|
+
sessionId?: string | null;
|
|
12
|
+
runId?: string | null;
|
|
13
|
+
turnId?: string | null;
|
|
14
|
+
mimeType?: string | null;
|
|
15
|
+
}
|
|
16
|
+
export declare class ArtifactRepository {
|
|
17
|
+
private readonly storageRoot;
|
|
18
|
+
private readonly clock;
|
|
19
|
+
private readonly idGenerator;
|
|
20
|
+
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
|
+
writeTextArtifact(params: ArtifactWriteParams): Promise<Artifact>;
|
|
26
|
+
writeJsonArtifact(params: Omit<ArtifactWriteParams, 'content' | 'extension' | 'mimeType'> & {
|
|
27
|
+
content: unknown;
|
|
28
|
+
extension?: string;
|
|
29
|
+
}): Promise<Artifact>;
|
|
30
|
+
get(artifactId: string, runId?: string | null): Promise<Artifact | null>;
|
|
31
|
+
listByRun(runId?: string | null): Promise<Artifact[]>;
|
|
32
|
+
}
|
|
33
|
+
export {};
|