@yanlinglabs/winter-agent-sdk 0.0.1 → 0.0.2

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.
@@ -0,0 +1,25 @@
1
+ import type { DeliveryOutcome, ListedRuntimeObject } from "./adapter.js";
2
+ export declare const MAX_GLOBAL_MESSAGE_SIZE = 1000000;
3
+ export declare const DEFAULT_MESSAGE_TTL_MS: number;
4
+ export declare const MAX_HOP_COUNT = 10;
5
+ export declare const RAPID_REPEAT_WINDOW_MS = 5000;
6
+ export declare const HELD_INBOX_CAP = 100;
7
+ export declare const ACCEPTED_QUEUE_CAP = 50;
8
+ export declare const DEFAULT_HOLD_EXPIRY_MS: number;
9
+ export declare const NOTIFY_IDLE_EXPIRY_MS: number;
10
+ export declare function messageExceedsMaxSize(body: string): boolean;
11
+ export declare function hopCountExceeded(hopCount: number): boolean;
12
+ export declare function delivered(messageId: string): DeliveryOutcome;
13
+ export declare function queued(messageId: string): DeliveryOutcome;
14
+ export declare function resumedAndDelivered(messageId: string): DeliveryOutcome;
15
+ export declare function held(messageId: string, reason: string): DeliveryOutcome;
16
+ export declare function subscribed(messageId: string): DeliveryOutcome;
17
+ export declare function deliveryUncertain(messageId: string, reason: string): DeliveryOutcome;
18
+ export declare function refused(messageId: string, reason: string): DeliveryOutcome;
19
+ export declare function ambiguous(messageId: string, candidates: ListedRuntimeObject[]): DeliveryOutcome;
20
+ export declare function notFound(messageId: string, reason: string): DeliveryOutcome;
21
+ export declare function unavailable(messageId: string, retryable: boolean, reason: string): DeliveryOutcome;
22
+ export interface LoopGuard {
23
+ check(from: string, to: string, body: string, now: number): "ok" | "duplicate";
24
+ }
25
+ export declare function createLoopGuard(): LoopGuard;
@@ -0,0 +1,39 @@
1
+ /**
2
+ * WS-10 §11: the resolution algorithm -- rules 1-6, MUST, in order.
3
+ *
4
+ * RUNTIME KIND. A serialized address (`session:<id>` / `agent:<parent>:<child>`) carries NO runtime
5
+ * kind -- WS-10 §11 puts it in the directory record instead -- so `parseRuntimeAddress` can only ever
6
+ * stamp a default. Where a `ListedRuntimeObject` row is available, THAT row's declared `runtimeKind`
7
+ * is authoritative and this function carries it onto the resolved address; a child resolves under
8
+ * `winter-agent`, since a child of a Winter session is one by construction. A consumer resolving from
9
+ * its OWN directory (the router) must overlay `runtimeKind` the same way for any address it builds by
10
+ * hand. `sameAddress` is unaffected -- it compares serializations, which never carry the kind.
11
+ *
12
+ * Consumes the `ChildLike` boundary interface and the RuntimeAddress/ListedRuntimeObject/
13
+ * serializeRuntimeAddress shapes from adapter.ts, and nothing else: resolution is pure, so both the
14
+ * Winter runtime's in-process adapter and the router package's cross-runtime one get identical
15
+ * answers.
16
+ */
17
+ import { type RuntimeAddress, type ListedRuntimeObject, type ChildLike } from "./adapter.js";
18
+ export declare function childToListedRuntimeObject(parentSessionId: string, child: ChildLike): ListedRuntimeObject;
19
+ export interface ResolutionInputs {
20
+ to: string;
21
+ callerParentSessionId: string;
22
+ children: readonly ChildLike[];
23
+ peers: readonly ListedRuntimeObject[];
24
+ }
25
+ export type ResolutionResult = {
26
+ kind: "resolved";
27
+ address: RuntimeAddress;
28
+ child?: ChildLike;
29
+ } | {
30
+ kind: "ambiguous";
31
+ candidates: ListedRuntimeObject[];
32
+ } | {
33
+ kind: "stale";
34
+ message: string;
35
+ } | {
36
+ kind: "not_found";
37
+ message: string;
38
+ };
39
+ export declare function resolveTarget(input: ResolutionInputs): ResolutionResult;
@@ -0,0 +1,90 @@
1
+ import { type RuntimeAddress, type ListedRuntimeObject, type DeliveryOutcome, type RuntimeMessagingAdapter, type MessagingRouterSeam, type ChildLike } from "./adapter.js";
2
+ import type { NotificationQueue, NotificationRecord } from "./idle.js";
3
+ import { type LoopGuard } from "./outcomes.js";
4
+ export interface MessagingRouterSeamWithRoster extends MessagingRouterSeam {
5
+ addChildRosterSource(getChildren: () => readonly ChildLike[]): () => void;
6
+ }
7
+ export declare const MAX_TRACKED_MESSAGE_IDS = 10000;
8
+ export declare function rememberBounded<V>(map: Map<string, V>, key: string, value: V, cap?: number): void;
9
+ export declare function createMessagingRouterSeam(): MessagingRouterSeamWithRoster;
10
+ export interface SubscriberDirectory {
11
+ remember(messageId: string, subscriberSessionId: string): void;
12
+ lookup(messageId: string): string | undefined;
13
+ }
14
+ export declare function createSubscriberDirectory(): SubscriberDirectory;
15
+ export interface MessagingRuntimeDeps {
16
+ seam: MessagingRouterSeam;
17
+ adapter: RuntimeMessagingAdapter;
18
+ notifications: NotificationQueue;
19
+ loopGuard: LoopGuard;
20
+ subscribers: SubscriberDirectory;
21
+ now(): number;
22
+ /**
23
+ * How a THROW out of an adapter delivery call is classified (R-7b-4's one behavioural seam).
24
+ *
25
+ * WS-10 §12's crash-window semantics make `delivery_uncertain` the honest default for an
26
+ * unexplained throw: from here, "the call failed" and "the effect happened and then the call
27
+ * failed" are indistinguishable. But a POLICY refusal thrown by an adapter is neither -- it is a
28
+ * clean, side-effect-free "no", and reporting it as uncertain would be a lie in the safe-looking
29
+ * direction.
30
+ *
31
+ * The core cannot recognise those classes itself: they belong to whichever runtime the adapter
32
+ * drives (the Winter runtime's `ChildResumeModeIncomparableError` under RULING P4-D; the router
33
+ * package's own official-branch refusals). So the owner supplies the predicate. ABSENT means
34
+ * "everything is uncertain", which is exactly the conservative reading.
35
+ */
36
+ classifyDeliveryError?(err: unknown): "refused" | "uncertain";
37
+ }
38
+ export interface CallerContext {
39
+ sessionId: string;
40
+ agentId?: string;
41
+ toolUseId: string;
42
+ }
43
+ export declare function callerAddress(caller: {
44
+ sessionId: string;
45
+ agentId?: string;
46
+ }): RuntimeAddress;
47
+ export interface SendMessageInput {
48
+ to: string;
49
+ message: string;
50
+ summary?: string;
51
+ notify_when_idle?: boolean;
52
+ }
53
+ export interface NotifyOutcome {
54
+ subscribed?: true;
55
+ refused?: string;
56
+ }
57
+ export interface SendMessageResult {
58
+ outcome: DeliveryOutcome;
59
+ notify?: NotifyOutcome;
60
+ }
61
+ export declare function sendMessage(deps: MessagingRuntimeDeps, caller: CallerContext, input: SendMessageInput): Promise<SendMessageResult>;
62
+ export interface ListAgentsInput {
63
+ channel?: string;
64
+ q?: string;
65
+ }
66
+ export interface SessionCallerContext {
67
+ sessionId: string;
68
+ }
69
+ export declare function listAgents(deps: MessagingRuntimeDeps, caller: SessionCallerContext, _input: ListAgentsInput): Promise<{
70
+ listing: string;
71
+ rows: ListedRuntimeObject[];
72
+ }>;
73
+ export declare function readNotifications(deps: MessagingRuntimeDeps, caller: SessionCallerContext): {
74
+ notifications: NotificationRecord[];
75
+ remaining: number;
76
+ };
77
+ export type { RuntimeAddress, ListedRuntimeObject, DeliveryOutcome };
78
+ export interface MessagingRouter {
79
+ sendMessage(caller: CallerContext, input: SendMessageInput): Promise<SendMessageResult>;
80
+ listAgents(caller: SessionCallerContext, input: ListAgentsInput): Promise<{
81
+ listing: string;
82
+ rows: ListedRuntimeObject[];
83
+ }>;
84
+ readNotifications(caller: SessionCallerContext): {
85
+ notifications: NotificationRecord[];
86
+ remaining: number;
87
+ };
88
+ readonly deps: MessagingRuntimeDeps;
89
+ }
90
+ export declare function createMessagingRouter(deps: MessagingRuntimeDeps): MessagingRouter;
@@ -0,0 +1,111 @@
1
+ import type { DeliveryOutcome, GlobalAgentMessage, ListedRuntimeObject, NotificationRecord, PermissionClassLabel, RuntimeAddress } from "../messaging/index.js";
2
+ /** Every subtype, in one place, so neither side spells a literal the other does not. */
3
+ export declare const MESSAGING_CONTROL_SUBTYPES: {
4
+ readonly listReachable: "messaging.list_reachable";
5
+ readonly deliver: "messaging.deliver";
6
+ readonly steerChild: "messaging.steer_child";
7
+ readonly resumeChild: "messaging.resume_child";
8
+ readonly subscribeIdle: "messaging.subscribe_idle";
9
+ readonly senderClass: "messaging.sender_class";
10
+ readonly readNotifications: "messaging.read_notifications";
11
+ readonly idleNotice: "messaging.idle_notice";
12
+ };
13
+ export type MessagingControlSubtype = (typeof MESSAGING_CONTROL_SUBTYPES)[keyof typeof MESSAGING_CONTROL_SUBTYPES];
14
+ /**
15
+ * The subtypes the RUNTIME serves (host -> runtime). The engine dispatches on exactly this set.
16
+ *
17
+ * `idleNotice` is deliberately absent: it travels runtime -> host, is answered by the WRAPPER, and a
18
+ * runtime that dispatched it would be answering its own request.
19
+ */
20
+ export declare const MESSAGING_HOST_REQUEST_SUBTYPES: readonly MessagingControlSubtype[];
21
+ /** The subtypes the WRAPPER serves (runtime -> host). */
22
+ export declare const MESSAGING_RUNTIME_REQUEST_SUBTYPES: readonly MessagingControlSubtype[];
23
+ /** Every subtype, both directions. */
24
+ export declare const MESSAGING_CONTROL_SUBTYPE_LIST: readonly MessagingControlSubtype[];
25
+ /** `messaging.list_reachable` and `messaging.sender_class` are payload-free (like the pinned `list_models`). */
26
+ export interface MessagingDeliverRequest {
27
+ message: GlobalAgentMessage;
28
+ }
29
+ export interface MessagingChildRequest {
30
+ /** A canonical address, or a bare child id read within the receiving session. */
31
+ id: string;
32
+ message: GlobalAgentMessage;
33
+ }
34
+ export interface MessagingSubscribeIdleRequest {
35
+ /** A canonical address, or a bare child id read within the receiving session. */
36
+ id: string;
37
+ /**
38
+ * The HOST's own message id. The facet never allocates one: allocation is the router's
39
+ * (WS-10 §12 keys it to the sender session plus tool-call id), and a second allocator on the far
40
+ * side of a pipe would break the retry idempotency that key exists for.
41
+ */
42
+ messageId: string;
43
+ /**
44
+ * Whose notification queue an eventual idle notice belongs to. WS-10 §15's `subscribeIdle(addr,
45
+ * {messageId})` carries no subscriber at all, and the in-process reference answers that gap with a
46
+ * router-side directory keyed by messageId -- which a REMOTE caller cannot write into. So the
47
+ * caller names it here; absent means the receiving session itself.
48
+ */
49
+ subscriberSessionId?: string;
50
+ }
51
+ export interface MessagingSenderClassResponse {
52
+ senderClass: PermissionClassLabel;
53
+ }
54
+ /**
55
+ * `messaging.read_notifications` — the CATCH-UP half of `notify_when_idle` (WS-15 §6.4).
56
+ *
57
+ * A bounded page: `max` caps how many records come back and `remaining` says how many are still
58
+ * queued, so a host recovering after a restart drains in pages rather than in one unbounded frame
59
+ * whose size nothing governs.
60
+ */
61
+ export interface MessagingReadNotificationsRequest {
62
+ /** Whose queue to drain. Absent = the receiving session's own. */
63
+ subscriberSessionId?: string;
64
+ /** Page size. Absent = everything queued for that key. */
65
+ max?: number;
66
+ }
67
+ export interface MessagingNotificationsPage {
68
+ notifications: NotificationRecord[];
69
+ remaining: number;
70
+ }
71
+ /**
72
+ * `messaging.idle_notice` — the LIVE half, and the ONE subtype that travels runtime -> host.
73
+ *
74
+ * The SAME notice the drain returns, carrying the same `notification_id`, because the queue is the
75
+ * durable record and this is a signal derived from it: a host that missed the frame (crashed, not yet
76
+ * connected) still finds the entry via `read_notifications`, and a host that got both dedupes on the
77
+ * id. The runtime does NOT wait for a handler — an unanswered or refused notice is a dropped LIVE
78
+ * signal, never a dropped notice.
79
+ */
80
+ export interface MessagingIdleNoticePayload {
81
+ /** The queue key the notice was filed under -- the SUBSCRIBER, not the target that went idle. */
82
+ subscriberSessionId: string;
83
+ notice: NotificationRecord;
84
+ }
85
+ export declare function isRuntimeAddress(v: unknown): v is RuntimeAddress;
86
+ export declare function isGlobalAgentMessage(v: unknown): v is GlobalAgentMessage;
87
+ export declare function isDeliveryOutcome(v: unknown): v is DeliveryOutcome;
88
+ export declare function isListedRuntimeObjectArray(v: unknown): v is ListedRuntimeObject[];
89
+ export declare function isPermissionClassLabel(v: unknown): v is PermissionClassLabel;
90
+ export declare function isMessagingDeliverRequest(v: unknown): v is MessagingDeliverRequest;
91
+ export declare function isMessagingChildRequest(v: unknown): v is MessagingChildRequest;
92
+ export declare function isNotificationRecord(v: unknown): v is NotificationRecord;
93
+ export declare function isMessagingNotificationsPage(v: unknown): v is MessagingNotificationsPage;
94
+ export declare function isMessagingIdleNoticePayload(v: unknown): v is MessagingIdleNoticePayload;
95
+ export declare function isMessagingReadNotificationsRequest(v: unknown): v is MessagingReadNotificationsRequest;
96
+ export declare function isMessagingSubscribeIdleRequest(v: unknown): v is MessagingSubscribeIdleRequest;
97
+ /**
98
+ * Turns a facet `id` into a `RuntimeAddress` within the receiving session.
99
+ *
100
+ * TWO forms, and no third:
101
+ * 1. a CANONICAL address (`session:<id>` / `agent:<parent>:<child>`) -- parsed by WS-10 §11's own
102
+ * inverse, so a router that already holds a directory entry addresses it exactly;
103
+ * 2. a bare stable CHILD id -- read within the receiving session, which is the only scope in which
104
+ * a child id means anything (WS-10 §10.3: a child is reachable only through its owning parent).
105
+ *
106
+ * It deliberately does NOT fall back to display-name lookup. That is resolution rule 3, and rules
107
+ * 3/4/5 are inseparable -- a name that resolves here would be a name that never got its ambiguity
108
+ * and staleness checks, because those need the whole directory the router holds and this side does
109
+ * not.
110
+ */
111
+ export declare function resolveFacetTarget(sessionId: string, id: string, parse: (s: string) => RuntimeAddress | undefined, buildChild: (parent: string, childId: string) => RuntimeAddress): RuntimeAddress;
package/dist/query.d.ts CHANGED
@@ -2,6 +2,8 @@ import type { SdkMessage as RuntimeSdkMessage } from "./protocol/frames.js";
2
2
  import type { AccountInfo, ModelInfo, ModelFamilyListing, RewindFilesResult } from "./protocol/config.js";
