@agenshield/broker 0.6.2 → 0.7.1
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/daemon-forward.d.ts +4 -1
- package/daemon-forward.d.ts.map +1 -1
- package/handlers/exec.d.ts.map +1 -1
- package/handlers/policy-check.d.ts +3 -0
- package/handlers/policy-check.d.ts.map +1 -1
- package/handlers/skill-install.d.ts.map +1 -1
- package/handlers/types.d.ts +3 -0
- package/handlers/types.d.ts.map +1 -1
- package/index.js +86 -55
- package/main.js +341 -68
- package/package.json +3 -2
- package/policies/command-allowlist.d.ts.map +1 -1
- package/policies/enforcer.d.ts +6 -0
- package/policies/enforcer.d.ts.map +1 -1
- package/secrets/resolver.d.ts +38 -0
- package/secrets/resolver.d.ts.map +1 -0
- package/server.d.ts +3 -0
- package/server.d.ts.map +1 -1
- package/types.d.ts +2 -0
- package/types.d.ts.map +1 -1
package/daemon-forward.d.ts
CHANGED
|
@@ -6,10 +6,13 @@
|
|
|
6
6
|
* in server.ts / http-fallback.ts when the broker's local enforcer denies
|
|
7
7
|
* a request but the daemon may have a user-defined policy that allows it.
|
|
8
8
|
*/
|
|
9
|
+
import type { SandboxConfig, PolicyExecutionContext } from '@agenshield/ipc';
|
|
9
10
|
export interface DaemonPolicyResult {
|
|
10
11
|
allowed: boolean;
|
|
11
12
|
policyId?: string;
|
|
12
13
|
reason?: string;
|
|
14
|
+
sandbox?: SandboxConfig;
|
|
15
|
+
executionContext?: PolicyExecutionContext;
|
|
13
16
|
}
|
|
14
17
|
/**
|
|
15
18
|
* Forward a policy check to the daemon's RPC endpoint.
|
|
@@ -21,5 +24,5 @@ export interface DaemonPolicyResult {
|
|
|
21
24
|
*
|
|
22
25
|
* @returns The daemon's result if it explicitly allows, or null to keep broker denial.
|
|
23
26
|
*/
|
|
24
|
-
export declare function forwardPolicyToDaemon(operation: string, target: string, daemonUrl: string): Promise<DaemonPolicyResult | null>;
|
|
27
|
+
export declare function forwardPolicyToDaemon(operation: string, target: string, daemonUrl: string, context?: PolicyExecutionContext): Promise<DaemonPolicyResult | null>;
|
|
25
28
|
//# sourceMappingURL=daemon-forward.d.ts.map
|
package/daemon-forward.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-forward.d.ts","sourceRoot":"","sources":["../src/daemon-forward.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"daemon-forward.d.ts","sourceRoot":"","sources":["../src/daemon-forward.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAK7E,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;CAC3C;AAED;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAuEpC"}
|
package/handlers/exec.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/handlers/exec.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAc,UAAU,EAAE,MAAM,aAAa,CAAC;AACzF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAgGtD,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/handlers/exec.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAc,UAAU,EAAE,MAAM,aAAa,CAAC;AACzF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAgGtD,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CA4HpC"}
|
|
@@ -10,10 +10,13 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import type { HandlerContext, HandlerResult } from '../types.js';
|
|
12
12
|
import type { HandlerDependencies } from './types.js';
|
|
13
|
+
import type { SandboxConfig, PolicyExecutionContext } from '@agenshield/ipc';
|
|
13
14
|
interface PolicyCheckResultData {
|
|
14
15
|
allowed: boolean;
|
|
15
16
|
policyId?: string;
|
|
16
17
|
reason?: string;
|
|
18
|
+
sandbox?: SandboxConfig;
|
|
19
|
+
executionContext?: PolicyExecutionContext;
|
|
17
20
|
}
|
|
18
21
|
export declare function handlePolicyCheck(params: Record<string, unknown>, context: HandlerContext, deps: HandlerDependencies): Promise<HandlerResult<PolicyCheckResultData>>;
|
|
19
22
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy-check.d.ts","sourceRoot":"","sources":["../../src/handlers/policy-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"policy-check.d.ts","sourceRoot":"","sources":["../../src/handlers/policy-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAS7E,UAAU,qBAAqB;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;CAC3C;AAKD,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC,CA6E/C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-install.d.ts","sourceRoot":"","sources":["../../src/handlers/skill-install.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"skill-install.d.ts","sourceRoot":"","sources":["../../src/handlers/skill-install.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EAEb,kBAAkB,EAElB,oBAAoB,EACrB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AA4CtD;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC,CA0H5C;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC,CAqE9C"}
|
package/handlers/types.d.ts
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
import type { PolicyEnforcer } from '../policies/enforcer.js';
|
|
5
5
|
import type { AuditLogger } from '../audit/logger.js';
|
|
6
6
|
import type { SecretVault } from '../secrets/vault.js';
|
|
7
|
+
import type { SecretResolver } from '../secrets/resolver.js';
|
|
7
8
|
import type { CommandAllowlist } from '../policies/command-allowlist.js';
|
|
8
9
|
/**
|
|
9
10
|
* Exec monitoring event emitted after each exec operation
|
|
@@ -16,11 +17,13 @@ export interface ExecMonitorEvent {
|
|
|
16
17
|
allowed: boolean;
|
|
17
18
|
duration: number;
|
|
18
19
|
timestamp: string;
|
|
20
|
+
injectedSecretNames?: string[];
|
|
19
21
|
}
|
|
20
22
|
export interface HandlerDependencies {
|
|
21
23
|
policyEnforcer: PolicyEnforcer;
|
|
22
24
|
auditLogger: AuditLogger;
|
|
23
25
|
secretVault: SecretVault;
|
|
26
|
+
secretResolver?: SecretResolver;
|
|
24
27
|
commandAllowlist: CommandAllowlist;
|
|
25
28
|
onExecMonitor?: (event: ExecMonitorEvent) => void;
|
|
26
29
|
onExecDenied?: (command: string, reason: string) => void;
|
package/handlers/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/handlers/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEzE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/handlers/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEzE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,cAAc,CAAC;IAC/B,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,WAAW,CAAC;IACzB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAClD,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
|
package/index.js
CHANGED
|
@@ -252,8 +252,10 @@ import { spawn } from "node:child_process";
|
|
|
252
252
|
|
|
253
253
|
// libs/shield-broker/src/daemon-forward.ts
|
|
254
254
|
var DAEMON_RPC_TIMEOUT = 2e3;
|
|
255
|
-
async function forwardPolicyToDaemon(operation, target, daemonUrl) {
|
|
255
|
+
async function forwardPolicyToDaemon(operation, target, daemonUrl, context) {
|
|
256
|
+
const verbose = process.env["AGENSHIELD_BROKER_VERBOSE"] === "true";
|
|
256
257
|
try {
|
|
258
|
+
if (verbose) console.error(`[broker:forward] op=${operation} target=${target} \u2192 daemon ${daemonUrl}`);
|
|
257
259
|
const controller = new AbortController();
|
|
258
260
|
const timeout = setTimeout(() => controller.abort(), DAEMON_RPC_TIMEOUT);
|
|
259
261
|
const response = await fetch(`${daemonUrl}/rpc`, {
|
|
@@ -263,7 +265,7 @@ async function forwardPolicyToDaemon(operation, target, daemonUrl) {
|
|
|
263
265
|
jsonrpc: "2.0",
|
|
264
266
|
id: `broker-fwd-${Date.now()}`,
|
|
265
267
|
method: "policy_check",
|
|
266
|
-
params: { operation, target }
|
|
268
|
+
params: { operation, target, context }
|
|
267
269
|
}),
|
|
268
270
|
signal: controller.signal
|
|
269
271
|
});
|
|
@@ -276,11 +278,22 @@ async function forwardPolicyToDaemon(operation, target, daemonUrl) {
|
|
|
276
278
|
return null;
|
|
277
279
|
}
|
|
278
280
|
const result = json.result;
|
|
281
|
+
if (verbose) console.error(`[broker:forward] result: allowed=${result.allowed} policyId=${result.policyId}`);
|
|
279
282
|
if (result.policyId) {
|
|
280
283
|
return {
|
|
281
284
|
allowed: !!result.allowed,
|
|
282
285
|
policyId: result.policyId,
|
|
283
|
-
reason: result.reason
|
|
286
|
+
reason: result.reason,
|
|
287
|
+
sandbox: result.sandbox,
|
|
288
|
+
executionContext: result.executionContext
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
if (result.sandbox) {
|
|
292
|
+
return {
|
|
293
|
+
allowed: true,
|
|
294
|
+
reason: result.reason,
|
|
295
|
+
sandbox: result.sandbox,
|
|
296
|
+
executionContext: result.executionContext
|
|
284
297
|
};
|
|
285
298
|
}
|
|
286
299
|
return null;
|
|
@@ -436,11 +449,17 @@ async function handleExec(params, context, deps) {
|
|
|
436
449
|
}
|
|
437
450
|
}
|
|
438
451
|
const effectiveTimeout = HTTP_EXEC_COMMANDS.has(commandBasename) ? Math.max(timeout, 3e5) : timeout;
|
|
452
|
+
const secretEnv = deps.secretResolver?.getSecretsForExec(
|
|
453
|
+
commandBasename,
|
|
454
|
+
args
|
|
455
|
+
) ?? {};
|
|
456
|
+
const injectedSecretNames = Object.keys(secretEnv);
|
|
457
|
+
const mergedEnv = injectedSecretNames.length > 0 ? { ...env || {}, ...secretEnv } : env;
|
|
439
458
|
const result = await executeCommand({
|
|
440
459
|
command: resolvedCommand,
|
|
441
460
|
args,
|
|
442
461
|
cwd: effectiveCwd,
|
|
443
|
-
env,
|
|
462
|
+
env: mergedEnv,
|
|
444
463
|
timeout: effectiveTimeout,
|
|
445
464
|
shell: false
|
|
446
465
|
// Always force shell: false to prevent injection
|
|
@@ -453,7 +472,8 @@ async function handleExec(params, context, deps) {
|
|
|
453
472
|
exitCode: result.exitCode,
|
|
454
473
|
allowed: true,
|
|
455
474
|
duration,
|
|
456
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
475
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
476
|
+
injectedSecretNames: injectedSecretNames.length > 0 ? injectedSecretNames : void 0
|
|
457
477
|
});
|
|
458
478
|
return {
|
|
459
479
|
success: true,
|
|
@@ -640,7 +660,6 @@ async function handlePing(params, context, deps) {
|
|
|
640
660
|
|
|
641
661
|
// libs/shield-broker/src/handlers/skill-install.ts
|
|
642
662
|
import * as fs2 from "node:fs/promises";
|
|
643
|
-
import * as fsSync from "node:fs";
|
|
644
663
|
import * as path3 from "node:path";
|
|
645
664
|
import { execSync } from "node:child_process";
|
|
646
665
|
function isValidSlug(slug) {
|
|
@@ -677,13 +696,14 @@ fi
|
|
|
677
696
|
}
|
|
678
697
|
async function handleSkillInstall(params, context, deps) {
|
|
679
698
|
const startTime = Date.now();
|
|
699
|
+
const warnings = [];
|
|
680
700
|
try {
|
|
681
701
|
const {
|
|
682
702
|
slug,
|
|
683
703
|
files,
|
|
684
704
|
createWrapper = true,
|
|
685
705
|
agentHome = process.env["AGENSHIELD_AGENT_HOME"] || "/Users/ash_default_agent",
|
|
686
|
-
socketGroup = process.env["AGENSHIELD_SOCKET_GROUP"] || "
|
|
706
|
+
socketGroup = process.env["AGENSHIELD_SOCKET_GROUP"] || "ash_default"
|
|
687
707
|
} = params;
|
|
688
708
|
if (!slug || !isValidSlug(slug)) {
|
|
689
709
|
return {
|
|
@@ -725,30 +745,11 @@ async function handleSkillInstall(params, context, deps) {
|
|
|
725
745
|
filesWritten++;
|
|
726
746
|
}
|
|
727
747
|
try {
|
|
728
|
-
execSync(`chown -R root:${socketGroup} "${skillDir}"`, { stdio: "pipe" });
|
|
729
748
|
execSync(`chmod -R a+rX,go-w "${skillDir}"`, { stdio: "pipe" });
|
|
730
749
|
} catch (err) {
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
try {
|
|
735
|
-
let openclawConfig = {};
|
|
736
|
-
try {
|
|
737
|
-
const raw = fsSync.readFileSync(openclawConfigPath, "utf-8");
|
|
738
|
-
openclawConfig = JSON.parse(raw);
|
|
739
|
-
} catch {
|
|
740
|
-
}
|
|
741
|
-
if (!openclawConfig.skills) {
|
|
742
|
-
openclawConfig.skills = {};
|
|
743
|
-
}
|
|
744
|
-
const skills = openclawConfig.skills;
|
|
745
|
-
if (!skills.entries) {
|
|
746
|
-
skills.entries = {};
|
|
747
|
-
}
|
|
748
|
-
skills.entries[slug] = { enabled: true };
|
|
749
|
-
fsSync.writeFileSync(openclawConfigPath, JSON.stringify(openclawConfig, null, 2), "utf-8");
|
|
750
|
-
} catch (err) {
|
|
751
|
-
console.warn(`[SkillInstall] openclaw.json update failed: ${err.message}`);
|
|
750
|
+
const msg = `chmod on skill dir failed: ${err.message}`;
|
|
751
|
+
console.warn(`[SkillInstall] ${msg}`);
|
|
752
|
+
warnings.push(msg);
|
|
752
753
|
}
|
|
753
754
|
let wrapperPath;
|
|
754
755
|
if (createWrapper) {
|
|
@@ -756,12 +757,6 @@ async function handleSkillInstall(params, context, deps) {
|
|
|
756
757
|
await fs2.mkdir(binDir, { recursive: true });
|
|
757
758
|
const wrapperContent = createWrapperContent(slug, skillDir);
|
|
758
759
|
await fs2.writeFile(wrapperPath, wrapperContent, { mode: 493 });
|
|
759
|
-
try {
|
|
760
|
-
execSync(`chown root:${socketGroup} "${wrapperPath}"`, { stdio: "pipe" });
|
|
761
|
-
execSync(`chmod 755 "${wrapperPath}"`, { stdio: "pipe" });
|
|
762
|
-
} catch (err) {
|
|
763
|
-
console.warn(`[SkillInstall] wrapper chown failed: ${err.message}`);
|
|
764
|
-
}
|
|
765
760
|
}
|
|
766
761
|
return {
|
|
767
762
|
success: true,
|
|
@@ -769,7 +764,8 @@ async function handleSkillInstall(params, context, deps) {
|
|
|
769
764
|
installed: true,
|
|
770
765
|
skillDir,
|
|
771
766
|
wrapperPath,
|
|
772
|
-
filesWritten
|
|
767
|
+
filesWritten,
|
|
768
|
+
warnings: warnings.length > 0 ? warnings : void 0
|
|
773
769
|
},
|
|
774
770
|
audit: {
|
|
775
771
|
duration: Date.now() - startTime,
|
|
@@ -810,18 +806,6 @@ async function handleSkillUninstall(params, context, deps) {
|
|
|
810
806
|
if (skillExists) {
|
|
811
807
|
await fs2.rm(skillDir, { recursive: true, force: true });
|
|
812
808
|
}
|
|
813
|
-
const openclawConfigPath = path3.join(agentHome, ".openclaw", "openclaw.json");
|
|
814
|
-
try {
|
|
815
|
-
const raw = fsSync.readFileSync(openclawConfigPath, "utf-8");
|
|
816
|
-
const openclawConfig = JSON.parse(raw);
|
|
817
|
-
const skills = openclawConfig.skills;
|
|
818
|
-
const entries = skills?.entries;
|
|
819
|
-
if (entries?.[slug]) {
|
|
820
|
-
delete entries[slug];
|
|
821
|
-
fsSync.writeFileSync(openclawConfigPath, JSON.stringify(openclawConfig, null, 2), "utf-8");
|
|
822
|
-
}
|
|
823
|
-
} catch {
|
|
824
|
-
}
|
|
825
809
|
let wrapperRemoved = false;
|
|
826
810
|
if (removeWrapper) {
|
|
827
811
|
try {
|
|
@@ -853,7 +837,7 @@ async function handleSkillUninstall(params, context, deps) {
|
|
|
853
837
|
// libs/shield-broker/src/handlers/policy-check.ts
|
|
854
838
|
var DEFAULT_DAEMON_URL = "http://127.0.0.1:5200";
|
|
855
839
|
async function handlePolicyCheck(params, context, deps) {
|
|
856
|
-
const { operation, target } = params;
|
|
840
|
+
const { operation, target, context: execContext } = params;
|
|
857
841
|
if (!operation) {
|
|
858
842
|
return {
|
|
859
843
|
success: false,
|
|
@@ -893,9 +877,18 @@ async function handlePolicyCheck(params, context, deps) {
|
|
|
893
877
|
};
|
|
894
878
|
}
|
|
895
879
|
const daemonUrl = deps.daemonUrl || DEFAULT_DAEMON_URL;
|
|
896
|
-
const daemonResult = await forwardPolicyToDaemon(operation, target || "", daemonUrl);
|
|
880
|
+
const daemonResult = await forwardPolicyToDaemon(operation, target || "", daemonUrl, execContext);
|
|
897
881
|
if (daemonResult && daemonResult.allowed) {
|
|
898
|
-
return {
|
|
882
|
+
return {
|
|
883
|
+
success: true,
|
|
884
|
+
data: {
|
|
885
|
+
allowed: daemonResult.allowed,
|
|
886
|
+
policyId: daemonResult.policyId,
|
|
887
|
+
reason: daemonResult.reason,
|
|
888
|
+
sandbox: daemonResult.sandbox,
|
|
889
|
+
executionContext: daemonResult.executionContext
|
|
890
|
+
}
|
|
891
|
+
};
|
|
899
892
|
}
|
|
900
893
|
return {
|
|
901
894
|
success: true,
|
|
@@ -937,6 +930,7 @@ var UnixSocketServer = class {
|
|
|
937
930
|
policyEnforcer;
|
|
938
931
|
auditLogger;
|
|
939
932
|
secretVault;
|
|
933
|
+
secretResolver;
|
|
940
934
|
commandAllowlist;
|
|
941
935
|
connections = /* @__PURE__ */ new Set();
|
|
942
936
|
constructor(options) {
|
|
@@ -944,6 +938,7 @@ var UnixSocketServer = class {
|
|
|
944
938
|
this.policyEnforcer = options.policyEnforcer;
|
|
945
939
|
this.auditLogger = options.auditLogger;
|
|
946
940
|
this.secretVault = options.secretVault;
|
|
941
|
+
this.secretResolver = options.secretResolver;
|
|
947
942
|
this.commandAllowlist = options.commandAllowlist;
|
|
948
943
|
}
|
|
949
944
|
/**
|
|
@@ -1076,6 +1071,7 @@ var UnixSocketServer = class {
|
|
|
1076
1071
|
policyEnforcer: this.policyEnforcer,
|
|
1077
1072
|
auditLogger: this.auditLogger,
|
|
1078
1073
|
secretVault: this.secretVault,
|
|
1074
|
+
secretResolver: this.secretResolver,
|
|
1079
1075
|
commandAllowlist: this.commandAllowlist,
|
|
1080
1076
|
daemonUrl: this.config.daemonUrl
|
|
1081
1077
|
});
|
|
@@ -1096,7 +1092,7 @@ var UnixSocketServer = class {
|
|
|
1096
1092
|
return {
|
|
1097
1093
|
jsonrpc: "2.0",
|
|
1098
1094
|
id: request.id,
|
|
1099
|
-
result:
|
|
1095
|
+
result: result.data
|
|
1100
1096
|
};
|
|
1101
1097
|
} else {
|
|
1102
1098
|
return this.errorResponse(
|
|
@@ -1404,6 +1400,7 @@ var PolicyEnforcer = class {
|
|
|
1404
1400
|
lastLoad = 0;
|
|
1405
1401
|
reloadInterval = 6e4;
|
|
1406
1402
|
// 1 minute
|
|
1403
|
+
verbose = process.env["AGENSHIELD_BROKER_VERBOSE"] === "true";
|
|
1407
1404
|
constructor(options) {
|
|
1408
1405
|
this.policiesPath = options.policiesPath;
|
|
1409
1406
|
this.failOpen = options.failOpen;
|
|
@@ -1491,13 +1488,17 @@ var PolicyEnforcer = class {
|
|
|
1491
1488
|
this.maybeReload();
|
|
1492
1489
|
try {
|
|
1493
1490
|
const target = this.extractTarget(operation, params);
|
|
1491
|
+
if (this.verbose) console.error(`[broker:enforcer] op=${operation} target=${target}`);
|
|
1494
1492
|
for (const rule of this.policies.rules) {
|
|
1495
1493
|
if (!rule.enabled) continue;
|
|
1496
1494
|
if (!rule.operations.includes(operation) && !rule.operations.includes("*")) {
|
|
1497
1495
|
continue;
|
|
1498
1496
|
}
|
|
1499
|
-
const matches = this.matchesPatterns(target, rule.patterns);
|
|
1497
|
+
const matches = this.matchesPatterns(target, rule.patterns, operation);
|
|
1500
1498
|
if (matches) {
|
|
1499
|
+
if (this.verbose) {
|
|
1500
|
+
console.error(`[broker:enforcer] MATCH rule=${rule.id} action=${rule.action} patterns=${rule.patterns.join(",")}`);
|
|
1501
|
+
}
|
|
1501
1502
|
if (rule.action === "deny" || rule.action === "approval") {
|
|
1502
1503
|
return {
|
|
1503
1504
|
allowed: false,
|
|
@@ -1522,6 +1523,9 @@ var PolicyEnforcer = class {
|
|
|
1522
1523
|
if (operation === "http_request" && this.policies.networkConstraints) {
|
|
1523
1524
|
return { allowed: true, reason: "Allowed by network constraints" };
|
|
1524
1525
|
}
|
|
1526
|
+
if (this.verbose) {
|
|
1527
|
+
console.error(`[broker:enforcer] DEFAULT action=${this.policies.defaultAction} (no rule matched)`);
|
|
1528
|
+
}
|
|
1525
1529
|
return {
|
|
1526
1530
|
allowed: this.policies.defaultAction === "allow",
|
|
1527
1531
|
reason: this.policies.defaultAction === "deny" ? "No matching allow policy" : void 0
|
|
@@ -1555,12 +1559,39 @@ var PolicyEnforcer = class {
|
|
|
1555
1559
|
return "";
|
|
1556
1560
|
}
|
|
1557
1561
|
}
|
|
1562
|
+
/**
|
|
1563
|
+
* Match a command target against a Claude Code-style command pattern.
|
|
1564
|
+
* See matchCommandPattern in daemon rpc.ts for full semantics.
|
|
1565
|
+
*/
|
|
1566
|
+
matchCommandPattern(pattern, target) {
|
|
1567
|
+
const trimmed = pattern.trim();
|
|
1568
|
+
if (trimmed === "*") return true;
|
|
1569
|
+
if (trimmed.endsWith(":*")) {
|
|
1570
|
+
const prefix = trimmed.slice(0, -2).toLowerCase();
|
|
1571
|
+
const lowerTarget = target.toLowerCase();
|
|
1572
|
+
if (lowerTarget === prefix || lowerTarget.startsWith(prefix + " ")) {
|
|
1573
|
+
return true;
|
|
1574
|
+
}
|
|
1575
|
+
const firstSpace = lowerTarget.indexOf(" ");
|
|
1576
|
+
const cmdPart = firstSpace >= 0 ? lowerTarget.slice(0, firstSpace) : lowerTarget;
|
|
1577
|
+
const lastSlash = cmdPart.lastIndexOf("/");
|
|
1578
|
+
if (lastSlash >= 0) {
|
|
1579
|
+
const basename2 = cmdPart.slice(lastSlash + 1);
|
|
1580
|
+
if (basename2 === prefix || basename2.startsWith(prefix + "-") || basename2.startsWith(prefix)) {
|
|
1581
|
+
return true;
|
|
1582
|
+
}
|
|
1583
|
+
}
|
|
1584
|
+
return false;
|
|
1585
|
+
}
|
|
1586
|
+
return target.toLowerCase() === trimmed.toLowerCase();
|
|
1587
|
+
}
|
|
1558
1588
|
/**
|
|
1559
1589
|
* Check if target matches any patterns
|
|
1560
1590
|
*/
|
|
1561
|
-
matchesPatterns(target, patterns) {
|
|
1591
|
+
matchesPatterns(target, patterns, operation) {
|
|
1562
1592
|
for (const pattern of patterns) {
|
|
1563
|
-
|
|
1593
|
+
const isExec = operation === "exec" || operation === "*";
|
|
1594
|
+
if (isExec ? this.matchCommandPattern(pattern, target) : this.matchPattern(target, pattern)) {
|
|
1564
1595
|
return true;
|
|
1565
1596
|
}
|
|
1566
1597
|
}
|
package/main.js
CHANGED
|
@@ -254,8 +254,10 @@ import { spawn } from "node:child_process";
|
|
|
254
254
|
|
|
255
255
|
// libs/shield-broker/src/daemon-forward.ts
|
|
256
256
|
var DAEMON_RPC_TIMEOUT = 2e3;
|
|
257
|
-
async function forwardPolicyToDaemon(operation, target, daemonUrl) {
|
|
257
|
+
async function forwardPolicyToDaemon(operation, target, daemonUrl, context) {
|
|
258
|
+
const verbose = process.env["AGENSHIELD_BROKER_VERBOSE"] === "true";
|
|
258
259
|
try {
|
|
260
|
+
if (verbose) console.error(`[broker:forward] op=${operation} target=${target} \u2192 daemon ${daemonUrl}`);
|
|
259
261
|
const controller = new AbortController();
|
|
260
262
|
const timeout = setTimeout(() => controller.abort(), DAEMON_RPC_TIMEOUT);
|
|
261
263
|
const response = await fetch(`${daemonUrl}/rpc`, {
|
|
@@ -265,7 +267,7 @@ async function forwardPolicyToDaemon(operation, target, daemonUrl) {
|
|
|
265
267
|
jsonrpc: "2.0",
|
|
266
268
|
id: `broker-fwd-${Date.now()}`,
|
|
267
269
|
method: "policy_check",
|
|
268
|
-
params: { operation, target }
|
|
270
|
+
params: { operation, target, context }
|
|
269
271
|
}),
|
|
270
272
|
signal: controller.signal
|
|
271
273
|
});
|
|
@@ -278,11 +280,22 @@ async function forwardPolicyToDaemon(operation, target, daemonUrl) {
|
|
|
278
280
|
return null;
|
|
279
281
|
}
|
|
280
282
|
const result = json.result;
|
|
283
|
+
if (verbose) console.error(`[broker:forward] result: allowed=${result.allowed} policyId=${result.policyId}`);
|
|
281
284
|
if (result.policyId) {
|
|
282
285
|
return {
|
|
283
286
|
allowed: !!result.allowed,
|
|
284
287
|
policyId: result.policyId,
|
|
285
|
-
reason: result.reason
|
|
288
|
+
reason: result.reason,
|
|
289
|
+
sandbox: result.sandbox,
|
|
290
|
+
executionContext: result.executionContext
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
if (result.sandbox) {
|
|
294
|
+
return {
|
|
295
|
+
allowed: true,
|
|
296
|
+
reason: result.reason,
|
|
297
|
+
sandbox: result.sandbox,
|
|
298
|
+
executionContext: result.executionContext
|
|
286
299
|
};
|
|
287
300
|
}
|
|
288
301
|
return null;
|
|
@@ -438,11 +451,17 @@ async function handleExec(params, context, deps) {
|
|
|
438
451
|
}
|
|
439
452
|
}
|
|
440
453
|
const effectiveTimeout = HTTP_EXEC_COMMANDS.has(commandBasename) ? Math.max(timeout, 3e5) : timeout;
|
|
454
|
+
const secretEnv = deps.secretResolver?.getSecretsForExec(
|
|
455
|
+
commandBasename,
|
|
456
|
+
args
|
|
457
|
+
) ?? {};
|
|
458
|
+
const injectedSecretNames = Object.keys(secretEnv);
|
|
459
|
+
const mergedEnv = injectedSecretNames.length > 0 ? { ...env || {}, ...secretEnv } : env;
|
|
441
460
|
const result = await executeCommand({
|
|
442
461
|
command: resolvedCommand,
|
|
443
462
|
args,
|
|
444
463
|
cwd: effectiveCwd,
|
|
445
|
-
env,
|
|
464
|
+
env: mergedEnv,
|
|
446
465
|
timeout: effectiveTimeout,
|
|
447
466
|
shell: false
|
|
448
467
|
// Always force shell: false to prevent injection
|
|
@@ -455,7 +474,8 @@ async function handleExec(params, context, deps) {
|
|
|
455
474
|
exitCode: result.exitCode,
|
|
456
475
|
allowed: true,
|
|
457
476
|
duration,
|
|
458
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
477
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
478
|
+
injectedSecretNames: injectedSecretNames.length > 0 ? injectedSecretNames : void 0
|
|
459
479
|
});
|
|
460
480
|
return {
|
|
461
481
|
success: true,
|
|
@@ -642,7 +662,6 @@ async function handlePing(params, context, deps) {
|
|
|
642
662
|
|
|
643
663
|
// libs/shield-broker/src/handlers/skill-install.ts
|
|
644
664
|
import * as fs2 from "node:fs/promises";
|
|
645
|
-
import * as fsSync from "node:fs";
|
|
646
665
|
import * as path3 from "node:path";
|
|
647
666
|
import { execSync } from "node:child_process";
|
|
648
667
|
function isValidSlug(slug) {
|
|
@@ -679,13 +698,14 @@ fi
|
|
|
679
698
|
}
|
|
680
699
|
async function handleSkillInstall(params, context, deps) {
|
|
681
700
|
const startTime = Date.now();
|
|
701
|
+
const warnings = [];
|
|
682
702
|
try {
|
|
683
703
|
const {
|
|
684
704
|
slug,
|
|
685
705
|
files,
|
|
686
706
|
createWrapper = true,
|
|
687
707
|
agentHome = process.env["AGENSHIELD_AGENT_HOME"] || "/Users/ash_default_agent",
|
|
688
|
-
socketGroup = process.env["AGENSHIELD_SOCKET_GROUP"] || "
|
|
708
|
+
socketGroup = process.env["AGENSHIELD_SOCKET_GROUP"] || "ash_default"
|
|
689
709
|
} = params;
|
|
690
710
|
if (!slug || !isValidSlug(slug)) {
|
|
691
711
|
return {
|
|
@@ -727,30 +747,11 @@ async function handleSkillInstall(params, context, deps) {
|
|
|
727
747
|
filesWritten++;
|
|
728
748
|
}
|
|
729
749
|
try {
|
|
730
|
-
execSync(`chown -R root:${socketGroup} "${skillDir}"`, { stdio: "pipe" });
|
|
731
750
|
execSync(`chmod -R a+rX,go-w "${skillDir}"`, { stdio: "pipe" });
|
|
732
751
|
} catch (err) {
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
try {
|
|
737
|
-
let openclawConfig = {};
|
|
738
|
-
try {
|
|
739
|
-
const raw = fsSync.readFileSync(openclawConfigPath, "utf-8");
|
|
740
|
-
openclawConfig = JSON.parse(raw);
|
|
741
|
-
} catch {
|
|
742
|
-
}
|
|
743
|
-
if (!openclawConfig.skills) {
|
|
744
|
-
openclawConfig.skills = {};
|
|
745
|
-
}
|
|
746
|
-
const skills = openclawConfig.skills;
|
|
747
|
-
if (!skills.entries) {
|
|
748
|
-
skills.entries = {};
|
|
749
|
-
}
|
|
750
|
-
skills.entries[slug] = { enabled: true };
|
|
751
|
-
fsSync.writeFileSync(openclawConfigPath, JSON.stringify(openclawConfig, null, 2), "utf-8");
|
|
752
|
-
} catch (err) {
|
|
753
|
-
console.warn(`[SkillInstall] openclaw.json update failed: ${err.message}`);
|
|
752
|
+
const msg = `chmod on skill dir failed: ${err.message}`;
|
|
753
|
+
console.warn(`[SkillInstall] ${msg}`);
|
|
754
|
+
warnings.push(msg);
|
|
754
755
|
}
|
|
755
756
|
let wrapperPath;
|
|
756
757
|
if (createWrapper) {
|
|
@@ -758,12 +759,6 @@ async function handleSkillInstall(params, context, deps) {
|
|
|
758
759
|
await fs2.mkdir(binDir, { recursive: true });
|
|
759
760
|
const wrapperContent = createWrapperContent(slug, skillDir);
|
|
760
761
|
await fs2.writeFile(wrapperPath, wrapperContent, { mode: 493 });
|
|
761
|
-
try {
|
|
762
|
-
execSync(`chown root:${socketGroup} "${wrapperPath}"`, { stdio: "pipe" });
|
|
763
|
-
execSync(`chmod 755 "${wrapperPath}"`, { stdio: "pipe" });
|
|
764
|
-
} catch (err) {
|
|
765
|
-
console.warn(`[SkillInstall] wrapper chown failed: ${err.message}`);
|
|
766
|
-
}
|
|
767
762
|
}
|
|
768
763
|
return {
|
|
769
764
|
success: true,
|
|
@@ -771,7 +766,8 @@ async function handleSkillInstall(params, context, deps) {
|
|
|
771
766
|
installed: true,
|
|
772
767
|
skillDir,
|
|
773
768
|
wrapperPath,
|
|
774
|
-
filesWritten
|
|
769
|
+
filesWritten,
|
|
770
|
+
warnings: warnings.length > 0 ? warnings : void 0
|
|
775
771
|
},
|
|
776
772
|
audit: {
|
|
777
773
|
duration: Date.now() - startTime,
|
|
@@ -812,18 +808,6 @@ async function handleSkillUninstall(params, context, deps) {
|
|
|
812
808
|
if (skillExists) {
|
|
813
809
|
await fs2.rm(skillDir, { recursive: true, force: true });
|
|
814
810
|
}
|
|
815
|
-
const openclawConfigPath = path3.join(agentHome, ".openclaw", "openclaw.json");
|
|
816
|
-
try {
|
|
817
|
-
const raw = fsSync.readFileSync(openclawConfigPath, "utf-8");
|
|
818
|
-
const openclawConfig = JSON.parse(raw);
|
|
819
|
-
const skills = openclawConfig.skills;
|
|
820
|
-
const entries = skills?.entries;
|
|
821
|
-
if (entries?.[slug]) {
|
|
822
|
-
delete entries[slug];
|
|
823
|
-
fsSync.writeFileSync(openclawConfigPath, JSON.stringify(openclawConfig, null, 2), "utf-8");
|
|
824
|
-
}
|
|
825
|
-
} catch {
|
|
826
|
-
}
|
|
827
811
|
let wrapperRemoved = false;
|
|
828
812
|
if (removeWrapper) {
|
|
829
813
|
try {
|
|
@@ -855,7 +839,7 @@ async function handleSkillUninstall(params, context, deps) {
|
|
|
855
839
|
// libs/shield-broker/src/handlers/policy-check.ts
|
|
856
840
|
var DEFAULT_DAEMON_URL = "http://127.0.0.1:5200";
|
|
857
841
|
async function handlePolicyCheck(params, context, deps) {
|
|
858
|
-
const { operation, target } = params;
|
|
842
|
+
const { operation, target, context: execContext } = params;
|
|
859
843
|
if (!operation) {
|
|
860
844
|
return {
|
|
861
845
|
success: false,
|
|
@@ -895,9 +879,18 @@ async function handlePolicyCheck(params, context, deps) {
|
|
|
895
879
|
};
|
|
896
880
|
}
|
|
897
881
|
const daemonUrl = deps.daemonUrl || DEFAULT_DAEMON_URL;
|
|
898
|
-
const daemonResult = await forwardPolicyToDaemon(operation, target || "", daemonUrl);
|
|
882
|
+
const daemonResult = await forwardPolicyToDaemon(operation, target || "", daemonUrl, execContext);
|
|
899
883
|
if (daemonResult && daemonResult.allowed) {
|
|
900
|
-
return {
|
|
884
|
+
return {
|
|
885
|
+
success: true,
|
|
886
|
+
data: {
|
|
887
|
+
allowed: daemonResult.allowed,
|
|
888
|
+
policyId: daemonResult.policyId,
|
|
889
|
+
reason: daemonResult.reason,
|
|
890
|
+
sandbox: daemonResult.sandbox,
|
|
891
|
+
executionContext: daemonResult.executionContext
|
|
892
|
+
}
|
|
893
|
+
};
|
|
901
894
|
}
|
|
902
895
|
return {
|
|
903
896
|
success: true,
|
|
@@ -939,6 +932,7 @@ var UnixSocketServer = class {
|
|
|
939
932
|
policyEnforcer;
|
|
940
933
|
auditLogger;
|
|
941
934
|
secretVault;
|
|
935
|
+
secretResolver;
|
|
942
936
|
commandAllowlist;
|
|
943
937
|
connections = /* @__PURE__ */ new Set();
|
|
944
938
|
constructor(options) {
|
|
@@ -946,6 +940,7 @@ var UnixSocketServer = class {
|
|
|
946
940
|
this.policyEnforcer = options.policyEnforcer;
|
|
947
941
|
this.auditLogger = options.auditLogger;
|
|
948
942
|
this.secretVault = options.secretVault;
|
|
943
|
+
this.secretResolver = options.secretResolver;
|
|
949
944
|
this.commandAllowlist = options.commandAllowlist;
|
|
950
945
|
}
|
|
951
946
|
/**
|
|
@@ -1078,6 +1073,7 @@ var UnixSocketServer = class {
|
|
|
1078
1073
|
policyEnforcer: this.policyEnforcer,
|
|
1079
1074
|
auditLogger: this.auditLogger,
|
|
1080
1075
|
secretVault: this.secretVault,
|
|
1076
|
+
secretResolver: this.secretResolver,
|
|
1081
1077
|
commandAllowlist: this.commandAllowlist,
|
|
1082
1078
|
daemonUrl: this.config.daemonUrl
|
|
1083
1079
|
});
|
|
@@ -1098,7 +1094,7 @@ var UnixSocketServer = class {
|
|
|
1098
1094
|
return {
|
|
1099
1095
|
jsonrpc: "2.0",
|
|
1100
1096
|
id: request.id,
|
|
1101
|
-
result:
|
|
1097
|
+
result: result.data
|
|
1102
1098
|
};
|
|
1103
1099
|
} else {
|
|
1104
1100
|
return this.errorResponse(
|
|
@@ -1406,6 +1402,7 @@ var PolicyEnforcer = class {
|
|
|
1406
1402
|
lastLoad = 0;
|
|
1407
1403
|
reloadInterval = 6e4;
|
|
1408
1404
|
// 1 minute
|
|
1405
|
+
verbose = process.env["AGENSHIELD_BROKER_VERBOSE"] === "true";
|
|
1409
1406
|
constructor(options) {
|
|
1410
1407
|
this.policiesPath = options.policiesPath;
|
|
1411
1408
|
this.failOpen = options.failOpen;
|
|
@@ -1493,13 +1490,17 @@ var PolicyEnforcer = class {
|
|
|
1493
1490
|
this.maybeReload();
|
|
1494
1491
|
try {
|
|
1495
1492
|
const target = this.extractTarget(operation, params);
|
|
1493
|
+
if (this.verbose) console.error(`[broker:enforcer] op=${operation} target=${target}`);
|
|
1496
1494
|
for (const rule of this.policies.rules) {
|
|
1497
1495
|
if (!rule.enabled) continue;
|
|
1498
1496
|
if (!rule.operations.includes(operation) && !rule.operations.includes("*")) {
|
|
1499
1497
|
continue;
|
|
1500
1498
|
}
|
|
1501
|
-
const matches = this.matchesPatterns(target, rule.patterns);
|
|
1499
|
+
const matches = this.matchesPatterns(target, rule.patterns, operation);
|
|
1502
1500
|
if (matches) {
|
|
1501
|
+
if (this.verbose) {
|
|
1502
|
+
console.error(`[broker:enforcer] MATCH rule=${rule.id} action=${rule.action} patterns=${rule.patterns.join(",")}`);
|
|
1503
|
+
}
|
|
1503
1504
|
if (rule.action === "deny" || rule.action === "approval") {
|
|
1504
1505
|
return {
|
|
1505
1506
|
allowed: false,
|
|
@@ -1524,6 +1525,9 @@ var PolicyEnforcer = class {
|
|
|
1524
1525
|
if (operation === "http_request" && this.policies.networkConstraints) {
|
|
1525
1526
|
return { allowed: true, reason: "Allowed by network constraints" };
|
|
1526
1527
|
}
|
|
1528
|
+
if (this.verbose) {
|
|
1529
|
+
console.error(`[broker:enforcer] DEFAULT action=${this.policies.defaultAction} (no rule matched)`);
|
|
1530
|
+
}
|
|
1527
1531
|
return {
|
|
1528
1532
|
allowed: this.policies.defaultAction === "allow",
|
|
1529
1533
|
reason: this.policies.defaultAction === "deny" ? "No matching allow policy" : void 0
|
|
@@ -1557,12 +1561,39 @@ var PolicyEnforcer = class {
|
|
|
1557
1561
|
return "";
|
|
1558
1562
|
}
|
|
1559
1563
|
}
|
|
1564
|
+
/**
|
|
1565
|
+
* Match a command target against a Claude Code-style command pattern.
|
|
1566
|
+
* See matchCommandPattern in daemon rpc.ts for full semantics.
|
|
1567
|
+
*/
|
|
1568
|
+
matchCommandPattern(pattern, target) {
|
|
1569
|
+
const trimmed = pattern.trim();
|
|
1570
|
+
if (trimmed === "*") return true;
|
|
1571
|
+
if (trimmed.endsWith(":*")) {
|
|
1572
|
+
const prefix = trimmed.slice(0, -2).toLowerCase();
|
|
1573
|
+
const lowerTarget = target.toLowerCase();
|
|
1574
|
+
if (lowerTarget === prefix || lowerTarget.startsWith(prefix + " ")) {
|
|
1575
|
+
return true;
|
|
1576
|
+
}
|
|
1577
|
+
const firstSpace = lowerTarget.indexOf(" ");
|
|
1578
|
+
const cmdPart = firstSpace >= 0 ? lowerTarget.slice(0, firstSpace) : lowerTarget;
|
|
1579
|
+
const lastSlash = cmdPart.lastIndexOf("/");
|
|
1580
|
+
if (lastSlash >= 0) {
|
|
1581
|
+
const basename3 = cmdPart.slice(lastSlash + 1);
|
|
1582
|
+
if (basename3 === prefix || basename3.startsWith(prefix + "-") || basename3.startsWith(prefix)) {
|
|
1583
|
+
return true;
|
|
1584
|
+
}
|
|
1585
|
+
}
|
|
1586
|
+
return false;
|
|
1587
|
+
}
|
|
1588
|
+
return target.toLowerCase() === trimmed.toLowerCase();
|
|
1589
|
+
}
|
|
1560
1590
|
/**
|
|
1561
1591
|
* Check if target matches any patterns
|
|
1562
1592
|
*/
|
|
1563
|
-
matchesPatterns(target, patterns) {
|
|
1593
|
+
matchesPatterns(target, patterns, operation) {
|
|
1564
1594
|
for (const pattern of patterns) {
|
|
1565
|
-
|
|
1595
|
+
const isExec = operation === "exec" || operation === "*";
|
|
1596
|
+
if (isExec ? this.matchCommandPattern(pattern, target) : this.matchPattern(target, pattern)) {
|
|
1566
1597
|
return true;
|
|
1567
1598
|
}
|
|
1568
1599
|
}
|
|
@@ -1947,6 +1978,7 @@ function getDefaultPolicies(options) {
|
|
|
1947
1978
|
import * as fs5 from "node:fs";
|
|
1948
1979
|
import * as path5 from "node:path";
|
|
1949
1980
|
var BUILTIN_COMMANDS = {
|
|
1981
|
+
bash: ["/bin/bash", "/usr/bin/bash", "/opt/homebrew/bin/bash"],
|
|
1950
1982
|
git: ["/usr/bin/git", "/opt/homebrew/bin/git", "/usr/local/bin/git"],
|
|
1951
1983
|
ssh: ["/usr/bin/ssh"],
|
|
1952
1984
|
scp: ["/usr/bin/scp"],
|
|
@@ -2467,10 +2499,224 @@ var SecretVault = class {
|
|
|
2467
2499
|
}
|
|
2468
2500
|
};
|
|
2469
2501
|
|
|
2470
|
-
// libs/shield-broker/src/
|
|
2502
|
+
// libs/shield-broker/src/secrets/resolver.ts
|
|
2471
2503
|
import * as fs8 from "node:fs";
|
|
2504
|
+
var HTTP_COMMANDS = /* @__PURE__ */ new Set(["curl", "wget"]);
|
|
2505
|
+
var HTTP_FLAGS_WITH_VALUE2 = /* @__PURE__ */ new Set([
|
|
2506
|
+
"-X",
|
|
2507
|
+
"--request",
|
|
2508
|
+
"-H",
|
|
2509
|
+
"--header",
|
|
2510
|
+
"-d",
|
|
2511
|
+
"--data",
|
|
2512
|
+
"--data-raw",
|
|
2513
|
+
"--data-binary",
|
|
2514
|
+
"--data-urlencode",
|
|
2515
|
+
"-o",
|
|
2516
|
+
"--output",
|
|
2517
|
+
"-u",
|
|
2518
|
+
"--user",
|
|
2519
|
+
"-A",
|
|
2520
|
+
"--user-agent",
|
|
2521
|
+
"-e",
|
|
2522
|
+
"--referer",
|
|
2523
|
+
"-b",
|
|
2524
|
+
"--cookie",
|
|
2525
|
+
"-c",
|
|
2526
|
+
"--cookie-jar",
|
|
2527
|
+
"--connect-timeout",
|
|
2528
|
+
"--max-time",
|
|
2529
|
+
"-w",
|
|
2530
|
+
"--write-out",
|
|
2531
|
+
"-T",
|
|
2532
|
+
"--upload-file",
|
|
2533
|
+
"--resolve",
|
|
2534
|
+
"--cacert",
|
|
2535
|
+
"--cert",
|
|
2536
|
+
"--key"
|
|
2537
|
+
]);
|
|
2538
|
+
var SecretResolver = class {
|
|
2539
|
+
syncFilePath;
|
|
2540
|
+
synced = null;
|
|
2541
|
+
lastLoad = 0;
|
|
2542
|
+
reloadInterval = 3e4;
|
|
2543
|
+
// 30 seconds
|
|
2544
|
+
constructor(syncFilePath) {
|
|
2545
|
+
this.syncFilePath = syncFilePath;
|
|
2546
|
+
this.load();
|
|
2547
|
+
}
|
|
2548
|
+
/** Load synced secrets from disk */
|
|
2549
|
+
load() {
|
|
2550
|
+
if (!fs8.existsSync(this.syncFilePath)) {
|
|
2551
|
+
this.synced = null;
|
|
2552
|
+
this.lastLoad = Date.now();
|
|
2553
|
+
return;
|
|
2554
|
+
}
|
|
2555
|
+
try {
|
|
2556
|
+
const content = fs8.readFileSync(this.syncFilePath, "utf-8");
|
|
2557
|
+
this.synced = JSON.parse(content);
|
|
2558
|
+
this.lastLoad = Date.now();
|
|
2559
|
+
} catch {
|
|
2560
|
+
this.synced = null;
|
|
2561
|
+
this.lastLoad = Date.now();
|
|
2562
|
+
}
|
|
2563
|
+
}
|
|
2564
|
+
maybeReload() {
|
|
2565
|
+
if (Date.now() - this.lastLoad > this.reloadInterval) {
|
|
2566
|
+
this.load();
|
|
2567
|
+
}
|
|
2568
|
+
}
|
|
2569
|
+
/**
|
|
2570
|
+
* Get environment variables to inject for an exec operation.
|
|
2571
|
+
* Returns global secrets + any secrets from policies whose patterns match.
|
|
2572
|
+
*/
|
|
2573
|
+
getSecretsForExec(command, args) {
|
|
2574
|
+
this.maybeReload();
|
|
2575
|
+
if (!this.synced) return {};
|
|
2576
|
+
const result = { ...this.synced.globalSecrets };
|
|
2577
|
+
for (const binding of this.synced.policyBindings) {
|
|
2578
|
+
let matched = false;
|
|
2579
|
+
if (binding.target === "url" && HTTP_COMMANDS.has(command)) {
|
|
2580
|
+
const url = this.extractUrlFromArgs(args);
|
|
2581
|
+
if (url) {
|
|
2582
|
+
matched = binding.patterns.some((p) => this.matchUrlPattern(p, url));
|
|
2583
|
+
}
|
|
2584
|
+
} else if (binding.target === "command") {
|
|
2585
|
+
const fullCommand = args.length > 0 ? `${command} ${args.join(" ")}` : command;
|
|
2586
|
+
matched = binding.patterns.some((p) => this.matchCommandPattern(p, fullCommand));
|
|
2587
|
+
}
|
|
2588
|
+
if (matched) {
|
|
2589
|
+
Object.assign(result, binding.secrets);
|
|
2590
|
+
}
|
|
2591
|
+
}
|
|
2592
|
+
return result;
|
|
2593
|
+
}
|
|
2594
|
+
/**
|
|
2595
|
+
* Get names of secrets that would be injected (for audit logging — names only, never values).
|
|
2596
|
+
*/
|
|
2597
|
+
getSecretNamesForExec(command, args) {
|
|
2598
|
+
return Object.keys(this.getSecretsForExec(command, args));
|
|
2599
|
+
}
|
|
2600
|
+
// --- URL matching (replicated from daemon rpc.ts) ---
|
|
2601
|
+
normalizeUrlBase(pattern) {
|
|
2602
|
+
let p = pattern.trim();
|
|
2603
|
+
p = p.replace(/\/+$/, "");
|
|
2604
|
+
if (!p.match(/^(\*|https?):\/\//i)) {
|
|
2605
|
+
p = `https://${p}`;
|
|
2606
|
+
}
|
|
2607
|
+
return p;
|
|
2608
|
+
}
|
|
2609
|
+
normalizeUrlTarget(url) {
|
|
2610
|
+
const trimmed = url.trim();
|
|
2611
|
+
try {
|
|
2612
|
+
const parsed = new URL(trimmed);
|
|
2613
|
+
let urlPath = parsed.pathname;
|
|
2614
|
+
if (urlPath.length > 1) {
|
|
2615
|
+
urlPath = urlPath.replace(/\/+$/, "");
|
|
2616
|
+
}
|
|
2617
|
+
return `${parsed.protocol}//${parsed.host}${urlPath}${parsed.search}`;
|
|
2618
|
+
} catch {
|
|
2619
|
+
return trimmed.replace(/\/+$/, "");
|
|
2620
|
+
}
|
|
2621
|
+
}
|
|
2622
|
+
globToRegex(pattern) {
|
|
2623
|
+
const regexPattern = pattern.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*\*/g, "{{GLOBSTAR}}").replace(/\*/g, "[^/]*").replace(/\?/g, ".").replace(/{{GLOBSTAR}}/g, ".*");
|
|
2624
|
+
return new RegExp(`^${regexPattern}$`, "i");
|
|
2625
|
+
}
|
|
2626
|
+
matchUrlPattern(pattern, target) {
|
|
2627
|
+
const base = this.normalizeUrlBase(pattern);
|
|
2628
|
+
const trimmed = pattern.trim().replace(/\/+$/, "");
|
|
2629
|
+
const effectiveTarget = this.normalizeUrlTarget(target);
|
|
2630
|
+
if (trimmed.endsWith("*")) {
|
|
2631
|
+
return this.globToRegex(base).test(effectiveTarget);
|
|
2632
|
+
}
|
|
2633
|
+
return this.globToRegex(base).test(effectiveTarget) || this.globToRegex(`${base}/**`).test(effectiveTarget);
|
|
2634
|
+
}
|
|
2635
|
+
// --- Command matching (replicated from daemon rpc.ts) ---
|
|
2636
|
+
matchCommandPattern(pattern, target) {
|
|
2637
|
+
const trimmed = pattern.trim();
|
|
2638
|
+
if (trimmed === "*") return true;
|
|
2639
|
+
if (trimmed.endsWith(":*")) {
|
|
2640
|
+
const prefix = trimmed.slice(0, -2);
|
|
2641
|
+
const lowerTarget = target.toLowerCase();
|
|
2642
|
+
const lowerPrefix = prefix.toLowerCase();
|
|
2643
|
+
return lowerTarget === lowerPrefix || lowerTarget.startsWith(lowerPrefix + " ");
|
|
2644
|
+
}
|
|
2645
|
+
return target.toLowerCase() === trimmed.toLowerCase();
|
|
2646
|
+
}
|
|
2647
|
+
// --- URL extraction from curl/wget args ---
|
|
2648
|
+
extractUrlFromArgs(args) {
|
|
2649
|
+
for (let i = 0; i < args.length; i++) {
|
|
2650
|
+
const arg = args[i];
|
|
2651
|
+
if (arg.startsWith("-")) {
|
|
2652
|
+
if (HTTP_FLAGS_WITH_VALUE2.has(arg)) {
|
|
2653
|
+
i++;
|
|
2654
|
+
}
|
|
2655
|
+
continue;
|
|
2656
|
+
}
|
|
2657
|
+
return arg;
|
|
2658
|
+
}
|
|
2659
|
+
return null;
|
|
2660
|
+
}
|
|
2661
|
+
};
|
|
2662
|
+
|
|
2663
|
+
// libs/shield-integrations/dist/index.js
|
|
2664
|
+
import { exec as exec2, spawn as spawn2 } from "node:child_process";
|
|
2665
|
+
import { promisify as promisify2 } from "node:util";
|
|
2666
|
+
import { exec as exec22, execSync as execSync2, spawn as spawn22 } from "node:child_process";
|
|
2667
|
+
import { promisify as promisify22 } from "node:util";
|
|
2668
|
+
import * as fs32 from "node:fs/promises";
|
|
2669
|
+
import { exec as exec3 } from "node:child_process";
|
|
2670
|
+
import { promisify as promisify3 } from "node:util";
|
|
2671
|
+
var execAsync2 = promisify2(exec2);
|
|
2672
|
+
var execAsync22 = promisify22(exec22);
|
|
2673
|
+
var execAsync3 = promisify3(exec3);
|
|
2674
|
+
var OPENCLAW_GATEWAY_LABEL = "com.agenshield.openclaw.gateway";
|
|
2675
|
+
var OPENCLAW_GATEWAY_PLIST = "/Library/LaunchDaemons/com.agenshield.openclaw.gateway.plist";
|
|
2676
|
+
async function startOpenClawServices() {
|
|
2677
|
+
try {
|
|
2678
|
+
await execAsync3(`sudo launchctl kickstart system/${OPENCLAW_GATEWAY_LABEL}`);
|
|
2679
|
+
return {
|
|
2680
|
+
success: true,
|
|
2681
|
+
message: "OpenClaw gateway started"
|
|
2682
|
+
};
|
|
2683
|
+
} catch (error) {
|
|
2684
|
+
return {
|
|
2685
|
+
success: false,
|
|
2686
|
+
message: `Failed to start OpenClaw gateway: ${error.message}`,
|
|
2687
|
+
error
|
|
2688
|
+
};
|
|
2689
|
+
}
|
|
2690
|
+
}
|
|
2691
|
+
async function stopOpenClawServices() {
|
|
2692
|
+
try {
|
|
2693
|
+
await execAsync3(`sudo launchctl kill SIGTERM system/${OPENCLAW_GATEWAY_LABEL}`);
|
|
2694
|
+
return {
|
|
2695
|
+
success: true,
|
|
2696
|
+
message: "OpenClaw gateway stopped"
|
|
2697
|
+
};
|
|
2698
|
+
} catch (error) {
|
|
2699
|
+
return {
|
|
2700
|
+
success: false,
|
|
2701
|
+
message: `Failed to stop OpenClaw gateway: ${error.message}`,
|
|
2702
|
+
error
|
|
2703
|
+
};
|
|
2704
|
+
}
|
|
2705
|
+
}
|
|
2706
|
+
async function isOpenClawInstalled() {
|
|
2707
|
+
try {
|
|
2708
|
+
await fs32.access(OPENCLAW_GATEWAY_PLIST);
|
|
2709
|
+
return true;
|
|
2710
|
+
} catch {
|
|
2711
|
+
return false;
|
|
2712
|
+
}
|
|
2713
|
+
}
|
|
2714
|
+
|
|
2715
|
+
// libs/shield-broker/src/main.ts
|
|
2716
|
+
import * as fs9 from "node:fs";
|
|
2472
2717
|
import * as path7 from "node:path";
|
|
2473
2718
|
var PROXIED_COMMANDS = [
|
|
2719
|
+
"bash",
|
|
2474
2720
|
"curl",
|
|
2475
2721
|
"wget",
|
|
2476
2722
|
"git",
|
|
@@ -2489,9 +2735,9 @@ var PROXIED_COMMANDS = [
|
|
|
2489
2735
|
function loadConfig() {
|
|
2490
2736
|
const configPath = process.env["AGENSHIELD_CONFIG"] || "/opt/agenshield/config/shield.json";
|
|
2491
2737
|
let fileConfig = {};
|
|
2492
|
-
if (
|
|
2738
|
+
if (fs9.existsSync(configPath)) {
|
|
2493
2739
|
try {
|
|
2494
|
-
const content =
|
|
2740
|
+
const content = fs9.readFileSync(configPath, "utf-8");
|
|
2495
2741
|
fileConfig = JSON.parse(content);
|
|
2496
2742
|
} catch (error) {
|
|
2497
2743
|
console.warn(`Warning: Failed to load config from ${configPath}:`, error);
|
|
@@ -2511,8 +2757,8 @@ function loadConfig() {
|
|
|
2511
2757
|
logLevel: process.env["AGENSHIELD_LOG_LEVEL"] || fileConfig.logLevel || "info",
|
|
2512
2758
|
failOpen: process.env["AGENSHIELD_FAIL_OPEN"] === "true" || (fileConfig.failOpen ?? false),
|
|
2513
2759
|
socketMode: fileConfig.socketMode || 438,
|
|
2514
|
-
socketOwner: fileConfig.socketOwner || "
|
|
2515
|
-
socketGroup: fileConfig.socketGroup || "
|
|
2760
|
+
socketOwner: fileConfig.socketOwner || "ash_default_broker",
|
|
2761
|
+
socketGroup: fileConfig.socketGroup || "ash_default",
|
|
2516
2762
|
agentHome: process.env["AGENSHIELD_AGENT_HOME"] || fileConfig.agentHome,
|
|
2517
2763
|
daemonUrl: process.env["AGENSHIELD_DAEMON_URL"] || fileConfig.daemonUrl || "http://127.0.0.1:5200"
|
|
2518
2764
|
};
|
|
@@ -2521,9 +2767,9 @@ function ensureDirectories(config) {
|
|
|
2521
2767
|
const socketDir = path7.dirname(config.socketPath);
|
|
2522
2768
|
const auditDir = path7.dirname(config.auditLogPath);
|
|
2523
2769
|
for (const dir of [socketDir, auditDir, config.policiesPath]) {
|
|
2524
|
-
if (!
|
|
2770
|
+
if (!fs9.existsSync(dir)) {
|
|
2525
2771
|
try {
|
|
2526
|
-
|
|
2772
|
+
fs9.mkdirSync(dir, { recursive: true, mode: 493 });
|
|
2527
2773
|
} catch (error) {
|
|
2528
2774
|
if (error.code !== "EEXIST") {
|
|
2529
2775
|
console.warn(`Warning: Could not create directory ${dir}:`, error);
|
|
@@ -2533,23 +2779,23 @@ function ensureDirectories(config) {
|
|
|
2533
2779
|
}
|
|
2534
2780
|
}
|
|
2535
2781
|
function ensureProxiedCommandWrappers(binDir) {
|
|
2536
|
-
if (!
|
|
2782
|
+
if (!fs9.existsSync(binDir)) {
|
|
2537
2783
|
try {
|
|
2538
|
-
|
|
2784
|
+
fs9.mkdirSync(binDir, { recursive: true, mode: 493 });
|
|
2539
2785
|
} catch {
|
|
2540
2786
|
console.warn(`[broker] cannot create bin dir ${binDir}`);
|
|
2541
2787
|
return;
|
|
2542
2788
|
}
|
|
2543
2789
|
}
|
|
2544
2790
|
const shieldExecPath = "/opt/agenshield/bin/shield-exec";
|
|
2545
|
-
const hasShieldExec =
|
|
2791
|
+
const hasShieldExec = fs9.existsSync(shieldExecPath);
|
|
2546
2792
|
let installed = 0;
|
|
2547
2793
|
for (const cmd of PROXIED_COMMANDS) {
|
|
2548
2794
|
const wrapperPath = path7.join(binDir, cmd);
|
|
2549
|
-
if (
|
|
2795
|
+
if (fs9.existsSync(wrapperPath)) continue;
|
|
2550
2796
|
if (hasShieldExec) {
|
|
2551
2797
|
try {
|
|
2552
|
-
|
|
2798
|
+
fs9.symlinkSync(shieldExecPath, wrapperPath);
|
|
2553
2799
|
installed++;
|
|
2554
2800
|
continue;
|
|
2555
2801
|
} catch {
|
|
@@ -2563,7 +2809,7 @@ function ensureProxiedCommandWrappers(binDir) {
|
|
|
2563
2809
|
`exec /opt/agenshield/bin/shield-client exec ${cmd} "$@"`,
|
|
2564
2810
|
""
|
|
2565
2811
|
].join("\n");
|
|
2566
|
-
|
|
2812
|
+
fs9.writeFileSync(wrapperPath, script, { mode: 493 });
|
|
2567
2813
|
installed++;
|
|
2568
2814
|
} catch {
|
|
2569
2815
|
console.warn(`[broker] cannot write wrapper for ${cmd}`);
|
|
@@ -2614,6 +2860,12 @@ async function main() {
|
|
|
2614
2860
|
const commandAllowlist = new CommandAllowlist(
|
|
2615
2861
|
"/opt/agenshield/config/allowed-commands.json"
|
|
2616
2862
|
);
|
|
2863
|
+
const secretResolver = new SecretResolver(
|
|
2864
|
+
path7.join(
|
|
2865
|
+
path7.dirname(config.configPath || "/opt/agenshield/config/shield.json"),
|
|
2866
|
+
"synced-secrets.json"
|
|
2867
|
+
)
|
|
2868
|
+
);
|
|
2617
2869
|
if (config.agentHome) {
|
|
2618
2870
|
ensureProxiedCommandWrappers(path7.join(config.agentHome, "bin"));
|
|
2619
2871
|
}
|
|
@@ -2622,6 +2874,7 @@ async function main() {
|
|
|
2622
2874
|
policyEnforcer,
|
|
2623
2875
|
auditLogger,
|
|
2624
2876
|
secretVault,
|
|
2877
|
+
secretResolver,
|
|
2625
2878
|
commandAllowlist
|
|
2626
2879
|
});
|
|
2627
2880
|
await socketServer.start();
|
|
@@ -2637,9 +2890,29 @@ async function main() {
|
|
|
2637
2890
|
await httpServer.start();
|
|
2638
2891
|
console.log(`HTTP fallback server listening on ${config.httpHost}:${config.httpPort}`);
|
|
2639
2892
|
}
|
|
2893
|
+
try {
|
|
2894
|
+
if (await isOpenClawInstalled()) {
|
|
2895
|
+
console.log("OpenClaw LaunchDaemons detected, starting services...");
|
|
2896
|
+
const clawResult = await startOpenClawServices();
|
|
2897
|
+
if (clawResult.success) {
|
|
2898
|
+
console.log("OpenClaw services started.");
|
|
2899
|
+
} else {
|
|
2900
|
+
console.warn(`OpenClaw start warning: ${clawResult.message}`);
|
|
2901
|
+
}
|
|
2902
|
+
}
|
|
2903
|
+
} catch (err) {
|
|
2904
|
+
console.warn("Warning: Failed to start OpenClaw services:", err);
|
|
2905
|
+
}
|
|
2640
2906
|
const shutdown = async (signal) => {
|
|
2641
2907
|
console.log(`
|
|
2642
2908
|
Received ${signal}, shutting down...`);
|
|
2909
|
+
try {
|
|
2910
|
+
if (await isOpenClawInstalled()) {
|
|
2911
|
+
console.log("Stopping OpenClaw services...");
|
|
2912
|
+
await stopOpenClawServices();
|
|
2913
|
+
}
|
|
2914
|
+
} catch {
|
|
2915
|
+
}
|
|
2643
2916
|
await socketServer.stop();
|
|
2644
2917
|
if (httpServer) {
|
|
2645
2918
|
await httpServer.stop();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agenshield/broker",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "AgenShield broker daemon with Unix socket and HTTP fallback",
|
|
6
6
|
"main": "./index.js",
|
|
@@ -24,7 +24,8 @@
|
|
|
24
24
|
},
|
|
25
25
|
"license": "MIT",
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@agenshield/
|
|
27
|
+
"@agenshield/integrations": "0.7.1",
|
|
28
|
+
"@agenshield/ipc": "0.7.1"
|
|
28
29
|
},
|
|
29
30
|
"devDependencies": {
|
|
30
31
|
"@types/node": "^24.0.0",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-allowlist.d.ts","sourceRoot":"","sources":["../../src/policies/command-allowlist.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;
|
|
1
|
+
{"version":3,"file":"command-allowlist.d.ts","sourceRoot":"","sources":["../../src/policies/command-allowlist.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAkDD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,eAAe,CAA0C;IACjE,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,cAAc,CAAiB;gBAE3B,UAAU,EAAE,MAAM;IAK9B;;OAEG;IACH,IAAI,IAAI,IAAI;IAqBZ;;OAEG;IACH,OAAO,CAAC,WAAW;IAMnB;;OAEG;IACH,IAAI,IAAI,IAAI;IAcZ;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI;IAK9B;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAQ7B;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI7C;;OAEG;IACH,IAAI,IAAI,KAAK,CAAC,cAAc,GAAG;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAsBpD;;OAEG;IACH,WAAW,IAAI,cAAc,EAAE;IAI/B;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIhC;;;;;OAKG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CA0CxC"}
|
package/policies/enforcer.d.ts
CHANGED
|
@@ -53,6 +53,7 @@ export declare class PolicyEnforcer {
|
|
|
53
53
|
private failOpen;
|
|
54
54
|
private lastLoad;
|
|
55
55
|
private reloadInterval;
|
|
56
|
+
private verbose;
|
|
56
57
|
constructor(options: PolicyEnforcerOptions);
|
|
57
58
|
/**
|
|
58
59
|
* Normalize a policy rule — infer operations from target when missing,
|
|
@@ -75,6 +76,11 @@ export declare class PolicyEnforcer {
|
|
|
75
76
|
* Extract target from operation params
|
|
76
77
|
*/
|
|
77
78
|
private extractTarget;
|
|
79
|
+
/**
|
|
80
|
+
* Match a command target against a Claude Code-style command pattern.
|
|
81
|
+
* See matchCommandPattern in daemon rpc.ts for full semantics.
|
|
82
|
+
*/
|
|
83
|
+
private matchCommandPattern;
|
|
78
84
|
/**
|
|
79
85
|
* Check if target matches any patterns
|
|
80
86
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enforcer.d.ts","sourceRoot":"","sources":["../../src/policies/enforcer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,UAAU,CAAC;IACtC,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,KAAK,CAAC;IACpC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,OAAO,GAAG,MAAM,CAAC;IAChC,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,aAAa,CAAC,EAAE;QACd,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,cAAc,EAAE,MAAM,EAAE,CAAC;KAC1B,CAAC;IACF,kBAAkB,CAAC,EAAE;QACnB,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,YAAY,EAAE,MAAM,EAAE,CAAC;KACxB,CAAC;CACH;AAED,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,YAAY,CAAC;IAC9B,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,cAAc,CAAiB;
|
|
1
|
+
{"version":3,"file":"enforcer.d.ts","sourceRoot":"","sources":["../../src/policies/enforcer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,UAAU,CAAC;IACtC,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,KAAK,CAAC;IACpC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,OAAO,GAAG,MAAM,CAAC;IAChC,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,aAAa,CAAC,EAAE;QACd,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,cAAc,EAAE,MAAM,EAAE,CAAC;KAC1B,CAAC;IACF,kBAAkB,CAAC,EAAE;QACnB,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,YAAY,EAAE,MAAM,EAAE,CAAC;KACxB,CAAC;CACH;AAED,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,YAAY,CAAC;IAC9B,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,OAAO,CAAuD;gBAE1D,OAAO,EAAE,qBAAqB;IAQ1C;;;OAGG;IACH,OAAO,CAAC,aAAa;IAyBrB;;OAEG;IACH,OAAO,CAAC,YAAY;IA4CpB;;OAEG;IACH,OAAO,CAAC,WAAW;IAMnB;;OAEG;IACG,KAAK,CACT,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,iBAAiB,CAAC;IAwE7B;;OAEG;IACH,OAAO,CAAC,aAAa;IAmBrB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IA+B3B;;OAEG;IACH,OAAO,CAAC,eAAe;IAUvB;;OAEG;IACH,OAAO,CAAC,YAAY;IAapB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA8GxB;;OAEG;IACH,WAAW,IAAI,YAAY;IAK3B;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAK/B;;OAEG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;CAQhC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Secret Resolver
|
|
3
|
+
*
|
|
4
|
+
* Reads synced-secrets.json (written by the daemon) and resolves which
|
|
5
|
+
* secrets should be injected as environment variables for each exec operation.
|
|
6
|
+
*
|
|
7
|
+
* - Global secrets (policyIds=[]) are always injected
|
|
8
|
+
* - Policy-linked secrets are injected when the policy's patterns match
|
|
9
|
+
* the command being executed
|
|
10
|
+
*
|
|
11
|
+
* Auto-reloads from disk every 30 seconds (same pattern as CommandAllowlist).
|
|
12
|
+
*/
|
|
13
|
+
export declare class SecretResolver {
|
|
14
|
+
private syncFilePath;
|
|
15
|
+
private synced;
|
|
16
|
+
private lastLoad;
|
|
17
|
+
private reloadInterval;
|
|
18
|
+
constructor(syncFilePath: string);
|
|
19
|
+
/** Load synced secrets from disk */
|
|
20
|
+
private load;
|
|
21
|
+
private maybeReload;
|
|
22
|
+
/**
|
|
23
|
+
* Get environment variables to inject for an exec operation.
|
|
24
|
+
* Returns global secrets + any secrets from policies whose patterns match.
|
|
25
|
+
*/
|
|
26
|
+
getSecretsForExec(command: string, args: string[]): Record<string, string>;
|
|
27
|
+
/**
|
|
28
|
+
* Get names of secrets that would be injected (for audit logging — names only, never values).
|
|
29
|
+
*/
|
|
30
|
+
getSecretNamesForExec(command: string, args: string[]): string[];
|
|
31
|
+
private normalizeUrlBase;
|
|
32
|
+
private normalizeUrlTarget;
|
|
33
|
+
private globToRegex;
|
|
34
|
+
private matchUrlPattern;
|
|
35
|
+
private matchCommandPattern;
|
|
36
|
+
private extractUrlFromArgs;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/secrets/resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA0CH,qBAAa,cAAc;IACzB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,cAAc,CAAiB;gBAE3B,YAAY,EAAE,MAAM;IAKhC,oCAAoC;IACpC,OAAO,CAAC,IAAI;IAgBZ,OAAO,CAAC,WAAW;IAMnB;;;OAGG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IA8B1E;;OAEG;IACH,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAMhE,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,eAAe;IAgBvB,OAAO,CAAC,mBAAmB;IAc3B,OAAO,CAAC,kBAAkB;CAa3B"}
|
package/server.d.ts
CHANGED
|
@@ -8,12 +8,14 @@ import type { BrokerConfig } from './types.js';
|
|
|
8
8
|
import type { PolicyEnforcer } from './policies/enforcer.js';
|
|
9
9
|
import type { AuditLogger } from './audit/logger.js';
|
|
10
10
|
import type { SecretVault } from './secrets/vault.js';
|
|
11
|
+
import type { SecretResolver } from './secrets/resolver.js';
|
|
11
12
|
import type { CommandAllowlist } from './policies/command-allowlist.js';
|
|
12
13
|
export interface UnixSocketServerOptions {
|
|
13
14
|
config: BrokerConfig;
|
|
14
15
|
policyEnforcer: PolicyEnforcer;
|
|
15
16
|
auditLogger: AuditLogger;
|
|
16
17
|
secretVault: SecretVault;
|
|
18
|
+
secretResolver?: SecretResolver;
|
|
17
19
|
commandAllowlist: CommandAllowlist;
|
|
18
20
|
}
|
|
19
21
|
export declare class UnixSocketServer {
|
|
@@ -22,6 +24,7 @@ export declare class UnixSocketServer {
|
|
|
22
24
|
private policyEnforcer;
|
|
23
25
|
private auditLogger;
|
|
24
26
|
private secretVault;
|
|
27
|
+
private secretResolver?;
|
|
25
28
|
private commandAllowlist;
|
|
26
29
|
private connections;
|
|
27
30
|
constructor(options: UnixSocketServerOptions);
|
package/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EACV,YAAY,EAIb,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAIxE,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,YAAY,CAAC;IACrB,cAAc,EAAE,cAAc,CAAC;IAC/B,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,WAAW,CAAC;IACzB,gBAAgB,EAAE,gBAAgB,CAAC;CACpC;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,WAAW,CAA8B;gBAErC,OAAO,EAAE,uBAAuB;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EACV,YAAY,EAIb,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAIxE,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,YAAY,CAAC;IACrB,cAAc,EAAE,cAAc,CAAC;IAC/B,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,WAAW,CAAC;IACzB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,gBAAgB,EAAE,gBAAgB,CAAC;CACpC;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,WAAW,CAA8B;gBAErC,OAAO,EAAE,uBAAuB;IAS5C;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA4B5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA0B3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA+BxB;;OAEG;YACW,cAAc;IAiH5B;;OAEG;IACH,OAAO,CAAC,UAAU;IA2BlB;;OAEG;IACH,OAAO,CAAC,aAAa;IAWrB;;OAEG;IACH,OAAO,CAAC,aAAa;CAWtB"}
|
package/types.d.ts
CHANGED
|
@@ -269,6 +269,8 @@ export interface SkillInstallResult {
|
|
|
269
269
|
wrapperPath?: string;
|
|
270
270
|
/** Number of files written */
|
|
271
271
|
filesWritten: number;
|
|
272
|
+
/** Non-fatal warnings (e.g., chown failures in dev) */
|
|
273
|
+
warnings?: string[];
|
|
272
274
|
}
|
|
273
275
|
export interface SkillUninstallParams {
|
|
274
276
|
/** Skill slug to uninstall */
|
package/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|