@rivet-dev/agentos-runtime-core 0.0.0-agent-acp-codex-session-benchmark.62b1f46
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 +7 -0
- package/commands/[ +0 -0
- package/commands/_stubs +0 -0
- package/commands/arch +0 -0
- package/commands/awk +0 -0
- package/commands/b2sum +0 -0
- package/commands/base32 +0 -0
- package/commands/base64 +0 -0
- package/commands/basename +0 -0
- package/commands/basenc +0 -0
- package/commands/bash +0 -0
- package/commands/cat +0 -0
- package/commands/chcon +0 -0
- package/commands/chgrp +0 -0
- package/commands/chmod +0 -0
- package/commands/chown +0 -0
- package/commands/chroot +0 -0
- package/commands/cksum +0 -0
- package/commands/codex +0 -0
- package/commands/codex-exec +0 -0
- package/commands/column +0 -0
- package/commands/comm +0 -0
- package/commands/cp +0 -0
- package/commands/curl +0 -0
- package/commands/cut +0 -0
- package/commands/date +0 -0
- package/commands/dd +0 -0
- package/commands/df +0 -0
- package/commands/diff +0 -0
- package/commands/dir +0 -0
- package/commands/dircolors +0 -0
- package/commands/dirname +0 -0
- package/commands/du +0 -0
- package/commands/echo +0 -0
- package/commands/egrep +0 -0
- package/commands/env +0 -0
- package/commands/envsubst +0 -0
- package/commands/expand +0 -0
- package/commands/expr +0 -0
- package/commands/factor +0 -0
- package/commands/false +0 -0
- package/commands/fd +0 -0
- package/commands/fgrep +0 -0
- package/commands/file +0 -0
- package/commands/find +0 -0
- package/commands/fmt +0 -0
- package/commands/fold +0 -0
- package/commands/git +0 -0
- package/commands/git-remote-http +0 -0
- package/commands/git-remote-https +0 -0
- package/commands/grep +0 -0
- package/commands/groups +0 -0
- package/commands/gunzip +0 -0
- package/commands/gzip +0 -0
- package/commands/head +0 -0
- package/commands/hostid +0 -0
- package/commands/hostname +0 -0
- package/commands/http-test +0 -0
- package/commands/http_get +0 -0
- package/commands/id +0 -0
- package/commands/install +0 -0
- package/commands/join +0 -0
- package/commands/jq +0 -0
- package/commands/kill +0 -0
- package/commands/link +0 -0
- package/commands/ln +0 -0
- package/commands/logname +0 -0
- package/commands/ls +0 -0
- package/commands/md5sum +0 -0
- package/commands/mkdir +0 -0
- package/commands/mkfifo +0 -0
- package/commands/mknod +0 -0
- package/commands/mktemp +0 -0
- package/commands/more +0 -0
- package/commands/mv +0 -0
- package/commands/nice +0 -0
- package/commands/nl +0 -0
- package/commands/nohup +0 -0
- package/commands/nproc +0 -0
- package/commands/numfmt +0 -0
- package/commands/od +0 -0
- package/commands/paste +0 -0
- package/commands/pathchk +0 -0
- package/commands/pinky +0 -0
- package/commands/printenv +0 -0
- package/commands/printf +0 -0
- package/commands/ptx +0 -0
- package/commands/pwd +0 -0
- package/commands/readlink +0 -0
- package/commands/realpath +0 -0
- package/commands/rev +0 -0
- package/commands/rg +0 -0
- package/commands/rm +0 -0
- package/commands/rmdir +0 -0
- package/commands/runcon +0 -0
- package/commands/sed +0 -0
- package/commands/seq +0 -0
- package/commands/sh +0 -0
- package/commands/sha1sum +0 -0
- package/commands/sha224sum +0 -0
- package/commands/sha256sum +0 -0
- package/commands/sha384sum +0 -0
- package/commands/sha512sum +0 -0
- package/commands/shred +0 -0
- package/commands/shuf +0 -0
- package/commands/sleep +0 -0
- package/commands/sort +0 -0
- package/commands/spawn-test-host +0 -0
- package/commands/split +0 -0
- package/commands/sqlite3 +0 -0
- package/commands/stat +0 -0
- package/commands/stdbuf +0 -0
- package/commands/strings +0 -0
- package/commands/stty +0 -0
- package/commands/sum +0 -0
- package/commands/sync +0 -0
- package/commands/tac +0 -0
- package/commands/tail +0 -0
- package/commands/tar +0 -0
- package/commands/tee +0 -0
- package/commands/test +0 -0
- package/commands/timeout +0 -0
- package/commands/touch +0 -0
- package/commands/tr +0 -0
- package/commands/tree +0 -0
- package/commands/true +0 -0
- package/commands/truncate +0 -0
- package/commands/tsort +0 -0
- package/commands/tty +0 -0
- package/commands/uname +0 -0
- package/commands/unexpand +0 -0
- package/commands/uniq +0 -0
- package/commands/unlink +0 -0
- package/commands/unzip +0 -0
- package/commands/uptime +0 -0
- package/commands/users +0 -0
- package/commands/vdir +0 -0
- package/commands/wc +0 -0
- package/commands/which +0 -0
- package/commands/who +0 -0
- package/commands/whoami +0 -0
- package/commands/xargs +0 -0
- package/commands/xu +0 -0
- package/commands/yes +0 -0
- package/commands/yq +0 -0
- package/commands/zcat +0 -0
- package/commands/zip +0 -0
- package/dist/binary.d.ts +4 -0
- package/dist/binary.js +25 -0
- package/dist/bytes.d.ts +2 -0
- package/dist/bytes.js +6 -0
- package/dist/callbacks.d.ts +41 -0
- package/dist/callbacks.js +94 -0
- package/dist/correlation.d.ts +7 -0
- package/dist/correlation.js +52 -0
- package/dist/descriptors.d.ts +81 -0
- package/dist/descriptors.js +57 -0
- package/dist/event-buffer.d.ts +98 -0
- package/dist/event-buffer.js +333 -0
- package/dist/ext.d.ts +7 -0
- package/dist/ext.js +13 -0
- package/dist/filesystem.d.ts +33 -0
- package/dist/filesystem.js +52 -0
- package/dist/frame-payload-codec.d.ts +8 -0
- package/dist/frame-payload-codec.js +14 -0
- package/dist/frame-rpc.d.ts +45 -0
- package/dist/frame-rpc.js +98 -0
- package/dist/frame-stream.d.ts +34 -0
- package/dist/frame-stream.js +109 -0
- package/dist/framing.d.ts +8 -0
- package/dist/framing.js +23 -0
- package/dist/generated/AcpLimitsConfig.d.ts +4 -0
- package/dist/generated/AcpLimitsConfig.js +2 -0
- package/dist/generated/CreateVmConfig.d.ts +26 -0
- package/dist/generated/CreateVmConfig.js +1 -0
- package/dist/generated/FsPermissionRule.d.ts +6 -0
- package/dist/generated/FsPermissionRule.js +1 -0
- package/dist/generated/FsPermissionRuleSet.d.ts +6 -0
- package/dist/generated/FsPermissionRuleSet.js +1 -0
- package/dist/generated/FsPermissionScope.d.ts +3 -0
- package/dist/generated/FsPermissionScope.js +1 -0
- package/dist/generated/HttpLimitsConfig.d.ts +3 -0
- package/dist/generated/HttpLimitsConfig.js +2 -0
- package/dist/generated/JsModuleResolution.d.ts +1 -0
- package/dist/generated/JsModuleResolution.js +2 -0
- package/dist/generated/JsRuntimeConfig.d.ts +31 -0
- package/dist/generated/JsRuntimeConfig.js +1 -0
- package/dist/generated/JsRuntimeLimitsConfig.d.ts +8 -0
- package/dist/generated/JsRuntimeLimitsConfig.js +2 -0
- package/dist/generated/JsRuntimePlatform.d.ts +1 -0
- package/dist/generated/JsRuntimePlatform.js +2 -0
- package/dist/generated/MountPluginDescriptor.d.ts +4 -0
- package/dist/generated/MountPluginDescriptor.js +2 -0
- package/dist/generated/NativeRootFilesystemConfig.d.ts +5 -0
- package/dist/generated/NativeRootFilesystemConfig.js +1 -0
- package/dist/generated/PatternPermissionRule.d.ts +6 -0
- package/dist/generated/PatternPermissionRule.js +1 -0
- package/dist/generated/PatternPermissionRuleSet.d.ts +6 -0
- package/dist/generated/PatternPermissionRuleSet.js +1 -0
- package/dist/generated/PatternPermissionScope.d.ts +3 -0
- package/dist/generated/PatternPermissionScope.js +1 -0
- package/dist/generated/PermissionMode.d.ts +1 -0
- package/dist/generated/PermissionMode.js +2 -0
- package/dist/generated/PermissionsPolicy.d.ts +10 -0
- package/dist/generated/PermissionsPolicy.js +1 -0
- package/dist/generated/PluginLimitsConfig.d.ts +4 -0
- package/dist/generated/PluginLimitsConfig.js +2 -0
- package/dist/generated/PythonLimitsConfig.d.ts +6 -0
- package/dist/generated/PythonLimitsConfig.js +2 -0
- package/dist/generated/ResourceLimitsConfig.d.ts +24 -0
- package/dist/generated/ResourceLimitsConfig.js +2 -0
- package/dist/generated/RootFilesystemConfig.d.ts +9 -0
- package/dist/generated/RootFilesystemConfig.js +1 -0
- package/dist/generated/RootFilesystemEntry.d.ts +13 -0
- package/dist/generated/RootFilesystemEntry.js +1 -0
- package/dist/generated/RootFilesystemEntryEncoding.d.ts +1 -0
- package/dist/generated/RootFilesystemEntryEncoding.js +2 -0
- package/dist/generated/RootFilesystemEntryKind.d.ts +1 -0
- package/dist/generated/RootFilesystemEntryKind.js +2 -0
- package/dist/generated/RootFilesystemLowerDescriptor.d.ts +7 -0
- package/dist/generated/RootFilesystemLowerDescriptor.js +1 -0
- package/dist/generated/RootFilesystemMode.d.ts +1 -0
- package/dist/generated/RootFilesystemMode.js +2 -0
- package/dist/generated/ToolLimitsConfig.d.ts +10 -0
- package/dist/generated/ToolLimitsConfig.js +2 -0
- package/dist/generated/VmDnsConfig.d.ts +6 -0
- package/dist/generated/VmDnsConfig.js +2 -0
- package/dist/generated/VmLimitsConfig.d.ts +18 -0
- package/dist/generated/VmLimitsConfig.js +1 -0
- package/dist/generated/VmListenPolicyConfig.d.ts +5 -0
- package/dist/generated/VmListenPolicyConfig.js +2 -0
- package/dist/generated/WasmLimitsConfig.d.ts +7 -0
- package/dist/generated/WasmLimitsConfig.js +2 -0
- package/dist/generated-protocol.d.ts +1452 -0
- package/dist/generated-protocol.js +3936 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.js +26 -0
- package/dist/json.d.ts +2 -0
- package/dist/json.js +20 -0
- package/dist/native-client.d.ts +47 -0
- package/dist/native-client.js +136 -0
- package/dist/numbers.d.ts +1 -0
- package/dist/numbers.js +8 -0
- package/dist/ownership.d.ts +18 -0
- package/dist/ownership.js +77 -0
- package/dist/permissions.d.ts +29 -0
- package/dist/permissions.js +68 -0
- package/dist/process.d.ts +22 -0
- package/dist/process.js +97 -0
- package/dist/protocol-client.d.ts +67 -0
- package/dist/protocol-client.js +270 -0
- package/dist/protocol-frames.d.ts +68 -0
- package/dist/protocol-frames.js +139 -0
- package/dist/protocol-maps.d.ts +31 -0
- package/dist/protocol-maps.js +273 -0
- package/dist/protocol-schema.d.ts +10 -0
- package/dist/protocol-schema.js +11 -0
- package/dist/request-payloads.d.ts +207 -0
- package/dist/request-payloads.js +357 -0
- package/dist/response-payloads.d.ts +268 -0
- package/dist/response-payloads.js +402 -0
- package/dist/sidecar-client.d.ts +19 -0
- package/dist/sidecar-client.js +1 -0
- package/dist/sidecar-errors.d.ts +44 -0
- package/dist/sidecar-errors.js +62 -0
- package/dist/sidecar-process.d.ts +434 -0
- package/dist/sidecar-process.js +1252 -0
- package/dist/state.d.ts +42 -0
- package/dist/state.js +45 -0
- package/dist/vm-config.d.ts +31 -0
- package/dist/vm-config.js +1 -0
- package/package.json +189 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export class PendingResponseRegistry {
|
|
2
|
+
pending = new Map();
|
|
3
|
+
// Deliberately no per-request timer: local framed stdio never loses frames,
|
|
4
|
+
// so a response is bounded by the transport's silence watchdog (a dead or
|
|
5
|
+
// wedged sidecar rejects all pending requests through `rejectAll`) rather
|
|
6
|
+
// than by guessing how long any one request should take.
|
|
7
|
+
waitForResponse(requestId, onResponse) {
|
|
8
|
+
if (this.pending.has(requestId)) {
|
|
9
|
+
throw new Error(`response waiter already registered for request ${requestId}`);
|
|
10
|
+
}
|
|
11
|
+
return new Promise((resolve, reject) => {
|
|
12
|
+
this.pending.set(requestId, {
|
|
13
|
+
resolve: (frame) => {
|
|
14
|
+
this.pending.delete(requestId);
|
|
15
|
+
try {
|
|
16
|
+
onResponse?.(frame);
|
|
17
|
+
resolve(frame);
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
reject(error instanceof Error ? error : new Error(String(error)));
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
reject: (error) => {
|
|
24
|
+
this.pending.delete(requestId);
|
|
25
|
+
reject(error);
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
resolve(requestId, frame) {
|
|
31
|
+
const pending = this.pending.get(requestId);
|
|
32
|
+
if (!pending) {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
pending.resolve(frame);
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
reject(requestId, error) {
|
|
39
|
+
const pending = this.pending.get(requestId);
|
|
40
|
+
if (!pending) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
pending.reject(error);
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
rejectAll(error) {
|
|
47
|
+
for (const pending of this.pending.values()) {
|
|
48
|
+
pending.reject(error);
|
|
49
|
+
}
|
|
50
|
+
this.pending.clear();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type * as protocol from "./generated-protocol.js";
|
|
2
|
+
export type LiveSidecarPlacement = {
|
|
3
|
+
kind: "shared";
|
|
4
|
+
pool?: string | null;
|
|
5
|
+
} | {
|
|
6
|
+
kind: "explicit";
|
|
7
|
+
sidecar_id: string;
|
|
8
|
+
};
|
|
9
|
+
export type MountConfigJsonPrimitive = string | number | boolean | null;
|
|
10
|
+
export type MountConfigJsonValue = MountConfigJsonPrimitive | MountConfigJsonObject | MountConfigJsonValue[];
|
|
11
|
+
export interface MountConfigJsonObject {
|
|
12
|
+
[key: string]: MountConfigJsonValue | undefined;
|
|
13
|
+
}
|
|
14
|
+
export interface NativeMountPluginDescriptor<TConfig extends MountConfigJsonObject = MountConfigJsonObject> {
|
|
15
|
+
id: string;
|
|
16
|
+
config?: TConfig;
|
|
17
|
+
}
|
|
18
|
+
export interface S3MountCredentialsConfig {
|
|
19
|
+
accessKeyId: string;
|
|
20
|
+
secretAccessKey: string;
|
|
21
|
+
}
|
|
22
|
+
export interface ObjectS3MountConfig {
|
|
23
|
+
bucket: string;
|
|
24
|
+
prefix?: string;
|
|
25
|
+
region?: string;
|
|
26
|
+
credentials?: S3MountCredentialsConfig;
|
|
27
|
+
endpoint?: string;
|
|
28
|
+
uid?: number;
|
|
29
|
+
gid?: number;
|
|
30
|
+
fileMode?: number;
|
|
31
|
+
dirMode?: number;
|
|
32
|
+
}
|
|
33
|
+
export interface ChunkedS3MountConfig {
|
|
34
|
+
bucket: string;
|
|
35
|
+
prefix?: string;
|
|
36
|
+
region?: string;
|
|
37
|
+
credentials?: S3MountCredentialsConfig;
|
|
38
|
+
endpoint?: string;
|
|
39
|
+
metadataBackend?: "sqlite" | "local" | "callback";
|
|
40
|
+
metadataPath?: string;
|
|
41
|
+
mountId?: string;
|
|
42
|
+
chunkSize?: number;
|
|
43
|
+
inlineThreshold?: number;
|
|
44
|
+
uid?: number;
|
|
45
|
+
gid?: number;
|
|
46
|
+
fileMode?: number;
|
|
47
|
+
dirMode?: number;
|
|
48
|
+
metadataCacheEntries?: number;
|
|
49
|
+
}
|
|
50
|
+
export interface ChunkedLocalMountConfig {
|
|
51
|
+
metadataPath: string;
|
|
52
|
+
blockRoot: string;
|
|
53
|
+
chunkSize?: number;
|
|
54
|
+
inlineThreshold?: number;
|
|
55
|
+
uid?: number;
|
|
56
|
+
gid?: number;
|
|
57
|
+
fileMode?: number;
|
|
58
|
+
dirMode?: number;
|
|
59
|
+
metadataCacheEntries?: number;
|
|
60
|
+
}
|
|
61
|
+
export declare function objectS3MountPlugin(config: ObjectS3MountConfig): NativeMountPluginDescriptor;
|
|
62
|
+
export declare function chunkedS3MountPlugin(config: ChunkedS3MountConfig): NativeMountPluginDescriptor;
|
|
63
|
+
export declare function chunkedLocalMountPlugin(config: ChunkedLocalMountConfig): NativeMountPluginDescriptor;
|
|
64
|
+
export interface LiveMountDescriptor {
|
|
65
|
+
guest_path: string;
|
|
66
|
+
read_only?: boolean;
|
|
67
|
+
plugin: NativeMountPluginDescriptor;
|
|
68
|
+
}
|
|
69
|
+
/** Opaque package transport. Native callers forward a trusted host path;
|
|
70
|
+
* browser package managers forward the complete `.aospkg` bytes. Neither form
|
|
71
|
+
* carries parsed package metadata. */
|
|
72
|
+
export type LivePackageDescriptor = {
|
|
73
|
+
path: string;
|
|
74
|
+
content?: never;
|
|
75
|
+
} | {
|
|
76
|
+
content: Uint8Array;
|
|
77
|
+
path?: never;
|
|
78
|
+
};
|
|
79
|
+
export declare function toGeneratedSidecarPlacement(placement: LiveSidecarPlacement): protocol.SidecarPlacement;
|
|
80
|
+
export declare function toGeneratedMountDescriptor(descriptor: LiveMountDescriptor): protocol.MountDescriptor;
|
|
81
|
+
export declare function toGeneratedPackageDescriptor(descriptor: LivePackageDescriptor): protocol.PackageDescriptor;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { toExactArrayBuffer } from "./bytes.js";
|
|
2
|
+
import { stringifyJsonUtf8 } from "./json.js";
|
|
3
|
+
export function objectS3MountPlugin(config) {
|
|
4
|
+
return {
|
|
5
|
+
id: "object_s3",
|
|
6
|
+
config: config,
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export function chunkedS3MountPlugin(config) {
|
|
10
|
+
return {
|
|
11
|
+
id: "chunked_s3",
|
|
12
|
+
config: config,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export function chunkedLocalMountPlugin(config) {
|
|
16
|
+
return {
|
|
17
|
+
id: "chunked_local",
|
|
18
|
+
config: config,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export function toGeneratedSidecarPlacement(placement) {
|
|
22
|
+
switch (placement.kind) {
|
|
23
|
+
case "shared":
|
|
24
|
+
return {
|
|
25
|
+
tag: "SidecarPlacementShared",
|
|
26
|
+
val: { pool: placement.pool ?? null },
|
|
27
|
+
};
|
|
28
|
+
case "explicit":
|
|
29
|
+
return {
|
|
30
|
+
tag: "SidecarPlacementExplicit",
|
|
31
|
+
val: { sidecarId: placement.sidecar_id },
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export function toGeneratedMountDescriptor(descriptor) {
|
|
36
|
+
return {
|
|
37
|
+
guestPath: descriptor.guest_path,
|
|
38
|
+
readOnly: descriptor.read_only ?? null,
|
|
39
|
+
plugin: {
|
|
40
|
+
id: descriptor.plugin.id,
|
|
41
|
+
config: descriptor.plugin.config === undefined
|
|
42
|
+
? null
|
|
43
|
+
: stringifyJsonUtf8(descriptor.plugin.config, "mount plugin config"),
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export function toGeneratedPackageDescriptor(descriptor) {
|
|
48
|
+
return "path" in descriptor && descriptor.path !== undefined
|
|
49
|
+
? {
|
|
50
|
+
tag: "PackagePath",
|
|
51
|
+
val: { path: descriptor.path },
|
|
52
|
+
}
|
|
53
|
+
: {
|
|
54
|
+
tag: "PackageInline",
|
|
55
|
+
val: { content: toExactArrayBuffer(descriptor.content) },
|
|
56
|
+
};
|
|
57
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { type LiveExtEnvelope } from "./ext.js";
|
|
2
|
+
import type * as protocol from "./generated-protocol.js";
|
|
3
|
+
import { type LiveOwnershipScope } from "./ownership.js";
|
|
4
|
+
import { type LiveCronDispatch } from "./response-payloads.js";
|
|
5
|
+
export declare const ANY_BUFFERED_EVENT_KEY = "*";
|
|
6
|
+
export type { LiveOwnershipScope } from "./ownership.js";
|
|
7
|
+
export type LiveSidecarEventPayload = {
|
|
8
|
+
type: "vm_lifecycle";
|
|
9
|
+
state: "creating" | "ready" | "disposing" | "disposed" | "failed";
|
|
10
|
+
} | {
|
|
11
|
+
type: "process_output";
|
|
12
|
+
process_id: string;
|
|
13
|
+
channel: "stdout" | "stderr";
|
|
14
|
+
chunk: Uint8Array;
|
|
15
|
+
} | {
|
|
16
|
+
type: "process_exited";
|
|
17
|
+
process_id: string;
|
|
18
|
+
exit_code: number;
|
|
19
|
+
stdout?: Uint8Array;
|
|
20
|
+
stderr?: Uint8Array;
|
|
21
|
+
error_code?: string;
|
|
22
|
+
error_message?: string;
|
|
23
|
+
} | {
|
|
24
|
+
type: "cron_dispatch";
|
|
25
|
+
dispatch: LiveCronDispatch;
|
|
26
|
+
} | {
|
|
27
|
+
type: "structured";
|
|
28
|
+
name: string;
|
|
29
|
+
detail: Record<string, string>;
|
|
30
|
+
} | {
|
|
31
|
+
type: "ext";
|
|
32
|
+
envelope: LiveExtEnvelope;
|
|
33
|
+
};
|
|
34
|
+
export interface LiveSidecarEventFrame {
|
|
35
|
+
ownership: LiveOwnershipScope;
|
|
36
|
+
payload: LiveSidecarEventPayload;
|
|
37
|
+
}
|
|
38
|
+
export type LiveSidecarEventSelector = {
|
|
39
|
+
any: true;
|
|
40
|
+
} | {
|
|
41
|
+
type: "vm_lifecycle";
|
|
42
|
+
ownership?: LiveOwnershipScope;
|
|
43
|
+
state?: Extract<LiveSidecarEventPayload, {
|
|
44
|
+
type: "vm_lifecycle";
|
|
45
|
+
}>["state"];
|
|
46
|
+
} | {
|
|
47
|
+
type: "process_output";
|
|
48
|
+
ownership?: LiveOwnershipScope;
|
|
49
|
+
processId?: string;
|
|
50
|
+
channel?: Extract<LiveSidecarEventPayload, {
|
|
51
|
+
type: "process_output";
|
|
52
|
+
}>["channel"];
|
|
53
|
+
} | {
|
|
54
|
+
type: "process_exited";
|
|
55
|
+
ownership?: LiveOwnershipScope;
|
|
56
|
+
processId?: string;
|
|
57
|
+
} | {
|
|
58
|
+
type: "structured";
|
|
59
|
+
ownership?: LiveOwnershipScope;
|
|
60
|
+
name?: string;
|
|
61
|
+
detail?: Record<string, string>;
|
|
62
|
+
};
|
|
63
|
+
export type LiveSidecarBufferedEventRecord<TEvent extends LiveSidecarEventFrame> = {
|
|
64
|
+
event: TEvent;
|
|
65
|
+
keys: readonly string[];
|
|
66
|
+
};
|
|
67
|
+
export type LiveSidecarEventWaitMatcher<TEvent extends LiveSidecarEventFrame> = {
|
|
68
|
+
matches: (event: TEvent) => boolean;
|
|
69
|
+
bufferKey: string | null;
|
|
70
|
+
};
|
|
71
|
+
export declare class SidecarEventBufferOverflow extends Error {
|
|
72
|
+
readonly capacity: number;
|
|
73
|
+
readonly bufferedEvents: number;
|
|
74
|
+
readonly eventType: LiveSidecarEventPayload["type"];
|
|
75
|
+
constructor(options: {
|
|
76
|
+
capacity: number;
|
|
77
|
+
bufferedEvents: number;
|
|
78
|
+
eventType: LiveSidecarEventPayload["type"];
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
export declare class SidecarEventBuffer<TEvent extends LiveSidecarEventFrame> {
|
|
82
|
+
private readonly capacity;
|
|
83
|
+
private readonly bufferedEvents;
|
|
84
|
+
private readonly bufferedEventQueues;
|
|
85
|
+
private nextBufferedEventId;
|
|
86
|
+
constructor(capacity: number);
|
|
87
|
+
get size(): number;
|
|
88
|
+
buffer(event: TEvent): SidecarEventBufferOverflow | null;
|
|
89
|
+
take(matcher: LiveSidecarEventWaitMatcher<TEvent>): TEvent | null;
|
|
90
|
+
private takeFromKey;
|
|
91
|
+
private remove;
|
|
92
|
+
}
|
|
93
|
+
export declare function sidecarSelectorMatchesEvent<TEvent extends LiveSidecarEventFrame>(selector: LiveSidecarEventSelector, event: TEvent): boolean;
|
|
94
|
+
export declare function sidecarSelectorBufferKey(selector: LiveSidecarEventSelector): string | null;
|
|
95
|
+
export declare function normalizeSidecarEventMatcher<TEvent extends LiveSidecarEventFrame>(selector: LiveSidecarEventSelector | ((event: TEvent) => boolean)): LiveSidecarEventWaitMatcher<TEvent>;
|
|
96
|
+
export declare function fromGeneratedEventPayload(payload: protocol.EventPayload): LiveSidecarEventPayload;
|
|
97
|
+
export declare function sidecarEventWaitAbortError(reason: unknown): Error;
|
|
98
|
+
export declare function sidecarEventBufferKeys<TEvent extends LiveSidecarEventFrame>(event: TEvent): string[];
|
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
import { fromGeneratedExtEnvelope } from "./ext.js";
|
|
2
|
+
import { ownershipMatchesSelector, ownershipSelectorKey, } from "./ownership.js";
|
|
3
|
+
import { fromGeneratedStreamChannel, fromGeneratedVmLifecycleState, } from "./protocol-maps.js";
|
|
4
|
+
import { fromGeneratedCronDispatch, } from "./response-payloads.js";
|
|
5
|
+
export const ANY_BUFFERED_EVENT_KEY = "*";
|
|
6
|
+
export class SidecarEventBufferOverflow extends Error {
|
|
7
|
+
capacity;
|
|
8
|
+
bufferedEvents;
|
|
9
|
+
eventType;
|
|
10
|
+
constructor(options) {
|
|
11
|
+
super(`sidecar event buffer overflow after ${options.bufferedEvents} queued events (capacity ${options.capacity}) while buffering ${options.eventType}`);
|
|
12
|
+
this.name = "SidecarEventBufferOverflow";
|
|
13
|
+
this.capacity = options.capacity;
|
|
14
|
+
this.bufferedEvents = options.bufferedEvents;
|
|
15
|
+
this.eventType = options.eventType;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export class SidecarEventBuffer {
|
|
19
|
+
capacity;
|
|
20
|
+
bufferedEvents = new Map();
|
|
21
|
+
bufferedEventQueues = new Map();
|
|
22
|
+
nextBufferedEventId = 1;
|
|
23
|
+
constructor(capacity) {
|
|
24
|
+
this.capacity = capacity;
|
|
25
|
+
}
|
|
26
|
+
get size() {
|
|
27
|
+
return this.bufferedEvents.size;
|
|
28
|
+
}
|
|
29
|
+
buffer(event) {
|
|
30
|
+
if (this.bufferedEvents.size >= this.capacity) {
|
|
31
|
+
return new SidecarEventBufferOverflow({
|
|
32
|
+
capacity: this.capacity,
|
|
33
|
+
bufferedEvents: this.bufferedEvents.size,
|
|
34
|
+
eventType: event.payload.type,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
const eventId = this.nextBufferedEventId++;
|
|
38
|
+
const keys = sidecarEventBufferKeys(event);
|
|
39
|
+
this.bufferedEvents.set(eventId, {
|
|
40
|
+
event,
|
|
41
|
+
keys,
|
|
42
|
+
});
|
|
43
|
+
for (const key of keys) {
|
|
44
|
+
const queue = this.bufferedEventQueues.get(key);
|
|
45
|
+
if (queue) {
|
|
46
|
+
queue.add(eventId);
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
this.bufferedEventQueues.set(key, new Set([eventId]));
|
|
50
|
+
}
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
take(matcher) {
|
|
54
|
+
if (matcher.bufferKey !== null) {
|
|
55
|
+
return this.takeFromKey(matcher.bufferKey);
|
|
56
|
+
}
|
|
57
|
+
const queue = this.bufferedEventQueues.get(ANY_BUFFERED_EVENT_KEY);
|
|
58
|
+
if (!queue) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
for (const eventId of queue) {
|
|
62
|
+
const record = this.bufferedEvents.get(eventId);
|
|
63
|
+
if (!record) {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (!matcher.matches(record.event)) {
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
return this.remove(eventId);
|
|
70
|
+
}
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
takeFromKey(key) {
|
|
74
|
+
const queue = this.bufferedEventQueues.get(key);
|
|
75
|
+
if (!queue) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
for (const eventId of queue) {
|
|
79
|
+
const record = this.bufferedEvents.get(eventId);
|
|
80
|
+
if (!record) {
|
|
81
|
+
queue.delete(eventId);
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
return this.remove(eventId);
|
|
85
|
+
}
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
remove(eventId) {
|
|
89
|
+
const record = this.bufferedEvents.get(eventId);
|
|
90
|
+
if (!record) {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
this.bufferedEvents.delete(eventId);
|
|
94
|
+
for (const key of record.keys) {
|
|
95
|
+
const queue = this.bufferedEventQueues.get(key);
|
|
96
|
+
if (!queue) {
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
queue.delete(eventId);
|
|
100
|
+
if (queue.size === 0) {
|
|
101
|
+
this.bufferedEventQueues.delete(key);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return record.event;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
function buildBufferKey(type, options) {
|
|
108
|
+
const parts = [`type:${type}`];
|
|
109
|
+
if (options?.ownership) {
|
|
110
|
+
parts.push(`ownership:${ownershipSelectorKey(options.ownership)}`);
|
|
111
|
+
}
|
|
112
|
+
if (options?.state) {
|
|
113
|
+
parts.push(`state:${options.state}`);
|
|
114
|
+
}
|
|
115
|
+
if (options?.processId) {
|
|
116
|
+
parts.push(`process:${options.processId}`);
|
|
117
|
+
}
|
|
118
|
+
if (options?.channel) {
|
|
119
|
+
parts.push(`channel:${options.channel}`);
|
|
120
|
+
}
|
|
121
|
+
if (options?.name) {
|
|
122
|
+
parts.push(`name:${options.name}`);
|
|
123
|
+
}
|
|
124
|
+
return parts.join("|");
|
|
125
|
+
}
|
|
126
|
+
export function sidecarSelectorMatchesEvent(selector, event) {
|
|
127
|
+
if ("any" in selector) {
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
if (event.payload.type !== selector.type) {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
if (!ownershipMatchesSelector(selector.ownership, event.ownership)) {
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
switch (selector.type) {
|
|
137
|
+
case "vm_lifecycle": {
|
|
138
|
+
const payload = event.payload;
|
|
139
|
+
return selector.state === undefined || payload.state === selector.state;
|
|
140
|
+
}
|
|
141
|
+
case "process_output": {
|
|
142
|
+
const payload = event.payload;
|
|
143
|
+
return ((selector.processId === undefined ||
|
|
144
|
+
payload.process_id === selector.processId) &&
|
|
145
|
+
(selector.channel === undefined || payload.channel === selector.channel));
|
|
146
|
+
}
|
|
147
|
+
case "process_exited": {
|
|
148
|
+
const payload = event.payload;
|
|
149
|
+
return (selector.processId === undefined ||
|
|
150
|
+
payload.process_id === selector.processId);
|
|
151
|
+
}
|
|
152
|
+
case "structured": {
|
|
153
|
+
const payload = event.payload;
|
|
154
|
+
if (selector.name !== undefined && payload.name !== selector.name) {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
if (!selector.detail) {
|
|
158
|
+
return true;
|
|
159
|
+
}
|
|
160
|
+
for (const [key, value] of Object.entries(selector.detail)) {
|
|
161
|
+
if (payload.detail[key] !== value) {
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return true;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
export function sidecarSelectorBufferKey(selector) {
|
|
170
|
+
if ("any" in selector) {
|
|
171
|
+
return ANY_BUFFERED_EVENT_KEY;
|
|
172
|
+
}
|
|
173
|
+
switch (selector.type) {
|
|
174
|
+
case "vm_lifecycle":
|
|
175
|
+
return buildBufferKey(selector.type, {
|
|
176
|
+
ownership: selector.ownership,
|
|
177
|
+
state: selector.state,
|
|
178
|
+
});
|
|
179
|
+
case "process_output":
|
|
180
|
+
return buildBufferKey(selector.type, {
|
|
181
|
+
ownership: selector.ownership,
|
|
182
|
+
processId: selector.processId,
|
|
183
|
+
channel: selector.channel,
|
|
184
|
+
});
|
|
185
|
+
case "process_exited":
|
|
186
|
+
return buildBufferKey(selector.type, {
|
|
187
|
+
ownership: selector.ownership,
|
|
188
|
+
processId: selector.processId,
|
|
189
|
+
});
|
|
190
|
+
case "structured":
|
|
191
|
+
if (selector.detail) {
|
|
192
|
+
return null;
|
|
193
|
+
}
|
|
194
|
+
return buildBufferKey(selector.type, {
|
|
195
|
+
ownership: selector.ownership,
|
|
196
|
+
name: selector.name,
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
export function normalizeSidecarEventMatcher(selector) {
|
|
201
|
+
if (typeof selector === "function") {
|
|
202
|
+
return {
|
|
203
|
+
matches: selector,
|
|
204
|
+
bufferKey: null,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
return {
|
|
208
|
+
matches: (event) => sidecarSelectorMatchesEvent(selector, event),
|
|
209
|
+
bufferKey: sidecarSelectorBufferKey(selector),
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
export function fromGeneratedEventPayload(payload) {
|
|
213
|
+
switch (payload.tag) {
|
|
214
|
+
case "VmLifecycleEvent":
|
|
215
|
+
return {
|
|
216
|
+
type: "vm_lifecycle",
|
|
217
|
+
state: fromGeneratedVmLifecycleState(payload.val.state),
|
|
218
|
+
};
|
|
219
|
+
case "ProcessOutputEvent":
|
|
220
|
+
return {
|
|
221
|
+
type: "process_output",
|
|
222
|
+
process_id: payload.val.processId,
|
|
223
|
+
channel: fromGeneratedStreamChannel(payload.val.channel),
|
|
224
|
+
chunk: Buffer.from(payload.val.chunk),
|
|
225
|
+
};
|
|
226
|
+
case "ProcessExitedEvent":
|
|
227
|
+
return {
|
|
228
|
+
type: "process_exited",
|
|
229
|
+
process_id: payload.val.processId,
|
|
230
|
+
exit_code: payload.val.exitCode,
|
|
231
|
+
...(payload.val.stdout === null
|
|
232
|
+
? {}
|
|
233
|
+
: { stdout: Buffer.from(payload.val.stdout) }),
|
|
234
|
+
...(payload.val.stderr === null
|
|
235
|
+
? {}
|
|
236
|
+
: { stderr: Buffer.from(payload.val.stderr) }),
|
|
237
|
+
...(payload.val.error === null
|
|
238
|
+
? {}
|
|
239
|
+
: {
|
|
240
|
+
error_code: payload.val.error.code,
|
|
241
|
+
error_message: payload.val.error.message,
|
|
242
|
+
}),
|
|
243
|
+
};
|
|
244
|
+
case "CronDispatchEvent":
|
|
245
|
+
return {
|
|
246
|
+
type: "cron_dispatch",
|
|
247
|
+
dispatch: fromGeneratedCronDispatch(payload.val),
|
|
248
|
+
};
|
|
249
|
+
case "StructuredEvent":
|
|
250
|
+
return {
|
|
251
|
+
type: "structured",
|
|
252
|
+
name: payload.val.name,
|
|
253
|
+
detail: Object.fromEntries(payload.val.detail),
|
|
254
|
+
};
|
|
255
|
+
case "ExtEnvelope":
|
|
256
|
+
return {
|
|
257
|
+
type: "ext",
|
|
258
|
+
envelope: fromGeneratedExtEnvelope(payload.val),
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
export function sidecarEventWaitAbortError(reason) {
|
|
263
|
+
return reason instanceof Error
|
|
264
|
+
? reason
|
|
265
|
+
: new Error(reason ? String(reason) : "sidecar event wait aborted");
|
|
266
|
+
}
|
|
267
|
+
export function sidecarEventBufferKeys(event) {
|
|
268
|
+
const owner = event.ownership;
|
|
269
|
+
const keys = new Set([
|
|
270
|
+
ANY_BUFFERED_EVENT_KEY,
|
|
271
|
+
buildBufferKey(event.payload.type),
|
|
272
|
+
buildBufferKey(event.payload.type, { ownership: owner }),
|
|
273
|
+
]);
|
|
274
|
+
switch (event.payload.type) {
|
|
275
|
+
case "vm_lifecycle":
|
|
276
|
+
keys.add(buildBufferKey(event.payload.type, {
|
|
277
|
+
state: event.payload.state,
|
|
278
|
+
}));
|
|
279
|
+
keys.add(buildBufferKey(event.payload.type, {
|
|
280
|
+
ownership: owner,
|
|
281
|
+
state: event.payload.state,
|
|
282
|
+
}));
|
|
283
|
+
break;
|
|
284
|
+
case "process_output":
|
|
285
|
+
keys.add(buildBufferKey(event.payload.type, {
|
|
286
|
+
processId: event.payload.process_id,
|
|
287
|
+
}));
|
|
288
|
+
keys.add(buildBufferKey(event.payload.type, {
|
|
289
|
+
channel: event.payload.channel,
|
|
290
|
+
}));
|
|
291
|
+
keys.add(buildBufferKey(event.payload.type, {
|
|
292
|
+
processId: event.payload.process_id,
|
|
293
|
+
channel: event.payload.channel,
|
|
294
|
+
}));
|
|
295
|
+
keys.add(buildBufferKey(event.payload.type, {
|
|
296
|
+
ownership: owner,
|
|
297
|
+
processId: event.payload.process_id,
|
|
298
|
+
}));
|
|
299
|
+
keys.add(buildBufferKey(event.payload.type, {
|
|
300
|
+
ownership: owner,
|
|
301
|
+
channel: event.payload.channel,
|
|
302
|
+
}));
|
|
303
|
+
keys.add(buildBufferKey(event.payload.type, {
|
|
304
|
+
ownership: owner,
|
|
305
|
+
processId: event.payload.process_id,
|
|
306
|
+
channel: event.payload.channel,
|
|
307
|
+
}));
|
|
308
|
+
break;
|
|
309
|
+
case "process_exited":
|
|
310
|
+
keys.add(buildBufferKey(event.payload.type, {
|
|
311
|
+
processId: event.payload.process_id,
|
|
312
|
+
}));
|
|
313
|
+
keys.add(buildBufferKey(event.payload.type, {
|
|
314
|
+
ownership: owner,
|
|
315
|
+
processId: event.payload.process_id,
|
|
316
|
+
}));
|
|
317
|
+
break;
|
|
318
|
+
case "cron_dispatch":
|
|
319
|
+
break;
|
|
320
|
+
case "structured":
|
|
321
|
+
keys.add(buildBufferKey(event.payload.type, {
|
|
322
|
+
name: event.payload.name,
|
|
323
|
+
}));
|
|
324
|
+
keys.add(buildBufferKey(event.payload.type, {
|
|
325
|
+
ownership: owner,
|
|
326
|
+
name: event.payload.name,
|
|
327
|
+
}));
|
|
328
|
+
break;
|
|
329
|
+
case "ext":
|
|
330
|
+
break;
|
|
331
|
+
}
|
|
332
|
+
return [...keys];
|
|
333
|
+
}
|
package/dist/ext.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type * as sidecarProtocol from "./generated-protocol.js";
|
|
2
|
+
export interface LiveExtEnvelope {
|
|
3
|
+
namespace: string;
|
|
4
|
+
payload: Uint8Array;
|
|
5
|
+
}
|
|
6
|
+
export declare function toGeneratedExtEnvelope(envelope: LiveExtEnvelope): sidecarProtocol.ExtEnvelope;
|
|
7
|
+
export declare function fromGeneratedExtEnvelope(envelope: sidecarProtocol.ExtEnvelope): LiveExtEnvelope;
|
package/dist/ext.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { toExactArrayBuffer } from "./bytes.js";
|
|
2
|
+
export function toGeneratedExtEnvelope(envelope) {
|
|
3
|
+
return {
|
|
4
|
+
namespace: envelope.namespace,
|
|
5
|
+
payload: toExactArrayBuffer(envelope.payload),
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
export function fromGeneratedExtEnvelope(envelope) {
|
|
9
|
+
return {
|
|
10
|
+
namespace: envelope.namespace,
|
|
11
|
+
payload: Buffer.from(envelope.payload),
|
|
12
|
+
};
|
|
13
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type * as protocol from "./generated-protocol.js";
|
|
2
|
+
import { type LiveRootFilesystemEntryEncoding } from "./protocol-maps.js";
|
|
3
|
+
export type { LiveRootFilesystemEntryEncoding } from "./protocol-maps.js";
|
|
4
|
+
export type GuestFilesystemContentEncoding = "utf8" | "base64";
|
|
5
|
+
export interface GuestFilesystemContentResult {
|
|
6
|
+
path: string;
|
|
7
|
+
content?: string;
|
|
8
|
+
encoding?: GuestFilesystemContentEncoding;
|
|
9
|
+
}
|
|
10
|
+
export type LiveRootFilesystemEntry = {
|
|
11
|
+
path: string;
|
|
12
|
+
kind: "file" | "directory" | "symlink";
|
|
13
|
+
mode?: number;
|
|
14
|
+
uid?: number;
|
|
15
|
+
gid?: number;
|
|
16
|
+
content?: string;
|
|
17
|
+
encoding?: LiveRootFilesystemEntryEncoding;
|
|
18
|
+
target?: string;
|
|
19
|
+
executable?: boolean;
|
|
20
|
+
};
|
|
21
|
+
export type LiveRootFilesystemLowerDescriptor = {
|
|
22
|
+
kind: "snapshot";
|
|
23
|
+
entries: LiveRootFilesystemEntry[];
|
|
24
|
+
} | {
|
|
25
|
+
kind: "bundled_base_filesystem";
|
|
26
|
+
};
|
|
27
|
+
export declare function encodeGuestFilesystemContent(content: string | Uint8Array): {
|
|
28
|
+
content: string;
|
|
29
|
+
encoding?: GuestFilesystemContentEncoding;
|
|
30
|
+
};
|
|
31
|
+
export declare function decodeGuestFilesystemContent(response: GuestFilesystemContentResult): Uint8Array;
|
|
32
|
+
export declare function toGeneratedRootFilesystemEntry(entry: LiveRootFilesystemEntry): protocol.RootFilesystemEntry;
|
|
33
|
+
export declare function fromGeneratedRootFilesystemEntry(entry: protocol.RootFilesystemEntry): LiveRootFilesystemEntry;
|