@morsehq-dev/sdk 0.5.0-rc.6 → 0.5.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/dist/anthropic/index.cjs +11 -11
- package/dist/anthropic/index.js +4 -4
- package/dist/anthropic-agent-sdk/index.cjs +40 -40
- package/dist/anthropic-agent-sdk/index.js +6 -6
- package/dist/browser/anthropic/index.cjs +11 -11
- package/dist/browser/anthropic/index.js +4 -4
- package/dist/browser/anthropic-agent-sdk/index.cjs +40 -40
- package/dist/browser/anthropic-agent-sdk/index.js +6 -6
- package/dist/browser/{chunk-TGN4FEKB.cjs → chunk-2X64OY2L.cjs} +12 -12
- package/dist/browser/{chunk-TGN4FEKB.cjs.map → chunk-2X64OY2L.cjs.map} +1 -1
- package/dist/browser/{chunk-6YPVIGD2.cjs → chunk-4CMVMTFB.cjs} +6 -6
- package/dist/browser/{chunk-6YPVIGD2.cjs.map → chunk-4CMVMTFB.cjs.map} +1 -1
- package/dist/browser/{chunk-PNUCUOUA.cjs → chunk-52JTU4LH.cjs} +15 -15
- package/dist/browser/{chunk-PNUCUOUA.cjs.map → chunk-52JTU4LH.cjs.map} +1 -1
- package/dist/browser/{chunk-WG45SF7N.cjs → chunk-6BNMYEMW.cjs} +3 -3
- package/dist/browser/{chunk-WG45SF7N.cjs.map → chunk-6BNMYEMW.cjs.map} +1 -1
- package/dist/browser/{chunk-MIHCAKQ2.js → chunk-6T6ZPOKZ.js} +3 -3
- package/dist/browser/{chunk-MIHCAKQ2.js.map → chunk-6T6ZPOKZ.js.map} +1 -1
- package/dist/{chunk-B3WEUUUK.cjs → browser/chunk-BIP66M44.cjs} +7 -7
- package/dist/browser/{chunk-NK6D2G5O.cjs.map → chunk-BIP66M44.cjs.map} +1 -1
- package/dist/browser/{chunk-FDWPKINR.js → chunk-BUCIE3DR.js} +4 -4
- package/dist/browser/{chunk-FDWPKINR.js.map → chunk-BUCIE3DR.js.map} +1 -1
- package/dist/browser/{chunk-DQ4JWHYH.cjs → chunk-ELQ4LGAS.cjs} +18 -18
- package/dist/browser/{chunk-DQ4JWHYH.cjs.map → chunk-ELQ4LGAS.cjs.map} +1 -1
- package/dist/browser/{chunk-JNF26SQM.js → chunk-KZFG23MO.js} +5 -5
- package/dist/browser/{chunk-JNF26SQM.js.map → chunk-KZFG23MO.js.map} +1 -1
- package/dist/browser/{chunk-IXCAR4UA.js → chunk-NU74H55W.js} +3 -3
- package/dist/browser/{chunk-IXCAR4UA.js.map → chunk-NU74H55W.js.map} +1 -1
- package/dist/browser/{chunk-2LZCQD3J.js → chunk-T6Z6UIBN.js} +3 -3
- package/dist/browser/{chunk-2LZCQD3J.js.map → chunk-T6Z6UIBN.js.map} +1 -1
- package/dist/browser/{chunk-ZAISDHUV.cjs → chunk-TV7TRP5O.cjs} +5 -5
- package/dist/browser/{chunk-ZAISDHUV.cjs.map → chunk-TV7TRP5O.cjs.map} +1 -1
- package/dist/browser/{chunk-PHE4P3DN.js → chunk-VIOT3AOP.js} +3 -3
- package/dist/browser/{chunk-PHE4P3DN.js.map → chunk-VIOT3AOP.js.map} +1 -1
- package/dist/{chunk-LEDIWC2M.js → browser/chunk-YYUDZTHI.js} +4 -4
- package/dist/browser/{chunk-TIZ5QRK2.js.map → chunk-YYUDZTHI.js.map} +1 -1
- package/dist/browser/index.cjs +91 -91
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.js +8 -8
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/integrations/pino.cjs +4 -4
- package/dist/browser/integrations/pino.js +3 -3
- package/dist/browser/langchain/index.cjs +17 -17
- package/dist/browser/langchain/index.js +2 -2
- package/dist/browser/langgraph/index.cjs +27 -27
- package/dist/browser/langgraph/index.js +5 -5
- package/dist/browser/openai/index.cjs +11 -11
- package/dist/browser/openai/index.js +2 -2
- package/dist/browser/openai-agents/index.cjs +34 -34
- package/dist/browser/openai-agents/index.js +4 -4
- package/dist/browser/vercel-ai/index.cjs +14 -14
- package/dist/browser/vercel-ai/index.js +3 -3
- package/dist/{chunk-2GWOF5JM.js → chunk-3ONFIKKC.js} +3 -3
- package/dist/{chunk-2GWOF5JM.js.map → chunk-3ONFIKKC.js.map} +1 -1
- package/dist/{chunk-QTATKDEI.js → chunk-6FLGLD72.js} +3 -3
- package/dist/{chunk-QTATKDEI.js.map → chunk-6FLGLD72.js.map} +1 -1
- package/dist/{chunk-TEWSIQ6E.cjs → chunk-7HYFOHM3.cjs} +6 -6
- package/dist/{chunk-TEWSIQ6E.cjs.map → chunk-7HYFOHM3.cjs.map} +1 -1
- package/dist/{chunk-K4FHTOBB.cjs → chunk-D5NTF54A.cjs} +12 -12
- package/dist/{chunk-K4FHTOBB.cjs.map → chunk-D5NTF54A.cjs.map} +1 -1
- package/dist/{chunk-ZFZTJXIO.cjs → chunk-GTPKPUAV.cjs} +15 -15
- package/dist/{chunk-ZFZTJXIO.cjs.map → chunk-GTPKPUAV.cjs.map} +1 -1
- package/dist/{chunk-Z2AYPTB2.js → chunk-J5FEPM7L.js} +5 -5
- package/dist/{chunk-Z2AYPTB2.js.map → chunk-J5FEPM7L.js.map} +1 -1
- package/dist/{chunk-UV5FUVNK.cjs → chunk-KMBKZLXH.cjs} +3 -3
- package/dist/{chunk-UV5FUVNK.cjs.map → chunk-KMBKZLXH.cjs.map} +1 -1
- package/dist/{browser/chunk-TIZ5QRK2.js → chunk-KWOSUW7B.js} +4 -4
- package/dist/{chunk-LEDIWC2M.js.map → chunk-KWOSUW7B.js.map} +1 -1
- package/dist/{chunk-AT3YR5SP.cjs → chunk-LPLL2OXI.cjs} +5 -5
- package/dist/{chunk-AT3YR5SP.cjs.map → chunk-LPLL2OXI.cjs.map} +1 -1
- package/dist/{browser/chunk-NK6D2G5O.cjs → chunk-NMARCV3R.cjs} +7 -7
- package/dist/{chunk-B3WEUUUK.cjs.map → chunk-NMARCV3R.cjs.map} +1 -1
- package/dist/{chunk-T5UFHQLZ.js → chunk-SFI36VWW.js} +3 -3
- package/dist/{chunk-T5UFHQLZ.js.map → chunk-SFI36VWW.js.map} +1 -1
- package/dist/{chunk-4QY5O46P.cjs → chunk-SUEBUMHL.cjs} +18 -18
- package/dist/{chunk-4QY5O46P.cjs.map → chunk-SUEBUMHL.cjs.map} +1 -1
- package/dist/{chunk-5YJXFU5U.js → chunk-ZIMGB7IT.js} +3 -3
- package/dist/{chunk-5YJXFU5U.js.map → chunk-ZIMGB7IT.js.map} +1 -1
- package/dist/{chunk-DK3RX7RS.js → chunk-ZZSVPAXM.js} +4 -4
- package/dist/{chunk-DK3RX7RS.js.map → chunk-ZZSVPAXM.js.map} +1 -1
- package/dist/index.cjs +101 -101
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +9 -9
- package/dist/index.js.map +1 -1
- package/dist/integrations/pino.cjs +4 -4
- package/dist/integrations/pino.js +3 -3
- package/dist/langchain/index.cjs +17 -17
- package/dist/langchain/index.js +2 -2
- package/dist/langgraph/index.cjs +27 -27
- package/dist/langgraph/index.js +5 -5
- package/dist/openai/index.cjs +11 -11
- package/dist/openai/index.js +2 -2
- package/dist/openai-agents/index.cjs +34 -34
- package/dist/openai-agents/index.js +4 -4
- package/dist/vercel-ai/index.cjs +14 -14
- package/dist/vercel-ai/index.js +3 -3
- package/package.json +1 -1
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('../chunk-
|
|
5
|
-
var
|
|
6
|
-
var
|
|
7
|
-
var
|
|
3
|
+
var chunkELQ4LGAS_cjs = require('../chunk-ELQ4LGAS.cjs');
|
|
4
|
+
require('../chunk-TV7TRP5O.cjs');
|
|
5
|
+
var chunkBIP66M44_cjs = require('../chunk-BIP66M44.cjs');
|
|
6
|
+
var chunk52JTU4LH_cjs = require('../chunk-52JTU4LH.cjs');
|
|
7
|
+
var chunk4CMVMTFB_cjs = require('../chunk-4CMVMTFB.cjs');
|
|
8
8
|
var chunkSWQOPFE4_cjs = require('../chunk-SWQOPFE4.cjs');
|
|
9
9
|
require('../chunk-RBNCTHK3.cjs');
|
|
10
|
-
var
|
|
10
|
+
var chunk6BNMYEMW_cjs = require('../chunk-6BNMYEMW.cjs');
|
|
11
11
|
|
|
12
12
|
// src/anthropic-agent-sdk/client-wrapper.ts
|
|
13
|
-
|
|
13
|
+
chunk6BNMYEMW_cjs.init_tracing();
|
|
14
14
|
var WRAPPED_CLIENT = /* @__PURE__ */ Symbol.for("morse.anthropic-agent-sdk.wrapped");
|
|
15
15
|
function wrapClaudeAgentSDK(client, options = {}) {
|
|
16
16
|
if (!client || typeof client !== "object") return client;
|
|
@@ -34,7 +34,7 @@ function wrapClaudeAgentSDK(client, options = {}) {
|
|
|
34
34
|
});
|
|
35
35
|
return wrapper;
|
|
36
36
|
}
|
|
37
|
-
var instrumentClaudeAgentSDK =
|
|
37
|
+
var instrumentClaudeAgentSDK = chunk4CMVMTFB_cjs.absorbErrorsAsync(
|
|
38
38
|
async (client = void 0, maybeOptions = {}) => {
|
|
39
39
|
if (client && isClient(client)) return wrapClaudeAgentSDK(client, maybeOptions);
|
|
40
40
|
return false;
|
|
@@ -57,7 +57,7 @@ function buildPatchedQuery(original, options) {
|
|
|
57
57
|
const boundOriginal = (p, o) => original.call(this, p, o);
|
|
58
58
|
const model = (callOptions && typeof callOptions.model === "string" ? callOptions.model : void 0) ?? defaultModel;
|
|
59
59
|
async function* iterateInTrace2() {
|
|
60
|
-
const handle =
|
|
60
|
+
const handle = chunk52JTU4LH_cjs.emitAgentSpan({
|
|
61
61
|
adapter: "anthropic-agent-sdk",
|
|
62
62
|
agentName: defaultAgentName,
|
|
63
63
|
model
|
|
@@ -80,7 +80,7 @@ function buildPatchedQuery(original, options) {
|
|
|
80
80
|
}
|
|
81
81
|
handle?.end();
|
|
82
82
|
}
|
|
83
|
-
if (
|
|
83
|
+
if (chunk6BNMYEMW_cjs.getActiveTraceState() !== null) {
|
|
84
84
|
return iterateInTrace2();
|
|
85
85
|
}
|
|
86
86
|
return (async function* outerTrace() {
|
|
@@ -96,7 +96,7 @@ function buildPatchedQuery(original, options) {
|
|
|
96
96
|
};
|
|
97
97
|
}
|
|
98
98
|
});
|
|
99
|
-
const runPromise =
|
|
99
|
+
const runPromise = chunk6BNMYEMW_cjs.runAsync({ agentName: defaultAgentName }, async (runHandle) => {
|
|
100
100
|
try {
|
|
101
101
|
for await (const event of iterateInTrace2()) {
|
|
102
102
|
queue.push({ kind: "value", value: event });
|
|
@@ -132,10 +132,10 @@ function buildPatchedQuery(original, options) {
|
|
|
132
132
|
}
|
|
133
133
|
|
|
134
134
|
// src/_agent-sdk-common/context-propagation.ts
|
|
135
|
-
|
|
136
|
-
var captureParentForFanOut =
|
|
135
|
+
chunk6BNMYEMW_cjs.init_tracing();
|
|
136
|
+
var captureParentForFanOut = chunk4CMVMTFB_cjs.absorbErrorsSync(
|
|
137
137
|
() => {
|
|
138
|
-
const state =
|
|
138
|
+
const state = chunk6BNMYEMW_cjs.getActiveTraceState();
|
|
139
139
|
if (state === null) return null;
|
|
140
140
|
const top = state.spanStack[state.spanStack.length - 1];
|
|
141
141
|
if (!top) return null;
|
|
@@ -146,13 +146,13 @@ var captureParentForFanOut = chunk6YPVIGD2_cjs.absorbErrorsSync(
|
|
|
146
146
|
},
|
|
147
147
|
{ fingerprint: "agent-sdk-common.captureParentForFanOut" }
|
|
148
148
|
);
|
|
149
|
-
var emitWithPinnedParent =
|
|
149
|
+
var emitWithPinnedParent = chunk4CMVMTFB_cjs.absorbErrorsSync(
|
|
150
150
|
(opts) => {
|
|
151
|
-
const state =
|
|
151
|
+
const state = chunk6BNMYEMW_cjs.getActiveTraceState();
|
|
152
152
|
if (state === null) return null;
|
|
153
153
|
const snap = opts.snapshot;
|
|
154
154
|
if (!snap || snap.traceId !== state.traceId) return null;
|
|
155
|
-
const handle =
|
|
155
|
+
const handle = chunk6BNMYEMW_cjs.startSpan({
|
|
156
156
|
name: opts.name,
|
|
157
157
|
type: opts.type,
|
|
158
158
|
metadata: opts.metadata
|
|
@@ -174,13 +174,13 @@ function findSpanById(state, spanId) {
|
|
|
174
174
|
}
|
|
175
175
|
return void 0;
|
|
176
176
|
}
|
|
177
|
-
var emitAsToolSibling =
|
|
177
|
+
var emitAsToolSibling = chunk4CMVMTFB_cjs.absorbErrorsSync(
|
|
178
178
|
(opts) => {
|
|
179
|
-
const state =
|
|
179
|
+
const state = chunk6BNMYEMW_cjs.getActiveTraceState();
|
|
180
180
|
if (state === null) return null;
|
|
181
181
|
const tool = findSpanById(state, opts.toolSpanId);
|
|
182
182
|
if (!tool) return null;
|
|
183
|
-
const handle =
|
|
183
|
+
const handle = chunk6BNMYEMW_cjs.startSpan({
|
|
184
184
|
name: opts.name,
|
|
185
185
|
type: opts.type,
|
|
186
186
|
metadata: opts.metadata
|
|
@@ -191,9 +191,9 @@ var emitAsToolSibling = chunk6YPVIGD2_cjs.absorbErrorsSync(
|
|
|
191
191
|
},
|
|
192
192
|
{ fingerprint: "agent-sdk-common.emitAsToolSibling" }
|
|
193
193
|
);
|
|
194
|
-
|
|
194
|
+
chunk4CMVMTFB_cjs.absorbErrorsSync(
|
|
195
195
|
() => {
|
|
196
|
-
const state =
|
|
196
|
+
const state = chunk6BNMYEMW_cjs.getActiveTraceState();
|
|
197
197
|
if (state === null) return null;
|
|
198
198
|
return {
|
|
199
199
|
traceId: state.traceId,
|
|
@@ -238,7 +238,7 @@ var _handleHookEvent = (payload, options) => {
|
|
|
238
238
|
return;
|
|
239
239
|
}
|
|
240
240
|
}
|
|
241
|
-
const fallback =
|
|
241
|
+
const fallback = chunk52JTU4LH_cjs.emitHookSpan({
|
|
242
242
|
adapter: "anthropic-agent-sdk",
|
|
243
243
|
hookName: name,
|
|
244
244
|
hookKind: kind,
|
|
@@ -248,7 +248,7 @@ var _handleHookEvent = (payload, options) => {
|
|
|
248
248
|
fallback.end();
|
|
249
249
|
}
|
|
250
250
|
};
|
|
251
|
-
var handleHookEvent =
|
|
251
|
+
var handleHookEvent = chunk4CMVMTFB_cjs.absorbErrorsSync(_handleHookEvent, {
|
|
252
252
|
fingerprint: "morse.anthropic-agent-sdk.hook-instrumentation.handle"
|
|
253
253
|
});
|
|
254
254
|
function installHookInstrumentation(client, options) {
|
|
@@ -276,7 +276,7 @@ function installHookInstrumentation(client, options) {
|
|
|
276
276
|
}
|
|
277
277
|
|
|
278
278
|
// src/anthropic-agent-sdk/llm-instrumentation.ts
|
|
279
|
-
|
|
279
|
+
chunk6BNMYEMW_cjs.init_diagnostics();
|
|
280
280
|
function readInputTokens(usage) {
|
|
281
281
|
if (usage === void 0 || usage === null || typeof usage !== "object") return void 0;
|
|
282
282
|
const base = typeof usage.input_tokens === "number" && Number.isFinite(usage.input_tokens) ? usage.input_tokens : 0;
|
|
@@ -343,7 +343,7 @@ async function* instrumentLlmCalls(events, options) {
|
|
|
343
343
|
const reportedModel = typeof event.message?.model === "string" && event.message.model.length > 0 ? event.message.model : void 0;
|
|
344
344
|
const model = reportedModel ?? fallbackModel;
|
|
345
345
|
if (!model) return;
|
|
346
|
-
const handle =
|
|
346
|
+
const handle = chunk52JTU4LH_cjs.emitLlmSpan({ adapter: "anthropic-agent-sdk", model });
|
|
347
347
|
if (!handle) return;
|
|
348
348
|
const usage = event.message?.usage;
|
|
349
349
|
const inputTokens = readInputTokens(usage);
|
|
@@ -360,7 +360,7 @@ async function* instrumentLlmCalls(events, options) {
|
|
|
360
360
|
applyCost(handle, model, inputTokens, outputTokens, cacheWriteTokens, cachedInputTokens);
|
|
361
361
|
if (requestParams !== void 0) {
|
|
362
362
|
try {
|
|
363
|
-
const segments =
|
|
363
|
+
const segments = chunkELQ4LGAS_cjs.extractAnthropicSegments(
|
|
364
364
|
requestParams,
|
|
365
365
|
event.message
|
|
366
366
|
);
|
|
@@ -383,7 +383,7 @@ async function* instrumentLlmCalls(events, options) {
|
|
|
383
383
|
if (model === void 0 || model.length === 0) {
|
|
384
384
|
return;
|
|
385
385
|
}
|
|
386
|
-
openSpan =
|
|
386
|
+
openSpan = chunk52JTU4LH_cjs.emitLlmSpan({
|
|
387
387
|
adapter: "anthropic-agent-sdk",
|
|
388
388
|
model
|
|
389
389
|
});
|
|
@@ -425,7 +425,7 @@ async function* instrumentLlmCalls(events, options) {
|
|
|
425
425
|
}
|
|
426
426
|
if (requestParams !== void 0) {
|
|
427
427
|
try {
|
|
428
|
-
const segments =
|
|
428
|
+
const segments = chunkELQ4LGAS_cjs.extractAnthropicSegments(
|
|
429
429
|
requestParams,
|
|
430
430
|
event.message
|
|
431
431
|
);
|
|
@@ -453,13 +453,13 @@ async function* instrumentLlmCalls(events, options) {
|
|
|
453
453
|
}
|
|
454
454
|
function reportSwallowed(err, fingerprint) {
|
|
455
455
|
try {
|
|
456
|
-
|
|
456
|
+
chunk6BNMYEMW_cjs.report(err, { fingerprint });
|
|
457
457
|
} catch {
|
|
458
458
|
}
|
|
459
459
|
}
|
|
460
460
|
|
|
461
461
|
// src/anthropic-agent-sdk/tool-and-subagent.ts
|
|
462
|
-
|
|
462
|
+
chunk6BNMYEMW_cjs.init_diagnostics();
|
|
463
463
|
var ADAPTER = "anthropic-agent-sdk";
|
|
464
464
|
var TASK_TOOL_NAME = "Task";
|
|
465
465
|
function safeCloseFailed(handle, message) {
|
|
@@ -505,7 +505,7 @@ async function* instrumentTools(events, options) {
|
|
|
505
505
|
tool_use_id: toolUseId
|
|
506
506
|
};
|
|
507
507
|
if (taskPrompt !== void 0) {
|
|
508
|
-
metadata.task_description =
|
|
508
|
+
metadata.task_description = chunkBIP66M44_cjs.summarizeToolInput(taskPrompt, inputOpts);
|
|
509
509
|
}
|
|
510
510
|
let handle2 = null;
|
|
511
511
|
try {
|
|
@@ -527,10 +527,10 @@ async function* instrumentTools(events, options) {
|
|
|
527
527
|
}
|
|
528
528
|
let handle = null;
|
|
529
529
|
try {
|
|
530
|
-
handle =
|
|
530
|
+
handle = chunk52JTU4LH_cjs.emitToolSpan({
|
|
531
531
|
adapter: ADAPTER,
|
|
532
532
|
toolName: name,
|
|
533
|
-
inputSummary:
|
|
533
|
+
inputSummary: chunkBIP66M44_cjs.summarizeToolInput(event.input, inputOpts),
|
|
534
534
|
attributes: { tool_use_id: toolUseId }
|
|
535
535
|
});
|
|
536
536
|
} catch {
|
|
@@ -547,7 +547,7 @@ async function* instrumentTools(events, options) {
|
|
|
547
547
|
open.delete(toolUseId);
|
|
548
548
|
const isError = event.is_error === true;
|
|
549
549
|
try {
|
|
550
|
-
const outputSummary =
|
|
550
|
+
const outputSummary = chunkBIP66M44_cjs.summarizeToolOutput(event.content, outputOpts);
|
|
551
551
|
entry.handle.span.metadata = {
|
|
552
552
|
...entry.handle.span.metadata ?? {},
|
|
553
553
|
tool_output_summary: outputSummary
|
|
@@ -619,15 +619,15 @@ async function* instrumentTools(events, options) {
|
|
|
619
619
|
}
|
|
620
620
|
function reportSwallowed2(err, fingerprint) {
|
|
621
621
|
try {
|
|
622
|
-
|
|
622
|
+
chunk6BNMYEMW_cjs.report(err, { fingerprint });
|
|
623
623
|
} catch {
|
|
624
624
|
}
|
|
625
625
|
}
|
|
626
626
|
|
|
627
627
|
// src/anthropic-agent-sdk/trace-bridge.ts
|
|
628
|
-
|
|
628
|
+
chunk6BNMYEMW_cjs.init_tracing();
|
|
629
629
|
function iterateInTrace(agentName, makeGenerator) {
|
|
630
|
-
if (
|
|
630
|
+
if (chunk6BNMYEMW_cjs.getActiveTraceState() !== null) {
|
|
631
631
|
return makeGenerator();
|
|
632
632
|
}
|
|
633
633
|
return (async function* outerTrace() {
|
|
@@ -643,7 +643,7 @@ function iterateInTrace(agentName, makeGenerator) {
|
|
|
643
643
|
};
|
|
644
644
|
}
|
|
645
645
|
});
|
|
646
|
-
const runPromise =
|
|
646
|
+
const runPromise = chunk6BNMYEMW_cjs.runAsync({ agentName }, async (runHandle) => {
|
|
647
647
|
try {
|
|
648
648
|
for await (const event of makeGenerator()) {
|
|
649
649
|
queue.push({ kind: "value", value: event });
|
|
@@ -692,7 +692,7 @@ function wrapClaudeAgentQuery(query, options = {}) {
|
|
|
692
692
|
async function* withAgentSpan() {
|
|
693
693
|
if (!opened) {
|
|
694
694
|
opened = true;
|
|
695
|
-
handle =
|
|
695
|
+
handle = chunk52JTU4LH_cjs.emitAgentSpan({
|
|
696
696
|
adapter: "anthropic-agent-sdk",
|
|
697
697
|
agentName: options.defaultAgentName ?? "claude-agent-sdk",
|
|
698
698
|
model
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { extractAnthropicSegments } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
3
|
-
import { summarizeToolInput, summarizeToolOutput } from '../chunk-
|
|
4
|
-
import { emitHookSpan, emitAgentSpan, emitLlmSpan, emitToolSpan } from '../chunk-
|
|
5
|
-
import { absorbErrorsAsync, absorbErrorsSync } from '../chunk-
|
|
1
|
+
import { extractAnthropicSegments } from '../chunk-KZFG23MO.js';
|
|
2
|
+
import '../chunk-VIOT3AOP.js';
|
|
3
|
+
import { summarizeToolInput, summarizeToolOutput } from '../chunk-NU74H55W.js';
|
|
4
|
+
import { emitHookSpan, emitAgentSpan, emitLlmSpan, emitToolSpan } from '../chunk-YYUDZTHI.js';
|
|
5
|
+
import { absorbErrorsAsync, absorbErrorsSync } from '../chunk-T6Z6UIBN.js';
|
|
6
6
|
import { calculateCost } from '../chunk-4FALQMOZ.js';
|
|
7
7
|
import '../chunk-MLDVXMQD.js';
|
|
8
|
-
import { init_tracing, getActiveTraceState, startSpan, init_diagnostics, runAsync, report } from '../chunk-
|
|
8
|
+
import { init_tracing, getActiveTraceState, startSpan, init_diagnostics, runAsync, report } from '../chunk-6T6ZPOKZ.js';
|
|
9
9
|
|
|
10
10
|
// src/anthropic-agent-sdk/client-wrapper.ts
|
|
11
11
|
init_tracing();
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
3
|
+
var chunk4CMVMTFB_cjs = require('./chunk-4CMVMTFB.cjs');
|
|
4
|
+
var chunk6BNMYEMW_cjs = require('./chunk-6BNMYEMW.cjs');
|
|
5
5
|
|
|
6
6
|
// src/log.ts
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
chunk6BNMYEMW_cjs.init_redaction();
|
|
8
|
+
chunk6BNMYEMW_cjs.init_tracing();
|
|
9
9
|
var DEFAULT_SERVICE_NAME = "morse-sdk-ts";
|
|
10
10
|
var ensureInitialized = () => {
|
|
11
11
|
};
|
|
@@ -14,14 +14,14 @@ function _setEnsureInitialized(fn) {
|
|
|
14
14
|
}
|
|
15
15
|
function logImpl(message, options = {}) {
|
|
16
16
|
ensureInitialized();
|
|
17
|
-
const transport =
|
|
17
|
+
const transport = chunk6BNMYEMW_cjs.getTransport();
|
|
18
18
|
if (transport === null) {
|
|
19
19
|
return;
|
|
20
20
|
}
|
|
21
21
|
let traceId = options.traceId ?? null;
|
|
22
22
|
let spanId = options.spanId ?? null;
|
|
23
23
|
if (traceId === null || spanId === null) {
|
|
24
|
-
const state =
|
|
24
|
+
const state = chunk6BNMYEMW_cjs.getActiveTraceState();
|
|
25
25
|
if (state !== null) {
|
|
26
26
|
if (traceId === null) traceId = state.traceId;
|
|
27
27
|
if (spanId === null && state.spanStack.length > 0) {
|
|
@@ -31,10 +31,10 @@ function logImpl(message, options = {}) {
|
|
|
31
31
|
}
|
|
32
32
|
const severity = (options.severity ?? "info").toUpperCase();
|
|
33
33
|
const serviceName = options.serviceName ?? DEFAULT_SERVICE_NAME;
|
|
34
|
-
const config =
|
|
34
|
+
const config = chunk6BNMYEMW_cjs.getRedactionConfig();
|
|
35
35
|
const rawAttributes = options.attributes ?? {};
|
|
36
|
-
const redactedAttributes = config.enabled ?
|
|
37
|
-
const redactedBody = config.enabled ?
|
|
36
|
+
const redactedAttributes = config.enabled ? chunk6BNMYEMW_cjs.redactValue(rawAttributes, config) : rawAttributes;
|
|
37
|
+
const redactedBody = config.enabled ? chunk6BNMYEMW_cjs.redactValue(String(message), config) : String(message);
|
|
38
38
|
const record = {
|
|
39
39
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
40
40
|
severity,
|
|
@@ -46,11 +46,11 @@ function logImpl(message, options = {}) {
|
|
|
46
46
|
};
|
|
47
47
|
transport.track({ logs: [record] });
|
|
48
48
|
}
|
|
49
|
-
var log =
|
|
49
|
+
var log = chunk4CMVMTFB_cjs.absorbErrorsSync(logImpl, {
|
|
50
50
|
fingerprint: "morse.log"
|
|
51
51
|
});
|
|
52
52
|
|
|
53
53
|
exports._setEnsureInitialized = _setEnsureInitialized;
|
|
54
54
|
exports.log = log;
|
|
55
|
-
//# sourceMappingURL=chunk-
|
|
56
|
-
//# sourceMappingURL=chunk-
|
|
55
|
+
//# sourceMappingURL=chunk-2X64OY2L.cjs.map
|
|
56
|
+
//# sourceMappingURL=chunk-2X64OY2L.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/log.ts"],"names":["init_redaction","init_tracing","getTransport","getActiveTraceState","getRedactionConfig","redactValue","absorbErrorsSync"],"mappings":";;;;;;AA8BAA,gCAAA,EAAA;AACAC,8BAAA,EAAA;AA2BA,IAAM,oBAAA,GAAuB,cAAA;AAS7B,IAAI,oBAAgC,MAAM;AAE1C,CAAA;AAGO,SAAS,sBAAsB,EAAA,EAAsB;AAC1D,EAAA,iBAAA,GAAoB,EAAA;AACtB;AAEA,SAAS,OAAA,CAAQ,OAAA,EAAiB,OAAA,GAAsB,EAAC,EAAS;AAGhE,EAAA,iBAAA,EAAkB;AAClB,EAAA,MAAM,YAAkCC,8BAAA,EAAa;AACrD,EAAA,IAAI,cAAc,IAAA,EAAM;AAGtB,IAAA;AAAA,EACF;AAMA,EAAA,IAAI,OAAA,GAAyB,QAAQ,OAAA,IAAW,IAAA;AAChD,EAAA,IAAI,MAAA,GAAwB,QAAQ,MAAA,IAAU,IAAA;AAC9C,EAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,MAAA,KAAW,IAAA,EAAM;AACvC,IAAA,MAAM,QAAQC,qCAAA,EAAoB;AAClC,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAA,IAAI,OAAA,KAAY,IAAA,EAAM,OAAA,GAAU,KAAA,CAAM,OAAA;AACtC,MAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,KAAA,CAAM,SAAA,CAAU,SAAS,CAAA,EAAG;AACjD,QAAA,MAAA,GAAS,MAAM,SAAA,CAAU,KAAA,CAAM,SAAA,CAAU,MAAA,GAAS,CAAC,CAAA,CAAG,OAAA;AAAA,MACxD;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAA,CAAY,OAAA,CAAQ,QAAA,IAAY,MAAA,EAAQ,WAAA,EAAY;AAC1D,EAAA,MAAM,WAAA,GAAc,QAAQ,WAAA,IAAe,oBAAA;AAK3C,EAAA,MAAM,SAASC,oCAAA,EAAmB;AAClC,EAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,UAAA,IAAc,EAAC;AAC7C,EAAA,MAAM,qBAAqB,MAAA,CAAO,OAAA,GAC7BC,6BAAA,CAAY,aAAA,EAAe,MAAM,CAAA,GAClC,aAAA;AACJ,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,OAAA,GACvBA,6BAAA,CAAY,MAAA,CAAO,OAAO,CAAA,EAAG,MAAM,CAAA,GACpC,MAAA,CAAO,OAAO,CAAA;AAElB,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IAClC,QAAA;AAAA,IACA,YAAA,EAAc,WAAA;AAAA,IACd,IAAA,EAAM,YAAA;AAAA,IACN,UAAA,EAAY,kBAAA;AAAA,IACZ,QAAA,EAAU,OAAA;AAAA,IACV,OAAA,EAAS;AAAA,GACX;AAEA,EAAA,SAAA,CAAU,MAAM,EAAE,IAAA,EAAM,CAAC,MAAM,GAAG,CAAA;AACpC;AAmCO,IAAM,GAAA,GAAMC,mCAAiB,OAAA,EAAS;AAAA,EAC3C,WAAA,EAAa;AACf,CAAC","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../../src/log.ts"],"names":["init_redaction","init_tracing","getTransport","getActiveTraceState","getRedactionConfig","redactValue","absorbErrorsSync"],"mappings":";;;;;;AA8BAA,gCAAA,EAAA;AACAC,8BAAA,EAAA;AA2BA,IAAM,oBAAA,GAAuB,cAAA;AAS7B,IAAI,oBAAgC,MAAM;AAE1C,CAAA;AAGO,SAAS,sBAAsB,EAAA,EAAsB;AAC1D,EAAA,iBAAA,GAAoB,EAAA;AACtB;AAEA,SAAS,OAAA,CAAQ,OAAA,EAAiB,OAAA,GAAsB,EAAC,EAAS;AAGhE,EAAA,iBAAA,EAAkB;AAClB,EAAA,MAAM,YAAkCC,8BAAA,EAAa;AACrD,EAAA,IAAI,cAAc,IAAA,EAAM;AAGtB,IAAA;AAAA,EACF;AAMA,EAAA,IAAI,OAAA,GAAyB,QAAQ,OAAA,IAAW,IAAA;AAChD,EAAA,IAAI,MAAA,GAAwB,QAAQ,MAAA,IAAU,IAAA;AAC9C,EAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,MAAA,KAAW,IAAA,EAAM;AACvC,IAAA,MAAM,QAAQC,qCAAA,EAAoB;AAClC,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAA,IAAI,OAAA,KAAY,IAAA,EAAM,OAAA,GAAU,KAAA,CAAM,OAAA;AACtC,MAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,KAAA,CAAM,SAAA,CAAU,SAAS,CAAA,EAAG;AACjD,QAAA,MAAA,GAAS,MAAM,SAAA,CAAU,KAAA,CAAM,SAAA,CAAU,MAAA,GAAS,CAAC,CAAA,CAAG,OAAA;AAAA,MACxD;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAA,CAAY,OAAA,CAAQ,QAAA,IAAY,MAAA,EAAQ,WAAA,EAAY;AAC1D,EAAA,MAAM,WAAA,GAAc,QAAQ,WAAA,IAAe,oBAAA;AAK3C,EAAA,MAAM,SAASC,oCAAA,EAAmB;AAClC,EAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,UAAA,IAAc,EAAC;AAC7C,EAAA,MAAM,qBAAqB,MAAA,CAAO,OAAA,GAC7BC,6BAAA,CAAY,aAAA,EAAe,MAAM,CAAA,GAClC,aAAA;AACJ,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,OAAA,GACvBA,6BAAA,CAAY,MAAA,CAAO,OAAO,CAAA,EAAG,MAAM,CAAA,GACpC,MAAA,CAAO,OAAO,CAAA;AAElB,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IAClC,QAAA;AAAA,IACA,YAAA,EAAc,WAAA;AAAA,IACd,IAAA,EAAM,YAAA;AAAA,IACN,UAAA,EAAY,kBAAA;AAAA,IACZ,QAAA,EAAU,OAAA;AAAA,IACV,OAAA,EAAS;AAAA,GACX;AAEA,EAAA,SAAA,CAAU,MAAM,EAAE,IAAA,EAAM,CAAC,MAAM,GAAG,CAAA;AACpC;AAmCO,IAAM,GAAA,GAAMC,mCAAiB,OAAA,EAAS;AAAA,EAC3C,WAAA,EAAa;AACf,CAAC","file":"chunk-2X64OY2L.cjs","sourcesContent":["/**\n * Phase 12.5 Tier 1.2 — TypeScript SDK `log()` export.\n *\n * Closes the TS side of Feature #4 \"Gap A\": before this module, customers\n * using the TS SDK had no way to populate the Logs tab of a trace's\n * Correlation panel without standing up their own OTel collector. The\n * Python SDK already had `morse.log(...)` (AGE-240); this is the\n * cross-language peer.\n *\n * Semantics mirror Python's `morse.log()`\n * (`apps/sdk/python/src/morse/__init__.py:360-411`):\n *\n * - Default severity: \"info\" (case-normalised to upper on the wire).\n * - Default service_name: \"morse-sdk-ts\" (overridable).\n * - Auto-reads the active trace_id + span_id from the SDK's existing\n * `node:async_hooks.AsyncLocalStorage` context (re-uses\n * `getActiveTraceState()` — the same primitive `run()`/`span()` use).\n * - Batched: the record is enqueued on the existing `BatchTransport`,\n * which flushes it to `/api/v1/logs/ingest` (derived from the traces\n * batch endpoint) on the next tick. NO synchronous fetch per call.\n * - Internal errors are absorbed via `absorbErrorsSync` so they never\n * propagate into the customer's logging call. Mirrors the Python\n * `@absorb_errors` decorator pattern.\n *\n * Wire shape: `{ logs: [{ timestamp, severity, service_name, body,\n * attributes, trace_id, span_id }] }`. See `apps/api/apps/logs/\n * controllers.py:66-134` for the API contract.\n */\n\nimport { absorbErrorsSync } from \"./_internal/errors\";\nimport { redactValue } from \"./_internal/redaction\";\nimport {\n getActiveTraceState,\n getRedactionConfig,\n getTransport,\n type TransportLike,\n} from \"./_internal/tracing\";\n\n/** Log severity — case-insensitive on input, upper-cased on the wire. */\nexport type LogSeverity = \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"fatal\";\n\n/** Options accepted by `log()`. */\nexport interface LogOptions {\n /** Default: `\"info\"`. Upper-cased server-side. */\n severity?: LogSeverity;\n /** Free-form structured fields persisted on the record. */\n attributes?: Record<string, unknown>;\n /**\n * Override the auto-detected trace_id. Use only when emitting on\n * behalf of a known external trace (rare).\n */\n traceId?: string;\n /** Override the auto-detected span_id. Same caveat as `traceId`. */\n spanId?: string;\n /** Logical service tag. Default: `\"morse-sdk-ts\"`. */\n serviceName?: string;\n}\n\nconst DEFAULT_SERVICE_NAME = \"morse-sdk-ts\";\n\n/**\n * Lazy-init hook injected by `index.ts`. Allows `log()` to participate\n * in env-driven auto-init (matching the behaviour of `track()` /\n * `record()`) without `log.ts` reaching into the singleton state.\n *\n * @internal\n */\nlet ensureInitialized: () => void = () => {\n /* default no-op; replaced from index.ts */\n};\n\n/** @internal */\nexport function _setEnsureInitialized(fn: () => void): void {\n ensureInitialized = fn;\n}\n\nfunction logImpl(message: string, options: LogOptions = {}): void {\n // Match Python semantics: env-driven auto-init kicks in if the SDK\n // hasn't been explicitly init()'d yet but MORSE_API_KEY is set.\n ensureInitialized();\n const transport: TransportLike | null = getTransport();\n if (transport === null) {\n // SDK not initialised — silent no-op. Matches Python behaviour\n // (`_ensure_initialized()` short-circuit).\n return;\n }\n\n // Auto-pull trace + span IDs from the active context. Re-uses the\n // exact same context primitive that `track()` / `run()` / `span()`\n // use, so a `log()` call inside an `await run(...)` callback will\n // see the active trace's IDs.\n let traceId: string | null = options.traceId ?? null;\n let spanId: string | null = options.spanId ?? null;\n if (traceId === null || spanId === null) {\n const state = getActiveTraceState();\n if (state !== null) {\n if (traceId === null) traceId = state.traceId;\n if (spanId === null && state.spanStack.length > 0) {\n spanId = state.spanStack[state.spanStack.length - 1]!.span_id;\n }\n }\n }\n\n const severity = (options.severity ?? \"info\").toUpperCase();\n const serviceName = options.serviceName ?? DEFAULT_SERVICE_NAME;\n\n // PII redaction reuses the trace path's allow-list config. Mirrors\n // the Python client's `self._redaction_config.redact_value(payload)`\n // call.\n const config = getRedactionConfig();\n const rawAttributes = options.attributes ?? {};\n const redactedAttributes = config.enabled\n ? (redactValue(rawAttributes, config) as Record<string, unknown>)\n : rawAttributes;\n const redactedBody = config.enabled\n ? (redactValue(String(message), config) as string)\n : String(message);\n\n const record = {\n timestamp: new Date().toISOString(),\n severity,\n service_name: serviceName,\n body: redactedBody,\n attributes: redactedAttributes,\n trace_id: traceId,\n span_id: spanId,\n };\n\n transport.track({ logs: [record] });\n}\n\n/**\n * Emit a log record correlated to the current trace context.\n *\n * Auto-correlates to the surrounding `morse.run()` /\n * `morse.span()` if one is active. Inside a trace, the record's\n * `trace_id` + `span_id` are filled in from `AsyncLocalStorage`;\n * outside a trace, both fields are `null` and the record is still\n * accepted by the backend (it surfaces in the service-wide Logs view\n * but not on any individual trace's Correlation panel).\n *\n * Non-blocking. Batched alongside trace events on the existing\n * transport — flushes at the SDK's configured interval (default 2s).\n * Internal errors are absorbed; this call never throws.\n *\n * Silent no-op when the SDK isn't initialised (no `MORSE_API_KEY`\n * and no explicit `init()` call).\n *\n * @example\n * ```ts\n * import { init, runTraced, log } from \"@morsehq-dev/sdk\";\n *\n * init({ apiKey: process.env.MORSE_API_KEY });\n *\n * await runTraced({ agentName: \"lead-qualifier\" }, async () => {\n * log(\"starting search\", { attributes: { query: \"morse\" } });\n * const results = await search();\n * log(\"search complete\", {\n * severity: \"info\",\n * attributes: { result_count: results.length },\n * });\n * });\n * ```\n */\nexport const log = absorbErrorsSync(logImpl, {\n fingerprint: \"morse.log\",\n});\n"]}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunk6BNMYEMW_cjs = require('./chunk-6BNMYEMW.cjs');
|
|
4
4
|
|
|
5
5
|
// src/_internal/errors.ts
|
|
6
|
-
|
|
6
|
+
chunk6BNMYEMW_cjs.init_diagnostics();
|
|
7
7
|
function absorbErrorsSync(fn, options) {
|
|
8
8
|
return (...args) => {
|
|
9
9
|
try {
|
|
10
10
|
return fn(...args);
|
|
11
11
|
} catch (err) {
|
|
12
|
-
|
|
12
|
+
chunk6BNMYEMW_cjs.report(err, options);
|
|
13
13
|
return void 0;
|
|
14
14
|
}
|
|
15
15
|
};
|
|
@@ -19,7 +19,7 @@ function absorbErrorsAsync(fn, options) {
|
|
|
19
19
|
try {
|
|
20
20
|
return await fn(...args);
|
|
21
21
|
} catch (err) {
|
|
22
|
-
|
|
22
|
+
chunk6BNMYEMW_cjs.report(err, options);
|
|
23
23
|
return void 0;
|
|
24
24
|
}
|
|
25
25
|
};
|
|
@@ -27,5 +27,5 @@ function absorbErrorsAsync(fn, options) {
|
|
|
27
27
|
|
|
28
28
|
exports.absorbErrorsAsync = absorbErrorsAsync;
|
|
29
29
|
exports.absorbErrorsSync = absorbErrorsSync;
|
|
30
|
-
//# sourceMappingURL=chunk-
|
|
31
|
-
//# sourceMappingURL=chunk-
|
|
30
|
+
//# sourceMappingURL=chunk-4CMVMTFB.cjs.map
|
|
31
|
+
//# sourceMappingURL=chunk-4CMVMTFB.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/_internal/errors.ts"],"names":["init_diagnostics","report"],"mappings":";;;;;AAsBAA,kCAAA,EAAA;AAiBO,SAAS,gBAAA,CACd,IACA,OAAA,EACyC;AACzC,EAAA,OAAO,IAAI,IAAA,KAAqC;AAC9C,IAAA,IAAI;AACF,MAAA,OAAO,EAAA,CAAG,GAAG,IAAI,CAAA;AAAA,IACnB,SAAS,GAAA,EAAK;AACZ,MAAAC,wBAAA,CAAO,KAAK,OAAO,CAAA;AACnB,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF,CAAA;AACF;AAOO,SAAS,iBAAA,CACd,IACA,OAAA,EACkD;AAClD,EAAA,OAAO,UAAU,IAAA,KAA8C;AAC7D,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,EAAA,CAAG,GAAG,IAAI,CAAA;AAAA,IACzB,SAAS,GAAA,EAAK;AACZ,MAAAA,wBAAA,CAAO,KAAK,OAAO,CAAA;AACnB,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF,CAAA;AACF","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../../src/_internal/errors.ts"],"names":["init_diagnostics","report"],"mappings":";;;;;AAsBAA,kCAAA,EAAA;AAiBO,SAAS,gBAAA,CACd,IACA,OAAA,EACyC;AACzC,EAAA,OAAO,IAAI,IAAA,KAAqC;AAC9C,IAAA,IAAI;AACF,MAAA,OAAO,EAAA,CAAG,GAAG,IAAI,CAAA;AAAA,IACnB,SAAS,GAAA,EAAK;AACZ,MAAAC,wBAAA,CAAO,KAAK,OAAO,CAAA;AACnB,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF,CAAA;AACF;AAOO,SAAS,iBAAA,CACd,IACA,OAAA,EACkD;AAClD,EAAA,OAAO,UAAU,IAAA,KAA8C;AAC7D,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,EAAA,CAAG,GAAG,IAAI,CAAA;AAAA,IACzB,SAAS,GAAA,EAAK;AACZ,MAAAA,wBAAA,CAAO,KAAK,OAAO,CAAA;AACnB,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF,CAAA;AACF","file":"chunk-4CMVMTFB.cjs","sourcesContent":["/**\n * Non-invasive error isolation — the foundational SDK guarantee.\n *\n * Mirrors Python's `_internal/errors.py` `@absorb_errors` decorator. Every\n * public SDK function and every adapter-installed wrapper is wrapped with\n * `absorbErrors()`. The wrapper catches all exceptions and reports them\n * out-of-band to Morse's own diagnostics endpoint, then returns a benign value\n * (typically `undefined`) instead of propagating.\n *\n * Foundational principle:\n *\n * Telemetry must never break the host application.\n *\n * The customer's call returns its original result (or `undefined`)\n * regardless of whether the SDK's recording path succeeded.\n *\n * Note on async: TypeScript-land has no `KeyboardInterrupt` equivalent —\n * the analogue is \"no exceptions are special\". We absorb everything,\n * and rely on Node's `process.exit` / browser navigation to tear down\n * the runtime cleanly.\n */\n\nimport { report } from \"./diagnostics\";\n\nexport interface AbsorbErrorsOptions {\n /**\n * Stable identifier for grouping. Used for server-side grouping and\n * the rate limiter (max 100 events per fingerprint per minute).\n */\n fingerprint: string;\n /** Optional metadata attached to the report; scrubbed against an allow-list. */\n extra?: Record<string, unknown>;\n}\n\n/**\n * Wrap a synchronous function so that any thrown exception is absorbed\n * (reported out-of-band) instead of propagating. Returns `undefined` on\n * absorbed error.\n */\nexport function absorbErrorsSync<TArgs extends unknown[], TReturn>(\n fn: (...args: TArgs) => TReturn,\n options: AbsorbErrorsOptions,\n): (...args: TArgs) => TReturn | undefined {\n return (...args: TArgs): TReturn | undefined => {\n try {\n return fn(...args);\n } catch (err) {\n report(err, options);\n return undefined;\n }\n };\n}\n\n/**\n * Wrap an async function so that any rejection or thrown exception is\n * absorbed (reported out-of-band) instead of propagating. Returns\n * `undefined` on absorbed error.\n */\nexport function absorbErrorsAsync<TArgs extends unknown[], TReturn>(\n fn: (...args: TArgs) => Promise<TReturn>,\n options: AbsorbErrorsOptions,\n): (...args: TArgs) => Promise<TReturn | undefined> {\n return async (...args: TArgs): Promise<TReturn | undefined> => {\n try {\n return await fn(...args);\n } catch (err) {\n report(err, options);\n return undefined;\n }\n };\n}\n\n/**\n * Higher-order alias chosen to read like the Python decorator: pass a\n * function in, get a wrapped version back. Resolves to the sync or async\n * variant based on the runtime return value (a Promise). Defaults to\n * sync at the type level; use `absorbErrorsAsync` directly for proper\n * async typing.\n */\nexport const absorbErrors = absorbErrorsSync;\n"]}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
3
|
+
var chunk4CMVMTFB_cjs = require('./chunk-4CMVMTFB.cjs');
|
|
4
|
+
var chunk6BNMYEMW_cjs = require('./chunk-6BNMYEMW.cjs');
|
|
5
5
|
|
|
6
6
|
// src/_agent-sdk-common/span-emitter.ts
|
|
7
|
-
|
|
7
|
+
chunk6BNMYEMW_cjs.init_tracing();
|
|
8
8
|
var MAX_NAME_BYTES = 256;
|
|
9
9
|
var MAX_DESCRIPTION_BYTES = 2048;
|
|
10
10
|
function truncate(value, maxBytes) {
|
|
@@ -25,7 +25,7 @@ var _emitAgentSpan = (opts) => {
|
|
|
25
25
|
adapter,
|
|
26
26
|
agent_name: agentName
|
|
27
27
|
};
|
|
28
|
-
const handle =
|
|
28
|
+
const handle = chunk6BNMYEMW_cjs.startSpan({
|
|
29
29
|
name: `${adapter}.agent`,
|
|
30
30
|
type: "agent",
|
|
31
31
|
metadata
|
|
@@ -37,7 +37,7 @@ var _emitAgentSpan = (opts) => {
|
|
|
37
37
|
}
|
|
38
38
|
return handle;
|
|
39
39
|
};
|
|
40
|
-
var emitAgentSpan =
|
|
40
|
+
var emitAgentSpan = chunk4CMVMTFB_cjs.absorbErrorsSync(
|
|
41
41
|
_emitAgentSpan,
|
|
42
42
|
{
|
|
43
43
|
fingerprint: "morse.adapters.shared.emitAgentSpan"
|
|
@@ -54,7 +54,7 @@ var _emitLlmSpan = (opts) => {
|
|
|
54
54
|
if (typeof opts.provider === "string" && opts.provider.length > 0) {
|
|
55
55
|
metadata.provider = opts.provider;
|
|
56
56
|
}
|
|
57
|
-
const handle =
|
|
57
|
+
const handle = chunk6BNMYEMW_cjs.startSpan({
|
|
58
58
|
name: `${adapter}.llm`,
|
|
59
59
|
type: "llm",
|
|
60
60
|
metadata
|
|
@@ -80,7 +80,7 @@ var _emitLlmSpan = (opts) => {
|
|
|
80
80
|
if (opts.outputData !== void 0) span.output_data = opts.outputData;
|
|
81
81
|
return handle;
|
|
82
82
|
};
|
|
83
|
-
var emitLlmSpan =
|
|
83
|
+
var emitLlmSpan = chunk4CMVMTFB_cjs.absorbErrorsSync(
|
|
84
84
|
_emitLlmSpan,
|
|
85
85
|
{
|
|
86
86
|
fingerprint: "morse.adapters.shared.emitLlmSpan"
|
|
@@ -101,13 +101,13 @@ var _emitToolSpan = (opts) => {
|
|
|
101
101
|
adapter,
|
|
102
102
|
tool
|
|
103
103
|
};
|
|
104
|
-
return
|
|
104
|
+
return chunk6BNMYEMW_cjs.startSpan({
|
|
105
105
|
name: `${adapter}.tool.${toolName}`,
|
|
106
106
|
type: "tool",
|
|
107
107
|
metadata
|
|
108
108
|
});
|
|
109
109
|
};
|
|
110
|
-
var emitToolSpan =
|
|
110
|
+
var emitToolSpan = chunk4CMVMTFB_cjs.absorbErrorsSync(
|
|
111
111
|
_emitToolSpan,
|
|
112
112
|
{
|
|
113
113
|
fingerprint: "morse.adapters.shared.emitToolSpan"
|
|
@@ -127,13 +127,13 @@ var _emitSubagentSpan = (opts) => {
|
|
|
127
127
|
if (typeof opts.taskDescription === "string" && opts.taskDescription.length > 0) {
|
|
128
128
|
metadata.task_description = truncate(opts.taskDescription, MAX_DESCRIPTION_BYTES);
|
|
129
129
|
}
|
|
130
|
-
return
|
|
130
|
+
return chunk6BNMYEMW_cjs.startSpan({
|
|
131
131
|
name: `${adapter}.subagent.${subagentName}`,
|
|
132
132
|
type: "agent",
|
|
133
133
|
metadata
|
|
134
134
|
});
|
|
135
135
|
};
|
|
136
|
-
var emitSubagentSpan =
|
|
136
|
+
var emitSubagentSpan = chunk4CMVMTFB_cjs.absorbErrorsSync(_emitSubagentSpan, {
|
|
137
137
|
fingerprint: "morse.adapters.shared.emitSubagentSpan"
|
|
138
138
|
});
|
|
139
139
|
var _emitHookSpan = (opts) => {
|
|
@@ -157,13 +157,13 @@ var _emitHookSpan = (opts) => {
|
|
|
157
157
|
tool_kind: "hook",
|
|
158
158
|
hook
|
|
159
159
|
};
|
|
160
|
-
return
|
|
160
|
+
return chunk6BNMYEMW_cjs.startSpan({
|
|
161
161
|
name: `${adapter}.hook.${hookKind}.${hookName}`,
|
|
162
162
|
type: "tool",
|
|
163
163
|
metadata
|
|
164
164
|
});
|
|
165
165
|
};
|
|
166
|
-
var emitHookSpan =
|
|
166
|
+
var emitHookSpan = chunk4CMVMTFB_cjs.absorbErrorsSync(
|
|
167
167
|
_emitHookSpan,
|
|
168
168
|
{
|
|
169
169
|
fingerprint: "morse.adapters.shared.emitHookSpan"
|
|
@@ -175,5 +175,5 @@ exports.emitHookSpan = emitHookSpan;
|
|
|
175
175
|
exports.emitLlmSpan = emitLlmSpan;
|
|
176
176
|
exports.emitSubagentSpan = emitSubagentSpan;
|
|
177
177
|
exports.emitToolSpan = emitToolSpan;
|
|
178
|
-
//# sourceMappingURL=chunk-
|
|
179
|
-
//# sourceMappingURL=chunk-
|
|
178
|
+
//# sourceMappingURL=chunk-52JTU4LH.cjs.map
|
|
179
|
+
//# sourceMappingURL=chunk-52JTU4LH.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/_agent-sdk-common/span-emitter.ts"],"names":["init_tracing","startSpan","absorbErrorsSync"],"mappings":"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","file":"chunk-PNUCUOUA.cjs","sourcesContent":["/**\n * `_agent-sdk-common/span-emitter.ts` — shared span-emission helpers used by\n * all three agent-SDK adapters (`anthropic-agent-sdk`, `openai-agents`,\n * `langgraph-js`).\n *\n * Each helper:\n *\n * 1. Validates the required metadata for its logical span type.\n * 2. Calls `startSpan(...)` from `_internal/tracing.ts` to allocate the\n * wire-format span and push it onto the active trace's span stack.\n * 3. Tags `metadata.adapter` on every span so the UI can attribute spans\n * back to their adapter origin.\n * 4. Hydrates type-specific top-level fields (`model`, `input_tokens`,\n * `output_tokens`, `total_tokens`, `context_segments`) onto `SpanData`.\n * 5. Returns the `SpanHandle` so callers can later call `.end(err?)`.\n *\n * All helpers are wrapped in `absorbErrorsSync` — telemetry MUST NOT throw\n * at the caller. If `startSpan` returns `null` (no active trace), the\n * helper also returns `null`; callers must tolerate this case.\n *\n * Logical → wire `type` mapping (per `design.md` §Span schema):\n *\n * agent → \"agent\"\n * llm → \"llm\"\n * tool → \"tool\"\n * subagent → \"agent\" + metadata.spawn_kind = \"subagent\"\n * hook → \"tool\" + metadata.tool_kind = \"hook\"\n *\n * Adapter-flavoured redaction (tool-arg truncation, base64/image\n * stripping) lives in a sibling `redaction.ts` (W1.2). This file is\n * intentionally agnostic: the only redaction it applies is a minimal\n * string-length guard on free-form fields that would otherwise blow up\n * the wire payload (task descriptions, hook names, tool names).\n */\n\nimport { absorbErrorsSync } from \"../_internal/errors\";\nimport type { ContextSegment, SpanData } from \"../_internal/spans\";\nimport { startSpan, type SpanHandle } from \"../_internal/tracing\";\n\n/* ------------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------------ */\n\nexport type AdapterName = \"anthropic-agent-sdk\" | \"openai-agents\" | \"langgraph-js\" | \"vercel-ai\";\n\n/** Soft cap for free-form identifier-ish strings (tool names, hook names, etc.). */\nconst MAX_NAME_BYTES = 256;\n\n/** Soft cap for free-form description strings (task descriptions). */\nconst MAX_DESCRIPTION_BYTES = 2048;\n\n/** Trim a string to `maxBytes` bytes (UTF-8 codepoint-safe at the JS-string level). */\nfunction truncate(value: string, maxBytes: number): string {\n if (value.length <= maxBytes) return value;\n return `${value.slice(0, maxBytes)}…[truncated]`;\n}\n\nfunction requireNonEmpty(value: unknown, field: string): string {\n if (typeof value !== \"string\" || value.length === 0) {\n throw new Error(`morse span-emitter: ${field} must be a non-empty string`);\n }\n return value;\n}\n\n/* ------------------------------------------------------------------------ */\n/* emitAgentSpan */\n/* ------------------------------------------------------------------------ */\n\nexport interface EmitAgentSpanOptions {\n adapter: AdapterName;\n agentName: string;\n model?: string;\n attributes?: Record<string, unknown>;\n}\n\nconst _emitAgentSpan = (opts: EmitAgentSpanOptions): SpanHandle | null => {\n const adapter = requireNonEmpty(opts.adapter, \"adapter\");\n const agentName = requireNonEmpty(opts.agentName, \"agentName\");\n const metadata: Record<string, unknown> = {\n ...(opts.attributes ?? {}),\n adapter,\n agent_name: agentName,\n };\n const handle = startSpan({\n name: `${adapter}.agent`,\n type: \"agent\",\n metadata,\n });\n if (handle === null) return null;\n if (typeof opts.model === \"string\" && opts.model.length > 0) {\n handle.span.model = opts.model;\n metadata.model = opts.model;\n }\n return handle;\n};\n\n/**\n * Emit a wire `type=agent` span. Returns `null` when no active trace exists\n * (callers MUST tolerate this); never throws.\n */\nexport const emitAgentSpan: (opts: EmitAgentSpanOptions) => SpanHandle | null = absorbErrorsSync(\n _emitAgentSpan,\n {\n fingerprint: \"morse.adapters.shared.emitAgentSpan\",\n },\n) as (opts: EmitAgentSpanOptions) => SpanHandle | null;\n\n/* ------------------------------------------------------------------------ */\n/* emitLlmSpan */\n/* ------------------------------------------------------------------------ */\n\nexport interface EmitLlmSpanOptions {\n adapter: AdapterName;\n model: string;\n provider?: string;\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n contextSegments?: ContextSegment[];\n attributes?: Record<string, unknown>;\n // MHQ-858: prompt/response capture. Adapters pass already-truncated\n // values (see `_internal/llm-io.ts`); this emitter does not truncate.\n inputData?: unknown;\n outputData?: unknown;\n}\n\nconst _emitLlmSpan = (opts: EmitLlmSpanOptions): SpanHandle | null => {\n const adapter = requireNonEmpty(opts.adapter, \"adapter\");\n const model = requireNonEmpty(opts.model, \"model\");\n const metadata: Record<string, unknown> = {\n ...(opts.attributes ?? {}),\n adapter,\n model,\n };\n if (typeof opts.provider === \"string\" && opts.provider.length > 0) {\n metadata.provider = opts.provider;\n }\n const handle = startSpan({\n name: `${adapter}.llm`,\n type: \"llm\",\n metadata,\n });\n if (handle === null) return null;\n const span: SpanData = handle.span;\n span.model = model;\n if (typeof opts.inputTokens === \"number\" && Number.isFinite(opts.inputTokens)) {\n span.input_tokens = opts.inputTokens;\n }\n if (typeof opts.outputTokens === \"number\" && Number.isFinite(opts.outputTokens)) {\n span.output_tokens = opts.outputTokens;\n }\n if (typeof opts.totalTokens === \"number\" && Number.isFinite(opts.totalTokens)) {\n span.total_tokens = opts.totalTokens;\n } else if (span.input_tokens !== undefined && span.output_tokens !== undefined) {\n span.total_tokens = span.input_tokens + span.output_tokens;\n }\n if (Array.isArray(opts.contextSegments)) {\n span.context_segments = opts.contextSegments;\n }\n if (opts.inputData !== undefined) span.input_data = opts.inputData;\n if (opts.outputData !== undefined) span.output_data = opts.outputData;\n return handle;\n};\n\n/**\n * Emit a wire `type=llm` span. Returns `null` when no active trace exists;\n * never throws. Hydrates `model`, `input_tokens`, `output_tokens`,\n * `total_tokens` (derived if absent), and `context_segments` onto the\n * underlying `SpanData` so downstream consumers see them at the top level\n * — not buried in `metadata`.\n */\nexport const emitLlmSpan: (opts: EmitLlmSpanOptions) => SpanHandle | null = absorbErrorsSync(\n _emitLlmSpan,\n {\n fingerprint: \"morse.adapters.shared.emitLlmSpan\",\n },\n) as (opts: EmitLlmSpanOptions) => SpanHandle | null;\n\n/* ------------------------------------------------------------------------ */\n/* emitToolSpan */\n/* ------------------------------------------------------------------------ */\n\nexport interface EmitToolSpanOptions {\n adapter: AdapterName;\n toolName: string;\n inputSummary?: unknown;\n outputSummary?: unknown;\n durationMs?: number;\n success?: boolean;\n attributes?: Record<string, unknown>;\n}\n\nconst _emitToolSpan = (opts: EmitToolSpanOptions): SpanHandle | null => {\n const adapter = requireNonEmpty(opts.adapter, \"adapter\");\n const toolName = truncate(requireNonEmpty(opts.toolName, \"toolName\"), MAX_NAME_BYTES);\n const tool: Record<string, unknown> = { name: toolName };\n if (opts.inputSummary !== undefined) tool.input_summary = opts.inputSummary;\n if (opts.outputSummary !== undefined) tool.output_summary = opts.outputSummary;\n if (typeof opts.durationMs === \"number\" && Number.isFinite(opts.durationMs)) {\n tool.duration_ms = opts.durationMs;\n }\n if (typeof opts.success === \"boolean\") tool.success = opts.success;\n const metadata: Record<string, unknown> = {\n ...(opts.attributes ?? {}),\n adapter,\n tool,\n };\n return startSpan({\n name: `${adapter}.tool.${toolName}`,\n type: \"tool\",\n metadata,\n });\n};\n\n/**\n * Emit a wire `type=tool` span. Returns `null` when no active trace exists;\n * never throws.\n */\nexport const emitToolSpan: (opts: EmitToolSpanOptions) => SpanHandle | null = absorbErrorsSync(\n _emitToolSpan,\n {\n fingerprint: \"morse.adapters.shared.emitToolSpan\",\n },\n) as (opts: EmitToolSpanOptions) => SpanHandle | null;\n\n/* ------------------------------------------------------------------------ */\n/* emitSubagentSpan */\n/* ------------------------------------------------------------------------ */\n\nexport interface EmitSubagentSpanOptions {\n adapter: AdapterName;\n parentAgentName: string;\n subagentName: string;\n taskDescription?: string;\n attributes?: Record<string, unknown>;\n}\n\nconst _emitSubagentSpan = (opts: EmitSubagentSpanOptions): SpanHandle | null => {\n const adapter = requireNonEmpty(opts.adapter, \"adapter\");\n const parentAgentName = requireNonEmpty(opts.parentAgentName, \"parentAgentName\");\n const subagentName = requireNonEmpty(opts.subagentName, \"subagentName\");\n const metadata: Record<string, unknown> = {\n ...(opts.attributes ?? {}),\n adapter,\n spawn_kind: \"subagent\",\n parent_agent_name: parentAgentName,\n subagent_name: subagentName,\n };\n if (typeof opts.taskDescription === \"string\" && opts.taskDescription.length > 0) {\n metadata.task_description = truncate(opts.taskDescription, MAX_DESCRIPTION_BYTES);\n }\n return startSpan({\n name: `${adapter}.subagent.${subagentName}`,\n type: \"agent\",\n metadata,\n });\n};\n\n/**\n * Emit a wire `type=agent` span with `metadata.spawn_kind=\"subagent\"` — the\n * UI inspects this metadata key to render subagent-spawn relationships\n * until the backend gains a native `subagent` enum value. Returns `null`\n * when no active trace exists; never throws.\n */\nexport const emitSubagentSpan: (opts: EmitSubagentSpanOptions) => SpanHandle | null =\n absorbErrorsSync(_emitSubagentSpan, {\n fingerprint: \"morse.adapters.shared.emitSubagentSpan\",\n }) as (opts: EmitSubagentSpanOptions) => SpanHandle | null;\n\n/* ------------------------------------------------------------------------ */\n/* emitHookSpan */\n/* ------------------------------------------------------------------------ */\n\nexport interface EmitHookSpanOptions {\n adapter: AdapterName;\n hookName: string;\n hookKind: \"pre_tool\" | \"post_tool\" | \"on_error\";\n durationMs?: number;\n attributes?: Record<string, unknown>;\n}\n\nconst _emitHookSpan = (opts: EmitHookSpanOptions): SpanHandle | null => {\n const adapter = requireNonEmpty(opts.adapter, \"adapter\");\n const hookName = truncate(requireNonEmpty(opts.hookName, \"hookName\"), MAX_NAME_BYTES);\n const hookKind = opts.hookKind;\n if (hookKind !== \"pre_tool\" && hookKind !== \"post_tool\" && hookKind !== \"on_error\") {\n throw new Error(\n `morse span-emitter: hookKind must be one of pre_tool|post_tool|on_error (got ${String(\n hookKind,\n )})`,\n );\n }\n const hook: Record<string, unknown> = { name: hookName, kind: hookKind };\n if (typeof opts.durationMs === \"number\" && Number.isFinite(opts.durationMs)) {\n hook.duration_ms = opts.durationMs;\n }\n const metadata: Record<string, unknown> = {\n ...(opts.attributes ?? {}),\n adapter,\n tool_kind: \"hook\",\n hook,\n };\n return startSpan({\n name: `${adapter}.hook.${hookKind}.${hookName}`,\n type: \"tool\",\n metadata,\n });\n};\n\n/**\n * Emit a wire `type=tool` span with `metadata.tool_kind=\"hook\"` — the UI\n * inspects this metadata key to render hook spans separately from regular\n * tool spans. Returns `null` when no active trace exists; never throws.\n */\nexport const emitHookSpan: (opts: EmitHookSpanOptions) => SpanHandle | null = absorbErrorsSync(\n _emitHookSpan,\n {\n fingerprint: \"morse.adapters.shared.emitHookSpan\",\n },\n) as (opts: EmitHookSpanOptions) => SpanHandle | null;\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/_agent-sdk-common/span-emitter.ts"],"names":["init_tracing","startSpan","absorbErrorsSync"],"mappings":"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","file":"chunk-52JTU4LH.cjs","sourcesContent":["/**\n * `_agent-sdk-common/span-emitter.ts` — shared span-emission helpers used by\n * all three agent-SDK adapters (`anthropic-agent-sdk`, `openai-agents`,\n * `langgraph-js`).\n *\n * Each helper:\n *\n * 1. Validates the required metadata for its logical span type.\n * 2. Calls `startSpan(...)` from `_internal/tracing.ts` to allocate the\n * wire-format span and push it onto the active trace's span stack.\n * 3. Tags `metadata.adapter` on every span so the UI can attribute spans\n * back to their adapter origin.\n * 4. Hydrates type-specific top-level fields (`model`, `input_tokens`,\n * `output_tokens`, `total_tokens`, `context_segments`) onto `SpanData`.\n * 5. Returns the `SpanHandle` so callers can later call `.end(err?)`.\n *\n * All helpers are wrapped in `absorbErrorsSync` — telemetry MUST NOT throw\n * at the caller. If `startSpan` returns `null` (no active trace), the\n * helper also returns `null`; callers must tolerate this case.\n *\n * Logical → wire `type` mapping (per `design.md` §Span schema):\n *\n * agent → \"agent\"\n * llm → \"llm\"\n * tool → \"tool\"\n * subagent → \"agent\" + metadata.spawn_kind = \"subagent\"\n * hook → \"tool\" + metadata.tool_kind = \"hook\"\n *\n * Adapter-flavoured redaction (tool-arg truncation, base64/image\n * stripping) lives in a sibling `redaction.ts` (W1.2). This file is\n * intentionally agnostic: the only redaction it applies is a minimal\n * string-length guard on free-form fields that would otherwise blow up\n * the wire payload (task descriptions, hook names, tool names).\n */\n\nimport { absorbErrorsSync } from \"../_internal/errors\";\nimport type { ContextSegment, SpanData } from \"../_internal/spans\";\nimport { startSpan, type SpanHandle } from \"../_internal/tracing\";\n\n/* ------------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------------ */\n\nexport type AdapterName = \"anthropic-agent-sdk\" | \"openai-agents\" | \"langgraph-js\" | \"vercel-ai\";\n\n/** Soft cap for free-form identifier-ish strings (tool names, hook names, etc.). */\nconst MAX_NAME_BYTES = 256;\n\n/** Soft cap for free-form description strings (task descriptions). */\nconst MAX_DESCRIPTION_BYTES = 2048;\n\n/** Trim a string to `maxBytes` bytes (UTF-8 codepoint-safe at the JS-string level). */\nfunction truncate(value: string, maxBytes: number): string {\n if (value.length <= maxBytes) return value;\n return `${value.slice(0, maxBytes)}…[truncated]`;\n}\n\nfunction requireNonEmpty(value: unknown, field: string): string {\n if (typeof value !== \"string\" || value.length === 0) {\n throw new Error(`morse span-emitter: ${field} must be a non-empty string`);\n }\n return value;\n}\n\n/* ------------------------------------------------------------------------ */\n/* emitAgentSpan */\n/* ------------------------------------------------------------------------ */\n\nexport interface EmitAgentSpanOptions {\n adapter: AdapterName;\n agentName: string;\n model?: string;\n attributes?: Record<string, unknown>;\n}\n\nconst _emitAgentSpan = (opts: EmitAgentSpanOptions): SpanHandle | null => {\n const adapter = requireNonEmpty(opts.adapter, \"adapter\");\n const agentName = requireNonEmpty(opts.agentName, \"agentName\");\n const metadata: Record<string, unknown> = {\n ...(opts.attributes ?? {}),\n adapter,\n agent_name: agentName,\n };\n const handle = startSpan({\n name: `${adapter}.agent`,\n type: \"agent\",\n metadata,\n });\n if (handle === null) return null;\n if (typeof opts.model === \"string\" && opts.model.length > 0) {\n handle.span.model = opts.model;\n metadata.model = opts.model;\n }\n return handle;\n};\n\n/**\n * Emit a wire `type=agent` span. Returns `null` when no active trace exists\n * (callers MUST tolerate this); never throws.\n */\nexport const emitAgentSpan: (opts: EmitAgentSpanOptions) => SpanHandle | null = absorbErrorsSync(\n _emitAgentSpan,\n {\n fingerprint: \"morse.adapters.shared.emitAgentSpan\",\n },\n) as (opts: EmitAgentSpanOptions) => SpanHandle | null;\n\n/* ------------------------------------------------------------------------ */\n/* emitLlmSpan */\n/* ------------------------------------------------------------------------ */\n\nexport interface EmitLlmSpanOptions {\n adapter: AdapterName;\n model: string;\n provider?: string;\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n contextSegments?: ContextSegment[];\n attributes?: Record<string, unknown>;\n // MHQ-858: prompt/response capture. Adapters pass already-truncated\n // values (see `_internal/llm-io.ts`); this emitter does not truncate.\n inputData?: unknown;\n outputData?: unknown;\n}\n\nconst _emitLlmSpan = (opts: EmitLlmSpanOptions): SpanHandle | null => {\n const adapter = requireNonEmpty(opts.adapter, \"adapter\");\n const model = requireNonEmpty(opts.model, \"model\");\n const metadata: Record<string, unknown> = {\n ...(opts.attributes ?? {}),\n adapter,\n model,\n };\n if (typeof opts.provider === \"string\" && opts.provider.length > 0) {\n metadata.provider = opts.provider;\n }\n const handle = startSpan({\n name: `${adapter}.llm`,\n type: \"llm\",\n metadata,\n });\n if (handle === null) return null;\n const span: SpanData = handle.span;\n span.model = model;\n if (typeof opts.inputTokens === \"number\" && Number.isFinite(opts.inputTokens)) {\n span.input_tokens = opts.inputTokens;\n }\n if (typeof opts.outputTokens === \"number\" && Number.isFinite(opts.outputTokens)) {\n span.output_tokens = opts.outputTokens;\n }\n if (typeof opts.totalTokens === \"number\" && Number.isFinite(opts.totalTokens)) {\n span.total_tokens = opts.totalTokens;\n } else if (span.input_tokens !== undefined && span.output_tokens !== undefined) {\n span.total_tokens = span.input_tokens + span.output_tokens;\n }\n if (Array.isArray(opts.contextSegments)) {\n span.context_segments = opts.contextSegments;\n }\n if (opts.inputData !== undefined) span.input_data = opts.inputData;\n if (opts.outputData !== undefined) span.output_data = opts.outputData;\n return handle;\n};\n\n/**\n * Emit a wire `type=llm` span. Returns `null` when no active trace exists;\n * never throws. Hydrates `model`, `input_tokens`, `output_tokens`,\n * `total_tokens` (derived if absent), and `context_segments` onto the\n * underlying `SpanData` so downstream consumers see them at the top level\n * — not buried in `metadata`.\n */\nexport const emitLlmSpan: (opts: EmitLlmSpanOptions) => SpanHandle | null = absorbErrorsSync(\n _emitLlmSpan,\n {\n fingerprint: \"morse.adapters.shared.emitLlmSpan\",\n },\n) as (opts: EmitLlmSpanOptions) => SpanHandle | null;\n\n/* ------------------------------------------------------------------------ */\n/* emitToolSpan */\n/* ------------------------------------------------------------------------ */\n\nexport interface EmitToolSpanOptions {\n adapter: AdapterName;\n toolName: string;\n inputSummary?: unknown;\n outputSummary?: unknown;\n durationMs?: number;\n success?: boolean;\n attributes?: Record<string, unknown>;\n}\n\nconst _emitToolSpan = (opts: EmitToolSpanOptions): SpanHandle | null => {\n const adapter = requireNonEmpty(opts.adapter, \"adapter\");\n const toolName = truncate(requireNonEmpty(opts.toolName, \"toolName\"), MAX_NAME_BYTES);\n const tool: Record<string, unknown> = { name: toolName };\n if (opts.inputSummary !== undefined) tool.input_summary = opts.inputSummary;\n if (opts.outputSummary !== undefined) tool.output_summary = opts.outputSummary;\n if (typeof opts.durationMs === \"number\" && Number.isFinite(opts.durationMs)) {\n tool.duration_ms = opts.durationMs;\n }\n if (typeof opts.success === \"boolean\") tool.success = opts.success;\n const metadata: Record<string, unknown> = {\n ...(opts.attributes ?? {}),\n adapter,\n tool,\n };\n return startSpan({\n name: `${adapter}.tool.${toolName}`,\n type: \"tool\",\n metadata,\n });\n};\n\n/**\n * Emit a wire `type=tool` span. Returns `null` when no active trace exists;\n * never throws.\n */\nexport const emitToolSpan: (opts: EmitToolSpanOptions) => SpanHandle | null = absorbErrorsSync(\n _emitToolSpan,\n {\n fingerprint: \"morse.adapters.shared.emitToolSpan\",\n },\n) as (opts: EmitToolSpanOptions) => SpanHandle | null;\n\n/* ------------------------------------------------------------------------ */\n/* emitSubagentSpan */\n/* ------------------------------------------------------------------------ */\n\nexport interface EmitSubagentSpanOptions {\n adapter: AdapterName;\n parentAgentName: string;\n subagentName: string;\n taskDescription?: string;\n attributes?: Record<string, unknown>;\n}\n\nconst _emitSubagentSpan = (opts: EmitSubagentSpanOptions): SpanHandle | null => {\n const adapter = requireNonEmpty(opts.adapter, \"adapter\");\n const parentAgentName = requireNonEmpty(opts.parentAgentName, \"parentAgentName\");\n const subagentName = requireNonEmpty(opts.subagentName, \"subagentName\");\n const metadata: Record<string, unknown> = {\n ...(opts.attributes ?? {}),\n adapter,\n spawn_kind: \"subagent\",\n parent_agent_name: parentAgentName,\n subagent_name: subagentName,\n };\n if (typeof opts.taskDescription === \"string\" && opts.taskDescription.length > 0) {\n metadata.task_description = truncate(opts.taskDescription, MAX_DESCRIPTION_BYTES);\n }\n return startSpan({\n name: `${adapter}.subagent.${subagentName}`,\n type: \"agent\",\n metadata,\n });\n};\n\n/**\n * Emit a wire `type=agent` span with `metadata.spawn_kind=\"subagent\"` — the\n * UI inspects this metadata key to render subagent-spawn relationships\n * until the backend gains a native `subagent` enum value. Returns `null`\n * when no active trace exists; never throws.\n */\nexport const emitSubagentSpan: (opts: EmitSubagentSpanOptions) => SpanHandle | null =\n absorbErrorsSync(_emitSubagentSpan, {\n fingerprint: \"morse.adapters.shared.emitSubagentSpan\",\n }) as (opts: EmitSubagentSpanOptions) => SpanHandle | null;\n\n/* ------------------------------------------------------------------------ */\n/* emitHookSpan */\n/* ------------------------------------------------------------------------ */\n\nexport interface EmitHookSpanOptions {\n adapter: AdapterName;\n hookName: string;\n hookKind: \"pre_tool\" | \"post_tool\" | \"on_error\";\n durationMs?: number;\n attributes?: Record<string, unknown>;\n}\n\nconst _emitHookSpan = (opts: EmitHookSpanOptions): SpanHandle | null => {\n const adapter = requireNonEmpty(opts.adapter, \"adapter\");\n const hookName = truncate(requireNonEmpty(opts.hookName, \"hookName\"), MAX_NAME_BYTES);\n const hookKind = opts.hookKind;\n if (hookKind !== \"pre_tool\" && hookKind !== \"post_tool\" && hookKind !== \"on_error\") {\n throw new Error(\n `morse span-emitter: hookKind must be one of pre_tool|post_tool|on_error (got ${String(\n hookKind,\n )})`,\n );\n }\n const hook: Record<string, unknown> = { name: hookName, kind: hookKind };\n if (typeof opts.durationMs === \"number\" && Number.isFinite(opts.durationMs)) {\n hook.duration_ms = opts.durationMs;\n }\n const metadata: Record<string, unknown> = {\n ...(opts.attributes ?? {}),\n adapter,\n tool_kind: \"hook\",\n hook,\n };\n return startSpan({\n name: `${adapter}.hook.${hookKind}.${hookName}`,\n type: \"tool\",\n metadata,\n });\n};\n\n/**\n * Emit a wire `type=tool` span with `metadata.tool_kind=\"hook\"` — the UI\n * inspects this metadata key to render hook spans separately from regular\n * tool spans. Returns `null` when no active trace exists; never throws.\n */\nexport const emitHookSpan: (opts: EmitHookSpanOptions) => SpanHandle | null = absorbErrorsSync(\n _emitHookSpan,\n {\n fingerprint: \"morse.adapters.shared.emitHookSpan\",\n },\n) as (opts: EmitHookSpanOptions) => SpanHandle | null;\n"]}
|