@namzu/sdk 0.4.3 → 0.4.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 (105) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/dist/bridge/tools/connector/adapter.d.ts +2 -2
  3. package/dist/bus/index.d.ts +3 -1
  4. package/dist/bus/index.d.ts.map +1 -1
  5. package/dist/bus/index.js +18 -11
  6. package/dist/bus/index.js.map +1 -1
  7. package/dist/config/runtime.d.ts +28 -28
  8. package/dist/probe/context.d.ts +8 -0
  9. package/dist/probe/context.d.ts.map +1 -0
  10. package/dist/probe/context.js +7 -0
  11. package/dist/probe/context.js.map +1 -0
  12. package/dist/probe/errors.d.ts +12 -0
  13. package/dist/probe/errors.d.ts.map +1 -0
  14. package/dist/probe/errors.js +21 -0
  15. package/dist/probe/errors.js.map +1 -0
  16. package/dist/probe/index.d.ts +5 -0
  17. package/dist/probe/index.d.ts.map +1 -0
  18. package/dist/probe/index.js +4 -0
  19. package/dist/probe/index.js.map +1 -0
  20. package/dist/probe/registry.d.ts +24 -0
  21. package/dist/probe/registry.d.ts.map +1 -0
  22. package/dist/probe/registry.js +228 -0
  23. package/dist/probe/registry.js.map +1 -0
  24. package/dist/probe/registry.test.d.ts +7 -0
  25. package/dist/probe/registry.test.d.ts.map +1 -0
  26. package/dist/probe/registry.test.js +310 -0
  27. package/dist/probe/registry.test.js.map +1 -0
  28. package/dist/provider/instrumentation.d.ts +9 -0
  29. package/dist/provider/instrumentation.d.ts.map +1 -0
  30. package/dist/provider/instrumentation.js +104 -0
  31. package/dist/provider/instrumentation.js.map +1 -0
  32. package/dist/provider/instrumentation.test.d.ts +2 -0
  33. package/dist/provider/instrumentation.test.d.ts.map +1 -0
  34. package/dist/provider/instrumentation.test.js +152 -0
  35. package/dist/provider/instrumentation.test.js.map +1 -0
  36. package/dist/public-runtime.d.ts +5 -0
  37. package/dist/public-runtime.d.ts.map +1 -1
  38. package/dist/public-runtime.js +4 -0
  39. package/dist/public-runtime.js.map +1 -1
  40. package/dist/public-types.d.ts +3 -0
  41. package/dist/public-types.d.ts.map +1 -1
  42. package/dist/runtime/query/events.d.ts +3 -1
  43. package/dist/runtime/query/events.d.ts.map +1 -1
  44. package/dist/runtime/query/events.js +6 -1
  45. package/dist/runtime/query/events.js.map +1 -1
  46. package/dist/runtime/query/executor.d.ts +3 -1
  47. package/dist/runtime/query/executor.d.ts.map +1 -1
  48. package/dist/runtime/query/executor.js +30 -1
  49. package/dist/runtime/query/executor.js.map +1 -1
  50. package/dist/types/bus/index.d.ts +46 -2
  51. package/dist/types/bus/index.d.ts.map +1 -1
  52. package/dist/types/doctor/check.d.ts +41 -0
  53. package/dist/types/doctor/check.d.ts.map +1 -0
  54. package/dist/types/doctor/check.js +2 -0
  55. package/dist/types/doctor/check.js.map +1 -0
  56. package/dist/types/doctor/index.d.ts +2 -0
  57. package/dist/types/doctor/index.d.ts.map +1 -0
  58. package/dist/types/doctor/index.js +2 -0
  59. package/dist/types/doctor/index.js.map +1 -0
  60. package/dist/types/probe/event-kind.d.ts +6 -0
  61. package/dist/types/probe/event-kind.d.ts.map +1 -0
  62. package/dist/types/probe/event-kind.js +2 -0
  63. package/dist/types/probe/event-kind.js.map +1 -0
  64. package/dist/types/probe/event-of.d.ts +5 -0
  65. package/dist/types/probe/event-of.d.ts.map +1 -0
  66. package/dist/types/probe/event-of.js +2 -0
  67. package/dist/types/probe/event-of.js.map +1 -0
  68. package/dist/types/probe/index.d.ts +4 -0
  69. package/dist/types/probe/index.d.ts.map +1 -0
  70. package/dist/types/probe/index.js +2 -0
  71. package/dist/types/probe/index.js.map +1 -0
  72. package/dist/types/probe/registry.d.ts +27 -0
  73. package/dist/types/probe/registry.d.ts.map +1 -0
  74. package/dist/types/probe/registry.js +2 -0
  75. package/dist/types/probe/registry.js.map +1 -0
  76. package/dist/vault/instrumentation.d.ts +11 -0
  77. package/dist/vault/instrumentation.d.ts.map +1 -0
  78. package/dist/vault/instrumentation.js +32 -0
  79. package/dist/vault/instrumentation.js.map +1 -0
  80. package/dist/vault/instrumentation.test.d.ts +2 -0
  81. package/dist/vault/instrumentation.test.d.ts.map +1 -0
  82. package/dist/vault/instrumentation.test.js +80 -0
  83. package/dist/vault/instrumentation.test.js.map +1 -0
  84. package/package.json +1 -1
  85. package/src/bus/index.ts +21 -10
  86. package/src/probe/context.ts +14 -0
  87. package/src/probe/errors.ts +27 -0
  88. package/src/probe/index.ts +4 -0
  89. package/src/probe/registry.test.ts +480 -0
  90. package/src/probe/registry.ts +276 -0
  91. package/src/provider/instrumentation.test.ts +192 -0
  92. package/src/provider/instrumentation.ts +139 -0
  93. package/src/public-runtime.ts +17 -0
  94. package/src/public-types.ts +3 -0
  95. package/src/runtime/query/events.ts +6 -1
  96. package/src/runtime/query/executor.ts +34 -0
  97. package/src/types/bus/index.ts +54 -2
  98. package/src/types/doctor/check.ts +53 -0
  99. package/src/types/doctor/index.ts +9 -0
  100. package/src/types/probe/event-kind.ts +8 -0
  101. package/src/types/probe/event-of.ts +3 -0
  102. package/src/types/probe/index.ts +11 -0
  103. package/src/types/probe/registry.ts +36 -0
  104. package/src/vault/instrumentation.test.ts +98 -0
  105. package/src/vault/instrumentation.ts +56 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../src/vault/instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAsB,KAAK,IAAI,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAWxF,MAAM,UAAU,mBAAmB,CAClC,KAAsB,EACtB,OAAoC,EAAE;IAEtC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,oBAAoB,CAAA;IAClD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;IACxB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,CAAA;IACtD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAA;IAElC,OAAO;QACN,KAAK,CACJ,QAAkB,EAClB,WAAwB,EACxB,KAAa,EACb,IAAgB;YAEhB,OAAO,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;QACvD,CAAC;QAED,KAAK,CAAC,QAAQ,CAAC,YAA0B;YACxC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;YACjD,MAAM,CAAC,QAAQ,CACd;gBACC,IAAI,EAAE,cAAc;gBACpB,OAAO;gBACP,YAAY;gBACZ,QAAQ,EAAE,YAAY;gBACtB,KAAK,EAAE,MAAM,KAAK,SAAS;gBAC3B,KAAK;aACL,EACD,iBAAiB,CAAC,EAAE,KAAK,EAAE,CAAC,CAC5B,CAAA;YACD,OAAO,MAAM,CAAA;QACd,CAAC;QAED,MAAM,CAAC,YAA0B;YAChC,OAAO,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;QAClC,CAAC;QAED,IAAI,CAAC,QAAkB,EAAE,WAAyB;YACjD,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;QACzC,CAAC;KACD,CAAA;AACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=instrumentation.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instrumentation.test.d.ts","sourceRoot":"","sources":["../../src/vault/instrumentation.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,80 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { createProbeRegistry } from '../probe/registry.js';
