@telorun/sdk 0.26.0 → 0.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cancellation.d.ts +40 -0
- package/dist/cancellation.d.ts.map +1 -1
- package/dist/evaluation-context.d.ts +19 -2
- package/dist/evaluation-context.d.ts.map +1 -1
- package/dist/invoke-step.d.ts +1 -1
- package/dist/invoke-step.d.ts.map +1 -1
- package/dist/invoke-step.js +9 -1
- package/dist/resource-context.d.ts +8 -1
- package/dist/resource-context.d.ts.map +1 -1
- package/dist/resource-instance.d.ts +18 -0
- package/dist/resource-instance.d.ts.map +1 -1
- package/dist/resource-instance.js +24 -1
- package/package.json +1 -1
- package/src/cancellation.ts +37 -0
- package/src/evaluation-context.ts +25 -2
- package/src/invoke-step.ts +9 -2
- package/src/resource-context.ts +8 -1
- package/src/resource-instance.ts +33 -0
package/dist/cancellation.d.ts
CHANGED
|
@@ -36,6 +36,46 @@ export interface CancellationToken {
|
|
|
36
36
|
*/
|
|
37
37
|
export interface InvokeContext {
|
|
38
38
|
readonly cancellation: CancellationToken;
|
|
39
|
+
/** Monotonic id minted by the kernel for this invocation — present only while
|
|
40
|
+
* tracing is active (a debug consumer is attached). Lets controllers correlate
|
|
41
|
+
* their work with the debug stream. */
|
|
42
|
+
readonly invocationId?: number;
|
|
43
|
+
/** The {@link invocationId} of the invocation that dispatched this one, or
|
|
44
|
+
* `undefined` at a trace root. Reconstructs the call tree on the consumer. */
|
|
45
|
+
readonly parentInvocationId?: number;
|
|
46
|
+
/** The trace this invocation belongs to — minted at the root span and inherited
|
|
47
|
+
* by every descendant. Present only while tracing. Groups all spans of one
|
|
48
|
+
* trace the way OpenTelemetry's `trace_id` does (an exporter maps it directly),
|
|
49
|
+
* independent of the parent chain. */
|
|
50
|
+
readonly traceId?: string;
|
|
51
|
+
}
|
|
52
|
+
/** Terminal status of a span — maps to OpenTelemetry span status. */
|
|
53
|
+
export type SpanOutcome = "ok" | "failed" | "rejected" | "cancelled";
|
|
54
|
+
/** Options for {@link ResourceContext.openSpan}. */
|
|
55
|
+
export interface OpenSpanOptions {
|
|
56
|
+
/** The resource the span is attributed to (an inbound transport's listener,
|
|
57
|
+
* e.g. the `Http.Api`). Becomes the span's `ref`. */
|
|
58
|
+
ref: {
|
|
59
|
+
kind: string;
|
|
60
|
+
name: string;
|
|
61
|
+
};
|
|
62
|
+
/** Human label for the span (e.g. `"POST /feedback"`). */
|
|
63
|
+
label?: string;
|
|
64
|
+
/** Structured attributes (e.g. `{ method, path }`). Map to OTel span attributes. */
|
|
65
|
+
attributes?: Record<string, unknown>;
|
|
66
|
+
/** Continue an upstream distributed trace instead of rooting a new one — e.g.
|
|
67
|
+
* seeded from a W3C `traceparent` header. */
|
|
68
|
+
inbound?: {
|
|
69
|
+
traceId: string;
|
|
70
|
+
parentSpanId?: number;
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/** Handle returned by {@link ResourceContext.openSpan}. */
|
|
74
|
+
export interface OpenSpan {
|
|
75
|
+
/** Thread into `invokeResolved` so the handler nests under the span. */
|
|
76
|
+
readonly context: InvokeContext;
|
|
77
|
+
/** Close the span with an outcome (emits the span's `end` event). */
|
|
78
|
+
settle(outcome: SpanOutcome, detail?: Record<string, unknown>): Promise<void>;
|
|
39
79
|
}
|
|
40
80
|
export interface CancellationSource {
|
|
41
81
|
readonly token: CancellationToken;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cancellation.d.ts","sourceRoot":"","sources":["../src/cancellation.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;GAeG;AAEH,eAAO,MAAM,oBAAoB,yBAAyB,CAAC;AAE3D,MAAM,WAAW,iBAAiB;IAChC,sEAAsE;IACtE,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,uEAAuE;IACvE,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC;yDACqD;IACrD,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B;2CACuC;IACvC,WAAW,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACxE,kEAAkE;IAClE,gBAAgB,IAAI,IAAI,CAAC;CAC1B;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"cancellation.d.ts","sourceRoot":"","sources":["../src/cancellation.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;GAeG;AAEH,eAAO,MAAM,oBAAoB,yBAAyB,CAAC;AAE3D,MAAM,WAAW,iBAAiB;IAChC,sEAAsE;IACtE,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,uEAAuE;IACvE,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC;yDACqD;IACrD,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B;2CACuC;IACvC,WAAW,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACxE,kEAAkE;IAClE,gBAAgB,IAAI,IAAI,CAAC;CAC1B;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAAC;IACzC;;4CAEwC;IACxC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B;mFAC+E;IAC/E,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC;;;2CAGuC;IACvC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,qEAAqE;AACrE,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,CAAC;AAErE,oDAAoD;AACpD,MAAM,WAAW,eAAe;IAC9B;0DACsD;IACtD,GAAG,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACpC,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oFAAoF;IACpF,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC;kDAC8C;IAC9C,OAAO,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACtD;AAED,2DAA2D;AAC3D,MAAM,WAAW,QAAQ;IACvB,wEAAwE;IACxE,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,qEAAqE;IACrE,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/E;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC;4EACwE;IACxE,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,yEAAyE;IACzE,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,uCAAuC;IACvC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B;;;mEAG+D;IAC/D,OAAO,IAAI,IAAI,CAAC;CACjB;AAiFD,wBAAgB,wBAAwB,IAAI,kBAAkB,CAE7D;AAMD;2EAC2E;AAC3E,eAAO,MAAM,eAAe,EAAE,iBAU7B,CAAC;AAEF,yEAAyE;AACzE,eAAO,MAAM,qBAAqB,EAAE,aAAiD,CAAC;AAEtF,oFAAoF;AACpF,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAMzD"}
|
|
@@ -1,9 +1,22 @@
|
|
|
1
|
-
import type { InvokeContext } from "./cancellation.js";
|
|
1
|
+
import type { InvokeContext, OpenSpan, OpenSpanOptions } from "./cancellation.js";
|
|
2
2
|
import type { ScopeHandle } from "./ref.js";
|
|
3
3
|
import type { ResourceInstance } from "./resource-instance.js";
|
|
4
4
|
import type { ResourceManifest } from "./resource-manifest.js";
|
|
5
5
|
import type { ResourceDefinition } from "./types.js";
|
|
6
|
-
export type EmitEvent = (event: string, payload?: any) => void | Promise<void>;
|
|
6
|
+
export type EmitEvent = (event: string, payload?: any, metadata?: Record<string, any>) => void | Promise<void>;
|
|
7
|
+
/**
|
|
8
|
+
* Per-kernel invocation tracer. Mints monotonic invocation ids and carries the
|
|
9
|
+
* gate that turns tracing on (a debug consumer is attached). Owned by the kernel,
|
|
10
|
+
* injected into the context tree; `enabled === false` is the zero-overhead default.
|
|
11
|
+
*/
|
|
12
|
+
export interface Tracer {
|
|
13
|
+
readonly enabled: boolean;
|
|
14
|
+
/** Mint the next monotonic invocation id (unique within the kernel run). */
|
|
15
|
+
next(): number;
|
|
16
|
+
/** Mint a fresh trace id (OTel-compatible 16-byte hex) for a new root trace.
|
|
17
|
+
* Children inherit it via {@link InvokeContext.traceId}. */
|
|
18
|
+
newTraceId(): string;
|
|
19
|
+
}
|
|
7
20
|
/** Four-stage resource lifecycle defined in resource-lifecycle.md */
|
|
8
21
|
export type LifecycleState = "Pending" | "Validated" | "Initialized" | "Draining" | "Teardown";
|
|
9
22
|
/**
|
|
@@ -58,6 +71,9 @@ export interface EvaluationContext {
|
|
|
58
71
|
/** Looks up a registered resource definition by fully-qualified kind.
|
|
59
72
|
* Set by the kernel; used for declared-throw-union checks. */
|
|
60
73
|
getDefinition?: (kind: string) => ResourceDefinition | undefined;
|
|
74
|
+
/** Per-kernel invocation tracer. Set by the kernel on the root context and
|
|
75
|
+
* propagated through `spawnChild`; drives invocation-id minting in `invoke`. */
|
|
76
|
+
tracer?: Tracer;
|
|
61
77
|
readonly createInstance: InstanceFactory;
|
|
62
78
|
readonly context: Record<string, unknown>;
|
|
63
79
|
readonly secretValues: Set<string>;
|
|
@@ -73,6 +89,7 @@ export interface EvaluationContext {
|
|
|
73
89
|
invoke<TInputs>(kind: string, name: string, inputs: TInputs, ctx?: InvokeContext): Promise<any>;
|
|
74
90
|
invokeResolved<TInputs>(kind: string, name: string, instance: ResourceInstance, inputs: TInputs, ctx?: InvokeContext): Promise<any>;
|
|
75
91
|
run(name: string, ctx?: InvokeContext): Promise<void>;
|
|
92
|
+
openSpan(base: InvokeContext | undefined, opts: OpenSpanOptions): Promise<OpenSpan>;
|
|
76
93
|
expand(value: unknown): unknown;
|
|
77
94
|
expandWith(value: unknown, extraContext: Record<string, unknown>): unknown;
|
|
78
95
|
expandPaths(value: Record<string, unknown>, paths: string[], excludePaths?: string[]): Record<string, unknown>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluation-context.d.ts","sourceRoot":"","sources":["../src/evaluation-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"evaluation-context.d.ts","sourceRoot":"","sources":["../src/evaluation-context.ts"],"names":[],"mappings":"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"}
|
package/dist/invoke-step.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Invocable } from "./capabilities/invokable.js";
|
|
2
2
|
import type { KindRef, ScopeContext } from "./ref.js";
|
|
3
|
-
import type
|
|
3
|
+
import { type ResourceInstance } from "./resource-instance.js";
|
|
4
4
|
/** Retry policy for a single invoke step, passed through to `ctx.invoke`. */
|
|
5
5
|
export interface InvokeStepRetry {
|
|
6
6
|
attempts?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invoke-step.d.ts","sourceRoot":"","sources":["../src/invoke-step.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"invoke-step.d.ts","sourceRoot":"","sources":["../src/invoke-step.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAkB,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/E,6EAA6E;AAC7E,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,eAAe,CAAC;CACzB;AAED;;;;qDAIqD;AACrD,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED;;;mFAGmF;AACnF,MAAM,MAAM,UAAU,GAClB,MAAM,GACN;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,GAAG,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/D,kBAAkB,CAAC;AAEvB;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC;IAC3D,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1F,cAAc,CAAC,OAAO,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,GAAG,CAAC,CAAC;IAChB;;qDAEiD;IACjD,uBAAuB,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAAC;CACrF;AAED;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,iBAAiB,EACtB,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,IAAI,CAAC,CAuCf"}
|
package/dist/invoke-step.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { getRefIdentity } from "./resource-instance.js";
|
|
1
2
|
/**
|
|
2
3
|
* Execute one invoke step: evaluate the `when` guard, expand `inputs`, resolve
|
|
3
4
|
* and invoke the target, then record `steps[step.name] = { result }`. Knows
|
|
@@ -12,7 +13,14 @@ export async function executeInvokeStep(step, ctx, state) {
|
|
|
12
13
|
const raw = step.invoke;
|
|
13
14
|
let result;
|
|
14
15
|
if (raw && typeof raw.invoke === "function") {
|
|
15
|
-
|
|
16
|
+
// A pre-injected live instance (a `!ref` resolved at Phase 5). Route it
|
|
17
|
+
// through the traced chokepoint using the identity the kernel stamped at
|
|
18
|
+
// injection, so the call is instrumented exactly like a by-name dispatch.
|
|
19
|
+
// A truly anonymous instance (no stamp) falls back to a direct call.
|
|
20
|
+
const identity = getRefIdentity(raw);
|
|
21
|
+
result = identity
|
|
22
|
+
? await ctx.invokeResolved(identity.kind, identity.name, raw, inputs)
|
|
23
|
+
: await raw.invoke(inputs);
|
|
16
24
|
}
|
|
17
25
|
else {
|
|
18
26
|
const ref = raw;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { CancellationSource, InvokeContext } from "./cancellation.js";
|
|
1
|
+
import type { CancellationSource, InvokeContext, OpenSpan, OpenSpanOptions } from "./cancellation.js";
|
|
2
2
|
import { ControllerContext } from "./controller-context.js";
|
|
3
3
|
import { ControllerPolicy } from "./controller-policy.js";
|
|
4
4
|
import { EvaluationContext } from "./evaluation-context.js";
|
|
@@ -40,6 +40,13 @@ export interface ResourceContext extends ControllerContext {
|
|
|
40
40
|
* lambda budget). Pass `source.context` into `invokeResolved` to scope an
|
|
41
41
|
* invocation tree to it. */
|
|
42
42
|
createCancellationSource(): CancellationSource;
|
|
43
|
+
/** Open a trace span for an inbound boundary (an HTTP request, a queue message).
|
|
44
|
+
* Returns a child {@link InvokeContext} to thread into `invokeResolved` so the
|
|
45
|
+
* handler nests under this span, plus `settle` to close it with an outcome.
|
|
46
|
+
* The span roots a fresh trace unless `inbound` continues an upstream one
|
|
47
|
+
* (e.g. a W3C `traceparent`). A no-op (returns `base` unchanged) when tracing
|
|
48
|
+
* is off. */
|
|
49
|
+
openSpan(base: InvokeContext | undefined, opts: OpenSpanOptions): Promise<OpenSpan>;
|
|
43
50
|
invoke<TInputs>(kind: string, name: string, inputs: TInputs, options?: any): Promise<any>;
|
|
44
51
|
invokeResolved<TInputs>(kind: string, name: string, instance: ResourceInstance, inputs: TInputs, ctx?: InvokeContext): Promise<any>;
|
|
45
52
|
run(kind: string, name: string): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-context.d.ts","sourceRoot":"","sources":["../src/resource-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"resource-context.d.ts","sourceRoot":"","sources":["../src/resource-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACtG,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,WAAW,WAAW;IAC1B;gFAC4E;IAC5E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;4EAGwE;IACxE,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI,CAAC;IAC1B,OAAO,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,aAAc,YAAW,aAAa;IACjD,OAAO;IAIP,QAAQ;CAGT;AAED,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,CAAC,CAAC,GAAG;IAAE,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEhG,MAAM,WAAW,eAAgB,SAAQ,iBAAiB;IACxD,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,IAAI,CAAC;IACzC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD;;iCAE6B;IAC7B,wBAAwB,IAAI,kBAAkB,CAAC;IAC/C;;;;;kBAKc;IACd,QAAQ,CAAC,IAAI,EAAE,aAAa,GAAG,SAAS,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpF,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1F,cAAc,CAAC,OAAO,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,EAAE,OAAO,EACf,GAAG,CAAC,EAAE,aAAa,GAClB,OAAO,CAAC,GAAG,CAAC,CAAC;IAChB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAAC;IACvE,gBAAgB,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI,CAAC;IACtC,iBAAiB,IAAI,iBAAiB,CAAC;IACvC,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,iBAAiB,CAAC;IAChE,aAAa,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IACnD,eAAe,CAAC,QAAQ,EAAE,GAAG,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACtF,cAAc,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC;IAC9C,qBAAqB,CAAC,MAAM,EAAE,GAAG,GAAG,aAAa,CAAC;IAClD,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACnD,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC/C,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IACzD,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE,GAAG,SAAS,CAAC;IACtD,kFAAkF;IAClF,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,GAAG,aAAa,CAAC;IACtF,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,kBAAkB,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjG,kBAAkB,CAAC,UAAU,EAAE,GAAG,GAAG,IAAI,CAAC;IAC1C,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACjF;;;;OAIG;IACH,mBAAmB,IAAI,gBAAgB,GAAG,SAAS,CAAC;IACpD;;;;;;;;;;;OAWG;IACH,WAAW,IAAI,MAAM,GAAG,SAAS,CAAC;IAClC;;;;iEAI6D;IAC7D,cAAc,IAAI,MAAM,GAAG,SAAS,CAAC;IACrC;wDACoD;IACpD,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC5E;;;sBAGkB;IAClB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACxD,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACjD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,cAAc,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC;CACxC"}
|
|
@@ -7,4 +7,22 @@ export type ResourceInstance<TInput = Record<string, any>, TOutput = any> = Part
|
|
|
7
7
|
teardown?(): void | Promise<void>;
|
|
8
8
|
snapshot?(): Record<string, any> | Promise<Record<string, any>>;
|
|
9
9
|
};
|
|
10
|
+
/** The kind+name an instance was resolved from. */
|
|
11
|
+
export interface RefIdentity {
|
|
12
|
+
kind: string;
|
|
13
|
+
name: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Non-enumerable identity tag the kernel stamps on a live instance when it
|
|
17
|
+
* injects a resolved `!ref` into a slot. A consumer that holds only the bare
|
|
18
|
+
* instance (an `executeInvokeStep` target whose `!ref` was pre-injected) can
|
|
19
|
+
* then recover the kind+name and dispatch through the traced chokepoint
|
|
20
|
+
* (`invokeResolved`) instead of calling `.invoke()` directly and escaping it.
|
|
21
|
+
*/
|
|
22
|
+
export declare const REF_IDENTITY: unique symbol;
|
|
23
|
+
/** Stamp the resolved kind+name onto an injected instance. Idempotent — an
|
|
24
|
+
* instance has exactly one identity, so re-injection into other slots is a no-op. */
|
|
25
|
+
export declare function stampRefIdentity(instance: object, kind: string, name: string): void;
|
|
26
|
+
/** Read the identity stamped by {@link stampRefIdentity}, if any. */
|
|
27
|
+
export declare function getRefIdentity(instance: object): RefIdentity | undefined;
|
|
10
28
|
//# sourceMappingURL=resource-instance.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-instance.d.ts","sourceRoot":"","sources":["../src/resource-instance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,MAAM,MAAM,gBAAgB,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,GAAG,GAAG,IAAI,OAAO,CACjF,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAC3B,GACC,OAAO,CAAC,QAAQ,CAAC,GACjB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG;IAC3B,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,QAAQ,CAAC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,QAAQ,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;CACjE,CAAC"}
|
|
1
|
+
{"version":3,"file":"resource-instance.d.ts","sourceRoot":"","sources":["../src/resource-instance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,MAAM,MAAM,gBAAgB,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,GAAG,GAAG,IAAI,OAAO,CACjF,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAC3B,GACC,OAAO,CAAC,QAAQ,CAAC,GACjB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG;IAC3B,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,QAAQ,CAAC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,QAAQ,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;CACjE,CAAC;AAEJ,mDAAmD;AACnD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,EAAE,OAAO,MAAuC,CAAC;AAE1E;sFACsF;AACtF,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CASnF;AAED,qEAAqE;AACrE,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAExE"}
|
|
@@ -1 +1,24 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Non-enumerable identity tag the kernel stamps on a live instance when it
|
|
3
|
+
* injects a resolved `!ref` into a slot. A consumer that holds only the bare
|
|
4
|
+
* instance (an `executeInvokeStep` target whose `!ref` was pre-injected) can
|
|
5
|
+
* then recover the kind+name and dispatch through the traced chokepoint
|
|
6
|
+
* (`invokeResolved`) instead of calling `.invoke()` directly and escaping it.
|
|
7
|
+
*/
|
|
8
|
+
export const REF_IDENTITY = Symbol.for("telo.refIdentity");
|
|
9
|
+
/** Stamp the resolved kind+name onto an injected instance. Idempotent — an
|
|
10
|
+
* instance has exactly one identity, so re-injection into other slots is a no-op. */
|
|
11
|
+
export function stampRefIdentity(instance, kind, name) {
|
|
12
|
+
if (!(REF_IDENTITY in instance)) {
|
|
13
|
+
Object.defineProperty(instance, REF_IDENTITY, {
|
|
14
|
+
value: { kind, name },
|
|
15
|
+
enumerable: false,
|
|
16
|
+
configurable: true,
|
|
17
|
+
writable: false,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/** Read the identity stamped by {@link stampRefIdentity}, if any. */
|
|
22
|
+
export function getRefIdentity(instance) {
|
|
23
|
+
return instance[REF_IDENTITY];
|
|
24
|
+
}
|
package/package.json
CHANGED
package/src/cancellation.ts
CHANGED
|
@@ -41,6 +41,43 @@ export interface CancellationToken {
|
|
|
41
41
|
*/
|
|
42
42
|
export interface InvokeContext {
|
|
43
43
|
readonly cancellation: CancellationToken;
|
|
44
|
+
/** Monotonic id minted by the kernel for this invocation — present only while
|
|
45
|
+
* tracing is active (a debug consumer is attached). Lets controllers correlate
|
|
46
|
+
* their work with the debug stream. */
|
|
47
|
+
readonly invocationId?: number;
|
|
48
|
+
/** The {@link invocationId} of the invocation that dispatched this one, or
|
|
49
|
+
* `undefined` at a trace root. Reconstructs the call tree on the consumer. */
|
|
50
|
+
readonly parentInvocationId?: number;
|
|
51
|
+
/** The trace this invocation belongs to — minted at the root span and inherited
|
|
52
|
+
* by every descendant. Present only while tracing. Groups all spans of one
|
|
53
|
+
* trace the way OpenTelemetry's `trace_id` does (an exporter maps it directly),
|
|
54
|
+
* independent of the parent chain. */
|
|
55
|
+
readonly traceId?: string;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** Terminal status of a span — maps to OpenTelemetry span status. */
|
|
59
|
+
export type SpanOutcome = "ok" | "failed" | "rejected" | "cancelled";
|
|
60
|
+
|
|
61
|
+
/** Options for {@link ResourceContext.openSpan}. */
|
|
62
|
+
export interface OpenSpanOptions {
|
|
63
|
+
/** The resource the span is attributed to (an inbound transport's listener,
|
|
64
|
+
* e.g. the `Http.Api`). Becomes the span's `ref`. */
|
|
65
|
+
ref: { kind: string; name: string };
|
|
66
|
+
/** Human label for the span (e.g. `"POST /feedback"`). */
|
|
67
|
+
label?: string;
|
|
68
|
+
/** Structured attributes (e.g. `{ method, path }`). Map to OTel span attributes. */
|
|
69
|
+
attributes?: Record<string, unknown>;
|
|
70
|
+
/** Continue an upstream distributed trace instead of rooting a new one — e.g.
|
|
71
|
+
* seeded from a W3C `traceparent` header. */
|
|
72
|
+
inbound?: { traceId: string; parentSpanId?: number };
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** Handle returned by {@link ResourceContext.openSpan}. */
|
|
76
|
+
export interface OpenSpan {
|
|
77
|
+
/** Thread into `invokeResolved` so the handler nests under the span. */
|
|
78
|
+
readonly context: InvokeContext;
|
|
79
|
+
/** Close the span with an outcome (emits the span's `end` event). */
|
|
80
|
+
settle(outcome: SpanOutcome, detail?: Record<string, unknown>): Promise<void>;
|
|
44
81
|
}
|
|
45
82
|
|
|
46
83
|
export interface CancellationSource {
|
|
@@ -1,10 +1,28 @@
|
|
|
1
|
-
import type { InvokeContext } from "./cancellation.js";
|
|
1
|
+
import type { InvokeContext, OpenSpan, OpenSpanOptions } from "./cancellation.js";
|
|
2
2
|
import type { ScopeHandle } from "./ref.js";
|
|
3
3
|
import type { ResourceInstance } from "./resource-instance.js";
|
|
4
4
|
import type { ResourceManifest } from "./resource-manifest.js";
|
|
5
5
|
import type { ResourceDefinition } from "./types.js";
|
|
6
6
|
|
|
7
|
-
export type EmitEvent = (
|
|
7
|
+
export type EmitEvent = (
|
|
8
|
+
event: string,
|
|
9
|
+
payload?: any,
|
|
10
|
+
metadata?: Record<string, any>,
|
|
11
|
+
) => void | Promise<void>;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Per-kernel invocation tracer. Mints monotonic invocation ids and carries the
|
|
15
|
+
* gate that turns tracing on (a debug consumer is attached). Owned by the kernel,
|
|
16
|
+
* injected into the context tree; `enabled === false` is the zero-overhead default.
|
|
17
|
+
*/
|
|
18
|
+
export interface Tracer {
|
|
19
|
+
readonly enabled: boolean;
|
|
20
|
+
/** Mint the next monotonic invocation id (unique within the kernel run). */
|
|
21
|
+
next(): number;
|
|
22
|
+
/** Mint a fresh trace id (OTel-compatible 16-byte hex) for a new root trace.
|
|
23
|
+
* Children inherit it via {@link InvokeContext.traceId}. */
|
|
24
|
+
newTraceId(): string;
|
|
25
|
+
}
|
|
8
26
|
|
|
9
27
|
/** Four-stage resource lifecycle defined in resource-lifecycle.md */
|
|
10
28
|
export type LifecycleState = "Pending" | "Validated" | "Initialized" | "Draining" | "Teardown";
|
|
@@ -83,6 +101,10 @@ export interface EvaluationContext {
|
|
|
83
101
|
* Set by the kernel; used for declared-throw-union checks. */
|
|
84
102
|
getDefinition?: (kind: string) => ResourceDefinition | undefined;
|
|
85
103
|
|
|
104
|
+
/** Per-kernel invocation tracer. Set by the kernel on the root context and
|
|
105
|
+
* propagated through `spawnChild`; drives invocation-id minting in `invoke`. */
|
|
106
|
+
tracer?: Tracer;
|
|
107
|
+
|
|
86
108
|
readonly createInstance: InstanceFactory;
|
|
87
109
|
readonly context: Record<string, unknown>;
|
|
88
110
|
readonly secretValues: Set<string>;
|
|
@@ -105,6 +127,7 @@ export interface EvaluationContext {
|
|
|
105
127
|
ctx?: InvokeContext,
|
|
106
128
|
): Promise<any>;
|
|
107
129
|
run(name: string, ctx?: InvokeContext): Promise<void>;
|
|
130
|
+
openSpan(base: InvokeContext | undefined, opts: OpenSpanOptions): Promise<OpenSpan>;
|
|
108
131
|
expand(value: unknown): unknown;
|
|
109
132
|
expandWith(value: unknown, extraContext: Record<string, unknown>): unknown;
|
|
110
133
|
expandPaths(
|
package/src/invoke-step.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Invocable } from "./capabilities/invokable.js";
|
|
2
2
|
import type { KindRef, ScopeContext } from "./ref.js";
|
|
3
|
-
import type
|
|
3
|
+
import { getRefIdentity, type ResourceInstance } from "./resource-instance.js";
|
|
4
4
|
|
|
5
5
|
/** Retry policy for a single invoke step, passed through to `ctx.invoke`. */
|
|
6
6
|
export interface InvokeStepRetry {
|
|
@@ -94,7 +94,14 @@ export async function executeInvokeStep(
|
|
|
94
94
|
let result: unknown;
|
|
95
95
|
|
|
96
96
|
if (raw && typeof (raw as Invocable).invoke === "function") {
|
|
97
|
-
|
|
97
|
+
// A pre-injected live instance (a `!ref` resolved at Phase 5). Route it
|
|
98
|
+
// through the traced chokepoint using the identity the kernel stamped at
|
|
99
|
+
// injection, so the call is instrumented exactly like a by-name dispatch.
|
|
100
|
+
// A truly anonymous instance (no stamp) falls back to a direct call.
|
|
101
|
+
const identity = getRefIdentity(raw as object);
|
|
102
|
+
result = identity
|
|
103
|
+
? await ctx.invokeResolved(identity.kind, identity.name, raw as ResourceInstance, inputs)
|
|
104
|
+
: await (raw as Invocable).invoke(inputs);
|
|
98
105
|
} else {
|
|
99
106
|
const ref = raw as KindRef<Invocable>;
|
|
100
107
|
if (ref.alias && ref.alias !== "Self") {
|
package/src/resource-context.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { CancellationSource, InvokeContext } from "./cancellation.js";
|
|
1
|
+
import type { CancellationSource, InvokeContext, OpenSpan, OpenSpanOptions } from "./cancellation.js";
|
|
2
2
|
import { ControllerContext } from "./controller-context.js";
|
|
3
3
|
import { ControllerPolicy } from "./controller-policy.js";
|
|
4
4
|
import { EvaluationContext } from "./evaluation-context.js";
|
|
@@ -49,6 +49,13 @@ export interface ResourceContext extends ControllerContext {
|
|
|
49
49
|
* lambda budget). Pass `source.context` into `invokeResolved` to scope an
|
|
50
50
|
* invocation tree to it. */
|
|
51
51
|
createCancellationSource(): CancellationSource;
|
|
52
|
+
/** Open a trace span for an inbound boundary (an HTTP request, a queue message).
|
|
53
|
+
* Returns a child {@link InvokeContext} to thread into `invokeResolved` so the
|
|
54
|
+
* handler nests under this span, plus `settle` to close it with an outcome.
|
|
55
|
+
* The span roots a fresh trace unless `inbound` continues an upstream one
|
|
56
|
+
* (e.g. a W3C `traceparent`). A no-op (returns `base` unchanged) when tracing
|
|
57
|
+
* is off. */
|
|
58
|
+
openSpan(base: InvokeContext | undefined, opts: OpenSpanOptions): Promise<OpenSpan>;
|
|
52
59
|
invoke<TInputs>(kind: string, name: string, inputs: TInputs, options?: any): Promise<any>;
|
|
53
60
|
invokeResolved<TInputs>(
|
|
54
61
|
kind: string,
|
package/src/resource-instance.ts
CHANGED
|
@@ -12,3 +12,36 @@ export type ResourceInstance<TInput = Record<string, any>, TOutput = any> = Part
|
|
|
12
12
|
teardown?(): void | Promise<void>;
|
|
13
13
|
snapshot?(): Record<string, any> | Promise<Record<string, any>>;
|
|
14
14
|
};
|
|
15
|
+
|
|
16
|
+
/** The kind+name an instance was resolved from. */
|
|
17
|
+
export interface RefIdentity {
|
|
18
|
+
kind: string;
|
|
19
|
+
name: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Non-enumerable identity tag the kernel stamps on a live instance when it
|
|
24
|
+
* injects a resolved `!ref` into a slot. A consumer that holds only the bare
|
|
25
|
+
* instance (an `executeInvokeStep` target whose `!ref` was pre-injected) can
|
|
26
|
+
* then recover the kind+name and dispatch through the traced chokepoint
|
|
27
|
+
* (`invokeResolved`) instead of calling `.invoke()` directly and escaping it.
|
|
28
|
+
*/
|
|
29
|
+
export const REF_IDENTITY: unique symbol = Symbol.for("telo.refIdentity");
|
|
30
|
+
|
|
31
|
+
/** Stamp the resolved kind+name onto an injected instance. Idempotent — an
|
|
32
|
+
* instance has exactly one identity, so re-injection into other slots is a no-op. */
|
|
33
|
+
export function stampRefIdentity(instance: object, kind: string, name: string): void {
|
|
34
|
+
if (!(REF_IDENTITY in instance)) {
|
|
35
|
+
Object.defineProperty(instance, REF_IDENTITY, {
|
|
36
|
+
value: { kind, name } satisfies RefIdentity,
|
|
37
|
+
enumerable: false,
|
|
38
|
+
configurable: true,
|
|
39
|
+
writable: false,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Read the identity stamped by {@link stampRefIdentity}, if any. */
|
|
45
|
+
export function getRefIdentity(instance: object): RefIdentity | undefined {
|
|
46
|
+
return (instance as Record<symbol, RefIdentity | undefined>)[REF_IDENTITY];
|
|
47
|
+
}
|