@brownandroot/api 0.10.0 → 0.11.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/README.md +21 -5
- package/dist/index.d.ts +3 -1
- package/dist/index.js +36 -16
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @brownandroot/api
|
|
2
2
|
|
|
3
|
-
TypeScript client for the Brown & Root APIHub data service. Provides read-only access to company data and an LLM chat endpoint powered by Azure AI Foundry.
|
|
3
|
+
TypeScript client for the Brown & Root APIHub data service. Provides read-only access to company data (employees, business units, cost codes, pay types, work orders, job type/job steps) and an LLM chat endpoint powered by Azure AI Foundry.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
@@ -25,11 +25,12 @@ const client = new ApiHubClient({
|
|
|
25
25
|
|
|
26
26
|
```typescript
|
|
27
27
|
const employees = await client.getEmployees()
|
|
28
|
-
const
|
|
28
|
+
const dropdown = await client.getEmployeesDropdown() // { value, label }[]
|
|
29
|
+
const employee = await client.getEmployee('12345')
|
|
29
30
|
const results = await client.searchByName('John')
|
|
30
31
|
const results = await client.searchByEmail('john@example.com')
|
|
31
|
-
const reports = await client.getBySupervisor(12345)
|
|
32
|
-
const chain = await client.getSupervisorChain(12345)
|
|
32
|
+
const reports = await client.getBySupervisor('12345')
|
|
33
|
+
const chain = await client.getSupervisorChain('12345')
|
|
33
34
|
const { jde, employee } = await client.getJdeFromEmail('john@example.com')
|
|
34
35
|
```
|
|
35
36
|
|
|
@@ -37,6 +38,7 @@ const { jde, employee } = await client.getJdeFromEmail('john@example.com')
|
|
|
37
38
|
|
|
38
39
|
```typescript
|
|
39
40
|
const units = await client.getBusinessUnits()
|
|
41
|
+
const dropdown = await client.getBusinessUnitsDropdown() // { value, label }[]
|
|
40
42
|
const unit = await client.getBusinessUnit('BU001')
|
|
41
43
|
```
|
|
42
44
|
|
|
@@ -44,6 +46,7 @@ const unit = await client.getBusinessUnit('BU001')
|
|
|
44
46
|
|
|
45
47
|
```typescript
|
|
46
48
|
const codes = await client.getCostcodes()
|
|
49
|
+
const dropdown = await client.getCostcodesDropdown() // { value, label }[]
|
|
47
50
|
const code = await client.getCostcode('CC001')
|
|
48
51
|
```
|
|
49
52
|
|
|
@@ -51,6 +54,7 @@ const code = await client.getCostcode('CC001')
|
|
|
51
54
|
|
|
52
55
|
```typescript
|
|
53
56
|
const types = await client.getPaytypes()
|
|
57
|
+
const dropdown = await client.getPaytypesDropdown() // { value, label, payClass }[]
|
|
54
58
|
const type = await client.getPaytype('PT001')
|
|
55
59
|
```
|
|
56
60
|
|
|
@@ -58,9 +62,18 @@ const type = await client.getPaytype('PT001')
|
|
|
58
62
|
|
|
59
63
|
```typescript
|
|
60
64
|
const orders = await client.getWorkorders()
|
|
65
|
+
const dropdown = await client.getWorkordersDropdown() // { value, label }[]
|
|
61
66
|
const order = await client.getWorkorder('WO001')
|
|
62
67
|
```
|
|
63
68
|
|
|
69
|
+
### Job Type / Job Steps
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
const items = await client.getJobtypejobsteps()
|
|
73
|
+
const dropdown = await client.getJobtypejobstepsDropdown() // { value, label }[]
|
|
74
|
+
const item = await client.getJobtypejobstep('JTJS001')
|
|
75
|
+
```
|
|
76
|
+
|
|
64
77
|
### LLM
|
|
65
78
|
|
|
66
79
|
```typescript
|
|
@@ -89,11 +102,14 @@ import type {
|
|
|
89
102
|
Costcode,
|
|
90
103
|
Paytype,
|
|
91
104
|
Workorder,
|
|
105
|
+
Jobtypejobstep,
|
|
92
106
|
LlmLog,
|
|
93
107
|
ChatMessage,
|
|
94
108
|
ChatRequest,
|
|
95
109
|
ChatResponse,
|
|
96
110
|
ApiHubClientOptions,
|
|
111
|
+
DropdownOption,
|
|
112
|
+
PaytypeDropdownOption,
|
|
97
113
|
} from '@brownandroot/api'
|
|
98
114
|
```
|
|
99
115
|
|
|
@@ -103,7 +119,7 @@ Methods throw an `Error` when the API returns a non-OK response. The error messa
|
|
|
103
119
|
|
|
104
120
|
```typescript
|
|
105
121
|
try {
|
|
106
|
-
const emp = await client.getEmployee(99999)
|
|
122
|
+
const emp = await client.getEmployee('99999')
|
|
107
123
|
} catch (err) {
|
|
108
124
|
console.error(err.message) // "Employee not found"
|
|
109
125
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -174,7 +174,7 @@ export declare class ApiHubClient {
|
|
|
174
174
|
searchByEmail(email: string): Promise<Employee[]>;
|
|
175
175
|
/** Get the supervisor chain above an employee */
|
|
176
176
|
getSupervisorChain(employeeId: string): Promise<Employee[]>;
|
|
177
|
-
/** Look up JDE number and employee data from email (with
|
|
177
|
+
/** Look up JDE number and employee data from email (with itime fallback) */
|
|
178
178
|
getJdeFromEmail(email: string): Promise<{
|
|
179
179
|
jde: string | null;
|
|
180
180
|
employee: Employee | null;
|
|
@@ -194,6 +194,8 @@ export declare class ApiHubClient {
|
|
|
194
194
|
getPaytype(id: string): Promise<Paytype>;
|
|
195
195
|
getWorkorders(): Promise<Workorder[]>;
|
|
196
196
|
getWorkordersDropdown(): Promise<DropdownOption[]>;
|
|
197
|
+
/** Get work orders for a specific business unit, formatted for dropdown controls */
|
|
198
|
+
getWorkordersDropdownByBu(businessUnitId: string): Promise<DropdownOption[]>;
|
|
197
199
|
getWorkorder(id: string): Promise<Workorder>;
|
|
198
200
|
getJobtypejobsteps(): Promise<Jobtypejobstep[]>;
|
|
199
201
|
getJobtypejobstepsDropdown(): Promise<DropdownOption[]>;
|
package/dist/index.js
CHANGED
|
@@ -6,12 +6,20 @@ export class ApiHubClient {
|
|
|
6
6
|
this.apiKey = options.apiKey;
|
|
7
7
|
}
|
|
8
8
|
async request(path) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
let res;
|
|
10
|
+
try {
|
|
11
|
+
res = await fetch(`${this.baseUrl}${path}`, {
|
|
12
|
+
headers: { 'x-api-key': this.apiKey },
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
throw new Error(`APIHub unavailable: ${this.baseUrl}${path}`);
|
|
17
|
+
}
|
|
12
18
|
if (!res.ok) {
|
|
13
|
-
const body = await res.json().catch(() =>
|
|
14
|
-
|
|
19
|
+
const body = await res.json().catch(() => null);
|
|
20
|
+
const message = (body && typeof body === 'object' && 'error' in body && typeof body.error === 'string' ? body.error : null) ??
|
|
21
|
+
`Request failed: ${res.status} ${res.statusText}`;
|
|
22
|
+
throw new Error(message);
|
|
15
23
|
}
|
|
16
24
|
return res.json();
|
|
17
25
|
}
|
|
@@ -43,7 +51,7 @@ export class ApiHubClient {
|
|
|
43
51
|
async getSupervisorChain(employeeId) {
|
|
44
52
|
return this.request(`/employees/${encodeURIComponent(employeeId)}/supervisor-chain`);
|
|
45
53
|
}
|
|
46
|
-
/** Look up JDE number and employee data from email (with
|
|
54
|
+
/** Look up JDE number and employee data from email (with itime fallback) */
|
|
47
55
|
async getJdeFromEmail(email) {
|
|
48
56
|
return this.request(`/employees/jde-from-email/${encodeURIComponent(email)}`);
|
|
49
57
|
}
|
|
@@ -56,17 +64,25 @@ export class ApiHubClient {
|
|
|
56
64
|
}
|
|
57
65
|
/** Send a chat completion request to the LLM */
|
|
58
66
|
async chat(request) {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
'
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
+
let res;
|
|
68
|
+
try {
|
|
69
|
+
res = await fetch(`${this.baseUrl}/llm/chat`, {
|
|
70
|
+
method: 'POST',
|
|
71
|
+
headers: {
|
|
72
|
+
'x-api-key': this.apiKey,
|
|
73
|
+
'Content-Type': 'application/json',
|
|
74
|
+
},
|
|
75
|
+
body: JSON.stringify(request),
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
throw new Error(`APIHub unavailable: ${this.baseUrl}/llm/chat`);
|
|
80
|
+
}
|
|
67
81
|
if (!res.ok) {
|
|
68
|
-
const body = await res.json().catch(() =>
|
|
69
|
-
|
|
82
|
+
const body = await res.json().catch(() => null);
|
|
83
|
+
const message = (body && typeof body === 'object' && 'error' in body && typeof body.error === 'string' ? body.error : null) ??
|
|
84
|
+
`Request failed: ${res.status} ${res.statusText}`;
|
|
85
|
+
throw new Error(message);
|
|
70
86
|
}
|
|
71
87
|
return res.json();
|
|
72
88
|
}
|
|
@@ -115,6 +131,10 @@ export class ApiHubClient {
|
|
|
115
131
|
async getWorkordersDropdown() {
|
|
116
132
|
return this.request('/workorders/dropdown');
|
|
117
133
|
}
|
|
134
|
+
/** Get work orders for a specific business unit, formatted for dropdown controls */
|
|
135
|
+
async getWorkordersDropdownByBu(businessUnitId) {
|
|
136
|
+
return this.request(`/workorders/by-bu/${encodeURIComponent(businessUnitId)}/dropdown`);
|
|
137
|
+
}
|
|
118
138
|
async getWorkorder(id) {
|
|
119
139
|
return this.request(`/workorders/${encodeURIComponent(id)}`);
|
|
120
140
|
}
|