3
3
  import { type Options } from "./options.js";
4
4
  import type { PermissionMode, PermissionResult } from "./permissions/types.js";
5
+ import { type DeliveryOutcome, type GlobalAgentMessage, type ListedRuntimeObject, type PermissionClassLabel } from "./messaging/index.js";
6
+ import { type MessagingNotificationsPage, type MessagingIdleNoticePayload } from "./protocol/messaging.js";
5
7
  export type SdkMessage = Extract<RuntimeSdkMessage, {
6
8
  type: "system";
7
9
  } | {
@@ -24,6 +26,88 @@ export interface QueryInternal {
24
26
  registerControlRequestHandler(subtype: string, handler: ControlRequestHandler): void;
25
27
  respondPermission(requestId: string, result: PermissionResult): void;
26
28
  }
29
+ /**
30
+ * R-7b-4: the per-session MESSAGING FACET -- `RuntimeMessagingAdapter` (WS-10 §15) reached over this
31
+ * session's own control channel.
32
+ *
33
+ * WHO CALLS IT: `@yanlinglabs/winter-runtime-sdk`, from the HOST process. A spawned Winter session's
34
+ * children live inside that session's process, behind a pipe; without this facet the router owns a
35
+ * RuntimeDirectory that can address the session and nothing inside it, so WS-15 §6.2's "running
36
+ * Winter child" and "terminal Winter child" rows have no mechanism at all.
37
+ *
38
+ * WHAT IT IS NOT: the router. Every rule that needs the whole directory -- WS-10 §11's resolution
39
+ * order, ambiguity, staleness, §12's dedupe/retry ledger and loop guard, §13's hold/refuse policy --
40
+ * runs ABOVE this, in the host, once, for both runtimes. This is the six owner-specific operations
41
+ * the router delegates to whichever runtime actually holds the object.
42
+ *
43
+ * WINTER-ONLY, disclosed: the pinned official SDK has no messaging surface of any kind (its `Query`
44
+ * declares none), so there is no counterpart to mirror and nothing here is a divergence FROM one.
45
+ *
46
+ * FOUR THINGS A CONSUMER MUST KNOW, because none of them is visible in the signatures:
47
+ *
48
+ * 1. NO DELIVERY METHOD REJECTS. `deliver`, `steerChild`, `resumeChild` and `subscribeIdle` always
49
+ * RESOLVE with a typed `DeliveryOutcome` -- a caller that must record an outcome for every
50
+ * message (WS-10 §12's ledger) is never left with nothing to write down. A refusal the runtime
51
+ * could name arrives as `refused`; an unregistered messaging runtime as non-retryable
52
+ * `unavailable`; every other failure, including a transport fault, as `delivery_uncertain`,
53
+ * because from the host's side that is genuinely indistinguishable from "it already happened".
54
+ * 2. THIS FACET SERVES ONE SESSION -- its own, and its own children. A target naming another session
55
+ * is refused, even though the runtime could reach it in a shared process: cross-session delivery
56
+ * belongs to the router, through its directory, which is the one party that holds every session's
57
+ * entry and can pick the right adapter for it.
58
+ * 3. THE RECEIVER RE-RUNS INBOUND POLICY on the `senderPermissionClass` YOU stamped (WS-10 §13), so
59
+ * a caller-side decision to deliver can still come back `held` or `refused`. The envelope's class
60
+ * is an input to the receiver's matrix, never a verdict.
61
+ * 4. NOTIFICATIONS ARE NAMESPACED. `subscribeIdle` and `readNotifications` default to the FACET's own
62
+ * queue key (`host:<sessionId>`), deliberately separate from the one the session's own model
63
+ * drains with its `ReadNotifications` tool -- a drain REMOVES, so a shared key would have
64
+ * whichever side read first silently eat the other's notices. Passing
65
+ * `subscriberSessionId: <the session's own id>` opts into the model's bucket on purpose.
66
+ */
67
+ export interface SessionMessagingFacet {
68
+ /** Every object this session can currently reach: its own children, plus the reachable live peers its adapter knows (WS-10 §10.2 -- never exited transcripts). */
69
+ listReachable(): Promise<ListedRuntimeObject[]>;
70
+ /** Deliver a fully-addressed envelope. The target is `msg.to`; the receiver's inbound policy (WS-10 §13) runs inside. */
71
+ deliver(msg: GlobalAgentMessage): Promise<DeliveryOutcome>;
72
+ /** Steer a RUNNING child (WS-10 §10.3). `id` is a canonical address or a bare child id within this session. */
73
+ steerChild(id: string, msg: GlobalAgentMessage): Promise<DeliveryOutcome>;
74
+ /** Resume a TERMINAL, addressable child (WS-10 §10.3). Never the reverse of `steerChild`. */
75
+ resumeChild(id: string, msg: GlobalAgentMessage): Promise<DeliveryOutcome>;
76
+ /**
77
+ * Subscribe to a target going idle (WS-10 §14). `opts.messageId` is the CALLER's -- the facet never
78
+ * allocates one, because allocation is keyed to the sender session plus tool-call id (§12) and a
79
+ * second allocator across the pipe would break the retry idempotency that key exists for.
80
+ * `subscriberSessionId` names whose notification queue the eventual notice belongs to; absent means
81
+ * the receiving session itself.
82
+ */
83
+ subscribeIdle(id: string, opts: {
84
+ messageId: string;
85
+ subscriberSessionId?: string;
86
+ }): Promise<DeliveryOutcome>;
87
+ /** This session's own sender permission class (WS-10 §13's matrix input), from its LIVE permission mode. */
88
+ senderClass(): Promise<PermissionClassLabel>;
89
+ /**
90
+ * Drain a bounded page of queued notifications -- the CATCH-UP half of `notify_when_idle`
91
+ * (WS-15 §6.4's restart recovery). `remaining` says how many are still queued, so a host that
92
+ * reconnects drains in pages rather than in one frame whose size nothing governs.
93
+ *
94
+ * A drain is the ACKNOWLEDGEMENT: a record it returns is removed. `onIdleNotice` below carries the
95
+ * same notice live, with the same `notification_id`, so a host that got both dedupes on the id.
96
+ */
97
+ readNotifications(opts?: {
98
+ subscriberSessionId?: string;
99
+ max?: number;
100
+ }): Promise<MessagingNotificationsPage>;
101
+ /**
102
+ * Subscribe to LIVE idle notices for this session. Returns an unsubscribe.
103
+ *
104
+ * A handler-plus-unsubscribe rather than an async iterator, because a notice is a fire-and-forget
105
+ * SIGNAL, not a stream a consumer may fall behind on: an iterator would need a buffer, and the
106
+ * durable buffer already exists on the runtime side (`readNotifications`). A handler that is never
107
+ * registered, or that throws, loses no notice -- the entry stays queued for the drain.
108
+ */
109
+ onIdleNotice(handler: (payload: MessagingIdleNoticePayload) => void): () => void;
110
+ }
27
111
  export interface Query extends AsyncGenerator<SdkMessage> {
28
112
  interrupt(): Promise<void>;
29
113
  setModel(model?: string): Promise<void>;
@@ -73,6 +157,13 @@ export interface Query extends AsyncGenerator<SdkMessage> {
73
157
  dryRun?: boolean;
74
158
  }): Promise<RewindFilesResult>;
75
159
  setPermissionMode(mode: PermissionMode): Promise<void>;
160
+ /**
161
+ * R-7b-4: this session's messaging facet, backed by the six `messaging.*` control subtypes.
162
+ *
163
+ * ADDITIVE and Winter-only: the pinned `Query` contract loses nothing, and the official SDK has no
164
+ * member this could collide with. See `SessionMessagingFacet` for what it is and is not.
165
+ */
166
+ messaging: SessionMessagingFacet;
76
167
  __internal?: QueryInternal;
77
168
  }
