@autohq/cli 0.1.291 → 0.1.293
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-bridge.js +345 -1
- package/dist/index.js +348 -1
- package/package.json +1 -1
package/dist/agent-bridge.js
CHANGED
|
@@ -19726,6 +19726,20 @@ var RuntimeBridgeOutputUiMessageChunkEnvelopeSchema = external_exports.object({
|
|
|
19726
19726
|
chunk: JsonValueSchema,
|
|
19727
19727
|
createdAt: external_exports.string().datetime()
|
|
19728
19728
|
}).strict();
|
|
19729
|
+
var RuntimeBridgeOutputUiMessagePartEnvelopeSchema = external_exports.object({
|
|
19730
|
+
type: external_exports.literal("ui.message.part"),
|
|
19731
|
+
sessionId: SessionIdSchema,
|
|
19732
|
+
runtimeId: RuntimeIdSchema,
|
|
19733
|
+
bridgeLeaseId: RuntimeBridgeLeaseIdSchema,
|
|
19734
|
+
outputSeq: external_exports.number().int().positive(),
|
|
19735
|
+
messageId: external_exports.string().trim().min(1),
|
|
19736
|
+
role: external_exports.enum(["system", "user", "assistant"]),
|
|
19737
|
+
partIndex: external_exports.number().int().nonnegative(),
|
|
19738
|
+
part: JsonValueSchema,
|
|
19739
|
+
coveredSeq: external_exports.number().int().positive(),
|
|
19740
|
+
messageMetadata: JsonValueSchema.optional(),
|
|
19741
|
+
createdAt: external_exports.string().datetime()
|
|
19742
|
+
}).strict();
|
|
19729
19743
|
var RuntimeBridgeOutputUiMessageCompletedEnvelopeSchema = external_exports.object({
|
|
19730
19744
|
type: external_exports.literal("ui.message.completed"),
|
|
19731
19745
|
sessionId: SessionIdSchema,
|
|
@@ -19745,6 +19759,7 @@ var RuntimeBridgeOutputEnvelopeSchema = external_exports.union([
|
|
|
19745
19759
|
RuntimeBridgeOutputEntryEnvelopeSchema,
|
|
19746
19760
|
RuntimeBridgeOutputDeltaEnvelopeSchema,
|
|
19747
19761
|
RuntimeBridgeOutputUiMessageChunkEnvelopeSchema,
|
|
19762
|
+
RuntimeBridgeOutputUiMessagePartEnvelopeSchema,
|
|
19748
19763
|
RuntimeBridgeOutputUiMessageCompletedEnvelopeSchema
|
|
19749
19764
|
]);
|
|
19750
19765
|
function legacyRuntimeTurnStatus(entry, sessionStatusAfter) {
|
|
@@ -23384,7 +23399,7 @@ Object.assign(lookup, {
|
|
|
23384
23399
|
// package.json
|
|
23385
23400
|
var package_default = {
|
|
23386
23401
|
name: "@autohq/cli",
|
|
23387
|
-
version: "0.1.
|
|
23402
|
+
version: "0.1.293",
|
|
23388
23403
|
license: "SEE LICENSE IN README.md",
|
|
23389
23404
|
publishConfig: {
|
|
23390
23405
|
access: "public"
|
|
@@ -36679,6 +36694,295 @@ var _a21;
|
|
|
36679
36694
|
_a21 = symbol21;
|
|
36680
36695
|
var defaultDownload2 = createDownload();
|
|
36681
36696
|
|
|
36697
|
+
// src/commands/agent-bridge/harness/ui-message-part-tracker.ts
|
|
36698
|
+
var UiMessagePartTracker = class {
|
|
36699
|
+
messageId = null;
|
|
36700
|
+
messageMetadata;
|
|
36701
|
+
metadataEmitted = false;
|
|
36702
|
+
parts = [];
|
|
36703
|
+
textPartIndexById = /* @__PURE__ */ new Map();
|
|
36704
|
+
reasoningPartIndexById = /* @__PURE__ */ new Map();
|
|
36705
|
+
toolPartIndexByCallId = /* @__PURE__ */ new Map();
|
|
36706
|
+
dataPartIndexById = /* @__PURE__ */ new Map();
|
|
36707
|
+
append(chunk) {
|
|
36708
|
+
switch (chunk.type) {
|
|
36709
|
+
case "start": {
|
|
36710
|
+
this.reset();
|
|
36711
|
+
const messageId = chunk.messageId?.trim();
|
|
36712
|
+
this.messageId = messageId && messageId !== UNKNOWN_MESSAGE_ID ? messageId : null;
|
|
36713
|
+
this.messageMetadata = chunk.messageMetadata;
|
|
36714
|
+
return [];
|
|
36715
|
+
}
|
|
36716
|
+
case "finish":
|
|
36717
|
+
case "error":
|
|
36718
|
+
case "abort": {
|
|
36719
|
+
this.reset();
|
|
36720
|
+
return [];
|
|
36721
|
+
}
|
|
36722
|
+
case "text-start": {
|
|
36723
|
+
const index = this.pushPart({
|
|
36724
|
+
type: "text",
|
|
36725
|
+
text: "",
|
|
36726
|
+
state: "streaming",
|
|
36727
|
+
...providerMetadataField(chunk.providerMetadata)
|
|
36728
|
+
});
|
|
36729
|
+
this.textPartIndexById.set(chunk.id, index);
|
|
36730
|
+
return [];
|
|
36731
|
+
}
|
|
36732
|
+
case "text-delta": {
|
|
36733
|
+
const part = this.partById(this.textPartIndexById, chunk.id);
|
|
36734
|
+
if (part) {
|
|
36735
|
+
part.text = String(part.text ?? "") + chunk.delta;
|
|
36736
|
+
}
|
|
36737
|
+
return [];
|
|
36738
|
+
}
|
|
36739
|
+
case "text-end": {
|
|
36740
|
+
const index = this.textPartIndexById.get(chunk.id);
|
|
36741
|
+
const part = this.partById(this.textPartIndexById, chunk.id);
|
|
36742
|
+
this.textPartIndexById.delete(chunk.id);
|
|
36743
|
+
if (!part || index === void 0) {
|
|
36744
|
+
return [];
|
|
36745
|
+
}
|
|
36746
|
+
part.state = "done";
|
|
36747
|
+
if (chunk.providerMetadata !== void 0) {
|
|
36748
|
+
part.providerMetadata = chunk.providerMetadata;
|
|
36749
|
+
}
|
|
36750
|
+
return this.persistable(index);
|
|
36751
|
+
}
|
|
36752
|
+
case "reasoning-start": {
|
|
36753
|
+
const index = this.pushPart({
|
|
36754
|
+
type: "reasoning",
|
|
36755
|
+
text: "",
|
|
36756
|
+
state: "streaming",
|
|
36757
|
+
...providerMetadataField(chunk.providerMetadata)
|
|
36758
|
+
});
|
|
36759
|
+
this.reasoningPartIndexById.set(chunk.id, index);
|
|
36760
|
+
return [];
|
|
36761
|
+
}
|
|
36762
|
+
case "reasoning-delta": {
|
|
36763
|
+
const part = this.partById(this.reasoningPartIndexById, chunk.id);
|
|
36764
|
+
if (part) {
|
|
36765
|
+
part.text = String(part.text ?? "") + chunk.delta;
|
|
36766
|
+
if (chunk.providerMetadata !== void 0) {
|
|
36767
|
+
part.providerMetadata = chunk.providerMetadata;
|
|
36768
|
+
}
|
|
36769
|
+
}
|
|
36770
|
+
return [];
|
|
36771
|
+
}
|
|
36772
|
+
case "reasoning-end": {
|
|
36773
|
+
const index = this.reasoningPartIndexById.get(chunk.id);
|
|
36774
|
+
const part = this.partById(this.reasoningPartIndexById, chunk.id);
|
|
36775
|
+
this.reasoningPartIndexById.delete(chunk.id);
|
|
36776
|
+
if (!part || index === void 0) {
|
|
36777
|
+
return [];
|
|
36778
|
+
}
|
|
36779
|
+
part.state = "done";
|
|
36780
|
+
if (chunk.providerMetadata !== void 0) {
|
|
36781
|
+
part.providerMetadata = chunk.providerMetadata;
|
|
36782
|
+
}
|
|
36783
|
+
return this.persistable(index);
|
|
36784
|
+
}
|
|
36785
|
+
case "tool-input-start": {
|
|
36786
|
+
const index = this.pushPart(
|
|
36787
|
+
toolPartShape({
|
|
36788
|
+
toolCallId: chunk.toolCallId,
|
|
36789
|
+
toolName: chunk.toolName,
|
|
36790
|
+
dynamic: chunk.dynamic,
|
|
36791
|
+
state: "input-streaming"
|
|
36792
|
+
})
|
|
36793
|
+
);
|
|
36794
|
+
this.toolPartIndexByCallId.set(chunk.toolCallId, index);
|
|
36795
|
+
return [];
|
|
36796
|
+
}
|
|
36797
|
+
case "tool-input-available": {
|
|
36798
|
+
const index = this.upsertToolPart(chunk.toolCallId, {
|
|
36799
|
+
...toolPartShape({
|
|
36800
|
+
toolCallId: chunk.toolCallId,
|
|
36801
|
+
toolName: chunk.toolName,
|
|
36802
|
+
dynamic: chunk.dynamic,
|
|
36803
|
+
state: "input-available"
|
|
36804
|
+
}),
|
|
36805
|
+
input: chunk.input,
|
|
36806
|
+
...chunk.providerExecuted !== void 0 ? { providerExecuted: chunk.providerExecuted } : {},
|
|
36807
|
+
...chunk.providerMetadata !== void 0 ? { callProviderMetadata: chunk.providerMetadata } : {}
|
|
36808
|
+
});
|
|
36809
|
+
return this.persistable(index);
|
|
36810
|
+
}
|
|
36811
|
+
case "tool-input-error": {
|
|
36812
|
+
const index = this.upsertToolPart(chunk.toolCallId, {
|
|
36813
|
+
...toolPartShape({
|
|
36814
|
+
toolCallId: chunk.toolCallId,
|
|
36815
|
+
toolName: chunk.toolName,
|
|
36816
|
+
dynamic: chunk.dynamic,
|
|
36817
|
+
state: "output-error"
|
|
36818
|
+
}),
|
|
36819
|
+
input: chunk.input,
|
|
36820
|
+
errorText: chunk.errorText
|
|
36821
|
+
});
|
|
36822
|
+
return this.persistable(index);
|
|
36823
|
+
}
|
|
36824
|
+
case "tool-output-available": {
|
|
36825
|
+
const part = this.partById(
|
|
36826
|
+
this.toolPartIndexByCallId,
|
|
36827
|
+
chunk.toolCallId
|
|
36828
|
+
);
|
|
36829
|
+
const index = this.toolPartIndexByCallId.get(chunk.toolCallId);
|
|
36830
|
+
if (!part || index === void 0) {
|
|
36831
|
+
return [];
|
|
36832
|
+
}
|
|
36833
|
+
part.state = "output-available";
|
|
36834
|
+
part.output = chunk.output;
|
|
36835
|
+
part.preliminary = chunk.preliminary;
|
|
36836
|
+
return this.persistable(index);
|
|
36837
|
+
}
|
|
36838
|
+
case "tool-output-error": {
|
|
36839
|
+
const part = this.partById(
|
|
36840
|
+
this.toolPartIndexByCallId,
|
|
36841
|
+
chunk.toolCallId
|
|
36842
|
+
);
|
|
36843
|
+
const index = this.toolPartIndexByCallId.get(chunk.toolCallId);
|
|
36844
|
+
if (!part || index === void 0) {
|
|
36845
|
+
return [];
|
|
36846
|
+
}
|
|
36847
|
+
part.state = "output-error";
|
|
36848
|
+
part.errorText = chunk.errorText;
|
|
36849
|
+
return this.persistable(index);
|
|
36850
|
+
}
|
|
36851
|
+
case "start-step": {
|
|
36852
|
+
const index = this.pushPart({ type: "step-start" });
|
|
36853
|
+
return this.persistable(index);
|
|
36854
|
+
}
|
|
36855
|
+
case "finish-step": {
|
|
36856
|
+
this.textPartIndexById.clear();
|
|
36857
|
+
this.reasoningPartIndexById.clear();
|
|
36858
|
+
return [];
|
|
36859
|
+
}
|
|
36860
|
+
case "file": {
|
|
36861
|
+
const index = this.pushPart({
|
|
36862
|
+
type: "file",
|
|
36863
|
+
mediaType: chunk.mediaType,
|
|
36864
|
+
url: chunk.url
|
|
36865
|
+
});
|
|
36866
|
+
return this.persistable(index);
|
|
36867
|
+
}
|
|
36868
|
+
case "source-url": {
|
|
36869
|
+
const index = this.pushPart({
|
|
36870
|
+
type: "source-url",
|
|
36871
|
+
sourceId: chunk.sourceId,
|
|
36872
|
+
url: chunk.url,
|
|
36873
|
+
...chunk.title !== void 0 ? { title: chunk.title } : {}
|
|
36874
|
+
});
|
|
36875
|
+
return this.persistable(index);
|
|
36876
|
+
}
|
|
36877
|
+
case "source-document": {
|
|
36878
|
+
const index = this.pushPart({
|
|
36879
|
+
type: "source-document",
|
|
36880
|
+
sourceId: chunk.sourceId,
|
|
36881
|
+
mediaType: chunk.mediaType,
|
|
36882
|
+
title: chunk.title,
|
|
36883
|
+
...chunk.filename !== void 0 ? { filename: chunk.filename } : {}
|
|
36884
|
+
});
|
|
36885
|
+
return this.persistable(index);
|
|
36886
|
+
}
|
|
36887
|
+
default: {
|
|
36888
|
+
return this.appendDataChunk(chunk);
|
|
36889
|
+
}
|
|
36890
|
+
}
|
|
36891
|
+
}
|
|
36892
|
+
appendDataChunk(chunk) {
|
|
36893
|
+
if (!chunk.type.startsWith("data-") || chunk.type === "data-auto-question") {
|
|
36894
|
+
return [];
|
|
36895
|
+
}
|
|
36896
|
+
const dataChunk = chunk;
|
|
36897
|
+
if (dataChunk.transient) {
|
|
36898
|
+
return [];
|
|
36899
|
+
}
|
|
36900
|
+
const part = {
|
|
36901
|
+
type: dataChunk.type,
|
|
36902
|
+
...dataChunk.id !== void 0 ? { id: dataChunk.id } : {},
|
|
36903
|
+
data: dataChunk.data
|
|
36904
|
+
};
|
|
36905
|
+
const dataKey = dataChunk.id ? `${dataChunk.type}:${dataChunk.id}` : null;
|
|
36906
|
+
const existingIndex = dataKey ? this.dataPartIndexById.get(dataKey) : void 0;
|
|
36907
|
+
if (existingIndex !== void 0) {
|
|
36908
|
+
this.parts[existingIndex] = part;
|
|
36909
|
+
return this.persistable(existingIndex);
|
|
36910
|
+
}
|
|
36911
|
+
const index = this.pushPart(part);
|
|
36912
|
+
if (dataKey) {
|
|
36913
|
+
this.dataPartIndexById.set(dataKey, index);
|
|
36914
|
+
}
|
|
36915
|
+
return this.persistable(index);
|
|
36916
|
+
}
|
|
36917
|
+
upsertToolPart(toolCallId, part) {
|
|
36918
|
+
const existingIndex = this.toolPartIndexByCallId.get(toolCallId);
|
|
36919
|
+
if (existingIndex !== void 0) {
|
|
36920
|
+
this.parts[existingIndex] = part;
|
|
36921
|
+
return existingIndex;
|
|
36922
|
+
}
|
|
36923
|
+
const index = this.pushPart(part);
|
|
36924
|
+
this.toolPartIndexByCallId.set(toolCallId, index);
|
|
36925
|
+
return index;
|
|
36926
|
+
}
|
|
36927
|
+
persistable(partIndex) {
|
|
36928
|
+
const part = this.parts[partIndex];
|
|
36929
|
+
if (!this.messageId || !part) {
|
|
36930
|
+
return [];
|
|
36931
|
+
}
|
|
36932
|
+
const includeMetadata = !this.metadataEmitted && this.messageMetadata !== void 0;
|
|
36933
|
+
if (includeMetadata) {
|
|
36934
|
+
this.metadataEmitted = true;
|
|
36935
|
+
}
|
|
36936
|
+
return [
|
|
36937
|
+
{
|
|
36938
|
+
messageId: this.messageId,
|
|
36939
|
+
partIndex,
|
|
36940
|
+
part: toJsonValue(part),
|
|
36941
|
+
...includeMetadata ? { messageMetadata: toJsonValue(this.messageMetadata) } : {}
|
|
36942
|
+
}
|
|
36943
|
+
];
|
|
36944
|
+
}
|
|
36945
|
+
pushPart(part) {
|
|
36946
|
+
this.parts.push(part);
|
|
36947
|
+
return this.parts.length - 1;
|
|
36948
|
+
}
|
|
36949
|
+
partById(indexById, id) {
|
|
36950
|
+
const index = indexById.get(id);
|
|
36951
|
+
if (index === void 0) {
|
|
36952
|
+
return null;
|
|
36953
|
+
}
|
|
36954
|
+
return this.parts[index] ?? null;
|
|
36955
|
+
}
|
|
36956
|
+
reset() {
|
|
36957
|
+
this.messageId = null;
|
|
36958
|
+
this.messageMetadata = void 0;
|
|
36959
|
+
this.metadataEmitted = false;
|
|
36960
|
+
this.parts = [];
|
|
36961
|
+
this.textPartIndexById = /* @__PURE__ */ new Map();
|
|
36962
|
+
this.reasoningPartIndexById = /* @__PURE__ */ new Map();
|
|
36963
|
+
this.toolPartIndexByCallId = /* @__PURE__ */ new Map();
|
|
36964
|
+
this.dataPartIndexById = /* @__PURE__ */ new Map();
|
|
36965
|
+
}
|
|
36966
|
+
};
|
|
36967
|
+
function toolPartShape(input) {
|
|
36968
|
+
if (input.dynamic) {
|
|
36969
|
+
return {
|
|
36970
|
+
type: "dynamic-tool",
|
|
36971
|
+
toolName: input.toolName,
|
|
36972
|
+
toolCallId: input.toolCallId,
|
|
36973
|
+
state: input.state
|
|
36974
|
+
};
|
|
36975
|
+
}
|
|
36976
|
+
return {
|
|
36977
|
+
type: `tool-${input.toolName}`,
|
|
36978
|
+
toolCallId: input.toolCallId,
|
|
36979
|
+
state: input.state
|
|
36980
|
+
};
|
|
36981
|
+
}
|
|
36982
|
+
function providerMetadataField(providerMetadata) {
|
|
36983
|
+
return providerMetadata !== void 0 ? { providerMetadata } : {};
|
|
36984
|
+
}
|
|
36985
|
+
|
|
36682
36986
|
// src/commands/agent-bridge/harness/output-buffer.ts
|
|
36683
36987
|
var AGENT_BRIDGE_OUTPUT_DELTA_FLUSH_MS = 50;
|
|
36684
36988
|
var AgentBridgeOutputBuffer = class {
|
|
@@ -36692,6 +36996,7 @@ var AgentBridgeOutputBuffer = class {
|
|
|
36692
36996
|
pendingDelta = null;
|
|
36693
36997
|
deltaFlushTimer = null;
|
|
36694
36998
|
activeUiMessageAssembler = null;
|
|
36999
|
+
uiMessagePartTracker = new UiMessagePartTracker();
|
|
36695
37000
|
drainBlocked = false;
|
|
36696
37001
|
drainPromise = null;
|
|
36697
37002
|
// ---------------------------------------------------------------------------
|
|
@@ -36732,6 +37037,9 @@ var AgentBridgeOutputBuffer = class {
|
|
|
36732
37037
|
}
|
|
36733
37038
|
await this.flushPendingDelta();
|
|
36734
37039
|
await this.emitLiveUiMessageChunk(context, projection.chunk);
|
|
37040
|
+
await this.emitUiMessagePartSnapshots(context, projection.chunk, {
|
|
37041
|
+
coveredSeq: this.outputSeq
|
|
37042
|
+
});
|
|
36735
37043
|
const completedMessage = await this.appendUiChunkToAssembler(
|
|
36736
37044
|
projection.chunk
|
|
36737
37045
|
);
|
|
@@ -36790,6 +37098,25 @@ var AgentBridgeOutputBuffer = class {
|
|
|
36790
37098
|
this.enqueueOutput(output);
|
|
36791
37099
|
await this.drainPendingOutputs();
|
|
36792
37100
|
}
|
|
37101
|
+
async emitUiMessagePartSnapshots(context, chunk, input) {
|
|
37102
|
+
const snapshots = this.uiMessagePartTracker.append(chunk);
|
|
37103
|
+
if (snapshots.length === 0) {
|
|
37104
|
+
return;
|
|
37105
|
+
}
|
|
37106
|
+
for (const snapshot of snapshots) {
|
|
37107
|
+
this.outputSeq += 1;
|
|
37108
|
+
this.enqueueOutput(
|
|
37109
|
+
buildUiMessagePartOutputEnvelope({
|
|
37110
|
+
context,
|
|
37111
|
+
outputSeq: this.outputSeq,
|
|
37112
|
+
coveredSeq: input.coveredSeq,
|
|
37113
|
+
snapshot,
|
|
37114
|
+
createdAt: now2()
|
|
37115
|
+
})
|
|
37116
|
+
);
|
|
37117
|
+
}
|
|
37118
|
+
await this.drainPendingOutputs();
|
|
37119
|
+
}
|
|
36793
37120
|
// ---------------------------------------------------------------------------
|
|
36794
37121
|
// Transport emit
|
|
36795
37122
|
// ---------------------------------------------------------------------------
|
|
@@ -37102,6 +37429,23 @@ function buildUiMessageChunkOutputEnvelope(input) {
|
|
|
37102
37429
|
createdAt: input.createdAt
|
|
37103
37430
|
});
|
|
37104
37431
|
}
|
|
37432
|
+
function buildUiMessagePartOutputEnvelope(input) {
|
|
37433
|
+
const { context, snapshot } = input;
|
|
37434
|
+
return RuntimeBridgeOutputEnvelopeSchema.parse({
|
|
37435
|
+
type: "ui.message.part",
|
|
37436
|
+
sessionId: context.sessionId,
|
|
37437
|
+
runtimeId: context.runtimeId,
|
|
37438
|
+
bridgeLeaseId: context.bridgeLeaseId,
|
|
37439
|
+
outputSeq: input.outputSeq,
|
|
37440
|
+
messageId: snapshot.messageId,
|
|
37441
|
+
role: "assistant",
|
|
37442
|
+
partIndex: snapshot.partIndex,
|
|
37443
|
+
part: snapshot.part,
|
|
37444
|
+
coveredSeq: input.coveredSeq,
|
|
37445
|
+
...snapshot.messageMetadata !== void 0 ? { messageMetadata: snapshot.messageMetadata } : {},
|
|
37446
|
+
createdAt: input.createdAt
|
|
37447
|
+
});
|
|
37448
|
+
}
|
|
37105
37449
|
function buildUiMessageCompletedOutputEnvelope(input) {
|
|
37106
37450
|
const { context } = input;
|
|
37107
37451
|
return RuntimeBridgeOutputEnvelopeSchema.parse({
|
package/dist/index.js
CHANGED
|
@@ -23182,7 +23182,7 @@ var init_package = __esm({
|
|
|
23182
23182
|
"package.json"() {
|
|
23183
23183
|
package_default = {
|
|
23184
23184
|
name: "@autohq/cli",
|
|
23185
|
-
version: "0.1.
|
|
23185
|
+
version: "0.1.293",
|
|
23186
23186
|
license: "SEE LICENSE IN README.md",
|
|
23187
23187
|
publishConfig: {
|
|
23188
23188
|
access: "public"
|
|
@@ -33177,6 +33177,20 @@ var RuntimeBridgeOutputUiMessageChunkEnvelopeSchema = external_exports.object({
|
|
|
33177
33177
|
chunk: JsonValueSchema2,
|
|
33178
33178
|
createdAt: external_exports.string().datetime()
|
|
33179
33179
|
}).strict();
|
|
33180
|
+
var RuntimeBridgeOutputUiMessagePartEnvelopeSchema = external_exports.object({
|
|
33181
|
+
type: external_exports.literal("ui.message.part"),
|
|
33182
|
+
sessionId: SessionIdSchema2,
|
|
33183
|
+
runtimeId: RuntimeIdSchema2,
|
|
33184
|
+
bridgeLeaseId: RuntimeBridgeLeaseIdSchema2,
|
|
33185
|
+
outputSeq: external_exports.number().int().positive(),
|
|
33186
|
+
messageId: external_exports.string().trim().min(1),
|
|
33187
|
+
role: external_exports.enum(["system", "user", "assistant"]),
|
|
33188
|
+
partIndex: external_exports.number().int().nonnegative(),
|
|
33189
|
+
part: JsonValueSchema2,
|
|
33190
|
+
coveredSeq: external_exports.number().int().positive(),
|
|
33191
|
+
messageMetadata: JsonValueSchema2.optional(),
|
|
33192
|
+
createdAt: external_exports.string().datetime()
|
|
33193
|
+
}).strict();
|
|
33180
33194
|
var RuntimeBridgeOutputUiMessageCompletedEnvelopeSchema = external_exports.object({
|
|
33181
33195
|
type: external_exports.literal("ui.message.completed"),
|
|
33182
33196
|
sessionId: SessionIdSchema2,
|
|
@@ -33196,6 +33210,7 @@ var RuntimeBridgeOutputEnvelopeSchema = external_exports.union([
|
|
|
33196
33210
|
RuntimeBridgeOutputEntryEnvelopeSchema,
|
|
33197
33211
|
RuntimeBridgeOutputDeltaEnvelopeSchema,
|
|
33198
33212
|
RuntimeBridgeOutputUiMessageChunkEnvelopeSchema,
|
|
33213
|
+
RuntimeBridgeOutputUiMessagePartEnvelopeSchema,
|
|
33199
33214
|
RuntimeBridgeOutputUiMessageCompletedEnvelopeSchema
|
|
33200
33215
|
]);
|
|
33201
33216
|
function legacyRuntimeTurnStatus(entry, sessionStatusAfter) {
|
|
@@ -33697,6 +33712,298 @@ init_src();
|
|
|
33697
33712
|
// src/commands/agent-bridge/harness/output-buffer.ts
|
|
33698
33713
|
init_src();
|
|
33699
33714
|
import { readUIMessageStream } from "ai";
|
|
33715
|
+
|
|
33716
|
+
// src/commands/agent-bridge/harness/ui-message-part-tracker.ts
|
|
33717
|
+
init_src();
|
|
33718
|
+
var UiMessagePartTracker = class {
|
|
33719
|
+
messageId = null;
|
|
33720
|
+
messageMetadata;
|
|
33721
|
+
metadataEmitted = false;
|
|
33722
|
+
parts = [];
|
|
33723
|
+
textPartIndexById = /* @__PURE__ */ new Map();
|
|
33724
|
+
reasoningPartIndexById = /* @__PURE__ */ new Map();
|
|
33725
|
+
toolPartIndexByCallId = /* @__PURE__ */ new Map();
|
|
33726
|
+
dataPartIndexById = /* @__PURE__ */ new Map();
|
|
33727
|
+
append(chunk) {
|
|
33728
|
+
switch (chunk.type) {
|
|
33729
|
+
case "start": {
|
|
33730
|
+
this.reset();
|
|
33731
|
+
const messageId = chunk.messageId?.trim();
|
|
33732
|
+
this.messageId = messageId && messageId !== UNKNOWN_MESSAGE_ID ? messageId : null;
|
|
33733
|
+
this.messageMetadata = chunk.messageMetadata;
|
|
33734
|
+
return [];
|
|
33735
|
+
}
|
|
33736
|
+
case "finish":
|
|
33737
|
+
case "error":
|
|
33738
|
+
case "abort": {
|
|
33739
|
+
this.reset();
|
|
33740
|
+
return [];
|
|
33741
|
+
}
|
|
33742
|
+
case "text-start": {
|
|
33743
|
+
const index = this.pushPart({
|
|
33744
|
+
type: "text",
|
|
33745
|
+
text: "",
|
|
33746
|
+
state: "streaming",
|
|
33747
|
+
...providerMetadataField(chunk.providerMetadata)
|
|
33748
|
+
});
|
|
33749
|
+
this.textPartIndexById.set(chunk.id, index);
|
|
33750
|
+
return [];
|
|
33751
|
+
}
|
|
33752
|
+
case "text-delta": {
|
|
33753
|
+
const part = this.partById(this.textPartIndexById, chunk.id);
|
|
33754
|
+
if (part) {
|
|
33755
|
+
part.text = String(part.text ?? "") + chunk.delta;
|
|
33756
|
+
}
|
|
33757
|
+
return [];
|
|
33758
|
+
}
|
|
33759
|
+
case "text-end": {
|
|
33760
|
+
const index = this.textPartIndexById.get(chunk.id);
|
|
33761
|
+
const part = this.partById(this.textPartIndexById, chunk.id);
|
|
33762
|
+
this.textPartIndexById.delete(chunk.id);
|
|
33763
|
+
if (!part || index === void 0) {
|
|
33764
|
+
return [];
|
|
33765
|
+
}
|
|
33766
|
+
part.state = "done";
|
|
33767
|
+
if (chunk.providerMetadata !== void 0) {
|
|
33768
|
+
part.providerMetadata = chunk.providerMetadata;
|
|
33769
|
+
}
|
|
33770
|
+
return this.persistable(index);
|
|
33771
|
+
}
|
|
33772
|
+
case "reasoning-start": {
|
|
33773
|
+
const index = this.pushPart({
|
|
33774
|
+
type: "reasoning",
|
|
33775
|
+
text: "",
|
|
33776
|
+
state: "streaming",
|
|
33777
|
+
...providerMetadataField(chunk.providerMetadata)
|
|
33778
|
+
});
|
|
33779
|
+
this.reasoningPartIndexById.set(chunk.id, index);
|
|
33780
|
+
return [];
|
|
33781
|
+
}
|
|
33782
|
+
case "reasoning-delta": {
|
|
33783
|
+
const part = this.partById(this.reasoningPartIndexById, chunk.id);
|
|
33784
|
+
if (part) {
|
|
33785
|
+
part.text = String(part.text ?? "") + chunk.delta;
|
|
33786
|
+
if (chunk.providerMetadata !== void 0) {
|
|
33787
|
+
part.providerMetadata = chunk.providerMetadata;
|
|
33788
|
+
}
|
|
33789
|
+
}
|
|
33790
|
+
return [];
|
|
33791
|
+
}
|
|
33792
|
+
case "reasoning-end": {
|
|
33793
|
+
const index = this.reasoningPartIndexById.get(chunk.id);
|
|
33794
|
+
const part = this.partById(this.reasoningPartIndexById, chunk.id);
|
|
33795
|
+
this.reasoningPartIndexById.delete(chunk.id);
|
|
33796
|
+
if (!part || index === void 0) {
|
|
33797
|
+
return [];
|
|
33798
|
+
}
|
|
33799
|
+
part.state = "done";
|
|
33800
|
+
if (chunk.providerMetadata !== void 0) {
|
|
33801
|
+
part.providerMetadata = chunk.providerMetadata;
|
|
33802
|
+
}
|
|
33803
|
+
return this.persistable(index);
|
|
33804
|
+
}
|
|
33805
|
+
case "tool-input-start": {
|
|
33806
|
+
const index = this.pushPart(
|
|
33807
|
+
toolPartShape({
|
|
33808
|
+
toolCallId: chunk.toolCallId,
|
|
33809
|
+
toolName: chunk.toolName,
|
|
33810
|
+
dynamic: chunk.dynamic,
|
|
33811
|
+
state: "input-streaming"
|
|
33812
|
+
})
|
|
33813
|
+
);
|
|
33814
|
+
this.toolPartIndexByCallId.set(chunk.toolCallId, index);
|
|
33815
|
+
return [];
|
|
33816
|
+
}
|
|
33817
|
+
case "tool-input-available": {
|
|
33818
|
+
const index = this.upsertToolPart(chunk.toolCallId, {
|
|
33819
|
+
...toolPartShape({
|
|
33820
|
+
toolCallId: chunk.toolCallId,
|
|
33821
|
+
toolName: chunk.toolName,
|
|
33822
|
+
dynamic: chunk.dynamic,
|
|
33823
|
+
state: "input-available"
|
|
33824
|
+
}),
|
|
33825
|
+
input: chunk.input,
|
|
33826
|
+
...chunk.providerExecuted !== void 0 ? { providerExecuted: chunk.providerExecuted } : {},
|
|
33827
|
+
...chunk.providerMetadata !== void 0 ? { callProviderMetadata: chunk.providerMetadata } : {}
|
|
33828
|
+
});
|
|
33829
|
+
return this.persistable(index);
|
|
33830
|
+
}
|
|
33831
|
+
case "tool-input-error": {
|
|
33832
|
+
const index = this.upsertToolPart(chunk.toolCallId, {
|
|
33833
|
+
...toolPartShape({
|
|
33834
|
+
toolCallId: chunk.toolCallId,
|
|
33835
|
+
toolName: chunk.toolName,
|
|
33836
|
+
dynamic: chunk.dynamic,
|
|
33837
|
+
state: "output-error"
|
|
33838
|
+
}),
|
|
33839
|
+
input: chunk.input,
|
|
33840
|
+
errorText: chunk.errorText
|
|
33841
|
+
});
|
|
33842
|
+
return this.persistable(index);
|
|
33843
|
+
}
|
|
33844
|
+
case "tool-output-available": {
|
|
33845
|
+
const part = this.partById(
|
|
33846
|
+
this.toolPartIndexByCallId,
|
|
33847
|
+
chunk.toolCallId
|
|
33848
|
+
);
|
|
33849
|
+
const index = this.toolPartIndexByCallId.get(chunk.toolCallId);
|
|
33850
|
+
if (!part || index === void 0) {
|
|
33851
|
+
return [];
|
|
33852
|
+
}
|
|
33853
|
+
part.state = "output-available";
|
|
33854
|
+
part.output = chunk.output;
|
|
33855
|
+
part.preliminary = chunk.preliminary;
|
|
33856
|
+
return this.persistable(index);
|
|
33857
|
+
}
|
|
33858
|
+
case "tool-output-error": {
|
|
33859
|
+
const part = this.partById(
|
|
33860
|
+
this.toolPartIndexByCallId,
|
|
33861
|
+
chunk.toolCallId
|
|
33862
|
+
);
|
|
33863
|
+
const index = this.toolPartIndexByCallId.get(chunk.toolCallId);
|
|
33864
|
+
if (!part || index === void 0) {
|
|
33865
|
+
return [];
|
|
33866
|
+
}
|
|
33867
|
+
part.state = "output-error";
|
|
33868
|
+
part.errorText = chunk.errorText;
|
|
33869
|
+
return this.persistable(index);
|
|
33870
|
+
}
|
|
33871
|
+
case "start-step": {
|
|
33872
|
+
const index = this.pushPart({ type: "step-start" });
|
|
33873
|
+
return this.persistable(index);
|
|
33874
|
+
}
|
|
33875
|
+
case "finish-step": {
|
|
33876
|
+
this.textPartIndexById.clear();
|
|
33877
|
+
this.reasoningPartIndexById.clear();
|
|
33878
|
+
return [];
|
|
33879
|
+
}
|
|
33880
|
+
case "file": {
|
|
33881
|
+
const index = this.pushPart({
|
|
33882
|
+
type: "file",
|
|
33883
|
+
mediaType: chunk.mediaType,
|
|
33884
|
+
url: chunk.url
|
|
33885
|
+
});
|
|
33886
|
+
return this.persistable(index);
|
|
33887
|
+
}
|
|
33888
|
+
case "source-url": {
|
|
33889
|
+
const index = this.pushPart({
|
|
33890
|
+
type: "source-url",
|
|
33891
|
+
sourceId: chunk.sourceId,
|
|
33892
|
+
url: chunk.url,
|
|
33893
|
+
...chunk.title !== void 0 ? { title: chunk.title } : {}
|
|
33894
|
+
});
|
|
33895
|
+
return this.persistable(index);
|
|
33896
|
+
}
|
|
33897
|
+
case "source-document": {
|
|
33898
|
+
const index = this.pushPart({
|
|
33899
|
+
type: "source-document",
|
|
33900
|
+
sourceId: chunk.sourceId,
|
|
33901
|
+
mediaType: chunk.mediaType,
|
|
33902
|
+
title: chunk.title,
|
|
33903
|
+
...chunk.filename !== void 0 ? { filename: chunk.filename } : {}
|
|
33904
|
+
});
|
|
33905
|
+
return this.persistable(index);
|
|
33906
|
+
}
|
|
33907
|
+
default: {
|
|
33908
|
+
return this.appendDataChunk(chunk);
|
|
33909
|
+
}
|
|
33910
|
+
}
|
|
33911
|
+
}
|
|
33912
|
+
appendDataChunk(chunk) {
|
|
33913
|
+
if (!chunk.type.startsWith("data-") || chunk.type === "data-auto-question") {
|
|
33914
|
+
return [];
|
|
33915
|
+
}
|
|
33916
|
+
const dataChunk = chunk;
|
|
33917
|
+
if (dataChunk.transient) {
|
|
33918
|
+
return [];
|
|
33919
|
+
}
|
|
33920
|
+
const part = {
|
|
33921
|
+
type: dataChunk.type,
|
|
33922
|
+
...dataChunk.id !== void 0 ? { id: dataChunk.id } : {},
|
|
33923
|
+
data: dataChunk.data
|
|
33924
|
+
};
|
|
33925
|
+
const dataKey = dataChunk.id ? `${dataChunk.type}:${dataChunk.id}` : null;
|
|
33926
|
+
const existingIndex = dataKey ? this.dataPartIndexById.get(dataKey) : void 0;
|
|
33927
|
+
if (existingIndex !== void 0) {
|
|
33928
|
+
this.parts[existingIndex] = part;
|
|
33929
|
+
return this.persistable(existingIndex);
|
|
33930
|
+
}
|
|
33931
|
+
const index = this.pushPart(part);
|
|
33932
|
+
if (dataKey) {
|
|
33933
|
+
this.dataPartIndexById.set(dataKey, index);
|
|
33934
|
+
}
|
|
33935
|
+
return this.persistable(index);
|
|
33936
|
+
}
|
|
33937
|
+
upsertToolPart(toolCallId, part) {
|
|
33938
|
+
const existingIndex = this.toolPartIndexByCallId.get(toolCallId);
|
|
33939
|
+
if (existingIndex !== void 0) {
|
|
33940
|
+
this.parts[existingIndex] = part;
|
|
33941
|
+
return existingIndex;
|
|
33942
|
+
}
|
|
33943
|
+
const index = this.pushPart(part);
|
|
33944
|
+
this.toolPartIndexByCallId.set(toolCallId, index);
|
|
33945
|
+
return index;
|
|
33946
|
+
}
|
|
33947
|
+
persistable(partIndex) {
|
|
33948
|
+
const part = this.parts[partIndex];
|
|
33949
|
+
if (!this.messageId || !part) {
|
|
33950
|
+
return [];
|
|
33951
|
+
}
|
|
33952
|
+
const includeMetadata = !this.metadataEmitted && this.messageMetadata !== void 0;
|
|
33953
|
+
if (includeMetadata) {
|
|
33954
|
+
this.metadataEmitted = true;
|
|
33955
|
+
}
|
|
33956
|
+
return [
|
|
33957
|
+
{
|
|
33958
|
+
messageId: this.messageId,
|
|
33959
|
+
partIndex,
|
|
33960
|
+
part: toJsonValue(part),
|
|
33961
|
+
...includeMetadata ? { messageMetadata: toJsonValue(this.messageMetadata) } : {}
|
|
33962
|
+
}
|
|
33963
|
+
];
|
|
33964
|
+
}
|
|
33965
|
+
pushPart(part) {
|
|
33966
|
+
this.parts.push(part);
|
|
33967
|
+
return this.parts.length - 1;
|
|
33968
|
+
}
|
|
33969
|
+
partById(indexById, id) {
|
|
33970
|
+
const index = indexById.get(id);
|
|
33971
|
+
if (index === void 0) {
|
|
33972
|
+
return null;
|
|
33973
|
+
}
|
|
33974
|
+
return this.parts[index] ?? null;
|
|
33975
|
+
}
|
|
33976
|
+
reset() {
|
|
33977
|
+
this.messageId = null;
|
|
33978
|
+
this.messageMetadata = void 0;
|
|
33979
|
+
this.metadataEmitted = false;
|
|
33980
|
+
this.parts = [];
|
|
33981
|
+
this.textPartIndexById = /* @__PURE__ */ new Map();
|
|
33982
|
+
this.reasoningPartIndexById = /* @__PURE__ */ new Map();
|
|
33983
|
+
this.toolPartIndexByCallId = /* @__PURE__ */ new Map();
|
|
33984
|
+
this.dataPartIndexById = /* @__PURE__ */ new Map();
|
|
33985
|
+
}
|
|
33986
|
+
};
|
|
33987
|
+
function toolPartShape(input) {
|
|
33988
|
+
if (input.dynamic) {
|
|
33989
|
+
return {
|
|
33990
|
+
type: "dynamic-tool",
|
|
33991
|
+
toolName: input.toolName,
|
|
33992
|
+
toolCallId: input.toolCallId,
|
|
33993
|
+
state: input.state
|
|
33994
|
+
};
|
|
33995
|
+
}
|
|
33996
|
+
return {
|
|
33997
|
+
type: `tool-${input.toolName}`,
|
|
33998
|
+
toolCallId: input.toolCallId,
|
|
33999
|
+
state: input.state
|
|
34000
|
+
};
|
|
34001
|
+
}
|
|
34002
|
+
function providerMetadataField(providerMetadata) {
|
|
34003
|
+
return providerMetadata !== void 0 ? { providerMetadata } : {};
|
|
34004
|
+
}
|
|
34005
|
+
|
|
34006
|
+
// src/commands/agent-bridge/harness/output-buffer.ts
|
|
33700
34007
|
var AGENT_BRIDGE_OUTPUT_DELTA_FLUSH_MS = 50;
|
|
33701
34008
|
var AgentBridgeOutputBuffer = class {
|
|
33702
34009
|
constructor(input) {
|
|
@@ -33709,6 +34016,7 @@ var AgentBridgeOutputBuffer = class {
|
|
|
33709
34016
|
pendingDelta = null;
|
|
33710
34017
|
deltaFlushTimer = null;
|
|
33711
34018
|
activeUiMessageAssembler = null;
|
|
34019
|
+
uiMessagePartTracker = new UiMessagePartTracker();
|
|
33712
34020
|
drainBlocked = false;
|
|
33713
34021
|
drainPromise = null;
|
|
33714
34022
|
// ---------------------------------------------------------------------------
|
|
@@ -33749,6 +34057,9 @@ var AgentBridgeOutputBuffer = class {
|
|
|
33749
34057
|
}
|
|
33750
34058
|
await this.flushPendingDelta();
|
|
33751
34059
|
await this.emitLiveUiMessageChunk(context, projection.chunk);
|
|
34060
|
+
await this.emitUiMessagePartSnapshots(context, projection.chunk, {
|
|
34061
|
+
coveredSeq: this.outputSeq
|
|
34062
|
+
});
|
|
33752
34063
|
const completedMessage = await this.appendUiChunkToAssembler(
|
|
33753
34064
|
projection.chunk
|
|
33754
34065
|
);
|
|
@@ -33807,6 +34118,25 @@ var AgentBridgeOutputBuffer = class {
|
|
|
33807
34118
|
this.enqueueOutput(output);
|
|
33808
34119
|
await this.drainPendingOutputs();
|
|
33809
34120
|
}
|
|
34121
|
+
async emitUiMessagePartSnapshots(context, chunk, input) {
|
|
34122
|
+
const snapshots = this.uiMessagePartTracker.append(chunk);
|
|
34123
|
+
if (snapshots.length === 0) {
|
|
34124
|
+
return;
|
|
34125
|
+
}
|
|
34126
|
+
for (const snapshot of snapshots) {
|
|
34127
|
+
this.outputSeq += 1;
|
|
34128
|
+
this.enqueueOutput(
|
|
34129
|
+
buildUiMessagePartOutputEnvelope({
|
|
34130
|
+
context,
|
|
34131
|
+
outputSeq: this.outputSeq,
|
|
34132
|
+
coveredSeq: input.coveredSeq,
|
|
34133
|
+
snapshot,
|
|
34134
|
+
createdAt: now2()
|
|
34135
|
+
})
|
|
34136
|
+
);
|
|
34137
|
+
}
|
|
34138
|
+
await this.drainPendingOutputs();
|
|
34139
|
+
}
|
|
33810
34140
|
// ---------------------------------------------------------------------------
|
|
33811
34141
|
// Transport emit
|
|
33812
34142
|
// ---------------------------------------------------------------------------
|
|
@@ -34119,6 +34449,23 @@ function buildUiMessageChunkOutputEnvelope(input) {
|
|
|
34119
34449
|
createdAt: input.createdAt
|
|
34120
34450
|
});
|
|
34121
34451
|
}
|
|
34452
|
+
function buildUiMessagePartOutputEnvelope(input) {
|
|
34453
|
+
const { context, snapshot } = input;
|
|
34454
|
+
return RuntimeBridgeOutputEnvelopeSchema.parse({
|
|
34455
|
+
type: "ui.message.part",
|
|
34456
|
+
sessionId: context.sessionId,
|
|
34457
|
+
runtimeId: context.runtimeId,
|
|
34458
|
+
bridgeLeaseId: context.bridgeLeaseId,
|
|
34459
|
+
outputSeq: input.outputSeq,
|
|
34460
|
+
messageId: snapshot.messageId,
|
|
34461
|
+
role: "assistant",
|
|
34462
|
+
partIndex: snapshot.partIndex,
|
|
34463
|
+
part: snapshot.part,
|
|
34464
|
+
coveredSeq: input.coveredSeq,
|
|
34465
|
+
...snapshot.messageMetadata !== void 0 ? { messageMetadata: snapshot.messageMetadata } : {},
|
|
34466
|
+
createdAt: input.createdAt
|
|
34467
|
+
});
|
|
34468
|
+
}
|
|
34122
34469
|
function buildUiMessageCompletedOutputEnvelope(input) {
|
|
34123
34470
|
const { context } = input;
|
|
34124
34471
|
return RuntimeBridgeOutputEnvelopeSchema.parse({
|