@canonmsg/agent-sdk 3.1.0 → 3.1.1

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.
@@ -1,4 +1,4 @@
1
- import { type AddMemberResult, type CanonContact, type CanonRuntimeActivityItem, type CanonRuntimeCommandDescriptor, type CanonRuntimeFact, type CanonRuntimePrimitiveId, type ContactCardPayload, type ClearRuntimeActivityOptions, type CreateContactRequestResult } from '@canonmsg/core';
1
+ import { type AddMemberResult, type CanonContact, type CanonConversation, type CreateConversationResult, type CanonRuntimeActivityItem, type CanonRuntimeCommandDescriptor, type CanonRuntimeFact, type CanonRuntimePrimitiveId, type ContactCardPayload, type ClearRuntimeActivityOptions, type CreateContactRequestResult } from '@canonmsg/core';
2
2
  import type { CanonAgentOptions, ContactAddedHandler, ContactRemovedHandler, CreateConversationOptions, MessageHandler, MessageUpdatedHandler, ReachOutOptions, ReachOutResult, ContactRequestHandler, RuntimeSignalHandler, RuntimePrimitiveHandler } from './types.js';
3
3
  /**
4
4
  * Contact-graph operations exposed under `agent.contacts`. Wraps the REST
@@ -18,6 +18,11 @@ export interface AgentUsersAPI {
18
18
  block(userId: string): Promise<void>;
19
19
  unblock(userId: string): Promise<void>;
20
20
  }
21
+ export interface AgentConversationsAPI {
22
+ list(options?: {
23
+ targetUserId?: string;
24
+ }): Promise<CanonConversation[]>;
25
+ }
21
26
  export declare class CanonAgent {
22
27
  private options;
23
28
  private apiClient;
@@ -40,6 +45,8 @@ export declare class CanonAgent {
40
45
  readonly contacts: AgentContactsAPI;
41
46
  /** Block/unblock operations (`agent.users.*`). Initialized in the constructor. */
42
47
  readonly users: AgentUsersAPI;
48
+ /** Conversation discovery for choosing existing sessions intentionally. */
49
+ readonly conversations: AgentConversationsAPI;
43
50
  private readonly reachOutInFlight;
44
51
  private agentId;
45
52
  private agentContext;