3
+ import { InMemoryCredentialVault } from './InMemoryCredentialVault.js';
4
+ import { wrapVaultWithProbes } from './instrumentation.js';
5
+ const tenant = 'tnt_acme';
6
+ const connector = 'conn_x';
7
+ describe('wrapVaultWithProbes', () => {
8
+ it('emits vault_lookup with found:true when retrieve hits', async () => {
9
+ const reg = createProbeRegistry();
10
+ const seen = [];
11
+ reg.onAny((event) => seen.push(event));
12
+ const inner = new InMemoryCredentialVault();
13
+ const ref = await inner.store(tenant, connector, 'k', { type: 'apiKey', apiKey: 's' });
14
+ const wrapped = wrapVaultWithProbes(inner, { probes: reg, vaultId: 'in-memory' });
15
+ const result = await wrapped.retrieve(ref.id);
16
+ expect(result).toBeDefined();
17
+ expect(seen.length).toBe(1);
18
+ const event = seen[0];
19
+ expect(event.type).toBe('vault_lookup');
20
+ expect(event.found).toBe(true);
21
+ expect(event.vaultId).toBe('in-memory');
22
+ expect(event.credentialId).toBe(ref.id);
23
+ });
24
+ it('emits vault_lookup with found:false when retrieve misses', async () => {
25
+ const reg = createProbeRegistry();
26
+ const seen = [];
27
+ reg.onAny((event) => seen.push(event));
28
+ const wrapped = wrapVaultWithProbes(new InMemoryCredentialVault(), {
29
+ probes: reg,
30
+ vaultId: 'in-memory',
31
+ });
32
+ const missing = 'cred_missing';
33
+ const result = await wrapped.retrieve(missing);
34
+ expect(result).toBeUndefined();
35
+ expect(seen.length).toBe(1);
36
+ const event = seen[0];
37
+ expect(event.found).toBe(false);
38
+ expect(event.credentialId).toBe(missing);
39
+ });
40
+ it('does not emit on store/revoke/list — retrieve is the audit point', async () => {
41
+ const reg = createProbeRegistry();
42
+ const seen = [];
43
+ reg.onAny((event) => seen.push(event));
44
+ const wrapped = wrapVaultWithProbes(new InMemoryCredentialVault(), { probes: reg });
45
+ const ref = await wrapped.store(tenant, connector, 'k', {
46
+ type: 'apiKey',
47
+ apiKey: 's',
48
+ });
49
+ await wrapped.list(tenant);
50
+ await wrapped.revoke(ref.id);
51
+ expect(seen.length).toBe(0);
52
+ });
53
+ it('does not leak the secret value in the emitted event', async () => {
54
+ const reg = createProbeRegistry();
55
+ const seen = [];
56
+ reg.onAny((event) => seen.push(event));
57
+ const inner = new InMemoryCredentialVault();
58
+ const ref = await inner.store(tenant, connector, 'k', {
59
+ type: 'apiKey',
60
+ apiKey: 'super-secret-value',
61
+ });
62
+ const wrapped = wrapVaultWithProbes(inner, { probes: reg });
63
+ await wrapped.retrieve(ref.id);
64
+ const event = seen[0];
65
+ const serialized = JSON.stringify(event);
66
+ expect(serialized).not.toContain('super-secret-value');
67
+ });
68
+ it('falls back to constructor.name as vaultId when not specified', async () => {
69
+ const reg = createProbeRegistry();
70
+ const seen = [];
71
+ reg.onAny((event) => seen.push(event));
72
+ const inner = new InMemoryCredentialVault();
73
+ const ref = await inner.store(tenant, connector, 'k', { type: 'apiKey', apiKey: 's' });
74
+ const wrapped = wrapVaultWithProbes(inner, { probes: reg });
75
+ await wrapped.retrieve(ref.id);
76
+ const event = seen[0];
77
+ expect(event.vaultId).toBe('InMemoryCredentialVault');
78
+ });
79
+ });
80
+ //# sourceMappingURL=instrumentation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instrumentation.test.js","sourceRoot":"","sources":["../../src/vault/instrumentation.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@namzu/sdk",
3
- "version": "0.4.3",
3
+ "version": "0.4.4",
4
4
  "description": "Open-source AI agent SDK with a built-in runtime. Nothing between you and your agents.",
