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.
Files changed (156) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +166 -0
  3. package/dist/bin/aipanel.d.ts +2 -0
  4. package/dist/bin/aipanel.js +5 -0
  5. package/dist/bin/aipanel.js.map +1 -0
  6. package/dist/src/app/AipanelApp.d.ts +17 -0
  7. package/dist/src/app/AipanelApp.js +53 -0
  8. package/dist/src/app/AipanelApp.js.map +1 -0
  9. package/dist/src/app/CommandRouter.d.ts +9 -0
  10. package/dist/src/app/CommandRouter.js +154 -0
  11. package/dist/src/app/CommandRouter.js.map +1 -0
  12. package/dist/src/app/ProfileLoader.d.ts +10 -0
  13. package/dist/src/app/ProfileLoader.js +51 -0
  14. package/dist/src/app/ProfileLoader.js.map +1 -0
  15. package/dist/src/app/WorkflowSelector.d.ts +4 -0
  16. package/dist/src/app/WorkflowSelector.js +6 -0
  17. package/dist/src/app/WorkflowSelector.js.map +1 -0
  18. package/dist/src/app/index.d.ts +4 -0
  19. package/dist/src/app/index.js +5 -0
  20. package/dist/src/app/index.js.map +1 -0
  21. package/dist/src/app/types.d.ts +36 -0
  22. package/dist/src/app/types.js +2 -0
  23. package/dist/src/app/types.js.map +1 -0
  24. package/dist/src/artifact/ArtifactRepository.d.ts +33 -0
  25. package/dist/src/artifact/ArtifactRepository.js +91 -0
  26. package/dist/src/artifact/ArtifactRepository.js.map +1 -0
  27. package/dist/src/artifact/index.d.ts +1 -0
  28. package/dist/src/artifact/index.js +2 -0
  29. package/dist/src/artifact/index.js.map +1 -0
  30. package/dist/src/cli/aipanel.d.ts +2 -0
  31. package/dist/src/cli/aipanel.js +32 -0
  32. package/dist/src/cli/aipanel.js.map +1 -0
  33. package/dist/src/compare/ComparisonEngine.d.ts +5 -0
  34. package/dist/src/compare/ComparisonEngine.js +19 -0
  35. package/dist/src/compare/ComparisonEngine.js.map +1 -0
  36. package/dist/src/compare/ResponseNormalizer.d.ts +36 -0
  37. package/dist/src/compare/ResponseNormalizer.js +43 -0
  38. package/dist/src/compare/ResponseNormalizer.js.map +1 -0
  39. package/dist/src/compare/index.d.ts +3 -0
  40. package/dist/src/compare/index.js +3 -0
  41. package/dist/src/compare/index.js.map +1 -0
  42. package/dist/src/context/ContextCollector.d.ts +43 -0
  43. package/dist/src/context/ContextCollector.js +81 -0
  44. package/dist/src/context/ContextCollector.js.map +1 -0
  45. package/dist/src/context/index.d.ts +2 -0
  46. package/dist/src/context/index.js +2 -0
  47. package/dist/src/context/index.js.map +1 -0
  48. package/dist/src/domain/artifact.d.ts +36 -0
  49. package/dist/src/domain/artifact.js +62 -0
  50. package/dist/src/domain/artifact.js.map +1 -0
  51. package/dist/src/domain/base.d.ts +10 -0
  52. package/dist/src/domain/base.js +23 -0
  53. package/dist/src/domain/base.js.map +1 -0
  54. package/dist/src/domain/index.d.ts +5 -0
  55. package/dist/src/domain/index.js +6 -0
  56. package/dist/src/domain/index.js.map +1 -0
  57. package/dist/src/domain/run.d.ts +260 -0
  58. package/dist/src/domain/run.js +456 -0
  59. package/dist/src/domain/run.js.map +1 -0
  60. package/dist/src/domain/session.d.ts +72 -0
  61. package/dist/src/domain/session.js +131 -0
  62. package/dist/src/domain/session.js.map +1 -0
  63. package/dist/src/domain/value-objects.d.ts +120 -0
  64. package/dist/src/domain/value-objects.js +191 -0
  65. package/dist/src/domain/value-objects.js.map +1 -0
  66. package/dist/src/orchestrator/PlanBuilder.d.ts +6 -0
  67. package/dist/src/orchestrator/PlanBuilder.js +59 -0
  68. package/dist/src/orchestrator/PlanBuilder.js.map +1 -0
  69. package/dist/src/orchestrator/ResultMerger.d.ts +10 -0
  70. package/dist/src/orchestrator/ResultMerger.js +19 -0
  71. package/dist/src/orchestrator/ResultMerger.js.map +1 -0
  72. package/dist/src/orchestrator/TaskExecutor.d.ts +20 -0
  73. package/dist/src/orchestrator/TaskExecutor.js +81 -0
  74. package/dist/src/orchestrator/TaskExecutor.js.map +1 -0
  75. package/dist/src/orchestrator/TaskScheduler.d.ts +4 -0
  76. package/dist/src/orchestrator/TaskScheduler.js +19 -0
  77. package/dist/src/orchestrator/TaskScheduler.js.map +1 -0
  78. package/dist/src/orchestrator/ValidationRunner.d.ts +4 -0
  79. package/dist/src/orchestrator/ValidationRunner.js +22 -0
  80. package/dist/src/orchestrator/ValidationRunner.js.map +1 -0
  81. package/dist/src/orchestrator/index.d.ts +5 -0
  82. package/dist/src/orchestrator/index.js +6 -0
  83. package/dist/src/orchestrator/index.js.map +1 -0
  84. package/dist/src/output/ResultRenderer.d.ts +13 -0
  85. package/dist/src/output/ResultRenderer.js +49 -0
  86. package/dist/src/output/ResultRenderer.js.map +1 -0
  87. package/dist/src/output/index.d.ts +1 -0
  88. package/dist/src/output/index.js +2 -0
  89. package/dist/src/output/index.js.map +1 -0
  90. package/dist/src/providers/ClaudeCodeAdapter.d.ts +5 -0
  91. package/dist/src/providers/ClaudeCodeAdapter.js +95 -0
  92. package/dist/src/providers/ClaudeCodeAdapter.js.map +1 -0
  93. package/dist/src/providers/ProviderAdapter.d.ts +35 -0
  94. package/dist/src/providers/ProviderAdapter.js +2 -0
  95. package/dist/src/providers/ProviderAdapter.js.map +1 -0
  96. package/dist/src/providers/ProviderRegistry.d.ts +12 -0
  97. package/dist/src/providers/ProviderRegistry.js +23 -0
  98. package/dist/src/providers/ProviderRegistry.js.map +1 -0
  99. package/dist/src/providers/index.d.ts +3 -0
  100. package/dist/src/providers/index.js +4 -0
  101. package/dist/src/providers/index.js.map +1 -0
  102. package/dist/src/run/RunCoordinator.d.ts +33 -0
  103. package/dist/src/run/RunCoordinator.js +101 -0
  104. package/dist/src/run/RunCoordinator.js.map +1 -0
  105. package/dist/src/run/RunRepository.d.ts +14 -0
  106. package/dist/src/run/RunRepository.js +55 -0
  107. package/dist/src/run/RunRepository.js.map +1 -0
  108. package/dist/src/run/index.d.ts +2 -0
  109. package/dist/src/run/index.js +3 -0
  110. package/dist/src/run/index.js.map +1 -0
  111. package/dist/src/session/SessionManager.d.ts +26 -0
  112. package/dist/src/session/SessionManager.js +60 -0
  113. package/dist/src/session/SessionManager.js.map +1 -0
  114. package/dist/src/session/SessionRepository.d.ts +14 -0
  115. package/dist/src/session/SessionRepository.js +55 -0
  116. package/dist/src/session/SessionRepository.js.map +1 -0
  117. package/dist/src/session/index.d.ts +2 -0
  118. package/dist/src/session/index.js +3 -0
  119. package/dist/src/session/index.js.map +1 -0
  120. package/dist/src/shared/clock.d.ts +4 -0
  121. package/dist/src/shared/clock.js +9 -0
  122. package/dist/src/shared/clock.js.map +1 -0
  123. package/dist/src/shared/contracts.d.ts +254 -0
  124. package/dist/src/shared/contracts.js +2 -0
  125. package/dist/src/shared/contracts.js.map +1 -0
  126. package/dist/src/shared/errors.d.ts +9 -0
  127. package/dist/src/shared/errors.js +11 -0
  128. package/dist/src/shared/errors.js.map +1 -0
  129. package/dist/src/shared/file-system.d.ts +8 -0
  130. package/dist/src/shared/file-system.js +36 -0
  131. package/dist/src/shared/file-system.js.map +1 -0
  132. package/dist/src/shared/ids.d.ts +1 -0
  133. package/dist/src/shared/ids.js +6 -0
  134. package/dist/src/shared/ids.js.map +1 -0
  135. package/dist/src/usecases/CompareUseCase.d.ts +6 -0
  136. package/dist/src/usecases/CompareUseCase.js +9 -0
  137. package/dist/src/usecases/CompareUseCase.js.map +1 -0
  138. package/dist/src/usecases/ConsultUseCase.d.ts +48 -0
  139. package/dist/src/usecases/ConsultUseCase.js +187 -0
  140. package/dist/src/usecases/ConsultUseCase.js.map +1 -0
  141. package/dist/src/usecases/DebugUseCase.d.ts +48 -0
  142. package/dist/src/usecases/DebugUseCase.js +191 -0
  143. package/dist/src/usecases/DebugUseCase.js.map +1 -0
  144. package/dist/src/usecases/FollowupUseCase.d.ts +6 -0
  145. package/dist/src/usecases/FollowupUseCase.js +14 -0
  146. package/dist/src/usecases/FollowupUseCase.js.map +1 -0
  147. package/dist/src/usecases/ListProvidersUseCase.d.ts +9 -0
  148. package/dist/src/usecases/ListProvidersUseCase.js +13 -0
  149. package/dist/src/usecases/ListProvidersUseCase.js.map +1 -0
  150. package/dist/src/usecases/helpers.d.ts +9 -0
  151. package/dist/src/usecases/helpers.js +31 -0
  152. package/dist/src/usecases/helpers.js.map +1 -0
  153. package/dist/src/usecases/index.d.ts +5 -0
  154. package/dist/src/usecases/index.js +6 -0
  155. package/dist/src/usecases/index.js.map +1 -0
  156. 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,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ import { runCli } from "../src/cli/aipanel.js";
