struere 0.7.4 → 0.8.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.
@@ -19399,6 +19399,9 @@ function getApiKey() {
19399
19399
 
19400
19400
  // src/cli/utils/convex.ts
19401
19401
  var CONVEX_URL = process.env.STRUERE_CONVEX_URL || "https://rapid-wildebeest-172.convex.cloud";
19402
+ function getSiteUrl() {
19403
+ return CONVEX_URL.replace(".cloud", ".site");
19404
+ }
19402
19405
  async function listMyOrganizations(token) {
19403
19406
  const response = await fetch(`${CONVEX_URL}/api/query`, {
19404
19407
  method: "POST",
@@ -19469,9 +19472,51 @@ async function getUserInfo(token) {
19469
19472
  }
19470
19473
  };
19471
19474
  }
19475
+ async function syncViaHttp(apiKey, payload) {
19476
+ const siteUrl = getSiteUrl();
19477
+ let response;
19478
+ try {
19479
+ response = await fetch(`${siteUrl}/v1/sync`, {
19480
+ method: "POST",
19481
+ headers: {
19482
+ "Content-Type": "application/json",
19483
+ Authorization: `Bearer ${apiKey}`
19484
+ },
19485
+ body: JSON.stringify({
19486
+ agents: payload.agents,
19487
+ entityTypes: payload.entityTypes,
19488
+ roles: payload.roles,
19489
+ evalSuites: payload.evalSuites,
19490
+ triggers: payload.triggers,
19491
+ fixtures: payload.fixtures
19492
+ }),
19493
+ signal: AbortSignal.timeout(30000)
19494
+ });
19495
+ } catch (err) {
19496
+ if (err instanceof DOMException && err.name === "TimeoutError") {
19497
+ return { success: false, error: "Sync request timed out after 30s" };
19498
+ }
19499
+ return { success: false, error: `Network error: ${err instanceof Error ? err.message : String(err)}` };
19500
+ }
19501
+ const text = await response.text();
19502
+ let json;
19503
+ try {
19504
+ json = JSON.parse(text);
19505
+ } catch {
19506
+ return { success: false, error: text || `HTTP ${response.status}` };
19507
+ }
19508
+ if (!response.ok) {
19509
+ const msg = json.error || text;
19510
+ return { success: false, error: msg };
19511
+ }
19512
+ return json;
19513
+ }
19472
19514
  async function syncOrganization(payload) {
19473
19515
  const credentials = loadCredentials();
19474
19516
  const apiKey = getApiKey();
19517
+ if (apiKey && !credentials?.token) {
19518
+ return syncViaHttp(apiKey, payload);
19519
+ }
19475
19520
  const token = apiKey || credentials?.token;
19476
19521
  if (!token) {
19477
19522
  return { success: false, error: "Not authenticated" };
@@ -19511,13 +19556,34 @@ async function syncOrganization(payload) {
19511
19556
  return json.value;
19512
19557
  }
19513
19558
  if (json.status === "error") {
19514
- return { success: false, error: json.errorMessage || "Unknown error from Convex" };
19559
+ return { success: false, error: json.errorData?.message || json.errorMessage || "Unknown error from Convex" };
19515
19560
  }
19516
19561
  return { success: false, error: `Unexpected response: ${text}` };
19517
19562
  }
19518
19563
  async function getSyncState(organizationId, environment) {
19519
19564
  const credentials = loadCredentials();
19520
19565
  const apiKey = getApiKey();
19566
+ if (apiKey && !credentials?.token) {
19567
+ const siteUrl = getSiteUrl();
19568
+ try {
19569
+ const response2 = await fetch(`${siteUrl}/v1/sync/state`, {
19570
+ method: "POST",
19571
+ headers: {
19572
+ "Content-Type": "application/json",
19573
+ Authorization: `Bearer ${apiKey}`
19574
+ },
19575
+ body: "{}"
19576
+ });
19577
+ if (!response2.ok) {
19578
+ const error = await response2.text();
19579
+ return { error };
19580
+ }
19581
+ const result2 = await response2.json();
19582
+ return { state: result2 };
19583
+ } catch (err) {
19584
+ return { error: `Network error: ${err instanceof Error ? err.message : String(err)}` };
19585
+ }
19586
+ }
19521
19587
  const token = apiKey || credentials?.token;
19522
19588
  if (!token) {
19523
19589
  return { error: "Not authenticated" };
@@ -19549,6 +19615,27 @@ async function getSyncState(organizationId, environment) {
19549
19615
  async function getPullState(organizationId, environment = "development") {
19550
19616
  const credentials = loadCredentials();
19551
19617
  const apiKey = getApiKey();
19618
+ if (apiKey && !credentials?.token) {
19619
+ const siteUrl = getSiteUrl();
19620
+ try {
19621
+ const response2 = await fetch(`${siteUrl}/v1/sync/pull`, {
19622
+ method: "POST",
19623
+ headers: {
19624
+ "Content-Type": "application/json",
19625
+ Authorization: `Bearer ${apiKey}`
19626
+ },
19627
+ body: "{}"
19628
+ });
19629
+ if (!response2.ok) {
19630
+ const error = await response2.text();
19631
+ return { error };
19632
+ }
19633
+ const result2 = await response2.json();
19634
+ return { state: result2 };
19635
+ } catch (err) {
19636
+ return { error: `Network error: ${err instanceof Error ? err.message : String(err)}` };
19637
+ }
19638
+ }
19552
19639
  const token = apiKey || credentials?.token;
19553
19640
  if (!token) {
19554
19641
  return { error: "Not authenticated" };
@@ -20597,7 +20684,13 @@ async function importUserFile(filePath) {
20597
20684
  const source = readFileSync3(filePath, "utf-8");
20598
20685
  const uid = `${Date.now()}-${importCounter++}`;
20599
20686
  if (!source.includes("'struere'") && !source.includes('"struere"')) {
20600
- return await import(`${filePath}?v=${uid}`);
20687
+ try {
20688
+ return await import(`${filePath}?v=${uid}`);
20689
+ } catch (err) {
20690
+ const detail = err instanceof Error ? err.stack || err.message : String(err);
20691
+ throw new Error(`Import error in ${basename(filePath)}:
20692
+ ${detail}`);
20693
+ }
20601
20694
  }
20602
20695
  const stripped = source.replace(IMPORT_STRUERE_RE, "");
20603
20696
  const inlined = VIRTUAL_MODULE_SOURCE.trim() + `
@@ -20607,6 +20700,10 @@ async function importUserFile(filePath) {
20607
20700
  writeFileSync4(tmpPath, inlined);
20608
20701
  try {
20609
20702
  return await import(`${tmpPath}?v=${uid}`);
20703
+ } catch (err) {
20704
+ const detail = err instanceof Error ? err.stack || err.message : String(err);
20705
+ throw new Error(`Import error in ${name}.ts:
20706
+ ${detail}`);
20610
20707
  } finally {
20611
20708
  try {
20612
20709
  unlinkSync2(tmpPath);
@@ -21654,10 +21751,16 @@ function extractHandlerCode(handler) {
21654
21751
  var devCommand = new Command("dev").description("Sync all resources to development environment").option("--force", "Skip destructive sync confirmation").action(async (options) => {
21655
21752
  const spinner = ora();
21656
21753
  const cwd = process.cwd();
21754
+ const apiKey = getApiKey();
21755
+ const isHeadless = !!apiKey && !loadCredentials()?.token;
21657
21756
  console.log();
21658
21757
  console.log(source_default.bold("Struere Dev"));
21659
21758
  console.log();
21660
21759
  if (!hasProject(cwd)) {
21760
+ if (isHeadless) {
21761
+ console.log(source_default.red("No struere.json found. Cannot run init in headless mode."));
21762
+ process.exit(1);
21763
+ }
21661
21764
  console.log(source_default.yellow("No struere.json found - initializing project..."));
21662
21765
  console.log();
21663
21766
  await runInit(cwd);
@@ -21671,9 +21774,11 @@ var devCommand = new Command("dev").description("Sync all resources to developme
21671
21774
  generateTypeDeclarations(cwd);
21672
21775
  console.log(source_default.gray("Organization:"), source_default.cyan(project.organization.name));
21673
21776
  console.log(source_default.gray("Environment:"), source_default.cyan("development"), "+", source_default.cyan("eval"));
21777
+ if (isHeadless) {
21778
+ console.log(source_default.gray("Auth:"), source_default.cyan("API key (headless)"));
21779
+ }
21674
21780
  console.log();
21675
21781
  let credentials = loadCredentials();
21676
- const apiKey = getApiKey();
21677
21782
  if (!credentials && !apiKey) {
21678
21783
  console.log(source_default.yellow("Not logged in - authenticating..."));
21679
21784
  console.log();
@@ -21706,8 +21811,12 @@ var devCommand = new Command("dev").description("Sync all resources to developme
21706
21811
  const performSync = async () => {
21707
21812
  const resources = await loadAllResources(cwd);
21708
21813
  if (resources.errors.length > 0) {
21709
- throw new Error(resources.errors.join(`
21710
- `));
21814
+ for (const err of resources.errors) {
21815
+ console.log(source_default.red(" \u2716"), err);
21816
+ }
21817
+ throw new Error(`${resources.errors.length} resource loading error(s):
21818
+ ${resources.errors.join(`
21819
+ `)}`);
21711
21820
  }
21712
21821
  const payload = extractSyncPayload(resources);
21713
21822
  const devResult = await syncOrganization({
@@ -21754,7 +21863,8 @@ var devCommand = new Command("dev").description("Sync all resources to developme
21754
21863
  spinner.fail("Failed to load resources");
21755
21864
  console.log(source_default.red("Error:"), error instanceof Error ? error.message : String(error));
21756
21865
  }
21757
- if (initialSyncOk && !options.force && loadedResources) {
21866
+ const shouldSkipConfirmation = options.force || isHeadless;
21867
+ if (initialSyncOk && !shouldSkipConfirmation && loadedResources) {
21758
21868
  spinner.start("Checking remote state");
21759
21869
  try {
21760
21870
  const { state: remoteState } = await getSyncState(project.organization.id, "development");
@@ -21817,7 +21927,7 @@ var devCommand = new Command("dev").description("Sync all resources to developme
21817
21927
  await performSync();
21818
21928
  spinner.succeed("Synced to development");
21819
21929
  } catch (error) {
21820
- if (isAuthError(error)) {
21930
+ if (isAuthError(error) && !isHeadless) {
21821
21931
  spinner.fail("Session expired - re-authenticating...");
21822
21932
  clearCredentials();
21823
21933
  credentials = await performLogin();
@@ -21833,6 +21943,11 @@ var devCommand = new Command("dev").description("Sync all resources to developme
21833
21943
  spinner.fail("Sync failed");
21834
21944
  console.log(source_default.red("Error:"), retryError instanceof Error ? retryError.message : String(retryError));
21835
21945
  }
21946
+ } else if (isAuthError(error) && isHeadless) {
21947
+ spinner.fail("API key authentication failed");
21948
+ console.log(source_default.red("Error:"), error instanceof Error ? error.message : String(error));
21949
+ console.log(source_default.gray("Check that STRUERE_API_KEY is valid and not expired."));
21950
+ process.exit(1);
21836
21951
  } else if (isOrgAccessError(error)) {
21837
21952
  spinner.fail("Organization access denied");
21838
21953
  console.log();
@@ -21864,7 +21979,7 @@ var devCommand = new Command("dev").description("Sync all resources to developme
21864
21979
  ].filter((p) => existsSync7(p));
21865
21980
  const watcher = import_chokidar.default.watch(watchPaths, {
21866
21981
  ignoreInitial: true,
21867
- ignored: [/node_modules/, /\.struere-tmp-/],
21982
+ ignored: [/node_modules/, /\.struere-tmp-/, /evals\/runs\//],
21868
21983
  persistent: true,
21869
21984
  usePolling: false
21870
21985
  });
@@ -21876,7 +21991,7 @@ var devCommand = new Command("dev").description("Sync all resources to developme
21876
21991
  await performSync();
21877
21992
  syncSpinner.succeed("Synced");
21878
21993
  } catch (error) {
21879
- if (isAuthError(error)) {
21994
+ if (isAuthError(error) && !isHeadless) {
21880
21995
  syncSpinner.fail("Session expired - re-authenticating...");
21881
21996
  clearCredentials();
21882
21997
  const newCredentials = await performLogin();
@@ -23760,8 +23875,11 @@ var runCommand = new Command("run").description("Run an eval suite").argument("<
23760
23875
  }
23761
23876
  let filteredCaseIds;
23762
23877
  if (options.case && options.case.length > 0) {
23763
- const nameSet = new Set(options.case.map((n) => n.toLowerCase()));
23764
- const matched = cases.filter((c) => nameSet.has(c.name.toLowerCase()));
23878
+ const patterns = options.case.map((n) => n.toLowerCase());
23879
+ const matched = cases.filter((c) => {
23880
+ const name = c.name.toLowerCase();
23881
+ return patterns.some((p) => name.includes(p));
23882
+ });
23765
23883
  if (matched.length === 0) {
23766
23884
  spinner.fail("No cases matched");
23767
23885
  console.log(source_default.gray(" Available cases:"));
@@ -24187,7 +24305,7 @@ templatesCommand.command("status <name>").description("Check template approval s
24187
24305
  // package.json
24188
24306
  var package_default = {
24189
24307
  name: "struere",
24190
- version: "0.7.4",
24308
+ version: "0.8.0",
24191
24309
  description: "Build, test, and deploy AI agents",
24192
24310
  keywords: [
24193
24311
  "ai",
@@ -1 +1 @@
1
- {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAiBnC,eAAO,MAAM,UAAU,SAkUnB,CAAA"}
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAiBnC,eAAO,MAAM,UAAU,SAoVnB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"eval.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/eval.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAgYnC,eAAO,MAAM,WAAW,SACe,CAAA"}
1
+ {"version":3,"file":"eval.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/eval.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAmYnC,eAAO,MAAM,WAAW,SACe,CAAA"}
package/dist/cli/index.js CHANGED
@@ -62,6 +62,9 @@ import ora from "ora";
62
62
 
63
63
  // src/cli/utils/convex.ts
64
64
  var CONVEX_URL = process.env.STRUERE_CONVEX_URL || "https://rapid-wildebeest-172.convex.cloud";
65
+ function getSiteUrl() {
66
+ return CONVEX_URL.replace(".cloud", ".site");
67
+ }
65
68
  async function listMyOrganizations(token) {
66
69
  const response = await fetch(`${CONVEX_URL}/api/query`, {
67
70
  method: "POST",
@@ -132,9 +135,51 @@ async function getUserInfo(token) {
132
135
  }
133
136
  };
134
137
  }
138
+ async function syncViaHttp(apiKey, payload) {
139
+ const siteUrl = getSiteUrl();
140
+ let response;
141
+ try {
142
+ response = await fetch(`${siteUrl}/v1/sync`, {
143
+ method: "POST",
144
+ headers: {
145
+ "Content-Type": "application/json",
146
+ Authorization: `Bearer ${apiKey}`
147
+ },
148
+ body: JSON.stringify({
149
+ agents: payload.agents,
150
+ entityTypes: payload.entityTypes,
151
+ roles: payload.roles,
152
+ evalSuites: payload.evalSuites,
153
+ triggers: payload.triggers,
154
+ fixtures: payload.fixtures
155
+ }),
156
+ signal: AbortSignal.timeout(30000)
157
+ });
158
+ } catch (err) {
159
+ if (err instanceof DOMException && err.name === "TimeoutError") {
160
+ return { success: false, error: "Sync request timed out after 30s" };
161
+ }
162
+ return { success: false, error: `Network error: ${err instanceof Error ? err.message : String(err)}` };
163
+ }
164
+ const text = await response.text();
165
+ let json;
166
+ try {
167
+ json = JSON.parse(text);
168
+ } catch {
169
+ return { success: false, error: text || `HTTP ${response.status}` };
170
+ }
171
+ if (!response.ok) {
172
+ const msg = json.error || text;
173
+ return { success: false, error: msg };
174
+ }
175
+ return json;
176
+ }
135
177
  async function syncOrganization(payload) {
136
178
  const credentials = loadCredentials();
137
179
  const apiKey = getApiKey();
180
+ if (apiKey && !credentials?.token) {
181
+ return syncViaHttp(apiKey, payload);
182
+ }
138
183
  const token = apiKey || credentials?.token;
139
184
  if (!token) {
140
185
  return { success: false, error: "Not authenticated" };
@@ -174,13 +219,34 @@ async function syncOrganization(payload) {
174
219
  return json.value;
175
220
  }
176
221
  if (json.status === "error") {
177
- return { success: false, error: json.errorMessage || "Unknown error from Convex" };
222
+ return { success: false, error: json.errorData?.message || json.errorMessage || "Unknown error from Convex" };
178
223
  }
179
224
  return { success: false, error: `Unexpected response: ${text}` };
180
225
  }
181
226
  async function getSyncState(organizationId, environment) {
182
227
  const credentials = loadCredentials();
183
228
  const apiKey = getApiKey();
229
+ if (apiKey && !credentials?.token) {
230
+ const siteUrl = getSiteUrl();
231
+ try {
232
+ const response2 = await fetch(`${siteUrl}/v1/sync/state`, {
233
+ method: "POST",
234
+ headers: {
235
+ "Content-Type": "application/json",
236
+ Authorization: `Bearer ${apiKey}`
237
+ },
238
+ body: "{}"
239
+ });
240
+ if (!response2.ok) {
241
+ const error = await response2.text();
242
+ return { error };
243
+ }
244
+ const result2 = await response2.json();
245
+ return { state: result2 };
246
+ } catch (err) {
247
+ return { error: `Network error: ${err instanceof Error ? err.message : String(err)}` };
248
+ }
249
+ }
184
250
  const token = apiKey || credentials?.token;
185
251
  if (!token) {
186
252
  return { error: "Not authenticated" };
@@ -212,6 +278,27 @@ async function getSyncState(organizationId, environment) {
212
278
  async function getPullState(organizationId, environment = "development") {
213
279
  const credentials = loadCredentials();
214
280
  const apiKey = getApiKey();
281
+ if (apiKey && !credentials?.token) {
282
+ const siteUrl = getSiteUrl();
283
+ try {
284
+ const response2 = await fetch(`${siteUrl}/v1/sync/pull`, {
285
+ method: "POST",
286
+ headers: {
287
+ "Content-Type": "application/json",
288
+ Authorization: `Bearer ${apiKey}`
289
+ },
290
+ body: "{}"
291
+ });
292
+ if (!response2.ok) {
293
+ const error = await response2.text();
294
+ return { error };
295
+ }
296
+ const result2 = await response2.json();
297
+ return { state: result2 };
298
+ } catch (err) {
299
+ return { error: `Network error: ${err instanceof Error ? err.message : String(err)}` };
300
+ }
301
+ }
215
302
  const token = apiKey || credentials?.token;
216
303
  if (!token) {
217
304
  return { error: "Not authenticated" };
@@ -1263,7 +1350,13 @@ async function importUserFile(filePath) {
1263
1350
  const source = readFileSync3(filePath, "utf-8");
1264
1351
  const uid = `${Date.now()}-${importCounter++}`;
1265
1352
  if (!source.includes("'struere'") && !source.includes('"struere"')) {
1266
- return await import(`${filePath}?v=${uid}`);
1353
+ try {
1354
+ return await import(`${filePath}?v=${uid}`);
1355
+ } catch (err) {
1356
+ const detail = err instanceof Error ? err.stack || err.message : String(err);
1357
+ throw new Error(`Import error in ${basename(filePath)}:
1358
+ ${detail}`);
1359
+ }
1267
1360
  }
1268
1361
  const stripped = source.replace(IMPORT_STRUERE_RE, "");
1269
1362
  const inlined = VIRTUAL_MODULE_SOURCE.trim() + `
@@ -1273,6 +1366,10 @@ async function importUserFile(filePath) {
1273
1366
  writeFileSync4(tmpPath, inlined);
1274
1367
  try {
1275
1368
  return await import(`${tmpPath}?v=${uid}`);
1369
+ } catch (err) {
1370
+ const detail = err instanceof Error ? err.stack || err.message : String(err);
1371
+ throw new Error(`Import error in ${name}.ts:
1372
+ ${detail}`);
1276
1373
  } finally {
1277
1374
  try {
1278
1375
  unlinkSync2(tmpPath);
@@ -2324,10 +2421,16 @@ function extractHandlerCode(handler) {
2324
2421
  var devCommand = new Command4("dev").description("Sync all resources to development environment").option("--force", "Skip destructive sync confirmation").action(async (options) => {
2325
2422
  const spinner = ora4();
2326
2423
  const cwd = process.cwd();
2424
+ const apiKey = getApiKey();
2425
+ const isHeadless = !!apiKey && !loadCredentials()?.token;
2327
2426
  console.log();
2328
2427
  console.log(chalk4.bold("Struere Dev"));
2329
2428
  console.log();
2330
2429
  if (!hasProject(cwd)) {
2430
+ if (isHeadless) {
2431
+ console.log(chalk4.red("No struere.json found. Cannot run init in headless mode."));
2432
+ process.exit(1);
2433
+ }
2331
2434
  console.log(chalk4.yellow("No struere.json found - initializing project..."));
2332
2435
  console.log();
2333
2436
  await runInit(cwd);
@@ -2341,9 +2444,11 @@ var devCommand = new Command4("dev").description("Sync all resources to developm
2341
2444
  generateTypeDeclarations(cwd);
2342
2445
  console.log(chalk4.gray("Organization:"), chalk4.cyan(project.organization.name));
2343
2446
  console.log(chalk4.gray("Environment:"), chalk4.cyan("development"), "+", chalk4.cyan("eval"));
2447
+ if (isHeadless) {
2448
+ console.log(chalk4.gray("Auth:"), chalk4.cyan("API key (headless)"));
2449
+ }
2344
2450
  console.log();
2345
2451
  let credentials = loadCredentials();
2346
- const apiKey = getApiKey();
2347
2452
  if (!credentials && !apiKey) {
2348
2453
  console.log(chalk4.yellow("Not logged in - authenticating..."));
2349
2454
  console.log();
@@ -2376,8 +2481,12 @@ var devCommand = new Command4("dev").description("Sync all resources to developm
2376
2481
  const performSync = async () => {
2377
2482
  const resources = await loadAllResources(cwd);
2378
2483
  if (resources.errors.length > 0) {
2379
- throw new Error(resources.errors.join(`
2380
- `));
2484
+ for (const err of resources.errors) {
2485
+ console.log(chalk4.red(" \u2716"), err);
2486
+ }
2487
+ throw new Error(`${resources.errors.length} resource loading error(s):
2488
+ ${resources.errors.join(`
2489
+ `)}`);
2381
2490
  }
2382
2491
  const payload = extractSyncPayload(resources);
2383
2492
  const devResult = await syncOrganization({
@@ -2424,7 +2533,8 @@ var devCommand = new Command4("dev").description("Sync all resources to developm
2424
2533
  spinner.fail("Failed to load resources");
2425
2534
  console.log(chalk4.red("Error:"), error instanceof Error ? error.message : String(error));
2426
2535
  }
2427
- if (initialSyncOk && !options.force && loadedResources) {
2536
+ const shouldSkipConfirmation = options.force || isHeadless;
2537
+ if (initialSyncOk && !shouldSkipConfirmation && loadedResources) {
2428
2538
  spinner.start("Checking remote state");
2429
2539
  try {
2430
2540
  const { state: remoteState } = await getSyncState(project.organization.id, "development");
@@ -2487,7 +2597,7 @@ var devCommand = new Command4("dev").description("Sync all resources to developm
2487
2597
  await performSync();
2488
2598
  spinner.succeed("Synced to development");
2489
2599
  } catch (error) {
2490
- if (isAuthError(error)) {
2600
+ if (isAuthError(error) && !isHeadless) {
2491
2601
  spinner.fail("Session expired - re-authenticating...");
2492
2602
  clearCredentials();
2493
2603
  credentials = await performLogin();
@@ -2503,6 +2613,11 @@ var devCommand = new Command4("dev").description("Sync all resources to developm
2503
2613
  spinner.fail("Sync failed");
2504
2614
  console.log(chalk4.red("Error:"), retryError instanceof Error ? retryError.message : String(retryError));
2505
2615
  }
2616
+ } else if (isAuthError(error) && isHeadless) {
2617
+ spinner.fail("API key authentication failed");
2618
+ console.log(chalk4.red("Error:"), error instanceof Error ? error.message : String(error));
2619
+ console.log(chalk4.gray("Check that STRUERE_API_KEY is valid and not expired."));
2620
+ process.exit(1);
2506
2621
  } else if (isOrgAccessError(error)) {
2507
2622
  spinner.fail("Organization access denied");
2508
2623
  console.log();
@@ -2534,7 +2649,7 @@ var devCommand = new Command4("dev").description("Sync all resources to developm
2534
2649
  ].filter((p) => existsSync7(p));
2535
2650
  const watcher = chokidar.watch(watchPaths, {
2536
2651
  ignoreInitial: true,
2537
- ignored: [/node_modules/, /\.struere-tmp-/],
2652
+ ignored: [/node_modules/, /\.struere-tmp-/, /evals\/runs\//],
2538
2653
  persistent: true,
2539
2654
  usePolling: false
2540
2655
  });
@@ -2546,7 +2661,7 @@ var devCommand = new Command4("dev").description("Sync all resources to developm
2546
2661
  await performSync();
2547
2662
  syncSpinner.succeed("Synced");
2548
2663
  } catch (error) {
2549
- if (isAuthError(error)) {
2664
+ if (isAuthError(error) && !isHeadless) {
2550
2665
  syncSpinner.fail("Session expired - re-authenticating...");
2551
2666
  clearCredentials();
2552
2667
  const newCredentials = await performLogin();
@@ -4457,8 +4572,11 @@ var runCommand = new Command12("run").description("Run an eval suite").argument(
4457
4572
  }
4458
4573
  let filteredCaseIds;
4459
4574
  if (options.case && options.case.length > 0) {
4460
- const nameSet = new Set(options.case.map((n) => n.toLowerCase()));
4461
- const matched = cases.filter((c) => nameSet.has(c.name.toLowerCase()));
4575
+ const patterns = options.case.map((n) => n.toLowerCase());
4576
+ const matched = cases.filter((c) => {
4577
+ const name = c.name.toLowerCase();
4578
+ return patterns.some((p) => name.includes(p));
4579
+ });
4462
4580
  if (matched.length === 0) {
4463
4581
  spinner.fail("No cases matched");
4464
4582
  console.log(chalk13.gray(" Available cases:"));
@@ -4888,7 +5006,7 @@ templatesCommand.command("status <name>").description("Check template approval s
4888
5006
  // package.json
4889
5007
  var package_default = {
4890
5008
  name: "struere",
4891
- version: "0.7.4",
5009
+ version: "0.8.0",
4892
5010
  description: "Build, test, and deploy AI agents",
4893
5011
  keywords: [
4894
5012
  "ai",
@@ -1 +1 @@
1
- {"version":3,"file":"convex.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/convex.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM,CAAA;QACV,KAAK,EAAE,MAAM,CAAA;QACb,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,CAAA;IACD,aAAa,EAAE,OAAO,EAAE,CAAA;CACzB;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb;AAED,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,aAAa,EAAE,OAAO,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAoB9G;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAwDjG;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,KAAK,CAAC;QACZ,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;QACZ,OAAO,EAAE,MAAM,CAAA;QACf,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,YAAY,EAAE,MAAM,CAAA;QACpB,KAAK,EAAE;YACL,QAAQ,EAAE,MAAM,CAAA;YAChB,IAAI,EAAE,MAAM,CAAA;YACZ,WAAW,CAAC,EAAE,MAAM,CAAA;YACpB,SAAS,CAAC,EAAE,MAAM,CAAA;SACnB,CAAA;QACD,KAAK,EAAE,KAAK,CAAC;YACX,IAAI,EAAE,MAAM,CAAA;YACZ,WAAW,EAAE,MAAM,CAAA;YACnB,UAAU,EAAE,OAAO,CAAA;YACnB,WAAW,CAAC,EAAE,MAAM,CAAA;YACpB,SAAS,EAAE,OAAO,CAAA;SACnB,CAAC,CAAA;KACH,CAAC,CAAA;IACF,WAAW,EAAE,KAAK,CAAC;QACjB,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;QACZ,MAAM,EAAE,OAAO,CAAA;QACf,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;QACvB,aAAa,CAAC,EAAE,OAAO,CAAA;KACxB,CAAC,CAAA;IACF,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,MAAM,CAAA;QACZ,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,QAAQ,EAAE,KAAK,CAAC;YACd,QAAQ,EAAE,MAAM,CAAA;YAChB,OAAO,EAAE,MAAM,EAAE,CAAA;YACjB,MAAM,EAAE,OAAO,GAAG,MAAM,CAAA;SACzB,CAAC,CAAA;QACF,UAAU,CAAC,EAAE,KAAK,CAAC;YACjB,UAAU,EAAE,MAAM,CAAA;YAClB,KAAK,EAAE,MAAM,CAAA;YACb,QAAQ,EAAE,MAAM,CAAA;YAChB,KAAK,EAAE,MAAM,CAAA;SACd,CAAC,CAAA;QACF,UAAU,CAAC,EAAE,KAAK,CAAC;YACjB,UAAU,EAAE,MAAM,CAAA;YAClB,SAAS,EAAE,MAAM,CAAA;YACjB,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAA;YAC3B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SACrC,CAAC,CAAA;KACH,CAAC,CAAA;IACF,UAAU,CAAC,EAAE,KAAK,CAAC;QACjB,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;QACZ,SAAS,EAAE,MAAM,CAAA;QACjB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;QACf,UAAU,CAAC,EAAE;YACX,QAAQ,EAAE,MAAM,CAAA;YAChB,IAAI,EAAE,MAAM,CAAA;SACb,CAAA;QACD,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,KAAK,EAAE,KAAK,CAAC;YACX,IAAI,EAAE,MAAM,CAAA;YACZ,WAAW,CAAC,EAAE,MAAM,CAAA;YACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;YACf,KAAK,EAAE,KAAK,CAAC;gBACX,WAAW,EAAE,MAAM,CAAA;gBACnB,UAAU,CAAC,EAAE,KAAK,CAAC;oBACjB,IAAI,EAAE,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,iBAAiB,CAAA;oBAC9E,QAAQ,CAAC,EAAE,MAAM,CAAA;oBACjB,KAAK,CAAC,EAAE,MAAM,CAAA;oBACd,MAAM,CAAC,EAAE,MAAM,CAAA;iBAChB,CAAC,CAAA;aACH,CAAC,CAAA;YACF,eAAe,CAAC,EAAE,KAAK,CAAC;gBACtB,IAAI,EAAE,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,iBAAiB,CAAA;gBAC9E,QAAQ,CAAC,EAAE,MAAM,CAAA;gBACjB,KAAK,CAAC,EAAE,MAAM,CAAA;gBACd,MAAM,CAAC,EAAE,MAAM,CAAA;aAChB,CAAC,CAAA;SACH,CAAC,CAAA;KACH,CAAC,CAAA;IACF,QAAQ,CAAC,EAAE,KAAK,CAAC;QACf,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;QACZ,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,UAAU,EAAE,MAAM,CAAA;QAClB,MAAM,EAAE,MAAM,CAAA;QACd,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QACnC,OAAO,EAAE,KAAK,CAAC;YACb,IAAI,EAAE,MAAM,CAAA;YACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YAC7B,EAAE,CAAC,EAAE,MAAM,CAAA;SACZ,CAAC,CAAA;QACF,QAAQ,CAAC,EAAE;YACT,KAAK,CAAC,EAAE,MAAM,CAAA;YACd,EAAE,CAAC,EAAE,MAAM,CAAA;YACX,MAAM,CAAC,EAAE,MAAM,CAAA;YACf,cAAc,CAAC,EAAE,OAAO,CAAA;SACzB,CAAA;QACD,KAAK,CAAC,EAAE;YACN,WAAW,CAAC,EAAE,MAAM,CAAA;YACpB,SAAS,CAAC,EAAE,MAAM,CAAA;SACnB,CAAA;KACF,CAAC,CAAA;IACF,QAAQ,CAAC,EAAE,KAAK,CAAC;QACf,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;QACZ,QAAQ,EAAE,KAAK,CAAC;YACd,GAAG,EAAE,MAAM,CAAA;YACX,IAAI,EAAE,MAAM,CAAA;YACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YAC7B,MAAM,CAAC,EAAE,MAAM,CAAA;SAChB,CAAC,CAAA;QACF,SAAS,CAAC,EAAE,KAAK,CAAC;YAChB,IAAI,EAAE,MAAM,CAAA;YACZ,EAAE,EAAE,MAAM,CAAA;YACV,IAAI,EAAE,MAAM,CAAA;YACZ,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SACnC,CAAC,CAAA;KACH,CAAC,CAAA;CACH;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;IACzE,KAAK,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;IACnE,MAAM,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;IACpE,UAAU,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;IAC3F,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,WAAY,SAAQ,WAAW;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,WAAW,EAAE,aAAa,GAAG,YAAY,GAAG,MAAM,CAAA;CACnD;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAqDhF;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;IAClF,WAAW,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAClD,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACnD,UAAU,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACnE,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACrF;AAED,wBAAsB,YAAY,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,aAAa,GAAG,YAAY,GAAG,MAAM,GAAG,OAAO,CAAC;IAAE,KAAK,CAAC,EAAE,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAqC/J;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACnF,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;CACnH;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,OAAO,CAAA;IACf,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACxE,UAAU,EAAE,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACzF,UAAU,EAAE,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAA;CACrH;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACnC,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC5E,QAAQ,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE,CAAA;IACrF,KAAK,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CACrD;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,WAAW,EAAE,mBAAmB,EAAE,CAAA;IAClC,KAAK,EAAE,aAAa,EAAE,CAAA;IACtB,QAAQ,EAAE,gBAAgB,EAAE,CAAA;CAC7B;AAED,wBAAsB,YAAY,CAChC,cAAc,CAAC,EAAE,MAAM,EACvB,WAAW,GAAE,aAAa,GAAG,YAAY,GAAG,MAAsB,GACjE,OAAO,CAAC;IAAE,KAAK,CAAC,EAAE,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAqChD"}
1
+ {"version":3,"file":"convex.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/convex.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,aAAa,EAAE,mBAAmB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AA2BlJ,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,WAAW,EAAE,gBAAgB,EAAE,CAAA;IAC/B,KAAK,EAAE,UAAU,EAAE,CAAA;IACnB,WAAW,EAAE,aAAa,EAAE,CAAA;IAC5B,UAAU,EAAE,mBAAmB,EAAE,CAAA;IACjC,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB,QAAQ,EAAE,iBAAiB,EAAE,CAAA;IAC7B,MAAM,EAAE,MAAM,EAAE,CAAA;CACjB;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAgB5E;AAuGD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG;IACnD,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;CACjB,CAUA"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,aAAa,EAAE,mBAAmB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAmClJ,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,WAAW,EAAE,gBAAgB,EAAE,CAAA;IAC/B,KAAK,EAAE,UAAU,EAAE,CAAA;IACnB,WAAW,EAAE,aAAa,EAAE,CAAA;IAC5B,UAAU,EAAE,mBAAmB,EAAE,CAAA;IACjC,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB,QAAQ,EAAE,iBAAiB,EAAE,CAAA;IAC7B,MAAM,EAAE,MAAM,EAAE,CAAA;CACjB;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAgB5E;AAuGD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG;IACnD,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;CACjB,CAUA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "struere",
3
- "version": "0.7.4",
3
+ "version": "0.8.0",
4
4
  "description": "Build, test, and deploy AI agents",
5
5
  "keywords": [
6
6
  "ai",