@otto-code/protocol 0.8.2 → 0.8.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/messages.js CHANGED
@@ -1544,6 +1544,21 @@ export const BrainCapabilitiesSchema = z
1544
1544
  load: z.boolean().default(false),
1545
1545
  resources: z.boolean().default(false),
1546
1546
  inventory: z.boolean().default(false),
1547
+ /**
1548
+ * GET /__host/events: a live SSE stream of complete status snapshots.
1549
+ *
1550
+ * The daemon reads this before deciding how to watch the brain. False (the
1551
+ * default, and what every brain built before the stream reports) keeps the
1552
+ * daemon on the ordinary status poll, which is why nothing else about the
1553
+ * management API had to change for pushed status to ship.
1554
+ */
1555
+ events: z.boolean().default(false),
1556
+ /**
1557
+ * Status events include bounded live inference stages, token counts and
1558
+ * throughput. False for the first event-stream generation, whose snapshots
1559
+ * only moved at phase boundaries.
1560
+ */
1561
+ liveInference: z.boolean().default(false),
1547
1562
  /** Whether writes are permitted right now (the brain's allowRemoteConfig). */
1548
1563
  writable: z.boolean().default(false),
1549
1564
  })
@@ -1556,6 +1571,14 @@ export const BrainHostStatusSchema = z
1556
1571
  running: z.boolean(),
1557
1572
  pid: z.number().nullable().optional(),
1558
1573
  version: z.string().nullable().optional(),
1574
+ /**
1575
+ * Which generation of the brain's management contract the far side speaks.
1576
+ *
1577
+ * Additive and separate from `version`, which is the package build. A daemon
1578
+ * reads this plus `capabilities` instead of pinning an exact brain version;
1579
+ * absent means a brain from before the field existed.
1580
+ */
1581
+ apiVersion: z.number().nullable().optional(),
1559
1582
  host: z.string().nullable().optional(),
1560
1583
  port: z.number().nullable().optional(),
1561
1584
  displayHost: z.string().nullable().optional(),
@@ -1577,7 +1600,7 @@ export const BrainHostStatusSchema = z
1577
1600
  * configuration. Null from a brain that predates the management API.
1578
1601
  */
1579
1602
  capabilities: BrainCapabilitiesSchema.nullable().optional(),
1580
- /** Live CPU/RAM/GPU/slot telemetry, only when the request asked for it. */
1603
+ /** Live CPU/RAM/GPU telemetry, only when the request asked for it. */
1581
1604
  resources: z.record(z.string(), z.unknown()).nullable().optional(),
1582
1605
  /** How many log lines the brain currently holds, for the Logs tab. */
1583
1606
  logLineCount: z.number().nullable().optional(),
@@ -1607,6 +1630,20 @@ export const BrainHostStatusSchema = z
1607
1630
  * because it is one boolean the router already knows.
1608
1631
  */
1609
1632
  reasoning: z.boolean().nullable().optional(),
1633
+ /**
1634
+ * Exact aggregate lifecycle counts for requests currently dispatched to
1635
+ * llama-server. Additive in host API v2; absent on older brains.
1636
+ */
1637
+ inference: z
1638
+ .object({
1639
+ activeRequests: z.number().int().nonnegative().optional(),
1640
+ processing: z.number().int().nonnegative().optional(),
1641
+ thinking: z.number().int().nonnegative().optional(),
1642
+ generating: z.number().int().nonnegative().optional(),
1643
+ })
1644
+ .passthrough()
1645
+ .nullable()
1646
+ .optional(),
1610
1647
  /**
1611
1648
  * Slot occupancy split by phase, so a client can tell a prompt being
1612
1649
  * ingested from a model that has started answering. Rides here rather than
@@ -1620,6 +1657,19 @@ export const BrainHostStatusSchema = z
1620
1657
  idle: z.number().nullable().optional(),
1621
1658
  prefill: z.number().nullable().optional(),
1622
1659
  decode: z.number().nullable().optional(),
1660
+ /** Bounded-rate per-slot performance samples; host API v2 and newer. */
1661
+ threads: z
1662
+ .array(z
1663
+ .object({
1664
+ slot: z.number().optional(),
1665
+ phase: z.enum(["prefill", "decode"]).optional(),
1666
+ promptTokens: z.number().nullable().optional(),
1667
+ generatedTokens: z.number().nullable().optional(),
1668
+ promptTokensPerSecond: z.number().nullable().optional(),
1669
+ tokensPerSecond: z.number().nullable().optional(),
1670
+ })
1671
+ .passthrough())
1672
+ .optional(),
1623
1673
  })
