@permission-slip/cli 0.1.4 → 0.1.10
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 +12 -13
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +37 -33
- package/dist/api/client.js.map +1 -1
- package/dist/commands/request-status.d.ts +4 -3
- package/dist/commands/request-status.d.ts.map +1 -1
- package/dist/commands/request-status.js +6 -27
- package/dist/commands/request-status.js.map +1 -1
- package/dist/commands/request.d.ts +4 -3
- package/dist/commands/request.d.ts.map +1 -1
- package/dist/commands/request.js +29 -35
- package/dist/commands/request.js.map +1 -1
- package/dist/commands/status.d.ts +4 -2
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +15 -5
- package/dist/commands/status.js.map +1 -1
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -5
- package/dist/index.js.map +1 -1
- package/package.json +4 -2
- package/dist/commands/execute.d.ts +0 -17
- package/dist/commands/execute.d.ts.map +0 -1
- package/dist/commands/execute.js +0 -58
- package/dist/commands/execute.js.map +0 -1
- package/dist/util/poll.d.ts +0 -30
- package/dist/util/poll.d.ts.map +0 -1
- package/dist/util/poll.js +0 -88
- package/dist/util/poll.js.map +0 -1
package/dist/api/client.d.ts
CHANGED
|
@@ -77,26 +77,25 @@ export declare class ApiClient {
|
|
|
77
77
|
connectors(): Promise<unknown>;
|
|
78
78
|
/** GET /connectors/{id} — public, no auth */
|
|
79
79
|
connector(id: string): Promise<unknown>;
|
|
80
|
-
/** POST /approvals/request */
|
|
80
|
+
/** POST /approvals/request — may auto-approve if a standing approval matches */
|
|
81
81
|
requestApproval(actionId: string, params: unknown, context?: {
|
|
82
82
|
description?: string;
|
|
83
83
|
risk_level?: string;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
|
|
84
|
+
}, payment?: {
|
|
85
|
+
paymentMethodId?: string;
|
|
86
|
+
amountCents?: number;
|
|
87
|
+
}, requestId?: string): Promise<{
|
|
88
|
+
approval_id?: string;
|
|
89
|
+
approval_url?: string;
|
|
87
90
|
status: string;
|
|
88
|
-
expires_at
|
|
89
|
-
|
|
91
|
+
expires_at?: string;
|
|
92
|
+
created_at?: string;
|
|
93
|
+
result?: unknown;
|
|
94
|
+
standing_approval_id?: string;
|
|
95
|
+
executions_remaining?: number | null;
|
|
90
96
|
}>;
|
|
91
97
|
/** GET /approvals/{id}/status — check approval and execution status */
|
|
92
98
|
approvalStatus(approvalId: string): Promise<ApprovalStatusResult>;
|
|
93
|
-
/** POST /actions/execute */
|
|
94
|
-
execute(tokenOrConfigId: {
|
|
95
|
-
token: string;
|
|
96
|
-
} | {
|
|
97
|
-
configuration_id: string;
|
|
98
|
-
request_id?: string;
|
|
99
|
-
}, actionId: string | undefined, params: unknown): Promise<unknown>;
|
|
100
99
|
}
|
|
101
100
|
export {};
|
|
102
101
|
//# sourceMappingURL=client.d.ts.map
|
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,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;
|
|
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;IAsElD,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,gFAAgF;IAC1E,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,EACvD,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,EAC5D,SAAS,CAAC,EAAE,MAAM;sBAiBF,MAAM;uBACL,MAAM;gBACb,MAAM;qBACD,MAAM;qBACN,MAAM;iBACV,OAAO;+BACO,MAAM;+BACN,MAAM,GAAG,IAAI;;IAQxC,uEAAuE;IACjE,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;CAMxE"}
|
package/dist/api/client.js
CHANGED
|
@@ -70,11 +70,26 @@ export class ApiClient {
|
|
|
70
70
|
}
|
|
71
71
|
const fullPath = opts.apiPath ?? `/api/v1${opts.routerPath}`;
|
|
72
72
|
const url = `${this.base}${fullPath}`;
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
73
|
+
const controller = new AbortController();
|
|
74
|
+
const timeoutId = setTimeout(() => controller.abort(), 30_000);
|
|
75
|
+
let res;
|
|
76
|
+
try {
|
|
77
|
+
res = await fetch(url, {
|
|
78
|
+
method: opts.method,
|
|
79
|
+
headers,
|
|
80
|
+
body: bodyStr,
|
|
81
|
+
signal: controller.signal,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
if (err instanceof DOMException && err.name === "AbortError") {
|
|
86
|
+
throw new Error(`Request timed out after 30s: ${opts.method} ${fullPath}`);
|
|
87
|
+
}
|
|
88
|
+
throw err;
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
clearTimeout(timeoutId);
|
|
92
|
+
}
|
|
78
93
|
if (!res.ok) {
|
|
79
94
|
let apiError;
|
|
80
95
|
try {
|
|
@@ -157,17 +172,26 @@ export class ApiClient {
|
|
|
157
172
|
public: true,
|
|
158
173
|
});
|
|
159
174
|
}
|
|
160
|
-
/** POST /approvals/request */
|
|
161
|
-
async requestApproval(actionId, params, context) {
|
|
162
|
-
const
|
|
175
|
+
/** POST /approvals/request — may auto-approve if a standing approval matches */
|
|
176
|
+
async requestApproval(actionId, params, context, payment, requestId) {
|
|
177
|
+
const resolvedRequestId = (requestId && requestId.trim().length > 0)
|
|
178
|
+
? requestId
|
|
179
|
+
: crypto.randomUUID();
|
|
180
|
+
const body = {
|
|
181
|
+
request_id: resolvedRequestId,
|
|
182
|
+
action: { type: actionId, parameters: params },
|
|
183
|
+
context: context ?? {},
|
|
184
|
+
};
|
|
185
|
+
if (payment?.paymentMethodId) {
|
|
186
|
+
body.payment_method_id = payment.paymentMethodId;
|
|
187
|
+
}
|
|
188
|
+
if (payment?.amountCents !== undefined) {
|
|
189
|
+
body.amount_cents = payment.amountCents;
|
|
190
|
+
}
|
|
163
191
|
return this.request({
|
|
164
192
|
method: "POST",
|
|
165
193
|
routerPath: "/approvals/request",
|
|
166
|
-
body
|
|
167
|
-
request_id: requestId,
|
|
168
|
-
action: { type: actionId, parameters: params },
|
|
169
|
-
context: context ?? {},
|
|
170
|
-
},
|
|
194
|
+
body,
|
|
171
195
|
});
|
|
172
196
|
}
|
|
173
197
|
/** GET /approvals/{id}/status — check approval and execution status */
|
|
@@ -177,25 +201,5 @@ export class ApiClient {
|
|
|
177
201
|
routerPath: `/approvals/${approvalId}/status`,
|
|
178
202
|
});
|
|
179
203
|
}
|
|
180
|
-
/** POST /actions/execute */
|
|
181
|
-
async execute(tokenOrConfigId, actionId, params) {
|
|
182
|
-
const requestId = crypto.randomUUID();
|
|
183
|
-
let body;
|
|
184
|
-
if ("token" in tokenOrConfigId) {
|
|
185
|
-
body = { token: tokenOrConfigId.token, action_id: actionId, parameters: params };
|
|
186
|
-
}
|
|
187
|
-
else {
|
|
188
|
-
body = {
|
|
189
|
-
request_id: tokenOrConfigId.request_id ?? requestId,
|
|
190
|
-
configuration_id: tokenOrConfigId.configuration_id,
|
|
191
|
-
parameters: params,
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
|
-
return this.request({
|
|
195
|
-
method: "POST",
|
|
196
|
-
routerPath: "/actions/execute",
|
|
197
|
-
body,
|
|
198
|
-
});
|
|
199
|
-
}
|
|
200
204
|
}
|
|
201
205
|
//# sourceMappingURL=client.js.map
|
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;AAoBjF,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAE7B;IACA;IAFlB,YACkB,UAAkB,EAClB,QAAkB;QAElC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAHR,eAAU,GAAV,UAAU,CAAQ;QAClB,aAAQ,GAAR,QAAQ,CAAU;QAGlC,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AASD;;GAEG;AACH,SAAS,aAAa,CAAC,GAAW;IAChC,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAAC,UAAkB;IACrC,OAAO,UAAU,CAAC;AACpB,CAAC;AAaD,MAAM,OAAO,SAAS;IACZ,IAAI,CAAS;IACb,OAAO,CAAkB;IAEjC,YAAY,IAAmB;QAC7B,2DAA2D;QAC3D,IAAI,MAAW,CAAC;QAChB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAChE,MAAM,IAAI,KAAK,CACb,0CAA0C,MAAM,CAAC,QAAQ,KAAK;gBAC9D,0BAA0B,CAC3B,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,OAAO,CAAI,IAAoB;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAChF,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,YAAY,EAAE,sBAAsB;SACrC,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,CAAC;YACrD,OAAO,CAAC,6BAA6B,CAAC,GAAG,oBAAoB,CAAC;gBAC5D,OAAO;gBACP,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC;gBAClC,IAAI,EAAE,OAAO;aACd,CAAC,CAAC;QACL,CAAC;QAED,MAAM,QAAQ,GACZ,IAAI,CAAC,OAAO,IAAI,UAAU,IAAI,CAAC,UAAU,EAAE,CAAC;QAC9C,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,QAAQ,EAAE,CAAC;QAEtC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* permission-slip request-status --approval-id <id> [--server <url>]
|
|
3
3
|
*
|
|
4
|
-
* Checks the status of a previously submitted approval request.
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Checks the status of a previously submitted approval request. Always
|
|
5
|
+
* returns immediately with the current status.
|
|
6
|
+
*
|
|
7
|
+
* Deprecated: prefer `permission-slip status <approval_id>` instead.
|
|
7
8
|
*/
|
|
8
9
|
import type { Command } from "commander";
|
|
9
10
|
export declare function requestStatusCommand(program: Command): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-status.d.ts","sourceRoot":"","sources":["../../src/commands/request-status.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"request-status.d.ts","sourceRoot":"","sources":["../../src/commands/request-status.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8B3D"}
|
|
@@ -1,50 +1,29 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* permission-slip request-status --approval-id <id> [--server <url>]
|
|
3
3
|
*
|
|
4
|
-
* Checks the status of a previously submitted approval request.
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Checks the status of a previously submitted approval request. Always
|
|
5
|
+
* returns immediately with the current status.
|
|
6
|
+
*
|
|
7
|
+
* Deprecated: prefer `permission-slip status <approval_id>` instead.
|
|
7
8
|
*/
|
|
8
9
|
import { ApiClient } from "../api/client.js";
|
|
9
10
|
import { resolveAgentId } from "./status.js";
|
|
10
11
|
import { output } from "../output.js";
|
|
11
|
-
import { pollUntilResolved, parseTimeout } from "../util/poll.js";
|
|
12
12
|
export function requestStatusCommand(program) {
|
|
13
13
|
program
|
|
14
14
|
.command("request-status")
|
|
15
|
-
.description("Check
|
|
15
|
+
.description("Check approval status (deprecated: use 'status <approval_id>' instead)")
|
|
16
16
|
.requiredOption("--approval-id <id>", "Approval ID returned by the request command")
|
|
17
17
|
.option("--server <url>", "Permission Slip server URL", "https://app.permissionslip.dev")
|
|
18
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
19
|
.option("--pretty", "Pretty-printed JSON (default is compact JSON)")
|
|
22
20
|
.action(async (opts) => {
|
|
23
21
|
const outputOpts = { pretty: opts.pretty ?? false };
|
|
24
22
|
try {
|
|
25
23
|
const agentId = resolveAgentId(opts.server, opts.agentId);
|
|
26
24
|
const client = new ApiClient({ serverUrl: opts.server, agentId });
|
|
27
|
-
|
|
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
|
-
});
|
|
25
|
+
const result = await client.approvalStatus(opts.approvalId);
|
|
44
26
|
output(result, outputOpts);
|
|
45
|
-
if (result.timed_out) {
|
|
46
|
-
process.exitCode = 2;
|
|
47
|
-
}
|
|
48
27
|
}
|
|
49
28
|
catch (err) {
|
|
50
29
|
output({ error: err instanceof Error ? err.message : String(err) }, outputOpts);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-status.js","sourceRoot":"","sources":["../../src/commands/request-status.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"request-status.js","sourceRoot":"","sources":["../../src/commands/request-status.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;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,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,wEAAwE,CAAC;SACrF,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,UAAU,EAAE,+CAA+C,CAAC;SACnE,MAAM,CAAC,KAAK,EAAE,IAKd,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,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC5D,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"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* permission-slip request --action <action_id> [--params '{}'] [--server <url>]
|
|
3
3
|
*
|
|
4
|
-
* Requests
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Requests approval for an action. If a matching standing approval exists,
|
|
5
|
+
* the action is auto-approved and executed immediately — the result is
|
|
6
|
+
* returned inline. Otherwise, creates a pending approval and returns
|
|
7
|
+
* an approval_id to poll via `permission-slip status`.
|
|
7
8
|
*/
|
|
8
9
|
import type { Command } from "commander";
|
|
9
10
|
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;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2FrD"}
|
package/dist/commands/request.js
CHANGED
|
@@ -1,27 +1,28 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* permission-slip request --action <action_id> [--params '{}'] [--server <url>]
|
|
3
3
|
*
|
|
4
|
-
* Requests
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Requests approval for an action. If a matching standing approval exists,
|
|
5
|
+
* the action is auto-approved and executed immediately — the result is
|
|
6
|
+
* returned inline. Otherwise, creates a pending approval and returns
|
|
7
|
+
* an approval_id to poll via `permission-slip status`.
|
|
7
8
|
*/
|
|
8
|
-
import { ApiClient } from "../api/client.js";
|
|
9
|
+
import { ApiClient, PermissionSlipApiError } from "../api/client.js";
|
|
9
10
|
import { resolveAgentId } from "./status.js";
|
|
10
11
|
import { output } from "../output.js";
|
|
11
12
|
import { shellQuote } from "../util/shell.js";
|
|
12
|
-
import { pollUntilResolved, parseTimeout } from "../util/poll.js";
|
|
13
13
|
export function requestCommand(program) {
|
|
14
14
|
program
|
|
15
15
|
.command("request")
|
|
16
|
-
.description("Request approval for an action")
|
|
16
|
+
.description("Request approval for an action (auto-approves if a standing approval matches)")
|
|
17
17
|
.requiredOption("--action <action_id>", "Action type (e.g. email.send)")
|
|
18
18
|
.option("--params <json>", "Action parameters as JSON string", "{}")
|
|
19
19
|
.option("--description <text>", "Human-readable description of the action")
|
|
20
20
|
.option("--risk-level <level>", "Risk level: low, medium, high")
|
|
21
21
|
.option("--server <url>", "Permission Slip server URL", "https://app.permissionslip.dev")
|
|
22
22
|
.option("--agent-id <id>", "Agent ID (auto-detected from saved registration)")
|
|
23
|
-
.option("--
|
|
24
|
-
.option("--
|
|
23
|
+
.option("--request-id <id>", "Idempotency key — reuse across retries to prevent duplicate execution")
|
|
24
|
+
.option("--payment-method-id <id>", "Payment method ID for payment-required actions")
|
|
25
|
+
.option("--amount-cents <cents>", "Transaction amount in cents (required with --payment-method-id)", parseInt)
|
|
25
26
|
.option("--pretty", "Pretty-printed JSON (default is compact JSON)")
|
|
26
27
|
.action(async (opts) => {
|
|
27
28
|
const outputOpts = { pretty: opts.pretty ?? false };
|
|
@@ -41,39 +42,32 @@ export function requestCommand(program) {
|
|
|
41
42
|
risk_level: opts.riskLevel,
|
|
42
43
|
}
|
|
43
44
|
: undefined;
|
|
44
|
-
const result = await client.requestApproval(opts.action, params, context);
|
|
45
|
-
if (
|
|
46
|
-
//
|
|
45
|
+
const result = await client.requestApproval(opts.action, params, context, { paymentMethodId: opts.paymentMethodId, amountCents: opts.amountCents }, opts.requestId);
|
|
46
|
+
if (result.status === "approved") {
|
|
47
|
+
// Auto-approved via standing approval — action already executed, result is inline.
|
|
48
|
+
// Include executed flag so external tools know no further action is needed.
|
|
49
|
+
output({ ...result, executed: true }, outputOpts);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
// Pending — tell the user how to check the result.
|
|
47
53
|
output({
|
|
48
54
|
...result,
|
|
49
|
-
next_step: "
|
|
50
|
-
|
|
51
|
-
`
|
|
52
|
-
(opts.server !== "https://app.permissionslip.dev" ? ` --server ${shellQuote(opts.server)}` : "") +
|
|
53
|
-
" (this blocks until resolved; add --no-wait for a single status check)",
|
|
55
|
+
next_step: "Approval requested. To check the result, run: " +
|
|
56
|
+
`permission-slip status ${shellQuote(result.approval_id ?? "")}` +
|
|
57
|
+
(opts.server !== "https://app.permissionslip.dev" ? ` --server ${shellQuote(opts.server)}` : ""),
|
|
54
58
|
}, 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
|
-
});
|
|
68
|
-
output({
|
|
69
|
-
...statusResult,
|
|
70
|
-
approval_url: result.approval_url,
|
|
71
|
-
}, outputOpts);
|
|
72
|
-
if (statusResult.timed_out) {
|
|
73
|
-
process.exitCode = 2;
|
|
74
59
|
}
|
|
75
60
|
}
|
|
76
61
|
catch (err) {
|
|
62
|
+
// Treat 409 duplicate_request_id as an idempotency success — the action
|
|
63
|
+
// was already executed on a prior call with this request_id. Exit 0 so
|
|
64
|
+
// external tools (AI agents, MCP wrappers) don't retry.
|
|
65
|
+
if (err instanceof PermissionSlipApiError &&
|
|
66
|
+
err.statusCode === 409 &&
|
|
67
|
+
err.apiError.code === "duplicate_request_id") {
|
|
68
|
+
output({ status: "duplicate", executed: true, request_id: opts.requestId }, outputOpts);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
77
71
|
output({ error: err instanceof Error ? err.message : String(err) }, outputOpts);
|
|
78
72
|
process.exit(1);
|
|
79
73
|
}
|
|
@@ -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":"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"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* permission-slip status [--server <url>]
|
|
2
|
+
* permission-slip status [<approval_id>] [--server <url>]
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Without an approval_id: shows the current registration state.
|
|
5
|
+
* With an approval_id: checks the status of a previously submitted approval
|
|
6
|
+
* request. Always returns immediately with the current status.
|
|
5
7
|
*/
|
|
6
8
|
import type { Command } from "commander";
|
|
7
9
|
export declare function statusCommand(program: Command): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqCpD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAc3E"}
|
package/dist/commands/status.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* permission-slip status [--server <url>]
|
|
2
|
+
* permission-slip status [<approval_id>] [--server <url>]
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Without an approval_id: shows the current registration state.
|
|
5
|
+
* With an approval_id: checks the status of a previously submitted approval
|
|
6
|
+
* request. Always returns immediately with the current status.
|
|
5
7
|
*/
|
|
6
8
|
import { ApiClient } from "../api/client.js";
|
|
7
9
|
import { findRegistration } from "../config/store.js";
|
|
@@ -9,16 +11,24 @@ import { output } from "../output.js";
|
|
|
9
11
|
export function statusCommand(program) {
|
|
10
12
|
program
|
|
11
13
|
.command("status")
|
|
12
|
-
.description("Show
|
|
14
|
+
.description("Show registration state, or check approval status with an approval_id")
|
|
15
|
+
.argument("[approval_id]", "Approval ID to check (omit for registration status)")
|
|
13
16
|
.option("--server <url>", "Permission Slip server URL", "https://app.permissionslip.dev")
|
|
14
17
|
.option("--agent-id <id>", "Agent ID (auto-detected from saved registration)")
|
|
15
18
|
.option("--pretty", "Pretty-printed JSON (default is compact JSON)")
|
|
16
|
-
.action(async (opts) => {
|
|
19
|
+
.action(async (approvalId, opts) => {
|
|
17
20
|
const outputOpts = { pretty: opts.pretty ?? false };
|
|
18
21
|
try {
|
|
19
22
|
const agentId = resolveAgentId(opts.server, opts.agentId);
|
|
20
23
|
const client = new ApiClient({ serverUrl: opts.server, agentId });
|
|
21
|
-
|
|
24
|
+
if (!approvalId) {
|
|
25
|
+
// No approval_id: show registration state.
|
|
26
|
+
const result = await client.status();
|
|
27
|
+
output(result, outputOpts);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
// Single check, return immediately.
|
|
31
|
+
const result = await client.approvalStatus(approvalId);
|
|
22
32
|
output(result, outputOpts);
|
|
23
33
|
}
|
|
24
34
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAsB,MAAM,cAAc,CAAC;AAE1D,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,uEAAuE,CAAC;SACpF,QAAQ,CAAC,eAAe,EAAE,qDAAqD,CAAC;SAChF,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,UAA8B,EAAE,IAI9C,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,UAAU,EAAE,CAAC;gBAChB,2CAA2C;gBAC3C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;gBACrC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;gBAC3B,OAAO;YACT,CAAC;YAED,oCAAoC;YACpC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YACvD,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;AAED,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,WAAoB;IACjE,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,EAAE,GAAG,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACrC,IAAI,KAAK,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,WAAW,EAAE,CAAC,CAAC;QACnE,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,GAAG,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,6BAA6B,MAAM,IAAI;YACvC,4DAA4D,CAC7D,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC,QAAQ,CAAC;AACtB,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -8,12 +8,11 @@
|
|
|
8
8
|
* Commands:
|
|
9
9
|
* register Generate keys and register with a Permission Slip server
|
|
10
10
|
* verify Complete registration with the confirmation code
|
|
11
|
-
* status Show
|
|
11
|
+
* status Show registration state, or check approval status
|
|
12
12
|
* capabilities List available action configurations and standing approvals
|
|
13
13
|
* connectors List available connectors
|
|
14
|
-
* request Request approval for an action (auto-
|
|
14
|
+
* request Request approval for an action (auto-approves if standing approval matches)
|
|
15
15
|
* request-status Check the status/outcome of an approval request
|
|
16
|
-
* execute Execute an action using a standing approval
|
|
17
16
|
* config Show saved configuration and registrations
|
|
18
17
|
* whoami Show agent identity and registration info
|
|
19
18
|
*
|
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;;;;;;;;;;;;;;;;;;GAkBG"}
|
package/dist/index.js
CHANGED
|
@@ -8,12 +8,11 @@
|
|
|
8
8
|
* Commands:
|
|
9
9
|
* register Generate keys and register with a Permission Slip server
|
|
10
10
|
* verify Complete registration with the confirmation code
|
|
11
|
-
* status Show
|
|
11
|
+
* status Show registration state, or check approval status
|
|
12
12
|
* capabilities List available action configurations and standing approvals
|
|
13
13
|
* connectors List available connectors
|
|
14
|
-
* request Request approval for an action (auto-
|
|
14
|
+
* request Request approval for an action (auto-approves if standing approval matches)
|
|
15
15
|
* request-status Check the status/outcome of an approval request
|
|
16
|
-
* execute Execute an action using a standing approval
|
|
17
16
|
* config Show saved configuration and registrations
|
|
18
17
|
* whoami Show agent identity and registration info
|
|
19
18
|
*
|
|
@@ -27,7 +26,6 @@ import { capabilitiesCommand } from "./commands/capabilities.js";
|
|
|
27
26
|
import { connectorsCommand } from "./commands/connectors.js";
|
|
28
27
|
import { requestCommand } from "./commands/request.js";
|
|
29
28
|
import { requestStatusCommand } from "./commands/request-status.js";
|
|
30
|
-
import { executeCommand } from "./commands/execute.js";
|
|
31
29
|
import { configCommand } from "./commands/config.js";
|
|
32
30
|
import { whoamiCommand } from "./commands/whoami.js";
|
|
33
31
|
const program = new Command();
|
|
@@ -47,7 +45,6 @@ capabilitiesCommand(program);
|
|
|
47
45
|
connectorsCommand(program);
|
|
48
46
|
requestCommand(program);
|
|
49
47
|
requestStatusCommand(program);
|
|
50
|
-
executeCommand(program);
|
|
51
48
|
configCommand(program);
|
|
52
49
|
whoamiCommand(program);
|
|
53
50
|
program.parse(process.argv);
|
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;;;;;;;;;;;;;;;;;;GAkBG;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,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,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,aAAa,CAAC,OAAO,CAAC,CAAC;AAEvB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@permission-slip/cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.10",
|
|
4
4
|
"description": "Agent-facing CLI for Permission Slip — register, verify, and interact with Permission Slip servers",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -45,7 +45,9 @@
|
|
|
45
45
|
{
|
|
46
46
|
"useESM": true,
|
|
47
47
|
"diagnostics": {
|
|
48
|
-
"ignoreCodes": [
|
|
48
|
+
"ignoreCodes": [
|
|
49
|
+
151002
|
|
50
|
+
]
|
|
49
51
|
}
|
|
50
52
|
}
|
|
51
53
|
]
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* permission-slip execute --configuration <id> [--params '{}'] [--server <url>]
|
|
3
|
-
*
|
|
4
|
-
* Executes an action using a standing approval configuration.
|
|
5
|
-
*
|
|
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
|
-
*/
|
|
15
|
-
import type { Command } from "commander";
|
|
16
|
-
export declare function executeCommand(program: Command): void;
|
|
17
|
-
//# sourceMappingURL=execute.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../src/commands/execute.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuDrD"}
|
package/dist/commands/execute.js
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* permission-slip execute --configuration <id> [--params '{}'] [--server <url>]
|
|
3
|
-
*
|
|
4
|
-
* Executes an action using a standing approval configuration.
|
|
5
|
-
*
|
|
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
|
-
*/
|
|
15
|
-
import { ApiClient } from "../api/client.js";
|
|
16
|
-
import { resolveAgentId } from "./status.js";
|
|
17
|
-
import { output } from "../output.js";
|
|
18
|
-
export function executeCommand(program) {
|
|
19
|
-
program
|
|
20
|
-
.command("execute")
|
|
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
|
-
.option("--configuration <id>", "Standing approval configuration ID")
|
|
24
|
-
.option("--action <action_id>", "Action type (required with --token)")
|
|
25
|
-
.option("--params <json>", "Action parameters as JSON string", "{}")
|
|
26
|
-
.option("--server <url>", "Permission Slip server URL", "https://app.permissionslip.dev")
|
|
27
|
-
.option("--agent-id <id>", "Agent ID (auto-detected from saved registration)")
|
|
28
|
-
.option("--pretty", "Pretty-printed JSON (default is compact JSON)")
|
|
29
|
-
.action(async (opts) => {
|
|
30
|
-
const outputOpts = { pretty: opts.pretty ?? false };
|
|
31
|
-
try {
|
|
32
|
-
if (!opts.token && !opts.configuration) {
|
|
33
|
-
throw new Error("Provide either --token <token> (one-off approval) or --configuration <id> (standing approval).");
|
|
34
|
-
}
|
|
35
|
-
if (opts.token && !opts.action) {
|
|
36
|
-
throw new Error("--action <action_id> is required when using --token.");
|
|
37
|
-
}
|
|
38
|
-
let params;
|
|
39
|
-
try {
|
|
40
|
-
params = JSON.parse(opts.params);
|
|
41
|
-
}
|
|
42
|
-
catch {
|
|
43
|
-
throw new Error(`--params must be valid JSON. Got: ${opts.params}`);
|
|
44
|
-
}
|
|
45
|
-
const agentId = resolveAgentId(opts.server, opts.agentId);
|
|
46
|
-
const client = new ApiClient({ serverUrl: opts.server, agentId });
|
|
47
|
-
const result = opts.token
|
|
48
|
-
? await client.execute({ token: opts.token }, opts.action, params)
|
|
49
|
-
: await client.execute({ configuration_id: opts.configuration }, undefined, params);
|
|
50
|
-
output(result, outputOpts);
|
|
51
|
-
}
|
|
52
|
-
catch (err) {
|
|
53
|
-
output({ error: err instanceof Error ? err.message : String(err) }, outputOpts);
|
|
54
|
-
process.exit(1);
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
//# sourceMappingURL=execute.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
package/dist/util/poll.d.ts
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
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
|
package/dist/util/poll.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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"}
|
package/dist/util/poll.js
DELETED
|
@@ -1,88 +0,0 @@
|
|
|
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
|
package/dist/util/poll.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"poll.js","sourceRoot":"","sources":["../../src/util/poll.ts"],"names":[],"mappings":"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"}
|