kradle 0.6.12 → 0.6.14

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
@@ -411,6 +411,8 @@ List all agents registered in the system with their model and pricing informatio
411
411
  kradle agent list
412
412
  ```
413
413
 
414
+ Agents whose model is no longer listed on OpenRouter are considered unavailable and hidden from the table.
415
+
414
416
  ## AI Docs Commands
415
417
 
416
418
  Output LLM-focused documentation to stdout, or sync local AI docs with the latest version from the CLI.
@@ -57,8 +57,16 @@ export default class List extends Command {
57
57
  this.log(pc.blue(">> Loading agents..."));
58
58
  const [agents, pricing] = await Promise.all([api.listKradleAgents(), fetchOpenRouterPricing()]);
59
59
  agents.sort((a, b) => a.username?.localeCompare(b.username || "") || 0);
60
+ // Drop agents whose model is no longer listed on OpenRouter. Skip filtering if the
61
+ // pricing fetch failed (empty map) so a transient outage doesn't hide everything.
62
+ const visibleAgents = pricing.size === 0
63
+ ? agents
64
+ : agents.filter((agent) => {
65
+ const model = agent.agentConfig && "model" in agent.agentConfig ? agent.agentConfig.model : "";
66
+ return !model || pricing.has(model);
67
+ });
60
68
  // Calculate column widths
61
- const rows = agents.map((agent) => {
69
+ const rows = visibleAgents.map((agent) => {
62
70
  const username = agent.username || "";
63
71
  const model = agent.agentConfig && "model" in agent.agentConfig ? agent.agentConfig.model : "";
64
72
  const costs = model ? pricing.get(model) : undefined;
@@ -72,7 +80,7 @@ export default class List extends Command {
72
80
  const modelWidth = Math.max("Model".length, ...rows.map((r) => r.model.length));
73
81
  const inputWidth = Math.max("Input/MTok".length, ...rows.map((r) => r.inputRaw.length));
74
82
  const outputWidth = Math.max("Output/MTok".length, ...rows.map((r) => r.outputRaw.length));
75
- this.log(pc.bold(`\nFound ${agents.length} agents:\n`));
83
+ this.log(pc.bold(`\nFound ${visibleAgents.length} agents:\n`));
76
84
  // Header
77
85
  const header = ` ${pc.bold("Agent".padEnd(nameWidth))} ${pc.bold("Model".padEnd(modelWidth))} ${pc.bold("Input/MTok".padEnd(inputWidth))} ${pc.bold("Output/MTok".padEnd(outputWidth))}`;
78
86
  this.log(header);
@@ -1543,5 +1543,5 @@
1543
1543
  ]
1544
1544
  }
1545
1545
  },
1546
- "version": "0.6.12"
1546
+ "version": "0.6.14"
1547
1547
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kradle",
3
- "version": "0.6.12",
3
+ "version": "0.6.14",
4
4
  "description": "Kradle's CLI. Manage challenges, experiments, agents and more!",
5
5
  "keywords": [
6
6
  "cli"
@@ -1137,10 +1137,12 @@ export const config = {
1137
1137
 
1138
1138
  ### `kradle agent list`
1139
1139
 
1140
- Lists all agents registered in the Kradle system with their model and pricing information.
1140
+ Lists agents registered in the Kradle system with their model and pricing information.
1141
1141
 
1142
1142
  Pricing (input/output cost per million tokens) is fetched from the OpenRouter API. Models without pricing data show `-`.
1143
1143
 
1144
+ Agents whose model is no longer listed on OpenRouter (deprecated/unavailable) are hidden from the table. If the OpenRouter pricing fetch fails entirely, this filtering is skipped so the command still shows the full list during transient outages.
1145
+
1144
1146
  **Usage:**
1145
1147
  ```bash
1146
1148
  kradle agent list
@@ -1148,7 +1150,7 @@ kradle agent list
1148
1150
 
1149
1151
  **Output format:**
1150
1152
  ```
1151
- Found 451 agents:
1153
+ Found 430 agents:
1152
1154
 
1153
1155
  Agent Model Input/MTok Output/MTok
1154
1156
  ───────────────────────────── ─────────────────────────── ────────── ───────────
@@ -45,6 +45,18 @@ Gather requirements by asking these questions. Save answers in a markdown summar
45
45
 
46
46
  **Important**: roles should just be alphanumeric, no hypen no underscore
47
47
 
48
+ **Targeting a role in Actions:** Roles are implemented as player **tags**, not Minecraft scoreboard teams. To target all players of a role, pass the role name as a string to any Action's `target`:
49
+
50
+ ```typescript
51
+ // Teleport all "red" role players to (15, 0, -60)
52
+ Actions.teleport({ target: "red", x: 15, y: 0, z: -60, absolute: true });
53
+
54
+ // Give items to "blue" role players
55
+ Actions.give({ target: "blue", item: "minecraft:iron_sword", count: 1 });
56
+ ```
57
+
58
+ Under the hood this resolves to `@a[tag=<role>]`. If you need a raw selector, use `Selector("@a", { tag: "red" })` — **not** `{ team: "red" }` (no scoreboard team of that name exists).
59
+
48
60
  ### Things to consider when building a challenge:
49
61
 
50
62
  - Agents don't "see" the world with images, they get JSON observations about the world, so if you want them to take a specific path, you need to put a marker and tell the agent to follow that marker. The agent will use A* algorithm to go to the marker.