1624
1674
  .passthrough()
1625
1675
  .nullable()
@@ -1638,9 +1688,9 @@ const BrainHostStatusResultSchema = z.object({
1638
1688
  export const BrainHostStatusRequestSchema = z.object({
1639
1689
  type: z.literal("brain.host.status.request"),
1640
1690
  /**
1641
- * Ask for live CPU/RAM/GPU/slot telemetry alongside the status. Off by default
1642
- * on purpose: it costs an `nvidia-smi` spawn plus a /slots round trip on the
1643
- * brain, and this RPC is also the liveness poll. Only a surface actually
1691
+ * Ask for live CPU/RAM/GPU telemetry alongside the status. Off by default on
1692
+ * purpose: it costs an `nvidia-smi` spawn on the brain, and this RPC is also
1693
+ * the liveness poll. Only a surface actually
1644
1694
  * rendering the numbers should turn it on.
1645
1695
  */
1646
1696
  resources: z.boolean().default(false),
@@ -6375,6 +6425,14 @@ export const ServerInfoStatusPayloadSchema = z
6375
6425
  // brain version independently.
6376
6426
  // COMPAT(brainConsole): added in v0.7.7, drop the gate when daemon floor >= v0.7.7.
6377
6427
  brainConsole: z.boolean().optional(),
6428
+ // COMPAT(brainStatusPush): added in v0.8.3, drop the gate when daemon
6429
+ // floor >= v0.8.3. The daemon subscribes to the brain's own SSE status
6430
+ // stream and broadcasts `brain_status_changed`. Unlike the flags above
6431
+ // this is not a fixed daemon capability: it is true only while the
6432
+ // SELECTED brain also advertises `capabilities.events`, and the daemon
6433
+ // re-broadcasts server_info when that changes. A client that sees it
6434
+ // false keeps the explicit status poll.
6435
+ brainStatusPush: z.boolean().optional(),
6378
6436
  // COMPAT(agentForkContext): added in v0.1.102, remove gate after 2026-12-28.
6379
6437
  agentForkContext: z.boolean().optional(),
6380
6438
  // COMPAT(providerRemove): added in v0.1.105, drop the gate when daemon floor >= v0.1.105.
@@ -6840,7 +6898,27 @@ export const LspDiagnosticsChangedStatusPayloadSchema = z
6840
6898
  diagnostics: z.array(CodeDiagnosticSchema),
6841
6899
  })
6842
6900
  .passthrough();
6901
+ /**
6902
+ * The brain's own state, pushed the moment it changes.
6903
+ *
6904
+ * A complete cheap `BrainHostStatus` snapshot, never a delta - which is what
6905
+ * makes a missed message and a reconnect the same, idempotent, recovery. It
6906
+ * excludes `resources`, whose collection spawns `nvidia-smi` on the brain host
6907
+ * and stays an opt-in pull for the Overview tab.
6908
+ *
6909
+ * Scoped by the daemon connection that delivers it: the client writes it under
6910
+ * that runtime's `serverId`, so two connected hosts cannot overwrite each
6911
+ * other's brain state. Gated by `server_info.features.brainStatusPush`, which
6912
+ * is true only when both the daemon and the brain it reaches support the stream.
6913
+ */
6914
+ export const BrainStatusChangedStatusPayloadSchema = z
6915
+ .object({
6916
+ status: z.literal("brain_status_changed"),
6917
+ brain: BrainHostStatusSchema,
6918
+ })
6919
+ .passthrough();
6843
6920
  export const KnownStatusPayloadSchema = z.discriminatedUnion("status", [
6921
+ BrainStatusChangedStatusPayloadSchema,
6844
6922
  LspActivityChangedStatusPayloadSchema,
6845
6923
  LspDiagnosticsChangedStatusPayloadSchema,
6846
6924
  AgentCreatedStatusPayloadSchema,
@@ -8320,13 +8398,9 @@ export const CheckoutPrStatusSchema = z.object({
8320
8398
  // Provider-neutral per-PR hosting facts. Absent from old daemons; for
8321
8399
  // GitHub projects both this and the legacy `github` field are populated.
8322
8400
  //
8323
- // NOT a shim, and deliberately untagged: this does not collapse into `forge`.
8324
- // Otto registers every hosting provider into the forge registry under the
8325
- // forge id `github`, which is the provider-routing facade rather than the gh
8326
- // CLI (bootstrap.ts, `createGitHostingResolver`). So `forge` reads "github"
8327
- // for a Bitbucket workspace and only `hosting.provider` carries the truth.
8328
- // The two disagree by design; a reader wanting the real provider must use
8329
- // this field.
8401
+ // NOT a shim, and deliberately untagged: this carries provider capabilities
8402
+ // alongside the Forge identity. They match for built-in hosts today, but the
8403
+ // provider remains the source of truth for hosting-specific capabilities.
8330
8404
  hosting: z
8331
8405
  .object({
8332
8406
  provider: GitHostingProviderIdWireSchema,
@@ -8352,9 +8426,8 @@ const CheckoutPrStatusPayloadSchema = z.object({
8352
8426
  githubFeaturesEnabled: z.boolean(),
8353
8427
  // Provider-neutral enablement. Present even when status is null so clients
8354
8428
  // can drive search/create-PR affordances for the workspace's provider.
8355
- // Permanent for the same reason as the `hosting` block on the PR status
8356
- // schema above: `forge` is a routing-facade id and cannot answer "which
8357
- // provider is this really".
8429
+ // Permanent so provider-specific capability decisions do not need to infer
8430
+ // behavior from the Forge presentation identity.
8358
8431
  hosting: z
8359
8432
  .object({
8360
8433
  provider: GitHostingProviderIdWireSchema,
@@ -6488,6 +6488,7 @@ export declare const WSOutboundMessageSchema: {
6488
6488
  running: import("zod").ZodBoolean;
6489
6489
  pid: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6490
6490
  version: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
6491
+ apiVersion: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6491
6492
  host: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
6492
6493
  port: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6493
6494
  displayHost: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
@@ -6510,6 +6511,8 @@ export declare const WSOutboundMessageSchema: {
6510
6511
  load: import("zod").ZodDefault<import("zod").ZodBoolean>;
6511
6512
  resources: import("zod").ZodDefault<import("zod").ZodBoolean>;
6512
6513
  inventory: import("zod").ZodDefault<import("zod").ZodBoolean>;
6514
+ events: import("zod").ZodDefault<import("zod").ZodBoolean>;
6515
+ liveInference: import("zod").ZodDefault<import("zod").ZodBoolean>;
6513
6516
  writable: import("zod").ZodDefault<import("zod").ZodBoolean>;
6514
6517
  }, import("zod/v4/core").$loose>>>;
6515
6518
  resources: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>>>;
@@ -6521,12 +6524,29 @@ export declare const WSOutboundMessageSchema: {
6521
6524
  startedAt: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
6522
6525
  }, import("zod/v4/core").$loose>>>;
6523
6526
  reasoning: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodBoolean>>;
6527
+ inference: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodObject<{
6528
+ activeRequests: import("zod").ZodOptional<import("zod").ZodNumber>;
6529
+ processing: import("zod").ZodOptional<import("zod").ZodNumber>;
6530
+ thinking: import("zod").ZodOptional<import("zod").ZodNumber>;
6531
+ generating: import("zod").ZodOptional<import("zod").ZodNumber>;
6532
+ }, import("zod/v4/core").$loose>>>;
6524
6533
  slots: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodObject<{
6525
6534
  total: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6526
6535
  busy: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6527
6536
  idle: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6528
6537
  prefill: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6529
6538
  decode: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6539
+ threads: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
6540
+ slot: import("zod").ZodOptional<import("zod").ZodNumber>;
6541
+ phase: import("zod").ZodOptional<import("zod").ZodEnum<{
6542
+ prefill: "prefill";
6543
+ decode: "decode";
6544
+ }>>;
6545
+ promptTokens: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6546
+ generatedTokens: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6547
+ promptTokensPerSecond: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6548
+ tokensPerSecond: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6549
+ }, import("zod/v4/core").$loose>>>;
6530
6550
  }, import("zod/v4/core").$loose>>>;
6531
6551
  queued: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6532
6552
  reachable: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodBoolean>>;
@@ -6541,6 +6561,7 @@ export declare const WSOutboundMessageSchema: {
6541
6561
  running: import("zod").ZodBoolean;
6542
6562
  pid: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6543
6563
  version: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
6564
+ apiVersion: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6544
6565
  host: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
6545
6566
  port: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6546
6567
  displayHost: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
@@ -6563,6 +6584,8 @@ export declare const WSOutboundMessageSchema: {
6563
6584
  load: import("zod").ZodDefault<import("zod").ZodBoolean>;
6564
6585
  resources: import("zod").ZodDefault<import("zod").ZodBoolean>;
6565
6586
  inventory: import("zod").ZodDefault<import("zod").ZodBoolean>;
6587
+ events: import("zod").ZodDefault<import("zod").ZodBoolean>;
6588
+ liveInference: import("zod").ZodDefault<import("zod").ZodBoolean>;
6566
6589
  writable: import("zod").ZodDefault<import("zod").ZodBoolean>;
6567
6590
  }, import("zod/v4/core").$loose>>>;
6568
6591
  resources: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>>>;
@@ -6574,12 +6597,29 @@ export declare const WSOutboundMessageSchema: {
6574
6597
  startedAt: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
6575
6598
  }, import("zod/v4/core").$loose>>>;
6576
6599
  reasoning: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodBoolean>>;
6600
+ inference: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodObject<{
6601
+ activeRequests: import("zod").ZodOptional<import("zod").ZodNumber>;
6602
+ processing: import("zod").ZodOptional<import("zod").ZodNumber>;
6603
+ thinking: import("zod").ZodOptional<import("zod").ZodNumber>;
6604
+ generating: import("zod").ZodOptional<import("zod").ZodNumber>;
6605
+ }, import("zod/v4/core").$loose>>>;
6577
6606
  slots: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodObject<{
6578
6607
  total: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6579
6608
  busy: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6580
6609
  idle: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6581
6610
  prefill: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6582
6611
  decode: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6612
+ threads: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
6613
+ slot: import("zod").ZodOptional<import("zod").ZodNumber>;
6614
+ phase: import("zod").ZodOptional<import("zod").ZodEnum<{
6615
+ prefill: "prefill";
6616
+ decode: "decode";
6617
+ }>>;
6618
+ promptTokens: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6619
+ generatedTokens: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6620
+ promptTokensPerSecond: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6621
+ tokensPerSecond: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6622
+ }, import("zod/v4/core").$loose>>>;
6583
6623
  }, import("zod/v4/core").$loose>>>;
6584
6624
  queued: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6585
6625
  reachable: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodBoolean>>;
@@ -6594,6 +6634,7 @@ export declare const WSOutboundMessageSchema: {
6594
6634
  running: import("zod").ZodBoolean;
6595
6635
  pid: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6596
6636
  version: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
6637
+ apiVersion: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6597
6638
  host: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
6598
6639
  port: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6599
6640
  displayHost: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
@@ -6616,6 +6657,8 @@ export declare const WSOutboundMessageSchema: {
6616
6657
  load: import("zod").ZodDefault<import("zod").ZodBoolean>;
6617
6658
  resources: import("zod").ZodDefault<import("zod").ZodBoolean>;
6618
6659
  inventory: import("zod").ZodDefault<import("zod").ZodBoolean>;
6660
+ events: import("zod").ZodDefault<import("zod").ZodBoolean>;
6661
+ liveInference: import("zod").ZodDefault<import("zod").ZodBoolean>;
6619
6662
  writable: import("zod").ZodDefault<import("zod").ZodBoolean>;
6620
6663
  }, import("zod/v4/core").$loose>>>;
6621
6664
  resources: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>>>;
@@ -6627,12 +6670,29 @@ export declare const WSOutboundMessageSchema: {
6627
6670
  startedAt: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
6628
6671
  }, import("zod/v4/core").$loose>>>;
6629
6672
  reasoning: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodBoolean>>;
6673
+ inference: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodObject<{
6674
+ activeRequests: import("zod").ZodOptional<import("zod").ZodNumber>;
6675
+ processing: import("zod").ZodOptional<import("zod").ZodNumber>;
6676
+ thinking: import("zod").ZodOptional<import("zod").ZodNumber>;
6677
+ generating: import("zod").ZodOptional<import("zod").ZodNumber>;
6678
+ }, import("zod/v4/core").$loose>>>;
6630
6679
  slots: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodObject<{
6631
6680
  total: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6632
6681
  busy: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6633
6682
  idle: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6634
6683
  prefill: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6635
6684
  decode: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6685
+ threads: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
6686
+ slot: import("zod").ZodOptional<import("zod").ZodNumber>;
6687
+ phase: import("zod").ZodOptional<import("zod").ZodEnum<{
6688
+ prefill: "prefill";
6689
+ decode: "decode";
6690
+ }>>;
6691
+ promptTokens: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6692
+ generatedTokens: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6693
+ promptTokensPerSecond: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6694
+ tokensPerSecond: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6695
+ }, import("zod/v4/core").$loose>>>;
6636
6696
  }, import("zod/v4/core").$loose>>>;
6637
6697
  queued: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6638
6698
  reachable: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodBoolean>>;
@@ -6647,6 +6707,7 @@ export declare const WSOutboundMessageSchema: {
6647
6707
  running: import("zod").ZodBoolean;
6648
6708
  pid: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6649
6709
  version: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
6710
+ apiVersion: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6650
6711
  host: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
6651
6712
  port: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6652
6713
  displayHost: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
@@ -6669,6 +6730,8 @@ export declare const WSOutboundMessageSchema: {
6669
6730
  load: import("zod").ZodDefault<import("zod").ZodBoolean>;
6670
6731
  resources: import("zod").ZodDefault<import("zod").ZodBoolean>;
6671
6732
  inventory: import("zod").ZodDefault<import("zod").ZodBoolean>;
6733
+ events: import("zod").ZodDefault<import("zod").ZodBoolean>;
6734
+ liveInference: import("zod").ZodDefault<import("zod").ZodBoolean>;
6672
6735
  writable: import("zod").ZodDefault<import("zod").ZodBoolean>;
6673
6736
  }, import("zod/v4/core").$loose>>>;
6674
6737
  resources: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>>>;
@@ -6680,12 +6743,29 @@ export declare const WSOutboundMessageSchema: {
6680
6743
  startedAt: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
6681
6744
  }, import("zod/v4/core").$loose>>>;
6682
6745
  reasoning: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodBoolean>>;
6746
+ inference: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodObject<{
6747
+ activeRequests: import("zod").ZodOptional<import("zod").ZodNumber>;
6748
+ processing: import("zod").ZodOptional<import("zod").ZodNumber>;
6749
+ thinking: import("zod").ZodOptional<import("zod").ZodNumber>;
6750
+ generating: import("zod").ZodOptional<import("zod").ZodNumber>;
6751
+ }, import("zod/v4/core").$loose>>>;
6683
6752
  slots: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodObject<{
6684
6753
  total: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6685
6754
  busy: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6686
6755
  idle: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6687
6756
  prefill: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6688
6757
  decode: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6758
+ threads: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
6759
+ slot: import("zod").ZodOptional<import("zod").ZodNumber>;
6760
+ phase: import("zod").ZodOptional<import("zod").ZodEnum<{
6761
+ prefill: "prefill";
6762
+ decode: "decode";
6763
+ }>>;
6764
+ promptTokens: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6765
+ generatedTokens: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6766
+ promptTokensPerSecond: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6767
+ tokensPerSecond: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6768
+ }, import("zod/v4/core").$loose>>>;
6689
6769
  }, import("zod/v4/core").$loose>>>;
6690
6770
  queued: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
6691
6771
  reachable: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodBoolean>>;
@@ -7273,6 +7353,7 @@ export declare const WSOutboundMessageSchema: {
7273
7353
  running: import("zod").ZodBoolean;
7274
7354
  pid: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
7275
7355
  version: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
7356
+ apiVersion: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
7276
7357
  host: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
7277
7358
  port: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
7278
7359
  displayHost: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
@@ -7295,6 +7376,8 @@ export declare const WSOutboundMessageSchema: {
7295
7376
  load: import("zod").ZodDefault<import("zod").ZodBoolean>;
7296
7377
  resources: import("zod").ZodDefault<import("zod").ZodBoolean>;
7297
7378
  inventory: import("zod").ZodDefault<import("zod").ZodBoolean>;
7379
+ events: import("zod").ZodDefault<import("zod").ZodBoolean>;
7380
+ liveInference: import("zod").ZodDefault<import("zod").ZodBoolean>;
7298
7381
  writable: import("zod").ZodDefault<import("zod").ZodBoolean>;
7299
7382
  }, import("zod/v4/core").$loose>>>;
7300
7383
  resources: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>>>;
@@ -7306,12 +7389,29 @@ export declare const WSOutboundMessageSchema: {
7306
7389
  startedAt: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
7307
7390
  }, import("zod/v4/core").$loose>>>;
7308
7391
  reasoning: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodBoolean>>;
7392
+ inference: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodObject<{
7393
+ activeRequests: import("zod").ZodOptional<import("zod").ZodNumber>;
7394
+ processing: import("zod").ZodOptional<import("zod").ZodNumber>;
7395
+ thinking: import("zod").ZodOptional<import("zod").ZodNumber>;
7396
+ generating: import("zod").ZodOptional<import("zod").ZodNumber>;
7397
+ }, import("zod/v4/core").$loose>>>;
7309
7398
  slots: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodObject<{
7310
7399
  total: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
7311
7400
  busy: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
7312
7401
  idle: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
7313
7402
  prefill: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
7314
7403
  decode: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
7404
+ threads: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
7405
+ slot: import("zod").ZodOptional<import("zod").ZodNumber>;
7406
+ phase: import("zod").ZodOptional<import("zod").ZodEnum<{
7407
+ prefill: "prefill";
7408
+ decode: "decode";
7409
+ }>>;
7410
+ promptTokens: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
7411
+ generatedTokens: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
7412
+ promptTokensPerSecond: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
7413
+ tokensPerSecond: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
7414
+ }, import("zod/v4/core").$loose>>>;
7315
7415
  }, import("zod/v4/core").$loose>>>;
7316
7416
  queued: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
7317
7417
  reachable: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodBoolean>>;
@@ -7336,6 +7436,7 @@ export declare const WSOutboundMessageSchema: {
7336
7436
  running: import("zod").ZodBoolean;
7337
7437
  pid: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
7338
7438
  version: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
7439
+ apiVersion: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
7339
7440
  host: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
7340
7441
  port: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
7341
7442
  displayHost: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
@@ -7358,6 +7459,8 @@ export declare const WSOutboundMessageSchema: {
7358
7459
  load: import("zod").ZodDefault<import("zod").ZodBoolean>;
7359
7460
  resources: import("zod").ZodDefault<import("zod").ZodBoolean>;
7360
7461
  inventory: import("zod").ZodDefault<import("zod").ZodBoolean>;
7462
+ events: import("zod").ZodDefault<import("zod").ZodBoolean>;
7463
+ liveInference: import("zod").ZodDefault<import("zod").ZodBoolean>;
7361
7464
  writable: import("zod").ZodDefault<import("zod").ZodBoolean>;
7362
7465
  }, import("zod/v4/core").$loose>>>;
7363
7466
  resources: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>>>;
@@ -7369,12 +7472,29 @@ export declare const WSOutboundMessageSchema: {
7369
7472
  startedAt: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
7370
7473
  }, import("zod/v4/core").$loose>>>;
7371
7474
  reasoning: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodBoolean>>;
7475
+ inference: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodObject<{
7476
+ activeRequests: import("zod").ZodOptional<import("zod").ZodNumber>;
7477
+ processing: import("zod").ZodOptional<import("zod").ZodNumber>;
7478
+ thinking: import("zod").ZodOptional<import("zod").ZodNumber>;
7479
+ generating: import("zod").ZodOptional<import("zod").ZodNumber>;
7480
+ }, import("zod/v4/core").$loose>>>;
7372
7481
  slots: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodObject<{
7373
7482
  total: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
7374
7483
  busy: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
7375
7484
  idle: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
7376
7485
  prefill: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
7377
7486
  decode: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
7487
+ threads: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
7488
+ slot: import("zod").ZodOptional<import("zod").ZodNumber>;
7489
+ phase: import("zod").ZodOptional<import("zod").ZodEnum<{
7490
+ prefill: "prefill";
7491
+ decode: "decode";
7492
+ }>>;
7493
+ promptTokens: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
7494
+ generatedTokens: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
7495
+ promptTokensPerSecond: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
7496
+ tokensPerSecond: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
7497
+ }, import("zod/v4/core").$loose>>>;
7378
7498
  }, import("zod/v4/core").$loose>>>;
7379
7499
  queued: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
7380
7500
  reachable: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodBoolean>>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@otto-code/protocol",
3
- "version": "0.8.2",
3
+ "version": "0.8.4",
4
4
  "description": "Otto shared protocol schemas and wire types",
5
5
  "license": "AGPL-3.0-or-later",
6
6
  "files": [
@@ -37,7 +37,7 @@
37
37
  "devDependencies": {
38
38
  "@types/node": "^20.9.0",
39
39
  "typescript": "^5.2.2",
40
- "vitest": "^4.1.6",
40
+ "vitest": "^4.1.10",
41
41
  "zod-aot": "0.20.4"
42
42
  }
43
43
  }