Skip to content

Commit 079f76a

Browse files
authored
Merge branch 'main' into rahuldevikar761-patch-3
2 parents c94c6d1 + 1f8b6ab commit 079f76a

27 files changed

Lines changed: 876 additions & 146 deletions

DEPENDENCIES.md

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# Microsoft Agent 365 SDK Node.js Package Dependencies
2+
3+
This diagram shows the internal dependencies between Microsoft Agent 365 SDK Node.js packages.
4+
5+
```mermaid
6+
graph LR
7+
agents_a365_notifications[agents-a365-notifications]
8+
agents_a365_observability[agents-a365-observability]
9+
agents_a365_observability_extensions_openai[agents-a365-observability-extensions-openai]
10+
agents_a365_observability_tokencache[agents-a365-observability-tokencache]
11+
agents_a365_runtime[agents-a365-runtime]
12+
agents_a365_tooling[agents-a365-tooling]
13+
agents_a365_tooling_extensions_claude[agents-a365-tooling-extensions-claude]
14+
agents_a365_tooling_extensions_langchain[agents-a365-tooling-extensions-langchain]
15+
agents_a365_tooling_extensions_openai[agents-a365-tooling-extensions-openai]
16+
17+
agents_a365_notifications --> agents_a365_runtime
18+
agents_a365_observability --> agents_a365_runtime
19+
agents_a365_observability_extensions_openai --> agents_a365_observability
20+
agents_a365_observability_tokencache --> agents_a365_observability
21+
agents_a365_observability_tokencache --> agents_a365_runtime
22+
agents_a365_tooling --> agents_a365_runtime
23+
agents_a365_tooling_extensions_claude --> agents_a365_runtime
24+
agents_a365_tooling_extensions_claude --> agents_a365_tooling
25+
agents_a365_tooling_extensions_langchain --> agents_a365_runtime
26+
agents_a365_tooling_extensions_langchain --> agents_a365_tooling
27+
agents_a365_tooling_extensions_openai --> agents_a365_runtime
28+
agents_a365_tooling_extensions_openai --> agents_a365_tooling
29+
30+
style agents_a365_notifications fill:#ffcdd2,stroke:#c62828,color:#280505
31+
style agents_a365_observability fill:#c8e6c9,stroke:#2e7d32,color:#142a14
32+
style agents_a365_observability_extensions_openai fill:#e8f5e9,stroke:#66bb6a,color:#1f3d1f
33+
style agents_a365_observability_tokencache fill:#e8f5e9,stroke:#66bb6a,color:#1f3d1f
34+
style agents_a365_runtime fill:#bbdefb,stroke:#1565c0,color:#0d1a26
35+
style agents_a365_tooling fill:#ffe0b2,stroke:#e65100,color:#331a00
36+
style agents_a365_tooling_extensions_claude fill:#fff3e0,stroke:#fb8c00,color:#4d2600
37+
style agents_a365_tooling_extensions_langchain fill:#fff3e0,stroke:#fb8c00,color:#4d2600
38+
style agents_a365_tooling_extensions_openai fill:#fff3e0,stroke:#fb8c00,color:#4d2600
39+
```
40+
## Package Types
41+
42+
- **Notifications** (Red): Notification and messaging extensions
43+
- **Observability** (Green): Telemetry and monitoring core
44+
- **Observability Extensions** (Light Green): Framework-specific observability integrations
45+
- **Runtime** (Blue): Core runtime components
46+
- **Tooling** (Orange): Agent tooling SDK core
47+
- **Tooling Extensions** (Light Orange): Framework-specific tooling integrations
48+