78
169
  export declare function query(args: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yanlinglabs/winter-agent-sdk",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "engines": {
@@ -21,6 +21,10 @@
21
21
  ".": {
22
22
  "types": "./dist/index.d.ts",
23
23
  "default": "./dist/index.js"
24
+ },
25
+ "./messaging": {
26
+ "types": "./dist/messaging/index.d.ts",
27
+ "default": "./dist/messaging/index.js"
24
28
  }
25
29
  },
26
30
  "files": [
@@ -37,15 +41,15 @@
37
41
  }
38
42
  },
39
43
  "dependencies": {
40
- "@yanlinglabs/winter-provider-catalog": "0.0.1"
44
+ "@yanlinglabs/winter-provider-catalog": "0.0.2"
41
45
  },
42
46
  "optionalDependencies": {
43
- "@yanlinglabs/winter-agent-sdk-darwin-arm64": "0.0.1"
47
+ "@yanlinglabs/winter-agent-sdk-darwin-arm64": "0.0.2"
44
48
  },
45
49
  "devDependencies": {
46
50
  "@types/node": "^26.4.0",
47
- "@yanlinglabs/winter-conformance": "0.0.1",
48
- "winter-agent-runtime": "0.0.1"
51
+ "@yanlinglabs/winter-conformance": "0.0.2",
52
+ "winter-agent-runtime": "0.0.2"
49
53
  },
50
54
  "scripts": {}
51
55
  }