@intentface/latch-langfuse 0.17.0 → 0.18.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@intentface/latch-langfuse",
3
- "version": "0.17.0",
3
+ "version": "0.18.0",
4
4
  "description": "Latch observability on Langfuse — one-line tracing for latch runtimes via the AI SDK telemetry integration, plus score and trace-read helpers for platforms.",
5
5
  "keywords": [
6
6
  "ai",
@@ -37,7 +37,7 @@
37
37
  "@langfuse/vercel-ai-sdk": "^5.11.1",
38
38
  "@opentelemetry/api": "^1.9.0",
39
39
  "@opentelemetry/sdk-trace-node": "^2.0.0",
40
- "@intentface/latch-core": "^0.17.0"
40
+ "@intentface/latch-core": "^0.18.0"
41
41
  },
42
42
  "peerDependencies": {
43
43
  "ai": ">=7.0.0"
@@ -54,7 +54,7 @@
54
54
  "directory": "packages/langfuse"
55
55
  },
56
56
  "scripts": {
57
- "build": "tsc -p tsconfig.json",
57
+ "build": "tsc -p tsconfig.build.json",
58
58
  "typecheck": "tsc -p tsconfig.json --noEmit",
59
59
  "test": "vitest run"
60
60
  }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=reads.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reads.test.d.ts","sourceRoot":"","sources":["../src/reads.test.ts"],"names":[],"mappings":""}
