@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.
@@ -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
@@ -1 +1 @@
1
- {"version":3,"file":"daemon-forward.d.ts","sourceRoot":"","sources":["../src/daemon-forward.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAiDpC"}
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"}
@@ -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,CA+GpC"}
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;AAQtD,UAAU,qBAAqB;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;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,CAoE/C"}
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;AAMH,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,CA+I5C;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,CAiF9C"}
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"}
@@ -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;
@@ -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;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,cAAc,CAAC;IAC/B,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,WAAW,CAAC;IACzB,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"}
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"] || "clawshield"
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
- console.warn(`[SkillInstall] chown failed (may be expected in dev): ${err.message}`);
732
- }
733
- const openclawConfigPath = path3.join(agentHome, ".openclaw", "openclaw.json");
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 { success: true, data: daemonResult };
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: { success: true, data: result.data }
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
- if (this.matchPattern(target, pattern)) {
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"] || "clawshield"
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
- console.warn(`[SkillInstall] chown failed (may be expected in dev): ${err.message}`);
734
- }
735
- const openclawConfigPath = path3.join(agentHome, ".openclaw", "openclaw.json");
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 { success: true, data: daemonResult };
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: { success: true, data: result.data }
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
- if (this.matchPattern(target, pattern)) {
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/main.ts
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 (fs8.existsSync(configPath)) {
2738
+ if (fs9.existsSync(configPath)) {
2493
2739
  try {
2494
- const content = fs8.readFileSync(configPath, "utf-8");
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 || "clawbroker",
2515
- socketGroup: fileConfig.socketGroup || "clawshield",
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 (!fs8.existsSync(dir)) {
2770
+ if (!fs9.existsSync(dir)) {
2525
2771
  try {
2526
- fs8.mkdirSync(dir, { recursive: true, mode: 493 });
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 (!fs8.existsSync(binDir)) {
2782
+ if (!fs9.existsSync(binDir)) {
2537
2783
  try {
2538
- fs8.mkdirSync(binDir, { recursive: true, mode: 493 });
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 = fs8.existsSync(shieldExecPath);
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 (fs8.existsSync(wrapperPath)) continue;
2795
+ if (fs9.existsSync(wrapperPath)) continue;
2550
2796
  if (hasShieldExec) {
2551
2797
  try {
2552
- fs8.symlinkSync(shieldExecPath, wrapperPath);
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
- fs8.writeFileSync(wrapperPath, script, { mode: 493 });
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.6.2",
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/ipc": "0.6.2"
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;AAiDD,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"}
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"}
@@ -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;gBAE3B,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;IAgE7B;;OAEG;IACH,OAAO,CAAC,aAAa;IAmBrB;;OAEG;IACH,OAAO,CAAC,eAAe;IASvB;;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"}
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;IAQ5C;;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;IAgH5B;;OAEG;IACH,OAAO,CAAC,UAAU;IA2BlB;;OAEG;IACH,OAAO,CAAC,aAAa;IAWrB;;OAEG;IACH,OAAO,CAAC,aAAa;CAWtB"}
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":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAc,aAAa,EAAqC,MAAM,iBAAiB,CAAC;AAEpG;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,uBAAuB;IACvB,UAAU,EAAE,MAAM,CAAC;IAEnB,uCAAuC;IACvC,WAAW,EAAE,OAAO,CAAC;IAErB,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAC;IAEjB,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;IAEjB,iCAAiC;IACjC,UAAU,EAAE,MAAM,CAAC;IAEnB,iCAAiC;IACjC,YAAY,EAAE,MAAM,CAAC;IAErB,wBAAwB;IACxB,YAAY,EAAE,MAAM,CAAC;IAErB,gBAAgB;IAChB,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAE9C,iDAAiD;IACjD,QAAQ,EAAE,OAAO,CAAC;IAElB,sCAAsC;IACtC,UAAU,EAAE,MAAM,CAAC;IAEnB,wBAAwB;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;IAElB,oCAAoC;IACpC,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC;IAE3B,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,2BAA2B;IAC3B,SAAS,EAAE,IAAI,CAAC;IAEhB,2BAA2B;IAC3B,MAAM,EAAE,YAAY,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,OAAO;IACxC,sCAAsC;IACtC,OAAO,EAAE,OAAO,CAAC;IAEjB,kCAAkC;IAClC,IAAI,CAAC,EAAE,CAAC,CAAC;IAET,oCAAoC;IACpC,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;IAEF,qBAAqB;IACrB,KAAK,CAAC,EAAE;QACN,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,sBAAsB;IACtB,EAAE,EAAE,MAAM,CAAC;IAEX,gBAAgB;IAChB,SAAS,EAAE,IAAI,CAAC;IAEhB,qBAAqB;IACrB,SAAS,EAAE,aAAa,CAAC;IAEzB,sBAAsB;IACtB,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC;IAE3B,qBAAqB;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IAEjB,mCAAmC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC;IAEf,uBAAuB;IACvB,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;IAEvC,8BAA8B;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;IAEnB,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IAEb,sBAAsB;IACtB,cAAc,EAAE,MAAM,CAAC;IAEvB,6CAA6C;IAC7C,iBAAiB,EAAE,aAAa,EAAE,CAAC;IAEnC,wBAAwB;IACxB,SAAS,EAAE,IAAI,CAAC;IAEhB,8BAA8B;IAC9B,cAAc,CAAC,EAAE,IAAI,CAAC;IAEtB,mBAAmB;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC;QACvC,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,0DAA0D;IAC1D,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,qCAAqC;IACrC,SAAS,EAAE,OAAO,CAAC;IACnB,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8BAA8B;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,uCAAuC;IACvC,WAAW,EAAE,OAAO,CAAC;IACrB,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,cAAc,EAAE,OAAO,CAAC;CACzB"}