@coalex-ai/sdk 1.7.0 → 1.13.0-beta.51
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 +17 -0
- package/dist/context.d.ts +14 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +32 -4
- package/dist/context.js.map +1 -1
- package/dist/evaluate.d.ts +5 -0
- package/dist/evaluate.d.ts.map +1 -1
- package/dist/evaluate.js +5 -0
- package/dist/evaluate.js.map +1 -1
- package/dist/ext/tool.d.ts.map +1 -1
- package/dist/ext/tool.js +28 -1
- package/dist/ext/tool.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/prompts.d.ts +27 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +44 -0
- package/dist/prompts.js.map +1 -0
- package/dist/resolve.d.ts +2 -2
- package/dist/resolve.d.ts.map +1 -1
- package/dist/resolve.js +1 -1
- package/dist/resolve.js.map +1 -1
- package/dist/span-processor.d.ts.map +1 -1
- package/dist/span-processor.js +18 -8
- package/dist/span-processor.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -127,6 +127,23 @@ const result = await resolve({
|
|
|
127
127
|
});
|
|
128
128
|
```
|
|
129
129
|
|
|
130
|
+
### `getPrompt(options)`
|
|
131
|
+
|
|
132
|
+
Fetch a versioned prompt template from the Prompt Vault (parity with the Python SDK's `coalex.get_prompt()`).
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
const prompt = await getPrompt({
|
|
136
|
+
agent: "sales-copilot",
|
|
137
|
+
name: "system",
|
|
138
|
+
version: "production", // "production" (default) | "staging" | "draft" | "latest" | number
|
|
139
|
+
});
|
|
140
|
+
// { id, agentId, name, promptType, version, content, status, metadata }
|
|
141
|
+
|
|
142
|
+
myLlm.systemPrompt = prompt.content;
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Throws if `register()` hasn't been called, or if the prompt doesn't exist (the API returns 404).
|
|
146
|
+
|
|
130
147
|
## Extension Spans
|
|
131
148
|
|
|
132
149
|
Import from `@coalex-ai/sdk/ext` for fine-grained tracing of RAG pipelines:
|
package/dist/context.d.ts
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
/** Record the prompt version/type served by the most recent getPrompt() (COA-368). */
|
|
2
|
+
export declare function setLastPrompt(version: number, type: string): void;
|
|
3
|
+
/** The prompt version/type from the most recent getPrompt(), or null. */
|
|
4
|
+
export declare function getLastPrompt(): {
|
|
5
|
+
version: number;
|
|
6
|
+
type: string;
|
|
7
|
+
} | null;
|
|
8
|
+
/**
|
|
9
|
+
* Return the agentId of the active coalexContext(), or undefined outside one.
|
|
10
|
+
* Lets evaluate() propagate the agentId for mid-run escalations that fire before
|
|
11
|
+
* the trace ingests, so the server resolves the agent instead of forcing health=0
|
|
12
|
+
* (COA-1076).
|
|
13
|
+
*/
|
|
14
|
+
export declare function currentAgentId(): string | undefined;
|
|
1
15
|
export interface CoalexContextOptions {
|
|
2
16
|
agentId: string;
|
|
3
17
|
requestId?: string;
|
package/dist/context.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAeA,sFAAsF;AACtF,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAEjE;AAED,yEAAyE;AACzE,wBAAgB,aAAa,IAAI;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAExE;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,IAAI,MAAM,GAAG,SAAS,CAEnD;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,aAAa,CAAC,CAAC,EACnC,OAAO,EAAE,oBAAoB,EAC7B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GACvB,OAAO,CAAC,CAAC,CAAC,CA0BZ;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EACjC,OAAO,EAAE,oBAAoB,EAC7B,EAAE,EAAE,MAAM,CAAC,GACV,CAAC,CA0BH"}
|
package/dist/context.js
CHANGED
|
@@ -1,4 +1,32 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
1
2
|
import { trace, SpanStatusCode } from "@opentelemetry/api";
|
|
3
|
+
const agentIdStore = new AsyncLocalStorage();
|
|
4
|
+
/**
|
|
5
|
+
* The prompt version + type last fetched via getPrompt(), used as a fallback so spans can be
|
|
6
|
+
* attributed to a prompt version even when getPrompt() ran at startup outside any span (COA-368).
|
|
7
|
+
*
|
|
8
|
+
* This is process-global (not async-context-scoped) so it survives a startup fetch into later
|
|
9
|
+
* request spans — the common case. Under concurrent getPrompt() calls for *different* versions in
|
|
10
|
+
* the same process the last write wins; the Python SDK's contextvar is the more precise analogue.
|
|
11
|
+
*/
|
|
12
|
+
let _lastPrompt = null;
|
|
13
|
+
/** Record the prompt version/type served by the most recent getPrompt() (COA-368). */
|
|
14
|
+
export function setLastPrompt(version, type) {
|
|
15
|
+
_lastPrompt = { version, type };
|
|
16
|
+
}
|
|
17
|
+
/** The prompt version/type from the most recent getPrompt(), or null. */
|
|
18
|
+
export function getLastPrompt() {
|
|
19
|
+
return _lastPrompt;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Return the agentId of the active coalexContext(), or undefined outside one.
|
|
23
|
+
* Lets evaluate() propagate the agentId for mid-run escalations that fire before
|
|
24
|
+
* the trace ingests, so the server resolves the agent instead of forcing health=0
|
|
25
|
+
* (COA-1076).
|
|
26
|
+
*/
|
|
27
|
+
export function currentAgentId() {
|
|
28
|
+
return agentIdStore.getStore();
|
|
29
|
+
}
|
|
2
30
|
export async function coalexContext(options, fn) {
|
|
3
31
|
const tracer = trace.getTracer("coalex");
|
|
4
32
|
const attrs = { "coalex.agent_id": options.agentId };
|
|
@@ -8,7 +36,7 @@ export async function coalexContext(options, fn) {
|
|
|
8
36
|
if (options.version !== undefined) {
|
|
9
37
|
attrs["coalex.agent_version"] = options.version;
|
|
10
38
|
}
|
|
11
|
-
return tracer.startActiveSpan("coalex.invocation", { attributes: attrs }, async (span) => {
|
|
39
|
+
return agentIdStore.run(options.agentId, () => tracer.startActiveSpan("coalex.invocation", { attributes: attrs }, async (span) => {
|
|
12
40
|
try {
|
|
13
41
|
const result = await fn();
|
|
14
42
|
span.setStatus({ code: SpanStatusCode.OK });
|
|
@@ -22,7 +50,7 @@ export async function coalexContext(options, fn) {
|
|
|
22
50
|
finally {
|
|
23
51
|
span.end();
|
|
24
52
|
}
|
|
25
|
-
});
|
|
53
|
+
}));
|
|
26
54
|
}
|
|
27
55
|
export function coalexContextSync(options, fn) {
|
|
28
56
|
const tracer = trace.getTracer("coalex");
|
|
@@ -33,7 +61,7 @@ export function coalexContextSync(options, fn) {
|
|
|
33
61
|
if (options.version !== undefined) {
|
|
34
62
|
attrs["coalex.agent_version"] = options.version;
|
|
35
63
|
}
|
|
36
|
-
return tracer.startActiveSpan("coalex.invocation", { attributes: attrs }, (span) => {
|
|
64
|
+
return agentIdStore.run(options.agentId, () => tracer.startActiveSpan("coalex.invocation", { attributes: attrs }, (span) => {
|
|
37
65
|
try {
|
|
38
66
|
const result = fn();
|
|
39
67
|
span.setStatus({ code: SpanStatusCode.OK });
|
|
@@ -47,6 +75,6 @@ export function coalexContextSync(options, fn) {
|
|
|
47
75
|
finally {
|
|
48
76
|
span.end();
|
|
49
77
|
}
|
|
50
|
-
});
|
|
78
|
+
}));
|
|
51
79
|
}
|
|
52
80
|
//# sourceMappingURL=context.js.map
|
package/dist/context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
|
package/dist/evaluate.d.ts
CHANGED
|
@@ -12,6 +12,11 @@ export interface EvaluateOptions {
|
|
|
12
12
|
output: Record<string, unknown>;
|
|
13
13
|
metrics?: Record<string, string[]>;
|
|
14
14
|
metadata?: Record<string, unknown>;
|
|
15
|
+
/**
|
|
16
|
+
* Agent identifier. Defaults to the active coalexContext()'s agentId. Propagated
|
|
17
|
+
* so mid-run escalations get the right agent even before the trace ingests (COA-1076).
|
|
18
|
+
*/
|
|
19
|
+
agentId?: string;
|
|
15
20
|
}
|
|
16
21
|
export declare function evaluate(options: EvaluateOptions): Promise<EvaluationDecision>;
|
|
17
22
|
//# sourceMappingURL=evaluate.d.ts.map
|
package/dist/evaluate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../src/evaluate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../src/evaluate.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,aAAa,aASxB,CAAC;AAEH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,eAAe,GAAG,WAAW,GAAG,UAAU,CAAC;IAC5D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAyDpF"}
|
package/dist/evaluate.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { getConfig, getApiKey } from "./index.js";
|
|
2
|
+
import { currentAgentId } from "./context.js";
|
|
2
3
|
export const KNOWN_METRICS = new Set([
|
|
3
4
|
"f1",
|
|
4
5
|
"word_overlap",
|
|
@@ -27,11 +28,15 @@ export async function evaluate(options) {
|
|
|
27
28
|
if (options.traceId) {
|
|
28
29
|
console.warn("[coalex] traceId is deprecated, use requestId instead");
|
|
29
30
|
}
|
|
31
|
+
const agentId = options.agentId ?? currentAgentId();
|
|
30
32
|
const payload = {
|
|
31
33
|
request_id: requestId,
|
|
32
34
|
input: options.input,
|
|
33
35
|
output: options.output,
|
|
34
36
|
};
|
|
37
|
+
if (agentId) {
|
|
38
|
+
payload.agent_id = agentId;
|
|
39
|
+
}
|
|
35
40
|
if (options.metrics) {
|
|
36
41
|
payload.metrics = options.metrics;
|
|
37
42
|
}
|
package/dist/evaluate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../src/evaluate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../src/evaluate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IACnC,IAAI;IACJ,cAAc;IACd,MAAM;IACN,SAAS;IACT,qBAAqB;IACrB,aAAa;IACb,aAAa;IACb,UAAU;CACX,CAAC,CAAC;AAuBH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAwB;IACrD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAE3B,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,KAAK,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAClE,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAChE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IACvD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC/E,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,cAAc,EAAE,CAAC;IAEpD,MAAM,OAAO,GAA4B;QACvC,UAAU,EAAE,SAAS;QACrB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC;IACF,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC7B,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IACpC,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IACtC,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,CAAC,QAAQ,kBAAkB,EAAE;QAC7D,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,MAAM,EAAE;SAClC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;KAC9B,CAAC,CAAC;IAEH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,sBAAsB,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/B,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,SAAS,EAAE,IAAI,CAAC,UAAU;QAC1B,YAAY,EAAE,IAAI,CAAC,aAAa,IAAI,SAAS;KAC9C,CAAC;AACJ,CAAC"}
|
package/dist/ext/tool.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/ext/tool.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;
|
|
1
|
+
{"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/ext/tool.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAqBD,wBAAgB,QAAQ,CAAC,CAAC,SAAS,OAAO,EAAE,EAAE,CAAC,EAC7C,OAAO,EAAE,eAAe,EACxB,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GACjC,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAgC5B"}
|
package/dist/ext/tool.js
CHANGED
|
@@ -1,4 +1,22 @@
|
|
|
1
1
|
import { getParentContext, getTracer } from "./base.js";
|
|
2
|
+
const MAX_OUTPUT_LEN = 10_000;
|
|
3
|
+
/**
|
|
4
|
+
* Serialize a tool's return value for the `output.value` span attribute.
|
|
5
|
+
* JSON when possible, else String(); truncated so a large result can't bloat the span.
|
|
6
|
+
*/
|
|
7
|
+
function serializeToolOutput(value) {
|
|
8
|
+
let text;
|
|
9
|
+
try {
|
|
10
|
+
text = JSON.stringify(value) ?? String(value);
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
text = String(value);
|
|
14
|
+
}
|
|
15
|
+
if (text.length > MAX_OUTPUT_LEN) {
|
|
16
|
+
text = text.slice(0, MAX_OUTPUT_LEN) + "…(truncated)";
|
|
17
|
+
}
|
|
18
|
+
return text;
|
|
19
|
+
}
|
|
2
20
|
export function toolSpan(options, fn) {
|
|
3
21
|
return async (...args) => {
|
|
4
22
|
const tracer = getTracer();
|
|
@@ -18,7 +36,16 @@ export function toolSpan(options, fn) {
|
|
|
18
36
|
// ignore serialization errors
|
|
19
37
|
}
|
|
20
38
|
}
|
|
21
|
-
|
|
39
|
+
const result = await fn(...args);
|
|
40
|
+
// Capture the return value so silver's output_value is populated —
|
|
41
|
+
// unblocks tool-correctness / tool-use metrics (COA-1109).
|
|
42
|
+
try {
|
|
43
|
+
span.setAttribute("output.value", serializeToolOutput(result));
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// ignore serialization errors
|
|
47
|
+
}
|
|
48
|
+
return result;
|
|
22
49
|
}
|
|
23
50
|
finally {
|
|
24
51
|
span.end();
|
package/dist/ext/tool.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../../src/ext/tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAOxD,MAAM,UAAU,QAAQ,CACtB,OAAwB,EACxB,EAAkC;IAElC,OAAO,KAAK,EAAE,GAAG,IAAO,EAAc,EAAE;QACtC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAC;QACrC,OAAO,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACxE,IAAI,CAAC;gBACH,IAAI,CAAC,YAAY,CAAC,yBAAyB,EAAE,MAAM,CAAC,CAAC;gBACrD,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;gBAC7C,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;oBACxB,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;gBAC7D,CAAC;gBACD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACpB,IAAI,CAAC;wBACH,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;oBAC7D,CAAC;oBAAC,MAAM,CAAC;wBACP,8BAA8B;oBAChC,CAAC;gBACH,CAAC;gBACD,
|
|
1
|
+
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../../src/ext/tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAOxD,MAAM,cAAc,GAAG,MAAM,CAAC;AAE9B;;;GAGG;AACH,SAAS,mBAAmB,CAAC,KAAc;IACzC,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,GAAG,cAAc,EAAE,CAAC;QACjC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,GAAG,cAAc,CAAC;IACxD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,QAAQ,CACtB,OAAwB,EACxB,EAAkC;IAElC,OAAO,KAAK,EAAE,GAAG,IAAO,EAAc,EAAE;QACtC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAC;QACrC,OAAO,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACxE,IAAI,CAAC;gBACH,IAAI,CAAC,YAAY,CAAC,yBAAyB,EAAE,MAAM,CAAC,CAAC;gBACrD,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;gBAC7C,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;oBACxB,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;gBAC7D,CAAC;gBACD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACpB,IAAI,CAAC;wBACH,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;oBAC7D,CAAC;oBAAC,MAAM,CAAC;wBACP,8BAA8B;oBAChC,CAAC;gBACH,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;gBACjC,mEAAmE;gBACnE,2DAA2D;gBAC3D,IAAI,CAAC;oBACH,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC;gBACjE,CAAC;gBAAC,MAAM,CAAC;oBACP,8BAA8B;gBAChC,CAAC;gBACD,OAAO,MAAM,CAAC;YAChB,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import type { CoalexConfig } from "./config.js";
|
|
2
2
|
export type { CoalexConfig } from "./config.js";
|
|
3
|
-
export { coalexContext, coalexContextSync } from "./context.js";
|
|
3
|
+
export { coalexContext, coalexContextSync, currentAgentId } from "./context.js";
|
|
4
4
|
export type { CoalexContextOptions } from "./context.js";
|
|
5
5
|
export { evaluate, KNOWN_METRICS } from "./evaluate.js";
|
|
6
6
|
export type { EvaluateOptions, EvaluationDecision } from "./evaluate.js";
|
|
7
7
|
export { resolve, VALID_DECISIONS } from "./resolve.js";
|
|
8
8
|
export type { ResolveOptions, ResolutionResult, MetricResult } from "./resolve.js";
|
|
9
|
+
export { getPrompt } from "./prompts.js";
|
|
10
|
+
export type { GetPromptOptions, PromptVersion } from "./prompts.js";
|
|
9
11
|
export { declareAgent } from "./agents.js";
|
|
10
12
|
export type { AgentDeclaration, DeclareAgentOptions } from "./agents.js";
|
|
11
13
|
export { autoInstrument, autoInstrumentAsync, instrumentOpenAI, instrumentLangChain, instrumentAnthropic } from "./auto-instrument.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAKhD,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAKhD,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAChF,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACxD,YAAY,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACxD,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACnF,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACvI,YAAY,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAKzF,wBAAgB,SAAS,IAAI,YAAY,CAKxC;AAED,wBAAgB,SAAS,IAAI,MAAM,CAKlC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,wBAAgB,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI,CA0BxD;AAED,0CAA0C;AAC1C,wBAAgB,gBAAgB,IAAI,IAAI,CAGvC"}
|
package/dist/index.js
CHANGED
|
@@ -6,9 +6,10 @@ import { ATTR_SERVICE_NAME } from "@opentelemetry/semantic-conventions";
|
|
|
6
6
|
import { SafeOTLPSpanExporter } from "./safe-exporter.js";
|
|
7
7
|
import { FilteringSpanExporter } from "./filtering-exporter.js";
|
|
8
8
|
import { CoalexAttributePropagator } from "./span-processor.js";
|
|
9
|
-
export { coalexContext, coalexContextSync } from "./context.js";
|
|
9
|
+
export { coalexContext, coalexContextSync, currentAgentId } from "./context.js";
|
|
10
10
|
export { evaluate, KNOWN_METRICS } from "./evaluate.js";
|
|
11
11
|
export { resolve, VALID_DECISIONS } from "./resolve.js";
|
|
12
|
+
export { getPrompt } from "./prompts.js";
|
|
12
13
|
export { declareAgent } from "./agents.js";
|
|
13
14
|
export { autoInstrument, autoInstrumentAsync, instrumentOpenAI, instrumentLangChain, instrumentAnthropic } from "./auto-instrument.js";
|
|
14
15
|
let _config = null;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAGxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAGhE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/** A single prompt version returned by the Prompt Vault. */
|
|
2
|
+
export interface PromptVersion {
|
|
3
|
+
readonly id: string;
|
|
4
|
+
readonly agentId: string;
|
|
5
|
+
readonly name: string;
|
|
6
|
+
readonly promptType: string;
|
|
7
|
+
readonly version: number;
|
|
8
|
+
readonly content: string;
|
|
9
|
+
readonly status: string;
|
|
10
|
+
readonly metadata: Record<string, unknown>;
|
|
11
|
+
}
|
|
12
|
+
export interface GetPromptOptions {
|
|
13
|
+
/** Agent ID (e.g. "sales-copilot"). */
|
|
14
|
+
agent: string;
|
|
15
|
+
/** Prompt name (e.g. "system"). */
|
|
16
|
+
name: string;
|
|
17
|
+
/** "production" (default), "staging", "draft", "latest", or a version number. */
|
|
18
|
+
version?: "production" | "staging" | "draft" | "latest" | number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Fetch a prompt template from the Prompt Vault — the TypeScript counterpart of the Python
|
|
22
|
+
* SDK's `coalex.get_prompt()` (COA-355 / COA-264).
|
|
23
|
+
*
|
|
24
|
+
* @throws if `register()` hasn't been called, or if the API returns a non-2xx (e.g. 404).
|
|
25
|
+
*/
|
|
26
|
+
export declare function getPrompt(options: GetPromptOptions): Promise<PromptVersion>;
|
|
27
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAIA,4DAA4D;AAC5D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,gBAAgB;IAC/B,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,iFAAiF;IACjF,OAAO,CAAC,EAAE,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;CAClE;AAED;;;;;GAKG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC,CAgDjF"}
|
package/dist/prompts.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { trace } from "@opentelemetry/api";
|
|
2
|
+
import { getConfig, getApiKey } from "./index.js";
|
|
3
|
+
import { setLastPrompt } from "./context.js";
|
|
4
|
+
/**
|
|
5
|
+
* Fetch a prompt template from the Prompt Vault — the TypeScript counterpart of the Python
|
|
6
|
+
* SDK's `coalex.get_prompt()` (COA-355 / COA-264).
|
|
7
|
+
*
|
|
8
|
+
* @throws if `register()` hasn't been called, or if the API returns a non-2xx (e.g. 404).
|
|
9
|
+
*/
|
|
10
|
+
export async function getPrompt(options) {
|
|
11
|
+
const config = getConfig();
|
|
12
|
+
const apiKey = getApiKey();
|
|
13
|
+
const version = options.version ?? "production";
|
|
14
|
+
const url = `${config.endpoint}/api/v2/prompts/${encodeURIComponent(options.agent)}/${encodeURIComponent(options.name)}` +
|
|
15
|
+
`?version=${encodeURIComponent(String(version))}`;
|
|
16
|
+
const resp = await fetch(url, {
|
|
17
|
+
headers: { Authorization: `Bearer ${apiKey}` },
|
|
18
|
+
});
|
|
19
|
+
if (!resp.ok) {
|
|
20
|
+
throw new Error(`getPrompt() failed: ${resp.status} ${resp.statusText}`);
|
|
21
|
+
}
|
|
22
|
+
const data = await resp.json();
|
|
23
|
+
// Attribute subsequent spans to this prompt version (COA-368): store it as a fallback for
|
|
24
|
+
// spans that start outside any invocation, and stamp the current span if one is recording.
|
|
25
|
+
setLastPrompt(data.version, data.prompt_type);
|
|
26
|
+
const active = trace.getActiveSpan();
|
|
27
|
+
if (active?.isRecording()) {
|
|
28
|
+
active.setAttribute("coalex.prompt_version", data.version);
|
|
29
|
+
active.setAttribute("coalex.prompt_type", data.prompt_type);
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
id: data.id,
|
|
33
|
+
agentId: data.agent_id,
|
|
34
|
+
// The Prompt Vault keys a prompt by (agent, prompt_type); there is no separate `name` in
|
|
35
|
+
// the response, and the URL's `{name}` segment IS the prompt_type. So `name` mirrors it.
|
|
36
|
+
name: data.prompt_type,
|
|
37
|
+
promptType: data.prompt_type,
|
|
38
|
+
version: data.version,
|
|
39
|
+
content: data.content,
|
|
40
|
+
status: data.status,
|
|
41
|
+
metadata: data.metadata ?? {},
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAuB7C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAyB;IACvD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAE3B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,YAAY,CAAC;IAChD,MAAM,GAAG,GACP,GAAG,MAAM,CAAC,QAAQ,mBAAmB,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QAC5G,YAAY,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;IAEpD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC5B,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,EAAE,EAAE;KAC/C,CAAC,CAAC;IAEH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,IAAI,GAQN,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IAEtB,0FAA0F;IAC1F,2FAA2F;IAC3F,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC;IACrC,IAAI,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC;QAC1B,MAAM,CAAC,YAAY,CAAC,uBAAuB,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3D,MAAM,CAAC,YAAY,CAAC,oBAAoB,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,OAAO,EAAE,IAAI,CAAC,QAAQ;QACtB,yFAAyF;QACzF,yFAAyF;QACzF,IAAI,EAAE,IAAI,CAAC,WAAW;QACtB,UAAU,EAAE,IAAI,CAAC,WAAW;QAC5B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE;KAC9B,CAAC;AACJ,CAAC"}
|
package/dist/resolve.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const VALID_DECISIONS: Set<"rejected" | "approved" | "corrected">;
|
|
1
|
+
export declare const VALID_DECISIONS: Set<"rejected" | "approved" | "corrected" | "expired">;
|
|
2
2
|
export interface MetricResult {
|
|
3
3
|
readonly field: string;
|
|
4
4
|
readonly metrics: Record<string, number>;
|
|
@@ -14,7 +14,7 @@ export interface ResolutionResult {
|
|
|
14
14
|
}
|
|
15
15
|
export interface ResolveOptions {
|
|
16
16
|
escalationId: string;
|
|
17
|
-
decision: "approved" | "rejected" | "corrected";
|
|
17
|
+
decision: "approved" | "rejected" | "corrected" | "expired";
|
|
18
18
|
corrections?: Record<string, unknown>;
|
|
19
19
|
reviewer?: string | {
|
|
20
20
|
name?: string;
|
package/dist/resolve.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,eAAe,
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,eAAe,wDAAqE,CAAC;AAElG,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,CAAC;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,GAAG;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAkEhF"}
|
package/dist/resolve.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getConfig, getApiKey } from "./index.js";
|
|
2
|
-
export const VALID_DECISIONS = new Set(["approved", "rejected", "corrected"]);
|
|
2
|
+
export const VALID_DECISIONS = new Set(["approved", "rejected", "corrected", "expired"]);
|
|
3
3
|
export async function resolve(options) {
|
|
4
4
|
const config = getConfig();
|
|
5
5
|
const apiKey = getApiKey();
|
package/dist/resolve.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,WAAW,CAAU,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,CAAU,CAAC,CAAC;AAyBlG,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAuB;IACnD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAE3B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,2BAA2B,CAAC,GAAG,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,QAAQ,GAAG,CACxF,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,KAAK,WAAW,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAC7D,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,OAAO,GAA4B,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;IACxE,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS;QAAE,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IACjF,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACzC,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACpC,OAAO,CAAC,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC;IAC3C,CAAC;SAAM,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC5B,OAAO,CAAC,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC9C,OAAO,CAAC,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;IAClD,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAElE,MAAM,IAAI,GAAG,MAAM,KAAK,CACtB,GAAG,MAAM,CAAC,QAAQ,uBAAuB,OAAO,CAAC,YAAY,UAAU,EACvE;QACE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,MAAM,EAAE;SAClC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;KAC9B,CACF,CAAC;IAEF,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IACzE,CAAC;IAMD,MAAM,IAAI,GAQN,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IACtB,OAAO;QACL,YAAY,EAAE,IAAI,CAAC,aAAa;QAChC,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO,EAAE,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxC,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,OAAO,EAAE,CAAC,CAAC,OAAO;SACnB,CAAC,CAAC;QACH,UAAU,EAAE,IAAI,CAAC,WAAW;QAC5B,UAAU,EAAE,IAAI,CAAC,WAAW;QAC5B,YAAY,EAAE,IAAI,CAAC,aAAa;QAChC,aAAa,EAAE,IAAI,CAAC,cAAc;KACnC,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"span-processor.d.ts","sourceRoot":"","sources":["../src/span-processor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"span-processor.d.ts","sourceRoot":"","sources":["../src/span-processor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAYvF,qBAAa,yBAA0B,YAAW,aAAa;IAC7D,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,GAAG,IAAI;IAgCjD,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAG/B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAGzB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAG5B"}
|
package/dist/span-processor.js
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { trace } from "@opentelemetry/api";
|
|
2
2
|
import { spanContextBridge } from "./ext/context-bridge.js";
|
|
3
|
+
import { getLastPrompt } from "./context.js";
|
|
3
4
|
const ATTRIBUTES_TO_PROPAGATE = [
|
|
4
5
|
"coalex.agent_id",
|
|
5
6
|
"coalex.request_id",
|
|
6
7
|
"coalex.agent_version",
|
|
8
|
+
"coalex.prompt_version",
|
|
9
|
+
"coalex.prompt_type",
|
|
7
10
|
];
|
|
8
11
|
export class CoalexAttributePropagator {
|
|
9
12
|
onStart(span, parentContext) {
|
|
@@ -12,20 +15,27 @@ export class CoalexAttributePropagator {
|
|
|
12
15
|
// and sets openinference.span.kind only at onEnd time. So we track all
|
|
13
16
|
// spans — the bridge returns the most recently active span in the trace.
|
|
14
17
|
spanContextBridge.push(span, parentContext);
|
|
15
|
-
// Propagate coalex attributes from parent to child
|
|
18
|
+
// Propagate coalex attributes from parent to child.
|
|
16
19
|
const parentSpan = trace.getSpan(parentContext);
|
|
17
|
-
|
|
18
|
-
return;
|
|
19
|
-
const parentReadable = parentSpan;
|
|
20
|
-
const parentAttrs = parentReadable.attributes;
|
|
21
|
-
if (!parentAttrs)
|
|
22
|
-
return;
|
|
20
|
+
const parentAttrs = parentSpan ? parentSpan.attributes : undefined;
|
|
23
21
|
for (const attrName of ATTRIBUTES_TO_PROPAGATE) {
|
|
24
|
-
const parentValue = parentAttrs[attrName];
|
|
22
|
+
const parentValue = parentAttrs?.[attrName];
|
|
25
23
|
if (parentValue !== undefined) {
|
|
26
24
|
span.setAttribute(attrName, parentValue);
|
|
27
25
|
}
|
|
28
26
|
}
|
|
27
|
+
// Fallback: attribute spans to the last prompt fetched via getPrompt() when no parent
|
|
28
|
+
// carries it (e.g. a root span after a startup getPrompt()) — mirrors the Python contextvar
|
|
29
|
+
// fallback (COA-368).
|
|
30
|
+
const prompt = getLastPrompt();
|
|
31
|
+
if (prompt) {
|
|
32
|
+
if (parentAttrs?.["coalex.prompt_version"] === undefined) {
|
|
33
|
+
span.setAttribute("coalex.prompt_version", prompt.version);
|
|
34
|
+
}
|
|
35
|
+
if (parentAttrs?.["coalex.prompt_type"] === undefined) {
|
|
36
|
+
span.setAttribute("coalex.prompt_type", prompt.type);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
29
39
|
}
|
|
30
40
|
onEnd(span) {
|
|
31
41
|
spanContextBridge.pop(span.spanContext());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"span-processor.js","sourceRoot":"","sources":["../src/span-processor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"span-processor.js","sourceRoot":"","sources":["../src/span-processor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,uBAAuB,GAAG;IAC9B,iBAAiB;IACjB,mBAAmB;IACnB,sBAAsB;IACtB,uBAAuB;IACvB,oBAAoB;CACZ,CAAC;AAEX,MAAM,OAAO,yBAAyB;IACpC,OAAO,CAAC,IAAU,EAAE,aAAsB;QACxC,mEAAmE;QACnE,0EAA0E;QAC1E,uEAAuE;QACvE,yEAAyE;QACzE,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAE5C,oDAAoD;QACpD,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAChD,MAAM,WAAW,GAAG,UAAU,CAAC,CAAC,CAAE,UAAsC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;QAEhG,KAAK,MAAM,QAAQ,IAAI,uBAAuB,EAAE,CAAC;YAC/C,MAAM,WAAW,GAAG,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC;YAC5C,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC9B,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,sFAAsF;QACtF,4FAA4F;QAC5F,sBAAsB;QACtB,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;QAC/B,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,WAAW,EAAE,CAAC,uBAAuB,CAAC,KAAK,SAAS,EAAE,CAAC;gBACzD,IAAI,CAAC,YAAY,CAAC,uBAAuB,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YAC7D,CAAC;YACD,IAAI,WAAW,EAAE,CAAC,oBAAoB,CAAC,KAAK,SAAS,EAAE,CAAC;gBACtD,IAAI,CAAC,YAAY,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAkB;QACtB,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5C,CAAC;IACD,QAAQ;QACN,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IACD,UAAU;QACR,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;CACF"}
|