@agent-os-sdk/client 0.2.2 → 0.2.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/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/modules/approvals.d.ts +50 -39
- package/dist/modules/approvals.d.ts.map +1 -1
- package/dist/modules/approvals.js +71 -34
- package/package.json +1 -1
- package/src/index.ts +1 -1
- package/src/modules/approvals.ts +106 -64
package/dist/index.d.ts
CHANGED
|
@@ -72,7 +72,7 @@ export { HandoffModule, type HandoffOptions, type HandoffResult, type ForkOption
|
|
|
72
72
|
export { FlowsModule, type Flow, type FlowStep, type FlowRun, type FlowVisualization, type FlowSimulationResult, type FlowStatus, type FlowListResponse } from "./modules/flows.js";
|
|
73
73
|
export { CapabilitiesModule, type Capability, type CapabilityType, type CapabilityTest, type CapabilityMatrix } from "./modules/capabilities.js";
|
|
74
74
|
export { PoliciesModule, type Policy, type PolicyScope, type PolicyEnforcement, type PolicyRule, type PolicyEvaluation, type PolicyEvaluationResult } from "./modules/policies.js";
|
|
75
|
-
export { ApprovalsModule, type Approval, type ApprovalStatus, type
|
|
75
|
+
export { ApprovalsModule, type Approval, type ApprovalStatus, type ApprovalDecision, type ApprovalListResponse, type ApprovalStatusResponse } from "./modules/approvals.js";
|
|
76
76
|
export { BudgetsModule, type Budget, type BudgetPeriod, type BudgetScope, type BudgetResourceType, type BudgetUsage, type BudgetAlert, type BudgetBreakdownItem } from "./modules/budgets.js";
|
|
77
77
|
export { DeploymentsModule, type Environment, type Deployment, type DeploymentStatus, type DeploymentConfig, type DeploymentHealth } from "./modules/deployments.js";
|
|
78
78
|
export { IncidentsModule, type Incident, type IncidentSeverity, type IncidentStatus, type IncidentUpdate, type IncidentMetrics } from "./modules/incidents.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,64 +1,75 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Approvals Module - Human-in-the-Loop Native
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Wave 2.x: Real implementation for HITL workflow.
|
|
5
|
+
* Endpoints: /v1/api/workspaces/{workspaceId}/approvals
|
|
6
6
|
*/
|
|
7
7
|
import type { RawClient, APIResponse } from "../client/raw.js";
|
|
8
|
-
export type ApprovalStatus = "pending" | "approved" | "
|
|
8
|
+
export type ApprovalStatus = "pending" | "approved" | "denied" | "expired";
|
|
9
9
|
export interface Approval {
|
|
10
10
|
id: string;
|
|
11
11
|
run_id: string;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
attempt_id: string;
|
|
13
|
+
policy_name: string;
|
|
14
|
+
reason: string;
|
|
15
15
|
status: ApprovalStatus;
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
expires_at?: string;
|
|
21
|
-
auto_approve_after?: number;
|
|
16
|
+
created_at: string;
|
|
17
|
+
decided_at?: string;
|
|
18
|
+
decided_by_actor?: string;
|
|
19
|
+
payload?: Record<string, unknown>;
|
|
22
20
|
}
|
|
23
|
-
export interface
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
payload: Record<string, unknown>;
|
|
27
|
-
expires_in_seconds?: number;
|
|
28
|
-
auto_approve_after_seconds?: number;
|
|
29
|
-
notify_channels?: string[];
|
|
21
|
+
export interface ApprovalDecision {
|
|
22
|
+
decision: "approve" | "deny";
|
|
23
|
+
comment?: string;
|
|
30
24
|
}
|
|
31
25
|
export interface ApprovalListResponse {
|
|
32
26
|
items: Approval[];
|
|
33
27
|
total: number;
|
|
34
|
-
pending_count: number;
|
|
35
28
|
}
|
|
36
|
-
export interface
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
29
|
+
export interface ApprovalStatusResponse {
|
|
30
|
+
id: string;
|
|
31
|
+
status: ApprovalStatus;
|
|
32
|
+
decided_at?: string;
|
|
33
|
+
decided_by_actor?: string;
|
|
34
|
+
decision_comment?: string;
|
|
41
35
|
}
|
|
42
36
|
export declare class ApprovalsModule {
|
|
43
37
|
private client;
|
|
44
38
|
private headers;
|
|
45
39
|
constructor(client: RawClient, headers: () => Record<string, string>);
|
|
46
|
-
/**
|
|
47
|
-
|
|
40
|
+
/**
|
|
41
|
+
* List approvals for a workspace.
|
|
42
|
+
* @param workspaceId - Workspace ID
|
|
43
|
+
* @param params - Filter options
|
|
44
|
+
*/
|
|
45
|
+
list(workspaceId: string, params?: {
|
|
48
46
|
status?: ApprovalStatus;
|
|
49
|
-
run_id?: string;
|
|
50
47
|
limit?: number;
|
|
51
|
-
offset?: number;
|
|
52
48
|
}): Promise<APIResponse<ApprovalListResponse>>;
|
|
53
|
-
/**
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
49
|
+
/**
|
|
50
|
+
* Get a specific approval by ID.
|
|
51
|
+
* @param workspaceId - Workspace ID
|
|
52
|
+
* @param approvalId - Approval ID
|
|
53
|
+
*/
|
|
54
|
+
get(workspaceId: string, approvalId: string): Promise<APIResponse<Approval>>;
|
|
55
|
+
/**
|
|
56
|
+
* Approve an approval request.
|
|
57
|
+
* @param workspaceId - Workspace ID
|
|
58
|
+
* @param approvalId - Approval ID
|
|
59
|
+
* @param comment - Optional reason for approval
|
|
60
|
+
*/
|
|
61
|
+
approve(workspaceId: string, approvalId: string, comment?: string): Promise<APIResponse<ApprovalStatusResponse>>;
|
|
62
|
+
/**
|
|
63
|
+
* Deny an approval request.
|
|
64
|
+
* @param workspaceId - Workspace ID
|
|
65
|
+
* @param approvalId - Approval ID
|
|
66
|
+
* @param comment - Optional reason for denial
|
|
67
|
+
*/
|
|
68
|
+
deny(workspaceId: string, approvalId: string, comment?: string): Promise<APIResponse<ApprovalStatusResponse>>;
|
|
69
|
+
/**
|
|
70
|
+
* Shorthand: List pending approvals for a workspace.
|
|
71
|
+
*/
|
|
72
|
+
listPending(workspaceId: string, limit?: number): Promise<APIResponse<ApprovalListResponse>>;
|
|
73
|
+
reject: (workspaceId: string, approvalId: string, comment?: string) => Promise<APIResponse<ApprovalStatusResponse>>;
|
|
63
74
|
}
|
|
64
75
|
//# sourceMappingURL=approvals.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approvals.d.ts","sourceRoot":"","sources":["../../src/modules/approvals.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAM/D,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,UAAU,GAAG,
|
|
1
|
+
{"version":3,"file":"approvals.d.ts","sourceRoot":"","sources":["../../src/modules/approvals.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAM/D,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE3E,MAAM,WAAW,QAAQ;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,cAAc,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,EAAE,SAAS,GAAG,MAAM,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACjC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,cAAc,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAMD,qBAAa,eAAe;IAEpB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,OAAO;gBADP,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAGjD;;;;OAIG;IACG,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE;QACrC,MAAM,CAAC,EAAE,cAAc,CAAC;QACxB,KAAK,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC;IAgB9C;;;;OAIG;IACG,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAYlF;;;;;OAKG;IACG,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC;IAgBtH;;;;;OAKG;IACG,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC;IAgBnH;;OAEG;IACG,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC;IAK9F,MAAM,gBAxBkB,MAAM,cAAc,MAAM,YAAY,MAAM,KAAG,OAAO,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC,CAwBhG;CACtB"}
|
|
@@ -1,23 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Approvals Module - Human-in-the-Loop Native
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Wave 2.x: Real implementation for HITL workflow.
|
|
5
|
+
* Endpoints: /v1/api/workspaces/{workspaceId}/approvals
|
|
6
6
|
*/
|
|
7
7
|
// ============================================================================
|
|
8
|
-
// Helper for 501 responses
|
|
9
|
-
// ============================================================================
|
|
10
|
-
function notImplemented(method) {
|
|
11
|
-
return {
|
|
12
|
-
data: undefined,
|
|
13
|
-
error: {
|
|
14
|
-
code: "NOT_IMPLEMENTED",
|
|
15
|
-
message: `ApprovalsModule.${method}() is not implemented. Backend endpoint not available.`,
|
|
16
|
-
},
|
|
17
|
-
response: new Response(null, { status: 501, statusText: "Not Implemented" }),
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
// ============================================================================
|
|
21
8
|
// Module
|
|
22
9
|
// ============================================================================
|
|
23
10
|
export class ApprovalsModule {
|
|
@@ -27,28 +14,78 @@ export class ApprovalsModule {
|
|
|
27
14
|
this.client = client;
|
|
28
15
|
this.headers = headers;
|
|
29
16
|
}
|
|
30
|
-
/**
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
async
|
|
36
|
-
return
|
|
17
|
+
/**
|
|
18
|
+
* List approvals for a workspace.
|
|
19
|
+
* @param workspaceId - Workspace ID
|
|
20
|
+
* @param params - Filter options
|
|
21
|
+
*/
|
|
22
|
+
async list(workspaceId, params) {
|
|
23
|
+
return this.client.GET("/v1/api/workspaces/{workspaceId}/approvals", {
|
|
24
|
+
params: {
|
|
25
|
+
path: { workspaceId },
|
|
26
|
+
query: {
|
|
27
|
+
status: params?.status,
|
|
28
|
+
limit: params?.limit ?? 50
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
headers: this.headers(),
|
|
32
|
+
});
|
|
37
33
|
}
|
|
38
|
-
/**
|
|
39
|
-
|
|
40
|
-
|
|
34
|
+
/**
|
|
35
|
+
* Get a specific approval by ID.
|
|
36
|
+
* @param workspaceId - Workspace ID
|
|
37
|
+
* @param approvalId - Approval ID
|
|
38
|
+
*/
|
|
39
|
+
async get(workspaceId, approvalId) {
|
|
40
|
+
return this.client.GET("/v1/api/workspaces/{workspaceId}/approvals/{approvalId}", {
|
|
41
|
+
params: {
|
|
42
|
+
path: { workspaceId, approvalId }
|
|
43
|
+
},
|
|
44
|
+
headers: this.headers(),
|
|
45
|
+
});
|
|
41
46
|
}
|
|
42
|
-
/**
|
|
43
|
-
|
|
44
|
-
|
|
47
|
+
/**
|
|
48
|
+
* Approve an approval request.
|
|
49
|
+
* @param workspaceId - Workspace ID
|
|
50
|
+
* @param approvalId - Approval ID
|
|
51
|
+
* @param comment - Optional reason for approval
|
|
52
|
+
*/
|
|
53
|
+
async approve(workspaceId, approvalId, comment) {
|
|
54
|
+
return this.client.POST("/v1/api/workspaces/{workspaceId}/approvals/{approvalId}/decision", {
|
|
55
|
+
params: {
|
|
56
|
+
path: { workspaceId, approvalId }
|
|
57
|
+
},
|
|
58
|
+
body: {
|
|
59
|
+
decision: "approve",
|
|
60
|
+
comment
|
|
61
|
+
},
|
|
62
|
+
headers: this.headers(),
|
|
63
|
+
});
|
|
45
64
|
}
|
|
46
|
-
/**
|
|
47
|
-
|
|
48
|
-
|
|
65
|
+
/**
|
|
66
|
+
* Deny an approval request.
|
|
67
|
+
* @param workspaceId - Workspace ID
|
|
68
|
+
* @param approvalId - Approval ID
|
|
69
|
+
* @param comment - Optional reason for denial
|
|
70
|
+
*/
|
|
71
|
+
async deny(workspaceId, approvalId, comment) {
|
|
72
|
+
return this.client.POST("/v1/api/workspaces/{workspaceId}/approvals/{approvalId}/decision", {
|
|
73
|
+
params: {
|
|
74
|
+
path: { workspaceId, approvalId }
|
|
75
|
+
},
|
|
76
|
+
body: {
|
|
77
|
+
decision: "deny",
|
|
78
|
+
comment
|
|
79
|
+
},
|
|
80
|
+
headers: this.headers(),
|
|
81
|
+
});
|
|
49
82
|
}
|
|
50
|
-
/**
|
|
51
|
-
|
|
52
|
-
|
|
83
|
+
/**
|
|
84
|
+
* Shorthand: List pending approvals for a workspace.
|
|
85
|
+
*/
|
|
86
|
+
async listPending(workspaceId, limit = 50) {
|
|
87
|
+
return this.list(workspaceId, { status: "pending", limit });
|
|
53
88
|
}
|
|
89
|
+
// Convenience aliases
|
|
90
|
+
reject = this.deny;
|
|
54
91
|
}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -122,7 +122,7 @@ export { HandoffModule, type HandoffOptions, type HandoffResult, type ForkOption
|
|
|
122
122
|
export { FlowsModule, type Flow, type FlowStep, type FlowRun, type FlowVisualization, type FlowSimulationResult, type FlowStatus, type FlowListResponse } from "./modules/flows.js";
|
|
123
123
|
export { CapabilitiesModule, type Capability, type CapabilityType, type CapabilityTest, type CapabilityMatrix } from "./modules/capabilities.js";
|
|
124
124
|
export { PoliciesModule, type Policy, type PolicyScope, type PolicyEnforcement, type PolicyRule, type PolicyEvaluation, type PolicyEvaluationResult } from "./modules/policies.js";
|
|
125
|
-
export { ApprovalsModule, type Approval, type ApprovalStatus, type
|
|
125
|
+
export { ApprovalsModule, type Approval, type ApprovalStatus, type ApprovalDecision, type ApprovalListResponse, type ApprovalStatusResponse } from "./modules/approvals.js";
|
|
126
126
|
export { BudgetsModule, type Budget, type BudgetPeriod, type BudgetScope, type BudgetResourceType, type BudgetUsage, type BudgetAlert, type BudgetBreakdownItem } from "./modules/budgets.js";
|
|
127
127
|
export { DeploymentsModule, type Environment, type Deployment, type DeploymentStatus, type DeploymentConfig, type DeploymentHealth } from "./modules/deployments.js";
|
|
128
128
|
export { IncidentsModule, type Incident, type IncidentSeverity, type IncidentStatus, type IncidentUpdate, type IncidentMetrics } from "./modules/incidents.js";
|
package/src/modules/approvals.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Approvals Module - Human-in-the-Loop Native
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
*
|
|
4
|
+
* Wave 2.x: Real implementation for HITL workflow.
|
|
5
|
+
* Endpoints: /v1/api/workspaces/{workspaceId}/approvals
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import type { RawClient, APIResponse } from "../client/raw.js";
|
|
@@ -11,58 +11,37 @@ import type { RawClient, APIResponse } from "../client/raw.js";
|
|
|
11
11
|
// Types
|
|
12
12
|
// ============================================================================
|
|
13
13
|
|
|
14
|
-
export type ApprovalStatus = "pending" | "approved" | "
|
|
14
|
+
export type ApprovalStatus = "pending" | "approved" | "denied" | "expired";
|
|
15
15
|
|
|
16
16
|
export interface Approval {
|
|
17
17
|
id: string;
|
|
18
18
|
run_id: string;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
attempt_id: string;
|
|
20
|
+
policy_name: string;
|
|
21
|
+
reason: string;
|
|
22
22
|
status: ApprovalStatus;
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
expires_at?: string;
|
|
28
|
-
auto_approve_after?: number;
|
|
23
|
+
created_at: string;
|
|
24
|
+
decided_at?: string;
|
|
25
|
+
decided_by_actor?: string;
|
|
26
|
+
payload?: Record<string, unknown>;
|
|
29
27
|
}
|
|
30
28
|
|
|
31
|
-
export interface
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
payload: Record<string, unknown>;
|
|
35
|
-
expires_in_seconds?: number;
|
|
36
|
-
auto_approve_after_seconds?: number;
|
|
37
|
-
notify_channels?: string[];
|
|
29
|
+
export interface ApprovalDecision {
|
|
30
|
+
decision: "approve" | "deny";
|
|
31
|
+
comment?: string;
|
|
38
32
|
}
|
|
39
33
|
|
|
40
34
|
export interface ApprovalListResponse {
|
|
41
35
|
items: Approval[];
|
|
42
36
|
total: number;
|
|
43
|
-
pending_count: number;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export interface ApprovalDecision {
|
|
47
|
-
approval_id: string;
|
|
48
|
-
decision: "approve" | "reject";
|
|
49
|
-
reason?: string;
|
|
50
|
-
modified_payload?: Record<string, unknown>;
|
|
51
37
|
}
|
|
52
38
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
data: undefined,
|
|
60
|
-
error: {
|
|
61
|
-
code: "NOT_IMPLEMENTED",
|
|
62
|
-
message: `ApprovalsModule.${method}() is not implemented. Backend endpoint not available.`,
|
|
63
|
-
},
|
|
64
|
-
response: new Response(null, { status: 501, statusText: "Not Implemented" }),
|
|
65
|
-
};
|
|
39
|
+
export interface ApprovalStatusResponse {
|
|
40
|
+
id: string;
|
|
41
|
+
status: ApprovalStatus;
|
|
42
|
+
decided_at?: string;
|
|
43
|
+
decided_by_actor?: string;
|
|
44
|
+
decision_comment?: string;
|
|
66
45
|
}
|
|
67
46
|
|
|
68
47
|
// ============================================================================
|
|
@@ -70,40 +49,103 @@ function notImplemented<T>(method: string): APIResponse<T> {
|
|
|
70
49
|
// ============================================================================
|
|
71
50
|
|
|
72
51
|
export class ApprovalsModule {
|
|
73
|
-
constructor(
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
52
|
+
constructor(
|
|
53
|
+
private client: RawClient,
|
|
54
|
+
private headers: () => Record<string, string>
|
|
55
|
+
) { }
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* List approvals for a workspace.
|
|
59
|
+
* @param workspaceId - Workspace ID
|
|
60
|
+
* @param params - Filter options
|
|
61
|
+
*/
|
|
62
|
+
async list(workspaceId: string, params?: {
|
|
77
63
|
status?: ApprovalStatus;
|
|
78
|
-
run_id?: string;
|
|
79
64
|
limit?: number;
|
|
80
|
-
offset?: number;
|
|
81
65
|
}): Promise<APIResponse<ApprovalListResponse>> {
|
|
82
|
-
return
|
|
66
|
+
return this.client.GET<ApprovalListResponse>(
|
|
67
|
+
"/v1/api/workspaces/{workspaceId}/approvals",
|
|
68
|
+
{
|
|
69
|
+
params: {
|
|
70
|
+
path: { workspaceId },
|
|
71
|
+
query: {
|
|
72
|
+
status: params?.status,
|
|
73
|
+
limit: params?.limit ?? 50
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
headers: this.headers(),
|
|
77
|
+
}
|
|
78
|
+
);
|
|
83
79
|
}
|
|
84
80
|
|
|
85
|
-
/**
|
|
86
|
-
|
|
87
|
-
|
|
81
|
+
/**
|
|
82
|
+
* Get a specific approval by ID.
|
|
83
|
+
* @param workspaceId - Workspace ID
|
|
84
|
+
* @param approvalId - Approval ID
|
|
85
|
+
*/
|
|
86
|
+
async get(workspaceId: string, approvalId: string): Promise<APIResponse<Approval>> {
|
|
87
|
+
return this.client.GET<Approval>(
|
|
88
|
+
"/v1/api/workspaces/{workspaceId}/approvals/{approvalId}",
|
|
89
|
+
{
|
|
90
|
+
params: {
|
|
91
|
+
path: { workspaceId, approvalId }
|
|
92
|
+
},
|
|
93
|
+
headers: this.headers(),
|
|
94
|
+
}
|
|
95
|
+
);
|
|
88
96
|
}
|
|
89
97
|
|
|
90
|
-
/**
|
|
91
|
-
|
|
92
|
-
|
|
98
|
+
/**
|
|
99
|
+
* Approve an approval request.
|
|
100
|
+
* @param workspaceId - Workspace ID
|
|
101
|
+
* @param approvalId - Approval ID
|
|
102
|
+
* @param comment - Optional reason for approval
|
|
103
|
+
*/
|
|
104
|
+
async approve(workspaceId: string, approvalId: string, comment?: string): Promise<APIResponse<ApprovalStatusResponse>> {
|
|
105
|
+
return this.client.POST<ApprovalStatusResponse>(
|
|
106
|
+
"/v1/api/workspaces/{workspaceId}/approvals/{approvalId}/decision",
|
|
107
|
+
{
|
|
108
|
+
params: {
|
|
109
|
+
path: { workspaceId, approvalId }
|
|
110
|
+
},
|
|
111
|
+
body: {
|
|
112
|
+
decision: "approve",
|
|
113
|
+
comment
|
|
114
|
+
},
|
|
115
|
+
headers: this.headers(),
|
|
116
|
+
}
|
|
117
|
+
);
|
|
93
118
|
}
|
|
94
119
|
|
|
95
|
-
/**
|
|
96
|
-
|
|
97
|
-
|
|
120
|
+
/**
|
|
121
|
+
* Deny an approval request.
|
|
122
|
+
* @param workspaceId - Workspace ID
|
|
123
|
+
* @param approvalId - Approval ID
|
|
124
|
+
* @param comment - Optional reason for denial
|
|
125
|
+
*/
|
|
126
|
+
async deny(workspaceId: string, approvalId: string, comment?: string): Promise<APIResponse<ApprovalStatusResponse>> {
|
|
127
|
+
return this.client.POST<ApprovalStatusResponse>(
|
|
128
|
+
"/v1/api/workspaces/{workspaceId}/approvals/{approvalId}/decision",
|
|
129
|
+
{
|
|
130
|
+
params: {
|
|
131
|
+
path: { workspaceId, approvalId }
|
|
132
|
+
},
|
|
133
|
+
body: {
|
|
134
|
+
decision: "deny",
|
|
135
|
+
comment
|
|
136
|
+
},
|
|
137
|
+
headers: this.headers(),
|
|
138
|
+
}
|
|
139
|
+
);
|
|
98
140
|
}
|
|
99
141
|
|
|
100
|
-
/**
|
|
101
|
-
|
|
102
|
-
|
|
142
|
+
/**
|
|
143
|
+
* Shorthand: List pending approvals for a workspace.
|
|
144
|
+
*/
|
|
145
|
+
async listPending(workspaceId: string, limit = 50): Promise<APIResponse<ApprovalListResponse>> {
|
|
146
|
+
return this.list(workspaceId, { status: "pending", limit });
|
|
103
147
|
}
|
|
104
148
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
return notImplemented<Approval>("awaitApproval");
|
|
108
|
-
}
|
|
149
|
+
// Convenience aliases
|
|
150
|
+
reject = this.deny;
|
|
109
151
|
}
|