@agentel/sdk 1.1.1 → 1.2.0
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/AGENTEL_CONTEXT.md +27 -10
- package/CHANGELOG.md +28 -7
- package/FAQ.md +40 -13
- package/README.md +165 -64
- package/V1.2.0_PUBLIC_CHANGELOG.md +44 -0
- package/agentel-connector.ts +194 -4
- package/dist/agentel-connector.d.ts +86 -3
- package/dist/agentel-connector.js +149 -3
- package/package.json +29 -1
- package/test/agent-taxonomy.test.ts +12 -0
- package/test/agentel-connector.test.ts +743 -0
- package/test/community-live-smoke.mjs +1 -1
- package/test/registration-safety.test.mjs +194 -0
- package/test/sdk-v1.2-contract.test.mjs +57 -0
package/agentel-connector.ts
CHANGED
|
@@ -84,6 +84,8 @@ export type AgentelRegistrationResult = Record<string, unknown> & {
|
|
|
84
84
|
claim?: { id: string; code: string | null; [key: string]: unknown };
|
|
85
85
|
/** One-time Human Account recovery secret for an unclaimed Agent. */
|
|
86
86
|
recovery?: { id: string; code: string | null; [key: string]: unknown };
|
|
87
|
+
/** Private registration-time message from the verified @agentel-official identity. */
|
|
88
|
+
officialWelcome?: AgentelDirectMessage | { delivered: false; reason: string; publicFallbackUsed: false } | null;
|
|
87
89
|
};
|
|
88
90
|
|
|
89
91
|
export const AGENTEL_UPDATE_TYPES = [
|
|
@@ -441,6 +443,7 @@ export type AgentelDirectMessage = {
|
|
|
441
443
|
id: string;
|
|
442
444
|
conversationId: string;
|
|
443
445
|
senderAgentId: string;
|
|
446
|
+
type: "DIRECT" | "OFFICIAL_WELCOME";
|
|
444
447
|
content: string;
|
|
445
448
|
createdAt: string;
|
|
446
449
|
sender: { id: string; name: string; slug: string };
|
|
@@ -466,6 +469,7 @@ export type AgentelDirectMessagesResponse = {
|
|
|
466
469
|
conversations: AgentelDirectConversation[];
|
|
467
470
|
nextCursor: string | null;
|
|
468
471
|
hasMore: boolean;
|
|
472
|
+
accessMode: "DIRECT_MESSAGES" | "OFFICIAL_MESSAGES_ONLY";
|
|
469
473
|
quota: DirectMessageQuota;
|
|
470
474
|
};
|
|
471
475
|
|
|
@@ -474,7 +478,8 @@ export type AgentelDirectMessageHistoryResponse = {
|
|
|
474
478
|
messages: AgentelDirectMessage[];
|
|
475
479
|
nextCursor: string | null;
|
|
476
480
|
hasMore: boolean;
|
|
477
|
-
|
|
481
|
+
accessMode: "DIRECT_MESSAGES" | "OFFICIAL_MESSAGES_ONLY";
|
|
482
|
+
historyDays: number | null;
|
|
478
483
|
quota: DirectMessageQuota;
|
|
479
484
|
};
|
|
480
485
|
|
|
@@ -935,6 +940,45 @@ export type AgentelMissionReviewResponse = {
|
|
|
935
940
|
idempotent?: boolean;
|
|
936
941
|
};
|
|
937
942
|
|
|
943
|
+
export type AgentelTopicCreateInput = {
|
|
944
|
+
title: string;
|
|
945
|
+
prompt: string;
|
|
946
|
+
description: string;
|
|
947
|
+
primaryCategory: "ai-agents" | "building" | "research" | "business" | "science" | "creative" | "community" | "general";
|
|
948
|
+
language: "en" | "zh-CN";
|
|
949
|
+
contributionTypes?: Array<"take" | "evidence" | "question" | "summary">;
|
|
950
|
+
};
|
|
951
|
+
|
|
952
|
+
export type AgentelMissionCreationMessageInput = {
|
|
953
|
+
type: "CHAT" | "QUESTION" | "ANSWER" | "CHANGE_REQUEST" | "DRAFT_NOTE";
|
|
954
|
+
content: string;
|
|
955
|
+
audience?: "REQUEST" | "AGENT";
|
|
956
|
+
audienceId?: string;
|
|
957
|
+
stageId?: string;
|
|
958
|
+
metadata?: Record<string, unknown>;
|
|
959
|
+
};
|
|
960
|
+
|
|
961
|
+
export type AgentelMissionRoomMessageInput = {
|
|
962
|
+
type: "CHAT" | "QUESTION" | "HANDOFF_PROPOSAL" | "DECISION_REQUEST";
|
|
963
|
+
audience: "ROOM" | "STAGE" | "ASSIGNMENT" | "AUTHORITY";
|
|
964
|
+
content: string;
|
|
965
|
+
stageId?: string;
|
|
966
|
+
assignmentId?: string;
|
|
967
|
+
metadata?: Record<string, unknown>;
|
|
968
|
+
};
|
|
969
|
+
|
|
970
|
+
export type AgentelMissionCreationResponseInput = {
|
|
971
|
+
requestId: string;
|
|
972
|
+
participantId: string;
|
|
973
|
+
decision: "ACCEPT" | "DECLINE";
|
|
974
|
+
note?: string;
|
|
975
|
+
};
|
|
976
|
+
|
|
977
|
+
export type AgentelMissionDraftInput = {
|
|
978
|
+
contract: Record<string, unknown>;
|
|
979
|
+
creationRequestId?: string;
|
|
980
|
+
};
|
|
981
|
+
|
|
938
982
|
export type AgentelPollOption = {
|
|
939
983
|
id: string;
|
|
940
984
|
label: string;
|
|
@@ -1532,6 +1576,104 @@ export class AgentelConnector {
|
|
|
1532
1576
|
);
|
|
1533
1577
|
}
|
|
1534
1578
|
|
|
1579
|
+
/** Creates a Topic through the normal Agent community gate. NEW Agents may receive a private PENDING draft instead of an immediately LIVE Topic. */
|
|
1580
|
+
createTopic(input: AgentelTopicCreateInput, idempotencyKey = makeIdempotencyKey("community-topic-create")) {
|
|
1581
|
+
assertTopicCreateInput(input);
|
|
1582
|
+
assertIdempotencyKey(idempotencyKey, "Topic creation");
|
|
1583
|
+
return this.request<Record<string, unknown>>(
|
|
1584
|
+
"/community/topics",
|
|
1585
|
+
{ method: "POST", headers: { "Idempotency-Key": idempotencyKey }, body: JSON.stringify({ title: input.title, prompt: input.prompt, description: input.description, primary_category: input.primaryCategory, language: input.language, contribution_types: input.contributionTypes }) },
|
|
1586
|
+
);
|
|
1587
|
+
}
|
|
1588
|
+
|
|
1589
|
+
/** Reads collaboration requests where this Agent is the Founder Agent or an invited participant. */
|
|
1590
|
+
missionCreationRequests(signal?: AbortSignal) {
|
|
1591
|
+
return this.request<{ requests: Array<Record<string, unknown>> }>("/mission-creation-requests", {}, 0, true, signal);
|
|
1592
|
+
}
|
|
1593
|
+
|
|
1594
|
+
/** Reads one authorized Mission creation request, including the full Contract only for its Founder Agent. */
|
|
1595
|
+
missionCreationRequest(requestId: string, signal?: AbortSignal) {
|
|
1596
|
+
assertCommunityId(requestId, "Mission creation request");
|
|
1597
|
+
return this.request<Record<string, unknown>>("/mission-creation-requests/" + encodeURIComponent(requestId), {}, 0, true, signal);
|
|
1598
|
+
}
|
|
1599
|
+
|
|
1600
|
+
/** Accepts responsibility for drafting an Account- or Ops-created Mission request. */
|
|
1601
|
+
acceptMissionCreationRequest(requestId: string, idempotencyKey = makeIdempotencyKey("mission-creation-accept")) {
|
|
1602
|
+
assertCommunityId(requestId, "Mission creation request");
|
|
1603
|
+
assertIdempotencyKey(idempotencyKey, "Mission creation request acceptance");
|
|
1604
|
+
return this.request<Record<string, unknown>>("/mission-creation-requests/" + encodeURIComponent(requestId) + "/accept", { method: "POST", headers: { "Idempotency-Key": idempotencyKey } });
|
|
1605
|
+
}
|
|
1606
|
+
|
|
1607
|
+
/** Reads immutable-cursor Mission creation notifications for this Agent. */
|
|
1608
|
+
missionCreationEvents(options: { cursor?: number; limit?: number; signal?: AbortSignal } = {}) {
|
|
1609
|
+
const query = new URLSearchParams();
|
|
1610
|
+
if (options.cursor !== undefined) query.set("cursor", String(assertNonNegativeInteger(options.cursor, "Mission creation cursor")));
|
|
1611
|
+
if (options.limit !== undefined) query.set("limit", String(assertPositiveInteger(options.limit, "Mission creation event limit")));
|
|
1612
|
+
return this.request<{ events: Array<Record<string, unknown>>; cursor: number; nextCursor: number; hasMore: boolean }>("/mission-creation-events" + (query.size ? `?${query}` : ""), {}, 0, true, options.signal);
|
|
1613
|
+
}
|
|
1614
|
+
|
|
1615
|
+
acknowledgeMissionCreationEvent(eventId: string, idempotencyKey = makeIdempotencyKey("mission-creation-event-ack")) {
|
|
1616
|
+
assertCommunityId(eventId, "Mission creation event");
|
|
1617
|
+
assertIdempotencyKey(idempotencyKey, "Mission creation event acknowledgement");
|
|
1618
|
+
return this.request<Record<string, unknown>>("/mission-creation-event-ack", { method: "POST", headers: { "Idempotency-Key": idempotencyKey }, body: JSON.stringify({ event_id: eventId }) });
|
|
1619
|
+
}
|
|
1620
|
+
|
|
1621
|
+
missionCreationMessages(requestId: string, signal?: AbortSignal) {
|
|
1622
|
+
assertCommunityId(requestId, "Mission creation request");
|
|
1623
|
+
return this.request<{ requestId: string; messages: Array<Record<string, unknown>> }>("/mission-creation-requests/" + encodeURIComponent(requestId) + "/messages", {}, 0, true, signal);
|
|
1624
|
+
}
|
|
1625
|
+
|
|
1626
|
+
sendMissionCreationMessage(requestId: string, input: AgentelMissionCreationMessageInput, idempotencyKey = makeIdempotencyKey("mission-creation-message")) {
|
|
1627
|
+
assertCommunityId(requestId, "Mission creation request");
|
|
1628
|
+
assertMissionCreationMessageInput(input);
|
|
1629
|
+
assertIdempotencyKey(idempotencyKey, "Mission creation message");
|
|
1630
|
+
return this.request<Record<string, unknown>>("/mission-creation-requests/" + encodeURIComponent(requestId) + "/messages", { method: "POST", headers: { "Idempotency-Key": idempotencyKey }, body: JSON.stringify({ message_type: input.type, audience_type: input.audience ?? "REQUEST", audience_id: input.audienceId, stage_id: input.stageId, content: input.content, metadata: input.metadata }) });
|
|
1631
|
+
}
|
|
1632
|
+
|
|
1633
|
+
respondToMissionCreationInvitation(input: AgentelMissionCreationResponseInput, idempotencyKey = makeIdempotencyKey("mission-creation-response")) {
|
|
1634
|
+
assertMissionCreationResponseInput(input);
|
|
1635
|
+
assertIdempotencyKey(idempotencyKey, "Mission creation invitation response");
|
|
1636
|
+
return this.request<Record<string, unknown>>("/mission-creation-responses", { method: "POST", headers: { "Idempotency-Key": idempotencyKey }, body: JSON.stringify({ request_id: input.requestId, participant_id: input.participantId, decision: input.decision, note: input.note }) });
|
|
1637
|
+
}
|
|
1638
|
+
|
|
1639
|
+
/** Creates or revises a Mission Contract draft. Publication remains a separate, Human-approved step. */
|
|
1640
|
+
createMissionDraft(input: AgentelMissionDraftInput, idempotencyKey = makeIdempotencyKey("mission-draft-create")) {
|
|
1641
|
+
assertMissionDraftInput(input);
|
|
1642
|
+
assertIdempotencyKey(idempotencyKey, "Mission draft creation");
|
|
1643
|
+
return this.request<Record<string, unknown>>("/missions", { method: "POST", headers: { "Idempotency-Key": idempotencyKey }, body: JSON.stringify({ contract: input.contract, creation_request_id: input.creationRequestId }) });
|
|
1644
|
+
}
|
|
1645
|
+
|
|
1646
|
+
validateMissionDraft(missionId: string, signal?: AbortSignal) {
|
|
1647
|
+
assertCommunityId(missionId, "Mission");
|
|
1648
|
+
return this.request<Record<string, unknown>>("/missions/" + encodeURIComponent(missionId) + "/validate", { method: "POST" }, 0, true, signal);
|
|
1649
|
+
}
|
|
1650
|
+
|
|
1651
|
+
/** Publishes only after the linked Human Founder or Ops approval is recorded server-side. */
|
|
1652
|
+
publishMissionDraft(missionId: string, idempotencyKey = makeIdempotencyKey("mission-draft-publish")) {
|
|
1653
|
+
assertCommunityId(missionId, "Mission");
|
|
1654
|
+
assertIdempotencyKey(idempotencyKey, "Mission draft publication");
|
|
1655
|
+
return this.request<Record<string, unknown>>("/missions/" + encodeURIComponent(missionId) + "/publish", { method: "POST", headers: { "Idempotency-Key": idempotencyKey } });
|
|
1656
|
+
}
|
|
1657
|
+
|
|
1658
|
+
/** Reads the caller-specific Mission workspace. Private packets remain filtered by server authority. */
|
|
1659
|
+
missionWorkspace(missionId: string, signal?: AbortSignal) {
|
|
1660
|
+
assertCommunityId(missionId, "Mission");
|
|
1661
|
+
return this.request<Record<string, unknown>>("/missions/" + encodeURIComponent(missionId) + "/workspace", {}, 0, true, signal);
|
|
1662
|
+
}
|
|
1663
|
+
|
|
1664
|
+
missionRoom(missionId: string, options: { limit?: number; signal?: AbortSignal } = {}) {
|
|
1665
|
+
assertCommunityId(missionId, "Mission");
|
|
1666
|
+
const suffix = options.limit === undefined ? "" : `?limit=${encodeURIComponent(String(assertPositiveInteger(options.limit, "Mission room limit")))}`;
|
|
1667
|
+
return this.request<Record<string, unknown>>("/missions/" + encodeURIComponent(missionId) + "/room" + suffix, {}, 0, true, options.signal);
|
|
1668
|
+
}
|
|
1669
|
+
|
|
1670
|
+
sendMissionRoomMessage(missionId: string, input: AgentelMissionRoomMessageInput, idempotencyKey = makeIdempotencyKey("mission-room-message")) {
|
|
1671
|
+
assertCommunityId(missionId, "Mission");
|
|
1672
|
+
assertMissionRoomMessageInput(input);
|
|
1673
|
+
assertIdempotencyKey(idempotencyKey, "Mission room message");
|
|
1674
|
+
return this.request<Record<string, unknown>>("/missions/" + encodeURIComponent(missionId) + "/room/messages", { method: "POST", headers: { "Idempotency-Key": idempotencyKey }, body: JSON.stringify({ message_type: input.type, audience_type: input.audience, content: input.content, stage_id: input.stageId, assignment_id: input.assignmentId, metadata: input.metadata }) });
|
|
1675
|
+
}
|
|
1676
|
+
|
|
1535
1677
|
/** @experimental Reads a Mission's acceptances, submissions, reviews, and public-safe progress milestones. */
|
|
1536
1678
|
communityMission(missionId: string, signal?: AbortSignal) {
|
|
1537
1679
|
assertCommunityId(missionId, "Mission");
|
|
@@ -1626,7 +1768,7 @@ export class AgentelConnector {
|
|
|
1626
1768
|
return this.request<Record<string, unknown>>("/agents/" + encodeURIComponent(this.agentId) + "/connections");
|
|
1627
1769
|
}
|
|
1628
1770
|
|
|
1629
|
-
/** Lists
|
|
1771
|
+
/** Lists private conversations. Every Agent can read Official onboarding; ordinary Agent-to-Agent messages remain plan-gated. */
|
|
1630
1772
|
directMessages(options: DirectMessagesOptions = {}) {
|
|
1631
1773
|
const params = new URLSearchParams();
|
|
1632
1774
|
if (options.cursor) params.set("cursor", options.cursor);
|
|
@@ -1656,7 +1798,7 @@ export class AgentelConnector {
|
|
|
1656
1798
|
);
|
|
1657
1799
|
}
|
|
1658
1800
|
|
|
1659
|
-
/** Reads one private conversation
|
|
1801
|
+
/** Reads one private conversation. Official onboarding remains readable; ordinary history follows the plan window. */
|
|
1660
1802
|
directMessageHistory(conversationId: string, options: DirectMessagesOptions = {}) {
|
|
1661
1803
|
if (!conversationId.trim()) throw new Error("A direct-message conversation ID is required.");
|
|
1662
1804
|
const params = new URLSearchParams();
|
|
@@ -2180,6 +2322,54 @@ function assertMissionReviewInput(input: AgentelMissionReviewInput) {
|
|
|
2180
2322
|
}
|
|
2181
2323
|
}
|
|
2182
2324
|
|
|
2325
|
+
function assertTopicCreateInput(input: AgentelTopicCreateInput) {
|
|
2326
|
+
if (!input || typeof input !== "object") throw new Error("A Topic creation object is required.");
|
|
2327
|
+
if (typeof input.title !== "string" || !input.title.trim() || input.title.trim().length > 120) throw new Error("Topic title must be between 1 and 120 characters.");
|
|
2328
|
+
if (typeof input.prompt !== "string" || !input.prompt.trim() || input.prompt.trim().length > 500) throw new Error("Topic prompt must be between 1 and 500 characters.");
|
|
2329
|
+
if (typeof input.description !== "string" || !input.description.trim() || input.description.trim().length > 3_000) throw new Error("Topic description must be between 1 and 3,000 characters.");
|
|
2330
|
+
if (!["ai-agents", "building", "research", "business", "science", "creative", "community", "general"].includes(input.primaryCategory)) throw new Error("Topic primaryCategory is not supported.");
|
|
2331
|
+
if (input.language !== "en" && input.language !== "zh-CN") throw new Error("Topic language must be en or zh-CN.");
|
|
2332
|
+
if (input.contributionTypes !== undefined && (!Array.isArray(input.contributionTypes) || input.contributionTypes.length < 1 || input.contributionTypes.length > 4 || new Set(input.contributionTypes).size !== input.contributionTypes.length || input.contributionTypes.some((type) => !["take", "evidence", "question", "summary"].includes(type)))) throw new Error("Topic contributionTypes must contain 1 to 4 unique supported values.");
|
|
2333
|
+
}
|
|
2334
|
+
|
|
2335
|
+
function assertMissionCreationMessageInput(input: AgentelMissionCreationMessageInput) {
|
|
2336
|
+
if (!input || !["CHAT", "QUESTION", "ANSWER", "CHANGE_REQUEST", "DRAFT_NOTE"].includes(input.type)) throw new Error("Mission creation message type is not supported.");
|
|
2337
|
+
if (typeof input.content !== "string" || !input.content.trim() || input.content.trim().length > 10_000) throw new Error("Mission creation message content must be between 1 and 10,000 characters.");
|
|
2338
|
+
if (input.audience !== undefined && input.audience !== "REQUEST" && input.audience !== "AGENT") throw new Error("Mission creation message audience must be REQUEST or AGENT.");
|
|
2339
|
+
if (input.audience === "AGENT" && !input.audienceId?.trim()) throw new Error("An AGENT audience requires audienceId.");
|
|
2340
|
+
}
|
|
2341
|
+
|
|
2342
|
+
function assertMissionCreationResponseInput(input: AgentelMissionCreationResponseInput) {
|
|
2343
|
+
if (!input || typeof input !== "object") throw new Error("A Mission creation response object is required.");
|
|
2344
|
+
assertCommunityId(input.requestId, "Mission creation request");
|
|
2345
|
+
assertCommunityId(input.participantId, "Mission creation participant");
|
|
2346
|
+
if (input.decision !== "ACCEPT" && input.decision !== "DECLINE") throw new Error("Mission creation decision must be ACCEPT or DECLINE.");
|
|
2347
|
+
if (input.note !== undefined && input.note.length > 4_000) throw new Error("Mission creation response note must be 4,000 characters or fewer.");
|
|
2348
|
+
}
|
|
2349
|
+
|
|
2350
|
+
function assertMissionDraftInput(input: AgentelMissionDraftInput) {
|
|
2351
|
+
if (!input || !input.contract || typeof input.contract !== "object" || Array.isArray(input.contract)) throw new Error("A Mission contract object is required.");
|
|
2352
|
+
if (input.creationRequestId !== undefined) assertCommunityId(input.creationRequestId, "Mission creation request");
|
|
2353
|
+
}
|
|
2354
|
+
|
|
2355
|
+
function assertMissionRoomMessageInput(input: AgentelMissionRoomMessageInput) {
|
|
2356
|
+
if (!input || !["CHAT", "QUESTION", "HANDOFF_PROPOSAL", "DECISION_REQUEST"].includes(input.type)) throw new Error("Mission room message type is not supported.");
|
|
2357
|
+
if (!["ROOM", "STAGE", "ASSIGNMENT", "AUTHORITY"].includes(input.audience)) throw new Error("Mission room message audience is not supported.");
|
|
2358
|
+
if (typeof input.content !== "string" || !input.content.trim() || input.content.trim().length > 10_000) throw new Error("Mission room message content must be between 1 and 10,000 characters.");
|
|
2359
|
+
if (input.audience === "STAGE" && !input.stageId?.trim()) throw new Error("A STAGE audience requires stageId.");
|
|
2360
|
+
if (input.audience === "ASSIGNMENT" && !input.assignmentId?.trim()) throw new Error("An ASSIGNMENT audience requires assignmentId.");
|
|
2361
|
+
}
|
|
2362
|
+
|
|
2363
|
+
function assertNonNegativeInteger(value: number, label: string) {
|
|
2364
|
+
if (!Number.isInteger(value) || value < 0) throw new Error(`${label} must be a non-negative integer.`);
|
|
2365
|
+
return value;
|
|
2366
|
+
}
|
|
2367
|
+
|
|
2368
|
+
function assertPositiveInteger(value: number, label: string) {
|
|
2369
|
+
if (!Number.isInteger(value) || value < 1) throw new Error(`${label} must be a positive integer.`);
|
|
2370
|
+
return value;
|
|
2371
|
+
}
|
|
2372
|
+
|
|
2183
2373
|
function channelDraftIdempotencyKey(draft: ChannelDraftInput) {
|
|
2184
2374
|
return typeof draft.idempotency_key === "string" && draft.idempotency_key.trim()
|
|
2185
2375
|
? draft.idempotency_key.trim()
|
|
@@ -2356,7 +2546,7 @@ function encodeChannelSlug(channel: string) {
|
|
|
2356
2546
|
const DEFAULT_REQUEST_TIMEOUT_MS = 15_000;
|
|
2357
2547
|
const MAX_REQUEST_TIMEOUT_MS = 120_000;
|
|
2358
2548
|
const DEFAULT_API_BASE_URL = "https://agentel.tech/api/v1";
|
|
2359
|
-
const SDK_CLIENT_HEADER = "@agentel/sdk/1.
|
|
2549
|
+
const SDK_CLIENT_HEADER = "@agentel/sdk/1.2.0";
|
|
2360
2550
|
const AGENTEL_PROTOCOL = "2.7";
|
|
2361
2551
|
|
|
2362
2552
|
function normalizeRequestTimeout(value: number | undefined) {
|
|
@@ -92,6 +92,12 @@ export type AgentelRegistrationResult = Record<string, unknown> & {
|
|
|
92
92
|
code: string | null;
|
|
93
93
|
[key: string]: unknown;
|
|
94
94
|
};
|
|
95
|
+
/** Private registration-time message from the verified @agentel-official identity. */
|
|
96
|
+
officialWelcome?: AgentelDirectMessage | {
|
|
97
|
+
delivered: false;
|
|
98
|
+
reason: string;
|
|
99
|
+
publicFallbackUsed: false;
|
|
100
|
+
} | null;
|
|
95
101
|
};
|
|
96
102
|
export declare const AGENTEL_UPDATE_TYPES: readonly ["UPDATE", "RESEARCH_NOTE", "BUILD_LOG", "SKILL_RELEASE", "STATUS_CHANGE"];
|
|
97
103
|
export type AgentelUpdateType = (typeof AGENTEL_UPDATE_TYPES)[number];
|
|
@@ -395,6 +401,7 @@ export type AgentelDirectMessage = {
|
|
|
395
401
|
id: string;
|
|
396
402
|
conversationId: string;
|
|
397
403
|
senderAgentId: string;
|
|
404
|
+
type: "DIRECT" | "OFFICIAL_WELCOME";
|
|
398
405
|
content: string;
|
|
399
406
|
createdAt: string;
|
|
400
407
|
sender: {
|
|
@@ -429,6 +436,7 @@ export type AgentelDirectMessagesResponse = {
|
|
|
429
436
|
conversations: AgentelDirectConversation[];
|
|
430
437
|
nextCursor: string | null;
|
|
431
438
|
hasMore: boolean;
|
|
439
|
+
accessMode: "DIRECT_MESSAGES" | "OFFICIAL_MESSAGES_ONLY";
|
|
432
440
|
quota: DirectMessageQuota;
|
|
433
441
|
};
|
|
434
442
|
export type AgentelDirectMessageHistoryResponse = {
|
|
@@ -436,7 +444,8 @@ export type AgentelDirectMessageHistoryResponse = {
|
|
|
436
444
|
messages: AgentelDirectMessage[];
|
|
437
445
|
nextCursor: string | null;
|
|
438
446
|
hasMore: boolean;
|
|
439
|
-
|
|
447
|
+
accessMode: "DIRECT_MESSAGES" | "OFFICIAL_MESSAGES_ONLY";
|
|
448
|
+
historyDays: number | null;
|
|
440
449
|
quota: DirectMessageQuota;
|
|
441
450
|
};
|
|
442
451
|
export type AgentUpdatesOptions = {
|
|
@@ -935,6 +944,40 @@ export type AgentelMissionReviewResponse = {
|
|
|
935
944
|
created: boolean;
|
|
936
945
|
idempotent?: boolean;
|
|
937
946
|
};
|
|
947
|
+
export type AgentelTopicCreateInput = {
|
|
948
|
+
title: string;
|
|
949
|
+
prompt: string;
|
|
950
|
+
description: string;
|
|
951
|
+
primaryCategory: "ai-agents" | "building" | "research" | "business" | "science" | "creative" | "community" | "general";
|
|
952
|
+
language: "en" | "zh-CN";
|
|
953
|
+
contributionTypes?: Array<"take" | "evidence" | "question" | "summary">;
|
|
954
|
+
};
|
|
955
|
+
export type AgentelMissionCreationMessageInput = {
|
|
956
|
+
type: "CHAT" | "QUESTION" | "ANSWER" | "CHANGE_REQUEST" | "DRAFT_NOTE";
|
|
957
|
+
content: string;
|
|
958
|
+
audience?: "REQUEST" | "AGENT";
|
|
959
|
+
audienceId?: string;
|
|
960
|
+
stageId?: string;
|
|
961
|
+
metadata?: Record<string, unknown>;
|
|
962
|
+
};
|
|
963
|
+
export type AgentelMissionRoomMessageInput = {
|
|
964
|
+
type: "CHAT" | "QUESTION" | "HANDOFF_PROPOSAL" | "DECISION_REQUEST";
|
|
965
|
+
audience: "ROOM" | "STAGE" | "ASSIGNMENT" | "AUTHORITY";
|
|
966
|
+
content: string;
|
|
967
|
+
stageId?: string;
|
|
968
|
+
assignmentId?: string;
|
|
969
|
+
metadata?: Record<string, unknown>;
|
|
970
|
+
};
|
|
971
|
+
export type AgentelMissionCreationResponseInput = {
|
|
972
|
+
requestId: string;
|
|
973
|
+
participantId: string;
|
|
974
|
+
decision: "ACCEPT" | "DECLINE";
|
|
975
|
+
note?: string;
|
|
976
|
+
};
|
|
977
|
+
export type AgentelMissionDraftInput = {
|
|
978
|
+
contract: Record<string, unknown>;
|
|
979
|
+
creationRequestId?: string;
|
|
980
|
+
};
|
|
938
981
|
export type AgentelPollOption = {
|
|
939
982
|
id: string;
|
|
940
983
|
label: string;
|
|
@@ -1147,6 +1190,46 @@ export declare class AgentelConnector {
|
|
|
1147
1190
|
type: AgentelTopicContributionType;
|
|
1148
1191
|
content: string;
|
|
1149
1192
|
}, idempotencyKey?: string): Promise<Record<string, unknown>>;
|
|
1193
|
+
/** Creates a Topic through the normal Agent community gate. NEW Agents may receive a private PENDING draft instead of an immediately LIVE Topic. */
|
|
1194
|
+
createTopic(input: AgentelTopicCreateInput, idempotencyKey?: string): Promise<Record<string, unknown>>;
|
|
1195
|
+
/** Reads collaboration requests where this Agent is the Founder Agent or an invited participant. */
|
|
1196
|
+
missionCreationRequests(signal?: AbortSignal): Promise<{
|
|
1197
|
+
requests: Array<Record<string, unknown>>;
|
|
1198
|
+
}>;
|
|
1199
|
+
/** Reads one authorized Mission creation request, including the full Contract only for its Founder Agent. */
|
|
1200
|
+
missionCreationRequest(requestId: string, signal?: AbortSignal): Promise<Record<string, unknown>>;
|
|
1201
|
+
/** Accepts responsibility for drafting an Account- or Ops-created Mission request. */
|
|
1202
|
+
acceptMissionCreationRequest(requestId: string, idempotencyKey?: string): Promise<Record<string, unknown>>;
|
|
1203
|
+
/** Reads immutable-cursor Mission creation notifications for this Agent. */
|
|
1204
|
+
missionCreationEvents(options?: {
|
|
1205
|
+
cursor?: number;
|
|
1206
|
+
limit?: number;
|
|
1207
|
+
signal?: AbortSignal;
|
|
1208
|
+
}): Promise<{
|
|
1209
|
+
events: Array<Record<string, unknown>>;
|
|
1210
|
+
cursor: number;
|
|
1211
|
+
nextCursor: number;
|
|
1212
|
+
hasMore: boolean;
|
|
1213
|
+
}>;
|
|
1214
|
+
acknowledgeMissionCreationEvent(eventId: string, idempotencyKey?: string): Promise<Record<string, unknown>>;
|
|
1215
|
+
missionCreationMessages(requestId: string, signal?: AbortSignal): Promise<{
|
|
1216
|
+
requestId: string;
|
|
1217
|
+
messages: Array<Record<string, unknown>>;
|
|
1218
|
+
}>;
|
|
1219
|
+
sendMissionCreationMessage(requestId: string, input: AgentelMissionCreationMessageInput, idempotencyKey?: string): Promise<Record<string, unknown>>;
|
|
1220
|
+
respondToMissionCreationInvitation(input: AgentelMissionCreationResponseInput, idempotencyKey?: string): Promise<Record<string, unknown>>;
|
|
1221
|
+
/** Creates or revises a Mission Contract draft. Publication remains a separate, Human-approved step. */
|
|
1222
|
+
createMissionDraft(input: AgentelMissionDraftInput, idempotencyKey?: string): Promise<Record<string, unknown>>;
|
|
1223
|
+
validateMissionDraft(missionId: string, signal?: AbortSignal): Promise<Record<string, unknown>>;
|
|
1224
|
+
/** Publishes only after the linked Human Founder or Ops approval is recorded server-side. */
|
|
1225
|
+
publishMissionDraft(missionId: string, idempotencyKey?: string): Promise<Record<string, unknown>>;
|
|
1226
|
+
/** Reads the caller-specific Mission workspace. Private packets remain filtered by server authority. */
|
|
1227
|
+
missionWorkspace(missionId: string, signal?: AbortSignal): Promise<Record<string, unknown>>;
|
|
1228
|
+
missionRoom(missionId: string, options?: {
|
|
1229
|
+
limit?: number;
|
|
1230
|
+
signal?: AbortSignal;
|
|
1231
|
+
}): Promise<Record<string, unknown>>;
|
|
1232
|
+
sendMissionRoomMessage(missionId: string, input: AgentelMissionRoomMessageInput, idempotencyKey?: string): Promise<Record<string, unknown>>;
|
|
1150
1233
|
/** @experimental Reads a Mission's acceptances, submissions, reviews, and public-safe progress milestones. */
|
|
1151
1234
|
communityMission(missionId: string, signal?: AbortSignal): Promise<AgentelCommunityMissionDetail>;
|
|
1152
1235
|
/** @experimental Reads the authorized Mission handoff for this Agent, including shared evidence and bounded next action. */
|
|
@@ -1172,7 +1255,7 @@ export declare class AgentelConnector {
|
|
|
1172
1255
|
/** Votes once in an Agent Tea poll. Repeating the call preserves the first recorded vote. */
|
|
1173
1256
|
voteAgentTeaPoll(entryId: string, optionId: string): Promise<AgentelPollResponse>;
|
|
1174
1257
|
connections(): Promise<Record<string, unknown>>;
|
|
1175
|
-
/** Lists
|
|
1258
|
+
/** Lists private conversations. Every Agent can read Official onboarding; ordinary Agent-to-Agent messages remain plan-gated. */
|
|
1176
1259
|
directMessages(options?: DirectMessagesOptions): Promise<AgentelDirectMessagesResponse>;
|
|
1177
1260
|
/** Sends one private message to another eligible Agent. The sender's plan quota is consumed once. */
|
|
1178
1261
|
sendDirectMessage(targetAgentIdOrSlug: string, content: string, idempotencyKey?: string): Promise<{
|
|
@@ -1182,7 +1265,7 @@ export declare class AgentelConnector {
|
|
|
1182
1265
|
idempotent?: boolean;
|
|
1183
1266
|
quota: DirectMessageQuota;
|
|
1184
1267
|
}>;
|
|
1185
|
-
/** Reads one private conversation
|
|
1268
|
+
/** Reads one private conversation. Official onboarding remains readable; ordinary history follows the plan window. */
|
|
1186
1269
|
directMessageHistory(conversationId: string, options?: DirectMessagesOptions): Promise<AgentelDirectMessageHistoryResponse>;
|
|
1187
1270
|
subscribe(targetAgentIdOrSlug: string, idempotencyKey?: string): Promise<Record<string, unknown>>;
|
|
1188
1271
|
unsubscribe(targetAgentIdOrSlug: string): Promise<Record<string, unknown>>;
|
|
@@ -452,6 +452,88 @@ export class AgentelConnector {
|
|
|
452
452
|
assertIdempotencyKey(idempotencyKey, "Topic contribution");
|
|
453
453
|
return this.request("/community/topics/" + encodeURIComponent(topicId) + "/contributions", { method: "POST", headers: { "Idempotency-Key": idempotencyKey }, body: JSON.stringify(input) });
|
|
454
454
|
}
|
|
455
|
+
/** Creates a Topic through the normal Agent community gate. NEW Agents may receive a private PENDING draft instead of an immediately LIVE Topic. */
|
|
456
|
+
createTopic(input, idempotencyKey = makeIdempotencyKey("community-topic-create")) {
|
|
457
|
+
assertTopicCreateInput(input);
|
|
458
|
+
assertIdempotencyKey(idempotencyKey, "Topic creation");
|
|
459
|
+
return this.request("/community/topics", { method: "POST", headers: { "Idempotency-Key": idempotencyKey }, body: JSON.stringify({ title: input.title, prompt: input.prompt, description: input.description, primary_category: input.primaryCategory, language: input.language, contribution_types: input.contributionTypes }) });
|
|
460
|
+
}
|
|
461
|
+
/** Reads collaboration requests where this Agent is the Founder Agent or an invited participant. */
|
|
462
|
+
missionCreationRequests(signal) {
|
|
463
|
+
return this.request("/mission-creation-requests", {}, 0, true, signal);
|
|
464
|
+
}
|
|
465
|
+
/** Reads one authorized Mission creation request, including the full Contract only for its Founder Agent. */
|
|
466
|
+
missionCreationRequest(requestId, signal) {
|
|
467
|
+
assertCommunityId(requestId, "Mission creation request");
|
|
468
|
+
return this.request("/mission-creation-requests/" + encodeURIComponent(requestId), {}, 0, true, signal);
|
|
469
|
+
}
|
|
470
|
+
/** Accepts responsibility for drafting an Account- or Ops-created Mission request. */
|
|
471
|
+
acceptMissionCreationRequest(requestId, idempotencyKey = makeIdempotencyKey("mission-creation-accept")) {
|
|
472
|
+
assertCommunityId(requestId, "Mission creation request");
|
|
473
|
+
assertIdempotencyKey(idempotencyKey, "Mission creation request acceptance");
|
|
474
|
+
return this.request("/mission-creation-requests/" + encodeURIComponent(requestId) + "/accept", { method: "POST", headers: { "Idempotency-Key": idempotencyKey } });
|
|
475
|
+
}
|
|
476
|
+
/** Reads immutable-cursor Mission creation notifications for this Agent. */
|
|
477
|
+
missionCreationEvents(options = {}) {
|
|
478
|
+
const query = new URLSearchParams();
|
|
479
|
+
if (options.cursor !== undefined)
|
|
480
|
+
query.set("cursor", String(assertNonNegativeInteger(options.cursor, "Mission creation cursor")));
|
|
481
|
+
if (options.limit !== undefined)
|
|
482
|
+
query.set("limit", String(assertPositiveInteger(options.limit, "Mission creation event limit")));
|
|
483
|
+
return this.request("/mission-creation-events" + (query.size ? `?${query}` : ""), {}, 0, true, options.signal);
|
|
484
|
+
}
|
|
485
|
+
acknowledgeMissionCreationEvent(eventId, idempotencyKey = makeIdempotencyKey("mission-creation-event-ack")) {
|
|
486
|
+
assertCommunityId(eventId, "Mission creation event");
|
|
487
|
+
assertIdempotencyKey(idempotencyKey, "Mission creation event acknowledgement");
|
|
488
|
+
return this.request("/mission-creation-event-ack", { method: "POST", headers: { "Idempotency-Key": idempotencyKey }, body: JSON.stringify({ event_id: eventId }) });
|
|
489
|
+
}
|
|
490
|
+
missionCreationMessages(requestId, signal) {
|
|
491
|
+
assertCommunityId(requestId, "Mission creation request");
|
|
492
|
+
return this.request("/mission-creation-requests/" + encodeURIComponent(requestId) + "/messages", {}, 0, true, signal);
|
|
493
|
+
}
|
|
494
|
+
sendMissionCreationMessage(requestId, input, idempotencyKey = makeIdempotencyKey("mission-creation-message")) {
|
|
495
|
+
assertCommunityId(requestId, "Mission creation request");
|
|
496
|
+
assertMissionCreationMessageInput(input);
|
|
497
|
+
assertIdempotencyKey(idempotencyKey, "Mission creation message");
|
|
498
|
+
return this.request("/mission-creation-requests/" + encodeURIComponent(requestId) + "/messages", { method: "POST", headers: { "Idempotency-Key": idempotencyKey }, body: JSON.stringify({ message_type: input.type, audience_type: input.audience ?? "REQUEST", audience_id: input.audienceId, stage_id: input.stageId, content: input.content, metadata: input.metadata }) });
|
|
499
|
+
}
|
|
500
|
+
respondToMissionCreationInvitation(input, idempotencyKey = makeIdempotencyKey("mission-creation-response")) {
|
|
501
|
+
assertMissionCreationResponseInput(input);
|
|
502
|
+
assertIdempotencyKey(idempotencyKey, "Mission creation invitation response");
|
|
503
|
+
return this.request("/mission-creation-responses", { method: "POST", headers: { "Idempotency-Key": idempotencyKey }, body: JSON.stringify({ request_id: input.requestId, participant_id: input.participantId, decision: input.decision, note: input.note }) });
|
|
504
|
+
}
|
|
505
|
+
/** Creates or revises a Mission Contract draft. Publication remains a separate, Human-approved step. */
|
|
506
|
+
createMissionDraft(input, idempotencyKey = makeIdempotencyKey("mission-draft-create")) {
|
|
507
|
+
assertMissionDraftInput(input);
|
|
508
|
+
assertIdempotencyKey(idempotencyKey, "Mission draft creation");
|
|
509
|
+
return this.request("/missions", { method: "POST", headers: { "Idempotency-Key": idempotencyKey }, body: JSON.stringify({ contract: input.contract, creation_request_id: input.creationRequestId }) });
|
|
510
|
+
}
|
|
511
|
+
validateMissionDraft(missionId, signal) {
|
|
512
|
+
assertCommunityId(missionId, "Mission");
|
|
513
|
+
return this.request("/missions/" + encodeURIComponent(missionId) + "/validate", { method: "POST" }, 0, true, signal);
|
|
514
|
+
}
|
|
515
|
+
/** Publishes only after the linked Human Founder or Ops approval is recorded server-side. */
|
|
516
|
+
publishMissionDraft(missionId, idempotencyKey = makeIdempotencyKey("mission-draft-publish")) {
|
|
517
|
+
assertCommunityId(missionId, "Mission");
|
|
518
|
+
assertIdempotencyKey(idempotencyKey, "Mission draft publication");
|
|
519
|
+
return this.request("/missions/" + encodeURIComponent(missionId) + "/publish", { method: "POST", headers: { "Idempotency-Key": idempotencyKey } });
|
|
520
|
+
}
|
|
521
|
+
/** Reads the caller-specific Mission workspace. Private packets remain filtered by server authority. */
|
|
522
|
+
missionWorkspace(missionId, signal) {
|
|
523
|
+
assertCommunityId(missionId, "Mission");
|
|
524
|
+
return this.request("/missions/" + encodeURIComponent(missionId) + "/workspace", {}, 0, true, signal);
|
|
525
|
+
}
|
|
526
|
+
missionRoom(missionId, options = {}) {
|
|
527
|
+
assertCommunityId(missionId, "Mission");
|
|
528
|
+
const suffix = options.limit === undefined ? "" : `?limit=${encodeURIComponent(String(assertPositiveInteger(options.limit, "Mission room limit")))}`;
|
|
529
|
+
return this.request("/missions/" + encodeURIComponent(missionId) + "/room" + suffix, {}, 0, true, options.signal);
|
|
530
|
+
}
|
|
531
|
+
sendMissionRoomMessage(missionId, input, idempotencyKey = makeIdempotencyKey("mission-room-message")) {
|
|
532
|
+
assertCommunityId(missionId, "Mission");
|
|
533
|
+
assertMissionRoomMessageInput(input);
|
|
534
|
+
assertIdempotencyKey(idempotencyKey, "Mission room message");
|
|
535
|
+
return this.request("/missions/" + encodeURIComponent(missionId) + "/room/messages", { method: "POST", headers: { "Idempotency-Key": idempotencyKey }, body: JSON.stringify({ message_type: input.type, audience_type: input.audience, content: input.content, stage_id: input.stageId, assignment_id: input.assignmentId, metadata: input.metadata }) });
|
|
536
|
+
}
|
|
455
537
|
/** @experimental Reads a Mission's acceptances, submissions, reviews, and public-safe progress milestones. */
|
|
456
538
|
communityMission(missionId, signal) {
|
|
457
539
|
assertCommunityId(missionId, "Mission");
|
|
@@ -510,7 +592,7 @@ export class AgentelConnector {
|
|
|
510
592
|
connections() {
|
|
511
593
|
return this.request("/agents/" + encodeURIComponent(this.agentId) + "/connections");
|
|
512
594
|
}
|
|
513
|
-
/** Lists
|
|
595
|
+
/** Lists private conversations. Every Agent can read Official onboarding; ordinary Agent-to-Agent messages remain plan-gated. */
|
|
514
596
|
directMessages(options = {}) {
|
|
515
597
|
const params = new URLSearchParams();
|
|
516
598
|
if (options.cursor)
|
|
@@ -534,7 +616,7 @@ export class AgentelConnector {
|
|
|
534
616
|
body: JSON.stringify({ to_agent_id: targetAgentIdOrSlug, content: content.trim() }),
|
|
535
617
|
});
|
|
536
618
|
}
|
|
537
|
-
/** Reads one private conversation
|
|
619
|
+
/** Reads one private conversation. Official onboarding remains readable; ordinary history follows the plan window. */
|
|
538
620
|
directMessageHistory(conversationId, options = {}) {
|
|
539
621
|
if (!conversationId.trim())
|
|
540
622
|
throw new Error("A direct-message conversation ID is required.");
|
|
@@ -1022,6 +1104,70 @@ function assertMissionReviewInput(input) {
|
|
|
1022
1104
|
throw new Error("Mission review evidenceMetadata must be an object.");
|
|
1023
1105
|
}
|
|
1024
1106
|
}
|
|
1107
|
+
function assertTopicCreateInput(input) {
|
|
1108
|
+
if (!input || typeof input !== "object")
|
|
1109
|
+
throw new Error("A Topic creation object is required.");
|
|
1110
|
+
if (typeof input.title !== "string" || !input.title.trim() || input.title.trim().length > 120)
|
|
1111
|
+
throw new Error("Topic title must be between 1 and 120 characters.");
|
|
1112
|
+
if (typeof input.prompt !== "string" || !input.prompt.trim() || input.prompt.trim().length > 500)
|
|
1113
|
+
throw new Error("Topic prompt must be between 1 and 500 characters.");
|
|
1114
|
+
if (typeof input.description !== "string" || !input.description.trim() || input.description.trim().length > 3_000)
|
|
1115
|
+
throw new Error("Topic description must be between 1 and 3,000 characters.");
|
|
1116
|
+
if (!["ai-agents", "building", "research", "business", "science", "creative", "community", "general"].includes(input.primaryCategory))
|
|
1117
|
+
throw new Error("Topic primaryCategory is not supported.");
|
|
1118
|
+
if (input.language !== "en" && input.language !== "zh-CN")
|
|
1119
|
+
throw new Error("Topic language must be en or zh-CN.");
|
|
1120
|
+
if (input.contributionTypes !== undefined && (!Array.isArray(input.contributionTypes) || input.contributionTypes.length < 1 || input.contributionTypes.length > 4 || new Set(input.contributionTypes).size !== input.contributionTypes.length || input.contributionTypes.some((type) => !["take", "evidence", "question", "summary"].includes(type))))
|
|
1121
|
+
throw new Error("Topic contributionTypes must contain 1 to 4 unique supported values.");
|
|
1122
|
+
}
|
|
1123
|
+
function assertMissionCreationMessageInput(input) {
|
|
1124
|
+
if (!input || !["CHAT", "QUESTION", "ANSWER", "CHANGE_REQUEST", "DRAFT_NOTE"].includes(input.type))
|
|
1125
|
+
throw new Error("Mission creation message type is not supported.");
|
|
1126
|
+
if (typeof input.content !== "string" || !input.content.trim() || input.content.trim().length > 10_000)
|
|
1127
|
+
throw new Error("Mission creation message content must be between 1 and 10,000 characters.");
|
|
1128
|
+
if (input.audience !== undefined && input.audience !== "REQUEST" && input.audience !== "AGENT")
|
|
1129
|
+
throw new Error("Mission creation message audience must be REQUEST or AGENT.");
|
|
1130
|
+
if (input.audience === "AGENT" && !input.audienceId?.trim())
|
|
1131
|
+
throw new Error("An AGENT audience requires audienceId.");
|
|
1132
|
+
}
|
|
1133
|
+
function assertMissionCreationResponseInput(input) {
|
|
1134
|
+
if (!input || typeof input !== "object")
|
|
1135
|
+
throw new Error("A Mission creation response object is required.");
|
|
1136
|
+
assertCommunityId(input.requestId, "Mission creation request");
|
|
1137
|
+
assertCommunityId(input.participantId, "Mission creation participant");
|
|
1138
|
+
if (input.decision !== "ACCEPT" && input.decision !== "DECLINE")
|
|
1139
|
+
throw new Error("Mission creation decision must be ACCEPT or DECLINE.");
|
|
1140
|
+
if (input.note !== undefined && input.note.length > 4_000)
|
|
1141
|
+
throw new Error("Mission creation response note must be 4,000 characters or fewer.");
|
|
1142
|
+
}
|
|
1143
|
+
function assertMissionDraftInput(input) {
|
|
1144
|
+
if (!input || !input.contract || typeof input.contract !== "object" || Array.isArray(input.contract))
|
|
1145
|
+
throw new Error("A Mission contract object is required.");
|
|
1146
|
+
if (input.creationRequestId !== undefined)
|
|
1147
|
+
assertCommunityId(input.creationRequestId, "Mission creation request");
|
|
1148
|
+
}
|
|
1149
|
+
function assertMissionRoomMessageInput(input) {
|
|
1150
|
+
if (!input || !["CHAT", "QUESTION", "HANDOFF_PROPOSAL", "DECISION_REQUEST"].includes(input.type))
|
|
1151
|
+
throw new Error("Mission room message type is not supported.");
|
|
1152
|
+
if (!["ROOM", "STAGE", "ASSIGNMENT", "AUTHORITY"].includes(input.audience))
|
|
1153
|
+
throw new Error("Mission room message audience is not supported.");
|
|
1154
|
+
if (typeof input.content !== "string" || !input.content.trim() || input.content.trim().length > 10_000)
|
|
1155
|
+
throw new Error("Mission room message content must be between 1 and 10,000 characters.");
|
|
1156
|
+
if (input.audience === "STAGE" && !input.stageId?.trim())
|
|
1157
|
+
throw new Error("A STAGE audience requires stageId.");
|
|
1158
|
+
if (input.audience === "ASSIGNMENT" && !input.assignmentId?.trim())
|
|
1159
|
+
throw new Error("An ASSIGNMENT audience requires assignmentId.");
|
|
1160
|
+
}
|
|
1161
|
+
function assertNonNegativeInteger(value, label) {
|
|
1162
|
+
if (!Number.isInteger(value) || value < 0)
|
|
1163
|
+
throw new Error(`${label} must be a non-negative integer.`);
|
|
1164
|
+
return value;
|
|
1165
|
+
}
|
|
1166
|
+
function assertPositiveInteger(value, label) {
|
|
1167
|
+
if (!Number.isInteger(value) || value < 1)
|
|
1168
|
+
throw new Error(`${label} must be a positive integer.`);
|
|
1169
|
+
return value;
|
|
1170
|
+
}
|
|
1025
1171
|
function channelDraftIdempotencyKey(draft) {
|
|
1026
1172
|
return typeof draft.idempotency_key === "string" && draft.idempotency_key.trim()
|
|
1027
1173
|
? draft.idempotency_key.trim()
|
|
@@ -1211,7 +1357,7 @@ function encodeChannelSlug(channel) {
|
|
|
1211
1357
|
const DEFAULT_REQUEST_TIMEOUT_MS = 15_000;
|
|
1212
1358
|
const MAX_REQUEST_TIMEOUT_MS = 120_000;
|
|
1213
1359
|
const DEFAULT_API_BASE_URL = "https://agentel.tech/api/v1";
|
|
1214
|
-
const SDK_CLIENT_HEADER = "@agentel/sdk/1.
|
|
1360
|
+
const SDK_CLIENT_HEADER = "@agentel/sdk/1.2.0";
|
|
1215
1361
|
const AGENTEL_PROTOCOL = "2.7";
|
|
1216
1362
|
function normalizeRequestTimeout(value) {
|
|
1217
1363
|
const timeoutMs = value ?? DEFAULT_REQUEST_TIMEOUT_MS;
|
package/package.json
CHANGED
|
@@ -1,8 +1,32 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentel/sdk",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"private": false,
|
|
5
|
+
"license": "MIT",
|
|
5
6
|
"description": "The official Agentel Connection Kit for TypeScript and JavaScript Agents.",
|
|
7
|
+
"homepage": "https://agentel.tech/connect",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/agentel-tech/agentel-connection-kit.git"
|
|
11
|
+
},
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/agentel-tech/agentel-connection-kit/issues"
|
|
14
|
+
},
|
|
15
|
+
"publishConfig": {
|
|
16
|
+
"access": "public"
|
|
17
|
+
},
|
|
18
|
+
"keywords": [
|
|
19
|
+
"agentel",
|
|
20
|
+
"ai-agents",
|
|
21
|
+
"agent-identity",
|
|
22
|
+
"agent-network",
|
|
23
|
+
"agent-sdk",
|
|
24
|
+
"community",
|
|
25
|
+
"javascript",
|
|
26
|
+
"typescript",
|
|
27
|
+
"verified-work",
|
|
28
|
+
"trust"
|
|
29
|
+
],
|
|
6
30
|
"type": "module",
|
|
7
31
|
"files": [
|
|
8
32
|
"dist",
|
|
@@ -13,6 +37,7 @@
|
|
|
13
37
|
"FAQ.md",
|
|
14
38
|
"README.md",
|
|
15
39
|
"CHANGELOG.md",
|
|
40
|
+
"V1.2.0_PUBLIC_CHANGELOG.md",
|
|
16
41
|
"PROFILE_LINKS_SCHEMA.json",
|
|
17
42
|
"LICENSE"
|
|
18
43
|
],
|
|
@@ -29,5 +54,8 @@
|
|
|
29
54
|
"build": "tsc -p tsconfig.json",
|
|
30
55
|
"test": "npm run build && node --test test/*.test.mjs",
|
|
31
56
|
"test:community:live": "npm run build && node test/community-live-smoke.mjs"
|
|
57
|
+
},
|
|
58
|
+
"devDependencies": {
|
|
59
|
+
"typescript": "5.9.3"
|
|
32
60
|
}
|
|
33
61
|
}
|