@code-yeongyu/senpi 0.74.0 → 2026.5.13

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 (112) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +4 -0
  3. package/dist/core/agent-session-services.d.ts.map +1 -1
  4. package/dist/core/agent-session-services.js +3 -1
  5. package/dist/core/agent-session-services.js.map +1 -1
  6. package/dist/core/extensions/builtin/anthropic-web-search/index.d.ts.map +1 -1
  7. package/dist/core/extensions/builtin/anthropic-web-search/index.js +25 -14
  8. package/dist/core/extensions/builtin/anthropic-web-search/index.js.map +1 -1
  9. package/dist/core/extensions/builtin/gpt-apply-patch/preview-format.d.ts.map +1 -1
  10. package/dist/core/extensions/builtin/gpt-apply-patch/preview-format.js +56 -7
  11. package/dist/core/extensions/builtin/gpt-apply-patch/preview-format.js.map +1 -1
  12. package/dist/core/extensions/builtin/prompt-preset/presets.d.ts +7 -3
  13. package/dist/core/extensions/builtin/prompt-preset/presets.d.ts.map +1 -1
  14. package/dist/core/extensions/builtin/prompt-preset/presets.js +12 -4
  15. package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
  16. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts +1 -0
  17. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts.map +1 -1
  18. package/dist/core/extensions/builtin/prompt-preset/settings.js +1 -1
  19. package/dist/core/extensions/builtin/prompt-preset/settings.js.map +1 -1
  20. package/dist/core/extensions/builtin/todotools/continuation/runtime.d.ts.map +1 -1
  21. package/dist/core/extensions/builtin/todotools/continuation/runtime.js +7 -10
  22. package/dist/core/extensions/builtin/todotools/continuation/runtime.js.map +1 -1
  23. package/dist/core/extensions/builtin/todotools/index.d.ts +2 -2
  24. package/dist/core/extensions/builtin/todotools/index.d.ts.map +1 -1
  25. package/dist/core/extensions/builtin/todotools/index.js +2 -2
  26. package/dist/core/extensions/builtin/todotools/index.js.map +1 -1
  27. package/dist/core/extensions/builtin/todotools/settings.d.ts +6 -0
  28. package/dist/core/extensions/builtin/todotools/settings.d.ts.map +1 -0
  29. package/dist/core/extensions/builtin/todotools/settings.js +58 -0
  30. package/dist/core/extensions/builtin/todotools/settings.js.map +1 -0
  31. package/dist/core/extensions/builtin/todotools/system-messages.d.ts +34 -0
  32. package/dist/core/extensions/builtin/todotools/system-messages.d.ts.map +1 -0
  33. package/dist/core/extensions/builtin/todotools/system-messages.js +82 -0
  34. package/dist/core/extensions/builtin/todotools/system-messages.js.map +1 -0
  35. package/dist/core/extensions/builtin/todotools/tools/todoread.d.ts.map +1 -1
  36. package/dist/core/extensions/builtin/todotools/tools/todoread.js +3 -1
  37. package/dist/core/extensions/builtin/todotools/tools/todoread.js.map +1 -1
  38. package/dist/core/extensions/builtin/todotools/tools/todowrite.d.ts.map +1 -1
  39. package/dist/core/extensions/builtin/todotools/tools/todowrite.js +3 -1
  40. package/dist/core/extensions/builtin/todotools/tools/todowrite.js.map +1 -1
  41. package/dist/core/keybindings.d.ts +5 -0
  42. package/dist/core/keybindings.d.ts.map +1 -1
  43. package/dist/core/keybindings.js +10 -3
  44. package/dist/core/keybindings.js.map +1 -1
  45. package/dist/core/model-registry.d.ts.map +1 -1
  46. package/dist/core/model-registry.js +8 -3
  47. package/dist/core/model-registry.js.map +1 -1
  48. package/dist/core/resource-loader.d.ts +8 -0
  49. package/dist/core/resource-loader.d.ts.map +1 -1
  50. package/dist/core/resource-loader.js +168 -17
  51. package/dist/core/resource-loader.js.map +1 -1
  52. package/dist/core/tools/bash.d.ts.map +1 -1
  53. package/dist/core/tools/bash.js +11 -4
  54. package/dist/core/tools/bash.js.map +1 -1
  55. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  56. package/dist/modes/interactive/components/bash-execution.js +11 -3
  57. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  58. package/dist/modes/interactive/components/favorite-models-selector.d.ts +10 -4
  59. package/dist/modes/interactive/components/favorite-models-selector.d.ts.map +1 -1
  60. package/dist/modes/interactive/components/favorite-models-selector.js +56 -78
  61. package/dist/modes/interactive/components/favorite-models-selector.js.map +1 -1
  62. package/dist/modes/interactive/components/model-favorites.d.ts +10 -0
  63. package/dist/modes/interactive/components/model-favorites.d.ts.map +1 -0
  64. package/dist/modes/interactive/components/model-favorites.js +53 -0
  65. package/dist/modes/interactive/components/model-favorites.js.map +1 -0
  66. package/dist/modes/interactive/components/model-selector.d.ts +9 -1
  67. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  68. package/dist/modes/interactive/components/model-selector.js +52 -10
  69. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  70. package/dist/modes/interactive/interactive-mode.d.ts +4 -0
  71. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  72. package/dist/modes/interactive/interactive-mode.js +83 -94
  73. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  74. package/docs/models.md +26 -1
  75. package/docs/settings.md +14 -0
  76. package/package.json +5 -8
  77. package/dist/core/extensions/builtin/agent-system/agent-types.d.ts +0 -25
  78. package/dist/core/extensions/builtin/agent-system/agent-types.d.ts.map +0 -1
  79. package/dist/core/extensions/builtin/agent-system/agent-types.js +0 -38
  80. package/dist/core/extensions/builtin/agent-system/agent-types.js.map +0 -1
  81. package/dist/core/extensions/builtin/agent-system/builtin-agents.d.ts +0 -3
  82. package/dist/core/extensions/builtin/agent-system/builtin-agents.d.ts.map +0 -1
  83. package/dist/core/extensions/builtin/agent-system/builtin-agents.js +0 -32
  84. package/dist/core/extensions/builtin/agent-system/builtin-agents.js.map +0 -1
  85. package/dist/core/extensions/builtin/agent-system/index.d.ts +0 -3
  86. package/dist/core/extensions/builtin/agent-system/index.d.ts.map +0 -1
  87. package/dist/core/extensions/builtin/agent-system/index.js +0 -42
  88. package/dist/core/extensions/builtin/agent-system/index.js.map +0 -1
  89. package/dist/core/extensions/builtin/agent-system/loader.d.ts +0 -4
  90. package/dist/core/extensions/builtin/agent-system/loader.d.ts.map +0 -1
  91. package/dist/core/extensions/builtin/agent-system/loader.js +0 -59
  92. package/dist/core/extensions/builtin/agent-system/loader.js.map +0 -1
  93. package/dist/core/extensions/builtin/agent-system/permission.d.ts +0 -11
  94. package/dist/core/extensions/builtin/agent-system/permission.d.ts.map +0 -1
  95. package/dist/core/extensions/builtin/agent-system/permission.js +0 -24
  96. package/dist/core/extensions/builtin/agent-system/permission.js.map +0 -1
  97. package/dist/core/extensions/builtin/agent-system/registry.d.ts +0 -10
  98. package/dist/core/extensions/builtin/agent-system/registry.d.ts.map +0 -1
  99. package/dist/core/extensions/builtin/agent-system/registry.js +0 -50
  100. package/dist/core/extensions/builtin/agent-system/registry.js.map +0 -1
  101. package/dist/core/extensions/builtin/agent-system/types.d.ts +0 -9
  102. package/dist/core/extensions/builtin/agent-system/types.d.ts.map +0 -1
  103. package/dist/core/extensions/builtin/agent-system/types.js +0 -2
  104. package/dist/core/extensions/builtin/agent-system/types.js.map +0 -1
  105. package/dist/core/extensions/builtin/agent-system/wildcard.d.ts +0 -4
  106. package/dist/core/extensions/builtin/agent-system/wildcard.d.ts.map +0 -1
  107. package/dist/core/extensions/builtin/agent-system/wildcard.js +0 -58
  108. package/dist/core/extensions/builtin/agent-system/wildcard.js.map +0 -1
  109. package/dist/core/extensions/builtin/anthropic-web-fetch/index.d.ts +0 -7
  110. package/dist/core/extensions/builtin/anthropic-web-fetch/index.d.ts.map +0 -1
  111. package/dist/core/extensions/builtin/anthropic-web-fetch/index.js +0 -112
  112. package/dist/core/extensions/builtin/anthropic-web-fetch/index.js.map +0 -1