@@ -85,9 +92,7 @@ export declare class CanonAgent {
85
92
  reachOut(card: ContactCardPayload, options?: ReachOutOptions): Promise<ReachOutResult>;
86
93
  private executeReachOut;
87
94
  start(): Promise<void>;
88
- createConversation(options: CreateConversationOptions): Promise<{
89
- conversationId: string;
90
- }>;
95
+ createConversation(options: CreateConversationOptions): Promise<CreateConversationResult>;
91
96
  updateTopic(conversationId: string, topic: string): Promise<void>;
92
97
  leaveConversation(conversationId: string): Promise<void>;
93
98
  updateConversationName(conversationId: string, name: string): Promise<void>;
@@ -245,6 +245,8 @@ export class CanonAgent {
245
245
  contacts;
246
246
  /** Block/unblock operations (`agent.users.*`). Initialized in the constructor. */
247
247
  users;
248
+ /** Conversation discovery for choosing existing sessions intentionally. */
249
+ conversations;
248
250
  reachOutInFlight = new Map();
249
251
  agentId = null;
250
252
  agentContext = null;
@@ -292,6 +294,14 @@ export class CanonAgent {
292
294
  block: (userId) => apiClient.blockUser(userId),
293
295
  unblock: (userId) => apiClient.unblockUser(userId),
294
296
  };
297
+ this.conversations = {
298
+ list: async (options = {}) => {
299
+ const conversations = await apiClient.getConversations();
300
+ if (!options.targetUserId)
301
+ return conversations;
302
+ return conversations.filter((conversation) => conversation.memberIds.includes(options.targetUserId));
303
+ },
304
+ };
295
305
  if (options.sessions?.enabled) {
296
306
  this.sessionManager = new SessionManager({
297
307
  contextLimit: options.sessions.contextLimit,
@@ -457,7 +467,7 @@ export class CanonAgent {
457
467
  const contextualKey = options?.selfContext
458
468
  ? `${options.sourceConversationId ?? ''}\u0000${options.selfContext.type}\u0000${options.selfContext.context}`
459
469
  : '';
460
- const inFlightKey = `${targetUserId}\u0000${options?.text ?? ''}\u0000${options?.requestMessage ?? ''}\u0000${JSON.stringify(options?.sessionConfig ?? null)}\u0000${contextualKey}`;
470
+ const inFlightKey = `${targetUserId}\u0000${options?.text ?? ''}\u0000${options?.requestMessage ?? ''}\u0000${JSON.stringify(options?.sessionConfig ?? null)}\u0000${JSON.stringify(options?.sessionSelection ?? null)}\u0000${contextualKey}`;
461
471
  const inFlight = this.reachOutInFlight.get(inFlightKey);
462
472
  if (inFlight)
463
473
  return inFlight;
@@ -482,6 +492,7 @@ export class CanonAgent {
482
492
  selfContext: options.selfContext,
483
493
  requestMessage: options.requestMessage ?? null,
484
494
  sessionConfig: options.sessionConfig ?? null,
495
+ sessionSelection: options.sessionSelection,
485
496
  });
486
497
  return result.status === 'messaged'
487
498
  ? {
@@ -489,6 +500,9 @@ export class CanonAgent {
489
500
  conversationId: result.conversationId,
490
501
  messageId: result.messageId,
491
502
  selfContextId: result.selfContextId,
503
+ created: result.created,
504
+ reused: result.reused,
505
+ sessionSelection: result.sessionSelection,
492
506
  }
493
507
  : result;
494
508
  }
@@ -497,6 +511,7 @@ export class CanonAgent {
497
511
  text: options?.text ?? null,
498
512
  requestMessage: options?.requestMessage ?? null,
499
513
  sessionConfig: options?.sessionConfig ?? null,
514
+ sessionSelection: options?.sessionSelection,
500
515
  });
501
516
  }
502
517
  async start() {
package/dist/index.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  export { CanonAgent } from './canon-agent.js';
2
- export type { AgentContactsAPI, AgentUsersAPI } from './canon-agent.js';
2
+ export type { AgentContactsAPI, AgentConversationsAPI, AgentUsersAPI } from './canon-agent.js';
3
3
  export { ApprovalManager, buildApprovalOutcome, buildApprovalReply, buildApprovalRequest, CanonApiError, DEFAULT_APPROVAL_CONFIG, generateApprovalId, HOST_ADMISSION_ACTION_CAPABILITIES, HOST_ADMISSION_ACTIONS_DISABLED, parseApprovalReplyMetadata, parseApprovalRequestMetadata, parseSessionRule, redactSecrets, } from '@canonmsg/core';
4
4
  export type { ApprovalConfig, ApprovalNativeRequestMetadata, ApprovalOutcomeMetadata, ApprovalReplyMetadata, ApprovalRequestCategory, ApprovalRequestDetail, ApprovalRequestMetadata, ApprovalResult, ApprovalRisk, CanonContact, CanonRuntimeActivityItem, CanonRuntimeActivityKind, CanonRuntimeActivityStatus, CanonRuntimeTurnModeActivation, CanonRuntimeTurnModeDescriptor, CanonRuntimeTurnModeScope, CanonRuntimeFact, CanonRuntimeFactGroup, CanonResolveAdmissionResult, ContactAddedPayload, ContactCardPayload, ContactRemovedPayload, ContactSource, HostAdmissionActionCapabilities, ResolvedAdmissionState, ResolvedAdmissionTargetSummary, ResolvedTargetAdmissionPayload, RuntimeInputAnswers, RuntimeInputChoice, RuntimeInputKind, RuntimeInputNativeMetadata, RuntimeInputQuestion, SessionRule, } from '@canonmsg/core';
5
5
  export { SessionManager } from './session-manager.js';
6
6
  export { DEFAULT_MEDIA_CACHE_DIR, getCodexImagePath, getMessageAttachments, inferUploadMimeType, isAnthropicImageAttachment, materializeAttachment, materializeMessageMedia, materializeReplyContextMedia, resolveAttachmentMimeType, sendMediaFileMessage, toAnthropicImageBlock, uploadMediaFile, } from './media.js';
7
7
  export type { AnthropicImageBlock, AnthropicImageMimeType, MaterializeMediaOptions, MaterializedCanonAttachment, MaterializedCanonReplyContext, ReplyWithFileOptions, UploadMediaFileOptions, } from './media.js';
8
8
  export type { SessionConfig, Session } from './session-manager.js';
9
- export type { AgentContext, CanonGroupContext, CanonKnownRecentParticipant, CanonMembershipChange, CanonContactRequest, CanonMessage, CanonConversation, CanonReplyContext, CanonSelfContext, CanonTurnContextV2, CanonRuntimeDescriptor, MessageUpdatedPayload, SendContextualMessageOptions, SendContextualMessageResult, SendContextualSelfContextInput, SendMessageOptions, CreateConversationOptions, } from '@canonmsg/core';
9
+ export type { AgentContext, CanonGroupContext, CanonKnownRecentParticipant, CanonMembershipChange, CanonContactRequest, CanonMessage, CanonConversation, CanonReplyContext, CanonSelfContext, CanonTurnContextV2, CanonRuntimeDescriptor, MessageUpdatedPayload, SendContextualMessageOptions, SendContextualMessageResult, SendContextualSelfContextInput, SendMessageOptions, CreateConversationOptions, CreateConversationResult, DirectSessionSelection, } from '@canonmsg/core';
10
10
  export type { CanonAgentOptions, ContactAddedHandler, ContactRemovedHandler, ContactRequestHandler, MessageHandler, MessageHandlerContext, MessageUpdatedHandler, ProgressMessageOptions, ProgressMessageResult, ReachOutOptions, ReachOutResult, RuntimeApprovalRequest, RuntimeInputRequest, RuntimeInputResult, RuntimeControlSurface, RuntimePrimitiveContext, RuntimePrimitiveHandler, RuntimePrimitiveHandlers, SessionInfo, SessionOptions, DeliveryMode, } from './types.js';
package/dist/types.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- export type { AddMemberResult, AgentClientType, CanonGroupContext, CanonRuntimeActivityItem, CanonRuntimeActivityKind, CanonRuntimeActivityStatus, CanonRuntimeDescriptor, CanonRuntimeFact, CanonRuntimeFactGroup, CanonRuntimePrimitiveId, CanonRuntimeProvenance, CanonTurnContextV2, CanonMessage, CanonConversation, CanonReplyContext, CanonContact, CanonContactRequest, CanonResolveAdmissionResult, ContactAddedPayload, ContactRemovedPayload, ContactSource, AgentContext, ResolvedAdmissionState, ResolvedAdmissionTargetSummary, ResolvedTargetAdmissionPayload, CanonSelfContext, SendContextualMessageOptions, SendContextualMessageResult, SendContextualSelfContextInput, SendMessageOptions, SessionConfig, CreateConversationOptions, TurnLifecycleState, TurnOutputBlock, TurnOutputBlockInput, ApprovalNativeRequestMetadata, ApprovalRequestCategory, ApprovalRequestDetail, ApprovalRequestMetadata, ApprovalRisk, ApprovalReplyMetadata, ApprovalOutcomeMetadata, RuntimeInputChoice, RuntimeInputAnswers, RuntimeInputKind, RuntimeInputNativeMetadata, RuntimeInputQuestion, RuntimeCardNativeMetadata, RuntimeCardV1, SessionRule, ApprovalResult, } from '@canonmsg/core';
2
- import type { AddMemberResult, CanonGroupContext, CanonMessage, CanonConversation, CanonReplyContext, ContactCardPayload, CanonRuntimeActionDispatch, CanonRuntimePrimitiveId, CanonRuntimeProvenance, CanonTurnContextV2, ApprovalNativeRequestMetadata, ApprovalRequestCategory, ApprovalRequestDetail, ApprovalResult, ApprovalRisk, RuntimeInputChoice, RuntimeInputAnswers, RuntimeInputKind, RuntimeInputNativeMetadata, RuntimeInputQuestion, RuntimeCardNativeMetadata, RuntimeCardV1, SendMessageOptions, SendContextualSelfContextInput, SessionConfig, TurnOutputBlock, TurnOutputBlockInput } from '@canonmsg/core';
1
+ export type { AddMemberResult, AgentClientType, CanonGroupContext, CanonRuntimeActivityItem, CanonRuntimeActivityKind, CanonRuntimeActivityStatus, CanonRuntimeDescriptor, CanonRuntimeFact, CanonRuntimeFactGroup, CanonRuntimePrimitiveId, CanonRuntimeProvenance, CanonTurnContextV2, CanonMessage, CanonConversation, CanonReplyContext, CanonContact, CanonContactRequest, CanonResolveAdmissionResult, ContactAddedPayload, ContactRemovedPayload, ContactSource, AgentContext, ResolvedAdmissionState, ResolvedAdmissionTargetSummary, ResolvedTargetAdmissionPayload, CanonSelfContext, CreateConversationResult, DirectSessionSelection, SendContextualMessageOptions, SendContextualMessageResult, SendContextualSelfContextInput, SendMessageOptions, SessionConfig, CreateConversationOptions, TurnLifecycleState, TurnOutputBlock, TurnOutputBlockInput, ApprovalNativeRequestMetadata, ApprovalRequestCategory, ApprovalRequestDetail, ApprovalRequestMetadata, ApprovalRisk, ApprovalReplyMetadata, ApprovalOutcomeMetadata, RuntimeInputChoice, RuntimeInputAnswers, RuntimeInputKind, RuntimeInputNativeMetadata, RuntimeInputQuestion, RuntimeCardNativeMetadata, RuntimeCardV1, SessionRule, ApprovalResult, } from '@canonmsg/core';
2
+ import type { AddMemberResult, CanonGroupContext, CanonMessage, CanonConversation, CanonReplyContext, ContactCardPayload, CanonRuntimeActionDispatch, CanonRuntimePrimitiveId, CanonRuntimeProvenance, CanonTurnContextV2, ApprovalNativeRequestMetadata, ApprovalRequestCategory, ApprovalRequestDetail, ApprovalResult, ApprovalRisk, RuntimeInputChoice, RuntimeInputAnswers, RuntimeInputKind, RuntimeInputNativeMetadata, RuntimeInputQuestion, RuntimeCardNativeMetadata, RuntimeCardV1, SendMessageOptions, SendContextualSelfContextInput, SessionConfig, DirectSessionSelection, TurnOutputBlock, TurnOutputBlockInput } from '@canonmsg/core';
3
3
  import type { MaterializeMediaOptions, MaterializedCanonAttachment, ReplyWithFileOptions, UploadMediaFileOptions } from './media.js';
4
4
  export interface ProgressMessageOptions extends SendMessageOptions {
5
5
  /**
@@ -282,6 +282,9 @@ export type ReachOutResult = {
282
282
  conversationId: string;
283
283
  messageId?: string;
284
284
  selfContextId?: string;
285
+ created?: boolean;
286
+ reused?: boolean;
287
+ sessionSelection?: DirectSessionSelection['mode'];
285
288
  } | {
286
289
  status: 'requested';
287
290
  requestId: string | null;
@@ -293,6 +296,9 @@ export type ReachOutResult = {
293
296
  } | {
294
297
  status: 'setup_required';
295
298
  reason: string;
299
+ } | {
300
+ status: 'no_session';
301
+ reason: string;
296
302
  } | {
297
303
  status: 'blocked' | 'unavailable';
298
304
  reason: string;
@@ -304,6 +310,8 @@ export interface ReachOutOptions {
304
310
  requestMessage?: string;
305
311
  /** Explicit session setup to use when the contact-card target is an agent. */
306
312
  sessionConfig?: SessionConfig | null;
313
+ /** Whether to continue an existing direct agent session or start a fresh one. */
314
+ sessionSelection?: DirectSessionSelection;
307
315
  /** Source conversation for contextual cross-session reach-outs. */
308
316
  sourceConversationId?: string;
309
317
  /** Private context for the agent when this reach-out sends a cross-session message. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@canonmsg/agent-sdk",
3
- "version": "3.1.0",
3
+ "version": "3.1.1",
4
4
  "description": "Canon Agent SDK — build AI agents that participate in Canon conversations",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -28,7 +28,7 @@
28
28
  "node": ">=18.0.0"
29
29
  },
30
30
  "dependencies": {
31
- "@canonmsg/core": "^2.1.0"
31
+ "@canonmsg/core": "^2.1.1"
32
32
  },
33
33
  "publishConfig": {
34
34
  "access": "public"