@stratusagent/gateway 0.14.8 → 0.14.9
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-source.d.ts +10 -0
- package/dist/agent-source.d.ts.map +1 -0
- package/dist/agent-source.js +7 -0
- package/dist/agent-source.js.map +1 -0
- package/dist/approvals.d.ts +38 -0
- package/dist/approvals.d.ts.map +1 -0
- package/dist/approvals.js +330 -0
- package/dist/approvals.js.map +1 -0
- package/dist/credential-requests.d.ts +24 -0
- package/dist/credential-requests.d.ts.map +1 -0
- package/dist/credential-requests.js +452 -0
- package/dist/credential-requests.js.map +1 -0
- package/dist/dispatch.d.ts +34 -0
- package/dist/dispatch.d.ts.map +1 -0
- package/dist/dispatch.js +461 -0
- package/dist/dispatch.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +368 -2443
- package/dist/index.js.map +1 -1
- package/dist/merge-batch.d.ts +60 -0
- package/dist/merge-batch.d.ts.map +1 -0
- package/dist/merge-batch.js +59 -0
- package/dist/merge-batch.js.map +1 -0
- package/dist/recovery.d.ts +49 -0
- package/dist/recovery.d.ts.map +1 -0
- package/dist/recovery.js +487 -0
- package/dist/recovery.js.map +1 -0
- package/dist/steering.d.ts +24 -0
- package/dist/steering.d.ts.map +1 -0
- package/dist/steering.js +108 -0
- package/dist/steering.js.map +1 -0
- package/dist/sub-agents.d.ts +20 -0
- package/dist/sub-agents.d.ts.map +1 -0
- package/dist/sub-agents.js +263 -0
- package/dist/sub-agents.js.map +1 -0
- package/dist/turn-dispatch.d.ts +34 -0
- package/dist/turn-dispatch.d.ts.map +1 -0
- package/dist/turn-dispatch.js +179 -0
- package/dist/turn-dispatch.js.map +1 -0
- package/package.json +7 -7
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { type ImageAttachment, type Session } from '@stratusagent/core';
|
|
2
|
+
import type { DispatchInput } from './types.ts';
|
|
3
|
+
/** A dispatch absorbed into a merged turn, waiting for its outcome. */
|
|
4
|
+
export interface MergeJoiner {
|
|
5
|
+
input: DispatchInput;
|
|
6
|
+
resolve: (session: Session) => void;
|
|
7
|
+
reject: (error: unknown) => void;
|
|
8
|
+
}
|
|
9
|
+
export interface MergeBatch {
|
|
10
|
+
agentId: string | undefined;
|
|
11
|
+
/** The dispatch that opened the batch and runs it, unless it is steered. */
|
|
12
|
+
leader: MergeJoiner;
|
|
13
|
+
/**
|
|
14
|
+
* Nothing was queued on the session's chain when it opened, so nothing
|
|
15
|
+
* can be ahead of it: the chain is first in, first out. Only such a batch
|
|
16
|
+
* is steered (card 948); one behind other work waits its turn.
|
|
17
|
+
*/
|
|
18
|
+
firstInLine: boolean;
|
|
19
|
+
absorbed: MergeJoiner[];
|
|
20
|
+
/**
|
|
21
|
+
* Taken by the turn running ahead of it (card 948), which settles every
|
|
22
|
+
* caller in it: the leader's place on the chain then runs nothing.
|
|
23
|
+
*/
|
|
24
|
+
steered: boolean;
|
|
25
|
+
/** Every image in the batch so far, leader's first. */
|
|
26
|
+
images: ImageAttachment[];
|
|
27
|
+
/** Characters of the merged user message so far, separators included. */
|
|
28
|
+
chars: number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The most text one merged user message may hold (card 423). The runner's
|
|
32
|
+
* overflow recovery can drop earlier transcript but never part of the
|
|
33
|
+
* newest message, so a batch must not grow that message past what one
|
|
34
|
+
* message could be on its own: this is Slack's own message-length limit.
|
|
35
|
+
* A single message longer than this still runs, alone, as it would have
|
|
36
|
+
* without merging.
|
|
37
|
+
*/
|
|
38
|
+
export declare const MERGED_TEXT_BUDGET_CHARS = 40000;
|
|
39
|
+
/** Separator between merged messages; counted against the text budget. */
|
|
40
|
+
export declare const MERGED_SEPARATOR = "\n\n";
|
|
41
|
+
/**
|
|
42
|
+
* Whether `images` all fit the replay budget together. A merged turn's
|
|
43
|
+
* images are one message's, and the runner empties whatever falls outside
|
|
44
|
+
* the budget before the provider sees it, so a batch that would overflow
|
|
45
|
+
* must not take the message that overflows it (card 423).
|
|
46
|
+
*/
|
|
47
|
+
export declare const fitsReplayBudget: (images: readonly ImageAttachment[]) => boolean;
|
|
48
|
+
/** A signal that aborts once every one of `signals` has. */
|
|
49
|
+
export declare const allAborted: (signals: readonly AbortSignal[]) => AbortSignal;
|
|
50
|
+
/**
|
|
51
|
+
* `allAborted` for callers that keep joining: a turn that takes in messages
|
|
52
|
+
* at its tool steps (card 948) is cancelled only once every caller in it
|
|
53
|
+
* is, the ones who joined late included. A caller joining with no signal
|
|
54
|
+
* can never cancel, so from then on neither can the turn.
|
|
55
|
+
*/
|
|
56
|
+
export declare const joinableSignal: (initial: readonly AbortSignal[]) => {
|
|
57
|
+
signal: AbortSignal;
|
|
58
|
+
join: (signal: AbortSignal | undefined) => void;
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=merge-batch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-batch.d.ts","sourceRoot":"","sources":["../src/merge-batch.ts"],"names":[],"mappings":"AAOA,OAAO,EAA4B,KAAK,eAAe,EAAE,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,uEAAuE;AACvE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,aAAa,CAAC;IACrB,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACpC,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,4EAA4E;IAC5E,MAAM,EAAE,WAAW,CAAC;IACpB;;;;OAIG;IACH,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB;;;OAGG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB,uDAAuD;IACvD,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,yEAAyE;IACzE,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,QAAS,CAAC;AAE/C,0EAA0E;AAC1E,eAAO,MAAM,gBAAgB,SAAS,CAAC;AAEvC;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAAI,QAAQ,SAAS,eAAe,EAAE,KAAG,OAC+E,CAAC;AAEtJ,4DAA4D;AAC5D,eAAO,MAAM,UAAU,GAAI,SAAS,SAAS,WAAW,EAAE,KAAG,WAA6C,CAAC;AAE3G;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GAAI,SAAS,SAAS,WAAW,EAAE,KAAG;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,KAAK,IAAI,CAAA;CAwBtI,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* A merged turn's batch: the dispatch that opened it and the ones absorbed
|
|
3
|
+
* into it while it waits, and the rules a batch grows by. Moved out of
|
|
4
|
+
* index.ts as is so the dispatch path split out of `createGateway` can name
|
|
5
|
+
* them; index.ts does not re-export them.
|
|
6
|
+
*/
|
|
7
|
+
import { imagesWithinReplayBudget } from '@stratusagent/core';
|
|
8
|
+
/**
|
|
9
|
+
* The most text one merged user message may hold (card 423). The runner's
|
|
10
|
+
* overflow recovery can drop earlier transcript but never part of the
|
|
11
|
+
* newest message, so a batch must not grow that message past what one
|
|
12
|
+
* message could be on its own: this is Slack's own message-length limit.
|
|
13
|
+
* A single message longer than this still runs, alone, as it would have
|
|
14
|
+
* without merging.
|
|
15
|
+
*/
|
|
16
|
+
export const MERGED_TEXT_BUDGET_CHARS = 40_000;
|
|
17
|
+
/** Separator between merged messages; counted against the text budget. */
|
|
18
|
+
export const MERGED_SEPARATOR = '\n\n';
|
|
19
|
+
/**
|
|
20
|
+
* Whether `images` all fit the replay budget together. A merged turn's
|
|
21
|
+
* images are one message's, and the runner empties whatever falls outside
|
|
22
|
+
* the budget before the provider sees it, so a batch that would overflow
|
|
23
|
+
* must not take the message that overflows it (card 423).
|
|
24
|
+
*/
|
|
25
|
+
export const fitsReplayBudget = (images) => images.length === 0 || imagesWithinReplayBudget([{ id: '', createdAt: '', role: 'user', content: '', images: [...images] }]).size === images.length;
|
|
26
|
+
/** A signal that aborts once every one of `signals` has. */
|
|
27
|
+
export const allAborted = (signals) => joinableSignal(signals).signal;
|
|
28
|
+
/**
|
|
29
|
+
* `allAborted` for callers that keep joining: a turn that takes in messages
|
|
30
|
+
* at its tool steps (card 948) is cancelled only once every caller in it
|
|
31
|
+
* is, the ones who joined late included. A caller joining with no signal
|
|
32
|
+
* can never cancel, so from then on neither can the turn.
|
|
33
|
+
*/
|
|
34
|
+
export const joinableSignal = (initial) => {
|
|
35
|
+
const controller = new AbortController();
|
|
36
|
+
const signals = [...initial];
|
|
37
|
+
let uncancellable = false;
|
|
38
|
+
const check = () => {
|
|
39
|
+
if (!uncancellable && !controller.signal.aborted && signals.every((signal) => signal.aborted)) {
|
|
40
|
+
controller.abort(signals[signals.length - 1]?.reason);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
for (const signal of signals) {
|
|
44
|
+
signal.addEventListener('abort', check, { once: true });
|
|
45
|
+
}
|
|
46
|
+
check();
|
|
47
|
+
return {
|
|
48
|
+
signal: controller.signal,
|
|
49
|
+
join: (signal) => {
|
|
50
|
+
if (signal === undefined) {
|
|
51
|
+
uncancellable = true;
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
signals.push(signal);
|
|
55
|
+
signal.addEventListener('abort', check, { once: true });
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=merge-batch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-batch.js","sourceRoot":"","sources":["../src/merge-batch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,wBAAwB,EAAsC,MAAM,oBAAoB,CAAC;AAgClG;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC;AAE/C,0EAA0E;AAC1E,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEvC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAkC,EAAW,EAAE,CAC9E,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,wBAAwB,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC;AAEtJ,4DAA4D;AAC5D,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAA+B,EAAe,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;AAE3G;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAA+B,EAA4E,EAAE;IAC1I,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;IAC7B,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,MAAM,KAAK,GAAG,GAAS,EAAE;QACvB,IAAI,CAAC,aAAa,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9F,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACxD,CAAC;IACH,CAAC,CAAC;IACF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,KAAK,EAAE,CAAC;IACR,OAAO;QACL,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE;YACf,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,aAAa,GAAG,IAAI,CAAC;gBACrB,OAAO;YACT,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,CAAC;KACF,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { type AgentRunner, type AgentRuntimeContext, type EventBus, type JsonObject, type RunAbortedError, type Session } from '@stratusagent/core';
|
|
2
|
+
import type { AgentSource } from './agent-source.ts';
|
|
3
|
+
import type { SchedulerRuntime } from './schedules.ts';
|
|
4
|
+
import type { ShardedSessionStore } from './sessions.ts';
|
|
5
|
+
import type { DispatchInput } from './types.ts';
|
|
6
|
+
import { type RuntimeConfig } from '@stratusagent/state';
|
|
7
|
+
/** What restart recovery closes over in `createGateway`. */
|
|
8
|
+
export interface RecoveryDeps {
|
|
9
|
+
log: (line: string) => void;
|
|
10
|
+
warn: (line: string) => void;
|
|
11
|
+
bus: EventBus;
|
|
12
|
+
store: ShardedSessionStore;
|
|
13
|
+
scheduler: SchedulerRuntime;
|
|
14
|
+
effectiveApprovalTimeoutMs: number;
|
|
15
|
+
refreshAgent: (agentId: string) => Promise<AgentSource>;
|
|
16
|
+
runtimeContextFor: (source: AgentSource, config: RuntimeConfig, onFallback: boolean, metadata: JsonObject | undefined, subAgent?: boolean) => AgentRuntimeContext;
|
|
17
|
+
runnerFor: (config: RuntimeConfig, agentId: string, subAgent?: boolean) => AgentRunner;
|
|
18
|
+
withWatchdog: <T>(sessionId: string, external: AbortSignal | undefined, idleEnabled: boolean, fallbackStreams: boolean, run: (signal: AbortSignal) => Promise<T>) => Promise<T>;
|
|
19
|
+
isStopping: () => boolean;
|
|
20
|
+
trackTurn: (sessionId: string, controller: AbortController) => void;
|
|
21
|
+
untrackTurn: (sessionId: string, controller: AbortController) => void;
|
|
22
|
+
getAbortingWith: () => string | undefined;
|
|
23
|
+
shutdownAbort: () => RunAbortedError;
|
|
24
|
+
activeTurns: Map<string, string>;
|
|
25
|
+
onTurnRuntime: <T>(sessionId: string, runtime: {
|
|
26
|
+
source: AgentSource;
|
|
27
|
+
config: RuntimeConfig;
|
|
28
|
+
}, work: () => Promise<T>) => Promise<T>;
|
|
29
|
+
getOrphanedAtStart: () => ReadonlySet<string>;
|
|
30
|
+
runtimeForAgent: (source: AgentSource) => Promise<RuntimeConfig>;
|
|
31
|
+
watchdogStreamsFor: (session: Pick<Session, 'metadata'> | undefined, config: RuntimeConfig) => {
|
|
32
|
+
switchedToFallback: boolean;
|
|
33
|
+
effectiveStreams: boolean;
|
|
34
|
+
fallbackStreams: boolean;
|
|
35
|
+
};
|
|
36
|
+
reachesHarness: (config: RuntimeConfig, switchedToFallback: boolean) => boolean;
|
|
37
|
+
onSessionChain: <T>(sessionId: string, work: () => Promise<T>, released?: () => boolean) => Promise<T>;
|
|
38
|
+
}
|
|
39
|
+
export declare const createRecovery: ({ log, warn, bus, store, scheduler, effectiveApprovalTimeoutMs, refreshAgent, runtimeContextFor, runnerFor, withWatchdog, isStopping, trackTurn, untrackTurn, getAbortingWith, shutdownAbort, activeTurns, onTurnRuntime, getOrphanedAtStart, runtimeForAgent, watchdogStreamsFor, reachesHarness, onSessionChain, }: RecoveryDeps) => {
|
|
40
|
+
recoverParkedTurns: (orphaned: ReadonlySet<string>) => Promise<void>;
|
|
41
|
+
listOrphanedDelegations: () => Promise<Set<string>>;
|
|
42
|
+
listAbandonedTurns: () => Promise<string[]>;
|
|
43
|
+
failAbandonedTurns: (abandoned: string[]) => Promise<void>;
|
|
44
|
+
settleRepeat: (sessionId: string, idempotencyKey: string, agentId: string | undefined, turnId: string | undefined, onRepeat: DispatchInput["onRepeat"]) => Promise<Session | undefined>;
|
|
45
|
+
archivedRepeat: (session: Session, idempotencyKey: string) => Promise<Session | undefined>;
|
|
46
|
+
settleUnfinished: (session: Session) => Promise<Session>;
|
|
47
|
+
};
|
|
48
|
+
export type Recovery = ReturnType<typeof createRecovery>;
|
|
49
|
+
//# sourceMappingURL=recovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../src/recovery.ts"],"names":[],"mappings":"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"}
|