@securecoms/agent-bridge 0.29.0 → 0.30.1
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/README.md +156 -9
- package/dist/bin.d.ts +83 -1
- package/dist/bin.js +3395 -586
- package/dist/bridge-agent.d.ts +269 -2
- package/dist/config.d.ts +7 -0
- package/dist/consumer-grants.d.ts +19 -0
- package/dist/errors.d.ts +1 -1
- package/dist/grants/binding.d.ts +58 -0
- package/dist/grants/effective.d.ts +47 -0
- package/dist/grants/manifest.d.ts +68 -0
- package/dist/grants/owner-turn.d.ts +52 -0
- package/dist/grants/persona-render.d.ts +30 -0
- package/dist/grants/pin-command.d.ts +31 -0
- package/dist/grants/pin.d.ts +35 -0
- package/dist/grants/room-search-cap.d.ts +15 -0
- package/dist/grants/voice-fence.d.ts +53 -0
- package/dist/http-server.d.ts +1 -0
- package/dist/index.js +2289 -192
- package/dist/memory/unified/item-book.d.ts +3 -0
- package/dist/memory/unified/migrate.d.ts +11 -0
- package/dist/memory/unified/read-book.d.ts +2 -1
- package/dist/memory/unified/worker-protocol.d.ts +4 -0
- package/dist/memory-taps.d.ts +1 -1
- package/dist/memory-worker.js +18 -3
- package/dist/service/install-prep.d.ts +21 -1
- package/dist/service/instance-lock.d.ts +88 -0
- package/dist/service/launchd.d.ts +1 -1
- package/dist/service/runtime-config-dir.d.ts +15 -0
- package/dist/service/status.d.ts +3 -5
- package/dist/service/systemd.d.ts +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/ws-server.d.ts +5 -1
- package/package.json +1 -1
|
@@ -23,6 +23,9 @@ export interface ItemWriteRequest {
|
|
|
23
23
|
sourceRef?: string;
|
|
24
24
|
vec?: Float32Array | null;
|
|
25
25
|
vecModelId?: string | null;
|
|
26
|
+
/** Owner grants plan 4 Task 16 (T-30): who wrote the line and, for an agent line, its origin (sealed in the record). */
|
|
27
|
+
role?: "peer" | "agent";
|
|
28
|
+
origin?: "fast_path" | "reply" | "untrusted";
|
|
26
29
|
/** Pins and migrated notes: one item, never chunked. */
|
|
27
30
|
noChunk?: true;
|
|
28
31
|
/** Task 30: a migrated source row changed since the marker: replace the item with the same source_ref, same trust. */
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
* marker to just past the clear in the store's clear transaction (fix round 1), so no later run re-imports pre-clear
|
|
13
13
|
* history (a clear keeps history, section 14.4). After a disable or a purge the markers stay, so a later run resumes.
|
|
14
14
|
*/
|
|
15
|
+
import { type LineOrigin } from "../../grants/voice-fence.js";
|
|
15
16
|
import { type SqliteMlsStateStore } from "@agentvault/connect-mls-store";
|
|
16
17
|
import { type ServiceLog } from "../../service-log.js";
|
|
17
18
|
import type { ItemBook } from "./item-book.js";
|
|
@@ -35,6 +36,16 @@ export interface MigrationDeps {
|
|
|
35
36
|
* never migrated, never retried, holds nothing); "unknown" when it cannot be classified now (retried on a later run).
|
|
36
37
|
*/
|
|
37
38
|
classify: (conversationId: string) => MigrationClass;
|
|
39
|
+
/**
|
|
40
|
+
* Owner grants plan 4 Task 16 (T-30): the origin of an agent history row, so a fast-path line migrated from 0.30.0 on
|
|
41
|
+
* is marked. Absent: the row's own origin, else the pure rule with no fast-id knowledge (classifyAgentLine).
|
|
42
|
+
*/
|
|
43
|
+
classifyHistoryOrigin?: (conversationId: string, row: {
|
|
44
|
+
messageId: string | null;
|
|
45
|
+
modality: string;
|
|
46
|
+
origin?: LineOrigin;
|
|
47
|
+
recordedAt: number;
|
|
48
|
+
}) => LineOrigin;
|
|
38
49
|
/** Called after a conversation's notes committed pins (the bridge empties its pin cache under the memory mutex, as Task 28 does). */
|
|
39
50
|
pinsChanged?: () => Promise<void>;
|
|
40
51
|
/**
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
import { type SqliteMlsStateStore } from "@agentvault/connect-mls-store";
|
|
9
9
|
import type { Embedder } from "../embedder/client.js";
|
|
10
10
|
import type { RankingClient } from "./ranking-client.js";
|
|
11
|
+
import type { OpenedItem } from "./worker-protocol.js";
|
|
11
12
|
export interface UnifiedFrameItem {
|
|
12
13
|
block: "pinned" | "owner" | "reference";
|
|
13
14
|
id: number;
|
|
@@ -63,7 +64,7 @@ export declare class UnifiedReadBook {
|
|
|
63
64
|
kind: "text" | "voice";
|
|
64
65
|
}): Promise<void>;
|
|
65
66
|
/** ws flush (synchronous): the entry's own channel and owner scope, its capture still current (H-4, U11). */
|
|
66
|
-
deliverable(messageId: string, channelId: string, scopeIdNow: string): {
|
|
67
|
+
deliverable(messageId: string, channelId: string, scopeIdNow: string, keep?: (i: OpenedItem) => boolean): {
|
|
67
68
|
items: UnifiedFrameItem[];
|
|
68
69
|
pinnedMore: number;
|
|
69
70
|
} | undefined;
|
|
@@ -38,6 +38,10 @@ export interface OpenedItem {
|
|
|
38
38
|
source: ItemSource;
|
|
39
39
|
trust: ItemTrust;
|
|
40
40
|
text: string;
|
|
41
|
+
/** Owner grants plan 4 Task 16 (voice fence, OQ-9): text only, from the sealed record and the row's clear source_ref. */
|
|
42
|
+
role?: "peer" | "agent";
|
|
43
|
+
origin?: "fast_path" | "reply" | "untrusted";
|
|
44
|
+
sourceRef?: string;
|
|
41
45
|
}
|
|
42
46
|
export type ToWorker = {
|
|
43
47
|
type: "query";
|
package/dist/memory-taps.d.ts
CHANGED
|
@@ -15,5 +15,5 @@ interface MemorySink {
|
|
|
15
15
|
export declare function recordInboundMemory(sink: MemorySink, channelId: string, senderId: string, text: string, messageId: string, modality?: "text" | "voice", expectPurgeEpoch?: number): Promise<void>;
|
|
16
16
|
/** Record the agent's own outbound reply. Best-effort. `modality` is "voice"
|
|
17
17
|
* for a line the voice fast path spoke (H1), else "text". */
|
|
18
|
-
export declare function recordOutboundMemory(sink: MemorySink, channelId: string, text: string, messageId: string, modality?: "text" | "voice", expectPurgeEpoch?: number): Promise<void>;
|
|
18
|
+
export declare function recordOutboundMemory(sink: MemorySink, channelId: string, text: string, messageId: string, modality?: "text" | "voice", expectPurgeEpoch?: number, origin?: "fast_path" | "reply" | "untrusted"): Promise<void>;
|
|
19
19
|
export {};
|
package/dist/memory-worker.js
CHANGED
|
@@ -150,7 +150,7 @@ function decodeItemRecord(b) {
|
|
|
150
150
|
}
|
|
151
151
|
if (!o || typeof o !== "object" || Array.isArray(o))
|
|
152
152
|
return null;
|
|
153
|
-
const { v, t, s, tr, sr, c } = o;
|
|
153
|
+
const { v, t, s, tr, sr, c, ro, or } = o;
|
|
154
154
|
if (v !== 1 || typeof t !== "string" || typeof s !== "string" || !ITEM_SOURCES.includes(s))
|
|
155
155
|
return null;
|
|
156
156
|
if (tr !== "owner" && tr !== "reference")
|
|
@@ -161,7 +161,19 @@ function decodeItemRecord(b) {
|
|
|
161
161
|
return null;
|
|
162
162
|
if (c !== void 0 && (typeof c !== "number" || !Number.isSafeInteger(c) || c < 1))
|
|
163
163
|
return null;
|
|
164
|
-
|
|
164
|
+
if (ro !== void 0 && ro !== "peer" && ro !== "agent")
|
|
165
|
+
return null;
|
|
166
|
+
if (or !== void 0 && or !== "fast_path" && or !== "reply" && or !== "untrusted")
|
|
167
|
+
return null;
|
|
168
|
+
return {
|
|
169
|
+
text: t,
|
|
170
|
+
source: s,
|
|
171
|
+
trust: tr,
|
|
172
|
+
...sr !== void 0 ? { sourceRef: sr } : {},
|
|
173
|
+
...c !== void 0 ? { chunks: c } : {},
|
|
174
|
+
...ro !== void 0 ? { role: ro } : {},
|
|
175
|
+
...or !== void 0 ? { origin: or } : {}
|
|
176
|
+
};
|
|
165
177
|
}
|
|
166
178
|
|
|
167
179
|
// src/memory/unified/ranking-core.ts
|
|
@@ -422,7 +434,10 @@ var RankingCore = class {
|
|
|
422
434
|
originAt: Number(r.origin_at),
|
|
423
435
|
source: rec.source,
|
|
424
436
|
trust: rec.trust,
|
|
425
|
-
text: rec.text
|
|
437
|
+
text: rec.text,
|
|
438
|
+
...rec.role !== void 0 ? { role: rec.role } : {},
|
|
439
|
+
...rec.origin !== void 0 ? { origin: rec.origin } : {},
|
|
440
|
+
...rec.sourceRef !== void 0 ? { sourceRef: rec.sourceRef } : {}
|
|
426
441
|
};
|
|
427
442
|
}
|
|
428
443
|
/** H-7: one batched statement, LIMIT 5,001 per MAC inside the allowed scopes; a MAC that fills its limit is skipped. */
|
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
import { type ServiceInput } from "./config.js";
|
|
2
2
|
import { type AutoWireDeps } from "./harness-wire.js";
|
|
3
|
+
/** The parsed `/healthz` body fields the install and status liveness checks read. */
|
|
4
|
+
export interface DaemonHealth {
|
|
5
|
+
agent_sessions?: number;
|
|
6
|
+
evictions?: number;
|
|
7
|
+
state?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Liveness is a routed `/healthz` 200 whose state is not `session_superseded`
|
|
11
|
+
* (P-2). A TCP accept proves nothing: the daemon pre-binds its port before
|
|
12
|
+
* `agent.start()`, so a connect succeeds before the bridge routes anything.
|
|
13
|
+
*/
|
|
14
|
+
export declare function isDaemonRouted(h: DaemonHealth | null): h is DaemonHealth;
|
|
15
|
+
/** Default install wait: the boot drain may take up to BOOT_DRAIN_WAIT_MS_DEFAULT, plus 15 s. */
|
|
16
|
+
export declare const VERIFY_BUDGET_MS: number;
|
|
3
17
|
export interface PrepDeps {
|
|
4
18
|
readFile: (p: string) => string;
|
|
5
19
|
writeFileMode: (p: string, data: string, mode: number) => void;
|
|
@@ -8,8 +22,11 @@ export interface PrepDeps {
|
|
|
8
22
|
realpath: (p: string) => string;
|
|
9
23
|
listDir: (p: string) => string[];
|
|
10
24
|
probeBindFree: (port: number) => boolean;
|
|
11
|
-
|
|
25
|
+
/** Routed `/healthz` probe (P-2): null unless the daemon answered a 200 with parseable JSON. */
|
|
26
|
+
getHealth: (port: number) => DaemonHealth | null;
|
|
12
27
|
sleep: (ms: number) => Promise<void>;
|
|
28
|
+
/** Wall clock in ms (Date.now). verifyDaemonUp's deadline reads it, so probe time counts, not only sleep. */
|
|
29
|
+
now: () => number;
|
|
13
30
|
}
|
|
14
31
|
export interface ParsedCredential {
|
|
15
32
|
deviceId: string;
|
|
@@ -19,6 +36,9 @@ export interface ParsedCredential {
|
|
|
19
36
|
export declare function assertReadableCredential(absPath: string, deps: PrepDeps): ParsedCredential;
|
|
20
37
|
export declare function durableDir(home: string, slug: string): string;
|
|
21
38
|
export declare function durableCredentialPath(home: string, slug: string): string;
|
|
39
|
+
/** M5 (OQ-3): the approved refusal text for an identity that is already installed. */
|
|
40
|
+
export declare class InstallRefusedError extends Error {
|
|
41
|
+
}
|
|
22
42
|
export declare function takeCustody(args: {
|
|
23
43
|
home: string;
|
|
24
44
|
slug: string;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type { ServiceLog } from "../service-log.js";
|
|
2
|
+
/** An unparseable lock this young may be a holder mid-write. */
|
|
3
|
+
export declare const LOCK_PARTIAL_WRITE_GRACE_MS = 10000;
|
|
4
|
+
/** A takeover guard this old was left by a crashed takeover. */
|
|
5
|
+
export declare const LOCK_TAKEOVER_GUARD_STALE_MS = 30000;
|
|
6
|
+
/** Two boot-epoch reads further apart than this are two different boots. */
|
|
7
|
+
export declare const BOOT_TOLERANCE_SEC = 120;
|
|
8
|
+
/** A holder refreshes its lock's mtime this often (#808 N1). */
|
|
9
|
+
export declare const LOCK_HEARTBEAT_MS = 60000;
|
|
10
|
+
/** A same-kernel, other-hostname lock untouched for this long is abandoned. */
|
|
11
|
+
export declare const LOCK_FOREIGN_STALE_MS: number;
|
|
12
|
+
export type LockRefusal = "held" | "foreign_host" | "unreadable" | "busy" | "failed";
|
|
13
|
+
export type LockResult = "acquired" | LockRefusal;
|
|
14
|
+
/** Everything the lock reads about the machine. Injected in tests. */
|
|
15
|
+
export interface LockEnv {
|
|
16
|
+
pid: number;
|
|
17
|
+
hostname(): string;
|
|
18
|
+
/** Linux boot_id, or undefined where the platform has none. */
|
|
19
|
+
bootId(): string | undefined;
|
|
20
|
+
bootEpochSec(): number;
|
|
21
|
+
/** Linux /proc/<pid>/stat start time, or undefined (not Linux / no such pid). */
|
|
22
|
+
procStart(pid: number): string | undefined;
|
|
23
|
+
/** kill(pid, 0): true when running (EPERM counts as running). */
|
|
24
|
+
pidAlive(pid: number): boolean;
|
|
25
|
+
/** Test seam: runs after the takeover guard is taken, before the re-read. */
|
|
26
|
+
beforeTakeoverReread?(): void;
|
|
27
|
+
/** Test seam: runs after the stale lock is unlinked, before our create. */
|
|
28
|
+
beforeTakeoverCreate?(): void;
|
|
29
|
+
/** Test seam: runs after an O_EXCL create found the lock, before it is read. */
|
|
30
|
+
beforeLockRead?(): void;
|
|
31
|
+
}
|
|
32
|
+
/** Field 22 of /proc/<pid>/stat. The comm field (2) may contain spaces or
|
|
33
|
+
* parentheses, so fields are counted from the LAST ')'. */
|
|
34
|
+
export declare function procStartFromStat(stat: string): string | undefined;
|
|
35
|
+
export declare function pidAliveByKill(pid: number): boolean;
|
|
36
|
+
export declare const realLockEnv: LockEnv;
|
|
37
|
+
export declare class InstanceLock {
|
|
38
|
+
readonly path: string;
|
|
39
|
+
private readonly env;
|
|
40
|
+
private readonly log;
|
|
41
|
+
private readonly heartbeatMs;
|
|
42
|
+
held: boolean;
|
|
43
|
+
/** The exact body this process wrote (#808 N1): release and the ownership
|
|
44
|
+
* check compare the file against THIS, never against live machine facts
|
|
45
|
+
* (a hostname can change under a running process). */
|
|
46
|
+
private written;
|
|
47
|
+
private heartbeat;
|
|
48
|
+
/** The error behind the last `unreadable` / `failed`, for the caller's one
|
|
49
|
+
* log line (the lock itself never logs a refusal: it is retried per call). */
|
|
50
|
+
lastError: unknown;
|
|
51
|
+
/** PID read from the lock body of the live holder behind the last `held`. */
|
|
52
|
+
private holderPid;
|
|
53
|
+
constructor(path: string, env?: LockEnv, log?: ServiceLog, heartbeatMs?: number);
|
|
54
|
+
private body;
|
|
55
|
+
/** Try to hold the lock. Never throws (#808 L-e: machine reads included). */
|
|
56
|
+
acquire(): {
|
|
57
|
+
result: LockResult;
|
|
58
|
+
holderPid?: number;
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* True while the file is still exactly the body this process wrote. Read
|
|
62
|
+
* before every reserve (one small read), so a holder whose lock was taken
|
|
63
|
+
* while it was frozen stops before it spends (#808 N1). A lost lock is
|
|
64
|
+
* dropped: the caller then refuses, and later calls try to re-acquire.
|
|
65
|
+
*/
|
|
66
|
+
stillHeld(): boolean;
|
|
67
|
+
private acquireUnguarded;
|
|
68
|
+
/** Remove the lock only while it is still exactly the body this process
|
|
69
|
+
* wrote (#808 N1: not the live hostname, which can change under us). */
|
|
70
|
+
release(): void;
|
|
71
|
+
private drop;
|
|
72
|
+
/** We hold it: remember what we wrote (the file as it is now, ours) and
|
|
73
|
+
* start the heartbeat. */
|
|
74
|
+
private took;
|
|
75
|
+
/** Refresh the mtime while the file is still ours; stop if it is not. */
|
|
76
|
+
private beat;
|
|
77
|
+
private sameBoot;
|
|
78
|
+
/** O_EXCL create with our body. A write failure removes the half-written
|
|
79
|
+
* file (it is ours: we created it) and reports `failed`, never throws. */
|
|
80
|
+
private create;
|
|
81
|
+
/**
|
|
82
|
+
* Replace a stale lock. Only the holder of the O_EXCL takeover guard may
|
|
83
|
+
* remove a lock, and only after re-reading it UNCHANGED, so two runtimes
|
|
84
|
+
* that both saw the same stale lock cannot each delete the other's new one.
|
|
85
|
+
* A fresh guard means a takeover is in progress: busy this time.
|
|
86
|
+
*/
|
|
87
|
+
private takeOver;
|
|
88
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { ServiceConfig } from "./config.js";
|
|
2
2
|
/** A deterministic launchd LaunchAgent plist. ProgramArguments re-invoke the
|
|
3
|
-
* running bin in run mode; KeepAlive restarts on
|
|
3
|
+
* running bin in run mode; KeepAlive{SuccessfulExit:false} restarts only on a non-zero exit (a clean exit stays down), RunAtLoad starts at login. */
|
|
4
4
|
export declare function renderLaunchdPlist(cfg: ServiceConfig): string;
|
|
@@ -13,6 +13,21 @@ export interface FsDeps {
|
|
|
13
13
|
unlink: (p: string) => void;
|
|
14
14
|
}
|
|
15
15
|
export declare function runtimeConfigDir(home: string, identityId: string): string;
|
|
16
|
+
/** Owner grants (spec §7.8): the runtime honours a manifest-marked grant only for a tool listed here. */
|
|
17
|
+
export declare const MANIFEST_POLICY_FILE = "manifest-policy.json";
|
|
18
|
+
export interface ManifestPolicyDoc {
|
|
19
|
+
readonly v: 1;
|
|
20
|
+
readonly manifest_tools: readonly string[];
|
|
21
|
+
readonly secret_path_mode: "enforce";
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Owner grants review H-2: under a manifest whose config signs no llm, a managed llm-source.json (written before the
|
|
25
|
+
* manifest, by an unsigned config) must not stay in force. The one deletion in this directory, by name, bridge-only.
|
|
26
|
+
* ENOENT is success; any other error throws.
|
|
27
|
+
*/
|
|
28
|
+
export declare function removeManagedLlmSource(home: string, identityId: string, deps?: FsDeps): void;
|
|
29
|
+
/** The bridge's own writer for manifest-policy.json (writeManagedFiles refuses the name). Atomic, 0600. Throws. */
|
|
30
|
+
export declare function writeManifestPolicy(home: string, identityId: string, policy: ManifestPolicyDoc, deps?: FsDeps): void;
|
|
16
31
|
export declare function writeManagedFiles(home: string, identityId: string, files: Record<string, string>, deps?: FsDeps): void;
|
|
17
32
|
/** Every path skills.json names, checked on disk. Contents are never read. */
|
|
18
33
|
export declare function checkConfiguredPaths(skillsJson: Record<string, unknown>, statFn?: (p: string) => {
|
package/dist/service/status.d.ts
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import type { AgentFleetEntry } from "./fleet.js";
|
|
2
|
+
import { type DaemonHealth } from "./install-prep.js";
|
|
2
3
|
export interface StatusDeps {
|
|
3
4
|
readFleet: () => AgentFleetEntry[];
|
|
4
|
-
|
|
5
|
-
getHealth: (port: number) =>
|
|
6
|
-
agent_sessions?: number;
|
|
7
|
-
evictions?: number;
|
|
8
|
-
} | null;
|
|
5
|
+
/** Routed `/healthz` probe (P-2): null unless the daemon answered a 200. */
|
|
6
|
+
getHealth: (port: number) => DaemonHealth | null;
|
|
9
7
|
}
|
|
10
8
|
export interface AgentStatusRow {
|
|
11
9
|
slug: string;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { ServiceConfig } from "./config.js";
|
|
2
2
|
/** A systemd --user unit. ExecStart re-invokes the running bin in run mode;
|
|
3
|
-
* Restart=
|
|
3
|
+
* Restart=on-failure supervises crashes only (a clean exit stays down). WantedBy=default.target enables at login. */
|
|
4
4
|
export declare function renderSystemdUnit(cfg: ServiceConfig): string;
|
package/dist/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const BRIDGE_VERSION = "0.
|
|
1
|
+
export declare const BRIDGE_VERSION = "0.30.1";
|
package/dist/ws-server.d.ts
CHANGED
|
@@ -34,6 +34,9 @@ export declare const INFLIGHT_STALE_AFTER_MS: number;
|
|
|
34
34
|
* consumer, so it never carried its notes.
|
|
35
35
|
*/
|
|
36
36
|
export declare const HELLO_WAIT_MS = 2000;
|
|
37
|
+
/** C9: the close code a superseded bridge sends its local runtime sockets;
|
|
38
|
+
* the same code the server sends the bridge (spec §4.1.5, OQ-9). */
|
|
39
|
+
export declare const WS_CLOSE_SESSION_SUPERSEDED = 4409;
|
|
37
40
|
/** Spec §8.5: the hello-reply feature that tells the runtime it may offer memory_note on this socket. */
|
|
38
41
|
export declare const MEMORY_NOTES_FEATURE = "memory_notes";
|
|
39
42
|
/** Semantic memory 7b (spec §7.2 Q4): the hello feature a runtime declares to receive `memory.recall`; the bridge echoes it. */
|
|
@@ -48,8 +51,9 @@ export declare const MEMORY_UNIFIED_FEATURE = "memory_unified";
|
|
|
48
51
|
* fake against this list at run time (7b gate fix: a member added here without
|
|
49
52
|
* a fake made three tests throw "is not a function").
|
|
50
53
|
*/
|
|
51
|
-
export declare const WS_AGENT_MEMBERS: readonly ["ackRuntimeMessages", "action", "admitRuntimeDelivery", "applyMemoryNote", "clearHarnessReport", "clearPerToolConsumer", "isRuntimeMessageRetired", "noteNotesConsumer", "notePerToolConsumer", "noteRecallConsumer", "noteUnifiedConsumer", "noteSessionClose", "noteSessionEvicted", "noteSessionOpen", "notesAppliedGeneration", "notesForDelivery", "recallForDelivery", "unifiedFeatureOn", "unifiedForDelivery", "recordHarnessReport", "recordRuntimeReply", "reportStatusGated", "requeueFailedRuntimeDeliveries", "requeueFront", "runtimeReplyReceipt", "send", "sendA2A", "subscribe", "takeDeliverable", "wakeListeners"];
|
|
54
|
+
export declare const WS_AGENT_MEMBERS: readonly ["ackRuntimeMessages", "action", "admitRuntimeDelivery", "applyMemoryNote", "clearHarnessReport", "clearManifestConsumer", "clearPerToolConsumer", "harnessGrantsWithheld", "isRuntimeMessageRetired", "noteConsumerCapability", "noteManifestConsumer", "noteRoomCapReached", "noteNotesConsumer", "notePerToolConsumer", "noteRecallConsumer", "noteUnifiedConsumer", "noteSessionClose", "noteSessionEvicted", "noteSessionOpen", "notesAppliedGeneration", "notesForDelivery", "recallForDelivery", "unifiedFeatureOn", "unifiedForDelivery", "recordHarnessReport", "recordRuntimeReply", "reportStatusGated", "requeueFailedRuntimeDeliveries", "requeueFront", "runtimeReplyReceipt", "send", "sendA2A", "subscribe", "takeDeliverable", "wakeListeners"];
|
|
52
55
|
export type WsAgent = Pick<BridgeAgent, (typeof WS_AGENT_MEMBERS)[number]>;
|
|
53
56
|
export declare function attachAgentWebSocket(server: HttpServer, agent: WsAgent, opts: AgentWebSocketOptions): {
|
|
54
57
|
close(): void;
|
|
58
|
+
enterSessionSuperseded(): void;
|
|
55
59
|
};
|