@stratusagent/gateway 0.4.0 → 0.7.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/index.d.ts +230 -25
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +466 -119
- package/dist/index.js.map +1 -1
- package/dist/schedules.d.ts +137 -0
- package/dist/schedules.d.ts.map +1 -0
- package/dist/schedules.js +427 -0
- package/dist/schedules.js.map +1 -0
- package/package.json +6 -5
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { EventBus, type AgentDefinition, type ApprovalAnswer, type ApprovalPolicy, type JsonObject, type Session, type SessionStatus, type SessionStore, type ToolRisk } from '@stratusagent/core';
|
|
2
2
|
import { type ParsedSoul } from '@stratusagent/agents';
|
|
3
|
-
import { type
|
|
3
|
+
import { type OptionalModuleHost } from '@stratusagent/plugins';
|
|
4
|
+
import { type PluginsConfig, type RuntimeSelection, type StateEnvironment } from '@stratusagent/state';
|
|
4
5
|
/**
|
|
5
6
|
* Durable session storage on node:sqlite (unflagged on Node 22.13+). The
|
|
6
7
|
* whole session — messages, status, and metadata, including provider replay
|
|
@@ -30,45 +31,81 @@ export declare class SqliteSessionStore implements SessionStore {
|
|
|
30
31
|
* no conversation body is deserialized to answer the question.
|
|
31
32
|
*/
|
|
32
33
|
listIdsByStatus(status: SessionStatus): Promise<string[]>;
|
|
33
|
-
/**
|
|
34
|
-
|
|
34
|
+
/**
|
|
35
|
+
* When each agent last did anything, and how many of its sessions are live
|
|
36
|
+
* right now.
|
|
37
|
+
*
|
|
38
|
+
* One aggregate over the indexed columns — no conversation body is
|
|
39
|
+
* deserialized, for the same reason `listIdsByStatus` returns ids: a
|
|
40
|
+
* roster view asks this on every load, and it must not cost a JSON parse
|
|
41
|
+
* per session to answer.
|
|
42
|
+
*
|
|
43
|
+
* Both halves are needed and neither is sufficient. `lastActiveAt` alone
|
|
44
|
+
* reads a turn parked on a human as idle, because the save that recorded
|
|
45
|
+
* the park is the last thing that touched the row — and a turn waiting
|
|
46
|
+
* twenty minutes on an approval is exactly when someone wants to see the
|
|
47
|
+
* agent lit. `activeSessions` alone loses an agent that finished a moment
|
|
48
|
+
* ago. The caller decides what window counts as "recent"; a daemon that
|
|
49
|
+
* baked one in would need upgrading to change it.
|
|
50
|
+
*/
|
|
51
|
+
/**
|
|
52
|
+
* How many sessions are in each state.
|
|
53
|
+
*
|
|
54
|
+
* A grouped count, not a listing that gets counted. The table grows for the
|
|
55
|
+
* life of an install and a health endpoint is polled, so materialising one
|
|
56
|
+
* object per historical session to produce five numbers gets steadily
|
|
57
|
+
* slower at exactly the thing meant to report that the daemon is fine.
|
|
58
|
+
*/
|
|
59
|
+
countByStatus(): Record<string, number>;
|
|
60
|
+
lastActivityByAgent(): Record<string, {
|
|
61
|
+
lastActiveAt: string;
|
|
62
|
+
activeSessions: number;
|
|
63
|
+
}>;
|
|
64
|
+
/**
|
|
65
|
+
* Newest-first session listing for one agent (or all agents).
|
|
66
|
+
*
|
|
67
|
+
* `limit` is not decoration: this table grows for the life of an install,
|
|
68
|
+
* and a surface that renders "recent conversations" would otherwise pull
|
|
69
|
+
* every session anyone has ever had to show ten of them.
|
|
70
|
+
*/
|
|
71
|
+
list(agentId?: string, limit?: number): Array<Pick<Session, 'id' | 'status' | 'createdAt' | 'updatedAt'> & {
|
|
35
72
|
agentId: string;
|
|
36
73
|
}>;
|
|
37
74
|
close(): void;
|
|
38
75
|
}
|
|
76
|
+
/**
|
|
77
|
+
* A soul's provider/model pins, and the daemon-wide defaults they demote.
|
|
78
|
+
*
|
|
79
|
+
* The implementation lives in `@stratusagent/state`, beside the resolver
|
|
80
|
+
* whose precedence it manipulates — it never had a gateway dependency. It is
|
|
81
|
+
* re-exported here because this is where callers were told to import it from,
|
|
82
|
+
* and because "what will a served agent actually resolve to" is a gateway
|
|
83
|
+
* question even when the rule answering it is not gateway code.
|
|
84
|
+
*/
|
|
85
|
+
export { applySoulPins, type SoulPinContext } from '@stratusagent/state';
|
|
39
86
|
/**
|
|
40
87
|
* A channel adapter as the gateway sees it: started after the roster
|
|
41
88
|
* loads, stopped before the store drains. Structurally identical to
|
|
42
89
|
* @stratusagent/channels' ChannelAdapter — kept structural here so the
|
|
43
90
|
* gateway does not depend on the channels package.
|
|
44
91
|
*/
|
|
45
|
-
/** Where the daemon-wide provider default could have come from. */
|
|
46
|
-
export interface SoulPinContext {
|
|
47
|
-
/** A provider fixed by the caller (the gateway's own selection). */
|
|
48
|
-
selectionProvider?: string;
|
|
49
|
-
/** The provider named by the active config file. */
|
|
50
|
-
configProvider?: string;
|
|
51
|
-
/** Whether a config file was found at all. */
|
|
52
|
-
configPresent: boolean;
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Apply a soul's provider/model pins to a selection, demoting the
|
|
56
|
-
* daemon-wide defaults the pins outrank.
|
|
57
|
-
*
|
|
58
|
-
* Exported because this is not only dispatch logic: anything that wants to
|
|
59
|
-
* know what a served agent will actually resolve to — a startup billing
|
|
60
|
-
* check, a diagnostic — has to normalize the same way, and a second copy
|
|
61
|
-
* of these rules drifts from this one.
|
|
62
|
-
*/
|
|
63
|
-
export declare const applySoulPins: (pins: ParsedSoul, selection: RuntimeSelection, env: StateEnvironment, context: SoulPinContext) => {
|
|
64
|
-
selection: RuntimeSelection;
|
|
65
|
-
env: StateEnvironment;
|
|
66
|
-
};
|
|
67
92
|
export interface GatewayChannelAdapter {
|
|
68
93
|
name: string;
|
|
69
94
|
start(gateway: Gateway): Promise<void>;
|
|
70
95
|
stop(): Promise<void>;
|
|
71
96
|
}
|
|
97
|
+
/**
|
|
98
|
+
* Where a session came from, as the gateway reports it. Structural for the
|
|
99
|
+
* same reason as the adapter above — @stratusagent/channels declares the
|
|
100
|
+
* matching shape for adapters to consume, and neither package imports the
|
|
101
|
+
* other to agree on it.
|
|
102
|
+
*/
|
|
103
|
+
export interface SessionRouting {
|
|
104
|
+
/** Whose app must do the talking. */
|
|
105
|
+
agentId: string;
|
|
106
|
+
/** The metadata the dispatching surface attached to the session. */
|
|
107
|
+
metadata: JsonObject;
|
|
108
|
+
}
|
|
72
109
|
/**
|
|
73
110
|
* What the gateway hands a policy that needs a human somewhere else: one
|
|
74
111
|
* function that publishes a request and settles on the answer. Handed to a
|
|
@@ -104,6 +141,36 @@ export interface GatewayApprovalRequest {
|
|
|
104
141
|
signal?: AbortSignal;
|
|
105
142
|
}
|
|
106
143
|
export type ApprovalRequester = (request: GatewayApprovalRequest) => Promise<ApprovalAnswer>;
|
|
144
|
+
/**
|
|
145
|
+
* A parked call as an observer sees it — everything `tool.approval-requested`
|
|
146
|
+
* announced, still outstanding.
|
|
147
|
+
*
|
|
148
|
+
* Listable because an event stream only tells you what happened while you
|
|
149
|
+
* were listening. A surface that connects while a turn is already parked
|
|
150
|
+
* would otherwise show no pending request at all until the next one, and
|
|
151
|
+
* rebuilding the set from the bus means keeping a second copy of state the
|
|
152
|
+
* gateway already holds.
|
|
153
|
+
*/
|
|
154
|
+
export interface PendingApproval {
|
|
155
|
+
requestId: string;
|
|
156
|
+
sessionId: string;
|
|
157
|
+
agentId: string;
|
|
158
|
+
call: {
|
|
159
|
+
id: string;
|
|
160
|
+
toolName: string;
|
|
161
|
+
input: JsonObject;
|
|
162
|
+
};
|
|
163
|
+
risk: ToolRisk;
|
|
164
|
+
/** When this call parked, ISO-8601. */
|
|
165
|
+
parkedAt: string;
|
|
166
|
+
/**
|
|
167
|
+
* When it denies itself, ISO-8601. Absent when it never will — the same
|
|
168
|
+
* distinction the announcing event draws.
|
|
169
|
+
*/
|
|
170
|
+
expiresAt?: string;
|
|
171
|
+
/** The session's metadata: where the turn is happening. */
|
|
172
|
+
metadata?: JsonObject;
|
|
173
|
+
}
|
|
107
174
|
export interface ResolveApprovalInput {
|
|
108
175
|
requestId: string;
|
|
109
176
|
answer: ApprovalAnswer;
|
|
@@ -122,6 +189,39 @@ export interface ResolveApprovalInput {
|
|
|
122
189
|
*/
|
|
123
190
|
reason?: 'decided' | 'undeliverable';
|
|
124
191
|
}
|
|
192
|
+
/** One registered tool, as an operator's surfaces need to see it. */
|
|
193
|
+
export interface GatewayTool {
|
|
194
|
+
name: string;
|
|
195
|
+
description?: string;
|
|
196
|
+
risk: ToolRisk;
|
|
197
|
+
/** The plugin package that contributed it; absent for kernel tools. */
|
|
198
|
+
package?: string;
|
|
199
|
+
/** Whether that package is trusted to declare a tool `safe`. */
|
|
200
|
+
trusted?: boolean;
|
|
201
|
+
}
|
|
202
|
+
/** One skill this daemon serves — identity and provenance, never the body. */
|
|
203
|
+
export interface GatewaySkill {
|
|
204
|
+
/** Canonical id: bare for an operator-installed skill, `<package>:<skill>` for a plugin's. */
|
|
205
|
+
id: string;
|
|
206
|
+
name: string;
|
|
207
|
+
description: string;
|
|
208
|
+
/** The bare id a plugin's skill also answers to, while no one else claims it. */
|
|
209
|
+
alias?: string;
|
|
210
|
+
/** The plugin package that contributed it; absent for operator-installed skills. */
|
|
211
|
+
package?: string;
|
|
212
|
+
/** Where the SKILL.md lives. */
|
|
213
|
+
path?: string;
|
|
214
|
+
}
|
|
215
|
+
/** A plugin this daemon was asked to load, and what came of it. */
|
|
216
|
+
export interface GatewayPluginStatus {
|
|
217
|
+
package: string;
|
|
218
|
+
name?: string;
|
|
219
|
+
trusted?: boolean;
|
|
220
|
+
tools?: GatewayTool[];
|
|
221
|
+
skills?: GatewaySkill[];
|
|
222
|
+
/** Present when the plugin did not load, and the only field that is. */
|
|
223
|
+
error?: string;
|
|
224
|
+
}
|
|
125
225
|
export interface GatewayOptions {
|
|
126
226
|
env?: StateEnvironment;
|
|
127
227
|
/** Gateway-wide provider/model overrides applied beneath per-soul pins. */
|
|
@@ -149,6 +249,26 @@ export interface GatewayOptions {
|
|
|
149
249
|
idleTimeoutMs?: number;
|
|
150
250
|
/** Session database path. Default ~/.stratus/sessions.db. */
|
|
151
251
|
sessionDbPath?: string;
|
|
252
|
+
/**
|
|
253
|
+
* Plugins to load, keyed by package name — the `plugins` block, which the
|
|
254
|
+
* caller has already read from a **trusted** config. The gateway does not
|
|
255
|
+
* go looking for one: a plugin runs in-process with the daemon, and which
|
|
256
|
+
* file may say so is a decision that belongs where the config precedence
|
|
257
|
+
* is already understood.
|
|
258
|
+
*/
|
|
259
|
+
plugins?: PluginsConfig;
|
|
260
|
+
/**
|
|
261
|
+
* How plugin packages are resolved and imported.
|
|
262
|
+
*
|
|
263
|
+
* Worth passing, and `stratus serve` does. `import.meta.resolve` answers
|
|
264
|
+
* relative to the module that calls it, so the default here asks "is this
|
|
265
|
+
* plugin visible from the gateway package" when the question is "is it
|
|
266
|
+
* visible from the thing the operator installed". Those differ under any
|
|
267
|
+
* layout that is not flat — a pnpm install being the obvious one — and the
|
|
268
|
+
* failure is a plugin reported as not installed while sitting right next
|
|
269
|
+
* to the CLI.
|
|
270
|
+
*/
|
|
271
|
+
pluginHost?: OptionalModuleHost;
|
|
152
272
|
log?: (line: string) => void;
|
|
153
273
|
warn?: (line: string) => void;
|
|
154
274
|
}
|
|
@@ -164,6 +284,16 @@ export interface DispatchInput {
|
|
|
164
284
|
userMessage: string;
|
|
165
285
|
metadata?: JsonObject;
|
|
166
286
|
signal?: AbortSignal;
|
|
287
|
+
/**
|
|
288
|
+
* Caller-chosen id for this turn, so events emitted while it runs can be
|
|
289
|
+
* attributed to it. A session processes several turns in sequence and
|
|
290
|
+
* `StratusEvent` carries no turn identifier, so a surface that queued a
|
|
291
|
+
* message has no other way to tell its own deltas from the next caller's.
|
|
292
|
+
*
|
|
293
|
+
* Optional because most callers do not need one: a channel renders
|
|
294
|
+
* whatever arrives for the conversation it is watching.
|
|
295
|
+
*/
|
|
296
|
+
turnId?: string;
|
|
167
297
|
}
|
|
168
298
|
export interface Gateway {
|
|
169
299
|
start(): Promise<void>;
|
|
@@ -176,6 +306,81 @@ export interface Gateway {
|
|
|
176
306
|
readonly store: SqliteSessionStore;
|
|
177
307
|
/** The current roster, default agent included. */
|
|
178
308
|
agents(): AgentDefinition[];
|
|
309
|
+
/**
|
|
310
|
+
* Re-read the agents directory and the configured default soul, returning
|
|
311
|
+
* the roster that results. Souls are already re-read on every dispatch, so
|
|
312
|
+
* this is for files that appeared or disappeared since start — an agent
|
|
313
|
+
* created by another surface, or one whose soul was deleted.
|
|
314
|
+
*/
|
|
315
|
+
reloadRoster(): Promise<AgentDefinition[]>;
|
|
316
|
+
/**
|
|
317
|
+
* The turn currently running on a session, if the caller that started it
|
|
318
|
+
* named one. Single-flight per session is what makes this exact: at most
|
|
319
|
+
* one turn is ever running on a session, so an event emitted for it
|
|
320
|
+
* belongs to this turn and no other.
|
|
321
|
+
*/
|
|
322
|
+
activeTurnId(sessionId: string): string | undefined;
|
|
323
|
+
/** Every call parked on a human right now, oldest first. */
|
|
324
|
+
pendingApprovals(): PendingApproval[];
|
|
325
|
+
/**
|
|
326
|
+
* Every registered tool, with the risk it will actually be judged at and
|
|
327
|
+
* the package it came from.
|
|
328
|
+
*
|
|
329
|
+
* Provenance is the reason this is not `tools.describe()`: "which of
|
|
330
|
+
* these can this daemon run, and whose code is it" is the question the
|
|
331
|
+
* catalog endpoint and 07's tool screens are asking, and a descriptor
|
|
332
|
+
* list answers only half of it. Kernel tools have no package, which is
|
|
333
|
+
* itself the answer for them.
|
|
334
|
+
*/
|
|
335
|
+
tools(): GatewayTool[];
|
|
336
|
+
/**
|
|
337
|
+
* Every skill this daemon serves — operator-installed and
|
|
338
|
+
* plugin-contributed — with the ids an allowlist can name. Descriptors
|
|
339
|
+
* only: bodies stay behind `skill.read`, on the agent's own turn.
|
|
340
|
+
*/
|
|
341
|
+
skills(): GatewaySkill[];
|
|
342
|
+
/**
|
|
343
|
+
* The plugins this daemon loaded, and the ones it could not — a plugin an
|
|
344
|
+
* operator enabled that failed to load is exactly what they need to see,
|
|
345
|
+
* and an empty list would say the opposite.
|
|
346
|
+
*/
|
|
347
|
+
plugins(): GatewayPluginStatus[];
|
|
348
|
+
/**
|
|
349
|
+
* The soul behind each agent in the current roster, built-in included
|
|
350
|
+
* (which has none).
|
|
351
|
+
*
|
|
352
|
+
* The roster the daemon is *serving*, which the agents directory stops
|
|
353
|
+
* describing the moment a soul is added, deleted, or broken since the last
|
|
354
|
+
* reload — and the gateway keeps dispatching from the soul it cached. A
|
|
355
|
+
* caller that has to answer "what would a turn as this agent run on" needs
|
|
356
|
+
* the pins that answer it, so this hands back the parsed soul rather than a
|
|
357
|
+
* path a second reader would have to re-read (and now read differently).
|
|
358
|
+
*
|
|
359
|
+
* Async because it re-reads each soul file, exactly as `refreshAgent` does
|
|
360
|
+
* before every dispatch: a pin edited on disk is live on the next turn, so
|
|
361
|
+
* a caller answering from the load-time snapshot would name the provider
|
|
362
|
+
* the daemon has already stopped billing. An unreadable file falls back to
|
|
363
|
+
* the cached soul, which is what that next dispatch falls back to as well.
|
|
364
|
+
*
|
|
365
|
+
* An agent is **absent** from this list when its file now declares a
|
|
366
|
+
* different id: `refreshAgent` refuses every dispatch for the old one until
|
|
367
|
+
* the roster reloads, so nothing is served under it and no runtime should
|
|
368
|
+
* be claimed for it. The roster it reports is therefore what can currently
|
|
369
|
+
* run, which is a narrower thing than `agents()`.
|
|
370
|
+
*/
|
|
371
|
+
servedSouls(): Promise<Array<{
|
|
372
|
+
id: string;
|
|
373
|
+
soul?: ParsedSoul;
|
|
374
|
+
}>>;
|
|
375
|
+
/**
|
|
376
|
+
* Where a durable session came from — its agent, and the metadata the
|
|
377
|
+
* dispatching surface attached to it.
|
|
378
|
+
*
|
|
379
|
+
* A projection rather than an accessor: the session's messages are not
|
|
380
|
+
* a channel's business, and handing back the whole record to save a few
|
|
381
|
+
* lines would make them one.
|
|
382
|
+
*/
|
|
383
|
+
sessionRouting(sessionId: string): Promise<SessionRouting | undefined>;
|
|
179
384
|
/**
|
|
180
385
|
* Settles a parked call. Returns false when the request is not pending —
|
|
181
386
|
* already decided, expired, or belonging to a turn that was cancelled —
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAGL,QAAQ,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|