sparkecoder 0.1.78 → 0.1.80
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/dist/agent/index.d.ts +2 -2
- package/dist/agent/index.js +19 -3
- package/dist/agent/index.js.map +1 -1
- package/dist/cli.js +73 -15
- package/dist/cli.js.map +1 -1
- package/dist/db/index.d.ts +2 -2
- package/dist/{index-DT1l57s0.d.ts → index-OhuTM4a0.d.ts} +6 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js +71 -14
- package/dist/index.js.map +1 -1
- package/dist/{schema-XcP0dedO.d.ts → schema-CohdIL13.d.ts} +1 -0
- package/dist/server/index.js +71 -14
- package/dist/server/index.js.map +1 -1
- package/dist/tools/index.js +2 -1
- package/dist/tools/index.js.map +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/web/.next/build-manifest.json +2 -2
- package/web/.next/standalone/web/.next/prerender-manifest.json +3 -3
- package/web/.next/standalone/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/standalone/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.html +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/installation.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/skills.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/tools.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/docs/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/docs.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.html +1 -1
- package/web/.next/standalone/web/.next/server/app/index.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/pages/404.html +1 -1
- package/web/.next/standalone/web/.next/server/pages/500.html +2 -2
- package/web/.next/standalone/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/server-reference-manifest.json +1 -1
- package/web/.next/standalone/web/package-lock.json +3 -3
- package/web/.next/standalone/web/src/lib/api.ts +1 -0
- /package/web/.next/standalone/web/.next/static/{q5xKLVzzjdkOykOwVu4eK → 439i-2Qg2oTm0bHSvJXp-}/_buildManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/{q5xKLVzzjdkOykOwVu4eK → 439i-2Qg2oTm0bHSvJXp-}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/standalone/web/.next/static/{q5xKLVzzjdkOykOwVu4eK → 439i-2Qg2oTm0bHSvJXp-}/_ssgManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/static/{q5xKLVzzjdkOykOwVu4eK → 439i-2Qg2oTm0bHSvJXp-}/_buildManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/static/{q5xKLVzzjdkOykOwVu4eK → 439i-2Qg2oTm0bHSvJXp-}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/standalone/web/.next/static/static/{q5xKLVzzjdkOykOwVu4eK → 439i-2Qg2oTm0bHSvJXp-}/_ssgManifest.js +0 -0
- /package/web/.next/static/{q5xKLVzzjdkOykOwVu4eK → 439i-2Qg2oTm0bHSvJXp-}/_buildManifest.js +0 -0
- /package/web/.next/static/{q5xKLVzzjdkOykOwVu4eK → 439i-2Qg2oTm0bHSvJXp-}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{q5xKLVzzjdkOykOwVu4eK → 439i-2Qg2oTm0bHSvJXp-}/_ssgManifest.js +0 -0
package/dist/db/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { C as Checkpoint, F as FileBackup, M as ModelMessage, a as Message, S as Session, L as LoadedSkill, T as TodoItem, b as ToolExecution, A as ActiveStream, I as IndexStatusRecord, c as IndexedChunk, d as SubagentExecution, e as SubagentStep, f as Terminal } from '../schema-
|
|
2
|
-
export { N as NewActiveStream, g as NewCheckpoint, h as NewFileBackup, i as NewIndexStatusRecord, j as NewIndexedChunk, k as NewMessage, l as NewSession, m as NewSubagentExecution, n as NewTerminal, o as NewTodoItem, p as NewToolExecution, q as SessionConfig, r as TaskConfig, U as UserContentPart, s as UserFilePart, t as UserImagePart, u as UserModelMessage, v as UserTextPart } from '../schema-
|
|
1
|
+
import { C as Checkpoint, F as FileBackup, M as ModelMessage, a as Message, S as Session, L as LoadedSkill, T as TodoItem, b as ToolExecution, A as ActiveStream, I as IndexStatusRecord, c as IndexedChunk, d as SubagentExecution, e as SubagentStep, f as Terminal } from '../schema-CohdIL13.js';
|
|
2
|
+
export { N as NewActiveStream, g as NewCheckpoint, h as NewFileBackup, i as NewIndexStatusRecord, j as NewIndexedChunk, k as NewMessage, l as NewSession, m as NewSubagentExecution, n as NewTerminal, o as NewTodoItem, p as NewToolExecution, q as SessionConfig, r as TaskConfig, U as UserContentPart, s as UserFilePart, t as UserImagePart, u as UserModelMessage, v as UserTextPart } from '../schema-CohdIL13.js';
|
|
3
3
|
import 'drizzle-orm/sqlite-core';
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ModelMessage, streamText } from 'ai';
|
|
2
|
-
import { S as Session, b as ToolExecution, r as TaskConfig } from './schema-
|
|
2
|
+
import { S as Session, b as ToolExecution, r as TaskConfig } from './schema-CohdIL13.js';
|
|
3
3
|
import { z } from 'zod';
|
|
4
4
|
import { B as BashToolProgress, W as WriteFileProgress, S as SearchToolProgress } from './search-CCffrVJE.js';
|
|
5
5
|
|
|
@@ -36,6 +36,7 @@ declare const SessionConfigSchema: z.ZodObject<{
|
|
|
36
36
|
result: z.ZodOptional<z.ZodUnknown>;
|
|
37
37
|
error: z.ZodOptional<z.ZodString>;
|
|
38
38
|
iterations: z.ZodOptional<z.ZodNumber>;
|
|
39
|
+
parentTaskId: z.ZodOptional<z.ZodString>;
|
|
39
40
|
}, "strip", z.ZodTypeAny, {
|
|
40
41
|
status: "completed" | "failed" | "running";
|
|
41
42
|
outputSchema: Record<string, unknown>;
|
|
@@ -43,6 +44,7 @@ declare const SessionConfigSchema: z.ZodObject<{
|
|
|
43
44
|
error?: string | undefined;
|
|
44
45
|
maxIterations?: number | undefined;
|
|
45
46
|
webhookUrl?: string | undefined;
|
|
47
|
+
parentTaskId?: string | undefined;
|
|
46
48
|
result?: unknown;
|
|
47
49
|
iterations?: number | undefined;
|
|
48
50
|
}, {
|
|
@@ -52,6 +54,7 @@ declare const SessionConfigSchema: z.ZodObject<{
|
|
|
52
54
|
error?: string | undefined;
|
|
53
55
|
maxIterations?: number | undefined;
|
|
54
56
|
webhookUrl?: string | undefined;
|
|
57
|
+
parentTaskId?: string | undefined;
|
|
55
58
|
result?: unknown;
|
|
56
59
|
iterations?: number | undefined;
|
|
57
60
|
}>>;
|
|
@@ -66,6 +69,7 @@ declare const SessionConfigSchema: z.ZodObject<{
|
|
|
66
69
|
error?: string | undefined;
|
|
67
70
|
maxIterations?: number | undefined;
|
|
68
71
|
webhookUrl?: string | undefined;
|
|
72
|
+
parentTaskId?: string | undefined;
|
|
69
73
|
result?: unknown;
|
|
70
74
|
iterations?: number | undefined;
|
|
71
75
|
} | undefined;
|
|
@@ -80,6 +84,7 @@ declare const SessionConfigSchema: z.ZodObject<{
|
|
|
80
84
|
error?: string | undefined;
|
|
81
85
|
maxIterations?: number | undefined;
|
|
82
86
|
webhookUrl?: string | undefined;
|
|
87
|
+
parentTaskId?: string | undefined;
|
|
83
88
|
result?: unknown;
|
|
84
89
|
iterations?: number | undefined;
|
|
85
90
|
} | undefined;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { R as ResolvedConfig } from './index-
|
|
2
|
-
export { A as Agent, a as AgentOptions, b as AgentRunOptions, c as AgentStreamResult, S as SparkcoderConfig, T as ToolApprovalConfig } from './index-
|
|
1
|
+
import { R as ResolvedConfig } from './index-OhuTM4a0.js';
|
|
2
|
+
export { A as Agent, a as AgentOptions, b as AgentRunOptions, c as AgentStreamResult, S as SparkcoderConfig, T as ToolApprovalConfig } from './index-OhuTM4a0.js';
|
|
3
3
|
export { ServerOptions, createApp, startServer, stopServer } from './server/index.js';
|
|
4
4
|
export { checkpointQueries, closeDatabase, fileBackupQueries, getDb, initDatabase, messageQueries, sessionQueries, skillQueries, todoQueries, toolExecutionQueries } from './db/index.js';
|
|
5
|
-
import { F as FileBackup, C as Checkpoint } from './schema-
|
|
6
|
-
export { a as Message, M as ModelMessage, S as Session, q as SessionConfig, f as Terminal, T as TodoItem, b as ToolExecution } from './schema-
|
|
5
|
+
import { F as FileBackup, C as Checkpoint } from './schema-CohdIL13.js';
|
|
6
|
+
export { a as Message, M as ModelMessage, S as Session, q as SessionConfig, f as Terminal, T as TodoItem, b as ToolExecution } from './schema-CohdIL13.js';
|
|
7
7
|
export { createLoadSkillTool, createReadFileTool, createTodoTool, createTools } from './tools/index.js';
|
|
8
8
|
export { c as createBashTool, a as createWriteFileTool } from './search-CCffrVJE.js';
|
|
9
9
|
import 'ai';
|
package/dist/index.js
CHANGED
|
@@ -37,7 +37,8 @@ var init_types = __esm({
|
|
|
37
37
|
status: z.enum(["running", "completed", "failed"]),
|
|
38
38
|
result: z.unknown().optional(),
|
|
39
39
|
error: z.string().optional(),
|
|
40
|
-
iterations: z.number().optional()
|
|
40
|
+
iterations: z.number().optional(),
|
|
41
|
+
parentTaskId: z.string().optional()
|
|
41
42
|
});
|
|
42
43
|
SessionConfigSchema = z.object({
|
|
43
44
|
toolApprovals: z.record(z.string(), z.boolean()).optional(),
|
|
@@ -6801,7 +6802,7 @@ function repairToolPairing(messages) {
|
|
|
6801
6802
|
const orphanedResults = new Set([...toolResultIds].filter((id) => !toolCallIds.has(id)));
|
|
6802
6803
|
if (orphanedCalls.size === 0 && orphanedResults.size === 0) return messages;
|
|
6803
6804
|
if (orphanedCalls.size > 0) {
|
|
6804
|
-
console.warn(`[tool-repair]
|
|
6805
|
+
console.warn(`[tool-repair] Injecting ${orphanedCalls.size} synthetic tool-result(s) for orphaned call(s): ${[...orphanedCalls].join(", ")}`);
|
|
6805
6806
|
}
|
|
6806
6807
|
if (orphanedResults.size > 0) {
|
|
6807
6808
|
console.warn(`[tool-repair] Removing ${orphanedResults.size} orphaned tool-result(s) with no matching call`);
|
|
@@ -6813,12 +6814,27 @@ function repairToolPairing(messages) {
|
|
|
6813
6814
|
continue;
|
|
6814
6815
|
}
|
|
6815
6816
|
const parts = msg.content.filter((part) => {
|
|
6816
|
-
if (part.type === "tool-call" && orphanedCalls.has(part.toolCallId)) return false;
|
|
6817
6817
|
if (part.type === "tool-result" && orphanedResults.has(part.toolCallId)) return false;
|
|
6818
6818
|
return true;
|
|
6819
6819
|
});
|
|
6820
6820
|
if (parts.length === 0) continue;
|
|
6821
6821
|
repaired.push({ ...msg, content: parts });
|
|
6822
|
+
if (msg.role === "assistant") {
|
|
6823
|
+
const callsNeedingResults = parts.filter(
|
|
6824
|
+
(part) => part.type === "tool-call" && orphanedCalls.has(part.toolCallId)
|
|
6825
|
+
);
|
|
6826
|
+
if (callsNeedingResults.length > 0) {
|
|
6827
|
+
repaired.push({
|
|
6828
|
+
role: "tool",
|
|
6829
|
+
content: callsNeedingResults.map((call) => ({
|
|
6830
|
+
type: "tool-result",
|
|
6831
|
+
toolCallId: call.toolCallId,
|
|
6832
|
+
toolName: call.toolName || "unknown",
|
|
6833
|
+
output: { type: "text", value: "[No result \u2014 tool execution was interrupted, never completed, or was stripped for brevity]" }
|
|
6834
|
+
}))
|
|
6835
|
+
});
|
|
6836
|
+
}
|
|
6837
|
+
}
|
|
6822
6838
|
}
|
|
6823
6839
|
return repaired;
|
|
6824
6840
|
}
|
|
@@ -10066,7 +10082,8 @@ var createTaskSchema = z19.object({
|
|
|
10066
10082
|
model: z19.string().optional(),
|
|
10067
10083
|
workingDirectory: z19.string().optional(),
|
|
10068
10084
|
name: z19.string().optional(),
|
|
10069
|
-
maxIterations: z19.number().int().min(1).max(500).optional()
|
|
10085
|
+
maxIterations: z19.number().int().min(1).max(500).optional(),
|
|
10086
|
+
parentTaskId: z19.string().optional()
|
|
10070
10087
|
});
|
|
10071
10088
|
tasks.post(
|
|
10072
10089
|
"/",
|
|
@@ -10079,17 +10096,52 @@ tasks.post(
|
|
|
10079
10096
|
outputSchema: body.outputSchema,
|
|
10080
10097
|
webhookUrl: body.webhookUrl,
|
|
10081
10098
|
maxIterations: body.maxIterations ?? 50,
|
|
10082
|
-
status: "running"
|
|
10099
|
+
status: "running",
|
|
10100
|
+
parentTaskId: body.parentTaskId
|
|
10083
10101
|
};
|
|
10084
|
-
|
|
10085
|
-
|
|
10086
|
-
|
|
10087
|
-
|
|
10088
|
-
|
|
10089
|
-
|
|
10090
|
-
|
|
10102
|
+
let agent;
|
|
10103
|
+
if (body.parentTaskId) {
|
|
10104
|
+
const parentSession = await sessionQueries.getById(body.parentTaskId);
|
|
10105
|
+
if (!parentSession) {
|
|
10106
|
+
return c.json({ error: "Parent task not found" }, 404);
|
|
10107
|
+
}
|
|
10108
|
+
const parentTask = parentSession.config?.task;
|
|
10109
|
+
if (!parentTask?.enabled) {
|
|
10110
|
+
return c.json({ error: "Parent session is not a task" }, 400);
|
|
10111
|
+
}
|
|
10112
|
+
if (parentTask.status === "running") {
|
|
10113
|
+
return c.json({ error: "Parent task is still running. Wait for it to complete before chaining." }, 409);
|
|
10114
|
+
}
|
|
10115
|
+
const parentStream = await activeStreamQueries.getBySessionId(body.parentTaskId);
|
|
10116
|
+
if (parentStream) {
|
|
10117
|
+
return c.json({ error: "Parent task has an active stream" }, 409);
|
|
10118
|
+
}
|
|
10119
|
+
agent = await Agent.create({
|
|
10120
|
+
name: body.name || "Task",
|
|
10121
|
+
workingDirectory: body.workingDirectory || parentSession.workingDirectory,
|
|
10122
|
+
model: body.model || parentSession.model,
|
|
10123
|
+
sessionConfig: {
|
|
10124
|
+
toolApprovals: { bash: false, write_file: false, read_file: false },
|
|
10125
|
+
task: taskConfig
|
|
10126
|
+
}
|
|
10127
|
+
});
|
|
10128
|
+
const parentMessages = await messageQueries.getBySession(body.parentTaskId);
|
|
10129
|
+
if (parentMessages.length > 0) {
|
|
10130
|
+
const modelMessages = parentMessages.map((m) => m.modelMessage);
|
|
10131
|
+
await messageQueries.addMany(agent.sessionId, modelMessages);
|
|
10132
|
+
console.log(`[TASK] Copied ${modelMessages.length} messages from parent ${body.parentTaskId} to ${agent.sessionId}`);
|
|
10091
10133
|
}
|
|
10092
|
-
}
|
|
10134
|
+
} else {
|
|
10135
|
+
agent = await Agent.create({
|
|
10136
|
+
name: body.name || "Task",
|
|
10137
|
+
workingDirectory: body.workingDirectory || config.resolvedWorkingDirectory,
|
|
10138
|
+
model: body.model || config.defaultModel,
|
|
10139
|
+
sessionConfig: {
|
|
10140
|
+
toolApprovals: { bash: false, write_file: false, read_file: false },
|
|
10141
|
+
task: taskConfig
|
|
10142
|
+
}
|
|
10143
|
+
});
|
|
10144
|
+
}
|
|
10093
10145
|
const taskId = agent.sessionId;
|
|
10094
10146
|
const abortController = new AbortController();
|
|
10095
10147
|
taskAbortControllers.set(taskId, abortController);
|
|
@@ -10161,7 +10213,11 @@ tasks.post(
|
|
|
10161
10213
|
return readable;
|
|
10162
10214
|
};
|
|
10163
10215
|
await streamContext.resumableStream(streamId, taskStreamProducer);
|
|
10164
|
-
return c.json({
|
|
10216
|
+
return c.json({
|
|
10217
|
+
taskId,
|
|
10218
|
+
status: "running",
|
|
10219
|
+
...body.parentTaskId ? { parentTaskId: body.parentTaskId } : {}
|
|
10220
|
+
}, 201);
|
|
10165
10221
|
}
|
|
10166
10222
|
);
|
|
10167
10223
|
tasks.get("/:id", async (c) => {
|
|
@@ -10191,6 +10247,7 @@ tasks.get("/:id", async (c) => {
|
|
|
10191
10247
|
iterations: task.iterations,
|
|
10192
10248
|
model: session.model,
|
|
10193
10249
|
name: session.name,
|
|
10250
|
+
parentTaskId: task.parentTaskId,
|
|
10194
10251
|
createdAt: session.createdAt.toISOString(),
|
|
10195
10252
|
updatedAt: session.updatedAt.toISOString(),
|
|
10196
10253
|
browserRecordings: browserRecordings.length > 0 ? browserRecordings : void 0
|