@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.
- package/CHANGELOG.md +36 -0
- package/dist/bridge/tools/connector/adapter.d.ts +2 -2
- package/dist/bus/index.d.ts +3 -1
- package/dist/bus/index.d.ts.map +1 -1
- package/dist/bus/index.js +18 -11
- package/dist/bus/index.js.map +1 -1
- package/dist/config/runtime.d.ts +28 -28
- package/dist/probe/context.d.ts +8 -0
- package/dist/probe/context.d.ts.map +1 -0
- package/dist/probe/context.js +7 -0
- package/dist/probe/context.js.map +1 -0
- package/dist/probe/errors.d.ts +12 -0
- package/dist/probe/errors.d.ts.map +1 -0
- package/dist/probe/errors.js +21 -0
- package/dist/probe/errors.js.map +1 -0
- package/dist/probe/index.d.ts +5 -0
- package/dist/probe/index.d.ts.map +1 -0
- package/dist/probe/index.js +4 -0
- package/dist/probe/index.js.map +1 -0
- package/dist/probe/registry.d.ts +24 -0
- package/dist/probe/registry.d.ts.map +1 -0
- package/dist/probe/registry.js +228 -0
- package/dist/probe/registry.js.map +1 -0
- package/dist/probe/registry.test.d.ts +7 -0
- package/dist/probe/registry.test.d.ts.map +1 -0
- package/dist/probe/registry.test.js +310 -0
- package/dist/probe/registry.test.js.map +1 -0
- package/dist/provider/instrumentation.d.ts +9 -0
- package/dist/provider/instrumentation.d.ts.map +1 -0
- package/dist/provider/instrumentation.js +104 -0
- package/dist/provider/instrumentation.js.map +1 -0
- package/dist/provider/instrumentation.test.d.ts +2 -0
- package/dist/provider/instrumentation.test.d.ts.map +1 -0
- package/dist/provider/instrumentation.test.js +152 -0
- package/dist/provider/instrumentation.test.js.map +1 -0
- package/dist/public-runtime.d.ts +5 -0
- package/dist/public-runtime.d.ts.map +1 -1
- package/dist/public-runtime.js +4 -0
- package/dist/public-runtime.js.map +1 -1
- package/dist/public-types.d.ts +3 -0
- package/dist/public-types.d.ts.map +1 -1
- package/dist/runtime/query/events.d.ts +3 -1
- package/dist/runtime/query/events.d.ts.map +1 -1
- package/dist/runtime/query/events.js +6 -1
- package/dist/runtime/query/events.js.map +1 -1
- package/dist/runtime/query/executor.d.ts +3 -1
- package/dist/runtime/query/executor.d.ts.map +1 -1
- package/dist/runtime/query/executor.js +30 -1
- package/dist/runtime/query/executor.js.map +1 -1
- package/dist/types/bus/index.d.ts +46 -2
- package/dist/types/bus/index.d.ts.map +1 -1
- package/dist/types/doctor/check.d.ts +41 -0
- package/dist/types/doctor/check.d.ts.map +1 -0
- package/dist/types/doctor/check.js +2 -0
- package/dist/types/doctor/check.js.map +1 -0
- package/dist/types/doctor/index.d.ts +2 -0
- package/dist/types/doctor/index.d.ts.map +1 -0
- package/dist/types/doctor/index.js +2 -0
- package/dist/types/doctor/index.js.map +1 -0
- package/dist/types/probe/event-kind.d.ts +6 -0
- package/dist/types/probe/event-kind.d.ts.map +1 -0
- package/dist/types/probe/event-kind.js +2 -0
- package/dist/types/probe/event-kind.js.map +1 -0
- package/dist/types/probe/event-of.d.ts +5 -0
- package/dist/types/probe/event-of.d.ts.map +1 -0
- package/dist/types/probe/event-of.js +2 -0
- package/dist/types/probe/event-of.js.map +1 -0
- package/dist/types/probe/index.d.ts +4 -0
- package/dist/types/probe/index.d.ts.map +1 -0
- package/dist/types/probe/index.js +2 -0
- package/dist/types/probe/index.js.map +1 -0
- package/dist/types/probe/registry.d.ts +27 -0
- package/dist/types/probe/registry.d.ts.map +1 -0
- package/dist/types/probe/registry.js +2 -0
- package/dist/types/probe/registry.js.map +1 -0
- package/dist/vault/instrumentation.d.ts +11 -0
- package/dist/vault/instrumentation.d.ts.map +1 -0
- package/dist/vault/instrumentation.js +32 -0
- package/dist/vault/instrumentation.js.map +1 -0
- package/dist/vault/instrumentation.test.d.ts +2 -0
- package/dist/vault/instrumentation.test.d.ts.map +1 -0
- package/dist/vault/instrumentation.test.js +80 -0
- package/dist/vault/instrumentation.test.js.map +1 -0
- package/package.json +1 -1
- package/src/bus/index.ts +21 -10
- package/src/probe/context.ts +14 -0
- package/src/probe/errors.ts +27 -0
- package/src/probe/index.ts +4 -0
- package/src/probe/registry.test.ts +480 -0
- package/src/probe/registry.ts +276 -0
- package/src/provider/instrumentation.test.ts +192 -0
- package/src/provider/instrumentation.ts +139 -0
- package/src/public-runtime.ts +17 -0
- package/src/public-types.ts +3 -0
- package/src/runtime/query/events.ts +6 -1
- package/src/runtime/query/executor.ts +34 -0
- package/src/types/bus/index.ts +54 -2
- package/src/types/doctor/check.ts +53 -0
- package/src/types/doctor/index.ts +9 -0
- package/src/types/probe/event-kind.ts +8 -0
- package/src/types/probe/event-of.ts +3 -0
- package/src/types/probe/index.ts +11 -0
- package/src/types/probe/registry.ts +36 -0
- package/src/vault/instrumentation.test.ts +98 -0
- 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 @@
|
|
|
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
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(
|
|
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
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
+
}
|