@morsehq-dev/sdk 0.5.0-rc.3 → 0.5.0-rc.4

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.
Files changed (98) hide show
  1. package/README.md +34 -0
  2. package/dist/anthropic/index.cjs +11 -11
  3. package/dist/anthropic/index.js +4 -4
  4. package/dist/anthropic-agent-sdk/index.cjs +37 -37
  5. package/dist/anthropic-agent-sdk/index.js +6 -6
  6. package/dist/browser/anthropic/index.cjs +11 -11
  7. package/dist/browser/anthropic/index.js +4 -4
  8. package/dist/browser/anthropic-agent-sdk/index.cjs +37 -37
  9. package/dist/browser/anthropic-agent-sdk/index.js +6 -6
  10. package/dist/{chunk-DPGUBZVO.cjs → browser/chunk-255AHH2W.cjs} +15 -15
  11. package/dist/browser/{chunk-XLQSSJUZ.cjs.map → chunk-255AHH2W.cjs.map} +1 -1
  12. package/dist/browser/{chunk-QCI2ZDQS.cjs → chunk-36QTJJT7.cjs} +12 -12
  13. package/dist/browser/{chunk-QCI2ZDQS.cjs.map → chunk-36QTJJT7.cjs.map} +1 -1
  14. package/dist/browser/{chunk-PM5D6VXF.cjs → chunk-3H2OJLC2.cjs} +4 -3
  15. package/dist/browser/{chunk-PM5D6VXF.cjs.map → chunk-3H2OJLC2.cjs.map} +1 -1
  16. package/dist/browser/{chunk-P7XWSMFX.cjs → chunk-3STFITZF.cjs} +6 -6
  17. package/dist/browser/{chunk-P7XWSMFX.cjs.map → chunk-3STFITZF.cjs.map} +1 -1
  18. package/dist/browser/{chunk-YSJVJ3Z3.cjs → chunk-6J6F5LJI.cjs} +7 -7
  19. package/dist/browser/{chunk-YSJVJ3Z3.cjs.map → chunk-6J6F5LJI.cjs.map} +1 -1
  20. package/dist/browser/{chunk-LGG5PL5U.js → chunk-E2OVLWAF.js} +3 -3
  21. package/dist/browser/{chunk-LGG5PL5U.js.map → chunk-E2OVLWAF.js.map} +1 -1
  22. package/dist/{chunk-HCEKAVDR.js → browser/chunk-JR6JN7IZ.js} +4 -4
  23. package/dist/browser/{chunk-KGSLJLWW.js.map → chunk-JR6JN7IZ.js.map} +1 -1
  24. package/dist/browser/{chunk-WUQXNRD3.js → chunk-KXVSMY6L.js} +3 -3
  25. package/dist/browser/{chunk-WUQXNRD3.js.map → chunk-KXVSMY6L.js.map} +1 -1
  26. package/dist/browser/{chunk-N4Q2WMOE.js → chunk-PIWO5L5N.js} +5 -5
  27. package/dist/browser/{chunk-N4Q2WMOE.js.map → chunk-PIWO5L5N.js.map} +1 -1
  28. package/dist/browser/{chunk-KFWCOUL3.cjs → chunk-VOZBYSWK.cjs} +5 -5
  29. package/dist/browser/{chunk-KFWCOUL3.cjs.map → chunk-VOZBYSWK.cjs.map} +1 -1
  30. package/dist/{chunk-7PGR4NJG.js → browser/chunk-VZA2EPY3.js} +4 -4
  31. package/dist/browser/{chunk-MOBYR3AP.js.map → chunk-VZA2EPY3.js.map} +1 -1
  32. package/dist/browser/{chunk-MI4OUWUZ.js → chunk-WIWUEI5Z.js} +3 -3
  33. package/dist/browser/{chunk-MI4OUWUZ.js.map → chunk-WIWUEI5Z.js.map} +1 -1
  34. package/dist/browser/{chunk-Y3BOPSM3.js → chunk-XD4VWCAC.js} +4 -4
  35. package/dist/browser/{chunk-Y3BOPSM3.js.map → chunk-XD4VWCAC.js.map} +1 -1
  36. package/dist/browser/{chunk-VSG4EWNL.cjs → chunk-YD7TO4PD.cjs} +18 -18
  37. package/dist/browser/{chunk-VSG4EWNL.cjs.map → chunk-YD7TO4PD.cjs.map} +1 -1
  38. package/dist/browser/index.cjs +91 -90
  39. package/dist/browser/index.cjs.map +1 -1
  40. package/dist/browser/index.js +9 -8
  41. package/dist/browser/index.js.map +1 -1
  42. package/dist/browser/integrations/pino.cjs +4 -4
  43. package/dist/browser/integrations/pino.js +3 -3
  44. package/dist/browser/langchain/index.cjs +17 -17
  45. package/dist/browser/langchain/index.js +2 -2
  46. package/dist/browser/langgraph/index.cjs +27 -27
  47. package/dist/browser/langgraph/index.js +5 -5
  48. package/dist/browser/openai/index.cjs +11 -11
  49. package/dist/browser/openai/index.js +2 -2
  50. package/dist/browser/openai-agents/index.cjs +34 -34
  51. package/dist/browser/openai-agents/index.js +4 -4
  52. package/dist/browser/vercel-ai/index.cjs +14 -14
  53. package/dist/browser/vercel-ai/index.js +3 -3
  54. package/dist/{chunk-XHOLQGN6.js → chunk-2O2FFJLK.js} +5 -5
  55. package/dist/{chunk-XHOLQGN6.js.map → chunk-2O2FFJLK.js.map} +1 -1
  56. package/dist/{chunk-3XQOZXJM.cjs → chunk-7ZNGY236.cjs} +7 -7
  57. package/dist/{chunk-3XQOZXJM.cjs.map → chunk-7ZNGY236.cjs.map} +1 -1
  58. package/dist/{browser/chunk-MOBYR3AP.js → chunk-BNMTY7PE.js} +4 -4
  59. package/dist/{chunk-7PGR4NJG.js.map → chunk-BNMTY7PE.js.map} +1 -1
  60. package/dist/{chunk-XZRJXJFA.js → chunk-ELBY4SJ7.js} +4 -4
  61. package/dist/{chunk-XZRJXJFA.js.map → chunk-ELBY4SJ7.js.map} +1 -1
  62. package/dist/{chunk-E3G3IE6Y.cjs → chunk-HA5RY4N5.cjs} +4 -3
  63. package/dist/{chunk-E3G3IE6Y.cjs.map → chunk-HA5RY4N5.cjs.map} +1 -1
  64. package/dist/{chunk-NGBJJGOC.cjs → chunk-HZKXILBF.cjs} +5 -5
  65. package/dist/{chunk-NGBJJGOC.cjs.map → chunk-HZKXILBF.cjs.map} +1 -1
  66. package/dist/{chunk-ZFE75G7S.js → chunk-JFFZBCTP.js} +3 -3
  67. package/dist/{chunk-ZFE75G7S.js.map → chunk-JFFZBCTP.js.map} +1 -1
  68. package/dist/{browser/chunk-KGSLJLWW.js → chunk-MBOISGKD.js} +4 -4
  69. package/dist/{chunk-HCEKAVDR.js.map → chunk-MBOISGKD.js.map} +1 -1
  70. package/dist/{chunk-UAJO6JM7.js → chunk-Q6NQQ2LO.js} +3 -3
  71. package/dist/{chunk-UAJO6JM7.js.map → chunk-Q6NQQ2LO.js.map} +1 -1
  72. package/dist/{chunk-TGHDV5MC.cjs → chunk-RDFDPK2X.cjs} +6 -6
  73. package/dist/{chunk-TGHDV5MC.cjs.map → chunk-RDFDPK2X.cjs.map} +1 -1
  74. package/dist/{chunk-RK3JPX27.cjs → chunk-ULWGK6F5.cjs} +12 -12
  75. package/dist/{chunk-RK3JPX27.cjs.map → chunk-ULWGK6F5.cjs.map} +1 -1
  76. package/dist/{chunk-YQ6ZA7OE.cjs → chunk-VM3QM22Z.cjs} +18 -18
  77. package/dist/{chunk-YQ6ZA7OE.cjs.map → chunk-VM3QM22Z.cjs.map} +1 -1
  78. package/dist/{browser/chunk-XLQSSJUZ.cjs → chunk-WLNADB4J.cjs} +15 -15
  79. package/dist/{chunk-DPGUBZVO.cjs.map → chunk-WLNADB4J.cjs.map} +1 -1
  80. package/dist/{chunk-T2NESDMT.js → chunk-YPP5DDPO.js} +3 -3
  81. package/dist/{chunk-T2NESDMT.js.map → chunk-YPP5DDPO.js.map} +1 -1
  82. package/dist/index.cjs +98 -97
  83. package/dist/index.cjs.map +1 -1
  84. package/dist/index.js +10 -9
  85. package/dist/index.js.map +1 -1
  86. package/dist/integrations/pino.cjs +4 -4
  87. package/dist/integrations/pino.js +3 -3
  88. package/dist/langchain/index.cjs +17 -17
  89. package/dist/langchain/index.js +2 -2
  90. package/dist/langgraph/index.cjs +27 -27
  91. package/dist/langgraph/index.js +5 -5
  92. package/dist/openai/index.cjs +11 -11
  93. package/dist/openai/index.js +2 -2
  94. package/dist/openai-agents/index.cjs +34 -34
  95. package/dist/openai-agents/index.js +4 -4
  96. package/dist/vercel-ai/index.cjs +14 -14
  97. package/dist/vercel-ai/index.js +3 -3
  98. package/package.json +14 -13