package/docs/models.md CHANGED
@@ -190,6 +190,7 @@ If your command is slow, expensive, rate-limited, or should keep using a previou
190
190
  |-------|----------|---------|-------------|
191
191
  | `id` | Yes | — | Model identifier (passed to the API) |
192
192
  | `name` | No | `id` | Human-readable model label. Used for matching (`--model` patterns) and shown in model details/status text. |
193
+ | `promptPreset` | No | auto-detected | System prompt preset for this model. Use this when a provider-specific model ID should force a known preset, such as `"kimi-k2-6"`. |
193
194
  | `api` | No | provider's `api` | Override provider's API for this model |
194
195
  | `reasoning` | No | `false` | Supports extended thinking |
195
196
  | `thinkingLevelMap` | No | omitted | Maps pi thinking levels to provider values and marks unsupported levels (see below) |
@@ -203,6 +204,30 @@ Current behavior:
203
204
  - `/model` and `--list-models` list entries by model `id`.
204
205
  - The configured `name` is used for model matching and detail/status text.
205
206
 
207
+ ### Prompt Preset
208
+
209
+ Use `promptPreset` on a model when auto-detection cannot infer the right system prompt preset from the provider's model ID.
210
+
211
+ ```json
212
+ {
213
+ "providers": {
214
+ "moonshot": {
215
+ "baseUrl": "https://api.moonshot.ai/v1",
216
+ "api": "openai-responses",
217
+ "apiKey": "MOONSHOT_API_KEY",
218
+ "models": [
219
+ {
220
+ "id": "kimi-k2p6-turbo",
221
+ "promptPreset": "kimi-k2-6"
222
+ }
223
+ ]
224
+ }
225
+ }
226
+ }
227
+ ```
228
+
229
+ If `settings.json` sets `promptPreset` to anything other than `"auto"`, that settings override wins. Model-level `promptPreset` is used when settings remain on `"auto"`.
230
+
206
231
  ### Thinking Level Map
207
232
 
208
233
  Use `thinkingLevelMap` on a model to describe model-specific thinking controls. Keys are pi thinking levels: `off`, `minimal`, `low`, `medium`, `high`, `xhigh`.
@@ -305,7 +330,7 @@ Use `modelOverrides` to customize specific built-in models without replacing the
305
330
  }
306
331
  ```
307
332
 
308
- `modelOverrides` supports these fields per model: `name`, `reasoning`, `input`, `cost` (partial), `contextWindow`, `maxTokens`, `headers`, `compat`.
333
+ `modelOverrides` supports these fields per model: `name`, `promptPreset`, `reasoning`, `input`, `cost` (partial), `contextWindow`, `maxTokens`, `headers`, `compat`.
309
334
 
310
335
  Behavior notes:
311
336
  - `modelOverrides` are applied to built-in provider models.
package/docs/settings.md CHANGED
@@ -18,9 +18,23 @@ Edit directly or use `/settings` for common options.
18
18
  | `defaultProvider` | string | - | Default provider (e.g., `"anthropic"`, `"openai"`) |
19
19
  | `defaultModel` | string | - | Default model ID |
20
20
  | `defaultThinkingLevel` | string | - | `"off"`, `"minimal"`, `"low"`, `"medium"`, `"high"`, `"xhigh"` |
21
+ | `promptPreset` | string | `"auto"` | Force a system prompt preset: `"auto"`, `"kimi-k2-6"`, `"claude-opus-4-5"`, `"claude-opus-4-6"`, `"claude-opus-4-7"`, `"gpt-5"`, `"gpt-5.2"`, `"gpt-5.3-codex"`, `"gpt-5.4"`, or `"gpt-5.5"` |
21
22
  | `hideThinkingBlock` | boolean | `false` | Hide thinking blocks in output |
22
23
  | `thinkingBudgets` | object | - | Custom token budgets per thinking level |
23
24
 
25
+ #### promptPreset
26
+
27
+ Use `promptPreset` when a provider's model ID does not auto-detect to the preset you want, or when you want to force one preset for a project.
28
+
29
+ ```json
30
+ {
31
+ "promptPreset": "kimi-k2-6"
32
+ }
33
+ ```
34
+
35
+ Project settings in `.senpi/settings.json` override global settings in `~/.senpi/agent/settings.json`.
36
+ When this value is anything other than `"auto"`, it overrides any model-level `promptPreset` configured in `models.json`.
37
+
24
38
  #### thinkingBudgets
25
39
 
26
40
  ```json
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/senpi",
3
- "version": "0.74.0",
3
+ "version": "2026.05.13",
4
4
  "description": "Coding agent CLI with read, bash, edit, write tools and session management",
5
5
  "type": "module",
6
6
  "piConfig": {
@@ -36,13 +36,13 @@
36
36
  "copy-assets": "shx mkdir -p dist/modes/interactive/theme && shx cp src/modes/interactive/theme/*.json dist/modes/interactive/theme/ && shx mkdir -p dist/modes/interactive/assets && shx cp src/modes/interactive/assets/*.png dist/modes/interactive/assets/ && shx mkdir -p dist/core/export-html/vendor && shx cp src/core/export-html/template.html src/core/export-html/template.css src/core/export-html/template.js dist/core/export-html/ && shx cp src/core/export-html/vendor/*.js dist/core/export-html/vendor/",
37
37
  "copy-binary-assets": "shx cp package.json dist/ && shx cp README.md dist/ && shx cp CHANGELOG.md dist/ && shx mkdir -p dist/theme && shx cp src/modes/interactive/theme/*.json dist/theme/ && shx mkdir -p dist/assets && shx cp src/modes/interactive/assets/*.png dist/assets/ && shx mkdir -p dist/export-html/vendor && shx cp src/core/export-html/template.html dist/export-html/ && shx cp src/core/export-html/vendor/*.js dist/export-html/vendor/ && shx cp -r docs dist/ && shx cp -r examples dist/ && shx cp ../../node_modules/@silvia-odwyer/photon-node/photon_rs_bg.wasm dist/",
38
38
  "test": "vitest --run",
39
- "prepublishOnly": "npm run sync:builtin-extensions && shx rm -rf dist && tsgo -p tsconfig.build.json && shx chmod +x dist/cli.js && shx cp dist/cli.js dist/senpi && shx chmod +x dist/senpi"
39
+ "prepublishOnly": "shx rm -rf dist && tsgo -p tsconfig.build.json && shx chmod +x dist/cli.js && shx cp dist/cli.js dist/senpi && shx chmod +x dist/senpi"
40
40
  },
41
41
  "dependencies": {
42
42
  "@anthropic-ai/sdk": "^0.91.1",
43
- "@earendil-works/pi-agent-core": "^0.74.0",
44
- "@earendil-works/pi-ai": "^0.74.0",
45
- "@earendil-works/pi-tui": "^0.74.0",
43
+ "@earendil-works/pi-agent-core": "^2026.05.13",
44
+ "@earendil-works/pi-ai": "^2026.05.13",
45
+ "@earendil-works/pi-tui": "^2026.05.13",
46
46
  "@silvia-odwyer/photon-node": "^0.3.4",
47
47
  "chalk": "^5.5.0",
48
48
  "cli-highlight": "^2.1.11",
@@ -96,9 +96,6 @@
96
96
  "url": "git+https://github.com/code-yeongyu/senpi.git",
97
97
  "directory": "packages/coding-agent"
98
98
  },
99
- "publishConfig": {
100
- "access": "public"
101
- },
102
99
  "engines": {
103
100
  "node": ">=20.6.0"
104
101
  }
