@yanlinglabs/winter-agent-runtime 0.0.38 → 0.0.40

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.
@@ -9,14 +9,14 @@ import {
9
9
  resolveEngineSession2,
10
10
  resolveProductionWinterHome2,
11
11
  resolveProductionStoreHome
12
- } from "./index-5xe59vkt.js";
12
+ } from "./index-a8j104mg.js";
13
13
  import {
14
14
  registerDefaultChildEngineFactory,
15
15
  loadResumedChain,
16
16
  buildProductionWiring,
17
17
  withAutoSkillPermissions,
18
18
  restoreChildRoster
19
- } from "./index-z3970wsj.js";
19
+ } from "./index-rhxkckyn.js";
20
20
 
21
21
  // src/embedded.ts
22
22
  import { splitFrames, encodeFrame } from "@yanlinglabs/winter-agent-sdk";
@@ -60,6 +60,7 @@ import {
60
60
  autoSkillPermissionEntries,
61
61
  listWorkflowsForListing,
62
62
  buildWorkflowSkillPrompt,
63
+ createToolLaneTails,
63
64
  ProviderTurnError,
64
65
  isProviderTurnError,
65
66
  createContextAccountant2,
@@ -85,7 +86,7 @@ import {
85
86
  providerCredentialRef2,
86
87
  createModelClassifier2,
87
88
  selectClassifierRoute2
88
- } from "./index-5xe59vkt.js";
89
+ } from "./index-a8j104mg.js";
89
90
  import {
90
91
  createKeychainCredentialStore,
91
92
  createKeychainSecretReader,
@@ -797,6 +798,7 @@ async function spawnChildEngine(req, inherit, runCtx, deps) {
797
798
  ...runCtx.budgetExceeded !== undefined ? { ancestorBudgetExceeded: () => runCtx.budgetExceeded() } : {},
798
799
  ...deps.resolveAuxiliaryModel !== undefined ? { resolveAuxiliaryModel: deps.resolveAuxiliaryModel } : {},
799
800
  ...deps.resolveToolSecret !== undefined ? { resolveToolSecret: deps.resolveToolSecret } : {},
801
+ ...deps.toolLaneTails !== undefined ? { toolLaneTails: deps.toolLaneTails } : {},
800
802
  ...deps.settingsRules !== undefined ? { settingsRules: deps.settingsRules } : {},
801
803
  ...childDurableRoot !== undefined ? { winterHome: childDurableRoot } : {},
802
804
  ...deps.structuredOutput !== undefined ? { structuredOutput: deps.structuredOutput } : {},
@@ -1186,7 +1188,8 @@ function registerDefaultChildEngineFactory(opts) {
1186
1188
  ...opts.priceUsage !== undefined ? { priceUsage: opts.priceUsage } : {},
1187
1189
  ...opts.usageRowFacts !== undefined ? { usageRowFacts: opts.usageRowFacts } : {},
1188
1190
  ...opts.resolveAuxiliaryModel !== undefined ? { resolveAuxiliaryModel: opts.resolveAuxiliaryModel } : {},
1189
- ...opts.resolveToolSecret !== undefined ? { resolveToolSecret: opts.resolveToolSecret } : {}
1191
+ ...opts.resolveToolSecret !== undefined ? { resolveToolSecret: opts.resolveToolSecret } : {},
1192
+ ...opts.toolLaneTails !== undefined ? { toolLaneTails: opts.toolLaneTails } : {}
1190
1193
  }));
1191
1194
  }
1192
1195
 
@@ -5888,6 +5891,7 @@ async function buildProductionWiring(opts) {
5888
5891
  ...pluginCacheDir !== undefined ? { pluginCacheDir } : {},
5889
5892
  ...mergedSandbox !== undefined ? { sandbox: mergedSandbox } : {}
5890
5893
  };
