agents-bridge 0.3.6 → 0.3.10
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 +14 -0
- package/config.multi-agent.example.json +4 -1
- package/dist/agents/agent-resolver.d.ts.map +1 -1
- package/dist/agents/agent-resolver.js +8 -2
- package/dist/agents/agent-resolver.js.map +1 -1
- package/dist/agents/cli-runner.d.ts +3 -3
- package/dist/agents/cli-runner.d.ts.map +1 -1
- package/dist/agents/cli-runner.js +87 -76
- package/dist/agents/cli-runner.js.map +1 -1
- package/dist/agents/cli-session-store.d.ts +3 -0
- package/dist/agents/cli-session-store.d.ts.map +1 -1
- package/dist/agents/cli-session-store.js +31 -10
- package/dist/agents/cli-session-store.js.map +1 -1
- package/dist/agents/codex-app-server-runtime.d.ts +37 -1
- package/dist/agents/codex-app-server-runtime.d.ts.map +1 -1
- package/dist/agents/codex-app-server-runtime.js +37 -14
- package/dist/agents/codex-app-server-runtime.js.map +1 -1
- package/dist/agents/managed-backend.d.ts +4 -0
- package/dist/agents/managed-backend.d.ts.map +1 -0
- package/dist/agents/managed-backend.js +18 -0
- package/dist/agents/managed-backend.js.map +1 -0
- package/dist/agents/managed-role.d.ts +17 -0
- package/dist/agents/managed-role.d.ts.map +1 -0
- package/dist/agents/managed-role.js +13 -0
- package/dist/agents/managed-role.js.map +1 -0
- package/dist/agents/model-control-files.d.ts +10 -4
- package/dist/agents/model-control-files.d.ts.map +1 -1
- package/dist/agents/model-control-files.js +127 -79
- package/dist/agents/model-control-files.js.map +1 -1
- package/dist/agents/trusted-launcher.js +5 -1
- package/dist/agents/trusted-launcher.js.map +1 -1
- package/dist/agents/windows-model-control-security.d.ts +4 -0
- package/dist/agents/windows-model-control-security.d.ts.map +1 -0
- package/dist/agents/windows-model-control-security.js +86 -0
- package/dist/agents/windows-model-control-security.js.map +1 -0
- package/dist/channels/bot-run-protocol.d.ts +13 -0
- package/dist/channels/bot-run-protocol.d.ts.map +1 -0
- package/dist/channels/bot-run-protocol.js +20 -0
- package/dist/channels/bot-run-protocol.js.map +1 -0
- package/dist/channels/bot-run-receipts.d.ts +14 -0
- package/dist/channels/bot-run-receipts.d.ts.map +1 -0
- package/dist/channels/bot-run-receipts.js +88 -0
- package/dist/channels/bot-run-receipts.js.map +1 -0
- package/dist/channels/botlink.d.ts +3 -0
- package/dist/channels/botlink.d.ts.map +1 -1
- package/dist/channels/botlink.js +95 -17
- package/dist/channels/botlink.js.map +1 -1
- package/dist/channels/managed-receipts.d.ts +14 -0
- package/dist/channels/managed-receipts.d.ts.map +1 -0
- package/dist/channels/managed-receipts.js +136 -0
- package/dist/channels/managed-receipts.js.map +1 -0
- package/dist/cli/cmd-start.d.ts.map +1 -1
- package/dist/cli/cmd-start.js +44 -5
- package/dist/cli/cmd-start.js.map +1 -1
- package/dist/cloud/main.d.ts +2 -0
- package/dist/cloud/main.d.ts.map +1 -0
- package/dist/cloud/main.js +14 -0
- package/dist/cloud/main.js.map +1 -0
- package/dist/cloud/worker.d.ts +98 -0
- package/dist/cloud/worker.d.ts.map +1 -0
- package/dist/cloud/worker.js +212 -0
- package/dist/cloud/worker.js.map +1 -0
- package/dist/config/agent-dirs.d.ts.map +1 -1
- package/dist/config/agent-dirs.js +2 -0
- package/dist/config/agent-dirs.js.map +1 -1
- package/dist/config/attachment-handoff.d.ts +5 -0
- package/dist/config/attachment-handoff.d.ts.map +1 -0
- package/dist/config/attachment-handoff.js +60 -0
- package/dist/config/attachment-handoff.js.map +1 -0
- package/dist/config/zod-schema.d.ts +281 -228
- package/dist/config/zod-schema.d.ts.map +1 -1
- package/dist/config/zod-schema.js +3 -0
- package/dist/config/zod-schema.js.map +1 -1
- package/dist/types/index.d.ts +12 -4
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -2,100 +2,148 @@ import { constants } from 'node:fs';
|
|
|
2
2
|
import { lstat, mkdir, open, realpath, rename, unlink } from 'node:fs/promises';
|
|
3
3
|
import { dirname, resolve } from 'node:path';
|
|
4
4
|
import { randomUUID } from 'node:crypto';
|
|
5
|
+
import { ensureWindowsModelControlSecurity, sameWindowsModelControlPath } from './windows-model-control-security.js';
|
|
5
6
|
const MAX_MODEL_CONTROL_FILE_BYTES = 64 * 1024;
|
|
6
7
|
function expectedUid() {
|
|
7
8
|
return typeof process.geteuid === 'function' ? process.geteuid() : typeof process.getuid === 'function' ? process.getuid() : undefined;
|
|
8
9
|
}
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
if ((info.mode & 0o777) !== 0o600)
|
|
31
|
-
throw new Error('INSECURE_MODEL_CONTROL_FILE_MODE');
|
|
32
|
-
if (info.size > MAX_MODEL_CONTROL_FILE_BYTES)
|
|
33
|
-
throw new Error('MODEL_CONTROL_FILE_TOO_LARGE');
|
|
34
|
-
}
|
|
35
|
-
export async function readSecureModelControlFile(path) {
|
|
36
|
-
await ensureSecureModelControlDirectory(dirname(path));
|
|
37
|
-
const file = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
38
|
-
try {
|
|
39
|
-
await validateOpenFile(file);
|
|
40
|
-
return await file.readFile('utf8');
|
|
41
|
-
}
|
|
42
|
-
finally {
|
|
43
|
-
await file.close();
|
|
10
|
+
// The explicit platform/security dependencies let non-Windows CI exercise the
|
|
11
|
+
// complete Windows IO lifecycle without claiming native ACL/OS acceptance.
|
|
12
|
+
export function createModelControlFileAccess({ platform = process.platform, windowsSecurity = ensureWindowsModelControlSecurity, } = {}) {
|
|
13
|
+
const windows = platform === 'win32';
|
|
14
|
+
const noFollow = windows ? 0 : constants.O_NOFOLLOW;
|
|
15
|
+
async function ensureSecureModelControlDirectory(path) {
|
|
16
|
+
const directory = resolve(path);
|
|
17
|
+
await mkdir(directory, { recursive: true, mode: 0o700 });
|
|
18
|
+
const info = await lstat(directory);
|
|
19
|
+
if (!info.isDirectory() || info.isSymbolicLink())
|
|
20
|
+
throw new Error('INSECURE_MODEL_CONTROL_DIRECTORY');
|
|
21
|
+
const uid = expectedUid();
|
|
22
|
+
if (!windows && uid !== undefined && info.uid !== uid)
|
|
23
|
+
throw new Error('INSECURE_MODEL_CONTROL_DIRECTORY_OWNER');
|
|
24
|
+
if (!windows && (info.mode & 0o022) !== 0)
|
|
25
|
+
throw new Error('INSECURE_MODEL_CONTROL_DIRECTORY_MODE');
|
|
26
|
+
const canonical = await realpath(directory);
|
|
27
|
+
if (windows ? !sameWindowsModelControlPath(canonical, directory) : canonical !== directory)
|
|
28
|
+
throw new Error('INSECURE_MODEL_CONTROL_DIRECTORY_PATH');
|
|
29
|
+
if (windows)
|
|
30
|
+
await windowsSecurity(directory);
|
|
44
31
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
32
|
+
async function validateOpenFile(file, path) {
|
|
33
|
+
const info = await file.stat();
|
|
34
|
+
if (!info.isFile() || info.isSymbolicLink())
|
|
35
|
+
throw new Error('INSECURE_MODEL_CONTROL_FILE_TYPE');
|
|
36
|
+
const uid = expectedUid();
|
|
37
|
+
if (!windows && uid !== undefined && info.uid !== uid)
|
|
38
|
+
throw new Error('INSECURE_MODEL_CONTROL_FILE_OWNER');
|
|
39
|
+
if (!windows && (info.mode & 0o777) !== 0o600)
|
|
40
|
+
throw new Error('INSECURE_MODEL_CONTROL_FILE_MODE');
|
|
41
|
+
if (info.size > MAX_MODEL_CONTROL_FILE_BYTES)
|
|
42
|
+
throw new Error('MODEL_CONTROL_FILE_TOO_LARGE');
|
|
43
|
+
if (windows) {
|
|
44
|
+
const entry = await lstat(path);
|
|
45
|
+
if (!entry.isFile() || entry.isSymbolicLink() || entry.dev !== info.dev || entry.ino !== info.ino || entry.nlink !== 1)
|
|
46
|
+
throw new Error('INSECURE_MODEL_CONTROL_FILE_TYPE');
|
|
47
|
+
const canonical = await realpath(path);
|
|
48
|
+
if (!sameWindowsModelControlPath(canonical, resolve(path)))
|
|
49
|
+
throw new Error('INSECURE_MODEL_CONTROL_FILE_PATH');
|
|
50
|
+
await windowsSecurity(path);
|
|
51
|
+
}
|
|
53
52
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
53
|
+
async function openExisting(path) {
|
|
54
|
+
// O_NOFOLLOW is unavailable on Windows. Check before opening, then compare
|
|
55
|
+
// the opened file's identity to lstat before reading any secret bytes.
|
|
56
|
+
if (windows) {
|
|
57
|
+
const entry = await lstat(path);
|
|
58
|
+
if (!entry.isFile() || entry.isSymbolicLink())
|
|
59
|
+
throw new Error('INSECURE_MODEL_CONTROL_FILE_TYPE');
|
|
60
|
+
}
|
|
61
|
+
return open(path, constants.O_RDONLY | noFollow);
|
|
63
62
|
}
|
|
64
|
-
|
|
65
|
-
await
|
|
63
|
+
async function readSecureModelControlFile(path) {
|
|
64
|
+
await ensureSecureModelControlDirectory(dirname(path));
|
|
65
|
+
const file = await openExisting(path);
|
|
66
|
+
try {
|
|
67
|
+
await validateOpenFile(file, path);
|
|
68
|
+
return await file.readFile('utf8');
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
await file.close();
|
|
72
|
+
}
|
|
66
73
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
const
|
|
74
|
+
async function syncDirectory(path) {
|
|
75
|
+
// Node cannot open/fsync a Windows directory with these POSIX flags.
|
|
76
|
+
// File contents are still fsynced before close/atomic rename below.
|
|
77
|
+
if (windows)
|
|
78
|
+
return;
|
|
79
|
+
const directory = await open(path, constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW);
|
|
73
80
|
try {
|
|
74
|
-
await
|
|
81
|
+
await directory.sync();
|
|
75
82
|
}
|
|
76
83
|
finally {
|
|
77
|
-
await
|
|
84
|
+
await directory.close();
|
|
78
85
|
}
|
|
79
86
|
}
|
|
80
|
-
|
|
81
|
-
if (
|
|
87
|
+
async function createSecureModelControlFile(path, contents) {
|
|
88
|
+
if (Buffer.byteLength(contents, 'utf8') > MAX_MODEL_CONTROL_FILE_BYTES)
|
|
89
|
+
throw new Error('MODEL_CONTROL_FILE_TOO_LARGE');
|
|
90
|
+
await ensureSecureModelControlDirectory(dirname(path));
|
|
91
|
+
const file = await open(path, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | noFollow, 0o600);
|
|
92
|
+
try {
|
|
93
|
+
await validateOpenFile(file, path);
|
|
94
|
+
await file.writeFile(contents);
|
|
95
|
+
await validateOpenFile(file, path);
|
|
96
|
+
await file.sync();
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
await file.close().catch(() => undefined);
|
|
100
|
+
await unlink(path).catch(() => undefined);
|
|
82
101
|
throw error;
|
|
102
|
+
}
|
|
103
|
+
await file.close();
|
|
104
|
+
await syncDirectory(dirname(path));
|
|
83
105
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
await
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
106
|
+
async function writeSecureModelControlFile(path, contents) {
|
|
107
|
+
if (Buffer.byteLength(contents, 'utf8') > MAX_MODEL_CONTROL_FILE_BYTES)
|
|
108
|
+
throw new Error('MODEL_CONTROL_FILE_TOO_LARGE');
|
|
109
|
+
await ensureSecureModelControlDirectory(dirname(path));
|
|
110
|
+
try {
|
|
111
|
+
const existing = await openExisting(path);
|
|
112
|
+
try {
|
|
113
|
+
await validateOpenFile(existing, path);
|
|
114
|
+
}
|
|
115
|
+
finally {
|
|
116
|
+
await existing.close();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
if (error?.code !== 'ENOENT')
|
|
121
|
+
throw error;
|
|
122
|
+
}
|
|
123
|
+
const temporaryPath = `${path}.${randomUUID()}.tmp`;
|
|
124
|
+
const file = await open(temporaryPath, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | noFollow, 0o600);
|
|
125
|
+
try {
|
|
126
|
+
await validateOpenFile(file, temporaryPath);
|
|
127
|
+
await file.writeFile(contents);
|
|
128
|
+
await validateOpenFile(file, temporaryPath);
|
|
129
|
+
await file.sync();
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
await file.close().catch(() => undefined);
|
|
133
|
+
await unlink(temporaryPath).catch(() => undefined);
|
|
134
|
+
throw error;
|
|
135
|
+
}
|
|
136
|
+
await file.close();
|
|
137
|
+
try {
|
|
138
|
+
await rename(temporaryPath, path);
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
await unlink(temporaryPath).catch(() => undefined);
|
|
142
|
+
throw error;
|
|
143
|
+
}
|
|
144
|
+
await syncDirectory(dirname(path));
|
|
96
145
|
}
|
|
97
|
-
|
|
98
|
-
await rename(temporaryPath, path);
|
|
99
|
-
await syncDirectory(dirname(path));
|
|
146
|
+
return { ensureSecureModelControlDirectory, readSecureModelControlFile, createSecureModelControlFile, writeSecureModelControlFile };
|
|
100
147
|
}
|
|
148
|
+
export const { ensureSecureModelControlDirectory, readSecureModelControlFile, createSecureModelControlFile, writeSecureModelControlFile, } = createModelControlFileAccess();
|
|
101
149
|
//# sourceMappingURL=model-control-files.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-control-files.js","sourceRoot":"","sources":["../../src/agents/model-control-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACnC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAC/E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"model-control-files.js","sourceRoot":"","sources":["../../src/agents/model-control-files.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,7 +26,11 @@ function launcherSessionId(profile, env = {}) {
|
|
|
26
26
|
const logicalSession = env.FCH_SESSION_ID?.trim();
|
|
27
27
|
if (!logicalSession)
|
|
28
28
|
return randomUUID();
|
|
29
|
-
|
|
29
|
+
const requestId = env.FCH_REQUEST_ID?.trim();
|
|
30
|
+
const identity = requestId
|
|
31
|
+
? `${profile}\0${logicalSession}\0${requestId}`
|
|
32
|
+
: `${profile}\0${logicalSession}`;
|
|
33
|
+
return `cli-${createHash('sha256').update(identity).digest('hex').slice(0, 32)}`;
|
|
30
34
|
}
|
|
31
35
|
function profileForCommand(command) {
|
|
32
36
|
switch (basename(command)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trusted-launcher.js","sourceRoot":"","sources":["../../src/agents/trusted-launcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAUvD,MAAM,UAAU,mBAAmB,CAAC,KAKnC;IACC,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IAC/C,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAA;IAC1D,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAA;IAC9H,CAAC;IACD,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAChD,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAA;IACzF,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,YAAY,CAAC,CAAA;IACrE,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,GAAG,CAAA;IAC9C,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;QAC3F,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAA;IAC3E,CAAC;IACD,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,uBAAuB;QACvE,IAAI,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC;QAC9F,GAAG,EAAE,SAAS;QACd,GAAG,EAAE,wBAAwB,CAAC,cAAc,EAAE,KAAK,CAAC,GAAG,CAAC;QACxD,KAAK,EAAE,KAAK;KACb,CAAA;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe,EAAE,MAAyB,EAAE;IACrE,MAAM,cAAc,GAAG,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,CAAA;IACjD,IAAI,CAAC,cAAc;QAAE,OAAO,UAAU,EAAE,CAAA;IACxC,
|
|
1
|
+
{"version":3,"file":"trusted-launcher.js","sourceRoot":"","sources":["../../src/agents/trusted-launcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function sameWindowsModelControlPath(left: string, right: string): boolean;
|
|
2
|
+
export declare function validateWindowsModelControlAcl(value: unknown): void;
|
|
3
|
+
export declare function ensureWindowsModelControlSecurity(path: string): Promise<void>;
|
|
4
|
+
//# sourceMappingURL=windows-model-control-security.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"windows-model-control-security.d.ts","sourceRoot":"","sources":["../../src/agents/windows-model-control-security.ts"],"names":[],"mappings":"AAiCA,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAEhF;AAED,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAuBnE;AAED,wBAAsB,iCAAiC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBnF"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { win32 } from 'node:path';
|
|
3
|
+
import { promisify } from 'node:util';
|
|
4
|
+
const execute = promisify(execFile);
|
|
5
|
+
const TRUSTED_SYSTEM_SIDS = new Set(['S-1-5-18', 'S-1-5-32-544']); // SYSTEM, Administrators
|
|
6
|
+
// Use SIDs rather than localized account names. Inspect inherited ACEs too; a
|
|
7
|
+
// Unix mode returned by stat on Windows says nothing about the actual DACL.
|
|
8
|
+
const INSPECT_ACL = `
|
|
9
|
+
$ErrorActionPreference = 'Stop'
|
|
10
|
+
$item = Get-Item -LiteralPath $env:AGENTS_BRIDGE_ACL_TARGET -Force
|
|
11
|
+
$cursor = $item
|
|
12
|
+
while ($null -ne $cursor) {
|
|
13
|
+
if (($cursor.Attributes -band [IO.FileAttributes]::ReparsePoint) -ne 0) { throw 'MODEL_CONTROL_REPARSE_POINT' }
|
|
14
|
+
if ($cursor -is [IO.DirectoryInfo]) { $cursor = $cursor.Parent } else { $cursor = $cursor.Directory }
|
|
15
|
+
}
|
|
16
|
+
$acl = Get-Acl -LiteralPath $env:AGENTS_BRIDGE_ACL_TARGET
|
|
17
|
+
$rules = @($acl.GetAccessRules($true, $true, [Security.Principal.SecurityIdentifier]) | ForEach-Object {
|
|
18
|
+
@{
|
|
19
|
+
sid = $_.IdentityReference.Value
|
|
20
|
+
allow = ($_.AccessControlType -eq [Security.AccessControl.AccessControlType]::Allow)
|
|
21
|
+
rights = [long]$_.FileSystemRights
|
|
22
|
+
inheritOnly = (($_.PropagationFlags -band [Security.AccessControl.PropagationFlags]::InheritOnly) -ne 0)
|
|
23
|
+
}
|
|
24
|
+
})
|
|
25
|
+
@{
|
|
26
|
+
currentSid = [Security.Principal.WindowsIdentity]::GetCurrent().User.Value
|
|
27
|
+
ownerSid = $acl.GetOwner([Security.Principal.SecurityIdentifier]).Value
|
|
28
|
+
rules = $rules
|
|
29
|
+
} | ConvertTo-Json -Depth 4 -Compress
|
|
30
|
+
`;
|
|
31
|
+
export function sameWindowsModelControlPath(left, right) {
|
|
32
|
+
return win32.normalize(left).toLowerCase() === win32.normalize(right).toLowerCase();
|
|
33
|
+
}
|
|
34
|
+
export function validateWindowsModelControlAcl(value) {
|
|
35
|
+
const invalid = () => new Error('INSECURE_MODEL_CONTROL_WINDOWS_ACL');
|
|
36
|
+
if (!value || typeof value !== 'object')
|
|
37
|
+
throw invalid();
|
|
38
|
+
const acl = value;
|
|
39
|
+
if (typeof acl.currentSid !== 'string' || !/^S-1-\d+(?:-\d+)+$/.test(acl.currentSid)
|
|
40
|
+
|| typeof acl.ownerSid !== 'string' || !Array.isArray(acl.rules))
|
|
41
|
+
throw invalid();
|
|
42
|
+
const trusted = new Set([acl.currentSid, ...TRUSTED_SYSTEM_SIDS]);
|
|
43
|
+
if (!trusted.has(acl.ownerSid))
|
|
44
|
+
throw invalid();
|
|
45
|
+
let effectiveAllow = false;
|
|
46
|
+
for (const entry of acl.rules) {
|
|
47
|
+
if (!entry || typeof entry !== 'object')
|
|
48
|
+
throw invalid();
|
|
49
|
+
const rule = entry;
|
|
50
|
+
if (typeof rule.sid !== 'string' || typeof rule.allow !== 'boolean'
|
|
51
|
+
|| typeof rule.inheritOnly !== 'boolean' || typeof rule.rights !== 'number'
|
|
52
|
+
|| !Number.isSafeInteger(rule.rights) || rule.rights < 0)
|
|
53
|
+
throw invalid();
|
|
54
|
+
if (!rule.allow || rule.rights === 0)
|
|
55
|
+
continue;
|
|
56
|
+
// Inherit-only grants still expose newly created state/temporary files.
|
|
57
|
+
if (!trusted.has(rule.sid) && !(rule.sid === 'S-1-3-0' && rule.inheritOnly))
|
|
58
|
+
throw invalid();
|
|
59
|
+
if (!rule.inheritOnly)
|
|
60
|
+
effectiveAllow = true;
|
|
61
|
+
}
|
|
62
|
+
// Also rejects empty/missing and null DACL representations rather than
|
|
63
|
+
// treating "no rules returned" as proof of privacy.
|
|
64
|
+
if (!effectiveAllow)
|
|
65
|
+
throw invalid();
|
|
66
|
+
}
|
|
67
|
+
export async function ensureWindowsModelControlSecurity(path) {
|
|
68
|
+
const executable = win32.join(process.env.SystemRoot || 'C:\\Windows', 'System32', 'WindowsPowerShell', 'v1.0', 'powershell.exe');
|
|
69
|
+
let snapshot;
|
|
70
|
+
try {
|
|
71
|
+
const { stdout } = await execute(executable, [
|
|
72
|
+
'-NoLogo', '-NoProfile', '-NonInteractive', '-EncodedCommand', Buffer.from(INSPECT_ACL, 'utf16le').toString('base64'),
|
|
73
|
+
], {
|
|
74
|
+
env: { ...process.env, AGENTS_BRIDGE_ACL_TARGET: path },
|
|
75
|
+
windowsHide: true, timeout: 10_000, maxBuffer: 128 * 1024,
|
|
76
|
+
});
|
|
77
|
+
snapshot = JSON.parse(stdout.replace(/^\uFEFF/, '').trim());
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Do not include shell output, environment, or a control-file path in logs.
|
|
81
|
+
// Fail closed if PowerShell/ACL inspection is unavailable.
|
|
82
|
+
throw new Error('MODEL_CONTROL_WINDOWS_ACL_UNAVAILABLE: Windows PowerShell ACL inspection failed');
|
|
83
|
+
}
|
|
84
|
+
validateWindowsModelControlAcl(snapshot);
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=windows-model-control-security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"windows-model-control-security.js","sourceRoot":"","sources":["../../src/agents/windows-model-control-security.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { SessionEnvelope } from '../types/index.js';
|
|
2
|
+
export interface RunDelivery {
|
|
3
|
+
version: 1;
|
|
4
|
+
sourceMessageId: string;
|
|
5
|
+
botId: string;
|
|
6
|
+
runId: string;
|
|
7
|
+
attempt: number;
|
|
8
|
+
deliveryId: string;
|
|
9
|
+
targetGatewayId: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function parseRunDelivery(message: Record<string, unknown>): RunDelivery | undefined;
|
|
12
|
+
export declare function runProvenance(envelope: SessionEnvelope): Record<string, unknown>;
|
|
13
|
+
//# sourceMappingURL=bot-run-protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bot-run-protocol.d.ts","sourceRoot":"","sources":["../../src/channels/bot-run-protocol.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACxD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,CAAC,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IACnF,UAAU,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;CAC7C;AACD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,GAAG,SAAS,CAU1F;AACD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAGhF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
export function parseRunDelivery(message) {
|
|
3
|
+
if (!message.bot_run_v1 && !message.bot_run && !message.delivery_id)
|
|
4
|
+
return undefined;
|
|
5
|
+
const r = message.bot_run;
|
|
6
|
+
if (!r || r.version !== 1 || typeof r.sourceMessageId !== 'string' || !r.sourceMessageId
|
|
7
|
+
|| typeof r.botId !== 'string' || !r.botId || typeof r.runId !== 'string' || !r.runId
|
|
8
|
+
|| !Number.isSafeInteger(r.attempt) || r.attempt < 1 || r.attempt > 8
|
|
9
|
+
|| message.source_message_id !== r.sourceMessageId || typeof message.target_gateway_id !== 'string' || !message.target_gateway_id)
|
|
10
|
+
throw Error('Invalid BotRunsV1 delivery');
|
|
11
|
+
const id = createHash('sha256').update(`${r.sourceMessageId}\0${r.botId}\0${r.runId}\0${r.attempt}`).digest('hex');
|
|
12
|
+
if (message.delivery_id !== id)
|
|
13
|
+
throw Error('Invalid stable BotRunsV1 delivery ID');
|
|
14
|
+
return { ...r, deliveryId: id, targetGatewayId: message.target_gateway_id };
|
|
15
|
+
}
|
|
16
|
+
export function runProvenance(envelope) {
|
|
17
|
+
const r = envelope.source.botRun;
|
|
18
|
+
return r ? { bot_run_v1: true, source_message_id: r.sourceMessageId, delivery_id: r.deliveryId } : {};
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=bot-run-protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bot-run-protocol.js","sourceRoot":"","sources":["../../src/channels/bot-run-protocol.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAMxC,MAAM,UAAU,gBAAgB,CAAC,OAAgC;IAC/D,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW;QAAE,OAAO,SAAS,CAAA;IACrF,MAAM,CAAC,GAAG,OAAO,CAAC,OAA2C,CAAA;IAC7D,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,eAAe,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,eAAe;WACnF,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,KAAK;WAClF,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAQ,GAAG,CAAC,IAAI,CAAC,CAAC,OAAQ,GAAG,CAAC;WACpE,OAAO,CAAC,iBAAiB,KAAK,CAAC,CAAC,eAAe,IAAI,OAAO,OAAO,CAAC,iBAAiB,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,iBAAiB;QAAE,MAAM,KAAK,CAAC,4BAA4B,CAAC,CAAA;IAC9K,MAAM,EAAE,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,eAAe,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAClH,IAAI,OAAO,CAAC,WAAW,KAAK,EAAE;QAAE,MAAM,KAAK,CAAC,sCAAsC,CAAC,CAAA;IACnF,OAAO,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,eAAe,EAAE,OAAO,CAAC,iBAAiB,EAAiB,CAAA;AAC5F,CAAC;AACD,MAAM,UAAU,aAAa,CAAC,QAAyB;IACrD,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAA;IAChC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC,eAAe,EAAE,WAAW,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;AACvG,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { SessionEnvelope } from '../types/index.js';
|
|
2
|
+
export type RunOutcome = 'completed' | 'failed' | 'stopped' | 'unknown';
|
|
3
|
+
interface Receipt {
|
|
4
|
+
envelope: SessionEnvelope;
|
|
5
|
+
state: 'received' | 'processing' | 'terminal';
|
|
6
|
+
outcome?: RunOutcome;
|
|
7
|
+
reported?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function claimRunDelivery(envelope: SessionEnvelope): Promise<boolean>;
|
|
10
|
+
export declare function markRunProcessing(envelope: SessionEnvelope): Promise<boolean>;
|
|
11
|
+
export declare function reportRunOutcome(envelope: SessionEnvelope, outcome: RunOutcome, report: (body: Record<string, unknown>) => Promise<unknown>): Promise<void>;
|
|
12
|
+
export declare function recoverRunReceipts(accountId: string): Promise<Receipt[]>;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=bot-run-receipts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bot-run-receipts.d.ts","sourceRoot":"","sources":["../../src/channels/bot-run-receipts.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACxD,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAA;AACvE,UAAU,OAAO;IAAG,QAAQ,EAAE,eAAe,CAAC;IAAC,KAAK,EAAE,UAAU,GAAG,YAAY,GAAG,UAAU,CAAC;IAAC,OAAO,CAAC,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE;AAQxI,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAKlF;AACD,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAMnF;AACD,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAWjK;AACD,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAW9E"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile, rename, readdir } from 'node:fs/promises';
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { DATA_SESSIONS_DIR } from '../config/paths.js';
|
|
5
|
+
const directory = () => join(DATA_SESSIONS_DIR(), 'bot-run-receipts');
|
|
6
|
+
const pathFor = (accountId, deliveryId) => join(directory(), createHash('sha256').update(`${accountId}\0${deliveryId}`).digest('hex') + '.json');
|
|
7
|
+
async function save(record) {
|
|
8
|
+
const r = record.envelope.source.botRun;
|
|
9
|
+
await mkdir(directory(), { recursive: true });
|
|
10
|
+
const file = pathFor(record.envelope.source.accountId ?? '', r.deliveryId);
|
|
11
|
+
const tmp = `${file}.${process.pid}.tmp`;
|
|
12
|
+
await writeFile(tmp, JSON.stringify(record), { mode: 0o600 });
|
|
13
|
+
await rename(tmp, file);
|
|
14
|
+
}
|
|
15
|
+
export async function claimRunDelivery(envelope) {
|
|
16
|
+
if (!envelope.source.botRun)
|
|
17
|
+
return true;
|
|
18
|
+
await mkdir(directory(), { recursive: true });
|
|
19
|
+
try {
|
|
20
|
+
await writeFile(pathFor(envelope.source.accountId ?? '', envelope.source.botRun.deliveryId), JSON.stringify({ envelope, state: 'received' }), { flag: 'wx', mode: 0o600 });
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
if (error.code === 'EEXIST') {
|
|
25
|
+
const r = JSON.parse(await readFile(pathFor(envelope.source.accountId ?? '', envelope.source.botRun.deliveryId), 'utf8'));
|
|
26
|
+
return r.state === 'received';
|
|
27
|
+
}
|
|
28
|
+
;
|
|
29
|
+
throw error;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export async function markRunProcessing(envelope) {
|
|
33
|
+
if (!envelope.source.botRun)
|
|
34
|
+
return true;
|
|
35
|
+
const file = pathFor(envelope.source.accountId ?? '', envelope.source.botRun.deliveryId);
|
|
36
|
+
try {
|
|
37
|
+
await writeFile(file + '.execution', 'claimed', { flag: 'wx', mode: 0o600 });
|
|
38
|
+
}
|
|
39
|
+
catch (e) {
|
|
40
|
+
if (e.code === 'EEXIST')
|
|
41
|
+
return false;
|
|
42
|
+
throw e;
|
|
43
|
+
}
|
|
44
|
+
await save({ envelope, state: 'processing' });
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
export async function reportRunOutcome(envelope, outcome, report) {
|
|
48
|
+
const run = envelope.source.botRun;
|
|
49
|
+
if (!run)
|
|
50
|
+
return;
|
|
51
|
+
const file = pathFor(envelope.source.accountId ?? '', run.deliveryId);
|
|
52
|
+
let record;
|
|
53
|
+
try {
|
|
54
|
+
record = JSON.parse(await readFile(file, 'utf8'));
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
record = { envelope, state: 'terminal' };
|
|
58
|
+
}
|
|
59
|
+
// A transport retry cannot overwrite a previously committed execution result.
|
|
60
|
+
if (record.state !== 'terminal')
|
|
61
|
+
record = { envelope, state: 'terminal', outcome };
|
|
62
|
+
record.outcome ??= outcome;
|
|
63
|
+
await save(record);
|
|
64
|
+
await report({ bot_run_v1: true, source_message_id: run.sourceMessageId, delivery_id: run.deliveryId, chat_id: envelope.source.chatId, status: record.outcome });
|
|
65
|
+
record.reported = true;
|
|
66
|
+
await save(record);
|
|
67
|
+
}
|
|
68
|
+
export async function recoverRunReceipts(accountId) {
|
|
69
|
+
await mkdir(directory(), { recursive: true });
|
|
70
|
+
const records = [];
|
|
71
|
+
for (const name of await readdir(directory())) {
|
|
72
|
+
if (!name.endsWith('.json'))
|
|
73
|
+
continue;
|
|
74
|
+
const r = JSON.parse(await readFile(join(directory(), name), 'utf8'));
|
|
75
|
+
if (r.envelope.source.accountId === accountId && !r.reported) {
|
|
76
|
+
if (r.state === 'received') {
|
|
77
|
+
try {
|
|
78
|
+
await readFile(join(directory(), name) + '.execution');
|
|
79
|
+
r.state = 'processing';
|
|
80
|
+
}
|
|
81
|
+
catch { }
|
|
82
|
+
}
|
|
83
|
+
records.push(r);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return records;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=bot-run-receipts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bot-run-receipts.js","sourceRoot":"","sources":["../../src/channels/bot-run-receipts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAItD,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,kBAAkB,CAAC,CAAA;AACrE,MAAM,OAAO,GAAG,CAAC,SAAiB,EAAE,UAAkB,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,SAAS,KAAK,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,CAAA;AAChK,KAAK,UAAU,IAAI,CAAC,MAAe;IAClC,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAO,CAAC;IAAC,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxF,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;IAAC,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,MAAM,CAAC;IACrH,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAAC,MAAM,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;AACvF,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAyB;IAC/D,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IACxC,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC7C,IAAI,CAAC;QAAC,MAAM,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAAC,OAAO,IAAI,CAAA;IAAC,CAAC;IAC/L,OAAO,KAAK,EAAE,CAAC;QAAC,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAAC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAY,CAAC;YAAC,OAAO,CAAC,CAAC,KAAK,KAAK,UAAU,CAAA;QAAC,CAAC;QAAA,CAAC;QAAC,MAAM,KAAK,CAAA;IAAC,CAAC;AAC/P,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,QAAyB;IAChE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IACxC,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;IACxF,IAAI,CAAC;QAAC,MAAM,SAAS,CAAC,IAAI,GAAG,YAAY,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IAAC,CAAC;IACpF,OAAO,CAAC,EAAE,CAAC;QAAC,IAAK,CAA2B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAAC,MAAM,CAAC,CAAA;IAAC,CAAC;IACvF,MAAM,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;IAAC,OAAO,IAAI,CAAA;AAC3D,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAyB,EAAE,OAAmB,EAAE,MAA2D;IACjJ,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;IAAC,IAAI,CAAC,GAAG;QAAE,OAAM;IACpD,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,GAAG,CAAC,UAAU,CAAC,CAAA;IACrE,IAAI,MAAe,CAAA;IACnB,IAAI,CAAC;QAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,MAAM,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,CAAA;IAAC,CAAC;IAC5G,8EAA8E;IAC9E,IAAI,MAAM,CAAC,KAAK,KAAK,UAAU;QAAE,MAAM,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,CAAA;IAClF,MAAM,CAAC,OAAO,KAAK,OAAO,CAAA;IAC1B,MAAM,IAAI,CAAC,MAAM,CAAC,CAAA;IAClB,MAAM,MAAM,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,iBAAiB,EAAE,GAAG,CAAC,eAAe,EAAE,WAAW,EAAE,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;IAChK,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;IAAC,MAAM,IAAI,CAAC,MAAM,CAAC,CAAA;AAC3C,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,SAAiB;IACzD,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAAC,MAAM,OAAO,GAAc,EAAE,CAAA;IAC5E,KAAK,MAAM,IAAI,IAAI,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,SAAQ;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAY,CAAA;QAChF,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC7D,IAAI,CAAC,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;gBAAC,IAAI,CAAC;oBAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;oBAAC,CAAC,CAAC,KAAK,GAAG,YAAY,CAAA;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;YAAC,CAAC;YAC/H,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;IACF,CAAC;IACD,OAAO,OAAO,CAAA;AACf,CAAC"}
|
|
@@ -33,6 +33,9 @@ export declare class BotlinkChannel implements ChannelPlugin {
|
|
|
33
33
|
private stopAccount;
|
|
34
34
|
private pollLoop;
|
|
35
35
|
private scheduleDispatch;
|
|
36
|
+
private recoverPendingRuns;
|
|
37
|
+
private ackRunDelivery;
|
|
38
|
+
private advanceOffset;
|
|
36
39
|
private logDispatchFailure;
|
|
37
40
|
private request;
|
|
38
41
|
private toSessionEnvelope;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"botlink.d.ts","sourceRoot":"","sources":["../../src/channels/botlink.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"botlink.d.ts","sourceRoot":"","sources":["../../src/channels/botlink.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAmB,MAAM,mBAAmB,CAAA;AAgBvF,UAAU,YAAY;IACpB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAmDD,qBAAa,gBAAiB,SAAQ,KAAK;IAEvC,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM;gBADd,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACvB,MAAM,EAAE,MAAM;CAIjB;AAED,qBAAa,eAAgB,SAAQ,KAAK;IAEtC,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS;gBAD7B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAAG,SAAS,EACtC,MAAM,EAAE,MAAM;CAIjB;AAED,KAAK,aAAa,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;AAiBvE,qBAAa,cAAe,YAAW,aAAa;IAMtC,OAAO,CAAC,QAAQ,CAAC,IAAI;IALjC,EAAE,SAAY;IAEd,OAAO,CAAC,QAAQ,CAA2C;IAC3D,OAAO,CAAC,GAAG,CAA8B;gBAEZ,IAAI,GAAE,aAAqB;IAElD,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB7D,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IA0B9D,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YAejB,YAAY;YAoCZ,cAAc;YAQd,aAAa;IAsB3B,OAAO,CAAC,uBAAuB;IAM/B,OAAO,CAAC,qBAAqB;YAQf,WAAW;YAYX,QAAQ;IA2ItB,OAAO,CAAC,gBAAgB;YAwBV,kBAAkB;YAmBlB,cAAc;IAS5B,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,kBAAkB;YAqBZ,OAAO;YAmDP,iBAAiB;YAwEjB,mBAAmB;YAoCnB,YAAY;IA8B1B,OAAO,CAAC,mBAAmB;CAY5B;AAuCD,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,YAAY,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAY5F"}
|