@botconnector/bccli 0.4.0-beta.39 → 0.4.0-beta.40

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.
@@ -97,8 +97,8 @@ function runAcp(input, output, opts) {
97
97
  function runtimeAgent(cwd) {
98
98
  return {
99
99
  async run(text, onChunk, signal) {
100
- const { parseCliArgs } = await import("./args-BD2PHEKG.js");
101
- const { createRuntime } = await import("./setup-FGCFKC7Z.js");
100
+ const { parseCliArgs } = await import("./args-4SMOHFN5.js");
101
+ const { createRuntime } = await import("./setup-I7UY7X7C.js");
102
102
  const rt = createRuntime({ cwd, args: { ...parseCliArgs([]), allowAll: true } });
103
103
  rt.agent.onEvent = (event) => {
104
104
  if (event.type === "text") onChunk(event.delta);
@@ -2,8 +2,8 @@
2
2
  import {
3
3
  helpText,
4
4
  parseCliArgs
5
- } from "./chunk-ZG7HCXYA.js";
6
- import "./chunk-R3ND76LW.js";
5
+ } from "./chunk-AS7VV7D3.js";
6
+ import "./chunk-GAFJEQTJ.js";
7
7
  import "./chunk-NI5JZUZ3.js";
8
8
  import "./chunk-M7LLJQ7M.js";
9
9
  import "./chunk-M23QBX3V.js";
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  MODE_ORDER
4
- } from "./chunk-R3ND76LW.js";
4
+ } from "./chunk-GAFJEQTJ.js";
5
5
  import {
6
6
  REASONING_LEVELS,
7
7
  isReasoningLevel
@@ -36,7 +36,7 @@ function readSecret(prompt) {
36
36
  }
37
37
  async function runLogin(providerId, cwd) {
38
38
  const { runProviderCommand } = await import("./providerCli-DDH4ZZUY.js");
39
- const { parseCliArgs } = await import("./args-BD2PHEKG.js");
39
+ const { parseCliArgs } = await import("./args-4SMOHFN5.js");
40
40
  return runProviderCommand(parseCliArgs(["provider", "add", providerId]), {
41
41
  env: process.env,
42
42
  cwd,
@@ -24,6 +24,19 @@ function commandKey(segment) {
24
24
  const words = segment.trim().split(/\s+/);
25
25
  return words[1] ? `${words[0]} ${words[1]}` : words[0];
26
26
  }
27
+ function requiresSensitiveToolApproval(req) {
28
+ const target = req.target.trim();
29
+ if (req.kind === "read" || req.kind === "edit") {
30
+ return /(?:^|[/\\])(?:\.env(?:\..*)?|\.ssh|\.aws|\.config\/gcloud|secrets?|credentials?)(?:[/\\]|$)/i.test(target) || /(?:id_rsa|id_ed25519|\.pem|\.p12|\.key)$/i.test(target);
31
+ }
32
+ if (req.kind === "bash") {
33
+ return /\b(?:rm\s+-[a-z]*r[a-z]*f[a-z]*\s|rm\s+-[a-z]*f[a-z]*r[a-z]*\s|mkfs(?:\.|\s)|wipefs\b|shred\s|git\s+push\s+(?:--force|-f)\b|docker\s+(?:system\s+prune|volume\s+rm)|kubectl\s+delete\b|drop\s+(?:database|table)|npm\s+publish\b)/i.test(target) || /\b(?:deploy-service\.sh|aws\s+secretsmanager|cat\s+[^;&|]*\.env\b)/i.test(target);
34
+ }
35
+ if (req.kind === "mcp") {
36
+ return /(?:delete|remove|revoke|transfer|send_email|publish|deploy|execute_command|run_command|read_secret)/i.test(req.tool);
37
+ }
38
+ return false;
39
+ }
27
40
  var Permissions = class {
28
41
  constructor(mode, rules = [], cwd = process.cwd()) {
29
42
  this.mode = mode;
@@ -43,6 +56,7 @@ var Permissions = class {
43
56
  }
44
57
  /** Rules that "[a] allow for this session" would add; undefined when it must always be asked. */
45
58
  rulesFor(req) {
59
+ if (process.env.BC_TOOL_POLICY_ENFORCE === "true" && requiresSensitiveToolApproval(req)) return void 0;
46
60
  if (req.kind === "edit") return this.editInProject(req.target) ? ["edit(project)"] : void 0;
47
61
  if (req.kind === "fetch") {
48
62
  try {
@@ -62,6 +76,8 @@ var Permissions = class {
62
76
  return [];
63
77
  }
64
78
  check(req) {
79
+ if (this.mode === "plan" && req.kind !== "read") return "deny";
80
+ if (process.env.BC_TOOL_POLICY_ENFORCE === "true" && requiresSensitiveToolApproval(req)) return "ask";
65
81
  if (req.kind === "read") return "allow";
66
82
  if (this.mode === "allowAll") return "allow";
67
83
  if (this.mode === "plan") return "deny";
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  // src/version.ts
4
- var VERSION = true ? "0.4.0-beta.39" : "0.0.0-dev";
4
+ var VERSION = true ? "0.4.0-beta.40" : "0.0.0-dev";
5
5
 
6
6
  export {
7
7
  VERSION
@@ -20,7 +20,7 @@ import {
20
20
  } from "./chunk-ZMU7MXCH.js";
21
21
  import {
22
22
  Permissions
23
- } from "./chunk-R3ND76LW.js";
23
+ } from "./chunk-GAFJEQTJ.js";
24
24
  import {
25
25
  addProviderKey
26
26
  } from "./chunk-JROUQ5YS.js";
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  VERSION
4
- } from "./chunk-PDZPPSLU.js";
4
+ } from "./chunk-PDVS4UWM.js";
5
5
  import {
6
6
  resolveWorktree,
7
7
  runPrint
@@ -9,16 +9,16 @@ import {
9
9
  import {
10
10
  helpText,
11
11
  parseCliArgs
12
- } from "./chunk-ZG7HCXYA.js";
12
+ } from "./chunk-AS7VV7D3.js";
13
13
  import {
14
14
  runLogin
15
- } from "./chunk-EONFDWBE.js";
15
+ } from "./chunk-DSFHN5CH.js";
16
16
  import {
17
17
  createRuntime
18
- } from "./chunk-QETGQXPL.js";
18
+ } from "./chunk-WH7XLDGZ.js";
19
19
  import "./chunk-3HCOAJEQ.js";
20
20
  import "./chunk-ZMU7MXCH.js";
21
- import "./chunk-R3ND76LW.js";
21
+ import "./chunk-GAFJEQTJ.js";
22
22
  import "./chunk-JROUQ5YS.js";
23
23
  import "./chunk-LN32JIZR.js";
24
24
  import {
@@ -67,12 +67,12 @@ async function main() {
67
67
  if (args.command === "login") return runLogin(args.loginProvider ?? "bc-cloud", cwd);
68
68
  if (args.command === "mcp") {
69
69
  const { runMcpCommand } = await import("./mcpCli-5QTXH7XJ.js");
70
- const { readSecret } = await import("./login-IWBRUNT4.js");
70
+ const { readSecret } = await import("./login-T5S6SPZA.js");
71
71
  return runMcpCommand(args, { env: process.env, cwd, out: (s) => console.log(s), err: (s) => console.error(s), readSecret });
72
72
  }
73
73
  if (args.command === "provider") {
74
74
  const { runProviderCommand } = await import("./providerCli-DDH4ZZUY.js");
75
- const { readSecret } = await import("./login-IWBRUNT4.js");
75
+ const { readSecret } = await import("./login-T5S6SPZA.js");
76
76
  return runProviderCommand(args, { env: process.env, cwd, out: (s) => console.log(s), err: (s) => console.error(s), readSecret });
77
77
  }
78
78
  if (args.command === "connect" || args.command === "disconnect" || args.command === "integrations") {
@@ -90,16 +90,16 @@ async function main() {
90
90
  return runModelsCommand(args, { env: process.env, cwd, out: (s) => console.log(s), err: (s) => console.error(s), fetch: globalThis.fetch });
91
91
  }
92
92
  if (args.command === "update") {
93
- const { runUpdateCommand } = await import("./update-73WI27VM.js");
93
+ const { runUpdateCommand } = await import("./update-SZUG3YSB.js");
94
94
  return runUpdateCommand({ env: process.env });
95
95
  }
96
96
  if (args.command === "acp") {
97
- const { runtimeAgent, runAcp } = await import("./acp-4XE2KOIJ.js");
97
+ const { runtimeAgent, runAcp } = await import("./acp-5A7EXLCG.js");
98
98
  await runAcp(process.stdin, process.stdout, { cwd, newAgent: (c) => runtimeAgent(c) });
99
99
  return 0;
100
100
  }
101
101
  if (args.command === "serve") {
102
- const { startServe } = await import("./serve-7BP5BVX3.js");
102
+ const { startServe } = await import("./serve-JNQUP7CZ.js");
103
103
  const handle = await startServe({ port: args.port, host: args.host, token: args.token, cwd, env: process.env });
104
104
  process.stderr.write(`bccli serve ${handle.url} \u2014 Authorization: Bearer ${handle.token}
105
105
  `);
@@ -135,13 +135,13 @@ async function main() {
135
135
  if (!process.stdin.isTTY) throw new ConfigError(t('Interactive mode needs a terminal. For scripts/CI use: bccli -p "task"'));
136
136
  if (rt.config.updateCheck !== "off" && !process.env.BCCLI_NO_UPDATE_CHECK) {
137
137
  try {
138
- const { checkForUpdate } = await import("./update-73WI27VM.js");
138
+ const { checkForUpdate } = await import("./update-SZUG3YSB.js");
139
139
  const update = await checkForUpdate({ home: rt.home, fetch: globalThis.fetch, now: /* @__PURE__ */ new Date() });
140
140
  if (update) console.error(update);
141
141
  } catch {
142
142
  }
143
143
  }
144
- const { startInteractive } = await import("./ui-MLOXPAHT.js");
144
+ const { startInteractive } = await import("./ui-GVIMUZNS.js");
145
145
  return startInteractive(rt, { initialPrompt: args.prompt, resume: args.resume, version: VERSION });
146
146
  }
147
147
  main().then(
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  readSecret,
4
4
  runLogin
5
- } from "./chunk-EONFDWBE.js";
5
+ } from "./chunk-DSFHN5CH.js";
6
6
  export {
7
7
  readSecret,
8
8
  runLogin
package/dist/sdk.js CHANGED
@@ -677,6 +677,19 @@ function commandKey(segment) {
677
677
  const words2 = segment.trim().split(/\s+/);
678
678
  return words2[1] ? `${words2[0]} ${words2[1]}` : words2[0];
679
679
  }
680
+ function requiresSensitiveToolApproval(req) {
681
+ const target = req.target.trim();
682
+ if (req.kind === "read" || req.kind === "edit") {
683
+ return /(?:^|[/\\])(?:\.env(?:\..*)?|\.ssh|\.aws|\.config\/gcloud|secrets?|credentials?)(?:[/\\]|$)/i.test(target) || /(?:id_rsa|id_ed25519|\.pem|\.p12|\.key)$/i.test(target);
684
+ }
685
+ if (req.kind === "bash") {
686
+ return /\b(?:rm\s+-[a-z]*r[a-z]*f[a-z]*\s|rm\s+-[a-z]*f[a-z]*r[a-z]*\s|mkfs(?:\.|\s)|wipefs\b|shred\s|git\s+push\s+(?:--force|-f)\b|docker\s+(?:system\s+prune|volume\s+rm)|kubectl\s+delete\b|drop\s+(?:database|table)|npm\s+publish\b)/i.test(target) || /\b(?:deploy-service\.sh|aws\s+secretsmanager|cat\s+[^;&|]*\.env\b)/i.test(target);
687
+ }
688
+ if (req.kind === "mcp") {
689
+ return /(?:delete|remove|revoke|transfer|send_email|publish|deploy|execute_command|run_command|read_secret)/i.test(req.tool);
690
+ }
691
+ return false;
692
+ }
680
693
  var Permissions = class {
681
694
  constructor(mode, rules = [], cwd = process.cwd()) {
682
695
  this.mode = mode;
@@ -696,6 +709,7 @@ var Permissions = class {
696
709
  }
697
710
  /** Rules that "[a] allow for this session" would add; undefined when it must always be asked. */
698
711
  rulesFor(req) {
712
+ if (process.env.BC_TOOL_POLICY_ENFORCE === "true" && requiresSensitiveToolApproval(req)) return void 0;
699
713
  if (req.kind === "edit") return this.editInProject(req.target) ? ["edit(project)"] : void 0;
700
714
  if (req.kind === "fetch") {
701
715
  try {
@@ -715,6 +729,8 @@ var Permissions = class {
715
729
  return [];
716
730
  }
717
731
  check(req) {
732
+ if (this.mode === "plan" && req.kind !== "read") return "deny";
733
+ if (process.env.BC_TOOL_POLICY_ENFORCE === "true" && requiresSensitiveToolApproval(req)) return "ask";
718
734
  if (req.kind === "read") return "allow";
719
735
  if (this.mode === "allowAll") return "allow";
720
736
  if (this.mode === "plan") return "deny";
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  VERSION
4
- } from "./chunk-PDZPPSLU.js";
4
+ } from "./chunk-PDVS4UWM.js";
5
5
  import {
6
6
  LOOPBACK_BIND,
7
7
  MAX_FRAME_BYTES,
@@ -10,13 +10,13 @@ import {
10
10
  parseClientFrame,
11
11
  randomToken,
12
12
  trustFence
13
- } from "./chunk-ZG7HCXYA.js";
13
+ } from "./chunk-AS7VV7D3.js";
14
14
  import {
15
15
  createRuntime
16
- } from "./chunk-QETGQXPL.js";
16
+ } from "./chunk-WH7XLDGZ.js";
17
17
  import "./chunk-3HCOAJEQ.js";
18
18
  import "./chunk-ZMU7MXCH.js";
19
- import "./chunk-R3ND76LW.js";
19
+ import "./chunk-GAFJEQTJ.js";
20
20
  import "./chunk-JROUQ5YS.js";
21
21
  import {
22
22
  listAllModels
@@ -2,10 +2,10 @@
2
2
  import {
3
3
  createRuntime,
4
4
  lunaPtcAutoEnabled
5
- } from "./chunk-QETGQXPL.js";
5
+ } from "./chunk-WH7XLDGZ.js";
6
6
  import "./chunk-3HCOAJEQ.js";
7
7
  import "./chunk-ZMU7MXCH.js";
8
- import "./chunk-R3ND76LW.js";
8
+ import "./chunk-GAFJEQTJ.js";
9
9
  import "./chunk-JROUQ5YS.js";
10
10
  import "./chunk-LN32JIZR.js";
11
11
  import "./chunk-SESBH44L.js";
@@ -24,7 +24,7 @@ import {
24
24
  } from "./chunk-ZMU7MXCH.js";
25
25
  import {
26
26
  nextMode
27
- } from "./chunk-R3ND76LW.js";
27
+ } from "./chunk-GAFJEQTJ.js";
28
28
  import {
29
29
  hasKey,
30
30
  providerName,
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  VERSION
4
- } from "./chunk-PDZPPSLU.js";
4
+ } from "./chunk-PDVS4UWM.js";
5
5
  import {
6
6
  t
7
7
  } from "./chunk-M23QBX3V.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@botconnector/bccli",
3
- "version": "0.4.0-beta.39",
3
+ "version": "0.4.0-beta.40",
4
4
  "description": "BCCLI — BotConnector AI coding agent for the terminal",
5
5
  "type": "module",
6
6
  "bin": {