@moxxy/sdk 0.43.0 → 0.45.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/dist/agent-account-limit.d.ts +41 -0
- package/dist/agent-account-limit.d.ts.map +1 -0
- package/dist/agent-account-limit.js +64 -0
- package/dist/agent-account-limit.js.map +1 -0
- package/dist/agent-computer-use.d.ts +10 -0
- package/dist/agent-computer-use.d.ts.map +1 -0
- package/dist/agent-computer-use.js +24 -0
- package/dist/agent-computer-use.js.map +1 -0
- package/dist/agent-context-window.d.ts +22 -0
- package/dist/agent-context-window.d.ts.map +1 -0
- package/dist/agent-context-window.js +40 -0
- package/dist/agent-context-window.js.map +1 -0
- package/dist/agent-no-reply.d.ts +11 -0
- package/dist/agent-no-reply.d.ts.map +1 -0
- package/dist/agent-no-reply.js +13 -0
- package/dist/agent-no-reply.js.map +1 -0
- package/dist/agent-step.d.ts +14 -0
- package/dist/agent-step.d.ts.map +1 -0
- package/dist/agent-step.js +26 -0
- package/dist/agent-step.js.map +1 -0
- package/dist/agent-work.d.ts +34 -0
- package/dist/agent-work.d.ts.map +1 -0
- package/dist/agent-work.js +80 -0
- package/dist/agent-work.js.map +1 -0
- package/dist/attachment-payload.d.ts +95 -0
- package/dist/attachment-payload.d.ts.map +1 -0
- package/dist/attachment-payload.js +155 -0
- package/dist/attachment-payload.js.map +1 -0
- package/dist/auto-approve.d.ts +9 -0
- package/dist/auto-approve.d.ts.map +1 -1
- package/dist/auto-approve.js +18 -0
- package/dist/auto-approve.js.map +1 -1
- package/dist/channel-auth.d.ts +3 -3
- package/dist/channel-auth.d.ts.map +1 -1
- package/dist/channel-auth.js +1 -1
- package/dist/channel.d.ts +1 -1
- package/dist/client-session.d.ts +9 -5
- package/dist/client-session.d.ts.map +1 -1
- package/dist/computer-control.d.ts +11 -11
- package/dist/computer-control.d.ts.map +1 -1
- package/dist/computer-control.js +1 -1
- package/dist/computer-control.js.map +1 -1
- package/dist/conversation-history.d.ts +50 -0
- package/dist/conversation-history.d.ts.map +1 -0
- package/dist/conversation-history.js +227 -0
- package/dist/conversation-history.js.map +1 -0
- package/dist/cron.d.ts +58 -0
- package/dist/cron.d.ts.map +1 -0
- package/dist/cron.js +320 -0
- package/dist/cron.js.map +1 -0
- package/dist/define.d.ts +2 -1
- package/dist/define.d.ts.map +1 -1
- package/dist/define.js +1 -0
- package/dist/define.js.map +1 -1
- package/dist/event-store.d.ts +1 -1
- package/dist/event-store.d.ts.map +1 -1
- package/dist/event-store.js +1 -0
- package/dist/event-store.js.map +1 -1
- package/dist/events.d.ts +23 -1
- package/dist/events.d.ts.map +1 -1
- package/dist/file-diff.d.ts +31 -0
- package/dist/file-diff.d.ts.map +1 -0
- package/dist/file-diff.js +196 -0
- package/dist/file-diff.js.map +1 -0
- package/dist/index.d.ts +23 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -4
- package/dist/index.js.map +1 -1
- package/dist/mode/agent-step-loop.d.ts +13 -0
- package/dist/mode/agent-step-loop.d.ts.map +1 -0
- package/dist/mode/agent-step-loop.js +578 -0
- package/dist/mode/agent-step-loop.js.map +1 -0
- package/dist/mode/checkpoint-gate.d.ts +25 -0
- package/dist/mode/checkpoint-gate.d.ts.map +1 -0
- package/dist/mode/checkpoint-gate.js +150 -0
- package/dist/mode/checkpoint-gate.js.map +1 -0
- package/dist/mode/checkpoint.d.ts +6 -0
- package/dist/mode/checkpoint.d.ts.map +1 -1
- package/dist/mode/collect-stream.d.ts +2 -0
- package/dist/mode/collect-stream.d.ts.map +1 -1
- package/dist/mode/collect-stream.js +1 -1
- package/dist/mode/collect-stream.js.map +1 -1
- package/dist/mode/project-messages.d.ts +3 -1
- package/dist/mode/project-messages.d.ts.map +1 -1
- package/dist/mode/project-messages.js +122 -81
- package/dist/mode/project-messages.js.map +1 -1
- package/dist/mode/react-loop-options.d.ts +113 -0
- package/dist/mode/react-loop-options.d.ts.map +1 -0
- package/dist/mode/react-loop-options.js +2 -0
- package/dist/mode/react-loop-options.js.map +1 -0
- package/dist/mode/react-loop.d.ts +2 -99
- package/dist/mode/react-loop.d.ts.map +1 -1
- package/dist/mode/react-loop.js +7 -145
- package/dist/mode/react-loop.js.map +1 -1
- package/dist/mode.d.ts +19 -7
- package/dist/mode.d.ts.map +1 -1
- package/dist/mode.js +1 -1
- package/dist/mode.js.map +1 -1
- package/dist/npm-registry.d.ts +22 -0
- package/dist/npm-registry.d.ts.map +1 -0
- package/dist/npm-registry.js +54 -0
- package/dist/npm-registry.js.map +1 -0
- package/dist/permission.d.ts +31 -0
- package/dist/permission.d.ts.map +1 -1
- package/dist/process-invocation.d.ts +2 -0
- package/dist/process-invocation.d.ts.map +1 -1
- package/dist/process-invocation.js +2 -2
- package/dist/process-invocation.js.map +1 -1
- package/dist/process-tree.d.ts +9 -0
- package/dist/process-tree.d.ts.map +1 -0
- package/dist/process-tree.js +40 -0
- package/dist/process-tree.js.map +1 -0
- package/dist/provider-login-bridge.js +1 -1
- package/dist/provider-login-bridge.js.map +1 -1
- package/dist/provider.d.ts +408 -0
- package/dist/provider.d.ts.map +1 -1
- package/dist/question-draft.d.ts +19 -0
- package/dist/question-draft.d.ts.map +1 -0
- package/dist/question-draft.js +30 -0
- package/dist/question-draft.js.map +1 -0
- package/dist/question.d.ts +204 -0
- package/dist/question.d.ts.map +1 -0
- package/dist/question.js +141 -0
- package/dist/question.js.map +1 -0
- package/dist/questions.d.ts +7 -0
- package/dist/questions.d.ts.map +1 -0
- package/dist/questions.js +7 -0
- package/dist/questions.js.map +1 -0
- package/dist/resolvers.d.ts +14 -1
- package/dist/resolvers.d.ts.map +1 -1
- package/dist/resolvers.js +33 -21
- package/dist/resolvers.js.map +1 -1
- package/dist/schemas.d.ts +53 -53
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +3 -2
- package/dist/schemas.js.map +1 -1
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +3 -0
- package/dist/server.js.map +1 -1
- package/dist/session-like.d.ts +19 -1
- package/dist/session-like.d.ts.map +1 -1
- package/dist/starting-model.d.ts +12 -0
- package/dist/starting-model.d.ts.map +1 -0
- package/dist/starting-model.js +9 -0
- package/dist/starting-model.js.map +1 -0
- package/dist/tool-dispatch.d.ts.map +1 -1
- package/dist/tool-dispatch.js +10 -4
- package/dist/tool-dispatch.js.map +1 -1
- package/dist/tool-display.d.ts +79 -3
- package/dist/tool-display.d.ts.map +1 -1
- package/dist/tool-display.js +117 -3
- package/dist/tool-display.js.map +1 -1
- package/dist/tool-modes.d.ts +1 -1
- package/dist/tool-modes.d.ts.map +1 -1
- package/dist/tool-modes.js +8 -2
- package/dist/tool-modes.js.map +1 -1
- package/dist/tool-output.d.ts +15 -0
- package/dist/tool-output.d.ts.map +1 -0
- package/dist/tool-output.js +39 -0
- package/dist/tool-output.js.map +1 -0
- package/dist/tool.d.ts +14 -1
- package/dist/tool.d.ts.map +1 -1
- package/dist/tunnel.d.ts +3 -3
- package/dist/tunnel.d.ts.map +1 -1
- package/dist/tunnel.js +2 -2
- package/dist/workflow-approval.d.ts +9 -9
- package/dist/workflow-approval.d.ts.map +1 -1
- package/dist/workflow-approval.js +1 -1
- package/dist/workflow-approval.js.map +1 -1
- package/package.json +37 -5
- package/src/agent-account-limit.test.ts +87 -0
- package/src/agent-account-limit.ts +89 -0
- package/src/agent-computer-use.test.ts +26 -0
- package/src/agent-computer-use.ts +29 -0
- package/src/agent-context-window.ts +51 -0
- package/src/agent-no-reply.ts +16 -0
- package/src/agent-step.ts +26 -0
- package/src/agent-work.ts +102 -0
- package/src/attachment-payload.test.ts +165 -0
- package/src/attachment-payload.ts +187 -0
- package/src/auto-approve.test.ts +13 -1
- package/src/auto-approve.ts +19 -0
- package/src/channel-auth.ts +3 -3
- package/src/channel.ts +1 -1
- package/src/client-session.ts +9 -2
- package/src/computer-control.ts +1 -1
- package/src/conversation-history.test.ts +184 -0
- package/src/conversation-history.ts +272 -0
- package/src/cron.test.ts +280 -0
- package/src/cron.ts +355 -0
- package/src/define.test.ts +1 -1
- package/src/define.ts +3 -1
- package/src/event-store.ts +2 -1
- package/src/events.ts +23 -1
- package/src/file-diff.test.ts +103 -0
- package/src/file-diff.ts +208 -0
- package/src/index.ts +140 -1
- package/src/json-file-store.test.ts +1 -1
- package/src/loop-helpers.test.ts +15 -0
- package/src/mode/agent-step-loop.ts +645 -0
- package/src/mode/checkpoint-gate.ts +198 -0
- package/src/mode/checkpoint.ts +6 -0
- package/src/mode/collect-stream.ts +1 -1
- package/src/mode/project-messages.test.ts +118 -1
- package/src/mode/project-messages.ts +136 -77
- package/src/mode/react-loop-options.ts +124 -0
- package/src/mode/react-loop.ts +10 -296
- package/src/mode.ts +19 -7
- package/src/npm-registry.test.ts +95 -0
- package/src/npm-registry.ts +57 -0
- package/src/permission.ts +30 -0
- package/src/process-invocation.test.ts +25 -0
- package/src/process-invocation.ts +8 -3
- package/src/process-tree.ts +37 -0
- package/src/provider-login-bridge.ts +1 -1
- package/src/provider-schema-constraints.test.ts +1 -1
- package/src/provider-utils.test.ts +1 -1
- package/src/provider.ts +346 -0
- package/src/question-draft.test.ts +57 -0
- package/src/question-draft.ts +47 -0
- package/src/question.test.ts +130 -0
- package/src/question.ts +229 -0
- package/src/questions.ts +6 -0
- package/src/resolvers.test.ts +84 -1
- package/src/resolvers.ts +40 -27
- package/src/schemas.test.ts +5 -0
- package/src/schemas.ts +3 -2
- package/src/server.ts +3 -0
- package/src/session-like.ts +19 -1
- package/src/skill-mentions.test.ts +1 -1
- package/src/starting-model.test.ts +19 -0
- package/src/starting-model.ts +11 -0
- package/src/token-efficiency.test.ts +1 -1
- package/src/tool-dispatch.ts +10 -4
- package/src/tool-display.test.ts +119 -0
- package/src/tool-display.ts +162 -4
- package/src/tool-gating.test.ts +1 -1
- package/src/tool-icon.test.ts +1 -1
- package/src/tool-modes.test.ts +18 -1
- package/src/tool-modes.ts +6 -2
- package/src/tool-output.test.ts +46 -0
- package/src/tool-output.ts +46 -0
- package/src/tool.ts +14 -1
- package/src/tunnel.ts +3 -3
- package/src/workflow-approval.ts +1 -1
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { MoxxyEvent } from './events.js';
|
|
2
|
+
/**
|
|
3
|
+
* How much of the person's account an agent connection's agent may still use, as the agent
|
|
4
|
+
* reports it (Claude's plan limits, Codex's rate limits). Recorded in the log, so every surface
|
|
5
|
+
* reads the same state.
|
|
6
|
+
*/
|
|
7
|
+
export interface AgentAccountLimit {
|
|
8
|
+
/** `reached`: the agent does no work until `resetsAt`; `near`: most of the window is used. */
|
|
9
|
+
readonly state: 'ok' | 'near' | 'reached';
|
|
10
|
+
/** When the window resets, in epoch ms, when the agent says. */
|
|
11
|
+
readonly resetsAt?: number;
|
|
12
|
+
/** The window's length in minutes: 300 for five hours, 10080 for a week. */
|
|
13
|
+
readonly windowMinutes?: number;
|
|
14
|
+
/** How much of the window is used, 0–100. */
|
|
15
|
+
readonly usedPercent?: number;
|
|
16
|
+
}
|
|
17
|
+
/** From how much of a window a limit counts as near, for an agent that does not say so itself (Claude warns from 75%). */
|
|
18
|
+
export declare const ACCOUNT_LIMIT_NEAR_PERCENT = 75;
|
|
19
|
+
/** Where an agent connection records its agent's account limit, under `AGENT_CONNECTION_PLUGIN_ID`. */
|
|
20
|
+
export declare const AGENT_ACCOUNT_LIMIT_SUBTYPE = "account_limit";
|
|
21
|
+
export interface RecordedAccountLimit {
|
|
22
|
+
readonly provider: string;
|
|
23
|
+
/** The agent's name ("Claude", "Codex"), for the surfaces to say whose limit it is. */
|
|
24
|
+
readonly agent?: string;
|
|
25
|
+
readonly limit: AgentAccountLimit;
|
|
26
|
+
}
|
|
27
|
+
/** The last account limit recorded for the provider. */
|
|
28
|
+
export declare function recordedAccountLimit(events: ReadonlyArray<MoxxyEvent>, provider: string): RecordedAccountLimit | undefined;
|
|
29
|
+
/** The limit a plugin event records, or undefined when it records something else. */
|
|
30
|
+
export declare function accountLimitOfEvent(event: MoxxyEvent): RecordedAccountLimit | undefined;
|
|
31
|
+
/** A near or reached limit, until its window resets; a limit with room left says nothing. */
|
|
32
|
+
export declare function accountLimitInForce(recorded: RecordedAccountLimit | undefined, nowMs: number): RecordedAccountLimit | undefined;
|
|
33
|
+
/** Whether two reports would read the same to the person: whole percents, the reset to the minute. */
|
|
34
|
+
export declare function sameAccountLimit(a: AgentAccountLimit | undefined, b: AgentAccountLimit): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* A used-up limit the agent reports without its reset (Claude Code's own
|
|
37
|
+
* "You've hit your limit" when its process already said when it resets) keeps
|
|
38
|
+
* the reset known before, while that still lies ahead.
|
|
39
|
+
*/
|
|
40
|
+
export declare function withKnownReset(reading: AgentAccountLimit, known: AgentAccountLimit | undefined, nowMs: number): AgentAccountLimit;
|
|
41
|
+
//# sourceMappingURL=agent-account-limit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-account-limit.d.ts","sourceRoot":"","sources":["../src/agent-account-limit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,8FAA8F;IAC9F,QAAQ,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC;IAC1C,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,4EAA4E;IAC5E,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,6CAA6C;IAC7C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,0HAA0H;AAC1H,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAE7C,uGAAuG;AACvG,eAAO,MAAM,2BAA2B,kBAAkB,CAAC;AAE3D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,uFAAuF;IACvF,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;CACnC;AAED,wDAAwD;AACxD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS,CAS1H;AAED,qFAAqF;AACrF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,GAAG,oBAAoB,GAAG,SAAS,CAIvF;AAUD,6FAA6F;AAC7F,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS,CAI/H;AAED,sGAAsG;AACtG,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,iBAAiB,GAAG,SAAS,EAAE,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAUhG;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,iBAAiB,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,iBAAiB,CAIjI"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { AGENT_CONNECTION_PLUGIN_ID } from './agent-step.js';
|
|
2
|
+
/** From how much of a window a limit counts as near, for an agent that does not say so itself (Claude warns from 75%). */
|
|
3
|
+
export const ACCOUNT_LIMIT_NEAR_PERCENT = 75;
|
|
4
|
+
/** Where an agent connection records its agent's account limit, under `AGENT_CONNECTION_PLUGIN_ID`. */
|
|
5
|
+
export const AGENT_ACCOUNT_LIMIT_SUBTYPE = 'account_limit';
|
|
6
|
+
/** The last account limit recorded for the provider. */
|
|
7
|
+
export function recordedAccountLimit(events, provider) {
|
|
8
|
+
for (let i = events.length - 1; i >= 0; i -= 1) {
|
|
9
|
+
const event = events[i];
|
|
10
|
+
if (!event || event.type !== 'plugin_event')
|
|
11
|
+
continue;
|
|
12
|
+
if (event.pluginId !== AGENT_CONNECTION_PLUGIN_ID || event.subtype !== AGENT_ACCOUNT_LIMIT_SUBTYPE)
|
|
13
|
+
continue;
|
|
14
|
+
const payload = event.payload;
|
|
15
|
+
if (payload && payload.provider === provider && payload.limit)
|
|
16
|
+
return accountLimitPayload(payload);
|
|
17
|
+
}
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
/** The limit a plugin event records, or undefined when it records something else. */
|
|
21
|
+
export function accountLimitOfEvent(event) {
|
|
22
|
+
if (event.type !== 'plugin_event' || event.pluginId !== AGENT_CONNECTION_PLUGIN_ID || event.subtype !== AGENT_ACCOUNT_LIMIT_SUBTYPE)
|
|
23
|
+
return undefined;
|
|
24
|
+
const payload = event.payload;
|
|
25
|
+
return payload && typeof payload.provider === 'string' && payload.limit ? accountLimitPayload(payload) : undefined;
|
|
26
|
+
}
|
|
27
|
+
function accountLimitPayload(payload) {
|
|
28
|
+
return {
|
|
29
|
+
provider: String(payload.provider),
|
|
30
|
+
...(typeof payload.agent === 'string' ? { agent: payload.agent } : {}),
|
|
31
|
+
limit: payload.limit,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/** A near or reached limit, until its window resets; a limit with room left says nothing. */
|
|
35
|
+
export function accountLimitInForce(recorded, nowMs) {
|
|
36
|
+
if (!recorded || recorded.limit.state === 'ok')
|
|
37
|
+
return undefined;
|
|
38
|
+
const { resetsAt } = recorded.limit;
|
|
39
|
+
return resetsAt !== undefined && resetsAt <= nowMs ? undefined : recorded;
|
|
40
|
+
}
|
|
41
|
+
/** Whether two reports would read the same to the person: whole percents, the reset to the minute. */
|
|
42
|
+
export function sameAccountLimit(a, b) {
|
|
43
|
+
if (!a)
|
|
44
|
+
return false;
|
|
45
|
+
const minute = (ms) => (ms === undefined ? undefined : Math.round(ms / 60_000));
|
|
46
|
+
const percent = (p) => (p === undefined ? undefined : Math.floor(p));
|
|
47
|
+
return (a.state === b.state &&
|
|
48
|
+
a.windowMinutes === b.windowMinutes &&
|
|
49
|
+
minute(a.resetsAt) === minute(b.resetsAt) &&
|
|
50
|
+
percent(a.usedPercent) === percent(b.usedPercent));
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* A used-up limit the agent reports without its reset (Claude Code's own
|
|
54
|
+
* "You've hit your limit" when its process already said when it resets) keeps
|
|
55
|
+
* the reset known before, while that still lies ahead.
|
|
56
|
+
*/
|
|
57
|
+
export function withKnownReset(reading, known, nowMs) {
|
|
58
|
+
if (reading.state !== 'reached' || reading.resetsAt !== undefined)
|
|
59
|
+
return reading;
|
|
60
|
+
if (!known || known.resetsAt === undefined || known.resetsAt <= nowMs)
|
|
61
|
+
return reading;
|
|
62
|
+
return { ...reading, resetsAt: known.resetsAt, ...(known.windowMinutes !== undefined && reading.windowMinutes === undefined ? { windowMinutes: known.windowMinutes } : {}) };
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=agent-account-limit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-account-limit.js","sourceRoot":"","sources":["../src/agent-account-limit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether a tool call an agent connection ran itself operates the person's computer, recognised
|
|
3
|
+
* by the tool's name, so every surface can say the agent is using the computer and offer Stop.
|
|
4
|
+
*/
|
|
5
|
+
export interface AgentComputerUse {
|
|
6
|
+
/** The app the call names, `null` when it names none (listing apps, a screenshot of the screen). */
|
|
7
|
+
readonly app: string | null;
|
|
8
|
+
}
|
|
9
|
+
export declare function agentComputerUseOf(name: string, input: unknown): AgentComputerUse | undefined;
|
|
10
|
+
//# sourceMappingURL=agent-computer-use.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-computer-use.d.ts","sourceRoot":"","sources":["../src/agent-computer-use.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,oGAAoG;IACpG,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAYD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,gBAAgB,GAAG,SAAS,CAQ7F"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether a tool call an agent connection ran itself operates the person's computer, recognised
|
|
3
|
+
* by the tool's name, so every surface can say the agent is using the computer and offer Stop.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* A computer-use MCP server's tools, which drive the person's apps: `mcp__computer-use__click` from
|
|
7
|
+
* Claude Code and Codex, `computer-use_click` from OpenCode (which names MCP tools `server_tool`).
|
|
8
|
+
*/
|
|
9
|
+
const COMPUTER_SERVERS = /^(?:mcp__)?computer[-_]use_/;
|
|
10
|
+
/** Codex's computer use as JavaScript against its `cua` API; the same API also drives Codex's own browser. */
|
|
11
|
+
const CUA_JS = 'mcp__cua_repl__js';
|
|
12
|
+
const CUA_APPS = /\bcua\.(getApp|getState|listApps|listWindows)\s*\(/;
|
|
13
|
+
const CUA_APP_NAME = /\bcua\.getApp\(\s*['"`]([^'"`]+)['"`]/;
|
|
14
|
+
export function agentComputerUseOf(name, input) {
|
|
15
|
+
const fields = typeof input === 'object' && input !== null ? input : {};
|
|
16
|
+
if (COMPUTER_SERVERS.test(name)) {
|
|
17
|
+
return { app: typeof fields.app === 'string' && fields.app.length > 0 ? fields.app : null };
|
|
18
|
+
}
|
|
19
|
+
if (name !== CUA_JS || typeof fields.code !== 'string' || !CUA_APPS.test(fields.code))
|
|
20
|
+
return undefined;
|
|
21
|
+
const named = CUA_APP_NAME.exec(fields.code);
|
|
22
|
+
return { app: named && named[1] ? named[1] : null };
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=agent-computer-use.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-computer-use.js","sourceRoot":"","sources":["../src/agent-computer-use.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH;;;GAGG;AACH,MAAM,gBAAgB,GAAG,6BAA6B,CAAC;AACvD,8GAA8G;AAC9G,MAAM,MAAM,GAAG,mBAAmB,CAAC;AACnC,MAAM,QAAQ,GAAG,oDAAoD,CAAC;AACtE,MAAM,YAAY,GAAG,uCAAuC,CAAC;AAE7D,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,KAAc;IAC7D,MAAM,MAAM,GAAG,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAE,KAAiC,CAAC,CAAC,CAAC,EAAE,CAAC;IACrG,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,GAAG,EAAE,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9F,CAAC;IACD,IAAI,IAAI,KAAK,MAAM,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACxG,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7C,OAAO,EAAE,GAAG,EAAE,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { MoxxyEvent } from './events.js';
|
|
2
|
+
import type { ModelDescriptor } from './provider.js';
|
|
3
|
+
/**
|
|
4
|
+
* Where an agent connection records the context window its agent reports for a model
|
|
5
|
+
* (Codex's `modelContextWindow`, Claude's `modelUsage.contextWindow`), under
|
|
6
|
+
* `AGENT_CONNECTION_PLUGIN_ID`. It replaces the starting window from the model list,
|
|
7
|
+
* so every surface shows the window the agent really runs with.
|
|
8
|
+
*/
|
|
9
|
+
export declare const AGENT_CONTEXT_WINDOW_SUBTYPE = "context_window";
|
|
10
|
+
export interface RecordedContextWindow {
|
|
11
|
+
readonly provider: string;
|
|
12
|
+
readonly model: string;
|
|
13
|
+
readonly tokens: number;
|
|
14
|
+
}
|
|
15
|
+
export declare function isContextWindowSize(tokens: unknown): tokens is number;
|
|
16
|
+
/** The window an event records, or undefined when it records something else. */
|
|
17
|
+
export declare function contextWindowOfEvent(event: MoxxyEvent): RecordedContextWindow | undefined;
|
|
18
|
+
/** The last window recorded for each model of the provider. */
|
|
19
|
+
export declare function recordedContextWindows(events: ReadonlyArray<MoxxyEvent>, provider: string): ReadonlyMap<string, number>;
|
|
20
|
+
/** The models with the windows the agent reported in place of their starting ones. */
|
|
21
|
+
export declare function withRecordedContextWindows(models: ReadonlyArray<ModelDescriptor>, windows: ReadonlyMap<string, number>): ReadonlyArray<ModelDescriptor>;
|
|
22
|
+
//# sourceMappingURL=agent-context-window.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-context-window.d.ts","sourceRoot":"","sources":["../src/agent-context-window.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,mBAAmB,CAAC;AAE7D,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,MAAM,CAErE;AAED,gFAAgF;AAChF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,UAAU,GAAG,qBAAqB,GAAG,SAAS,CAKzF;AAED,+DAA+D;AAC/D,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAOvH;AAED,sFAAsF;AACtF,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,aAAa,CAAC,eAAe,CAAC,EACtC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,aAAa,CAAC,eAAe,CAAC,CAMhC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { AGENT_CONNECTION_PLUGIN_ID } from './agent-step.js';
|
|
2
|
+
/**
|
|
3
|
+
* Where an agent connection records the context window its agent reports for a model
|
|
4
|
+
* (Codex's `modelContextWindow`, Claude's `modelUsage.contextWindow`), under
|
|
5
|
+
* `AGENT_CONNECTION_PLUGIN_ID`. It replaces the starting window from the model list,
|
|
6
|
+
* so every surface shows the window the agent really runs with.
|
|
7
|
+
*/
|
|
8
|
+
export const AGENT_CONTEXT_WINDOW_SUBTYPE = 'context_window';
|
|
9
|
+
export function isContextWindowSize(tokens) {
|
|
10
|
+
return typeof tokens === 'number' && Number.isSafeInteger(tokens) && tokens > 0;
|
|
11
|
+
}
|
|
12
|
+
/** The window an event records, or undefined when it records something else. */
|
|
13
|
+
export function contextWindowOfEvent(event) {
|
|
14
|
+
if (event.type !== 'plugin_event' || event.pluginId !== AGENT_CONNECTION_PLUGIN_ID || event.subtype !== AGENT_CONTEXT_WINDOW_SUBTYPE)
|
|
15
|
+
return undefined;
|
|
16
|
+
const payload = event.payload;
|
|
17
|
+
if (!payload || typeof payload.provider !== 'string' || typeof payload.model !== 'string' || !isContextWindowSize(payload.tokens))
|
|
18
|
+
return undefined;
|
|
19
|
+
return { provider: payload.provider, model: payload.model, tokens: payload.tokens };
|
|
20
|
+
}
|
|
21
|
+
/** The last window recorded for each model of the provider. */
|
|
22
|
+
export function recordedContextWindows(events, provider) {
|
|
23
|
+
const windows = new Map();
|
|
24
|
+
for (const event of events) {
|
|
25
|
+
const recorded = contextWindowOfEvent(event);
|
|
26
|
+
if (recorded && recorded.provider === provider)
|
|
27
|
+
windows.set(recorded.model, recorded.tokens);
|
|
28
|
+
}
|
|
29
|
+
return windows;
|
|
30
|
+
}
|
|
31
|
+
/** The models with the windows the agent reported in place of their starting ones. */
|
|
32
|
+
export function withRecordedContextWindows(models, windows) {
|
|
33
|
+
if (windows.size === 0)
|
|
34
|
+
return models;
|
|
35
|
+
return models.map((model) => {
|
|
36
|
+
const tokens = windows.get(model.id);
|
|
37
|
+
return tokens === undefined || tokens === model.contextWindow ? model : { ...model, contextWindow: tokens };
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=agent-context-window.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-context-window.js","sourceRoot":"","sources":["../src/agent-context-window.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAI7D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,gBAAgB,CAAC;AAQ7D,MAAM,UAAU,mBAAmB,CAAC,MAAe;IACjD,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC;AAClF,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,oBAAoB,CAAC,KAAiB;IACpD,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,QAAQ,KAAK,0BAA0B,IAAI,KAAK,CAAC,OAAO,KAAK,4BAA4B;QAAE,OAAO,SAAS,CAAC;IACvJ,MAAM,OAAO,GAAG,KAAK,CAAC,OAAgD,CAAC;IACvE,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IACpJ,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;AACtF,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,sBAAsB,CAAC,MAAiC,EAAE,QAAgB;IACxF,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,QAAQ,IAAI,QAAQ,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/F,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,0BAA0B,CACxC,MAAsC,EACtC,OAAoC;IAEpC,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IACtC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACrC,OAAO,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;IAC9G,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { MoxxyEvent } from './events.js';
|
|
2
|
+
/**
|
|
3
|
+
* Recorded under `AGENT_CONNECTION_PLUGIN_ID` at the end of a turn the agent took up by
|
|
4
|
+
* itself ("Agent continued") in which it said nothing and ran nothing, so every surface
|
|
5
|
+
* says so instead of leaving the turn's marker alone in the chat.
|
|
6
|
+
*/
|
|
7
|
+
export declare const AGENT_NO_REPLY_SUBTYPE = "no_reply";
|
|
8
|
+
/** How every surface words the note. */
|
|
9
|
+
export declare const AGENT_NO_REPLY_TEXT = "The agent finished without replying.";
|
|
10
|
+
export declare function isAgentNoReplyEvent(event: MoxxyEvent): boolean;
|
|
11
|
+
//# sourceMappingURL=agent-no-reply.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-no-reply.d.ts","sourceRoot":"","sources":["../src/agent-no-reply.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,aAAa,CAAC;AAEjD,wCAAwC;AACxC,eAAO,MAAM,mBAAmB,yCAAyC,CAAC;AAE1E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAE9D"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { AGENT_CONNECTION_PLUGIN_ID } from './agent-step.js';
|
|
2
|
+
/**
|
|
3
|
+
* Recorded under `AGENT_CONNECTION_PLUGIN_ID` at the end of a turn the agent took up by
|
|
4
|
+
* itself ("Agent continued") in which it said nothing and ran nothing, so every surface
|
|
5
|
+
* says so instead of leaving the turn's marker alone in the chat.
|
|
6
|
+
*/
|
|
7
|
+
export const AGENT_NO_REPLY_SUBTYPE = 'no_reply';
|
|
8
|
+
/** How every surface words the note. */
|
|
9
|
+
export const AGENT_NO_REPLY_TEXT = 'The agent finished without replying.';
|
|
10
|
+
export function isAgentNoReplyEvent(event) {
|
|
11
|
+
return event.type === 'plugin_event' && event.pluginId === AGENT_CONNECTION_PLUGIN_ID && event.subtype === AGENT_NO_REPLY_SUBTYPE;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=agent-no-reply.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-no-reply.js","sourceRoot":"","sources":["../src/agent-no-reply.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAG7D;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,UAAU,CAAC;AAEjD,wCAAwC;AACxC,MAAM,CAAC,MAAM,mBAAmB,GAAG,sCAAsC,CAAC;AAE1E,MAAM,UAAU,mBAAmB,CAAC,KAAiB;IACnD,OAAO,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,QAAQ,KAAK,0BAA0B,IAAI,KAAK,CAAC,OAAO,KAAK,sBAAsB,CAAC;AACpI,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { MoxxyEvent } from './events.js';
|
|
2
|
+
/**
|
|
3
|
+
* Where an agent connection keeps the vendor agent's session in the log. The
|
|
4
|
+
* `agentStep` contract itself is part of the provider types (`provider.ts`).
|
|
5
|
+
*/
|
|
6
|
+
export declare const AGENT_CONNECTION_PLUGIN_ID: import("./ids.js").PluginId;
|
|
7
|
+
export declare const AGENT_SESSION_SUBTYPE = "agent_session";
|
|
8
|
+
/** The state of the agent's own goal (Claude `/goal`, Codex `thread/goal`), recorded after its turn. */
|
|
9
|
+
export declare const AGENT_GOAL_SUBTYPE = "goal_status";
|
|
10
|
+
/** Where subagents are recorded, the agent's own as well as Moxxy's (`@moxxy/core` writes the same envelope). */
|
|
11
|
+
export declare const SUBAGENTS_PLUGIN_ID: import("./ids.js").PluginId;
|
|
12
|
+
/** The agent session to resume for this provider: the last one recorded, if any. */
|
|
13
|
+
export declare function agentSessionFromEvents(events: ReadonlyArray<MoxxyEvent>, provider: string): string | undefined;
|
|
14
|
+
//# sourceMappingURL=agent-step.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-step.d.ts","sourceRoot":"","sources":["../src/agent-step.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9C;;;GAGG;AAEH,eAAO,MAAM,0BAA0B,6BAAwC,CAAC;AAChF,eAAO,MAAM,qBAAqB,kBAAkB,CAAC;AACrD,wGAAwG;AACxG,eAAO,MAAM,kBAAkB,gBAAgB,CAAC;AAChD,iHAAiH;AACjH,eAAO,MAAM,mBAAmB,6BAAiC,CAAC;AAElE,oFAAoF;AACpF,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAS9G"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { asPluginId } from './ids.js';
|
|
2
|
+
/**
|
|
3
|
+
* Where an agent connection keeps the vendor agent's session in the log. The
|
|
4
|
+
* `agentStep` contract itself is part of the provider types (`provider.ts`).
|
|
5
|
+
*/
|
|
6
|
+
export const AGENT_CONNECTION_PLUGIN_ID = asPluginId('@moxxy/agent-connection');
|
|
7
|
+
export const AGENT_SESSION_SUBTYPE = 'agent_session';
|
|
8
|
+
/** The state of the agent's own goal (Claude `/goal`, Codex `thread/goal`), recorded after its turn. */
|
|
9
|
+
export const AGENT_GOAL_SUBTYPE = 'goal_status';
|
|
10
|
+
/** Where subagents are recorded, the agent's own as well as Moxxy's (`@moxxy/core` writes the same envelope). */
|
|
11
|
+
export const SUBAGENTS_PLUGIN_ID = asPluginId('@moxxy/subagents');
|
|
12
|
+
/** The agent session to resume for this provider: the last one recorded, if any. */
|
|
13
|
+
export function agentSessionFromEvents(events, provider) {
|
|
14
|
+
for (let i = events.length - 1; i >= 0; i -= 1) {
|
|
15
|
+
const event = events[i];
|
|
16
|
+
if (!event || event.type !== 'plugin_event')
|
|
17
|
+
continue;
|
|
18
|
+
if (event.pluginId !== AGENT_CONNECTION_PLUGIN_ID || event.subtype !== AGENT_SESSION_SUBTYPE)
|
|
19
|
+
continue;
|
|
20
|
+
const payload = event.payload;
|
|
21
|
+
if (payload && payload.provider === provider && typeof payload.sessionId === 'string')
|
|
22
|
+
return payload.sessionId;
|
|
23
|
+
}
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=agent-step.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-step.js","sourceRoot":"","sources":["../src/agent-step.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC;;;GAGG;AAEH,MAAM,CAAC,MAAM,0BAA0B,GAAG,UAAU,CAAC,yBAAyB,CAAC,CAAC;AAChF,MAAM,CAAC,MAAM,qBAAqB,GAAG,eAAe,CAAC;AACrD,wGAAwG;AACxG,MAAM,CAAC,MAAM,kBAAkB,GAAG,aAAa,CAAC;AAChD,iHAAiH;AACjH,MAAM,CAAC,MAAM,mBAAmB,GAAG,UAAU,CAAC,kBAAkB,CAAC,CAAC;AAElE,oFAAoF;AACpF,MAAM,UAAU,sBAAsB,CAAC,MAAiC,EAAE,QAAgB;IACxF,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc;YAAE,SAAS;QACtD,IAAI,KAAK,CAAC,QAAQ,KAAK,0BAA0B,IAAI,KAAK,CAAC,OAAO,KAAK,qBAAqB;YAAE,SAAS;QACvG,MAAM,OAAO,GAAG,KAAK,CAAC,OAA6D,CAAC;QACpF,IAAI,OAAO,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ;YAAE,OAAO,OAAO,CAAC,SAAS,CAAC;IAClH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { PluginId } from './ids.js';
|
|
2
|
+
import type { MoxxyEvent } from './events.js';
|
|
3
|
+
import type { AgentStepEvent } from './provider.js';
|
|
4
|
+
/** Everything the agent runs in the background now (`AGENT_CONNECTION_PLUGIN_ID`); each record replaces the one before. */
|
|
5
|
+
export declare const AGENT_BACKGROUND_WORK_SUBTYPE = "background_work";
|
|
6
|
+
/** One background work ended (`AGENT_CONNECTION_PLUGIN_ID`), with what it printed last. */
|
|
7
|
+
export declare const AGENT_BACKGROUND_WORK_ENDED_SUBTYPE = "background_work_ended";
|
|
8
|
+
/** What a subagent said as it worked (`SUBAGENTS_PLUGIN_ID`). */
|
|
9
|
+
export declare const SUBAGENT_MESSAGE_SUBTYPE = "subagent_message";
|
|
10
|
+
/** How much of a command's output a `background_work_ended` keeps: its end, which says how it went. */
|
|
11
|
+
export declare const AGENT_WORK_OUTPUT_LIMIT = 4096;
|
|
12
|
+
/** A record of the agent's background work (its list, an end): read by the Agents pane, never drawn in the chat. */
|
|
13
|
+
export declare function isAgentWorkEvent(event: MoxxyEvent): boolean;
|
|
14
|
+
/** A record of a helper agent (its start, steps, words, end), from Moxxy's own subagents or an agent connection's. */
|
|
15
|
+
export declare function isSubagentEvent(event: MoxxyEvent): boolean;
|
|
16
|
+
/** A `plugin_event` without its envelope (session, turn, id, time). */
|
|
17
|
+
export interface AgentActivityRecord {
|
|
18
|
+
readonly source: 'plugin' | 'system';
|
|
19
|
+
readonly pluginId: PluginId;
|
|
20
|
+
readonly subtype: string;
|
|
21
|
+
readonly payload: Record<string, unknown>;
|
|
22
|
+
}
|
|
23
|
+
/** The helpers of a conversation by id, kept to name them in the records of their later events. */
|
|
24
|
+
export type SubagentNames = Map<string, {
|
|
25
|
+
readonly label: string;
|
|
26
|
+
readonly agentType: string;
|
|
27
|
+
}>;
|
|
28
|
+
/**
|
|
29
|
+
* How an agent's helpers and background work are recorded in the log, the
|
|
30
|
+
* same whether they come in a turn or between turns; `undefined` for any
|
|
31
|
+
* other event.
|
|
32
|
+
*/
|
|
33
|
+
export declare function agentActivityRecord(event: AgentStepEvent, provider: string, names: SubagentNames): AgentActivityRecord | undefined;
|
|
34
|
+
//# sourceMappingURL=agent-work.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-work.d.ts","sourceRoot":"","sources":["../src/agent-work.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,2HAA2H;AAC3H,eAAO,MAAM,6BAA6B,oBAAoB,CAAC;AAC/D,2FAA2F;AAC3F,eAAO,MAAM,mCAAmC,0BAA0B,CAAC;AAC3E,iEAAiE;AACjE,eAAO,MAAM,wBAAwB,qBAAqB,CAAC;AAC3D,uGAAuG;AACvG,eAAO,MAAM,uBAAuB,OAAO,CAAC;AAE5C,oHAAoH;AACpH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAM3D;AAED,sHAAsH;AACtH,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAE1D;AAED,uEAAuE;AACvE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED,mGAAmG;AACnG,MAAM,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEhG;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,mBAAmB,GAAG,SAAS,CA6ClI"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { AGENT_CONNECTION_PLUGIN_ID, SUBAGENTS_PLUGIN_ID } from './agent-step.js';
|
|
2
|
+
/** Everything the agent runs in the background now (`AGENT_CONNECTION_PLUGIN_ID`); each record replaces the one before. */
|
|
3
|
+
export const AGENT_BACKGROUND_WORK_SUBTYPE = 'background_work';
|
|
4
|
+
/** One background work ended (`AGENT_CONNECTION_PLUGIN_ID`), with what it printed last. */
|
|
5
|
+
export const AGENT_BACKGROUND_WORK_ENDED_SUBTYPE = 'background_work_ended';
|
|
6
|
+
/** What a subagent said as it worked (`SUBAGENTS_PLUGIN_ID`). */
|
|
7
|
+
export const SUBAGENT_MESSAGE_SUBTYPE = 'subagent_message';
|
|
8
|
+
/** How much of a command's output a `background_work_ended` keeps: its end, which says how it went. */
|
|
9
|
+
export const AGENT_WORK_OUTPUT_LIMIT = 4096;
|
|
10
|
+
/** A record of the agent's background work (its list, an end): read by the Agents pane, never drawn in the chat. */
|
|
11
|
+
export function isAgentWorkEvent(event) {
|
|
12
|
+
return (event.type === 'plugin_event' &&
|
|
13
|
+
event.pluginId === AGENT_CONNECTION_PLUGIN_ID &&
|
|
14
|
+
(event.subtype === AGENT_BACKGROUND_WORK_SUBTYPE || event.subtype === AGENT_BACKGROUND_WORK_ENDED_SUBTYPE));
|
|
15
|
+
}
|
|
16
|
+
/** A record of a helper agent (its start, steps, words, end), from Moxxy's own subagents or an agent connection's. */
|
|
17
|
+
export function isSubagentEvent(event) {
|
|
18
|
+
return event.type === 'plugin_event' && event.pluginId === SUBAGENTS_PLUGIN_ID;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* How an agent's helpers and background work are recorded in the log, the
|
|
22
|
+
* same whether they come in a turn or between turns; `undefined` for any
|
|
23
|
+
* other event.
|
|
24
|
+
*/
|
|
25
|
+
export function agentActivityRecord(event, provider, names) {
|
|
26
|
+
switch (event.type) {
|
|
27
|
+
case 'subagent_started':
|
|
28
|
+
names.set(event.id, { label: event.label, agentType: event.agentType });
|
|
29
|
+
return subagentRecord('subagent_started', {
|
|
30
|
+
childSessionId: event.id,
|
|
31
|
+
label: event.label,
|
|
32
|
+
agentType: event.agentType,
|
|
33
|
+
...(event.prompt ? { prompt: event.prompt } : {}),
|
|
34
|
+
...(event.toolsUnseen ? { toolsUnseen: true } : {}),
|
|
35
|
+
});
|
|
36
|
+
case 'subagent_tool_call': {
|
|
37
|
+
const named = names.get(event.id);
|
|
38
|
+
return subagentRecord('subagent_tool_call', { childSessionId: event.id, ...(named ? { label: named.label } : {}), name: event.name, input: event.input });
|
|
39
|
+
}
|
|
40
|
+
case 'subagent_message': {
|
|
41
|
+
const named = names.get(event.id);
|
|
42
|
+
return subagentRecord(SUBAGENT_MESSAGE_SUBTYPE, { childSessionId: event.id, ...(named ? { label: named.label } : {}), text: event.text });
|
|
43
|
+
}
|
|
44
|
+
case 'subagent_completed': {
|
|
45
|
+
const named = names.get(event.id);
|
|
46
|
+
return subagentRecord('subagent_completed', {
|
|
47
|
+
childSessionId: event.id,
|
|
48
|
+
...(named ? { label: named.label, agentType: named.agentType } : {}),
|
|
49
|
+
text: event.text,
|
|
50
|
+
stopReason: event.stopped ? 'stopped' : event.error ? 'error' : 'end_turn',
|
|
51
|
+
...(event.tokensUsed !== undefined ? { tokensUsed: event.tokensUsed } : {}),
|
|
52
|
+
...(event.error ? { error: event.error } : {}),
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
case 'background_work':
|
|
56
|
+
return workRecord(AGENT_BACKGROUND_WORK_SUBTYPE, { provider, work: event.work.map(({ id, kind, label }) => ({ id, kind, label })) });
|
|
57
|
+
case 'background_work_ended':
|
|
58
|
+
return workRecord(AGENT_BACKGROUND_WORK_ENDED_SUBTYPE, {
|
|
59
|
+
provider,
|
|
60
|
+
id: event.id,
|
|
61
|
+
kind: event.kind,
|
|
62
|
+
label: event.label,
|
|
63
|
+
status: event.status,
|
|
64
|
+
...(event.summary ? { summary: event.summary } : {}),
|
|
65
|
+
...(event.output ? { output: outputEnd(event.output) } : {}),
|
|
66
|
+
});
|
|
67
|
+
default:
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function subagentRecord(subtype, payload) {
|
|
72
|
+
return { source: 'plugin', pluginId: SUBAGENTS_PLUGIN_ID, subtype, payload };
|
|
73
|
+
}
|
|
74
|
+
function workRecord(subtype, payload) {
|
|
75
|
+
return { source: 'system', pluginId: AGENT_CONNECTION_PLUGIN_ID, subtype, payload };
|
|
76
|
+
}
|
|
77
|
+
function outputEnd(output) {
|
|
78
|
+
return output.length <= AGENT_WORK_OUTPUT_LIMIT ? output : output.slice(-AGENT_WORK_OUTPUT_LIMIT);
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=agent-work.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-work.js","sourceRoot":"","sources":["../src/agent-work.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import type { MoxxyEvent, UserPromptAttachment } from './events.js';
|
|
2
|
+
/**
|
|
3
|
+
* Attachment bytes travel two very different roads. The model needs them in
|
|
4
|
+
* full; a client that only DRAWS the conversation (desktop, a channel
|
|
5
|
+
* bot) does not, and pushing a scanned 30 MB PDF through the client link on
|
|
6
|
+
* every reconnect is what once wedged a chat in a reconnect loop. So the runner
|
|
7
|
+
* sends clients {@link eventForClient} — large payloads swapped for their size —
|
|
8
|
+
* and a client that wants the bytes (an image preview) reads them back in
|
|
9
|
+
* bounded slices with {@link readAttachmentChunk}. The log itself never changes.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* The most attachment payload (base64 characters) one model request carries.
|
|
13
|
+
* Every request resends the whole conversation, so without a cap a chat with a
|
|
14
|
+
* few scanned PDFs outgrows the provider's request limit (Anthropic: 32 MB) and
|
|
15
|
+
* EVERY later turn fails. The newest attachments go in full; older ones that no
|
|
16
|
+
* longer fit become a note naming them.
|
|
17
|
+
*/
|
|
18
|
+
export declare const MODEL_ATTACHMENT_BUDGET_CHARS: number;
|
|
19
|
+
/** One attachment's payload above this travels to clients by size only. */
|
|
20
|
+
export declare const CLIENT_INLINE_ATTACHMENT_CHARS: number;
|
|
21
|
+
/** All of one event's inline attachment payloads together stay under this. */
|
|
22
|
+
export declare const CLIENT_INLINE_EVENT_CHARS: number;
|
|
23
|
+
/** The largest slice one attachment read returns. */
|
|
24
|
+
export declare const ATTACHMENT_READ_CHUNK_CHARS: number;
|
|
25
|
+
/** The attachment's size in bytes — its real size even on a client copy whose bytes were left out. */
|
|
26
|
+
export declare function attachmentBytes(att: UserPromptAttachment): number;
|
|
27
|
+
/**
|
|
28
|
+
* The copy of `event` a client receives: every attachment payload too large for
|
|
29
|
+
* the client link becomes `content: ''` plus `omittedBytes`. Returns `event`
|
|
30
|
+
* itself when nothing had to change, so the common case allocates nothing.
|
|
31
|
+
*/
|
|
32
|
+
export declare function eventForClient(event: MoxxyEvent): MoxxyEvent;
|
|
33
|
+
/**
|
|
34
|
+
* The most one history page may weigh on the wire, in JSON characters. Paging
|
|
35
|
+
* counts events, and a few hundred events with screenshots or attachments can
|
|
36
|
+
* add up to tens of megabytes — one frame the client has to swallow whole.
|
|
37
|
+
*/
|
|
38
|
+
export declare const HISTORY_PAGE_MAX_CHARS: number;
|
|
39
|
+
/** One newest-first history page: ascending events plus the cursor to the next older page. */
|
|
40
|
+
export interface HistoryPage {
|
|
41
|
+
readonly events: ReadonlyArray<MoxxyEvent>;
|
|
42
|
+
readonly prevCursor: number | null;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* The page as a client receives it: every event in its client form, and the
|
|
46
|
+
* oldest events dropped until the page fits {@link HISTORY_PAGE_MAX_CHARS}. The
|
|
47
|
+
* newest event always stays, so paging always advances; the dropped events
|
|
48
|
+
* come back on the next older page.
|
|
49
|
+
*/
|
|
50
|
+
export declare function historyPageForClient(page: HistoryPage): HistoryPage;
|
|
51
|
+
/** One slice of an attachment's `content`, starting at `offset` (in characters). */
|
|
52
|
+
export interface AttachmentChunk {
|
|
53
|
+
readonly data: string;
|
|
54
|
+
/** The full `content` length, so the reader knows when it has everything. */
|
|
55
|
+
readonly total: number;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Slice attachment `index` of `event`. Slices start on a multiple of four
|
|
59
|
+
* characters when `offset` does, so base64 slices decode on their own too.
|
|
60
|
+
*/
|
|
61
|
+
export declare function readAttachmentChunk(event: MoxxyEvent, index: number, offset: number): AttachmentChunk;
|
|
62
|
+
/** How an attachment is named across the conversation: `seq:index` of the prompt that carried it. */
|
|
63
|
+
export declare function attachmentKey(seq: number, index: number): string;
|
|
64
|
+
/** One attachment found in the log, with where it sits. */
|
|
65
|
+
export interface FoundAttachment {
|
|
66
|
+
readonly seq: number;
|
|
67
|
+
readonly index: number;
|
|
68
|
+
readonly attachment: UserPromptAttachment;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* The attachment `query` names: its key (`seq:index`) or its file name, the
|
|
72
|
+
* newest one of that name, whatever the case. Null when none matches.
|
|
73
|
+
*/
|
|
74
|
+
export declare function findAttachment(events: ReadonlyArray<MoxxyEvent>, query: string): FoundAttachment | null;
|
|
75
|
+
/** Every attachment of the conversation, oldest first, as `seq:index name`. */
|
|
76
|
+
export declare function listAttachments(events: ReadonlyArray<MoxxyEvent>): string[];
|
|
77
|
+
/**
|
|
78
|
+
* What `recall({ attachment })` returns for an image or a document: a pointer,
|
|
79
|
+
* not the bytes, which stay once in the log. The projection puts the
|
|
80
|
+
* attachment itself beside this result, so the model sees the original again
|
|
81
|
+
* even after its turn was summarized away.
|
|
82
|
+
*/
|
|
83
|
+
export interface RestoredAttachmentOutput {
|
|
84
|
+
readonly forModel: string;
|
|
85
|
+
readonly restoredAttachment: {
|
|
86
|
+
readonly seq: number;
|
|
87
|
+
readonly index: number;
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/** The attachment a recall result restores, or null for any other output. */
|
|
91
|
+
export declare function restoredAttachmentRef(output: unknown): {
|
|
92
|
+
seq: number;
|
|
93
|
+
index: number;
|
|
94
|
+
} | null;
|
|
95
|
+
//# sourceMappingURL=attachment-payload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachment-payload.d.ts","sourceRoot":"","sources":["../src/attachment-payload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEpE;;;;;;;;GAQG;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,6BAA6B,QAAmB,CAAC;AAE9D,2EAA2E;AAC3E,eAAO,MAAM,8BAA8B,QAAa,CAAC;AACzD,8EAA8E;AAC9E,eAAO,MAAM,yBAAyB,QAAc,CAAC;AACrD,qDAAqD;AACrD,eAAO,MAAM,2BAA2B,QAAc,CAAC;AAOvD,sGAAsG;AACtG,wBAAgB,eAAe,CAAC,GAAG,EAAE,oBAAoB,GAAG,MAAM,CAKjE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAc5D;AAED;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,QAAkB,CAAC;AAEtD,8FAA8F;AAC9F,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAC3C,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,WAAW,GAAG,WAAW,CAgBnE;AAED,oFAAoF;AACpF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,6EAA6E;IAC7E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,eAAe,CAQrG;AAED,qGAAqG;AACrG,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,2DAA2D;AAC3D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,oBAAoB,CAAC;CAC3C;AAaD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAYvG;AAED,+EAA+E;AAC/E,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,GAAG,MAAM,EAAE,CAI3E;AAED;;;;;GAKG;AACH,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,kBAAkB,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/E;AAED,6EAA6E;AAC7E,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAM5F"}
|