generate-package-dependencies.js

Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// Licensed under the MIT License.
3+
4+
import fs from 'fs';
5+
import path from 'path';
6+
import { fileURLToPath } from 'url';
7+
8+
const __filename = fileURLToPath(import.meta.url);
9+
const __dirname = path.dirname(__filename);
10+
11+
// Color definitions for package types
12+
const packageTypeColors = {
13+
'Notifications': { fill: '#ffcdd2', stroke: '#c62828', color: '#280505' },
14+
'Observability': { fill: '#c8e6c9', stroke: '#2e7d32', color: '#142a14' },
15+
'Observability Extensions': { fill: '#e8f5e9', stroke: '#66bb6a', color: '#1f3d1f' },
16+
'Runtime': { fill: '#bbdefb', stroke: '#1565c0', color: '#0d1a26' },
17+
'Tooling': { fill: '#ffe0b2', stroke: '#e65100', color: '#331a00' },
18+
'Tooling Extensions': { fill: '#fff3e0', stroke: '#fb8c00', color: '#4d2600' }
19+
};
20+
21+
// Package to type mapping
22+
const packageToType = {
23+
'agents-a365-notifications': 'Notifications',
24+
'agents-a365-observability': 'Observability',
25+
'agents-a365-observability-extensions-openai': 'Observability Extensions',
26+
'agents-a365-observability-tokencache': 'Observability Extensions',
27+
'agents-a365-runtime': 'Runtime',
28+
'agents-a365-tooling': 'Tooling',
29+
'agents-a365-tooling-extensions-claude': 'Tooling Extensions',
30+
'agents-a365-tooling-extensions-langchain': 'Tooling Extensions',
31+
'agents-a365-tooling-extensions-openai': 'Tooling Extensions'
32+
};
33+
34+
// Find all package directories matching the pattern
35+
function findPackages() {
36+
const packagesDir = path.join(__dirname, 'packages');
37+
const packages = [];
38+
39+
const dirs = fs.readdirSync(packagesDir, { withFileTypes: true });
40+
41+
for (const dir of dirs) {
42+
if (dir.isDirectory() && dir.name.startsWith('agents-a365-')) {
43+
const packageJsonPath = path.join(packagesDir, dir.name, 'package.json');
44+
if (fs.existsSync(packageJsonPath)) {
45+
packages.push({
46+
name: dir.name,
47+
path: packageJsonPath
48+
});
49+
}
50+
}
51+
}
52+
53+
return packages;
54+
}
55+
56+
// Read and parse package.json
57+
function readPackageJson(packagePath) {
58+
const content = fs.readFileSync(packagePath, 'utf-8');
59+
return JSON.parse(content);
60+
}
61+
62+
// Extract dependencies related to our packages
63+
function extractRelevantDependencies(packageJson, relevantPackageNames) {
64+
const deps = [];
65+
const allDeps = {
66+
...packageJson.dependencies,
67+
...packageJson.devDependencies,
68+
...packageJson.peerDependencies
69+
};
70+
71+
for (const [depName, version] of Object.entries(allDeps || {})) {
72+
// Check if this dependency is one of our packages
73+
if (relevantPackageNames.has(depName)) {
74+
deps.push(depName);
75+
}
76+
}
77+
78+
return deps;
79+
}
80+
81+
// Generate Mermaid diagram
82+
function generateMermaidDiagram(packages) {
83+
let mermaid = '```mermaid\ngraph LR\n';
84+
85+
// Create a map of package names to directory names
86+
const packageNameToDir = new Map();
87+
for (const pkg of packages) {
88+
packageNameToDir.set(pkg.packageName, pkg.name);
89+
}
90+
91+
// Create nodes
92+
for (const pkg of packages) {
93+
const nodeId = pkg.name.replace(/-/g, '_');
94+
mermaid += ` ${nodeId}[${pkg.name}]\n`;
95+
}
96+
97+
mermaid += '\n';
98+
99+
// Create edges (dependencies)
100+
for (const pkg of packages) {
101+
const nodeId = pkg.name.replace(/-/g, '_');
102+
for (const dep of pkg.dependencies) {
103+
// Convert package name to directory name
104+
const depDirName = packageNameToDir.get(dep);
105+
if (depDirName) {
106+
const depId = depDirName.replace(/-/g, '_');
107+
mermaid += ` ${nodeId} --> ${depId}\n`;
108+
}
109+
}
110+
}
111+
112+
mermaid += '\n';
113+
114+
// Add styling
115+
for (const pkg of packages) {
116+
const nodeId = pkg.name.replace(/-/g, '_');
117+
const packageType = packageToType[pkg.name];
118+
if (packageType) {
119+
const colors = packageTypeColors[packageType];
120+
if (colors) {
121+
mermaid += ` style ${nodeId} fill:${colors.fill},stroke:${colors.stroke},color:${colors.color}\n`;
122+
}
123+
}
124+
}
125+
126+
mermaid += '```\n';
127+
128+
return mermaid;
129+
}
130+
131+
// Main function
132+
function main() {
133+
console.log('Finding packages...');
134+
const packageList = findPackages();
135+
console.log(`Found ${packageList.length} packages`);
136+
137+
// Get all package names for filtering dependencies
138+
const relevantPackageNames = new Set(packageList.map(p => {
139+
const pkgJson = readPackageJson(p.path);
140+
return pkgJson.name;
141+
}));
142+
143+
console.log('Analyzing dependencies...');
144+
const packagesWithDeps = packageList.map(pkg => {
145+
const packageJson = readPackageJson(pkg.path);
146+
const dependencies = extractRelevantDependencies(packageJson, relevantPackageNames);
147+
148+
console.log(` ${pkg.name}: ${dependencies.length} dependencies`);
149+
150+
return {
151+
name: pkg.name,
152+
packageName: packageJson.name,
153+
dependencies
154+
};
155+
});
156+
157+
console.log('Generating Mermaid diagram...');
158+
const diagram = generateMermaidDiagram(packagesWithDeps);
159+
160+
// Add header and legend
161+
let markdown = '# Microsoft Agent 365 SDK Node.js Package Dependencies\n\n';
162+
markdown += 'This diagram shows the internal dependencies between Microsoft Agent 365 SDK Node.js packages.\n\n';
163+
markdown += diagram;
164+
markdown += '## Package Types\n\n';
165+
markdown += '- **Notifications** (Red): Notification and messaging extensions\n';
166+
markdown += '- **Observability** (Green): Telemetry and monitoring core\n';
167+
markdown += '- **Observability Extensions** (Light Green): Framework-specific observability integrations\n';
168+
markdown += '- **Runtime** (Blue): Core runtime components\n';
169+
markdown += '- **Tooling** (Orange): Agent tooling SDK core\n';
170+
markdown += '- **Tooling Extensions** (Light Orange): Framework-specific tooling integrations\n\n';
171+
172+
const outputPath = path.join(__dirname, 'DEPENDENCIES.md');
173+
fs.writeFileSync(outputPath, markdown, 'utf-8');
174+
175+
console.log(`\nDiagram generated successfully: ${outputPath}`);
176+
}
177+
178+
main();

