@moxt-ai/mobius 0.0.142 → 0.0.144
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/acp/agent-query-processes.js +2 -2
- package/dist/acp/agent-query-processes.js.map +1 -1
- package/dist/acp/agent-runtime-manager.js +4 -4
- package/dist/acp/agent-runtime-manager.js.map +1 -1
- package/dist/acp/agent-session.d.ts.map +1 -1
- package/dist/acp/agent-session.js +37 -34
- package/dist/acp/agent-session.js.map +1 -1
- package/dist/acp/runtime-operations.d.ts +2 -2
- package/dist/acp/runtime-operations.d.ts.map +1 -1
- package/dist/acp/runtime-operations.js +2 -2
- package/dist/acp/runtime-operations.js.map +1 -1
- package/dist/cli.js +594 -419
- package/dist/cli.js.map +4 -4
- package/dist/daemon-active-turn.d.ts +2 -0
- package/dist/daemon-active-turn.d.ts.map +1 -1
- package/dist/daemon-active-turn.js +80 -6
- package/dist/daemon-active-turn.js.map +1 -1
- package/dist/daemon-prompt-executor.d.ts.map +1 -1
- package/dist/daemon-prompt-executor.js +25 -41
- package/dist/daemon-prompt-executor.js.map +1 -1
- package/dist/daemon-turn-registry.d.ts +48 -0
- package/dist/daemon-turn-registry.d.ts.map +1 -1
- package/dist/index.js +593 -418
- package/dist/index.js.map +4 -4
- package/dist/native-sessions/codex-history.d.ts.map +1 -1
- package/dist/native-sessions/codex-history.js +254 -94
- package/dist/native-sessions/codex-history.js.map +1 -1
- package/dist/native-sessions/live-history-page.d.ts.map +1 -1
- package/dist/native-sessions/live-history-page.js +40 -24
- package/dist/native-sessions/live-history-page.js.map +1 -1
- package/dist/relay-connection/coalescing-agent-event-publisher.d.ts +32 -0
- package/dist/relay-connection/coalescing-agent-event-publisher.d.ts.map +1 -0
- package/dist/relay-connection/coalescing-agent-event-publisher.js +116 -0
- package/dist/relay-connection/coalescing-agent-event-publisher.js.map +1 -0
- package/dist/runtime.js +593 -418
- package/dist/runtime.js.map +4 -4
- package/package.json +1 -1
- package/dist/relay-connection/coalescing-activity-publisher.d.ts +0 -10
- package/dist/relay-connection/coalescing-activity-publisher.d.ts.map +0 -1
- package/dist/relay-connection/coalescing-activity-publisher.js +0 -54
- package/dist/relay-connection/coalescing-activity-publisher.js.map +0 -1
- package/dist/relay-connection/coalescing-narration-publisher.d.ts +0 -31
- package/dist/relay-connection/coalescing-narration-publisher.d.ts.map +0 -1
- package/dist/relay-connection/coalescing-narration-publisher.js +0 -61
- package/dist/relay-connection/coalescing-narration-publisher.js.map +0 -1
- package/dist/relay-connection/coalescing-text-publisher.d.ts +0 -26
- package/dist/relay-connection/coalescing-text-publisher.d.ts.map +0 -1
- package/dist/relay-connection/coalescing-text-publisher.js +0 -57
- package/dist/relay-connection/coalescing-text-publisher.js.map +0 -1
|
@@ -49,6 +49,34 @@ function historyMessageCharacters(message) {
|
|
|
49
49
|
? JSON.stringify(message.activities).length + JSON.stringify(message.content).length
|
|
50
50
|
: 0));
|
|
51
51
|
}
|
|
52
|
+
function boundedActiveMessages(messages, messageLimit, characterLimit) {
|
|
53
|
+
const selected = [];
|
|
54
|
+
let remainingCharacters = characterLimit;
|
|
55
|
+
for (let index = messages.length - 1; index >= 0 && selected.length < messageLimit; index -= 1) {
|
|
56
|
+
const message = messages[index];
|
|
57
|
+
if (message === undefined) {
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
const characters = historyMessageCharacters(message);
|
|
61
|
+
if (characters <= remainingCharacters) {
|
|
62
|
+
selected.unshift(message);
|
|
63
|
+
remainingCharacters -= characters;
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
const structuredCharacters = characters - message.text.length;
|
|
67
|
+
if (selected.length === 0 && structuredCharacters <= remainingCharacters) {
|
|
68
|
+
const textCharacters = remainingCharacters - structuredCharacters;
|
|
69
|
+
selected.unshift({ ...message, text: textCharacters === 0 ? "" : message.text.slice(-textCharacters) });
|
|
70
|
+
remainingCharacters = 0;
|
|
71
|
+
}
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
characters: characterLimit - remainingCharacters,
|
|
76
|
+
messages: selected,
|
|
77
|
+
truncated: selected.length !== messages.length,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
52
80
|
function paginateAcpSessionHistory(history, sessionId, cursor, limit) {
|
|
53
81
|
if (history.status === "unavailable") {
|
|
54
82
|
if (cursor !== null) {
|
|
@@ -89,27 +117,15 @@ export function paginateLiveSessionHistory(history, activeTurn, sessionId, curso
|
|
|
89
117
|
if (activeTurn === null || cursor !== null) {
|
|
90
118
|
return paginateAcpSessionHistory(history, sessionId, cursor, limit);
|
|
91
119
|
}
|
|
92
|
-
const activeMessageOverhead = 4;
|
|
93
|
-
const activeStructuredCharacters = JSON.stringify(activeTurn.activities).length + JSON.stringify(activeTurn.content).length;
|
|
94
|
-
const maximumActiveTextLength = Math.max(0, SESSION_HISTORY_CHARACTER_LIMIT - activeTurn.prompt.length - activeStructuredCharacters - activeMessageOverhead);
|
|
95
|
-
const activeText = activeTurn.text.slice(-maximumActiveTextLength);
|
|
96
|
-
const completeActiveMessages = [
|
|
97
|
-
{ role: "user", text: activeTurn.prompt },
|
|
98
|
-
{
|
|
99
|
-
activities: activeTurn.activities,
|
|
100
|
-
content: activeTurn.content,
|
|
101
|
-
role: "assistant",
|
|
102
|
-
text: activeText,
|
|
103
|
-
},
|
|
104
|
-
];
|
|
105
120
|
if (history.status === "unavailable") {
|
|
121
|
+
const bounded = boundedActiveMessages(activeTurn.messages, Math.max(0, limit - 1), Math.max(0, SESSION_HISTORY_CHARACTER_LIMIT - activeTurn.prompt.length));
|
|
106
122
|
return {
|
|
107
123
|
coveredCommandIds: [],
|
|
108
124
|
coveredMessageIds: [],
|
|
109
|
-
messages:
|
|
125
|
+
messages: [{ role: "user", text: activeTurn.prompt }, ...bounded.messages],
|
|
110
126
|
nextCursor: null,
|
|
111
127
|
status: "available",
|
|
112
|
-
truncated: activeTurn.truncated ||
|
|
128
|
+
truncated: activeTurn.truncated || bounded.truncated,
|
|
113
129
|
};
|
|
114
130
|
}
|
|
115
131
|
// Native turn identity, rather than prompt text, tells us whether the source
|
|
@@ -127,15 +143,15 @@ export function paginateLiveSessionHistory(history, activeTurn, sessionId, curso
|
|
|
127
143
|
};
|
|
128
144
|
}
|
|
129
145
|
const latestNativeMessage = history.messages.at(-1);
|
|
130
|
-
const
|
|
131
|
-
|
|
132
|
-
|
|
146
|
+
const includeActivePrompt = activeUserIndex < 0 &&
|
|
147
|
+
!(latestNativeMessage?.role === "user" && latestNativeMessage.text === activeTurn.prompt);
|
|
148
|
+
const bounded = boundedActiveMessages(activeTurn.messages, Math.max(0, limit - (includeActivePrompt ? 1 : 0)), Math.max(0, SESSION_HISTORY_CHARACTER_LIMIT - (includeActivePrompt ? activeTurn.prompt.length : 0)));
|
|
149
|
+
const activeMessages = [
|
|
150
|
+
...(includeActivePrompt ? [{ role: "user", text: activeTurn.prompt }] : []),
|
|
151
|
+
...bounded.messages,
|
|
152
|
+
];
|
|
133
153
|
let historicalMessageCount = 0;
|
|
134
|
-
let remainingCharacters = SESSION_HISTORY_CHARACTER_LIMIT -
|
|
135
|
-
activeText.length -
|
|
136
|
-
activeMessageOverhead -
|
|
137
|
-
activeStructuredCharacters -
|
|
138
|
-
(activeMessages.length === completeActiveMessages.length ? activeTurn.prompt.length : 0);
|
|
154
|
+
let remainingCharacters = SESSION_HISTORY_CHARACTER_LIMIT - bounded.characters - (includeActivePrompt ? activeTurn.prompt.length : 0);
|
|
139
155
|
const historicalMessageLimit = Math.max(0, limit - activeMessages.length);
|
|
140
156
|
for (let index = history.messages.length - 1; index >= 0 && historicalMessageCount < historicalMessageLimit; index -= 1) {
|
|
141
157
|
const message = history.messages[index];
|
|
@@ -162,7 +178,7 @@ export function paginateLiveSessionHistory(history, activeTurn, sessionId, curso
|
|
|
162
178
|
return {
|
|
163
179
|
...page,
|
|
164
180
|
messages: [...page.messages, ...activeMessages],
|
|
165
|
-
truncated: page.truncated || activeTurn.truncated ||
|
|
181
|
+
truncated: page.truncated || activeTurn.truncated || bounded.truncated,
|
|
166
182
|
};
|
|
167
183
|
}
|
|
168
184
|
export function mergeLiveSessionHistory(history, activeTurn, sessionId) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"live-history-page.js","sourceRoot":"","sources":["../../src/native-sessions/live-history-page.ts"],"names":[],"mappings":"AAAA,OAAO,EAIH,+BAA+B,GAClC,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"live-history-page.js","sourceRoot":"","sources":["../../src/native-sessions/live-history-page.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { AcpActivity, AcpActivityNarration } from "../acp/activity.ts";
|
|
2
|
+
import type { DaemonTimer } from "./timer.ts";
|
|
3
|
+
export declare const AGENT_EVENT_COALESCING_MILLISECONDS = 100;
|
|
4
|
+
export declare const AGENT_EVENT_TEXT_MAXIMUM_LENGTH = 100000;
|
|
5
|
+
export type BufferedAgentEvent = {
|
|
6
|
+
readonly kind: "activity";
|
|
7
|
+
readonly activity: AcpActivity;
|
|
8
|
+
} | {
|
|
9
|
+
readonly kind: "narration";
|
|
10
|
+
readonly increment: AcpActivityNarration;
|
|
11
|
+
} | {
|
|
12
|
+
readonly kind: "text";
|
|
13
|
+
readonly messageId: string;
|
|
14
|
+
readonly text: string;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Coalesces the Agent callback stream without splitting it into independently
|
|
18
|
+
* timed channels. Entries stay in callback order, and only compatible adjacent
|
|
19
|
+
* entries are combined. Activity updates therefore cannot let later text pass
|
|
20
|
+
* an earlier tool boundary, while repeated updates still avoid saturating the
|
|
21
|
+
* Relay connection.
|
|
22
|
+
*/
|
|
23
|
+
export declare class CoalescingAgentEventPublisher {
|
|
24
|
+
#private;
|
|
25
|
+
constructor(timer: DaemonTimer, publish: (event: BufferedAgentEvent) => void);
|
|
26
|
+
readonly flush: () => void;
|
|
27
|
+
readonly recordActivity: (activity: AcpActivity) => Promise<void>;
|
|
28
|
+
readonly recordNarration: (increment: AcpActivityNarration) => Promise<void>;
|
|
29
|
+
readonly recordText: (text: string, messageId: string) => Promise<void>;
|
|
30
|
+
private schedule;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=coalescing-agent-event-publisher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coalescing-agent-event-publisher.d.ts","sourceRoot":"","sources":["../../src/relay-connection/coalescing-agent-event-publisher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,KAAK,EAAuB,WAAW,EAAE,MAAM,YAAY,CAAC;AAEnE,eAAO,MAAM,mCAAmC,MAAM,CAAC;AACvD,eAAO,MAAM,+BAA+B,SAAU,CAAC;AAEvD,MAAM,MAAM,kBAAkB,GACxB;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAA;CAAE,GAC7D;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,oBAAoB,CAAA;CAAE,GACxE;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnF;;;;;;GAMG;AACH,qBAAa,6BAA6B;;IAOtC,YAAY,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,EAG3E;IAED,QAAQ,CAAC,KAAK,QAAO,IAAI,CAQvB;IAEF,QAAQ,CAAC,cAAc,aAAc,WAAW,KAAG,OAAO,CAAC,IAAI,CAAC,CAe9D;IAEF,QAAQ,CAAC,eAAe,cAAe,oBAAoB,KAAG,OAAO,CAAC,IAAI,CAAC,CAmCzE;IAEF,QAAQ,CAAC,UAAU,SAAU,MAAM,aAAa,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC,CA8BpE;IAEF,OAAO,CAAC,QAAQ;CAGnB"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
export const AGENT_EVENT_COALESCING_MILLISECONDS = 100;
|
|
2
|
+
export const AGENT_EVENT_TEXT_MAXIMUM_LENGTH = 100_000;
|
|
3
|
+
/**
|
|
4
|
+
* Coalesces the Agent callback stream without splitting it into independently
|
|
5
|
+
* timed channels. Entries stay in callback order, and only compatible adjacent
|
|
6
|
+
* entries are combined. Activity updates therefore cannot let later text pass
|
|
7
|
+
* an earlier tool boundary, while repeated updates still avoid saturating the
|
|
8
|
+
* Relay connection.
|
|
9
|
+
*/
|
|
10
|
+
export class CoalescingAgentEventPublisher {
|
|
11
|
+
#entries = [];
|
|
12
|
+
#publish;
|
|
13
|
+
#publishedActivityIds = new Set();
|
|
14
|
+
#scheduled = null;
|
|
15
|
+
#timer;
|
|
16
|
+
constructor(timer, publish) {
|
|
17
|
+
this.#publish = publish;
|
|
18
|
+
this.#timer = timer;
|
|
19
|
+
}
|
|
20
|
+
flush = () => {
|
|
21
|
+
this.#scheduled?.cancel();
|
|
22
|
+
this.#scheduled = null;
|
|
23
|
+
const entries = this.#entries;
|
|
24
|
+
this.#entries = [];
|
|
25
|
+
for (const entry of entries) {
|
|
26
|
+
this.#publish(entry);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
recordActivity = (activity) => {
|
|
30
|
+
const latest = this.#entries.at(-1);
|
|
31
|
+
this.#entries =
|
|
32
|
+
latest?.kind === "activity" && latest.activity.activityId === activity.activityId
|
|
33
|
+
? [...this.#entries.slice(0, -1), { activity, kind: "activity" }]
|
|
34
|
+
: [...this.#entries, { activity, kind: "activity" }];
|
|
35
|
+
const first = !this.#publishedActivityIds.has(activity.activityId);
|
|
36
|
+
this.#publishedActivityIds.add(activity.activityId);
|
|
37
|
+
if (first || (activity.status !== "pending" && activity.status !== "running")) {
|
|
38
|
+
this.flush();
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
this.schedule();
|
|
42
|
+
}
|
|
43
|
+
return Promise.resolve();
|
|
44
|
+
};
|
|
45
|
+
recordNarration = (increment) => {
|
|
46
|
+
if (increment.text.length === 0) {
|
|
47
|
+
return Promise.resolve();
|
|
48
|
+
}
|
|
49
|
+
let remaining = increment.text;
|
|
50
|
+
while (remaining.length > 0) {
|
|
51
|
+
const latest = this.#entries.at(-1);
|
|
52
|
+
if (latest?.kind === "narration" && latest.increment.activityId === increment.activityId) {
|
|
53
|
+
const available = AGENT_EVENT_TEXT_MAXIMUM_LENGTH - latest.increment.text.length;
|
|
54
|
+
if (available > 0) {
|
|
55
|
+
this.#entries = [
|
|
56
|
+
...this.#entries.slice(0, -1),
|
|
57
|
+
{
|
|
58
|
+
increment: {
|
|
59
|
+
...increment,
|
|
60
|
+
text: `${latest.increment.text}${remaining.slice(0, available)}`,
|
|
61
|
+
},
|
|
62
|
+
kind: "narration",
|
|
63
|
+
},
|
|
64
|
+
];
|
|
65
|
+
remaining = remaining.slice(available);
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
this.#entries = [
|
|
70
|
+
...this.#entries,
|
|
71
|
+
{
|
|
72
|
+
increment: { ...increment, text: remaining.slice(0, AGENT_EVENT_TEXT_MAXIMUM_LENGTH) },
|
|
73
|
+
kind: "narration",
|
|
74
|
+
},
|
|
75
|
+
];
|
|
76
|
+
remaining = remaining.slice(AGENT_EVENT_TEXT_MAXIMUM_LENGTH);
|
|
77
|
+
}
|
|
78
|
+
this.schedule();
|
|
79
|
+
return Promise.resolve();
|
|
80
|
+
};
|
|
81
|
+
recordText = (text, messageId) => {
|
|
82
|
+
if (text.length === 0) {
|
|
83
|
+
return Promise.resolve();
|
|
84
|
+
}
|
|
85
|
+
let remaining = text;
|
|
86
|
+
while (remaining.length > 0) {
|
|
87
|
+
const latest = this.#entries.at(-1);
|
|
88
|
+
if (latest?.kind === "text" && latest.messageId === messageId) {
|
|
89
|
+
const available = AGENT_EVENT_TEXT_MAXIMUM_LENGTH - latest.text.length;
|
|
90
|
+
if (available > 0) {
|
|
91
|
+
this.#entries = [
|
|
92
|
+
...this.#entries.slice(0, -1),
|
|
93
|
+
{ ...latest, text: `${latest.text}${remaining.slice(0, available)}` },
|
|
94
|
+
];
|
|
95
|
+
remaining = remaining.slice(available);
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
this.#entries = [
|
|
100
|
+
...this.#entries,
|
|
101
|
+
{
|
|
102
|
+
kind: "text",
|
|
103
|
+
messageId,
|
|
104
|
+
text: remaining.slice(0, AGENT_EVENT_TEXT_MAXIMUM_LENGTH),
|
|
105
|
+
},
|
|
106
|
+
];
|
|
107
|
+
remaining = remaining.slice(AGENT_EVENT_TEXT_MAXIMUM_LENGTH);
|
|
108
|
+
}
|
|
109
|
+
this.schedule();
|
|
110
|
+
return Promise.resolve();
|
|
111
|
+
};
|
|
112
|
+
schedule() {
|
|
113
|
+
this.#scheduled ??= this.#timer.schedule(this.flush, AGENT_EVENT_COALESCING_MILLISECONDS);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=coalescing-agent-event-publisher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coalescing-agent-event-publisher.js","sourceRoot":"","sources":["../../src/relay-connection/coalescing-agent-event-publisher.ts"],"names":[],"mappings":"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"}
|