5894
+ const toolLaneTails = createToolLaneTails();
5891
5895
  return {
5892
5896
  providerWiring,
5893
5897
  settingsEnv,
@@ -5944,6 +5948,7 @@ async function buildProductionWiring(opts) {
5944
5948
  ...providerWiring.resolveReviewer !== undefined ? { resolveReviewer: providerWiring.resolveReviewer } : {},
5945
5949
  ...providerWiring.resolveAuxiliaryModel !== undefined ? { resolveAuxiliaryModel: providerWiring.resolveAuxiliaryModel } : {},
5946
5950
  resolveToolSecret: providerWiring.resolveToolSecret,
5951
+ toolLaneTails,
5947
5952
  ...providerWiring.providerSupportsToolSearch !== undefined ? { providerSupportsToolSearch: providerWiring.providerSupportsToolSearch } : {},
5948
5953
  ...providerWiring.classifier !== undefined ? { classifier: providerWiring.classifier } : {},
5949
5954
  systemPromptAssembler,
@@ -5973,6 +5978,7 @@ async function buildProductionWiring(opts) {
5973
5978
  priceUsage: (modelKey, usage) => providerWiring.priceUsage(modelKey, usage),
5974
5979
  usageRowFacts: (modelKey) => providerWiring.usageRowFacts(modelKey),
5975
5980
  resolveToolSecret: providerWiring.resolveToolSecret,
5981
+ toolLaneTails,
5976
5982
  ...providerWiring.resolveAuxiliaryModel !== undefined ? { resolveAuxiliaryModel: providerWiring.resolveAuxiliaryModel } : {},
5977
5983
  settingsRules,
5978
5984
  structuredOutput,
package/dist/index.js CHANGED
@@ -55,7 +55,7 @@ import {
55
55
  DEFAULT_CLASSIFIER_TIMEOUT_MS2,
56
56
  createModelClassifier2,
57
57
  selectClassifierRoute2
58
- } from "./index-5xe59vkt.js";
58
+ } from "./index-a8j104mg.js";
59
59
  import"./index-1hef2gff.js";
60
60
  import"./index-mwew595z.js";
61
61
  import"./index-2wgfv0pa.js";
@@ -0,0 +1,19 @@
1
+ import { type HostMessagingPort } from "@yanlinglabs/winter-agent-sdk/messaging";
2
+ import type { RpcBridge } from "../rpc/bridge.js";
3
+ /**
4
+ * How long one delivery may take. Generous on purpose: a host may RESUME a finished session for the
5
+ * message (start its runtime, replay its transcript, connect its MCP servers) before it can answer. A
6
+ * timeout is `delivery_uncertain`, never `not_found` -- by then the host may well have delivered.
7
+ */
8
+ export declare const HOST_MESSAGE_SEND_TIMEOUT_MS = 180000;
9
+ /** How long a listing may take; a slow one lists nothing more (ListAgents still shows the subagents). */
10
+ export declare const HOST_MESSAGE_LIST_TIMEOUT_MS = 15000;
11
+ /** How long a session stop may take (an interrupt is quick; the host answers once it is requested). */
12
+ export declare const HOST_SESSION_STOP_TIMEOUT_MS = 30000;
13
+ /** Thrown for a malformed send answer, so the router core reports it as `delivery_uncertain`. */
14
+ export declare class HostMessagingAnswerError extends Error {
15
+ constructor(message: string);
16
+ }
17
+ /** The bridge's own `request`, whose options carry the `signal` the host requests ride. */
18
+ export type HostMessagingSender = Pick<RpcBridge, "request">;
19
+ export declare function createHostMessagingPort(sender: HostMessagingSender): HostMessagingPort;
@@ -1,5 +1,5 @@
1
1
  import type { PermissionMode } from "@yanlinglabs/winter-agent-sdk";
2
- import { type ChildLike, type RuntimeAddress, type DeliveryOutcome, type GlobalAgentMessage, type RuntimeMessagingAdapter, type CrossSessionInbound, type NotificationQueue, type MessagingRouterSeamWithRoster, type MessagingRuntimeDeps, type SubscriberDirectory } from "@yanlinglabs/winter-agent-sdk/messaging";
2
+ import { type ChildLike, type RuntimeAddress, type DeliveryOutcome, type GlobalAgentMessage, type RuntimeMessagingAdapter, type CrossSessionInbound, type NotificationQueue, type MessagingRouterSeamWithRoster, type MessagingRuntimeDeps, type SubscriberDirectory, type HostMessagingPort } from "@yanlinglabs/winter-agent-sdk/messaging";
3
3
  export interface PeerSessionHandle {
4
4
  readonly address: RuntimeAddress;
5
5
  readonly name?: string;
@@ -41,6 +41,13 @@ export interface DefaultMessagingRuntime extends MessagingRuntimeDeps {
41
41
  adapter: ReferenceMessagingAdapter;
42
42
  peers: PeerDirectory;
43
43
  seam: MessagingRouterSeamWithRoster;
44
+ /**
45
+ * Host messaging: register `port` as the host line of the OWNING session `sessionId` (a top-level run
46
+ * whose config says `hostMessaging: true`). Returns the withdrawal, which removes only this exact
47
+ * registration. Keyed by session, never one process slot: the in-memory leg runs several sessions in
48
+ * one realm, and each must reach only its own host handler.
49
+ */
50
+ registerHostMessagingPort(sessionId: string, port: HostMessagingPort): () => void;
44
51
  }
45
52
  /**
46
53
  * R-7b-4: THIS RUNTIME's answer to "was that throw a policy refusal, or a crash window?"
@@ -0,0 +1,26 @@
1
+ type Platform = typeof process.platform;
2
+ export interface BashReadOnlyContext {
3
+ /** The session's current working directory (where the command runs). */
4
+ cwd: string;
5
+ /** The directory the session started in. */
6
+ originalCwd: string;
7
+ /** Whether the Bash sandbox is on for this call. */
8
+ sandboxEnabled: boolean;
9
+ }
10
+ /** True when `command` is provably read-only, which is exactly when a Bash call may run concurrently. */
11
+ export declare function isBashCommandReadOnly(command: string, ctx: BashReadOnlyContext): boolean;
12
+ /**
13
+ * True when `cwd` holds a bare repository's own markers -- a `HEAD` file, an `objects/` or a `refs/`
14
+ * directory -- and no working `.git` (a `.git` FILE, as in a worktree or submodule, or a `.git`
15
+ * directory with a regular `HEAD` file) that git would find first. git would then use `cwd` itself as
16
+ * the repository and could run hooks planted there.
17
+ */
18
+ export declare function isCurrentDirectoryBareGitRepo(cwd: string): boolean;
19
+ /**
20
+ * True on Windows when `text` names a UNC or WebDAV location, which Windows opens by reaching out over
21
+ * the network (and authenticating). Any run of two or more path separators -- `\\`, `//`, or a mix
22
+ * such as `/\\` -- followed directly by a host-like character counts, except the `//` of a URL scheme
23
+ * (`https://…`). STRICTER: a mixed pair such as `/\host` counts too.
24
+ */
25
+ export declare function containsVulnerableUncPath(text: string, platform?: Platform): boolean;
26
+ export {};
@@ -36,6 +36,13 @@ export declare function leadingWord(s: string): {
36
36
  */
37
37
  export declare function joinLineContinuations(command: string): string;
38
38
  export declare function splitCompound(rawCommand: string): string[] | null;
39
+ /**
40
+ * The command a wrapper-prefixed (sub)command really runs: leading assignments and the fixed wrappers
41
+ * (`timeout 5`, `nice -n 5`, flag-free `xargs`, ...) looked through, per `direction` (see the module
42
+ * header). Any file-writing redirection that was part of the looked-through words is appended, so
43
+ * every redirect scan of the result still sees it. For an allow whose wrapper word is spelled so that
44
+ * only the broad reading names a wrapper (`"\timeout" …`), the command is returned as written.
45
+ */
39
46
  export declare function stripWrappers(rawCmd: string, direction: "allow" | "denyAsk"): string;
40
47
  /** One word of a command: its text after quote removal, as written, and whether any of it was quoted. */
41
48
  export interface ShellWord {
@@ -43,16 +50,35 @@ export interface ShellWord {
43
50
  raw: string;
44
51
  quoted: boolean;
45
52
  }
53
+ /**
54
+ * How a backslash inside double quotes is read.
55
+ *
56
+ * - `"bash"`: exactly as bash does. Inside `"…"` a backslash escapes only `$`, `` ` ``, `"`, `\` and a
57
+ * newline (backslash-newline is a line continuation: both characters vanish); before any other
58
+ * character the backslash is kept, so `"\-o"` is the word `\-o` and `"a\b"` is `a\b`.
59
+ * - `"broad"`: the backslash is dropped before every character, so `"\-o"` reads `-o`. Not what bash
60
+ * runs, but a superset view for the permission layer's deny rules and write floors: a spelling
61
+ * like `"\.git/config"` or `sort "\-o"` is still matched against `.git/config` / `sort -o`.
62
+ *
63
+ * Outside quotes a backslash escapes the next character (backslash-newline vanishes) and inside single
64
+ * quotes nothing is special, in both readings.
65
+ */
66
+ export type QuoteReading = "bash" | "broad";
46
67
  /**
47
68
  * bash's quote removal (and, with `split`, its word splitting at unquoted blanks) over one command's
48
- * text: single quotes, double quotes (a backslash there drops -- stricter than bash, which keeps it
49
- * before an ordinary character, and never naming a DIFFERENT protected file), backslash escapes,
50
- * ANSI-C `$'…'` (decoded) and locale `$"…"` (as double quotes). Expansions are left as written. An
51
- * unterminated quote runs to the end.
69
+ * text: single quotes, double quotes (a backslash inside them per `reading` -- see `QuoteReading`;
70
+ * the default `"broad"` is what the permission layer's deny rules and write floors read), backslash
71
+ * escapes, ANSI-C `$'…'` (decoded) and locale `$"…"` (as double quotes). Expansions are left as
72
+ * written. An unterminated quote runs to the end.
52
73
  */
53
- export declare function shellWords(s: string, split?: boolean): ShellWord[];
54
- /** `word` after bash's quote removal, as ONE word (blanks inside it are kept). */
74
+ export declare function shellWords(s: string, split?: boolean, reading?: QuoteReading): ShellWord[];
75
+ /** `word` after bash's quote removal, exactly as bash reads it, as ONE word (blanks inside it are kept). */
55
76
  export declare function dequoteShellWord(word: string): string;
77
+ /**
78
+ * `word` in bash's reading and, when it differs, the broad one (see `QuoteReading`) -- for deny-side
79
+ * checks and write floors, which must judge every file the word could be taken to name.
80
+ */
81
+ export declare function shellWordReadings(word: string): string[];
56
82
  /** One file-writing redirection: the target word as written (`raw`) and after bash's quote removal. */
57
83
  export interface RedirectWrite {
58
84
  raw: string;
@@ -241,6 +241,8 @@ export interface ProductionWiring {
241
241
  */
242
242
  resolveAuxiliaryModel?: NonNullable<EngineOptions["resolveAuxiliaryModel"]>;
243
243
  resolveToolSecret: NonNullable<EngineOptions["resolveToolSecret"]>;
244
+ /** SDK 0.0.40: the session's concurrency lanes -- the SAME map `childFactoryOptions.toolLaneTails` carries. */
245
+ toolLaneTails: NonNullable<EngineOptions["toolLaneTails"]>;
244
246
  };
245
247
  /**
246
248
  * Mirrors handed to `registerDefaultChildEngineFactory`, so a CHILD engine gets the same context
@@ -261,7 +263,7 @@ export interface ProductionWiring {
261
263
  * Adding a mirror is therefore now a two-file edit by construction: declare it on
262
264
  * `DefaultChildEngineFactoryOptions` first, then produce it here.
263
265
  */
264
- childFactoryOptions: Required<Pick<DefaultChildEngineFactoryOptions, "systemPromptAssembler" | "skillRuntime" | "skillListing" | "settingsRules" | "structuredOutput" | "extraHookEntries" | "compactionControllerFactory" | "resolveChildProvider" | "describeModel" | "priceUsage" | "usageRowFacts" | "resolveToolSecret">> & Pick<DefaultChildEngineFactoryOptions, "resolveAuxiliaryModel">;
266
+ childFactoryOptions: Required<Pick<DefaultChildEngineFactoryOptions, "systemPromptAssembler" | "skillRuntime" | "skillListing" | "settingsRules" | "structuredOutput" | "extraHookEntries" | "compactionControllerFactory" | "resolveChildProvider" | "describeModel" | "priceUsage" | "usageRowFacts" | "resolveToolSecret" | "toolLaneTails">> & Pick<DefaultChildEngineFactoryOptions, "resolveAuxiliaryModel">;
265
267
  /**
266
268
  * Phase 6 Task 10: the session's provider, and everything resolved with it.
267
269
  *
@@ -5,6 +5,7 @@ export interface RpcBridge {
5
5
  timeoutMs?: number;
6
6
  requestId?: string;
7
7
  signal?: AbortSignal;
8
+ cancelGraceMs?: number;
8
9
  }): Promise<T>;
9
10
  handleResponse(frame: ControlResponseFrame): boolean;
10
11
  ownsRequest(requestId: string): boolean;
@@ -478,7 +478,7 @@ export declare class TranscriptWriter implements SessionPersistence {
478
478
  private dialectRecord;
479
479
  static readBack(store: SessionStore, key: SessionKey): Promise<SessionStoreEntry[]>;
480
480
  }
481
- export declare const RUNTIME_ENGINE_VERSION = "0.0.38";
481
+ export declare const RUNTIME_ENGINE_VERSION = "0.0.40";
482
482
  export interface ResolvedEngineSession {
483
483
  config: RuntimeConfig;
484
484
  store: SessionPersistence | undefined;
@@ -146,6 +146,8 @@ export interface ChildEngineFactoryDeps {
146
146
  usageRowFacts?: EngineOptions["usageRowFacts"];
147
147
  resolveAuxiliaryModel?: EngineOptions["resolveAuxiliaryModel"];
148
148
  resolveToolSecret?: EngineOptions["resolveToolSecret"];
149
+ /** SDK 0.0.40: the SESSION's concurrency lanes, the same map the top-level engine runs with -- see `EngineOptions.toolLaneTails`. */
150
+ toolLaneTails?: EngineOptions["toolLaneTails"];
149
151
  getParentPolicy?: () => {
150
152
  mode: PermissionMode;
151
153
  version: number;
@@ -62,5 +62,7 @@ export interface DefaultChildEngineFactoryOptions {
62
62
  usageRowFacts?: EngineOptions["usageRowFacts"];
63
63
  resolveAuxiliaryModel?: EngineOptions["resolveAuxiliaryModel"];
64
64
  resolveToolSecret?: EngineOptions["resolveToolSecret"];
65
+ /** SDK 0.0.40: the session's concurrency lanes -- see `ChildEngineFactoryDeps.toolLaneTails`. */
66
+ toolLaneTails?: EngineOptions["toolLaneTails"];
65
67
  }
66
68
  export declare function registerDefaultChildEngineFactory(opts: DefaultChildEngineFactoryOptions): void;
package/dist/testing.js CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  runEngine2,
4
4
  echoProvider2,
5
5
  resolveEngineSession2
6
- } from "./index-5xe59vkt.js";
6
+ } from "./index-a8j104mg.js";
7
7
  import"./index-1hef2gff.js";
8
8
  import"./index-mwew595z.js";
9
9
  import"./index-2wgfv0pa.js";
@@ -14,7 +14,7 @@ import {
14
14
  buildProductionWiring,
15
15
  withAutoSkillPermissions,
16
16
  restoreChildRoster
17
- } from "./index-z3970wsj.js";
17
+ } from "./index-rhxkckyn.js";
18
18
  import {
19
19
  Queue
20
20
  } from "./index-97t2rmtf.js";
@@ -0,0 +1,48 @@
1
+ /** At most this many concurrent/lane calls of one round run at once (claude's default). */
2
+ export declare const MAX_TOOL_CONCURRENCY = 10;
3
+ /** The built-ins that always run concurrently, by canonical name. */
4
+ export declare const CONCURRENCY_SAFE_BUILTINS: ReadonlySet<string>;
5
+ /** What `Bash`'s read-only classification needs to know about the session (claude reads the same three). */
6
+ export interface BashReadOnlyContext {
7
+ cwd: string;
8
+ originalCwd: string;
9
+ sandboxEnabled: boolean;
10
+ }
11
+ export type CallScheduling = {
12
+ kind: "concurrent";
13
+ } | {
14
+ kind: "lane";
15
+ lane: string;
16
+ } | {
17
+ kind: "serial";
18
+ };
19
+ /** How a call to `name` (the registered name it will run as) with `input` is scheduled. */
20
+ export declare function schedulingForCall(name: string, input: unknown, bash?: BashReadOnlyContext): CallScheduling;
21
+ /**
22
+ * A SESSION's lanes: for each lane, the last call that entered it (settling once that call is done).
23
+ *
24
+ * One map per session, shared by the top-level engine and every subagent engine of the session (it rides
25
+ * `EngineOptions.toolLaneTails` and the child-engine factory's deps), so a lane is exclusive across the
26
+ * whole session -- two concurrent subagents, or a parent and its subagent, never run the same lane at once.
27
+ * A call enters its lane only once its OWN checks are done -- hook stop, permission, any approval card --
28
+ * so a call parked on a card holds no lane. One engine's calls finish their checks one at a time in call
29
+ * order, so they enter a lane in call order; across engines, in the order their calls became ready. A call
30
+ * holds its lane until it is done AND its execution has really stopped: an interrupted in-process host tool
31
+ * keeps the lane until the host answers the cancel, or `SDK_MCP_CANCEL_GRACE_MS` runs out. Never rejects.
32
+ */
33
+ export type ToolLaneTails = Map<string, Promise<unknown>>;
34
+ /**
35
+ * How long an interrupted `sdk_mcp_call` stays pending after its `control_cancel_request`, waiting for the
36
+ * host to answer that the tool stopped (a host that answers nothing after a cancel -- an older SDK -- costs
37
+ * the lane this long). Until it settles, the call's concurrency lane stays held.
38
+ */
39
+ export declare const SDK_MCP_CANCEL_GRACE_MS = 5000;
40
+ /** A fresh, empty set of lanes for one session. */
41
+ export declare function createToolLaneTails(): ToolLaneTails;
42
+ /**
43
+ * Enter `lane` with `tail` (a call's never-rejecting settle): returns the previous tail to wait for, if any,
44
+ * and drops the entry once `tail` settles while it is still the lane's last call (no unbounded growth).
45
+ */
46
+ export declare function enterToolLane(lanes: ToolLaneTails, lane: string, tail: Promise<unknown>): Promise<unknown> | undefined;
47
+ /** Whether a call to `name` always runs beside other concurrent calls (no lane, no input-dependence). */
48
+ export declare function isConcurrencySafeTool(name: string): boolean;
@@ -8,4 +8,6 @@ declare function parseTaskStopInput(input: unknown): TaskStopInput | {
8
8
  error: string;
9
9
  };
10
10
  declare const taskStopExecutor: ToolExecutor;
11
+ /** `task_type` for a host session in TaskStop's pinned result shape. */
12
+ export declare const HOST_SESSION_TASK_TYPE = "session";
11
13
  export { parseTaskStopInput, taskStopExecutor };
@@ -62,6 +62,7 @@ export interface ToolDescriptor {
62
62
  disposition: ToolDisposition;
63
63
  versionIntroduced?: string;
64
64
  deferred?: boolean | readonly PermissionMode[];
65
+ concurrencyLane?: string;
65
66
  alwaysLoad?: boolean;
66
67
  _meta?: Record<string, unknown>;
67
68
  interaction?: "required";
@@ -351,10 +352,22 @@ export declare function rebrandStandingServerTools(renames: ReadonlyArray<{
351
352
  from: string;
352
353
  to: string;
353
354
  }>, serverName: string): () => void;
355
+ /**
356
+ * SDK 0.0.40: a HOST's concurrency lanes for some of one in-process server's tools
357
+ * (`McpSdkServerConfig.toolLanes`): server tool name -> lane key. A tool in a lane runs BESIDE the round's
358
+ * other calls (it is not a barrier) but one at a time WITHIN its lane, in call order -- e.g. two `Computer`
359
+ * calls never overlap, while a `Computer` call and a `Browser` call (another lane) and any read-only call
360
+ * may. Only an in-process (`sdk`) server carries lanes: the host vouches for its own tools. A lane key is
361
+ * 1-64 characters of `[A-Za-z0-9_.:-]`; anything else is ignored (the tool stays serial).
362
+ */
363
+ export type McpServerToolLanes = Readonly<Record<string, string>>;
364
+ /** Whether `lane` is a usable concurrency-lane key. */
365
+ export declare function isValidConcurrencyLane(lane: unknown): lane is string;
354
366
  export declare function registerMcpServerTools(server: string, incomingTools: readonly McpToolDefinition[], opts: {
355
367
  alwaysLoad?: boolean;
356
368
  deferredDefault: boolean | readonly PermissionMode[];
357
369
  toolNames?: McpServerToolNames;
370
+ toolLanes?: McpServerToolLanes;
358
371
  }): void;
359
372
  /**
360
373
  * Fix round 20: the live MCP server that registered `canonicalName` through `registerMcpServerTools`,
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const RUNTIME_VERSION = "0.0.38";
1
+ export declare const RUNTIME_VERSION = "0.0.40";
package/dist/version.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // src/version.ts
2
- var RUNTIME_VERSION = "0.0.38";
2
+ var RUNTIME_VERSION = "0.0.40";
3
3
  export {
4
4
  RUNTIME_VERSION
5
5
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yanlinglabs/winter-agent-runtime",
3
- "version": "0.0.38",
3
+ "version": "0.0.40",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "engines": {
@@ -73,9 +73,9 @@
73
73
  "@modelcontextprotocol/client": "^2.1.0",
74
74
  "ajv": "^8.20.0",
75
75
  "ignore": "7.0.5",
76
- "@yanlinglabs/winter-agent-sdk": "0.0.38",
77
- "@yanlinglabs/winter-provider-runtime": "0.0.38",
78
- "@yanlinglabs/winter-provider-catalog": "0.0.38"
76
+ "@yanlinglabs/winter-provider-catalog": "0.0.40",
77
+ "@yanlinglabs/winter-provider-runtime": "0.0.40",
78
+ "@yanlinglabs/winter-agent-sdk": "0.0.40"
79
79
  },
80
80
  "devDependencies": {
81
81
  "@modelcontextprotocol/server": "^2.1.0"