@agent-native/core 0.7.12 → 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/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/registry.d.ts +20 -1
- package/dist/agent/engine/registry.d.ts.map +1 -1
- package/dist/agent/engine/registry.js +49 -1
- 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.map +1 -1
- package/dist/agent/production-agent.js +65 -7
- 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 +25 -13
- package/dist/cli/create.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 +49 -10
- 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 +30 -9
- 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 +9 -5
- 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 +112 -12
- 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 +6 -5
- 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.js +1 -1
- 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.js +2 -2
- 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 +707 -443
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-teams.js +1 -1
- package/dist/server/agent-teams.js.map +1 -1
- package/dist/server/analytics.d.ts +5 -6
- package/dist/server/analytics.d.ts.map +1 -1
- package/dist/server/analytics.js +6 -14
- 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 +10 -1
- 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 +208 -6
- 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/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 +9 -2
- package/src/templates/default/.agents/skills/progress/SKILL.md +14 -12
- package/src/templates/default/app/root.tsx +7 -0
|
@@ -22,25 +22,27 @@ Separate concern from `notifications`:
|
|
|
22
22
|
|
|
23
23
|
Common pattern: on completion, emit a `notify()` so the user sees the outcome when they're not actively watching the tray.
|
|
24
24
|
|
|
25
|
-
##
|
|
25
|
+
## Tool
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
All progress operations go through a single `manage-progress` tool with an `action` parameter:
|
|
28
|
+
|
|
29
|
+
| Action | Purpose |
|
|
28
30
|
|---|---|
|
|
29
|
-
| `start
|
|
30
|
-
| `update
|
|
31
|
-
| `complete
|
|
32
|
-
| `list
|
|
31
|
+
| `start` | Mark the start of a long task. Returns a runId. |
|
|
32
|
+
| `update` | Update percent and/or current step. Call frequently. |
|
|
33
|
+
| `complete` | Mark terminal status: `succeeded`, `failed`, `cancelled`. |
|
|
34
|
+
| `list` | List recent runs (all or `--active=true`). |
|
|
33
35
|
|
|
34
36
|
## Canonical Flow
|
|
35
37
|
|
|
36
38
|
```
|
|
37
|
-
|
|
39
|
+
manage-progress --action=start --title "Triage 128 unread emails" --step "Fetching inbox"
|
|
38
40
|
→ runId=abc
|
|
39
41
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
+
manage-progress --action=update --runId=abc --percent=25 --step="Classifying 32/128"
|
|
43
|
+
manage-progress --action=update --runId=abc --percent=75 --step="Drafting replies 97/128"
|
|
42
44
|
|
|
43
|
-
|
|
45
|
+
manage-progress --action=complete --runId=abc --status=succeeded
|
|
44
46
|
notify --severity=info --title="Triage done" --body="12 archived, 6 drafts ready to review"
|
|
45
47
|
```
|
|
46
48
|
|
|
@@ -48,9 +50,9 @@ notify --severity=info --title="Triage done" --body="12 archived, 6 drafts ready
|
|
|
48
50
|
|
|
49
51
|
- **Start a run for anything > ~5 seconds.** Users want feedback; a spinner with no context feels frozen.
|
|
50
52
|
- **Update at natural checkpoints**, not every iteration. Every 5–10% is enough for most UIs.
|
|
51
|
-
- **Always call `complete
|
|
53
|
+
- **Always call `manage-progress --action=complete`** at the end — including the error path. An orphaned `running` row is worse than no row.
|
|
52
54
|
- **Pair with `notify`** on completion. The tray tells users what's *running*; notifications tell them what *finished*.
|
|
53
|
-
- **Use `metadataJson`** on `start
|
|
55
|
+
- **Use `metadataJson`** on `manage-progress --action=start` to pass a link back to the produced artifact (thread id, document path), so the UI can deep-link from the runs tray.
|
|
54
56
|
|
|
55
57
|
## Runs API
|
|
56
58
|
|
|
@@ -16,6 +16,13 @@ import { ThemeProvider } from "next-themes";
|
|
|
16
16
|
import { useDbSync } from "@agent-native/core";
|
|
17
17
|
import { ClientOnly, DefaultSpinner } from "@agent-native/core/client";
|
|
18
18
|
import { Toaster } from "sonner";
|
|
19
|
+
import { configureTracking } from "@agent-native/core/client";
|
|
20
|
+
configureTracking({
|
|
21
|
+
getDefaultProps: (_name, properties) => ({
|
|
22
|
+
...properties,
|
|
23
|
+
app: "{{APP_NAME}}",
|
|
24
|
+
}),
|
|
25
|
+
});
|
|
19
26
|
import "./global.css";
|
|
20
27
|
|
|
21
28
|
export function Layout({ children }: { children: React.ReactNode }) {
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface BuilderTranscribeOptions {
|
|
2
|
+
audioBytes: Uint8Array;
|
|
3
|
+
mimeType: string;
|
|
4
|
+
diarize?: boolean;
|
|
5
|
+
minSpeakers?: number;
|
|
6
|
+
maxSpeakers?: number;
|
|
7
|
+
language?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface BuilderTranscribeResult {
|
|
10
|
+
text: string;
|
|
11
|
+
language: string;
|
|
12
|
+
durationSeconds: number;
|
|
13
|
+
segments: Array<{
|
|
14
|
+
startMs: number;
|
|
15
|
+
endMs: number;
|
|
16
|
+
text: string;
|
|
17
|
+
speakerLabel?: string;
|
|
18
|
+
words?: Array<{
|
|
19
|
+
startMs: number;
|
|
20
|
+
endMs: number;
|
|
21
|
+
text: string;
|
|
22
|
+
confidence?: number;
|
|
23
|
+
}>;
|
|
24
|
+
}>;
|
|
25
|
+
}
|
|
26
|
+
export declare function transcribeWithBuilder(opts: BuilderTranscribeOptions): Promise<BuilderTranscribeResult>;
|
|
27
|
+
//# sourceMappingURL=builder-transcription.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder-transcription.d.ts","sourceRoot":"","sources":["../../src/transcription/builder-transcription.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,KAAK,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,KAAK,CAAC,EAAE,KAAK,CAAC;YACZ,OAAO,EAAE,MAAM,CAAC;YAChB,KAAK,EAAE,MAAM,CAAC;YACd,IAAI,EAAE,MAAM,CAAC;YACb,UAAU,CAAC,EAAE,MAAM,CAAC;SACrB,CAAC,CAAC;KACJ,CAAC,CAAC;CACJ;AAED,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,wBAAwB,GAC7B,OAAO,CAAC,uBAAuB,CAAC,CAqDlC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { hasBuilderPrivateKey, getBuilderProxyOrigin, getBuilderAuthHeader, } from "../server/credential-provider.js";
|
|
2
|
+
export async function transcribeWithBuilder(opts) {
|
|
3
|
+
if (!hasBuilderPrivateKey()) {
|
|
4
|
+
throw new Error("Builder private key not configured. Connect your Builder.io account in Settings.");
|
|
5
|
+
}
|
|
6
|
+
const authHeader = getBuilderAuthHeader();
|
|
7
|
+
if (!authHeader) {
|
|
8
|
+
throw new Error("Could not generate Builder auth header.");
|
|
9
|
+
}
|
|
10
|
+
const params = new URLSearchParams();
|
|
11
|
+
params.set("mimeType", opts.mimeType);
|
|
12
|
+
if (opts.diarize != null)
|
|
13
|
+
params.set("diarize", String(opts.diarize));
|
|
14
|
+
if (opts.minSpeakers != null)
|
|
15
|
+
params.set("minSpeakers", String(opts.minSpeakers));
|
|
16
|
+
if (opts.maxSpeakers != null)
|
|
17
|
+
params.set("maxSpeakers", String(opts.maxSpeakers));
|
|
18
|
+
if (opts.language)
|
|
19
|
+
params.set("language", opts.language);
|
|
20
|
+
const url = `${getBuilderProxyOrigin()}/agent-native/transcribe-audio?${params.toString()}`;
|
|
21
|
+
// Copy to a plain ArrayBuffer so TS6 accepts it as BodyInit (Uint8Array
|
|
22
|
+
// with ArrayBufferLike doesn't satisfy the strict BlobPart/BodyInit types).
|
|
23
|
+
const body = opts.audioBytes.buffer.slice(opts.audioBytes.byteOffset, opts.audioBytes.byteOffset + opts.audioBytes.byteLength);
|
|
24
|
+
const res = await fetch(url, {
|
|
25
|
+
method: "POST",
|
|
26
|
+
headers: {
|
|
27
|
+
Authorization: authHeader,
|
|
28
|
+
"Content-Type": "application/octet-stream",
|
|
29
|
+
},
|
|
30
|
+
body,
|
|
31
|
+
});
|
|
32
|
+
if (res.status === 402) {
|
|
33
|
+
throw new Error("Builder transcription credits exhausted. Upgrade your plan or switch to OpenAI Whisper in Settings.");
|
|
34
|
+
}
|
|
35
|
+
if (!res.ok) {
|
|
36
|
+
const text = await res.text().catch(() => "");
|
|
37
|
+
throw new Error(`Builder transcription failed (${res.status}): ${text.slice(0, 300)}`);
|
|
38
|
+
}
|
|
39
|
+
return (await res.json());
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=builder-transcription.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder-transcription.js","sourceRoot":"","sources":["../../src/transcription/builder-transcription.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,kCAAkC,CAAC;AA6B1C,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,IAA8B;IAE9B,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,kFAAkF,CACnF,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,oBAAoB,EAAE,CAAC;IAC1C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;IACrC,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtC,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI;QAAE,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACtE,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI;QAC1B,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IACtD,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI;QAC1B,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IACtD,IAAI,IAAI,CAAC,QAAQ;QAAE,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEzD,MAAM,GAAG,GAAG,GAAG,qBAAqB,EAAE,kCAAkC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;IAE5F,wEAAwE;IACxE,4EAA4E;IAC5E,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CACvC,IAAI,CAAC,UAAU,CAAC,UAAU,EAC1B,IAAI,CAAC,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CACzC,CAAC;IAEjB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,aAAa,EAAE,UAAU;YACzB,cAAc,EAAE,0BAA0B;SAC3C;QACD,IAAI;KACL,CAAC,CAAC;IAEH,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,qGAAqG,CACtG,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,IAAI,KAAK,CACb,iCAAiC,GAAG,CAAC,MAAM,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CACtE,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA4B,CAAC;AACvD,CAAC"}
|
|
@@ -4,6 +4,9 @@
|
|
|
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 type { ActionEntry } from "../agent/production-agent.js";
|
|
9
12
|
export declare function createAutomationToolEntries(getCurrentUser: () => string): Record<string, ActionEntry>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/triggers/actions.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/triggers/actions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAiMhE,wBAAgB,2BAA2B,CACzC,cAAc,EAAE,MAAM,MAAM,GAC3B,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAuG7B"}
|
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
|
};
|