@permission-slip/cli 0.1.0 → 0.1.4
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/api/client.d.ts +11 -0
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +12 -1
- package/dist/api/client.js.map +1 -1
- package/dist/commands/execute.d.ts +9 -9
- package/dist/commands/execute.js +11 -11
- package/dist/commands/execute.js.map +1 -1
- package/dist/commands/request-status.d.ts +10 -0
- package/dist/commands/request-status.d.ts.map +1 -0
- package/dist/commands/request-status.js +55 -0
- package/dist/commands/request-status.js.map +1 -0
- package/dist/commands/request.d.ts +3 -2
- package/dist/commands/request.d.ts.map +1 -1
- package/dist/commands/request.js +34 -6
- package/dist/commands/request.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/util/poll.d.ts +30 -0
- package/dist/util/poll.d.ts.map +1 -0
- package/dist/util/poll.js +88 -0
- package/dist/util/poll.js.map +1 -0
- package/package.json +1 -1
package/dist/api/client.d.ts
CHANGED
|
@@ -16,6 +16,15 @@ export interface ApiError {
|
|
|
16
16
|
details?: Record<string, unknown>;
|
|
17
17
|
trace_id?: string;
|
|
18
18
|
}
|
|
19
|
+
/** Shape returned by GET /approvals/{id}/status. */
|
|
20
|
+
export interface ApprovalStatusResult {
|
|
21
|
+
approval_id: string;
|
|
22
|
+
status: string;
|
|
23
|
+
expires_at: string;
|
|
24
|
+
created_at: string;
|
|
25
|
+
execution_status?: string;
|
|
26
|
+
execution_result?: unknown;
|
|
27
|
+
}
|
|
19
28
|
export declare class PermissionSlipApiError extends Error {
|
|
20
29
|
readonly statusCode: number;
|
|
21
30
|
readonly apiError: ApiError;
|
|
@@ -79,6 +88,8 @@ export declare class ApiClient {
|
|
|
79
88
|
expires_at: string;
|
|
80
89
|
verification_required: boolean;
|
|
81
90
|
}>;
|
|
91
|
+
/** GET /approvals/{id}/status — check approval and execution status */
|
|
92
|
+
approvalStatus(approvalId: string): Promise<ApprovalStatusResult>;
|
|
82
93
|
/** POST /actions/execute */
|
|
83
94
|
execute(tokenOrConfigId: {
|
|
84
95
|
token: string;
|
package/dist/api/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,sBAAuB,SAAQ,KAAK;aAE7B,UAAU,EAAE,MAAM;aAClB,QAAQ,EAAE,QAAQ;gBADlB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,QAAQ;CAKrC;AAED,MAAM,WAAW,aAAa;IAC5B,kFAAkF;IAClF,SAAS,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;CAC1B;AAiBD,UAAU,cAAc;IACtB,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,0EAA0E;IAC1E,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAClC,8DAA8D;IAC9D,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,OAAO,CAAkB;gBAErB,IAAI,EAAE,aAAa;IAkBzB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC;IAwDlD,yDAAyD;IACnD,QAAQ,CACZ,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,SAAU;kBAIL,MAAM;oBACJ,MAAM;+BACK,OAAO;;IAclC,4EAA4E;IACtE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM;gBAEtB,MAAM;uBAAiB,MAAM;;IAQ7D,4CAA4C;IACtC,MAAM;kBAEE,MAAM;gBACR,MAAM;kBACJ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;uBAClB,MAAM;wBACL,MAAM;oBACV,MAAM;;IAOtB,oCAAoC;IAC9B,YAAY,CAAC,OAAO,EAAE,MAAM;IAQlC,wCAAwC;IAClC,UAAU;IAQhB,6CAA6C;IACvC,SAAS,CAAC,EAAE,EAAE,MAAM;IAQ1B,8BAA8B;IACxB,eAAe,CACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,EACf,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE;qBAIxC,MAAM;sBACL,MAAM;gBACZ,MAAM;oBACF,MAAM;+BACK,OAAO;;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,oDAAoD;AACpD,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,qBAAa,sBAAuB,SAAQ,KAAK;aAE7B,UAAU,EAAE,MAAM;aAClB,QAAQ,EAAE,QAAQ;gBADlB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,QAAQ;CAKrC;AAED,MAAM,WAAW,aAAa;IAC5B,kFAAkF;IAClF,SAAS,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;CAC1B;AAiBD,UAAU,cAAc;IACtB,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,0EAA0E;IAC1E,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAClC,8DAA8D;IAC9D,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,OAAO,CAAkB;gBAErB,IAAI,EAAE,aAAa;IAkBzB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC;IAwDlD,yDAAyD;IACnD,QAAQ,CACZ,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,SAAU;kBAIL,MAAM;oBACJ,MAAM;+BACK,OAAO;;IAclC,4EAA4E;IACtE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM;gBAEtB,MAAM;uBAAiB,MAAM;;IAQ7D,4CAA4C;IACtC,MAAM;kBAEE,MAAM;gBACR,MAAM;kBACJ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;uBAClB,MAAM;wBACL,MAAM;oBACV,MAAM;;IAOtB,oCAAoC;IAC9B,YAAY,CAAC,OAAO,EAAE,MAAM;IAQlC,wCAAwC;IAClC,UAAU;IAQhB,6CAA6C;IACvC,SAAS,CAAC,EAAE,EAAE,MAAM;IAQ1B,8BAA8B;IACxB,eAAe,CACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,EACf,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE;qBAIxC,MAAM;sBACL,MAAM;gBACZ,MAAM;oBACF,MAAM;+BACK,OAAO;;IAYlC,uEAAuE;IACjE,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAOvE,4BAA4B;IACtB,OAAO,CACX,eAAe,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,gBAAgB,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,EACtF,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,MAAM,EAAE,OAAO;CAmBlB"}
|
package/dist/api/client.js
CHANGED
|
@@ -163,7 +163,18 @@ export class ApiClient {
|
|
|
163
163
|
return this.request({
|
|
164
164
|
method: "POST",
|
|
165
165
|
routerPath: "/approvals/request",
|
|
166
|
-
body: {
|
|
166
|
+
body: {
|
|
167
|
+
request_id: requestId,
|
|
168
|
+
action: { type: actionId, parameters: params },
|
|
169
|
+
context: context ?? {},
|
|
170
|
+
},
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
/** GET /approvals/{id}/status — check approval and execution status */
|
|
174
|
+
async approvalStatus(approvalId) {
|
|
175
|
+
return this.request({
|
|
176
|
+
method: "GET",
|
|
177
|
+
routerPath: `/approvals/${approvalId}/status`,
|
|
167
178
|
});
|
|
168
179
|
}
|
|
169
180
|
/** POST /actions/execute */
|
package/dist/api/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* permission-slip execute --token <token> [--action <id>] [--params '{}'] [--server <url>]
|
|
3
|
-
* or
|
|
4
2
|
* permission-slip execute --configuration <id> [--params '{}'] [--server <url>]
|
|
5
3
|
*
|
|
6
|
-
* Executes an
|
|
7
|
-
* - A one-off execution token (obtained after the user approves a request)
|
|
8
|
-
* - A standing approval configuration (--configuration)
|
|
4
|
+
* Executes an action using a standing approval configuration.
|
|
9
5
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
6
|
+
* Standing approvals are pre-approved recurring action configurations. Use
|
|
7
|
+
* `permission-slip capabilities` to see available standing approvals and
|
|
8
|
+
* their configuration IDs.
|
|
9
|
+
*
|
|
10
|
+
* NOTE: For one-off approvals (created via `permission-slip request`), the
|
|
11
|
+
* server auto-executes the action when the approver approves it — you do NOT
|
|
12
|
+
* need to call `execute`. Use `permission-slip request-status` to check the
|
|
13
|
+
* outcome instead.
|
|
14
14
|
*/
|
|
15
15
|
import type { Command } from "commander";
|
|
16
16
|
export declare function executeCommand(program: Command): void;
|
package/dist/commands/execute.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* permission-slip execute --token <token> [--action <id>] [--params '{}'] [--server <url>]
|
|
3
|
-
* or
|
|
4
2
|
* permission-slip execute --configuration <id> [--params '{}'] [--server <url>]
|
|
5
3
|
*
|
|
6
|
-
* Executes an
|
|
7
|
-
* - A one-off execution token (obtained after the user approves a request)
|
|
8
|
-
* - A standing approval configuration (--configuration)
|
|
4
|
+
* Executes an action using a standing approval configuration.
|
|
9
5
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
6
|
+
* Standing approvals are pre-approved recurring action configurations. Use
|
|
7
|
+
* `permission-slip capabilities` to see available standing approvals and
|
|
8
|
+
* their configuration IDs.
|
|
9
|
+
*
|
|
10
|
+
* NOTE: For one-off approvals (created via `permission-slip request`), the
|
|
11
|
+
* server auto-executes the action when the approver approves it — you do NOT
|
|
12
|
+
* need to call `execute`. Use `permission-slip request-status` to check the
|
|
13
|
+
* outcome instead.
|
|
14
14
|
*/
|
|
15
15
|
import { ApiClient } from "../api/client.js";
|
|
16
16
|
import { resolveAgentId } from "./status.js";
|
|
@@ -18,8 +18,8 @@ import { output } from "../output.js";
|
|
|
18
18
|
export function executeCommand(program) {
|
|
19
19
|
program
|
|
20
20
|
.command("execute")
|
|
21
|
-
.description("Execute an
|
|
22
|
-
.option("--token <token>", "Execution token (
|
|
21
|
+
.description("Execute an action using a standing approval (one-off approvals auto-execute on approval)")
|
|
22
|
+
.option("--token <token>", "Execution token (advanced — most agents should use --configuration instead)")
|
|
23
23
|
.option("--configuration <id>", "Standing approval configuration ID")
|
|
24
24
|
.option("--action <action_id>", "Action type (required with --token)")
|
|
25
25
|
.option("--params <json>", "Action parameters as JSON string", "{}")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../src/commands/execute.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAsB,MAAM,cAAc,CAAC;AAE1D,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../src/commands/execute.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAsB,MAAM,cAAc,CAAC;AAE1D,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,0FAA0F,CAAC;SACvG,MAAM,CAAC,iBAAiB,EAAE,6EAA6E,CAAC;SACxG,MAAM,CAAC,sBAAsB,EAAE,oCAAoC,CAAC;SACpE,MAAM,CAAC,sBAAsB,EAAE,qCAAqC,CAAC;SACrE,MAAM,CAAC,iBAAiB,EAAE,kCAAkC,EAAE,IAAI,CAAC;SACnE,MAAM,CACL,gBAAgB,EAChB,4BAA4B,EAC5B,gCAAgC,CACjC;SACA,MAAM,CAAC,iBAAiB,EAAE,kDAAkD,CAAC;SAC7E,MAAM,CAAC,UAAU,EAAE,+CAA+C,CAAC;SACnE,MAAM,CAAC,KAAK,EAAE,IAQd,EAAE,EAAE;QACH,MAAM,UAAU,GAAkB,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC;QACnE,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;gBACvC,MAAM,IAAI,KAAK,CACb,gGAAgG,CACjG,CAAC;YACJ,CAAC;YACD,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC/B,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;YAC1E,CAAC;YAED,IAAI,MAAe,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,IAAI,KAAK,CAAC,qCAAqC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YACtE,CAAC;YAED,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1D,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YAElE,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK;gBAChC,CAAC,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;gBAClE,CAAC,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,aAAc,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;YAEvF,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* permission-slip request-status --approval-id <id> [--server <url>]
|
|
3
|
+
*
|
|
4
|
+
* Checks the status of a previously submitted approval request. By default,
|
|
5
|
+
* blocks until the approval reaches a terminal state. Pass --no-wait for a
|
|
6
|
+
* single status check.
|
|
7
|
+
*/
|
|
8
|
+
import type { Command } from "commander";
|
|
9
|
+
export declare function requestStatusCommand(program: Command): void;
|
|
10
|
+
//# sourceMappingURL=request-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-status.d.ts","sourceRoot":"","sources":["../../src/commands/request-status.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4D3D"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* permission-slip request-status --approval-id <id> [--server <url>]
|
|
3
|
+
*
|
|
4
|
+
* Checks the status of a previously submitted approval request. By default,
|
|
5
|
+
* blocks until the approval reaches a terminal state. Pass --no-wait for a
|
|
6
|
+
* single status check.
|
|
7
|
+
*/
|
|
8
|
+
import { ApiClient } from "../api/client.js";
|
|
9
|
+
import { resolveAgentId } from "./status.js";
|
|
10
|
+
import { output } from "../output.js";
|
|
11
|
+
import { pollUntilResolved, parseTimeout } from "../util/poll.js";
|
|
12
|
+
export function requestStatusCommand(program) {
|
|
13
|
+
program
|
|
14
|
+
.command("request-status")
|
|
15
|
+
.description("Check the status of an approval request")
|
|
16
|
+
.requiredOption("--approval-id <id>", "Approval ID returned by the request command")
|
|
17
|
+
.option("--server <url>", "Permission Slip server URL", "https://app.permissionslip.dev")
|
|
18
|
+
.option("--agent-id <id>", "Agent ID (auto-detected from saved registration)")
|
|
19
|
+
.option("--no-wait", "Return immediately without waiting for resolution")
|
|
20
|
+
.option("--timeout <seconds>", "Max seconds to wait for resolution (default: 120)", "120")
|
|
21
|
+
.option("--pretty", "Pretty-printed JSON (default is compact JSON)")
|
|
22
|
+
.action(async (opts) => {
|
|
23
|
+
const outputOpts = { pretty: opts.pretty ?? false };
|
|
24
|
+
try {
|
|
25
|
+
const agentId = resolveAgentId(opts.server, opts.agentId);
|
|
26
|
+
const client = new ApiClient({ serverUrl: opts.server, agentId });
|
|
27
|
+
if (!opts.wait) {
|
|
28
|
+
// Single check, no waiting.
|
|
29
|
+
const result = await client.approvalStatus(opts.approvalId);
|
|
30
|
+
output(result, outputOpts);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
// Wait for terminal state.
|
|
34
|
+
const timeoutSeconds = parseTimeout(opts.timeout);
|
|
35
|
+
process.stderr.write(`Waiting for approval ${opts.approvalId}...\n`);
|
|
36
|
+
const result = await pollUntilResolved({
|
|
37
|
+
approvalId: opts.approvalId,
|
|
38
|
+
client,
|
|
39
|
+
timeoutSeconds,
|
|
40
|
+
onPoll: ({ elapsed, timeout }) => {
|
|
41
|
+
process.stderr.write(`Still waiting... ${elapsed}s / ${timeout}s\n`);
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
output(result, outputOpts);
|
|
45
|
+
if (result.timed_out) {
|
|
46
|
+
process.exitCode = 2;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
output({ error: err instanceof Error ? err.message : String(err) }, outputOpts);
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=request-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-status.js","sourceRoot":"","sources":["../../src/commands/request-status.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAsB,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAElE,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,yCAAyC,CAAC;SACtD,cAAc,CAAC,oBAAoB,EAAE,6CAA6C,CAAC;SACnF,MAAM,CACL,gBAAgB,EAChB,4BAA4B,EAC5B,gCAAgC,CACjC;SACA,MAAM,CAAC,iBAAiB,EAAE,kDAAkD,CAAC;SAC7E,MAAM,CAAC,WAAW,EAAE,mDAAmD,CAAC;SACxE,MAAM,CAAC,qBAAqB,EAAE,mDAAmD,EAAE,KAAK,CAAC;SACzF,MAAM,CAAC,UAAU,EAAE,+CAA+C,CAAC;SACnE,MAAM,CAAC,KAAK,EAAE,IAOd,EAAE,EAAE;QACH,MAAM,UAAU,GAAkB,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC;QACnE,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1D,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YAElE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACf,4BAA4B;gBAC5B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAC5D,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;gBAC3B,OAAO;YACT,CAAC;YAED,2BAA2B;YAC3B,MAAM,cAAc,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAElD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,IAAI,CAAC,UAAU,OAAO,CAAC,CAAC;YAErE,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC;gBACrC,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,MAAM;gBACN,cAAc;gBACd,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE;oBAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,oBAAoB,OAAO,OAAO,OAAO,KAAK,CAC/C,CAAC;gBACJ,CAAC;aACF,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;YAE3B,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBACrB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* permission-slip request --action <action_id> [--params '{}'] [--server <url>]
|
|
3
3
|
*
|
|
4
|
-
* Requests one-off approval for an action.
|
|
5
|
-
*
|
|
4
|
+
* Requests one-off approval for an action. By default, blocks until the
|
|
5
|
+
* approval is resolved (approved/denied/cancelled/expired) and returns the
|
|
6
|
+
* execution result. Pass --no-wait for fire-and-forget behavior.
|
|
6
7
|
*/
|
|
7
8
|
import type { Command } from "commander";
|
|
8
9
|
export declare function requestCommand(program: Command): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/commands/request.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/commands/request.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqGrD"}
|
package/dist/commands/request.js
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* permission-slip request --action <action_id> [--params '{}'] [--server <url>]
|
|
3
3
|
*
|
|
4
|
-
* Requests one-off approval for an action.
|
|
5
|
-
*
|
|
4
|
+
* Requests one-off approval for an action. By default, blocks until the
|
|
5
|
+
* approval is resolved (approved/denied/cancelled/expired) and returns the
|
|
6
|
+
* execution result. Pass --no-wait for fire-and-forget behavior.
|
|
6
7
|
*/
|
|
7
8
|
import { ApiClient } from "../api/client.js";
|
|
8
9
|
import { resolveAgentId } from "./status.js";
|
|
9
10
|
import { output } from "../output.js";
|
|
10
11
|
import { shellQuote } from "../util/shell.js";
|
|
12
|
+
import { pollUntilResolved, parseTimeout } from "../util/poll.js";
|
|
11
13
|
export function requestCommand(program) {
|
|
12
14
|
program
|
|
13
15
|
.command("request")
|
|
@@ -18,6 +20,8 @@ export function requestCommand(program) {
|
|
|
18
20
|
.option("--risk-level <level>", "Risk level: low, medium, high")
|
|
19
21
|
.option("--server <url>", "Permission Slip server URL", "https://app.permissionslip.dev")
|
|
20
22
|
.option("--agent-id <id>", "Agent ID (auto-detected from saved registration)")
|
|
23
|
+
.option("--no-wait", "Return immediately without waiting for approval")
|
|
24
|
+
.option("--timeout <seconds>", "Max seconds to wait for approval (default: 120)", "120")
|
|
21
25
|
.option("--pretty", "Pretty-printed JSON (default is compact JSON)")
|
|
22
26
|
.action(async (opts) => {
|
|
23
27
|
const outputOpts = { pretty: opts.pretty ?? false };
|
|
@@ -38,12 +42,36 @@ export function requestCommand(program) {
|
|
|
38
42
|
}
|
|
39
43
|
: undefined;
|
|
40
44
|
const result = await client.requestApproval(opts.action, params, context);
|
|
45
|
+
if (!opts.wait) {
|
|
46
|
+
// Fire-and-forget: output immediately with next_step hint.
|
|
47
|
+
output({
|
|
48
|
+
...result,
|
|
49
|
+
next_step: "Your request is pending approval. Once approved, the action will execute automatically — no further action is needed from you. " +
|
|
50
|
+
"To wait for the outcome, run: " +
|
|
51
|
+
`permission-slip request-status --approval-id ${shellQuote(result.approval_id)}` +
|
|
52
|
+
(opts.server !== "https://app.permissionslip.dev" ? ` --server ${shellQuote(opts.server)}` : "") +
|
|
53
|
+
" (this blocks until resolved; add --no-wait for a single status check)",
|
|
54
|
+
}, outputOpts);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
// Wait for approval resolution.
|
|
58
|
+
const timeoutSeconds = parseTimeout(opts.timeout);
|
|
59
|
+
process.stderr.write(`Waiting for approval... (approve at ${result.approval_url})\n`);
|
|
60
|
+
const statusResult = await pollUntilResolved({
|
|
61
|
+
approvalId: result.approval_id,
|
|
62
|
+
client,
|
|
63
|
+
timeoutSeconds,
|
|
64
|
+
onPoll: ({ elapsed, timeout }) => {
|
|
65
|
+
process.stderr.write(`Still waiting... ${elapsed}s / ${timeout}s\n`);
|
|
66
|
+
},
|
|
67
|
+
});
|
|
41
68
|
output({
|
|
42
|
-
...
|
|
43
|
-
|
|
44
|
-
`permission-slip execute --token <token> --action ${shellQuote(opts.action)} --params ${shellQuote(opts.params)}` +
|
|
45
|
-
(opts.server !== "https://app.permissionslip.dev" ? ` --server ${shellQuote(opts.server)}` : ""),
|
|
69
|
+
...statusResult,
|
|
70
|
+
approval_url: result.approval_url,
|
|
46
71
|
}, outputOpts);
|
|
72
|
+
if (statusResult.timed_out) {
|
|
73
|
+
process.exitCode = 2;
|
|
74
|
+
}
|
|
47
75
|
}
|
|
48
76
|
catch (err) {
|
|
49
77
|
output({ error: err instanceof Error ? err.message : String(err) }, outputOpts);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/commands/request.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/commands/request.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAsB,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAElE,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,gCAAgC,CAAC;SAC7C,cAAc,CAAC,sBAAsB,EAAE,+BAA+B,CAAC;SACvE,MAAM,CAAC,iBAAiB,EAAE,kCAAkC,EAAE,IAAI,CAAC;SACnE,MAAM,CAAC,sBAAsB,EAAE,0CAA0C,CAAC;SAC1E,MAAM,CAAC,sBAAsB,EAAE,+BAA+B,CAAC;SAC/D,MAAM,CACL,gBAAgB,EAChB,4BAA4B,EAC5B,gCAAgC,CACjC;SACA,MAAM,CAAC,iBAAiB,EAAE,kDAAkD,CAAC;SAC7E,MAAM,CAAC,WAAW,EAAE,iDAAiD,CAAC;SACtE,MAAM,CAAC,qBAAqB,EAAE,iDAAiD,EAAE,KAAK,CAAC;SACvF,MAAM,CAAC,UAAU,EAAE,+CAA+C,CAAC;SACnE,MAAM,CAAC,KAAK,EAAE,IAUd,EAAE,EAAE;QACH,MAAM,UAAU,GAAkB,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC;QACnE,IAAI,CAAC;YACH,IAAI,MAAe,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,IAAI,KAAK,CAAC,qCAAqC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YACtE,CAAC;YAED,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1D,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YAElE,MAAM,OAAO,GACX,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,SAAS;gBAChC,CAAC,CAAC;oBACE,WAAW,EAAE,IAAI,CAAC,WAAW;oBAC7B,UAAU,EAAE,IAAI,CAAC,SAAS;iBAC3B;gBACH,CAAC,CAAC,SAAS,CAAC;YAEhB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAE1E,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACf,2DAA2D;gBAC3D,MAAM,CACJ;oBACE,GAAG,MAAM;oBACT,SAAS,EACP,iIAAiI;wBACjI,gCAAgC;wBAChC,gDAAgD,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE;wBAChF,CAAC,IAAI,CAAC,MAAM,KAAK,gCAAgC,CAAC,CAAC,CAAC,aAAa,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBAChG,wEAAwE;iBAC3E,EACD,UAAU,CACX,CAAC;gBACF,OAAO;YACT,CAAC;YAED,gCAAgC;YAChC,MAAM,cAAc,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAElD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,uCAAuC,MAAM,CAAC,YAAY,KAAK,CAChE,CAAC;YAEF,MAAM,YAAY,GAAG,MAAM,iBAAiB,CAAC;gBAC3C,UAAU,EAAE,MAAM,CAAC,WAAW;gBAC9B,MAAM;gBACN,cAAc;gBACd,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE;oBAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,oBAAoB,OAAO,OAAO,OAAO,KAAK,CAC/C,CAAC;gBACJ,CAAC;aACF,CAAC,CAAC;YAEH,MAAM,CACJ;gBACE,GAAG,YAAY;gBACf,YAAY,EAAE,MAAM,CAAC,YAAY;aAClC,EACD,UAAU,CACX,CAAC;YAEF,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC;gBAC3B,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -11,8 +11,9 @@
|
|
|
11
11
|
* status Show current registration state
|
|
12
12
|
* capabilities List available action configurations and standing approvals
|
|
13
13
|
* connectors List available connectors
|
|
14
|
-
* request
|
|
15
|
-
*
|
|
14
|
+
* request Request approval for an action (auto-executes on approval)
|
|
15
|
+
* request-status Check the status/outcome of an approval request
|
|
16
|
+
* execute Execute an action using a standing approval
|
|
16
17
|
* config Show saved configuration and registrations
|
|
17
18
|
* whoami Show agent identity and registration info
|
|
18
19
|
*
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;GAmBG"}
|
package/dist/index.js
CHANGED
|
@@ -11,8 +11,9 @@
|
|
|
11
11
|
* status Show current registration state
|
|
12
12
|
* capabilities List available action configurations and standing approvals
|
|
13
13
|
* connectors List available connectors
|
|
14
|
-
* request
|
|
15
|
-
*
|
|
14
|
+
* request Request approval for an action (auto-executes on approval)
|
|
15
|
+
* request-status Check the status/outcome of an approval request
|
|
16
|
+
* execute Execute an action using a standing approval
|
|
16
17
|
* config Show saved configuration and registrations
|
|
17
18
|
* whoami Show agent identity and registration info
|
|
18
19
|
*
|
|
@@ -25,6 +26,7 @@ import { statusCommand } from "./commands/status.js";
|
|
|
25
26
|
import { capabilitiesCommand } from "./commands/capabilities.js";
|
|
26
27
|
import { connectorsCommand } from "./commands/connectors.js";
|
|
27
28
|
import { requestCommand } from "./commands/request.js";
|
|
29
|
+
import { requestStatusCommand } from "./commands/request-status.js";
|
|
28
30
|
import { executeCommand } from "./commands/execute.js";
|
|
29
31
|
import { configCommand } from "./commands/config.js";
|
|
30
32
|
import { whoamiCommand } from "./commands/whoami.js";
|
|
@@ -44,6 +46,7 @@ statusCommand(program);
|
|
|
44
46
|
capabilitiesCommand(program);
|
|
45
47
|
connectorsCommand(program);
|
|
46
48
|
requestCommand(program);
|
|
49
|
+
requestStatusCommand(program);
|
|
47
50
|
executeCommand(program);
|
|
48
51
|
configCommand(program);
|
|
49
52
|
whoamiCommand(program);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,iBAAiB,CAAC;KACvB,WAAW,CACV,yGAAyG;IACzG,yFAAyF;IACzF,gBAAgB;IAChB,iEAAiE;IACjE,qEAAqE;IACrE,8CAA8C,CAC/C;KACA,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,eAAe,CAAC,OAAO,CAAC,CAAC;AACzB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,iBAAiB,CAAC,OAAO,CAAC,CAAC;AAC3B,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,aAAa,CAAC,OAAO,CAAC,CAAC;AAEvB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Polls an approval's status until it reaches a terminal state or timeout.
|
|
3
|
+
*/
|
|
4
|
+
import { type ApiClient, type ApprovalStatusResult } from "../api/client.js";
|
|
5
|
+
export type { ApprovalStatusResult };
|
|
6
|
+
export interface PollOptions {
|
|
7
|
+
approvalId: string;
|
|
8
|
+
client: ApiClient;
|
|
9
|
+
/** Maximum seconds to wait before returning. */
|
|
10
|
+
timeoutSeconds: number;
|
|
11
|
+
/** Called after each poll while still pending. Use for progress messages. */
|
|
12
|
+
onPoll?: (info: {
|
|
13
|
+
status: string;
|
|
14
|
+
elapsed: number;
|
|
15
|
+
timeout: number;
|
|
16
|
+
}) => void;
|
|
17
|
+
}
|
|
18
|
+
/** Parses and clamps a timeout string to a valid range. Warns on invalid input. */
|
|
19
|
+
export declare function parseTimeout(value: string | undefined, warn?: (msg: string) => void): number;
|
|
20
|
+
/**
|
|
21
|
+
* Polls `GET /approvals/{id}/status` with gentle backoff until the approval
|
|
22
|
+
* reaches a terminal state (approved/denied/cancelled/expired) or the timeout
|
|
23
|
+
* elapses. Returns the last status result. Transient errors — API errors
|
|
24
|
+
* (429, 5xx, retryable) and native network failures (TypeError from fetch) —
|
|
25
|
+
* are silently retried on the next interval instead of aborting the wait.
|
|
26
|
+
*/
|
|
27
|
+
export declare function pollUntilResolved(opts: PollOptions): Promise<ApprovalStatusResult & {
|
|
28
|
+
timed_out?: boolean;
|
|
29
|
+
}>;
|
|
30
|
+
//# sourceMappingURL=poll.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poll.d.ts","sourceRoot":"","sources":["../../src/util/poll.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,KAAK,SAAS,EACd,KAAK,oBAAoB,EAE1B,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EAAE,oBAAoB,EAAE,CAAC;AAErC,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,SAAS,CAAC;IAClB,gDAAgD;IAChD,cAAc,EAAE,MAAM,CAAC;IACvB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAC/E;AAQD,mFAAmF;AACnF,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAyC,GAAG,MAAM,CAOhI;AAkBD;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,WAAW,GAChB,OAAO,CAAC,oBAAoB,GAAG;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAmDzD"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Polls an approval's status until it reaches a terminal state or timeout.
|
|
3
|
+
*/
|
|
4
|
+
import { PermissionSlipApiError, } from "../api/client.js";
|
|
5
|
+
const TERMINAL_STATUSES = new Set(["approved", "denied", "cancelled", "expired"]);
|
|
6
|
+
const DEFAULT_TIMEOUT = 120;
|
|
7
|
+
const MIN_TIMEOUT = 1;
|
|
8
|
+
const MAX_TIMEOUT = 86400;
|
|
9
|
+
/** Parses and clamps a timeout string to a valid range. Warns on invalid input. */
|
|
10
|
+
export function parseTimeout(value, warn = (msg) => process.stderr.write(msg)) {
|
|
11
|
+
const parsed = Number(value);
|
|
12
|
+
if (value !== undefined && (isNaN(parsed) || parsed <= 0)) {
|
|
13
|
+
warn(`Warning: invalid --timeout value "${value}", using default ${DEFAULT_TIMEOUT}s\n`);
|
|
14
|
+
return DEFAULT_TIMEOUT;
|
|
15
|
+
}
|
|
16
|
+
return Math.max(MIN_TIMEOUT, Math.min(parsed || DEFAULT_TIMEOUT, MAX_TIMEOUT));
|
|
17
|
+
}
|
|
18
|
+
function sleep(ms) {
|
|
19
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
20
|
+
}
|
|
21
|
+
function isTransientError(err) {
|
|
22
|
+
if (err instanceof PermissionSlipApiError) {
|
|
23
|
+
return err.apiError.retryable || err.statusCode === 429 || err.statusCode >= 500;
|
|
24
|
+
}
|
|
25
|
+
// Native fetch throws TypeError for network-level failures
|
|
26
|
+
// (ECONNREFUSED, DNS errors, aborted connections) — treat as transient.
|
|
27
|
+
if (err instanceof TypeError) {
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Polls `GET /approvals/{id}/status` with gentle backoff until the approval
|
|
34
|
+
* reaches a terminal state (approved/denied/cancelled/expired) or the timeout
|
|
35
|
+
* elapses. Returns the last status result. Transient errors — API errors
|
|
36
|
+
* (429, 5xx, retryable) and native network failures (TypeError from fetch) —
|
|
37
|
+
* are silently retried on the next interval instead of aborting the wait.
|
|
38
|
+
*/
|
|
39
|
+
export async function pollUntilResolved(opts) {
|
|
40
|
+
const start = Date.now();
|
|
41
|
+
const deadline = start + opts.timeoutSeconds * 1000;
|
|
42
|
+
let interval = 2000; // start at 2 seconds
|
|
43
|
+
const maxInterval = 5000; // cap at 5 seconds
|
|
44
|
+
while (Date.now() < deadline) {
|
|
45
|
+
try {
|
|
46
|
+
const result = await opts.client.approvalStatus(opts.approvalId);
|
|
47
|
+
if (TERMINAL_STATUSES.has(result.status)) {
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
opts.onPoll?.({
|
|
51
|
+
status: result.status,
|
|
52
|
+
elapsed: Math.round((Date.now() - start) / 1000),
|
|
53
|
+
timeout: opts.timeoutSeconds,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
if (!isTransientError(err))
|
|
58
|
+
throw err;
|
|
59
|
+
// Transient error — continue to next poll interval.
|
|
60
|
+
}
|
|
61
|
+
const remaining = deadline - Date.now();
|
|
62
|
+
if (remaining <= 0)
|
|
63
|
+
break;
|
|
64
|
+
await sleep(Math.min(interval, remaining));
|
|
65
|
+
interval = Math.min(Math.ceil(interval * 1.5), maxInterval);
|
|
66
|
+
}
|
|
67
|
+
// Final check after timeout — also protected from transient errors.
|
|
68
|
+
try {
|
|
69
|
+
const final = await opts.client.approvalStatus(opts.approvalId);
|
|
70
|
+
if (TERMINAL_STATUSES.has(final.status)) {
|
|
71
|
+
return final;
|
|
72
|
+
}
|
|
73
|
+
return { ...final, timed_out: true };
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
if (!isTransientError(err))
|
|
77
|
+
throw err;
|
|
78
|
+
// Transient error on final check — report timeout with minimal info.
|
|
79
|
+
return {
|
|
80
|
+
approval_id: opts.approvalId,
|
|
81
|
+
status: "pending",
|
|
82
|
+
expires_at: "",
|
|
83
|
+
created_at: "",
|
|
84
|
+
timed_out: true,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=poll.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poll.js","sourceRoot":"","sources":["../../src/util/poll.ts"],"names":[],"mappings":"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"}
|