packages/agents-a365-observability-tokencache/package.json renamed to packages/agents-a365-observability-hosting/package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
2-
"name": "@microsoft/agents-a365-observability-tokencache",
3-
"version": "0.0.0-placeholder",
4-
"description": "Microsoft Agent 365 SDK observability token cache utilities",
2+
"name": "@microsoft/agents-a365-observability-hosting",
3+
"version": "0.1.0",
4+
"description": "Hosting & Observability utilities for Agent365 (Node.js): token caching, baggage builder, hosting registration.",
55
"keywords": [
66
"agent365",
77
"observability",
@@ -16,7 +16,7 @@
1616
"repository": {
1717
"type": "git",
1818
"url": "https://github.com/microsoft/Agent365-nodejs.git",
19-
"directory": "packages/agents-a365-observability-tokencache"
19+
"directory": "packages/agents-a365-observability-hosting"
2020
},
2121
"license": "MIT",
2222
"author": "Microsoft",
@@ -36,7 +36,7 @@
3636
"clean": "npx rimraf dist",
3737
"lint": "eslint src/**/*.ts",
3838
"lint:fix": "eslint src/**/*.ts --fix",
39-
"test": "jest --config ./jest.config.cjs --passWithNoTests",
39+
"test": "jest --config ../../tests/jest.config.json --passWithNoTests",
4040
"test:watch": "jest --watch",
4141
"test:coverage": "jest --coverage",
4242
"pack": "npm pack --pack-destination=../"

packages/agents-a365-observability-tokencache/src/AgenticTokenCache.ts renamed to packages/agents-a365-observability-hosting/src/caching/AgenticTokenCache.ts

File renamed without changes.

packages/agents-a365-observability-tokencache/src/index.ts renamed to packages/agents-a365-observability-hosting/src/index.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,7 @@
33
// Licensed under the MIT License.
44
// ------------------------------------------------------------------------------
55

6-
export { AgenticTokenCacheInstance } from './AgenticTokenCache';
6+
export * from './utils/BaggageBuilderUtils';
7+
export * from './utils/InvokeAgentScopeUtils';
8+
export * from './utils/TurnContextUtils';
9+
export { AgenticTokenCacheInstance } from './caching/AgenticTokenCache';
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
// ------------------------------------------------------------------------------
2+
// Copyright (c) Microsoft Corporation.
3+
// Licensed under the MIT License.
4+
// ------------------------------------------------------------------------------
5+
6+
import { TurnContext } from '@microsoft/agents-hosting';
7+
import {
8+
getCallerBaggagePairs,
9+
getExecutionTypePair,
10+
getTargetAgentBaggagePairs,
11+
getTenantIdPair,
12+
getSourceMetadataBaggagePairs,
13+
getConversationIdAndItemLinkPairs
14+
} from './TurnContextUtils';
15+
import { BaggageBuilder } from '@microsoft/agents-a365-observability';
16+
17+
18+
19+
/**
20+
* Utilities to populate BaggageBuilder from a TurnContext.
21+
*/
22+
export class BaggageBuilderUtils {
23+
/**
24+
* Populate all supported baggage pairs from the provided TurnContext.
25+
* @param builder The BaggageBuilder instance to populate.
26+
* @param turnContext The TurnContext containing activity information.
27+
* @returns The updated BaggageBuilder instance.
28+
*/
29+
static fromTurnContext(builder: BaggageBuilder, turnContext: TurnContext): BaggageBuilder {
30+
if (!turnContext) {
31+
throw new Error('turnContext is required');
32+
}
33+
this.setCallerBaggage(builder, turnContext);
34+
this.setExecutionTypeBaggage(builder, turnContext);
35+
this.setTargetAgentBaggage(builder, turnContext);
36+
this.setTenantIdBaggage(builder, turnContext);
37+
this.setSourceMetadataBaggage(builder, turnContext);
38+
this.setConversationIdBaggage(builder, turnContext);
39+
return builder;
40+
}
41+
42+
/**
43+
* Sets the caller-related baggage values from the TurnContext.
44+
* @param builder The BaggageBuilder instance.
45+
* @param turnContext The TurnContext containing activity information.
46+
* @returns The updated BaggageBuilder instance.
47+
*/
48+
static setCallerBaggage(builder: BaggageBuilder, turnContext: TurnContext): BaggageBuilder {
49+
builder.setPairs(getCallerBaggagePairs(turnContext));
50+
return builder;
51+
}
52+
53+
54+
/**
55+
* Sets the execution type baggage value based on caller and recipient agentic status.
56+
* @param builder The BaggageBuilder instance.
57+
* @param turnContext The TurnContext containing activity information.
58+
* @returns The updated BaggageBuilder instance.
59+
*/
60+
static setExecutionTypeBaggage(builder: BaggageBuilder, turnContext: TurnContext): BaggageBuilder {
61+
builder.setPairs(getExecutionTypePair(turnContext));
62+
return builder;
63+
}
64+
65+
66+
/**
67+
* Sets the target agent-related baggage values from the TurnContext.
68+
* @param builder The BaggageBuilder instance.
69+
* @param turnContext The TurnContext containing activity information.
70+
* @returns The updated BaggageBuilder instance.
71+
*/
72+
static setTargetAgentBaggage(builder: BaggageBuilder, turnContext: TurnContext): BaggageBuilder {
73+
builder.setPairs(getTargetAgentBaggagePairs(turnContext));
74+
return builder;
75+
}
76+
77+
78+
/**
79+
* Sets the tenant ID baggage value, extracting from ChannelData if necessary.
80+
* @param builder The BaggageBuilder instance.
81+
* @param turnContext The TurnContext containing activity information.
82+
* @returns The updated BaggageBuilder instance.
83+
*/
84+
static setTenantIdBaggage(builder: BaggageBuilder, turnContext: TurnContext): BaggageBuilder {
85+
builder.setPairs(getTenantIdPair(turnContext));
86+
return builder;
87+
}
88+
89+
90+
/**
91+
* Sets the source metadata baggage values from the TurnContext.
92+
* @param builder The BaggageBuilder instance.
93+
* @param turnContext The TurnContext containing activity information.
94+
* @returns The updated BaggageBuilder instance.
95+
*/
96+
static setSourceMetadataBaggage(builder: BaggageBuilder, turnContext: TurnContext): BaggageBuilder {
97+
builder.setPairs(getSourceMetadataBaggagePairs(turnContext));
98+
return builder;
99+
}
100+
101+
102+
/**
103+
* Sets the conversation ID and item link baggage values from the TurnContext.
104+
* @param builder The BaggageBuilder instance.
105+
* @param turnContext The TurnContext containing activity information.
106+
* @returns The updated BaggageBuilder instance.
107+
*/
108+
static setConversationIdBaggage(builder: BaggageBuilder, turnContext: TurnContext): BaggageBuilder {
109+
builder.setPairs(getConversationIdAndItemLinkPairs(turnContext));
110+
return builder;
111+
}
112+
}

0 commit comments

Comments
 (0)