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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TaskExecutor.js","sourceRoot":"","sources":["../../../src/orchestrator/TaskExecutor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { PlanTaskSpec } from "../shared/contracts.js";
2
+ export declare class TaskScheduler {
3
+ order(tasks: PlanTaskSpec[]): PlanTaskSpec[];
4
+ }
@@ -0,0 +1,19 @@
1
+ export class TaskScheduler {
2
+ order(tasks) {
3
+ const remaining = [...tasks];
4
+ const ordered = [];
5
+ const seen = new Set();
6
+ while (remaining.length > 0) {
7
+ const nextIndex = remaining.findIndex((task) => (task.dependsOn ?? []).every((dependency) => seen.has(dependency)));
8
+ const indexToUse = nextIndex >= 0 ? nextIndex : 0;
9
+ const [task] = remaining.splice(indexToUse, 1);
10
+ if (!task) {
11
+ break;
12
+ }
13
+ ordered.push(task);
14
+ seen.add(task.taskKind);
15
+ }
16
+ return ordered;
17
+ }
18
+ }
19
+ //# sourceMappingURL=TaskScheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TaskScheduler.js","sourceRoot":"","sources":["../../../src/orchestrator/TaskScheduler.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,aAAa;IACxB,KAAK,CAAC,KAAqB;QACzB,MAAM,SAAS,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;QAC7B,MAAM,OAAO,GAAmB,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAE/B,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAC7C,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CACnE,CAAC;YAEF,MAAM,UAAU,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YAC/C,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM;YACR,CAAC;YAED,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import type { NormalizedResponseData, ValidationResult } from "../shared/contracts.js";
2
+ export declare class ValidationRunner {
3
+ validate(normalizedResponses: NormalizedResponseData[]): ValidationResult;
4
+ }
@@ -0,0 +1,22 @@
1
+ export class ValidationRunner {
2
+ validate(normalizedResponses) {
3
+ if (normalizedResponses.length === 0) {
4
+ return {
5
+ status: "failed",
6
+ notes: ["No normalized responses were produced."],
7
+ };
8
+ }
9
+ const lowConfidence = normalizedResponses.filter((response) => response.confidence.level === "low");
10
+ if (lowConfidence.length > 0) {
11
+ return {
12
+ status: "partial",
13
+ notes: lowConfidence.map((response) => `Low confidence response from ${response.provider}/${response.taskId}: ${response.confidence.reason}`),
14
+ };
15
+ }
16
+ return {
17
+ status: "validated",
18
+ notes: ["All task responses reached the minimum validation threshold for phase 1."],
19
+ };
20
+ }
21
+ }
22
+ //# sourceMappingURL=ValidationRunner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ValidationRunner.js","sourceRoot":"","sources":["../../../src/orchestrator/ValidationRunner.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,gBAAgB;IAC3B,QAAQ,CAAC,mBAA6C;QACpD,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrC,OAAO;gBACL,MAAM,EAAE,QAAQ;gBAChB,KAAK,EAAE,CAAC,wCAAwC,CAAC;aAClD,CAAC;QACJ,CAAC;QAED,MAAM,aAAa,GAAG,mBAAmB,CAAC,MAAM,CAC9C,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,KAAK,KAAK,CAClD,CAAC;QAEF,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,KAAK,EAAE,aAAa,CAAC,GAAG,CACtB,CAAC,QAAQ,EAAE,EAAE,CACX,gCAAgC,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,CACxG;aACF,CAAC;QACJ,CAAC;QAED,OAAO;YACL,MAAM,EAAE,WAAW;YACnB,KAAK,EAAE,CAAC,0EAA0E,CAAC;SACpF,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ export { PlanBuilder } from "./PlanBuilder.js";
2
+ export { TaskScheduler } from "./TaskScheduler.js";
3
+ export { TaskExecutor } from "./TaskExecutor.js";
4
+ export { ResultMerger } from "./ResultMerger.js";
5
+ export { ValidationRunner } from "./ValidationRunner.js";
@@ -0,0 +1,6 @@
1
+ export { PlanBuilder } from "./PlanBuilder.js";
2
+ export { TaskScheduler } from "./TaskScheduler.js";
3
+ export { TaskExecutor } from "./TaskExecutor.js";
4
+ export { ResultMerger } from "./ResultMerger.js";
5
+ export { ValidationRunner } from "./ValidationRunner.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/orchestrator/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { ConsultationResult } from "../usecases/ConsultUseCase.js";
2
+ import type { DebugResult } from "../usecases/DebugUseCase.js";
3
+ export type RenderedOutput = {
4
+ text: string;
5
+ json: Record<string, unknown>;
6
+ };
7
+ export type RenderableResult = {
8
+ kind: "providers";
9
+ providers: string[];
10
+ } | ConsultationResult | DebugResult;
11
+ export declare class ResultRenderer {
12
+ render(result: RenderableResult, outputFormat?: "text" | "json"): RenderedOutput;
13
+ }
@@ -0,0 +1,49 @@
1
+ export class ResultRenderer {
2
+ render(result, outputFormat = "text") {
3
+ const rendered = (() => {
4
+ switch (result.kind) {
5
+ case "providers":
6
+ return {
7
+ text: result.providers.join("\n"),
8
+ json: {
9
+ kind: result.kind,
10
+ providers: result.providers,
11
+ },
12
+ };
13
+ case "consultation":
14
+ return {
15
+ text: [
16
+ `session: ${result.sessionId}`,
17
+ `run: ${result.runId}`,
18
+ `provider: ${result.provider}`,
19
+ `status: ${result.status}`,
20
+ "",
21
+ result.answer,
22
+ ].join("\n"),
23
+ json: { ...result },
24
+ };
25
+ case "debug":
26
+ return {
27
+ text: [
28
+ `session: ${result.sessionId}`,
29
+ `run: ${result.runId}`,
30
+ `status: ${result.status}`,
31
+ "",
32
+ `summary: ${result.summary}`,
33
+ "",
34
+ result.details.join("\n\n"),
35
+ ].join("\n"),
36
+ json: { ...result },
37
+ };
38
+ }
39
+ })();
40
+ if (outputFormat === "json") {
41
+ return {
42
+ text: `${JSON.stringify(rendered.json, null, 2)}\n`,
43
+ json: rendered.json,
44
+ };
45
+ }
46
+ return rendered;
47
+ }
48
+ }
49
+ //# sourceMappingURL=ResultRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResultRenderer.js","sourceRoot":"","sources":["../../../src/output/ResultRenderer.ts"],"names":[],"mappings":"AAaA,MAAM,OAAO,cAAc;IACzB,MAAM,CAAC,MAAwB,EAAE,eAAgC,MAAM;QACrE,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE;YACrB,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;gBACpB,KAAK,WAAW;oBACd,OAAO;wBACL,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;wBACjC,IAAI,EAAE;4BACJ,IAAI,EAAE,MAAM,CAAC,IAAI;4BACjB,SAAS,EAAE,MAAM,CAAC,SAAS;yBAC5B;qBACF,CAAC;gBACJ,KAAK,cAAc;oBACjB,OAAO;wBACL,IAAI,EAAE;4BACJ,YAAY,MAAM,CAAC,SAAS,EAAE;4BAC9B,QAAQ,MAAM,CAAC,KAAK,EAAE;4BACtB,aAAa,MAAM,CAAC,QAAQ,EAAE;4BAC9B,WAAW,MAAM,CAAC,MAAM,EAAE;4BAC1B,EAAE;4BACF,MAAM,CAAC,MAAM;yBACd,CAAC,IAAI,CAAC,IAAI,CAAC;wBACZ,IAAI,EAAE,EAAE,GAAG,MAAM,EAAE;qBACpB,CAAC;gBACJ,KAAK,OAAO;oBACV,OAAO;wBACL,IAAI,EAAE;4BACJ,YAAY,MAAM,CAAC,SAAS,EAAE;4BAC9B,QAAQ,MAAM,CAAC,KAAK,EAAE;4BACtB,WAAW,MAAM,CAAC,MAAM,EAAE;4BAC1B,EAAE;4BACF,YAAY,MAAM,CAAC,OAAO,EAAE;4BAC5B,EAAE;4BACF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;yBAC5B,CAAC,IAAI,CAAC,IAAI,CAAC;wBACZ,IAAI,EAAE,EAAE,GAAG,MAAM,EAAE;qBACpB,CAAC;YACN,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;QAEL,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;YAC5B,OAAO;gBACL,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI;gBACnD,IAAI,EAAE,QAAQ,CAAC,IAAI;aACpB,CAAC;QACJ,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF"}
@@ -0,0 +1 @@
1
+ export * from "./ResultRenderer.js";
@@ -0,0 +1,2 @@
1
+ export * from "./ResultRenderer.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/output/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { ProviderAdapter, ProviderCallPlan, ProviderCallResult } from "./ProviderAdapter.js";
2
+ export declare class ClaudeCodeAdapter implements ProviderAdapter {
3
+ readonly name: "claude-code";
4
+ call(input: ProviderCallPlan): Promise<ProviderCallResult>;
5
+ }
@@ -0,0 +1,95 @@
1
+ import { spawn } from "node:child_process";
2
+ function isSuccessSubtype(subtype) {
3
+ return subtype === "success";
4
+ }
5
+ async function runClaude(plan) {
6
+ return new Promise((resolve, reject) => {
7
+ const args = [
8
+ "-p",
9
+ "--tools",
10
+ "",
11
+ "--model",
12
+ plan.model ?? "sonnet",
13
+ "--output-format",
14
+ "json",
15
+ plan.prompt,
16
+ ];
17
+ const child = spawn("claude", args, {
18
+ cwd: plan.cwd,
19
+ env: process.env,
20
+ stdio: ["ignore", "pipe", "pipe"],
21
+ });
22
+ let stdout = "";
23
+ let stderr = "";
24
+ let didTimeout = false;
25
+ const timeoutHandle = setTimeout(() => {
26
+ didTimeout = true;
27
+ child.kill("SIGTERM");
28
+ }, plan.timeoutMs);
29
+ child.stdout.on("data", (chunk) => {
30
+ stdout += chunk.toString();
31
+ });
32
+ child.stderr.on("data", (chunk) => {
33
+ stderr += chunk.toString();
34
+ });
35
+ child.on("error", (error) => {
36
+ clearTimeout(timeoutHandle);
37
+ reject(error);
38
+ });
39
+ child.on("close", (code, signal) => {
40
+ clearTimeout(timeoutHandle);
41
+ if (didTimeout) {
42
+ reject(new Error(`Claude Code timed out after ${plan.timeoutMs}ms.`));
43
+ return;
44
+ }
45
+ if (code !== 0) {
46
+ const details = [
47
+ `Claude Code exited with code ${code}${signal ? ` (signal: ${signal})` : ""}.`,
48
+ ];
49
+ if (stderr.trim()) {
50
+ details.push(stderr.trim());
51
+ }
52
+ if (stdout.trim()) {
53
+ details.push(stdout.trim());
54
+ }
55
+ reject(new Error(details.join("\n\n")));
56
+ return;
57
+ }
58
+ resolve(stdout);
59
+ });
60
+ });
61
+ }
62
+ export class ClaudeCodeAdapter {
63
+ name = "claude-code";
64
+ async call(input) {
65
+ const stdout = await runClaude(input);
66
+ const parsed = JSON.parse(stdout);
67
+ const subtype = parsed.subtype ?? null;
68
+ const isError = parsed.is_error === true || !isSuccessSubtype(parsed.subtype);
69
+ const externalRefs = parsed.session_id
70
+ ? [
71
+ {
72
+ system: "claude-code",
73
+ id: parsed.session_id,
74
+ scope: "session",
75
+ },
76
+ ]
77
+ : [];
78
+ return {
79
+ provider: this.name,
80
+ rawText: parsed.result ?? "",
81
+ rawJson: parsed,
82
+ usage: {
83
+ inputTokens: parsed.usage?.input_tokens ?? null,
84
+ outputTokens: parsed.usage?.output_tokens ?? null,
85
+ costUsd: parsed.total_cost_usd ?? null,
86
+ latencyMs: parsed.duration_ms ?? null,
87
+ },
88
+ externalRefs,
89
+ citations: [],
90
+ isError,
91
+ subtype,
92
+ };
93
+ }
94
+ }
95
+ //# sourceMappingURL=ClaudeCodeAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClaudeCodeAdapter.js","sourceRoot":"","sources":["../../../src/providers/ClaudeCodeAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ export interface ProviderCallPlan {
2
+ provider: string;
3
+ prompt: string;
4
+ cwd: string;
5
+ timeoutMs: number;
6
+ model?: string;
7
+ }
8
+ export interface ProviderCallResult {
9
+ provider: string;
10
+ rawText: string;
11
+ rawJson: unknown;
12
+ usage: {
13
+ inputTokens?: number | null;
14
+ outputTokens?: number | null;
15
+ costUsd?: number | null;
16
+ latencyMs?: number | null;
17
+ };
18
+ externalRefs: Array<{
19
+ system: string;
20
+ id: string;
21
+ scope: string;
22
+ }>;
23
+ citations: Array<{
24
+ kind: string;
25
+ label?: string | null;
26
+ pathOrUrl?: string | null;
27
+ line?: number | null;
28
+ }>;
29
+ isError: boolean;
30
+ subtype: string | null;
31
+ }
32
+ export interface ProviderAdapter {
33
+ readonly name: string;
34
+ call(plan: ProviderCallPlan): Promise<ProviderCallResult>;
35
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ProviderAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProviderAdapter.js","sourceRoot":"","sources":["../../../src/providers/ProviderAdapter.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ import type { ProviderAdapter } from "./ProviderAdapter.js";
2
+ export interface ProviderRegistryOptions {
3
+ adapters: ProviderAdapter[];
4
+ defaultProvider: string;
5
+ }
6
+ export declare class ProviderRegistry {
7
+ #private;
8
+ constructor(options: ProviderRegistryOptions);
9
+ list(): string[];
10
+ get(name?: string): ProviderAdapter;
11
+ get defaultProvider(): string;
12
+ }
@@ -0,0 +1,23 @@
1
+ export class ProviderRegistry {
2
+ #adapters;
3
+ #defaultProvider;
4
+ constructor(options) {
5
+ this.#adapters = new Map(options.adapters.map((adapter) => [adapter.name, adapter]));
6
+ this.#defaultProvider = options.defaultProvider;
7
+ }
8
+ list() {
9
+ return [...this.#adapters.keys()].sort();
10
+ }
11
+ get(name) {
12
+ const providerName = name ?? this.#defaultProvider;
13
+ const adapter = this.#adapters.get(providerName);
14
+ if (!adapter) {
15
+ throw new Error(`Unknown provider: ${providerName}`);
16
+ }
17
+ return adapter;
18
+ }
19
+ get defaultProvider() {
20
+ return this.#defaultProvider;
21
+ }
22
+ }
23
+ //# sourceMappingURL=ProviderRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProviderRegistry.js","sourceRoot":"","sources":["../../../src/providers/ProviderRegistry.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,gBAAgB;IAClB,SAAS,CAA+B;IACxC,gBAAgB,CAAS;IAElC,YAAY,OAAgC;QAC1C,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;QACrF,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAClD,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,CAAC;IAED,GAAG,CAAC,IAAa;QACf,MAAM,YAAY,GAAG,IAAI,IAAI,IAAI,CAAC,gBAAgB,CAAC;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACjD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,qBAAqB,YAAY,EAAE,CAAC,CAAC;QACvD,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ export * from "./ProviderAdapter.js";
2
+ export * from "./ProviderRegistry.js";
3
+ export * from "./ClaudeCodeAdapter.js";
@@ -0,0 +1,4 @@
1
+ export * from "./ProviderAdapter.js";
2
+ export * from "./ProviderRegistry.js";
3
+ export * from "./ClaudeCodeAdapter.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { ComparisonReport, ContextBundle, NormalizedResponse, ProviderResponse, Run, RunTask, TaskResult, type Clock, type ComparisonReportProps, type ContextBundleProps, type IdGenerator, type NormalizedResponseProps, type ProviderResponseProps, type RunStatus, type RunTaskProps, type TaskResultProps } from "../domain/index.js";
2
+ import { RunRepository } from "./RunRepository.js";
3
+ export interface RunCoordinatorOptions {
4
+ repository: RunRepository;
5
+ clock?: Clock;
6
+ idGenerator?: IdGenerator;
7
+ }
8
+ export declare class RunCoordinator {
9
+ private readonly repository;
10
+ private readonly clock;
11
+ private readonly idGenerator;
12
+ constructor(options: RunCoordinatorOptions);
13
+ createRun(params: {
14
+ sessionId?: string | null;
15
+ command: string;
16
+ mode?: string;
17
+ planVersion?: string;
18
+ plan?: Record<string, unknown> | null;
19
+ }): Promise<Run>;
20
+ createTask(run: Run, params: Omit<RunTaskProps, 'taskId' | 'runId' | 'createdAt' | 'updatedAt'>): RunTask;
21
+ createContextBundle(run: Run, params: Omit<ContextBundleProps, 'contextId' | 'runId' | 'createdAt'>): ContextBundle;
22
+ createProviderResponse(run: Run, params: Omit<ProviderResponseProps, 'responseId' | 'createdAt'>): ProviderResponse;
23
+ createNormalizedResponse(run: Run, params: Omit<NormalizedResponseProps, 'normalizedResponseId' | 'createdAt'>): NormalizedResponse;
24
+ createTaskResult(run: Run, params: Omit<TaskResultProps, 'resultId' | 'createdAt'>): TaskResult;
25
+ createComparisonReport(run: Run, params: Omit<ComparisonReportProps, 'reportId' | 'runId' | 'createdAt'>): ComparisonReport;
26
+ transition(run: Run, status: RunStatus): Run;
27
+ complete(run: Run, params?: {
28
+ finalSummary?: string | null;
29
+ validationStatus?: string | null;
30
+ }): Run;
31
+ fail(run: Run, message: string, status?: RunStatus): Run;
32
+ save(run: Run): Promise<Run>;
33
+ }
@@ -0,0 +1,101 @@
1
+ import { ComparisonReport, ContextBundle, NormalizedResponse, ProviderResponse, Run, RunTask, TaskResult, defaultClock, defaultIdGenerator, } from "../domain/index.js";
2
+ import { RunRepository } from "./RunRepository.js";
3
+ export class RunCoordinator {
4
+ repository;
5
+ clock;
6
+ idGenerator;
7
+ constructor(options) {
8
+ this.repository = options.repository;
9
+ this.clock = options.clock ?? defaultClock;
10
+ this.idGenerator = options.idGenerator ?? defaultIdGenerator;
11
+ }
12
+ async createRun(params) {
13
+ const run = Run.create({
14
+ command: params.command,
15
+ clock: this.clock,
16
+ idGenerator: this.idGenerator,
17
+ ...(params.sessionId !== undefined ? { sessionId: params.sessionId } : {}),
18
+ ...(params.mode ? { mode: params.mode } : {}),
19
+ ...(params.planVersion ? { planVersion: params.planVersion } : {}),
20
+ ...(params.plan !== undefined ? { plan: params.plan } : {}),
21
+ });
22
+ return this.repository.save(run);
23
+ }
24
+ createTask(run, params) {
25
+ const task = RunTask.create({
26
+ ...params,
27
+ runId: run.runId,
28
+ clock: this.clock,
29
+ idGenerator: this.idGenerator,
30
+ });
31
+ run.addTask(task, this.clock());
32
+ return task;
33
+ }
34
+ createContextBundle(run, params) {
35
+ const contextBundle = ContextBundle.create({
36
+ ...params,
37
+ runId: run.runId,
38
+ clock: this.clock,
39
+ idGenerator: this.idGenerator,
40
+ });
41
+ run.addContextBundle(contextBundle, this.clock());
42
+ return contextBundle;
43
+ }
44
+ createProviderResponse(run, params) {
45
+ const providerResponse = ProviderResponse.create({
46
+ ...params,
47
+ clock: this.clock,
48
+ idGenerator: this.idGenerator,
49
+ });
50
+ run.addProviderResponse(providerResponse, this.clock());
51
+ return providerResponse;
52
+ }
53
+ createNormalizedResponse(run, params) {
54
+ const normalizedResponse = NormalizedResponse.create({
55
+ ...params,
56
+ clock: this.clock,
57
+ idGenerator: this.idGenerator,
58
+ });
59
+ run.addNormalizedResponse(normalizedResponse, this.clock());
60
+ return normalizedResponse;
61
+ }
62
+ createTaskResult(run, params) {
63
+ const taskResult = TaskResult.create({
64
+ ...params,
65
+ clock: this.clock,
66
+ idGenerator: this.idGenerator,
67
+ });
68
+ run.addTaskResult(taskResult, this.clock());
69
+ return taskResult;
70
+ }
71
+ createComparisonReport(run, params) {
72
+ const comparisonReport = ComparisonReport.create({
73
+ ...params,
74
+ runId: run.runId,
75
+ clock: this.clock,
76
+ idGenerator: this.idGenerator,
77
+ });
78
+ run.addComparisonReport(comparisonReport, this.clock());
79
+ return comparisonReport;
80
+ }
81
+ transition(run, status) {
82
+ run.transition(status, this.clock());
83
+ return run;
84
+ }
85
+ complete(run, params = {}) {
86
+ run.complete({
87
+ updatedAt: this.clock(),
88
+ ...(params.finalSummary !== undefined ? { finalSummary: params.finalSummary } : {}),
89
+ ...(params.validationStatus !== undefined ? { validationStatus: params.validationStatus } : {}),
90
+ });
91
+ return run;
92
+ }
93
+ fail(run, message, status = 'failed') {
94
+ run.fail(message, status, this.clock());
95
+ return run;
96
+ }
97
+ async save(run) {
98
+ return this.repository.save(run);
99
+ }
100
+ }
101
+ //# sourceMappingURL=RunCoordinator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunCoordinator.js","sourceRoot":"","sources":["../../../src/run/RunCoordinator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { Run } from "../domain/index.js";
2
+ export interface RunRepositoryOptions {
3
+ storageRoot?: string;
4
+ }
5
+ export declare class RunRepository {
6
+ private readonly storageRoot;
7
+ constructor(options?: RunRepositoryOptions);
8
+ get runsDirectory(): string;
9
+ filePathFor(runId: string): string;
10
+ save(run: Run): Promise<Run>;
11
+ get(runId: string): Promise<Run | null>;
12
+ require(runId: string): Promise<Run>;
13
+ list(): Promise<Run[]>;
14
+ }
@@ -0,0 +1,55 @@
1
+ import { mkdir, readdir, readFile, writeFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { Run } from "../domain/index.js";
4
+ export class RunRepository {
5
+ storageRoot;
6
+ constructor(options = {}) {
7
+ this.storageRoot = options.storageRoot ?? path.join(process.cwd(), '.aipanel');
8
+ }
9
+ get runsDirectory() {
10
+ return path.join(this.storageRoot, 'runs');
11
+ }
12
+ filePathFor(runId) {
13
+ return path.join(this.runsDirectory, `${runId}.json`);
14
+ }
15
+ async save(run) {
16
+ await mkdir(this.runsDirectory, { recursive: true });
17
+ const document = { run: run.toJSON() };
18
+ await writeFile(this.filePathFor(run.runId), JSON.stringify(document, null, 2), 'utf8');
19
+ return run;
20
+ }
21
+ async get(runId) {
22
+ try {
23
+ const raw = await readFile(this.filePathFor(runId), 'utf8');
24
+ const parsed = JSON.parse(raw);
25
+ return Run.fromJSON('run' in parsed ? parsed.run : parsed);
26
+ }
27
+ catch (error) {
28
+ if (error.code === 'ENOENT') {
29
+ return null;
30
+ }
31
+ throw error;
32
+ }
33
+ }
34
+ async require(runId) {
35
+ const run = await this.get(runId);
36
+ if (!run) {
37
+ throw new Error(`Run not found: ${runId}`);
38
+ }
39
+ return run;
40
+ }
41
+ async list() {
42
+ await mkdir(this.runsDirectory, { recursive: true });
43
+ const entries = await readdir(this.runsDirectory, { withFileTypes: true });
44
+ const runs = await Promise.all(entries
45
+ .filter((entry) => entry.isFile() && entry.name.endsWith('.json'))
46
+ .map(async (entry) => {
47
+ const runId = entry.name.replace(/\.json$/u, '');
48
+ return this.get(runId);
49
+ }));
50
+ return runs
51
+ .filter((run) => Boolean(run))
52
+ .sort((left, right) => right.updatedAt.localeCompare(left.updatedAt));
53
+ }
54
+ }
55
+ //# sourceMappingURL=RunRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunRepository.js","sourceRoot":"","sources":["../../../src/run/RunRepository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from "./RunRepository.js";
2
+ export * from "./RunCoordinator.js";
@@ -0,0 +1,3 @@
1
+ export * from "./RunRepository.js";
2
+ export * from "./RunCoordinator.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/run/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC"}