<Self>(): DaemonTagBuild<Self>Define a managed daemon as a toolkit HyperService. Self is given explicitly (Effect's ()
two-stage form). The base tag carries observation + lifecycle; add a schedule with
.pipe(schedule(…)). Declare value/error wire schemas on the tag:
class Health extends Daemon.Tag<Health>()("app/Health") {}
class Prices extends Daemon.Tag<Prices>()("app/Prices", PriceSchema) {}
class PricesE extends Daemon.Tag<PricesE>()("app/Prices", PriceSchema, FetchErr) {}
class PricesCfg extends Daemon.Tag<PricesCfg>()("app/Prices", {
success: PriceSchema,
error: FetchErr,
}) {}Pass options.node to bind the daemon to a Node.Tag.
export const const Tag: <
Self
>() => DaemonTagBuild<Self>
Define a managed daemon as a toolkit HyperService. Self is given explicitly (Effect's ()
two-stage form). The base tag carries observation + lifecycle; add a schedule with
.pipe(
schedule
(…)). Declare value/error wire schemas on the tag:
class Health extends Daemon.Tag<Health>()("app/Health") {}
class Prices extends Daemon.Tag<Prices>()("app/Prices", PriceSchema) {}
class PricesE extends Daemon.Tag<PricesE>()("app/Prices", PriceSchema, FetchErr) {}
class PricesCfg extends Daemon.Tag<PricesCfg>()("app/Prices", {
success: PriceSchema,
error: FetchErr,
}) {}
Pass options.node to bind the daemon to a
Node.Tag
.
Tag = <function (type parameter) Self in <Self>(): DaemonTagBuild<Self>Self>() => {
function function (local function) build(key: string, second?: Schema.Top | DaemonTagOptions, third?: Schema.Top): HyperlinkTag<Self, DaemonSpec> | NodeBoundTag<Self, DaemonSpec, unknown>build(
key: stringkey: string,
second: Schema.Top | DaemonTagOptionssecond?: import SchemaSchema.Top | type DaemonTagOptions = {
readonly description?: string
readonly success?: Schema.Top
readonly error?: Schema.Top
readonly node?: NodeKey<unknown>
}
Options for
Tag
— use as the sole 2nd argument (config-object overload) or merge with
positional success / error args.
DaemonTagOptions,
third: Schema.Topthird?: import SchemaSchema.Top,
): interface HyperlinkTag<Self, S extends Spec, Svc = Simplify<{ readonly [K in keyof S]: S[K] extends FromLocalMethod<infer M> ? InjectLocal<M, Self> : S[K] extends LocalMethod<infer T> ? LocalEffect<...> : S[K] extends DefaultMethod<...> ? F : S[K] extends { ...; } ? SuccessOf<...> : S[K] extends { ...; } ? Subscribable<...> : S[K] extends { ...; } ? ClientMethod<...> : S[K] extends Spec ? Simplify<...> : never; }>>The type of a HyperService tag carrying spec S — what
Hyperlink.Tag
produces
(and what you extend). Lets a consumer write
<S extends Spec>(tag: HyperlinkTag<Self, S>) and read the spec through named types
(
specOf
/
groupOf
) instead of a Parameters<typeof specOf> workaround.
HyperlinkTag<function (type parameter) Self in <Self>(): DaemonTagBuild<Self>Self, type DaemonSpec = {
events: Hyperlink.Method<undefined, Schema.Union<readonly [Schema.TaggedStruct<"Started", {
readonly key: Schema.String;
readonly scheduleKey: Schema.NullOr<Schema.String>;
readonly startedAt: Schema.Number;
readonly isStartupRun: Schema.Boolean;
}>, Schema.TaggedStruct<"Completed", {
readonly key: Schema.String;
readonly scheduleKey: Schema.NullOr<Schema.String>;
readonly startedAt: Schema.Number;
readonly completedAt: Schema.Number;
readonly durationMs: Schema.Number;
readonly isStartupRun: Schema.Boolean;
} | {
...;
}>, Schema.TaggedStruct<...>, Schema.TaggedStruct<...>]>, Schema.Never, true, Hyperlink.MethodAnnotations & {
...;
}, Hyperlink.Derive>;
... 5 more ...;
resetCadence: Hyperlink.Method<...>;
}
The base (schedule-less, result-less) daemon spec.
DaemonSpec> | interface NodeBoundTag<Self, S extends Spec, HSelf, Svc = Simplify<{ readonly [K in keyof S]: S[K] extends FromLocalMethod<infer M> ? InjectLocal<M, Self> : S[K] extends LocalMethod<infer T> ? LocalEffect<...> : S[K] extends DefaultMethod<...> ? F : S[K] extends { ...; } ? SuccessOf<...> : S[K] extends { ...; } ? Subscribable<...> : S[K] extends { ...; } ? ClientMethod<...> : S[K] extends Spec ? Simplify<...> : never; }>>A
HyperlinkTag
bound to a concrete
Node
— its [nodeSym] narrowed to that node's
NodeKey<HSelf>, which is how
Hyperlink.client
discriminates the node-aware path. Returned
by the node-bearing tag constructors. It's a named type (not an inline & { [nodeSym] }) so a
consumer can export a node-bearing tag without leaking the internal symbol (TS4020).
NodeBoundTag<function (type parameter) Self in <Self>(): DaemonTagBuild<Self>Self, type DaemonSpec = {
events: Hyperlink.Method<undefined, Schema.Union<readonly [Schema.TaggedStruct<"Started", {
readonly key: Schema.String;
readonly scheduleKey: Schema.NullOr<Schema.String>;
readonly startedAt: Schema.Number;
readonly isStartupRun: Schema.Boolean;
}>, Schema.TaggedStruct<"Completed", {
readonly key: Schema.String;
readonly scheduleKey: Schema.NullOr<Schema.String>;
readonly startedAt: Schema.Number;
readonly completedAt: Schema.Number;
readonly durationMs: Schema.Number;
readonly isStartupRun: Schema.Boolean;
} | {
...;
}>, Schema.TaggedStruct<...>, Schema.TaggedStruct<...>]>, Schema.Never, true, Hyperlink.MethodAnnotations & {
...;
}, Hyperlink.Derive>;
... 5 more ...;
resetCadence: Hyperlink.Method<...>;
}
The base (schedule-less, result-less) daemon spec.
DaemonSpec, unknown> {
if (second: Schema.Top | DaemonTagOptionssecond === var undefinedundefined) {
return const buildDaemonTag: <Self>(
key: string,
options:
| (DaemonTagOptions & {
readonly defaults?: Hyperlink.DefaultsBag
})
| undefined,
positional?: {
readonly success?: Schema.Top
readonly error?: Schema.Top
}
) =>
| HyperlinkTag<any, any, any>
| NodeBoundTag<any, any, unknown, any>
buildDaemonTag<function (type parameter) Self in <Self>(): DaemonTagBuild<Self>Self>(key: stringkey, var undefinedundefined);
}
if (import SchemaSchema.function isSchema(u: unknown): u is TopChecks whether a value is a Schema.
isSchema(second: Schema.Top | DaemonTagOptionssecond)) {
return const buildDaemonTag: <Self>(
key: string,
options:
| (DaemonTagOptions & {
readonly defaults?: Hyperlink.DefaultsBag
})
| undefined,
positional?: {
readonly success?: Schema.Top
readonly error?: Schema.Top
}
) =>
| HyperlinkTag<any, any, any>
| NodeBoundTag<any, any, unknown, any>
buildDaemonTag<function (type parameter) Self in <Self>(): DaemonTagBuild<Self>Self>(key: stringkey, var undefinedundefined, {
success?: Schema.Top(property) success?: {
Rebuild: Rebuild;
Iso: Iso;
ast: Ast;
Type: T;
Encoded: E;
DecodingServices: RD;
EncodingServices: RE;
annotate: (annotations: Schema.Annotations.Bottom<unknown, any>) => Schema.Top;
annotateKey: (annotations: Schema.Annotations.Key<unknown>) => Schema.Top;
check: (checks_0: Check<unknown>, ...checks: Array<Check<unknown>>) => Schema.Top;
rebuild: (ast: AST) => Schema.Top;
make: (input: unknown, options?: MakeOptions) => unknown;
makeOption: (input: unknown, options?: MakeOptions) => Option_.Option<unknown>;
makeEffect: (input: unknown, options?: MakeOptions) => Effect.Effect<unknown, SchemaError, never>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
}
success: second: Schema.Top | DaemonTagOptions(parameter) second: {
Rebuild: Rebuild;
Iso: Iso;
ast: Ast;
Type: T;
Encoded: E;
DecodingServices: RD;
EncodingServices: RE;
annotate: (annotations: Schema.Annotations.Bottom<unknown, any>) => Schema.Top;
annotateKey: (annotations: Schema.Annotations.Key<unknown>) => Schema.Top;
check: (checks_0: Check<unknown>, ...checks: Array<Check<unknown>>) => Schema.Top;
rebuild: (ast: AST) => Schema.Top;
make: (input: unknown, options?: MakeOptions) => unknown;
makeOption: (input: unknown, options?: MakeOptions) => Option_.Option<unknown>;
makeEffect: (input: unknown, options?: MakeOptions) => Effect.Effect<unknown, SchemaError, never>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
}
second,
error?: Schema.Top | undefinederror: third: Schema.Topthird,
});
}
if (const isDaemonTagOptions: (
value: unknown
) => value is DaemonTagOptions
isDaemonTagOptions(second: Schema.Top | DaemonTagOptions(parameter) second: {
description: string;
success: Schema.Top;
error: Schema.Top;
node: NodeKey<unknown>;
}
second)) {
return const buildDaemonTag: <Self>(
key: string,
options:
| (DaemonTagOptions & {
readonly defaults?: Hyperlink.DefaultsBag
})
| undefined,
positional?: {
readonly success?: Schema.Top
readonly error?: Schema.Top
}
) =>
| HyperlinkTag<any, any, any>
| NodeBoundTag<any, any, unknown, any>
buildDaemonTag<function (type parameter) Self in <Self>(): DaemonTagBuild<Self>Self>(key: stringkey, second: Schema.Top | DaemonTagOptions(parameter) second: {
description: string;
success: Schema.Top;
error: Schema.Top;
node: NodeKey<unknown>;
}
second);
}
return const buildDaemonTag: <Self>(
key: string,
options:
| (DaemonTagOptions & {
readonly defaults?: Hyperlink.DefaultsBag
})
| undefined,
positional?: {
readonly success?: Schema.Top
readonly error?: Schema.Top
}
) =>
| HyperlinkTag<any, any, any>
| NodeBoundTag<any, any, unknown, any>
buildDaemonTag<function (type parameter) Self in <Self>(): DaemonTagBuild<Self>Self>(key: stringkey, var undefinedundefined);
}
// The single, guarded cast: an overloaded *function* (`build`) isn't structurally assignable to a
// call-signature *object* type (`DaemonTagBuild<Self>`) even when it implements exactly those
// overloads — a known TS limitation (the same class as WorkPool's `nameQueueService` cast).
// It's soundness-guarded: `daemon-driver` / `daemon-contract-shape` .test-d.ts exercise
// `Daemon.Tag()` in every form, so a drift between `build` and `DaemonTagBuild` fails the build.
return function (local function) build(key: string, second?: Schema.Top | DaemonTagOptions, third?: Schema.Top): HyperlinkTag<Self, DaemonSpec> | NodeBoundTag<Self, DaemonSpec, unknown>build as type DaemonTagBuild<Self> = {
(key: string): HyperlinkTag<
Self,
DaemonInstanceSpec
>
<A extends Schema.Top>(
key: string,
success: A
): HyperlinkTag<Self, DaemonInstanceSpec<A>>
<A extends Schema.Top, E extends Schema.Top>(
key: string,
success: A,
error: E
): HyperlinkTag<Self, DaemonInstanceSpec<A, E>>
<
A extends Schema.Top,
const D extends Hyperlink.DefaultsBag
>(
key: string,
options: DaemonTagOptions & {
readonly success: A
readonly defaults: Hyperlink.DefaultsInput<D>
}
): Hyperlink.TagWithDefaults<
HyperlinkTag<Self, DaemonInstanceSpec<A>>,
D
>
<A extends Schema.Top>(
key: string,
options: DaemonTagOptions & {
readonly success: A
}
): HyperlinkTag<Self, DaemonInstanceSpec<A>>
<
E extends Schema.Top,
const D extends Hyperlink.DefaultsBag
>(
key: string,
options: DaemonTagOptions & {
readonly error: E
readonly defaults: Hyperlink.DefaultsInput<D>
}
): Hyperlink.TagWithDefaults<
HyperlinkTag<
Self,
DaemonInstanceSpec<typeof Schema.Void, E>
>,
D
>
<E extends Schema.Top>(
key: string,
options: DaemonTagOptions & {
readonly error: E
}
): HyperlinkTag<
Self,
DaemonInstanceSpec<typeof Schema.Void, E>
>
<
A extends Schema.Top,
E extends Schema.Top,
const D extends Hyperlink.DefaultsBag
>(
key: string,
options: DaemonTagOptions & {
readonly success: A
readonly error: E
readonly defaults: Hyperlink.DefaultsInput<D>
}
): Hyperlink.TagWithDefaults<
HyperlinkTag<Self, DaemonInstanceSpec<A, E>>,
D
>
<A extends Schema.Top, E extends Schema.Top>(
key: string,
options: DaemonTagOptions & {
readonly success: A
readonly error: E
}
): HyperlinkTag<Self, DaemonInstanceSpec<A, E>>
<HSelf, const D extends Hyperlink.DefaultsBag>(
key: string,
options: DaemonTagOptions & {
readonly node: NodeKey<HSelf>
readonly defaults: Hyperlink.DefaultsInput<D>
}
): Hyperlink.TagWithDefaults<
NodeBoundTag<Self, DaemonInstanceSpec, HSelf>,
D
>
<HSelf>(
key: string,
options: DaemonTagOptions & {
readonly node: NodeKey<HSelf>
}
): NodeBoundTag<Self, DaemonInstanceSpec, HSelf>
<
A extends Schema.Top,
HSelf,
const D extends Hyperlink.DefaultsBag
>(
key: string,
options: DaemonTagOptions & {
readonly success: A
readonly node: NodeKey<HSelf>
readonly defaults: Hyperlink.DefaultsInput<D>
}
): Hyperlink.TagWithDefaults<
NodeBoundTag<
Self,
DaemonInstanceSpec<A>,
HSelf
>,
D
>
<A extends Schema.Top, HSelf>(
key: string,
options: DaemonTagOptions & {
readonly success: A
readonly node: NodeKey<HSelf>
}
): NodeBoundTag<
Self,
DaemonInstanceSpec<A>,
HSelf
>
<const D extends Hyperlink.DefaultsBag>(
key: string,
options: DaemonTagOptions & {
readonly defaults: Hyperlink.DefaultsInput<D>
}
): Hyperlink.TagWithDefaults<
HyperlinkTag<Self, DaemonInstanceSpec>,
D
>
(
key: string,
options?: DaemonTagOptions
): HyperlinkTag<Self, DaemonInstanceSpec>
}
Callable shape for
Tag
— overloads for positional schemas + config object.
DaemonTagBuild<function (type parameter) Self in <Self>(): DaemonTagBuild<Self>Self>;
};