@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/jobs/tools.js
CHANGED
|
@@ -5,203 +5,179 @@ import { getRequestUserEmail, getRequestOrgId, } from "../server/request-context
|
|
|
5
5
|
function getOwner() {
|
|
6
6
|
return getRequestUserEmail() || "local@localhost";
|
|
7
7
|
}
|
|
8
|
+
async function runCreate(args) {
|
|
9
|
+
const { name, schedule, instructions, scope, runAs } = args;
|
|
10
|
+
if (!name || !schedule || !instructions) {
|
|
11
|
+
return JSON.stringify({
|
|
12
|
+
error: "name, schedule, and instructions are required",
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
if (!isValidCron(schedule)) {
|
|
16
|
+
return JSON.stringify({
|
|
17
|
+
error: `Invalid cron expression: "${schedule}". Use 5 fields: minute hour day-of-month month day-of-week.`,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
const owner = scope === "personal" ? getOwner() : SHARED_OWNER;
|
|
21
|
+
const path = `jobs/${name}.md`;
|
|
22
|
+
const now = new Date();
|
|
23
|
+
const next = nextOccurrence(schedule, now);
|
|
24
|
+
const meta = {
|
|
25
|
+
schedule,
|
|
26
|
+
enabled: true,
|
|
27
|
+
createdBy: getOwner(),
|
|
28
|
+
orgId: getRequestOrgId() || undefined,
|
|
29
|
+
runAs: runAs === "shared" ? "shared" : "creator",
|
|
30
|
+
nextRun: next.toISOString(),
|
|
31
|
+
};
|
|
32
|
+
const content = buildJobContent(meta, instructions);
|
|
33
|
+
await resourcePut(owner, path, content);
|
|
34
|
+
return JSON.stringify({
|
|
35
|
+
created: true,
|
|
36
|
+
name,
|
|
37
|
+
path,
|
|
38
|
+
schedule,
|
|
39
|
+
scheduleDescription: describeCron(schedule),
|
|
40
|
+
nextRun: next.toISOString(),
|
|
41
|
+
scope: scope || "shared",
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
async function runList(args) {
|
|
45
|
+
const owner = getOwner();
|
|
46
|
+
// Fetch only current user's and shared jobs (not other users')
|
|
47
|
+
const [personal, shared] = await Promise.all([
|
|
48
|
+
resourceList(owner, "jobs/"),
|
|
49
|
+
resourceList(SHARED_OWNER, "jobs/"),
|
|
50
|
+
]);
|
|
51
|
+
let resources = [...personal, ...shared];
|
|
52
|
+
if (args.scope === "personal")
|
|
53
|
+
resources = personal;
|
|
54
|
+
else if (args.scope === "shared")
|
|
55
|
+
resources = shared;
|
|
56
|
+
const metas = resources.filter((r) => r.path.endsWith(".md") && !r.path.endsWith(".keep"));
|
|
57
|
+
const jobs = await Promise.all(metas.map(async (r) => {
|
|
58
|
+
const full = await resourceGetByPath(r.owner, r.path);
|
|
59
|
+
const { meta } = parseJobFrontmatter(full?.content || "");
|
|
60
|
+
return {
|
|
61
|
+
name: r.path.replace(/^jobs\//, "").replace(/\.md$/, ""),
|
|
62
|
+
path: r.path,
|
|
63
|
+
scope: r.owner === SHARED_OWNER ? "shared" : "personal",
|
|
64
|
+
schedule: meta.schedule,
|
|
65
|
+
scheduleDescription: meta.schedule ? describeCron(meta.schedule) : "",
|
|
66
|
+
enabled: meta.enabled,
|
|
67
|
+
lastRun: meta.lastRun || null,
|
|
68
|
+
lastStatus: meta.lastStatus || null,
|
|
69
|
+
lastError: meta.lastError || null,
|
|
70
|
+
nextRun: meta.nextRun || null,
|
|
71
|
+
};
|
|
72
|
+
}));
|
|
73
|
+
if (jobs.length === 0) {
|
|
74
|
+
return "No recurring jobs configured. Use manage-jobs with action 'create' to create one.";
|
|
75
|
+
}
|
|
76
|
+
return JSON.stringify(jobs, null, 2);
|
|
77
|
+
}
|
|
78
|
+
async function runUpdate(args) {
|
|
79
|
+
const { name, schedule, instructions, enabled, scope, runAs } = args;
|
|
80
|
+
const path = `jobs/${name}.md`;
|
|
81
|
+
// Try to find the resource
|
|
82
|
+
let resource = await resourceGetByPath(SHARED_OWNER, path);
|
|
83
|
+
if (!resource && scope !== "shared") {
|
|
84
|
+
resource = await resourceGetByPath(getOwner(), path);
|
|
85
|
+
}
|
|
86
|
+
if (!resource) {
|
|
87
|
+
return JSON.stringify({ error: `Job "${name}" not found` });
|
|
88
|
+
}
|
|
89
|
+
const { meta, body } = parseJobFrontmatter(resource.content);
|
|
90
|
+
if (schedule) {
|
|
91
|
+
if (!isValidCron(schedule)) {
|
|
92
|
+
return JSON.stringify({
|
|
93
|
+
error: `Invalid cron expression: "${schedule}"`,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
meta.schedule = schedule;
|
|
97
|
+
meta.nextRun = nextOccurrence(schedule).toISOString();
|
|
98
|
+
}
|
|
99
|
+
if (enabled !== undefined) {
|
|
100
|
+
meta.enabled = enabled === "true";
|
|
101
|
+
}
|
|
102
|
+
if (runAs === "creator" || runAs === "shared") {
|
|
103
|
+
meta.runAs = runAs;
|
|
104
|
+
}
|
|
105
|
+
const newBody = instructions || body;
|
|
106
|
+
const content = buildJobContent(meta, newBody);
|
|
107
|
+
await resourcePut(resource.owner, resource.path, content);
|
|
108
|
+
return JSON.stringify({
|
|
109
|
+
updated: true,
|
|
110
|
+
name,
|
|
111
|
+
schedule: meta.schedule,
|
|
112
|
+
scheduleDescription: describeCron(meta.schedule),
|
|
113
|
+
enabled: meta.enabled,
|
|
114
|
+
nextRun: meta.nextRun,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
8
117
|
export function createJobTools() {
|
|
9
118
|
return {
|
|
10
|
-
"
|
|
119
|
+
"manage-jobs": {
|
|
11
120
|
tool: {
|
|
12
|
-
description:
|
|
121
|
+
description: `Manage recurring jobs that run on a cron schedule.
|
|
122
|
+
|
|
123
|
+
Actions:
|
|
124
|
+
- "create": Create a new recurring job. Requires name, schedule, and instructions.
|
|
125
|
+
- "list": List all recurring jobs and their status (schedule, enabled, last run, next run).
|
|
126
|
+
- "update": Update a job's schedule, instructions, or enabled state. Requires name.
|
|
127
|
+
|
|
128
|
+
Cron format is 5 fields: minute hour day-of-month month day-of-week. Common patterns: '0 9 * * *' (daily 9am), '0 9 * * 1-5' (weekdays 9am), '0 * * * *' (every hour), '0 9 * * 1' (Mondays 9am), '*/30 * * * *' (every 30 min).`,
|
|
13
129
|
parameters: {
|
|
14
130
|
type: "object",
|
|
15
131
|
properties: {
|
|
16
|
-
|
|
132
|
+
action: {
|
|
17
133
|
type: "string",
|
|
18
|
-
description: "
|
|
134
|
+
description: "The action to perform.",
|
|
135
|
+
enum: ["create", "list", "update"],
|
|
19
136
|
},
|
|
20
|
-
schedule: {
|
|
21
|
-
type: "string",
|
|
22
|
-
description: "Cron expression (5 fields: minute hour day-of-month month day-of-week). Examples: '0 9 * * 1-5' (weekdays 9am), '0 */2 * * *' (every 2 hours).",
|
|
23
|
-
},
|
|
24
|
-
instructions: {
|
|
25
|
-
type: "string",
|
|
26
|
-
description: "What the agent should do when this job runs. Be specific — include which actions to call and what to do with the results.",
|
|
27
|
-
},
|
|
28
|
-
scope: {
|
|
29
|
-
type: "string",
|
|
30
|
-
description: "personal (only your jobs) or shared (team jobs). Default: shared.",
|
|
31
|
-
enum: ["personal", "shared"],
|
|
32
|
-
},
|
|
33
|
-
runAs: {
|
|
34
|
-
type: "string",
|
|
35
|
-
description: "Who shared jobs execute as: creator or shared. Default: creator.",
|
|
36
|
-
enum: ["creator", "shared"],
|
|
37
|
-
},
|
|
38
|
-
},
|
|
39
|
-
required: ["name", "schedule", "instructions"],
|
|
40
|
-
},
|
|
41
|
-
},
|
|
42
|
-
run: async (args) => {
|
|
43
|
-
const { name, schedule, instructions, scope, runAs } = args;
|
|
44
|
-
if (!name || !schedule || !instructions) {
|
|
45
|
-
return JSON.stringify({
|
|
46
|
-
error: "name, schedule, and instructions are required",
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
if (!isValidCron(schedule)) {
|
|
50
|
-
return JSON.stringify({
|
|
51
|
-
error: `Invalid cron expression: "${schedule}". Use 5 fields: minute hour day-of-month month day-of-week.`,
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
const owner = scope === "personal" ? getOwner() : SHARED_OWNER;
|
|
55
|
-
const path = `jobs/${name}.md`;
|
|
56
|
-
const now = new Date();
|
|
57
|
-
const next = nextOccurrence(schedule, now);
|
|
58
|
-
const meta = {
|
|
59
|
-
schedule,
|
|
60
|
-
enabled: true,
|
|
61
|
-
createdBy: getOwner(),
|
|
62
|
-
orgId: getRequestOrgId() || undefined,
|
|
63
|
-
runAs: runAs === "shared" ? "shared" : "creator",
|
|
64
|
-
nextRun: next.toISOString(),
|
|
65
|
-
};
|
|
66
|
-
const content = buildJobContent(meta, instructions);
|
|
67
|
-
await resourcePut(owner, path, content);
|
|
68
|
-
return JSON.stringify({
|
|
69
|
-
created: true,
|
|
70
|
-
name,
|
|
71
|
-
path,
|
|
72
|
-
schedule,
|
|
73
|
-
scheduleDescription: describeCron(schedule),
|
|
74
|
-
nextRun: next.toISOString(),
|
|
75
|
-
scope: scope || "shared",
|
|
76
|
-
});
|
|
77
|
-
},
|
|
78
|
-
},
|
|
79
|
-
"list-jobs": {
|
|
80
|
-
tool: {
|
|
81
|
-
description: "List all recurring jobs and their status (schedule, enabled, last run, last status, next run).",
|
|
82
|
-
parameters: {
|
|
83
|
-
type: "object",
|
|
84
|
-
properties: {
|
|
85
|
-
scope: {
|
|
86
|
-
type: "string",
|
|
87
|
-
description: "Filter by scope: personal, shared, or all. Default: all.",
|
|
88
|
-
enum: ["personal", "shared", "all"],
|
|
89
|
-
},
|
|
90
|
-
},
|
|
91
|
-
},
|
|
92
|
-
},
|
|
93
|
-
run: async (args) => {
|
|
94
|
-
const owner = getOwner();
|
|
95
|
-
// Fetch only current user's and shared jobs (not other users')
|
|
96
|
-
const [personal, shared] = await Promise.all([
|
|
97
|
-
resourceList(owner, "jobs/"),
|
|
98
|
-
resourceList(SHARED_OWNER, "jobs/"),
|
|
99
|
-
]);
|
|
100
|
-
let resources = [...personal, ...shared];
|
|
101
|
-
if (args.scope === "personal")
|
|
102
|
-
resources = personal;
|
|
103
|
-
else if (args.scope === "shared")
|
|
104
|
-
resources = shared;
|
|
105
|
-
const metas = resources.filter((r) => r.path.endsWith(".md") && !r.path.endsWith(".keep"));
|
|
106
|
-
const jobs = await Promise.all(metas.map(async (r) => {
|
|
107
|
-
const full = await resourceGetByPath(r.owner, r.path);
|
|
108
|
-
const { meta } = parseJobFrontmatter(full?.content || "");
|
|
109
|
-
return {
|
|
110
|
-
name: r.path.replace(/^jobs\//, "").replace(/\.md$/, ""),
|
|
111
|
-
path: r.path,
|
|
112
|
-
scope: r.owner === SHARED_OWNER ? "shared" : "personal",
|
|
113
|
-
schedule: meta.schedule,
|
|
114
|
-
scheduleDescription: meta.schedule
|
|
115
|
-
? describeCron(meta.schedule)
|
|
116
|
-
: "",
|
|
117
|
-
enabled: meta.enabled,
|
|
118
|
-
lastRun: meta.lastRun || null,
|
|
119
|
-
lastStatus: meta.lastStatus || null,
|
|
120
|
-
lastError: meta.lastError || null,
|
|
121
|
-
nextRun: meta.nextRun || null,
|
|
122
|
-
};
|
|
123
|
-
}));
|
|
124
|
-
if (jobs.length === 0) {
|
|
125
|
-
return "No recurring jobs configured. Use create-job to create one.";
|
|
126
|
-
}
|
|
127
|
-
return JSON.stringify(jobs, null, 2);
|
|
128
|
-
},
|
|
129
|
-
},
|
|
130
|
-
"update-job": {
|
|
131
|
-
tool: {
|
|
132
|
-
description: "Update a recurring job's schedule, instructions, or enabled state.",
|
|
133
|
-
parameters: {
|
|
134
|
-
type: "object",
|
|
135
|
-
properties: {
|
|
136
137
|
name: {
|
|
137
138
|
type: "string",
|
|
138
|
-
description: "Job name (e.g. 'daily-scorecard-check')",
|
|
139
|
+
description: "Job name (hyphen-case, e.g. 'daily-scorecard-check'). Required for create and update.",
|
|
139
140
|
},
|
|
140
141
|
schedule: {
|
|
141
142
|
type: "string",
|
|
142
|
-
description: "
|
|
143
|
+
description: "Cron expression (5 fields: minute hour day-of-month month day-of-week). Required for create, optional for update.",
|
|
143
144
|
},
|
|
144
145
|
instructions: {
|
|
145
146
|
type: "string",
|
|
146
|
-
description: "
|
|
147
|
+
description: "What the agent should do when this job runs. Be specific — include which actions to call and what to do with the results. Required for create, optional for update.",
|
|
147
148
|
},
|
|
148
149
|
enabled: {
|
|
149
150
|
type: "string",
|
|
150
|
-
description: "Enable or disable: 'true' or 'false'
|
|
151
|
+
description: "Enable or disable a job: 'true' or 'false'. Only used with update.",
|
|
151
152
|
enum: ["true", "false"],
|
|
152
153
|
},
|
|
153
154
|
scope: {
|
|
154
155
|
type: "string",
|
|
155
|
-
description: "
|
|
156
|
+
description: "For create: personal or shared (default: shared). For list: personal, shared, or all (default: all). For update: which scope to search (default: all).",
|
|
156
157
|
enum: ["personal", "shared", "all"],
|
|
157
158
|
},
|
|
158
159
|
runAs: {
|
|
159
160
|
type: "string",
|
|
160
|
-
description: "
|
|
161
|
+
description: "Who shared jobs execute as: creator or shared. Default: creator. Used with create and update.",
|
|
161
162
|
enum: ["creator", "shared"],
|
|
162
163
|
},
|
|
163
164
|
},
|
|
164
|
-
required: ["
|
|
165
|
+
required: ["action"],
|
|
165
166
|
},
|
|
166
167
|
},
|
|
167
168
|
run: async (args) => {
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
return JSON.stringify({ error: `Job "${name}" not found` });
|
|
177
|
-
}
|
|
178
|
-
const { meta, body } = parseJobFrontmatter(resource.content);
|
|
179
|
-
if (schedule) {
|
|
180
|
-
if (!isValidCron(schedule)) {
|
|
169
|
+
switch (args.action) {
|
|
170
|
+
case "create":
|
|
171
|
+
return runCreate(args);
|
|
172
|
+
case "list":
|
|
173
|
+
return runList(args);
|
|
174
|
+
case "update":
|
|
175
|
+
return runUpdate(args);
|
|
176
|
+
default:
|
|
181
177
|
return JSON.stringify({
|
|
182
|
-
error: `
|
|
178
|
+
error: `Unknown action "${args.action}". Use "create", "list", or "update".`,
|
|
183
179
|
});
|
|
184
|
-
}
|
|
185
|
-
meta.schedule = schedule;
|
|
186
|
-
meta.nextRun = nextOccurrence(schedule).toISOString();
|
|
187
|
-
}
|
|
188
|
-
if (enabled !== undefined) {
|
|
189
|
-
meta.enabled = enabled === "true";
|
|
190
|
-
}
|
|
191
|
-
if (runAs === "creator" || runAs === "shared") {
|
|
192
|
-
meta.runAs = runAs;
|
|
193
180
|
}
|
|
194
|
-
const newBody = instructions || body;
|
|
195
|
-
const content = buildJobContent(meta, newBody);
|
|
196
|
-
await resourcePut(resource.owner, resource.path, content);
|
|
197
|
-
return JSON.stringify({
|
|
198
|
-
updated: true,
|
|
199
|
-
name,
|
|
200
|
-
schedule: meta.schedule,
|
|
201
|
-
scheduleDescription: describeCron(meta.schedule),
|
|
202
|
-
enabled: meta.enabled,
|
|
203
|
-
nextRun: meta.nextRun,
|
|
204
|
-
});
|
|
205
181
|
},
|
|
206
182
|
},
|
|
207
183
|
};
|
package/dist/jobs/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/jobs/tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EACL,mBAAmB,EACnB,eAAe,GAEhB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,WAAW,
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/jobs/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Framework-level agent actions for the notifications primitive.
|
|
3
3
|
*
|
|
4
4
|
* Registered as native tools (not template actions) so they're available in
|
|
5
|
-
* every template.
|
|
6
|
-
*
|
|
5
|
+
* every template. Consolidated into a single `manage-notifications` tool with
|
|
6
|
+
* an `action` parameter that dispatches to the correct implementation.
|
|
7
7
|
*/
|
|
8
8
|
import type { ActionEntry } from "../agent/production-agent.js";
|
|
9
9
|
export declare function createNotificationToolEntries(getCurrentUser: () => string): Record<string, ActionEntry>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/notifications/actions.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAIhE,wBAAgB,6BAA6B,CAC3C,cAAc,EAAE,MAAM,MAAM,GAC3B,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/notifications/actions.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAIhE,wBAAgB,6BAA6B,CAC3C,cAAc,EAAE,MAAM,MAAM,GAC3B,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAkI7B"}
|
|
@@ -2,112 +2,120 @@
|
|
|
2
2
|
* Framework-level agent actions for the notifications primitive.
|
|
3
3
|
*
|
|
4
4
|
* Registered as native tools (not template actions) so they're available in
|
|
5
|
-
* every template.
|
|
6
|
-
*
|
|
5
|
+
* every template. Consolidated into a single `manage-notifications` tool with
|
|
6
|
+
* an `action` parameter that dispatches to the correct implementation.
|
|
7
7
|
*/
|
|
8
8
|
import { notify, listNotifications, countUnread } from "./registry.js";
|
|
9
9
|
export function createNotificationToolEntries(getCurrentUser) {
|
|
10
10
|
return {
|
|
11
|
-
|
|
11
|
+
"manage-notifications": {
|
|
12
12
|
tool: {
|
|
13
|
-
description:
|
|
13
|
+
description: [
|
|
14
|
+
"Manage user notifications. Available actions:",
|
|
15
|
+
"",
|
|
16
|
+
'• action="send" — Send a notification to the user. Persisted to the in-app inbox so the bell + toast surface shows it. Registered channels (webhook, Slack, etc.) also run.',
|
|
17
|
+
" Required: severity, title. Optional: body, metadataJson, channels.",
|
|
18
|
+
"",
|
|
19
|
+
'• action="list" — List recent notifications for the current user. Useful when the user asks about prior alerts.',
|
|
20
|
+
" Optional: unreadOnly (boolean), limit (number, default 20, max 200).",
|
|
21
|
+
].join("\n"),
|
|
14
22
|
parameters: {
|
|
15
23
|
type: "object",
|
|
16
24
|
properties: {
|
|
25
|
+
action: {
|
|
26
|
+
type: "string",
|
|
27
|
+
enum: ["send", "list"],
|
|
28
|
+
description: "The notification action to perform.",
|
|
29
|
+
},
|
|
17
30
|
severity: {
|
|
18
31
|
type: "string",
|
|
19
32
|
enum: ["info", "warning", "critical"],
|
|
20
|
-
description:
|
|
33
|
+
description: '(send) Severity level — drives styling and per-severity channel routing. Use "info" for FYI, "warning" for things the user should look at, "critical" for things that need immediate attention.',
|
|
21
34
|
},
|
|
22
35
|
title: {
|
|
23
36
|
type: "string",
|
|
24
|
-
description: "Short, human-readable headline (≤100 chars).",
|
|
37
|
+
description: "(send) Short, human-readable headline (≤100 chars).",
|
|
25
38
|
},
|
|
26
39
|
body: {
|
|
27
40
|
type: "string",
|
|
28
|
-
description: "Optional longer description.",
|
|
41
|
+
description: "(send) Optional longer description.",
|
|
29
42
|
},
|
|
30
43
|
metadataJson: {
|
|
31
44
|
type: "string",
|
|
32
|
-
description: 'Optional JSON metadata (URLs, entity ids, etc.). Example: \'{"threadId":"abc","link":"/inbox/abc"}\'.',
|
|
45
|
+
description: '(send) Optional JSON metadata (URLs, entity ids, etc.). Example: \'{"threadId":"abc","link":"/inbox/abc"}\'.',
|
|
33
46
|
},
|
|
34
47
|
channels: {
|
|
35
48
|
type: "string",
|
|
36
|
-
description: 'Optional comma-separated channel allowlist (e.g. "inbox,webhook"). Omit to run all registered channels.',
|
|
49
|
+
description: '(send) Optional comma-separated channel allowlist (e.g. "inbox,webhook"). Omit to run all registered channels.',
|
|
37
50
|
},
|
|
38
|
-
},
|
|
39
|
-
required: ["severity", "title"],
|
|
40
|
-
},
|
|
41
|
-
},
|
|
42
|
-
run: async (args) => {
|
|
43
|
-
const owner = getCurrentUser();
|
|
44
|
-
if (!args.severity || !args.title) {
|
|
45
|
-
return "Error: --severity and --title are required.";
|
|
46
|
-
}
|
|
47
|
-
const severity = args.severity;
|
|
48
|
-
if (!["info", "warning", "critical"].includes(severity)) {
|
|
49
|
-
return `Error: severity must be info, warning, or critical (got "${severity}").`;
|
|
50
|
-
}
|
|
51
|
-
let metadata;
|
|
52
|
-
if (args.metadataJson) {
|
|
53
|
-
try {
|
|
54
|
-
metadata = JSON.parse(args.metadataJson);
|
|
55
|
-
}
|
|
56
|
-
catch {
|
|
57
|
-
return "Error: metadataJson must be valid JSON.";
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
const channels = args.channels
|
|
61
|
-
? args.channels
|
|
62
|
-
.split(",")
|
|
63
|
-
.map((s) => s.trim())
|
|
64
|
-
.filter(Boolean)
|
|
65
|
-
: undefined;
|
|
66
|
-
const stored = await notify({
|
|
67
|
-
severity,
|
|
68
|
-
title: args.title,
|
|
69
|
-
body: args.body || undefined,
|
|
70
|
-
metadata,
|
|
71
|
-
channels,
|
|
72
|
-
}, { owner });
|
|
73
|
-
return stored
|
|
74
|
-
? `Notification sent (id: ${stored.id})`
|
|
75
|
-
: "Notification dispatched to channels (not persisted).";
|
|
76
|
-
},
|
|
77
|
-
},
|
|
78
|
-
"list-notifications": {
|
|
79
|
-
tool: {
|
|
80
|
-
description: "List recent notifications for the current user. Useful when the user asks about prior alerts.",
|
|
81
|
-
parameters: {
|
|
82
|
-
type: "object",
|
|
83
|
-
properties: {
|
|
84
51
|
unreadOnly: {
|
|
85
52
|
type: "boolean",
|
|
86
|
-
description: "When true, only include unread notifications.",
|
|
53
|
+
description: "(list) When true, only include unread notifications.",
|
|
87
54
|
},
|
|
88
55
|
limit: {
|
|
89
56
|
type: "number",
|
|
90
|
-
description: "Max rows to return (default 20, max 200).",
|
|
57
|
+
description: "(list) Max rows to return (default 20, max 200).",
|
|
91
58
|
},
|
|
92
59
|
},
|
|
60
|
+
required: ["action"],
|
|
93
61
|
},
|
|
94
62
|
},
|
|
95
63
|
run: async (args) => {
|
|
96
64
|
const owner = getCurrentUser();
|
|
97
|
-
const
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
65
|
+
const action = args.action;
|
|
66
|
+
switch (action) {
|
|
67
|
+
case "send": {
|
|
68
|
+
if (!args.severity || !args.title) {
|
|
69
|
+
return "Error: severity and title are required for action=send.";
|
|
70
|
+
}
|
|
71
|
+
const severity = args.severity;
|
|
72
|
+
if (!["info", "warning", "critical"].includes(severity)) {
|
|
73
|
+
return `Error: severity must be info, warning, or critical (got "${severity}").`;
|
|
74
|
+
}
|
|
75
|
+
let metadata;
|
|
76
|
+
if (args.metadataJson) {
|
|
77
|
+
try {
|
|
78
|
+
metadata = JSON.parse(args.metadataJson);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return "Error: metadataJson must be valid JSON.";
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
const channels = typeof args.channels === "string"
|
|
85
|
+
? args.channels
|
|
86
|
+
.split(",")
|
|
87
|
+
.map((s) => s.trim())
|
|
88
|
+
.filter(Boolean)
|
|
89
|
+
: undefined;
|
|
90
|
+
const stored = await notify({
|
|
91
|
+
severity,
|
|
92
|
+
title: args.title,
|
|
93
|
+
body: args.body || undefined,
|
|
94
|
+
metadata,
|
|
95
|
+
channels,
|
|
96
|
+
}, { owner });
|
|
97
|
+
return stored
|
|
98
|
+
? `Notification sent (id: ${stored.id})`
|
|
99
|
+
: "Notification dispatched to channels (not persisted).";
|
|
100
|
+
}
|
|
101
|
+
case "list": {
|
|
102
|
+
const rows = await listNotifications(owner, {
|
|
103
|
+
unreadOnly: args.unreadOnly === true || args.unreadOnly === "true",
|
|
104
|
+
limit: Math.min(Number(args.limit ?? 20), 200),
|
|
105
|
+
});
|
|
106
|
+
if (rows.length === 0) {
|
|
107
|
+
return args.unreadOnly
|
|
108
|
+
? "No unread notifications."
|
|
109
|
+
: "No notifications.";
|
|
110
|
+
}
|
|
111
|
+
const unreadCount = await countUnread(owner);
|
|
112
|
+
const lines = rows.map((n) => `[${n.readAt ? " " : "•"}] (${n.severity}) ${n.title}${n.body ? ` — ${n.body}` : ""} · ${n.createdAt}`);
|
|
113
|
+
return `${unreadCount} unread\n\n${lines.join("\n")}`;
|
|
114
|
+
}
|
|
115
|
+
default:
|
|
116
|
+
return `Error: unknown action "${action}". Must be one of: send, list.`;
|
|
105
117
|
}
|
|
106
|
-
const unreadCount = await countUnread(owner);
|
|
107
|
-
const lines = rows.map((n) => `[${n.readAt ? " " : "•"}] (${n.severity}) ${n.title}${n.body ? ` — ${n.body}` : ""} · ${n.createdAt}`);
|
|
108
|
-
return `${unreadCount} unread\n\n${lines.join("\n")}`;
|
|
109
118
|
},
|
|
110
|
-
readOnly: true,
|
|
111
119
|
},
|
|
112
120
|
};
|
|
113
121
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/notifications/actions.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGvE,MAAM,UAAU,6BAA6B,CAC3C,cAA4B;IAE5B,OAAO;QACL,
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/notifications/actions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { EvalResult, EvalCriteria } from "./types.js";
|
|
2
|
+
import type { AgentEngine } from "../agent/engine/types.js";
|
|
3
|
+
export declare function runAutomatedEvals(runId: string): Promise<EvalResult[]>;
|
|
4
|
+
export declare function runLlmJudgeEval(runId: string, criteria: EvalCriteria, opts?: {
|
|
5
|
+
engine?: AgentEngine;
|
|
6
|
+
model?: string;
|
|
7
|
+
userId?: string | null;
|
|
8
|
+
}): Promise<EvalResult | null>;
|
|
9
|
+
export declare function runDatasetEval(datasetId: string, opts?: {
|
|
10
|
+
criteria?: EvalCriteria[];
|
|
11
|
+
engine?: AgentEngine;
|
|
12
|
+
model?: string;
|
|
13
|
+
}): Promise<{
|
|
14
|
+
datasetId: string;
|
|
15
|
+
totalCases: number;
|
|
16
|
+
avgScore: number;
|
|
17
|
+
results: EvalResult[];
|
|
18
|
+
}>;
|
|
19
|
+
export declare function evaluateRun(runId: string, opts?: {
|
|
20
|
+
sampleRate?: number;
|
|
21
|
+
}): Promise<EvalResult[]>;
|
|
22
|
+
//# sourceMappingURL=evals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evals.d.ts","sourceRoot":"","sources":["../../src/observability/evals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,YAAY,EAGb,MAAM,YAAY,CAAC;AAGpB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AA0I5D,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAsB5E;AA2DD,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,YAAY,EACtB,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,WAAW,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACtE,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CA6E5B;AAID,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACzE,OAAO,CAAC;IACT,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB,CAAC,CAkDD;AAuGD,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7B,OAAO,CAAC,UAAU,EAAE,CAAC,CA6BvB"}
|