arkna 2.0.0 → 3.0.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.
Files changed (78) hide show
  1. package/dist/client.d.ts +257 -0
  2. package/dist/client.d.ts.map +1 -0
  3. package/dist/client.js +948 -0
  4. package/dist/client.js.map +1 -0
  5. package/dist/diagnostics.d.ts +41 -0
  6. package/dist/diagnostics.d.ts.map +1 -0
  7. package/dist/diagnostics.js +146 -0
  8. package/dist/diagnostics.js.map +1 -0
  9. package/dist/enforcement.d.ts +67 -0
  10. package/dist/enforcement.d.ts.map +1 -0
  11. package/dist/enforcement.js +303 -0
  12. package/dist/enforcement.js.map +1 -0
  13. package/dist/index.d.ts +27 -1
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +32 -27
  16. package/dist/index.js.map +1 -1
  17. package/dist/init.d.ts +74 -0
  18. package/dist/init.d.ts.map +1 -0
  19. package/dist/init.js +333 -0
  20. package/dist/init.js.map +1 -0
  21. package/dist/instrumentations/langchain.d.ts +79 -0
  22. package/dist/instrumentations/langchain.d.ts.map +1 -0
  23. package/dist/instrumentations/langchain.js +398 -0
  24. package/dist/instrumentations/langchain.js.map +1 -0
  25. package/dist/instrumentations/vercel-ai.d.ts +40 -0
  26. package/dist/instrumentations/vercel-ai.d.ts.map +1 -0
  27. package/dist/instrumentations/vercel-ai.js +212 -0
  28. package/dist/instrumentations/vercel-ai.js.map +1 -0
  29. package/dist/license.d.ts +89 -0
  30. package/dist/license.d.ts.map +1 -0
  31. package/dist/license.js +198 -0
  32. package/dist/license.js.map +1 -0
  33. package/dist/types.d.ts +402 -0
  34. package/dist/types.d.ts.map +1 -0
  35. package/dist/types.js +8 -0
  36. package/dist/types.js.map +1 -0
  37. package/package.json +23 -25
  38. package/bin/arkna.js +0 -2
  39. package/dist/commands/init.d.ts +0 -3
  40. package/dist/commands/init.d.ts.map +0 -1
  41. package/dist/commands/init.js +0 -276
  42. package/dist/commands/init.js.map +0 -1
  43. package/dist/commands/login.d.ts +0 -3
  44. package/dist/commands/login.d.ts.map +0 -1
  45. package/dist/commands/login.js +0 -289
  46. package/dist/commands/login.js.map +0 -1
  47. package/dist/commands/status.d.ts +0 -3
  48. package/dist/commands/status.d.ts.map +0 -1
  49. package/dist/commands/status.js +0 -108
  50. package/dist/commands/status.js.map +0 -1
  51. package/dist/commands/verify.d.ts +0 -3
  52. package/dist/commands/verify.d.ts.map +0 -1
  53. package/dist/commands/verify.js +0 -112
  54. package/dist/commands/verify.js.map +0 -1
  55. package/dist/lib/arkna-dir.d.ts +0 -12
  56. package/dist/lib/arkna-dir.d.ts.map +0 -1
  57. package/dist/lib/arkna-dir.js +0 -89
  58. package/dist/lib/arkna-dir.js.map +0 -1
  59. package/dist/lib/connectivity.d.ts +0 -31
  60. package/dist/lib/connectivity.d.ts.map +0 -1
  61. package/dist/lib/connectivity.js +0 -116
  62. package/dist/lib/connectivity.js.map +0 -1
  63. package/dist/lib/detect.d.ts +0 -35
  64. package/dist/lib/detect.d.ts.map +0 -1
  65. package/dist/lib/detect.js +0 -335
  66. package/dist/lib/detect.js.map +0 -1
  67. package/dist/lib/ui.d.ts +0 -28
  68. package/dist/lib/ui.d.ts.map +0 -1
  69. package/dist/lib/ui.js +0 -176
  70. package/dist/lib/ui.js.map +0 -1
  71. package/dist/lib/update-check.d.ts +0 -7
  72. package/dist/lib/update-check.d.ts.map +0 -1
  73. package/dist/lib/update-check.js +0 -94
  74. package/dist/lib/update-check.js.map +0 -1
  75. package/dist/lib/verify.d.ts +0 -15
  76. package/dist/lib/verify.d.ts.map +0 -1
  77. package/dist/lib/verify.js +0 -33
  78. package/dist/lib/verify.js.map +0 -1
