@switchboard-mcp/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -0
- package/dist/approvals/approval-requests.d.ts +151 -0
- package/dist/approvals/approval-requests.d.ts.map +1 -0
- package/dist/approvals/approval-requests.js +393 -0
- package/dist/approvals/approval-requests.js.map +1 -0
- package/dist/audit/audit-log.d.ts +45 -0
- package/dist/audit/audit-log.d.ts.map +1 -0
- package/dist/audit/audit-log.js +88 -0
- package/dist/audit/audit-log.js.map +1 -0
- package/dist/config/gitignore.d.ts +9 -0
- package/dist/config/gitignore.d.ts.map +1 -0
- package/dist/config/gitignore.js +90 -0
- package/dist/config/gitignore.js.map +1 -0
- package/dist/config/load-config.d.ts +28 -0
- package/dist/config/load-config.d.ts.map +1 -0
- package/dist/config/load-config.js +138 -0
- package/dist/config/load-config.js.map +1 -0
- package/dist/config/paths.d.ts +13 -0
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +38 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/daemon/daemon-state.d.ts +44 -0
- package/dist/daemon/daemon-state.d.ts.map +1 -0
- package/dist/daemon/daemon-state.js +110 -0
- package/dist/daemon/daemon-state.js.map +1 -0
- package/dist/import/import-plan.d.ts +92 -0
- package/dist/import/import-plan.d.ts.map +1 -0
- package/dist/import/import-plan.js +677 -0
- package/dist/import/import-plan.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/install/client-config.d.ts +73 -0
- package/dist/install/client-config.d.ts.map +1 -0
- package/dist/install/client-config.js +514 -0
- package/dist/install/client-config.js.map +1 -0
- package/dist/mandates/mandates.d.ts +244 -0
- package/dist/mandates/mandates.d.ts.map +1 -0
- package/dist/mandates/mandates.js +690 -0
- package/dist/mandates/mandates.js.map +1 -0
- package/dist/namespaces/namespaces.d.ts +16 -0
- package/dist/namespaces/namespaces.d.ts.map +1 -0
- package/dist/namespaces/namespaces.js +49 -0
- package/dist/namespaces/namespaces.js.map +1 -0
- package/dist/onboarding/init-config.d.ts +19 -0
- package/dist/onboarding/init-config.d.ts.map +1 -0
- package/dist/onboarding/init-config.js +85 -0
- package/dist/onboarding/init-config.js.map +1 -0
- package/dist/providers/provider-add.d.ts +25 -0
- package/dist/providers/provider-add.d.ts.map +1 -0
- package/dist/providers/provider-add.js +179 -0
- package/dist/providers/provider-add.js.map +1 -0
- package/dist/providers/provider-templates.d.ts +96 -0
- package/dist/providers/provider-templates.d.ts.map +1 -0
- package/dist/providers/provider-templates.js +556 -0
- package/dist/providers/provider-templates.js.map +1 -0
- package/dist/scan/scan.d.ts +67 -0
- package/dist/scan/scan.d.ts.map +1 -0
- package/dist/scan/scan.js +389 -0
- package/dist/scan/scan.js.map +1 -0
- package/dist/schemas/config.d.ts +197 -0
- package/dist/schemas/config.d.ts.map +1 -0
- package/dist/schemas/config.js +133 -0
- package/dist/schemas/config.js.map +1 -0
- package/dist/secrets/secret-refs.d.ts +10 -0
- package/dist/secrets/secret-refs.d.ts.map +1 -0
- package/dist/secrets/secret-refs.js +32 -0
- package/dist/secrets/secret-refs.js.map +1 -0
- package/dist/secrets/secrets.d.ts +63 -0
- package/dist/secrets/secrets.d.ts.map +1 -0
- package/dist/secrets/secrets.js +301 -0
- package/dist/secrets/secrets.js.map +1 -0
- package/package.json +42 -0
package/README.md
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# @switchboard-mcp/core
|
|
2
|
+
|
|
3
|
+
Core TypeScript primitives for Switchboard config loading, provider safety
|
|
4
|
+
templates, local mandates, approval requests, client install helpers, audit
|
|
5
|
+
logs, and secret references.
|
|
6
|
+
|
|
7
|
+
Most users should install and run `@switchboard-mcp/cli`.
|
|
8
|
+
|
|
9
|
+
Project docs: https://github.com/woverfield/switchboard
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
import type { PathResolutionOptions } from "../config/paths.js";
|
|
3
|
+
export type ApprovalRequestStatus = "pending" | "approved" | "denied" | "stale";
|
|
4
|
+
export type ApprovalRequestRuntimeStatus = ApprovalRequestStatus | "expired";
|
|
5
|
+
export declare const approvalRequestSchema: z.ZodObject<{
|
|
6
|
+
version: z.ZodLiteral<1>;
|
|
7
|
+
id: z.ZodString;
|
|
8
|
+
mandateId: z.ZodString;
|
|
9
|
+
mandateUid: z.ZodOptional<z.ZodString>;
|
|
10
|
+
parentMandateId: z.ZodOptional<z.ZodString>;
|
|
11
|
+
parentMandateUid: z.ZodOptional<z.ZodString>;
|
|
12
|
+
delegatedBy: z.ZodOptional<z.ZodString>;
|
|
13
|
+
delegationPath: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
14
|
+
delegationUids: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
15
|
+
repoPath: z.ZodString;
|
|
16
|
+
branch: z.ZodString;
|
|
17
|
+
toolName: z.ZodString;
|
|
18
|
+
approvalGateId: z.ZodString;
|
|
19
|
+
approvalGatePattern: z.ZodString;
|
|
20
|
+
approvalGateReason: z.ZodOptional<z.ZodString>;
|
|
21
|
+
approvalGateRisk: z.ZodOptional<z.ZodEnum<{
|
|
22
|
+
low: "low";
|
|
23
|
+
medium: "medium";
|
|
24
|
+
high: "high";
|
|
25
|
+
critical: "critical";
|
|
26
|
+
}>>;
|
|
27
|
+
approvalGateLabels: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
28
|
+
status: z.ZodEnum<{
|
|
29
|
+
pending: "pending";
|
|
30
|
+
approved: "approved";
|
|
31
|
+
denied: "denied";
|
|
32
|
+
stale: "stale";
|
|
33
|
+
}>;
|
|
34
|
+
createdAt: z.ZodString;
|
|
35
|
+
expiresAt: z.ZodString;
|
|
36
|
+
decidedAt: z.ZodOptional<z.ZodString>;
|
|
37
|
+
decisionReason: z.ZodOptional<z.ZodString>;
|
|
38
|
+
}, z.core.$strip>;
|
|
39
|
+
export declare const approvalRequestStoreSchema: z.ZodObject<{
|
|
40
|
+
version: z.ZodLiteral<1>;
|
|
41
|
+
requests: z.ZodArray<z.ZodObject<{
|
|
42
|
+
version: z.ZodLiteral<1>;
|
|
43
|
+
id: z.ZodString;
|
|
44
|
+
mandateId: z.ZodString;
|
|
45
|
+
mandateUid: z.ZodOptional<z.ZodString>;
|
|
46
|
+
parentMandateId: z.ZodOptional<z.ZodString>;
|
|
47
|
+
parentMandateUid: z.ZodOptional<z.ZodString>;
|
|
48
|
+
delegatedBy: z.ZodOptional<z.ZodString>;
|
|
49
|
+
delegationPath: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
50
|
+
delegationUids: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
51
|
+
repoPath: z.ZodString;
|
|
52
|
+
branch: z.ZodString;
|
|
53
|
+
toolName: z.ZodString;
|
|
54
|
+
approvalGateId: z.ZodString;
|
|
55
|
+
approvalGatePattern: z.ZodString;
|
|
56
|
+
approvalGateReason: z.ZodOptional<z.ZodString>;
|
|
57
|
+
approvalGateRisk: z.ZodOptional<z.ZodEnum<{
|
|
58
|
+
low: "low";
|
|
59
|
+
medium: "medium";
|
|
60
|
+
high: "high";
|
|
61
|
+
critical: "critical";
|
|
62
|
+
}>>;
|
|
63
|
+
approvalGateLabels: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
64
|
+
status: z.ZodEnum<{
|
|
65
|
+
pending: "pending";
|
|
66
|
+
approved: "approved";
|
|
67
|
+
denied: "denied";
|
|
68
|
+
stale: "stale";
|
|
69
|
+
}>;
|
|
70
|
+
createdAt: z.ZodString;
|
|
71
|
+
expiresAt: z.ZodString;
|
|
72
|
+
decidedAt: z.ZodOptional<z.ZodString>;
|
|
73
|
+
decisionReason: z.ZodOptional<z.ZodString>;
|
|
74
|
+
}, z.core.$strip>>;
|
|
75
|
+
}, z.core.$strip>;
|
|
76
|
+
export type ApprovalRequest = z.infer<typeof approvalRequestSchema>;
|
|
77
|
+
export type ApprovalRequestStore = z.infer<typeof approvalRequestStoreSchema>;
|
|
78
|
+
export type ApprovalRequestWithStatus = ApprovalRequest & {
|
|
79
|
+
runtimeStatus: ApprovalRequestRuntimeStatus;
|
|
80
|
+
};
|
|
81
|
+
export interface CreateApprovalRequestOptions {
|
|
82
|
+
mandateId: string;
|
|
83
|
+
mandateUid?: string;
|
|
84
|
+
parentMandateId?: string;
|
|
85
|
+
parentMandateUid?: string;
|
|
86
|
+
delegatedBy?: string;
|
|
87
|
+
delegationPath?: string[];
|
|
88
|
+
delegationUids?: string[];
|
|
89
|
+
repoPath: string;
|
|
90
|
+
branch: string;
|
|
91
|
+
toolName: string;
|
|
92
|
+
approvalGateId: string;
|
|
93
|
+
approvalGatePattern: string;
|
|
94
|
+
approvalGateReason?: string;
|
|
95
|
+
approvalGateRisk?: "low" | "medium" | "high" | "critical";
|
|
96
|
+
approvalGateLabels?: string[];
|
|
97
|
+
expiresAt: string;
|
|
98
|
+
path?: string;
|
|
99
|
+
now?: () => Date;
|
|
100
|
+
}
|
|
101
|
+
export interface ListApprovalRequestsOptions {
|
|
102
|
+
path?: string;
|
|
103
|
+
repoPath?: string;
|
|
104
|
+
mandateId?: string;
|
|
105
|
+
mandateUid?: string;
|
|
106
|
+
rootMandateUid?: string;
|
|
107
|
+
status?: ApprovalRequestRuntimeStatus;
|
|
108
|
+
now?: () => Date;
|
|
109
|
+
}
|
|
110
|
+
export interface DecideApprovalRequestOptions {
|
|
111
|
+
id: string;
|
|
112
|
+
status: "approved" | "denied";
|
|
113
|
+
reason?: string;
|
|
114
|
+
path?: string;
|
|
115
|
+
now?: () => Date;
|
|
116
|
+
}
|
|
117
|
+
export interface MarkApprovalRequestStaleOptions {
|
|
118
|
+
id: string;
|
|
119
|
+
reason?: string;
|
|
120
|
+
path?: string;
|
|
121
|
+
now?: () => Date;
|
|
122
|
+
}
|
|
123
|
+
export interface MarkPendingApprovalRequestsStaleOptions {
|
|
124
|
+
repoPath?: string;
|
|
125
|
+
mandateId?: string;
|
|
126
|
+
mandateUid?: string;
|
|
127
|
+
reason?: string;
|
|
128
|
+
path?: string;
|
|
129
|
+
now?: () => Date;
|
|
130
|
+
}
|
|
131
|
+
export interface FindApprovedApprovalRequestOptions {
|
|
132
|
+
mandateId: string;
|
|
133
|
+
mandateUid?: string;
|
|
134
|
+
repoPath: string;
|
|
135
|
+
toolName: string;
|
|
136
|
+
approvalGateId: string;
|
|
137
|
+
path?: string;
|
|
138
|
+
now?: () => Date;
|
|
139
|
+
}
|
|
140
|
+
export declare function resolveApprovalRequestStorePath(options?: PathResolutionOptions): string;
|
|
141
|
+
export declare function approvalRequestRuntimeStatus(request: Pick<ApprovalRequest, "status" | "expiresAt">, now?: Date): ApprovalRequestRuntimeStatus;
|
|
142
|
+
export declare function createApprovalRequest(options: CreateApprovalRequestOptions): Promise<ApprovalRequestWithStatus>;
|
|
143
|
+
export declare function listApprovalRequests(options?: ListApprovalRequestsOptions): Promise<ApprovalRequestWithStatus[]>;
|
|
144
|
+
export declare function findApprovedApprovalRequest(options: FindApprovedApprovalRequestOptions): Promise<ApprovalRequestWithStatus | undefined>;
|
|
145
|
+
export declare function decideApprovalRequest(options: DecideApprovalRequestOptions): Promise<ApprovalRequestWithStatus>;
|
|
146
|
+
export declare function markApprovalRequestStale(options: MarkApprovalRequestStaleOptions): Promise<ApprovalRequestWithStatus>;
|
|
147
|
+
export declare function markPendingApprovalRequestsStale(options?: MarkPendingApprovalRequestsStaleOptions): Promise<ApprovalRequestWithStatus[]>;
|
|
148
|
+
export declare function readApprovalRequestStore(options?: {
|
|
149
|
+
path?: string;
|
|
150
|
+
}): Promise<ApprovalRequestStore>;
|
|
151
|
+
//# sourceMappingURL=approval-requests.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval-requests.d.ts","sourceRoot":"","sources":["../../src/approvals/approval-requests.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
import { chmod, mkdir, open, readFile, rename, rm, stat, writeFile } from "node:fs/promises";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { dirname, join, resolve } from "node:path";
|
|
4
|
+
import * as z from "zod";
|
|
5
|
+
const approvalStoreLockTimeoutMs = 5_000;
|
|
6
|
+
const approvalStoreStaleLockMs = 30_000;
|
|
7
|
+
export const approvalRequestSchema = z.object({
|
|
8
|
+
version: z.literal(1),
|
|
9
|
+
id: z.string().min(1),
|
|
10
|
+
mandateId: z.string().min(1),
|
|
11
|
+
mandateUid: z.string().min(1).optional(),
|
|
12
|
+
parentMandateId: z.string().min(1).optional(),
|
|
13
|
+
parentMandateUid: z.string().min(1).optional(),
|
|
14
|
+
delegatedBy: z.string().min(1).optional(),
|
|
15
|
+
delegationPath: z.array(z.string().min(1)).optional(),
|
|
16
|
+
delegationUids: z.array(z.string().min(1)).optional(),
|
|
17
|
+
repoPath: z.string().min(1),
|
|
18
|
+
branch: z.string().min(1),
|
|
19
|
+
toolName: z.string().min(1),
|
|
20
|
+
approvalGateId: z.string().min(1),
|
|
21
|
+
approvalGatePattern: z.string().min(1),
|
|
22
|
+
approvalGateReason: z.string().min(1).optional(),
|
|
23
|
+
approvalGateRisk: z.enum(["low", "medium", "high", "critical"]).optional(),
|
|
24
|
+
approvalGateLabels: z.array(z.string().min(1)).optional(),
|
|
25
|
+
status: z.enum(["pending", "approved", "denied", "stale"]),
|
|
26
|
+
createdAt: z.string().min(1),
|
|
27
|
+
expiresAt: z.string().min(1),
|
|
28
|
+
decidedAt: z.string().min(1).optional(),
|
|
29
|
+
decisionReason: z.string().min(1).optional()
|
|
30
|
+
});
|
|
31
|
+
export const approvalRequestStoreSchema = z.object({
|
|
32
|
+
version: z.literal(1),
|
|
33
|
+
requests: z.array(approvalRequestSchema)
|
|
34
|
+
});
|
|
35
|
+
export function resolveApprovalRequestStorePath(options = {}) {
|
|
36
|
+
const env = options.env ?? process.env;
|
|
37
|
+
const home = options.homeDir ?? homedir();
|
|
38
|
+
const stateRoot = env.XDG_STATE_HOME
|
|
39
|
+
? resolve(env.XDG_STATE_HOME)
|
|
40
|
+
: join(home, ".local", "state");
|
|
41
|
+
return join(stateRoot, "switchboard", "approvals", "approvals.json");
|
|
42
|
+
}
|
|
43
|
+
export function approvalRequestRuntimeStatus(request, now = new Date()) {
|
|
44
|
+
if (request.status === "stale") {
|
|
45
|
+
return "stale";
|
|
46
|
+
}
|
|
47
|
+
const expiresAtMs = Date.parse(request.expiresAt);
|
|
48
|
+
if (Number.isNaN(expiresAtMs)) {
|
|
49
|
+
return "expired";
|
|
50
|
+
}
|
|
51
|
+
if (expiresAtMs <= now.getTime()) {
|
|
52
|
+
return "expired";
|
|
53
|
+
}
|
|
54
|
+
return request.status;
|
|
55
|
+
}
|
|
56
|
+
export async function createApprovalRequest(options) {
|
|
57
|
+
const now = options.now ?? (() => new Date());
|
|
58
|
+
const createdAt = now();
|
|
59
|
+
const repoPath = resolve(options.repoPath);
|
|
60
|
+
const path = options.path ?? resolveApprovalRequestStorePath();
|
|
61
|
+
const approvalGateRisk = normalizeApprovalGateRisk(options.approvalGateRisk);
|
|
62
|
+
const approvalGateLabels = normalizeApprovalGateLabels(options.approvalGateLabels ?? []);
|
|
63
|
+
return withApprovalStoreLock(path, async () => {
|
|
64
|
+
const store = await readApprovalRequestStore({ path });
|
|
65
|
+
const existing = store.requests.find((request) => approvalRequestMatchesMandate(request, {
|
|
66
|
+
mandateId: options.mandateId,
|
|
67
|
+
...(options.mandateUid ? { mandateUid: options.mandateUid } : {})
|
|
68
|
+
}) &&
|
|
69
|
+
request.repoPath === repoPath &&
|
|
70
|
+
request.toolName === options.toolName &&
|
|
71
|
+
request.approvalGateId === options.approvalGateId &&
|
|
72
|
+
approvalRequestRuntimeStatus(request, createdAt) === "pending");
|
|
73
|
+
if (existing) {
|
|
74
|
+
return withRuntimeStatus(existing, createdAt);
|
|
75
|
+
}
|
|
76
|
+
const request = {
|
|
77
|
+
version: 1,
|
|
78
|
+
id: nextApprovalRequestId(store),
|
|
79
|
+
mandateId: options.mandateId,
|
|
80
|
+
...(options.mandateUid ? { mandateUid: options.mandateUid } : {}),
|
|
81
|
+
...optionalTextField("parentMandateId", options.parentMandateId),
|
|
82
|
+
...optionalTextField("parentMandateUid", options.parentMandateUid),
|
|
83
|
+
...optionalTextField("delegatedBy", options.delegatedBy),
|
|
84
|
+
...optionalTextListField("delegationPath", options.delegationPath ?? []),
|
|
85
|
+
...optionalTextListField("delegationUids", options.delegationUids ?? []),
|
|
86
|
+
repoPath,
|
|
87
|
+
branch: options.branch.trim(),
|
|
88
|
+
toolName: options.toolName.trim(),
|
|
89
|
+
approvalGateId: options.approvalGateId.trim(),
|
|
90
|
+
approvalGatePattern: options.approvalGatePattern.trim(),
|
|
91
|
+
...(options.approvalGateReason?.trim()
|
|
92
|
+
? { approvalGateReason: options.approvalGateReason.trim() }
|
|
93
|
+
: {}),
|
|
94
|
+
...(approvalGateRisk
|
|
95
|
+
? { approvalGateRisk }
|
|
96
|
+
: {}),
|
|
97
|
+
...(approvalGateLabels.length > 0
|
|
98
|
+
? { approvalGateLabels }
|
|
99
|
+
: {}),
|
|
100
|
+
status: "pending",
|
|
101
|
+
createdAt: createdAt.toISOString(),
|
|
102
|
+
expiresAt: options.expiresAt
|
|
103
|
+
};
|
|
104
|
+
store.requests.push(request);
|
|
105
|
+
await writeApprovalRequestStore(store, { path });
|
|
106
|
+
return withRuntimeStatus(request, createdAt);
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
export async function listApprovalRequests(options = {}) {
|
|
110
|
+
const now = options.now?.() ?? new Date();
|
|
111
|
+
const store = await readApprovalRequestStore(options.path ? { path: options.path } : {});
|
|
112
|
+
const repoPath = options.repoPath ? resolve(options.repoPath) : undefined;
|
|
113
|
+
return store.requests
|
|
114
|
+
.filter((request) => (repoPath ? request.repoPath === repoPath : true))
|
|
115
|
+
.filter((request) => options.mandateId ? request.mandateId === options.mandateId : true)
|
|
116
|
+
.filter((request) => options.mandateUid ? request.mandateUid === options.mandateUid : true)
|
|
117
|
+
.filter((request) => options.rootMandateUid
|
|
118
|
+
? request.delegationUids?.[0] === options.rootMandateUid ||
|
|
119
|
+
request.mandateUid === options.rootMandateUid
|
|
120
|
+
: true)
|
|
121
|
+
.map((request) => withRuntimeStatus(request, now))
|
|
122
|
+
.filter((request) => options.status ? request.runtimeStatus === options.status : true);
|
|
123
|
+
}
|
|
124
|
+
export async function findApprovedApprovalRequest(options) {
|
|
125
|
+
const now = options.now?.() ?? new Date();
|
|
126
|
+
const repoPath = resolve(options.repoPath);
|
|
127
|
+
const store = await readApprovalRequestStore(options.path ? { path: options.path } : {});
|
|
128
|
+
const request = store.requests.find((item) => item.mandateId === options.mandateId &&
|
|
129
|
+
(options.mandateUid ? item.mandateUid === options.mandateUid : true) &&
|
|
130
|
+
item.repoPath === repoPath &&
|
|
131
|
+
item.toolName === options.toolName &&
|
|
132
|
+
item.approvalGateId === options.approvalGateId &&
|
|
133
|
+
item.status === "approved" &&
|
|
134
|
+
approvalRequestRuntimeStatus(item, now) === "approved");
|
|
135
|
+
return request ? withRuntimeStatus(request, now) : undefined;
|
|
136
|
+
}
|
|
137
|
+
export async function decideApprovalRequest(options) {
|
|
138
|
+
const now = options.now ?? (() => new Date());
|
|
139
|
+
const decidedAt = now();
|
|
140
|
+
const path = options.path ?? resolveApprovalRequestStorePath();
|
|
141
|
+
return withApprovalStoreLock(path, async () => {
|
|
142
|
+
const store = await readApprovalRequestStore({ path });
|
|
143
|
+
const index = store.requests.findIndex((request) => request.id === options.id);
|
|
144
|
+
if (index < 0) {
|
|
145
|
+
throw new Error(`approval request "${options.id}" was not found`);
|
|
146
|
+
}
|
|
147
|
+
const current = store.requests[index];
|
|
148
|
+
if (!current) {
|
|
149
|
+
throw new Error(`approval request "${options.id}" was not found`);
|
|
150
|
+
}
|
|
151
|
+
if (approvalRequestRuntimeStatus(current, decidedAt) === "expired") {
|
|
152
|
+
throw new Error(`approval request "${options.id}" is expired`);
|
|
153
|
+
}
|
|
154
|
+
if (approvalRequestRuntimeStatus(current, decidedAt) === "stale") {
|
|
155
|
+
throw new Error(`approval request "${options.id}" is stale`);
|
|
156
|
+
}
|
|
157
|
+
if (current.status !== "pending") {
|
|
158
|
+
throw new Error(`approval request "${options.id}" is already ${current.status}`);
|
|
159
|
+
}
|
|
160
|
+
const reason = options.reason?.trim();
|
|
161
|
+
const updated = {
|
|
162
|
+
...current,
|
|
163
|
+
status: options.status,
|
|
164
|
+
decidedAt: decidedAt.toISOString(),
|
|
165
|
+
...(reason ? { decisionReason: reason } : {})
|
|
166
|
+
};
|
|
167
|
+
store.requests[index] = updated;
|
|
168
|
+
await writeApprovalRequestStore(store, { path });
|
|
169
|
+
return withRuntimeStatus(updated, decidedAt);
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
export async function markApprovalRequestStale(options) {
|
|
173
|
+
const now = options.now ?? (() => new Date());
|
|
174
|
+
const decidedAt = now();
|
|
175
|
+
const path = options.path ?? resolveApprovalRequestStorePath();
|
|
176
|
+
return withApprovalStoreLock(path, async () => {
|
|
177
|
+
const store = await readApprovalRequestStore({ path });
|
|
178
|
+
const index = store.requests.findIndex((request) => request.id === options.id);
|
|
179
|
+
if (index < 0) {
|
|
180
|
+
throw new Error(`approval request "${options.id}" was not found`);
|
|
181
|
+
}
|
|
182
|
+
const current = store.requests[index];
|
|
183
|
+
if (!current) {
|
|
184
|
+
throw new Error(`approval request "${options.id}" was not found`);
|
|
185
|
+
}
|
|
186
|
+
if (approvalRequestRuntimeStatus(current, decidedAt) === "expired") {
|
|
187
|
+
return withRuntimeStatus(current, decidedAt);
|
|
188
|
+
}
|
|
189
|
+
if (current.status === "denied" || current.status === "stale") {
|
|
190
|
+
return withRuntimeStatus(current, decidedAt);
|
|
191
|
+
}
|
|
192
|
+
const reason = options.reason?.trim();
|
|
193
|
+
const updated = {
|
|
194
|
+
...current,
|
|
195
|
+
status: "stale",
|
|
196
|
+
decidedAt: decidedAt.toISOString(),
|
|
197
|
+
...(reason ? { decisionReason: reason } : {})
|
|
198
|
+
};
|
|
199
|
+
store.requests[index] = updated;
|
|
200
|
+
await writeApprovalRequestStore(store, { path });
|
|
201
|
+
return withRuntimeStatus(updated, decidedAt);
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
export async function markPendingApprovalRequestsStale(options = {}) {
|
|
205
|
+
const now = options.now ?? (() => new Date());
|
|
206
|
+
const decidedAt = now();
|
|
207
|
+
const path = options.path ?? resolveApprovalRequestStorePath();
|
|
208
|
+
const repoPath = options.repoPath ? resolve(options.repoPath) : undefined;
|
|
209
|
+
return withApprovalStoreLock(path, async () => {
|
|
210
|
+
const store = await readApprovalRequestStore({ path });
|
|
211
|
+
const staleRequests = [];
|
|
212
|
+
let changed = false;
|
|
213
|
+
const reason = options.reason?.trim();
|
|
214
|
+
store.requests = store.requests.map((request) => {
|
|
215
|
+
const matchesRepo = repoPath ? request.repoPath === repoPath : true;
|
|
216
|
+
const matchesMandate = options.mandateId
|
|
217
|
+
? request.mandateId === options.mandateId
|
|
218
|
+
: true;
|
|
219
|
+
const matchesMandateUid = options.mandateUid
|
|
220
|
+
? request.mandateUid === options.mandateUid
|
|
221
|
+
: true;
|
|
222
|
+
if (!matchesRepo ||
|
|
223
|
+
!matchesMandate ||
|
|
224
|
+
!matchesMandateUid ||
|
|
225
|
+
approvalRequestRuntimeStatus(request, decidedAt) !== "pending") {
|
|
226
|
+
return request;
|
|
227
|
+
}
|
|
228
|
+
changed = true;
|
|
229
|
+
const updated = {
|
|
230
|
+
...request,
|
|
231
|
+
status: "stale",
|
|
232
|
+
decidedAt: decidedAt.toISOString(),
|
|
233
|
+
...(reason ? { decisionReason: reason } : {})
|
|
234
|
+
};
|
|
235
|
+
staleRequests.push(withRuntimeStatus(updated, decidedAt));
|
|
236
|
+
return updated;
|
|
237
|
+
});
|
|
238
|
+
if (changed) {
|
|
239
|
+
await writeApprovalRequestStore(store, { path });
|
|
240
|
+
}
|
|
241
|
+
return staleRequests;
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
function approvalRequestMatchesMandate(request, mandate) {
|
|
245
|
+
if (mandate.mandateUid) {
|
|
246
|
+
return request.mandateUid === mandate.mandateUid;
|
|
247
|
+
}
|
|
248
|
+
return request.mandateId === mandate.mandateId;
|
|
249
|
+
}
|
|
250
|
+
export async function readApprovalRequestStore(options = {}) {
|
|
251
|
+
const path = options.path ?? resolveApprovalRequestStorePath();
|
|
252
|
+
const raw = await readFile(path, "utf8").catch((error) => {
|
|
253
|
+
if (isNodeErrorCode(error, "ENOENT")) {
|
|
254
|
+
return "";
|
|
255
|
+
}
|
|
256
|
+
throw error;
|
|
257
|
+
});
|
|
258
|
+
if (!raw.trim()) {
|
|
259
|
+
return { version: 1, requests: [] };
|
|
260
|
+
}
|
|
261
|
+
const parsed = JSON.parse(raw);
|
|
262
|
+
const result = approvalRequestStoreSchema.safeParse(parsed);
|
|
263
|
+
if (!result.success) {
|
|
264
|
+
throw new Error(`invalid Switchboard approval request store at ${path}: ${z.prettifyError(result.error)}`);
|
|
265
|
+
}
|
|
266
|
+
return result.data;
|
|
267
|
+
}
|
|
268
|
+
async function writeApprovalRequestStore(store, options = {}) {
|
|
269
|
+
const path = options.path ?? resolveApprovalRequestStorePath();
|
|
270
|
+
const tempPath = `${path}.${process.pid}.${Date.now()}.tmp`;
|
|
271
|
+
await mkdir(dirname(path), { recursive: true, mode: 0o700 });
|
|
272
|
+
await writeFile(tempPath, `${JSON.stringify(store, null, 2)}\n`, {
|
|
273
|
+
mode: 0o600
|
|
274
|
+
});
|
|
275
|
+
await chmod(tempPath, 0o600);
|
|
276
|
+
await rename(tempPath, path);
|
|
277
|
+
await chmod(path, 0o600);
|
|
278
|
+
}
|
|
279
|
+
async function withApprovalStoreLock(path, fn) {
|
|
280
|
+
const lockPath = `${path}.lock`;
|
|
281
|
+
const startedAt = Date.now();
|
|
282
|
+
while (true) {
|
|
283
|
+
try {
|
|
284
|
+
await mkdir(dirname(lockPath), { recursive: true, mode: 0o700 });
|
|
285
|
+
const handle = await open(lockPath, "wx", 0o600);
|
|
286
|
+
try {
|
|
287
|
+
await handle.writeFile(JSON.stringify({ pid: process.pid, createdAt: new Date().toISOString() }));
|
|
288
|
+
}
|
|
289
|
+
finally {
|
|
290
|
+
await handle.close();
|
|
291
|
+
}
|
|
292
|
+
break;
|
|
293
|
+
}
|
|
294
|
+
catch (error) {
|
|
295
|
+
if (!isNodeErrorCode(error, "EEXIST")) {
|
|
296
|
+
throw error;
|
|
297
|
+
}
|
|
298
|
+
await removeStaleLock(lockPath);
|
|
299
|
+
if (Date.now() - startedAt > approvalStoreLockTimeoutMs) {
|
|
300
|
+
throw new Error(`timed out waiting for approval store lock at ${lockPath}`);
|
|
301
|
+
}
|
|
302
|
+
await sleep(25);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
try {
|
|
306
|
+
return await fn();
|
|
307
|
+
}
|
|
308
|
+
finally {
|
|
309
|
+
await rm(lockPath, { force: true });
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
async function removeStaleLock(lockPath) {
|
|
313
|
+
const lockStat = await stat(lockPath).catch((error) => {
|
|
314
|
+
if (isNodeErrorCode(error, "ENOENT")) {
|
|
315
|
+
return undefined;
|
|
316
|
+
}
|
|
317
|
+
throw error;
|
|
318
|
+
});
|
|
319
|
+
if (lockStat && Date.now() - lockStat.mtimeMs > approvalStoreStaleLockMs) {
|
|
320
|
+
await rm(lockPath, { force: true });
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
function nextApprovalRequestId(store) {
|
|
324
|
+
return `approval-${store.requests.length + 1}`;
|
|
325
|
+
}
|
|
326
|
+
function optionalTextField(key, value) {
|
|
327
|
+
const trimmed = value?.trim();
|
|
328
|
+
return trimmed ? { [key]: trimmed } : {};
|
|
329
|
+
}
|
|
330
|
+
function optionalTextListField(key, values) {
|
|
331
|
+
const normalized = uniqueTrimmed(values);
|
|
332
|
+
return normalized.length > 0 ? { [key]: normalized } : {};
|
|
333
|
+
}
|
|
334
|
+
function uniqueTrimmed(values) {
|
|
335
|
+
const seen = new Set();
|
|
336
|
+
const result = [];
|
|
337
|
+
for (const value of values) {
|
|
338
|
+
const trimmed = value.trim();
|
|
339
|
+
if (!trimmed || seen.has(trimmed)) {
|
|
340
|
+
continue;
|
|
341
|
+
}
|
|
342
|
+
seen.add(trimmed);
|
|
343
|
+
result.push(trimmed);
|
|
344
|
+
}
|
|
345
|
+
return result;
|
|
346
|
+
}
|
|
347
|
+
function normalizeApprovalGateRisk(value) {
|
|
348
|
+
const risk = value?.trim().toLowerCase();
|
|
349
|
+
if (!risk) {
|
|
350
|
+
return undefined;
|
|
351
|
+
}
|
|
352
|
+
if (risk !== "low" &&
|
|
353
|
+
risk !== "medium" &&
|
|
354
|
+
risk !== "high" &&
|
|
355
|
+
risk !== "critical") {
|
|
356
|
+
throw new Error("approval gate risk must be one of: low, medium, high, critical");
|
|
357
|
+
}
|
|
358
|
+
return risk;
|
|
359
|
+
}
|
|
360
|
+
function normalizeApprovalGateLabels(labels) {
|
|
361
|
+
const seen = new Set();
|
|
362
|
+
const result = [];
|
|
363
|
+
for (const rawLabel of labels) {
|
|
364
|
+
const label = rawLabel.trim().toLowerCase();
|
|
365
|
+
if (!label || seen.has(label)) {
|
|
366
|
+
continue;
|
|
367
|
+
}
|
|
368
|
+
if (!/^[a-z0-9][a-z0-9_.:-]*$/.test(label)) {
|
|
369
|
+
throw new Error("approval gate labels must use lowercase letters, digits, dots, colons, underscores, or hyphens");
|
|
370
|
+
}
|
|
371
|
+
seen.add(label);
|
|
372
|
+
result.push(label);
|
|
373
|
+
}
|
|
374
|
+
return result;
|
|
375
|
+
}
|
|
376
|
+
function withRuntimeStatus(request, now) {
|
|
377
|
+
return {
|
|
378
|
+
...request,
|
|
379
|
+
runtimeStatus: approvalRequestRuntimeStatus(request, now)
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
function sleep(ms) {
|
|
383
|
+
return new Promise((resolveSleep) => {
|
|
384
|
+
setTimeout(resolveSleep, ms);
|
|
385
|
+
});
|
|
386
|
+
}
|
|
387
|
+
function isNodeErrorCode(error, code) {
|
|
388
|
+
return (typeof error === "object" &&
|
|
389
|
+
error !== null &&
|
|
390
|
+
"code" in error &&
|
|
391
|
+
error.code === code);
|
|
392
|
+
}
|
|
393
|
+
//# sourceMappingURL=approval-requests.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval-requests.js","sourceRoot":"","sources":["../../src/approvals/approval-requests.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { PathResolutionOptions } from "../config/paths.js";
|
|
2
|
+
export type AuditAction = "profile_test" | "tool_call" | "approval_elicitation";
|
|
3
|
+
export type AuditStatus = "ok" | "error";
|
|
4
|
+
export interface AuditLogEntry {
|
|
5
|
+
version: 1;
|
|
6
|
+
timestamp: string;
|
|
7
|
+
action: AuditAction;
|
|
8
|
+
status: AuditStatus;
|
|
9
|
+
profileName?: string;
|
|
10
|
+
namespace?: string;
|
|
11
|
+
toolName?: string;
|
|
12
|
+
upstreamName?: string;
|
|
13
|
+
mandateId?: string;
|
|
14
|
+
mandateUid?: string;
|
|
15
|
+
repoPath?: string;
|
|
16
|
+
worktreePath?: string;
|
|
17
|
+
branch?: string;
|
|
18
|
+
approvalRequestId?: string;
|
|
19
|
+
approvalGateId?: string;
|
|
20
|
+
approvalGatePattern?: string;
|
|
21
|
+
approvalDecision?: "approved" | "denied" | "declined" | "cancelled" | "failed";
|
|
22
|
+
durationMs?: number;
|
|
23
|
+
error?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface AuditLogger {
|
|
26
|
+
log(entry: Omit<AuditLogEntry, "version" | "timestamp">): Promise<void>;
|
|
27
|
+
}
|
|
28
|
+
export interface JsonlAuditLoggerOptions extends PathResolutionOptions {
|
|
29
|
+
path?: string;
|
|
30
|
+
now?: () => Date;
|
|
31
|
+
}
|
|
32
|
+
export interface ReadAuditLogOptions {
|
|
33
|
+
path?: string;
|
|
34
|
+
limit?: number;
|
|
35
|
+
mandateId?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface SafeAuditLogOptions {
|
|
38
|
+
onError?: (error: unknown) => void;
|
|
39
|
+
}
|
|
40
|
+
export declare function resolveAuditLogPath(options?: PathResolutionOptions): string;
|
|
41
|
+
export declare function createJsonlAuditLogger(options?: JsonlAuditLoggerOptions): AuditLogger;
|
|
42
|
+
export declare const noopAuditLogger: AuditLogger;
|
|
43
|
+
export declare function safeAuditLog(logger: AuditLogger, entry: Omit<AuditLogEntry, "version" | "timestamp">, options?: SafeAuditLogOptions): Promise<void>;
|
|
44
|
+
export declare function readAuditLogEntries(options?: ReadAuditLogOptions): Promise<AuditLogEntry[]>;
|
|
45
|
+
//# sourceMappingURL=audit-log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-log.d.ts","sourceRoot":"","sources":["../../src/audit/audit-log.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG,WAAW,GAAG,sBAAsB,CAAC;AAChF,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,OAAO,CAAC;AAEzC,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gBAAgB,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzE;AAED,MAAM,WAAW,uBAAwB,SAAQ,qBAAqB;IACpE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACpC;AAED,wBAAgB,mBAAmB,CACjC,OAAO,GAAE,qBAA0B,GAClC,MAAM,CAQR;AAED,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,uBAA4B,GACpC,WAAW,CAmBb;AAED,eAAO,MAAM,eAAe,EAAE,WAI7B,CAAC;AAEF,wBAAsB,YAAY,CAChC,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,GAAG,WAAW,CAAC,EACnD,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,IAAI,CAAC,CAMf;AAED,wBAAsB,mBAAmB,CACvC,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,aAAa,EAAE,CAAC,CA2B1B"}
|