orionfold-relay 0.29.0 → 0.29.1

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/cli.js CHANGED
@@ -25941,8 +25941,8 @@ import { execFileSync as execFileSync3 } from "child_process";
25941
25941
  import yaml12 from "js-yaml";
25942
25942
  import semver from "semver";
25943
25943
  function relayCoreVersion() {
25944
- if (semver.valid("0.29.0")) {
25945
- return "0.29.0";
25944
+ if (semver.valid("0.29.1")) {
25945
+ return "0.29.1";
25946
25946
  }
25947
25947
  try {
25948
25948
  const root = getAppRoot(import.meta.dirname, 3);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "orionfold-relay",
3
- "version": "0.29.0",
3
+ "version": "0.29.1",
4
4
  "description": "Orionfold Relay — a local-first, multi-agent orchestration runtime and builder scaffold for AI-native work.",
5
5
  "keywords": [
6
6
  "ai",
@@ -113,6 +113,33 @@ export function RunnableBlueprintCard({
113
113
  runCount30d,
114
114
  }: RunnableBlueprintCardProps) {
115
115
  const isRowInsert = card.trigger?.kind === "row-insert";
116
+
117
+ // #31: an unresolved card is a husk — the registry had no definition for this
118
+ // blueprint id, so `name` is the raw id and a Run button would fail downstream
119
+ // at /instantiate. Surface the failure honestly (principle #1) rather than
120
+ // rendering a fake action. `=== false` so a legacy card lacking the flag still
121
+ // renders normally.
122
+ if (card.resolved === false) {
123
+ return (
124
+ <Card className="surface-card border-destructive/30">
125
+ <CardHeader className="pb-2 space-y-1.5">
126
+ <CardTitle className="text-sm font-medium text-muted-foreground">
127
+ {card.name}
128
+ </CardTitle>
129
+ </CardHeader>
130
+ <CardContent>
131
+ <p className="flex items-start gap-1.5 text-xs text-muted-foreground">
132
+ <AlertCircle className="h-3.5 w-3.5 shrink-0 mt-px text-destructive" />
133
+ <span>
134
+ This workflow couldn&apos;t load. Its definition wasn&apos;t
135
+ found. Reinstall the pack to restore it.
136
+ </span>
137
+ </p>
138
+ </CardContent>
139
+ </Card>
140
+ );
141
+ }
142
+
116
143
  return (
117
144
  <Card
118
145
  className={
@@ -682,6 +682,10 @@ async function loadBlueprintCards(
682
682
  variables: def?.variables ?? [],
683
683
  trigger,
684
684
  isPrimary: stub.id === primaryBlueprintId,
685
+ // #31: a definition-less card is a husk (raw id, no variables). Flag it so
686
+ // the card renders an explicit "couldn't load" state instead of a fake Run
687
+ // button that would fail downstream at /instantiate (principle #1).
688
+ resolved: def != null,
685
689
  };
686
690
  });
687
691
  }
@@ -160,6 +160,15 @@ export interface BlueprintCard {
160
160
  trigger: { kind: "row-insert"; table: string; tableName: string } | null;
161
161
  /** The recommended first workflow, rendered with a "Start here" flag. */
162
162
  isPrimary: boolean;
163
+ /**
164
+ * Whether the blueprint DEFINITION was resolved from the registry at
165
+ * enrichment time. `false` = the registry had no definition for this id (the
166
+ * files never reached the scanned dir, or the registry import failed), so
167
+ * `name` fell back to the raw id and there are no `variables`/`description`.
168
+ * The card renders an explicit "couldn't load" state instead of a fake Run
169
+ * button that would fail downstream at /instantiate (#31, principle #1).
170
+ */
171
+ resolved: boolean;
163
172
  }
164
173
 
165
174
  /** Phase 2: minimal task summary used by Workflow Hub's secondary + activity. */