sneakoscope 4.0.4 → 4.0.6
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 +9 -9
- package/crates/sks-core/Cargo.lock +1 -1
- package/crates/sks-core/Cargo.toml +1 -1
- package/crates/sks-core/src/main.rs +1 -1
- package/dist/bin/sks.js +1 -1
- package/dist/core/codex-app/glm-profile-schema.js +5 -1
- package/dist/core/commands/glm-command.js +51 -6
- package/dist/core/commands/mad-sks-command.js +65 -9
- package/dist/core/fsx.js +1 -1
- package/dist/core/perf/lru-cache.js +33 -0
- package/dist/core/providers/glm/glm-52-profile.js +14 -7
- package/dist/core/providers/glm/glm-52-request.js +43 -12
- package/dist/core/providers/glm/glm-52-response-guard.js +1 -2
- package/dist/core/providers/glm/glm-52-settings.js +50 -8
- package/dist/core/providers/glm/glm-bench.js +127 -0
- package/dist/core/providers/glm/glm-context-budget.js +15 -0
- package/dist/core/providers/glm/glm-context-cache.js +9 -0
- package/dist/core/providers/glm/glm-direct-run.js +140 -0
- package/dist/core/providers/glm/glm-interactive-launch.js +5 -0
- package/dist/core/providers/glm/glm-latency-trace.js +40 -0
- package/dist/core/providers/glm/glm-loop-guard.js +31 -0
- package/dist/core/providers/glm/glm-mad-launch.js +18 -3
- package/dist/core/providers/glm/glm-mad-mode.js +48 -20
- package/dist/core/providers/glm/glm-model-meta-cache.js +19 -0
- package/dist/core/providers/glm/glm-patch-apply.js +58 -0
- package/dist/core/providers/glm/glm-patch-parser.js +19 -0
- package/dist/core/providers/glm/glm-profile-resolver.js +104 -0
- package/dist/core/providers/glm/glm-readiness.js +5 -0
- package/dist/core/providers/glm/glm-reasoning-policy.js +15 -0
- package/dist/core/providers/glm/glm-request-cache.js +64 -0
- package/dist/core/providers/glm/glm-run-controller.js +66 -0
- package/dist/core/providers/glm/glm-run-state.js +11 -0
- package/dist/core/providers/glm/glm-run-timeout.js +31 -0
- package/dist/core/providers/glm/glm-speed-context.js +82 -0
- package/dist/core/providers/glm/glm-speed-gate.js +40 -0
- package/dist/core/providers/glm/glm-speed-output-parser.js +40 -0
- package/dist/core/providers/glm/glm-tool-schema-cache.js +19 -0
- package/dist/core/providers/openrouter/openrouter-client.js +21 -1
- package/dist/core/providers/openrouter/openrouter-stream.js +94 -0
- package/dist/core/version.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { redactOpenRouterString } from '../../security/redact-secrets.js';
|
|
2
|
+
import { OPENROUTER_CHAT_COMPLETIONS_URL } from './openrouter-types.js';
|
|
3
|
+
import { normalizeOpenRouterError } from './openrouter-error.js';
|
|
4
|
+
import { encodeGlmRequestWithCache } from '../glm/glm-request-cache.js';
|
|
5
|
+
export async function sendOpenRouterChatCompletionStream(input) {
|
|
6
|
+
const started = Date.now();
|
|
7
|
+
const controller = input.timeoutMs ? new AbortController() : null;
|
|
8
|
+
const timeout = controller ? setTimeout(() => controller.abort(), Math.max(1, input.timeoutMs || 0)) : null;
|
|
9
|
+
try {
|
|
10
|
+
const request = { ...input.request, stream: true };
|
|
11
|
+
const encoded = encodeGlmRequestWithCache(request);
|
|
12
|
+
const signal = input.signal || controller?.signal;
|
|
13
|
+
const response = await (input.fetchImpl || fetch)(OPENROUTER_CHAT_COMPLETIONS_URL, {
|
|
14
|
+
method: 'POST',
|
|
15
|
+
...(signal ? { signal } : {}),
|
|
16
|
+
headers: {
|
|
17
|
+
Authorization: `Bearer ${input.apiKey}`,
|
|
18
|
+
'Content-Type': 'application/json',
|
|
19
|
+
'X-OpenRouter-Title': 'Sneakoscope-Codex'
|
|
20
|
+
},
|
|
21
|
+
body: encoded.body
|
|
22
|
+
});
|
|
23
|
+
if (timeout)
|
|
24
|
+
clearTimeout(timeout);
|
|
25
|
+
const text = await response.text();
|
|
26
|
+
if (!response.ok)
|
|
27
|
+
return { ok: false, error: normalizeOpenRouterError(response.status, text) };
|
|
28
|
+
return { ok: true, value: parseOpenRouterStreamText(text, started) };
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
if (timeout)
|
|
32
|
+
clearTimeout(timeout);
|
|
33
|
+
if (err instanceof Error && err.name === 'AbortError') {
|
|
34
|
+
return {
|
|
35
|
+
ok: false,
|
|
36
|
+
error: {
|
|
37
|
+
code: 'glm_request_timeout',
|
|
38
|
+
message: `OpenRouter stream aborted after ${input.timeoutMs || 'external'}ms.`,
|
|
39
|
+
severity: 'failed'
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
ok: false,
|
|
45
|
+
error: {
|
|
46
|
+
code: 'glm_openrouter_stream_failed',
|
|
47
|
+
message: redactOpenRouterString(err instanceof Error ? err.message : String(err)),
|
|
48
|
+
severity: 'failed'
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export function parseOpenRouterStreamText(text, startedAtMs = Date.now()) {
|
|
54
|
+
const events = [];
|
|
55
|
+
let content = '';
|
|
56
|
+
let model;
|
|
57
|
+
let usage;
|
|
58
|
+
let ttft = null;
|
|
59
|
+
for (const line of text.split(/\r?\n/)) {
|
|
60
|
+
if (!line.startsWith('data:'))
|
|
61
|
+
continue;
|
|
62
|
+
const data = line.slice('data:'.length).trim();
|
|
63
|
+
if (!data || data === '[DONE]')
|
|
64
|
+
continue;
|
|
65
|
+
try {
|
|
66
|
+
const raw = JSON.parse(data);
|
|
67
|
+
const delta = raw?.choices?.[0]?.delta?.content;
|
|
68
|
+
if (typeof raw?.model === 'string')
|
|
69
|
+
model = raw.model;
|
|
70
|
+
if (raw?.usage)
|
|
71
|
+
usage = raw.usage;
|
|
72
|
+
if (typeof delta === 'string' && delta) {
|
|
73
|
+
if (ttft === null)
|
|
74
|
+
ttft = Math.max(0, Date.now() - startedAtMs);
|
|
75
|
+
content += delta;
|
|
76
|
+
events.push({ type: 'chunk', content_delta: delta, ...(model ? { model } : {}), raw });
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
events.push({ type: 'error', raw: data });
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
events.push({ type: 'done', ...(model ? { model } : {}), ...(usage ? { usage } : {}) });
|
|
84
|
+
return {
|
|
85
|
+
content,
|
|
86
|
+
...(model ? { model } : {}),
|
|
87
|
+
...(usage ? { usage } : {}),
|
|
88
|
+
ttft_ms: ttft,
|
|
89
|
+
total_ms: Math.max(0, Date.now() - startedAtMs),
|
|
90
|
+
chunk_count: events.filter((event) => event.type === 'chunk').length,
|
|
91
|
+
events
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=openrouter-stream.js.map
|
package/dist/core/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const PACKAGE_VERSION = '4.0.
|
|
1
|
+
export const PACKAGE_VERSION = '4.0.6';
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sneakoscope",
|
|
3
3
|
"displayName": "ㅅㅋㅅ",
|
|
4
|
-
"version": "4.0.
|
|
4
|
+
"version": "4.0.6",
|
|
5
5
|
"description": "Sneakoscope Codex: fast proof-first Codex trust layer with image-based Voxel TriWiki.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"homepage": "https://github.com/mandarange/Sneakoscope-Codex#readme",
|