struere 0.6.1 → 0.6.3

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.
@@ -18204,6 +18204,7 @@ function ora(options) {
18204
18204
  var isUpKey = (key, keybindings = []) => key.name === "up" || keybindings.includes("vim") && key.name === "k" || keybindings.includes("emacs") && key.ctrl && key.name === "p";
18205
18205
  var isDownKey = (key, keybindings = []) => key.name === "down" || keybindings.includes("vim") && key.name === "j" || keybindings.includes("emacs") && key.ctrl && key.name === "n";
18206
18206
  var isBackspaceKey = (key) => key.name === "backspace";
18207
+ var isTabKey = (key) => key.name === "tab";
18207
18208
  var isNumberKey = (key) => "1234567890".includes(key.name);
18208
18209
  var isEnterKey = (key) => key.name === "enter" || key.name === "return";
18209
18210
  // ../../node_modules/.bun/@inquirer+core@10.3.2+c8db042c65d7bfc4/node_modules/@inquirer/core/dist/esm/lib/errors.js
@@ -19056,6 +19057,51 @@ class Separator {
19056
19057
  return Boolean(choice && typeof choice === "object" && "type" in choice && choice.type === "separator");
19057
19058
  }
19058
19059
  }
19060
+ // ../../node_modules/.bun/@inquirer+confirm@5.1.21+c8db042c65d7bfc4/node_modules/@inquirer/confirm/dist/esm/index.js
19061
+ function getBooleanValue(value, defaultValue) {
19062
+ let answer = defaultValue !== false;
19063
+ if (/^(y|yes)/i.test(value))
19064
+ answer = true;
19065
+ else if (/^(n|no)/i.test(value))
19066
+ answer = false;
19067
+ return answer;
19068
+ }
19069
+ function boolToString(value) {
19070
+ return value ? "Yes" : "No";
19071
+ }
19072
+ var esm_default2 = createPrompt((config, done) => {
19073
+ const { transformer = boolToString } = config;
19074
+ const [status, setStatus] = useState("idle");
19075
+ const [value, setValue] = useState("");
19076
+ const theme = makeTheme(config.theme);
19077
+ const prefix = usePrefix({ status, theme });
19078
+ useKeypress((key, rl) => {
19079
+ if (status !== "idle")
19080
+ return;
19081
+ if (isEnterKey(key)) {
19082
+ const answer = getBooleanValue(value, config.default);
19083
+ setValue(transformer(answer));
19084
+ setStatus("done");
19085
+ done(answer);
19086
+ } else if (isTabKey(key)) {
19087
+ const answer = boolToString(!getBooleanValue(value, config.default));
19088
+ rl.clearLine(0);
19089
+ rl.write(answer);
19090
+ setValue(answer);
19091
+ } else {
19092
+ setValue(rl.line);
19093
+ }
19094
+ });
19095
+ let formattedValue = value;
19096
+ let defaultValue = "";
19097
+ if (status === "done") {
19098
+ formattedValue = theme.style.answer(value);
19099
+ } else {
19100
+ defaultValue = ` ${theme.style.defaultAnswer(config.default === false ? "y/N" : "Y/n")}`;
19101
+ }
19102
+ const message = theme.style.message(config.message, status);
19103
+ return `${prefix} ${message}${defaultValue} ${formattedValue}`;
19104
+ });
19059
19105
  // ../../node_modules/.bun/@inquirer+select@4.4.2+c8db042c65d7bfc4/node_modules/@inquirer/select/dist/esm/index.js
19060
19106
  var import_yoctocolors_cjs3 = __toESM(require_yoctocolors_cjs(), 1);
19061
19107
  var selectTheme = {
@@ -19097,7 +19143,7 @@ function normalizeChoices(choices) {
19097
19143
  return normalizedChoice;
19098
19144
  });
19099
19145
  }
