Skip to content

Add agentic send helpers#632

Merged
heyitsaamir merged 14 commits into
agent365-featurefrom
agentic-send-helpers
Jul 7, 2026
Merged

Add agentic send helpers#632
heyitsaamir merged 14 commits into
agent365-featurefrom
agentic-send-helpers

Conversation

@heyitsaamir

@heyitsaamir heyitsaamir commented Jun 26, 2026

Copy link
Copy Markdown
Collaborator

Wires agentic identity into the app-layer send/reply helpers (mirrors Python PR #480):

  • app.send(conversationId, activity, options?) accepts RequestOptions
  • app.reply() supports options via isRequestOptions type guard
  • app.getAgenticIdentity(appId, userId, opts?) factory method
  • ActivitySender refactored to accept pre-built Client; merges agenticIdentity and serviceUrl into all API calls
  • Per-turn ActivitySender in $process with identity from activity.recipient
  • IActivitySender interface extended with readonly agenticIdentity?
  • ActivityContext.send() simplified — delegates to sender directly
  • examples/agent365/ — reactive echo + proactive send sample

@heyitsaamir

Copy link
Copy Markdown
Collaborator Author

Comment thread packages/apps/src/contexts/activity.ts Outdated
Comment thread packages/apps/src/activity-sender.ts Outdated
Comment thread packages/apps/src/app.process.ts Outdated
@heyitsaamir heyitsaamir marked this pull request as ready for review June 26, 2026 20:12
@heyitsaamir heyitsaamir force-pushed the agentic-api-surface branch from eb8d2e2 to c92e38c Compare June 26, 2026 20:19
@heyitsaamir heyitsaamir force-pushed the agentic-send-helpers branch 2 times, most recently from cefad04 to 9088f52 Compare June 26, 2026 20:21
@heyitsaamir heyitsaamir force-pushed the agentic-api-surface branch from c92e38c to b57702e Compare June 26, 2026 20:29
@heyitsaamir heyitsaamir force-pushed the agentic-send-helpers branch from 9088f52 to 6925d74 Compare June 26, 2026 20:29
@heyitsaamir heyitsaamir requested a review from Copilot June 26, 2026 20:30

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR wires agentic identity and request-level overrides into the @microsoft/teams.apps send/reply pipeline by threading RequestOptions (serviceUrl + agenticIdentity) through App, ActivityContext, and ActivitySender, and adds a new examples/agent365 sample demonstrating reactive + proactive agentic sends.

Changes:

  • Extend app-layer send() / reply() helpers to accept RequestOptions, and add an App.getAgenticIdentity() convenience factory.
  • Refactor ActivitySender to reuse a pre-built Teams API Client and pass RequestOptions into conversation activity operations.
  • Add examples/agent365 workspace showing reactive echo and proactive agentic sends.

Reviewed changes

Copilot reviewed 16 out of 19 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
packages/apps/src/types/plugin/sender.ts Extends IActivitySender with optional agentic identity + RequestOptions support.
packages/apps/src/contexts/activity.ts Simplifies ActivityContext.send() delegation to activitySender.
packages/apps/src/app.ts Adds RequestOptions plumbing to send/reply and introduces getAgenticIdentity().
packages/apps/src/app.spec.ts Updates tests to pass valid ActivityLike payloads (explicit type).
packages/apps/src/app.process.ts Creates per-turn ApiClient/ActivitySender with agentic identity from inbound recipient.
packages/apps/src/app.process.spec.ts Adjusts serviceUrl capture tests to hook ActivitySender.send.
packages/apps/src/activity-sender.ts Refactors sender to reuse Client and forward RequestOptions into API calls.
packages/apps/src/activity-sender.spec.ts Reworks sender tests to mock the API client instead of raw HTTP.
package-lock.json Adds workspace entries for the new @examples/agent365 package.
examples/agent365/turbo.json Adds turbo task config for building the new example workspace.
examples/agent365/tsconfig.json TypeScript configuration for the new example.
examples/agent365/src/proactive.ts Proactive messaging sample using AgenticIdentity with both app.send and API client.
examples/agent365/src/main.ts Reactive echo sample demonstrating automatic propagation of inbound agentic identity/serviceUrl.
examples/agent365/README.md Documentation for running reactive and proactive samples.
examples/agent365/package.json Declares the new example workspace and scripts.
examples/agent365/eslint.config.js ESLint config for the new example workspace.
examples/agent365/appPackage/manifest.json Teams app manifest for the example agent package.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread packages/apps/src/app.ts
Comment thread packages/apps/src/activity-sender.ts
Comment thread packages/apps/src/activity-sender.ts
Comment thread packages/apps/src/app.process.spec.ts
Comment thread packages/apps/src/app.process.spec.ts
@heyitsaamir heyitsaamir force-pushed the agentic-send-helpers branch 2 times, most recently from cc09eae to db6a642 Compare July 1, 2026 22:51
@heyitsaamir heyitsaamir force-pushed the agentic-api-surface branch from bff3ee5 to ef6df69 Compare July 1, 2026 22:57
@heyitsaamir heyitsaamir force-pushed the agentic-send-helpers branch from db6a642 to 2168311 Compare July 1, 2026 22:57
@heyitsaamir heyitsaamir force-pushed the agentic-api-surface branch from ef6df69 to 64922a6 Compare July 1, 2026 23:08
@heyitsaamir heyitsaamir force-pushed the agentic-send-helpers branch from 2168311 to 5188887 Compare July 1, 2026 23:08
@heyitsaamir heyitsaamir force-pushed the agentic-api-surface branch from 64922a6 to b2a0d57 Compare July 1, 2026 23:12
@heyitsaamir heyitsaamir force-pushed the agentic-send-helpers branch from 5188887 to 51a9bea Compare July 1, 2026 23:12
heyitsaamir and others added 4 commits July 1, 2026 16:16
- AuthProvider.token scope is now optional; provider defaults to cloud scopes
- AuthProviderInterceptor accepts defaultAgenticIdentity as fallback
- Client (ApiClient) accepts agenticIdentity and passes to interceptor
- AppAuthProvider defaults to cloud.botScope / cloud.agenticBotScope

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@heyitsaamir heyitsaamir force-pushed the agentic-api-surface branch from b2a0d57 to 56bb113 Compare July 1, 2026 23:16
@heyitsaamir heyitsaamir force-pushed the agentic-send-helpers branch 2 times, most recently from 4cfa97e to cf3ab03 Compare July 1, 2026 23:22
heyitsaamir and others added 6 commits July 7, 2026 10:48
Adds foundational token support for Agent 365 scenarios:

- `AgenticIdentity` type (agenticAppId, agenticUserId, tenantId,
agenticAppBlueprintId)
- `agenticBotScope` on `CloudEnvironment`
(`https://botapi.skype.com/.default`)
- `TokenRequestOptions` type for extensible token callback options
- `TokenManager.getAgenticToken(agenticIdentity, scope)` — 3-step FMI
token exchange (T1 → T2 → T3)
- `TokenManager.getAppToken(scope, tenantId?)` — generalized app token
method
- `TokenCredentials.token` signature extended: `(scope, tenantId?,
options?: TokenRequestOptions)`
Adds support for validating inbound Entra ID tokens (used by Agent 365)
alongside existing BotFramework tokens:

- `ServiceTokenValidator` now routes tokens based on issuer — Entra vs
BotFramework
- Decodes unverified JWT payload to inspect `iss` and `tid` claims
- Per-tenant Entra `JwtValidator` instances with bounded LRU cache (max
100)
- Entra tokens validated against tenant-specific OIDC metadata
- Exports `decodeJwtPayload` from `jwt-validator` for pre-validation
inspection

Note: Does _not_ currently do service url validation (not present in
Token)
Adds the auth provider abstraction layer that sits between the app and
the API client:

- `AuthProvider` type — `{ token(options: { scope?, agenticIdentity? })
}`
- `AuthProviderInterceptor` — HTTP interceptor that resolves tokens via
AuthProvider, reads per-request agentic identity from extensions
- `AppAuthProvider` — default implementation backed by `TokenManager`,
handles bot/agentic token routing
- `Client` (ApiClient) constructor extended to accept `cloud`,
`authProvider`, `agenticIdentity`
- HttpClient interceptor interface updated to receive `log` in request
context
- `App.api` wired to use provider-based auth

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add RequestOptions (agenticIdentity, serviceUrl) to app.send()
- Add isRequestOptions guard for reply() overload disambiguation
- Refactor ActivitySender to accept pre-built API Client
- Wire agentic identity from inbound recipient into per-turn sender
- Forward serviceUrl from ConversationReference in all API calls
- Add getAgenticIdentity() factory on App
- Add agenticIdentity to IActivitySender interface
- Simplify ActivityContext.send() to delegate to sender directly
- Add examples/agent365 reactive + proactive sample

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@heyitsaamir heyitsaamir force-pushed the agentic-send-helpers branch from cf3ab03 to b8d0118 Compare July 7, 2026 18:50
Base automatically changed from agentic-api-surface to agent365-feature July 7, 2026 19:11
@heyitsaamir heyitsaamir force-pushed the agentic-send-helpers branch from 927748f to f206889 Compare July 7, 2026 19:24
heyitsaamir and others added 2 commits July 7, 2026 12:28
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
The ActivitySender now uses the API Client (with conversations.activities)
rather than raw HTTP client. Update tests to mock the correct interface.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@heyitsaamir heyitsaamir merged commit fba29da into agent365-feature Jul 7, 2026
4 checks passed
@heyitsaamir heyitsaamir deleted the agentic-send-helpers branch July 7, 2026 20:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants