@nexrall/code-core 1.4.77 → 1.4.78

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.
Files changed (39) hide show
  1. package/dist/agent/effortCap.d.ts +24 -0
  2. package/dist/agent/effortCap.d.ts.map +1 -0
  3. package/dist/agent/effortCap.js +66 -0
  4. package/dist/agent/hooks.d.ts +10 -2
  5. package/dist/agent/hooks.d.ts.map +1 -1
  6. package/dist/agent/hooks.js +9 -3
  7. package/dist/agent/skills.d.ts.map +1 -1
  8. package/dist/agent/skills.js +14 -1
  9. package/dist/index.d.ts +5 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +5 -0
  12. package/dist/mcp/manager.d.ts +8 -0
  13. package/dist/mcp/manager.d.ts.map +1 -1
  14. package/dist/mcp/manager.js +64 -57
  15. package/dist/permissions/destructiveTokens.d.ts +1 -0
  16. package/dist/permissions/destructiveTokens.d.ts.map +1 -1
  17. package/dist/permissions/destructiveTokens.js +93 -0
  18. package/dist/permissions/rules.d.ts +12 -0
  19. package/dist/permissions/rules.d.ts.map +1 -1
  20. package/dist/permissions/rules.js +89 -7
  21. package/dist/plugins/configStore.d.ts +43 -0
  22. package/dist/plugins/configStore.d.ts.map +1 -0
  23. package/dist/plugins/configStore.js +253 -0
  24. package/dist/plugins/files.d.ts +10 -0
  25. package/dist/plugins/files.d.ts.map +1 -0
  26. package/dist/plugins/files.js +85 -0
  27. package/dist/plugins/index.d.ts +3 -22
  28. package/dist/plugins/index.d.ts.map +1 -1
  29. package/dist/plugins/index.js +30 -40
  30. package/dist/plugins/resolve.d.ts +18 -0
  31. package/dist/plugins/resolve.d.ts.map +1 -0
  32. package/dist/plugins/resolve.js +152 -0
  33. package/dist/plugins/userConfig.d.ts +90 -0
  34. package/dist/plugins/userConfig.d.ts.map +1 -0
  35. package/dist/plugins/userConfig.js +332 -0
  36. package/dist/plugins/validate.d.ts +14 -0
  37. package/dist/plugins/validate.d.ts.map +1 -0
  38. package/dist/plugins/validate.js +222 -0
  39. package/package.json +1 -1
