aipanel-cli 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +77 -43
- package/dist/src/app/AipanelApp.d.ts +6 -3
- package/dist/src/app/AipanelApp.js +22 -14
- package/dist/src/app/AipanelApp.js.map +1 -1
- package/dist/src/app/CommandRouter.js +27 -6
- package/dist/src/app/CommandRouter.js.map +1 -1
- package/dist/src/app/ProfileLoader.d.ts +3 -2
- package/dist/src/app/ProfileLoader.js +6 -5
- package/dist/src/app/ProfileLoader.js.map +1 -1
- package/dist/src/artifact/ArtifactRepository.d.ts +4 -9
- package/dist/src/artifact/ArtifactRepository.js +24 -60
- package/dist/src/artifact/ArtifactRepository.js.map +1 -1
- package/dist/src/cli/aipanel.js +2 -1
- package/dist/src/cli/aipanel.js.map +1 -1
- package/dist/src/compare/ComparisonEngine.d.ts +10 -1
- package/dist/src/compare/ComparisonEngine.js.map +1 -1
- package/dist/src/compare/ResponseNormalizer.d.ts +3 -2
- package/dist/src/compare/ResponseNormalizer.js +4 -2
- package/dist/src/compare/ResponseNormalizer.js.map +1 -1
- package/dist/src/context/ContextCollector.d.ts +5 -4
- package/dist/src/context/ContextCollector.js +4 -2
- package/dist/src/context/ContextCollector.js.map +1 -1
- package/dist/src/domain/artifact.d.ts +3 -2
- package/dist/src/domain/artifact.js +7 -7
- package/dist/src/domain/base.d.ts +0 -1
- package/dist/src/domain/base.js +1 -7
- package/dist/src/domain/base.js.map +1 -1
- package/dist/src/domain/run.d.ts +11 -23
- package/dist/src/domain/run.js +59 -51
- package/dist/src/domain/run.js.map +1 -1
- package/dist/src/domain/session.d.ts +6 -5
- package/dist/src/domain/session.js +9 -7
- package/dist/src/domain/session.js.map +1 -1
- package/dist/src/domain/value-objects.js +3 -1
- package/dist/src/domain/value-objects.js.map +1 -1
- package/dist/src/output/ResultRenderer.d.ts +3 -2
- package/dist/src/output/ResultRenderer.js +3 -0
- package/dist/src/output/ResultRenderer.js.map +1 -1
- package/dist/src/providers/ClaudeCodeAdapter.d.ts +1 -0
- package/dist/src/providers/ClaudeCodeAdapter.js +3 -0
- package/dist/src/providers/ClaudeCodeAdapter.js.map +1 -1
- package/dist/src/providers/CodexExecAdapter.d.ts +5 -0
- package/dist/src/providers/CodexExecAdapter.js +128 -0
- package/dist/src/providers/CodexExecAdapter.js.map +1 -0
- package/dist/src/providers/ProviderAdapter.d.ts +2 -0
- package/dist/src/providers/ProviderRegistry.d.ts +3 -2
- package/dist/src/providers/ProviderRegistry.js +3 -3
- package/dist/src/providers/ProviderRegistry.js.map +1 -1
- package/dist/src/run/RunCoordinator.d.ts +10 -16
- package/dist/src/run/RunCoordinator.js +5 -20
- package/dist/src/run/RunCoordinator.js.map +1 -1
- package/dist/src/run/RunRepository.d.ts +3 -7
- package/dist/src/run/RunRepository.js +9 -45
- package/dist/src/run/RunRepository.js.map +1 -1
- package/dist/src/session/SessionManager.d.ts +5 -3
- package/dist/src/session/SessionManager.js +5 -6
- package/dist/src/session/SessionManager.js.map +1 -1
- package/dist/src/session/SessionRepository.d.ts +3 -5
- package/dist/src/session/SessionRepository.js +14 -28
- package/dist/src/session/SessionRepository.js.map +1 -1
- package/dist/src/shared/clock.d.ts +0 -1
- package/dist/src/shared/clock.js +0 -3
- package/dist/src/shared/clock.js.map +1 -1
- package/dist/src/shared/file-system.d.ts +0 -6
- package/dist/src/shared/file-system.js +1 -23
- package/dist/src/shared/file-system.js.map +1 -1
- package/dist/src/usecases/ConsultUseCase.d.ts +4 -1
- package/dist/src/usecases/ConsultUseCase.js +10 -6
- package/dist/src/usecases/ConsultUseCase.js.map +1 -1
- package/dist/src/usecases/DebugUseCase.d.ts +4 -1
- package/dist/src/usecases/DebugUseCase.js +25 -6
- package/dist/src/usecases/DebugUseCase.js.map +1 -1
- package/dist/src/usecases/FollowupUseCase.js.map +1 -1
- package/package.json +19 -63
- package/dist/src/app/WorkflowSelector.d.ts +0 -4
- package/dist/src/app/WorkflowSelector.js +0 -6
- package/dist/src/app/WorkflowSelector.js.map +0 -1
- package/dist/src/app/index.d.ts +0 -4
- package/dist/src/app/index.js +0 -5
- package/dist/src/app/index.js.map +0 -1
- package/dist/src/app/types.d.ts +0 -36
- package/dist/src/app/types.js +0 -2
- package/dist/src/app/types.js.map +0 -1
- package/dist/src/artifact/index.d.ts +0 -1
- package/dist/src/artifact/index.js +0 -2
- package/dist/src/artifact/index.js.map +0 -1
- package/dist/src/compare/index.d.ts +0 -3
- package/dist/src/compare/index.js +0 -3
- package/dist/src/compare/index.js.map +0 -1
- package/dist/src/context/index.d.ts +0 -2
- package/dist/src/context/index.js +0 -2
- package/dist/src/context/index.js.map +0 -1
- package/dist/src/domain/index.d.ts +0 -5
- package/dist/src/domain/index.js +0 -6
- package/dist/src/domain/index.js.map +0 -1
- package/dist/src/index.d.ts +0 -16
- package/dist/src/index.js +0 -16
- package/dist/src/index.js.map +0 -1
- package/dist/src/orchestrator/PlanBuilder.d.ts +0 -6
- package/dist/src/orchestrator/PlanBuilder.js +0 -59
- package/dist/src/orchestrator/PlanBuilder.js.map +0 -1
- package/dist/src/orchestrator/ResultMerger.d.ts +0 -10
- package/dist/src/orchestrator/ResultMerger.js +0 -19
- package/dist/src/orchestrator/ResultMerger.js.map +0 -1
- package/dist/src/orchestrator/TaskExecutor.d.ts +0 -20
- package/dist/src/orchestrator/TaskExecutor.js +0 -81
- package/dist/src/orchestrator/TaskExecutor.js.map +0 -1
- package/dist/src/orchestrator/TaskScheduler.d.ts +0 -4
- package/dist/src/orchestrator/TaskScheduler.js +0 -19
- package/dist/src/orchestrator/TaskScheduler.js.map +0 -1
- package/dist/src/orchestrator/ValidationRunner.d.ts +0 -4
- package/dist/src/orchestrator/ValidationRunner.js +0 -22
- package/dist/src/orchestrator/ValidationRunner.js.map +0 -1
- package/dist/src/orchestrator/index.d.ts +0 -5
- package/dist/src/orchestrator/index.js +0 -6
- package/dist/src/orchestrator/index.js.map +0 -1
- package/dist/src/output/index.d.ts +0 -1
- package/dist/src/output/index.js +0 -2
- package/dist/src/output/index.js.map +0 -1
- package/dist/src/providers/index.d.ts +0 -3
- package/dist/src/providers/index.js +0 -4
- package/dist/src/providers/index.js.map +0 -1
- package/dist/src/run/index.d.ts +0 -2
- package/dist/src/run/index.js +0 -3
- package/dist/src/run/index.js.map +0 -1
- package/dist/src/session/index.d.ts +0 -2
- package/dist/src/session/index.js +0 -3
- package/dist/src/session/index.js.map +0 -1
- package/dist/src/shared/contracts.d.ts +0 -254
- package/dist/src/shared/contracts.js +0 -2
- package/dist/src/shared/contracts.js.map +0 -1
- package/dist/src/shared/errors.d.ts +0 -9
- package/dist/src/shared/errors.js +0 -11
- package/dist/src/shared/errors.js.map +0 -1
- package/dist/src/shared/index.d.ts +0 -4
- package/dist/src/shared/index.js +0 -5
- package/dist/src/shared/index.js.map +0 -1
- package/dist/src/usecases/CompareUseCase.d.ts +0 -6
- package/dist/src/usecases/CompareUseCase.js +0 -9
- package/dist/src/usecases/CompareUseCase.js.map +0 -1
- package/dist/src/usecases/helpers.d.ts +0 -9
- package/dist/src/usecases/helpers.js +0 -31
- package/dist/src/usecases/helpers.js.map +0 -1
- package/dist/src/usecases/index.d.ts +0 -5
- package/dist/src/usecases/index.js +0 -6
- package/dist/src/usecases/index.js.map +0 -1
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
function parseJsonLines(stdout) {
|
|
3
|
+
return stdout
|
|
4
|
+
.split("\n")
|
|
5
|
+
.map((line) => line.trim())
|
|
6
|
+
.filter(Boolean)
|
|
7
|
+
.map((line) => JSON.parse(line));
|
|
8
|
+
}
|
|
9
|
+
function pickLastAgentMessage(events) {
|
|
10
|
+
const messages = events
|
|
11
|
+
.filter((event) => event.type === "item.completed")
|
|
12
|
+
.map((event) => event.item)
|
|
13
|
+
.filter((item) => Boolean(item))
|
|
14
|
+
.filter((item) => item.type === "agent_message")
|
|
15
|
+
.map((item) => item.text?.trim())
|
|
16
|
+
.filter((text) => Boolean(text));
|
|
17
|
+
return messages.at(-1) ?? "";
|
|
18
|
+
}
|
|
19
|
+
function pickThreadId(events) {
|
|
20
|
+
return (events.find((event) => event.type === "thread.started")?.thread_id ?? null);
|
|
21
|
+
}
|
|
22
|
+
function pickUsage(events) {
|
|
23
|
+
return events.find((event) => event.type === "turn.completed")?.usage ?? null;
|
|
24
|
+
}
|
|
25
|
+
function pickErrorMessage(events) {
|
|
26
|
+
const eventError = events.find((event) => event.type === "turn.failed")?.error?.message ??
|
|
27
|
+
events.find((event) => event.type === "error")?.message;
|
|
28
|
+
return eventError?.trim() ? eventError.trim() : null;
|
|
29
|
+
}
|
|
30
|
+
async function runCodex(plan) {
|
|
31
|
+
return new Promise((resolve, reject) => {
|
|
32
|
+
const args = [
|
|
33
|
+
"exec",
|
|
34
|
+
"--json",
|
|
35
|
+
"--skip-git-repo-check",
|
|
36
|
+
"-C",
|
|
37
|
+
plan.cwd,
|
|
38
|
+
"-s",
|
|
39
|
+
"read-only",
|
|
40
|
+
"-c",
|
|
41
|
+
'approval_policy="never"',
|
|
42
|
+
];
|
|
43
|
+
if (plan.model) {
|
|
44
|
+
args.push("-m", plan.model);
|
|
45
|
+
}
|
|
46
|
+
args.push(plan.prompt);
|
|
47
|
+
const child = spawn("codex", args, {
|
|
48
|
+
cwd: plan.cwd,
|
|
49
|
+
env: process.env,
|
|
50
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
51
|
+
});
|
|
52
|
+
let stdout = "";
|
|
53
|
+
let stderr = "";
|
|
54
|
+
let didTimeout = false;
|
|
55
|
+
const timeoutHandle = setTimeout(() => {
|
|
56
|
+
didTimeout = true;
|
|
57
|
+
child.kill("SIGTERM");
|
|
58
|
+
}, plan.timeoutMs);
|
|
59
|
+
child.stdout.on("data", (chunk) => {
|
|
60
|
+
stdout += chunk.toString();
|
|
61
|
+
});
|
|
62
|
+
child.stderr.on("data", (chunk) => {
|
|
63
|
+
stderr += chunk.toString();
|
|
64
|
+
});
|
|
65
|
+
child.on("error", (error) => {
|
|
66
|
+
clearTimeout(timeoutHandle);
|
|
67
|
+
reject(error);
|
|
68
|
+
});
|
|
69
|
+
child.on("close", (code, signal) => {
|
|
70
|
+
clearTimeout(timeoutHandle);
|
|
71
|
+
if (didTimeout) {
|
|
72
|
+
reject(new Error(`Codex exec timed out after ${plan.timeoutMs}ms.`));
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (code !== 0) {
|
|
76
|
+
const details = [
|
|
77
|
+
`Codex exec exited with code ${code}${signal ? ` (signal: ${signal})` : ""}.`,
|
|
78
|
+
];
|
|
79
|
+
if (stderr.trim()) {
|
|
80
|
+
details.push(stderr.trim());
|
|
81
|
+
}
|
|
82
|
+
if (stdout.trim()) {
|
|
83
|
+
details.push(stdout.trim());
|
|
84
|
+
}
|
|
85
|
+
reject(new Error(details.join("\n\n")));
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
resolve(stdout);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
export class CodexExecAdapter {
|
|
93
|
+
name = "codex";
|
|
94
|
+
async call(plan) {
|
|
95
|
+
const stdout = await runCodex(plan);
|
|
96
|
+
const events = parseJsonLines(stdout);
|
|
97
|
+
const rawText = pickLastAgentMessage(events);
|
|
98
|
+
const errorMessage = pickErrorMessage(events);
|
|
99
|
+
const usage = pickUsage(events);
|
|
100
|
+
const threadId = pickThreadId(events);
|
|
101
|
+
const isError = Boolean(errorMessage);
|
|
102
|
+
return {
|
|
103
|
+
provider: this.name,
|
|
104
|
+
model: plan.model ?? "configured-default",
|
|
105
|
+
rawText: rawText || errorMessage || "",
|
|
106
|
+
rawJson: events,
|
|
107
|
+
usage: {
|
|
108
|
+
inputTokens: usage?.input_tokens ?? null,
|
|
109
|
+
outputTokens: usage?.output_tokens ?? null,
|
|
110
|
+
costUsd: null,
|
|
111
|
+
latencyMs: null,
|
|
112
|
+
},
|
|
113
|
+
externalRefs: threadId
|
|
114
|
+
? [
|
|
115
|
+
{
|
|
116
|
+
system: "codex",
|
|
117
|
+
id: threadId,
|
|
118
|
+
scope: "session",
|
|
119
|
+
},
|
|
120
|
+
]
|
|
121
|
+
: [],
|
|
122
|
+
citations: [],
|
|
123
|
+
isError,
|
|
124
|
+
subtype: isError ? "failed" : "success",
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=CodexExecAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodexExecAdapter.js","sourceRoot":"","sources":["../../../src/providers/CodexExecAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AA0B3C,SAAS,cAAc,CAAC,MAAc;IACpC,OAAO,MAAM;SACV,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAkB,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAuB;IACnD,MAAM,QAAQ,GAAG,MAAM;SACpB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,gBAAgB,CAAC;SAClD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;SAC1B,MAAM,CAAC,CAAC,IAAI,EAA8C,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SAC3E,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,eAAe,CAAC;SAC/C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;SAChC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAEnD,OAAO,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC/B,CAAC;AAED,SAAS,YAAY,CAAC,MAAuB;IAC3C,OAAO,CACL,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,gBAAgB,CAAC,EAAE,SAAS,IAAI,IAAI,CAC3E,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,MAAuB;IACxC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,gBAAgB,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC;AAChF,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAuB;IAC/C,MAAM,UAAU,GACd,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,EAAE,KAAK,EAAE,OAAO;QACpE,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,EAAE,OAAO,CAAC;IAE1D,OAAO,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACvD,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,IAAsB;IAC5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG;YACX,MAAM;YACN,QAAQ;YACR,uBAAuB;YACvB,IAAI;YACJ,IAAI,CAAC,GAAG;YACR,IAAI;YACJ,WAAW;YACX,IAAI;YACJ,yBAAyB;SAC1B,CAAC;QAEF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEvB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;YACjC,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,UAAU,GAAG,KAAK,CAAC;QAEvB,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;YACpC,UAAU,GAAG,IAAI,CAAC;YAClB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAEnB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YAChC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YAChC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,YAAY,CAAC,aAAa,CAAC,CAAC;YAC5B,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YACjC,YAAY,CAAC,aAAa,CAAC,CAAC;YAE5B,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,KAAK,CAAC,8BAA8B,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC;gBACrE,OAAO;YACT,CAAC;YAED,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG;oBACd,+BAA+B,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,aAAa,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG;iBAC9E,CAAC;gBACF,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;oBAClB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC9B,CAAC;gBACD,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;oBAClB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC9B,CAAC;gBACD,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACxC,OAAO;YACT,CAAC;YAED,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,OAAO,gBAAgB;IAClB,IAAI,GAAG,OAAgB,CAAC;IAEjC,KAAK,CAAC,IAAI,CAAC,IAAsB;QAC/B,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,YAAY,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;QAEtC,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,oBAAoB;YACzC,OAAO,EAAE,OAAO,IAAI,YAAY,IAAI,EAAE;YACtC,OAAO,EAAE,MAAM;YACf,KAAK,EAAE;gBACL,WAAW,EAAE,KAAK,EAAE,YAAY,IAAI,IAAI;gBACxC,YAAY,EAAE,KAAK,EAAE,aAAa,IAAI,IAAI;gBAC1C,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,IAAI;aAChB;YACD,YAAY,EAAE,QAAQ;gBACpB,CAAC,CAAC;oBACE;wBACE,MAAM,EAAE,OAAO;wBACf,EAAE,EAAE,QAAQ;wBACZ,KAAK,EAAE,SAAS;qBACjB;iBACF;gBACH,CAAC,CAAC,EAAE;YACN,SAAS,EAAE,EAAE;YACb,OAAO;YACP,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;SACxC,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -7,6 +7,7 @@ export interface ProviderCallPlan {
|
|
|
7
7
|
}
|
|
8
8
|
export interface ProviderCallResult {
|
|
9
9
|
provider: string;
|
|
10
|
+
model: string;
|
|
10
11
|
rawText: string;
|
|
11
12
|
rawJson: unknown;
|
|
12
13
|
usage: {
|
|
@@ -31,5 +32,6 @@ export interface ProviderCallResult {
|
|
|
31
32
|
}
|
|
32
33
|
export interface ProviderAdapter {
|
|
33
34
|
readonly name: string;
|
|
35
|
+
readonly defaultModel?: string;
|
|
34
36
|
call(plan: ProviderCallPlan): Promise<ProviderCallResult>;
|
|
35
37
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ProviderAdapter } from "./ProviderAdapter.js";
|
|
2
|
-
|
|
2
|
+
interface ProviderRegistryOptions {
|
|
3
3
|
adapters: ProviderAdapter[];
|
|
4
4
|
defaultProvider: string;
|
|
5
5
|
}
|
|
@@ -7,6 +7,7 @@ export declare class ProviderRegistry {
|
|
|
7
7
|
#private;
|
|
8
8
|
constructor(options: ProviderRegistryOptions);
|
|
9
9
|
list(): string[];
|
|
10
|
+
getDefaultModel(name?: string): string | undefined;
|
|
10
11
|
get(name?: string): ProviderAdapter;
|
|
11
|
-
get defaultProvider(): string;
|
|
12
12
|
}
|
|
13
|
+
export {};
|
|
@@ -8,6 +8,9 @@ export class ProviderRegistry {
|
|
|
8
8
|
list() {
|
|
9
9
|
return [...this.#adapters.keys()].sort();
|
|
10
10
|
}
|
|
11
|
+
getDefaultModel(name) {
|
|
12
|
+
return this.get(name).defaultModel;
|
|
13
|
+
}
|
|
11
14
|
get(name) {
|
|
12
15
|
const providerName = name ?? this.#defaultProvider;
|
|
13
16
|
const adapter = this.#adapters.get(providerName);
|
|
@@ -16,8 +19,5 @@ export class ProviderRegistry {
|
|
|
16
19
|
}
|
|
17
20
|
return adapter;
|
|
18
21
|
}
|
|
19
|
-
get defaultProvider() {
|
|
20
|
-
return this.#defaultProvider;
|
|
21
|
-
}
|
|
22
22
|
}
|
|
23
23
|
//# sourceMappingURL=ProviderRegistry.js.map
|
|
@@ -1 +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,
|
|
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,CACtB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAC3D,CAAC;QACF,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,eAAe,CAAC,IAAa;QAC3B,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC;IACrC,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;CACF"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { ComparisonReport, ContextBundle, NormalizedResponse, ProviderResponse, Run, RunTask, TaskResult, type
|
|
1
|
+
import { ComparisonReport, ContextBundle, NormalizedResponse, ProviderResponse, Run, RunTask, TaskResult, type ComparisonReportProps, type ContextBundleProps, type NormalizedResponseProps, type ProviderResponseProps, type RunTaskProps, type TaskResultProps } from "../domain/run.js";
|
|
2
|
+
import { type Clock, type IdGenerator } from "../domain/base.js";
|
|
2
3
|
import { RunRepository } from "./RunRepository.js";
|
|
3
|
-
|
|
4
|
+
interface RunCoordinatorOptions {
|
|
4
5
|
repository: RunRepository;
|
|
5
6
|
clock?: Clock;
|
|
6
7
|
idGenerator?: IdGenerator;
|
|
@@ -14,20 +15,13 @@ export declare class RunCoordinator {
|
|
|
14
15
|
sessionId?: string | null;
|
|
15
16
|
command: string;
|
|
16
17
|
mode?: string;
|
|
17
|
-
planVersion?: string;
|
|
18
|
-
plan?: Record<string, unknown> | null;
|
|
19
18
|
}): Promise<Run>;
|
|
20
|
-
createTask(run: Run, params: Omit<RunTaskProps,
|
|
21
|
-
createContextBundle(run: Run, params: Omit<ContextBundleProps,
|
|
22
|
-
createProviderResponse(run: Run, params: Omit<ProviderResponseProps,
|
|
23
|
-
createNormalizedResponse(run: Run, params: Omit<NormalizedResponseProps,
|
|
24
|
-
createTaskResult(run: Run, params: Omit<TaskResultProps,
|
|
25
|
-
createComparisonReport(run: Run, params: Omit<ComparisonReportProps,
|
|
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;
|
|
19
|
+
createTask(run: Run, params: Omit<RunTaskProps, "taskId" | "runId" | "createdAt" | "updatedAt">): RunTask;
|
|
20
|
+
createContextBundle(run: Run, params: Omit<ContextBundleProps, "contextId" | "runId" | "createdAt">): ContextBundle;
|
|
21
|
+
createProviderResponse(run: Run, params: Omit<ProviderResponseProps, "responseId" | "createdAt">): ProviderResponse;
|
|
22
|
+
createNormalizedResponse(run: Run, params: Omit<NormalizedResponseProps, "normalizedResponseId" | "createdAt">): NormalizedResponse;
|
|
23
|
+
createTaskResult(run: Run, params: Omit<TaskResultProps, "resultId" | "createdAt">): TaskResult;
|
|
24
|
+
createComparisonReport(run: Run, params: Omit<ComparisonReportProps, "reportId" | "runId" | "createdAt">): ComparisonReport;
|
|
32
25
|
save(run: Run): Promise<Run>;
|
|
33
26
|
}
|
|
27
|
+
export {};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { ComparisonReport, ContextBundle, NormalizedResponse, ProviderResponse, Run, RunTask, TaskResult,
|
|
1
|
+
import { ComparisonReport, ContextBundle, NormalizedResponse, ProviderResponse, Run, RunTask, TaskResult, } from "../domain/run.js";
|
|
2
|
+
import { defaultClock, defaultIdGenerator, } from "../domain/base.js";
|
|
2
3
|
import { RunRepository } from "./RunRepository.js";
|
|
3
4
|
export class RunCoordinator {
|
|
4
5
|
repository;
|
|
@@ -14,10 +15,10 @@ export class RunCoordinator {
|
|
|
14
15
|
command: params.command,
|
|
15
16
|
clock: this.clock,
|
|
16
17
|
idGenerator: this.idGenerator,
|
|
17
|
-
...(params.sessionId !== undefined
|
|
18
|
+
...(params.sessionId !== undefined
|
|
19
|
+
? { sessionId: params.sessionId }
|
|
20
|
+
: {}),
|
|
18
21
|
...(params.mode ? { mode: params.mode } : {}),
|
|
19
|
-
...(params.planVersion ? { planVersion: params.planVersion } : {}),
|
|
20
|
-
...(params.plan !== undefined ? { plan: params.plan } : {}),
|
|
21
22
|
});
|
|
22
23
|
return this.repository.save(run);
|
|
23
24
|
}
|
|
@@ -78,22 +79,6 @@ export class RunCoordinator {
|
|
|
78
79
|
run.addComparisonReport(comparisonReport, this.clock());
|
|
79
80
|
return comparisonReport;
|
|
80
81
|
}
|
|
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
82
|
async save(run) {
|
|
98
83
|
return this.repository.save(run);
|
|
99
84
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RunCoordinator.js","sourceRoot":"","sources":["../../../src/run/RunCoordinator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,GAAG,EACH,OAAO,EACP,UAAU,
|
|
1
|
+
{"version":3,"file":"RunCoordinator.js","sourceRoot":"","sources":["../../../src/run/RunCoordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,10 @@
|
|
|
1
|
-
import { Run } from "../domain/
|
|
2
|
-
|
|
1
|
+
import { Run } from "../domain/run.js";
|
|
2
|
+
interface RunRepositoryOptions {
|
|
3
3
|
storageRoot?: string;
|
|
4
4
|
}
|
|
5
5
|
export declare class RunRepository {
|
|
6
6
|
private readonly storageRoot;
|
|
7
7
|
constructor(options?: RunRepositoryOptions);
|
|
8
|
-
get runsDirectory(): string;
|
|
9
|
-
filePathFor(runId: string): string;
|
|
10
8
|
save(run: Run): Promise<Run>;
|
|
11
|
-
get(runId: string): Promise<Run | null>;
|
|
12
|
-
require(runId: string): Promise<Run>;
|
|
13
|
-
list(): Promise<Run[]>;
|
|
14
9
|
}
|
|
10
|
+
export {};
|
|
@@ -1,55 +1,19 @@
|
|
|
1
|
-
import { mkdir,
|
|
2
|
-
import path from
|
|
3
|
-
import { Run } from "../domain/
|
|
1
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { Run } from "../domain/run.js";
|
|
4
4
|
export class RunRepository {
|
|
5
5
|
storageRoot;
|
|
6
6
|
constructor(options = {}) {
|
|
7
|
-
this.storageRoot =
|
|
8
|
-
|
|
9
|
-
get runsDirectory() {
|
|
10
|
-
return path.join(this.storageRoot, 'runs');
|
|
11
|
-
}
|
|
12
|
-
filePathFor(runId) {
|
|
13
|
-
return path.join(this.runsDirectory, `${runId}.json`);
|
|
7
|
+
this.storageRoot =
|
|
8
|
+
options.storageRoot ?? path.join(process.cwd(), ".aipanel");
|
|
14
9
|
}
|
|
15
10
|
async save(run) {
|
|
16
|
-
|
|
11
|
+
const runsDirectory = path.join(this.storageRoot, "runs");
|
|
12
|
+
const filePath = path.join(runsDirectory, `${run.runId}.json`);
|
|
13
|
+
await mkdir(runsDirectory, { recursive: true });
|
|
17
14
|
const document = { run: run.toJSON() };
|
|
18
|
-
await writeFile(
|
|
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
|
-
}
|
|
15
|
+
await writeFile(filePath, JSON.stringify(document, null, 2), "utf8");
|
|
39
16
|
return run;
|
|
40
17
|
}
|
|
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
18
|
}
|
|
55
19
|
//# sourceMappingURL=RunRepository.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RunRepository.js","sourceRoot":"","sources":["../../../src/run/RunRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"RunRepository.js","sourceRoot":"","sources":["../../../src/run/RunRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,GAAG,EAAiB,MAAM,kBAAkB,CAAC;AAUtD,MAAM,OAAO,aAAa;IACP,WAAW,CAAS;IAErC,YAAY,UAAgC,EAAE;QAC5C,IAAI,CAAC,WAAW;YACd,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAQ;QACjB,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,GAAG,CAAC,KAAK,OAAO,CAAC,CAAC;QAC/D,MAAM,KAAK,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAgB,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;QACpD,MAAM,SAAS,CACb,QAAQ,EACR,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EACjC,MAAM,CACP,CAAC;QACF,OAAO,GAAG,CAAC;IACb,CAAC;CACF"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import { Session, SessionTurn,
|
|
1
|
+
import { Session, SessionTurn, type SessionTurnRole } from "../domain/session.js";
|
|
2
|
+
import { type Clock, type IdGenerator } from "../domain/base.js";
|
|
3
|
+
import { ProviderRef, type ProviderRefProps } from "../domain/value-objects.js";
|
|
2
4
|
import { SessionRepository } from "./SessionRepository.js";
|
|
3
|
-
|
|
5
|
+
interface SessionManagerOptions {
|
|
4
6
|
repository: SessionRepository;
|
|
5
7
|
clock?: Clock;
|
|
6
8
|
idGenerator?: IdGenerator;
|
|
@@ -22,5 +24,5 @@ export declare class SessionManager {
|
|
|
22
24
|
appendUserTurn(session: Session, content: string, artifactIds?: string[]): Promise<SessionTurn>;
|
|
23
25
|
appendAssistantTurn(session: Session, content: string, artifactIds?: string[]): Promise<SessionTurn>;
|
|
24
26
|
updateProviderRef(session: Session, providerRef: ProviderRef | ProviderRefProps): Promise<Session>;
|
|
25
|
-
save(session: Session): Promise<Session>;
|
|
26
27
|
}
|
|
28
|
+
export {};
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import { Session, SessionTurn,
|
|
1
|
+
import { Session, SessionTurn, } from "../domain/session.js";
|
|
2
|
+
import { defaultClock, defaultIdGenerator, } from "../domain/base.js";
|
|
3
|
+
import { ProviderRef } from "../domain/value-objects.js";
|
|
2
4
|
import { SessionRepository } from "./SessionRepository.js";
|
|
3
5
|
export class SessionManager {
|
|
4
6
|
repository;
|
|
@@ -33,14 +35,14 @@ export class SessionManager {
|
|
|
33
35
|
}
|
|
34
36
|
async appendUserTurn(session, content, artifactIds = []) {
|
|
35
37
|
return this.appendTurn(session, {
|
|
36
|
-
role:
|
|
38
|
+
role: "user",
|
|
37
39
|
content,
|
|
38
40
|
artifactIds,
|
|
39
41
|
});
|
|
40
42
|
}
|
|
41
43
|
async appendAssistantTurn(session, content, artifactIds = []) {
|
|
42
44
|
return this.appendTurn(session, {
|
|
43
|
-
role:
|
|
45
|
+
role: "assistant",
|
|
44
46
|
content,
|
|
45
47
|
artifactIds,
|
|
46
48
|
});
|
|
@@ -53,8 +55,5 @@ export class SessionManager {
|
|
|
53
55
|
}), this.clock());
|
|
54
56
|
return this.repository.save(session);
|
|
55
57
|
}
|
|
56
|
-
async save(session) {
|
|
57
|
-
return this.repository.save(session);
|
|
58
|
-
}
|
|
59
58
|
}
|
|
60
59
|
//# sourceMappingURL=SessionManager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionManager.js","sourceRoot":"","sources":["../../../src/session/SessionManager.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,WAAW,
|
|
1
|
+
{"version":3,"file":"SessionManager.js","sourceRoot":"","sources":["../../../src/session/SessionManager.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,WAAW,GAEZ,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,YAAY,EACZ,kBAAkB,GAGnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAyB,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAQ3D,MAAM,OAAO,cAAc;IACR,UAAU,CAAoB;IAC9B,KAAK,CAAQ;IACb,WAAW,CAAc;IAE1C,YAAY,OAA8B;QACxC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,YAAY,CAAC;QAC3C,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,kBAAkB,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,SAAiD,EAAE;QAEnD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;YAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjD,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,UAAU,CACd,OAAgB,EAChB,MAIC;QAED,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC;YAC9B,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnE,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,OAAgB,EAChB,OAAe,EACf,cAAwB,EAAE;QAE1B,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;YAC9B,IAAI,EAAE,MAAM;YACZ,OAAO;YACP,WAAW;SACZ,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,mBAAmB,CACvB,OAAgB,EAChB,OAAe,EACf,cAAwB,EAAE;QAE1B,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;YAC9B,IAAI,EAAE,WAAW;YACjB,OAAO;YACP,WAAW;SACZ,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,OAAgB,EAChB,WAA2C;QAE3C,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC/C,OAAO,CAAC,iBAAiB,CACvB,IAAI,WAAW,CAAC;YACd,GAAG,QAAQ,CAAC,MAAM,EAAE;YACpB,UAAU,EAAE,QAAQ,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,EAAE;SAChD,CAAC,EACF,IAAI,CAAC,KAAK,EAAE,CACb,CAAC;QAEF,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;CACF"}
|
|
@@ -1,14 +1,12 @@
|
|
|
1
|
-
import { Session } from "../domain/
|
|
2
|
-
|
|
1
|
+
import { Session } from "../domain/session.js";
|
|
2
|
+
interface SessionRepositoryOptions {
|
|
3
3
|
storageRoot?: string;
|
|
4
4
|
}
|
|
5
5
|
export declare class SessionRepository {
|
|
6
6
|
private readonly storageRoot;
|
|
7
7
|
constructor(options?: SessionRepositoryOptions);
|
|
8
|
-
get sessionsDirectory(): string;
|
|
9
|
-
filePathFor(sessionId: string): string;
|
|
10
8
|
save(session: Session): Promise<Session>;
|
|
11
9
|
get(sessionId: string): Promise<Session | null>;
|
|
12
10
|
require(sessionId: string): Promise<Session>;
|
|
13
|
-
list(): Promise<Session[]>;
|
|
14
11
|
}
|
|
12
|
+
export {};
|
|
@@ -1,31 +1,30 @@
|
|
|
1
|
-
import { mkdir,
|
|
2
|
-
import path from
|
|
3
|
-
import { Session } from "../domain/
|
|
1
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { Session } from "../domain/session.js";
|
|
4
4
|
export class SessionRepository {
|
|
5
5
|
storageRoot;
|
|
6
6
|
constructor(options = {}) {
|
|
7
|
-
this.storageRoot =
|
|
8
|
-
|
|
9
|
-
get sessionsDirectory() {
|
|
10
|
-
return path.join(this.storageRoot, 'sessions');
|
|
11
|
-
}
|
|
12
|
-
filePathFor(sessionId) {
|
|
13
|
-
return path.join(this.sessionsDirectory, `${sessionId}.json`);
|
|
7
|
+
this.storageRoot =
|
|
8
|
+
options.storageRoot ?? path.join(process.cwd(), ".aipanel");
|
|
14
9
|
}
|
|
15
10
|
async save(session) {
|
|
16
|
-
|
|
11
|
+
const sessionsDirectory = path.join(this.storageRoot, "sessions");
|
|
12
|
+
const filePath = path.join(sessionsDirectory, `${session.sessionId}.json`);
|
|
13
|
+
await mkdir(sessionsDirectory, { recursive: true });
|
|
17
14
|
const document = { session: session.toJSON() };
|
|
18
|
-
await writeFile(
|
|
15
|
+
await writeFile(filePath, JSON.stringify(document, null, 2), "utf8");
|
|
19
16
|
return session;
|
|
20
17
|
}
|
|
21
18
|
async get(sessionId) {
|
|
19
|
+
const sessionsDirectory = path.join(this.storageRoot, "sessions");
|
|
20
|
+
const filePath = path.join(sessionsDirectory, `${sessionId}.json`);
|
|
22
21
|
try {
|
|
23
|
-
const raw = await readFile(
|
|
22
|
+
const raw = await readFile(filePath, "utf8");
|
|
24
23
|
const parsed = JSON.parse(raw);
|
|
25
|
-
return Session.fromJSON(
|
|
24
|
+
return Session.fromJSON("session" in parsed ? parsed.session : parsed);
|
|
26
25
|
}
|
|
27
26
|
catch (error) {
|
|
28
|
-
if (error.code ===
|
|
27
|
+
if (error.code === "ENOENT") {
|
|
29
28
|
return null;
|
|
30
29
|
}
|
|
31
30
|
throw error;
|
|
@@ -38,18 +37,5 @@ export class SessionRepository {
|
|
|
38
37
|
}
|
|
39
38
|
return session;
|
|
40
39
|
}
|
|
41
|
-
async list() {
|
|
42
|
-
await mkdir(this.sessionsDirectory, { recursive: true });
|
|
43
|
-
const entries = await readdir(this.sessionsDirectory, { withFileTypes: true });
|
|
44
|
-
const sessions = await Promise.all(entries
|
|
45
|
-
.filter((entry) => entry.isFile() && entry.name.endsWith('.json'))
|
|
46
|
-
.map(async (entry) => {
|
|
47
|
-
const sessionId = entry.name.replace(/\.json$/u, '');
|
|
48
|
-
return this.get(sessionId);
|
|
49
|
-
}));
|
|
50
|
-
return sessions
|
|
51
|
-
.filter((session) => Boolean(session))
|
|
52
|
-
.sort((left, right) => right.updatedAt.localeCompare(left.updatedAt));
|
|
53
|
-
}
|
|
54
40
|
}
|
|
55
41
|
//# sourceMappingURL=SessionRepository.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionRepository.js","sourceRoot":"","sources":["../../../src/session/SessionRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"SessionRepository.js","sourceRoot":"","sources":["../../../src/session/SessionRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAqB,MAAM,sBAAsB,CAAC;AAUlE,MAAM,OAAO,iBAAiB;IACX,WAAW,CAAS;IAErC,YAAY,UAAoC,EAAE;QAChD,IAAI,CAAC,WAAW;YACd,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAgB;QACzB,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,OAAO,CAAC,SAAS,OAAO,CAAC,CAAC;QAC3E,MAAM,KAAK,CAAC,iBAAiB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAoB,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QAChE,MAAM,SAAS,CACb,QAAQ,EACR,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EACjC,MAAM,CACP,CAAC;QACF,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,SAAiB;QACzB,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,SAAS,OAAO,CAAC,CAAC;QACnE,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmC,CAAC;YACjE,OAAO,OAAO,CAAC,QAAQ,CAAC,SAAS,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACzE,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvD,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,SAAiB;QAC7B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAE1C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAC;QACrD,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
|
package/dist/src/shared/clock.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clock.js","sourceRoot":"","sources":["../../../src/shared/clock.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,
|
|
1
|
+
{"version":3,"file":"clock.js","sourceRoot":"","sources":["../../../src/shared/clock.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,MAAM;QACJ,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAClC,CAAC;CACF,CAAC"}
|
|
@@ -1,8 +1,2 @@
|
|
|
1
|
-
export declare function ensureDirectory(path: string): Promise<void>;
|
|
2
|
-
export declare function ensureParentDirectory(path: string): Promise<void>;
|
|
3
1
|
export declare function readText(path: string, encoding?: BufferEncoding): Promise<string>;
|
|
4
|
-
export declare function writeText(path: string, contents: string, encoding?: BufferEncoding): Promise<void>;
|
|
5
|
-
export declare function readJson<T>(path: string): Promise<T>;
|
|
6
|
-
export declare function writeJson(path: string, value: unknown): Promise<void>;
|
|
7
2
|
export declare function pathExists(path: string): Promise<boolean>;
|
|
8
|
-
export declare function listDirectory(path: string): Promise<string[]>;
|
|
@@ -1,26 +1,7 @@
|
|
|
1
|
-
import { access,
|
|
2
|
-
import { dirname } from "node:path";
|
|
3
|
-
export async function ensureDirectory(path) {
|
|
4
|
-
await mkdir(path, { recursive: true });
|
|
5
|
-
}
|
|
6
|
-
export async function ensureParentDirectory(path) {
|
|
7
|
-
await ensureDirectory(dirname(path));
|
|
8
|
-
}
|
|
1
|
+
import { access, readFile } from "node:fs/promises";
|
|
9
2
|
export async function readText(path, encoding = "utf8") {
|
|
10
3
|
return readFile(path, encoding);
|
|
11
4
|
}
|
|
12
|
-
export async function writeText(path, contents, encoding = "utf8") {
|
|
13
|
-
await ensureParentDirectory(path);
|
|
14
|
-
await writeFile(path, contents, encoding);
|
|
15
|
-
}
|
|
16
|
-
export async function readJson(path) {
|
|
17
|
-
const text = await readText(path, "utf8");
|
|
18
|
-
return JSON.parse(text);
|
|
19
|
-
}
|
|
20
|
-
export async function writeJson(path, value) {
|
|
21
|
-
const text = `${JSON.stringify(value, null, 2)}\n`;
|
|
22
|
-
await writeText(path, text, "utf8");
|
|
23
|
-
}
|
|
24
5
|
export async function pathExists(path) {
|
|
25
6
|
try {
|
|
26
7
|
await access(path);
|
|
@@ -30,7 +11,4 @@ export async function pathExists(path) {
|
|
|
30
11
|
return false;
|
|
31
12
|
}
|
|
32
13
|
}
|
|
33
|
-
export async function listDirectory(path) {
|
|
34
|
-
return readdir(path);
|
|
35
|
-
}
|
|
36
14
|
//# sourceMappingURL=file-system.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-system.js","sourceRoot":"","sources":["../../../src/shared/file-system.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"file-system.js","sourceRoot":"","sources":["../../../src/shared/file-system.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,IAAY,EACZ,WAA2B,MAAM;IAEjC,OAAO,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|