UNPKG

@microsoft/teams.apps

Version:

<p> <a href="https://www.npmjs.com/package/@microsoft/teams.apps" target="_blank"> <img src="https://img.shields.io/npm/v/@microsoft/teams.apps/latest" /> </a> <a href="https://www.npmjs.com/package/@microsoft/teams.apps?activeTab=code

108 lines • 8.55 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Plan = void 0; const teams_api_1 = require("@microsoft/teams.api"); const teams_common_1 = require("@microsoft/teams.common"); /** * Sends prompt-bound Plan activities; the application owns ordering and concurrency. * Serialize the IDs with JSON.stringify() and inject a client when reconstructing. * * Targeted Plan scenarios are not supported. * Plans use ordinary create routing, and completion() does not inherit * targeting from the originating context. * * In a chat thread, complete() is posted to the reply chain like `ctx.send`. * Typing updates (start, update, stop, error) are sent to the conversation, as `ctx.send` does for typing activities. * * @experimental This API is in preview and may change in the future. * Diagnostic: ExperimentalTeamsPlan */ class Plan { /** * Emits the SentActivity once after a successful send, before the method returns. * Listeners are runtime-only and are not serialized. */ events = new teams_common_1.EventEmitter(); /** Conversation ID to which this Plan is bound. */ conversationId; /** Original prompt ID to which all Plan activities reply. */ replyToId; /** Reply chain (thread) to which the completion is posted, if any. */ replyChain; api; /** Create a Plan from saved IDs and a configured client; no request or client cloning occurs. */ constructor(options) { this.conversationId = options.conversationId; this.replyToId = options.replyToId; this.replyChain = options.replyChain; this.api = options.apiClient; } /** Serialize only the prompt binding and its placement, excluding the client, credentials, and listeners. */ toJSON() { return { conversationId: this.conversationId, replyToId: this.replyToId, ...(this.replyChain ? { replyChain: this.replyChain } : {}), }; } /** Start the bound Plan with the supplied ordered steps; API failures propagate. */ async start(steps) { await this.sendUpdate('start', steps); } /** Send new or changed steps, with versions incremented by the application. */ async update(steps) { await this.sendUpdate('continue', steps); } /** Stop the displayed Plan without canceling application-owned work. */ async stop() { await this.sendUpdate('stop'); } /** Report a failed Plan without canceling application-owned work. */ async error() { await this.sendUpdate('error'); } /** * Build a fresh completion message without sending or changing this Plan. * Emit it last on a stream for the same conversation, then explicitly close the stream. * The original prompt ID is preserved; use the returned builder to add final metadata. */ completion() { return new teams_api_1.MessageActivityInput('', { replyToId: this.replyToId, entities: [{ type: 'planInfo', planType: 'complete' }], }); } /** Complete with an answer, preserving metadata and rejecting non-complete Plan operations. */ async complete(message) { const input = typeof message === 'string' ? new teams_api_1.MessageActivityInput(message) : teams_api_1.MessageActivityInput.from(structuredClone(teams_api_1.MessageActivityInput.from(message))); if (input.entities?.some((entity) => entity.type === 'planInfo' && entity.planType !== 'complete')) { throw new TypeError('complete() cannot send non-complete Plan operations.'); } if (!(0, teams_api_1.getPlanInfo)(input)) input.addEntity({ type: 'planInfo', planType: 'complete' }); return this.send(input, this.replyChain); } async sendUpdate(planType, steps) { return this.send({ type: 'typing', entities: [{ type: 'planInfo', planType, ...(steps === undefined ? {} : { steps: [...steps] }) }], }); } async send(activity, replyChain) { const payload = { ...structuredClone(activity), replyToId: this.replyToId, conversation: { id: replyChain?.chatOrChannelId ?? this.conversationId }, }; const result = replyChain ? await this.api.conversations.createReplyChainActivity(replyChain.chatOrChannelId, replyChain.replyChainId, payload) : await this.api.conversations.createActivity(this.conversationId, payload); const sent = { ...payload, ...result }; this.events.emit('sent', sent); return sent; } } exports.Plan = Plan; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wbGFuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG9EQVM4QjtBQUM5QiwwREFBdUQ7QUFxQ3ZEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFhLElBQUk7SUFDZjs7O09BR0c7SUFDTSxNQUFNLEdBQUcsSUFBSSwyQkFBWSxFQUEwQixDQUFDO0lBRTdELG1EQUFtRDtJQUMxQyxjQUFjLENBQVM7SUFFaEMsNkRBQTZEO0lBQ3BELFNBQVMsQ0FBUztJQUUzQixzRUFBc0U7SUFDN0QsVUFBVSxDQUFrQjtJQUVwQixHQUFHLENBQVM7SUFFN0IsaUdBQWlHO0lBQ2pHLFlBQVksT0FBb0I7UUFDOUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO1FBQzdDLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztRQUNuQyxJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7UUFDckMsSUFBSSxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDO0lBQy9CLENBQUM7SUFFRCw2R0FBNkc7SUFDN0csTUFBTTtRQUNKLE9BQU87WUFDTCxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWM7WUFDbkMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3pCLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUM1RCxDQUFDO0lBQ0osQ0FBQztJQUVELG9GQUFvRjtJQUNwRixLQUFLLENBQUMsS0FBSyxDQUFDLEtBQXNCO1FBQ2hDLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELCtFQUErRTtJQUMvRSxLQUFLLENB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