19100
- var esm_default2 = createPrompt((config, done) => {
19146
+ var esm_default3 = createPrompt((config, done) => {
19101
19147
  const { loop = true, pageSize = 7 } = config;
19102
19148
  const theme = makeTheme(selectTheme, config.theme);
19103
19149
  const { keybindings } = theme;
@@ -19944,7 +19990,7 @@ function getClaudeMD(orgName) {
19944
19990
 
19945
19991
  > **This is a workspace project**, not the Struere framework source code. You define agents, entity types, roles, and custom tools here. The CLI syncs them to Convex. Framework source: github.com/struere/struere
19946
19992
 
19947
- Struere is a framework for building production AI agents with Convex as the real-time backend. Agents can manage entities (business data), emit events, and schedule background jobs\u2014all with built-in RBAC permissions.
19993
+ Struere is a framework for building production AI agents with Convex as the real-time backend. Agents can manage entities (business data), emit events, and automate workflows with triggers\u2014all with built-in RBAC permissions.
19948
19994
 
19949
19995
  ## How It Works
19950
19996
 
@@ -19962,7 +20008,7 @@ Struere is a framework for building production AI agents with Convex as the real
19962
20008
  \u25BC
19963
20009
  \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510
19964
20010
  \u2502 Convex (Real-time Backend) \u2502
19965
- \u2502 \u2022 Stores agent configs, entities, events, jobs \u2502
20011
+ \u2502 \u2022 Stores agent configs, entities, events, triggers \u2502
19966
20012
  \u2502 \u2022 Runs LLM calls (Anthropic/OpenAI) \u2502
19967
20013
  \u2502 \u2022 Enforces RBAC on every operation \u2502
19968
20014
  \u2502 \u2022 Executes custom tools via Cloudflare Worker \u2502
@@ -20363,6 +20409,8 @@ export default defineTrigger({
20363
20409
  | \\\`on.entityType\\\` | Yes | Entity type slug to watch |
20364
20410
  | \\\`on.action\\\` | Yes | \\\`"created"\\\`, \\\`"updated"\\\`, or \\\`"deleted"\\\` |
20365
20411
  | \\\`on.condition\\\` | No | Dot-notation equality conditions on entity data |
20412
+ | \\\`schedule\\\` | No | Delay or schedule execution (see Scheduled Triggers) |
20413
+ | \\\`retry\\\` | No | Retry on failure (see Retry Options) |
20366
20414
  | \\\`actions\\\` | Yes | Ordered list of tool calls to execute |
20367
20415
 
20368
20416
  ### Action Pipeline
@@ -20406,6 +20454,47 @@ condition: {
20406
20454
  - **Events**: Emits \\\`trigger.executed\\\` on success, \\\`trigger.failed\\\` on error
20407
20455
  - **Both paths**: Triggers fire from dashboard CRUD, agent tool calls, and API mutations
20408
20456
 
20457
+ ### Scheduled Triggers
20458
+
20459
+ Add \\\`schedule\\\` to delay execution or run at a specific time derived from entity data:
20460
+
20461
+ \\\`\\\`\\\`typescript
20462
+ defineTrigger({
20463
+ name: "Session Reminder",
20464
+ slug: "session-reminder",
20465
+ on: { entityType: "session", action: "created" },
20466
+ schedule: {
20467
+ at: "{{trigger.data.startTime}}",
20468
+ offset: -3600000,
20469
+ },
20470
+ retry: { maxAttempts: 3, backoffMs: 60000 },
20471
+ actions: [
20472
+ { tool: "entity.get", args: { id: "{{trigger.entityId}}" }, as: "session" },
20473
+ { tool: "event.emit", args: { eventType: "session.reminder", entityId: "{{trigger.entityId}}" } },
20474
+ ],
20475
+ })
20476
+ \\\`\\\`\\\`
20477
+
20478
+ **Schedule Options:**
20479
+
20480
+ | Field | Type | Description |
20481
+ |-------|------|-------------|
20482
+ | \\\`delay\\\` | number | Fixed delay in ms after entity mutation |
20483
+ | \\\`at\\\` | string | Template expression resolving to a timestamp (e.g. \\\`"{{trigger.data.startTime}}"\\\`) |
20484
+ | \\\`offset\\\` | number | Offset from \\\`at\\\` time in ms (negative = before, positive = after) |
20485
+ | \\\`cancelPrevious\\\` | boolean | Cancel pending runs for same trigger+entity when new run created |
20486
+
20487
+ Cannot use both \\\`delay\\\` and \\\`at\\\` on the same trigger.
20488
+
20489
+ **Retry Options:**
20490
+
20491
+ | Field | Type | Default | Description |
20492
+ |-------|------|---------|-------------|
20493
+ | \\\`maxAttempts\\\` | number | 1 | Max execution attempts |
20494
+ | \\\`backoffMs\\\` | number | 60000 | Base backoff (exponential: \\\`min(backoffMs * 2^(attempt-1), 3600000)\\\`) |
20495
+
20496
+ Scheduled triggers create **trigger runs** visible in the dashboard with status tracking (pending \u2192 running \u2192 completed/failed/dead).
20497
+
20409
20498
  ### Scaffold a new trigger
20410
20499
 
20411
20500
  \\\`\\\`\\\`bash
@@ -20453,23 +20542,6 @@ Creates \\\`triggers/my-trigger.ts\\\` with a starter template.
20453
20542
 
20454
20543
  Events are immutable audit logs. Use for analytics, debugging, compliance.
20455
20544
 
20456
- ### Job Tools
20457
-
20458
- \`\`\`typescript
20459
- // job.enqueue - Schedule background work
20460
- {
20461
- jobType: "send_reminder",
20462
- payload: { customerId: "ent_abc", message: "Your trial ends soon" },
20463
- runAt: 1706832000000 // Unix timestamp (optional, runs immediately if omitted)
20464
- }
20465
-
20466
- // job.status - Check job status
20467
- { jobId: "job_xyz123" }
20468
- // Returns: { status: "pending" | "running" | "completed" | "failed", result: {...} }
20469
- \`\`\`
20470
-
20471
- Jobs run asynchronously with retry logic. Use for: emails, notifications, data sync.
20472
-
20473
20545
  ### Calendar Tools
20474
20546
 
20475
20547
  Requires a connected Google Calendar (via Settings > Integrations). The \`userId\` must be a user with a linked Google account.
@@ -20718,7 +20790,7 @@ export default defineAgent({
20718
20790
  Check teacher availability before booking. Create session entities for confirmed bookings.
20719
20791
  Send confirmation via the send_notification custom tool.\\\`,
20720
20792
  model: { provider: "anthropic", name: "claude-haiku-4-5" },
20721
- tools: ["entity.create", "entity.query", "job.enqueue", "send_notification"],
20793
+ tools: ["entity.create", "entity.query", "event.emit", "send_notification"],
20722
20794
  })
20723
20795
  \`\`\`
20724
20796
 
@@ -21242,7 +21314,7 @@ async function runInit(cwd, selectedOrg) {
21242
21314
  if (organizations.length === 1) {
21243
21315
  org = organizations[0];
21244
21316
  } else {
21245
- org = await esm_default2({
21317
+ org = await esm_default3({
21246
21318
  message: "Select organization:",
21247
21319
  choices: organizations.map((o) => ({
21248
21320
  name: `${o.name} (${o.slug})`,
@@ -21317,7 +21389,7 @@ var initCommand = new Command("init").description("Initialize a new Struere orga
21317
21389
  } else if (organizations.length === 1) {
21318
21390
  selectedOrg = organizations[0];
21319
21391
  } else {
21320
- selectedOrg = await esm_default2({
21392
+ selectedOrg = await esm_default3({
21321
21393
  message: "Select organization:",
21322
21394
  choices: organizations.map((o) => ({
21323
21395
  name: `${o.name} (${o.slug})`,
@@ -21493,8 +21565,6 @@ var BUILTIN_TOOLS = [
21493
21565
  "entity.unlink",
21494
21566
  "event.emit",
21495
21567
  "event.query",
21496
- "job.enqueue",
21497
- "job.status",
21498
21568
  "calendar.list",
21499
21569
  "calendar.create",
21500
21570
  "calendar.update",
@@ -21569,7 +21639,9 @@ function extractSyncPayload(resources) {
21569
21639
  tool: a.tool,
21570
21640
  args: a.args,
21571
21641
  as: a.as
21572
- }))
21642
+ })),
21643
+ schedule: t.schedule,
21644
+ retry: t.retry
21573
21645
  })) : undefined;
21574
21646
  return { agents, entityTypes, roles, evalSuites, triggers };
21575
21647
  }
@@ -21633,8 +21705,6 @@ function getBuiltinToolDescription(name) {
21633
21705
  "entity.unlink": "Remove a relation between two entities",
21634
21706
  "event.emit": "Emit a custom event for audit logging",
21635
21707
  "event.query": "Query historical events with optional filters",
21636
- "job.enqueue": "Schedule a background job to run later",
21637
- "job.status": "Get the status of a scheduled job",
21638
21708
  "calendar.list": "List Google Calendar events for a user within a time range",
21639
21709
  "calendar.create": "Create a Google Calendar event on a user's calendar",
21640
21710
  "calendar.update": "Update an existing Google Calendar event",
@@ -21727,26 +21797,6 @@ function getBuiltinToolParameters(name) {
21727
21797
  limit: { type: "number", description: "Maximum number of results" }
21728
21798
  }
21729
21799
  },
21730
- "job.enqueue": {
21731
- type: "object",
21732
- properties: {
21733
- jobType: { type: "string", description: "The type of job to schedule" },
21734
- payload: { type: "object", description: "Job payload data" },
21735
- scheduledFor: { type: "number", description: "Unix timestamp when job should run (optional, runs immediately if omitted)" },
21736
- priority: { type: "number", description: "Job priority (higher runs first)" },
21737
- maxAttempts: { type: "number", description: "Maximum retry attempts" },
21738
- idempotencyKey: { type: "string", description: "Unique key to prevent duplicate jobs" },
21739
- entityId: { type: "string", description: "Optional entity ID this job relates to" }
21740
- },
21741
- required: ["jobType"]
21742
- },
21743
- "job.status": {
21744
- type: "object",
21745
- properties: {
21746
- id: { type: "string", description: "The job ID to check" }
21747
- },
21748
- required: ["id"]
21749
- },
21750
21800
  "calendar.list": {
21751
21801
  type: "object",
21752
21802
  properties: {
@@ -21831,7 +21881,7 @@ function extractHandlerCode(handler) {
21831
21881
  }
21832
21882
 
21833
21883
  // src/cli/commands/dev.ts
21834
- var devCommand = new Command("dev").description("Sync all resources to development environment").action(async () => {
21884
+ var devCommand = new Command("dev").description("Sync all resources to development environment").option("--force", "Skip destructive sync confirmation").action(async (options) => {
21835
21885
  const spinner = ora();
21836
21886
  const cwd = process.cwd();
21837
21887
  console.log();
@@ -21895,20 +21945,78 @@ var devCommand = new Command("dev").description("Sync all resources to developme
21895
21945
  return true;
21896
21946
  };
21897
21947
  let initialSyncOk = false;
21948
+ let loadedResources = null;
21898
21949
  spinner.start("Loading resources");
21899
21950
  try {
21900
- const resources = await loadAllResources(cwd);
21901
- spinner.succeed(`Loaded ${resources.agents.length} agents, ${resources.entityTypes.length} entity types, ${resources.roles.length} roles, ${resources.customTools.length} custom tools, ${resources.evalSuites.length} eval suites, ${resources.triggers.length} triggers`);
21902
- for (const err of resources.errors) {
21951
+ loadedResources = await loadAllResources(cwd);
21952
+ spinner.succeed(`Loaded ${loadedResources.agents.length} agents, ${loadedResources.entityTypes.length} entity types, ${loadedResources.roles.length} roles, ${loadedResources.customTools.length} custom tools, ${loadedResources.evalSuites.length} eval suites, ${loadedResources.triggers.length} triggers`);
21953
+ for (const err of loadedResources.errors) {
21903
21954
  console.log(source_default.red(" \u2716"), err);
21904
21955
  }
21905
- if (resources.errors.length === 0) {
21956
+ if (loadedResources.errors.length === 0) {
21906
21957
  initialSyncOk = true;
21907
21958
  }
21908
21959
  } catch (error) {
21909
21960
  spinner.fail("Failed to load resources");
21910
21961
  console.log(source_default.red("Error:"), error instanceof Error ? error.message : String(error));
21911
21962
  }
21963
+ if (initialSyncOk && !options.force && loadedResources) {
21964
+ spinner.start("Checking remote state");
21965
+ try {
21966
+ const { state: remoteState } = await getSyncState(project.organization.id, "development");
21967
+ spinner.stop();
21968
+ if (remoteState) {
21969
+ const payload = extractSyncPayload(loadedResources);
21970
+ const localSlugs = {
21971
+ agents: new Set(payload.agents.map((a) => a.slug)),
21972
+ entityTypes: new Set(payload.entityTypes.map((et) => et.slug)),
21973
+ roles: new Set(payload.roles.map((r) => r.name)),
21974
+ evalSuites: new Set((payload.evalSuites || []).map((es) => es.slug)),
21975
+ triggers: new Set((payload.triggers || []).map((t) => t.slug))
21976
+ };
21977
+ const deletions = [];
21978
+ const deletedAgents = remoteState.agents.filter((a) => !localSlugs.agents.has(a.slug)).map((a) => a.name);
21979
+ if (deletedAgents.length > 0)
21980
+ deletions.push({ type: "Agents", remote: remoteState.agents.length, local: payload.agents.length, deleted: deletedAgents });
21981
+ const deletedEntityTypes = remoteState.entityTypes.filter((et) => !localSlugs.entityTypes.has(et.slug)).map((et) => et.name);
21982
+ if (deletedEntityTypes.length > 0)
21983
+ deletions.push({ type: "Entity types", remote: remoteState.entityTypes.length, local: payload.entityTypes.length, deleted: deletedEntityTypes });
21984
+ const deletedRoles = remoteState.roles.filter((r) => !localSlugs.roles.has(r.name)).map((r) => r.name);
21985
+ if (deletedRoles.length > 0)
21986
+ deletions.push({ type: "Roles", remote: remoteState.roles.length, local: payload.roles.length, deleted: deletedRoles });
21987
+ const remoteEvalSuites = remoteState.evalSuites || [];
21988
+ const deletedEvalSuites = remoteEvalSuites.filter((es) => !localSlugs.evalSuites.has(es.slug)).map((es) => es.name);
21989
+ if (deletedEvalSuites.length > 0)
21990
+ deletions.push({ type: "Eval suites", remote: remoteEvalSuites.length, local: (payload.evalSuites || []).length, deleted: deletedEvalSuites });
21991
+ const remoteTriggers = remoteState.triggers || [];
21992
+ const deletedTriggers = remoteTriggers.filter((t) => !localSlugs.triggers.has(t.slug)).map((t) => t.name);
21993
+ if (deletedTriggers.length > 0)
21994
+ deletions.push({ type: "Triggers", remote: remoteTriggers.length, local: (payload.triggers || []).length, deleted: deletedTriggers });
21995
+ if (deletions.length > 0) {
21996
+ console.log(source_default.yellow.bold(" Warning: this sync will DELETE remote resources:"));
21997
+ console.log();
21998
+ for (const d of deletions) {
21999
+ console.log(source_default.yellow(` ${d.type}:`.padEnd(20)), `${d.remote} remote \u2192 ${d.local} local`, source_default.red(`(${d.deleted.length} will be deleted)`));
22000
+ for (const name of d.deleted) {
22001
+ console.log(source_default.red(` - ${name}`));
22002
+ }
22003
+ }
22004
+ console.log();
22005
+ console.log(source_default.gray(" Run"), source_default.cyan("struere pull"), source_default.gray("first to download remote resources."));
22006
+ console.log();
22007
+ const shouldContinue = await esm_default2({ message: "Continue anyway?", default: false });
22008
+ if (!shouldContinue) {
22009
+ console.log();
22010
+ console.log(source_default.gray("Aborted."));
22011
+ process.exit(0);
22012
+ }
22013
+ console.log();
22014
+ }
22015
+ }
22016
+ } catch {
22017
+ spinner.stop();
22018
+ }
22019
+ }
21912
22020
  if (initialSyncOk) {
21913
22021
  spinner.start("Syncing to Convex");
21914
22022
  try {
@@ -22095,6 +22203,41 @@ var deployCommand = new Command("deploy").description("Deploy all resources to p
22095
22203
  console.log();
22096
22204
  return;
22097
22205
  }
22206
+ const payload = extractSyncPayload(resources);
22207
+ spinner.start("Checking remote state");
22208
+ let deletions = [];
22209
+ try {
22210
+ const { state: remoteState } = await getSyncState(project.organization.id, "production");
22211
+ spinner.stop();
22212
+ if (remoteState) {
22213
+ const localSlugs = {
22214
+ agents: new Set(payload.agents.map((a) => a.slug)),
22215
+ entityTypes: new Set(payload.entityTypes.map((et) => et.slug)),
22216
+ roles: new Set(payload.roles.map((r) => r.name)),
22217
+ evalSuites: new Set((payload.evalSuites || []).map((es) => es.slug)),
22218
+ triggers: new Set((payload.triggers || []).map((t) => t.slug))
22219
+ };
22220
+ const deletedAgents = remoteState.agents.filter((a) => !localSlugs.agents.has(a.slug)).map((a) => a.name);
22221
+ if (deletedAgents.length > 0)
22222
+ deletions.push({ type: "Agents", remote: remoteState.agents.length, local: payload.agents.length, deleted: deletedAgents });
22223
+ const deletedEntityTypes = remoteState.entityTypes.filter((et) => !localSlugs.entityTypes.has(et.slug)).map((et) => et.name);
22224
+ if (deletedEntityTypes.length > 0)
22225
+ deletions.push({ type: "Entity types", remote: remoteState.entityTypes.length, local: payload.entityTypes.length, deleted: deletedEntityTypes });
22226
+ const deletedRoles = remoteState.roles.filter((r) => !localSlugs.roles.has(r.name)).map((r) => r.name);
22227
+ if (deletedRoles.length > 0)
22228
+ deletions.push({ type: "Roles", remote: remoteState.roles.length, local: payload.roles.length, deleted: deletedRoles });
22229
+ const remoteEvalSuites = remoteState.evalSuites || [];
22230
+ const deletedEvalSuites = remoteEvalSuites.filter((es) => !localSlugs.evalSuites.has(es.slug)).map((es) => es.name);
22231
+ if (deletedEvalSuites.length > 0)
22232
+ deletions.push({ type: "Eval suites", remote: remoteEvalSuites.length, local: (payload.evalSuites || []).length, deleted: deletedEvalSuites });
22233
+ const remoteTriggers = remoteState.triggers || [];
22234
+ const deletedTriggers = remoteTriggers.filter((t) => !localSlugs.triggers.has(t.slug)).map((t) => t.name);
22235
+ if (deletedTriggers.length > 0)
22236
+ deletions.push({ type: "Triggers", remote: remoteTriggers.length, local: (payload.triggers || []).length, deleted: deletedTriggers });
22237
+ }
22238
+ } catch {
22239
+ spinner.stop();
22240
+ }
22098
22241
  if (options.dryRun) {
22099
22242
  console.log();
22100
22243
  console.log(source_default.yellow("Dry run mode - no changes will be made"));
@@ -22120,12 +22263,38 @@ var deployCommand = new Command("deploy").description("Deploy all resources to p
22120
22263
  console.log(source_default.gray(" -"), source_default.cyan(suite.suite), source_default.gray(`(${suite.cases.length} cases)`));
22121
22264
  }
22122
22265
  }
22266
+ if (deletions.length > 0) {
22267
+ console.log();
22268
+ console.log(source_default.red.bold("Would DELETE:"));
22269
+ for (const d of deletions) {
22270
+ for (const name of d.deleted) {
22271
+ console.log(source_default.red(` - ${d.type.toLowerCase()}: ${name}`));
22272
+ }
22273
+ }
22274
+ }
22123
22275
  console.log();
22124
22276
  return;
22125
22277
  }
22278
+ if (deletions.length > 0) {
22279
+ console.log(source_default.yellow.bold(" Warning: this deploy will DELETE production resources:"));
22280
+ console.log();
22281
+ for (const d of deletions) {
22282
+ console.log(source_default.yellow(` ${d.type}:`.padEnd(20)), `${d.remote} remote \u2192 ${d.local} local`, source_default.red(`(${d.deleted.length} will be deleted)`));
22283
+ for (const name of d.deleted) {
22284
+ console.log(source_default.red(` - ${name}`));
22285
+ }
22286
+ }
22287
+ console.log();
22288
+ const shouldContinue = await esm_default2({ message: "Continue anyway?", default: false });
22289
+ if (!shouldContinue) {
22290
+ console.log();
22291
+ console.log(source_default.gray("Aborted."));
22292
+ process.exit(0);
22293
+ }
22294
+ console.log();
22295
+ }
22126
22296
  spinner.start("Deploying to production");
22127
22297
  try {
22128
- const payload = extractSyncPayload(resources);
22129
22298
  const syncResult = await syncOrganization({
22130
22299
  ...payload,
22131
22300
  organizationId: project.organization.id,
@@ -22167,7 +22336,6 @@ var deployCommand = new Command("deploy").description("Deploy all resources to p
22167
22336
  }
22168
22337
  spinner.start("Deploying to production");
22169
22338
  try {
22170
- const payload = extractSyncPayload(resources);
22171
22339
  const syncResult = await syncOrganization({
22172
22340
  ...payload,
22173
22341
  organizationId: project.organization.id,
@@ -22528,8 +22696,7 @@ var BUILTIN_TOOLS2 = [
22528
22696
  "entity.unlink",
22529
22697
  "event.emit",
22530
22698
  "event.query",
22531
- "job.enqueue",
22532
- "job.status"
22699
+ "agent.chat"
22533
22700
  ];
22534
22701
  function escapeTemplateLiteral(str) {
22535
22702
  return str.replace(/\\/g, "\\\\").replace(/`/g, "\\`").replace(/\$\{/g, "\\${");
@@ -22728,6 +22895,56 @@ ${toolEntries.join(`,
22728
22895
  ])
22729
22896
  `;
22730
22897
  }
22898
+ function generateTriggerFile(trigger) {
22899
+ const onParts = [
22900
+ ` entityType: "${trigger.entityType}"`,
22901
+ ` action: "${trigger.action}"`
22902
+ ];
22903
+ if (trigger.condition && Object.keys(trigger.condition).length > 0) {
22904
+ onParts.push(` condition: ${stringifyValue(trigger.condition, 4)}`);
22905
+ }
22906
+ const actionLines = trigger.actions.map((a) => {
22907
+ const aParts = [
22908
+ ` tool: "${a.tool}"`,
22909
+ ` args: ${stringifyValue(a.args, 6)}`
22910
+ ];
22911
+ if (a.as) {
22912
+ aParts.push(` as: "${a.as}"`);
22913
+ }
22914
+ return ` {
22915
+ ${aParts.join(`,
22916
+ `)},
22917
+ }`;
22918
+ });
22919
+ const parts = [
22920
+ ` name: "${trigger.name}"`,
22921
+ ` slug: "${trigger.slug}"`
22922
+ ];
22923
+ if (trigger.description) {
22924
+ parts.push(` description: "${trigger.description}"`);
22925
+ }
22926
+ parts.push(` on: {
22927
+ ${onParts.join(`,
22928
+ `)},
22929
+ }`);
22930
+ parts.push(` actions: [
22931
+ ${actionLines.join(`,
22932
+ `)},
22933
+ ]`);
22934
+ if (trigger.schedule) {
22935
+ parts.push(` schedule: ${stringifyValue(trigger.schedule, 2)}`);
22936
+ }
22937
+ if (trigger.retry) {
22938
+ parts.push(` retry: ${stringifyValue(trigger.retry, 2)}`);
22939
+ }
22940
+ return `import { defineTrigger } from 'struere'
22941
+
22942
+ export default defineTrigger({
22943
+ ${parts.join(`,
22944
+ `)},
22945
+ })
22946
+ `;
22947
+ }
22731
22948
  function generateIndexFile(type, slugs) {
22732
22949
  if (slugs.length === 0) {
22733
22950
  return "";
@@ -22828,6 +23045,7 @@ var pullCommand = new Command("pull").description("Pull remote resources to loca
22828
23045
  ensureDir2(join7(cwd, "agents"));
22829
23046
  ensureDir2(join7(cwd, "entity-types"));
22830
23047
  ensureDir2(join7(cwd, "roles"));
23048
+ ensureDir2(join7(cwd, "triggers"));
22831
23049
  ensureDir2(join7(cwd, "tools"));
22832
23050
  const agentSlugs = [];
22833
23051
  for (const agent of state.agents) {
@@ -22849,6 +23067,12 @@ var pullCommand = new Command("pull").description("Pull remote resources to loca
22849
23067
  const content = generateRoleFile(role);
22850
23068
  writeOrSkip(`roles/${role.name}.ts`, content);
22851
23069
  }
23070
+ const triggerSlugs = [];
23071
+ for (const trigger of state.triggers || []) {
23072
+ triggerSlugs.push(trigger.slug);
23073
+ const content = generateTriggerFile(trigger);
23074
+ writeOrSkip(`triggers/${trigger.slug}.ts`, content);
23075
+ }
22852
23076
  const customTools = collectCustomTools(state.agents);
22853
23077
  if (customTools.length > 0) {
22854
23078
  const content = generateToolsFile(customTools);
@@ -22869,6 +23093,11 @@ var pullCommand = new Command("pull").description("Pull remote resources to loca
22869
23093
  if (content)
22870
23094
  writeOrSkip("roles/index.ts", content);
22871
23095
  }
23096
+ if (triggerSlugs.length > 0) {
23097
+ const content = generateIndexFile("triggers", triggerSlugs);
23098
+ if (content)
23099
+ writeOrSkip("triggers/index.ts", content);
23100
+ }
22872
23101
  if (options.dryRun) {
22873
23102
  console.log(source_default.cyan("Dry run - no files written"));
22874
23103
  console.log();
@@ -22899,7 +23128,7 @@ var pullCommand = new Command("pull").description("Pull remote resources to loca
22899
23128
  // package.json
22900
23129
  var package_default = {
22901
23130
  name: "struere",
22902
- version: "0.6.1",
23131
+ version: "0.6.3",
22903
23132
  description: "Build, test, and deploy AI agents",
22904
23133
  keywords: [
22905
23134
  "ai",
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/deploy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA0BnC,eAAO,MAAM,aAAa,SA4LtB,CAAA"}
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/deploy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA2BnC,eAAO,MAAM,aAAa,SA6PtB,CAAA"}
@@ -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;AAgBnC,eAAO,MAAM,UAAU,SAoOnB,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,SAoSnB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/pull.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAmBnC,eAAO,MAAM,WAAW,SAoKpB,CAAA"}
1
+ {"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/pull.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAoBnC,eAAO,MAAM,WAAW,SAiLpB,CAAA"}
package/dist/cli/index.js CHANGED
@@ -737,7 +737,7 @@ function getClaudeMD(orgName) {
737
737
 
738
738
  > **This is a workspace project**, not the Struere framework source code. You define agents, entity types, roles, and custom tools here. The CLI syncs them to Convex. Framework source: github.com/struere/struere
739
739
 
740
- Struere is a framework for building production AI agents with Convex as the real-time backend. Agents can manage entities (business data), emit events, and schedule background jobs\u2014all with built-in RBAC permissions.
740
+ Struere is a framework for building production AI agents with Convex as the real-time backend. Agents can manage entities (business data), emit events, and automate workflows with triggers\u2014all with built-in RBAC permissions.
741
741
 
742
742
  ## How It Works
743
743
 
@@ -755,7 +755,7 @@ Struere is a framework for building production AI agents with Convex as the real
755
755
  \u25BC
756
756
  \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510
757
757
  \u2502 Convex (Real-time Backend) \u2502
758
- \u2502 \u2022 Stores agent configs, entities, events, jobs \u2502
758
+ \u2502 \u2022 Stores agent configs, entities, events, triggers \u2502
759
759
  \u2502 \u2022 Runs LLM calls (Anthropic/OpenAI) \u2502
760
760
  \u2502 \u2022 Enforces RBAC on every operation \u2502
761
761
  \u2502 \u2022 Executes custom tools via Cloudflare Worker \u2502
@@ -1156,6 +1156,8 @@ export default defineTrigger({
1156
1156
  | \\\`on.entityType\\\` | Yes | Entity type slug to watch |
1157
1157
  | \\\`on.action\\\` | Yes | \\\`"created"\\\`, \\\`"updated"\\\`, or \\\`"deleted"\\\` |
1158
1158
  | \\\`on.condition\\\` | No | Dot-notation equality conditions on entity data |
1159
+ | \\\`schedule\\\` | No | Delay or schedule execution (see Scheduled Triggers) |
1160
+ | \\\`retry\\\` | No | Retry on failure (see Retry Options) |
1159
1161
  | \\\`actions\\\` | Yes | Ordered list of tool calls to execute |
1160
1162
 
1161
1163
  ### Action Pipeline
@@ -1199,6 +1201,47 @@ condition: {
1199
1201
  - **Events**: Emits \\\`trigger.executed\\\` on success, \\\`trigger.failed\\\` on error
1200
1202
  - **Both paths**: Triggers fire from dashboard CRUD, agent tool calls, and API mutations
1201
1203
 
1204
+ ### Scheduled Triggers
1205
+
1206
+ Add \\\`schedule\\\` to delay execution or run at a specific time derived from entity data:
1207
+
1208
+ \\\`\\\`\\\`typescript
1209
+ defineTrigger({
1210
+ name: "Session Reminder",
1211
+ slug: "session-reminder",
1212
+ on: { entityType: "session", action: "created" },
1213
+ schedule: {
1214
+ at: "{{trigger.data.startTime}}",
1215
+ offset: -3600000,
1216
+ },
1217
+ retry: { maxAttempts: 3, backoffMs: 60000 },
1218
+ actions: [
1219
+ { tool: "entity.get", args: { id: "{{trigger.entityId}}" }, as: "session" },
1220
+ { tool: "event.emit", args: { eventType: "session.reminder", entityId: "{{trigger.entityId}}" } },
1221
+ ],
1222
+ })
1223
+ \\\`\\\`\\\`
1224
+
1225
+ **Schedule Options:**
1226
+
1227
+ | Field | Type | Description |
1228
+ |-------|------|-------------|
1229
+ | \\\`delay\\\` | number | Fixed delay in ms after entity mutation |
1230
+ | \\\`at\\\` | string | Template expression resolving to a timestamp (e.g. \\\`"{{trigger.data.startTime}}"\\\`) |
1231
+ | \\\`offset\\\` | number | Offset from \\\`at\\\` time in ms (negative = before, positive = after) |
1232
+ | \\\`cancelPrevious\\\` | boolean | Cancel pending runs for same trigger+entity when new run created |
1233
+
1234
+ Cannot use both \\\`delay\\\` and \\\`at\\\` on the same trigger.
1235
+
1236
+ **Retry Options:**
1237
+
1238
+ | Field | Type | Default | Description |
1239
+ |-------|------|---------|-------------|
1240
+ | \\\`maxAttempts\\\` | number | 1 | Max execution attempts |
1241
+ | \\\`backoffMs\\\` | number | 60000 | Base backoff (exponential: \\\`min(backoffMs * 2^(attempt-1), 3600000)\\\`) |
1242
+
1243
+ Scheduled triggers create **trigger runs** visible in the dashboard with status tracking (pending \u2192 running \u2192 completed/failed/dead).
1244
+
1202
1245
  ### Scaffold a new trigger
1203
1246
 
1204
1247
  \\\`\\\`\\\`bash
@@ -1246,23 +1289,6 @@ Creates \\\`triggers/my-trigger.ts\\\` with a starter template.
1246
1289
 
1247
1290
  Events are immutable audit logs. Use for analytics, debugging, compliance.
1248
1291
 
1249
- ### Job Tools
1250
-
1251
- \`\`\`typescript
1252
- // job.enqueue - Schedule background work
1253
- {
1254
- jobType: "send_reminder",
1255
- payload: { customerId: "ent_abc", message: "Your trial ends soon" },
1256
- runAt: 1706832000000 // Unix timestamp (optional, runs immediately if omitted)
1257
- }
1258
-
1259
- // job.status - Check job status
1260
- { jobId: "job_xyz123" }
1261
- // Returns: { status: "pending" | "running" | "completed" | "failed", result: {...} }
1262
- \`\`\`
1263
-
1264
- Jobs run asynchronously with retry logic. Use for: emails, notifications, data sync.
1265
-
1266
1292
  ### Calendar Tools
1267
1293
 
1268
1294
  Requires a connected Google Calendar (via Settings > Integrations). The \`userId\` must be a user with a linked Google account.
@@ -1511,7 +1537,7 @@ export default defineAgent({
1511
1537
  Check teacher availability before booking. Create session entities for confirmed bookings.
1512
1538
  Send confirmation via the send_notification custom tool.\\\`,
1513
1539
  model: { provider: "anthropic", name: "claude-haiku-4-5" },
1514
- tools: ["entity.create", "entity.query", "job.enqueue", "send_notification"],
1540
+ tools: ["entity.create", "entity.query", "event.emit", "send_notification"],
1515
1541
  })
1516
1542
  \`\`\`
1517
1543
 
@@ -2163,6 +2189,7 @@ import ora3 from "ora";
2163
2189
  import chokidar from "chokidar";
2164
2190
  import { join as join6 } from "path";
2165
2191
  import { existsSync as existsSync6, writeFileSync as writeFileSync5 } from "fs";
2192
+ import { confirm } from "@inquirer/prompts";
2166
2193
 
2167
2194
  // src/cli/utils/loader.ts
2168
2195
  import { existsSync as existsSync5, readdirSync, readFileSync as readFileSync3, writeFileSync as writeFileSync4, unlinkSync as unlinkSync2 } from "fs";
@@ -2289,8 +2316,6 @@ var BUILTIN_TOOLS = [
2289
2316
  "entity.unlink",
2290
2317
  "event.emit",
2291
2318
  "event.query",
2292
- "job.enqueue",
2293
- "job.status",
2294
2319
  "calendar.list",
2295
2320
  "calendar.create",
2296
2321
  "calendar.update",
@@ -2365,7 +2390,9 @@ function extractSyncPayload(resources) {
2365
2390
  tool: a.tool,
2366
2391
  args: a.args,
2367
2392
  as: a.as
2368
- }))
2393
+ })),
2394
+ schedule: t.schedule,
2395
+ retry: t.retry
2369
2396
  })) : undefined;
2370
2397
  return { agents, entityTypes, roles, evalSuites, triggers };
2371
2398
  }
@@ -2429,8 +2456,6 @@ function getBuiltinToolDescription(name) {
2429
2456
  "entity.unlink": "Remove a relation between two entities",
2430
2457
  "event.emit": "Emit a custom event for audit logging",
2431
2458
  "event.query": "Query historical events with optional filters",
2432
- "job.enqueue": "Schedule a background job to run later",
2433
- "job.status": "Get the status of a scheduled job",
2434
2459
  "calendar.list": "List Google Calendar events for a user within a time range",
2435
2460
  "calendar.create": "Create a Google Calendar event on a user's calendar",
2436
2461
  "calendar.update": "Update an existing Google Calendar event",
@@ -2523,26 +2548,6 @@ function getBuiltinToolParameters(name) {
2523
2548
  limit: { type: "number", description: "Maximum number of results" }
2524
2549
  }
2525
2550
  },
2526
- "job.enqueue": {
2527
- type: "object",
2528
- properties: {
2529
- jobType: { type: "string", description: "The type of job to schedule" },
2530
- payload: { type: "object", description: "Job payload data" },
2531
- scheduledFor: { type: "number", description: "Unix timestamp when job should run (optional, runs immediately if omitted)" },
2532
- priority: { type: "number", description: "Job priority (higher runs first)" },
2533
- maxAttempts: { type: "number", description: "Maximum retry attempts" },
2534
- idempotencyKey: { type: "string", description: "Unique key to prevent duplicate jobs" },
2535
- entityId: { type: "string", description: "Optional entity ID this job relates to" }
2536
- },
2537
- required: ["jobType"]
2538
- },
2539
- "job.status": {
2540
- type: "object",
2541
- properties: {
2542
- id: { type: "string", description: "The job ID to check" }
2543
- },
2544
- required: ["id"]
2545
- },
2546
2551
  "calendar.list": {
2547
2552
  type: "object",
2548
2553
  properties: {
@@ -2627,7 +2632,7 @@ function extractHandlerCode(handler) {
2627
2632
  }
2628
2633
 
2629
2634
  // src/cli/commands/dev.ts
2630
- var devCommand = new Command3("dev").description("Sync all resources to development environment").action(async () => {
2635
+ var devCommand = new Command3("dev").description("Sync all resources to development environment").option("--force", "Skip destructive sync confirmation").action(async (options) => {
2631
2636
  const spinner = ora3();
2632
2637
  const cwd = process.cwd();
2633
2638
  console.log();
@@ -2691,20 +2696,78 @@ var devCommand = new Command3("dev").description("Sync all resources to developm
2691
2696
  return true;
2692
2697
  };
2693
2698
  let initialSyncOk = false;
2699
+ let loadedResources = null;
2694
2700
  spinner.start("Loading resources");
2695
2701
  try {
2696
- const resources = await loadAllResources(cwd);
2697
- spinner.succeed(`Loaded ${resources.agents.length} agents, ${resources.entityTypes.length} entity types, ${resources.roles.length} roles, ${resources.customTools.length} custom tools, ${resources.evalSuites.length} eval suites, ${resources.triggers.length} triggers`);
2698
- for (const err of resources.errors) {
2702
+ loadedResources = await loadAllResources(cwd);
2703
+ spinner.succeed(`Loaded ${loadedResources.agents.length} agents, ${loadedResources.entityTypes.length} entity types, ${loadedResources.roles.length} roles, ${loadedResources.customTools.length} custom tools, ${loadedResources.evalSuites.length} eval suites, ${loadedResources.triggers.length} triggers`);
2704
+ for (const err of loadedResources.errors) {
2699
2705
  console.log(chalk3.red(" \u2716"), err);
2700
2706
  }
2701
- if (resources.errors.length === 0) {
2707
+ if (loadedResources.errors.length === 0) {
2702
2708
  initialSyncOk = true;
2703
2709
  }
2704
2710
  } catch (error) {
2705
2711
  spinner.fail("Failed to load resources");
2706
2712
  console.log(chalk3.red("Error:"), error instanceof Error ? error.message : String(error));
2707
2713
  }
2714
+ if (initialSyncOk && !options.force && loadedResources) {
2715
+ spinner.start("Checking remote state");
2716
+ try {
2717
+ const { state: remoteState } = await getSyncState(project.organization.id, "development");
2718
+ spinner.stop();
2719
+ if (remoteState) {
2720
+ const payload = extractSyncPayload(loadedResources);
2721
+ const localSlugs = {
2722
+ agents: new Set(payload.agents.map((a) => a.slug)),
2723
+ entityTypes: new Set(payload.entityTypes.map((et) => et.slug)),
2724
+ roles: new Set(payload.roles.map((r) => r.name)),
2725
+ evalSuites: new Set((payload.evalSuites || []).map((es) => es.slug)),
2726
+ triggers: new Set((payload.triggers || []).map((t) => t.slug))
2727
+ };
2728
+ const deletions = [];
2729
+ const deletedAgents = remoteState.agents.filter((a) => !localSlugs.agents.has(a.slug)).map((a) => a.name);
2730
+ if (deletedAgents.length > 0)
2731
+ deletions.push({ type: "Agents", remote: remoteState.agents.length, local: payload.agents.length, deleted: deletedAgents });
2732
+ const deletedEntityTypes = remoteState.entityTypes.filter((et) => !localSlugs.entityTypes.has(et.slug)).map((et) => et.name);
2733
+ if (deletedEntityTypes.length > 0)
2734
+ deletions.push({ type: "Entity types", remote: remoteState.entityTypes.length, local: payload.entityTypes.length, deleted: deletedEntityTypes });
2735
+ const deletedRoles = remoteState.roles.filter((r) => !localSlugs.roles.has(r.name)).map((r) => r.name);
2736
+ if (deletedRoles.length > 0)
2737
+ deletions.push({ type: "Roles", remote: remoteState.roles.length, local: payload.roles.length, deleted: deletedRoles });
2738
+ const remoteEvalSuites = remoteState.evalSuites || [];
2739
+ const deletedEvalSuites = remoteEvalSuites.filter((es) => !localSlugs.evalSuites.has(es.slug)).map((es) => es.name);
2740
+ if (deletedEvalSuites.length > 0)
2741
+ deletions.push({ type: "Eval suites", remote: remoteEvalSuites.length, local: (payload.evalSuites || []).length, deleted: deletedEvalSuites });
2742
+ const remoteTriggers = remoteState.triggers || [];
2743
+ const deletedTriggers = remoteTriggers.filter((t) => !localSlugs.triggers.has(t.slug)).map((t) => t.name);
2744
+ if (deletedTriggers.length > 0)
2745
+ deletions.push({ type: "Triggers", remote: remoteTriggers.length, local: (payload.triggers || []).length, deleted: deletedTriggers });
2746
+ if (deletions.length > 0) {
2747
+ console.log(chalk3.yellow.bold(" Warning: this sync will DELETE remote resources:"));
2748
+ console.log();
2749
+ for (const d of deletions) {
2750
+ console.log(chalk3.yellow(` ${d.type}:`.padEnd(20)), `${d.remote} remote \u2192 ${d.local} local`, chalk3.red(`(${d.deleted.length} will be deleted)`));
2751
+ for (const name of d.deleted) {
2752
+ console.log(chalk3.red(` - ${name}`));
2753
+ }
2754
+ }
2755
+ console.log();
2756
+ console.log(chalk3.gray(" Run"), chalk3.cyan("struere pull"), chalk3.gray("first to download remote resources."));
2757
+ console.log();
2758
+ const shouldContinue = await confirm({ message: "Continue anyway?", default: false });
2759
+ if (!shouldContinue) {
2760
+ console.log();
2761
+ console.log(chalk3.gray("Aborted."));
2762
+ process.exit(0);
2763
+ }
2764
+ console.log();
2765
+ }
2766
+ }
2767
+ } catch {
2768
+ spinner.stop();
2769
+ }
2770
+ }
2708
2771
  if (initialSyncOk) {
2709
2772
  spinner.start("Syncing to Convex");
2710
2773
  try {
@@ -2827,6 +2890,7 @@ var devCommand = new Command3("dev").description("Sync all resources to developm
2827
2890
  import { Command as Command4 } from "commander";
2828
2891
  import chalk4 from "chalk";
2829
2892
  import ora4 from "ora";
2893
+ import { confirm as confirm2 } from "@inquirer/prompts";
2830
2894
  var isAuthError = (error) => {
2831
2895
  const message = error instanceof Error ? error.message : String(error);
2832
2896
  return message.includes("Unauthenticated") || message.includes("OIDC") || message.includes("token") || message.includes("expired");
@@ -2894,6 +2958,41 @@ var deployCommand = new Command4("deploy").description("Deploy all resources to
2894
2958
  console.log();
2895
2959
  return;
2896
2960
  }
2961
+ const payload = extractSyncPayload(resources);
2962
+ spinner.start("Checking remote state");
2963
+ let deletions = [];
2964
+ try {
2965
+ const { state: remoteState } = await getSyncState(project.organization.id, "production");
2966
+ spinner.stop();
2967
+ if (remoteState) {
2968
+ const localSlugs = {
2969
+ agents: new Set(payload.agents.map((a) => a.slug)),
2970
+ entityTypes: new Set(payload.entityTypes.map((et) => et.slug)),
2971
+ roles: new Set(payload.roles.map((r) => r.name)),
2972
+ evalSuites: new Set((payload.evalSuites || []).map((es) => es.slug)),
2973
+ triggers: new Set((payload.triggers || []).map((t) => t.slug))
2974
+ };
2975
+ const deletedAgents = remoteState.agents.filter((a) => !localSlugs.agents.has(a.slug)).map((a) => a.name);
2976
+ if (deletedAgents.length > 0)
2977
+ deletions.push({ type: "Agents", remote: remoteState.agents.length, local: payload.agents.length, deleted: deletedAgents });
2978
+ const deletedEntityTypes = remoteState.entityTypes.filter((et) => !localSlugs.entityTypes.has(et.slug)).map((et) => et.name);
2979
+ if (deletedEntityTypes.length > 0)
2980
+ deletions.push({ type: "Entity types", remote: remoteState.entityTypes.length, local: payload.entityTypes.length, deleted: deletedEntityTypes });
2981
+ const deletedRoles = remoteState.roles.filter((r) => !localSlugs.roles.has(r.name)).map((r) => r.name);
2982
+ if (deletedRoles.length > 0)
2983
+ deletions.push({ type: "Roles", remote: remoteState.roles.length, local: payload.roles.length, deleted: deletedRoles });
2984
+ const remoteEvalSuites = remoteState.evalSuites || [];
2985
+ const deletedEvalSuites = remoteEvalSuites.filter((es) => !localSlugs.evalSuites.has(es.slug)).map((es) => es.name);
2986
+ if (deletedEvalSuites.length > 0)
2987
+ deletions.push({ type: "Eval suites", remote: remoteEvalSuites.length, local: (payload.evalSuites || []).length, deleted: deletedEvalSuites });
2988
+ const remoteTriggers = remoteState.triggers || [];
2989
+ const deletedTriggers = remoteTriggers.filter((t) => !localSlugs.triggers.has(t.slug)).map((t) => t.name);
2990
+ if (deletedTriggers.length > 0)
2991
+ deletions.push({ type: "Triggers", remote: remoteTriggers.length, local: (payload.triggers || []).length, deleted: deletedTriggers });
2992
+ }
2993
+ } catch {
2994
+ spinner.stop();
2995
+ }
2897
2996
  if (options.dryRun) {
2898
2997
  console.log();
2899
2998
  console.log(chalk4.yellow("Dry run mode - no changes will be made"));
@@ -2919,12 +3018,38 @@ var deployCommand = new Command4("deploy").description("Deploy all resources to
2919
3018
  console.log(chalk4.gray(" -"), chalk4.cyan(suite.suite), chalk4.gray(`(${suite.cases.length} cases)`));
2920
3019
  }
2921
3020
  }
3021
+ if (deletions.length > 0) {
3022
+ console.log();
3023
+ console.log(chalk4.red.bold("Would DELETE:"));
3024
+ for (const d of deletions) {
3025
+ for (const name of d.deleted) {
3026
+ console.log(chalk4.red(` - ${d.type.toLowerCase()}: ${name}`));
3027
+ }
3028
+ }
3029
+ }
2922
3030
  console.log();
2923
3031
  return;
2924
3032
  }
3033
+ if (deletions.length > 0) {
3034
+ console.log(chalk4.yellow.bold(" Warning: this deploy will DELETE production resources:"));
3035
+ console.log();
3036
+ for (const d of deletions) {
3037
+ console.log(chalk4.yellow(` ${d.type}:`.padEnd(20)), `${d.remote} remote \u2192 ${d.local} local`, chalk4.red(`(${d.deleted.length} will be deleted)`));
3038
+ for (const name of d.deleted) {
3039
+ console.log(chalk4.red(` - ${name}`));
3040
+ }
3041
+ }
3042
+ console.log();
3043
+ const shouldContinue = await confirm2({ message: "Continue anyway?", default: false });
3044
+ if (!shouldContinue) {
3045
+ console.log();
3046
+ console.log(chalk4.gray("Aborted."));
3047
+ process.exit(0);
3048
+ }
3049
+ console.log();
3050
+ }
2925
3051
  spinner.start("Deploying to production");
2926
3052
  try {
2927
- const payload = extractSyncPayload(resources);
2928
3053
  const syncResult = await syncOrganization({
2929
3054
  ...payload,
2930
3055
  organizationId: project.organization.id,
@@ -2966,7 +3091,6 @@ var deployCommand = new Command4("deploy").description("Deploy all resources to
2966
3091
  }
2967
3092
  spinner.start("Deploying to production");
2968
3093
  try {
2969
- const payload = extractSyncPayload(resources);
2970
3094
  const syncResult = await syncOrganization({
2971
3095
  ...payload,
2972
3096
  organizationId: project.organization.id,
@@ -3340,8 +3464,7 @@ var BUILTIN_TOOLS2 = [
3340
3464
  "entity.unlink",
3341
3465
  "event.emit",
3342
3466
  "event.query",
3343
- "job.enqueue",
3344
- "job.status"
3467
+ "agent.chat"
3345
3468
  ];
3346
3469
  function escapeTemplateLiteral(str) {
3347
3470
  return str.replace(/\\/g, "\\\\").replace(/`/g, "\\`").replace(/\$\{/g, "\\${");
@@ -3540,6 +3663,56 @@ ${toolEntries.join(`,
3540
3663
  ])
3541
3664
  `;
3542
3665
  }
3666
+ function generateTriggerFile(trigger) {
3667
+ const onParts = [
3668
+ ` entityType: "${trigger.entityType}"`,
3669
+ ` action: "${trigger.action}"`
3670
+ ];
3671
+ if (trigger.condition && Object.keys(trigger.condition).length > 0) {
3672
+ onParts.push(` condition: ${stringifyValue(trigger.condition, 4)}`);
3673
+ }
3674
+ const actionLines = trigger.actions.map((a) => {
3675
+ const aParts = [
3676
+ ` tool: "${a.tool}"`,
3677
+ ` args: ${stringifyValue(a.args, 6)}`
3678
+ ];
3679
+ if (a.as) {
3680
+ aParts.push(` as: "${a.as}"`);
3681
+ }
3682
+ return ` {
3683
+ ${aParts.join(`,
3684
+ `)},
3685
+ }`;
3686
+ });
3687
+ const parts = [
3688
+ ` name: "${trigger.name}"`,
3689
+ ` slug: "${trigger.slug}"`
3690
+ ];
3691
+ if (trigger.description) {
3692
+ parts.push(` description: "${trigger.description}"`);
3693
+ }
3694
+ parts.push(` on: {
3695
+ ${onParts.join(`,
3696
+ `)},
3697
+ }`);
3698
+ parts.push(` actions: [
3699
+ ${actionLines.join(`,
3700
+ `)},
3701
+ ]`);
3702
+ if (trigger.schedule) {
3703
+ parts.push(` schedule: ${stringifyValue(trigger.schedule, 2)}`);
3704
+ }
3705
+ if (trigger.retry) {
3706
+ parts.push(` retry: ${stringifyValue(trigger.retry, 2)}`);
3707
+ }
3708
+ return `import { defineTrigger } from 'struere'
3709
+
3710
+ export default defineTrigger({
3711
+ ${parts.join(`,
3712
+ `)},
3713
+ })
3714
+ `;
3715
+ }
3543
3716
  function generateIndexFile(type, slugs) {
3544
3717
  if (slugs.length === 0) {
3545
3718
  return "";
@@ -3640,6 +3813,7 @@ var pullCommand = new Command9("pull").description("Pull remote resources to loc
3640
3813
  ensureDir2(join7(cwd, "agents"));
3641
3814
  ensureDir2(join7(cwd, "entity-types"));
3642
3815
  ensureDir2(join7(cwd, "roles"));
3816
+ ensureDir2(join7(cwd, "triggers"));
3643
3817
  ensureDir2(join7(cwd, "tools"));
3644
3818
  const agentSlugs = [];
3645
3819
  for (const agent of state.agents) {
@@ -3661,6 +3835,12 @@ var pullCommand = new Command9("pull").description("Pull remote resources to loc
3661
3835
  const content = generateRoleFile(role);
3662
3836
  writeOrSkip(`roles/${role.name}.ts`, content);
3663
3837
  }
3838
+ const triggerSlugs = [];
3839
+ for (const trigger of state.triggers || []) {
3840
+ triggerSlugs.push(trigger.slug);
3841
+ const content = generateTriggerFile(trigger);
3842
+ writeOrSkip(`triggers/${trigger.slug}.ts`, content);
3843
+ }
3664
3844
  const customTools = collectCustomTools(state.agents);
3665
3845
  if (customTools.length > 0) {
3666
3846
  const content = generateToolsFile(customTools);
@@ -3681,6 +3861,11 @@ var pullCommand = new Command9("pull").description("Pull remote resources to loc
3681
3861
  if (content)
3682
3862
  writeOrSkip("roles/index.ts", content);
3683
3863
  }
3864
+ if (triggerSlugs.length > 0) {
3865
+ const content = generateIndexFile("triggers", triggerSlugs);
3866
+ if (content)
3867
+ writeOrSkip("triggers/index.ts", content);
3868
+ }
3684
3869
  if (options.dryRun) {
3685
3870
  console.log(chalk9.cyan("Dry run - no files written"));
3686
3871
  console.log();
@@ -3711,7 +3896,7 @@ var pullCommand = new Command9("pull").description("Pull remote resources to loc
3711
3896
  // package.json
3712
3897
  var package_default = {
3713
3898
  name: "struere",
3714
- version: "0.6.1",
3899
+ version: "0.6.3",
3715
3900
  description: "Build, test, and deploy AI agents",
3716
3901
  keywords: [
3717
3902
  "ai",
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/templates/index.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,IAAI,MAAM,CAyBpC;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAwD5D;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAoB9F;AAED,wBAAgB,aAAa,IAAI,MAAM,CAatC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAiBrC;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CA0BlE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAa9C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAgC7D;AAED,wBAAgB,eAAe,IAAI,MAAM,CAsExC;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAatF;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAmBnD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CA+xBnD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAsB/D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/templates/index.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,IAAI,MAAM,CAyBpC;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAwD5D;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAoB9F;AAED,wBAAgB,aAAa,IAAI,MAAM,CAatC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAiBrC;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CA0BlE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAa9C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAgC7D;AAED,wBAAgB,eAAe,IAAI,MAAM,CAsExC;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAatF;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAmBnD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAyzBnD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAsB/D"}
@@ -212,10 +212,34 @@ export interface PullStateRole {
212
212
  maskConfig?: Record<string, unknown>;
213
213
  }>;
214
214
  }
215
+ export interface PullStateTrigger {
216
+ name: string;
217
+ slug: string;
218
+ description?: string;
219
+ entityType: string;
220
+ action: string;
221
+ condition?: Record<string, unknown>;
222
+ actions: Array<{
223
+ tool: string;
224
+ args: Record<string, unknown>;
225
+ as?: string;
226
+ }>;
227
+ schedule?: {
228
+ delay?: number;
229
+ at?: string;
230
+ offset?: number;
231
+ cancelPrevious?: boolean;
232
+ };
233
+ retry?: {
234
+ maxAttempts?: number;
235
+ backoffMs?: number;
236
+ };
237
+ }
215
238
  export interface PullState {
216
239
  agents: PullStateAgent[];
217
240
  entityTypes: PullStateEntityType[];
218
241
  roles: PullStateRole[];
242
+ triggers: PullStateTrigger[];
219
243
  }
220
244
  export declare function getPullState(organizationId?: string, environment?: 'development' | 'production'): Promise<{
221
245
  state?: PullState;
@@ -1 +1 @@
1
- {"version":3,"file":"convex.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/convex.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"convex.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/convex.ts"],"names":[],"mappings":"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"}
@@ -95,6 +95,16 @@ export interface SyncPayload {
95
95
  args: Record<string, unknown>;
96
96
  as?: string;
97
97
  }>;
98
+ schedule?: {
99
+ delay?: number;
100
+ at?: string;
101
+ offset?: number;
102
+ cancelPrevious?: boolean;
103
+ };
104
+ retry?: {
105
+ maxAttempts?: number;
106
+ backoffMs?: number;
107
+ };
98
108
  }>;
99
109
  }
100
110
  export declare function extractSyncPayload(resources: LoadedResources): SyncPayload;
@@ -1 +1 @@
1
- {"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/extractor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/extractor.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { PullStateAgent, PullStateEntityType, PullStateRole } from './convex';
1
+ import type { PullStateAgent, PullStateEntityType, PullStateRole, PullStateTrigger } from './convex';
2
2
  export declare function generateAgentFile(agent: PullStateAgent): string;
3
3
  export declare function generateEntityTypeFile(entityType: PullStateEntityType): string;
4
4
  export declare function generateRoleFile(role: PullStateRole): string;
@@ -9,7 +9,8 @@ interface CustomTool {
9
9
  handlerCode?: string;
10
10
  }
11
11
  export declare function generateToolsFile(customTools: CustomTool[]): string;
12
- export declare function generateIndexFile(type: 'agents' | 'entity-types' | 'roles', slugs: string[]): string;
12
+ export declare function generateTriggerFile(trigger: PullStateTrigger): string;
13
+ export declare function generateIndexFile(type: 'agents' | 'entity-types' | 'roles' | 'triggers', slugs: string[]): string;
13
14
  export declare function collectCustomTools(agents: PullStateAgent[]): CustomTool[];
14
15
  export {};
15
16
  //# sourceMappingURL=generator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AA4ClF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAmC/D;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,mBAAmB,GAAG,MAAM,CAqB9E;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAsD5D;AAED,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,OAAO,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,CA8BnE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,cAAc,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAWpG;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,UAAU,EAAE,CAiBzE"}
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AA2CpG,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAmC/D;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,mBAAmB,GAAG,MAAM,CAqB9E;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAsD5D;AAED,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,OAAO,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,CA8BnE;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CA8CrE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,cAAc,GAAG,OAAO,GAAG,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAWjH;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,UAAU,EAAE,CAiBzE"}
@@ -1 +1 @@
1
- {"version":3,"file":"trigger.d.ts","sourceRoot":"","sources":["../../src/define/trigger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAI7C,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,CA8BlE"}
1
+ {"version":3,"file":"trigger.d.ts","sourceRoot":"","sources":["../../src/define/trigger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAI7C,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,CAqDlE"}
package/dist/index.js CHANGED
@@ -179,6 +179,27 @@ function defineTrigger(config) {
179
179
  throw new Error("Trigger action args must be an object");
180
180
  }
181
181
  }
182
+ if (config.schedule) {
183
+ const { delay, at } = config.schedule;
184
+ if (delay !== undefined && at !== undefined) {
185
+ throw new Error('Trigger schedule cannot have both "delay" and "at"');
186
+ }
187
+ if (delay !== undefined && (typeof delay !== "number" || delay <= 0)) {
188
+ throw new Error("Trigger schedule.delay must be a positive number");
189
+ }
190
+ if (at !== undefined && typeof at !== "string") {
191
+ throw new Error("Trigger schedule.at must be a string template expression");
192
+ }
193
+ }
194
+ if (config.retry) {
195
+ const { maxAttempts, backoffMs } = config.retry;
196
+ if (maxAttempts !== undefined && (typeof maxAttempts !== "number" || maxAttempts < 1)) {
197
+ throw new Error("Trigger retry.maxAttempts must be >= 1");
198
+ }
199
+ if (backoffMs !== undefined && (typeof backoffMs !== "number" || backoffMs <= 0)) {
200
+ throw new Error("Trigger retry.backoffMs must be a positive number");
201
+ }
202
+ }
182
203
  return config;
183
204
  }
184
205
  export {
package/dist/types.d.ts CHANGED
@@ -185,6 +185,16 @@ export interface TriggerAction {
185
185
  args: Record<string, unknown>;
186
186
  as?: string;
187
187
  }
188
+ export interface TriggerSchedule {
189
+ delay?: number;
190
+ at?: string;
191
+ offset?: number;
192
+ cancelPrevious?: boolean;
193
+ }
194
+ export interface TriggerRetry {
195
+ maxAttempts?: number;
196
+ backoffMs?: number;
197
+ }
188
198
  export interface TriggerConfig {
189
199
  name: string;
190
200
  slug: string;
@@ -194,6 +204,8 @@ export interface TriggerConfig {
194
204
  action: 'created' | 'updated' | 'deleted';
195
205
  condition?: Record<string, unknown>;
196
206
  };
207
+ schedule?: TriggerSchedule;
208
+ retry?: TriggerRetry;
197
209
  actions: TriggerAction[];
198
210
  }
199
211
  export interface SyncPayload {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;IACtD,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,cAAc,CAAA;IAC1B,OAAO,EAAE,WAAW,CAAA;IACpB,gBAAgB,CAAC,EAAE,WAAW,CAAA;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,CAAA;IACd,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;IAC/C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAA;IAC1D,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,KAAK,CAAC,EAAE,mBAAmB,CAAA;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;CACjD;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;AAErG,MAAM,WAAW,WAAW;IAC1B,cAAc,EAAE,MAAM,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,OAAO,CAAC,EAAE,aAAa,CAAA;IACvB,IAAI,CAAC,EAAE,UAAU,CAAA;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;IAC1C,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAA;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,CAAA;IAC3C,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CAC/C;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,iBAAiB,CAAA;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,CAAC,EAAE,aAAa,EAAE,CAAA;CAC7B;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,eAAe,CAAC,EAAE,aAAa,EAAE,CAAA;CAClC;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,kBAAkB,EAAE,CAAA;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAA;IACpE,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9C,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAA;IAC7D,aAAa,EAAE,OAAO,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,KAAK,CAAC;QAClB,SAAS,EAAE,MAAM,CAAA;QACjB,WAAW,EAAE,MAAM,CAAA;QACnB,iBAAiB,EAAE,MAAM,CAAA;QACzB,gBAAgB,CAAC,EAAE,KAAK,CAAC;YACvB,IAAI,EAAE,MAAM,CAAA;YACZ,MAAM,EAAE,OAAO,CAAA;YACf,KAAK,CAAC,EAAE,MAAM,CAAA;YACd,MAAM,CAAC,EAAE,MAAM,CAAA;YACf,QAAQ,CAAC,EAAE,MAAM,CAAA;SAClB,CAAC,CAAA;QACF,UAAU,EAAE,MAAM,CAAA;KACnB,CAAC,CAAA;CACH;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,UAAU,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,aAAa,CAAC,EAAE;QACd,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,aAAa,CAAC,EAAE,MAAM,CAAA;QACtB,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAC1B,CAAA;IACD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,QAAQ,CAAA;IACd,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAA;IAC9C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAA;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,KAAK,CAAC,EAAE,kBAAkB,CAAA;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAA;IAC/C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,YAAY,EAAE,CAAA;IACxB,UAAU,CAAC,EAAE,eAAe,EAAE,CAAA;IAC9B,UAAU,CAAC,EAAE,eAAe,EAAE,CAAA;CAC/B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,EAAE,OAAO,GAAG,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,UAAU,CAAA;IACzC,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAA;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACrC;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,KAAK,CAAA;IACd,YAAY,EAAE;QACZ,EAAE,EAAE,MAAM,CAAA;QACV,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;KACb,CAAA;CACF;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;IACvD,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,EAAE,CAAC,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,EAAE,EAAE;QACF,UAAU,EAAE,MAAM,CAAA;QAClB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAA;QACzC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KACpC,CAAA;IACD,OAAO,EAAE,aAAa,EAAE,CAAA;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,WAAW,EAAE,gBAAgB,EAAE,CAAA;IAC/B,KAAK,EAAE,UAAU,EAAE,CAAA;IACnB,WAAW,CAAC,EAAE,aAAa,EAAE,CAAA;IAC7B,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAA;CAC3B;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,YAAY,EAAE,OAAO,CAAC;QAAC,aAAa,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;IAC7G,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,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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "struere",
3
- "version": "0.6.1",
3
+ "version": "0.6.3",
4
4
  "description": "Build, test, and deploy AI agents",
5
5
  "keywords": [
6
6
  "ai",