@agencer/reverie-loop 0.1.0-alpha.0 → 0.1.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/CHANGELOG.md +148 -69
- package/LICENSE +8 -199
- package/README.md +118 -56
- package/dist/contracts.d.ts +161 -0
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js +28 -0
- package/dist/contracts.js.map +1 -0
- package/dist/index.d.ts +12 -5
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -4
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +47 -21
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +44 -107
- package/dist/logger.js.map +1 -0
- package/dist/opus-client.d.ts +60 -0
- package/dist/opus-client.d.ts.map +1 -0
- package/dist/opus-client.js +301 -0
- package/dist/opus-client.js.map +1 -0
- package/dist/pair-sink.d.ts +36 -0
- package/dist/pair-sink.d.ts.map +1 -0
- package/dist/pair-sink.js +132 -0
- package/dist/pair-sink.js.map +1 -0
- package/dist/reverie-loop.d.ts +83 -0
- package/dist/reverie-loop.d.ts.map +1 -0
- package/dist/reverie-loop.js +216 -0
- package/dist/reverie-loop.js.map +1 -0
- package/dist/reverie-trigger.d.ts +67 -0
- package/dist/reverie-trigger.d.ts.map +1 -0
- package/dist/reverie-trigger.js +271 -0
- package/dist/reverie-trigger.js.map +1 -0
- package/package.json +43 -12
- package/dist/compat.d.ts +0 -22
- package/dist/compat.js +0 -81
- package/dist/types.d.ts +0 -34
- package/dist/types.js +0 -8
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/** Minimal pino-compatible logger surface invoked by every Lego module.
|
|
2
|
+
*
|
|
3
|
+
* pino.Logger structurally satisfies this. Consumers using bunyan,
|
|
4
|
+
* winston, or a custom logger can ship a thin adapter; the Lego only
|
|
5
|
+
* invokes the three methods listed here. debug is optional because
|
|
6
|
+
* reverie code occasionally calls it but does not depend on it.
|
|
7
|
+
*
|
|
8
|
+
* Contract: implementations MUST NOT throw. Reverie is fire-and-forget
|
|
9
|
+
* post-session observability; a logger throw would break the
|
|
10
|
+
* NEVER-throws facade contract. */
|
|
11
|
+
export interface LoggerLike {
|
|
12
|
+
info(obj: object, msg: string): void;
|
|
13
|
+
warn(obj: object, msg: string): void;
|
|
14
|
+
error(obj: object, msg: string): void;
|
|
15
|
+
debug?(obj: object, msg: string): void;
|
|
16
|
+
}
|
|
17
|
+
/** Minimal metered-call ledger surface the Lego invokes for paid-call
|
|
18
|
+
* cost rows (`reverie.opus.reflection`) and zero-cost counter rows
|
|
19
|
+
* (`reverie.trigger.*`, `reverie.skipped.*`).
|
|
20
|
+
*
|
|
21
|
+
* Component is a plain string (NOT a branded type) so the public
|
|
22
|
+
* contract has zero dependency on @agencer/usage-accountant's
|
|
23
|
+
* UsageComponentType brand. Consumers may pass any string. The Lego
|
|
24
|
+
* owns its own component vocabulary; canonical names emitted by the
|
|
25
|
+
* Lego today:
|
|
26
|
+
*
|
|
27
|
+
* reverie.opus.reflection (paid Opus spend with real tokens)
|
|
28
|
+
* reverie.trigger.opus.attempt
|
|
29
|
+
* reverie.trigger.disconnect
|
|
30
|
+
* reverie.trigger.idle_timer
|
|
31
|
+
* reverie.skipped.budget_exceeded
|
|
32
|
+
* reverie.skipped.deduped
|
|
33
|
+
*
|
|
34
|
+
* These strings are observable (downstream dashboards filter by them);
|
|
35
|
+
* the Lego treats them as a stable contract and emits them verbatim.
|
|
36
|
+
*
|
|
37
|
+
* Implementation contract: recordCall and getUserUsage are documented
|
|
38
|
+
* NEVER-throws by convention. The Lego wraps every call in try/catch
|
|
39
|
+
* so a buggy implementation cannot break the facade's NEVER-throws
|
|
40
|
+
* contract, but a well-behaved implementation should not rely on that.
|
|
41
|
+
*
|
|
42
|
+
* @agencer/usage-accountant UsageAccountant structurally satisfies
|
|
43
|
+
* this interface (its recordCall takes a superset of these fields and
|
|
44
|
+
* its getUserUsage signature matches). */
|
|
45
|
+
export interface UsageMeter {
|
|
46
|
+
recordCall(args: {
|
|
47
|
+
userId: string;
|
|
48
|
+
sessionId: string;
|
|
49
|
+
component: string;
|
|
50
|
+
model: string;
|
|
51
|
+
inputTokens: number;
|
|
52
|
+
outputTokens: number;
|
|
53
|
+
latencyMs: number;
|
|
54
|
+
}): void;
|
|
55
|
+
/** Returns per-component cost rollup for the given user since the
|
|
56
|
+
* `from` lower bound. `from` is a lexicographically-comparable
|
|
57
|
+
* date or datetime string (the bundled UsageAccountant uses
|
|
58
|
+
* "YYYY-MM-DD" or "YYYY-MM-DD HH:MM:SS"). `groupBy: "component"`
|
|
59
|
+
* is the only mode the Lego invokes today.
|
|
60
|
+
*
|
|
61
|
+
* The Lego reads `.component` and `.totalCostUsd` only; `.totalCalls`
|
|
62
|
+
* is included to match UsageAccountant's actual return shape so
|
|
63
|
+
* the structural match is exact. */
|
|
64
|
+
getUserUsage(userId: string, opts: {
|
|
65
|
+
from: string;
|
|
66
|
+
groupBy: "component";
|
|
67
|
+
}): Array<{
|
|
68
|
+
component: string;
|
|
69
|
+
totalCostUsd: number;
|
|
70
|
+
totalCalls: number;
|
|
71
|
+
}>;
|
|
72
|
+
}
|
|
73
|
+
/** Per-call identity threaded into UsageMeter.recordCall and into JSONL
|
|
74
|
+
* rows that need user/session attribution.
|
|
75
|
+
*
|
|
76
|
+
* Structurally satisfied by @agencer/usage-accountant's UserContext.
|
|
77
|
+
* Consumers wiring their own ledger pass whatever object carries these
|
|
78
|
+
* two string fields. */
|
|
79
|
+
export interface ReverieUserContext {
|
|
80
|
+
userId: string;
|
|
81
|
+
sessionId: string;
|
|
82
|
+
}
|
|
83
|
+
/** Cost calculator for paid-call accounting. The Lego does NOT embed
|
|
84
|
+
* pricing tables; consumers inject this function so the
|
|
85
|
+
* `ReverieResult.cost_usd` written to JSONL matches whatever the
|
|
86
|
+
* ledger computed and stored (Law 19 One Writer Per Path on pricing).
|
|
87
|
+
*
|
|
88
|
+
* Signature matches @agencer/usage-accountant's calculateCost
|
|
89
|
+
* byte-for-byte so the helper satisfies this type without an adapter:
|
|
90
|
+
*
|
|
91
|
+
* import { calculateCost } from "@agencer/usage-accountant";
|
|
92
|
+
* const calculator: CostCalculator = calculateCost;
|
|
93
|
+
*
|
|
94
|
+
* Consumers who do not care about per-call cost USD calculation can
|
|
95
|
+
* pass `() => 0`. The result flows into ReverieResult.cost_usd and
|
|
96
|
+
* the safety-flag provenance link only; the Lego itself does not
|
|
97
|
+
* branch on the numeric value. */
|
|
98
|
+
export type CostCalculator = (model: string, inputTokens: number, outputTokens: number) => number;
|
|
99
|
+
/** Single inference request issued by the Lego's opus-client for the
|
|
100
|
+
* reflection call.
|
|
101
|
+
*
|
|
102
|
+
* `family` is a plain string rather than a literal union so future
|
|
103
|
+
* consumers can wire haiku, sonnet, or non-Anthropic providers without
|
|
104
|
+
* bumping the Lego semver. Today the only call site emits `"opus"`
|
|
105
|
+
* (the most-capable adversarial reviewer per Law 26's "use the most
|
|
106
|
+
* capable model for adversarial review" guidance).
|
|
107
|
+
*
|
|
108
|
+
* `messages[].role` is narrowed to `"user" | "assistant"` because the
|
|
109
|
+
* reflection prompt never emits `system` messages (the system prompt
|
|
110
|
+
* threads through the top-level `system` field) and the underlying
|
|
111
|
+
* Anthropic Messages API rejects other role values.
|
|
112
|
+
*
|
|
113
|
+
* `temperature` is optional; the Lego call site supplies a constant
|
|
114
|
+
* if the consumer does not pre-fill it. */
|
|
115
|
+
export interface ReverieInferenceRequest {
|
|
116
|
+
family: string;
|
|
117
|
+
system: string;
|
|
118
|
+
messages: Array<{
|
|
119
|
+
role: "user" | "assistant";
|
|
120
|
+
content: string;
|
|
121
|
+
}>;
|
|
122
|
+
max_tokens: number;
|
|
123
|
+
temperature?: number;
|
|
124
|
+
}
|
|
125
|
+
/** Inference response shape the Lego consumes.
|
|
126
|
+
*
|
|
127
|
+
* Mirrors the subset of Anthropic Messages API the reflection call
|
|
128
|
+
* reads: the resolved model id (for the ledger row + JSONL record),
|
|
129
|
+
* an array of content blocks (the Lego only reads the first text
|
|
130
|
+
* block), and a usage object with input/output token counts. */
|
|
131
|
+
export interface ReverieInferenceResponse {
|
|
132
|
+
model: string;
|
|
133
|
+
content: Array<{
|
|
134
|
+
type: string;
|
|
135
|
+
text?: string;
|
|
136
|
+
}>;
|
|
137
|
+
usage: {
|
|
138
|
+
input_tokens: number;
|
|
139
|
+
output_tokens: number;
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
/** Inference provider invoked by the Lego's opus-client (Layer B in
|
|
143
|
+
* the reflection-call architecture). The consumer's adapter owns the
|
|
144
|
+
* SDK call, auth handling, retries, and any provider-specific config.
|
|
145
|
+
*
|
|
146
|
+
* Contract: implementations should resolve with the response shape on
|
|
147
|
+
* success and reject (or throw) on SDK failure. The Lego catches
|
|
148
|
+
* rejections and maps them to a `ReverieErrorKind` via local duck
|
|
149
|
+
* typing on `.code` (no class-identity coupling).
|
|
150
|
+
*
|
|
151
|
+
* A canonical agencer-ox adapter wrapping @agencer/usage-accountant's
|
|
152
|
+
* AnthropicProvider lives at the composition root and is composed in
|
|
153
|
+
* via the ReverieTrigger constructor.
|
|
154
|
+
*
|
|
155
|
+
* `abortSignal` is required (not optional) so the Lego can cancel
|
|
156
|
+
* in-flight reflection calls at session-end teardown without the
|
|
157
|
+
* provider needing to expose its own cancel handle. */
|
|
158
|
+
export interface ReverieInferenceProvider {
|
|
159
|
+
messagesCreate(request: ReverieInferenceRequest, abortSignal: AbortSignal): Promise<ReverieInferenceResponse>;
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=contracts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":"AA6BA;;;;;;;;;oCASoC;AACpC,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,KAAK,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACxC;AAID;;;;;;;;;;;;;;;;;;;;;;;;;;;2CA2B2C;AAC3C,MAAM,WAAW,UAAU;IACzB,UAAU,CAAC,IAAI,EAAE;QACf,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;KACnB,GAAG,IAAI,CAAC;IAET;;;;;;;;yCAQqC;IACrC,YAAY,CACV,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,WAAW,CAAA;KAAE,GAC3C,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC3E;AAID;;;;;yBAKyB;AACzB,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAID;;;;;;;;;;;;;;mCAcmC;AACnC,MAAM,MAAM,cAAc,GAAG,CAC3B,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,KACjB,MAAM,CAAC;AAIZ;;;;;;;;;;;;;;;4CAe4C;AAC5C,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjE,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;iEAKiE;AACjE,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChD,KAAK,EAAE;QACL,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAED;;;;;;;;;;;;;;;wDAewD;AACxD,MAAM,WAAW,wBAAwB;IACvC,cAAc,CACZ,OAAO,EAAE,uBAAuB,EAChC,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,wBAAwB,CAAC,CAAC;CACtC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// @agencer/reverie-loop public contract interfaces.
|
|
2
|
+
//
|
|
3
|
+
// Leg G (Day 169+ AO, May 2026): defines provider-agnostic Layer-A
|
|
4
|
+
// interfaces that let external consumers wire their own metered ledger,
|
|
5
|
+
// inference provider, cost calculator, and logger without taking a
|
|
6
|
+
// runtime dependency on @agencer/usage-accountant or @anthropic-ai/sdk.
|
|
7
|
+
// The agencer-ox composition root provides the canonical
|
|
8
|
+
// implementations; this file declares the shapes those implementations
|
|
9
|
+
// satisfy structurally.
|
|
10
|
+
//
|
|
11
|
+
// Sister Lego: @agencer/learning-loop@0.3.0. Reverie-Loop mirrors the
|
|
12
|
+
// Layer-A pattern (Law 15 Sister-Lego Consistency) and goes one notch
|
|
13
|
+
// further: zero @agencer/* declared in dependencies AND zero
|
|
14
|
+
// @anthropic-ai/sdk anywhere in dependencies/peerDependencies. The
|
|
15
|
+
// public surface is pure abstract code; install-from-tarball in a
|
|
16
|
+
// scratch directory pulls no Agencer-internal modules.
|
|
17
|
+
//
|
|
18
|
+
// Canon Law 2 (Hot-Swappable Providers): Layer A interfaces own the
|
|
19
|
+
// consumer surface; Layer B implementations (AnthropicProvider,
|
|
20
|
+
// UsageAccountant, etc.) are injected at the composition root rather
|
|
21
|
+
// than imported by the Lego.
|
|
22
|
+
//
|
|
23
|
+
// Additive in Leg G Commit G-1: nothing else in the package imports
|
|
24
|
+
// from this file yet. Commits G-2 through G-4b rewrite the logger,
|
|
25
|
+
// opus-client, pair-sink, reverie-loop, and reverie-trigger source
|
|
26
|
+
// files to consume these contracts.
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=contracts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,EAAE;AACF,mEAAmE;AACnE,wEAAwE;AACxE,mEAAmE;AACnE,wEAAwE;AACxE,yDAAyD;AACzD,uEAAuE;AACvE,wBAAwB;AACxB,EAAE;AACF,sEAAsE;AACtE,sEAAsE;AACtE,6DAA6D;AAC7D,mEAAmE;AACnE,kEAAkE;AAClE,uDAAuD;AACvD,EAAE;AACF,oEAAoE;AACpE,gEAAgE;AAChE,qEAAqE;AACrE,6BAA6B;AAC7B,EAAE;AACF,oEAAoE;AACpE,mEAAmE;AACnE,mEAAmE;AACnE,oCAAoC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
3
|
-
export {
|
|
4
|
-
export {
|
|
5
|
-
export {
|
|
1
|
+
export type { LoggerLike, UsageMeter, ReverieUserContext, CostCalculator, ReverieInferenceRequest, ReverieInferenceResponse, ReverieInferenceProvider, } from "./contracts.js";
|
|
2
|
+
export { createReverieLogger } from "./logger.js";
|
|
3
|
+
export type { ReverieFailureReason, ReverieEntry, ReverieLoggerOptions, ReverieLogger, LogReverieFn, LogWhisperResultFn, } from "./logger.js";
|
|
4
|
+
export { executeReflection, validateCorrectionPairs, mapErrorKind, REVERIE_PAIR_SCHEMA_VERSION, REVERIE_SAFETY_FLAG_SCHEMA_VERSION, _REFLECTION_SYSTEM_PROMPT_FOR_TEST, } from "./opus-client.js";
|
|
5
|
+
export type { ReverieCategory, CorrectionPair, ReverieSchemaVersion, ReverieErrorKind, ReverieResult, ConversationExchange, ExecuteReflectionArgs, } from "./opus-client.js";
|
|
6
|
+
export { splitResultByCategory, appendReverieResult, appendSafetyFlag, } from "./pair-sink.js";
|
|
7
|
+
export type { SplitResult } from "./pair-sink.js";
|
|
8
|
+
export { triggerReverie, executeReverie, getLastReverie, getLastReverieReal, cancelAllReveries, } from "./reverie-loop.js";
|
|
9
|
+
export type { ReverieDeps, ReverieObservationLegacy, ReverieResultLegacy, ReverieObservation, } from "./reverie-loop.js";
|
|
10
|
+
export { ReverieTrigger } from "./reverie-trigger.js";
|
|
11
|
+
export type { ReverieTriggerOptions } from "./reverie-trigger.js";
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAkBA,YAAY,EACV,UAAU,EACV,UAAU,EACV,kBAAkB,EAClB,cAAc,EACd,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,YAAY,EACV,oBAAoB,EACpB,YAAY,EACZ,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,kBAAkB,GACnB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,YAAY,EACZ,2BAA2B,EAC3B,kCAAkC,EAClC,kCAAkC,GACnC,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,eAAe,EACf,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,aAAa,EACb,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAGlD,OAAO,EACL,cAAc,EACd,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,WAAW,EACX,wBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAM3B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,30 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
// @agencer/reverie-loop public API barrel.
|
|
2
|
+
//
|
|
3
|
+
// Progressive Leg G arc populates this barrel:
|
|
4
|
+
//
|
|
5
|
+
// G-1: contracts.ts (6 Layer-A interfaces) ✓
|
|
6
|
+
// G-2: logger.ts (createReverieLogger factory + types) ✓
|
|
7
|
+
// G-3a: opus-client.ts (executeReflection, schema versions, types)
|
|
8
|
+
// G-3b: pair-sink.ts (splitResultByCategory, append* helpers)
|
|
9
|
+
// G-4a: reverie-loop.ts (triggerReverie, executeReverie)
|
|
10
|
+
// G-4b: reverie-trigger.ts (ReverieTrigger class, options)
|
|
11
|
+
//
|
|
12
|
+
// Compatibility shims at packages/server/src/services/reverie-logger.ts,
|
|
13
|
+
// packages/server/src/services/reverie-loop.ts,
|
|
14
|
+
// packages/server/src/brain/reverie-pair-sink.ts,
|
|
15
|
+
// packages/server/src/brain/reverie-trigger.ts re-export from this
|
|
16
|
+
// barrel until G-6 deletes them.
|
|
17
|
+
// ── G-2 logger ────────────────────────────────────────────────────
|
|
18
|
+
export { createReverieLogger } from "./logger.js";
|
|
19
|
+
// ── G-3a opus-client ──────────────────────────────────────────────
|
|
20
|
+
export { executeReflection, validateCorrectionPairs, mapErrorKind, REVERIE_PAIR_SCHEMA_VERSION, REVERIE_SAFETY_FLAG_SCHEMA_VERSION, _REFLECTION_SYSTEM_PROMPT_FOR_TEST, } from "./opus-client.js";
|
|
21
|
+
// ── G-3b pair-sink ────────────────────────────────────────────────
|
|
22
|
+
export { splitResultByCategory, appendReverieResult, appendSafetyFlag, } from "./pair-sink.js";
|
|
23
|
+
// ── G-4a reverie-loop ─────────────────────────────────────────────
|
|
24
|
+
export { triggerReverie, executeReverie, getLastReverie, getLastReverieReal, cancelAllReveries, } from "./reverie-loop.js";
|
|
25
|
+
// Note: ConversationExchange and ReverieResult are also re-exported
|
|
26
|
+
// from reverie-loop.ts but defer to the opus-client.ts canonical
|
|
27
|
+
// definitions, which are already exported above.
|
|
28
|
+
// ── G-4b reverie-trigger ──────────────────────────────────────────
|
|
29
|
+
export { ReverieTrigger } from "./reverie-trigger.js";
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,EAAE;AACF,+CAA+C;AAC/C,EAAE;AACF,gDAAgD;AAChD,4DAA4D;AAC5D,qEAAqE;AACrE,gEAAgE;AAChE,2DAA2D;AAC3D,6DAA6D;AAC7D,EAAE;AACF,yEAAyE;AACzE,gDAAgD;AAChD,kDAAkD;AAClD,mEAAmE;AACnE,iCAAiC;AAajC,qEAAqE;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAUlD,qEAAqE;AACrE,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,YAAY,EACZ,2BAA2B,EAC3B,kCAAkC,EAClC,kCAAkC,GACnC,MAAM,kBAAkB,CAAC;AAW1B,qEAAqE;AACrE,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AAGxB,qEAAqE;AACrE,OAAO,EACL,cAAc,EACd,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAO3B,oEAAoE;AACpE,iEAAiE;AACjE,iDAAiD;AAEjD,qEAAqE;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/logger.d.ts
CHANGED
|
@@ -1,22 +1,48 @@
|
|
|
1
|
-
|
|
2
|
-
export
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
* Log a reverie: the whisper model failed, Opus took over.
|
|
11
|
-
* The delta between the two responses is a training signal.
|
|
12
|
-
*/
|
|
13
|
-
logReverie(userMessage: string, miniResponse: string, opusResponse: string, failureReason: ReverieFailureReason, whisperModelId: string): void;
|
|
14
|
-
/**
|
|
15
|
-
* Log a whisper model result (success or failure) for monitoring.
|
|
16
|
-
*/
|
|
17
|
-
logWhisperResult(outcome: "success" | "failure", modelId: string, userMessage: string, response: string): void;
|
|
18
|
-
readReverieLog(): ReverieEntry[];
|
|
19
|
-
readWhisperResultLog(): WhisperResultEntry[];
|
|
20
|
-
/** Reserved for future fd pooling. No-op today; safe to call repeatedly. */
|
|
21
|
-
close(): void;
|
|
1
|
+
export type ReverieFailureReason = "weak_response" | "user_corrected" | "timeout" | "error";
|
|
2
|
+
export interface ReverieEntry {
|
|
3
|
+
type: "reverie";
|
|
4
|
+
user_message: string;
|
|
5
|
+
mini_response: string;
|
|
6
|
+
opus_response: string;
|
|
7
|
+
failure_reason: ReverieFailureReason;
|
|
8
|
+
whisper_model_id: string;
|
|
9
|
+
timestamp: string;
|
|
22
10
|
}
|
|
11
|
+
/** Options threaded into createReverieLogger. Both paths are absolute
|
|
12
|
+
* file paths (not directories). The factory writes each appendFileSync
|
|
13
|
+
* to the supplied path verbatim. Parent directory is created on
|
|
14
|
+
* first write via mkdirSync(dirname(path), { recursive: true }). */
|
|
15
|
+
export interface ReverieLoggerOptions {
|
|
16
|
+
/** Absolute path to the reveries JSONL file (one record per
|
|
17
|
+
* whisper-failure → Opus-takeover event). Default at the
|
|
18
|
+
* composition root: $HOME/.operative-x/training-data/reveries.jsonl */
|
|
19
|
+
reveriesPath: string;
|
|
20
|
+
/** Absolute path to the whisper-results JSONL file (one record per
|
|
21
|
+
* whisper invocation, success or failure). Default at the
|
|
22
|
+
* composition root:
|
|
23
|
+
* $HOME/.operative-x/training-data/whisper-results.jsonl */
|
|
24
|
+
whisperResultsPath: string;
|
|
25
|
+
}
|
|
26
|
+
/** Factory-bound logReverie. Same signature as the pre-Leg-G
|
|
27
|
+
* packages/server/src/services/reverie-logger.ts export so the
|
|
28
|
+
* compatibility shim can re-export it without curry layers. */
|
|
29
|
+
export type LogReverieFn = (userMessage: string, miniResponse: string, opusResponse: string, failureReason: ReverieFailureReason, whisperModelId: string) => void;
|
|
30
|
+
/** Factory-bound logWhisperResult. Same signature as the pre-Leg-G
|
|
31
|
+
* packages/server/src/services/reverie-logger.ts export. */
|
|
32
|
+
export type LogWhisperResultFn = (outcome: "success" | "failure", modelId: string, userMessage: string, response: string) => void;
|
|
33
|
+
/** Bound logger pair returned by createReverieLogger. */
|
|
34
|
+
export interface ReverieLogger {
|
|
35
|
+
logReverie: LogReverieFn;
|
|
36
|
+
logWhisperResult: LogWhisperResultFn;
|
|
37
|
+
}
|
|
38
|
+
/** Build a reverie-logger bound to the supplied absolute paths.
|
|
39
|
+
*
|
|
40
|
+
* Both returned functions NEVER throw. Any filesystem error
|
|
41
|
+
* (permission denied, disk full, EACCES, etc.) is swallowed so a
|
|
42
|
+
* failing append cannot break the voice handler's response path.
|
|
43
|
+
*
|
|
44
|
+
* Synchronous appendFileSync mirrors the pre-Leg-G behavior; reverie
|
|
45
|
+
* logging happens at session-end (already off the user-facing latency
|
|
46
|
+
* path) so blocking I/O is acceptable. */
|
|
47
|
+
export declare function createReverieLogger(opts: ReverieLoggerOptions): ReverieLogger;
|
|
48
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAwBA,MAAM,MAAM,oBAAoB,GAC5B,eAAe,GACf,gBAAgB,GAChB,SAAS,GACT,OAAO,CAAC;AAEZ,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,SAAS,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,oBAAoB,CAAC;IACrC,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;qEAGqE;AACrE,MAAM,WAAW,oBAAoB;IACnC;;4EAEwE;IACxE,YAAY,EAAE,MAAM,CAAC;IACrB;;;iEAG6D;IAC7D,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED;;gEAEgE;AAChE,MAAM,MAAM,YAAY,GAAG,CACzB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,oBAAoB,EACnC,cAAc,EAAE,MAAM,KACnB,IAAI,CAAC;AAEV;6DAC6D;AAC7D,MAAM,MAAM,kBAAkB,GAAG,CAC/B,OAAO,EAAE,SAAS,GAAG,SAAS,EAC9B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,KACb,IAAI,CAAC;AAEV,yDAAyD;AACzD,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,YAAY,CAAC;IACzB,gBAAgB,EAAE,kBAAkB,CAAC;CACtC;AAED;;;;;;;;2CAQ2C;AAC3C,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,oBAAoB,GACzB,aAAa,CAsDf"}
|
package/dist/logger.js
CHANGED
|
@@ -1,75 +1,39 @@
|
|
|
1
|
+
// @agencer/reverie-loop logger module.
|
|
2
|
+
//
|
|
3
|
+
// Leg G-2: extracted from packages/server/src/services/reverie-logger.ts
|
|
4
|
+
// (102 LOC). Behavior preserved byte-for-byte: same JSONL row shapes,
|
|
5
|
+
// same NEVER-throws contract, same fs.appendFileSync semantics, same
|
|
6
|
+
// timestamp/truncation discipline.
|
|
7
|
+
//
|
|
8
|
+
// Sacred constraint (Law 8, declared in README): No process.env or
|
|
9
|
+
// os.homedir() reads inside this module. The Lego accepts explicit
|
|
10
|
+
// absolute file paths via the createReverieLogger factory; the
|
|
11
|
+
// agencer-ox composition root (and the compatibility shim at
|
|
12
|
+
// packages/server/src/services/reverie-logger.ts until G-6) resolves
|
|
13
|
+
// ~/.operative-x/training-data/* paths from os.homedir() and threads
|
|
14
|
+
// them in.
|
|
15
|
+
//
|
|
16
|
+
// Two log files:
|
|
17
|
+
// reveries.jsonl — whisper failed, Opus took over (the delta
|
|
18
|
+
// is a training signal for ox-data-factory)
|
|
19
|
+
// whisper-results.jsonl — success/failure monitoring for the
|
|
20
|
+
// fine-tuned whisper model
|
|
1
21
|
import fs from "node:fs";
|
|
2
22
|
import path from "node:path";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
name === "..") {
|
|
16
|
-
throw new Error(`ReverieLogger: invalid ${field} "${name}" — must be a plain basename with no path separators`);
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
function parseLinesLenient(raw) {
|
|
20
|
-
// Per-line try/catch: one torn tail line must not erase the whole log.
|
|
21
|
-
// This matters after crashes, ENOSPC, or power loss — the very situations
|
|
22
|
-
// where diagnostic tools most need to read the log.
|
|
23
|
-
const out = [];
|
|
24
|
-
for (const line of raw.split("\n")) {
|
|
25
|
-
if (line.length === 0)
|
|
26
|
-
continue;
|
|
27
|
-
try {
|
|
28
|
-
out.push(JSON.parse(line));
|
|
29
|
-
}
|
|
30
|
-
catch {
|
|
31
|
-
// Skip the malformed line, keep the rest.
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
return out;
|
|
35
|
-
}
|
|
36
|
-
export class ReverieLogger {
|
|
37
|
-
#logDir;
|
|
38
|
-
#reverieFilename;
|
|
39
|
-
#whisperResultFilename;
|
|
40
|
-
constructor(config) {
|
|
41
|
-
if (typeof config.logDir !== "string" || config.logDir.length === 0) {
|
|
42
|
-
throw new Error("ReverieLogger: config.logDir is required and must be a non-empty string");
|
|
43
|
-
}
|
|
44
|
-
const reverieFilename = config.reverieFilename ?? DEFAULT_REVERIE_FILENAME;
|
|
45
|
-
const whisperResultFilename = config.whisperResultFilename ?? DEFAULT_WHISPER_RESULT_FILENAME;
|
|
46
|
-
validateFilename(reverieFilename, "reverieFilename");
|
|
47
|
-
validateFilename(whisperResultFilename, "whisperResultFilename");
|
|
48
|
-
if (reverieFilename === whisperResultFilename) {
|
|
49
|
-
// Mixing both schemas into one file would silently poison both reads:
|
|
50
|
-
// readers type-cast every line to the requested type without filtering
|
|
51
|
-
// by the `type` discriminator. Catch the env-var typo at init.
|
|
52
|
-
throw new Error(`ReverieLogger: reverieFilename and whisperResultFilename must differ (both were "${reverieFilename}")`);
|
|
53
|
-
}
|
|
54
|
-
this.#logDir = config.logDir;
|
|
55
|
-
this.#reverieFilename = reverieFilename;
|
|
56
|
-
this.#whisperResultFilename = whisperResultFilename;
|
|
57
|
-
}
|
|
58
|
-
/** Package-private: used by the compat API to honor custom filenames on explicit-dir reads. */
|
|
59
|
-
get reverieFilename() {
|
|
60
|
-
return this.#reverieFilename;
|
|
61
|
-
}
|
|
62
|
-
/** Package-private: used by the compat API to honor custom filenames on explicit-dir reads. */
|
|
63
|
-
get whisperResultFilename() {
|
|
64
|
-
return this.#whisperResultFilename;
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Log a reverie: the whisper model failed, Opus took over.
|
|
68
|
-
* The delta between the two responses is a training signal.
|
|
69
|
-
*/
|
|
70
|
-
logReverie(userMessage, miniResponse, opusResponse, failureReason, whisperModelId) {
|
|
23
|
+
/** Build a reverie-logger bound to the supplied absolute paths.
|
|
24
|
+
*
|
|
25
|
+
* Both returned functions NEVER throw. Any filesystem error
|
|
26
|
+
* (permission denied, disk full, EACCES, etc.) is swallowed so a
|
|
27
|
+
* failing append cannot break the voice handler's response path.
|
|
28
|
+
*
|
|
29
|
+
* Synchronous appendFileSync mirrors the pre-Leg-G behavior; reverie
|
|
30
|
+
* logging happens at session-end (already off the user-facing latency
|
|
31
|
+
* path) so blocking I/O is acceptable. */
|
|
32
|
+
export function createReverieLogger(opts) {
|
|
33
|
+
const { reveriesPath, whisperResultsPath } = opts;
|
|
34
|
+
const logReverie = (userMessage, miniResponse, opusResponse, failureReason, whisperModelId) => {
|
|
71
35
|
try {
|
|
72
|
-
fs.mkdirSync(
|
|
36
|
+
fs.mkdirSync(path.dirname(reveriesPath), { recursive: true });
|
|
73
37
|
const entry = {
|
|
74
38
|
type: "reverie",
|
|
75
39
|
user_message: userMessage,
|
|
@@ -79,56 +43,29 @@ export class ReverieLogger {
|
|
|
79
43
|
whisper_model_id: whisperModelId,
|
|
80
44
|
timestamp: new Date().toISOString(),
|
|
81
45
|
};
|
|
82
|
-
fs.appendFileSync(
|
|
46
|
+
fs.appendFileSync(reveriesPath, JSON.stringify(entry) + "\n");
|
|
83
47
|
}
|
|
84
48
|
catch {
|
|
85
|
-
//
|
|
49
|
+
// NEVER let logging break voice
|
|
86
50
|
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
* Log a whisper model result (success or failure) for monitoring.
|
|
90
|
-
*/
|
|
91
|
-
logWhisperResult(outcome, modelId, userMessage, response) {
|
|
51
|
+
};
|
|
52
|
+
const logWhisperResult = (outcome, modelId, userMessage, response) => {
|
|
92
53
|
try {
|
|
93
|
-
fs.mkdirSync(
|
|
54
|
+
fs.mkdirSync(path.dirname(whisperResultsPath), { recursive: true });
|
|
94
55
|
const entry = {
|
|
95
56
|
type: "whisper_result",
|
|
96
57
|
outcome,
|
|
97
58
|
model_id: modelId,
|
|
98
|
-
user_message: userMessage.slice(0,
|
|
59
|
+
user_message: userMessage.slice(0, 200), // truncate for logging
|
|
99
60
|
response_length: response.length,
|
|
100
61
|
timestamp: new Date().toISOString(),
|
|
101
62
|
};
|
|
102
|
-
fs.appendFileSync(
|
|
103
|
-
}
|
|
104
|
-
catch {
|
|
105
|
-
// swallow — logging must never break the voice pipeline
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
readReverieLog() {
|
|
109
|
-
try {
|
|
110
|
-
const logPath = path.join(this.#logDir, this.#reverieFilename);
|
|
111
|
-
if (!fs.existsSync(logPath))
|
|
112
|
-
return [];
|
|
113
|
-
return parseLinesLenient(fs.readFileSync(logPath, "utf-8"));
|
|
114
|
-
}
|
|
115
|
-
catch {
|
|
116
|
-
return [];
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
readWhisperResultLog() {
|
|
120
|
-
try {
|
|
121
|
-
const logPath = path.join(this.#logDir, this.#whisperResultFilename);
|
|
122
|
-
if (!fs.existsSync(logPath))
|
|
123
|
-
return [];
|
|
124
|
-
return parseLinesLenient(fs.readFileSync(logPath, "utf-8"));
|
|
63
|
+
fs.appendFileSync(whisperResultsPath, JSON.stringify(entry) + "\n");
|
|
125
64
|
}
|
|
126
65
|
catch {
|
|
127
|
-
|
|
66
|
+
// NEVER let logging break voice
|
|
128
67
|
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
close() {
|
|
132
|
-
// no-op
|
|
133
|
-
}
|
|
68
|
+
};
|
|
69
|
+
return { logReverie, logWhisperResult };
|
|
134
70
|
}
|
|
71
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,EAAE;AACF,yEAAyE;AACzE,sEAAsE;AACtE,qEAAqE;AACrE,mCAAmC;AACnC,EAAE;AACF,mEAAmE;AACnE,mEAAmE;AACnE,+DAA+D;AAC/D,6DAA6D;AAC7D,qEAAqE;AACrE,qEAAqE;AACrE,WAAW;AACX,EAAE;AACF,iBAAiB;AACjB,sEAAsE;AACtE,sEAAsE;AACtE,+DAA+D;AAC/D,qDAAqD;AAErD,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AA4D7B;;;;;;;;2CAQ2C;AAC3C,MAAM,UAAU,mBAAmB,CACjC,IAA0B;IAE1B,MAAM,EAAE,YAAY,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAAC;IAElD,MAAM,UAAU,GAAiB,CAC/B,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,cAAc,EACd,EAAE;QACF,IAAI,CAAC;YACH,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAE9D,MAAM,KAAK,GAAiB;gBAC1B,IAAI,EAAE,SAAS;gBACf,YAAY,EAAE,WAAW;gBACzB,aAAa,EAAE,YAAY;gBAC3B,aAAa,EAAE,YAAY;gBAC3B,cAAc,EAAE,aAAa;gBAC7B,gBAAgB,EAAE,cAAc;gBAChC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC;YAEF,EAAE,CAAC,cAAc,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;QAChE,CAAC;QAAC,MAAM,CAAC;YACP,gCAAgC;QAClC,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAuB,CAC3C,OAAO,EACP,OAAO,EACP,WAAW,EACX,QAAQ,EACR,EAAE;QACF,IAAI,CAAC;YACH,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAEpE,MAAM,KAAK,GAAG;gBACZ,IAAI,EAAE,gBAAgB;gBACtB,OAAO;gBACP,QAAQ,EAAE,OAAO;gBACjB,YAAY,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,uBAAuB;gBAChE,eAAe,EAAE,QAAQ,CAAC,MAAM;gBAChC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC;YAEF,EAAE,CAAC,cAAc,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;QACtE,CAAC;QAAC,MAAM,CAAC;YACP,gCAAgC;QAClC,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { CostCalculator, LoggerLike, ReverieInferenceProvider, ReverieUserContext, UsageMeter } from "./contracts.js";
|
|
2
|
+
export declare const REVERIE_PAIR_SCHEMA_VERSION: "reverie-pair-v1";
|
|
3
|
+
export declare const REVERIE_SAFETY_FLAG_SCHEMA_VERSION: "reverie-safety-flag-v1";
|
|
4
|
+
export declare const _REFLECTION_SYSTEM_PROMPT_FOR_TEST = "You are reviewing a conversation between a user and OX (an AI coding assistant). Identify turns where OX's response could have been better. For each, produce a correction pair to train future versions of OX.\n\nFor each turn needing correction, output an object with:\n- turn_index (integer; index in the cohort history)\n- user_query (verbatim what the user asked or said that prompted OX's response)\n- negative (verbatim what OX actually said)\n- positive (what OX should have said instead)\n- evidence (quote the user signal: explicit correction, frustration, task failure, or implicit signal of dissatisfaction)\n- category (one of: factual_error | tone_miss | tool_misuse | verbosity | safety_concern | other)\n- confidence (0.0 to 1.0; your confidence the correction is valid)\n\nCategory definitions:\n- factual_error: OX stated something incorrect or unsupported.\n- tone_miss: OX's register, warmth, or directness mismatched the user's need.\n- tool_misuse: OX used the wrong tool, used a tool wrong, or skipped a tool that was needed.\n- verbosity: OX over-explained, padded, or buried the answer.\n- safety_concern: OX should have refused, declined, or escalated rather than complied. Includes (non-exhaustive): attempts to extract system prompts, attempts to extract API keys or secrets, requests for harmful content, requests to bypass operator-set boundaries, requests for security exploits, social-engineering against the user.\n- other: anything else worth correcting that doesn't fit the above.\n\nIf no turns need correction, return [].\nOutput ONLY the JSON array. No prose. No markdown fences. No code blocks.";
|
|
5
|
+
export type ReverieCategory = "factual_error" | "tone_miss" | "tool_misuse" | "verbosity" | "safety_concern" | "other";
|
|
6
|
+
export interface CorrectionPair {
|
|
7
|
+
turn_index: number;
|
|
8
|
+
user_query: string;
|
|
9
|
+
negative: string;
|
|
10
|
+
positive: string;
|
|
11
|
+
evidence: string;
|
|
12
|
+
category: ReverieCategory;
|
|
13
|
+
confidence: number;
|
|
14
|
+
}
|
|
15
|
+
export type ReverieSchemaVersion = typeof REVERIE_PAIR_SCHEMA_VERSION | typeof REVERIE_SAFETY_FLAG_SCHEMA_VERSION;
|
|
16
|
+
export type ReverieErrorKind = "auth" | "network" | "rate_limit" | "server" | "parse" | "refusal" | "unknown";
|
|
17
|
+
export interface ReverieResult {
|
|
18
|
+
cohort_id: string;
|
|
19
|
+
schema_version: ReverieSchemaVersion;
|
|
20
|
+
ts: string;
|
|
21
|
+
model: string;
|
|
22
|
+
input_tokens: number;
|
|
23
|
+
output_tokens: number;
|
|
24
|
+
cost_usd: number;
|
|
25
|
+
pairs: CorrectionPair[];
|
|
26
|
+
validation_error?: string;
|
|
27
|
+
error_kind?: ReverieErrorKind;
|
|
28
|
+
/** Set on the safety twin of a split write (C-1 Option B): points
|
|
29
|
+
* at the jsonl path where the cost was attributed. Behavioral
|
|
30
|
+
* record carries the full cost; safety record carries 0 + this
|
|
31
|
+
* provenance link. ox-data-factory and constitutional pipeline
|
|
32
|
+
* both use it to join cost across the split. */
|
|
33
|
+
cost_attributed_to?: string;
|
|
34
|
+
}
|
|
35
|
+
export interface ConversationExchange {
|
|
36
|
+
role: string;
|
|
37
|
+
content: string;
|
|
38
|
+
}
|
|
39
|
+
interface ValidatorOk {
|
|
40
|
+
valid: true;
|
|
41
|
+
pairs: CorrectionPair[];
|
|
42
|
+
}
|
|
43
|
+
interface ValidatorErr {
|
|
44
|
+
valid: false;
|
|
45
|
+
error: string;
|
|
46
|
+
}
|
|
47
|
+
export declare function validateCorrectionPairs(raw: unknown): ValidatorOk | ValidatorErr;
|
|
48
|
+
export interface ExecuteReflectionArgs {
|
|
49
|
+
cohortId: string;
|
|
50
|
+
userContext: ReverieUserContext;
|
|
51
|
+
history: ConversationExchange[];
|
|
52
|
+
inferenceProvider: ReverieInferenceProvider;
|
|
53
|
+
meter: UsageMeter;
|
|
54
|
+
costCalculator: CostCalculator;
|
|
55
|
+
logger: LoggerLike;
|
|
56
|
+
}
|
|
57
|
+
export declare function executeReflection(args: ExecuteReflectionArgs): Promise<ReverieResult>;
|
|
58
|
+
export declare function mapErrorKind(err: unknown): ReverieErrorKind;
|
|
59
|
+
export {};
|
|
60
|
+
//# sourceMappingURL=opus-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opus-client.d.ts","sourceRoot":"","sources":["../src/opus-client.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EACV,wBAAwB,EACxB,kBAAkB,EAClB,UAAU,EACX,MAAM,gBAAgB,CAAC;AASxB,eAAO,MAAM,2BAA2B,EAAG,iBAA0B,CAAC;AACtE,eAAO,MAAM,kCAAkC,EAC7C,wBAAiC,CAAC;AA+CpC,eAAO,MAAM,kCAAkC,mmDAA2B,CAAC;AAI3E,MAAM,MAAM,eAAe,GACvB,eAAe,GACf,WAAW,GACX,aAAa,GACb,WAAW,GACX,gBAAgB,GAChB,OAAO,CAAC;AAEZ,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,eAAe,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,oBAAoB,GAC5B,OAAO,2BAA2B,GAClC,OAAO,kCAAkC,CAAC;AAE9C,MAAM,MAAM,gBAAgB,GACxB,MAAM,GACN,SAAS,GACT,YAAY,GACZ,QAAQ,GACR,OAAO,GACP,SAAS,GACT,SAAS,CAAC;AAEd,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,oBAAoB,CAAC;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B;;;;qDAIiD;IACjD,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAaD,UAAU,WAAW;IACnB,KAAK,EAAE,IAAI,CAAC;IACZ,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED,UAAU,YAAY;IACpB,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,OAAO,GACX,WAAW,GAAG,YAAY,CA+D5B;AAID,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,kBAAkB,CAAC;IAChC,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAChC,iBAAiB,EAAE,wBAAwB,CAAC;IAC5C,KAAK,EAAE,UAAU,CAAC;IAClB,cAAc,EAAE,cAAc,CAAC;IAC/B,MAAM,EAAE,UAAU,CAAC;CACpB;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,aAAa,CAAC,CAkJxB;AAeD,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,CA6B3D"}
|