@vm0/cli 9.209.2 → 9.210.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/{chunk-6P4FKVEV.js → chunk-6EGWCGWC.js} +1110 -239
- package/{chunk-6P4FKVEV.js.map → chunk-6EGWCGWC.js.map} +1 -1
- package/{figma.generated-7FWIRN56.js → figma.generated-EJXHASDR.js} +2 -2
- package/figma.generated-EJXHASDR.js.map +1 -0
- package/index.js +101 -45
- package/index.js.map +1 -1
- package/package.json +1 -1
- package/zero.js +157 -81
- package/zero.js.map +1 -1
- package/figma.generated-7FWIRN56.js.map +0 -1
|
@@ -60737,13 +60737,13 @@ function attributeValueToTypedAttributeValue(rawValue, useFallback) {
|
|
|
60737
60737
|
if (!useFallback || useFallback === "skip-undefined" && value === void 0) {
|
|
60738
60738
|
return;
|
|
60739
60739
|
}
|
|
60740
|
-
let
|
|
60740
|
+
let stringValue2 = "";
|
|
60741
60741
|
try {
|
|
60742
|
-
|
|
60742
|
+
stringValue2 = JSON.stringify(value) ?? "";
|
|
60743
60743
|
} catch {
|
|
60744
60744
|
}
|
|
60745
60745
|
return {
|
|
60746
|
-
value:
|
|
60746
|
+
value: stringValue2,
|
|
60747
60747
|
type: "string",
|
|
60748
60748
|
...checkedUnit
|
|
60749
60749
|
};
|
|
@@ -80408,7 +80408,7 @@ if (DSN) {
|
|
|
80408
80408
|
init2({
|
|
80409
80409
|
dsn: DSN,
|
|
80410
80410
|
environment: process.env.SENTRY_ENVIRONMENT ?? "production",
|
|
80411
|
-
release: "9.
|
|
80411
|
+
release: "9.210.0",
|
|
80412
80412
|
sendDefaultPii: false,
|
|
80413
80413
|
tracesSampleRate: 0,
|
|
80414
80414
|
shutdownTimeout: 500,
|
|
@@ -80427,7 +80427,7 @@ if (DSN) {
|
|
|
80427
80427
|
}
|
|
80428
80428
|
});
|
|
80429
80429
|
setContext("cli", {
|
|
80430
|
-
version: "9.
|
|
80430
|
+
version: "9.210.0",
|
|
80431
80431
|
command: process.argv.slice(2).join(" ")
|
|
80432
80432
|
});
|
|
80433
80433
|
setContext("runtime", {
|
|
@@ -86687,7 +86687,7 @@ function validateBaseUrlScheme(scheme, base, serviceName2) {
|
|
|
86687
86687
|
throw new Error(errMsg(base, serviceName2, "scheme must be http or https"));
|
|
86688
86688
|
}
|
|
86689
86689
|
}
|
|
86690
|
-
function validateUrlSchemeDelimiter(value, serviceName2, label,
|
|
86690
|
+
function validateUrlSchemeDelimiter(value, serviceName2, label, displayValue2 = value) {
|
|
86691
86691
|
if (value.includes("://")) return;
|
|
86692
86692
|
const colonIndex = value.indexOf(":");
|
|
86693
86693
|
if (colonIndex !== -1) {
|
|
@@ -86696,15 +86696,15 @@ function validateUrlSchemeDelimiter(value, serviceName2, label, displayValue = v
|
|
|
86696
86696
|
const allowedScheme = label === "auth.base URL" ? scheme.toLowerCase() === REQUIRED_AUTH_BASE_URL_SCHEME : ALLOWED_BASE_URL_SCHEMES.has(scheme.toLowerCase());
|
|
86697
86697
|
if (!allowedScheme) {
|
|
86698
86698
|
throw new Error(
|
|
86699
|
-
`Invalid ${label} "${
|
|
86699
|
+
`Invalid ${label} "${displayValue2}" in firewall "${serviceName2}": ${schemeDetail}`
|
|
86700
86700
|
);
|
|
86701
86701
|
}
|
|
86702
86702
|
throw new Error(
|
|
86703
|
-
`Invalid ${label} "${
|
|
86703
|
+
`Invalid ${label} "${displayValue2}" in firewall "${serviceName2}": URL must include "://" after the scheme`
|
|
86704
86704
|
);
|
|
86705
86705
|
}
|
|
86706
86706
|
throw new Error(
|
|
86707
|
-
`Invalid ${label} "${
|
|
86707
|
+
`Invalid ${label} "${displayValue2}" in firewall "${serviceName2}": URL must include a scheme (e.g. "https://${displayValue2}")`
|
|
86708
86708
|
);
|
|
86709
86709
|
}
|
|
86710
86710
|
function isAscii(value) {
|
|
@@ -87401,6 +87401,11 @@ var runnerClaimPollReasonSchema = external_exports.enum([
|
|
|
87401
87401
|
var runnerClaimTelemetrySchema = external_exports.object({
|
|
87402
87402
|
jobDiscoveredToClaimRequestMs: external_exports.number().int().nonnegative().optional(),
|
|
87403
87403
|
localAdmissionToClaimRequestMs: external_exports.number().int().nonnegative().optional(),
|
|
87404
|
+
pollDueToJobDiscoveredMs: external_exports.number().int().nonnegative().optional(),
|
|
87405
|
+
pollHttpRequestMs: external_exports.number().int().nonnegative().optional(),
|
|
87406
|
+
pollReason: runnerClaimPollReasonSchema.optional()
|
|
87407
|
+
});
|
|
87408
|
+
var runnerPollTelemetrySchema = external_exports.object({
|
|
87404
87409
|
pollReason: runnerClaimPollReasonSchema.optional()
|
|
87405
87410
|
});
|
|
87406
87411
|
var runnerGroupSchema = external_exports.string().regex(
|
|
@@ -87430,7 +87435,8 @@ var runnersPollContract = c.router({
|
|
|
87430
87435
|
body: external_exports.object({
|
|
87431
87436
|
group: runnerGroupSchema,
|
|
87432
87437
|
profiles: external_exports.array(external_exports.string()).optional(),
|
|
87433
|
-
heldSessionStates: external_exports.array(heldSessionStateSchema).max(1024).optional()
|
|
87438
|
+
heldSessionStates: external_exports.array(heldSessionStateSchema).max(1024).optional(),
|
|
87439
|
+
telemetry: runnerPollTelemetrySchema.optional()
|
|
87434
87440
|
}),
|
|
87435
87441
|
responses: {
|
|
87436
87442
|
200: external_exports.object({
|
|
@@ -89076,7 +89082,14 @@ var orgMessageResponseSchema = external_exports.object({
|
|
|
89076
89082
|
|
|
89077
89083
|
// ../../packages/api-contracts/src/contracts/orgs.ts
|
|
89078
89084
|
var c5 = initContract();
|
|
89079
|
-
var orgTierSchema = external_exports.enum([
|
|
89085
|
+
var orgTierSchema = external_exports.enum([
|
|
89086
|
+
"free",
|
|
89087
|
+
"limited-free-1",
|
|
89088
|
+
"pro-suspend",
|
|
89089
|
+
"pro",
|
|
89090
|
+
"team"
|
|
89091
|
+
]);
|
|
89092
|
+
var ORG_TIER_SET = new Set(orgTierSchema.options);
|
|
89080
89093
|
var orgSlugSchema = external_exports.string().min(3, "Org slug must be at least 3 characters").max(64, "Org slug must be at most 64 characters").regex(
|
|
89081
89094
|
/^[a-z0-9][a-z0-9-]*[a-z0-9]$|^[a-z0-9]{1,2}$/,
|
|
89082
89095
|
"Org slug must contain only lowercase letters, numbers, and hyphens, and must start and end with an alphanumeric character"
|
|
@@ -90300,6 +90313,7 @@ var zeroModelPoliciesMainContract = c13.router({
|
|
|
90300
90313
|
200: orgModelPoliciesResponseSchema,
|
|
90301
90314
|
400: apiErrorSchema,
|
|
90302
90315
|
401: apiErrorSchema,
|
|
90316
|
+
402: apiErrorSchema,
|
|
90303
90317
|
403: apiErrorSchema,
|
|
90304
90318
|
404: apiErrorSchema,
|
|
90305
90319
|
500: apiErrorSchema
|
|
@@ -90524,7 +90538,7 @@ var paginationSchema = external_exports.object({
|
|
|
90524
90538
|
});
|
|
90525
90539
|
var listQuerySchema = external_exports.object({
|
|
90526
90540
|
cursor: external_exports.string().optional(),
|
|
90527
|
-
limit: external_exports.coerce.number().min(1).max(100).default(20)
|
|
90541
|
+
limit: external_exports.coerce.number().int().min(1).max(100).default(20)
|
|
90528
90542
|
});
|
|
90529
90543
|
var c15 = initContract();
|
|
90530
90544
|
var logStatusSchema = external_exports.enum([
|
|
@@ -90965,6 +90979,12 @@ var sequenceQueryNumberSchema = safeIntegerQueryNumberSchema.refine(
|
|
|
90965
90979
|
},
|
|
90966
90980
|
{ message: "Sequence cursor is out of range" }
|
|
90967
90981
|
);
|
|
90982
|
+
function boundedIntegerQueryNumberSchema(min, max) {
|
|
90983
|
+
return external_exports.preprocess(
|
|
90984
|
+
rejectBlankQueryNumber2,
|
|
90985
|
+
external_exports.coerce.number().int().min(min).max(max)
|
|
90986
|
+
);
|
|
90987
|
+
}
|
|
90968
90988
|
function logSinceQuerySchema(cursorKind) {
|
|
90969
90989
|
return cursorKind === "time" ? timestampQueryNumberSchema : sequenceQueryNumberSchema;
|
|
90970
90990
|
}
|
|
@@ -91285,6 +91305,7 @@ var runNetworkLogsContract = c16.router({
|
|
|
91285
91305
|
var searchResultSchema = external_exports.object({
|
|
91286
91306
|
runId: external_exports.string(),
|
|
91287
91307
|
agentName: external_exports.string(),
|
|
91308
|
+
framework: external_exports.string().nullable().optional(),
|
|
91288
91309
|
matchedEvent: runEventSchema,
|
|
91289
91310
|
contextBefore: external_exports.array(runEventSchema),
|
|
91290
91311
|
contextAfter: external_exports.array(runEventSchema)
|
|
@@ -91293,6 +91314,15 @@ var logsSearchResponseSchema = external_exports.object({
|
|
|
91293
91314
|
results: external_exports.array(searchResultSchema),
|
|
91294
91315
|
hasMore: external_exports.boolean()
|
|
91295
91316
|
});
|
|
91317
|
+
var logsSearchQuerySchema = external_exports.object({
|
|
91318
|
+
keyword: external_exports.string().trim().min(1),
|
|
91319
|
+
agentId: external_exports.string().uuid().optional(),
|
|
91320
|
+
runId: external_exports.string().uuid().optional(),
|
|
91321
|
+
since: timestampQueryNumberSchema.optional(),
|
|
91322
|
+
limit: boundedIntegerQueryNumberSchema(1, 50).default(20),
|
|
91323
|
+
before: boundedIntegerQueryNumberSchema(0, 10).default(0),
|
|
91324
|
+
after: boundedIntegerQueryNumberSchema(0, 10).default(0)
|
|
91325
|
+
});
|
|
91296
91326
|
var logsSearchContract = c16.router({
|
|
91297
91327
|
/**
|
|
91298
91328
|
* GET /api/logs/search
|
|
@@ -91302,15 +91332,7 @@ var logsSearchContract = c16.router({
|
|
|
91302
91332
|
method: "GET",
|
|
91303
91333
|
path: "/api/logs/search",
|
|
91304
91334
|
headers: authHeadersSchema,
|
|
91305
|
-
query:
|
|
91306
|
-
keyword: external_exports.string().min(1),
|
|
91307
|
-
agentId: external_exports.string().uuid().optional(),
|
|
91308
|
-
runId: external_exports.string().optional(),
|
|
91309
|
-
since: timestampQueryNumberSchema.optional(),
|
|
91310
|
-
limit: external_exports.coerce.number().min(1).max(50).default(20),
|
|
91311
|
-
before: external_exports.coerce.number().min(0).max(10).default(0),
|
|
91312
|
-
after: external_exports.coerce.number().min(0).max(10).default(0)
|
|
91313
|
-
}),
|
|
91335
|
+
query: logsSearchQuerySchema,
|
|
91314
91336
|
responses: {
|
|
91315
91337
|
200: logsSearchResponseSchema,
|
|
91316
91338
|
400: apiErrorSchema,
|
|
@@ -91940,6 +91962,7 @@ var chatThreadByIdContract = c18.router({
|
|
|
91940
91962
|
204: c18.noBody(),
|
|
91941
91963
|
400: apiErrorSchema,
|
|
91942
91964
|
401: apiErrorSchema,
|
|
91965
|
+
402: apiErrorSchema,
|
|
91943
91966
|
404: apiErrorSchema
|
|
91944
91967
|
},
|
|
91945
91968
|
summary: "Delete a chat thread",
|
|
@@ -92031,6 +92054,7 @@ var chatThreadModelSelectionContract = c18.router({
|
|
|
92031
92054
|
204: c18.noBody(),
|
|
92032
92055
|
400: apiErrorSchema,
|
|
92033
92056
|
401: apiErrorSchema,
|
|
92057
|
+
402: apiErrorSchema,
|
|
92034
92058
|
404: apiErrorSchema
|
|
92035
92059
|
},
|
|
92036
92060
|
summary: "Update a chat thread model selection"
|
|
@@ -92173,7 +92197,7 @@ var chatSearchContract = c18.router({
|
|
|
92173
92197
|
path: "/api/zero/chat/search",
|
|
92174
92198
|
headers: authHeadersSchema,
|
|
92175
92199
|
query: external_exports.object({
|
|
92176
|
-
keyword: external_exports.string().min(1),
|
|
92200
|
+
keyword: external_exports.string().trim().min(1),
|
|
92177
92201
|
agentId: external_exports.string().uuid().optional(),
|
|
92178
92202
|
since: external_exports.coerce.number().optional(),
|
|
92179
92203
|
limit: external_exports.coerce.number().min(1).max(50).default(20),
|
|
@@ -94353,15 +94377,7 @@ var zeroLogsSearchContract = c27.router({
|
|
|
94353
94377
|
method: "GET",
|
|
94354
94378
|
path: "/api/zero/logs/search",
|
|
94355
94379
|
headers: authHeadersSchema,
|
|
94356
|
-
query:
|
|
94357
|
-
keyword: external_exports.string().min(1),
|
|
94358
|
-
agentId: external_exports.string().uuid().optional(),
|
|
94359
|
-
runId: external_exports.string().optional(),
|
|
94360
|
-
since: timestampQueryNumberSchema.optional(),
|
|
94361
|
-
limit: external_exports.coerce.number().min(1).max(50).default(20),
|
|
94362
|
-
before: external_exports.coerce.number().min(0).max(10).default(0),
|
|
94363
|
-
after: external_exports.coerce.number().min(0).max(10).default(0)
|
|
94364
|
-
}),
|
|
94380
|
+
query: logsSearchQuerySchema,
|
|
94365
94381
|
responses: {
|
|
94366
94382
|
200: logsSearchResponseSchema,
|
|
94367
94383
|
400: apiErrorSchema,
|
|
@@ -95836,6 +95852,9 @@ var zeroWorkflowScheduleSchema = external_exports.discriminatedUnion("type", [
|
|
|
95836
95852
|
var unattendedTriggerPermissionActionSchema = firewallPolicyValueSchema.exclude(["ask"]);
|
|
95837
95853
|
var unattendedTriggerConnectorRefSchema = external_exports.string().min(1).max(64);
|
|
95838
95854
|
var unattendedTriggerPermissionKeySchema = external_exports.string().min(1).max(128);
|
|
95855
|
+
var unattendedTriggerConnectorRefsSchema = external_exports.array(
|
|
95856
|
+
unattendedTriggerConnectorRefSchema
|
|
95857
|
+
);
|
|
95839
95858
|
var unattendedTriggerPermissionPolicySchema = external_exports.record(
|
|
95840
95859
|
unattendedTriggerConnectorRefSchema,
|
|
95841
95860
|
external_exports.object({
|
|
@@ -95846,6 +95865,7 @@ var unattendedTriggerPermissionPolicySchema = external_exports.record(
|
|
|
95846
95865
|
})
|
|
95847
95866
|
);
|
|
95848
95867
|
var setUnattendedTriggerPermissionPolicyRequestSchema = external_exports.object({
|
|
95868
|
+
unattendedConnectorRefs: unattendedTriggerConnectorRefsSchema.optional(),
|
|
95849
95869
|
unattendedPermissionPolicy: unattendedTriggerPermissionPolicySchema.nullable()
|
|
95850
95870
|
});
|
|
95851
95871
|
var zeroWorkflowTriggerSummaryBaseSchema = external_exports.object({
|
|
@@ -95855,6 +95875,7 @@ var zeroWorkflowTriggerSummaryBaseSchema = external_exports.object({
|
|
|
95855
95875
|
chatThreadId: external_exports.string().nullable(),
|
|
95856
95876
|
nextRunAt: external_exports.string().datetime().nullable(),
|
|
95857
95877
|
lastRunAt: external_exports.string().datetime().nullable(),
|
|
95878
|
+
unattendedConnectorRefs: unattendedTriggerConnectorRefsSchema,
|
|
95858
95879
|
unattendedPermissionPolicy: unattendedTriggerPermissionPolicySchema.nullable()
|
|
95859
95880
|
});
|
|
95860
95881
|
var zeroWorkflowScheduleTriggerSummarySchema = zeroWorkflowTriggerSummaryBaseSchema.extend({
|
|
@@ -96268,21 +96289,6 @@ var zeroWorkflowTriggersContract = c32.router({
|
|
|
96268
96289
|
},
|
|
96269
96290
|
summary: "Disable a workflow trigger"
|
|
96270
96291
|
},
|
|
96271
|
-
run: {
|
|
96272
|
-
method: "POST",
|
|
96273
|
-
path: "/api/zero/workflow-triggers/:id/run",
|
|
96274
|
-
headers: authHeadersSchema,
|
|
96275
|
-
pathParams: triggerIdParams,
|
|
96276
|
-
body: c32.noBody(),
|
|
96277
|
-
responses: {
|
|
96278
|
-
200: external_exports.object({ runId: external_exports.string() }),
|
|
96279
|
-
401: apiErrorSchema,
|
|
96280
|
-
403: apiErrorSchema,
|
|
96281
|
-
404: apiErrorSchema,
|
|
96282
|
-
409: apiErrorSchema
|
|
96283
|
-
},
|
|
96284
|
-
summary: "Fire a one-off test run of a workflow trigger"
|
|
96285
|
-
},
|
|
96286
96292
|
setPermissionPolicy: {
|
|
96287
96293
|
method: "PUT",
|
|
96288
96294
|
path: "/api/zero/workflow-triggers/:id/permission-policy",
|
|
@@ -96402,13 +96408,6 @@ async function disableWorkflowTrigger(id) {
|
|
|
96402
96408
|
if (result.status === 200) return result.body;
|
|
96403
96409
|
handleError(result, `Failed to disable workflow trigger "${id}"`);
|
|
96404
96410
|
}
|
|
96405
|
-
async function runWorkflowTrigger(id) {
|
|
96406
|
-
const config3 = await getClientConfig();
|
|
96407
|
-
const client = initClient(zeroWorkflowTriggersContract, config3);
|
|
96408
|
-
const result = await client.run({ params: { id } });
|
|
96409
|
-
if (result.status === 200) return result.body;
|
|
96410
|
-
handleError(result, `Failed to run workflow trigger "${id}"`);
|
|
96411
|
-
}
|
|
96412
96411
|
|
|
96413
96412
|
// src/lib/api/domains/integrations-slack.ts
|
|
96414
96413
|
init_esm_shims();
|
|
@@ -101563,6 +101562,45 @@ async function removeEmptyDirs(dir, excludeDirs = [".vm0"]) {
|
|
|
101563
101562
|
return isEmpty;
|
|
101564
101563
|
}
|
|
101565
101564
|
|
|
101565
|
+
// ../../packages/core/src/frameworks.ts
|
|
101566
|
+
init_esm_shims();
|
|
101567
|
+
var SUPPORTED_FRAMEWORKS = ["claude-code", "codex"];
|
|
101568
|
+
function isSupportedFramework(framework) {
|
|
101569
|
+
if (!framework) return false;
|
|
101570
|
+
return SUPPORTED_FRAMEWORKS.includes(framework);
|
|
101571
|
+
}
|
|
101572
|
+
function assertSupportedFramework(framework, context2) {
|
|
101573
|
+
if (!isSupportedFramework(framework)) {
|
|
101574
|
+
const contextMsg = context2 ? ` in ${context2}` : "";
|
|
101575
|
+
throw new Error(
|
|
101576
|
+
`Unsupported framework "${framework}"${contextMsg}. Supported frameworks: ${SUPPORTED_FRAMEWORKS.join(", ")}`
|
|
101577
|
+
);
|
|
101578
|
+
}
|
|
101579
|
+
}
|
|
101580
|
+
function getValidatedFramework(framework) {
|
|
101581
|
+
if (framework === void 0) {
|
|
101582
|
+
return "claude-code";
|
|
101583
|
+
}
|
|
101584
|
+
assertSupportedFramework(framework);
|
|
101585
|
+
return framework;
|
|
101586
|
+
}
|
|
101587
|
+
var FRAMEWORK_DISPLAY_NAMES = {
|
|
101588
|
+
"claude-code": "Claude Code",
|
|
101589
|
+
codex: "Codex"
|
|
101590
|
+
};
|
|
101591
|
+
function getFrameworkDisplayName(framework) {
|
|
101592
|
+
assertSupportedFramework(framework);
|
|
101593
|
+
return FRAMEWORK_DISPLAY_NAMES[framework];
|
|
101594
|
+
}
|
|
101595
|
+
var FRAMEWORK_INSTRUCTIONS_FILENAMES = {
|
|
101596
|
+
"claude-code": "CLAUDE.md",
|
|
101597
|
+
codex: "AGENTS.md"
|
|
101598
|
+
};
|
|
101599
|
+
function getInstructionsFilename(framework) {
|
|
101600
|
+
const validated = getValidatedFramework(framework);
|
|
101601
|
+
return FRAMEWORK_INSTRUCTIONS_FILENAMES[validated];
|
|
101602
|
+
}
|
|
101603
|
+
|
|
101566
101604
|
// ../../packages/core/src/resource-registry.ts
|
|
101567
101605
|
init_esm_shims();
|
|
101568
101606
|
var PRESENTATION_REQUIRED_RESOURCE_IDS = [
|
|
@@ -109805,6 +109843,26 @@ var onboardingSetupContract = c63.router({
|
|
|
109805
109843
|
summary: "Complete admin onboarding in a single request"
|
|
109806
109844
|
}
|
|
109807
109845
|
});
|
|
109846
|
+
var onboardingCompleteLimitedFreeContract = c63.router({
|
|
109847
|
+
complete: {
|
|
109848
|
+
method: "POST",
|
|
109849
|
+
path: "/api/zero/onboarding/complete-limited-free",
|
|
109850
|
+
headers: authHeadersSchema,
|
|
109851
|
+
body: external_exports.object({}).strict(),
|
|
109852
|
+
responses: {
|
|
109853
|
+
200: external_exports.object({
|
|
109854
|
+
agentId: external_exports.string(),
|
|
109855
|
+
tier: external_exports.literal("limited-free-1"),
|
|
109856
|
+
needsOnboarding: external_exports.literal(false)
|
|
109857
|
+
}),
|
|
109858
|
+
400: apiErrorSchema,
|
|
109859
|
+
401: apiErrorSchema,
|
|
109860
|
+
403: apiErrorSchema,
|
|
109861
|
+
409: apiErrorSchema
|
|
109862
|
+
},
|
|
109863
|
+
summary: "Complete onboarding and enter the limited free tier"
|
|
109864
|
+
}
|
|
109865
|
+
});
|
|
109808
109866
|
|
|
109809
109867
|
// ../../packages/api-contracts/src/contracts/skills.ts
|
|
109810
109868
|
init_esm_shims();
|
|
@@ -112136,45 +112194,6 @@ function getInstructionsStorageName(agentName) {
|
|
|
112136
112194
|
// ../../packages/core/src/github-url.ts
|
|
112137
112195
|
init_esm_shims();
|
|
112138
112196
|
|
|
112139
|
-
// ../../packages/core/src/frameworks.ts
|
|
112140
|
-
init_esm_shims();
|
|
112141
|
-
var SUPPORTED_FRAMEWORKS = ["claude-code", "codex"];
|
|
112142
|
-
function isSupportedFramework(framework) {
|
|
112143
|
-
if (!framework) return false;
|
|
112144
|
-
return SUPPORTED_FRAMEWORKS.includes(framework);
|
|
112145
|
-
}
|
|
112146
|
-
function assertSupportedFramework(framework, context2) {
|
|
112147
|
-
if (!isSupportedFramework(framework)) {
|
|
112148
|
-
const contextMsg = context2 ? ` in ${context2}` : "";
|
|
112149
|
-
throw new Error(
|
|
112150
|
-
`Unsupported framework "${framework}"${contextMsg}. Supported frameworks: ${SUPPORTED_FRAMEWORKS.join(", ")}`
|
|
112151
|
-
);
|
|
112152
|
-
}
|
|
112153
|
-
}
|
|
112154
|
-
function getValidatedFramework(framework) {
|
|
112155
|
-
if (framework === void 0) {
|
|
112156
|
-
return "claude-code";
|
|
112157
|
-
}
|
|
112158
|
-
assertSupportedFramework(framework);
|
|
112159
|
-
return framework;
|
|
112160
|
-
}
|
|
112161
|
-
var FRAMEWORK_DISPLAY_NAMES = {
|
|
112162
|
-
"claude-code": "Claude Code",
|
|
112163
|
-
codex: "Codex"
|
|
112164
|
-
};
|
|
112165
|
-
function getFrameworkDisplayName(framework) {
|
|
112166
|
-
assertSupportedFramework(framework);
|
|
112167
|
-
return FRAMEWORK_DISPLAY_NAMES[framework];
|
|
112168
|
-
}
|
|
112169
|
-
var FRAMEWORK_INSTRUCTIONS_FILENAMES = {
|
|
112170
|
-
"claude-code": "CLAUDE.md",
|
|
112171
|
-
codex: "AGENTS.md"
|
|
112172
|
-
};
|
|
112173
|
-
function getInstructionsFilename(framework) {
|
|
112174
|
-
const validated = getValidatedFramework(framework);
|
|
112175
|
-
return FRAMEWORK_INSTRUCTIONS_FILENAMES[validated];
|
|
112176
|
-
}
|
|
112177
|
-
|
|
112178
112197
|
// ../../packages/core/src/feature-switch-key.ts
|
|
112179
112198
|
init_esm_shims();
|
|
112180
112199
|
|
|
@@ -112672,207 +112691,766 @@ var ClaudeEventParser = class {
|
|
|
112672
112691
|
|
|
112673
112692
|
// src/lib/events/codex-event-parser.ts
|
|
112674
112693
|
init_esm_shims();
|
|
112694
|
+
var MAX_FORMATTED_ARRAY_ITEMS = 6;
|
|
112695
|
+
var MAX_FORMATTED_ARRAY_DEPTH = 4;
|
|
112696
|
+
var MAX_FORMATTED_OBJECT_FIELDS = 8;
|
|
112697
|
+
var MAX_FORMATTED_OBJECT_INSPECTED_FIELDS = 16;
|
|
112698
|
+
var MAX_FORMATTED_TEXT_LENGTH = 240;
|
|
112699
|
+
var MAX_ERROR_SIGNAL_DEPTH = 8;
|
|
112700
|
+
var MAX_FORMATTED_PLAN_STEPS = 20;
|
|
112701
|
+
var MAX_FORMATTED_FILE_CHANGES = 20;
|
|
112702
|
+
function asRecord(value) {
|
|
112703
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
112704
|
+
return null;
|
|
112705
|
+
}
|
|
112706
|
+
return value;
|
|
112707
|
+
}
|
|
112708
|
+
function hasOwnKey(record, key) {
|
|
112709
|
+
return Object.prototype.hasOwnProperty.call(record, key);
|
|
112710
|
+
}
|
|
112711
|
+
function stringValue(value) {
|
|
112712
|
+
return typeof value === "string" ? value : void 0;
|
|
112713
|
+
}
|
|
112714
|
+
function nonEmptyStringValue(value) {
|
|
112715
|
+
const valueString = stringValue(value);
|
|
112716
|
+
return valueString && valueString.length > 0 ? valueString : void 0;
|
|
112717
|
+
}
|
|
112718
|
+
function trimmedStringValue(value) {
|
|
112719
|
+
const valueString = stringValue(value)?.trim();
|
|
112720
|
+
return valueString && valueString.length > 0 ? valueString : void 0;
|
|
112721
|
+
}
|
|
112722
|
+
function numberValue(value) {
|
|
112723
|
+
return typeof value === "number" && Number.isFinite(value) ? value : void 0;
|
|
112724
|
+
}
|
|
112725
|
+
function getFirstString(record, keys) {
|
|
112726
|
+
for (const key of keys) {
|
|
112727
|
+
const value = trimmedStringValue(record[key]);
|
|
112728
|
+
if (value) {
|
|
112729
|
+
return value;
|
|
112730
|
+
}
|
|
112731
|
+
}
|
|
112732
|
+
return void 0;
|
|
112733
|
+
}
|
|
112734
|
+
function getFirstNumber(record, keys) {
|
|
112735
|
+
for (const key of keys) {
|
|
112736
|
+
const value = numberValue(record[key]);
|
|
112737
|
+
if (value !== void 0) {
|
|
112738
|
+
return value;
|
|
112739
|
+
}
|
|
112740
|
+
}
|
|
112741
|
+
return void 0;
|
|
112742
|
+
}
|
|
112743
|
+
function truncate2(text) {
|
|
112744
|
+
if (text.length <= MAX_FORMATTED_TEXT_LENGTH) {
|
|
112745
|
+
return text;
|
|
112746
|
+
}
|
|
112747
|
+
return `${text.slice(0, MAX_FORMATTED_TEXT_LENGTH - 3)}...`;
|
|
112748
|
+
}
|
|
112749
|
+
function formatScalar(value) {
|
|
112750
|
+
if (value === null) {
|
|
112751
|
+
return "null";
|
|
112752
|
+
}
|
|
112753
|
+
if (typeof value === "string") {
|
|
112754
|
+
return value.trim().length > 0 ? truncate2(value) : void 0;
|
|
112755
|
+
}
|
|
112756
|
+
if (typeof value === "number" || typeof value === "boolean") {
|
|
112757
|
+
return truncate2(String(value));
|
|
112758
|
+
}
|
|
112759
|
+
return void 0;
|
|
112760
|
+
}
|
|
112761
|
+
function hasSignalValue(value, depth = 0) {
|
|
112762
|
+
if (value === null || value === void 0 || value === false) {
|
|
112763
|
+
return false;
|
|
112764
|
+
}
|
|
112765
|
+
if (typeof value === "string") {
|
|
112766
|
+
return value.trim().length > 0;
|
|
112767
|
+
}
|
|
112768
|
+
if (typeof value === "number") {
|
|
112769
|
+
return Number.isFinite(value);
|
|
112770
|
+
}
|
|
112771
|
+
if (typeof value === "boolean") {
|
|
112772
|
+
return true;
|
|
112773
|
+
}
|
|
112774
|
+
if (depth >= MAX_ERROR_SIGNAL_DEPTH) {
|
|
112775
|
+
return false;
|
|
112776
|
+
}
|
|
112777
|
+
if (Array.isArray(value)) {
|
|
112778
|
+
if (depth >= MAX_FORMATTED_ARRAY_DEPTH) {
|
|
112779
|
+
return false;
|
|
112780
|
+
}
|
|
112781
|
+
return value.slice(0, MAX_FORMATTED_ARRAY_ITEMS).some((item) => {
|
|
112782
|
+
return hasSignalValue(item, depth + 1);
|
|
112783
|
+
});
|
|
112784
|
+
}
|
|
112785
|
+
const record = asRecord(value);
|
|
112786
|
+
if (!record) {
|
|
112787
|
+
return false;
|
|
112788
|
+
}
|
|
112789
|
+
let inspectedFields = 0;
|
|
112790
|
+
for (const key in record) {
|
|
112791
|
+
if (!hasOwnKey(record, key)) {
|
|
112792
|
+
continue;
|
|
112793
|
+
}
|
|
112794
|
+
if (inspectedFields >= MAX_FORMATTED_OBJECT_INSPECTED_FIELDS) {
|
|
112795
|
+
return false;
|
|
112796
|
+
}
|
|
112797
|
+
inspectedFields += 1;
|
|
112798
|
+
if (hasSignalValue(record[key], depth + 1)) {
|
|
112799
|
+
return true;
|
|
112800
|
+
}
|
|
112801
|
+
}
|
|
112802
|
+
return false;
|
|
112803
|
+
}
|
|
112804
|
+
function formatUnknownValue(value, depth = 0) {
|
|
112805
|
+
const scalar = formatScalar(value);
|
|
112806
|
+
if (scalar !== void 0) {
|
|
112807
|
+
return scalar;
|
|
112808
|
+
}
|
|
112809
|
+
if (Array.isArray(value)) {
|
|
112810
|
+
if (depth >= MAX_FORMATTED_ARRAY_DEPTH) {
|
|
112811
|
+
return "...";
|
|
112812
|
+
}
|
|
112813
|
+
const items = value.slice(0, MAX_FORMATTED_ARRAY_ITEMS).map((item) => {
|
|
112814
|
+
return formatUnknownValue(item, depth + 1);
|
|
112815
|
+
}).filter((item) => {
|
|
112816
|
+
return item !== void 0 && item.length > 0;
|
|
112817
|
+
});
|
|
112818
|
+
if (items.length === 0) {
|
|
112819
|
+
return void 0;
|
|
112820
|
+
}
|
|
112821
|
+
const suffix = value.length > MAX_FORMATTED_ARRAY_ITEMS ? ", ..." : "";
|
|
112822
|
+
return `[${items.join(", ")}${suffix}]`;
|
|
112823
|
+
}
|
|
112824
|
+
const record = asRecord(value);
|
|
112825
|
+
if (!record || depth > 0) {
|
|
112826
|
+
return void 0;
|
|
112827
|
+
}
|
|
112828
|
+
const fields = [];
|
|
112829
|
+
let inspectedFields = 0;
|
|
112830
|
+
for (const key in record) {
|
|
112831
|
+
if (!hasOwnKey(record, key)) {
|
|
112832
|
+
continue;
|
|
112833
|
+
}
|
|
112834
|
+
if (fields.length >= MAX_FORMATTED_OBJECT_FIELDS || inspectedFields >= MAX_FORMATTED_OBJECT_INSPECTED_FIELDS) {
|
|
112835
|
+
fields.push("...");
|
|
112836
|
+
break;
|
|
112837
|
+
}
|
|
112838
|
+
inspectedFields += 1;
|
|
112839
|
+
const fieldValue = record[key];
|
|
112840
|
+
const formatted = formatUnknownValue(fieldValue, depth + 1);
|
|
112841
|
+
if (formatted !== void 0) {
|
|
112842
|
+
fields.push(`${key}=${formatted}`);
|
|
112843
|
+
}
|
|
112844
|
+
}
|
|
112845
|
+
return fields.length > 0 ? `{${fields.join(", ")}}` : void 0;
|
|
112846
|
+
}
|
|
112847
|
+
function formatSignalValue(value, includeBoundedPlaceholder = false) {
|
|
112848
|
+
if (value === null || value === void 0 || value === false) {
|
|
112849
|
+
return void 0;
|
|
112850
|
+
}
|
|
112851
|
+
const formatted = formatUnknownValue(value);
|
|
112852
|
+
if (!formatted) {
|
|
112853
|
+
return void 0;
|
|
112854
|
+
}
|
|
112855
|
+
if (hasSignalValue(value)) {
|
|
112856
|
+
return formatted;
|
|
112857
|
+
}
|
|
112858
|
+
return includeBoundedPlaceholder && formatted.includes("...") ? formatted : void 0;
|
|
112859
|
+
}
|
|
112860
|
+
function combineDistinctMessages(first, second) {
|
|
112861
|
+
const messages = [];
|
|
112862
|
+
for (const message of [first, second]) {
|
|
112863
|
+
const trimmed = message?.trim();
|
|
112864
|
+
if (!trimmed) {
|
|
112865
|
+
continue;
|
|
112866
|
+
}
|
|
112867
|
+
const containingIndex = messages.findIndex((existing) => {
|
|
112868
|
+
return existing === trimmed || existing.includes(trimmed);
|
|
112869
|
+
});
|
|
112870
|
+
if (containingIndex !== -1) {
|
|
112871
|
+
continue;
|
|
112872
|
+
}
|
|
112873
|
+
const containedIndex = messages.findIndex((existing) => {
|
|
112874
|
+
return trimmed.includes(existing);
|
|
112875
|
+
});
|
|
112876
|
+
if (containedIndex !== -1) {
|
|
112877
|
+
messages[containedIndex] = trimmed;
|
|
112878
|
+
continue;
|
|
112879
|
+
}
|
|
112880
|
+
messages.push(trimmed);
|
|
112881
|
+
}
|
|
112882
|
+
return messages.length > 0 ? messages.join("\n") : void 0;
|
|
112883
|
+
}
|
|
112884
|
+
function isGenericFailureMessage(message) {
|
|
112885
|
+
const normalized = message.trim().toLowerCase().replace(/[\s.:!?]+$/u, "");
|
|
112886
|
+
return normalized === "error" || normalized === "turn failed" || normalized === "turn interrupted" || normalized === "unknown error" || normalized === "codex error";
|
|
112887
|
+
}
|
|
112888
|
+
function combineResultWithError(result, errorMessage) {
|
|
112889
|
+
if (result === void 0 || result.length === 0) {
|
|
112890
|
+
return errorMessage;
|
|
112891
|
+
}
|
|
112892
|
+
if (!errorMessage) {
|
|
112893
|
+
return result;
|
|
112894
|
+
}
|
|
112895
|
+
const trimmedResult = result.trim();
|
|
112896
|
+
if (!trimmedResult) {
|
|
112897
|
+
return errorMessage;
|
|
112898
|
+
}
|
|
112899
|
+
if (trimmedResult === errorMessage || trimmedResult.includes(errorMessage)) {
|
|
112900
|
+
return result;
|
|
112901
|
+
}
|
|
112902
|
+
if (errorMessage.includes(trimmedResult)) {
|
|
112903
|
+
return errorMessage;
|
|
112904
|
+
}
|
|
112905
|
+
return `${result}
|
|
112906
|
+
${errorMessage}`;
|
|
112907
|
+
}
|
|
112908
|
+
function formatDetailSuffix(details) {
|
|
112909
|
+
return details.length > 0 ? ` (${details.join("; ")})` : "";
|
|
112910
|
+
}
|
|
112911
|
+
function extractErrorMessage(value, depth = 0) {
|
|
112912
|
+
if (value === null || value === void 0 || value === false) {
|
|
112913
|
+
return void 0;
|
|
112914
|
+
}
|
|
112915
|
+
const direct = trimmedStringValue(value);
|
|
112916
|
+
if (direct) {
|
|
112917
|
+
return direct;
|
|
112918
|
+
}
|
|
112919
|
+
const record = asRecord(value);
|
|
112920
|
+
if (!record) {
|
|
112921
|
+
return hasSignalValue(value, depth) ? formatUnknownValue(value) : void 0;
|
|
112922
|
+
}
|
|
112923
|
+
const message = getFirstString(record, ["message"]) ?? getFirstString(record, ["error", "code", "failureReason"]);
|
|
112924
|
+
const details = [
|
|
112925
|
+
getFirstString(record, ["additional_details", "additionalDetails"]),
|
|
112926
|
+
getFirstString(record, ["codex_error_info", "codexErrorInfo"]),
|
|
112927
|
+
formatSignalValue(record.connectors, message !== void 0)
|
|
112928
|
+
].filter((detail) => {
|
|
112929
|
+
return detail !== void 0 && detail.length > 0;
|
|
112930
|
+
});
|
|
112931
|
+
if (message) {
|
|
112932
|
+
const uniqueDetails = details.filter((detail) => {
|
|
112933
|
+
return !message.includes(detail);
|
|
112934
|
+
});
|
|
112935
|
+
return `${message}${formatDetailSuffix(uniqueDetails)}`;
|
|
112936
|
+
}
|
|
112937
|
+
if (details.length > 0) {
|
|
112938
|
+
return details.join("; ");
|
|
112939
|
+
}
|
|
112940
|
+
if (depth >= MAX_ERROR_SIGNAL_DEPTH) {
|
|
112941
|
+
return void 0;
|
|
112942
|
+
}
|
|
112943
|
+
const nested = extractErrorMessage(record.error, depth + 1);
|
|
112944
|
+
if (nested) {
|
|
112945
|
+
return nested;
|
|
112946
|
+
}
|
|
112947
|
+
return hasSignalValue(record, depth) ? formatUnknownValue(record) : void 0;
|
|
112948
|
+
}
|
|
112949
|
+
function extractEventErrorMessage(event) {
|
|
112950
|
+
return combineDistinctMessages(
|
|
112951
|
+
trimmedStringValue(event.message),
|
|
112952
|
+
extractErrorMessage(event.error)
|
|
112953
|
+
);
|
|
112954
|
+
}
|
|
112955
|
+
function getTurnRecord(event) {
|
|
112956
|
+
return asRecord(event.turn);
|
|
112957
|
+
}
|
|
112958
|
+
function getTurnId(event) {
|
|
112959
|
+
const topLevelId = getFirstString(event, ["turn_id", "turnId"]);
|
|
112960
|
+
if (topLevelId) {
|
|
112961
|
+
return topLevelId;
|
|
112962
|
+
}
|
|
112963
|
+
const turn = getTurnRecord(event);
|
|
112964
|
+
return turn ? getFirstString(turn, ["id"]) : void 0;
|
|
112965
|
+
}
|
|
112966
|
+
function getTurnStatus(event) {
|
|
112967
|
+
const turn = getTurnRecord(event);
|
|
112968
|
+
return (turn ? getFirstString(turn, ["status"]) : void 0) ?? getFirstString(event, ["status"]);
|
|
112969
|
+
}
|
|
112970
|
+
var FAILED_STATUSES = /* @__PURE__ */ new Set([
|
|
112971
|
+
"aborted",
|
|
112972
|
+
"cancelled",
|
|
112973
|
+
"canceled",
|
|
112974
|
+
"declined",
|
|
112975
|
+
"error",
|
|
112976
|
+
"failed",
|
|
112977
|
+
"interrupted",
|
|
112978
|
+
"timed_out",
|
|
112979
|
+
"timeout"
|
|
112980
|
+
]);
|
|
112981
|
+
var SUCCESSFUL_TURN_COMPLETION_STATUSES = /* @__PURE__ */ new Set([
|
|
112982
|
+
"completed",
|
|
112983
|
+
"success",
|
|
112984
|
+
"succeeded"
|
|
112985
|
+
]);
|
|
112986
|
+
function isFailedStatus(status) {
|
|
112987
|
+
return status !== void 0 && FAILED_STATUSES.has(status.toLowerCase());
|
|
112988
|
+
}
|
|
112989
|
+
function isUnsuccessfulTurnCompletionStatus(status) {
|
|
112990
|
+
return status !== void 0 && !SUCCESSFUL_TURN_COMPLETION_STATUSES.has(status.toLowerCase());
|
|
112991
|
+
}
|
|
112992
|
+
function hasExtractableError(value) {
|
|
112993
|
+
return extractErrorMessage(value) !== void 0;
|
|
112994
|
+
}
|
|
112995
|
+
function hasTurnCompletionError(event, turn) {
|
|
112996
|
+
return turn !== null && hasExtractableError(turn.error) || hasExtractableError(event.error);
|
|
112997
|
+
}
|
|
112998
|
+
function getTurnErrorMessage(event, turn) {
|
|
112999
|
+
const turnMessage = turn !== null ? extractErrorMessage(turn.error) : void 0;
|
|
113000
|
+
const eventMessage = extractEventErrorMessage(event);
|
|
113001
|
+
if (turnMessage && eventMessage && isGenericFailureMessage(eventMessage)) {
|
|
113002
|
+
return turnMessage;
|
|
113003
|
+
}
|
|
113004
|
+
return combineDistinctMessages(turnMessage, eventMessage);
|
|
113005
|
+
}
|
|
113006
|
+
function getUsage(event) {
|
|
113007
|
+
const turn = getTurnRecord(event);
|
|
113008
|
+
return asRecord(event.usage) ?? (turn ? asRecord(turn.usage) : null) ?? {};
|
|
113009
|
+
}
|
|
113010
|
+
function getTurnDurationMs(event, turn) {
|
|
113011
|
+
return (turn ? getFirstNumber(turn, ["duration_ms", "durationMs"]) : void 0) ?? getFirstNumber(event, ["duration_ms", "durationMs"]) ?? 0;
|
|
113012
|
+
}
|
|
113013
|
+
function getItem(event) {
|
|
113014
|
+
return asRecord(event.item);
|
|
113015
|
+
}
|
|
113016
|
+
function getItemId(item) {
|
|
113017
|
+
return getFirstString(item, ["id"]);
|
|
113018
|
+
}
|
|
113019
|
+
function getItemType(item) {
|
|
113020
|
+
return getFirstString(item, ["type"]);
|
|
113021
|
+
}
|
|
113022
|
+
function getItemStatus(item) {
|
|
113023
|
+
return getFirstString(item, ["status"]);
|
|
113024
|
+
}
|
|
113025
|
+
function getItemErrorMessage(item) {
|
|
113026
|
+
return extractErrorMessage(item.error);
|
|
113027
|
+
}
|
|
113028
|
+
function shouldRenderGenericItemFailure(eventType, item) {
|
|
113029
|
+
return eventType === "item.completed" && (isFailedStatus(getItemStatus(item)) || getItemErrorMessage(item) !== void 0);
|
|
113030
|
+
}
|
|
113031
|
+
function formatPlanStatus(status) {
|
|
113032
|
+
if (status === "completed") return "completed";
|
|
113033
|
+
if (status === "in_progress") return "in progress";
|
|
113034
|
+
if (status === "pending") return "pending";
|
|
113035
|
+
return status ?? "step";
|
|
113036
|
+
}
|
|
113037
|
+
function formatPlanLines(plan) {
|
|
113038
|
+
if (!Array.isArray(plan)) {
|
|
113039
|
+
return [];
|
|
113040
|
+
}
|
|
113041
|
+
const lines = plan.slice(0, MAX_FORMATTED_PLAN_STEPS).map((step) => {
|
|
113042
|
+
const stepRecord = asRecord(step);
|
|
113043
|
+
if (!stepRecord) {
|
|
113044
|
+
return void 0;
|
|
113045
|
+
}
|
|
113046
|
+
const text = trimmedStringValue(stepRecord.step);
|
|
113047
|
+
if (!text) {
|
|
113048
|
+
return void 0;
|
|
113049
|
+
}
|
|
113050
|
+
const status = formatPlanStatus(trimmedStringValue(stepRecord.status));
|
|
113051
|
+
return `- ${status}: ${text}`;
|
|
113052
|
+
}).filter((line) => {
|
|
113053
|
+
return line !== void 0;
|
|
113054
|
+
});
|
|
113055
|
+
const remaining = plan.length - MAX_FORMATTED_PLAN_STEPS;
|
|
113056
|
+
if (remaining > 0) {
|
|
113057
|
+
lines.push(`- ... +${remaining} more steps`);
|
|
113058
|
+
}
|
|
113059
|
+
return lines;
|
|
113060
|
+
}
|
|
113061
|
+
function formatGenericItem(item) {
|
|
113062
|
+
const itemType = getItemType(item);
|
|
113063
|
+
if (!itemType) {
|
|
113064
|
+
return void 0;
|
|
113065
|
+
}
|
|
113066
|
+
const fields = [itemType];
|
|
113067
|
+
const id = getItemId(item);
|
|
113068
|
+
if (id) {
|
|
113069
|
+
fields.push(`id=${id}`);
|
|
113070
|
+
}
|
|
113071
|
+
const status = getItemStatus(item);
|
|
113072
|
+
if (status) {
|
|
113073
|
+
fields.push(`status=${status}`);
|
|
113074
|
+
}
|
|
113075
|
+
let inspectedFields = 0;
|
|
113076
|
+
for (const key in item) {
|
|
113077
|
+
if (!hasOwnKey(item, key)) {
|
|
113078
|
+
continue;
|
|
113079
|
+
}
|
|
113080
|
+
if (key === "id" || key === "type" || key === "status") {
|
|
113081
|
+
continue;
|
|
113082
|
+
}
|
|
113083
|
+
if (fields.length >= MAX_FORMATTED_OBJECT_FIELDS + 3 || inspectedFields >= MAX_FORMATTED_OBJECT_INSPECTED_FIELDS) {
|
|
113084
|
+
fields.push("...");
|
|
113085
|
+
break;
|
|
113086
|
+
}
|
|
113087
|
+
inspectedFields += 1;
|
|
113088
|
+
const value = item[key];
|
|
113089
|
+
const formatted = formatUnknownValue(value);
|
|
113090
|
+
if (formatted !== void 0) {
|
|
113091
|
+
fields.push(`${key}=${formatted}`);
|
|
113092
|
+
}
|
|
113093
|
+
}
|
|
113094
|
+
return `[item] ${fields.join(" ")}`;
|
|
113095
|
+
}
|
|
113096
|
+
function formatFileChangeAction(kind) {
|
|
113097
|
+
if (kind === "add") return "Created";
|
|
113098
|
+
if (kind === "modify") return "Modified";
|
|
113099
|
+
if (kind === "delete") return "Deleted";
|
|
113100
|
+
return "Changed";
|
|
113101
|
+
}
|
|
112675
113102
|
var CodexEventParser = class {
|
|
112676
113103
|
/**
|
|
112677
|
-
* Parse a raw Codex
|
|
112678
|
-
* Returns null if the event type is unknown or malformed
|
|
113104
|
+
* Parse a raw Codex JSONL event into the shared CLI parsed-event format.
|
|
113105
|
+
* Returns null if the event type is unknown or too malformed to display.
|
|
112679
113106
|
*/
|
|
112680
113107
|
static parse(rawEvent) {
|
|
112681
|
-
|
|
113108
|
+
const event = asRecord(rawEvent);
|
|
113109
|
+
if (!event) {
|
|
113110
|
+
return null;
|
|
113111
|
+
}
|
|
113112
|
+
const eventType = stringValue(event.type);
|
|
113113
|
+
if (!eventType) {
|
|
112682
113114
|
return null;
|
|
112683
113115
|
}
|
|
112684
|
-
const eventType = rawEvent.type;
|
|
112685
113116
|
if (eventType === "thread.started") {
|
|
112686
|
-
return this.parseThreadStarted(
|
|
113117
|
+
return this.parseThreadStarted(event);
|
|
112687
113118
|
}
|
|
112688
113119
|
if (eventType === "turn.completed") {
|
|
112689
|
-
return this.parseTurnCompleted(
|
|
113120
|
+
return this.parseTurnCompleted(event);
|
|
112690
113121
|
}
|
|
112691
113122
|
if (eventType === "turn.failed") {
|
|
112692
|
-
return this.parseTurnFailed(
|
|
113123
|
+
return this.parseTurnFailed(event);
|
|
113124
|
+
}
|
|
113125
|
+
if (eventType === "turn.plan.updated") {
|
|
113126
|
+
return this.parseTurnPlanUpdated(event);
|
|
113127
|
+
}
|
|
113128
|
+
if (eventType === "warning") {
|
|
113129
|
+
return this.parseWarning(event);
|
|
112693
113130
|
}
|
|
112694
113131
|
if (eventType.startsWith("item.")) {
|
|
112695
|
-
return this.parseItemEvent(
|
|
113132
|
+
return this.parseItemEvent(event, eventType);
|
|
112696
113133
|
}
|
|
112697
113134
|
if (eventType === "error") {
|
|
112698
|
-
return this.parseErrorEvent(
|
|
113135
|
+
return this.parseErrorEvent(event);
|
|
112699
113136
|
}
|
|
112700
113137
|
return null;
|
|
112701
113138
|
}
|
|
112702
113139
|
static parseThreadStarted(event) {
|
|
113140
|
+
const threadId2 = getFirstString(event, ["thread_id", "threadId"]);
|
|
113141
|
+
if (!threadId2) {
|
|
113142
|
+
return null;
|
|
113143
|
+
}
|
|
112703
113144
|
return {
|
|
112704
113145
|
type: "init",
|
|
112705
113146
|
timestamp: /* @__PURE__ */ new Date(),
|
|
112706
113147
|
data: {
|
|
112707
113148
|
framework: "codex",
|
|
112708
|
-
sessionId:
|
|
113149
|
+
sessionId: threadId2,
|
|
112709
113150
|
tools: []
|
|
112710
113151
|
}
|
|
112711
113152
|
};
|
|
112712
113153
|
}
|
|
112713
113154
|
static parseTurnCompleted(event) {
|
|
113155
|
+
const status = getTurnStatus(event);
|
|
113156
|
+
const turn = getTurnRecord(event);
|
|
113157
|
+
const turnId = getTurnId(event);
|
|
113158
|
+
const durationMs = getTurnDurationMs(event, turn);
|
|
113159
|
+
if (isUnsuccessfulTurnCompletionStatus(status) || hasTurnCompletionError(event, turn)) {
|
|
113160
|
+
const result = getTurnErrorMessage(event, turn) ?? (status ? `Turn ${status}` : "Turn failed");
|
|
113161
|
+
return {
|
|
113162
|
+
type: "result",
|
|
113163
|
+
timestamp: /* @__PURE__ */ new Date(),
|
|
113164
|
+
data: {
|
|
113165
|
+
success: false,
|
|
113166
|
+
result,
|
|
113167
|
+
durationMs,
|
|
113168
|
+
numTurns: 1,
|
|
113169
|
+
cost: 0,
|
|
113170
|
+
usage: getUsage(event),
|
|
113171
|
+
...turnId ? { turnId } : {}
|
|
113172
|
+
}
|
|
113173
|
+
};
|
|
113174
|
+
}
|
|
112714
113175
|
return {
|
|
112715
113176
|
type: "result",
|
|
112716
113177
|
timestamp: /* @__PURE__ */ new Date(),
|
|
112717
113178
|
data: {
|
|
112718
113179
|
success: true,
|
|
112719
113180
|
result: "",
|
|
112720
|
-
durationMs
|
|
113181
|
+
durationMs,
|
|
112721
113182
|
numTurns: 1,
|
|
112722
113183
|
cost: 0,
|
|
112723
|
-
usage: event
|
|
113184
|
+
usage: getUsage(event),
|
|
113185
|
+
...turnId ? { turnId } : {}
|
|
112724
113186
|
}
|
|
112725
113187
|
};
|
|
112726
113188
|
}
|
|
112727
113189
|
static parseTurnFailed(event) {
|
|
113190
|
+
const turn = getTurnRecord(event);
|
|
113191
|
+
const turnId = getTurnId(event);
|
|
112728
113192
|
return {
|
|
112729
113193
|
type: "result",
|
|
112730
113194
|
timestamp: /* @__PURE__ */ new Date(),
|
|
112731
113195
|
data: {
|
|
112732
113196
|
success: false,
|
|
112733
|
-
result: event
|
|
112734
|
-
durationMs:
|
|
113197
|
+
result: getTurnErrorMessage(event, turn) ?? "Turn failed",
|
|
113198
|
+
durationMs: getTurnDurationMs(event, turn),
|
|
112735
113199
|
numTurns: 1,
|
|
112736
113200
|
cost: 0,
|
|
112737
|
-
usage:
|
|
113201
|
+
usage: getUsage(event),
|
|
113202
|
+
...turnId ? { turnId } : {}
|
|
112738
113203
|
}
|
|
112739
113204
|
};
|
|
112740
113205
|
}
|
|
112741
|
-
static
|
|
112742
|
-
const
|
|
113206
|
+
static parseTurnPlanUpdated(event) {
|
|
113207
|
+
const lines = formatPlanLines(event.plan);
|
|
113208
|
+
const explanation = trimmedStringValue(event.explanation);
|
|
113209
|
+
if (lines.length === 0 && !explanation) {
|
|
113210
|
+
return null;
|
|
113211
|
+
}
|
|
113212
|
+
return {
|
|
113213
|
+
type: "text",
|
|
113214
|
+
timestamp: /* @__PURE__ */ new Date(),
|
|
113215
|
+
data: {
|
|
113216
|
+
text: ["[plan]", explanation, ...lines].filter((line) => {
|
|
113217
|
+
return line !== void 0 && line.length > 0;
|
|
113218
|
+
}).join("\n")
|
|
113219
|
+
}
|
|
113220
|
+
};
|
|
113221
|
+
}
|
|
113222
|
+
static parseWarning(event) {
|
|
113223
|
+
const message = extractEventErrorMessage(event);
|
|
113224
|
+
if (!message) {
|
|
113225
|
+
return null;
|
|
113226
|
+
}
|
|
113227
|
+
return {
|
|
113228
|
+
type: "text",
|
|
113229
|
+
timestamp: /* @__PURE__ */ new Date(),
|
|
113230
|
+
data: { text: `[warning] ${message}` }
|
|
113231
|
+
};
|
|
113232
|
+
}
|
|
113233
|
+
static parseItemEvent(event, eventType) {
|
|
113234
|
+
const item = getItem(event);
|
|
112743
113235
|
if (!item) {
|
|
112744
113236
|
return null;
|
|
112745
113237
|
}
|
|
112746
|
-
const itemType = item
|
|
112747
|
-
if (itemType
|
|
112748
|
-
return
|
|
113238
|
+
const itemType = getItemType(item);
|
|
113239
|
+
if (!itemType) {
|
|
113240
|
+
return null;
|
|
113241
|
+
}
|
|
113242
|
+
if (itemType === "agent_message") {
|
|
113243
|
+
return this.parseTextItem(eventType, item, (text) => {
|
|
113244
|
+
return text;
|
|
113245
|
+
});
|
|
112749
113246
|
}
|
|
112750
113247
|
if (itemType === "command_execution") {
|
|
112751
|
-
return this.parseCommandExecution(
|
|
113248
|
+
return this.parseCommandExecution(eventType, item);
|
|
112752
113249
|
}
|
|
112753
113250
|
if (itemType === "file_edit" || itemType === "file_write") {
|
|
112754
|
-
return this.parseFileEditOrWrite(
|
|
113251
|
+
return this.parseFileEditOrWrite(eventType, item);
|
|
112755
113252
|
}
|
|
112756
113253
|
if (itemType === "file_read") {
|
|
112757
|
-
return this.parseFileRead(
|
|
113254
|
+
return this.parseFileRead(eventType, item);
|
|
112758
113255
|
}
|
|
112759
113256
|
if (itemType === "file_change") {
|
|
112760
113257
|
return this.parseFileChange(item);
|
|
112761
113258
|
}
|
|
112762
|
-
if (itemType === "reasoning"
|
|
113259
|
+
if (itemType === "reasoning") {
|
|
113260
|
+
return this.parseTextItem(eventType, item, (text) => {
|
|
113261
|
+
return `[thinking] ${text}`;
|
|
113262
|
+
});
|
|
113263
|
+
}
|
|
113264
|
+
if (itemType === "plan") {
|
|
113265
|
+
return this.parseTextItem(eventType, item, (text) => {
|
|
113266
|
+
return `[plan]
|
|
113267
|
+
${text}`;
|
|
113268
|
+
});
|
|
113269
|
+
}
|
|
113270
|
+
if (eventType === "item.completed") {
|
|
113271
|
+
return this.parseGenericCompletedItem(item);
|
|
113272
|
+
}
|
|
113273
|
+
return null;
|
|
113274
|
+
}
|
|
113275
|
+
static parseTextItem(eventType, item, formatText) {
|
|
113276
|
+
const text = trimmedStringValue(item.text);
|
|
113277
|
+
if (text) {
|
|
112763
113278
|
return {
|
|
112764
113279
|
type: "text",
|
|
112765
113280
|
timestamp: /* @__PURE__ */ new Date(),
|
|
112766
|
-
data: { text:
|
|
113281
|
+
data: { text: formatText(text) }
|
|
112767
113282
|
};
|
|
112768
113283
|
}
|
|
112769
|
-
return null;
|
|
113284
|
+
return shouldRenderGenericItemFailure(eventType, item) ? this.parseGenericCompletedItem(item) : null;
|
|
112770
113285
|
}
|
|
112771
|
-
static
|
|
112772
|
-
const
|
|
112773
|
-
|
|
113286
|
+
static parseGenericCompletedItem(item) {
|
|
113287
|
+
const text = formatGenericItem(item);
|
|
113288
|
+
return text ? { type: "text", timestamp: /* @__PURE__ */ new Date(), data: { text } } : null;
|
|
113289
|
+
}
|
|
113290
|
+
static parseCommandExecution(eventType, item) {
|
|
113291
|
+
const itemId = getItemId(item);
|
|
113292
|
+
const command = trimmedStringValue(item.command);
|
|
113293
|
+
if (!itemId) {
|
|
113294
|
+
return null;
|
|
113295
|
+
}
|
|
113296
|
+
if (eventType === "item.started" && command) {
|
|
112774
113297
|
return {
|
|
112775
113298
|
type: "tool_use",
|
|
112776
113299
|
timestamp: /* @__PURE__ */ new Date(),
|
|
112777
113300
|
data: {
|
|
112778
113301
|
tool: "Bash",
|
|
112779
|
-
toolUseId:
|
|
112780
|
-
input: { command
|
|
113302
|
+
toolUseId: itemId,
|
|
113303
|
+
input: { command }
|
|
112781
113304
|
}
|
|
112782
113305
|
};
|
|
112783
113306
|
}
|
|
112784
|
-
if (
|
|
112785
|
-
const output = item.aggregated_output ?? item.output ?? "";
|
|
113307
|
+
if (eventType === "item.completed") {
|
|
113308
|
+
const output = nonEmptyStringValue(item.aggregated_output) ?? nonEmptyStringValue(item.output) ?? "";
|
|
113309
|
+
const status = getItemStatus(item);
|
|
113310
|
+
const exitCode = numberValue(item.exit_code);
|
|
113311
|
+
const errorMessage = getItemErrorMessage(item);
|
|
113312
|
+
const isError2 = (exitCode !== void 0 ? exitCode !== 0 : false) || isFailedStatus(status) || errorMessage !== void 0;
|
|
112786
113313
|
return {
|
|
112787
113314
|
type: "tool_result",
|
|
112788
113315
|
timestamp: /* @__PURE__ */ new Date(),
|
|
112789
113316
|
data: {
|
|
112790
|
-
|
|
112791
|
-
|
|
112792
|
-
|
|
113317
|
+
tool: "Bash",
|
|
113318
|
+
toolUseId: itemId,
|
|
113319
|
+
input: command ? { command } : {},
|
|
113320
|
+
result: combineResultWithError(output, errorMessage) ?? (isFailedStatus(status) ? `Command ${status}` : ""),
|
|
113321
|
+
isError: isError2
|
|
112793
113322
|
}
|
|
112794
113323
|
};
|
|
112795
113324
|
}
|
|
112796
113325
|
return null;
|
|
112797
113326
|
}
|
|
112798
|
-
static parseFileEditOrWrite(
|
|
112799
|
-
const
|
|
112800
|
-
|
|
113327
|
+
static parseFileEditOrWrite(eventType, item) {
|
|
113328
|
+
const itemId = getItemId(item);
|
|
113329
|
+
const path4 = trimmedStringValue(item.path);
|
|
113330
|
+
if (!itemId) {
|
|
113331
|
+
return null;
|
|
113332
|
+
}
|
|
113333
|
+
if (eventType === "item.started" && path4) {
|
|
112801
113334
|
return {
|
|
112802
113335
|
type: "tool_use",
|
|
112803
113336
|
timestamp: /* @__PURE__ */ new Date(),
|
|
112804
113337
|
data: {
|
|
112805
|
-
tool: item
|
|
112806
|
-
toolUseId:
|
|
112807
|
-
input: { file_path:
|
|
113338
|
+
tool: getItemType(item) === "file_edit" ? "Edit" : "Write",
|
|
113339
|
+
toolUseId: itemId,
|
|
113340
|
+
input: { file_path: path4 }
|
|
112808
113341
|
}
|
|
112809
113342
|
};
|
|
112810
113343
|
}
|
|
112811
|
-
if (
|
|
113344
|
+
if (eventType === "item.completed") {
|
|
113345
|
+
const status = getItemStatus(item);
|
|
113346
|
+
const tool = getItemType(item) === "file_edit" ? "Edit" : "Write";
|
|
113347
|
+
const errorMessage = getItemErrorMessage(item);
|
|
112812
113348
|
return {
|
|
112813
113349
|
type: "tool_result",
|
|
112814
113350
|
timestamp: /* @__PURE__ */ new Date(),
|
|
112815
113351
|
data: {
|
|
112816
|
-
|
|
112817
|
-
|
|
112818
|
-
|
|
113352
|
+
tool,
|
|
113353
|
+
toolUseId: itemId,
|
|
113354
|
+
input: path4 ? { file_path: path4 } : {},
|
|
113355
|
+
result: combineResultWithError(
|
|
113356
|
+
nonEmptyStringValue(item.diff),
|
|
113357
|
+
errorMessage
|
|
113358
|
+
) ?? (isFailedStatus(status) ? `File operation ${status}` : "File operation completed"),
|
|
113359
|
+
isError: isFailedStatus(status) || errorMessage !== void 0
|
|
112819
113360
|
}
|
|
112820
113361
|
};
|
|
112821
113362
|
}
|
|
112822
113363
|
return null;
|
|
112823
113364
|
}
|
|
112824
|
-
static parseFileRead(
|
|
112825
|
-
const
|
|
112826
|
-
|
|
113365
|
+
static parseFileRead(eventType, item) {
|
|
113366
|
+
const itemId = getItemId(item);
|
|
113367
|
+
const path4 = trimmedStringValue(item.path);
|
|
113368
|
+
if (!itemId) {
|
|
113369
|
+
return null;
|
|
113370
|
+
}
|
|
113371
|
+
if (eventType === "item.started" && path4) {
|
|
112827
113372
|
return {
|
|
112828
113373
|
type: "tool_use",
|
|
112829
113374
|
timestamp: /* @__PURE__ */ new Date(),
|
|
112830
113375
|
data: {
|
|
112831
113376
|
tool: "Read",
|
|
112832
|
-
toolUseId:
|
|
112833
|
-
input: { file_path:
|
|
113377
|
+
toolUseId: itemId,
|
|
113378
|
+
input: { file_path: path4 }
|
|
112834
113379
|
}
|
|
112835
113380
|
};
|
|
112836
113381
|
}
|
|
112837
|
-
if (
|
|
113382
|
+
if (eventType === "item.completed") {
|
|
113383
|
+
const status = getItemStatus(item);
|
|
113384
|
+
const output = nonEmptyStringValue(item.output);
|
|
113385
|
+
const errorMessage = getItemErrorMessage(item);
|
|
112838
113386
|
return {
|
|
112839
113387
|
type: "tool_result",
|
|
112840
113388
|
timestamp: /* @__PURE__ */ new Date(),
|
|
112841
113389
|
data: {
|
|
112842
|
-
|
|
112843
|
-
|
|
112844
|
-
|
|
113390
|
+
tool: "Read",
|
|
113391
|
+
toolUseId: itemId,
|
|
113392
|
+
input: path4 ? { file_path: path4 } : {},
|
|
113393
|
+
result: combineResultWithError(output, errorMessage) ?? (isFailedStatus(status) ? `File read ${status}` : "File read completed"),
|
|
113394
|
+
isError: isFailedStatus(status) || errorMessage !== void 0
|
|
112845
113395
|
}
|
|
112846
113396
|
};
|
|
112847
113397
|
}
|
|
112848
113398
|
return null;
|
|
112849
113399
|
}
|
|
112850
113400
|
static parseFileChange(item) {
|
|
112851
|
-
|
|
113401
|
+
const status = getItemStatus(item);
|
|
113402
|
+
const errorMessage = getItemErrorMessage(item);
|
|
113403
|
+
const lines = Array.isArray(item.changes) ? item.changes.slice(0, MAX_FORMATTED_FILE_CHANGES).map((change) => {
|
|
113404
|
+
const changeRecord = asRecord(change);
|
|
113405
|
+
if (!changeRecord) {
|
|
113406
|
+
return void 0;
|
|
113407
|
+
}
|
|
113408
|
+
const path4 = trimmedStringValue(changeRecord.path);
|
|
113409
|
+
if (!path4) {
|
|
113410
|
+
return void 0;
|
|
113411
|
+
}
|
|
113412
|
+
const action = formatFileChangeAction(
|
|
113413
|
+
trimmedStringValue(changeRecord.kind)
|
|
113414
|
+
);
|
|
113415
|
+
return `${action}: ${path4}`;
|
|
113416
|
+
}).filter((line) => {
|
|
113417
|
+
return line !== void 0;
|
|
113418
|
+
}) : [];
|
|
113419
|
+
if (Array.isArray(item.changes) && item.changes.length > MAX_FORMATTED_FILE_CHANGES) {
|
|
113420
|
+
lines.push(
|
|
113421
|
+
`... +${item.changes.length - MAX_FORMATTED_FILE_CHANGES} more changes`
|
|
113422
|
+
);
|
|
113423
|
+
}
|
|
113424
|
+
if (lines.length === 0 && !isFailedStatus(status) && !errorMessage) {
|
|
112852
113425
|
return null;
|
|
112853
113426
|
}
|
|
112854
|
-
const
|
|
112855
|
-
|
|
112856
|
-
return `${action}: ${c101.path}`;
|
|
112857
|
-
}).join("\n");
|
|
113427
|
+
const statusLine = isFailedStatus(status) ? `Status: ${status}` : void 0;
|
|
113428
|
+
const errorLine = errorMessage ? `Error: ${errorMessage}` : void 0;
|
|
112858
113429
|
return {
|
|
112859
113430
|
type: "text",
|
|
112860
113431
|
timestamp: /* @__PURE__ */ new Date(),
|
|
112861
|
-
data: {
|
|
112862
|
-
|
|
113432
|
+
data: {
|
|
113433
|
+
text: ["[files]", statusLine, errorLine, ...lines].filter((line) => {
|
|
113434
|
+
return line !== void 0 && line.length > 0;
|
|
113435
|
+
}).join("\n")
|
|
113436
|
+
}
|
|
112863
113437
|
};
|
|
112864
113438
|
}
|
|
112865
113439
|
static parseErrorEvent(event) {
|
|
113440
|
+
const turn = getTurnRecord(event);
|
|
113441
|
+
const turnId = getTurnId(event);
|
|
113442
|
+
const hasTurnContext = turn !== null || turnId !== void 0;
|
|
112866
113443
|
return {
|
|
112867
113444
|
type: "result",
|
|
112868
113445
|
timestamp: /* @__PURE__ */ new Date(),
|
|
112869
113446
|
data: {
|
|
112870
113447
|
success: false,
|
|
112871
|
-
result: event
|
|
112872
|
-
durationMs:
|
|
112873
|
-
numTurns: 0,
|
|
113448
|
+
result: getTurnErrorMessage(event, turn) ?? "Unknown error",
|
|
113449
|
+
durationMs: getTurnDurationMs(event, turn),
|
|
113450
|
+
numTurns: hasTurnContext ? 1 : 0,
|
|
112874
113451
|
cost: 0,
|
|
112875
|
-
usage:
|
|
113452
|
+
usage: getUsage(event),
|
|
113453
|
+
...turnId ? { turnId } : {}
|
|
112876
113454
|
}
|
|
112877
113455
|
};
|
|
112878
113456
|
}
|
|
@@ -112888,7 +113466,7 @@ function parseEvent(rawEvent, framework) {
|
|
|
112888
113466
|
}
|
|
112889
113467
|
|
|
112890
113468
|
// src/lib/events/event-stream-normalizer.ts
|
|
112891
|
-
function
|
|
113469
|
+
function asRecord2(rawEvent) {
|
|
112892
113470
|
if (!rawEvent || typeof rawEvent !== "object") {
|
|
112893
113471
|
return null;
|
|
112894
113472
|
}
|
|
@@ -112898,13 +113476,72 @@ function getEventType(rawEvent) {
|
|
|
112898
113476
|
const eventType = rawEvent?.type;
|
|
112899
113477
|
return typeof eventType === "string" ? eventType : void 0;
|
|
112900
113478
|
}
|
|
113479
|
+
function stringData(value) {
|
|
113480
|
+
return typeof value === "string" && value.trim().length > 0 ? value.trim() : void 0;
|
|
113481
|
+
}
|
|
113482
|
+
function isFailureResult(event) {
|
|
113483
|
+
return event?.type === "result" && event.data.success === false;
|
|
113484
|
+
}
|
|
113485
|
+
function isTopLevelCodexError(eventType, parsed) {
|
|
113486
|
+
return eventType === "error" && isFailureResult(parsed);
|
|
113487
|
+
}
|
|
113488
|
+
function isTerminalCodexFailure(eventType, parsed) {
|
|
113489
|
+
if (!isFailureResult(parsed)) {
|
|
113490
|
+
return false;
|
|
113491
|
+
}
|
|
113492
|
+
return eventType === "turn.failed" || eventType === "turn.completed";
|
|
113493
|
+
}
|
|
113494
|
+
function getParsedTurnId(event) {
|
|
113495
|
+
return stringData(event.data.turnId);
|
|
113496
|
+
}
|
|
113497
|
+
function getResultText(event) {
|
|
113498
|
+
return stringData(event.data.result);
|
|
113499
|
+
}
|
|
113500
|
+
function combineDistinctMessages2(first, second) {
|
|
113501
|
+
const messages = [];
|
|
113502
|
+
for (const message of [first, second]) {
|
|
113503
|
+
if (!message) {
|
|
113504
|
+
continue;
|
|
113505
|
+
}
|
|
113506
|
+
const containingIndex = messages.findIndex((existing) => {
|
|
113507
|
+
return existing === message || existing.includes(message);
|
|
113508
|
+
});
|
|
113509
|
+
if (containingIndex !== -1) {
|
|
113510
|
+
continue;
|
|
113511
|
+
}
|
|
113512
|
+
const containedIndex = messages.findIndex((existing) => {
|
|
113513
|
+
return message.includes(existing);
|
|
113514
|
+
});
|
|
113515
|
+
if (containedIndex !== -1) {
|
|
113516
|
+
messages[containedIndex] = message;
|
|
113517
|
+
continue;
|
|
113518
|
+
}
|
|
113519
|
+
messages.push(message);
|
|
113520
|
+
}
|
|
113521
|
+
return messages.length > 0 ? messages.join("\n") : void 0;
|
|
113522
|
+
}
|
|
113523
|
+
function attachFramework(parsed, framework) {
|
|
113524
|
+
if (!parsed || !framework || parsed.data.framework !== void 0) {
|
|
113525
|
+
return parsed;
|
|
113526
|
+
}
|
|
113527
|
+
return {
|
|
113528
|
+
...parsed,
|
|
113529
|
+
data: {
|
|
113530
|
+
...parsed.data,
|
|
113531
|
+
framework
|
|
113532
|
+
}
|
|
113533
|
+
};
|
|
113534
|
+
}
|
|
112901
113535
|
var EventStreamNormalizer = class {
|
|
112902
113536
|
pendingCodexError = null;
|
|
112903
113537
|
process(rawEvent, framework, timestamp) {
|
|
112904
113538
|
const isCodex = framework === "codex";
|
|
112905
|
-
const rawRecord =
|
|
113539
|
+
const rawRecord = asRecord2(rawEvent);
|
|
112906
113540
|
const eventType = getEventType(rawRecord);
|
|
112907
|
-
const parsed =
|
|
113541
|
+
const parsed = attachFramework(
|
|
113542
|
+
rawRecord ? parseEvent(rawRecord, framework) : null,
|
|
113543
|
+
framework
|
|
113544
|
+
);
|
|
112908
113545
|
if (parsed && timestamp) {
|
|
112909
113546
|
parsed.timestamp = timestamp;
|
|
112910
113547
|
}
|
|
@@ -112915,19 +113552,44 @@ var EventStreamNormalizer = class {
|
|
|
112915
113552
|
}
|
|
112916
113553
|
return output2;
|
|
112917
113554
|
}
|
|
112918
|
-
if (eventType
|
|
113555
|
+
if (isTopLevelCodexError(eventType, parsed)) {
|
|
112919
113556
|
const output2 = this.flush();
|
|
112920
113557
|
this.pendingCodexError = parsed;
|
|
112921
113558
|
return output2;
|
|
112922
113559
|
}
|
|
112923
|
-
if (eventType
|
|
113560
|
+
if (isTerminalCodexFailure(eventType, parsed)) {
|
|
113561
|
+
if (this.pendingCodexError) {
|
|
113562
|
+
const pendingTurnId = getParsedTurnId(this.pendingCodexError);
|
|
113563
|
+
const terminalTurnId = getParsedTurnId(parsed);
|
|
113564
|
+
const shouldCollapse = !pendingTurnId || terminalTurnId !== void 0 && pendingTurnId === terminalTurnId;
|
|
113565
|
+
if (shouldCollapse) {
|
|
113566
|
+
const mergedResult = combineDistinctMessages2(
|
|
113567
|
+
getResultText(this.pendingCodexError),
|
|
113568
|
+
getResultText(parsed)
|
|
113569
|
+
);
|
|
113570
|
+
this.pendingCodexError = null;
|
|
113571
|
+
return [
|
|
113572
|
+
{
|
|
113573
|
+
...parsed,
|
|
113574
|
+
data: {
|
|
113575
|
+
...parsed.data,
|
|
113576
|
+
...mergedResult ? { result: mergedResult } : {}
|
|
113577
|
+
}
|
|
113578
|
+
}
|
|
113579
|
+
];
|
|
113580
|
+
}
|
|
113581
|
+
const output2 = this.flush();
|
|
113582
|
+
output2.push(parsed);
|
|
113583
|
+
return output2;
|
|
113584
|
+
}
|
|
112924
113585
|
this.pendingCodexError = null;
|
|
112925
|
-
return
|
|
113586
|
+
return [parsed];
|
|
112926
113587
|
}
|
|
112927
|
-
|
|
112928
|
-
|
|
112929
|
-
output.push(parsed);
|
|
113588
|
+
if (!parsed) {
|
|
113589
|
+
return [];
|
|
112930
113590
|
}
|
|
113591
|
+
const output = this.flush();
|
|
113592
|
+
output.push(parsed);
|
|
112931
113593
|
return output;
|
|
112932
113594
|
}
|
|
112933
113595
|
flush() {
|
|
@@ -112940,18 +113602,42 @@ var EventStreamNormalizer = class {
|
|
|
112940
113602
|
}
|
|
112941
113603
|
};
|
|
112942
113604
|
|
|
113605
|
+
// src/lib/utils/time-format.ts
|
|
113606
|
+
init_esm_shims();
|
|
113607
|
+
function formatIsoTimestamp(value) {
|
|
113608
|
+
const timestamp = value instanceof Date ? value : new Date(value);
|
|
113609
|
+
if (!Number.isFinite(timestamp.getTime())) {
|
|
113610
|
+
return "invalid-date";
|
|
113611
|
+
}
|
|
113612
|
+
return timestamp.toISOString().replace(/\.\d{3}Z$/, "Z");
|
|
113613
|
+
}
|
|
113614
|
+
|
|
112943
113615
|
// src/lib/events/event-renderer.ts
|
|
112944
113616
|
init_esm_shims();
|
|
112945
113617
|
|
|
112946
113618
|
// src/lib/events/tool-formatters.ts
|
|
112947
113619
|
init_esm_shims();
|
|
113620
|
+
var MAX_FORMATTED_TODOS = 20;
|
|
112948
113621
|
function pluralize(count, singular, plural) {
|
|
112949
113622
|
return count === 1 ? singular : plural;
|
|
112950
113623
|
}
|
|
112951
|
-
function
|
|
113624
|
+
function truncate3(text, maxLength) {
|
|
112952
113625
|
if (text.length <= maxLength) return text;
|
|
112953
113626
|
return text.slice(0, maxLength - 3) + "...";
|
|
112954
113627
|
}
|
|
113628
|
+
function displayValue(value) {
|
|
113629
|
+
return value === null || value === void 0 ? "" : String(value);
|
|
113630
|
+
}
|
|
113631
|
+
function nonEmptyDisplayValue(value) {
|
|
113632
|
+
const display = displayValue(value);
|
|
113633
|
+
return display.length > 0 ? display : void 0;
|
|
113634
|
+
}
|
|
113635
|
+
function recordValue(value) {
|
|
113636
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
113637
|
+
return null;
|
|
113638
|
+
}
|
|
113639
|
+
return value;
|
|
113640
|
+
}
|
|
112955
113641
|
function formatToolHeader(data) {
|
|
112956
113642
|
const { tool, input } = data;
|
|
112957
113643
|
const headline = getToolHeadline(tool, input);
|
|
@@ -112959,31 +113645,31 @@ function formatToolHeader(data) {
|
|
|
112959
113645
|
}
|
|
112960
113646
|
var toolHeadlineFormatters = {
|
|
112961
113647
|
Read: (input) => {
|
|
112962
|
-
return `Read${source_default.dim(`(${
|
|
113648
|
+
return `Read${source_default.dim(`(${displayValue(input.file_path)})`)}`;
|
|
112963
113649
|
},
|
|
112964
113650
|
Edit: (input) => {
|
|
112965
|
-
return `Edit${source_default.dim(`(${
|
|
113651
|
+
return `Edit${source_default.dim(`(${displayValue(input.file_path)})`)}`;
|
|
112966
113652
|
},
|
|
112967
113653
|
Write: (input) => {
|
|
112968
|
-
return `Write${source_default.dim(`(${
|
|
113654
|
+
return `Write${source_default.dim(`(${displayValue(input.file_path)})`)}`;
|
|
112969
113655
|
},
|
|
112970
113656
|
Bash: (input) => {
|
|
112971
|
-
return `Bash${source_default.dim(`(${
|
|
113657
|
+
return `Bash${source_default.dim(`(${truncate3(displayValue(input.command), 60)})`)}`;
|
|
112972
113658
|
},
|
|
112973
113659
|
Glob: (input) => {
|
|
112974
|
-
return `Glob${source_default.dim(`(${
|
|
113660
|
+
return `Glob${source_default.dim(`(${displayValue(input.pattern)})`)}`;
|
|
112975
113661
|
},
|
|
112976
113662
|
Grep: (input) => {
|
|
112977
|
-
return `Grep${source_default.dim(`(${
|
|
113663
|
+
return `Grep${source_default.dim(`(${displayValue(input.pattern)})`)}`;
|
|
112978
113664
|
},
|
|
112979
113665
|
Task: (input) => {
|
|
112980
|
-
return `Task${source_default.dim(`(${
|
|
113666
|
+
return `Task${source_default.dim(`(${truncate3(displayValue(input.description), 60)})`)}`;
|
|
112981
113667
|
},
|
|
112982
113668
|
WebFetch: (input) => {
|
|
112983
|
-
return `WebFetch${source_default.dim(`(${
|
|
113669
|
+
return `WebFetch${source_default.dim(`(${truncate3(displayValue(input.url), 60)})`)}`;
|
|
112984
113670
|
},
|
|
112985
113671
|
WebSearch: (input) => {
|
|
112986
|
-
return `WebSearch${source_default.dim(`(${
|
|
113672
|
+
return `WebSearch${source_default.dim(`(${truncate3(displayValue(input.query), 60)})`)}`;
|
|
112987
113673
|
},
|
|
112988
113674
|
TodoWrite: () => {
|
|
112989
113675
|
return "TodoWrite";
|
|
@@ -112997,28 +113683,18 @@ function formatToolResult(toolUse, result, verbose) {
|
|
|
112997
113683
|
const { tool, input } = toolUse;
|
|
112998
113684
|
const { result: resultText, isError: isError2 } = result;
|
|
112999
113685
|
const lines = [];
|
|
113000
|
-
|
|
113001
|
-
|
|
113002
|
-
|
|
113003
|
-
|
|
113004
|
-
|
|
113005
|
-
|
|
113006
|
-
|
|
113007
|
-
|
|
113008
|
-
return
|
|
113009
|
-
}
|
|
113010
|
-
if (tool === "Edit" && !isError2) {
|
|
113011
|
-
const editLines = formatEditDiff(input, verbose);
|
|
113012
|
-
lines.push(...editLines);
|
|
113013
|
-
return lines;
|
|
113014
|
-
}
|
|
113015
|
-
if (tool === "Write" && !isError2) {
|
|
113016
|
-
const writeLines = formatWritePreview(input, verbose);
|
|
113017
|
-
lines.push(...writeLines);
|
|
113018
|
-
return lines;
|
|
113686
|
+
const specialLines = formatSpecialToolResult(
|
|
113687
|
+
tool,
|
|
113688
|
+
input,
|
|
113689
|
+
resultText,
|
|
113690
|
+
isError2,
|
|
113691
|
+
verbose
|
|
113692
|
+
);
|
|
113693
|
+
if (specialLines) {
|
|
113694
|
+
return specialLines;
|
|
113019
113695
|
}
|
|
113020
113696
|
if (isError2) {
|
|
113021
|
-
const errorMsg = resultText ?
|
|
113697
|
+
const errorMsg = resultText ? truncate3(resultText, 80) : "Error";
|
|
113022
113698
|
lines.push(`\u2514 \u2717 ${source_default.dim(errorMsg)}`);
|
|
113023
113699
|
return lines;
|
|
113024
113700
|
}
|
|
@@ -113047,6 +113723,30 @@ function formatToolResult(toolUse, result, verbose) {
|
|
|
113047
113723
|
}
|
|
113048
113724
|
return lines;
|
|
113049
113725
|
}
|
|
113726
|
+
function formatSpecialToolResult(tool, input, resultText, isError2, verbose) {
|
|
113727
|
+
if (isError2) {
|
|
113728
|
+
return null;
|
|
113729
|
+
}
|
|
113730
|
+
if (tool === "Read" && resultText) {
|
|
113731
|
+
return formatReadContent(resultText, verbose);
|
|
113732
|
+
}
|
|
113733
|
+
if (tool === "TodoWrite") {
|
|
113734
|
+
return formatTodoList(input);
|
|
113735
|
+
}
|
|
113736
|
+
if (tool === "Edit" && hasClaudeEditInput(input)) {
|
|
113737
|
+
return formatEditDiff(input, verbose);
|
|
113738
|
+
}
|
|
113739
|
+
if (tool === "Write" && hasClaudeWriteInput(input)) {
|
|
113740
|
+
return formatWritePreview(input, verbose);
|
|
113741
|
+
}
|
|
113742
|
+
return null;
|
|
113743
|
+
}
|
|
113744
|
+
function hasClaudeEditInput(input) {
|
|
113745
|
+
return typeof input.old_string === "string" || typeof input.new_string === "string";
|
|
113746
|
+
}
|
|
113747
|
+
function hasClaudeWriteInput(input) {
|
|
113748
|
+
return typeof input.content === "string";
|
|
113749
|
+
}
|
|
113050
113750
|
function formatReadContent(resultText, verbose) {
|
|
113051
113751
|
const lines = [];
|
|
113052
113752
|
const rawLines = resultText.split("\n");
|
|
@@ -113058,9 +113758,7 @@ function formatReadContent(resultText, verbose) {
|
|
|
113058
113758
|
contentLines.push(match[1] ?? "");
|
|
113059
113759
|
}
|
|
113060
113760
|
}
|
|
113061
|
-
const displayLines = contentLines.length > 0 ? contentLines : rawLines
|
|
113062
|
-
return line.trim().length > 0;
|
|
113063
|
-
});
|
|
113761
|
+
const displayLines = contentLines.length > 0 ? contentLines : rawLines;
|
|
113064
113762
|
const totalLines = displayLines.length;
|
|
113065
113763
|
if (totalLines === 0) {
|
|
113066
113764
|
lines.push(`\u2514 \u2713 ${source_default.dim("(empty)")}`);
|
|
@@ -113088,7 +113786,7 @@ function formatReadContent(resultText, verbose) {
|
|
|
113088
113786
|
}
|
|
113089
113787
|
function formatWritePreview(input, verbose) {
|
|
113090
113788
|
const lines = [];
|
|
113091
|
-
const content =
|
|
113789
|
+
const content = displayValue(input.content);
|
|
113092
113790
|
const contentLines = content.split("\n");
|
|
113093
113791
|
const totalLines = contentLines.length;
|
|
113094
113792
|
if (verbose) {
|
|
@@ -113113,8 +113811,8 @@ function formatWritePreview(input, verbose) {
|
|
|
113113
113811
|
}
|
|
113114
113812
|
function formatEditDiff(input, verbose) {
|
|
113115
113813
|
const lines = [];
|
|
113116
|
-
const oldString =
|
|
113117
|
-
const newString =
|
|
113814
|
+
const oldString = displayValue(input.old_string);
|
|
113815
|
+
const newString = displayValue(input.new_string);
|
|
113118
113816
|
const oldLines = oldString.split("\n");
|
|
113119
113817
|
const newLines = newString.split("\n");
|
|
113120
113818
|
const removed = oldLines.length;
|
|
@@ -113133,7 +113831,7 @@ function formatEditDiff(input, verbose) {
|
|
|
113133
113831
|
const showOld = Math.min(previewLimit, oldLines.length);
|
|
113134
113832
|
const showNew = Math.min(previewLimit, newLines.length);
|
|
113135
113833
|
for (let i = 0; i < showOld; i++) {
|
|
113136
|
-
lines.push(` - ${source_default.dim(
|
|
113834
|
+
lines.push(` - ${source_default.dim(truncate3(oldLines[i] ?? "", 60))}`);
|
|
113137
113835
|
}
|
|
113138
113836
|
const remainingOld = oldLines.length - previewLimit;
|
|
113139
113837
|
if (remainingOld > 0) {
|
|
@@ -113142,7 +113840,7 @@ function formatEditDiff(input, verbose) {
|
|
|
113142
113840
|
);
|
|
113143
113841
|
}
|
|
113144
113842
|
for (let i = 0; i < showNew; i++) {
|
|
113145
|
-
lines.push(` + ${source_default.dim(
|
|
113843
|
+
lines.push(` + ${source_default.dim(truncate3(newLines[i] ?? "", 60))}`);
|
|
113146
113844
|
}
|
|
113147
113845
|
const remainingNew = newLines.length - previewLimit;
|
|
113148
113846
|
if (remainingNew > 0) {
|
|
@@ -113156,19 +113854,30 @@ function formatEditDiff(input, verbose) {
|
|
|
113156
113854
|
function formatTodoList(input) {
|
|
113157
113855
|
const lines = [];
|
|
113158
113856
|
const todos = input.todos;
|
|
113159
|
-
if (!
|
|
113857
|
+
if (!Array.isArray(todos)) {
|
|
113160
113858
|
lines.push("\u2514 \u2713 Done");
|
|
113161
113859
|
return lines;
|
|
113162
113860
|
}
|
|
113163
|
-
|
|
113164
|
-
|
|
113165
|
-
|
|
113166
|
-
|
|
113861
|
+
if (todos.length === 0) {
|
|
113862
|
+
lines.push("\u2514 \u2713 Done");
|
|
113863
|
+
return lines;
|
|
113864
|
+
}
|
|
113865
|
+
const displayedTodos = todos.slice(0, MAX_FORMATTED_TODOS);
|
|
113866
|
+
for (let i = 0; i < displayedTodos.length; i++) {
|
|
113867
|
+
const todo = recordValue(displayedTodos[i]);
|
|
113868
|
+
const content = nonEmptyDisplayValue(todo?.content) ?? "Unknown task";
|
|
113869
|
+
const status = nonEmptyDisplayValue(todo?.status) ?? "pending";
|
|
113167
113870
|
const icon = getTodoStatusIcon(status);
|
|
113168
113871
|
const styledContent = formatTodoContent(content, status);
|
|
113169
113872
|
const prefix = i === 0 ? "\u2514 " : " ";
|
|
113170
113873
|
lines.push(`${prefix}${icon} ${styledContent}`);
|
|
113171
113874
|
}
|
|
113875
|
+
const remaining = todos.length - MAX_FORMATTED_TODOS;
|
|
113876
|
+
if (remaining > 0) {
|
|
113877
|
+
lines.push(
|
|
113878
|
+
` ${source_default.dim(`\u2026 +${remaining} ${pluralize(remaining, "task", "tasks")} (vm0 logs <runId> to see all)`)}`
|
|
113879
|
+
);
|
|
113880
|
+
}
|
|
113172
113881
|
return lines;
|
|
113173
113882
|
}
|
|
113174
113883
|
function getTodoStatusIcon(status) {
|
|
@@ -113195,8 +113904,23 @@ function formatTodoContent(content, status) {
|
|
|
113195
113904
|
}
|
|
113196
113905
|
|
|
113197
113906
|
// src/lib/events/event-renderer.ts
|
|
113907
|
+
function recordData(value) {
|
|
113908
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
113909
|
+
return {};
|
|
113910
|
+
}
|
|
113911
|
+
return value;
|
|
113912
|
+
}
|
|
113913
|
+
function displayString(value) {
|
|
113914
|
+
return value === null || value === void 0 ? "" : String(value);
|
|
113915
|
+
}
|
|
113916
|
+
function displayNonNegativeNumber(value) {
|
|
113917
|
+
const number = typeof value === "number" ? value : typeof value === "string" && value.trim().length > 0 ? Number(value) : void 0;
|
|
113918
|
+
return number !== void 0 && Number.isFinite(number) && number >= 0 ? number : 0;
|
|
113919
|
+
}
|
|
113198
113920
|
var EventRenderer = class _EventRenderer {
|
|
113199
113921
|
pendingToolUse = /* @__PURE__ */ new Map();
|
|
113922
|
+
ambiguousToolUseIds = /* @__PURE__ */ new Set();
|
|
113923
|
+
ambiguousRenderedToolUses = /* @__PURE__ */ new Map();
|
|
113200
113924
|
options;
|
|
113201
113925
|
lastEventType = null;
|
|
113202
113926
|
frameworkDisplayName = "Agent";
|
|
@@ -113220,7 +113944,7 @@ var EventRenderer = class _EventRenderer {
|
|
|
113220
113944
|
* Format timestamp for display (without milliseconds, matching metrics format)
|
|
113221
113945
|
*/
|
|
113222
113946
|
static formatTimestamp(timestamp) {
|
|
113223
|
-
return timestamp
|
|
113947
|
+
return formatIsoTimestamp(timestamp);
|
|
113224
113948
|
}
|
|
113225
113949
|
/**
|
|
113226
113950
|
* Render a parsed event to console
|
|
@@ -113229,9 +113953,11 @@ var EventRenderer = class _EventRenderer {
|
|
|
113229
113953
|
const timestampPrefix = this.options.showTimestamp ? `[${_EventRenderer.formatTimestamp(event.timestamp)}] ` : "";
|
|
113230
113954
|
switch (event.type) {
|
|
113231
113955
|
case "init":
|
|
113956
|
+
this.renderPendingToolUses();
|
|
113232
113957
|
this.renderInit(event, timestampPrefix);
|
|
113233
113958
|
break;
|
|
113234
113959
|
case "text":
|
|
113960
|
+
this.renderPendingToolUses();
|
|
113235
113961
|
this.renderText(event, timestampPrefix);
|
|
113236
113962
|
break;
|
|
113237
113963
|
case "tool_use":
|
|
@@ -113241,10 +113967,30 @@ var EventRenderer = class _EventRenderer {
|
|
|
113241
113967
|
this.handleToolResult(event, timestampPrefix);
|
|
113242
113968
|
break;
|
|
113243
113969
|
case "result":
|
|
113970
|
+
this.renderPendingToolUses();
|
|
113244
113971
|
this.renderResult(event, timestampPrefix);
|
|
113245
113972
|
break;
|
|
113246
113973
|
}
|
|
113247
113974
|
}
|
|
113975
|
+
/**
|
|
113976
|
+
* Render any buffered display state that cannot wait for a future event.
|
|
113977
|
+
*/
|
|
113978
|
+
flush() {
|
|
113979
|
+
this.renderPendingToolUses();
|
|
113980
|
+
this.pendingToolUse.clear();
|
|
113981
|
+
this.ambiguousToolUseIds.clear();
|
|
113982
|
+
this.ambiguousRenderedToolUses.clear();
|
|
113983
|
+
}
|
|
113984
|
+
renderPendingToolUses() {
|
|
113985
|
+
for (const pending of this.pendingToolUse.values()) {
|
|
113986
|
+
if (pending.rendered) {
|
|
113987
|
+
continue;
|
|
113988
|
+
}
|
|
113989
|
+
const { toolUse, prefix } = pending;
|
|
113990
|
+
this.renderToolUseOnly(toolUse, prefix);
|
|
113991
|
+
pending.rendered = true;
|
|
113992
|
+
}
|
|
113993
|
+
}
|
|
113248
113994
|
/**
|
|
113249
113995
|
* Render run completed state
|
|
113250
113996
|
* Note: This is run lifecycle status, not an event
|
|
@@ -113299,12 +114045,30 @@ var EventRenderer = class _EventRenderer {
|
|
|
113299
114045
|
* or render immediately (when not buffered, e.g., historical log viewing)
|
|
113300
114046
|
*/
|
|
113301
114047
|
handleToolUse(event, prefix) {
|
|
113302
|
-
const toolUseId =
|
|
113303
|
-
const tool =
|
|
113304
|
-
const input = event.data.input
|
|
114048
|
+
const toolUseId = displayString(event.data.toolUseId);
|
|
114049
|
+
const tool = displayString(event.data.tool);
|
|
114050
|
+
const input = recordData(event.data.input);
|
|
113305
114051
|
const toolUseData = { tool, input };
|
|
113306
|
-
if (this.options.buffered !== false) {
|
|
113307
|
-
this.pendingToolUse.
|
|
114052
|
+
if (this.options.buffered !== false && toolUseId.length > 0) {
|
|
114053
|
+
const existing = this.pendingToolUse.get(toolUseId);
|
|
114054
|
+
if (existing || this.ambiguousToolUseIds.has(toolUseId)) {
|
|
114055
|
+
if (existing) {
|
|
114056
|
+
if (!existing.rendered) {
|
|
114057
|
+
this.renderToolUseOnly(existing.toolUse, existing.prefix);
|
|
114058
|
+
}
|
|
114059
|
+
this.rememberAmbiguousRenderedToolUse(toolUseId, existing.toolUse);
|
|
114060
|
+
}
|
|
114061
|
+
this.pendingToolUse.delete(toolUseId);
|
|
114062
|
+
this.ambiguousToolUseIds.add(toolUseId);
|
|
114063
|
+
this.renderToolUseOnly(toolUseData, prefix);
|
|
114064
|
+
this.rememberAmbiguousRenderedToolUse(toolUseId, toolUseData);
|
|
114065
|
+
return;
|
|
114066
|
+
}
|
|
114067
|
+
this.pendingToolUse.set(toolUseId, {
|
|
114068
|
+
toolUse: toolUseData,
|
|
114069
|
+
prefix,
|
|
114070
|
+
rendered: false
|
|
114071
|
+
});
|
|
113308
114072
|
} else {
|
|
113309
114073
|
this.renderToolUseOnly(toolUseData, prefix);
|
|
113310
114074
|
}
|
|
@@ -113332,14 +114096,69 @@ var EventRenderer = class _EventRenderer {
|
|
|
113332
114096
|
* Handle tool_result event - lookup buffered tool_use and render grouped
|
|
113333
114097
|
*/
|
|
113334
114098
|
handleToolResult(event, prefix) {
|
|
113335
|
-
const toolUseId =
|
|
113336
|
-
const result =
|
|
114099
|
+
const toolUseId = displayString(event.data.toolUseId);
|
|
114100
|
+
const result = displayString(event.data.result);
|
|
113337
114101
|
const isError2 = Boolean(event.data.isError);
|
|
114102
|
+
if (toolUseId.length > 0 && this.ambiguousToolUseIds.has(toolUseId)) {
|
|
114103
|
+
const orphanToolUse2 = this.getToolUseFromResultEvent(event);
|
|
114104
|
+
const renderedToolUse = orphanToolUse2 ? this.getMatchingAmbiguousRenderedToolUse(toolUseId, orphanToolUse2) : void 0;
|
|
114105
|
+
if (renderedToolUse) {
|
|
114106
|
+
this.renderToolResultOnly(renderedToolUse, { result, isError: isError2 }, prefix);
|
|
114107
|
+
return;
|
|
114108
|
+
}
|
|
114109
|
+
if (orphanToolUse2) {
|
|
114110
|
+
this.renderGroupedTool(orphanToolUse2, { result, isError: isError2 }, prefix);
|
|
114111
|
+
}
|
|
114112
|
+
return;
|
|
114113
|
+
}
|
|
113338
114114
|
const pending = this.pendingToolUse.get(toolUseId);
|
|
113339
114115
|
if (pending) {
|
|
113340
|
-
|
|
114116
|
+
if (pending.rendered) {
|
|
114117
|
+
this.renderToolResultOnly(pending.toolUse, { result, isError: isError2 }, prefix);
|
|
114118
|
+
} else {
|
|
114119
|
+
this.renderGroupedTool(pending.toolUse, { result, isError: isError2 }, prefix);
|
|
114120
|
+
}
|
|
113341
114121
|
this.pendingToolUse.delete(toolUseId);
|
|
114122
|
+
return;
|
|
114123
|
+
}
|
|
114124
|
+
const orphanToolUse = this.getToolUseFromResultEvent(event);
|
|
114125
|
+
if (orphanToolUse) {
|
|
114126
|
+
this.renderGroupedTool(orphanToolUse, { result, isError: isError2 }, prefix);
|
|
114127
|
+
}
|
|
114128
|
+
}
|
|
114129
|
+
getToolUseFromResultEvent(event) {
|
|
114130
|
+
const tool = event.data.tool;
|
|
114131
|
+
if (typeof tool !== "string" || tool.length === 0) {
|
|
114132
|
+
return null;
|
|
114133
|
+
}
|
|
114134
|
+
return {
|
|
114135
|
+
tool,
|
|
114136
|
+
input: recordData(event.data.input)
|
|
114137
|
+
};
|
|
114138
|
+
}
|
|
114139
|
+
rememberAmbiguousRenderedToolUse(toolUseId, toolUse) {
|
|
114140
|
+
const renderedToolUses = this.ambiguousRenderedToolUses.get(toolUseId);
|
|
114141
|
+
if (renderedToolUses) {
|
|
114142
|
+
renderedToolUses.push(toolUse);
|
|
114143
|
+
return;
|
|
114144
|
+
}
|
|
114145
|
+
this.ambiguousRenderedToolUses.set(toolUseId, [toolUse]);
|
|
114146
|
+
}
|
|
114147
|
+
getMatchingAmbiguousRenderedToolUse(toolUseId, toolUse) {
|
|
114148
|
+
const renderedToolUses = this.ambiguousRenderedToolUses.get(toolUseId);
|
|
114149
|
+
if (!renderedToolUses) {
|
|
114150
|
+
return void 0;
|
|
114151
|
+
}
|
|
114152
|
+
for (let index = renderedToolUses.length - 1; index >= 0; index -= 1) {
|
|
114153
|
+
const renderedToolUse = renderedToolUses[index];
|
|
114154
|
+
if (renderedToolUse !== void 0 && this.hasSameToolHeader(renderedToolUse, toolUse)) {
|
|
114155
|
+
return renderedToolUse;
|
|
114156
|
+
}
|
|
113342
114157
|
}
|
|
114158
|
+
return void 0;
|
|
114159
|
+
}
|
|
114160
|
+
hasSameToolHeader(first, second) {
|
|
114161
|
+
return formatToolHeader(first).join("\n") === formatToolHeader(second).join("\n");
|
|
113343
114162
|
}
|
|
113344
114163
|
/**
|
|
113345
114164
|
* Get continuation prefix (simple indent, no timestamp alignment)
|
|
@@ -113371,12 +114190,30 @@ var EventRenderer = class _EventRenderer {
|
|
|
113371
114190
|
console.log();
|
|
113372
114191
|
this.lastEventType = "tool";
|
|
113373
114192
|
}
|
|
114193
|
+
renderToolResultOnly(toolUse, result, prefix) {
|
|
114194
|
+
if (this.lastEventType === "text") {
|
|
114195
|
+
console.log();
|
|
114196
|
+
}
|
|
114197
|
+
const verbose = this.options.verbose ?? false;
|
|
114198
|
+
const cont = this.getContinuationPrefix();
|
|
114199
|
+
const resultLines = formatToolResult(toolUse, result, verbose);
|
|
114200
|
+
for (let i = 0; i < resultLines.length; i++) {
|
|
114201
|
+
const line = resultLines[i];
|
|
114202
|
+
if (i === 0) {
|
|
114203
|
+
console.log(prefix + cont + line);
|
|
114204
|
+
} else {
|
|
114205
|
+
console.log(cont + line);
|
|
114206
|
+
}
|
|
114207
|
+
}
|
|
114208
|
+
console.log();
|
|
114209
|
+
this.lastEventType = "tool";
|
|
114210
|
+
}
|
|
113374
114211
|
renderInit(event, prefix) {
|
|
113375
|
-
const frameworkStr =
|
|
114212
|
+
const frameworkStr = displayString(event.data.framework) || "claude-code";
|
|
113376
114213
|
const displayName = isSupportedFramework(frameworkStr) ? getFrameworkDisplayName(frameworkStr) : frameworkStr;
|
|
113377
114214
|
this.frameworkDisplayName = displayName;
|
|
113378
114215
|
console.log(prefix + source_default.bold(`\u25B7 ${displayName} Started`));
|
|
113379
|
-
console.log(` Session: ${source_default.dim(
|
|
114216
|
+
console.log(` Session: ${source_default.dim(displayString(event.data.sessionId))}`);
|
|
113380
114217
|
if (event.data.model) {
|
|
113381
114218
|
console.log(` Model: ${source_default.dim(String(event.data.model))}`);
|
|
113382
114219
|
}
|
|
@@ -113389,29 +114226,38 @@ var EventRenderer = class _EventRenderer {
|
|
|
113389
114226
|
this.lastEventType = "init";
|
|
113390
114227
|
}
|
|
113391
114228
|
renderText(event, prefix) {
|
|
113392
|
-
const text =
|
|
114229
|
+
const text = displayString(event.data.text);
|
|
113393
114230
|
console.log(prefix + "\u25CF " + text);
|
|
113394
114231
|
this.lastEventType = "text";
|
|
113395
114232
|
}
|
|
113396
114233
|
renderResult(event, prefix) {
|
|
113397
114234
|
console.log();
|
|
113398
114235
|
const success = Boolean(event.data.success);
|
|
114236
|
+
const eventFramework = displayString(event.data.framework);
|
|
114237
|
+
const displayName = eventFramework && isSupportedFramework(eventFramework) ? getFrameworkDisplayName(eventFramework) : eventFramework || this.frameworkDisplayName;
|
|
114238
|
+
this.frameworkDisplayName = displayName;
|
|
113399
114239
|
if (success) {
|
|
113400
|
-
console.log(
|
|
113401
|
-
prefix + source_default.bold(`\u25C6 ${this.frameworkDisplayName} Completed`)
|
|
113402
|
-
);
|
|
114240
|
+
console.log(prefix + source_default.bold(`\u25C6 ${displayName} Completed`));
|
|
113403
114241
|
} else {
|
|
113404
|
-
console.log(prefix + source_default.bold(`\u25C6 ${
|
|
114242
|
+
console.log(prefix + source_default.bold(`\u25C6 ${displayName} Failed`));
|
|
114243
|
+
const result = displayString(event.data.result).trim();
|
|
114244
|
+
if (result.length > 0) {
|
|
114245
|
+
const [firstLine, ...restLines] = result.split("\n");
|
|
114246
|
+
console.log(` Error: ${source_default.red(firstLine)}`);
|
|
114247
|
+
for (const line of restLines) {
|
|
114248
|
+
console.log(` ${source_default.red(line)}`);
|
|
114249
|
+
}
|
|
114250
|
+
}
|
|
113405
114251
|
}
|
|
113406
|
-
const durationMs =
|
|
114252
|
+
const durationMs = displayNonNegativeNumber(event.data.durationMs);
|
|
113407
114253
|
const durationSec = (durationMs / 1e3).toFixed(1);
|
|
113408
114254
|
console.log(` Duration: ${source_default.dim(durationSec + "s")}`);
|
|
113409
|
-
const numTurns =
|
|
114255
|
+
const numTurns = displayNonNegativeNumber(event.data.numTurns);
|
|
113410
114256
|
console.log(` Turns: ${source_default.dim(String(numTurns))}`);
|
|
113411
114257
|
const usage = event.data.usage;
|
|
113412
114258
|
if (usage && typeof usage === "object") {
|
|
113413
|
-
const inputTokens =
|
|
113414
|
-
const outputTokens =
|
|
114259
|
+
const inputTokens = displayNonNegativeNumber(usage.input_tokens);
|
|
114260
|
+
const outputTokens = displayNonNegativeNumber(usage.output_tokens);
|
|
113415
114261
|
const formatTokens = (count) => {
|
|
113416
114262
|
if (count >= 1e3) {
|
|
113417
114263
|
return Math.floor(count / 1e3) + "k";
|
|
@@ -113516,8 +114362,9 @@ Expected format: '{"ref": {"permissions": {"perm": "allow|deny|ask"}}}'`
|
|
|
113516
114362
|
}
|
|
113517
114363
|
return result.data;
|
|
113518
114364
|
}
|
|
114365
|
+
var UUID_PATTERN2 = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;
|
|
113519
114366
|
function isUUID(str) {
|
|
113520
|
-
return
|
|
114367
|
+
return UUID_PATTERN2.test(str);
|
|
113521
114368
|
}
|
|
113522
114369
|
function extractVarNames(composeContent) {
|
|
113523
114370
|
const grouped = extractAndGroupVariables(composeContent);
|
|
@@ -113600,6 +114447,9 @@ var POLL_INTERVAL_MS = 1e3;
|
|
|
113600
114447
|
var TERMINAL_DRAIN_POLL_INTERVAL_MS = 500;
|
|
113601
114448
|
var TERMINAL_DRAIN_IDLE_MS = 1e3;
|
|
113602
114449
|
var TERMINAL_DRAIN_MAX_MS = 3e3;
|
|
114450
|
+
function supportedEventFramework(framework) {
|
|
114451
|
+
return isSupportedFramework(framework) ? framework : void 0;
|
|
114452
|
+
}
|
|
113603
114453
|
function isTerminalRunState(run) {
|
|
113604
114454
|
return TERMINAL_RUN_STATUSES.includes(run.status);
|
|
113605
114455
|
}
|
|
@@ -113701,6 +114551,7 @@ async function pollEvents(runId, options) {
|
|
|
113701
114551
|
for (const parsed of normalizer.flush()) {
|
|
113702
114552
|
renderer.render(parsed);
|
|
113703
114553
|
}
|
|
114554
|
+
renderer.flush();
|
|
113704
114555
|
};
|
|
113705
114556
|
for (; ; ) {
|
|
113706
114557
|
const previousSequence = nextSequence;
|
|
@@ -113714,7 +114565,7 @@ async function pollEvents(runId, options) {
|
|
|
113714
114565
|
for (const event of response.events) {
|
|
113715
114566
|
const parsedEvents = normalizer.process(
|
|
113716
114567
|
event.eventData,
|
|
113717
|
-
response.framework
|
|
114568
|
+
supportedEventFramework(response.framework)
|
|
113718
114569
|
);
|
|
113719
114570
|
for (const parsed of parsedEvents) {
|
|
113720
114571
|
renderer.render(parsed);
|
|
@@ -113941,6 +114792,17 @@ function parsePositiveLogCount(value, optionName) {
|
|
|
113941
114792
|
}
|
|
113942
114793
|
return count;
|
|
113943
114794
|
}
|
|
114795
|
+
function parseBoundedLogCount(value, optionName, min, max) {
|
|
114796
|
+
const trimmed = value.trim();
|
|
114797
|
+
if (!/^\d+$/.test(trimmed)) {
|
|
114798
|
+
throw new Error(`${optionName} must be between ${min} and ${max}`);
|
|
114799
|
+
}
|
|
114800
|
+
const count = Number(trimmed);
|
|
114801
|
+
if (!Number.isSafeInteger(count) || count < min || count > max) {
|
|
114802
|
+
throw new Error(`${optionName} must be between ${min} and ${max}`);
|
|
114803
|
+
}
|
|
114804
|
+
return count;
|
|
114805
|
+
}
|
|
113944
114806
|
async function collectLogItems(options) {
|
|
113945
114807
|
const collected = [];
|
|
113946
114808
|
const seenCursors = /* @__PURE__ */ new Set();
|
|
@@ -113954,9 +114816,6 @@ async function collectLogItems(options) {
|
|
|
113954
114816
|
order: options.order
|
|
113955
114817
|
});
|
|
113956
114818
|
collected.push(...page.items);
|
|
113957
|
-
if (page.items.length === 0) {
|
|
113958
|
-
break;
|
|
113959
|
-
}
|
|
113960
114819
|
if (options.targetCount !== "all" && collected.length >= options.targetCount) {
|
|
113961
114820
|
break;
|
|
113962
114821
|
}
|
|
@@ -113971,6 +114830,16 @@ async function collectLogItems(options) {
|
|
|
113971
114830
|
return options.order === "desc" ? entries.reverse() : entries;
|
|
113972
114831
|
}
|
|
113973
114832
|
|
|
114833
|
+
// src/lib/utils/search-query.ts
|
|
114834
|
+
init_esm_shims();
|
|
114835
|
+
function parseSearchQuery(value, label) {
|
|
114836
|
+
const trimmed = value.trim();
|
|
114837
|
+
if (!trimmed) {
|
|
114838
|
+
throw new Error(`${label} cannot be empty.`);
|
|
114839
|
+
}
|
|
114840
|
+
return trimmed;
|
|
114841
|
+
}
|
|
114842
|
+
|
|
113974
114843
|
export {
|
|
113975
114844
|
InvalidArgumentError,
|
|
113976
114845
|
Command,
|
|
@@ -114073,7 +114942,6 @@ export {
|
|
|
114073
114942
|
deleteWorkflowTrigger,
|
|
114074
114943
|
enableWorkflowTrigger,
|
|
114075
114944
|
disableWorkflowTrigger,
|
|
114076
|
-
runWorkflowTrigger,
|
|
114077
114945
|
createGoal,
|
|
114078
114946
|
editGoal,
|
|
114079
114947
|
getGoal,
|
|
@@ -114155,6 +115023,7 @@ export {
|
|
|
114155
115023
|
excludeVm0Filter,
|
|
114156
115024
|
listTarFiles,
|
|
114157
115025
|
removeExtraFiles,
|
|
115026
|
+
isSupportedFramework,
|
|
114158
115027
|
getInstructionsFilename,
|
|
114159
115028
|
PRESENTATION_REQUIRED_RESOURCE_IDS,
|
|
114160
115029
|
listImageStyles,
|
|
@@ -114171,8 +115040,8 @@ export {
|
|
|
114171
115040
|
selectResourceCandidates,
|
|
114172
115041
|
matchFirewallBaseUrl,
|
|
114173
115042
|
findMatchingPermissions,
|
|
114174
|
-
parseEvent,
|
|
114175
115043
|
EventStreamNormalizer,
|
|
115044
|
+
formatIsoTimestamp,
|
|
114176
115045
|
EventRenderer,
|
|
114177
115046
|
collectKeyValue,
|
|
114178
115047
|
collectVolumeVersions,
|
|
@@ -114194,7 +115063,9 @@ export {
|
|
|
114194
115063
|
promptConfirm,
|
|
114195
115064
|
promptPassword,
|
|
114196
115065
|
parsePositiveLogCount,
|
|
114197
|
-
|
|
115066
|
+
parseBoundedLogCount,
|
|
115067
|
+
collectLogItems,
|
|
115068
|
+
parseSearchQuery
|
|
114198
115069
|
};
|
|
114199
115070
|
/*! Bundled license information:
|
|
114200
115071
|
|
|
@@ -114204,4 +115075,4 @@ undici/lib/web/fetch/body.js:
|
|
|
114204
115075
|
undici/lib/web/websocket/frame.js:
|
|
114205
115076
|
(*! ws. MIT License. Einar Otto Stangvik <einaros@gmail.com> *)
|
|
114206
115077
|
*/
|
|
114207
|
-
//# sourceMappingURL=chunk-
|
|
115078
|
+
//# sourceMappingURL=chunk-6EGWCGWC.js.map
|