@@ -0,0 +1,24 @@
1
+ /** Canonical ladder, low → high. A resolved cap normalizes to one of these. */
2
+ export declare const EFFORT_CAP_LEVELS: readonly ["low", "medium", "high", "xhigh", "max"];
3
+ export type EffortCapLevel = (typeof EFFORT_CAP_LEVELS)[number];
4
+ /** Canonical rank of an effort token, or null when it is not on the ladder. */
5
+ export declare function effortRank(level: string): number | null;
6
+ export interface EffortCapResolution {
7
+ /** The effective cap (canonical name), or null when no tier sets a valid one. */
8
+ cap: EffortCapLevel | null;
9
+ /** Which tier supplied the deciding (strictest) value. Null when cap is null. */
10
+ tier: string | null;
11
+ /** Tier values that were ignored because they are not on the ladder. */
12
+ ignored: Array<{
13
+ tier: string;
14
+ value: string;
15
+ }>;
16
+ }
17
+ /**
18
+ * Resolve the effective `maxEffortLevel` across the settings tiers. A value the
19
+ * ladder does not know is IGNORED and reported (`ignored`) rather than guessed
20
+ * at — a typo must not silently disable the cap, but it must not silently clamp
21
+ * to the wrong level either; the caller surfaces it in one line.
22
+ */
23
+ export declare function resolveMaxEffortCap(workDir: string): EffortCapResolution;
24
+ //# sourceMappingURL=effortCap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effortCap.d.ts","sourceRoot":"","sources":["../../src/agent/effortCap.ts"],"names":[],"mappings":"AAeA,+EAA+E;AAC/E,eAAO,MAAM,iBAAiB,oDAAqD,CAAC;AACpF,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAgBhE,+EAA+E;AAC/E,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIvD;AAED,MAAM,WAAW,mBAAmB;IAClC,iFAAiF;IACjF,GAAG,EAAE,cAAc,GAAG,IAAI,CAAC;IAC3B,iFAAiF;IACjF,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,wEAAwE;IACxE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,CAexE"}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ // S25b — `maxEffortLevel`: a CAP on the thinking-effort level (Claude Code W37
3
+ // parity — "caps the effort level on every provider… users can still pick a
4
+ // lower level"). The cap is read from every settings tier, and the STRICTEST
5
+ // value wins: a cap can only be TIGHTENED, never loosened, by a lower-precedence
6
+ // file — a cloned repo's `.nexrall/settings.json` cannot raise the ceiling the
7
+ // user or an admin set.
8
+ //
9
+ // One ladder for every provider: each model scale (anthropic low…ultra,
10
+ // deepseek low/high/max, qwen thinking off/on, glm low/high/max, openai
11
+ // low/medium/high) resolves onto the canonical ranks below, so a single cap
12
+ // value means the same thing on every model. The CLI half that walks a model's
13
+ // own wire scale lives in packages/cli/src/effortCap.ts.
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.EFFORT_CAP_LEVELS = void 0;
16
+ exports.effortRank = effortRank;
17
+ exports.resolveMaxEffortCap = resolveMaxEffortCap;
18
+ const rules_1 = require("../permissions/rules");
19
+ /** Canonical ladder, low → high. A resolved cap normalizes to one of these. */
20
+ exports.EFFORT_CAP_LEVELS = ['low', 'medium', 'high', 'xhigh', 'max'];
21
+ /** Wire/UI tokens (aliases included) → canonical rank. `extra`/`ultra` are this
22
+ * codebase's legacy anthropic UI labels (extra→xhigh, ultra→max, translated
23
+ * server-side by routes/code.js's EFFORT_MAP); the rest are the real wire values
24
+ * across the provider styles. */
25
+ const EFFORT_RANK = {
26
+ low: 0,
27
+ medium: 1,
28
+ high: 2,
29
+ extra: 3,
30
+ xhigh: 3,
31
+ max: 4,
32
+ ultra: 4,
33
+ };
34
+ /** Canonical rank of an effort token, or null when it is not on the ladder. */
35
+ function effortRank(level) {
36
+ if (typeof level !== 'string')
37
+ return null;
38
+ const r = EFFORT_RANK[level.trim().toLowerCase()];
39
+ return r === undefined ? null : r;
40
+ }
41
+ /**
42
+ * Resolve the effective `maxEffortLevel` across the settings tiers. A value the
43
+ * ladder does not know is IGNORED and reported (`ignored`) rather than guessed
44
+ * at — a typo must not silently disable the cap, but it must not silently clamp
45
+ * to the wrong level either; the caller surfaces it in one line.
46
+ */
47
+ function resolveMaxEffortCap(workDir) {
48
+ let best = null;
49
+ const ignored = [];
50
+ for (const { tier, raw } of (0, rules_1.settingsTiersRaw)(workDir)) {
51
+ const v = raw.maxEffortLevel;
52
+ if (v === undefined)
53
+ continue;
54
+ const rank = typeof v === 'string' ? effortRank(v) : null;
55
+ if (rank === null) {
56
+ ignored.push({ tier, value: typeof v === 'string' ? v : (JSON.stringify(v) ?? 'null') });
57
+ continue;
58
+ }
59
+ if (!best || rank < best.rank)
60
+ best = { rank, tier };
61
+ }
62
+ if (!best)
63
+ return { cap: null, tier: null, ignored };
64
+ return { cap: exports.EFFORT_CAP_LEVELS[best.rank], tier: best.tier, ignored };
65
+ }
66
+ //# sourceMappingURL=effortCap.js.map
@@ -36,7 +36,15 @@ export interface HookDef {
36
36
  */
37
37
  asyncRewake?: boolean;
38
38
  /**
39
- * Run the hook once per session — after its first SUCCESSFUL run (exit 0) it is
39
+ * S24: the plugin's resolved userConfig as environment variables
40
+ * (NEXRALL_PLUGIN_OPTION_<KEY> — baked in by resolvePluginHooks). A shell-form
41
+ * hook reads a value from here because `${user_config.*}` is rejected inside
42
+ * a shell-form command (the substituted value would be re-parsed by the
43
+ * shell; validate.ts reports the reference).
44
+ */
45
+ pluginOptions?: Record<string, string>;
46
+ /**
47
+ * `once`: run the hook once per session — after its first SUCCESSFUL run (exit 0) it is
40
48
  * skipped; a failure, exit 2 or a timeout leaves it armed. Claude Code only honours
41
49
  * this in skill frontmatter; Nexrall honours it wherever the hook is declared.
42
50
  */
@@ -56,7 +64,7 @@ export interface HookDef {
56
64
  input?: Record<string, unknown>;
57
65
  /**
58
66
  * Which plugin this handler came from (stamped by the loader when it merges a
59
- * plugin's hooks.json — see pluginHooks in ../plugins/index). Its processes are
67
+ * plugin's hooks.json — see resolvePluginHooks in ../plugins/resolve). Its processes are
60
68
  * then started with NEXRALL_PLUGIN_DATA pointing at that plugin's OWN persistent
61
69
  * data directory, the one place it may keep files across plugin updates.
62
70
  */
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/agent/hooks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/agent/hooks.ts"],"names":[],"mappings":"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"}
@@ -63,7 +63,7 @@ const client_1 = require("../api/client");
63
63
  const executor_1 = require("../tools/executor");
64
64
  const agentTypes_1 = require("./agentTypes");
65
65
  const rules_1 = require("../permissions/rules");
66
- const index_1 = require("../plugins/index");
66
+ const resolve_1 = require("../plugins/resolve");
67
67
  const data_1 = require("../plugins/data");
68
68
  const fs = __importStar(require("fs"));
69
69
  const path = __importStar(require("path"));
@@ -99,7 +99,7 @@ function loadHooks(workDir) {
99
99
  fromSettings = base;
100
100
  }
101
101
  // Merge plugin-provided hooks AFTER the project's own (project hooks run first).
102
- const fromPlugins = (0, index_1.pluginHooks)(workDir);
102
+ const fromPlugins = (0, resolve_1.resolvePluginHooks)(workDir);
103
103
  const merged = { ...fromSettings };
104
104
  for (const phase of Object.keys(fromPlugins)) {
105
105
  const extra = fromPlugins[phase];
@@ -666,7 +666,13 @@ async function runHookHandler(hook, payload, opts) {
666
666
  // forgot would silently break the plugin's only place to keep state. HTTP and model
667
667
  // handlers ignore the variable; passing it costs nothing.
668
668
  const env = hook.plugin
669
- ? { ...(opts.env ?? process.env), NEXRALL_PLUGIN_DATA: (0, data_1.ensurePluginDataDir)(hook.plugin) }
669
+ ? {
670
+ ...(opts.env ?? process.env),
671
+ NEXRALL_PLUGIN_DATA: (0, data_1.ensurePluginDataDir)(hook.plugin),
672
+ // S24: the plugin's resolved userConfig rides in as env vars for EVERY
673
+ // handler of that plugin (mcp_tool/http handlers simply ignore them).
674
+ ...(hook.pluginOptions ?? {}),
675
+ }
670
676
  : opts.env;
671
677
  return runWithHookEvents(hook, opts.event ?? 'hook', (onData) => {
672
678
  if (hook.type === 'http')
@@ -1 +1 @@
1
- {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/agent/skills.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/agent/skills.ts"],"names":[],"mappings":"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"}
@@ -50,6 +50,7 @@ const path = __importStar(require("path"));
50
50
  const os = __importStar(require("os"));
51
51
  const child_process_1 = require("child_process");
52
52
  const index_1 = require("../plugins/index");
53
+ const resolve_1 = require("../plugins/resolve");
53
54
  const loader_1 = require("../commands/loader");
54
55
  const frontmatter_1 = require("../util/frontmatter");
55
56
  const agentTypes_1 = require("./agentTypes");
@@ -730,7 +731,19 @@ function resolveNestedSkill(workDir, ref) {
730
731
  * guidance without loading them into context up front.
731
732
  */
732
733
  function expandSkill(skill, argString, workDir) {
733
- const expanded = (0, loader_1.expandBody)(skill.body, argString, workDir);
734
+ let expanded = (0, loader_1.expandBody)(skill.body, argString, workDir);
735
+ // S24: a PLUGIN skill's body may embed ${user_config.KEY} references — that is
736
+ // how a skill targets the value the user configured for its plugin. Only
737
+ // NON-sensitive values are substituted here: a sensitive reference stays the
738
+ // literal token, so a token never rides a skill into model context (the
739
+ // command/agent can still read it from NEXRALL_PLUGIN_OPTION_<KEY> in its own
740
+ // processes). Flat plugin commands have no `dir` and cannot be attributed to
741
+ // one plugin — they are skipped.
742
+ if (skill.source === 'plugin' && skill.dir) {
743
+ const cfg = (0, resolve_1.pluginConfigForSkillDir)(workDir, skill.dir);
744
+ if (cfg)
745
+ expanded = (0, resolve_1.substituteSkillBody)(expanded, cfg);
746
+ }
734
747
  if (!skill.dir)
735
748
  return expanded;
736
749
  let siblings = [];
package/dist/index.d.ts CHANGED
@@ -27,6 +27,7 @@ export * from './mcp/stats';
27
27
  export * from './checkpoint/manager';
28
28
  export * from './commands/loader';
29
29
  export * from './agent/agentTypes';
30
+ export * from './agent/effortCap';
30
31
  export * from './agent/planMode';
31
32
  export * from './agent/agentRegistry';
32
33
  export * from './agent/backgroundAgents';
@@ -40,6 +41,10 @@ export * from './plugins/installer';
40
41
  export * from './plugins/sources';
41
42
  export * from './plugins/data';
42
43
  export * from './plugins/eval';
44
+ export * from './plugins/userConfig';
45
+ export * from './plugins/configStore';
46
+ export * from './plugins/validate';
47
+ export * from './plugins/resolve';
43
48
  export * from './agent/trust';
44
49
  export * from './agent/crossProcessLock';
45
50
  export * from './agent/worktree';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC"}
package/dist/index.js CHANGED
@@ -43,6 +43,7 @@ __exportStar(require("./mcp/stats"), exports);
43
43
  __exportStar(require("./checkpoint/manager"), exports);
44
44
  __exportStar(require("./commands/loader"), exports);
45
45
  __exportStar(require("./agent/agentTypes"), exports);
46
+ __exportStar(require("./agent/effortCap"), exports);
46
47
  __exportStar(require("./agent/planMode"), exports);
47
48
  __exportStar(require("./agent/agentRegistry"), exports);
48
49
  __exportStar(require("./agent/backgroundAgents"), exports);
@@ -56,6 +57,10 @@ __exportStar(require("./plugins/installer"), exports);
56
57
  __exportStar(require("./plugins/sources"), exports);
57
58
  __exportStar(require("./plugins/data"), exports);
58
59
  __exportStar(require("./plugins/eval"), exports);
60
+ __exportStar(require("./plugins/userConfig"), exports);
61
+ __exportStar(require("./plugins/configStore"), exports);
62
+ __exportStar(require("./plugins/validate"), exports);
63
+ __exportStar(require("./plugins/resolve"), exports);
59
64
  __exportStar(require("./agent/trust"), exports);
60
65
  __exportStar(require("./agent/crossProcessLock"), exports);
61
66
  __exportStar(require("./agent/worktree"), exports);
@@ -71,6 +71,14 @@ export declare class McpManager {
71
71
  * poll in executor.ts), just without the ability to also kill a remote
72
72
  * server's in-flight work the way `bash` can kill a local child process.
73
73
  */
74
+ /**
75
+ * S25e (Claude Code 2.1.288 parity): a mid-call 401/insufficient_scope already flips
76
+ * the server to needs-auth (see trackAuth below); when the HOST can ask a user, it may
77
+ * re-authorize on the spot and request ONE retry of the same call. Unset = no retry
78
+ * (headless runs), so the enriched error still reaches the caller. A hook that throws
79
+ * is treated as "no retry" — the original OAuth error must stay the thing the model sees.
80
+ */
81
+ onAuthRequired?: (serverName: string, missingScope: string) => Promise<boolean>;
74
82
  callTool(prefixedName: string, input: Record<string, unknown>, abortSignal?: {
75
83
  aborted: boolean;
76
84
  }): Promise<string | null>;
@@ -1 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/mcp/manager.ts"],"names":[],"mappings":"AAGA,OAAO,EAAa,eAAe,EAAE,iBAAiB,EAAgB,WAAW,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC/G,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAItD,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAIpC,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC5C;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAGD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE;QACZ,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACrC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH;AAID,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAmC;IAEnD,OAAO,CAAC,QAAQ,CAA6B;IAI7C,OAAO,CAAC,YAAY,CAAkC;IAEtD,OAAO,CAAC,QAAQ,CAAsC;IACtD,OAAO,CAAC,OAAO,CAA6B;IAE5C,OAAO,CAAC,UAAU,CAA6B;IAG/C,OAAO,CAAC,SAAS,CAAqB;IACtC,wFAAwF;IACxF,QAAQ,CAAC,KAAK,YAAmB;IAGjC,OAAO,CAAC,mBAAmB,CAAsC;IAEjE;;;;OAIG;IACH,qBAAqB,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI,GAAG,IAAI;IAKlE;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB;IAe1B,mFAAmF;IACnF,OAAO,CAAC,eAAe;IAOvB,+FAA+F;IAC/F,OAAO,CAAC,MAAM,CAAC,UAAU;IAMzB,oGAAoG;IACpG,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS;IAgC7C,mFAAmF;IAC7E,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAkClD,sEAAsE;IACtE,iBAAiB,IAAI,aAAa,EAAE;IAkBpC;;;;;;;;;;;;;;;;OAgBG;IACG,QAAQ,CACZ,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,WAAW,CAAC,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,GACjC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAkEzB,8FAA8F;IACxF,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAStF,kGAAkG;IAC5F,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBhE;;;;;OAKG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAUtD,wFAAwF;IAClF,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IASlF;;;;;;;OAOG;IACG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAyCrF,uDAAuD;IACvD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIhC,IAAI,WAAW,IAAI,MAAM,EAAE,CAE1B;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED;;;;;;;OAOG;IACH,iBAAiB,IAAI,MAAM,EAAE;IAM7B,OAAO,CAAC,MAAM,CAAC,WAAW;IAK1B,6FAA6F;IAC7F,SAAS,IAAI,KAAK,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;QACpC,KAAK,EAAE,iBAAiB,EAAE,CAAC;QAC3B,SAAS,EAAE,OAAO,CAAC;QACnB,QAAQ,EAAE,OAAO,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,qGAAqG;QACrG,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,8EAA8E;QAC9E,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,sFAAsF;QACtF,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IA4DF,uFAAuF;IACvF,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAInC,wFAAwF;IACxF,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAIlC;;;;OAIG;IACH,kBAAkB,IAAI,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAQrE,uEAAuE;IACvE,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIjC;;;;OAIG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAO9B;;;;OAIG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAuBlD,yFAAyF;IACzF,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAOjC,kFAAkF;IAClF,OAAO,CAAC,WAAW;IAoBnB,+CAA+C;IAC/C,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM;IAMrE,OAAO,CAAC,MAAM,CAAC,cAAc;IAa7B,OAAO,CAAC,MAAM,CAAC,eAAe;IAK9B,iEAAiE;IACjE,MAAM,CAAC,SAAS,CACd,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,eAAe,EACvB,KAAK,GAAE,SAAS,GAAG,MAAkB,GACpC,IAAI;IAOP;;;;;;OAMG;IACH,MAAM,CAAC,iBAAiB,CACtB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,OAAO,EACjB,KAAK,GAAE,SAAS,GAAG,MAAkB,GACpC,MAAM;IAYT,4FAA4F;IAC5F,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM;IAazF,+FAA+F;IAC/F,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAqB3D,aAAa,IAAI,IAAI;CAUtB"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/mcp/manager.ts"],"names":[],"mappings":"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"}
@@ -41,6 +41,7 @@ const client_1 = require("./client");
41
41
  const httpClient_1 = require("./httpClient");
42
42
  const sseClient_1 = require("./sseClient");
43
43
  const index_1 = require("../plugins/index");
44
+ const resolve_1 = require("../plugins/resolve");
44
45
  const stats_1 = require("./stats");
45
46
  // ─── McpManager ───────────────────────────────────────────────────────────────
46
47
  class McpManager {
@@ -119,7 +120,8 @@ class McpManager {
119
120
  // Plugins first, then user, then project — later assignments override, so
120
121
  // a user/project server definition beats a plugin's same-name one.
121
122
  try {
122
- Object.assign(merged.mcpServers, (0, index_1.pluginMcpServers)(workDir));
123
+ // resolvePluginMcpServers = pluginMcpServers + `${user_config.KEY}` substitution (S24).
124
+ Object.assign(merged.mcpServers, (0, resolve_1.resolvePluginMcpServers)(workDir));
123
125
  }
124
126
  catch {
125
127
  /* plugin scan is best-effort */
@@ -196,23 +198,6 @@ class McpManager {
196
198
  }
197
199
  return tools;
198
200
  }
199
- /**
200
- * Execute an MCP tool call. Returns null if this tool is not an MCP tool.
201
- *
202
- * `abortSignal` is optional and best-effort: the underlying transports (stdio
203
- * JSON-RPC / HTTP / SSE) have no cancellation message in this client, so an
204
- * abort here does NOT stop the server from finishing its work — it only stops
205
- * THIS CALL from making the caller wait for it. Before this was added, Ctrl+C
206
- * during an MCP tool call was silently swallowed: loop.ts set
207
- * `abortSignal.aborted = true` but nothing downstream of `options.mcpManager
208
- * .callTool(name, input)` ever looked at it, so the user's only way out was
209
- * to wait out the full 60s MCP_TOOL_TIMEOUT_MS (or however long the server
210
- * actually took). Racing the same abortSignal the 60s timeout already races
211
- * against makes Ctrl+C return control immediately instead of up to a minute
212
- * later — matching how the `bash` tool already behaves (its own 200ms abort
213
- * poll in executor.ts), just without the ability to also kill a remote
214
- * server's in-flight work the way `bash` can kill a local child process.
215
- */
216
201
  async callTool(prefixedName, input, abortSignal) {
217
202
  const serverName = this._toolMap.get(prefixedName);
218
203
  if (!serverName)
@@ -222,48 +207,70 @@ class McpManager {
222
207
  return null;
223
208
  // Strip the server prefix to get the real tool name
224
209
  const toolName = prefixedName.slice(serverName.length + 2);
225
- // Enforce a timeout — a hung MCP server would otherwise block the agent loop forever.
210
+ // One attempt's full race — a fresh timeout, abort poll and stat pairing per try,
211
+ // because a promise cannot be awaited twice and S25e's retry below builds new ones.
226
212
  const MCP_TOOL_TIMEOUT_MS = 60000;
227
- const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error(`MCP tool "${prefixedName}" timed out after ${MCP_TOOL_TIMEOUT_MS / 1000}s`)), MCP_TOOL_TIMEOUT_MS));
228
- // Timing covers the whole path the user waits on (server round-trip AND the
229
- // race against the 60s timeout / abort), which is what "how long did that take"
230
- // means from the outside. The tool name recorded is the PREFIXED one, so the
231
- // stats of two servers with a same-named tool never merge.
232
- const startedAt = Date.now();
233
- this.stats.begin();
234
- const timed = (p) => p.then((v) => {
235
- this.stats.ok(prefixedName, Date.now() - startedAt);
236
- return v;
237
- }, (e) => {
238
- this.stats.fail(prefixedName, Date.now() - startedAt, e.message || String(e));
239
- throw e;
240
- });
241
- // A 401 mid-CALL is different from one at connect: the server is already up and
242
- // some tools work — record it so /mcp flips to needs-auth (with the missing
243
- // scope) and let the enriched message reach the caller (the model sees WHY).
244
- const trackAuth = (p) => p.catch((err) => {
245
- if (err instanceof httpClient_1.McpOAuthRequiredError)
246
- this._needsAuth.set(serverName, err.wwwAuthenticate);
247
- throw err;
248
- });
249
- const racers = [timed(client.callTool(toolName, input)), timed(timeoutPromise)];
250
- if (abortSignal) {
251
- let pollId;
252
- const abortPromise = new Promise((_, reject) => {
253
- pollId = setInterval(() => {
254
- if (abortSignal.aborted) {
255
- clearInterval(pollId);
256
- reject(Object.assign(new Error('Aborted'), { name: 'AbortError' }));
257
- }
258
- }, 100);
213
+ const once = () => {
214
+ const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error(`MCP tool "${prefixedName}" timed out after ${MCP_TOOL_TIMEOUT_MS / 1000}s`)), MCP_TOOL_TIMEOUT_MS));
215
+ // Timing covers the whole path the user waits on (server round-trip AND the
216
+ // race against the 60s timeout / abort), which is what "how long did that take"
217
+ // means from the outside. The tool name recorded is the PREFIXED one, so the
218
+ // stats of two servers with a same-named tool never merge.
219
+ const startedAt = Date.now();
220
+ this.stats.begin();
221
+ const timed = (p) => p.then((v) => {
222
+ this.stats.ok(prefixedName, Date.now() - startedAt);
223
+ return v;
224
+ }, (e) => {
225
+ this.stats.fail(prefixedName, Date.now() - startedAt, e.message || String(e));
226
+ throw e;
227
+ });
228
+ // A 401 mid-CALL is different from one at connect: the server is already up and
229
+ // some tools work — record it so /mcp flips to needs-auth (with the missing
230
+ // scope) and let the enriched message reach the caller (the model sees WHY).
231
+ const trackAuth = (p) => p.catch((err) => {
232
+ if (err instanceof httpClient_1.McpOAuthRequiredError)
233
+ this._needsAuth.set(serverName, err.wwwAuthenticate);
234
+ throw err;
259
235
  });
260
- racers.push(timed(abortPromise));
261
- // Clearing the poll on whichever branch wins avoids leaving a live interval
262
- // (and the closure it holds) running for the rest of the process lifetime —
263
- // the same leak-prevention pattern client.ts uses for its own abort poll.
264
- return trackAuth(Promise.race(racers).finally(() => clearInterval(pollId)));
236
+ const racers = [timed(client.callTool(toolName, input)), timed(timeoutPromise)];
237
+ if (abortSignal) {
238
+ let pollId;
239
+ const abortPromise = new Promise((_, reject) => {
240
+ pollId = setInterval(() => {
241
+ if (abortSignal.aborted) {
242
+ clearInterval(pollId);
243
+ reject(Object.assign(new Error('Aborted'), { name: 'AbortError' }));
244
+ }
245
+ }, 100);
246
+ });
247
+ racers.push(timed(abortPromise));
248
+ // Clearing the poll on whichever branch wins avoids leaving a live interval
249
+ // (and the closure it holds) running for the rest of the process lifetime —
250
+ // the same leak-prevention pattern client.ts uses for its own abort poll.
251
+ return trackAuth(Promise.race(racers).finally(() => clearInterval(pollId)));
252
+ }
253
+ return trackAuth(Promise.race(racers));
254
+ };
255
+ try {
256
+ return await once();
257
+ }
258
+ catch (err) {
259
+ const hook = this.onAuthRequired;
260
+ if (!hook || !(err instanceof httpClient_1.McpOAuthRequiredError))
261
+ throw err;
262
+ let retry;
263
+ try {
264
+ retry = await hook(serverName, err.missingScope ?? '');
265
+ }
266
+ catch {
267
+ retry = false; // a broken host hook must not mask the OAuth error
268
+ }
269
+ if (!retry)
270
+ throw err;
271
+ // The host re-authorized (fresh tokens are in): one retry, no loop.
272
+ return await once();
265
273
  }
266
- return trackAuth(Promise.race(racers));
267
274
  }
268
275
  /** Resources across connected, enabled servers. One server failing never hides the others. */
269
276
  async listResources(server) {
@@ -32,4 +32,5 @@ export interface TokenMatch {
32
32
  /** Split `src` into simple commands, each a list of unquoted words. */
33
33
  export declare function tokenize(src: string): string[][];
34
34
  export declare function classifyTokens(tokens: string[], recurse: (command: string) => TokenMatch | null, rawSql: (command: string) => TokenMatch | null): TokenMatch | null;
35
+ export declare function unwrappedViews(command: string): string[];
35
36
  //# sourceMappingURL=destructiveTokens.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"destructiveTokens.d.ts","sourceRoot":"","sources":["../../src/permissions/destructiveTokens.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAID,uEAAuE;AACvE,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,CA6DhD;AAsVD,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,UAAU,GAAG,IAAI,EAC/C,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,UAAU,GAAG,IAAI,GAC7C,UAAU,GAAG,IAAI,CA+HnB"}
1
+ {"version":3,"file":"destructiveTokens.d.ts","sourceRoot":"","sources":["../../src/permissions/destructiveTokens.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAID,uEAAuE;AACvE,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,CA6DhD;AAsVD,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,UAAU,GAAG,IAAI,EAC/C,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,UAAU,GAAG,IAAI,GAC7C,UAAU,GAAG,IAAI,CA+HnB;AAyBD,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAKxD"}
@@ -23,6 +23,7 @@
23
23
  Object.defineProperty(exports, "__esModule", { value: true });
24
24
  exports.tokenize = tokenize;
25
25
  exports.classifyTokens = classifyTokens;
26
+ exports.unwrappedViews = unwrappedViews;
26
27
  const hit = (category, reason) => ({ category, reason });
27
28
  /** Split `src` into simple commands, each a list of unquoted words. */
28
29
  function tokenize(src) {
@@ -552,4 +553,96 @@ function classifyTokens(tokens, recurse, rawSql) {
552
553
  }
553
554
  return null;
554
555
  }
556
+ // ─── Every spelling of the command, for the permission-rule matcher ─────────
557
+ //
558
+ // A deny/ask rule must not be skippable by dressing the command up. Claude Code
559
+ // fixed exactly this class (2.1.288/289): "a deny or ask rule … missing a
560
+ // command behind an environment variable prefix with an expanded value (e.g.
561
+ // `TZ="$HOME" rm -rf build`)" and "a bare variable assignment came before the
562
+ // command". The destructive guard has always seen through these (tokenize +
563
+ // classifyTokens above); the RULE matcher had not, so `permissions.deny:
564
+ // ["Bash(rm:*)"]` silently did nothing against `FOO=bar rm -rf build`.
565
+ //
566
+ // unwrappedViews returns every "command actually run" spelling hiding in one
567
+ // command line, using this module's tokenizer and the same wrapper tables as
568
+ // classifyTokens, so anything the guard can see, a rule can see too:
569
+ //
570
+ // 'FOO=bar sudo rm -rf build' → 'sudo rm -rf build', 'rm -rf build'
571
+ // 'cd /tmp && FOO=1 rm -rf x' → 'cd /tmp', 'rm -rf x'
572
+ // 'echo $(rm -rf build)' → 'echo $', 'rm -rf build'
573
+ //
574
+ // Deliberately NOT unwrapped (same as classifyTokens's guard scope):
575
+ // ssh / docker exec / kubectl exec — reaching into those needs the remote or
576
+ // container branch, tracked separately.
577
+ //
578
+ // Order: most literal first (wrappers still attached), then each peeled form.
579
+ function unwrappedViews(command) {
580
+ if (typeof command !== 'string' || command.length === 0)
581
+ return [];
582
+ const out = new Set();
583
+ collectViews(command, out, 0);
584
+ return [...out];
585
+ }
586
+ /** Flags of a peelable wrapper that consume a following value (mirror of classifyTokens). */
587
+ const WRAPPER_VALUE_FLAGS = {
588
+ sudo: new Set(['-u', '-g', '-h', '-p', '-C', '-D', '-R', '-T', '-U']),
589
+ doas: new Set(['-u', '-g', '-h', '-p', '-C', '-D', '-R', '-T', '-U']),
590
+ env: new Set(['-u', '-C', '-S']),
591
+ nice: new Set(['-n']),
592
+ ionice: new Set(['-c', '-n', '-p']),
593
+ command: new Set(),
594
+ builtin: new Set(),
595
+ nohup: new Set(),
596
+ exec: new Set(),
597
+ time: new Set(),
598
+ setsid: new Set(),
599
+ caffeinate: new Set(),
600
+ stdbuf: new Set(),
601
+ unbuffer: new Set(),
602
+ };
603
+ /** `command -v rm` (or `-V`, `-pv`) only PRINTS where rm is — never peel it into `rm`. */
604
+ const LOOKUP_FLAG = /^-p?[vV]+$/;
605
+ function collectViews(src, out, depth) {
606
+ if (depth > 3)
607
+ return;
608
+ for (const tokens of tokenize(src)) {
609
+ let t = tokens;
610
+ for (let guard = 0; guard < 12; guard++) {
611
+ while (t.length && (ENV_ASSIGN.test(t[0]) || CONTROL_WORDS.has(t[0])))
612
+ t = t.slice(1);
613
+ if (t.length === 0)
614
+ break;
615
+ out.add(t.join(' '));
616
+ const bin = base(t[0]);
617
+ const args = t.slice(1);
618
+ // bash -c "…" / eval "…" carry the command as a STRING — read it too.
619
+ if (SHELLS.has(bin)) {
620
+ const i = args.findIndex((a) => /^-[A-Za-z]*c[A-Za-z]*$/.test(a));
621
+ if (i >= 0 && args[i + 1] !== undefined)
622
+ collectViews(args[i + 1], out, depth + 1);
623
+ break;
624
+ }
625
+ if (bin === 'eval') {
626
+ collectViews(args.join(' '), out, depth + 1);
627
+ break;
628
+ }
629
+ if (bin === 'timeout') {
630
+ t = dropOpts(args, new Set(['-s', '-k'])).slice(1); // timeout DURATION cmd
631
+ continue;
632
+ }
633
+ if (bin === 'xargs') {
634
+ t = dropOpts(args, new Set(['-I', '-n', '-P', '-L', '-s', '-d', '-E', '-a', '-J']));
635
+ continue;
636
+ }
637
+ if ((bin === 'command' || bin === 'builtin') && args.some((a) => LOOKUP_FLAG.test(a)))
638
+ break;
639
+ const valueFlags = WRAPPER_VALUE_FLAGS[bin];
640
+ if (valueFlags) {
641
+ t = dropOpts(args, valueFlags);
642
+ continue;
643
+ }
644
+ break;
645
+ }
646
+ }
647
+ }
555
648
  //# sourceMappingURL=destructiveTokens.js.map
@@ -15,6 +15,18 @@ export declare function setSessionRules(r: Partial<PermissionRules>): void;
15
15
  export declare function setSessionSettings(obj: Record<string, unknown> | null): void;
16
16
  export declare function getSessionSettings(): Record<string, unknown> | null;
17
17
  export declare function loadSettings(workDir: string): MergedSettings;
18
+ /**
19
+ * S25b: the raw object of every settings tier, in precedence order (managed →
20
+ * user → project → local → `--settings` session settings). For resolvers where
21
+ * the STRICTEST value must win regardless of tier — `maxEffortLevel` (a cap can
22
+ * only be tightened by a lower-precedence file, never loosened), and anything
23
+ * with the same one-way semantics added later. `loadSettings().raw` cannot serve
24
+ * those: it merges with LAST-wins, which is the opposite direction.
25
+ */
26
+ export declare function settingsTiersRaw(workDir: string): Array<{
27
+ tier: string;
28
+ raw: Record<string, unknown>;
29
+ }>;
18
30
  /** The first ALLOW rule that matches this call, or null. S20's classifier gate
19
31
  * reads this to tell a NARROW pre-approval (wins, no review) from a BROAD one
20
32
  * (suspended while the classifier is on — see isBroadAllowRule). */