@binalyze/air-sdk 5.4.2 → 5.4.3
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 +50 -8
- package/dist/domains/interact.js +107 -0
- package/dist/domains/interact.js.map +1 -1
- package/dist/domains/tasks.js +75 -0
- package/dist/domains/tasks.js.map +1 -1
- package/dist/types/interact.d.ts +26 -0
- package/dist/types/tasks.d.ts +25 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @binalyze/air-sdk
|
|
2
2
|
|
|
3
|
-
AIR SDK (typescript-axios) bundled with an
|
|
3
|
+
AIR SDK (typescript-axios) bundled with an API surface.
|
|
4
4
|
|
|
5
5
|
## Requirements
|
|
6
6
|
- Node >= 18
|
|
@@ -17,20 +17,62 @@ import { AIR } from '@binalyze/air-sdk';
|
|
|
17
17
|
|
|
18
18
|
const air = new AIR(process.env.AIR_BASE_URL, process.env.AIR_TOKEN);
|
|
19
19
|
|
|
20
|
-
const
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
20
|
+
const baseUrl = process.env.AIR_DEV_URL;
|
|
21
|
+
const token = process.env.AIR_API_TOKEN;
|
|
22
|
+
|
|
23
|
+
if (!baseUrl || !token) {
|
|
24
|
+
throw new Error('AIR_DEV_URL and AIR_API_TOKEN must be set in .env file');
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const air = new AIR(baseUrl, token);
|
|
28
|
+
|
|
29
|
+
// List users (paginated array with optional _pagination metadata)
|
|
30
|
+
const users = await air.users.getMany({ pageNumber: 1, pageSize: 10 });
|
|
31
|
+
console.log('Users count:', users.length);
|
|
26
32
|
```
|
|
27
33
|
|
|
28
|
-
##
|
|
34
|
+
## Usage notes
|
|
29
35
|
- The package exposes only `AIR` as the public entry.
|
|
30
36
|
- Under the hood it configures:
|
|
31
37
|
- Authorization header
|
|
32
38
|
- deepObject query serialization
|
|
33
39
|
- success/error response normalization
|
|
40
|
+
- List endpoints return arrays that also carry pagination metadata via an optional `_pagination` property.
|
|
41
|
+
- When organization scoping is omitted, defaults may apply (e.g., `organizationIds` default to `[0]`).
|
|
42
|
+
|
|
43
|
+
## Examples
|
|
44
|
+
|
|
45
|
+
```ts
|
|
46
|
+
// Acquire baseline evidence for specific endpoints and an optional case
|
|
47
|
+
const baseline = await air.baseline.acquire({
|
|
48
|
+
caseId: 'C-2025-0007',
|
|
49
|
+
filter: {
|
|
50
|
+
includedEndpointIds: ['f9032a34-8e6d-4875-b1c3-a60d23506746'],
|
|
51
|
+
// organizationIds will default to [0] if omitted
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
console.log('Baseline:', baseline);
|
|
55
|
+
|
|
56
|
+
// Get case activities (paginated array)
|
|
57
|
+
const getActivities = await air.cases.getActivities({ id: 'C-2025-0007' });
|
|
58
|
+
console.log(
|
|
59
|
+
'First activity case ID for C-2025-0007:',
|
|
60
|
+
getActivities[0].data.caseId,
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
// List API tokens (paginated array)
|
|
64
|
+
const getApiTokens = await air.apiTokens.getMany();
|
|
65
|
+
console.log('API Tokens:', getApiTokens);
|
|
66
|
+
|
|
67
|
+
// List users with simple pagination and sorting
|
|
68
|
+
const usersPage = await air.users.getMany({
|
|
69
|
+
pageNumber: 1,
|
|
70
|
+
pageSize: 20,
|
|
71
|
+
sortBy: 'createdAt',
|
|
72
|
+
sortType: 'DESC',
|
|
73
|
+
});
|
|
74
|
+
console.log('Users (latest first):', usersPage);
|
|
75
|
+
```
|
|
34
76
|
|
|
35
77
|
## Support
|
|
36
78
|
Please open an internal ticket or contact the maintainers.
|
package/dist/domains/interact.js
CHANGED
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.createInteractAPI = createInteractAPI;
|
|
4
4
|
const bindings_1 = require("../generated/bindings");
|
|
5
5
|
const utils_1 = require("../utils");
|
|
6
|
+
const bindings_2 = require("../generated/bindings");
|
|
6
7
|
function createInteractAPI() {
|
|
7
8
|
return {
|
|
8
9
|
getCommands: async () => {
|
|
@@ -77,6 +78,112 @@ function createInteractAPI() {
|
|
|
77
78
|
return failure;
|
|
78
79
|
}
|
|
79
80
|
},
|
|
81
|
+
waitForSession: async ({ sessionId, taskId, timeoutSeconds, pollIntervalMs }) => {
|
|
82
|
+
const startedAt = Date.now();
|
|
83
|
+
const pollEveryMs = typeof pollIntervalMs === 'number' && pollIntervalMs > 0 ? pollIntervalMs : 60000;
|
|
84
|
+
const hasTimedOut = () => {
|
|
85
|
+
if (!timeoutSeconds || timeoutSeconds <= 0)
|
|
86
|
+
return false;
|
|
87
|
+
const elapsedSeconds = (Date.now() - startedAt) / 1000;
|
|
88
|
+
return elapsedSeconds >= timeoutSeconds;
|
|
89
|
+
};
|
|
90
|
+
// eslint-disable-next-line no-constant-condition
|
|
91
|
+
while (true) {
|
|
92
|
+
try {
|
|
93
|
+
const res = await (0, bindings_2.tasksGetById)({ path: { id: taskId } });
|
|
94
|
+
const task = (0, utils_1.unwrapResponse)(res);
|
|
95
|
+
if (task && task.type === 'interact-shell') {
|
|
96
|
+
if (task.status === 'processing') {
|
|
97
|
+
const result = {
|
|
98
|
+
sessionId,
|
|
99
|
+
taskId,
|
|
100
|
+
status: 'live',
|
|
101
|
+
message: 'InterACT session is ready - task is processing',
|
|
102
|
+
taskStatus: task.status,
|
|
103
|
+
taskType: task.type,
|
|
104
|
+
organizationId: task.organizationId,
|
|
105
|
+
createdAt: task.createdAt,
|
|
106
|
+
updatedAt: task.updatedAt,
|
|
107
|
+
};
|
|
108
|
+
return result;
|
|
109
|
+
}
|
|
110
|
+
if (task.status === 'completed') {
|
|
111
|
+
const result = {
|
|
112
|
+
sessionId,
|
|
113
|
+
taskId,
|
|
114
|
+
status: 'completed',
|
|
115
|
+
message: 'InterACT session task completed',
|
|
116
|
+
taskStatus: task.status,
|
|
117
|
+
taskType: task.type,
|
|
118
|
+
organizationId: task.organizationId,
|
|
119
|
+
createdAt: task.createdAt,
|
|
120
|
+
updatedAt: task.updatedAt,
|
|
121
|
+
};
|
|
122
|
+
return result;
|
|
123
|
+
}
|
|
124
|
+
if (task.status === 'cancelled') {
|
|
125
|
+
const result = {
|
|
126
|
+
sessionId,
|
|
127
|
+
taskId,
|
|
128
|
+
status: 'cancelled',
|
|
129
|
+
message: 'InterACT session task was cancelled',
|
|
130
|
+
error: 'Task was cancelled before becoming live',
|
|
131
|
+
taskStatus: task.status,
|
|
132
|
+
taskType: task.type,
|
|
133
|
+
organizationId: task.organizationId,
|
|
134
|
+
createdAt: task.createdAt,
|
|
135
|
+
updatedAt: task.updatedAt,
|
|
136
|
+
};
|
|
137
|
+
return result;
|
|
138
|
+
}
|
|
139
|
+
if (task.status === 'failed') {
|
|
140
|
+
const result = {
|
|
141
|
+
sessionId,
|
|
142
|
+
taskId,
|
|
143
|
+
status: 'failed',
|
|
144
|
+
message: 'InterACT session task failed',
|
|
145
|
+
error: 'Task failed during execution',
|
|
146
|
+
taskStatus: task.status,
|
|
147
|
+
taskType: task.type,
|
|
148
|
+
organizationId: task.organizationId,
|
|
149
|
+
createdAt: task.createdAt,
|
|
150
|
+
updatedAt: task.updatedAt,
|
|
151
|
+
};
|
|
152
|
+
return result;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
// Invalid task type for InterACT session
|
|
157
|
+
return {
|
|
158
|
+
sessionId,
|
|
159
|
+
taskId,
|
|
160
|
+
status: 'failed',
|
|
161
|
+
message: `Invalid task: Task ID ${taskId} is not an InterACT session task or was not found`,
|
|
162
|
+
error: 'Invalid task type',
|
|
163
|
+
taskStatus: task?.status,
|
|
164
|
+
taskType: task?.type,
|
|
165
|
+
organizationId: task?.organizationId,
|
|
166
|
+
createdAt: task?.createdAt,
|
|
167
|
+
updatedAt: task?.updatedAt,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
// swallow and continue polling
|
|
173
|
+
}
|
|
174
|
+
if (hasTimedOut()) {
|
|
175
|
+
return {
|
|
176
|
+
sessionId,
|
|
177
|
+
taskId,
|
|
178
|
+
status: 'timeout',
|
|
179
|
+
message: `InterACT session did not become live within ${timeoutSeconds} seconds`,
|
|
180
|
+
error: 'Timeout exceeded. Task is still waiting to become live',
|
|
181
|
+
taskStatus: 'unknown',
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
await new Promise((resolve) => setTimeout(resolve, pollEveryMs));
|
|
185
|
+
}
|
|
186
|
+
},
|
|
80
187
|
};
|
|
81
188
|
}
|
|
82
189
|
function readSessionId(payload) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interact.js","sourceRoot":"","sources":["../../src/domains/interact.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"interact.js","sourceRoot":"","sources":["../../src/domains/interact.ts"],"names":[],"mappings":"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"}
|
package/dist/domains/tasks.js
CHANGED
|
@@ -50,6 +50,81 @@ function createTasksAPI() {
|
|
|
50
50
|
});
|
|
51
51
|
return (0, utils_1.normalizePage)(res, (entity) => entity);
|
|
52
52
|
},
|
|
53
|
+
waitForCompletion: async ({ taskId, timeoutSeconds, pollIntervalMs }) => {
|
|
54
|
+
const startedAt = Date.now();
|
|
55
|
+
const defaultInterval = !timeoutSeconds || timeoutSeconds === 0 ? 300000 : 60000;
|
|
56
|
+
const pollEveryMs = typeof pollIntervalMs === 'number' && pollIntervalMs > 0 ? pollIntervalMs : defaultInterval;
|
|
57
|
+
const hasTimedOut = () => {
|
|
58
|
+
if (!timeoutSeconds || timeoutSeconds <= 0)
|
|
59
|
+
return false;
|
|
60
|
+
const elapsedSeconds = (Date.now() - startedAt) / 1000;
|
|
61
|
+
return elapsedSeconds >= timeoutSeconds;
|
|
62
|
+
};
|
|
63
|
+
// eslint-disable-next-line no-constant-condition
|
|
64
|
+
while (true) {
|
|
65
|
+
try {
|
|
66
|
+
const res = await (0, bindings_1.tasksGetById)({ path: { id: taskId } });
|
|
67
|
+
const task = (0, utils_1.unwrapResponse)(res);
|
|
68
|
+
if (task) {
|
|
69
|
+
if (task.status === 'completed') {
|
|
70
|
+
const result = {
|
|
71
|
+
taskId,
|
|
72
|
+
status: 'completed',
|
|
73
|
+
message: 'Task completed successfully',
|
|
74
|
+
taskStatus: task.status,
|
|
75
|
+
taskType: task.type,
|
|
76
|
+
organizationId: task.organizationId,
|
|
77
|
+
createdAt: task.createdAt,
|
|
78
|
+
updatedAt: task.updatedAt,
|
|
79
|
+
};
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
if (task.status === 'cancelled') {
|
|
83
|
+
const result = {
|
|
84
|
+
taskId,
|
|
85
|
+
status: 'cancelled',
|
|
86
|
+
message: 'Task was cancelled',
|
|
87
|
+
error: 'Task was cancelled before completion',
|
|
88
|
+
taskStatus: task.status,
|
|
89
|
+
taskType: task.type,
|
|
90
|
+
organizationId: task.organizationId,
|
|
91
|
+
createdAt: task.createdAt,
|
|
92
|
+
updatedAt: task.updatedAt,
|
|
93
|
+
};
|
|
94
|
+
return result;
|
|
95
|
+
}
|
|
96
|
+
if (task.status === 'failed') {
|
|
97
|
+
const result = {
|
|
98
|
+
taskId,
|
|
99
|
+
status: 'failed',
|
|
100
|
+
message: 'Task failed',
|
|
101
|
+
error: 'Task failed during execution',
|
|
102
|
+
taskStatus: task.status,
|
|
103
|
+
taskType: task.type,
|
|
104
|
+
organizationId: task.organizationId,
|
|
105
|
+
createdAt: task.createdAt,
|
|
106
|
+
updatedAt: task.updatedAt,
|
|
107
|
+
};
|
|
108
|
+
return result;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
// swallow and continue polling
|
|
114
|
+
}
|
|
115
|
+
if (hasTimedOut()) {
|
|
116
|
+
const timeoutResult = {
|
|
117
|
+
taskId,
|
|
118
|
+
status: 'timeout',
|
|
119
|
+
message: `Task did not complete within ${timeoutSeconds} seconds`,
|
|
120
|
+
error: 'Timeout exceeded. Task is still waiting to complete',
|
|
121
|
+
taskStatus: 'unknown',
|
|
122
|
+
};
|
|
123
|
+
return timeoutResult;
|
|
124
|
+
}
|
|
125
|
+
await new Promise((resolve) => setTimeout(resolve, pollEveryMs));
|
|
126
|
+
}
|
|
127
|
+
},
|
|
53
128
|
};
|
|
54
129
|
}
|
|
55
130
|
//# sourceMappingURL=tasks.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/domains/tasks.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/domains/tasks.ts"],"names":[],"mappings":"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"}
|
package/dist/types/interact.d.ts
CHANGED
|
@@ -50,6 +50,31 @@ export interface IInterruptInteractCommandOptions {
|
|
|
50
50
|
export interface ICloseInteractSessionOptions {
|
|
51
51
|
sessionId: InteractSessionCloseData['path']['sessionId'];
|
|
52
52
|
}
|
|
53
|
+
export interface IWaitForSessionOptions {
|
|
54
|
+
sessionId: string;
|
|
55
|
+
taskId: string;
|
|
56
|
+
/**
|
|
57
|
+
* Timeout in seconds. If 0 or undefined, waits indefinitely.
|
|
58
|
+
*/
|
|
59
|
+
timeoutSeconds?: number;
|
|
60
|
+
/**
|
|
61
|
+
* Poll interval in milliseconds. Defaults to 60000 (1 minute).
|
|
62
|
+
*/
|
|
63
|
+
pollIntervalMs?: number;
|
|
64
|
+
}
|
|
65
|
+
export type WaitForSessionStatus = 'live' | 'completed' | 'cancelled' | 'failed' | 'timeout';
|
|
66
|
+
export interface IWaitForSessionResult {
|
|
67
|
+
sessionId: string;
|
|
68
|
+
taskId: string;
|
|
69
|
+
status: WaitForSessionStatus;
|
|
70
|
+
message: string;
|
|
71
|
+
taskStatus?: string;
|
|
72
|
+
taskType?: string;
|
|
73
|
+
organizationId?: number;
|
|
74
|
+
createdAt?: string;
|
|
75
|
+
updatedAt?: string;
|
|
76
|
+
error?: string;
|
|
77
|
+
}
|
|
53
78
|
export interface IInteractAPI {
|
|
54
79
|
getCommands: () => Promise<IInteractCommand[]>;
|
|
55
80
|
createShellSession: (options: CreateInteractShellSessionOptions) => Promise<InteractShellSession>;
|
|
@@ -58,5 +83,6 @@ export interface IInteractAPI {
|
|
|
58
83
|
getCommandMessage: (options: IGetInteractCommandMessageOptions) => Promise<InteractCommandMessage>;
|
|
59
84
|
interruptCommand: (options: IInterruptInteractCommandOptions) => Promise<InteractInterruptCommandResult>;
|
|
60
85
|
closeSession: (options: ICloseInteractSessionOptions) => Promise<ICloseSessionResult>;
|
|
86
|
+
waitForSession: (options: IWaitForSessionOptions) => Promise<IWaitForSessionResult>;
|
|
61
87
|
}
|
|
62
88
|
export {};
|
package/dist/types/tasks.d.ts
CHANGED
|
@@ -122,4 +122,29 @@ export interface ITasksAPI {
|
|
|
122
122
|
get: (options: IGetTaskOptions) => Promise<Task>;
|
|
123
123
|
getMany: (options?: IGetTasksOptions) => Promise<ITasksPage>;
|
|
124
124
|
getAssignments: (options: IGetTaskAssignmentsOptions) => Promise<ITaskAssignmentsPage>;
|
|
125
|
+
waitForCompletion: (options: IWaitForCompletionOptions) => Promise<IWaitForCompletionResult>;
|
|
126
|
+
}
|
|
127
|
+
export interface IWaitForCompletionOptions {
|
|
128
|
+
taskId: string;
|
|
129
|
+
/**
|
|
130
|
+
* Timeout in seconds. If 0 or undefined, waits indefinitely.
|
|
131
|
+
*/
|
|
132
|
+
timeoutSeconds?: number;
|
|
133
|
+
/**
|
|
134
|
+
* Poll interval in milliseconds. If not provided, defaults to 300000 when waiting indefinitely,
|
|
135
|
+
* otherwise 60000.
|
|
136
|
+
*/
|
|
137
|
+
pollIntervalMs?: number;
|
|
138
|
+
}
|
|
139
|
+
export type WaitForCompletionStatus = 'completed' | 'cancelled' | 'failed' | 'timeout';
|
|
140
|
+
export interface IWaitForCompletionResult {
|
|
141
|
+
taskId: string;
|
|
142
|
+
status: WaitForCompletionStatus;
|
|
143
|
+
message: string;
|
|
144
|
+
taskStatus?: string;
|
|
145
|
+
taskType?: string;
|
|
146
|
+
organizationId?: number;
|
|
147
|
+
createdAt?: string;
|
|
148
|
+
updatedAt?: string;
|
|
149
|
+
error?: string;
|
|
125
150
|
}
|