@@ -1,150 +0,0 @@
1
- import { beforeEach, describe, expect, it, vi } from "vitest";
2
- /**
3
- * The trace-list calls the reader made, in order, so a test can assert WHICH
4
- * queries were issued (one per agent-owner tag, plus the caller's own userId).
5
- */
6
- const calls = [];
7
- let tracePages;
8
- let scoreRows;
9
- /** When set, the trace-list call matching this filter key rejects ("*" = all). */
10
- let failFor;
11
- vi.mock("./client.js", () => ({
12
- getLangfuseClient: () => ({
13
- api: {
14
- trace: {
15
- list: async (params) => {
16
- calls.push(params);
17
- // Key the canned page by the filter this call used.
18
- const tags = params.tags;
19
- const key = tags?.[0] ?? `user:${String(params.userId)}`;
20
- if (failFor && (failFor === "*" || key === failFor)) {
21
- throw new Error("langfuse unavailable");
22
- }
23
- return { data: tracePages[key] ?? [] };
24
- },
25
- },
26
- scoresV3: {
27
- getManyV3: async () => ({ data: scoreRows, meta: {} }),
28
- },
29
- },
30
- }),
31
- }));
32
- const { AGENT_OWNER_TAG, listAdministeredTraces } = await import("./reads.js");
33
- const trace = (id, at, over = {}) => ({
34
- id,
35
- name: "my-agent",
36
- timestamp: at,
37
- tags: [`run:run-${id}`, `agent:my-agent`],
38
- ...over,
39
- });
40
- describe("listAdministeredTraces", () => {
41
- beforeEach(() => {
42
- calls.length = 0;
43
- tracePages = {};
44
- scoreRows = [];
45
- failFor = undefined;
46
- });
47
- it("queries once per agent-owner key, plus the reader's own runs", async () => {
48
- await listAdministeredTraces({
49
- agentOwnerTags: ["org/me", "org"],
50
- ownerTag: "org/me",
51
- limit: 10,
52
- });
53
- expect(calls).toHaveLength(3);
54
- expect(calls[0]).toMatchObject({ tags: [`${AGENT_OWNER_TAG}org/me`] });
55
- expect(calls[1]).toMatchObject({ tags: [`${AGENT_OWNER_TAG}org`] });
56
- expect(calls[2]).toMatchObject({ userId: "org/me" });
57
- });
58
- it("collapses duplicate owner keys into one query", async () => {
59
- // An org-only principal's personal and org keys are the same string.
60
- await listAdministeredTraces({
61
- agentOwnerTags: ["org", "org", ""],
62
- ownerTag: "org",
63
- });
64
- expect(calls).toHaveLength(2); // one tag query + the userId query
65
- });
66
- it("surfaces another user's run on an agent I administer", async () => {
67
- tracePages[`${AGENT_OWNER_TAG}org`] = [
68
- trace("t1", "2026-07-31T10:00:00Z", {
69
- userId: "org/colleague",
70
- tags: ["run:run-t1", "agent:my-agent", `${AGENT_OWNER_TAG}org`],
71
- }),
72
- ];
73
- const rows = await listAdministeredTraces({
74
- agentOwnerTags: ["org"],
75
- ownerTag: "org/me",
76
- });
77
- expect(rows).toHaveLength(1);
78
- expect(rows[0]).toMatchObject({
79
- runId: "run-t1",
80
- userId: "org/colleague", // attribution: who ran it
81
- agentOwner: "org", // whose agent it was
82
- });
83
- });
84
- it("de-duplicates a trace returned by more than one source", async () => {
85
- const t = trace("t1", "2026-07-31T10:00:00Z", { userId: "org/me" });
86
- tracePages[`${AGENT_OWNER_TAG}org`] = [t];
87
- tracePages["user:org/me"] = [t];
88
- const rows = await listAdministeredTraces({
89
- agentOwnerTags: ["org"],
90
- ownerTag: "org/me",
91
- });
92
- expect(rows.map((r) => r.id)).toEqual(["t1"]);
93
- });
94
- it("re-sorts across sources and caps at the limit", async () => {
95
- // Each source is newest-first on its own; the union must be too, or the cap
96
- // would keep whichever query a row happened to come from.
97
- tracePages[`${AGENT_OWNER_TAG}org`] = [
98
- trace("old", "2026-07-01T00:00:00Z"),
99
- trace("oldest", "2026-06-01T00:00:00Z"),
100
- ];
101
- tracePages["user:org/me"] = [trace("newest", "2026-07-31T00:00:00Z")];
102
- const rows = await listAdministeredTraces({
103
- agentOwnerTags: ["org"],
104
- ownerTag: "org/me",
105
- limit: 2,
106
- });
107
- expect(rows.map((r) => r.id)).toEqual(["newest", "old"]);
108
- });
109
- it("joins scores in and normalizes booleans to numbers", async () => {
110
- tracePages[`${AGENT_OWNER_TAG}org`] = [trace("t1", "2026-07-31T10:00:00Z")];
111
- scoreRows = [
112
- { name: "greets", value: true, subject: { kind: "trace", id: "t1" }, dataType: "BOOLEAN" },
113
- { name: "user-feedback", value: 1, subject: { kind: "trace", id: "t1" } },
114
- { name: "ignored", value: 1, subject: { kind: "observation", id: "t1" } },
115
- ];
116
- const rows = await listAdministeredTraces({
117
- agentOwnerTags: ["org"],
118
- ownerTag: "org/me",
119
- });
120
- expect(rows[0].scores).toEqual([
121
- { name: "greets", value: 1, comment: undefined, dataType: "BOOLEAN" },
122
- { name: "user-feedback", value: 1, comment: undefined, dataType: undefined },
123
- ]);
124
- });
125
- it("degrades to the surviving sources when one query fails", async () => {
126
- tracePages["user:org/me"] = [trace("mine", "2026-07-31T10:00:00Z", { userId: "org/me" })];
127
- // The tag query throws; the reader's own runs must still render.
128
- failFor = `${AGENT_OWNER_TAG}org`;
129
- const rows = await listAdministeredTraces({
130
- agentOwnerTags: ["org"],
131
- ownerTag: "org/me",
132
- });
133
- expect(rows.map((r) => r.id)).toEqual(["mine"]);
134
- });
135
- it("throws when EVERY source fails, so the caller keeps its last good page", async () => {
136
- // An empty array would read as "no traces yet" and wipe the feed.
137
- failFor = "*";
138
- await expect(listAdministeredTraces({ agentOwnerTags: ["org"], ownerTag: "org/me" })).rejects.toThrow("langfuse unavailable");
139
- });
140
- it("passes the agent filter to every source", async () => {
141
- await listAdministeredTraces({
142
- agentOwnerTags: ["org"],
143
- ownerTag: "org/me",
144
- agent: "my-agent",
145
- });
146
- for (const c of calls)
147
- expect(c).toMatchObject({ name: "my-agent" });
148
- });
149
- });
150
- //# sourceMappingURL=reads.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reads.test.js","sourceRoot":"","sources":["../src/reads.test.ts"],"names":[],"mappings":"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"}