3
+ const exitCode = await runCli(process.argv.slice(2));
4
+ process.exit(exitCode);
5
+ //# sourceMappingURL=aipanel.js.map
@@ -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,9 @@
1
+ import { AipanelApp } from "./AipanelApp.js";
2
+ export declare class CommandRouter {
3
+ readonly app: AipanelApp;
4
+ constructor(app: AipanelApp);
5
+ route(argv: string[]): Promise<{
6
+ output: string;
7
+ exitCode: number;
8
+ }>;
9
+ }
@@ -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,10 @@
1
+ export interface Profile {
2
+ defaultProvider: string;
3
+ defaultTimeoutMs: number;
4
+ }
5
+ export declare class ProfileLoader {
6
+ readonly storageRoot: string;
7
+ constructor(storageRoot?: string);
8
+ get profilePath(): string;
9
+ load(): Promise<Profile>;
10
+ }
@@ -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,4 @@
1
+ export type WorkflowMode = "direct" | "orchestrated";
2
+ export declare class WorkflowSelector {
3
+ select(command: string): WorkflowMode;
4
+ }
@@ -0,0 +1,6 @@
1
+ export class WorkflowSelector {
2
+ select(command) {
3
+ return command === "debug" ? "orchestrated" : "direct";
4
+ }
5
+ }
6
+ //# sourceMappingURL=WorkflowSelector.js.map
@@ -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,4 @@
1
+ export * from "./AipanelApp.js";
2
+ export * from "./CommandRouter.js";
3
+ export * from "./ProfileLoader.js";
4
+ export * from "./WorkflowSelector.js";
@@ -0,0 +1,5 @@
1
+ export * from "./AipanelApp.js";
2
+ export * from "./CommandRouter.js";
3
+ export * from "./ProfileLoader.js";
4
+ export * from "./WorkflowSelector.js";
5
+ //# sourceMappingURL=index.js.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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 {};