Merged via squash. Prepared head SHA: ffa45893e0ea72bc21b48d0ea227253ba207eec0 Co-authored-by: jalehman <550978+jalehman@users.noreply.github.com> Co-authored-by: jalehman <550978+jalehman@users.noreply.github.com> Reviewed-by: @jalehman
140 lines
4.9 KiB
TypeScript
140 lines
4.9 KiB
TypeScript
import { Type } from "@sinclair/typebox";
|
|
import { InputProvenanceSchema, NonEmptyString, SessionLabelString } from "./primitives.js";
|
|
|
|
export const AgentInternalEventSchema = Type.Object(
|
|
{
|
|
type: Type.Literal("task_completion"),
|
|
source: Type.String({ enum: ["subagent", "cron"] }),
|
|
childSessionKey: Type.String(),
|
|
childSessionId: Type.Optional(Type.String()),
|
|
announceType: Type.String(),
|
|
taskLabel: Type.String(),
|
|
status: Type.String({ enum: ["ok", "timeout", "error", "unknown"] }),
|
|
statusLabel: Type.String(),
|
|
result: Type.String(),
|
|
statsLine: Type.Optional(Type.String()),
|
|
replyInstruction: Type.String(),
|
|
},
|
|
{ additionalProperties: false },
|
|
);
|
|
|
|
export const AgentEventSchema = Type.Object(
|
|
{
|
|
runId: NonEmptyString,
|
|
seq: Type.Integer({ minimum: 0 }),
|
|
stream: NonEmptyString,
|
|
ts: Type.Integer({ minimum: 0 }),
|
|
data: Type.Record(Type.String(), Type.Unknown()),
|
|
},
|
|
{ additionalProperties: false },
|
|
);
|
|
|
|
export const SendParamsSchema = Type.Object(
|
|
{
|
|
to: NonEmptyString,
|
|
message: Type.Optional(Type.String()),
|
|
mediaUrl: Type.Optional(Type.String()),
|
|
mediaUrls: Type.Optional(Type.Array(Type.String())),
|
|
gifPlayback: Type.Optional(Type.Boolean()),
|
|
channel: Type.Optional(Type.String()),
|
|
accountId: Type.Optional(Type.String()),
|
|
/** Optional agent id for per-agent media root resolution on gateway sends. */
|
|
agentId: Type.Optional(Type.String()),
|
|
/** Thread id (channel-specific meaning, e.g. Telegram forum topic id). */
|
|
threadId: Type.Optional(Type.String()),
|
|
/** Optional session key for mirroring delivered output back into the transcript. */
|
|
sessionKey: Type.Optional(Type.String()),
|
|
idempotencyKey: NonEmptyString,
|
|
},
|
|
{ additionalProperties: false },
|
|
);
|
|
|
|
export const PollParamsSchema = Type.Object(
|
|
{
|
|
to: NonEmptyString,
|
|
question: NonEmptyString,
|
|
options: Type.Array(NonEmptyString, { minItems: 2, maxItems: 12 }),
|
|
maxSelections: Type.Optional(Type.Integer({ minimum: 1, maximum: 12 })),
|
|
/** Poll duration in seconds (channel-specific limits may apply). */
|
|
durationSeconds: Type.Optional(Type.Integer({ minimum: 1, maximum: 604_800 })),
|
|
durationHours: Type.Optional(Type.Integer({ minimum: 1 })),
|
|
/** Send silently (no notification) where supported. */
|
|
silent: Type.Optional(Type.Boolean()),
|
|
/** Poll anonymity where supported (e.g. Telegram polls default to anonymous). */
|
|
isAnonymous: Type.Optional(Type.Boolean()),
|
|
/** Thread id (channel-specific meaning, e.g. Telegram forum topic id). */
|
|
threadId: Type.Optional(Type.String()),
|
|
channel: Type.Optional(Type.String()),
|
|
accountId: Type.Optional(Type.String()),
|
|
idempotencyKey: NonEmptyString,
|
|
},
|
|
{ additionalProperties: false },
|
|
);
|
|
|
|
export const AgentParamsSchema = Type.Object(
|
|
{
|
|
message: NonEmptyString,
|
|
agentId: Type.Optional(NonEmptyString),
|
|
provider: Type.Optional(Type.String()),
|
|
model: Type.Optional(Type.String()),
|
|
to: Type.Optional(Type.String()),
|
|
replyTo: Type.Optional(Type.String()),
|
|
sessionId: Type.Optional(Type.String()),
|
|
sessionKey: Type.Optional(Type.String()),
|
|
thinking: Type.Optional(Type.String()),
|
|
deliver: Type.Optional(Type.Boolean()),
|
|
attachments: Type.Optional(Type.Array(Type.Unknown())),
|
|
channel: Type.Optional(Type.String()),
|
|
replyChannel: Type.Optional(Type.String()),
|
|
accountId: Type.Optional(Type.String()),
|
|
replyAccountId: Type.Optional(Type.String()),
|
|
threadId: Type.Optional(Type.String()),
|
|
groupId: Type.Optional(Type.String()),
|
|
groupChannel: Type.Optional(Type.String()),
|
|
groupSpace: Type.Optional(Type.String()),
|
|
timeout: Type.Optional(Type.Integer({ minimum: 0 })),
|
|
bestEffortDeliver: Type.Optional(Type.Boolean()),
|
|
lane: Type.Optional(Type.String()),
|
|
extraSystemPrompt: Type.Optional(Type.String()),
|
|
internalEvents: Type.Optional(Type.Array(AgentInternalEventSchema)),
|
|
inputProvenance: Type.Optional(InputProvenanceSchema),
|
|
idempotencyKey: NonEmptyString,
|
|
label: Type.Optional(SessionLabelString),
|
|
},
|
|
{ additionalProperties: false },
|
|
);
|
|
|
|
export const AgentIdentityParamsSchema = Type.Object(
|
|
{
|
|
agentId: Type.Optional(NonEmptyString),
|
|
sessionKey: Type.Optional(Type.String()),
|
|
},
|
|
{ additionalProperties: false },
|
|
);
|
|
|
|
export const AgentIdentityResultSchema = Type.Object(
|
|
{
|
|
agentId: NonEmptyString,
|
|
name: Type.Optional(NonEmptyString),
|
|
avatar: Type.Optional(NonEmptyString),
|
|
emoji: Type.Optional(NonEmptyString),
|
|
},
|
|
{ additionalProperties: false },
|
|
);
|
|
|
|
export const AgentWaitParamsSchema = Type.Object(
|
|
{
|
|
runId: NonEmptyString,
|
|
timeoutMs: Type.Optional(Type.Integer({ minimum: 0 })),
|
|
},
|
|
{ additionalProperties: false },
|
|
);
|
|
|
|
export const WakeParamsSchema = Type.Object(
|
|
{
|
|
mode: Type.Union([Type.Literal("now"), Type.Literal("next-heartbeat")]),
|
|
text: NonEmptyString,
|
|
},
|
|
{ additionalProperties: false },
|
|
);
|