package/dist/index.d.ts CHANGED
@@ -1,2 +1,28 @@
1
- export {};
1
+ /**
2
+ * arkna — Official Node.js SDK for ARKNA AI Agent Observability
3
+ *
4
+ * Quick start (auto-instrumentation):
5
+ * import { init } from 'arkna';
6
+ * init('intk_...');
7
+ * // All OpenAI and Anthropic calls are now automatically recorded
8
+ *
9
+ * Manual instrumentation:
10
+ * import { ArknaClient } from 'arkna';
11
+ * const client = new ArknaClient();
12
+ * const run = await client.startRun({ input: 'my task' });
13
+ * await client.recordStep(run.runId, { stepType: 'reasoning', output: '...' });
14
+ * await client.completeRun(run.runId, { status: 'completed' });
15
+ */
16
+ export { ArknaClient } from './client';
17
+ export { init, trace, shutdown } from './init';
18
+ export type { InitOptions } from './init';
19
+ export { enableEnforcement } from './enforcement';
20
+ export { verify, status } from './diagnostics';
21
+ export type { DiagnosticsConfig, DiagnosticCheck, VerifyResult, StatusResult } from './diagnostics';
22
+ export type { ArknaConfig, ActionResult, ToolDefinition, PortablePermit, HeartbeatResult, RegisterResult, ToolsResponse, GovernanceEnvelope, GatewayMessage, ExecuteOptions, HeartbeatHandle, StartRunOptions, RunHandle, StepOptions, StepResult, ToolCallOptions, CompleteRunOptions, RunResult, CaptureContextOptions, SessionHandle, StepInput, StepBatchResult, CloseSessionResult, } from './types';
23
+ export type { GovernanceContract, EnforcementOptions, EnforcementGuard, } from './enforcement';
24
+ export { ArknaLangChainHandler } from './instrumentations/langchain';
25
+ export type { ArknaLangChainHandlerOptions } from './instrumentations/langchain';
26
+ export { wrapVercelAI } from './instrumentations/vercel-ai';
27
+ export type { WrapVercelAIOptions } from './instrumentations/vercel-ai';
2
28
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAC/C,YAAY,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC/C,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEpG,YAAY,EACV,WAAW,EACX,YAAY,EACZ,cAAc,EACd,cAAc,EACd,eAAe,EACf,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,eAAe,EACf,eAAe,EACf,SAAS,EACT,WAAW,EACX,UAAU,EACV,eAAe,EACf,kBAAkB,EAClB,SAAS,EACT,qBAAqB,EACrB,aAAa,EACb,SAAS,EACT,eAAe,EACf,kBAAkB,GACnB,MAAM,SAAS,CAAC;AAEjB,YAAY,EACV,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,YAAY,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,YAAY,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC"}
package/dist/index.js CHANGED
@@ -1,30 +1,35 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
2
+ /**
3
+ * arkna — Official Node.js SDK for ARKNA AI Agent Observability
4
+ *
5
+ * Quick start (auto-instrumentation):
6
+ * import { init } from 'arkna';
7
+ * init('intk_...');
8
+ * // All OpenAI and Anthropic calls are now automatically recorded
9
+ *
10
+ * Manual instrumentation:
11
+ * import { ArknaClient } from 'arkna';
12
+ * const client = new ArknaClient();
13
+ * const run = await client.startRun({ input: 'my task' });
14
+ * await client.recordStep(run.runId, { stepType: 'reasoning', output: '...' });
15
+ * await client.completeRun(run.runId, { status: 'completed' });
16
+ */
5
17
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const commander_1 = require("commander");
7
- const chalk_1 = __importDefault(require("chalk"));
8
- const init_1 = require("./commands/init");
9
- const verify_1 = require("./commands/verify");
10
- const status_1 = require("./commands/status");
11
- const login_1 = require("./commands/login");
12
- const update_check_1 = require("./lib/update-check");
13
- // Version injected at build time by `npm run build` — never depends on runtime path resolution
14
- const CLI_VERSION = '2.0.0';
15
- const brand = chalk_1.default.hex('#3B82F6');
16
- // Start non-blocking update check (runs at most once per 24h)
17
- const printUpdateNotice = (0, update_check_1.startUpdateCheck)(CLI_VERSION);
18
- const program = new commander_1.Command();
19
- program
20
- .name('arkna')
21
- .description(brand('\u25B2 ARKNA CLI') + chalk_1.default.dim(' \u2014 Agent Observability'))
22
- .version(CLI_VERSION, '-v, --version');
23
- program.addCommand(init_1.initCommand, { isDefault: true });
24
- program.addCommand(verify_1.verifyCommand);
25
- program.addCommand(status_1.statusCommand);
26
- program.addCommand(login_1.loginCommand);
27
- program.parseAsync().then(() => {
28
- printUpdateNotice();
29
- });
18
+ exports.wrapVercelAI = exports.ArknaLangChainHandler = exports.status = exports.verify = exports.enableEnforcement = exports.shutdown = exports.trace = exports.init = exports.ArknaClient = void 0;
19
+ var client_1 = require("./client");
20
+ Object.defineProperty(exports, "ArknaClient", { enumerable: true, get: function () { return client_1.ArknaClient; } });
21
+ var init_1 = require("./init");
22
+ Object.defineProperty(exports, "init", { enumerable: true, get: function () { return init_1.init; } });
23
+ Object.defineProperty(exports, "trace", { enumerable: true, get: function () { return init_1.trace; } });
24
+ Object.defineProperty(exports, "shutdown", { enumerable: true, get: function () { return init_1.shutdown; } });
25
+ var enforcement_1 = require("./enforcement");
26
+ Object.defineProperty(exports, "enableEnforcement", { enumerable: true, get: function () { return enforcement_1.enableEnforcement; } });
27
+ var diagnostics_1 = require("./diagnostics");
28
+ Object.defineProperty(exports, "verify", { enumerable: true, get: function () { return diagnostics_1.verify; } });
29
+ Object.defineProperty(exports, "status", { enumerable: true, get: function () { return diagnostics_1.status; } });
30
+ // Auto-instrumentation for frameworks (peer dependencies required)
31
+ var langchain_1 = require("./instrumentations/langchain");
32
+ Object.defineProperty(exports, "ArknaLangChainHandler", { enumerable: true, get: function () { return langchain_1.ArknaLangChainHandler; } });
33
+ var vercel_ai_1 = require("./instrumentations/vercel-ai");
34
+ Object.defineProperty(exports, "wrapVercelAI", { enumerable: true, get: function () { return vercel_ai_1.wrapVercelAI; } });
30
35
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;AAAA,yCAAoC;AACpC,kDAA0B;AAC1B,0CAA8C;AAC9C,8CAAkD;AAClD,8CAAkD;AAClD,4CAAgD;AAChD,qDAAsD;AAEtD,+FAA+F;AAC/F,MAAM,WAAW,GAAG,iBAAiB,CAAC;AAEtC,MAAM,KAAK,GAAG,eAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAEnC,8DAA8D;AAC9D,MAAM,iBAAiB,GAAG,IAAA,+BAAgB,EAAC,WAAW,CAAC,CAAC;AAExD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,KAAK,CAAC,kBAAkB,CAAC,GAAG,eAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;KACjF,OAAO,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;AAEzC,OAAO,CAAC,UAAU,CAAC,kBAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACrD,OAAO,CAAC,UAAU,CAAC,sBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,sBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,oBAAY,CAAC,CAAC;AAEjC,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;IAC7B,iBAAiB,EAAE,CAAC;AACtB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAEH,mCAAuC;AAA9B,qGAAA,WAAW,OAAA;AACpB,+BAA+C;AAAtC,4FAAA,IAAI,OAAA;AAAE,6FAAA,KAAK,OAAA;AAAE,gGAAA,QAAQ,OAAA;AAE9B,6CAAkD;AAAzC,gHAAA,iBAAiB,OAAA;AAC1B,6CAA+C;AAAtC,qGAAA,MAAM,OAAA;AAAE,qGAAA,MAAM,OAAA;AAmCvB,mEAAmE;AACnE,0DAAqE;AAA5D,kHAAA,qBAAqB,OAAA;AAE9B,0DAA4D;AAAnD,yGAAA,YAAY,OAAA"}
package/dist/init.d.ts ADDED
@@ -0,0 +1,74 @@
1
+ /**
2
+ * ARKNA Auto-Instrumentation for Node.js
3
+ *
4
+ * Usage:
5
+ * import { init } from 'arkna';
6
+ * init('intk_...');
7
+ *
8
+ * Or with env vars:
9
+ * ARKNA_TOKEN=intk_... node app.js
10
+ * import { init } from 'arkna';
11
+ * init();
12
+ *
13
+ * All OpenAI and Anthropic SDK calls are automatically recorded as ARKNA runs.
14
+ * Each LLM call becomes a run with a reasoning step. Use trace() to group
15
+ * multiple LLM calls into a single run.
16
+ */
17
+ export interface InitOptions {
18
+ /** Integration token (intk_...) — or set ARKNA_TOKEN env var */
19
+ apiKey?: string;
20
+ /** API base URL (default: https://api.arkna.com.au) — or set ARKNA_URL env var */
21
+ baseUrl?: string;
22
+ /** Print debug info to console */
23
+ debug?: boolean;
24
+ }
25
+ /**
26
+ * Initialize ARKNA auto-instrumentation.
27
+ *
28
+ * Monkey-patches OpenAI and Anthropic SDKs to automatically record all LLM
29
+ * calls as ARKNA observability runs. Each call creates a run with a reasoning
30
+ * step capturing model, tokens, cost, latency, and input/output.
31
+ *
32
+ * @example
33
+ * ```typescript
34
+ * import { init } from 'arkna';
35
+ *
36
+ * // With API key directly
37
+ * init('intk_...');
38
+ *
39
+ * // With env vars (ARKNA_TOKEN)
40
+ * init();
41
+ *
42
+ * // With options
43
+ * init({ apiKey: 'intk_...', debug: true });
44
+ * ```
45
+ */
46
+ export declare function init(apiKeyOrOptions?: string | InitOptions): void;
47
+ /**
48
+ * Trace a function as a single ARKNA run.
49
+ *
50
+ * All LLM calls made inside the function are recorded as steps in a single
51
+ * run, rather than creating separate runs for each call.
52
+ *
53
+ * @example
54
+ * ```typescript
55
+ * import { init, trace } from 'arkna';
56
+ * init();
57
+ *
58
+ * const result = await trace('research-task', async () => {
59
+ * const plan = await openai.chat.completions.create({ ... });
60
+ * const result = await openai.chat.completions.create({ ... });
61
+ * return result.choices[0].message.content;
62
+ * });
63
+ * ```
64
+ */
65
+ export declare function trace<T>(name: string, fn: () => Promise<T>, options?: {
66
+ sessionId?: string;
67
+ metadata?: Record<string, unknown>;
68
+ }): Promise<T>;
69
+ /**
70
+ * Shut down ARKNA instrumentation and clear internal state.
71
+ * Call before process exit if you want to ensure clean teardown.
72
+ */
73
+ export declare function shutdown(): void;
74
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAqPH,MAAM,WAAW,WAAW;IAC1B,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,IAAI,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CA6BjE;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,KAAK,CAAC,CAAC,EAC3B,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GACnE,OAAO,CAAC,CAAC,CAAC,CAgCZ;AAED;;;GAGG;AACH,wBAAgB,QAAQ,IAAI,IAAI,CAI/B"}
package/dist/init.js ADDED
@@ -0,0 +1,333 @@
1
+ "use strict";
2
+ /**
3
+ * ARKNA Auto-Instrumentation for Node.js
4
+ *
5
+ * Usage:
6
+ * import { init } from 'arkna';
7
+ * init('intk_...');
8
+ *
9
+ * Or with env vars:
10
+ * ARKNA_TOKEN=intk_... node app.js
11
+ * import { init } from 'arkna';
12
+ * init();
13
+ *
14
+ * All OpenAI and Anthropic SDK calls are automatically recorded as ARKNA runs.
15
+ * Each LLM call becomes a run with a reasoning step. Use trace() to group
16
+ * multiple LLM calls into a single run.
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.init = init;
20
+ exports.trace = trace;
21
+ exports.shutdown = shutdown;
22
+ const async_hooks_1 = require("async_hooks");
23
+ const _config = { apiKey: '', ingestionUrl: '', debug: false };
24
+ let _initialized = false;
25
+ const _runCtx = new async_hooks_1.AsyncLocalStorage();
26
+ // ── HTTP helpers (zero dependencies, uses Node 18+ fetch) ───
27
+ async function _post(path, body) {
28
+ try {
29
+ const resp = await fetch(`${_config.ingestionUrl}${path}`, {
30
+ method: 'POST',
31
+ headers: {
32
+ 'X-Integration-Token': _config.apiKey,
33
+ 'Content-Type': 'application/json',
34
+ },
35
+ body: JSON.stringify(body),
36
+ signal: AbortSignal.timeout(10_000),
37
+ });
38
+ return resp.ok ? await resp.json() : null;
39
+ }
40
+ catch {
41
+ return null;
42
+ }
43
+ }
44
+ async function _patch(path, body) {
45
+ try {
46
+ const resp = await fetch(`${_config.ingestionUrl}${path}`, {
47
+ method: 'PATCH',
48
+ headers: {
49
+ 'X-Integration-Token': _config.apiKey,
50
+ 'Content-Type': 'application/json',
51
+ },
52
+ body: JSON.stringify(body),
53
+ signal: AbortSignal.timeout(10_000),
54
+ });
55
+ return resp.ok ? await resp.json() : null;
56
+ }
57
+ catch {
58
+ return null;
59
+ }
60
+ }
61
+ // ── Cost estimation (per 1K tokens, USD) ────────────────────
62
+ const _COSTS = {
63
+ 'gpt-4o': [0.0025, 0.01],
64
+ 'gpt-4o-mini': [0.00015, 0.0006],
65
+ 'gpt-4-turbo': [0.01, 0.03],
66
+ 'gpt-4': [0.03, 0.06],
67
+ 'gpt-3.5-turbo': [0.0005, 0.0015],
68
+ 'claude-opus-4-6': [0.015, 0.075],
69
+ 'claude-sonnet-4-5-20250929': [0.003, 0.015],
70
+ 'claude-haiku-4-5-20251001': [0.0008, 0.004],
71
+ 'claude-3-5-sonnet-20241022': [0.003, 0.015],
72
+ 'claude-3-haiku-20240307': [0.00025, 0.00125],
73
+ };
74
+ function _costCents(model, inp, out) {
75
+ let c = _COSTS[model];
76
+ if (!c) {
77
+ for (const [k, v] of Object.entries(_COSTS)) {
78
+ if (model.startsWith(k)) {
79
+ c = v;
80
+ break;
81
+ }
82
+ }
83
+ }
84
+ if (!c)
85
+ return 0;
86
+ return Math.round(((inp / 1000) * c[0] + (out / 1000) * c[1]) * 10000) / 100;
87
+ }
88
+ // ── Recording (fire-and-forget) ─────────────────────────────
89
+ function _record(provider, model, input, output, durationMs, tokens, error) {
90
+ const run = _runCtx.getStore();
91
+ const cost = _costCents(model, tokens.inp, tokens.out);
92
+ const stepBody = {
93
+ step_type: error ? 'error' : 'reasoning',
94
+ input: input.substring(0, 10000),
95
+ output: (error ? `${error.type}: ${error.message}` : output).substring(0, 10000),
96
+ duration_ms: durationMs,
97
+ tokens_used: tokens.total || undefined,
98
+ cost_cents: cost || undefined,
99
+ metadata: {
100
+ provider,
101
+ model,
102
+ prompt_tokens: tokens.inp,
103
+ completion_tokens: tokens.out,
104
+ },
105
+ };
106
+ if (error) {
107
+ stepBody.error_type = error.type;
108
+ stepBody.error_message = error.message;
109
+ }
110
+ if (run) {
111
+ // Inside a trace() — record as step in existing run
112
+ _post(`/runs/${run.runId}/steps`, stepBody).catch(() => { });
113
+ run.stepCount++;
114
+ }
115
+ else {
116
+ // Standalone call — create run → record step → complete run
117
+ (async () => {
118
+ const r = await _post('/runs', {
119
+ trigger_type: 'auto',
120
+ input: input.substring(0, 5000),
121
+ metadata: { provider, model, auto_instrumented: true },
122
+ });
123
+ if (!r?.run_id)
124
+ return;
125
+ await _post(`/runs/${r.run_id}/steps`, stepBody);
126
+ const completeBody = {
127
+ status: error ? 'failed' : 'completed',
128
+ output: output.substring(0, 5000),
129
+ total_tokens: tokens.total || undefined,
130
+ total_cost_cents: cost || undefined,
131
+ };
132
+ if (error) {
133
+ completeBody.error_type = error.type;
134
+ completeBody.error_message = error.message;
135
+ }
136
+ await _patch(`/runs/${r.run_id}`, completeBody);
137
+ })().catch(() => { });
138
+ }
139
+ }
140
+ // ── OpenAI patch ────────────────────────────────────────────
141
+ function _patchOpenAI() {
142
+ try {
143
+ const mod = require('openai/resources/chat/completions');
144
+ const Cls = mod.Completions;
145
+ if (!Cls?.prototype?.create || Cls.prototype.create.__arkna)
146
+ return false;
147
+ const orig = Cls.prototype.create;
148
+ const patched = async function (body, opts) {
149
+ const t0 = Date.now();
150
+ const msgs = body?.messages;
151
+ const inputStr = Array.isArray(msgs)
152
+ ? JSON.stringify(msgs.slice(-3))
153
+ : String(msgs ?? '');
154
+ try {
155
+ const res = await orig.call(this, body, opts);
156
+ if (!body?.stream && res?.choices) {
157
+ const out = res.choices[0]?.message?.content ?? '';
158
+ const u = res.usage ?? {};
159
+ _record('openai', body.model ?? 'unknown', inputStr, out, Date.now() - t0, {
160
+ inp: u.prompt_tokens ?? 0,
161
+ out: u.completion_tokens ?? 0,
162
+ total: u.total_tokens ?? 0,
163
+ });
164
+ }
165
+ return res;
166
+ }
167
+ catch (e) {
168
+ _record('openai', body?.model ?? 'unknown', inputStr, '', Date.now() - t0, { inp: 0, out: 0, total: 0 }, { type: e.name || 'Error', message: e.message });
169
+ throw e;
170
+ }
171
+ };
172
+ patched.__arkna = true;
173
+ Cls.prototype.create = patched;
174
+ if (_config.debug)
175
+ console.log('[arkna] Patched openai.chat.completions.create');
176
+ return true;
177
+ }
178
+ catch {
179
+ return false;
180
+ }
181
+ }
182
+ // ── Anthropic patch ─────────────────────────────────────────
183
+ function _patchAnthropic() {
184
+ try {
185
+ const mod = require('@anthropic-ai/sdk/resources/messages');
186
+ const Cls = mod.Messages;
187
+ if (!Cls?.prototype?.create || Cls.prototype.create.__arkna)
188
+ return false;
189
+ const orig = Cls.prototype.create;
190
+ const patched = async function (body, opts) {
191
+ const t0 = Date.now();
192
+ const msgs = body?.messages;
193
+ const inputStr = Array.isArray(msgs)
194
+ ? JSON.stringify(msgs.slice(-3))
195
+ : String(msgs ?? '');
196
+ try {
197
+ const res = await orig.call(this, body, opts);
198
+ if (!body?.stream && res?.content) {
199
+ const out = res.content.map((c) => c.text ?? '').join('');
200
+ const u = res.usage ?? {};
201
+ const inp = u.input_tokens ?? 0;
202
+ const outp = u.output_tokens ?? 0;
203
+ _record('anthropic', body.model ?? 'unknown', inputStr, out, Date.now() - t0, {
204
+ inp,
205
+ out: outp,
206
+ total: inp + outp,
207
+ });
208
+ }
209
+ return res;
210
+ }
211
+ catch (e) {
212
+ _record('anthropic', body?.model ?? 'unknown', inputStr, '', Date.now() - t0, { inp: 0, out: 0, total: 0 }, { type: e.name || 'Error', message: e.message });
213
+ throw e;
214
+ }
215
+ };
216
+ patched.__arkna = true;
217
+ Cls.prototype.create = patched;
218
+ if (_config.debug)
219
+ console.log('[arkna] Patched anthropic.messages.create');
220
+ return true;
221
+ }
222
+ catch {
223
+ return false;
224
+ }
225
+ }
226
+ /**
227
+ * Initialize ARKNA auto-instrumentation.
228
+ *
229
+ * Monkey-patches OpenAI and Anthropic SDKs to automatically record all LLM
230
+ * calls as ARKNA observability runs. Each call creates a run with a reasoning
231
+ * step capturing model, tokens, cost, latency, and input/output.
232
+ *
233
+ * @example
234
+ * ```typescript
235
+ * import { init } from 'arkna';
236
+ *
237
+ * // With API key directly
238
+ * init('intk_...');
239
+ *
240
+ * // With env vars (ARKNA_TOKEN)
241
+ * init();
242
+ *
243
+ * // With options
244
+ * init({ apiKey: 'intk_...', debug: true });
245
+ * ```
246
+ */
247
+ function init(apiKeyOrOptions) {
248
+ if (_initialized)
249
+ return;
250
+ const opts = typeof apiKeyOrOptions === 'string'
251
+ ? { apiKey: apiKeyOrOptions }
252
+ : (apiKeyOrOptions ?? {});
253
+ const apiKey = opts.apiKey || process.env.ARKNA_TOKEN || '';
254
+ const baseUrl = (opts.baseUrl || process.env.ARKNA_URL || 'https://api.arkna.com.au')
255
+ .replace(/\/+$/, '');
256
+ _config.debug = opts.debug ?? false;
257
+ if (!apiKey) {
258
+ if (_config.debug)
259
+ console.warn('[arkna] No API key. Set ARKNA_TOKEN or pass to init().');
260
+ return;
261
+ }
262
+ _config.apiKey = apiKey;
263
+ _config.ingestionUrl = baseUrl.endsWith('/api/v1') ? baseUrl : `${baseUrl}/api/v1`;
264
+ _initialized = true;
265
+ const patched = [];
266
+ if (_patchOpenAI())
267
+ patched.push('openai');
268
+ if (_patchAnthropic())
269
+ patched.push('anthropic');
270
+ if (_config.debug) {
271
+ console.log(`[arkna] Initialized. Patched: ${patched.length ? patched.join(', ') : 'none (install openai or @anthropic-ai/sdk)'}`);
272
+ }
273
+ }
274
+ /**
275
+ * Trace a function as a single ARKNA run.
276
+ *
277
+ * All LLM calls made inside the function are recorded as steps in a single
278
+ * run, rather than creating separate runs for each call.
279
+ *
280
+ * @example
281
+ * ```typescript
282
+ * import { init, trace } from 'arkna';
283
+ * init();
284
+ *
285
+ * const result = await trace('research-task', async () => {
286
+ * const plan = await openai.chat.completions.create({ ... });
287
+ * const result = await openai.chat.completions.create({ ... });
288
+ * return result.choices[0].message.content;
289
+ * });
290
+ * ```
291
+ */
292
+ async function trace(name, fn, options) {
293
+ if (!_initialized)
294
+ return fn();
295
+ const run = await _post('/runs', {
296
+ trigger_type: 'auto',
297
+ input: name,
298
+ session_id: options?.sessionId,
299
+ metadata: { ...options?.metadata, auto_instrumented: true },
300
+ });
301
+ if (!run?.run_id)
302
+ return fn();
303
+ const ctx = { runId: run.run_id, stepCount: 0 };
304
+ return _runCtx.run(ctx, async () => {
305
+ try {
306
+ const result = await fn();
307
+ const out = typeof result === 'string' ? result : JSON.stringify(result);
308
+ _patch(`/runs/${run.run_id}`, {
309
+ status: 'completed',
310
+ output: out?.substring(0, 5000),
311
+ }).catch(() => { });
312
+ return result;
313
+ }
314
+ catch (err) {
315
+ _patch(`/runs/${run.run_id}`, {
316
+ status: 'failed',
317
+ error_type: err.name || 'Error',
318
+ error_message: err.message,
319
+ }).catch(() => { });
320
+ throw err;
321
+ }
322
+ });
323
+ }
324
+ /**
325
+ * Shut down ARKNA instrumentation and clear internal state.
326
+ * Call before process exit if you want to ensure clean teardown.
327
+ */
328
+ function shutdown() {
329
+ _initialized = false;
330
+ _config.apiKey = '';
331
+ _config.ingestionUrl = '';
332
+ }
333
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * ARKNA LangChain Auto-Instrumentation
3
+ *
4
+ * Callback handler that automatically captures LangChain chain/agent
5
+ * executions as ARKNA observability runs — no manual SDK calls needed.
6
+ *
7
+ * Usage:
8
+ * import { ArknaClient, ArknaLangChainHandler } from 'arkna';
9
+ * const client = new ArknaClient();
10
+ * const handler = new ArknaLangChainHandler(client);
11
+ * const result = await chain.invoke(input, { callbacks: [handler] });
12
+ *
13
+ * Requires: langchain >= 0.2.0 (peer dependency, not bundled)
14
+ */
15
+ import type { ArknaClient } from '../client';
16
+ /** Options for the ARKNA LangChain handler */
17
+ export interface ArknaLangChainHandlerOptions {
18
+ /** Session ID to group related runs */
19
+ sessionId?: string;
20
+ /** How the run was triggered (e.g. 'api', 'user', 'cron') */
21
+ trigger?: string;
22
+ /** Additional metadata attached to the run */
23
+ metadata?: Record<string, unknown>;
24
+ }
25
+ /**
26
+ * LangChain callback handler that auto-captures runs into ARKNA observability.
27
+ *
28
+ * Event mapping:
29
+ * chain start → startRun() (top-level) or recordStep(reasoning) (nested)
30
+ * LLM start → recordStep(reasoning)
31
+ * LLM end → update step with output + token usage
32
+ * tool start → recordToolCall()
33
+ * tool end → (tool result captured)
34
+ * retriever → recordStep(retrieval)
35
+ * chain end → completeRun(completed)
36
+ * chain error → completeRun(failed)
37
+ *
38
+ * This class dynamically extends BaseCallbackHandler at runtime so that
39
+ * `@langchain/core` is only required at runtime (peer dependency).
40
+ */
41
+ export declare class ArknaLangChainHandler {
42
+ private client;
43
+ private sessionId?;
44
+ private trigger;
45
+ private runMetadata;
46
+ private runs;
47
+ private parentToArknaRun;
48
+ private rootRunId;
49
+ private _handler;
50
+ constructor(client: ArknaClient, options?: ArknaLangChainHandlerOptions);
51
+ /**
52
+ * Get the LangChain-compatible callback handler instance.
53
+ * Lazily creates a BaseCallbackHandler subclass on first access.
54
+ * Pass this to LangChain's `callbacks` option.
55
+ */
56
+ get handler(): any;
57
+ /**
58
+ * Also allow using the ArknaLangChainHandler directly as a callback
59
+ * by implementing the key callback methods on the instance itself.
60
+ * LangChain checks for method existence, so this works as a duck-typed handler.
61
+ */
62
+ private createHandler;
63
+ private post;
64
+ private patch;
65
+ private handleChainStart;
66
+ private handleChainEnd;
67
+ private handleChainError;
68
+ private handleLLMStart;
69
+ private handleLLMEnd;
70
+ private handleLLMError;
71
+ private handleToolStart;
72
+ private handleToolError;
73
+ private handleRetrieverStart;
74
+ private handleRetrieverEnd;
75
+ private handleRetrieverError;
76
+ private getArknaRunId;
77
+ private cleanup;
78
+ }
79
+ //# sourceMappingURL=langchain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"langchain.d.ts","sourceRoot":"","sources":["../../src/instrumentations/langchain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,8CAA8C;AAC9C,MAAM,WAAW,4BAA4B;IAC3C,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAQD;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAA0B;IAG7C,OAAO,CAAC,IAAI,CAA+B;IAE3C,OAAO,CAAC,gBAAgB,CAA6B;IAErD,OAAO,CAAC,SAAS,CAAuB;IAGxC,OAAO,CAAC,QAAQ,CAAa;gBAEjB,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,4BAA4B;IAOvE;;;;OAIG;IACH,IAAI,OAAO,IAAI,GAAG,CAKjB;IAED;;;;OAIG;IACH,OAAO,CAAC,aAAa;YAuDP,IAAI;YAIJ,KAAK;YAQL,gBAAgB;YA6ChB,cAAc;YAkBd,gBAAgB;YAyBhB,cAAc;YA8Bd,YAAY;YA8BZ,cAAc;YAsBd,eAAe;YA+Cf,eAAe;YAsBf,oBAAoB;YA6BpB,kBAAkB;YAwBlB,oBAAoB;IAsBlC,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,OAAO;CAKhB"}