@@ -1,25 +0,0 @@
1
- import { type Static, Type } from "typebox";
2
- import type { Ruleset } from "./types.js";
3
- export declare const AgentModeSchema: Type.TUnion<[Type.TLiteral<"subagent">, Type.TLiteral<"primary">, Type.TLiteral<"all">]>;
4
- export type AgentMode = Static<typeof AgentModeSchema>;
5
- export declare const AgentFrontmatterSchema: Type.TObject<{
6
- description: Type.TOptional<Type.TString>;
7
- mode: Type.TOptional<Type.TUnion<[Type.TLiteral<"subagent">, Type.TLiteral<"primary">, Type.TLiteral<"all">]>>;
8
- model: Type.TOptional<Type.TString>;
9
- temperature: Type.TOptional<Type.TNumber>;
10
- tools: Type.TOptional<Type.TRecord<"^.*$", Type.TUnion<[Type.TUnion<[Type.TLiteral<"allow">, Type.TLiteral<"deny">, Type.TLiteral<"ask">]>, Type.TRecord<"^.*$", Type.TUnion<[Type.TLiteral<"allow">, Type.TLiteral<"deny">, Type.TLiteral<"ask">]>>]>>>;
11
- disable: Type.TOptional<Type.TBoolean>;
12
- }>;
13
- export type AgentFrontmatter = Static<typeof AgentFrontmatterSchema>;
14
- export type AgentInfo = {
15
- name: string;
16
- description?: string;
17
- mode: AgentMode;
18
- model?: string;
19
- temperature?: number;
20
- prompt?: string;
21
- permission: Ruleset;
22
- native: boolean;
23
- };
24
- export declare function validateAgentConfig(name: string, frontmatter: AgentFrontmatter, body: string): AgentInfo | Error;
25
- //# sourceMappingURL=agent-types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"agent-types.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/agent-system/agent-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAG5C,OAAO,KAAK,EAAoB,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5D,eAAO,MAAM,eAAe,0FAAuF,CAAC;AACpH,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,eAAe,CAAC,CAAC;AAMvD,eAAO,MAAM,sBAAsB;;;;;;;EAOjC,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAIrE,MAAM,MAAM,SAAS,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,CAuBhH","sourcesContent":["import { type Static, Type } from \"typebox\";\nimport { Compile } from \"typebox/compile\";\nimport { fromConfig } from \"./permission.js\";\nimport type { PermissionConfig, Ruleset } from \"./types.js\";\n\nexport const AgentModeSchema = Type.Union([Type.Literal(\"subagent\"), Type.Literal(\"primary\"), Type.Literal(\"all\")]);\nexport type AgentMode = Static<typeof AgentModeSchema>;\n\nconst ToolActionSchema = Type.Union([Type.Literal(\"allow\"), Type.Literal(\"deny\"), Type.Literal(\"ask\")]);\n\nconst ToolPermissionValueSchema = Type.Union([ToolActionSchema, Type.Record(Type.String(), ToolActionSchema)]);\n\nexport const AgentFrontmatterSchema = Type.Object({\n\tdescription: Type.Optional(Type.String()),\n\tmode: Type.Optional(AgentModeSchema),\n\tmodel: Type.Optional(Type.String()),\n\ttemperature: Type.Optional(Type.Number({ minimum: 0, maximum: 2 })),\n\ttools: Type.Optional(Type.Record(Type.String(), ToolPermissionValueSchema)),\n\tdisable: Type.Optional(Type.Boolean()),\n});\nexport type AgentFrontmatter = Static<typeof AgentFrontmatterSchema>;\n\nconst CompiledAgentFrontmatterSchema = Compile(AgentFrontmatterSchema);\n\nexport type AgentInfo = {\n\tname: string;\n\tdescription?: string;\n\tmode: AgentMode;\n\tmodel?: string;\n\ttemperature?: number;\n\tprompt?: string;\n\tpermission: Ruleset;\n\tnative: boolean;\n};\n\nexport function validateAgentConfig(name: string, frontmatter: AgentFrontmatter, body: string): AgentInfo | Error {\n\tconst isValid = CompiledAgentFrontmatterSchema.Check(frontmatter);\n\tif (!isValid) {\n\t\tconst errors = CompiledAgentFrontmatterSchema.Errors(frontmatter);\n\t\tconst errorMessages = [];\n\t\tfor (const error of errors) {\n\t\t\terrorMessages.push(`${error.instancePath}: ${error.message}`);\n\t\t}\n\t\treturn new Error(`Invalid agent config: ${errorMessages.join(\", \")}`);\n\t}\n\n\tconst agentInfo: AgentInfo = {\n\t\tname,\n\t\tdescription: frontmatter.description,\n\t\tmode: frontmatter.mode ?? \"all\",\n\t\tmodel: frontmatter.model,\n\t\ttemperature: frontmatter.temperature,\n\t\tprompt: body,\n\t\tpermission: fromConfig((frontmatter.tools ?? {}) as PermissionConfig),\n\t\tnative: false,\n\t};\n\n\treturn agentInfo;\n}\n"]}
@@ -1,38 +0,0 @@
1
- import { Type } from "typebox";
2
- import { Compile } from "typebox/compile";
3
- import { fromConfig } from "./permission.js";
4
- export const AgentModeSchema = Type.Union([Type.Literal("subagent"), Type.Literal("primary"), Type.Literal("all")]);
5
- const ToolActionSchema = Type.Union([Type.Literal("allow"), Type.Literal("deny"), Type.Literal("ask")]);
6
- const ToolPermissionValueSchema = Type.Union([ToolActionSchema, Type.Record(Type.String(), ToolActionSchema)]);
7
- export const AgentFrontmatterSchema = Type.Object({
8
- description: Type.Optional(Type.String()),
9
- mode: Type.Optional(AgentModeSchema),
10
- model: Type.Optional(Type.String()),
11
- temperature: Type.Optional(Type.Number({ minimum: 0, maximum: 2 })),
12
- tools: Type.Optional(Type.Record(Type.String(), ToolPermissionValueSchema)),
13
- disable: Type.Optional(Type.Boolean()),
14
- });
15
- const CompiledAgentFrontmatterSchema = Compile(AgentFrontmatterSchema);
16
- export function validateAgentConfig(name, frontmatter, body) {
17
- const isValid = CompiledAgentFrontmatterSchema.Check(frontmatter);
18
- if (!isValid) {
19
- const errors = CompiledAgentFrontmatterSchema.Errors(frontmatter);
20
- const errorMessages = [];
21
- for (const error of errors) {
22
- errorMessages.push(`${error.instancePath}: ${error.message}`);
23
- }
24
- return new Error(`Invalid agent config: ${errorMessages.join(", ")}`);
25
- }
26
- const agentInfo = {
27
- name,
28
- description: frontmatter.description,
29
- mode: frontmatter.mode ?? "all",
30
- model: frontmatter.model,
31
- temperature: frontmatter.temperature,
32
- prompt: body,
33
- permission: fromConfig((frontmatter.tools ?? {})),
34
- native: false,
35
- };
36
- return agentInfo;
37
- }
38
- //# sourceMappingURL=agent-types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"agent-types.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/agent-system/agent-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,IAAI,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAGpH,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAExG,MAAM,yBAAyB,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;AAE/G,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC,MAAM,CAAC;IACjD,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IACzC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC;IACpC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IACnC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IACnE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,yBAAyB,CAAC,CAAC;IAC3E,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;CACtC,CAAC,CAAC;AAGH,MAAM,8BAA8B,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;AAavE,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,WAA6B,EAAE,IAAY,EAAqB;IACjH,MAAM,OAAO,GAAG,8BAA8B,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAClE,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,8BAA8B,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAClE,MAAM,aAAa,GAAG,EAAE,CAAC;QACzB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC5B,aAAa,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,YAAY,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,IAAI,KAAK,CAAC,yBAAyB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,SAAS,GAAc;QAC5B,IAAI;QACJ,WAAW,EAAE,WAAW,CAAC,WAAW;QACpC,IAAI,EAAE,WAAW,CAAC,IAAI,IAAI,KAAK;QAC/B,KAAK,EAAE,WAAW,CAAC,KAAK;QACxB,WAAW,EAAE,WAAW,CAAC,WAAW;QACpC,MAAM,EAAE,IAAI;QACZ,UAAU,EAAE,UAAU,CAAC,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE,CAAqB,CAAC;QACrE,MAAM,EAAE,KAAK;KACb,CAAC;IAEF,OAAO,SAAS,CAAC;AAAA,CACjB","sourcesContent":["import { type Static, Type } from \"typebox\";\nimport { Compile } from \"typebox/compile\";\nimport { fromConfig } from \"./permission.js\";\nimport type { PermissionConfig, Ruleset } from \"./types.js\";\n\nexport const AgentModeSchema = Type.Union([Type.Literal(\"subagent\"), Type.Literal(\"primary\"), Type.Literal(\"all\")]);\nexport type AgentMode = Static<typeof AgentModeSchema>;\n\nconst ToolActionSchema = Type.Union([Type.Literal(\"allow\"), Type.Literal(\"deny\"), Type.Literal(\"ask\")]);\n\nconst ToolPermissionValueSchema = Type.Union([ToolActionSchema, Type.Record(Type.String(), ToolActionSchema)]);\n\nexport const AgentFrontmatterSchema = Type.Object({\n\tdescription: Type.Optional(Type.String()),\n\tmode: Type.Optional(AgentModeSchema),\n\tmodel: Type.Optional(Type.String()),\n\ttemperature: Type.Optional(Type.Number({ minimum: 0, maximum: 2 })),\n\ttools: Type.Optional(Type.Record(Type.String(), ToolPermissionValueSchema)),\n\tdisable: Type.Optional(Type.Boolean()),\n});\nexport type AgentFrontmatter = Static<typeof AgentFrontmatterSchema>;\n\nconst CompiledAgentFrontmatterSchema = Compile(AgentFrontmatterSchema);\n\nexport type AgentInfo = {\n\tname: string;\n\tdescription?: string;\n\tmode: AgentMode;\n\tmodel?: string;\n\ttemperature?: number;\n\tprompt?: string;\n\tpermission: Ruleset;\n\tnative: boolean;\n};\n\nexport function validateAgentConfig(name: string, frontmatter: AgentFrontmatter, body: string): AgentInfo | Error {\n\tconst isValid = CompiledAgentFrontmatterSchema.Check(frontmatter);\n\tif (!isValid) {\n\t\tconst errors = CompiledAgentFrontmatterSchema.Errors(frontmatter);\n\t\tconst errorMessages = [];\n\t\tfor (const error of errors) {\n\t\t\terrorMessages.push(`${error.instancePath}: ${error.message}`);\n\t\t}\n\t\treturn new Error(`Invalid agent config: ${errorMessages.join(\", \")}`);\n\t}\n\n\tconst agentInfo: AgentInfo = {\n\t\tname,\n\t\tdescription: frontmatter.description,\n\t\tmode: frontmatter.mode ?? \"all\",\n\t\tmodel: frontmatter.model,\n\t\ttemperature: frontmatter.temperature,\n\t\tprompt: body,\n\t\tpermission: fromConfig((frontmatter.tools ?? {}) as PermissionConfig),\n\t\tnative: false,\n\t};\n\n\treturn agentInfo;\n}\n"]}
@@ -1,3 +0,0 @@
1
- import type { AgentInfo } from "./agent-types.js";
2
- export declare const BUILTIN_AGENTS: Record<string, AgentInfo>;
3
- //# sourceMappingURL=builtin-agents.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"builtin-agents.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/agent-system/builtin-agents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAa,MAAM,kBAAkB,CAAC;AAG7D,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAiCpD,CAAC","sourcesContent":["import type { AgentInfo, AgentMode } from \"./agent-types.js\";\nimport { fromConfig, merge } from \"./permission.js\";\n\nexport const BUILTIN_AGENTS: Record<string, AgentInfo> = {\n\tgeneral: {\n\t\tname: \"general\",\n\t\tdescription:\n\t\t\t\"General-purpose agent for complex multi-step tasks. Use to execute multiple units of work in parallel.\",\n\t\tmode: \"subagent\" as AgentMode,\n\t\tnative: true,\n\t\tpermission: fromConfig({ \"*\": \"allow\", task: \"deny\", todowrite: \"deny\" }),\n\t},\n\texplore: {\n\t\tname: \"explore\",\n\t\tdescription: \"Fast codebase exploration agent. Read-only. Finds files, searches code, reads contents.\",\n\t\tmode: \"subagent\" as AgentMode,\n\t\tnative: true,\n\t\tpermission: merge(\n\t\t\tfromConfig({ \"*\": \"deny\" }),\n\t\t\tfromConfig({\n\t\t\t\tread: \"allow\",\n\t\t\t\tgrep: \"allow\",\n\t\t\t\tfind: \"allow\",\n\t\t\t\tls: \"allow\",\n\t\t\t\tbash: \"allow\",\n\t\t\t}),\n\t\t),\n\t\tprompt: `You are a file search specialist. You excel at thoroughly navigating and exploring codebases.\nGuidelines:\n- Search file contents by regex or literal pattern when you need to locate usages or definitions\n- Read files directly when you already know the path\n- List directory contents to build a map of unfamiliar areas\n- Return file paths as absolute paths\n- Do not create any files or modify the system state\nComplete the search request efficiently and report findings clearly.`,\n\t},\n};\n"]}
@@ -1,32 +0,0 @@
1
- import { fromConfig, merge } from "./permission.js";
2
- export const BUILTIN_AGENTS = {
3
- general: {
4
- name: "general",
5
- description: "General-purpose agent for complex multi-step tasks. Use to execute multiple units of work in parallel.",
6
- mode: "subagent",
7
- native: true,
8
- permission: fromConfig({ "*": "allow", task: "deny", todowrite: "deny" }),
9
- },
10
- explore: {
11
- name: "explore",
12
- description: "Fast codebase exploration agent. Read-only. Finds files, searches code, reads contents.",
13
- mode: "subagent",
14
- native: true,
15
- permission: merge(fromConfig({ "*": "deny" }), fromConfig({
16
- read: "allow",
17
- grep: "allow",
18
- find: "allow",
19
- ls: "allow",
20
- bash: "allow",
21
- })),
22
- prompt: `You are a file search specialist. You excel at thoroughly navigating and exploring codebases.
23
- Guidelines:
24
- - Search file contents by regex or literal pattern when you need to locate usages or definitions
25
- - Read files directly when you already know the path
26
- - List directory contents to build a map of unfamiliar areas
27
- - Return file paths as absolute paths
28
- - Do not create any files or modify the system state
29
- Complete the search request efficiently and report findings clearly.`,
30
- },
31
- };
32
- //# sourceMappingURL=builtin-agents.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"builtin-agents.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/agent-system/builtin-agents.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAEpD,MAAM,CAAC,MAAM,cAAc,GAA8B;IACxD,OAAO,EAAE;QACR,IAAI,EAAE,SAAS;QACf,WAAW,EACV,wGAAwG;QACzG,IAAI,EAAE,UAAuB;QAC7B,MAAM,EAAE,IAAI;QACZ,UAAU,EAAE,UAAU,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;KACzE;IACD,OAAO,EAAE;QACR,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,yFAAyF;QACtG,IAAI,EAAE,UAAuB;QAC7B,MAAM,EAAE,IAAI;QACZ,UAAU,EAAE,KAAK,CAChB,UAAU,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAC3B,UAAU,CAAC;YACV,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,OAAO;YACb,EAAE,EAAE,OAAO;YACX,IAAI,EAAE,OAAO;SACb,CAAC,CACF;QACD,MAAM,EAAE;;;;;;;qEAO2D;KACnE;CACD,CAAC","sourcesContent":["import type { AgentInfo, AgentMode } from \"./agent-types.js\";\nimport { fromConfig, merge } from \"./permission.js\";\n\nexport const BUILTIN_AGENTS: Record<string, AgentInfo> = {\n\tgeneral: {\n\t\tname: \"general\",\n\t\tdescription:\n\t\t\t\"General-purpose agent for complex multi-step tasks. Use to execute multiple units of work in parallel.\",\n\t\tmode: \"subagent\" as AgentMode,\n\t\tnative: true,\n\t\tpermission: fromConfig({ \"*\": \"allow\", task: \"deny\", todowrite: \"deny\" }),\n\t},\n\texplore: {\n\t\tname: \"explore\",\n\t\tdescription: \"Fast codebase exploration agent. Read-only. Finds files, searches code, reads contents.\",\n\t\tmode: \"subagent\" as AgentMode,\n\t\tnative: true,\n\t\tpermission: merge(\n\t\t\tfromConfig({ \"*\": \"deny\" }),\n\t\t\tfromConfig({\n\t\t\t\tread: \"allow\",\n\t\t\t\tgrep: \"allow\",\n\t\t\t\tfind: \"allow\",\n\t\t\t\tls: \"allow\",\n\t\t\t\tbash: \"allow\",\n\t\t\t}),\n\t\t),\n\t\tprompt: `You are a file search specialist. You excel at thoroughly navigating and exploring codebases.\nGuidelines:\n- Search file contents by regex or literal pattern when you need to locate usages or definitions\n- Read files directly when you already know the path\n- List directory contents to build a map of unfamiliar areas\n- Return file paths as absolute paths\n- Do not create any files or modify the system state\nComplete the search request efficiently and report findings clearly.`,\n\t},\n};\n"]}
@@ -1,3 +0,0 @@
1
- import type { ExtensionAPI } from "../../types.js";
2
- export default function agentSystemExtension(pi: ExtensionAPI): void;
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/agent-system/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAMnD,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAsCnE","sourcesContent":["import { SettingsManager } from \"../../../settings-manager.js\";\nimport type { ExtensionAPI } from \"../../types.js\";\nimport { AGENT_TYPE_ENV_VAR } from \"../background-task/types.js\";\nimport type { AgentInfo } from \"./agent-types.js\";\nimport { evaluate, fromConfig, merge } from \"./permission.js\";\nimport { createRegistry } from \"./registry.js\";\n\nexport default function agentSystemExtension(pi: ExtensionAPI): void {\n\tconst agentType = process.env[AGENT_TYPE_ENV_VAR];\n\tif (!agentType) return; // No agent type = legacy mode, no filtering\n\tlet agentInfo: AgentInfo | undefined;\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tconst registry = await createRegistry(ctx.cwd);\n\t\tconst resolved = registry.get(agentType);\n\t\tif (!resolved) {\n\t\t\t// Unknown agent type — log warning, continue without restrictions\n\t\t\tprocess.stderr.write(\n\t\t\t\t`[agent-system] Unknown agent type: \"${agentType}\". Available: ${registry.getAvailableAgentDescriptions()}\\n`,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tconst settingsManager = SettingsManager.create(ctx.cwd);\n\t\tconst globalSettings = settingsManager.getGlobalSettings();\n\t\tconst projectSettings = settingsManager.getProjectSettings();\n\t\tconst mergedAgentDefaults = { ...globalSettings.agentDefaults, ...projectSettings.agentDefaults };\n\t\tconst globalDefaults = fromConfig(mergedAgentDefaults.permission ?? {});\n\t\tconst mergedInfo: AgentInfo = {\n\t\t\t...resolved,\n\t\t\tpermission: merge(globalDefaults, resolved.permission),\n\t\t};\n\t\tagentInfo = mergedInfo;\n\t\tconst allTools = pi.getAllTools();\n\t\tconst allowedTools = allTools\n\t\t\t.filter((tool) => evaluate(tool.name, \"*\", mergedInfo.permission).action !== \"deny\")\n\t\t\t.map((tool) => tool.name);\n\t\tpi.setActiveTools(allowedTools);\n\n\t\tpi.on(\"before_agent_start\", async (event, _ctx) => {\n\t\t\tif (!agentInfo?.prompt) return undefined;\n\t\t\treturn {\n\t\t\t\tsystemPrompt: `${event.systemPrompt}\\n\\n${agentInfo.prompt}`,\n\t\t\t};\n\t\t});\n\t});\n}\n"]}
@@ -1,42 +0,0 @@
1
- import { SettingsManager } from "../../../settings-manager.js";
2
- import { AGENT_TYPE_ENV_VAR } from "../background-task/types.js";
3
- import { evaluate, fromConfig, merge } from "./permission.js";
4
- import { createRegistry } from "./registry.js";
5
- export default function agentSystemExtension(pi) {
6
- const agentType = process.env[AGENT_TYPE_ENV_VAR];
7
- if (!agentType)
8
- return; // No agent type = legacy mode, no filtering
9
- let agentInfo;
10
- pi.on("session_start", async (_event, ctx) => {
11
- const registry = await createRegistry(ctx.cwd);
12
- const resolved = registry.get(agentType);
13
- if (!resolved) {
14
- // Unknown agent type — log warning, continue without restrictions
15
- process.stderr.write(`[agent-system] Unknown agent type: "${agentType}". Available: ${registry.getAvailableAgentDescriptions()}\n`);
16
- return;
17
- }
18
- const settingsManager = SettingsManager.create(ctx.cwd);
19
- const globalSettings = settingsManager.getGlobalSettings();
20
- const projectSettings = settingsManager.getProjectSettings();
21
- const mergedAgentDefaults = { ...globalSettings.agentDefaults, ...projectSettings.agentDefaults };
22
- const globalDefaults = fromConfig(mergedAgentDefaults.permission ?? {});
23
- const mergedInfo = {
24
- ...resolved,
25
- permission: merge(globalDefaults, resolved.permission),
26
- };
27
- agentInfo = mergedInfo;
28
- const allTools = pi.getAllTools();
29
- const allowedTools = allTools
30
- .filter((tool) => evaluate(tool.name, "*", mergedInfo.permission).action !== "deny")
31
- .map((tool) => tool.name);
32
- pi.setActiveTools(allowedTools);
33
- pi.on("before_agent_start", async (event, _ctx) => {
34
- if (!agentInfo?.prompt)
35
- return undefined;
36
- return {
37
- systemPrompt: `${event.systemPrompt}\n\n${agentInfo.prompt}`,
38
- };
39
- });
40
- });
41
- }
42
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/agent-system/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,EAAgB,EAAQ;IACpE,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAClD,IAAI,CAAC,SAAS;QAAE,OAAO,CAAC,4CAA4C;IACpE,IAAI,SAAgC,CAAC;IAErC,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;QAC7C,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACf,oEAAkE;YAClE,OAAO,CAAC,MAAM,CAAC,KAAK,CACnB,uCAAuC,SAAS,iBAAiB,QAAQ,CAAC,6BAA6B,EAAE,IAAI,CAC7G,CAAC;YACF,OAAO;QACR,CAAC;QACD,MAAM,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxD,MAAM,cAAc,GAAG,eAAe,CAAC,iBAAiB,EAAE,CAAC;QAC3D,MAAM,eAAe,GAAG,eAAe,CAAC,kBAAkB,EAAE,CAAC;QAC7D,MAAM,mBAAmB,GAAG,EAAE,GAAG,cAAc,CAAC,aAAa,EAAE,GAAG,eAAe,CAAC,aAAa,EAAE,CAAC;QAClG,MAAM,cAAc,GAAG,UAAU,CAAC,mBAAmB,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;QACxE,MAAM,UAAU,GAAc;YAC7B,GAAG,QAAQ;YACX,UAAU,EAAE,KAAK,CAAC,cAAc,EAAE,QAAQ,CAAC,UAAU,CAAC;SACtD,CAAC;QACF,SAAS,GAAG,UAAU,CAAC;QACvB,MAAM,QAAQ,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;QAClC,MAAM,YAAY,GAAG,QAAQ;aAC3B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC;aACnF,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,EAAE,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QAEhC,EAAE,CAAC,EAAE,CAAC,oBAAoB,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;YAClD,IAAI,CAAC,SAAS,EAAE,MAAM;gBAAE,OAAO,SAAS,CAAC;YACzC,OAAO;gBACN,YAAY,EAAE,GAAG,KAAK,CAAC,YAAY,OAAO,SAAS,CAAC,MAAM,EAAE;aAC5D,CAAC;QAAA,CACF,CAAC,CAAC;IAAA,CACH,CAAC,CAAC;AAAA,CACH","sourcesContent":["import { SettingsManager } from \"../../../settings-manager.js\";\nimport type { ExtensionAPI } from \"../../types.js\";\nimport { AGENT_TYPE_ENV_VAR } from \"../background-task/types.js\";\nimport type { AgentInfo } from \"./agent-types.js\";\nimport { evaluate, fromConfig, merge } from \"./permission.js\";\nimport { createRegistry } from \"./registry.js\";\n\nexport default function agentSystemExtension(pi: ExtensionAPI): void {\n\tconst agentType = process.env[AGENT_TYPE_ENV_VAR];\n\tif (!agentType) return; // No agent type = legacy mode, no filtering\n\tlet agentInfo: AgentInfo | undefined;\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tconst registry = await createRegistry(ctx.cwd);\n\t\tconst resolved = registry.get(agentType);\n\t\tif (!resolved) {\n\t\t\t// Unknown agent type — log warning, continue without restrictions\n\t\t\tprocess.stderr.write(\n\t\t\t\t`[agent-system] Unknown agent type: \"${agentType}\". Available: ${registry.getAvailableAgentDescriptions()}\\n`,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tconst settingsManager = SettingsManager.create(ctx.cwd);\n\t\tconst globalSettings = settingsManager.getGlobalSettings();\n\t\tconst projectSettings = settingsManager.getProjectSettings();\n\t\tconst mergedAgentDefaults = { ...globalSettings.agentDefaults, ...projectSettings.agentDefaults };\n\t\tconst globalDefaults = fromConfig(mergedAgentDefaults.permission ?? {});\n\t\tconst mergedInfo: AgentInfo = {\n\t\t\t...resolved,\n\t\t\tpermission: merge(globalDefaults, resolved.permission),\n\t\t};\n\t\tagentInfo = mergedInfo;\n\t\tconst allTools = pi.getAllTools();\n\t\tconst allowedTools = allTools\n\t\t\t.filter((tool) => evaluate(tool.name, \"*\", mergedInfo.permission).action !== \"deny\")\n\t\t\t.map((tool) => tool.name);\n\t\tpi.setActiveTools(allowedTools);\n\n\t\tpi.on(\"before_agent_start\", async (event, _ctx) => {\n\t\t\tif (!agentInfo?.prompt) return undefined;\n\t\t\treturn {\n\t\t\t\tsystemPrompt: `${event.systemPrompt}\\n\\n${agentInfo.prompt}`,\n\t\t\t};\n\t\t});\n\t});\n}\n"]}
@@ -1,4 +0,0 @@
1
- import { type AgentInfo } from "./agent-types.js";
2
- export declare function loadAgentsFromDirectory(dir: string): Promise<Record<string, AgentInfo>>;
3
- export declare function loadAllAgents(cwd: string, homeDir?: string): Promise<Record<string, AgentInfo>>;
4
- //# sourceMappingURL=loader.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/agent-system/loader.ts"],"names":[],"mappings":"AAKA,OAAO,EAAyB,KAAK,SAAS,EAAuB,MAAM,kBAAkB,CAAC;AA2B9F,wBAAsB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAsB7F;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,MAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAInH","sourcesContent":["import * as fs from \"node:fs/promises\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { CONFIG_DIR_NAME } from \"../../../../config.js\";\nimport { parseFrontmatter } from \"../../../../utils/frontmatter.js\";\nimport { type AgentFrontmatter, type AgentInfo, validateAgentConfig } from \"./agent-types.js\";\n\nasync function scanDir(dir: string, files: string[]): Promise<void> {\n\tconst entries = await fs.readdir(dir, { withFileTypes: true });\n\tfor (const entry of entries) {\n\t\tconst fullPath = path.join(dir, entry.name);\n\t\tif (entry.isDirectory()) {\n\t\t\tawait scanDir(fullPath, files);\n\t\t} else if (entry.name.endsWith(\".md\")) {\n\t\t\tfiles.push(fullPath);\n\t\t}\n\t}\n}\n\nasync function scanMarkdownFiles(baseDir: string): Promise<string[]> {\n\tconst files: string[] = [];\n\tfor (const subdir of [\"agent\", \"agents\"]) {\n\t\tconst dir = path.join(baseDir, subdir);\n\t\ttry {\n\t\t\tawait scanDir(dir, files);\n\t\t} catch {\n\t\t\t// directory doesn't exist, skip\n\t\t}\n\t}\n\treturn files;\n}\n\nexport async function loadAgentsFromDirectory(dir: string): Promise<Record<string, AgentInfo>> {\n\tconst agents: Record<string, AgentInfo> = {};\n\tconst files = await scanMarkdownFiles(dir);\n\n\tfor (const file of files) {\n\t\tconst name = path.basename(file, \".md\");\n\t\ttry {\n\t\t\tconst content = await fs.readFile(file, \"utf-8\");\n\t\t\tconst { frontmatter, body } = parseFrontmatter<AgentFrontmatter>(content);\n\t\t\tconst result = validateAgentConfig(name, frontmatter, body);\n\t\t\tif (result instanceof Error) {\n\t\t\t\tprocess.stderr.write(`Warning: skipping agent \"${name}\" from ${file}: ${result.message}\\n`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tagents[name] = result;\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : \"unknown error\";\n\t\t\tprocess.stderr.write(`Warning: failed to load agent \"${name}\" from ${file}: ${message}\\n`);\n\t\t}\n\t}\n\n\treturn agents;\n}\n\nexport async function loadAllAgents(cwd: string, homeDir: string = os.homedir()): Promise<Record<string, AgentInfo>> {\n\tconst globalAgents = await loadAgentsFromDirectory(path.join(homeDir, CONFIG_DIR_NAME));\n\tconst localAgents = await loadAgentsFromDirectory(path.join(cwd, CONFIG_DIR_NAME));\n\treturn { ...globalAgents, ...localAgents };\n}\n"]}
@@ -1,59 +0,0 @@
1
- import * as fs from "node:fs/promises";
2
- import * as os from "node:os";
3
- import * as path from "node:path";
4
- import { CONFIG_DIR_NAME } from "../../../../config.js";
5
- import { parseFrontmatter } from "../../../../utils/frontmatter.js";
6
- import { validateAgentConfig } from "./agent-types.js";
7
- async function scanDir(dir, files) {
8
- const entries = await fs.readdir(dir, { withFileTypes: true });
9
- for (const entry of entries) {
10
- const fullPath = path.join(dir, entry.name);
11
- if (entry.isDirectory()) {
12
- await scanDir(fullPath, files);
13
- }
14
- else if (entry.name.endsWith(".md")) {
15
- files.push(fullPath);
16
- }
17
- }
18
- }
19
- async function scanMarkdownFiles(baseDir) {
20
- const files = [];
21
- for (const subdir of ["agent", "agents"]) {
22
- const dir = path.join(baseDir, subdir);
23
- try {
24
- await scanDir(dir, files);
25
- }
26
- catch {
27
- // directory doesn't exist, skip
28
- }
29
- }
30
- return files;
31
- }
32
- export async function loadAgentsFromDirectory(dir) {
33
- const agents = {};
34
- const files = await scanMarkdownFiles(dir);
35
- for (const file of files) {
36
- const name = path.basename(file, ".md");
37
- try {
38
- const content = await fs.readFile(file, "utf-8");
39
- const { frontmatter, body } = parseFrontmatter(content);
40
- const result = validateAgentConfig(name, frontmatter, body);
41
- if (result instanceof Error) {
42
- process.stderr.write(`Warning: skipping agent "${name}" from ${file}: ${result.message}\n`);
43
- continue;
44
- }
45
- agents[name] = result;
46
- }
47
- catch (error) {
48
- const message = error instanceof Error ? error.message : "unknown error";
49
- process.stderr.write(`Warning: failed to load agent "${name}" from ${file}: ${message}\n`);
50
- }
51
- }
52
- return agents;
53
- }
54
- export async function loadAllAgents(cwd, homeDir = os.homedir()) {
55
- const globalAgents = await loadAgentsFromDirectory(path.join(homeDir, CONFIG_DIR_NAME));
56
- const localAgents = await loadAgentsFromDirectory(path.join(cwd, CONFIG_DIR_NAME));
57
- return { ...globalAgents, ...localAgents };
58
- }
59
- //# sourceMappingURL=loader.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/agent-system/loader.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from \"node:fs/promises\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { CONFIG_DIR_NAME } from \"../../../../config.js\";\nimport { parseFrontmatter } from \"../../../../utils/frontmatter.js\";\nimport { type AgentFrontmatter, type AgentInfo, validateAgentConfig } from \"./agent-types.js\";\n\nasync function scanDir(dir: string, files: string[]): Promise<void> {\n\tconst entries = await fs.readdir(dir, { withFileTypes: true });\n\tfor (const entry of entries) {\n\t\tconst fullPath = path.join(dir, entry.name);\n\t\tif (entry.isDirectory()) {\n\t\t\tawait scanDir(fullPath, files);\n\t\t} else if (entry.name.endsWith(\".md\")) {\n\t\t\tfiles.push(fullPath);\n\t\t}\n\t}\n}\n\nasync function scanMarkdownFiles(baseDir: string): Promise<string[]> {\n\tconst files: string[] = [];\n\tfor (const subdir of [\"agent\", \"agents\"]) {\n\t\tconst dir = path.join(baseDir, subdir);\n\t\ttry {\n\t\t\tawait scanDir(dir, files);\n\t\t} catch {\n\t\t\t// directory doesn't exist, skip\n\t\t}\n\t}\n\treturn files;\n}\n\nexport async function loadAgentsFromDirectory(dir: string): Promise<Record<string, AgentInfo>> {\n\tconst agents: Record<string, AgentInfo> = {};\n\tconst files = await scanMarkdownFiles(dir);\n\n\tfor (const file of files) {\n\t\tconst name = path.basename(file, \".md\");\n\t\ttry {\n\t\t\tconst content = await fs.readFile(file, \"utf-8\");\n\t\t\tconst { frontmatter, body } = parseFrontmatter<AgentFrontmatter>(content);\n\t\t\tconst result = validateAgentConfig(name, frontmatter, body);\n\t\t\tif (result instanceof Error) {\n\t\t\t\tprocess.stderr.write(`Warning: skipping agent \"${name}\" from ${file}: ${result.message}\\n`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tagents[name] = result;\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : \"unknown error\";\n\t\t\tprocess.stderr.write(`Warning: failed to load agent \"${name}\" from ${file}: ${message}\\n`);\n\t\t}\n\t}\n\n\treturn agents;\n}\n\nexport async function loadAllAgents(cwd: string, homeDir: string = os.homedir()): Promise<Record<string, AgentInfo>> {\n\tconst globalAgents = await loadAgentsFromDirectory(path.join(homeDir, CONFIG_DIR_NAME));\n\tconst localAgents = await loadAgentsFromDirectory(path.join(cwd, CONFIG_DIR_NAME));\n\treturn { ...globalAgents, ...localAgents };\n}\n"]}
@@ -1,11 +0,0 @@
1
- import type { PermissionConfig, Rule, Ruleset } from "./types.js";
2
- declare global {
3
- interface Array<T> {
4
- findLast<S extends T>(predicate: (value: T, index: number, array: T[]) => value is S, thisArg?: unknown): S | undefined;
5
- findLast(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: unknown): T | undefined;
6
- }
7
- }
8
- export declare function evaluate(permission: string, pattern: string, ...rulesets: Ruleset[]): Rule;
9
- export declare function fromConfig(config: PermissionConfig): Ruleset;
10
- export declare function merge(...rulesets: Ruleset[]): Ruleset;
11
- //# sourceMappingURL=permission.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"permission.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/agent-system/permission.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAGlE,OAAO,CAAC,MAAM,CAAC,CAAC;IACf,UAAU,KAAK,CAAC,CAAC;QAChB,QAAQ,CAAC,CAAC,SAAS,CAAC,EACnB,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC,EAC9D,OAAO,CAAC,EAAE,OAAO,GACf,CAAC,GAAG,SAAS,CAAC;QACjB,QAAQ,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,CAAC,GAAG,SAAS,CAAC;KACxG;CACD;AAED,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI,CAU1F;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAU5D;AAED,wBAAgB,KAAK,CAAC,GAAG,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAErD","sourcesContent":["import type { PermissionConfig, Rule, Ruleset } from \"./types.js\";\nimport { Wildcard } from \"./wildcard.js\";\n\ndeclare global {\n\tinterface Array<T> {\n\t\tfindLast<S extends T>(\n\t\t\tpredicate: (value: T, index: number, array: T[]) => value is S,\n\t\t\tthisArg?: unknown,\n\t\t): S | undefined;\n\t\tfindLast(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: unknown): T | undefined;\n\t}\n}\n\nexport function evaluate(permission: string, pattern: string, ...rulesets: Ruleset[]): Rule {\n\tconst matchedRule = rulesets.flat().findLast((rule) => {\n\t\treturn Wildcard.match(permission, rule.permission) && Wildcard.match(pattern, rule.pattern);\n\t});\n\n\tif (matchedRule) {\n\t\treturn matchedRule;\n\t}\n\n\treturn { action: \"ask\", permission, pattern: \"*\" };\n}\n\nexport function fromConfig(config: PermissionConfig): Ruleset {\n\treturn Object.entries(config).flatMap(([permission, value]) => {\n\t\tif (typeof value === \"string\") {\n\t\t\treturn [{ permission, pattern: \"*\", action: value }];\n\t\t}\n\n\t\treturn Object.entries(value).map(([pattern, action]) => {\n\t\t\treturn { permission, pattern, action };\n\t\t});\n\t});\n}\n\nexport function merge(...rulesets: Ruleset[]): Ruleset {\n\treturn rulesets.flat();\n}\n"]}
@@ -1,24 +0,0 @@
1
- import { Wildcard } from "./wildcard.js";
2
- export function evaluate(permission, pattern, ...rulesets) {
3
- const matchedRule = rulesets.flat().findLast((rule) => {
4
- return Wildcard.match(permission, rule.permission) && Wildcard.match(pattern, rule.pattern);
5
- });
6
- if (matchedRule) {
7
- return matchedRule;
8
- }
9
- return { action: "ask", permission, pattern: "*" };
10
- }
11
- export function fromConfig(config) {
12
- return Object.entries(config).flatMap(([permission, value]) => {
13
- if (typeof value === "string") {
14
- return [{ permission, pattern: "*", action: value }];
15
- }
16
- return Object.entries(value).map(([pattern, action]) => {
17
- return { permission, pattern, action };
18
- });
19
- });
20
- }
21
- export function merge(...rulesets) {
22
- return rulesets.flat();
23
- }
24
- //# sourceMappingURL=permission.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"permission.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/agent-system/permission.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAYzC,MAAM,UAAU,QAAQ,CAAC,UAAkB,EAAE,OAAe,EAAE,GAAG,QAAmB,EAAQ;IAC3F,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACtD,OAAO,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAAA,CAC5F,CAAC,CAAC;IAEH,IAAI,WAAW,EAAE,CAAC;QACjB,OAAO,WAAW,CAAC;IACpB,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;AAAA,CACnD;AAED,MAAM,UAAU,UAAU,CAAC,MAAwB,EAAW;IAC7D,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;QAC9D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACtD,CAAC;QAED,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;YACvD,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAA,CACvC,CAAC,CAAC;IAAA,CACH,CAAC,CAAC;AAAA,CACH;AAED,MAAM,UAAU,KAAK,CAAC,GAAG,QAAmB,EAAW;IACtD,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AAAA,CACvB","sourcesContent":["import type { PermissionConfig, Rule, Ruleset } from \"./types.js\";\nimport { Wildcard } from \"./wildcard.js\";\n\ndeclare global {\n\tinterface Array<T> {\n\t\tfindLast<S extends T>(\n\t\t\tpredicate: (value: T, index: number, array: T[]) => value is S,\n\t\t\tthisArg?: unknown,\n\t\t): S | undefined;\n\t\tfindLast(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: unknown): T | undefined;\n\t}\n}\n\nexport function evaluate(permission: string, pattern: string, ...rulesets: Ruleset[]): Rule {\n\tconst matchedRule = rulesets.flat().findLast((rule) => {\n\t\treturn Wildcard.match(permission, rule.permission) && Wildcard.match(pattern, rule.pattern);\n\t});\n\n\tif (matchedRule) {\n\t\treturn matchedRule;\n\t}\n\n\treturn { action: \"ask\", permission, pattern: \"*\" };\n}\n\nexport function fromConfig(config: PermissionConfig): Ruleset {\n\treturn Object.entries(config).flatMap(([permission, value]) => {\n\t\tif (typeof value === \"string\") {\n\t\t\treturn [{ permission, pattern: \"*\", action: value }];\n\t\t}\n\n\t\treturn Object.entries(value).map(([pattern, action]) => {\n\t\t\treturn { permission, pattern, action };\n\t\t});\n\t});\n}\n\nexport function merge(...rulesets: Ruleset[]): Ruleset {\n\treturn rulesets.flat();\n}\n"]}
@@ -1,10 +0,0 @@
1
- import type { AgentInfo } from "./agent-types.js";
2
- export declare class AgentRegistry {
3
- private agents;
4
- constructor(agents: Map<string, AgentInfo>);
5
- get(name: string): AgentInfo | undefined;
6
- list(): AgentInfo[];
7
- getAvailableAgentDescriptions(): string;
8
- }
9
- export declare function createRegistry(cwd: string): Promise<AgentRegistry>;
10
- //# sourceMappingURL=registry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/agent-system/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAa,MAAM,kBAAkB,CAAC;AAK7D,qBAAa,aAAa;IACzB,OAAO,CAAC,MAAM,CAAyB;IAEvC,YAAY,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EAEzC;IAED,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAEvC;IAED,IAAI,IAAI,SAAS,EAAE,CAElB;IAED,6BAA6B,IAAI,MAAM,CAMtC;CACD;AAID,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA0BxE","sourcesContent":["import type { AgentInfo, AgentMode } from \"./agent-types.js\";\nimport { BUILTIN_AGENTS } from \"./builtin-agents.js\";\nimport { loadAllAgents } from \"./loader.js\";\nimport { fromConfig, merge } from \"./permission.js\";\n\nexport class AgentRegistry {\n\tprivate agents: Map<string, AgentInfo>;\n\n\tconstructor(agents: Map<string, AgentInfo>) {\n\t\tthis.agents = agents;\n\t}\n\n\tget(name: string): AgentInfo | undefined {\n\t\treturn this.agents.get(name);\n\t}\n\n\tlist(): AgentInfo[] {\n\t\treturn Array.from(this.agents.values()).sort((a, b) => a.name.localeCompare(b.name));\n\t}\n\n\tgetAvailableAgentDescriptions(): string {\n\t\tconst lines = [\"Available agent types:\"];\n\t\tfor (const agent of this.list()) {\n\t\t\tlines.push(`- ${agent.name}: ${agent.description ?? \"No description\"}`);\n\t\t}\n\t\treturn lines.join(\"\\n\");\n\t}\n}\n\n// v1 limitation: AgentFrontmatter.disable is stripped by validateAgentConfig before reaching here.\n// Disabling built-in agents via custom config requires adding `disable` to AgentInfo.\nexport async function createRegistry(cwd: string): Promise<AgentRegistry> {\n\tconst agents = new Map<string, AgentInfo>();\n\tfor (const [key, agent] of Object.entries(BUILTIN_AGENTS)) {\n\t\tagents.set(key, structuredClone(agent));\n\t}\n\n\tconst customAgents = await loadAllAgents(cwd);\n\tfor (const [key, custom] of Object.entries(customAgents)) {\n\t\tconst existing = agents.get(key) ?? {\n\t\t\tname: key,\n\t\t\tmode: \"all\" as AgentMode,\n\t\t\tpermission: merge(fromConfig({})),\n\t\t\tnative: false,\n\t\t};\n\t\tagents.set(key, {\n\t\t\t...existing,\n\t\t\t...(custom.model !== undefined && { model: custom.model }),\n\t\t\t...(custom.prompt !== undefined && { prompt: custom.prompt }),\n\t\t\t...(custom.description !== undefined && { description: custom.description }),\n\t\t\t...(custom.temperature !== undefined && { temperature: custom.temperature }),\n\t\t\t...(custom.mode !== undefined && { mode: custom.mode }),\n\t\t\tpermission: merge(existing.permission, custom.permission),\n\t\t});\n\t}\n\n\treturn new AgentRegistry(agents);\n}\n"]}
@@ -1,50 +0,0 @@
1
- import { BUILTIN_AGENTS } from "./builtin-agents.js";
2
- import { loadAllAgents } from "./loader.js";
3
- import { fromConfig, merge } from "./permission.js";
4
- export class AgentRegistry {
5
- agents;
6
- constructor(agents) {
7
- this.agents = agents;
8
- }
9
- get(name) {
10
- return this.agents.get(name);
11
- }
12
- list() {
13
- return Array.from(this.agents.values()).sort((a, b) => a.name.localeCompare(b.name));
14
- }
15
- getAvailableAgentDescriptions() {
16
- const lines = ["Available agent types:"];
17
- for (const agent of this.list()) {
18
- lines.push(`- ${agent.name}: ${agent.description ?? "No description"}`);
19
- }
20
- return lines.join("\n");
21
- }
22
- }
23
- // v1 limitation: AgentFrontmatter.disable is stripped by validateAgentConfig before reaching here.
24
- // Disabling built-in agents via custom config requires adding `disable` to AgentInfo.
25
- export async function createRegistry(cwd) {
26
- const agents = new Map();
27
- for (const [key, agent] of Object.entries(BUILTIN_AGENTS)) {
28
- agents.set(key, structuredClone(agent));
29
- }
30
- const customAgents = await loadAllAgents(cwd);
31
- for (const [key, custom] of Object.entries(customAgents)) {
32
- const existing = agents.get(key) ?? {
33
- name: key,
34
- mode: "all",
35
- permission: merge(fromConfig({})),
36
- native: false,
37
- };
38
- agents.set(key, {
39
- ...existing,
40
- ...(custom.model !== undefined && { model: custom.model }),
41
- ...(custom.prompt !== undefined && { prompt: custom.prompt }),
42
- ...(custom.description !== undefined && { description: custom.description }),
43
- ...(custom.temperature !== undefined && { temperature: custom.temperature }),
44
- ...(custom.mode !== undefined && { mode: custom.mode }),
45
- permission: merge(existing.permission, custom.permission),
46
- });
47
- }
48
- return new AgentRegistry(agents);
49
- }
50
- //# sourceMappingURL=registry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/agent-system/registry.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentInfo, AgentMode } from \"./agent-types.js\";\nimport { BUILTIN_AGENTS } from \"./builtin-agents.js\";\nimport { loadAllAgents } from \"./loader.js\";\nimport { fromConfig, merge } from \"./permission.js\";\n\nexport class AgentRegistry {\n\tprivate agents: Map<string, AgentInfo>;\n\n\tconstructor(agents: Map<string, AgentInfo>) {\n\t\tthis.agents = agents;\n\t}\n\n\tget(name: string): AgentInfo | undefined {\n\t\treturn this.agents.get(name);\n\t}\n\n\tlist(): AgentInfo[] {\n\t\treturn Array.from(this.agents.values()).sort((a, b) => a.name.localeCompare(b.name));\n\t}\n\n\tgetAvailableAgentDescriptions(): string {\n\t\tconst lines = [\"Available agent types:\"];\n\t\tfor (const agent of this.list()) {\n\t\t\tlines.push(`- ${agent.name}: ${agent.description ?? \"No description\"}`);\n\t\t}\n\t\treturn lines.join(\"\\n\");\n\t}\n}\n\n// v1 limitation: AgentFrontmatter.disable is stripped by validateAgentConfig before reaching here.\n// Disabling built-in agents via custom config requires adding `disable` to AgentInfo.\nexport async function createRegistry(cwd: string): Promise<AgentRegistry> {\n\tconst agents = new Map<string, AgentInfo>();\n\tfor (const [key, agent] of Object.entries(BUILTIN_AGENTS)) {\n\t\tagents.set(key, structuredClone(agent));\n\t}\n\n\tconst customAgents = await loadAllAgents(cwd);\n\tfor (const [key, custom] of Object.entries(customAgents)) {\n\t\tconst existing = agents.get(key) ?? {\n\t\t\tname: key,\n\t\t\tmode: \"all\" as AgentMode,\n\t\t\tpermission: merge(fromConfig({})),\n\t\t\tnative: false,\n\t\t};\n\t\tagents.set(key, {\n\t\t\t...existing,\n\t\t\t...(custom.model !== undefined && { model: custom.model }),\n\t\t\t...(custom.prompt !== undefined && { prompt: custom.prompt }),\n\t\t\t...(custom.description !== undefined && { description: custom.description }),\n\t\t\t...(custom.temperature !== undefined && { temperature: custom.temperature }),\n\t\t\t...(custom.mode !== undefined && { mode: custom.mode }),\n\t\t\tpermission: merge(existing.permission, custom.permission),\n\t\t});\n\t}\n\n\treturn new AgentRegistry(agents);\n}\n"]}
@@ -1,9 +0,0 @@
1
- export type Action = "allow" | "deny" | "ask";
2
- export type Rule = {
3
- permission: string;
4
- pattern: string;
5
- action: Action;
6
- };
7
- export type Ruleset = Rule[];
8
- export type PermissionConfig = Record<string, Action | Record<string, Action>>;
9
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/agent-system/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;AAE9C,MAAM,MAAM,IAAI,GAAG;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG,IAAI,EAAE,CAAC;AAE7B,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC","sourcesContent":["export type Action = \"allow\" | \"deny\" | \"ask\";\n\nexport type Rule = {\n\tpermission: string;\n\tpattern: string;\n\taction: Action;\n};\n\nexport type Ruleset = Rule[];\n\nexport type PermissionConfig = Record<string, Action | Record<string, Action>>;\n"]}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/agent-system/types.ts"],"names":[],"mappings":"","sourcesContent":["export type Action = \"allow\" | \"deny\" | \"ask\";\n\nexport type Rule = {\n\tpermission: string;\n\tpattern: string;\n\taction: Action;\n};\n\nexport type Ruleset = Rule[];\n\nexport type PermissionConfig = Record<string, Action | Record<string, Action>>;\n"]}
@@ -1,4 +0,0 @@
1
- export declare namespace Wildcard {
2
- function match(value: string, pattern: string): boolean;
3
- }
4
- //# sourceMappingURL=wildcard.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"wildcard.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/agent-system/wildcard.ts"],"names":[],"mappings":"AAAA,yBAAiB,QAAQ,CAAC,CAAC;IAC1B,SAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAoD7D;CACD","sourcesContent":["export namespace Wildcard {\n\texport function match(value: string, pattern: string): boolean {\n\t\tif (value === \"\" && pattern === \"\") {\n\t\t\treturn true;\n\t\t}\n\t\tif (pattern === \"\") {\n\t\t\treturn false;\n\t\t}\n\t\tif (value === \"\" && pattern === \"*\") {\n\t\t\treturn true;\n\t\t}\n\t\tif (value === \"\") {\n\t\t\tfor (let i = 0; i < pattern.length; i++) {\n\t\t\t\tif (pattern[i] !== \"*\") {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tlet valueIdx = 0;\n\t\tlet patternIdx = 0;\n\t\tlet starIdx = -1;\n\t\tlet matchIdx = 0;\n\n\t\twhile (valueIdx < value.length) {\n\t\t\tconst patternChar = pattern[patternIdx];\n\t\t\tconst valueChar = value[valueIdx];\n\n\t\t\tif (patternChar === \"?\") {\n\t\t\t\tvalueIdx++;\n\t\t\t\tpatternIdx++;\n\t\t\t} else if (patternChar === \"*\") {\n\t\t\t\tstarIdx = patternIdx;\n\t\t\t\tmatchIdx = valueIdx;\n\t\t\t\tpatternIdx++;\n\t\t\t} else if (patternChar === valueChar) {\n\t\t\t\tvalueIdx++;\n\t\t\t\tpatternIdx++;\n\t\t\t} else if (starIdx >= 0) {\n\t\t\t\tpatternIdx = starIdx + 1;\n\t\t\t\tmatchIdx++;\n\t\t\t\tvalueIdx = matchIdx;\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\twhile (patternIdx < pattern.length && pattern[patternIdx] === \"*\") {\n\t\t\tpatternIdx++;\n\t\t}\n\n\t\treturn patternIdx === pattern.length;\n\t}\n}\n"]}