lingxios 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/README.md +54 -0
- package/db/schema.sql +306 -0
- package/dist/src/app/artifacts.d.ts +8 -0
- package/dist/src/app/artifacts.js +114 -0
- package/dist/src/app/artifacts.js.map +1 -0
- package/dist/src/app/doctor.d.ts +22 -0
- package/dist/src/app/doctor.js +44 -0
- package/dist/src/app/doctor.js.map +1 -0
- package/dist/src/app/index.d.ts +123 -0
- package/dist/src/app/index.js +291 -0
- package/dist/src/app/index.js.map +1 -0
- package/dist/src/app/input.d.ts +22 -0
- package/dist/src/app/input.js +60 -0
- package/dist/src/app/input.js.map +1 -0
- package/dist/src/app/recover-wait.d.ts +5 -0
- package/dist/src/app/recover-wait.js +59 -0
- package/dist/src/app/recover-wait.js.map +1 -0
- package/dist/src/app/resources.d.ts +5 -0
- package/dist/src/app/resources.js +9 -0
- package/dist/src/app/resources.js.map +1 -0
- package/dist/src/app/storage.d.ts +2 -0
- package/dist/src/app/storage.js +41 -0
- package/dist/src/app/storage.js.map +1 -0
- package/dist/src/cli/doctor.d.ts +2 -0
- package/dist/src/cli/doctor.js +20 -0
- package/dist/src/cli/doctor.js.map +1 -0
- package/dist/src/cli/eval.d.ts +2 -0
- package/dist/src/cli/eval.js +44 -0
- package/dist/src/cli/eval.js.map +1 -0
- package/dist/src/config.d.ts +22 -0
- package/dist/src/config.js +56 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/context/attachments.d.ts +10 -0
- package/dist/src/context/attachments.js +18 -0
- package/dist/src/context/attachments.js.map +1 -0
- package/dist/src/context/document-text.d.ts +1 -0
- package/dist/src/context/document-text.js +29 -0
- package/dist/src/context/document-text.js.map +1 -0
- package/dist/src/context/document-worker.d.ts +1 -0
- package/dist/src/context/document-worker.js +62 -0
- package/dist/src/context/document-worker.js.map +1 -0
- package/dist/src/context/evidence.d.ts +19 -0
- package/dist/src/context/evidence.js +37 -0
- package/dist/src/context/evidence.js.map +1 -0
- package/dist/src/context/request.d.ts +21 -0
- package/dist/src/context/request.js +32 -0
- package/dist/src/context/request.js.map +1 -0
- package/dist/src/context/research-evidence.d.ts +4 -0
- package/dist/src/context/research-evidence.js +24 -0
- package/dist/src/context/research-evidence.js.map +1 -0
- package/dist/src/context/resource-checks.d.ts +7 -0
- package/dist/src/context/resource-checks.js +15 -0
- package/dist/src/context/resource-checks.js.map +1 -0
- package/dist/src/context/task-contract.d.ts +11 -0
- package/dist/src/context/task-contract.js +23 -0
- package/dist/src/context/task-contract.js.map +1 -0
- package/dist/src/context/text.d.ts +2 -0
- package/dist/src/context/text.js +7 -0
- package/dist/src/context/text.js.map +1 -0
- package/dist/src/control-plane/http-server.d.ts +22 -0
- package/dist/src/control-plane/http-server.js +196 -0
- package/dist/src/control-plane/http-server.js.map +1 -0
- package/dist/src/control-plane/memory-store.d.ts +71 -0
- package/dist/src/control-plane/memory-store.js +389 -0
- package/dist/src/control-plane/memory-store.js.map +1 -0
- package/dist/src/control-plane/pg-store.d.ts +62 -0
- package/dist/src/control-plane/pg-store.js +386 -0
- package/dist/src/control-plane/pg-store.js.map +1 -0
- package/dist/src/control-plane/service.d.ts +52 -0
- package/dist/src/control-plane/service.js +630 -0
- package/dist/src/control-plane/service.js.map +1 -0
- package/dist/src/control-plane/stores.d.ts +184 -0
- package/dist/src/control-plane/stores.js +19 -0
- package/dist/src/control-plane/stores.js.map +1 -0
- package/dist/src/errors.d.ts +66 -0
- package/dist/src/errors.js +102 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/eval/calibration.d.ts +16 -0
- package/dist/src/eval/calibration.js +28 -0
- package/dist/src/eval/calibration.js.map +1 -0
- package/dist/src/eval/index.d.ts +40 -0
- package/dist/src/eval/index.js +40 -0
- package/dist/src/eval/index.js.map +1 -0
- package/dist/src/eval/review.d.ts +20 -0
- package/dist/src/eval/review.js +49 -0
- package/dist/src/eval/review.js.map +1 -0
- package/dist/src/host/http-client.d.ts +48 -0
- package/dist/src/host/http-client.js +127 -0
- package/dist/src/host/http-client.js.map +1 -0
- package/dist/src/host/port.d.ts +26 -0
- package/dist/src/host/port.js +2 -0
- package/dist/src/host/port.js.map +1 -0
- package/dist/src/index.d.ts +17 -0
- package/dist/src/index.js +9 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/integrations/lingxiloop/actions.d.ts +25 -0
- package/dist/src/integrations/lingxiloop/actions.js +77 -0
- package/dist/src/integrations/lingxiloop/actions.js.map +1 -0
- package/dist/src/integrations/lingxiloop/app.d.ts +167 -0
- package/dist/src/integrations/lingxiloop/app.js +434 -0
- package/dist/src/integrations/lingxiloop/app.js.map +1 -0
- package/dist/src/integrations/lingxiloop/approvals.d.ts +148 -0
- package/dist/src/integrations/lingxiloop/approvals.js +540 -0
- package/dist/src/integrations/lingxiloop/approvals.js.map +1 -0
- package/dist/src/integrations/lingxiloop/attachments.d.ts +8 -0
- package/dist/src/integrations/lingxiloop/attachments.js +38 -0
- package/dist/src/integrations/lingxiloop/attachments.js.map +1 -0
- package/dist/src/integrations/lingxiloop/calendar-approvals.d.ts +21 -0
- package/dist/src/integrations/lingxiloop/calendar-approvals.js +126 -0
- package/dist/src/integrations/lingxiloop/calendar-approvals.js.map +1 -0
- package/dist/src/integrations/lingxiloop/calendar-writes.d.ts +15 -0
- package/dist/src/integrations/lingxiloop/calendar-writes.js +79 -0
- package/dist/src/integrations/lingxiloop/calendar-writes.js.map +1 -0
- package/dist/src/integrations/lingxiloop/calendar.d.ts +19 -0
- package/dist/src/integrations/lingxiloop/calendar.js +43 -0
- package/dist/src/integrations/lingxiloop/calendar.js.map +1 -0
- package/dist/src/integrations/lingxiloop/canvas-events.d.ts +7 -0
- package/dist/src/integrations/lingxiloop/canvas-events.js +53 -0
- package/dist/src/integrations/lingxiloop/canvas-events.js.map +1 -0
- package/dist/src/integrations/lingxiloop/canvas-summary.d.ts +5 -0
- package/dist/src/integrations/lingxiloop/canvas-summary.js +52 -0
- package/dist/src/integrations/lingxiloop/canvas-summary.js.map +1 -0
- package/dist/src/integrations/lingxiloop/canvas-work-report.d.ts +12 -0
- package/dist/src/integrations/lingxiloop/canvas-work-report.js +120 -0
- package/dist/src/integrations/lingxiloop/canvas-work-report.js.map +1 -0
- package/dist/src/integrations/lingxiloop/canvas-work.d.ts +11 -0
- package/dist/src/integrations/lingxiloop/canvas-work.js +306 -0
- package/dist/src/integrations/lingxiloop/canvas-work.js.map +1 -0
- package/dist/src/integrations/lingxiloop/canvas.d.ts +12 -0
- package/dist/src/integrations/lingxiloop/canvas.js +79 -0
- package/dist/src/integrations/lingxiloop/canvas.js.map +1 -0
- package/dist/src/integrations/lingxiloop/chat.d.ts +11 -0
- package/dist/src/integrations/lingxiloop/chat.js +46 -0
- package/dist/src/integrations/lingxiloop/chat.js.map +1 -0
- package/dist/src/integrations/lingxiloop/document-approvals.d.ts +21 -0
- package/dist/src/integrations/lingxiloop/document-approvals.js +75 -0
- package/dist/src/integrations/lingxiloop/document-approvals.js.map +1 -0
- package/dist/src/integrations/lingxiloop/document-content.d.ts +80 -0
- package/dist/src/integrations/lingxiloop/document-content.js +195 -0
- package/dist/src/integrations/lingxiloop/document-content.js.map +1 -0
- package/dist/src/integrations/lingxiloop/document-writes.d.ts +8 -0
- package/dist/src/integrations/lingxiloop/document-writes.js +49 -0
- package/dist/src/integrations/lingxiloop/document-writes.js.map +1 -0
- package/dist/src/integrations/lingxiloop/documents.d.ts +22 -0
- package/dist/src/integrations/lingxiloop/documents.js +38 -0
- package/dist/src/integrations/lingxiloop/documents.js.map +1 -0
- package/dist/src/integrations/lingxiloop/event-outbox.d.ts +5 -0
- package/dist/src/integrations/lingxiloop/event-outbox.js +47 -0
- package/dist/src/integrations/lingxiloop/event-outbox.js.map +1 -0
- package/dist/src/integrations/lingxiloop/index.d.ts +3 -0
- package/dist/src/integrations/lingxiloop/index.js +3 -0
- package/dist/src/integrations/lingxiloop/index.js.map +1 -0
- package/dist/src/integrations/lingxiloop/learning-attempts.d.ts +13 -0
- package/dist/src/integrations/lingxiloop/learning-attempts.js +58 -0
- package/dist/src/integrations/lingxiloop/learning-attempts.js.map +1 -0
- package/dist/src/integrations/lingxiloop/learning-evaluation.d.ts +8 -0
- package/dist/src/integrations/lingxiloop/learning-evaluation.js +64 -0
- package/dist/src/integrations/lingxiloop/learning-evaluation.js.map +1 -0
- package/dist/src/integrations/lingxiloop/learning-evidence.d.ts +7 -0
- package/dist/src/integrations/lingxiloop/learning-evidence.js +88 -0
- package/dist/src/integrations/lingxiloop/learning-evidence.js.map +1 -0
- package/dist/src/integrations/lingxiloop/learning-missions.d.ts +18 -0
- package/dist/src/integrations/lingxiloop/learning-missions.js +95 -0
- package/dist/src/integrations/lingxiloop/learning-missions.js.map +1 -0
- package/dist/src/integrations/lingxiloop/learning.d.ts +22 -0
- package/dist/src/integrations/lingxiloop/learning.js +150 -0
- package/dist/src/integrations/lingxiloop/learning.js.map +1 -0
- package/dist/src/integrations/lingxiloop/memory.d.ts +14 -0
- package/dist/src/integrations/lingxiloop/memory.js +133 -0
- package/dist/src/integrations/lingxiloop/memory.js.map +1 -0
- package/dist/src/integrations/lingxiloop/polls.d.ts +9 -0
- package/dist/src/integrations/lingxiloop/polls.js +47 -0
- package/dist/src/integrations/lingxiloop/polls.js.map +1 -0
- package/dist/src/integrations/lingxiloop/presentations.d.ts +11 -0
- package/dist/src/integrations/lingxiloop/presentations.js +34 -0
- package/dist/src/integrations/lingxiloop/presentations.js.map +1 -0
- package/dist/src/integrations/lingxiloop/questionnaire.d.ts +21 -0
- package/dist/src/integrations/lingxiloop/questionnaire.js +57 -0
- package/dist/src/integrations/lingxiloop/questionnaire.js.map +1 -0
- package/dist/src/integrations/lingxiloop/research.d.ts +19 -0
- package/dist/src/integrations/lingxiloop/research.js +20 -0
- package/dist/src/integrations/lingxiloop/research.js.map +1 -0
- package/dist/src/integrations/lingxiloop/routines.d.ts +91 -0
- package/dist/src/integrations/lingxiloop/routines.js +198 -0
- package/dist/src/integrations/lingxiloop/routines.js.map +1 -0
- package/dist/src/integrations/lingxiloop/service-contracts.d.ts +1045 -0
- package/dist/src/integrations/lingxiloop/service-contracts.js +2 -0
- package/dist/src/integrations/lingxiloop/service-contracts.js.map +1 -0
- package/dist/src/integrations/lingxiloop/teacher-context.d.ts +32 -0
- package/dist/src/integrations/lingxiloop/teacher-context.js +25 -0
- package/dist/src/integrations/lingxiloop/teacher-context.js.map +1 -0
- package/dist/src/integrations/lingxiloop/teacher-digest.d.ts +13 -0
- package/dist/src/integrations/lingxiloop/teacher-digest.js +152 -0
- package/dist/src/integrations/lingxiloop/teacher-digest.js.map +1 -0
- package/dist/src/integrations/lingxiloop/teacher-preview.d.ts +22 -0
- package/dist/src/integrations/lingxiloop/teacher-preview.js +41 -0
- package/dist/src/integrations/lingxiloop/teacher-preview.js.map +1 -0
- package/dist/src/integrations/lingxiloop/teacher.d.ts +24 -0
- package/dist/src/integrations/lingxiloop/teacher.js +224 -0
- package/dist/src/integrations/lingxiloop/teacher.js.map +1 -0
- package/dist/src/kernel/manager.d.ts +52 -0
- package/dist/src/kernel/manager.js +407 -0
- package/dist/src/kernel/manager.js.map +1 -0
- package/dist/src/logging.d.ts +21 -0
- package/dist/src/logging.js +54 -0
- package/dist/src/logging.js.map +1 -0
- package/dist/src/memory/evidence.d.ts +6 -0
- package/dist/src/memory/evidence.js +43 -0
- package/dist/src/memory/evidence.js.map +1 -0
- package/dist/src/memory/processor.d.ts +3 -0
- package/dist/src/memory/processor.js +66 -0
- package/dist/src/memory/processor.js.map +1 -0
- package/dist/src/memory/semantic.d.ts +19 -0
- package/dist/src/memory/semantic.js +93 -0
- package/dist/src/memory/semantic.js.map +1 -0
- package/dist/src/memory/store.d.ts +20 -0
- package/dist/src/memory/store.js +34 -0
- package/dist/src/memory/store.js.map +1 -0
- package/dist/src/memory/synthesis.d.ts +24 -0
- package/dist/src/memory/synthesis.js +138 -0
- package/dist/src/memory/synthesis.js.map +1 -0
- package/dist/src/metrics.d.ts +43 -0
- package/dist/src/metrics.js +130 -0
- package/dist/src/metrics.js.map +1 -0
- package/dist/src/model/driver.d.ts +60 -0
- package/dist/src/model/driver.js +2 -0
- package/dist/src/model/driver.js.map +1 -0
- package/dist/src/model/embeddings.d.ts +24 -0
- package/dist/src/model/embeddings.js +97 -0
- package/dist/src/model/embeddings.js.map +1 -0
- package/dist/src/model/openai.d.ts +45 -0
- package/dist/src/model/openai.js +340 -0
- package/dist/src/model/openai.js.map +1 -0
- package/dist/src/outcome/assessment.d.ts +16 -0
- package/dist/src/outcome/assessment.js +45 -0
- package/dist/src/outcome/assessment.js.map +1 -0
- package/dist/src/outcome/content-check.d.ts +19 -0
- package/dist/src/outcome/content-check.js +44 -0
- package/dist/src/outcome/content-check.js.map +1 -0
- package/dist/src/outcome/envelope.d.ts +34 -0
- package/dist/src/outcome/envelope.js +42 -0
- package/dist/src/outcome/envelope.js.map +1 -0
- package/dist/src/protocol/constants.d.ts +25 -0
- package/dist/src/protocol/constants.js +26 -0
- package/dist/src/protocol/constants.js.map +1 -0
- package/dist/src/protocol/kernel-wire.d.ts +74 -0
- package/dist/src/protocol/kernel-wire.js +2 -0
- package/dist/src/protocol/kernel-wire.js.map +1 -0
- package/dist/src/protocol/outcome.d.ts +16 -0
- package/dist/src/protocol/outcome.js +14 -0
- package/dist/src/protocol/outcome.js.map +1 -0
- package/dist/src/protocol/types.d.ts +266 -0
- package/dist/src/protocol/types.js +19 -0
- package/dist/src/protocol/types.js.map +1 -0
- package/dist/src/research/address.d.ts +2 -0
- package/dist/src/research/address.js +32 -0
- package/dist/src/research/address.js.map +1 -0
- package/dist/src/research/fetch.d.ts +7 -0
- package/dist/src/research/fetch.js +83 -0
- package/dist/src/research/fetch.js.map +1 -0
- package/dist/src/research/index.d.ts +26 -0
- package/dist/src/research/index.js +109 -0
- package/dist/src/research/index.js.map +1 -0
- package/dist/src/runtime/compaction.d.ts +41 -0
- package/dist/src/runtime/compaction.js +86 -0
- package/dist/src/runtime/compaction.js.map +1 -0
- package/dist/src/runtime/corrections.d.ts +20 -0
- package/dist/src/runtime/corrections.js +27 -0
- package/dist/src/runtime/corrections.js.map +1 -0
- package/dist/src/runtime/policy.d.ts +42 -0
- package/dist/src/runtime/policy.js +91 -0
- package/dist/src/runtime/policy.js.map +1 -0
- package/dist/src/runtime/resource-refresh.d.ts +8 -0
- package/dist/src/runtime/resource-refresh.js +37 -0
- package/dist/src/runtime/resource-refresh.js.map +1 -0
- package/dist/src/runtime/runtime.d.ts +51 -0
- package/dist/src/runtime/runtime.js +804 -0
- package/dist/src/runtime/runtime.js.map +1 -0
- package/dist/src/runtime/tool.d.ts +13 -0
- package/dist/src/runtime/tool.js +42 -0
- package/dist/src/runtime/tool.js.map +1 -0
- package/dist/src/ui/index.d.ts +27 -0
- package/dist/src/ui/index.js +54 -0
- package/dist/src/ui/index.js.map +1 -0
- package/dist/src/versions.d.ts +9 -0
- package/dist/src/versions.js +11 -0
- package/dist/src/versions.js.map +1 -0
- package/dist/src/worker/index.d.ts +3 -0
- package/dist/src/worker/index.js +57 -0
- package/dist/src/worker/index.js.map +1 -0
- package/dist/src/worker/main.d.ts +2 -0
- package/dist/src/worker/main.js +9 -0
- package/dist/src/worker/main.js.map +1 -0
- package/dist/src/worker/worker.d.ts +45 -0
- package/dist/src/worker/worker.js +154 -0
- package/dist/src/worker/worker.js.map +1 -0
- package/kernel/runner.py +507 -0
- package/package.json +83 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal in-process metrics registry with Prometheus text exposition.
|
|
3
|
+
* Counters, gauges, and fixed-bucket histograms — enough for operational
|
|
4
|
+
* dashboards without pulling in a client library.
|
|
5
|
+
*/
|
|
6
|
+
function labelKey(labels) {
|
|
7
|
+
const entries = Object.entries(labels).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
|
|
8
|
+
return entries.map(([k, v]) => `${k}="${v.replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n')}"`).join(',');
|
|
9
|
+
}
|
|
10
|
+
class Counter {
|
|
11
|
+
name;
|
|
12
|
+
help;
|
|
13
|
+
series = new Map();
|
|
14
|
+
constructor(name, help) {
|
|
15
|
+
this.name = name;
|
|
16
|
+
this.help = help;
|
|
17
|
+
}
|
|
18
|
+
inc(labels = {}, delta = 1) {
|
|
19
|
+
const key = labelKey(labels);
|
|
20
|
+
this.series.set(key, (this.series.get(key) ?? 0) + delta);
|
|
21
|
+
}
|
|
22
|
+
expose() {
|
|
23
|
+
const lines = [`# HELP ${this.name} ${this.help}`, `# TYPE ${this.name} counter`];
|
|
24
|
+
for (const [key, value] of this.series)
|
|
25
|
+
lines.push(`${this.name}${key ? `{${key}}` : ''} ${value}`);
|
|
26
|
+
if (this.series.size === 0)
|
|
27
|
+
lines.push(`${this.name} 0`);
|
|
28
|
+
return lines;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
class Gauge {
|
|
32
|
+
name;
|
|
33
|
+
help;
|
|
34
|
+
series = new Map();
|
|
35
|
+
constructor(name, help) {
|
|
36
|
+
this.name = name;
|
|
37
|
+
this.help = help;
|
|
38
|
+
}
|
|
39
|
+
set(value, labels = {}) {
|
|
40
|
+
this.series.set(labelKey(labels), value);
|
|
41
|
+
}
|
|
42
|
+
expose() {
|
|
43
|
+
const lines = [`# HELP ${this.name} ${this.help}`, `# TYPE ${this.name} gauge`];
|
|
44
|
+
for (const [key, value] of this.series)
|
|
45
|
+
lines.push(`${this.name}${key ? `{${key}}` : ''} ${value}`);
|
|
46
|
+
if (this.series.size === 0)
|
|
47
|
+
lines.push(`${this.name} 0`);
|
|
48
|
+
return lines;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
class Histogram {
|
|
52
|
+
name;
|
|
53
|
+
help;
|
|
54
|
+
buckets;
|
|
55
|
+
counts = new Map();
|
|
56
|
+
sums = new Map();
|
|
57
|
+
totals = new Map();
|
|
58
|
+
constructor(name, help, buckets) {
|
|
59
|
+
this.name = name;
|
|
60
|
+
this.help = help;
|
|
61
|
+
this.buckets = buckets;
|
|
62
|
+
}
|
|
63
|
+
observe(value, labels = {}) {
|
|
64
|
+
const key = labelKey(labels);
|
|
65
|
+
let counts = this.counts.get(key);
|
|
66
|
+
if (!counts) {
|
|
67
|
+
counts = this.buckets.map(() => 0);
|
|
68
|
+
this.counts.set(key, counts);
|
|
69
|
+
}
|
|
70
|
+
for (const [index, bound] of this.buckets.entries()) {
|
|
71
|
+
if (value <= bound)
|
|
72
|
+
counts[index] = (counts[index] ?? 0) + 1;
|
|
73
|
+
}
|
|
74
|
+
this.sums.set(key, (this.sums.get(key) ?? 0) + value);
|
|
75
|
+
this.totals.set(key, (this.totals.get(key) ?? 0) + 1);
|
|
76
|
+
}
|
|
77
|
+
expose() {
|
|
78
|
+
const lines = [`# HELP ${this.name} ${this.help}`, `# TYPE ${this.name} histogram`];
|
|
79
|
+
for (const [key, counts] of this.counts) {
|
|
80
|
+
const prefix = key ? `${key},` : '';
|
|
81
|
+
for (const [index, bound] of this.buckets.entries()) {
|
|
82
|
+
lines.push(`${this.name}_bucket{${prefix}le="${bound}"} ${counts[index] ?? 0}`);
|
|
83
|
+
}
|
|
84
|
+
lines.push(`${this.name}_bucket{${prefix}le="+Inf"} ${this.totals.get(key) ?? 0}`);
|
|
85
|
+
lines.push(`${this.name}_sum${key ? `{${key}}` : ''} ${this.sums.get(key) ?? 0}`);
|
|
86
|
+
lines.push(`${this.name}_count${key ? `{${key}}` : ''} ${this.totals.get(key) ?? 0}`);
|
|
87
|
+
}
|
|
88
|
+
return lines;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
export class MetricsRegistry {
|
|
92
|
+
counters = new Map();
|
|
93
|
+
gauges = new Map();
|
|
94
|
+
histograms = new Map();
|
|
95
|
+
counter(name, help) {
|
|
96
|
+
let metric = this.counters.get(name);
|
|
97
|
+
if (!metric) {
|
|
98
|
+
metric = new Counter(name, help);
|
|
99
|
+
this.counters.set(name, metric);
|
|
100
|
+
}
|
|
101
|
+
return metric;
|
|
102
|
+
}
|
|
103
|
+
gauge(name, help) {
|
|
104
|
+
let metric = this.gauges.get(name);
|
|
105
|
+
if (!metric) {
|
|
106
|
+
metric = new Gauge(name, help);
|
|
107
|
+
this.gauges.set(name, metric);
|
|
108
|
+
}
|
|
109
|
+
return metric;
|
|
110
|
+
}
|
|
111
|
+
histogram(name, help, buckets) {
|
|
112
|
+
let metric = this.histograms.get(name);
|
|
113
|
+
if (!metric) {
|
|
114
|
+
metric = new Histogram(name, help, buckets);
|
|
115
|
+
this.histograms.set(name, metric);
|
|
116
|
+
}
|
|
117
|
+
return metric;
|
|
118
|
+
}
|
|
119
|
+
expose() {
|
|
120
|
+
const lines = [];
|
|
121
|
+
for (const metric of this.counters.values())
|
|
122
|
+
lines.push(...metric.expose());
|
|
123
|
+
for (const metric of this.gauges.values())
|
|
124
|
+
lines.push(...metric.expose());
|
|
125
|
+
for (const metric of this.histograms.values())
|
|
126
|
+
lines.push(...metric.expose());
|
|
127
|
+
return `${lines.join('\n')}\n`;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model driver port. The runtime speaks only this interface; concrete
|
|
3
|
+
* providers (OpenAI-compatible, Anthropic, test fakes) live behind it.
|
|
4
|
+
*/
|
|
5
|
+
import type { ModelItem } from '../protocol/types.js';
|
|
6
|
+
export interface ModelUsage {
|
|
7
|
+
available: boolean;
|
|
8
|
+
inputTokens: number;
|
|
9
|
+
outputTokens: number;
|
|
10
|
+
}
|
|
11
|
+
export interface ModelTurnResult {
|
|
12
|
+
/** Structured final response; the runtime validates it against the captured request. */
|
|
13
|
+
finalCandidate?: string;
|
|
14
|
+
/** Items to append to session history (assistant text and/or tool calls). */
|
|
15
|
+
output: ModelItem[];
|
|
16
|
+
/** Full assistant text of this turn ('' when the turn is a tool call). */
|
|
17
|
+
text: string;
|
|
18
|
+
model?: string;
|
|
19
|
+
usage: ModelUsage;
|
|
20
|
+
diagnostics?: Record<string, unknown>;
|
|
21
|
+
}
|
|
22
|
+
export interface ModelTurnRequest {
|
|
23
|
+
instructions: string;
|
|
24
|
+
items: readonly ModelItem[];
|
|
25
|
+
signal?: AbortSignal | undefined;
|
|
26
|
+
/** Called as assistant text streams; used for latency, not for delivery. */
|
|
27
|
+
onTextDelta?: ((delta: string) => void) | undefined;
|
|
28
|
+
}
|
|
29
|
+
export interface StructuredCallRequest {
|
|
30
|
+
instructions: string;
|
|
31
|
+
input: unknown;
|
|
32
|
+
signal?: AbortSignal | undefined;
|
|
33
|
+
}
|
|
34
|
+
export interface StructuredCallResult {
|
|
35
|
+
value: unknown;
|
|
36
|
+
model: string;
|
|
37
|
+
usage: ModelUsage;
|
|
38
|
+
}
|
|
39
|
+
export interface CompactionRequest {
|
|
40
|
+
instructions: string;
|
|
41
|
+
items: readonly ModelItem[];
|
|
42
|
+
signal?: AbortSignal | undefined;
|
|
43
|
+
}
|
|
44
|
+
export interface CompactionResult {
|
|
45
|
+
value: string;
|
|
46
|
+
model: string;
|
|
47
|
+
usage: ModelUsage;
|
|
48
|
+
}
|
|
49
|
+
export interface ModelDriver {
|
|
50
|
+
readonly modelId?: string;
|
|
51
|
+
readonly contextWindowTokens?: number;
|
|
52
|
+
readonly maxOutputTokens?: number;
|
|
53
|
+
readonly toolDefinitionTokens?: number;
|
|
54
|
+
/** One agent-loop turn: one Python call or a structured final candidate. */
|
|
55
|
+
run(request: ModelTurnRequest): Promise<ModelTurnResult>;
|
|
56
|
+
/** One-shot JSON-mode call for auxiliary pipelines. */
|
|
57
|
+
structured(request: StructuredCallRequest): Promise<StructuredCallResult>;
|
|
58
|
+
/** Summarize `items` into a continuity summary for context compaction. */
|
|
59
|
+
compact(request: CompactionRequest): Promise<CompactionResult>;
|
|
60
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver.js","sourceRoot":"","sources":["../../../src/model/driver.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface EmbeddingOptions {
|
|
2
|
+
id: string;
|
|
3
|
+
apiKey: string;
|
|
4
|
+
baseUrl?: string;
|
|
5
|
+
dimensions?: number;
|
|
6
|
+
requestTimeoutMs?: number;
|
|
7
|
+
}
|
|
8
|
+
/** One bounded request. Durable indexing work, rather than the HTTP client, owns retries. */
|
|
9
|
+
export declare class OpenAIEmbeddingDriver {
|
|
10
|
+
private readonly options;
|
|
11
|
+
readonly cacheKey: string;
|
|
12
|
+
private readonly endpoint;
|
|
13
|
+
private readonly timeoutMs;
|
|
14
|
+
constructor(options: EmbeddingOptions);
|
|
15
|
+
embed(input: readonly string[], signal?: AbortSignal): Promise<{
|
|
16
|
+
model: string;
|
|
17
|
+
vectors: number[][];
|
|
18
|
+
usage: {
|
|
19
|
+
available: boolean;
|
|
20
|
+
inputTokens: number;
|
|
21
|
+
totalTokens: number;
|
|
22
|
+
};
|
|
23
|
+
}>;
|
|
24
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
/** One bounded request. Durable indexing work, rather than the HTTP client, owns retries. */
|
|
3
|
+
export class OpenAIEmbeddingDriver {
|
|
4
|
+
options;
|
|
5
|
+
cacheKey;
|
|
6
|
+
endpoint;
|
|
7
|
+
timeoutMs;
|
|
8
|
+
constructor(options) {
|
|
9
|
+
this.options = options;
|
|
10
|
+
this.options = { ...options };
|
|
11
|
+
if (!options.id?.trim() || !options.apiKey?.trim())
|
|
12
|
+
throw new Error('embedding model id and apiKey are required');
|
|
13
|
+
let url;
|
|
14
|
+
try {
|
|
15
|
+
url = new URL(options.baseUrl ?? 'https://api.openai.com/v1');
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
throw new Error('invalid embedding base URL');
|
|
19
|
+
}
|
|
20
|
+
if (!['http:', 'https:'].includes(url.protocol) || url.username || url.password || url.search || url.hash)
|
|
21
|
+
throw new Error('invalid embedding base URL');
|
|
22
|
+
this.endpoint = `${url.href.replace(/\/+$/, '')}/embeddings`;
|
|
23
|
+
this.timeoutMs = options.requestTimeoutMs ?? 15_000;
|
|
24
|
+
if (!Number.isSafeInteger(this.timeoutMs) || this.timeoutMs < 1 || this.timeoutMs > 60_000)
|
|
25
|
+
throw new Error('invalid embedding timeout');
|
|
26
|
+
if (options.dimensions !== undefined && (!Number.isSafeInteger(options.dimensions) || options.dimensions < 1 || options.dimensions > 4096))
|
|
27
|
+
throw new Error('invalid embedding dimensions');
|
|
28
|
+
this.cacheKey = createHash('sha256').update(JSON.stringify([this.endpoint, options.id, options.dimensions ?? null])).digest('hex');
|
|
29
|
+
}
|
|
30
|
+
async embed(input, signal) {
|
|
31
|
+
// UTF-8 bytes conservatively bound input tokens without a tokenizer dependency.
|
|
32
|
+
if (!Array.isArray(input) || !input.length || input.length > 32
|
|
33
|
+
|| input.some(text => typeof text !== 'string' || !text.trim() || Buffer.byteLength(text) > 8000))
|
|
34
|
+
throw new Error('embedding input requires 1-32 nonempty strings of at most 8000 UTF-8 bytes');
|
|
35
|
+
const combined = AbortSignal.any([...(signal ? [signal] : []), AbortSignal.timeout(this.timeoutMs)]);
|
|
36
|
+
combined.throwIfAborted();
|
|
37
|
+
const response = await fetch(this.endpoint, { method: 'POST', redirect: 'error', signal: combined,
|
|
38
|
+
headers: { 'content-type': 'application/json', authorization: `Bearer ${this.options.apiKey}` },
|
|
39
|
+
body: JSON.stringify({ model: this.options.id, input, encoding_format: 'float',
|
|
40
|
+
...(this.options.dimensions === undefined ? {} : { dimensions: this.options.dimensions }) }) });
|
|
41
|
+
if (!response.ok) {
|
|
42
|
+
await response.body?.cancel();
|
|
43
|
+
// Provider error bodies may echo credentials or input; never persist them in work errors.
|
|
44
|
+
throw new Error(`embedding provider returned HTTP ${response.status}`);
|
|
45
|
+
}
|
|
46
|
+
if (!response.body)
|
|
47
|
+
throw new Error('embedding provider returned no response body');
|
|
48
|
+
const reader = response.body.getReader();
|
|
49
|
+
const chunks = [];
|
|
50
|
+
let size = 0;
|
|
51
|
+
try {
|
|
52
|
+
while (true) {
|
|
53
|
+
const { done, value } = await reader.read();
|
|
54
|
+
if (done)
|
|
55
|
+
break;
|
|
56
|
+
size += value.byteLength;
|
|
57
|
+
if (size > 4 * 1024 * 1024)
|
|
58
|
+
throw new Error('embedding response exceeds 4 MiB');
|
|
59
|
+
chunks.push(value);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
await reader.cancel().catch(() => { });
|
|
64
|
+
reader.releaseLock();
|
|
65
|
+
}
|
|
66
|
+
combined.throwIfAborted();
|
|
67
|
+
let result;
|
|
68
|
+
try {
|
|
69
|
+
result = JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(Buffer.concat(chunks)));
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
throw new Error('embedding provider returned invalid JSON');
|
|
73
|
+
}
|
|
74
|
+
if (!result || typeof result !== 'object' || typeof result.model !== 'string' || !result.model.trim() || result.model.length > 256
|
|
75
|
+
|| !Array.isArray(result.data) || result.data.length !== input.length)
|
|
76
|
+
throw new Error('invalid embedding response envelope');
|
|
77
|
+
const vectors = new Array(input.length);
|
|
78
|
+
let dimensions = this.options.dimensions;
|
|
79
|
+
for (const item of result.data) {
|
|
80
|
+
if (!item || !Number.isSafeInteger(item.index) || item.index < 0 || item.index >= input.length || vectors[item.index]
|
|
81
|
+
|| !Array.isArray(item.embedding) || item.embedding.length < 1 || item.embedding.length > 4096
|
|
82
|
+
|| item.embedding.some((value) => typeof value !== 'number' || !Number.isFinite(value)))
|
|
83
|
+
throw new Error('invalid embedding vector or index');
|
|
84
|
+
dimensions ??= item.embedding.length;
|
|
85
|
+
if (item.embedding.length !== dimensions)
|
|
86
|
+
throw new Error('embedding dimensions do not match');
|
|
87
|
+
const norm = Math.hypot(...item.embedding);
|
|
88
|
+
if (!Number.isFinite(norm) || norm === 0)
|
|
89
|
+
throw new Error('embedding vector has invalid magnitude');
|
|
90
|
+
vectors[item.index] = item.embedding.map((value) => value / norm);
|
|
91
|
+
}
|
|
92
|
+
const prompt = result.usage?.prompt_tokens, total = result.usage?.total_tokens;
|
|
93
|
+
const available = Number.isSafeInteger(prompt) && Number(prompt) >= 0 && Number.isSafeInteger(total) && Number(total) >= Number(prompt);
|
|
94
|
+
return { model: result.model, vectors, usage: { available, inputTokens: available ? Number(prompt) : 0, totalTokens: available ? Number(total) : 0 } };
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=embeddings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../../src/model/embeddings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { CompactionRequest, CompactionResult, ModelDriver, ModelTurnRequest, ModelTurnResult, StructuredCallRequest, StructuredCallResult } from './driver.js';
|
|
2
|
+
export declare const DEFAULT_MODEL: {
|
|
3
|
+
readonly id: "deepseek-ai/DeepSeek-V4-Flash";
|
|
4
|
+
readonly baseUrl: "https://api.siliconflow.cn/v1";
|
|
5
|
+
readonly reasoningEffort: "high";
|
|
6
|
+
};
|
|
7
|
+
export interface OpenAIDriverOptions {
|
|
8
|
+
apiKey: string;
|
|
9
|
+
baseUrl?: string;
|
|
10
|
+
reasoningEffort?: 'high' | 'max';
|
|
11
|
+
/** Max attempts per request across retryable failures (429/5xx/network). */
|
|
12
|
+
maxAttempts?: number;
|
|
13
|
+
/** Base backoff in ms; grows exponentially with full jitter. */
|
|
14
|
+
retryBaseMs?: number;
|
|
15
|
+
/** Per-request timeout in ms (wall clock, including streaming). */
|
|
16
|
+
requestTimeoutMs?: number;
|
|
17
|
+
maxOutputTokens?: number;
|
|
18
|
+
contextWindowTokens?: number;
|
|
19
|
+
fetchImpl?: typeof fetch;
|
|
20
|
+
/** Injectable sleep for tests. */
|
|
21
|
+
sleep?: (ms: number, signal?: AbortSignal) => Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
/** Parse bounded `text/event-stream` bodies into `data:` payload strings. */
|
|
24
|
+
export declare function sseDataEvents(body: ReadableStream<Uint8Array>): AsyncGenerator<string>;
|
|
25
|
+
export declare class OpenAIChatDriver implements ModelDriver {
|
|
26
|
+
readonly modelId: string;
|
|
27
|
+
private readonly options;
|
|
28
|
+
readonly contextWindowTokens: number;
|
|
29
|
+
readonly maxOutputTokens: number;
|
|
30
|
+
readonly toolDefinitionTokens: number;
|
|
31
|
+
private readonly baseUrl;
|
|
32
|
+
private readonly maxAttempts;
|
|
33
|
+
private readonly retryBaseMs;
|
|
34
|
+
private readonly requestTimeoutMs;
|
|
35
|
+
private readonly fetchImpl;
|
|
36
|
+
private readonly sleep;
|
|
37
|
+
constructor(modelId: string, options: OpenAIDriverOptions);
|
|
38
|
+
private request;
|
|
39
|
+
private backoffMs;
|
|
40
|
+
private consumeStream;
|
|
41
|
+
private usageOf;
|
|
42
|
+
run(request: ModelTurnRequest): Promise<ModelTurnResult>;
|
|
43
|
+
structured(request: StructuredCallRequest): Promise<StructuredCallResult>;
|
|
44
|
+
compact(request: CompactionRequest): Promise<CompactionResult>;
|
|
45
|
+
}
|