@agent-native/core 0.7.11 → 0.7.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/action.js +30 -11
- package/dist/action.js.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.js +26 -8
- package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
- package/dist/agent/engine/builder-engine.d.ts +19 -0
- package/dist/agent/engine/builder-engine.d.ts.map +1 -0
- package/dist/agent/engine/builder-engine.js +430 -0
- package/dist/agent/engine/builder-engine.js.map +1 -0
- package/dist/agent/engine/builtin.d.ts.map +1 -1
- package/dist/agent/engine/builtin.js +26 -10
- package/dist/agent/engine/builtin.js.map +1 -1
- package/dist/agent/engine/index.d.ts +1 -1
- package/dist/agent/engine/index.d.ts.map +1 -1
- package/dist/agent/engine/index.js +1 -1
- package/dist/agent/engine/index.js.map +1 -1
- package/dist/agent/engine/provider-env-vars.d.ts +21 -0
- package/dist/agent/engine/provider-env-vars.d.ts.map +1 -0
- package/dist/agent/engine/provider-env-vars.js +50 -0
- package/dist/agent/engine/provider-env-vars.js.map +1 -0
- package/dist/agent/engine/registry.d.ts +37 -0
- package/dist/agent/engine/registry.d.ts.map +1 -1
- package/dist/agent/engine/registry.js +102 -4
- package/dist/agent/engine/registry.js.map +1 -1
- package/dist/agent/engine/types.d.ts +30 -0
- package/dist/agent/engine/types.d.ts.map +1 -1
- package/dist/agent/engine/types.js +19 -1
- package/dist/agent/engine/types.js.map +1 -1
- package/dist/agent/production-agent.d.ts +7 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +67 -15
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-manager.d.ts.map +1 -1
- package/dist/agent/run-manager.js +11 -1
- package/dist/agent/run-manager.js.map +1 -1
- package/dist/agent/thread-data-builder.d.ts +4 -0
- package/dist/agent/thread-data-builder.d.ts.map +1 -1
- package/dist/agent/thread-data-builder.js +1 -0
- package/dist/agent/thread-data-builder.js.map +1 -1
- package/dist/agent/types.d.ts +8 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/checkpoints/service.d.ts +1 -0
- package/dist/checkpoints/service.d.ts.map +1 -1
- package/dist/checkpoints/service.js +26 -2
- package/dist/checkpoints/service.js.map +1 -1
- package/dist/cli/create.d.ts +30 -0
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +127 -10
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/index.js +19 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/templates-meta.d.ts +2 -0
- package/dist/cli/templates-meta.d.ts.map +1 -1
- package/dist/cli/templates-meta.js +2 -0
- package/dist/cli/templates-meta.js.map +1 -1
- package/dist/cli/workspacify.d.ts.map +1 -1
- package/dist/cli/workspacify.js +7 -3
- package/dist/cli/workspacify.js.map +1 -1
- package/dist/client/AgentPanel.js +1 -1
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +93 -37
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/ConnectBuilderCard.d.ts +1 -7
- package/dist/client/ConnectBuilderCard.d.ts.map +1 -1
- package/dist/client/ConnectBuilderCard.js +30 -132
- package/dist/client/ConnectBuilderCard.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +58 -26
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/analytics.d.ts +5 -8
- package/dist/client/analytics.d.ts.map +1 -1
- package/dist/client/analytics.js +53 -11
- package/dist/client/analytics.js.map +1 -1
- package/dist/client/builder-mark.d.ts +9 -0
- package/dist/client/builder-mark.d.ts.map +1 -0
- package/dist/client/builder-mark.js +10 -0
- package/dist/client/builder-mark.js.map +1 -0
- package/dist/client/components/ui/popover.d.ts +8 -0
- package/dist/client/components/ui/popover.d.ts.map +1 -0
- package/dist/client/components/ui/popover.js +11 -0
- package/dist/client/components/ui/popover.js.map +1 -0
- package/dist/client/composer/ComposerPlusMenu.d.ts +2 -0
- package/dist/client/composer/ComposerPlusMenu.d.ts.map +1 -0
- package/dist/client/composer/ComposerPlusMenu.js +244 -0
- package/dist/client/composer/ComposerPlusMenu.js.map +1 -0
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +25 -7
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/composer/useVoiceDictation.d.ts.map +1 -1
- package/dist/client/composer/useVoiceDictation.js +4 -2
- package/dist/client/composer/useVoiceDictation.js.map +1 -1
- package/dist/client/error-format.d.ts +2 -0
- package/dist/client/error-format.d.ts.map +1 -0
- package/dist/client/error-format.js +31 -0
- package/dist/client/error-format.js.map +1 -0
- package/dist/client/index.d.ts +3 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +3 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/observability/ObservabilityDashboard.d.ts +5 -0
- package/dist/client/observability/ObservabilityDashboard.d.ts.map +1 -0
- package/dist/client/observability/ObservabilityDashboard.js +169 -0
- package/dist/client/observability/ObservabilityDashboard.js.map +1 -0
- package/dist/client/observability/ThumbsFeedback.d.ts +8 -0
- package/dist/client/observability/ThumbsFeedback.d.ts.map +1 -0
- package/dist/client/observability/ThumbsFeedback.js +64 -0
- package/dist/client/observability/ThumbsFeedback.js.map +1 -0
- package/dist/client/observability/index.d.ts +4 -0
- package/dist/client/observability/index.d.ts.map +1 -0
- package/dist/client/observability/index.js +4 -0
- package/dist/client/observability/index.js.map +1 -0
- package/dist/client/observability/useObservability.d.ts +128 -0
- package/dist/client/observability/useObservability.d.ts.map +1 -0
- package/dist/client/observability/useObservability.js +109 -0
- package/dist/client/observability/useObservability.js.map +1 -0
- package/dist/client/onboarding/OnboardingPanel.d.ts.map +1 -1
- package/dist/client/onboarding/OnboardingPanel.js +34 -92
- package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
- package/dist/client/org/RequireActiveOrg.d.ts +33 -0
- package/dist/client/org/RequireActiveOrg.d.ts.map +1 -0
- package/dist/client/org/RequireActiveOrg.js +63 -0
- package/dist/client/org/RequireActiveOrg.js.map +1 -0
- package/dist/client/org/hooks.d.ts.map +1 -1
- package/dist/client/org/hooks.js +50 -15
- package/dist/client/org/hooks.js.map +1 -1
- package/dist/client/org/index.d.ts +1 -0
- package/dist/client/org/index.d.ts.map +1 -1
- package/dist/client/org/index.js +1 -0
- package/dist/client/org/index.js.map +1 -1
- package/dist/client/resources/ResourcesPanel.js +3 -3
- package/dist/client/resources/ResourcesPanel.js.map +1 -1
- package/dist/client/settings/AutomationsSection.js +1 -1
- package/dist/client/settings/AutomationsSection.js.map +1 -1
- package/dist/client/settings/BrowserSection.js +1 -1
- package/dist/client/settings/BrowserSection.js.map +1 -1
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/client/settings/SettingsPanel.js +251 -42
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/settings/VoiceTranscriptionSection.d.ts.map +1 -1
- package/dist/client/settings/VoiceTranscriptionSection.js +10 -4
- package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
- package/dist/client/settings/useBuilderStatus.d.ts +26 -0
- package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
- package/dist/client/settings/useBuilderStatus.js +128 -4
- package/dist/client/settings/useBuilderStatus.js.map +1 -1
- package/dist/client/sse-event-processor.d.ts +2 -0
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +6 -2
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/client/transcription/BuilderTranscriptionCta.d.ts +9 -0
- package/dist/client/transcription/BuilderTranscriptionCta.d.ts.map +1 -0
- package/dist/client/transcription/BuilderTranscriptionCta.js +18 -0
- package/dist/client/transcription/BuilderTranscriptionCta.js.map +1 -0
- package/dist/client/transcription/use-live-transcription.d.ts +29 -0
- package/dist/client/transcription/use-live-transcription.d.ts.map +1 -0
- package/dist/client/transcription/use-live-transcription.js +156 -0
- package/dist/client/transcription/use-live-transcription.js.map +1 -0
- package/dist/client/use-builder-enabled.d.ts +17 -0
- package/dist/client/use-builder-enabled.d.ts.map +1 -0
- package/dist/client/use-builder-enabled.js +36 -0
- package/dist/client/use-builder-enabled.js.map +1 -0
- package/dist/client/use-db-sync.d.ts.map +1 -1
- package/dist/client/use-db-sync.js +4 -2
- package/dist/client/use-db-sync.js.map +1 -1
- package/dist/client/useProductionAgent.d.ts.map +1 -1
- package/dist/client/useProductionAgent.js +3 -1
- package/dist/client/useProductionAgent.js.map +1 -1
- package/dist/db/migrations.d.ts +9 -0
- package/dist/db/migrations.d.ts.map +1 -1
- package/dist/db/migrations.js +75 -10
- package/dist/db/migrations.js.map +1 -1
- package/dist/file-upload/builder.d.ts.map +1 -1
- package/dist/file-upload/builder.js +11 -4
- package/dist/file-upload/builder.js.map +1 -1
- package/dist/jobs/tools.d.ts.map +1 -1
- package/dist/jobs/tools.js +137 -161
- package/dist/jobs/tools.js.map +1 -1
- package/dist/notifications/actions.d.ts +2 -2
- package/dist/notifications/actions.d.ts.map +1 -1
- package/dist/notifications/actions.js +77 -69
- package/dist/notifications/actions.js.map +1 -1
- package/dist/observability/evals.d.ts +22 -0
- package/dist/observability/evals.d.ts.map +1 -0
- package/dist/observability/evals.js +371 -0
- package/dist/observability/evals.js.map +1 -0
- package/dist/observability/experiments.d.ts +24 -0
- package/dist/observability/experiments.d.ts.map +1 -0
- package/dist/observability/experiments.js +274 -0
- package/dist/observability/experiments.js.map +1 -0
- package/dist/observability/feedback.d.ts +14 -0
- package/dist/observability/feedback.d.ts.map +1 -0
- package/dist/observability/feedback.js +256 -0
- package/dist/observability/feedback.js.map +1 -0
- package/dist/observability/index.d.ts +6 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +5 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/plugin.d.ts +2 -0
- package/dist/observability/plugin.d.ts.map +1 -0
- package/dist/observability/plugin.js +12 -0
- package/dist/observability/plugin.js.map +1 -0
- package/dist/observability/routes.d.ts +68 -0
- package/dist/observability/routes.d.ts.map +1 -0
- package/dist/observability/routes.js +301 -0
- package/dist/observability/routes.js.map +1 -0
- package/dist/observability/store.d.ts +77 -0
- package/dist/observability/store.d.ts.map +1 -0
- package/dist/observability/store.js +976 -0
- package/dist/observability/store.js.map +1 -0
- package/dist/observability/traces.d.ts +37 -0
- package/dist/observability/traces.d.ts.map +1 -0
- package/dist/observability/traces.js +182 -0
- package/dist/observability/traces.js.map +1 -0
- package/dist/observability/types.d.ts +159 -0
- package/dist/observability/types.d.ts.map +1 -0
- package/dist/observability/types.js +16 -0
- package/dist/observability/types.js.map +1 -0
- package/dist/onboarding/default-steps.d.ts.map +1 -1
- package/dist/onboarding/default-steps.js +68 -24
- package/dist/onboarding/default-steps.js.map +1 -1
- package/dist/onboarding/types.d.ts +10 -1
- package/dist/onboarding/types.d.ts.map +1 -1
- package/dist/org/context.d.ts +8 -1
- package/dist/org/context.d.ts.map +1 -1
- package/dist/org/context.js +163 -6
- package/dist/org/context.js.map +1 -1
- package/dist/org/handlers.d.ts.map +1 -1
- package/dist/org/handlers.js +49 -30
- package/dist/org/handlers.js.map +1 -1
- package/dist/progress/actions.d.ts +3 -0
- package/dist/progress/actions.d.ts.map +1 -1
- package/dist/progress/actions.js +86 -110
- package/dist/progress/actions.js.map +1 -1
- package/dist/progress/routes.d.ts +1 -1
- package/dist/progress/routes.js +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.js +20 -6
- package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
- package/dist/scripts/agent-engines/manage-agent-engine.d.ts +10 -0
- package/dist/scripts/agent-engines/manage-agent-engine.d.ts.map +1 -0
- package/dist/scripts/agent-engines/manage-agent-engine.js +47 -0
- package/dist/scripts/agent-engines/manage-agent-engine.js.map +1 -0
- package/dist/scripts/agent-engines/set-agent-engine.d.ts.map +1 -1
- package/dist/scripts/agent-engines/set-agent-engine.js +10 -9
- package/dist/scripts/agent-engines/set-agent-engine.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts +39 -0
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +743 -452
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-teams.d.ts.map +1 -1
- package/dist/server/agent-teams.js +18 -7
- package/dist/server/agent-teams.js.map +1 -1
- package/dist/server/analytics.d.ts +9 -7
- package/dist/server/analytics.d.ts.map +1 -1
- package/dist/server/analytics.js +12 -11
- package/dist/server/analytics.js.map +1 -1
- package/dist/server/app-name.d.ts +5 -2
- package/dist/server/app-name.d.ts.map +1 -1
- package/dist/server/app-name.js +14 -3
- package/dist/server/app-name.js.map +1 -1
- package/dist/server/app-url.d.ts.map +1 -1
- package/dist/server/app-url.js +17 -5
- package/dist/server/app-url.js.map +1 -1
- package/dist/server/auth.d.ts +2 -0
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +153 -2
- package/dist/server/auth.js.map +1 -1
- package/dist/server/better-auth-instance.d.ts +2 -0
- package/dist/server/better-auth-instance.d.ts.map +1 -1
- package/dist/server/better-auth-instance.js +4 -0
- package/dist/server/better-auth-instance.js.map +1 -1
- package/dist/server/builder-browser.d.ts +59 -1
- package/dist/server/builder-browser.d.ts.map +1 -1
- package/dist/server/builder-browser.js +127 -11
- package/dist/server/builder-browser.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +278 -13
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/credential-provider.d.ts +7 -0
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +10 -0
- package/dist/server/credential-provider.js.map +1 -1
- package/dist/server/onboarding-html.d.ts.map +1 -1
- package/dist/server/onboarding-html.js +29 -4
- package/dist/server/onboarding-html.js.map +1 -1
- package/dist/server/poll.d.ts.map +1 -1
- package/dist/server/poll.js +46 -5
- package/dist/server/poll.js.map +1 -1
- package/dist/server/ssr-handler.d.ts.map +1 -1
- package/dist/server/ssr-handler.js +2 -1
- package/dist/server/ssr-handler.js.map +1 -1
- package/dist/server/transcribe-voice.d.ts.map +1 -1
- package/dist/server/transcribe-voice.js +44 -5
- package/dist/server/transcribe-voice.js.map +1 -1
- package/dist/styles/agent-native.css +11 -2
- package/dist/templates/default/.agents/skills/progress/SKILL.md +14 -12
- package/dist/templates/default/app/root.tsx +7 -0
- package/dist/templates/workspace-root/pnpm-workspace.yaml +6 -0
- package/dist/transcription/builder-transcription.d.ts +27 -0
- package/dist/transcription/builder-transcription.d.ts.map +1 -0
- package/dist/transcription/builder-transcription.js +41 -0
- package/dist/transcription/builder-transcription.js.map +1 -0
- package/dist/triggers/actions.d.ts +3 -0
- package/dist/triggers/actions.d.ts.map +1 -1
- package/dist/triggers/actions.js +189 -213
- package/dist/triggers/actions.js.map +1 -1
- package/docs/content/agent-mentions.md +1 -1
- package/docs/content/automations.md +22 -19
- package/docs/content/cloneable-saas.md +2 -2
- package/docs/content/deployment.md +21 -61
- package/docs/content/getting-started.md +1 -1
- package/docs/content/key-concepts.md +1 -1
- package/docs/content/{enterprise-workspace.md → multi-app-workspace.md} +3 -3
- package/docs/content/multi-tenancy.md +1 -1
- package/docs/content/progress.md +11 -11
- package/docs/content/template-dispatch.md +3 -3
- package/docs/content/workspace-management.md +1 -1
- package/package.json +13 -1
- package/src/templates/default/.agents/skills/progress/SKILL.md +14 -12
- package/src/templates/default/app/root.tsx +7 -0
- package/src/templates/workspace-root/pnpm-workspace.yaml +6 -0
- package/dist/client/settings/LLMSection.d.ts +0 -2
- package/dist/client/settings/LLMSection.d.ts.map +0 -1
- package/dist/client/settings/LLMSection.js +0 -191
- package/dist/client/settings/LLMSection.js.map +0 -1
package/dist/triggers/actions.js
CHANGED
|
@@ -4,115 +4,192 @@
|
|
|
4
4
|
* These are registered as native tools (not template actions) so they're
|
|
5
5
|
* available in every template. The agent uses them to create, list, and
|
|
6
6
|
* manage automations from chat.
|
|
7
|
+
*
|
|
8
|
+
* All six operations are consolidated into a single `manage-automations` tool
|
|
9
|
+
* with an `action` discriminator to keep the tool registry compact.
|
|
7
10
|
*/
|
|
8
11
|
import { listEvents } from "../event-bus/index.js";
|
|
9
12
|
import { resourceListAllOwners, resourcePut, resourceDelete, resourceGetByPath, } from "../resources/store.js";
|
|
10
13
|
import { parseTriggerFrontmatter, buildTriggerContent } from "./dispatcher.js";
|
|
11
14
|
import { refreshEventSubscriptions } from "./dispatcher.js";
|
|
15
|
+
/* ------------------------------------------------------------------ */
|
|
16
|
+
/* Individual action handlers */
|
|
17
|
+
/* ------------------------------------------------------------------ */
|
|
18
|
+
async function handleListEvents() {
|
|
19
|
+
const events = listEvents();
|
|
20
|
+
if (events.length === 0) {
|
|
21
|
+
return "No events registered yet. Events are registered by integrations (mail, calendar, clips, etc.).";
|
|
22
|
+
}
|
|
23
|
+
const lines = events.map((e) => {
|
|
24
|
+
let schemaStr = "";
|
|
25
|
+
try {
|
|
26
|
+
const s = e.payloadSchema;
|
|
27
|
+
if (s?._zod?.def?.shape) {
|
|
28
|
+
const fields = Object.keys(s._zod.def.shape);
|
|
29
|
+
schemaStr = ` Fields: ${fields.join(", ")}`;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// ignore
|
|
34
|
+
}
|
|
35
|
+
const example = e.example
|
|
36
|
+
? `\n Example: ${JSON.stringify(e.example)}`
|
|
37
|
+
: "";
|
|
38
|
+
return `- **${e.name}**: ${e.description}${schemaStr}${example}`;
|
|
39
|
+
});
|
|
40
|
+
return lines.join("\n");
|
|
41
|
+
}
|
|
42
|
+
async function handleList(args) {
|
|
43
|
+
const resources = await resourceListAllOwners("jobs/");
|
|
44
|
+
const triggers = resources
|
|
45
|
+
.filter((r) => r.path.endsWith(".md"))
|
|
46
|
+
.map((r) => {
|
|
47
|
+
const { meta, body } = parseTriggerFrontmatter(r.content);
|
|
48
|
+
const name = r.path.replace(/^jobs\//, "").replace(/\.md$/, "");
|
|
49
|
+
return { name, meta, body, owner: r.owner, id: r.id };
|
|
50
|
+
})
|
|
51
|
+
.filter((t) => {
|
|
52
|
+
if (args.domain && t.meta.domain !== args.domain)
|
|
53
|
+
return false;
|
|
54
|
+
if (args.enabled_only === "true" && !t.meta.enabled)
|
|
55
|
+
return false;
|
|
56
|
+
return true;
|
|
57
|
+
});
|
|
58
|
+
if (triggers.length === 0)
|
|
59
|
+
return "No automations found.";
|
|
60
|
+
const lines = triggers.map((t) => {
|
|
61
|
+
const type = t.meta.triggerType === "event"
|
|
62
|
+
? `on ${t.meta.event || "?"}`
|
|
63
|
+
: `cron: ${t.meta.schedule}`;
|
|
64
|
+
const status = t.meta.enabled ? "enabled" : "disabled";
|
|
65
|
+
const lastStatus = t.meta.lastStatus ? ` (last: ${t.meta.lastStatus})` : "";
|
|
66
|
+
const condition = t.meta.condition
|
|
67
|
+
? `\n Condition: "${t.meta.condition}"`
|
|
68
|
+
: "";
|
|
69
|
+
const domain = t.meta.domain ? ` [${t.meta.domain}]` : "";
|
|
70
|
+
return `- **${t.name}**${domain}: ${type} → ${t.meta.mode} (${status}${lastStatus})${condition}\n Body: ${t.body.slice(0, 100)}${t.body.length > 100 ? "..." : ""}`;
|
|
71
|
+
});
|
|
72
|
+
return lines.join("\n\n");
|
|
73
|
+
}
|
|
74
|
+
async function handleDefine(args, getCurrentUser) {
|
|
75
|
+
const owner = getCurrentUser();
|
|
76
|
+
const name = (args.name || "").replace(/[^a-z0-9-]/g, "-");
|
|
77
|
+
if (!name)
|
|
78
|
+
return "Error: name is required (lowercase, hyphens).";
|
|
79
|
+
const path = `jobs/${name}.md`;
|
|
80
|
+
// Check if it already exists
|
|
81
|
+
const existing = await resourceGetByPath(owner, path);
|
|
82
|
+
if (existing) {
|
|
83
|
+
return `Error: An automation named "${name}" already exists. Use a different name or delete the existing one first.`;
|
|
84
|
+
}
|
|
85
|
+
const triggerType = args.trigger_type === "schedule" ? "schedule" : "event";
|
|
86
|
+
const meta = {
|
|
87
|
+
schedule: args.schedule || "",
|
|
88
|
+
enabled: true,
|
|
89
|
+
triggerType,
|
|
90
|
+
event: args.event || undefined,
|
|
91
|
+
condition: args.condition || undefined,
|
|
92
|
+
mode: args.mode === "deterministic" ? "deterministic" : "agentic",
|
|
93
|
+
domain: args.domain || undefined,
|
|
94
|
+
createdBy: owner,
|
|
95
|
+
runAs: "creator",
|
|
96
|
+
};
|
|
97
|
+
const content = buildTriggerContent(meta, args.body || "");
|
|
98
|
+
await resourcePut(owner, path, content);
|
|
99
|
+
// Refresh event subscriptions so the new trigger is active immediately
|
|
100
|
+
await refreshEventSubscriptions();
|
|
101
|
+
const summary = triggerType === "event"
|
|
102
|
+
? `on ${meta.event || "?"}${meta.condition ? ` when "${meta.condition}"` : ""}`
|
|
103
|
+
: `on schedule "${meta.schedule}"`;
|
|
104
|
+
return `Automation "${name}" created. Fires ${summary} in ${meta.mode} mode.`;
|
|
105
|
+
}
|
|
106
|
+
async function handleUpdate(args, getCurrentUser) {
|
|
107
|
+
const owner = getCurrentUser();
|
|
108
|
+
const name = args.name;
|
|
109
|
+
const path = `jobs/${name}.md`;
|
|
110
|
+
const resource = await resourceGetByPath(owner, path);
|
|
111
|
+
if (!resource) {
|
|
112
|
+
return `Automation "${name}" not found (or you don't own it).`;
|
|
113
|
+
}
|
|
114
|
+
const { meta, body } = parseTriggerFrontmatter(resource.content);
|
|
115
|
+
if (args.enabled !== undefined) {
|
|
116
|
+
meta.enabled = args.enabled !== "false";
|
|
117
|
+
}
|
|
118
|
+
if (args.condition !== undefined) {
|
|
119
|
+
meta.condition = args.condition || undefined;
|
|
120
|
+
}
|
|
121
|
+
const newBody = args.body ?? body;
|
|
122
|
+
await resourcePut(resource.owner, resource.path, buildTriggerContent(meta, newBody));
|
|
123
|
+
await refreshEventSubscriptions();
|
|
124
|
+
return `Automation "${name}" updated.`;
|
|
125
|
+
}
|
|
126
|
+
async function handleDelete(args, getCurrentUser) {
|
|
127
|
+
const owner = getCurrentUser();
|
|
128
|
+
const path = `jobs/${args.name}.md`;
|
|
129
|
+
const resource = await resourceGetByPath(owner, path);
|
|
130
|
+
if (!resource)
|
|
131
|
+
return `Automation "${args.name}" not found.`;
|
|
132
|
+
await resourceDelete(resource.id);
|
|
133
|
+
return `Automation "${args.name}" deleted.`;
|
|
134
|
+
}
|
|
135
|
+
async function handleFireTest(args) {
|
|
136
|
+
// Dynamic import to avoid circular dependency at module load time
|
|
137
|
+
const { emit } = await import("../event-bus/index.js");
|
|
138
|
+
let data = {};
|
|
139
|
+
if (args.data) {
|
|
140
|
+
try {
|
|
141
|
+
data = JSON.parse(args.data);
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return "Error: invalid JSON in data parameter.";
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
emit("test.event.fired", { data });
|
|
148
|
+
return `Test event fired with payload: ${JSON.stringify({ data })}. Any automations subscribed to "test.event.fired" will be evaluated.`;
|
|
149
|
+
}
|
|
150
|
+
/* ------------------------------------------------------------------ */
|
|
151
|
+
/* Consolidated tool entry */
|
|
152
|
+
/* ------------------------------------------------------------------ */
|
|
153
|
+
const VALID_ACTIONS = [
|
|
154
|
+
"list-events",
|
|
155
|
+
"list",
|
|
156
|
+
"define",
|
|
157
|
+
"update",
|
|
158
|
+
"delete",
|
|
159
|
+
"fire-test",
|
|
160
|
+
];
|
|
12
161
|
export function createAutomationToolEntries(getCurrentUser) {
|
|
13
162
|
return {
|
|
14
|
-
"
|
|
15
|
-
tool: {
|
|
16
|
-
description: "List all registered event types that automations can subscribe to. Returns event names, descriptions, and payload schemas. Call this BEFORE defining an automation to discover available events.",
|
|
17
|
-
parameters: { type: "object", properties: {} },
|
|
18
|
-
},
|
|
19
|
-
run: async () => {
|
|
20
|
-
const events = listEvents();
|
|
21
|
-
if (events.length === 0) {
|
|
22
|
-
return "No events registered yet. Events are registered by integrations (mail, calendar, clips, etc.).";
|
|
23
|
-
}
|
|
24
|
-
const lines = events.map((e) => {
|
|
25
|
-
let schemaStr = "";
|
|
26
|
-
try {
|
|
27
|
-
const s = e.payloadSchema;
|
|
28
|
-
if (s?._zod?.def?.shape) {
|
|
29
|
-
const fields = Object.keys(s._zod.def.shape);
|
|
30
|
-
schemaStr = ` Fields: ${fields.join(", ")}`;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
catch {
|
|
34
|
-
// ignore
|
|
35
|
-
}
|
|
36
|
-
const example = e.example
|
|
37
|
-
? `\n Example: ${JSON.stringify(e.example)}`
|
|
38
|
-
: "";
|
|
39
|
-
return `- **${e.name}**: ${e.description}${schemaStr}${example}`;
|
|
40
|
-
});
|
|
41
|
-
return lines.join("\n");
|
|
42
|
-
},
|
|
43
|
-
readOnly: true,
|
|
44
|
-
},
|
|
45
|
-
"list-automations": {
|
|
163
|
+
"manage-automations": {
|
|
46
164
|
tool: {
|
|
47
|
-
description:
|
|
165
|
+
description: `Manage automations (event-triggered and scheduled tasks). Use the "action" parameter to choose an operation:
|
|
166
|
+
|
|
167
|
+
- **list-events**: List all registered event types that automations can subscribe to. Returns event names, descriptions, and payload schemas. Call this BEFORE defining an automation to discover available events.
|
|
168
|
+
- **list**: List all automations (triggers). Shows name, event, condition, mode, status, and domain. Optional params: domain, enabled_only.
|
|
169
|
+
- **define**: Create a new automation. IMPORTANT: Always confirm with the user before calling — show them a summary of what will be created. Required params: name, trigger_type, body. Optional: event, schedule, condition, mode, domain.
|
|
170
|
+
- **update**: Update an existing automation's settings (enabled, condition, body, etc.). Required param: name. Optional: enabled, condition, body.
|
|
171
|
+
- **delete**: Delete an automation. Always confirm with the user first. Required param: name.
|
|
172
|
+
- **fire-test**: Fire a test event to validate automations. Emits a test.event.fired event. Optional param: data (JSON string).`,
|
|
48
173
|
parameters: {
|
|
49
174
|
type: "object",
|
|
50
175
|
properties: {
|
|
51
|
-
|
|
176
|
+
action: {
|
|
52
177
|
type: "string",
|
|
53
|
-
description: "
|
|
178
|
+
description: "The operation to perform: list-events, list, define, update, delete, or fire-test.",
|
|
179
|
+
enum: [...VALID_ACTIONS],
|
|
54
180
|
},
|
|
55
|
-
enabled_only: {
|
|
56
|
-
type: "string",
|
|
57
|
-
description: '"true" to show only enabled automations.',
|
|
58
|
-
},
|
|
59
|
-
},
|
|
60
|
-
},
|
|
61
|
-
},
|
|
62
|
-
run: async (args) => {
|
|
63
|
-
const resources = await resourceListAllOwners("jobs/");
|
|
64
|
-
const triggers = resources
|
|
65
|
-
.filter((r) => r.path.endsWith(".md"))
|
|
66
|
-
.map((r) => {
|
|
67
|
-
const { meta, body } = parseTriggerFrontmatter(r.content);
|
|
68
|
-
const name = r.path.replace(/^jobs\//, "").replace(/\.md$/, "");
|
|
69
|
-
return { name, meta, body, owner: r.owner, id: r.id };
|
|
70
|
-
})
|
|
71
|
-
.filter((t) => {
|
|
72
|
-
if (args.domain && t.meta.domain !== args.domain)
|
|
73
|
-
return false;
|
|
74
|
-
if (args.enabled_only === "true" && !t.meta.enabled)
|
|
75
|
-
return false;
|
|
76
|
-
return true;
|
|
77
|
-
});
|
|
78
|
-
if (triggers.length === 0)
|
|
79
|
-
return "No automations found.";
|
|
80
|
-
const lines = triggers.map((t) => {
|
|
81
|
-
const type = t.meta.triggerType === "event"
|
|
82
|
-
? `on ${t.meta.event || "?"}`
|
|
83
|
-
: `cron: ${t.meta.schedule}`;
|
|
84
|
-
const status = t.meta.enabled ? "enabled" : "disabled";
|
|
85
|
-
const lastStatus = t.meta.lastStatus
|
|
86
|
-
? ` (last: ${t.meta.lastStatus})`
|
|
87
|
-
: "";
|
|
88
|
-
const condition = t.meta.condition
|
|
89
|
-
? `\n Condition: "${t.meta.condition}"`
|
|
90
|
-
: "";
|
|
91
|
-
const domain = t.meta.domain ? ` [${t.meta.domain}]` : "";
|
|
92
|
-
return `- **${t.name}**${domain}: ${type} → ${t.meta.mode} (${status}${lastStatus})${condition}\n Body: ${t.body.slice(0, 100)}${t.body.length > 100 ? "..." : ""}`;
|
|
93
|
-
});
|
|
94
|
-
return lines.join("\n\n");
|
|
95
|
-
},
|
|
96
|
-
readOnly: true,
|
|
97
|
-
},
|
|
98
|
-
"define-automation": {
|
|
99
|
-
tool: {
|
|
100
|
-
description: `Create a new automation. The automation is stored as a markdown resource and fires when the specified event occurs and the condition (if any) matches. IMPORTANT: Always confirm with the user before calling this — show them a summary of what will be created.`,
|
|
101
|
-
parameters: {
|
|
102
|
-
type: "object",
|
|
103
|
-
properties: {
|
|
104
181
|
name: {
|
|
105
182
|
type: "string",
|
|
106
|
-
description: "Slug name for the automation (lowercase, hyphens).
|
|
183
|
+
description: "Slug name for the automation (lowercase, hyphens). Used by define, update, and delete.",
|
|
107
184
|
},
|
|
108
185
|
trigger_type: {
|
|
109
186
|
type: "string",
|
|
110
|
-
description: '"event" or "schedule".',
|
|
187
|
+
description: '"event" or "schedule". Required for define.',
|
|
111
188
|
enum: ["event", "schedule"],
|
|
112
189
|
},
|
|
113
190
|
event: {
|
|
114
191
|
type: "string",
|
|
115
|
-
description: "For event triggers: the event name to subscribe to. Call list-
|
|
192
|
+
description: "For event triggers: the event name to subscribe to. Call with action=list-events first to see available events.",
|
|
116
193
|
},
|
|
117
194
|
schedule: {
|
|
118
195
|
type: "string",
|
|
@@ -120,156 +197,55 @@ export function createAutomationToolEntries(getCurrentUser) {
|
|
|
120
197
|
},
|
|
121
198
|
condition: {
|
|
122
199
|
type: "string",
|
|
123
|
-
description: 'Natural-language condition. Example: "attendee email ends with @builder.io". Leave empty for unconditional.',
|
|
200
|
+
description: 'Natural-language condition. Example: "attendee email ends with @builder.io". Leave empty for unconditional. Used by define and update.',
|
|
124
201
|
},
|
|
125
202
|
mode: {
|
|
126
203
|
type: "string",
|
|
127
|
-
description: '"agentic" (full agent loop, can use tools) or "deterministic" (fixed actions only).',
|
|
204
|
+
description: '"agentic" (full agent loop, can use tools) or "deterministic" (fixed actions only). Used by define.',
|
|
128
205
|
enum: ["agentic", "deterministic"],
|
|
129
206
|
},
|
|
130
207
|
domain: {
|
|
131
208
|
type: "string",
|
|
132
|
-
description: "Domain tag for grouping (mail, calendar, clips, etc.).",
|
|
209
|
+
description: "Domain tag for grouping (mail, calendar, clips, etc.). Used by define and list.",
|
|
133
210
|
},
|
|
134
211
|
body: {
|
|
135
212
|
type: "string",
|
|
136
|
-
description: "The natural-language instructions for what to do when the automation fires. This becomes the agent's prompt in agentic mode.",
|
|
137
|
-
},
|
|
138
|
-
},
|
|
139
|
-
required: ["name", "trigger_type", "body"],
|
|
140
|
-
},
|
|
141
|
-
},
|
|
142
|
-
run: async (args) => {
|
|
143
|
-
const owner = getCurrentUser();
|
|
144
|
-
const name = (args.name || "").replace(/[^a-z0-9-]/g, "-");
|
|
145
|
-
if (!name)
|
|
146
|
-
return "Error: name is required (lowercase, hyphens).";
|
|
147
|
-
const path = `jobs/${name}.md`;
|
|
148
|
-
// Check if it already exists
|
|
149
|
-
const existing = await resourceGetByPath(owner, path);
|
|
150
|
-
if (existing) {
|
|
151
|
-
return `Error: An automation named "${name}" already exists. Use a different name or delete the existing one first.`;
|
|
152
|
-
}
|
|
153
|
-
const triggerType = args.trigger_type === "schedule" ? "schedule" : "event";
|
|
154
|
-
const meta = {
|
|
155
|
-
schedule: args.schedule || "",
|
|
156
|
-
enabled: true,
|
|
157
|
-
triggerType,
|
|
158
|
-
event: args.event || undefined,
|
|
159
|
-
condition: args.condition || undefined,
|
|
160
|
-
mode: args.mode === "deterministic" ? "deterministic" : "agentic",
|
|
161
|
-
domain: args.domain || undefined,
|
|
162
|
-
createdBy: owner,
|
|
163
|
-
runAs: "creator",
|
|
164
|
-
};
|
|
165
|
-
const content = buildTriggerContent(meta, args.body || "");
|
|
166
|
-
await resourcePut(owner, path, content);
|
|
167
|
-
// Refresh event subscriptions so the new trigger is active immediately
|
|
168
|
-
await refreshEventSubscriptions();
|
|
169
|
-
const summary = triggerType === "event"
|
|
170
|
-
? `on ${meta.event || "?"}${meta.condition ? ` when "${meta.condition}"` : ""}`
|
|
171
|
-
: `on schedule "${meta.schedule}"`;
|
|
172
|
-
return `Automation "${name}" created. Fires ${summary} in ${meta.mode} mode.`;
|
|
173
|
-
},
|
|
174
|
-
},
|
|
175
|
-
"update-automation": {
|
|
176
|
-
tool: {
|
|
177
|
-
description: "Update an existing automation's settings (enabled, condition, body, etc.).",
|
|
178
|
-
parameters: {
|
|
179
|
-
type: "object",
|
|
180
|
-
properties: {
|
|
181
|
-
name: {
|
|
182
|
-
type: "string",
|
|
183
|
-
description: "Name of the automation to update.",
|
|
213
|
+
description: "The natural-language instructions for what to do when the automation fires. This becomes the agent's prompt in agentic mode. Used by define and update.",
|
|
184
214
|
},
|
|
185
215
|
enabled: {
|
|
186
216
|
type: "string",
|
|
187
|
-
description: '"true" or "false" to enable/disable.',
|
|
188
|
-
},
|
|
189
|
-
condition: {
|
|
190
|
-
type: "string",
|
|
191
|
-
description: "New natural-language condition (or empty to clear).",
|
|
192
|
-
},
|
|
193
|
-
body: {
|
|
194
|
-
type: "string",
|
|
195
|
-
description: "New automation body/instructions.",
|
|
217
|
+
description: '"true" or "false" to enable/disable. Used by update.',
|
|
196
218
|
},
|
|
197
|
-
|
|
198
|
-
required: ["name"],
|
|
199
|
-
},
|
|
200
|
-
},
|
|
201
|
-
run: async (args) => {
|
|
202
|
-
const owner = getCurrentUser();
|
|
203
|
-
const name = args.name;
|
|
204
|
-
const path = `jobs/${name}.md`;
|
|
205
|
-
const resource = await resourceGetByPath(owner, path);
|
|
206
|
-
if (!resource) {
|
|
207
|
-
return `Automation "${name}" not found (or you don't own it).`;
|
|
208
|
-
}
|
|
209
|
-
const { meta, body } = parseTriggerFrontmatter(resource.content);
|
|
210
|
-
if (args.enabled !== undefined) {
|
|
211
|
-
meta.enabled = args.enabled !== "false";
|
|
212
|
-
}
|
|
213
|
-
if (args.condition !== undefined) {
|
|
214
|
-
meta.condition = args.condition || undefined;
|
|
215
|
-
}
|
|
216
|
-
const newBody = args.body ?? body;
|
|
217
|
-
await resourcePut(resource.owner, resource.path, buildTriggerContent(meta, newBody));
|
|
218
|
-
await refreshEventSubscriptions();
|
|
219
|
-
return `Automation "${name}" updated.`;
|
|
220
|
-
},
|
|
221
|
-
},
|
|
222
|
-
"delete-automation": {
|
|
223
|
-
tool: {
|
|
224
|
-
description: "Delete an automation. Always confirm with the user first.",
|
|
225
|
-
parameters: {
|
|
226
|
-
type: "object",
|
|
227
|
-
properties: {
|
|
228
|
-
name: {
|
|
219
|
+
enabled_only: {
|
|
229
220
|
type: "string",
|
|
230
|
-
description: "
|
|
221
|
+
description: '"true" to show only enabled automations. Used by list.',
|
|
231
222
|
},
|
|
232
|
-
},
|
|
233
|
-
required: ["name"],
|
|
234
|
-
},
|
|
235
|
-
},
|
|
236
|
-
run: async (args) => {
|
|
237
|
-
const owner = getCurrentUser();
|
|
238
|
-
const path = `jobs/${args.name}.md`;
|
|
239
|
-
const resource = await resourceGetByPath(owner, path);
|
|
240
|
-
if (!resource)
|
|
241
|
-
return `Automation "${args.name}" not found.`;
|
|
242
|
-
await resourceDelete(resource.id);
|
|
243
|
-
return `Automation "${args.name}" deleted.`;
|
|
244
|
-
},
|
|
245
|
-
},
|
|
246
|
-
"fire-test-event": {
|
|
247
|
-
tool: {
|
|
248
|
-
description: "Fire a test event to validate automations. Emits a test.event.fired event with the provided data.",
|
|
249
|
-
parameters: {
|
|
250
|
-
type: "object",
|
|
251
|
-
properties: {
|
|
252
223
|
data: {
|
|
253
224
|
type: "string",
|
|
254
|
-
description: 'JSON data to include as the event payload. Example: \'{"email": "test@example.com"}\'.',
|
|
225
|
+
description: 'JSON data to include as the test event payload. Used by fire-test. Example: \'{"email": "test@example.com"}\'.',
|
|
255
226
|
},
|
|
256
227
|
},
|
|
228
|
+
required: ["action"],
|
|
257
229
|
},
|
|
258
230
|
},
|
|
259
231
|
run: async (args) => {
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
232
|
+
const action = args.action;
|
|
233
|
+
switch (action) {
|
|
234
|
+
case "list-events":
|
|
235
|
+
return handleListEvents();
|
|
236
|
+
case "list":
|
|
237
|
+
return handleList(args);
|
|
238
|
+
case "define":
|
|
239
|
+
return handleDefine(args, getCurrentUser);
|
|
240
|
+
case "update":
|
|
241
|
+
return handleUpdate(args, getCurrentUser);
|
|
242
|
+
case "delete":
|
|
243
|
+
return handleDelete(args, getCurrentUser);
|
|
244
|
+
case "fire-test":
|
|
245
|
+
return handleFireTest(args);
|
|
246
|
+
default:
|
|
247
|
+
return `Error: unknown action "${action}". Valid actions: ${VALID_ACTIONS.join(", ")}.`;
|
|
270
248
|
}
|
|
271
|
-
emit("test.event.fired", { data });
|
|
272
|
-
return `Test event fired with payload: ${JSON.stringify({ data })}. Any automations subscribed to "test.event.fired" will be evaluated.`;
|
|
273
249
|
},
|
|
274
250
|
},
|
|
275
251
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/triggers/actions.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/triggers/actions.ts"],"names":[],"mappings":"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"}
|
|
@@ -166,6 +166,6 @@ All reference types follow the same pattern: select from the popover, and the re
|
|
|
166
166
|
|
|
167
167
|
## Sub-agent selection {#sub-agent-selection}
|
|
168
168
|
|
|
169
|
-
The main agent can also use custom agents when spawning sub-agents with `spawn
|
|
169
|
+
The main agent can also use custom agents when spawning sub-agents with `agent-teams` (action: "spawn").
|
|
170
170
|
|
|
171
171
|
Pass the `agent` parameter to choose a profile from `agents/*.md`. That profile's instructions are added to the delegated run, and its `model` frontmatter can override the default model for that sub-agent.
|
|
@@ -85,15 +85,15 @@ Integrations register events at module load time. The bus validates payloads aga
|
|
|
85
85
|
|
|
86
86
|
### Built-in events {#built-in-events}
|
|
87
87
|
|
|
88
|
-
| Event | Source
|
|
89
|
-
| ---------------------- |
|
|
90
|
-
| `test.event.fired` | Manual / `fire-test
|
|
91
|
-
| `agent.turn.completed` | Agent chat
|
|
92
|
-
| `calendar.*` | Calendar integration
|
|
93
|
-
| `clip.*` | Clips integration
|
|
94
|
-
| `mail.*` | Mail integration
|
|
88
|
+
| Event | Source |
|
|
89
|
+
| ---------------------- | ---------------------------------------------- |
|
|
90
|
+
| `test.event.fired` | Manual / `manage-automations` action=fire-test |
|
|
91
|
+
| `agent.turn.completed` | Agent chat |
|
|
92
|
+
| `calendar.*` | Calendar integration |
|
|
93
|
+
| `clip.*` | Clips integration |
|
|
94
|
+
| `mail.*` | Mail integration |
|
|
95
95
|
|
|
96
|
-
Call `list-
|
|
96
|
+
Call `manage-automations` with `action=list-events` from the agent to see all registered events with descriptions and payload schemas for the current template.
|
|
97
97
|
|
|
98
98
|
### Emitting custom events {#emitting-events}
|
|
99
99
|
|
|
@@ -183,15 +183,18 @@ Keys are ad-hoc secrets created by users or the agent for automation use (e.g. `
|
|
|
183
183
|
|
|
184
184
|
## Agent tools {#agent-tools}
|
|
185
185
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
|
189
|
-
|
|
|
190
|
-
| `list-
|
|
191
|
-
| `
|
|
192
|
-
| `
|
|
193
|
-
| `
|
|
194
|
-
| `
|
|
186
|
+
All automation operations are accessed through a single `manage-automations` tool with an `action` parameter:
|
|
187
|
+
|
|
188
|
+
| Action | Purpose |
|
|
189
|
+
| ------------- | -------------------------------------------------------------------- |
|
|
190
|
+
| `list-events` | Discover all registered events with descriptions and payload schemas |
|
|
191
|
+
| `list` | List all automations with status; filter by domain or enabled |
|
|
192
|
+
| `define` | Create a new automation (name, trigger type, event, condition, body) |
|
|
193
|
+
| `update` | Update an existing automation (enabled, condition, body) |
|
|
194
|
+
| `delete` | Delete an automation (always confirms with user first) |
|
|
195
|
+
| `fire-test` | Emit a `test.event.fired` event to validate automations |
|
|
196
|
+
|
|
197
|
+
Additional tool: `web-request` — outbound HTTP with `${keys.NAME}` substitution.
|
|
195
198
|
|
|
196
199
|
## API endpoints {#api}
|
|
197
200
|
|
|
@@ -220,9 +223,9 @@ Keys are ad-hoc secrets created by users or the agent for automation use (e.g. `
|
|
|
220
223
|
|
|
221
224
|
**Agent flow:**
|
|
222
225
|
|
|
223
|
-
1. Calls `list-
|
|
226
|
+
1. Calls `manage-automations` with `action=list-events` — finds `calendar.booking.created`.
|
|
224
227
|
2. Confirms the plan with the user.
|
|
225
|
-
3. Calls `define
|
|
228
|
+
3. Calls `manage-automations` with `action=define`:
|
|
226
229
|
- `name`: `slack-on-builder-booking`
|
|
227
230
|
- `trigger_type`: `event`
|
|
228
231
|
- `event`: `calendar.booking.created`
|
|
@@ -49,7 +49,7 @@ Every cloneable SaaS follows the same lifecycle:
|
|
|
49
49
|
pnpm dlx @agent-native/core create my-platform
|
|
50
50
|
```
|
|
51
51
|
|
|
52
|
-
The CLI shows a multi-select picker. Pick one app (standalone) or several (workspace — apps share auth, brand, agent config, and database). Each picked template is scaffolded into `apps/<name>/` with every file you need. See [Getting Started](/docs) for the full flow or [
|
|
52
|
+
The CLI shows a multi-select picker. Pick one app (standalone) or several (workspace — apps share auth, brand, agent config, and database). Each picked template is scaffolded into `apps/<name>/` with every file you need. See [Getting Started](/docs) for the full flow or [Multi-App Workspace](/docs/multi-app-workspace) for the workspace story.
|
|
53
53
|
|
|
54
54
|
### 2. Use it immediately
|
|
55
55
|
|
|
@@ -92,7 +92,7 @@ Want to publish a new template — your own cloneable SaaS? See [Creating Templa
|
|
|
92
92
|
|
|
93
93
|
## What's next
|
|
94
94
|
|
|
95
|
-
- [**
|
|
95
|
+
- [**Multi-App Workspace**](/docs/multi-app-workspace) — bundle many cloneable-SaaS apps into one monorepo that shares auth, brand, and agent instructions
|
|
96
96
|
- [**Key Concepts**](/docs/key-concepts) — the architecture that makes this work
|
|
97
97
|
- [**Deployment**](/docs/deployment) — ship your forked app
|
|
98
98
|
- [**Creating Templates**](/docs/creating-templates) — author and publish a new cloneable SaaS
|