@jasonews/agent-squad-gateway 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +200 -0
- package/SECURITY.md +44 -0
- package/dist/bin/agent-squad-gateway.js +55 -0
- package/dist/bin/agent-squad-gateway.js.map +1 -0
- package/dist/config/config.js +124 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/paths.js +16 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/control-plane/clients.js +77 -0
- package/dist/control-plane/clients.js.map +1 -0
- package/dist/control-plane/core-connection.js +54 -0
- package/dist/control-plane/core-connection.js.map +1 -0
- package/dist/control-plane/credentials.js +134 -0
- package/dist/control-plane/credentials.js.map +1 -0
- package/dist/control-plane/db.js +33 -0
- package/dist/control-plane/db.js.map +1 -0
- package/dist/control-plane/extensions.js +59 -0
- package/dist/control-plane/extensions.js.map +1 -0
- package/dist/control-plane/grants.js +107 -0
- package/dist/control-plane/grants.js.map +1 -0
- package/dist/control-plane/idempotency.js +132 -0
- package/dist/control-plane/idempotency.js.map +1 -0
- package/dist/control-plane/migrations.js +133 -0
- package/dist/control-plane/migrations.js.map +1 -0
- package/dist/control-plane/response-sessions.js +359 -0
- package/dist/control-plane/response-sessions.js.map +1 -0
- package/dist/control-plane/retention.js +138 -0
- package/dist/control-plane/retention.js.map +1 -0
- package/dist/control-plane/runs.js +156 -0
- package/dist/control-plane/runs.js.map +1 -0
- package/dist/control-plane/targets.js +449 -0
- package/dist/control-plane/targets.js.map +1 -0
- package/dist/control-plane/types.js +2 -0
- package/dist/control-plane/types.js.map +1 -0
- package/dist/core-client/client.js +275 -0
- package/dist/core-client/client.js.map +1 -0
- package/dist/core-client/event-proxy.js +105 -0
- package/dist/core-client/event-proxy.js.map +1 -0
- package/dist/core-client/types.js +2 -0
- package/dist/core-client/types.js.map +1 -0
- package/dist/extensions/contract.js +2 -0
- package/dist/extensions/contract.js.map +1 -0
- package/dist/extensions/openai/auth.js +16 -0
- package/dist/extensions/openai/auth.js.map +1 -0
- package/dist/extensions/openai/chat.js +403 -0
- package/dist/extensions/openai/chat.js.map +1 -0
- package/dist/extensions/openai/errors.js +79 -0
- package/dist/extensions/openai/errors.js.map +1 -0
- package/dist/extensions/openai/image-input.js +79 -0
- package/dist/extensions/openai/image-input.js.map +1 -0
- package/dist/extensions/openai/models.js +40 -0
- package/dist/extensions/openai/models.js.map +1 -0
- package/dist/extensions/openai/responses.js +731 -0
- package/dist/extensions/openai/responses.js.map +1 -0
- package/dist/extensions/openai/routes.js +81 -0
- package/dist/extensions/openai/routes.js.map +1 -0
- package/dist/extensions/openai/run-attempt.js +96 -0
- package/dist/extensions/openai/run-attempt.js.map +1 -0
- package/dist/extensions/openai/schemas.js +176 -0
- package/dist/extensions/openai/schemas.js.map +1 -0
- package/dist/extensions/openai/sse.js +421 -0
- package/dist/extensions/openai/sse.js.map +1 -0
- package/dist/extensions/openai/tools.js +727 -0
- package/dist/extensions/openai/tools.js.map +1 -0
- package/dist/extensions/registry.js +30 -0
- package/dist/extensions/registry.js.map +1 -0
- package/dist/lifecycle/daemon.js +437 -0
- package/dist/lifecycle/daemon.js.map +1 -0
- package/dist/lifecycle/pidfile.js +34 -0
- package/dist/lifecycle/pidfile.js.map +1 -0
- package/dist/provider-runtime/antigravity/adapter.js +398 -0
- package/dist/provider-runtime/antigravity/adapter.js.map +1 -0
- package/dist/provider-runtime/antigravity/conversation.js +31 -0
- package/dist/provider-runtime/antigravity/conversation.js.map +1 -0
- package/dist/provider-runtime/capability-service.js +191 -0
- package/dist/provider-runtime/capability-service.js.map +1 -0
- package/dist/provider-runtime/claude/adapter.js +397 -0
- package/dist/provider-runtime/claude/adapter.js.map +1 -0
- package/dist/provider-runtime/claude/protocol.js +143 -0
- package/dist/provider-runtime/claude/protocol.js.map +1 -0
- package/dist/provider-runtime/codex/adapter.js +440 -0
- package/dist/provider-runtime/codex/adapter.js.map +1 -0
- package/dist/provider-runtime/codex/json-rpc-client.js +182 -0
- package/dist/provider-runtime/codex/json-rpc-client.js.map +1 -0
- package/dist/provider-runtime/codex/protocol.js +128 -0
- package/dist/provider-runtime/codex/protocol.js.map +1 -0
- package/dist/provider-runtime/command-discovery.js +106 -0
- package/dist/provider-runtime/command-discovery.js.map +1 -0
- package/dist/provider-runtime/cursor/adapter.js +427 -0
- package/dist/provider-runtime/cursor/adapter.js.map +1 -0
- package/dist/provider-runtime/cursor/protocol.js +81 -0
- package/dist/provider-runtime/cursor/protocol.js.map +1 -0
- package/dist/provider-runtime/fake/adapter.js +138 -0
- package/dist/provider-runtime/fake/adapter.js.map +1 -0
- package/dist/provider-runtime/image-assets.js +409 -0
- package/dist/provider-runtime/image-assets.js.map +1 -0
- package/dist/provider-runtime/image-support.js +5 -0
- package/dist/provider-runtime/image-support.js.map +1 -0
- package/dist/provider-runtime/invocation-service.js +503 -0
- package/dist/provider-runtime/invocation-service.js.map +1 -0
- package/dist/provider-runtime/kimi/adapter.js +657 -0
- package/dist/provider-runtime/kimi/adapter.js.map +1 -0
- package/dist/provider-runtime/opencode/adapter.js +610 -0
- package/dist/provider-runtime/opencode/adapter.js.map +1 -0
- package/dist/provider-runtime/opencode/server.js +46 -0
- package/dist/provider-runtime/opencode/server.js.map +1 -0
- package/dist/provider-runtime/process/line-reader.js +49 -0
- package/dist/provider-runtime/process/line-reader.js.map +1 -0
- package/dist/provider-runtime/process/managed-process.js +151 -0
- package/dist/provider-runtime/process/managed-process.js.map +1 -0
- package/dist/provider-runtime/provider-input.js +77 -0
- package/dist/provider-runtime/provider-input.js.map +1 -0
- package/dist/provider-runtime/register-providers.js +26 -0
- package/dist/provider-runtime/register-providers.js.map +1 -0
- package/dist/provider-runtime/registry.js +35 -0
- package/dist/provider-runtime/registry.js.map +1 -0
- package/dist/provider-runtime/replay-buffer.js +168 -0
- package/dist/provider-runtime/replay-buffer.js.map +1 -0
- package/dist/provider-runtime/scheduler.js +155 -0
- package/dist/provider-runtime/scheduler.js.map +1 -0
- package/dist/provider-runtime/types.js +2 -0
- package/dist/provider-runtime/types.js.map +1 -0
- package/dist/provider-runtime/workspaces.js +814 -0
- package/dist/provider-runtime/workspaces.js.map +1 -0
- package/dist/security/admin-auth.js +109 -0
- package/dist/security/admin-auth.js.map +1 -0
- package/dist/security/crypto.js +52 -0
- package/dist/security/crypto.js.map +1 -0
- package/dist/security/secret-files.js +33 -0
- package/dist/security/secret-files.js.map +1 -0
- package/dist/server/admin-routes.js +610 -0
- package/dist/server/admin-routes.js.map +1 -0
- package/dist/server/app.js +178 -0
- package/dist/server/app.js.map +1 -0
- package/dist/server/auth-hooks.js +43 -0
- package/dist/server/auth-hooks.js.map +1 -0
- package/dist/server/core-routes.js +127 -0
- package/dist/server/core-routes.js.map +1 -0
- package/dist/server/errors.js +19 -0
- package/dist/server/errors.js.map +1 -0
- package/dist/server/ui-routes.js +77 -0
- package/dist/server/ui-routes.js.map +1 -0
- package/dist/web/assets/index-BhqNoPpE.js +206 -0
- package/dist/web/assets/index-BhqNoPpE.js.map +1 -0
- package/dist/web/assets/index-C5nnaBfZ.css +1 -0
- package/dist/web/index.html +14 -0
- package/package.json +74 -0
- package/translations/README.zh-CN.md +175 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/provider-runtime/cursor/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
const initEventSchema = z.object({
|
|
3
|
+
type: z.literal('system'),
|
|
4
|
+
subtype: z.literal('init'),
|
|
5
|
+
session_id: z.string().min(1),
|
|
6
|
+
cwd: z.string().optional(),
|
|
7
|
+
model: z.string().optional(),
|
|
8
|
+
permissionMode: z.string().optional(),
|
|
9
|
+
}).passthrough();
|
|
10
|
+
const userEventSchema = z.object({
|
|
11
|
+
type: z.literal('user'),
|
|
12
|
+
session_id: z.string().min(1),
|
|
13
|
+
message: z.unknown(),
|
|
14
|
+
}).passthrough();
|
|
15
|
+
const textBlockSchema = z.object({
|
|
16
|
+
type: z.literal('text'),
|
|
17
|
+
text: z.string(),
|
|
18
|
+
}).passthrough();
|
|
19
|
+
const assistantEventSchema = z.object({
|
|
20
|
+
type: z.literal('assistant'),
|
|
21
|
+
session_id: z.string().min(1),
|
|
22
|
+
message: z.object({
|
|
23
|
+
role: z.literal('assistant'),
|
|
24
|
+
content: z.array(textBlockSchema).min(1),
|
|
25
|
+
}).passthrough(),
|
|
26
|
+
timestamp_ms: z.number().int().optional(),
|
|
27
|
+
}).passthrough();
|
|
28
|
+
const thinkingEventSchema = z.object({
|
|
29
|
+
type: z.literal('thinking'),
|
|
30
|
+
subtype: z.enum(['delta', 'completed']),
|
|
31
|
+
session_id: z.string().min(1),
|
|
32
|
+
text: z.string().optional(),
|
|
33
|
+
timestamp_ms: z.number().int().optional(),
|
|
34
|
+
}).passthrough();
|
|
35
|
+
const toolCallEventSchema = z.object({
|
|
36
|
+
type: z.literal('tool_call'),
|
|
37
|
+
subtype: z.string(),
|
|
38
|
+
session_id: z.string().min(1),
|
|
39
|
+
call_id: z.string().optional(),
|
|
40
|
+
tool_call: z.unknown(),
|
|
41
|
+
}).passthrough();
|
|
42
|
+
const resultEventSchema = z.object({
|
|
43
|
+
type: z.literal('result'),
|
|
44
|
+
subtype: z.string(),
|
|
45
|
+
is_error: z.boolean(),
|
|
46
|
+
session_id: z.string().min(1),
|
|
47
|
+
result: z.string().optional(),
|
|
48
|
+
}).passthrough();
|
|
49
|
+
const cursorEventSchema = z.discriminatedUnion('type', [
|
|
50
|
+
initEventSchema,
|
|
51
|
+
userEventSchema,
|
|
52
|
+
thinkingEventSchema,
|
|
53
|
+
assistantEventSchema,
|
|
54
|
+
toolCallEventSchema,
|
|
55
|
+
resultEventSchema,
|
|
56
|
+
]);
|
|
57
|
+
export class CursorAdapterError extends Error {
|
|
58
|
+
code;
|
|
59
|
+
constructor(code) {
|
|
60
|
+
super(code);
|
|
61
|
+
this.code = code;
|
|
62
|
+
this.name = 'CursorAdapterError';
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
export function parseCursorEvent(line) {
|
|
66
|
+
let value;
|
|
67
|
+
try {
|
|
68
|
+
value = JSON.parse(line);
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
throw new CursorAdapterError('adapter_protocol_error');
|
|
72
|
+
}
|
|
73
|
+
const parsed = cursorEventSchema.safeParse(value);
|
|
74
|
+
if (!parsed.success)
|
|
75
|
+
throw new CursorAdapterError('adapter_protocol_error');
|
|
76
|
+
return parsed.data;
|
|
77
|
+
}
|
|
78
|
+
export function cursorAssistantText(event) {
|
|
79
|
+
return event.message.content.map((block) => block.text).join('');
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/provider-runtime/cursor/protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
export class FakeProviderAdapter {
|
|
2
|
+
options;
|
|
3
|
+
activeRuns = new Map();
|
|
4
|
+
constructor(options = {}) {
|
|
5
|
+
this.options = options;
|
|
6
|
+
}
|
|
7
|
+
async probeCapabilities(_request) {
|
|
8
|
+
return {
|
|
9
|
+
available: true,
|
|
10
|
+
verified: false,
|
|
11
|
+
modelSelection: true,
|
|
12
|
+
effortSelection: true,
|
|
13
|
+
modelOptions: [{ id: 'fake', label: 'Fake', effortOptions: ['low', 'medium', 'high'] }],
|
|
14
|
+
isolationLevel: 'strict',
|
|
15
|
+
streamingMode: 'native',
|
|
16
|
+
toolBridge: 'structured_output',
|
|
17
|
+
resume: true,
|
|
18
|
+
cancellation: true,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
start(request) {
|
|
22
|
+
return this.stream(request, `fake_session_${request.runId}`);
|
|
23
|
+
}
|
|
24
|
+
resume(request) {
|
|
25
|
+
return this.stream(request, request.nativeSessionId);
|
|
26
|
+
}
|
|
27
|
+
async cancel(runId) {
|
|
28
|
+
this.activeRuns.get(runId)?.forEach((controller) => controller.abort());
|
|
29
|
+
}
|
|
30
|
+
async *stream(request, nativeSessionId) {
|
|
31
|
+
const cancellation = new AbortController();
|
|
32
|
+
const abortRequest = () => cancellation.abort();
|
|
33
|
+
let cleaned = false;
|
|
34
|
+
const cleanup = () => {
|
|
35
|
+
if (cleaned)
|
|
36
|
+
return;
|
|
37
|
+
cleaned = true;
|
|
38
|
+
request.signal.removeEventListener('abort', abortRequest);
|
|
39
|
+
const controllers = this.activeRuns.get(request.runId);
|
|
40
|
+
if (!controllers)
|
|
41
|
+
return;
|
|
42
|
+
controllers.delete(cancellation);
|
|
43
|
+
if (controllers.size === 0)
|
|
44
|
+
this.activeRuns.delete(request.runId);
|
|
45
|
+
};
|
|
46
|
+
request.signal.addEventListener('abort', abortRequest, { once: true });
|
|
47
|
+
if (request.signal.aborted)
|
|
48
|
+
cancellation.abort();
|
|
49
|
+
const controllers = this.activeRuns.get(request.runId) ?? new Set();
|
|
50
|
+
controllers.add(cancellation);
|
|
51
|
+
this.activeRuns.set(request.runId, controllers);
|
|
52
|
+
try {
|
|
53
|
+
if (cancellation.signal.aborted) {
|
|
54
|
+
cleanup();
|
|
55
|
+
yield { type: 'cancelled' };
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (this.options.failBeforeSession) {
|
|
59
|
+
cleanup();
|
|
60
|
+
yield {
|
|
61
|
+
type: 'failed',
|
|
62
|
+
code: 'fake_failed_before_session',
|
|
63
|
+
message: 'Fake provider failed before starting a session',
|
|
64
|
+
nativeStateAdvanced: false,
|
|
65
|
+
};
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
yield { type: 'session_started', nativeSessionId };
|
|
69
|
+
if (this.options.failAfterSession) {
|
|
70
|
+
cleanup();
|
|
71
|
+
yield {
|
|
72
|
+
type: 'failed',
|
|
73
|
+
code: 'fake_failed_after_session',
|
|
74
|
+
message: 'Fake provider failed after starting a session',
|
|
75
|
+
nativeStateAdvanced: true,
|
|
76
|
+
};
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const structured = request.outputSchema !== null;
|
|
80
|
+
for (const chunk of this.chunks(structured)) {
|
|
81
|
+
if (await waitForDelay(this.options.delayMs ?? 0, cancellation.signal)) {
|
|
82
|
+
cleanup();
|
|
83
|
+
yield { type: 'cancelled' };
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (cancellation.signal.aborted) {
|
|
87
|
+
cleanup();
|
|
88
|
+
yield { type: 'cancelled' };
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
yield structured ? { type: 'structured_delta', delta: chunk } : { type: 'text_delta', delta: chunk };
|
|
92
|
+
}
|
|
93
|
+
if (cancellation.signal.aborted) {
|
|
94
|
+
cleanup();
|
|
95
|
+
yield { type: 'cancelled' };
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
cleanup();
|
|
99
|
+
yield { type: 'completed' };
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
cleanup();
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
chunks(structured) {
|
|
106
|
+
if (!structured)
|
|
107
|
+
return this.options.chunks ?? ['fake response'];
|
|
108
|
+
const envelope = JSON.stringify(this.options.structuredEnvelope ?? {});
|
|
109
|
+
const chunks = this.options.chunks;
|
|
110
|
+
if (chunks && chunks.length >= 2 && chunks.join('') === envelope)
|
|
111
|
+
return chunks;
|
|
112
|
+
const splitAt = Math.ceil(envelope.length / 2);
|
|
113
|
+
return [envelope.slice(0, splitAt), envelope.slice(splitAt)];
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function waitForDelay(delayMs, signal) {
|
|
117
|
+
if (signal.aborted)
|
|
118
|
+
return Promise.resolve(true);
|
|
119
|
+
if (delayMs <= 0)
|
|
120
|
+
return Promise.resolve(false);
|
|
121
|
+
return new Promise((resolve) => {
|
|
122
|
+
let timer;
|
|
123
|
+
const complete = (cancelled) => {
|
|
124
|
+
if (timer)
|
|
125
|
+
clearTimeout(timer);
|
|
126
|
+
signal.removeEventListener('abort', onAbort);
|
|
127
|
+
resolve(cancelled);
|
|
128
|
+
};
|
|
129
|
+
const onAbort = () => complete(true);
|
|
130
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
131
|
+
if (signal.aborted) {
|
|
132
|
+
complete(true);
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
timer = setTimeout(() => complete(false), delayMs);
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/provider-runtime/fake/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
import { lookup as lookupHost } from 'node:dns/promises';
|
|
2
|
+
import { chmod, mkdtemp, rm, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { request as requestHttps } from 'node:https';
|
|
4
|
+
import { isIP } from 'node:net';
|
|
5
|
+
import { tmpdir } from 'node:os';
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
const DEFAULT_MAX_IMAGES = 8;
|
|
8
|
+
const DEFAULT_MAX_IMAGE_BYTES = 10 * 1024 * 1024;
|
|
9
|
+
const DEFAULT_MAX_TOTAL_BYTES = 25 * 1024 * 1024;
|
|
10
|
+
const DEFAULT_FETCH_TIMEOUT_MS = 10_000;
|
|
11
|
+
const DEFAULT_MAX_REDIRECTS = 3;
|
|
12
|
+
const MAX_URL_LENGTH = 8_192;
|
|
13
|
+
export class ImageAssetError extends Error {
|
|
14
|
+
code;
|
|
15
|
+
constructor(code) {
|
|
16
|
+
super(code);
|
|
17
|
+
this.code = code;
|
|
18
|
+
this.name = 'ImageAssetError';
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const MEDIA_EXTENSIONS = {
|
|
22
|
+
'image/png': 'png',
|
|
23
|
+
'image/jpeg': 'jpg',
|
|
24
|
+
'image/gif': 'gif',
|
|
25
|
+
'image/webp': 'webp',
|
|
26
|
+
};
|
|
27
|
+
function fail(code) {
|
|
28
|
+
throw new ImageAssetError(code);
|
|
29
|
+
}
|
|
30
|
+
function supportedMediaType(value) {
|
|
31
|
+
const normalized = value?.split(';', 1)[0]?.trim().toLowerCase();
|
|
32
|
+
switch (normalized) {
|
|
33
|
+
case 'image/png':
|
|
34
|
+
case 'image/jpeg':
|
|
35
|
+
case 'image/gif':
|
|
36
|
+
case 'image/webp':
|
|
37
|
+
return normalized;
|
|
38
|
+
default:
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function hasExpectedSignature(data, mediaType) {
|
|
43
|
+
switch (mediaType) {
|
|
44
|
+
case 'image/png':
|
|
45
|
+
return data.length >= 8
|
|
46
|
+
&& data.subarray(0, 8).equals(Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]));
|
|
47
|
+
case 'image/jpeg':
|
|
48
|
+
return data.length >= 3 && data[0] === 0xff && data[1] === 0xd8 && data[2] === 0xff;
|
|
49
|
+
case 'image/gif':
|
|
50
|
+
return data.length >= 6 && (data.subarray(0, 6).toString('ascii') === 'GIF87a'
|
|
51
|
+
|| data.subarray(0, 6).toString('ascii') === 'GIF89a');
|
|
52
|
+
case 'image/webp':
|
|
53
|
+
return data.length >= 12
|
|
54
|
+
&& data.subarray(0, 4).toString('ascii') === 'RIFF'
|
|
55
|
+
&& data.subarray(8, 12).toString('ascii') === 'WEBP';
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function parseIpv4(address) {
|
|
59
|
+
const parts = address.split('.');
|
|
60
|
+
if (parts.length !== 4)
|
|
61
|
+
return null;
|
|
62
|
+
const octets = parts.map((part) => Number(part));
|
|
63
|
+
return octets.every((part) => Number.isInteger(part) && part >= 0 && part <= 255)
|
|
64
|
+
? octets
|
|
65
|
+
: null;
|
|
66
|
+
}
|
|
67
|
+
function isPublicIpv4(address) {
|
|
68
|
+
const octets = parseIpv4(address);
|
|
69
|
+
if (!octets)
|
|
70
|
+
return false;
|
|
71
|
+
const [a, b, c] = octets;
|
|
72
|
+
if (a === 0 || a === 10 || a === 127 || a >= 224)
|
|
73
|
+
return false;
|
|
74
|
+
if (a === 100 && b >= 64 && b <= 127)
|
|
75
|
+
return false;
|
|
76
|
+
if (a === 169 && b === 254)
|
|
77
|
+
return false;
|
|
78
|
+
if (a === 172 && b >= 16 && b <= 31)
|
|
79
|
+
return false;
|
|
80
|
+
if (a === 192 && b === 168)
|
|
81
|
+
return false;
|
|
82
|
+
if (a === 192 && b === 0 && c === 0)
|
|
83
|
+
return false;
|
|
84
|
+
if (a === 192 && b === 0 && c === 2)
|
|
85
|
+
return false;
|
|
86
|
+
if (a === 192 && b === 88 && c === 99)
|
|
87
|
+
return false;
|
|
88
|
+
if (a === 198 && (b === 18 || b === 19))
|
|
89
|
+
return false;
|
|
90
|
+
if (a === 198 && b === 51 && c === 100)
|
|
91
|
+
return false;
|
|
92
|
+
if (a === 203 && b === 0 && c === 113)
|
|
93
|
+
return false;
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
function ipv6Bytes(address) {
|
|
97
|
+
const value = address.toLowerCase().split('%', 1)[0];
|
|
98
|
+
if (value.length === 0 || value.includes(':::'))
|
|
99
|
+
return null;
|
|
100
|
+
const halves = value.split('::');
|
|
101
|
+
if (halves.length > 2)
|
|
102
|
+
return null;
|
|
103
|
+
const parseHalf = (half) => {
|
|
104
|
+
if (half.length === 0)
|
|
105
|
+
return [];
|
|
106
|
+
const groups = half.split(':');
|
|
107
|
+
const output = [];
|
|
108
|
+
for (const group of groups) {
|
|
109
|
+
if (group.includes('.')) {
|
|
110
|
+
const ipv4 = parseIpv4(group);
|
|
111
|
+
if (!ipv4 || group !== groups.at(-1))
|
|
112
|
+
return null;
|
|
113
|
+
output.push((ipv4[0] << 8) | ipv4[1], (ipv4[2] << 8) | ipv4[3]);
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
if (!/^[0-9a-f]{1,4}$/.test(group))
|
|
117
|
+
return null;
|
|
118
|
+
output.push(Number.parseInt(group, 16));
|
|
119
|
+
}
|
|
120
|
+
return output;
|
|
121
|
+
};
|
|
122
|
+
const left = parseHalf(halves[0]);
|
|
123
|
+
const right = parseHalf(halves[1] ?? '');
|
|
124
|
+
if (!left || !right)
|
|
125
|
+
return null;
|
|
126
|
+
const omitted = 8 - left.length - right.length;
|
|
127
|
+
if ((halves.length === 1 && omitted !== 0) || (halves.length === 2 && omitted < 1))
|
|
128
|
+
return null;
|
|
129
|
+
const groups = [...left, ...Array.from({ length: omitted }, () => 0), ...right];
|
|
130
|
+
if (groups.length !== 8)
|
|
131
|
+
return null;
|
|
132
|
+
return groups.flatMap((group) => [group >> 8, group & 0xff]);
|
|
133
|
+
}
|
|
134
|
+
function isPublicIpv6(address) {
|
|
135
|
+
const bytes = ipv6Bytes(address);
|
|
136
|
+
if (!bytes)
|
|
137
|
+
return false;
|
|
138
|
+
const allZero = bytes.every((byte) => byte === 0);
|
|
139
|
+
const loopback = bytes.slice(0, 15).every((byte) => byte === 0) && bytes[15] === 1;
|
|
140
|
+
if (allZero || loopback)
|
|
141
|
+
return false;
|
|
142
|
+
if (bytes.slice(0, 10).every((byte) => byte === 0) && bytes[10] === 0xff && bytes[11] === 0xff) {
|
|
143
|
+
return isPublicIpv4(`${bytes[12]}.${bytes[13]}.${bytes[14]}.${bytes[15]}`);
|
|
144
|
+
}
|
|
145
|
+
if (bytes.slice(0, 12).every((byte) => byte === 0)) {
|
|
146
|
+
return isPublicIpv4(`${bytes[12]}.${bytes[13]}.${bytes[14]}.${bytes[15]}`);
|
|
147
|
+
}
|
|
148
|
+
if ((bytes[0] & 0xfe) === 0xfc)
|
|
149
|
+
return false;
|
|
150
|
+
if (bytes[0] === 0xfe && (bytes[1] & 0xc0) === 0x80)
|
|
151
|
+
return false;
|
|
152
|
+
if (bytes[0] === 0xfe && (bytes[1] & 0xc0) === 0xc0)
|
|
153
|
+
return false;
|
|
154
|
+
if (bytes[0] === 0xff)
|
|
155
|
+
return false;
|
|
156
|
+
if (bytes[0] === 0x00 && bytes[1] === 0x64 && bytes[2] === 0xff && bytes[3] === 0x9b)
|
|
157
|
+
return false;
|
|
158
|
+
if (bytes[0] === 0x20 && bytes[1] === 0x02)
|
|
159
|
+
return false;
|
|
160
|
+
if (bytes[0] === 0x20 && bytes[1] === 0x01 && bytes[2] === 0x00 && bytes[3] === 0x00)
|
|
161
|
+
return false;
|
|
162
|
+
if (bytes[0] === 0x20 && bytes[1] === 0x01 && bytes[2] === 0x0d && bytes[3] === 0xb8)
|
|
163
|
+
return false;
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
export function isPublicIpAddress(address) {
|
|
167
|
+
const family = isIP(address);
|
|
168
|
+
if (family === 4)
|
|
169
|
+
return isPublicIpv4(address);
|
|
170
|
+
if (family === 6)
|
|
171
|
+
return isPublicIpv6(address);
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
function parseHttpsUrl(value) {
|
|
175
|
+
if (value.length === 0 || value.length > MAX_URL_LENGTH)
|
|
176
|
+
fail('image_input_invalid');
|
|
177
|
+
let url;
|
|
178
|
+
try {
|
|
179
|
+
url = new URL(value);
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
fail('image_input_invalid');
|
|
183
|
+
}
|
|
184
|
+
if (url.protocol !== 'https:' || url.username.length > 0 || url.password.length > 0) {
|
|
185
|
+
fail('image_input_invalid');
|
|
186
|
+
}
|
|
187
|
+
return url;
|
|
188
|
+
}
|
|
189
|
+
function decodeDataUrl(value, maxBytes) {
|
|
190
|
+
const match = /^data:([^;,]+);base64,(.*)$/s.exec(value);
|
|
191
|
+
if (!match)
|
|
192
|
+
fail('image_input_invalid');
|
|
193
|
+
const mediaType = supportedMediaType(match[1]);
|
|
194
|
+
if (!mediaType)
|
|
195
|
+
fail('image_input_invalid');
|
|
196
|
+
const encoded = match[2];
|
|
197
|
+
if (encoded.length === 0 || encoded.length > Math.ceil(maxBytes * 4 / 3) + 4) {
|
|
198
|
+
fail('image_too_large');
|
|
199
|
+
}
|
|
200
|
+
if (!/^[A-Za-z0-9+/]*={0,2}$/.test(encoded) || encoded.length % 4 === 1) {
|
|
201
|
+
fail('image_input_invalid');
|
|
202
|
+
}
|
|
203
|
+
const data = Buffer.from(encoded, 'base64');
|
|
204
|
+
if (data.toString('base64').replace(/=+$/, '') !== encoded.replace(/=+$/, '')) {
|
|
205
|
+
fail('image_input_invalid');
|
|
206
|
+
}
|
|
207
|
+
if (data.length > maxBytes)
|
|
208
|
+
fail('image_too_large');
|
|
209
|
+
if (!hasExpectedSignature(data, mediaType))
|
|
210
|
+
fail('image_input_invalid');
|
|
211
|
+
return { data, mediaType };
|
|
212
|
+
}
|
|
213
|
+
function abortable(operation, signal) {
|
|
214
|
+
if (signal.aborted)
|
|
215
|
+
return Promise.reject(signal.reason);
|
|
216
|
+
return new Promise((resolve, reject) => {
|
|
217
|
+
const onAbort = () => reject(signal.reason);
|
|
218
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
219
|
+
void operation.then((value) => {
|
|
220
|
+
signal.removeEventListener('abort', onAbort);
|
|
221
|
+
resolve(value);
|
|
222
|
+
}, (error) => {
|
|
223
|
+
signal.removeEventListener('abort', onAbort);
|
|
224
|
+
reject(error);
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
export class SecureImageDownloader {
|
|
229
|
+
fetchTimeoutMs;
|
|
230
|
+
maxRedirects;
|
|
231
|
+
resolve;
|
|
232
|
+
constructor(options = {}) {
|
|
233
|
+
this.fetchTimeoutMs = options.fetchTimeoutMs ?? DEFAULT_FETCH_TIMEOUT_MS;
|
|
234
|
+
this.maxRedirects = options.maxRedirects ?? DEFAULT_MAX_REDIRECTS;
|
|
235
|
+
this.resolve = options.resolve ?? lookupHost;
|
|
236
|
+
}
|
|
237
|
+
async download(value, maxBytes, signal) {
|
|
238
|
+
const timeout = new AbortController();
|
|
239
|
+
const timer = setTimeout(() => {
|
|
240
|
+
timeout.abort(new DOMException('Image fetch timed out', 'TimeoutError'));
|
|
241
|
+
}, this.fetchTimeoutMs);
|
|
242
|
+
timer.unref();
|
|
243
|
+
const combined = AbortSignal.any([signal, timeout.signal]);
|
|
244
|
+
try {
|
|
245
|
+
let url = parseHttpsUrl(value);
|
|
246
|
+
for (let redirects = 0;; redirects += 1) {
|
|
247
|
+
if (redirects > this.maxRedirects)
|
|
248
|
+
fail('image_fetch_failed');
|
|
249
|
+
const address = await this.resolvePublicAddress(url, combined);
|
|
250
|
+
const result = await this.downloadOnce(url, address, maxBytes, combined);
|
|
251
|
+
if (result.type === 'image')
|
|
252
|
+
return result;
|
|
253
|
+
url = parseHttpsUrl(new URL(result.location, url).toString());
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
if (signal.aborted)
|
|
258
|
+
throw signal.reason;
|
|
259
|
+
if (timeout.signal.aborted)
|
|
260
|
+
fail('image_fetch_timeout');
|
|
261
|
+
if (error instanceof ImageAssetError)
|
|
262
|
+
throw error;
|
|
263
|
+
fail('image_fetch_failed');
|
|
264
|
+
}
|
|
265
|
+
finally {
|
|
266
|
+
clearTimeout(timer);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
async resolvePublicAddress(url, signal) {
|
|
270
|
+
const hostname = url.hostname.startsWith('[') && url.hostname.endsWith(']')
|
|
271
|
+
? url.hostname.slice(1, -1)
|
|
272
|
+
: url.hostname;
|
|
273
|
+
const literalFamily = isIP(hostname);
|
|
274
|
+
const addresses = literalFamily === 0
|
|
275
|
+
? await abortable(this.resolve(hostname, { all: true, verbatim: true }), signal)
|
|
276
|
+
: [{ address: hostname, family: literalFamily }];
|
|
277
|
+
if (addresses.length === 0 || addresses.some((entry) => !isPublicIpAddress(entry.address))) {
|
|
278
|
+
fail('image_input_invalid');
|
|
279
|
+
}
|
|
280
|
+
const selected = addresses[0];
|
|
281
|
+
if (selected.family !== 4 && selected.family !== 6)
|
|
282
|
+
fail('image_input_invalid');
|
|
283
|
+
return { address: selected.address, family: selected.family };
|
|
284
|
+
}
|
|
285
|
+
downloadOnce(url, address, maxBytes, signal) {
|
|
286
|
+
return new Promise((resolve, reject) => {
|
|
287
|
+
const request = requestHttps(url, {
|
|
288
|
+
method: 'GET',
|
|
289
|
+
signal,
|
|
290
|
+
headers: {
|
|
291
|
+
accept: 'image/png,image/jpeg,image/gif,image/webp',
|
|
292
|
+
'user-agent': 'Agent-Squad-Gateway/0.1',
|
|
293
|
+
},
|
|
294
|
+
lookup: (_hostname, _options, callback) => {
|
|
295
|
+
callback(null, address.address, address.family);
|
|
296
|
+
},
|
|
297
|
+
}, (response) => {
|
|
298
|
+
const status = response.statusCode ?? 0;
|
|
299
|
+
if ([301, 302, 303, 307, 308].includes(status)) {
|
|
300
|
+
const location = response.headers.location;
|
|
301
|
+
response.resume();
|
|
302
|
+
if (!location) {
|
|
303
|
+
reject(new ImageAssetError('image_fetch_failed'));
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
resolve({ type: 'redirect', location });
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
if (status < 200 || status >= 300) {
|
|
310
|
+
response.resume();
|
|
311
|
+
reject(new ImageAssetError('image_fetch_failed'));
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
const mediaType = supportedMediaType(response.headers['content-type']);
|
|
315
|
+
if (!mediaType) {
|
|
316
|
+
response.resume();
|
|
317
|
+
reject(new ImageAssetError('image_input_invalid'));
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
const declaredLength = Number(response.headers['content-length']);
|
|
321
|
+
if (Number.isFinite(declaredLength) && declaredLength > maxBytes) {
|
|
322
|
+
response.resume();
|
|
323
|
+
reject(new ImageAssetError('image_too_large'));
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
const chunks = [];
|
|
327
|
+
let size = 0;
|
|
328
|
+
response.on('data', (chunk) => {
|
|
329
|
+
const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
330
|
+
size += buffer.length;
|
|
331
|
+
if (size > maxBytes) {
|
|
332
|
+
response.destroy(new ImageAssetError('image_too_large'));
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
chunks.push(buffer);
|
|
336
|
+
});
|
|
337
|
+
response.once('error', reject);
|
|
338
|
+
response.once('end', () => {
|
|
339
|
+
const data = Buffer.concat(chunks, size);
|
|
340
|
+
if (!hasExpectedSignature(data, mediaType)) {
|
|
341
|
+
reject(new ImageAssetError('image_input_invalid'));
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
resolve({ type: 'image', data, mediaType });
|
|
345
|
+
});
|
|
346
|
+
});
|
|
347
|
+
request.once('error', reject);
|
|
348
|
+
request.end();
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
export class ImageAssetMaterializer {
|
|
353
|
+
maxImages;
|
|
354
|
+
maxImageBytes;
|
|
355
|
+
maxTotalBytes;
|
|
356
|
+
downloader;
|
|
357
|
+
tempDirectory;
|
|
358
|
+
constructor(options = {}) {
|
|
359
|
+
this.maxImages = options.maxImages ?? DEFAULT_MAX_IMAGES;
|
|
360
|
+
this.maxImageBytes = options.maxImageBytes ?? DEFAULT_MAX_IMAGE_BYTES;
|
|
361
|
+
this.maxTotalBytes = options.maxTotalBytes ?? DEFAULT_MAX_TOTAL_BYTES;
|
|
362
|
+
this.downloader = options.downloader ?? new SecureImageDownloader();
|
|
363
|
+
this.tempDirectory = options.tempDirectory ?? tmpdir();
|
|
364
|
+
}
|
|
365
|
+
async materialize(sources, signal) {
|
|
366
|
+
if (sources.length === 0)
|
|
367
|
+
return { images: [], release: async () => { } };
|
|
368
|
+
if (sources.length > this.maxImages)
|
|
369
|
+
fail('image_limit_exceeded');
|
|
370
|
+
const directory = await mkdtemp(join(this.tempDirectory, 'agent-squad-images-'));
|
|
371
|
+
let released = false;
|
|
372
|
+
const release = async () => {
|
|
373
|
+
if (released)
|
|
374
|
+
return;
|
|
375
|
+
try {
|
|
376
|
+
await rm(directory, { recursive: true, force: true });
|
|
377
|
+
released = true;
|
|
378
|
+
}
|
|
379
|
+
catch {
|
|
380
|
+
fail('image_cleanup_failed');
|
|
381
|
+
}
|
|
382
|
+
};
|
|
383
|
+
try {
|
|
384
|
+
await chmod(directory, 0o700);
|
|
385
|
+
const images = [];
|
|
386
|
+
let totalBytes = 0;
|
|
387
|
+
for (const [index, source] of sources.entries()) {
|
|
388
|
+
if (signal.aborted)
|
|
389
|
+
throw signal.reason;
|
|
390
|
+
const downloaded = source.url.startsWith('data:')
|
|
391
|
+
? decodeDataUrl(source.url, this.maxImageBytes)
|
|
392
|
+
: await this.downloader.download(source.url, this.maxImageBytes, signal);
|
|
393
|
+
totalBytes += downloaded.data.length;
|
|
394
|
+
if (totalBytes > this.maxTotalBytes)
|
|
395
|
+
fail('image_limit_exceeded');
|
|
396
|
+
const filename = `image-${String(index + 1).padStart(2, '0')}.${MEDIA_EXTENSIONS[downloaded.mediaType]}`;
|
|
397
|
+
const path = join(directory, filename);
|
|
398
|
+
await writeFile(path, downloaded.data, { mode: 0o600, flag: 'wx' });
|
|
399
|
+
images.push({ path, mediaType: downloaded.mediaType, detail: source.detail });
|
|
400
|
+
}
|
|
401
|
+
return { images, release };
|
|
402
|
+
}
|
|
403
|
+
catch (error) {
|
|
404
|
+
await release();
|
|
405
|
+
throw error;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
//# sourceMappingURL=image-assets.js.map
|