@yaklabs-ai/plugin-sdk 0.34.0 → 0.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -13,7 +13,7 @@ it under the name your plugin code actually imports:
13
13
  ```json
14
14
  {
15
15
  "dependencies": {
16
- "@bonsai/plugin-sdk": "npm:@yaklabs-ai/plugin-sdk@^0.34.0"
16
+ "@bonsai/plugin-sdk": "npm:@yaklabs-ai/plugin-sdk@^0.35.0"
17
17
  }
18
18
  }
19
19
  ```
@@ -62,7 +62,7 @@ Every tool the entrypoint registers is declared in the manifest too:
62
62
  "description": "Greets people by name.",
63
63
  "version": "0.1.0",
64
64
  "namespace": "widgets",
65
- "compatibility": { "sdk": "^0.34.0" },
65
+ "compatibility": { "sdk": "^0.35.0" },
66
66
  "targets": {
67
67
  "kay": {
68
68
  "agent": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "package": "@yaklabs-ai/plugin-sdk",
4
- "version": "0.34.0",
4
+ "version": "0.35.0",
5
5
  "target": "npm",
6
6
  "firstPartyLicense": "MIT",
7
7
  "bundled": [
@@ -1598,11 +1598,18 @@ declare type FailureJsonValue = null | boolean | number | string | readonly Fail
1598
1598
  readonly [key: string]: FailureJsonValue;
1599
1599
  };
1600
1600
 
1601
- declare interface FailureOccurrence<C = FailureJsonValue> {
1601
+ /**
1602
+ * One failure, as every lane records it. `Code` and `Domain` default to
1603
+ * `string`; a lane that declares its codes (an `as const` list beside its
1604
+ * cause schema) passes them, so minting a record with an undeclared code
1605
+ * fails typecheck. Reading is unchanged: `failureSchema` keeps both as
1606
+ * strings, so a saved record with an unknown code still reads.
1607
+ */
1608
+ declare interface FailureOccurrence<C = FailureJsonValue, Code extends string = string, Domain extends string = string> {
1602
1609
  readonly ref: FailureRef;
1603
1610
  readonly sourceRef: FailureRef;
1604
- readonly domain: string;
1605
- readonly code: string;
1611
+ readonly domain: Domain;
1612
+ readonly code: Code;
1606
1613
  readonly context: {
1607
1614
  readonly component: string;
1608
1615
  readonly operation: string;
@@ -6833,6 +6840,17 @@ declare interface Tool<TParameters extends TSchema = TSchema> {
6833
6840
  constrainedSampling?: false | ConstrainedSamplingConfig;
6834
6841
  }
6835
6842
 
6843
+ /**
6844
+ * The closed vocabulary of tool call failure codes. The engine and the tools
6845
+ * mint only these; a returned failure with a code outside it is not a
6846
+ * classification (the engine records the rejection on an unexplained failure),
6847
+ * and a stored record with one reads as none.
6848
+ */
6849
+ declare const TOOL_CALL_FAILURE_CODES: readonly ["tool.invalid_input", "tool.blocked", "tool.cancelled", "tool.timeout", "tool.not_found", "tool.unavailable", "tool.execution_failed", "tool.auth_unavailable", "tool.replies_owed", "provider.http", "provider.api", "provider.transport", "uri.not_found", "uri.unsupported_operation", "uri.not_connected", "uri.auth_unavailable", "permission.denied", "edit.empty_edits", "edit.text_not_found", "edit.text_not_unique", "edit.empty_old_text", "edit.overlapping_edits", "edit.no_change", "uri.not_connected.pick_account", "uri.not_connected.account_not_allowed", "uri.not_connected.sign_in_expired", "tool.blocked.by_user", "tool.blocked.by_rule", "tool.blocked.by_bonsai", "tool.blocked.by_mode", "tool.blocked.protected_path", "tool.blocked.approval_not_shown", "tool.blocked.unverified", "tool.blocked.edits_not_applied"];
6850
+
6851
+ /** The `domain` of a tool call failure occurrence; it selects this lane's cause contract. */
6852
+ declare const TOOL_CALL_FAILURE_DOMAIN: "tool-call";
6853
+
6836
6854
  declare interface ToolCall {
6837
6855
  type: "toolCall";
6838
6856
  id: string;
@@ -6891,13 +6909,15 @@ declare const toolCallFailureCauseSchema: z.ZodObject<{
6891
6909
  }, z.core.$strict>>;
6892
6910
  }, z.core.$strict>;
6893
6911
 
6912
+ declare type ToolCallFailureCode = (typeof TOOL_CALL_FAILURE_CODES)[number];
6913
+
6894
6914
  /**
6895
6915
  * The failure occurrence a failed tool result carries under
6896
6916
  * `details.toolCallFailure`: the classification's code at the occurrence
6897
6917
  * level and the rest as its cause, with its own ref and the call it came out
6898
6918
  * of as its operation.
6899
6919
  */
6900
- declare type ToolCallFailureOccurrence = FailureOccurrence<ToolCallFailureCause>;
6920
+ declare type ToolCallFailureOccurrence = FailureOccurrence<ToolCallFailureCause, ToolCallFailureCode, typeof TOOL_CALL_FAILURE_DOMAIN>;
6901
6921
 
6902
6922
  /**
6903
6923
  * The minimal shape this leaf reads from a session entry: a `timestamp` and the
@@ -2380,8 +2380,13 @@ declare const KAY_PLUGIN_PROTOCOL_VERSION: "kay.plugin.v1";
2380
2380
  * 0.34.0 lets a rail entry declare a sidebar (#15901). `panel.body` on a `railEntries` entry names
2381
2381
  * what fills it, either a `contextOnly` app in the plugin or a body the host ships. Additive: a rail
2382
2382
  * entry with no `panel` still opens its page alone. A plugin that declares a panel declares ^0.34.0.
2383
+ *
2384
+ * 0.35.0 lets a rail entry declare a count badge as data (#15900). `badge` on a `railEntries` entry
2385
+ * names one of the plugin's `rows` data sources, an optional `where` and a plural `label`.
2386
+ * `app.skills` gains `listPendingSuggestions` and `subscribeSuggestions` under `skills.read`. A plugin
2387
+ * that declares a badge declares ^0.35.0.
2383
2388
  */
2384
- declare const KAY_PLUGIN_SDK_VERSION: "0.34.0";
2389
+ declare const KAY_PLUGIN_SDK_VERSION: "0.35.0";
2385
2390
 
2386
2391
  declare const KAY_PLUGIN_TARGET_NAMES: readonly ["kay.agent", "kay.app", "kay.ui"];
2387
2392
 
@@ -2434,8 +2434,13 @@ declare const KAY_PLUGIN_PROTOCOL_VERSION: "kay.plugin.v1";
2434
2434
  * 0.34.0 lets a rail entry declare a sidebar (#15901). `panel.body` on a `railEntries` entry names
2435
2435
  * what fills it, either a `contextOnly` app in the plugin or a body the host ships. Additive: a rail
2436
2436
  * entry with no `panel` still opens its page alone. A plugin that declares a panel declares ^0.34.0.
2437
+ *
2438
+ * 0.35.0 lets a rail entry declare a count badge as data (#15900). `badge` on a `railEntries` entry
2439
+ * names one of the plugin's `rows` data sources, an optional `where` and a plural `label`.
2440
+ * `app.skills` gains `listPendingSuggestions` and `subscribeSuggestions` under `skills.read`. A plugin
2441
+ * that declares a badge declares ^0.35.0.
2437
2442
  */
2438
- declare const KAY_PLUGIN_SDK_VERSION: "0.34.0";
2443
+ declare const KAY_PLUGIN_SDK_VERSION: "0.35.0";
2439
2444
 
2440
2445
  declare const KAY_PLUGIN_TARGET_NAMES: readonly ["kay.agent", "kay.app", "kay.ui"];
2441
2446
 
@@ -4756,14 +4761,14 @@ declare const ResolvedPluginContractV1: z.ZodObject<{
4756
4761
  "kay.ui": "kay.ui";
4757
4762
  }>;
4758
4763
  kind: z.ZodEnum<{
4764
+ endpoint: "endpoint";
4759
4765
  tool: "tool";
4760
4766
  resource: "resource";
4761
- endpoint: "endpoint";
4762
4767
  storage: "storage";
4763
- command: "command";
4764
4768
  uriModule: "uriModule";
4765
4769
  authService: "authService";
4766
4770
  app: "app";
4771
+ command: "command";
4767
4772
  configSection: "configSection";
4768
4773
  skill: "skill";
4769
4774
  converter: "converter";
@@ -5284,30 +5289,30 @@ declare const ResolvedPluginContractV1: z.ZodObject<{
5284
5289
  description: z.ZodString;
5285
5290
  operations: z.ZodExactOptional<z.ZodArray<z.ZodEnum<{
5286
5291
  search: "search";
5287
- delete: "delete";
5288
5292
  list: "list";
5289
5293
  read: "read";
5290
5294
  write: "write";
5291
5295
  help: "help";
5292
5296
  edit: "edit";
5297
+ delete: "delete";
5293
5298
  }>>>;
5294
5299
  operationDocs: z.ZodExactOptional<z.ZodRecord<z.ZodEnum<{
5295
5300
  search: "search";
5296
- delete: "delete";
5297
5301
  list: "list";
5298
5302
  read: "read";
5299
5303
  write: "write";
5300
5304
  help: "help";
5301
5305
  edit: "edit";
5306
+ delete: "delete";
5302
5307
  }> & z.core.$partial, z.ZodString>>;
5303
5308
  operationDefaults: z.ZodExactOptional<z.ZodRecord<z.ZodEnum<{
5304
5309
  search: "search";
5305
- delete: "delete";
5306
5310
  list: "list";
5307
5311
  read: "read";
5308
5312
  write: "write";
5309
5313
  help: "help";
5310
5314
  edit: "edit";
5315
+ delete: "delete";
5311
5316
  }> & z.core.$partial, z.ZodEnum<{
5312
5317
  never: "never";
5313
5318
  allow: "allow";
@@ -5366,12 +5371,12 @@ declare const ResolvedPluginContractV1: z.ZodObject<{
5366
5371
  action: z.ZodString;
5367
5372
  operations: z.ZodExactOptional<z.ZodArray<z.ZodEnum<{
5368
5373
  search: "search";
5369
- delete: "delete";
5370
5374
  list: "list";
5371
5375
  read: "read";
5372
5376
  write: "write";
5373
5377
  help: "help";
5374
5378
  edit: "edit";
5379
+ delete: "delete";
5375
5380
  }>>>;
5376
5381
  routes: z.ZodExactOptional<z.ZodArray<z.ZodString>>;
5377
5382
  query: z.ZodExactOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
@@ -5379,12 +5384,12 @@ declare const ResolvedPluginContractV1: z.ZodObject<{
5379
5384
  public: z.ZodLiteral<true>;
5380
5385
  operations: z.ZodExactOptional<z.ZodArray<z.ZodEnum<{
5381
5386
  search: "search";
5382
- delete: "delete";
5383
5387
  list: "list";
5384
5388
  read: "read";
5385
5389
  write: "write";
5386
5390
  help: "help";
5387
5391
  edit: "edit";
5392
+ delete: "delete";
5388
5393
  }>>>;
5389
5394
  routes: z.ZodExactOptional<z.ZodArray<z.ZodString>>;
5390
5395
  query: z.ZodExactOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
@@ -5566,9 +5571,9 @@ declare const ResolvedPluginContractV1: z.ZodObject<{
5566
5571
  localId: z.ZodString;
5567
5572
  globalId: z.ZodString;
5568
5573
  scope: z.ZodEnum<{
5569
- session: "session";
5570
5574
  runtime: "runtime";
5571
5575
  account: "account";
5576
+ session: "session";
5572
5577
  }>;
5573
5578
  snapshot: z.ZodObject<{
5574
5579
  version: z.ZodNumber;
@@ -5702,17 +5707,17 @@ declare const ResolvedPluginContractV1: z.ZodObject<{
5702
5707
  globalId: z.ZodString;
5703
5708
  }, z.core.$strict>>>;
5704
5709
  host: z.ZodOptional<z.ZodArray<z.ZodEnum<{
5710
+ "navigation.open-session": "navigation.open-session";
5705
5711
  "sessions.create": "sessions.create";
5706
- "memory.read": "memory.read";
5707
- "skills.read": "skills.read";
5708
- "automations.run": "automations.run";
5709
5712
  "artifacts.read": "artifacts.read";
5710
- "navigation.open-session": "navigation.open-session";
5711
5713
  "artifacts.preview": "artifacts.preview";
5712
5714
  "cost.read": "cost.read";
5713
5715
  "billing.read": "billing.read";
5716
+ "skills.read": "skills.read";
5717
+ "memory.read": "memory.read";
5714
5718
  "self-improvement.read": "self-improvement.read";
5715
5719
  "automations.read": "automations.read";
5720
+ "automations.run": "automations.run";
5716
5721
  "shared-artifacts.read": "shared-artifacts.read";
5717
5722
  "workspace.place-pane": "workspace.place-pane";
5718
5723
  "workspace.pane-header": "workspace.pane-header";
@@ -2709,8 +2709,13 @@ declare const KAY_PLUGIN_PROTOCOL_VERSION: "kay.plugin.v1";
2709
2709
  * 0.34.0 lets a rail entry declare a sidebar (#15901). `panel.body` on a `railEntries` entry names
2710
2710
  * what fills it, either a `contextOnly` app in the plugin or a body the host ships. Additive: a rail
2711
2711
  * entry with no `panel` still opens its page alone. A plugin that declares a panel declares ^0.34.0.
2712
+ *
2713
+ * 0.35.0 lets a rail entry declare a count badge as data (#15900). `badge` on a `railEntries` entry
2714
+ * names one of the plugin's `rows` data sources, an optional `where` and a plural `label`.
2715
+ * `app.skills` gains `listPendingSuggestions` and `subscribeSuggestions` under `skills.read`. A plugin
2716
+ * that declares a badge declares ^0.35.0.
2712
2717
  */
2713
- declare const KAY_PLUGIN_SDK_VERSION: "0.34.0";
2718
+ declare const KAY_PLUGIN_SDK_VERSION: "0.35.0";
2714
2719
 
2715
2720
  declare const KAY_PLUGIN_TARGET_NAMES: readonly ["kay.agent", "kay.app", "kay.ui"];
2716
2721
 
@@ -453,9 +453,9 @@ declare const CorpusResourceInvocationQuery: z.ZodObject<{
453
453
  }, z.core.$strict>>;
454
454
  limit: z.ZodOptional<z.ZodNumber>;
455
455
  rootCreatedByKind: z.ZodOptional<z.ZodEnum<{
456
+ agent: "agent";
456
457
  plugin: "plugin";
457
458
  human: "human";
458
- agent: "agent";
459
459
  trigger: "trigger";
460
460
  daemon: "daemon";
461
461
  }>>;
@@ -841,11 +841,18 @@ declare type FailureJsonValue = null | boolean | number | string | readonly Fail
841
841
  readonly [key: string]: FailureJsonValue;
842
842
  };
843
843
 
844
- declare interface FailureOccurrence<C = FailureJsonValue> {
844
+ /**
845
+ * One failure, as every lane records it. `Code` and `Domain` default to
846
+ * `string`; a lane that declares its codes (an `as const` list beside its
847
+ * cause schema) passes them, so minting a record with an undeclared code
848
+ * fails typecheck. Reading is unchanged: `failureSchema` keeps both as
849
+ * strings, so a saved record with an unknown code still reads.
850
+ */
851
+ declare interface FailureOccurrence<C = FailureJsonValue, Code extends string = string, Domain extends string = string> {
845
852
  readonly ref: FailureRef;
846
853
  readonly sourceRef: FailureRef;
847
- readonly domain: string;
848
- readonly code: string;
854
+ readonly domain: Domain;
855
+ readonly code: Code;
849
856
  readonly context: {
850
857
  readonly component: string;
851
858
  readonly operation: string;
package/dist/kay-app.d.ts CHANGED
@@ -795,9 +795,9 @@ export declare const CorpusResourceInvocationQuery: z.ZodObject<{
795
795
  }, z.core.$strict>>;
796
796
  limit: z.ZodOptional<z.ZodNumber>;
797
797
  rootCreatedByKind: z.ZodOptional<z.ZodEnum<{
798
+ agent: "agent";
798
799
  plugin: "plugin";
799
800
  human: "human";
800
- agent: "agent";
801
801
  trigger: "trigger";
802
802
  daemon: "daemon";
803
803
  }>>;
@@ -1501,11 +1501,18 @@ declare type FailureJsonValue = null | boolean | number | string | readonly Fail
1501
1501
  readonly [key: string]: FailureJsonValue;
1502
1502
  };
1503
1503
 
1504
- declare interface FailureOccurrence<C = FailureJsonValue> {
1504
+ /**
1505
+ * One failure, as every lane records it. `Code` and `Domain` default to
1506
+ * `string`; a lane that declares its codes (an `as const` list beside its
1507
+ * cause schema) passes them, so minting a record with an undeclared code
1508
+ * fails typecheck. Reading is unchanged: `failureSchema` keeps both as
1509
+ * strings, so a saved record with an unknown code still reads.
1510
+ */
1511
+ declare interface FailureOccurrence<C = FailureJsonValue, Code extends string = string, Domain extends string = string> {
1505
1512
  readonly ref: FailureRef;
1506
1513
  readonly sourceRef: FailureRef;
1507
- readonly domain: string;
1508
- readonly code: string;
1514
+ readonly domain: Domain;
1515
+ readonly code: Code;
1509
1516
  readonly context: {
1510
1517
  readonly component: string;
1511
1518
  readonly operation: string;
@@ -2664,8 +2671,13 @@ declare const KAY_PLUGIN_PROTOCOL_VERSION: "kay.plugin.v1";
2664
2671
  * 0.34.0 lets a rail entry declare a sidebar (#15901). `panel.body` on a `railEntries` entry names
2665
2672
  * what fills it, either a `contextOnly` app in the plugin or a body the host ships. Additive: a rail
2666
2673
  * entry with no `panel` still opens its page alone. A plugin that declares a panel declares ^0.34.0.
2674
+ *
2675
+ * 0.35.0 lets a rail entry declare a count badge as data (#15900). `badge` on a `railEntries` entry
2676
+ * names one of the plugin's `rows` data sources, an optional `where` and a plural `label`.
2677
+ * `app.skills` gains `listPendingSuggestions` and `subscribeSuggestions` under `skills.read`. A plugin
2678
+ * that declares a badge declares ^0.35.0.
2667
2679
  */
2668
- declare const KAY_PLUGIN_SDK_VERSION: "0.34.0";
2680
+ declare const KAY_PLUGIN_SDK_VERSION: "0.35.0";
2669
2681
 
2670
2682
  declare const KAY_PLUGIN_TARGET_NAMES: readonly ["kay.agent", "kay.app", "kay.ui"];
2671
2683
 
@@ -4986,6 +4998,18 @@ export declare interface KayAppPaths {
4986
4998
  readonly logsRoot?: string;
4987
4999
  }
4988
5000
 
5001
+ /** One suggested change waiting for a person's review. Ids repeat across skills, so all three identify it. */
5002
+ export declare interface KayAppPendingSkillSuggestion {
5003
+ readonly sourceId: string;
5004
+ readonly skillName: string;
5005
+ readonly suggestionId: string;
5006
+ }
5007
+
5008
+ export declare type KayAppPendingSkillSuggestionsResult = {
5009
+ readonly status: "ok";
5010
+ readonly suggestions: readonly KayAppPendingSkillSuggestion[];
5011
+ } | KayAppSkillsUnavailable;
5012
+
4989
5013
  export declare interface KayAppPermissions {
4990
5014
  /**
4991
5015
  * Register a live source of permission rows under a plugin-local id (register during
@@ -7198,6 +7222,13 @@ export declare interface KayAppSkills {
7198
7222
  list(): Promise<KayAppSkillsListResult>;
7199
7223
  /** One skill's identity, current version, and suggestions. */
7200
7224
  read(skill: KayAppSkillRef): Promise<KayAppSkillReadResult>;
7225
+ /** Every suggested change, across all skills, still waiting for a person's review. */
7226
+ listPendingSuggestions(): Promise<KayAppPendingSkillSuggestionsResult>;
7227
+ /**
7228
+ * Calls `listener` when {@link KayAppSkills.listPendingSuggestions} may answer differently, at most
7229
+ * once per burst of writes. Returns an unsubscribe.
7230
+ */
7231
+ subscribeSuggestions(listener: () => void): () => void;
7201
7232
  /** One skill's revisions, newest first, each with its version and how it came about. */
7202
7233
  history(skill: KayAppSkillRef, options?: KayAppSkillHistoryOptions): Promise<KayAppSkillHistoryResult>;
7203
7234
  /** How the skill's local copy differs from its source. */
package/dist/kay-app.js CHANGED
@@ -735,6 +735,8 @@ function createUnavailableSkills(message) {
735
735
  },
736
736
  list: async () => unavailable,
737
737
  read: async () => unavailable,
738
+ listPendingSuggestions: async () => unavailable,
739
+ subscribeSuggestions: () => () => void 0,
738
740
  history: async () => unavailable,
739
741
  diff: async () => unavailable,
740
742
  revision: async () => unavailable,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yaklabs-ai/plugin-sdk",
3
- "version": "0.34.0",
3
+ "version": "0.35.0",
4
4
  "description": "The Kay plugin SDK — types and helpers for authoring a Kay directory plugin.",
5
5
  "author": "YakLabs",
6
6
  "type": "module",