@@ -1,16 +1,16 @@
1
1
  'use strict';
2
2
 
3
- var chunkVSG4EWNL_cjs = require('../chunk-VSG4EWNL.cjs');
4
- require('../chunk-KFWCOUL3.cjs');
5
- var chunkYSJVJ3Z3_cjs = require('../chunk-YSJVJ3Z3.cjs');
6
- var chunkXLQSSJUZ_cjs = require('../chunk-XLQSSJUZ.cjs');
7
- var chunkP7XWSMFX_cjs = require('../chunk-P7XWSMFX.cjs');
3
+ var chunkYD7TO4PD_cjs = require('../chunk-YD7TO4PD.cjs');
4
+ require('../chunk-VOZBYSWK.cjs');
5
+ var chunk6J6F5LJI_cjs = require('../chunk-6J6F5LJI.cjs');
6
+ var chunk255AHH2W_cjs = require('../chunk-255AHH2W.cjs');
7
+ var chunk3STFITZF_cjs = require('../chunk-3STFITZF.cjs');
8
8
  var chunkSWQOPFE4_cjs = require('../chunk-SWQOPFE4.cjs');
9
9
  require('../chunk-RBNCTHK3.cjs');
10
- var chunkPM5D6VXF_cjs = require('../chunk-PM5D6VXF.cjs');
10
+ var chunk3H2OJLC2_cjs = require('../chunk-3H2OJLC2.cjs');
11
11
 