5
5
  "license": "FSL-1.1-MIT",
6
6
  "type": "module",
package/src/bus/index.ts CHANGED
@@ -5,6 +5,8 @@ import {
5
5
  DEFAULT_LOCK_TIMEOUT_MS,
6
6
  DEFAULT_MAX_LOCKS_PER_AGENT,
7
7
  } from '../constants/bus/index.js'
8
+ import { buildProbeContext } from '../probe/context.js'
9
+ import { type ProbeRegistry, probe as defaultProbeRegistry } from '../probe/registry.js'
8
10
  import type { AgentBusEvent, AgentBusEventListener } from '../types/bus/index.js'
9
11
  import type { RunId } from '../types/ids/index.js'
10
12
  import type { Logger } from '../utils/logger.js'
@@ -39,10 +41,17 @@ export class AgentBus {
39
41
  private readonly listeners: Set<AgentBusEventListener> = new Set()
40
42
  private readonly log: Logger
41
43
  private readonly config: AgentBusConfig
44
+ private readonly probes: ProbeRegistry
42
45
 
43
- constructor(log: Logger, config: Partial<AgentBusConfig> = {}) {
46
+ constructor(
47
+ log: Logger,
48
+ config: Partial<AgentBusConfig> = {},
49
+ probeRegistry: ProbeRegistry = defaultProbeRegistry,
50
+ ) {
44
51
  this.config = { ...DEFAULT_AGENT_BUS_CONFIG, ...config }
45
52
  this.log = log.child({ component: 'AgentBus' })
53
+ this.probes = probeRegistry
54
+ this.probes.setLogger(log)
46
55
 
47
56
  const emitFn = (event: AgentBusEvent): void => this.emit(event)
48
57
 
@@ -70,16 +79,18 @@ export class AgentBus {
70
79
  }
71
80
 
72
81
  private emit(event: AgentBusEvent): void {
73
- for (const listener of this.listeners) {
74
- try {
75
- listener(event)
76
- } catch (error) {
77
- this.log.error('event listener threw', {
78
- eventType: event.type,
79
- error: error instanceof Error ? error.message : String(error),
80
- })
82
+ this.probes.dispatch(event, buildProbeContext(), () => {
83
+ for (const listener of this.listeners) {
84
+ try {
85
+ listener(event)
86
+ } catch (error) {
87
+ this.log.error('event listener threw', {
88
+ eventType: event.type,
89
+ error: error instanceof Error ? error.message : String(error),
90
+ })
91
+ }
81
92
  }
82
- }
93
+ })
83
94
  }
84
95
 
85
96
  cleanupAgent(runId: RunId): void {
@@ -0,0 +1,14 @@
1
+ import type { RunId } from '../types/ids/index.js'
2
+ import type { ProbeContext } from '../types/probe/index.js'
3
+
4
+ export interface ProbeContextInput {
5
+ readonly runId?: RunId
6
+ readonly isReplay?: boolean
7
+ }
8
+
9
+ export function buildProbeContext(input: ProbeContextInput = {}): ProbeContext {
10
+ return Object.freeze({
11
+ runId: input.runId,
12
+ isReplay: input.isReplay ?? false,
13
+ })
14
+ }
@@ -0,0 +1,27 @@
1
+ import type { VetoableEventKind } from '../types/probe/index.js'
2
+
3
+ export class ProbeNameCollisionError extends Error {
4
+ readonly probeName: string
5
+
6
+ constructor(probeName: string) {
7
+ super(
8
+ `Probe name "${probeName}" is already registered. Pass { override: true } to replace, or pick a different name.`,
9
+ )
10
+ this.name = 'ProbeNameCollisionError'
11
+ this.probeName = probeName
12
+ }
13
+ }
14
+
15
+ export class ProbeVetoError extends Error {
16
+ readonly probeName: string
17
+ readonly reason: string
18
+ readonly eventKind: VetoableEventKind
19
+
20
+ constructor(probeName: string, reason: string, eventKind: VetoableEventKind) {
21
+ super(`Operation denied by probe "${probeName}" on ${eventKind}: ${reason}`)
22
+ this.name = 'ProbeVetoError'
23
+ this.probeName = probeName
24
+ this.reason = reason
25
+ this.eventKind = eventKind
26
+ }
27
+ }
@@ -0,0 +1,4 @@
1
+ export { ProbeNameCollisionError, ProbeVetoError } from './errors.js'
2
+ export { buildProbeContext } from './context.js'
3
+ export type { ProbeContextInput } from './context.js'
4
+ export { ProbeRegistry, createProbeRegistry, probe } from './registry.js'