12
12
  // src/anthropic-agent-sdk/client-wrapper.ts
13
- chunkPM5D6VXF_cjs.init_tracing();
13
+ chunk3H2OJLC2_cjs.init_tracing();
14
14
  var WRAPPED_CLIENT = /* @__PURE__ */ Symbol.for("morse.anthropic-agent-sdk.wrapped");
15
15
  var INSTALL_SENTINEL = /* @__PURE__ */ Symbol.for("morse.anthropic-agent-sdk.installed");
16
16
  var ORIGINALS_SENTINEL = /* @__PURE__ */ Symbol.for("morse.anthropic-agent-sdk.originals");
@@ -36,7 +36,7 @@ function wrapClaudeAgentSDK(client, options = {}) {
36
36
  });
37
37
  return wrapper;
38
38
  }
39
- var instrumentClaudeAgentSDK = chunkP7XWSMFX_cjs.absorbErrorsAsync(
39
+ var instrumentClaudeAgentSDK = chunk3STFITZF_cjs.absorbErrorsAsync(
40
40
  async (clientOrOptions = void 0, maybeOptions = {}) => {
41
41
  if (clientOrOptions && isClient(clientOrOptions)) {
42
42
  const opts2 = maybeOptions ?? {};
@@ -64,7 +64,7 @@ var instrumentClaudeAgentSDK = chunkP7XWSMFX_cjs.absorbErrorsAsync(
64
64
  },
65
65
  { fingerprint: "morse.adapters.anthropic-agent-sdk.install" }
66
66
  );
67
- var uninstallClaudeAgentSDK = chunkP7XWSMFX_cjs.absorbErrorsSync(
67
+ var uninstallClaudeAgentSDK = chunk3STFITZF_cjs.absorbErrorsSync(
68
68
  (claudeAgentSdkModule) => {
69
69
  if (!claudeAgentSdkModule || typeof claudeAgentSdkModule !== "object") return;
70
70
  const mod = claudeAgentSdkModule;
@@ -116,7 +116,7 @@ function buildPatchedQuery(original, options) {
116
116
  const boundOriginal = (p, o) => original.call(this, p, o);
117
117
  const model = (callOptions && typeof callOptions.model === "string" ? callOptions.model : void 0) ?? defaultModel;
118
118
  async function* iterateInTrace() {
119
- const handle = chunkXLQSSJUZ_cjs.emitAgentSpan({
119
+ const handle = chunk255AHH2W_cjs.emitAgentSpan({
120
120
  adapter: "anthropic-agent-sdk",
121
121
  agentName: defaultAgentName,
122
122
  model
@@ -139,7 +139,7 @@ function buildPatchedQuery(original, options) {
139
139
  }
140
140
  handle?.end();
141
141
  }
142
- if (chunkPM5D6VXF_cjs.getActiveTraceState() !== null) {
142
+ if (chunk3H2OJLC2_cjs.getActiveTraceState() !== null) {
143
143
  return iterateInTrace();
144
144
  }
145
145
  return (async function* outerTrace() {
@@ -155,7 +155,7 @@ function buildPatchedQuery(original, options) {
155
155
  };
156
156
  }
157
157
  });
158
- const runPromise = chunkPM5D6VXF_cjs.runAsync({ agentName: defaultAgentName }, async (runHandle) => {
158
+ const runPromise = chunk3H2OJLC2_cjs.runAsync({ agentName: defaultAgentName }, async (runHandle) => {
159
159
  try {
160
160
  for await (const event of iterateInTrace()) {
161
161
  queue.push({ kind: "value", value: event });
@@ -191,10 +191,10 @@ function buildPatchedQuery(original, options) {
191
191
  }
192
192
 
193
193
  // src/_agent-sdk-common/context-propagation.ts
194
- chunkPM5D6VXF_cjs.init_tracing();
195
- var captureParentForFanOut = chunkP7XWSMFX_cjs.absorbErrorsSync(
194
+ chunk3H2OJLC2_cjs.init_tracing();
195
+ var captureParentForFanOut = chunk3STFITZF_cjs.absorbErrorsSync(
196
196
  () => {
197
- const state = chunkPM5D6VXF_cjs.getActiveTraceState();
197
+ const state = chunk3H2OJLC2_cjs.getActiveTraceState();
198
198
  if (state === null) return null;
199
199
  const top = state.spanStack[state.spanStack.length - 1];
200
200
  if (!top) return null;
@@ -205,13 +205,13 @@ var captureParentForFanOut = chunkP7XWSMFX_cjs.absorbErrorsSync(
205
205
  },
206
206
  { fingerprint: "agent-sdk-common.captureParentForFanOut" }
207
207
  );
208
- var emitWithPinnedParent = chunkP7XWSMFX_cjs.absorbErrorsSync(
208
+ var emitWithPinnedParent = chunk3STFITZF_cjs.absorbErrorsSync(
209
209
  (opts) => {
210
- const state = chunkPM5D6VXF_cjs.getActiveTraceState();
210
+ const state = chunk3H2OJLC2_cjs.getActiveTraceState();
211
211
  if (state === null) return null;
212
212
  const snap = opts.snapshot;
213
213
  if (!snap || snap.traceId !== state.traceId) return null;
214
- const handle = chunkPM5D6VXF_cjs.startSpan({
214
+ const handle = chunk3H2OJLC2_cjs.startSpan({
215
215
  name: opts.name,
216
216
  type: opts.type,
217
217
  metadata: opts.metadata
@@ -233,13 +233,13 @@ function findSpanById(state, spanId) {
233
233
  }
234
234
  return void 0;
235
235
  }
236
- var emitAsToolSibling = chunkP7XWSMFX_cjs.absorbErrorsSync(
236
+ var emitAsToolSibling = chunk3STFITZF_cjs.absorbErrorsSync(
237
237
  (opts) => {
238
- const state = chunkPM5D6VXF_cjs.getActiveTraceState();
238
+ const state = chunk3H2OJLC2_cjs.getActiveTraceState();
239
239
  if (state === null) return null;
240
240
  const tool = findSpanById(state, opts.toolSpanId);
241
241
  if (!tool) return null;
242
- const handle = chunkPM5D6VXF_cjs.startSpan({
242
+ const handle = chunk3H2OJLC2_cjs.startSpan({
243
243
  name: opts.name,
244
244
  type: opts.type,
245
245
  metadata: opts.metadata
@@ -250,9 +250,9 @@ var emitAsToolSibling = chunkP7XWSMFX_cjs.absorbErrorsSync(
250
250
  },
251
251
  { fingerprint: "agent-sdk-common.emitAsToolSibling" }
252
252
  );
253
- chunkP7XWSMFX_cjs.absorbErrorsSync(
253
+ chunk3STFITZF_cjs.absorbErrorsSync(
254
254
  () => {
255
- const state = chunkPM5D6VXF_cjs.getActiveTraceState();
255
+ const state = chunk3H2OJLC2_cjs.getActiveTraceState();
256
256
  if (state === null) return null;
257
257
  return {
258
258
  traceId: state.traceId,
@@ -297,7 +297,7 @@ var _handleHookEvent = (payload, options) => {
297
297
  return;
298
298
  }
299
299
  }
300
- const fallback = chunkXLQSSJUZ_cjs.emitHookSpan({
300
+ const fallback = chunk255AHH2W_cjs.emitHookSpan({
301
301
  adapter: "anthropic-agent-sdk",
302
302
  hookName: name,
303
303
  hookKind: kind,
@@ -307,7 +307,7 @@ var _handleHookEvent = (payload, options) => {
307
307
  fallback.end();
308
308
  }
309
309
  };
310
- var handleHookEvent = chunkP7XWSMFX_cjs.absorbErrorsSync(_handleHookEvent, {
310
+ var handleHookEvent = chunk3STFITZF_cjs.absorbErrorsSync(_handleHookEvent, {
311
311
  fingerprint: "morse.anthropic-agent-sdk.hook-instrumentation.handle"
312
312
  });
313
313
  function installHookInstrumentation(client, options) {
@@ -335,7 +335,7 @@ function installHookInstrumentation(client, options) {
335
335
  }
336
336
 
337
337
  // src/anthropic-agent-sdk/llm-instrumentation.ts
338
- chunkPM5D6VXF_cjs.init_diagnostics();
338
+ chunk3H2OJLC2_cjs.init_diagnostics();
339
339
  function readInputTokens(usage) {
340
340
  if (usage === void 0 || usage === null || typeof usage !== "object") return void 0;
341
341
  const base = typeof usage.input_tokens === "number" && Number.isFinite(usage.input_tokens) ? usage.input_tokens : 0;
@@ -402,7 +402,7 @@ async function* instrumentLlmCalls(events, options) {
402
402
  const reportedModel = typeof event.message?.model === "string" && event.message.model.length > 0 ? event.message.model : void 0;
403
403
  const model = reportedModel ?? fallbackModel;
404
404
  if (!model) return;
405
- const handle = chunkXLQSSJUZ_cjs.emitLlmSpan({ adapter: "anthropic-agent-sdk", model });
405
+ const handle = chunk255AHH2W_cjs.emitLlmSpan({ adapter: "anthropic-agent-sdk", model });
406
406
  if (!handle) return;
407
407
  const usage = event.message?.usage;
408
408
  const inputTokens = readInputTokens(usage);
@@ -419,7 +419,7 @@ async function* instrumentLlmCalls(events, options) {
419
419
  applyCost(handle, model, inputTokens, outputTokens, cacheWriteTokens, cachedInputTokens);
420
420
  if (requestParams !== void 0) {
421
421
  try {
422
- const segments = chunkVSG4EWNL_cjs.extractAnthropicSegments(
422
+ const segments = chunkYD7TO4PD_cjs.extractAnthropicSegments(
423
423
  requestParams,
424
424
  event.message
425
425
  );
@@ -442,7 +442,7 @@ async function* instrumentLlmCalls(events, options) {
442
442
  if (model === void 0 || model.length === 0) {
443
443
  return;
444
444
  }
445
- openSpan = chunkXLQSSJUZ_cjs.emitLlmSpan({
445
+ openSpan = chunk255AHH2W_cjs.emitLlmSpan({
446
446
  adapter: "anthropic-agent-sdk",
447
447
  model
448
448
  });
@@ -484,7 +484,7 @@ async function* instrumentLlmCalls(events, options) {
484
484
  }
485
485
  if (requestParams !== void 0) {
486
486
  try {
487
- const segments = chunkVSG4EWNL_cjs.extractAnthropicSegments(
487
+ const segments = chunkYD7TO4PD_cjs.extractAnthropicSegments(
488
488
  requestParams,
489
489
  event.message
490
490
  );
@@ -512,13 +512,13 @@ async function* instrumentLlmCalls(events, options) {
512
512
  }
513
513
  function reportSwallowed(err, fingerprint) {
514
514
  try {
515
- chunkPM5D6VXF_cjs.report(err, { fingerprint });
515
+ chunk3H2OJLC2_cjs.report(err, { fingerprint });
516
516
  } catch {
517
517
  }
518
518
  }
519
519
 
520
520
  // src/anthropic-agent-sdk/tool-and-subagent.ts
521
- chunkPM5D6VXF_cjs.init_diagnostics();
521
+ chunk3H2OJLC2_cjs.init_diagnostics();
522
522
  var ADAPTER = "anthropic-agent-sdk";
523
523
  var TASK_TOOL_NAME = "Task";
524
524
  function safeCloseFailed(handle, message) {
@@ -564,7 +564,7 @@ async function* instrumentTools(events, options) {
564
564
  tool_use_id: toolUseId
565
565
  };
566
566
  if (taskPrompt !== void 0) {
567
- metadata.task_description = chunkYSJVJ3Z3_cjs.summarizeToolInput(taskPrompt, inputOpts);
567
+ metadata.task_description = chunk6J6F5LJI_cjs.summarizeToolInput(taskPrompt, inputOpts);
568
568
  }
569
569
  let handle2 = null;
570
570
  try {
@@ -586,10 +586,10 @@ async function* instrumentTools(events, options) {
586
586
  }
587
587
  let handle = null;
588
588
  try {
589
- handle = chunkXLQSSJUZ_cjs.emitToolSpan({
589
+ handle = chunk255AHH2W_cjs.emitToolSpan({
590
590
  adapter: ADAPTER,
591
591
  toolName: name,
592
- inputSummary: chunkYSJVJ3Z3_cjs.summarizeToolInput(event.input, inputOpts),
592
+ inputSummary: chunk6J6F5LJI_cjs.summarizeToolInput(event.input, inputOpts),
593
593
  attributes: { tool_use_id: toolUseId }
594
594
  });
595
595
  } catch {
@@ -606,7 +606,7 @@ async function* instrumentTools(events, options) {
606
606
  open.delete(toolUseId);
607
607
  const isError = event.is_error === true;
608
608
  try {
609
- const outputSummary = chunkYSJVJ3Z3_cjs.summarizeToolOutput(event.content, outputOpts);
609
+ const outputSummary = chunk6J6F5LJI_cjs.summarizeToolOutput(event.content, outputOpts);
610
610
  entry.handle.span.metadata = {
611
611
  ...entry.handle.span.metadata ?? {},
612
612
  tool_output_summary: outputSummary
@@ -678,7 +678,7 @@ async function* instrumentTools(events, options) {
678
678
  }
679
679
  function reportSwallowed2(err, fingerprint) {
680
680
  try {
681
- chunkPM5D6VXF_cjs.report(err, { fingerprint });
681
+ chunk3H2OJLC2_cjs.report(err, { fingerprint });
682
682
  } catch {
683
683
  }
684
684
  }
@@ -1,11 +1,11 @@
1
- import { extractAnthropicSegments } from '../chunk-N4Q2WMOE.js';
2
- import '../chunk-WUQXNRD3.js';
3
- import { summarizeToolInput, summarizeToolOutput } from '../chunk-LGG5PL5U.js';
4
- import { emitAgentSpan, emitHookSpan, emitLlmSpan, emitToolSpan } from '../chunk-MOBYR3AP.js';
5
- import { absorbErrorsAsync, absorbErrorsSync } from '../chunk-MI4OUWUZ.js';
1
+ import { extractAnthropicSegments } from '../chunk-PIWO5L5N.js';
2
+ import '../chunk-KXVSMY6L.js';
3
+ import { summarizeToolInput, summarizeToolOutput } from '../chunk-E2OVLWAF.js';
4
+ import { emitAgentSpan, emitHookSpan, emitLlmSpan, emitToolSpan } from '../chunk-VZA2EPY3.js';
5
+ import { absorbErrorsAsync, absorbErrorsSync } from '../chunk-WIWUEI5Z.js';
6
6
  import { calculateCost } from '../chunk-4FALQMOZ.js';
7
7
  import '../chunk-MLDVXMQD.js';
8
- import { init_tracing, getActiveTraceState, runAsync, startSpan, init_diagnostics, report } from '../chunk-Y3BOPSM3.js';
8
+ import { init_tracing, getActiveTraceState, runAsync, startSpan, init_diagnostics, report } from '../chunk-XD4VWCAC.js';
9
9
 
10
10
  // src/anthropic-agent-sdk/client-wrapper.ts
11
11
  init_tracing();
@@ -1,10 +1,10 @@
1
1
  'use strict';
2
2
 
3
- var chunkTGHDV5MC_cjs = require('./chunk-TGHDV5MC.cjs');
4
- var chunkE3G3IE6Y_cjs = require('./chunk-E3G3IE6Y.cjs');
3
+ var chunk3STFITZF_cjs = require('./chunk-3STFITZF.cjs');
4
+ var chunk3H2OJLC2_cjs = require('./chunk-3H2OJLC2.cjs');
5
5
 
6
6
  // src/_agent-sdk-common/span-emitter.ts
7
- chunkE3G3IE6Y_cjs.init_tracing();
7
+ chunk3H2OJLC2_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 = chunkE3G3IE6Y_cjs.startSpan({
28
+ const handle = chunk3H2OJLC2_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 = chunkTGHDV5MC_cjs.absorbErrorsSync(
40
+ var emitAgentSpan = chunk3STFITZF_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 = chunkE3G3IE6Y_cjs.startSpan({
57
+ const handle = chunk3H2OJLC2_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 = chunkTGHDV5MC_cjs.absorbErrorsSync(
83
+ var emitLlmSpan = chunk3STFITZF_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 chunkE3G3IE6Y_cjs.startSpan({
104
+ return chunk3H2OJLC2_cjs.startSpan({
105
105
  name: `${adapter}.tool.${toolName}`,
106
106
  type: "tool",
107
107
  metadata
108
108
  });
109
109
  };
110
- var emitToolSpan = chunkTGHDV5MC_cjs.absorbErrorsSync(
110
+ var emitToolSpan = chunk3STFITZF_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 chunkE3G3IE6Y_cjs.startSpan({
130
+ return chunk3H2OJLC2_cjs.startSpan({
131
131
  name: `${adapter}.subagent.${subagentName}`,
132
132
  type: "agent",
133
133
  metadata
134
134
  });
135
135
  };
136
- var emitSubagentSpan = chunkTGHDV5MC_cjs.absorbErrorsSync(_emitSubagentSpan, {
136
+ var emitSubagentSpan = chunk3STFITZF_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 chunkE3G3IE6Y_cjs.startSpan({
160
+ return chunk3H2OJLC2_cjs.startSpan({
161
161
  name: `${adapter}.hook.${hookKind}.${hookName}`,
162
162
  type: "tool",
163
163
  metadata
164
164
  });
165
165
  };
166
- var emitHookSpan = chunkTGHDV5MC_cjs.absorbErrorsSync(
166
+ var emitHookSpan = chunk3STFITZF_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-DPGUBZVO.cjs.map
179
- //# sourceMappingURL=chunk-DPGUBZVO.cjs.map
178
+ //# sourceMappingURL=chunk-255AHH2W.cjs.map
179
+ //# sourceMappingURL=chunk-255AHH2W.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-XLQSSJUZ.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-255AHH2W.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,11 +1,11 @@
1
1
  'use strict';
2
2
 
3
- var chunkP7XWSMFX_cjs = require('./chunk-P7XWSMFX.cjs');
4
- var chunkPM5D6VXF_cjs = require('./chunk-PM5D6VXF.cjs');
3
+ var chunk3STFITZF_cjs = require('./chunk-3STFITZF.cjs');
4
+ var chunk3H2OJLC2_cjs = require('./chunk-3H2OJLC2.cjs');
5
5
 
6
6
  // src/log.ts
7
- chunkPM5D6VXF_cjs.init_redaction();
8
- chunkPM5D6VXF_cjs.init_tracing();
7
+ chunk3H2OJLC2_cjs.init_redaction();
8
+ chunk3H2OJLC2_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 = chunkPM5D6VXF_cjs.getTransport();
17
+ const transport = chunk3H2OJLC2_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 = chunkPM5D6VXF_cjs.getActiveTraceState();
24
+ const state = chunk3H2OJLC2_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 = chunkPM5D6VXF_cjs.getRedactionConfig();
34
+ const config = chunk3H2OJLC2_cjs.getRedactionConfig();
35
35
  const rawAttributes = options.attributes ?? {};
36
- const redactedAttributes = config.enabled ? chunkPM5D6VXF_cjs.redactValue(rawAttributes, config) : rawAttributes;
37
- const redactedBody = config.enabled ? chunkPM5D6VXF_cjs.redactValue(String(message), config) : String(message);
36
+ const redactedAttributes = config.enabled ? chunk3H2OJLC2_cjs.redactValue(rawAttributes, config) : rawAttributes;
37
+ const redactedBody = config.enabled ? chunk3H2OJLC2_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 = chunkP7XWSMFX_cjs.absorbErrorsSync(logImpl, {
49
+ var log = chunk3STFITZF_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-QCI2ZDQS.cjs.map
56
- //# sourceMappingURL=chunk-QCI2ZDQS.cjs.map
55
+ //# sourceMappingURL=chunk-36QTJJT7.cjs.map
56
+ //# sourceMappingURL=chunk-36QTJJT7.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-QCI2ZDQS.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
+ {"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-36QTJJT7.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"]}
@@ -593,7 +593,7 @@ var init_diagnostics = __esm({
593
593
  "src/_internal/diagnostics.ts"() {
594
594
  init_env();
595
595
  init_redaction();
596
- SDK_VERSION = "0.5.0-rc.3" ;
596
+ SDK_VERSION = "0.5.0-rc.4" ;
597
597
  LEVEL_OFF = "off";
598
598
  LEVEL_ERROR = "error";
599
599
  LEVEL_DEBUG = "debug";
@@ -1262,6 +1262,7 @@ exports._resetForTesting2 = _resetForTesting2;
1262
1262
  exports.buildRedactionConfig = buildRedactionConfig;
1263
1263
  exports.buildTraceEntry = buildTraceEntry;
1264
1264
  exports.extractTraceparent = extractTraceparent;
1265
+ exports.flushOnce = flushOnce;
1265
1266
  exports.formatTraceparent = formatTraceparent;
1266
1267
  exports.generateSpanId = generateSpanId;
1267
1268
  exports.generateTraceId = generateTraceId;
@@ -1305,5 +1306,5 @@ exports.setTransport = setTransport;
1305
1306
  exports.spanAsync = spanAsync;
1306
1307
  exports.spanSync = spanSync;
1307
1308
  exports.startSpan = startSpan;
1308
- //# sourceMappingURL=chunk-PM5D6VXF.cjs.map
1309
- //# sourceMappingURL=chunk-PM5D6VXF.cjs.map
1309
+ //# sourceMappingURL=chunk-3H2OJLC2.cjs.map
1310
+ //# sourceMappingURL=chunk-3H2OJLC2.cjs.map