@armadra/agent 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +84 -0
- package/README.md +93 -44
- package/dist/agent/retry.d.ts +1 -1
- package/dist/agent/retry.js +2 -1
- package/dist/agent/session-cache.js +1 -1
- package/dist/agent/session-classifier.d.ts +18 -0
- package/dist/agent/session-classifier.js +103 -0
- package/dist/agent/session-core.d.ts +13 -0
- package/dist/agent/session-tools.js +24 -3
- package/dist/agent/session.d.ts +3 -0
- package/dist/agent/session.js +12 -3
- package/dist/agent/tool-runner.js +15 -2
- package/dist/agent/types.d.ts +9 -1
- package/dist/ai/apis/anthropic-messages.js +3 -2
- package/dist/ai/apis/google-generative-ai.js +3 -2
- package/dist/ai/apis/openai-completions.js +3 -2
- package/dist/ai/apis/openai-responses.js +3 -2
- package/dist/ai/http.d.ts +28 -6
- package/dist/ai/http.js +41 -8
- package/dist/ai/providers/registry.d.ts +8 -1
- package/dist/ai/providers/registry.js +30 -22
- package/dist/ai/providers/suggest.d.ts +18 -0
- package/dist/ai/providers/suggest.js +72 -0
- package/dist/ai/sse.d.ts +6 -2
- package/dist/ai/sse.js +22 -2
- package/dist/ai/types.d.ts +9 -2
- package/dist/bundle/ama.cjs +15279 -10151
- package/dist/cli/args.d.ts +19 -4
- package/dist/cli/args.js +83 -10
- package/dist/cli/bootstrap.js +27 -3
- package/dist/cli/codemode-notice.d.ts +20 -0
- package/dist/cli/codemode-notice.js +55 -0
- package/dist/cli/compose-session.d.ts +5 -0
- package/dist/cli/compose-session.js +32 -1
- package/dist/cli/compose-store.d.ts +1 -1
- package/dist/cli/compose-store.js +3 -1
- package/dist/cli/compose.d.ts +14 -4
- package/dist/cli/compose.js +29 -10
- package/dist/cli/default-model.d.ts +38 -1
- package/dist/cli/default-model.js +96 -9
- package/dist/cli/deps.d.ts +36 -0
- package/dist/cli/exit-codes.d.ts +2 -0
- package/dist/cli/exit-codes.js +3 -0
- package/dist/cli/fake-visibility.d.ts +13 -0
- package/dist/cli/fake-visibility.js +26 -0
- package/dist/cli/from-prompt.d.ts +18 -0
- package/dist/cli/from-prompt.js +49 -0
- package/dist/cli/main.d.ts +9 -2
- package/dist/cli/main.js +77 -3
- package/dist/cli/proxy.d.ts +51 -0
- package/dist/cli/proxy.js +135 -0
- package/dist/cli/startup-screen.d.ts +29 -0
- package/dist/cli/startup-screen.js +47 -0
- package/dist/cli/startup-steps.d.ts +1 -1
- package/dist/cli/startup-steps.js +14 -12
- package/dist/cli/subcommands/config.d.ts +19 -3
- package/dist/cli/subcommands/config.js +108 -21
- package/dist/cli/subcommands/context.js +4 -1
- package/dist/cli/subcommands/doctor.js +12 -1
- package/dist/cli/subcommands/init.js +2 -1
- package/dist/cli/subcommands/models-discover.d.ts +15 -9
- package/dist/cli/subcommands/models-discover.js +53 -46
- package/dist/cli/subcommands/probe-runner.d.ts +96 -0
- package/dist/cli/subcommands/probe-runner.js +264 -0
- package/dist/cli/subcommands/providers-probe.d.ts +34 -0
- package/dist/cli/subcommands/providers-probe.js +87 -0
- package/dist/cli/subcommands/providers.d.ts +3 -2
- package/dist/cli/subcommands/providers.js +48 -45
- package/dist/cli/subcommands/sessions-export.d.ts +10 -0
- package/dist/cli/subcommands/sessions-export.js +59 -0
- package/dist/cli/subcommands/sessions-search.d.ts +13 -0
- package/dist/cli/subcommands/sessions-search.js +103 -0
- package/dist/cli/subcommands/sessions.d.ts +3 -2
- package/dist/cli/subcommands/sessions.js +22 -1
- package/dist/cli/subcommands/stats.d.ts +17 -0
- package/dist/cli/subcommands/stats.js +198 -0
- package/dist/cli/system-prompt-arg.d.ts +11 -0
- package/dist/cli/system-prompt-arg.js +34 -0
- package/dist/codemode/modes.d.ts +4 -11
- package/dist/codemode/modes.js +5 -27
- package/dist/codemode/tool.d.ts +18 -14
- package/dist/codemode/tool.js +71 -28
- package/dist/config/init.d.ts +6 -2
- package/dist/config/init.js +12 -5
- package/dist/config/json-schema.d.ts +1 -0
- package/dist/config/json-schema.js +36 -3
- package/dist/config/key-docs.d.ts +22 -0
- package/dist/config/key-docs.js +105 -0
- package/dist/config/merge.d.ts +9 -8
- package/dist/config/merge.js +22 -7
- package/dist/config/schema.d.ts +1 -1
- package/dist/config/schema.js +24 -5
- package/dist/config/types.d.ts +34 -6
- package/dist/config/types.js +17 -1
- package/dist/modes/commands-core.js +6 -5
- package/dist/modes/interactive/approval-dialog.d.ts +21 -5
- package/dist/modes/interactive/approval-dialog.js +106 -27
- package/dist/modes/interactive/commands.d.ts +11 -2
- package/dist/modes/interactive/commands.js +56 -16
- package/dist/modes/interactive/interactive-mode.d.ts +2 -1
- package/dist/modes/interactive/interactive-mode.js +65 -81
- package/dist/modes/interactive/key-dispatch.d.ts +3 -1
- package/dist/modes/interactive/key-dispatch.js +5 -6
- package/dist/modes/interactive/line/line-mode.d.ts +1 -0
- package/dist/modes/interactive/line/line-mode.js +6 -4
- package/dist/modes/interactive/line/line-render.d.ts +4 -0
- package/dist/modes/interactive/line/line-render.js +28 -6
- package/dist/modes/interactive/message-view.d.ts +48 -9
- package/dist/modes/interactive/message-view.js +238 -44
- package/dist/modes/interactive/panels.d.ts +18 -0
- package/dist/modes/interactive/panels.js +143 -0
- package/dist/modes/interactive/pickers.d.ts +23 -2
- package/dist/modes/interactive/pickers.js +48 -15
- package/dist/modes/interactive/run-indicator.d.ts +51 -0
- package/dist/modes/interactive/run-indicator.js +189 -0
- package/dist/modes/interactive/startup-header.d.ts +40 -0
- package/dist/modes/interactive/startup-header.js +169 -0
- package/dist/modes/interactive/status-bar.d.ts +18 -15
- package/dist/modes/interactive/status-bar.js +98 -56
- package/dist/modes/interactive/tool-summary.d.ts +46 -0
- package/dist/modes/interactive/tool-summary.js +218 -0
- package/dist/modes/interactive/tool-view.d.ts +48 -15
- package/dist/modes/interactive/tool-view.js +203 -145
- package/dist/modes/print/print-mode.d.ts +31 -4
- package/dist/modes/print/print-mode.js +116 -7
- package/dist/modes/rpc/commands.js +5 -0
- package/dist/permissions/auto-safe.d.ts +60 -0
- package/dist/permissions/auto-safe.js +529 -0
- package/dist/permissions/classifier.d.ts +64 -0
- package/dist/permissions/classifier.js +184 -0
- package/dist/permissions/dangerous.d.ts +5 -0
- package/dist/permissions/dangerous.js +1 -1
- package/dist/permissions/modes.d.ts +30 -0
- package/dist/permissions/modes.js +78 -0
- package/dist/permissions/pipeline.d.ts +31 -4
- package/dist/permissions/pipeline.js +196 -6
- package/dist/permissions/protected.d.ts +19 -0
- package/dist/permissions/protected.js +74 -0
- package/dist/permissions/rules.js +3 -0
- package/dist/permissions/types.d.ts +50 -3
- package/dist/permissions/types.js +3 -0
- package/dist/sdk.d.ts +9 -3
- package/dist/sdk.js +10 -2
- package/dist/session/export.d.ts +32 -0
- package/dist/session/export.js +187 -0
- package/dist/session/redact.d.ts +15 -0
- package/dist/session/redact.js +55 -0
- package/dist/session/reuse.d.ts +33 -0
- package/dist/session/reuse.js +86 -0
- package/dist/session/scan.d.ts +34 -0
- package/dist/session/scan.js +140 -0
- package/dist/session/search.d.ts +52 -0
- package/dist/session/search.js +211 -0
- package/dist/session/stats-aggregate.d.ts +63 -0
- package/dist/session/stats-aggregate.js +163 -0
- package/dist/session/stats-index.d.ts +26 -0
- package/dist/session/stats-index.js +91 -0
- package/dist/session/stats-scan.d.ts +54 -0
- package/dist/session/stats-scan.js +236 -0
- package/dist/tools/presets.d.ts +35 -8
- package/dist/tools/presets.js +56 -17
- package/dist/tui/component.d.ts +8 -2
- package/dist/tui/component.js +3 -1
- package/dist/tui/components/box.d.ts +6 -1
- package/dist/tui/components/box.js +16 -6
- package/dist/tui/components/card.d.ts +23 -0
- package/dist/tui/components/card.js +37 -0
- package/dist/tui/components/editor-history.d.ts +6 -0
- package/dist/tui/components/editor-history.js +45 -0
- package/dist/tui/components/editor-paste.d.ts +1 -1
- package/dist/tui/components/editor-paste.js +4 -4
- package/dist/tui/components/editor.d.ts +11 -5
- package/dist/tui/components/editor.js +52 -58
- package/dist/tui/components/key-value.d.ts +3 -0
- package/dist/tui/components/key-value.js +16 -6
- package/dist/tui/components/loader.d.ts +37 -7
- package/dist/tui/components/loader.js +84 -21
- package/dist/tui/components/markdown.d.ts +5 -1
- package/dist/tui/components/markdown.js +45 -21
- package/dist/tui/components/meter.d.ts +3 -3
- package/dist/tui/components/meter.js +13 -11
- package/dist/tui/components/select-list.d.ts +23 -1
- package/dist/tui/components/select-list.js +76 -13
- package/dist/tui/glyphs.d.ts +68 -0
- package/dist/tui/glyphs.js +114 -0
- package/dist/tui/theme.d.ts +30 -6
- package/dist/tui/theme.js +103 -17
- package/dist/tui.d.ts +4 -2
- package/dist/tui.js +3 -1
- package/docs/codemode.md +23 -9
- package/docs/hooks.md +10 -10
- package/docs/permissions.md +148 -0
- package/docs/providers.md +33 -10
- package/docs/rpc.md +36 -36
- package/docs/session-format.md +2 -1
- package/docs/sessions.md +134 -0
- package/docs/tui.md +139 -62
- package/package.json +3 -1
|
@@ -3,11 +3,13 @@
|
|
|
3
3
|
* (docs/providers.md「配置目录」)。规则与 schema.ts 的 `validateConfig` 一一对应:未知字段在那里是
|
|
4
4
|
* warning、这里是 `additionalProperties: false`;渠道引用(模型 `channels` 指向已定义的渠道)这类跨字段
|
|
5
5
|
* 规则 JSON Schema 表达不了,只在 `validateConfig` 里查。一致性由 json-schema.test.ts 的正反例守住。
|
|
6
|
+
* 顶层与各段的键(供应商内部除外)的 description / default 来自 key-docs.ts(`annotate`)。
|
|
6
7
|
*/
|
|
7
8
|
import { WARMING_MODES } from "../ai/cache/types.js";
|
|
8
9
|
import { PERMISSION_MODES_STRICT_FIRST } from "../permissions/types.js";
|
|
10
|
+
import { CONFIG_KEY_DOCS, DYNAMIC_DEFAULTS, defaultFor } from "./key-docs.js";
|
|
9
11
|
import { HOOK_TIMEOUT_MAX_MS, THINKING_LEVELS } from "./schema.js";
|
|
10
|
-
import { CACHE_RETENTIONS, CHANNEL_NAME_PATTERN, CODEMODE_MODES,
|
|
12
|
+
import { CACHE_RETENTIONS, CHANNEL_NAME_PATTERN, CODEMODE_MODES, TOOLS_PRESET_INPUTS, } from "./types.js";
|
|
11
13
|
export const CONFIG_SCHEMA_FILE = "config.schema.json";
|
|
12
14
|
export const CONFIG_SCHEMA_ID = "https://github.com/Owlbay/armadra-agent/config.schema.json";
|
|
13
15
|
const KNOWN_APIS = [
|
|
@@ -119,8 +121,33 @@ const provider = object({
|
|
|
119
121
|
models: { type: "array", items: model("自定义模型(同 id 整条替换)") },
|
|
120
122
|
modelOverrides: { type: "array", items: model("只改已有模型的元数据") },
|
|
121
123
|
});
|
|
124
|
+
/** 给顶层与各段的键写上 description 与 default(key-docs.ts);供应商内部不动。 */
|
|
125
|
+
function annotate(properties, prefix = "") {
|
|
126
|
+
for (const [key, shared] of Object.entries(properties)) {
|
|
127
|
+
const path = prefix === "" ? key : `${prefix}.${key}`;
|
|
128
|
+
// 片段(strings、bool() 等)在多处复用:先浅拷贝再写说明
|
|
129
|
+
const schema = { ...shared };
|
|
130
|
+
properties[key] = schema;
|
|
131
|
+
const description = CONFIG_KEY_DOCS[path];
|
|
132
|
+
if (description !== undefined)
|
|
133
|
+
schema["description"] = description;
|
|
134
|
+
const nested = schema["properties"];
|
|
135
|
+
if (nested !== undefined && path !== "providers") {
|
|
136
|
+
annotate(nested, path);
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
const value = defaultFor(path);
|
|
140
|
+
if (value !== undefined && DYNAMIC_DEFAULTS[path] === undefined)
|
|
141
|
+
schema["default"] = value;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
122
144
|
/** 生成 config.json 的 JSON Schema。 */
|
|
123
145
|
export function buildConfigJsonSchema() {
|
|
146
|
+
const schema = buildBaseSchema();
|
|
147
|
+
annotate(schema["properties"]);
|
|
148
|
+
return schema;
|
|
149
|
+
}
|
|
150
|
+
function buildBaseSchema() {
|
|
124
151
|
return {
|
|
125
152
|
$schema: "http://json-schema.org/draft-07/schema#",
|
|
126
153
|
$id: CONFIG_SCHEMA_ID,
|
|
@@ -136,6 +163,8 @@ export function buildConfigJsonSchema() {
|
|
|
136
163
|
allow: strings,
|
|
137
164
|
deny: strings,
|
|
138
165
|
builtinDeny: { anyOf: [{ type: "boolean" }, strings] },
|
|
166
|
+
autoModel: str("auto 模式分类器的模型 provider/model;缺省用当前会话模型"),
|
|
167
|
+
autoSafeCommands: strings,
|
|
139
168
|
}),
|
|
140
169
|
compaction: object({ enabled: bool(), reserveTokens: num(0), keepRecentTokens: num(0) }),
|
|
141
170
|
retry: object({
|
|
@@ -145,7 +174,7 @@ export function buildConfigJsonSchema() {
|
|
|
145
174
|
maxDelayMs: num(0),
|
|
146
175
|
}),
|
|
147
176
|
tools: object({
|
|
148
|
-
preset: oneOf(
|
|
177
|
+
preset: oneOf(TOOLS_PRESET_INPUTS),
|
|
149
178
|
default: strings,
|
|
150
179
|
maxToolResultChars: num(1),
|
|
151
180
|
bashTimeoutMs: num(1),
|
|
@@ -158,11 +187,14 @@ export function buildConfigJsonSchema() {
|
|
|
158
187
|
}),
|
|
159
188
|
hooks: object({ timeoutMs: num(1, HOOK_TIMEOUT_MAX_MS) }),
|
|
160
189
|
ui: object({
|
|
161
|
-
theme: oneOf(["dark", "light"]),
|
|
190
|
+
theme: oneOf(["dark", "light", "auto"]),
|
|
162
191
|
markdown: bool(),
|
|
163
192
|
showThinking: oneOf(["full", "collapsed", "hidden"]),
|
|
164
193
|
tuiMode: oneOf(["regular"]),
|
|
165
194
|
quietStartup: oneOf(["normal", "header", "silent"]),
|
|
195
|
+
ascii: bool(),
|
|
196
|
+
compact: bool(),
|
|
197
|
+
animation: bool(),
|
|
166
198
|
}),
|
|
167
199
|
skills: object({ dirs: strings }),
|
|
168
200
|
cache: object({
|
|
@@ -172,6 +204,7 @@ export function buildConfigJsonSchema() {
|
|
|
172
204
|
missNotices: bool(),
|
|
173
205
|
warmSubagents: bool(),
|
|
174
206
|
}),
|
|
207
|
+
request: object({ idleTimeoutMs: num(0) }),
|
|
175
208
|
}),
|
|
176
209
|
required: ["version"],
|
|
177
210
|
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* config.json 每个键的说明与缺省值:config.schema.json(编辑器悬停)与 `ama config show`(来源 default
|
|
3
|
+
* 的行)共用这一张表。
|
|
4
|
+
*
|
|
5
|
+
* - `description` 写在 `CONFIG_KEY_DOCS`;缺省值不手写,从 `DEFAULT_CONFIG`(merge.ts)、
|
|
6
|
+
* `DEFAULT_CACHE_CONFIG`(types.ts)与代码里的隐式缺省(`IMPLICIT_DEFAULTS`)合成 `DISPLAY_DEFAULTS`;
|
|
7
|
+
* - 缺省值取决于运行时的键(自动选模型、跟随预设等)列在 `DYNAMIC_DEFAULTS`,schema 里不写 `default`,
|
|
8
|
+
* 说明里写规则;
|
|
9
|
+
* - 一致性由 json-schema.test.ts 守住:schema 的每个键都在表里,表里的每个键 schema 都有,缺省值与
|
|
10
|
+
* DISPLAY_DEFAULTS 相同,DISPLAY_DEFAULTS 本身通过 `validateConfig`。
|
|
11
|
+
*/
|
|
12
|
+
import { type AmaConfig } from "./types.js";
|
|
13
|
+
/** 全部有固定缺省值的键(展示用;运行时仍以 DEFAULT_CONFIG 合并)。 */
|
|
14
|
+
export declare const DISPLAY_DEFAULTS: Readonly<AmaConfig>;
|
|
15
|
+
/** 缺省值由运行时决定的键 → 规则(schema 不写 default)。 */
|
|
16
|
+
export declare const DYNAMIC_DEFAULTS: Readonly<Record<string, string>>;
|
|
17
|
+
/** 键路径 → 说明(段落本身也有一条)。 */
|
|
18
|
+
export declare const CONFIG_KEY_DOCS: Readonly<Record<string, string>>;
|
|
19
|
+
/** 叶子路径(段落不算)。 */
|
|
20
|
+
export declare function documentedLeaves(): string[];
|
|
21
|
+
/** 键路径的缺省值(DISPLAY_DEFAULTS 里取;没有返回 undefined)。 */
|
|
22
|
+
export declare function defaultFor(path: string): unknown;
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* config.json 每个键的说明与缺省值:config.schema.json(编辑器悬停)与 `ama config show`(来源 default
|
|
3
|
+
* 的行)共用这一张表。
|
|
4
|
+
*
|
|
5
|
+
* - `description` 写在 `CONFIG_KEY_DOCS`;缺省值不手写,从 `DEFAULT_CONFIG`(merge.ts)、
|
|
6
|
+
* `DEFAULT_CACHE_CONFIG`(types.ts)与代码里的隐式缺省(`IMPLICIT_DEFAULTS`)合成 `DISPLAY_DEFAULTS`;
|
|
7
|
+
* - 缺省值取决于运行时的键(自动选模型、跟随预设等)列在 `DYNAMIC_DEFAULTS`,schema 里不写 `default`,
|
|
8
|
+
* 说明里写规则;
|
|
9
|
+
* - 一致性由 json-schema.test.ts 守住:schema 的每个键都在表里,表里的每个键 schema 都有,缺省值与
|
|
10
|
+
* DISPLAY_DEFAULTS 相同,DISPLAY_DEFAULTS 本身通过 `validateConfig`。
|
|
11
|
+
*/
|
|
12
|
+
import { DEFAULT_IDLE_TIMEOUT_MS } from "../ai/http.js";
|
|
13
|
+
import { DEFAULT_INLINE_BUDGET } from "../codemode/declarations.js";
|
|
14
|
+
import { DEFAULT_CONFIG, mergeConfig } from "./merge.js";
|
|
15
|
+
import { DEFAULT_CACHE_CONFIG } from "./types.js";
|
|
16
|
+
/** 代码里生效、但 DEFAULT_CONFIG 不写的缺省(写进去会改变合并结果或 `config.codemode` 的有无)。 */
|
|
17
|
+
const IMPLICIT_DEFAULTS = {
|
|
18
|
+
providers: {},
|
|
19
|
+
permission: { builtinDeny: true, autoSafeCommands: [] },
|
|
20
|
+
tools: { default: [] },
|
|
21
|
+
codemode: { inlineBudget: DEFAULT_INLINE_BUDGET, requireStrict: false },
|
|
22
|
+
cache: { ...DEFAULT_CACHE_CONFIG },
|
|
23
|
+
request: { idleTimeoutMs: DEFAULT_IDLE_TIMEOUT_MS },
|
|
24
|
+
ui: { compact: false, animation: true },
|
|
25
|
+
};
|
|
26
|
+
/** 全部有固定缺省值的键(展示用;运行时仍以 DEFAULT_CONFIG 合并)。 */
|
|
27
|
+
export const DISPLAY_DEFAULTS = Object.freeze(mergeConfig(DEFAULT_CONFIG, IMPLICIT_DEFAULTS));
|
|
28
|
+
/** 缺省值由运行时决定的键 → 规则(schema 不写 default)。 */
|
|
29
|
+
export const DYNAMIC_DEFAULTS = Object.freeze({
|
|
30
|
+
$schema: "ama init 写 ./config.schema.json",
|
|
31
|
+
defaultModel: "零配置自动选择",
|
|
32
|
+
"permission.autoModel": "当前会话模型",
|
|
33
|
+
"codemode.mode": "跟随预设",
|
|
34
|
+
"ui.ascii": "自动检测",
|
|
35
|
+
});
|
|
36
|
+
/** 键路径 → 说明(段落本身也有一条)。 */
|
|
37
|
+
export const CONFIG_KEY_DOCS = Object.freeze({
|
|
38
|
+
$schema: "编辑器用的 JSON Schema 路径",
|
|
39
|
+
version: "配置文件格式版本,固定为 1",
|
|
40
|
+
defaultModel: "缺省模型 provider/model 或 provider/model@channel;不写时零配置自动选择(ama config show 显示选了谁、为什么)",
|
|
41
|
+
thinkingLevel: "思考强度",
|
|
42
|
+
providers: "自定义供应商与对内置供应商的覆盖(docs/providers.md)",
|
|
43
|
+
permission: "权限(docs/permissions.md)",
|
|
44
|
+
"permission.mode": "权限模式;项目级只能更严",
|
|
45
|
+
"permission.allow": "放行规则,如 bash(npm test);项目级不能加",
|
|
46
|
+
"permission.deny": "拒绝规则,如 write(**/.env);各层累加",
|
|
47
|
+
"permission.builtinDeny": "内置 deny 表(.git/** 写、.ssh/** 读写):true 全部启用,false 全部移除,数组 = 要移除的规则原文;只认用户级",
|
|
48
|
+
"permission.autoModel": "auto 模式分类器的模型 provider/model;不写时用当前会话模型;只认用户级",
|
|
49
|
+
"permission.autoSafeCommands": "auto 模式安全名单追加(词前缀或含 * 的通配);只认用户级",
|
|
50
|
+
compaction: "自动压缩",
|
|
51
|
+
"compaction.enabled": "上下文接近上限时自动压缩",
|
|
52
|
+
"compaction.reserveTokens": "为回复预留的 token;剩余不足时触发压缩",
|
|
53
|
+
"compaction.keepRecentTokens": "压缩时原样保留的最近消息 token",
|
|
54
|
+
retry: "请求失败重试",
|
|
55
|
+
"retry.enabled": "可重试的错误(限流、服务端错误、连接中断等)自动重试",
|
|
56
|
+
"retry.maxRetries": "最多重试次数",
|
|
57
|
+
"retry.baseDelayMs": "首次重试等待(毫秒,指数退避;有 Retry-After 时按它)",
|
|
58
|
+
"retry.maxDelayMs": "单次等待上限(毫秒)",
|
|
59
|
+
tools: "内置工具",
|
|
60
|
+
"tools.preset": "工具预设:default(六个工具,Node ≥ 25 时另加 codemode)、minimal、codemode-only、coordinator;codemode 是 codemode-only 的旧名;项目级只能更严",
|
|
61
|
+
"tools.default": "在预设上微调:+name 加、-name 去,不带前缀的名字整组替换预设的内置工具;只认用户级",
|
|
62
|
+
"tools.maxToolResultChars": "单条工具结果进上下文的字符上限,超出保留首尾",
|
|
63
|
+
"tools.bashTimeoutMs": "bash 缺省超时(毫秒,单次调用可覆盖,最大 600000)",
|
|
64
|
+
"tools.disabled": "禁用的工具名;各层累加",
|
|
65
|
+
codemode: "codemode:模型写脚本批量调用工具(docs/codemode.md)",
|
|
66
|
+
"codemode.mode": "off | on | only;不写时跟随预设:default → on(Node ≥ 25;Node 22 / 24 → off)、codemode-only → only、minimal / coordinator → off;项目级只接受 off",
|
|
67
|
+
"codemode.inlineBudget": "only 模式在描述里内联工具声明的预算(估算 token),超出只列名字",
|
|
68
|
+
"codemode.requireStrict": "true:运行时 Node 不隔离网络(Node 22 / 24)时直接禁用 codemode",
|
|
69
|
+
hooks: "Hook 设置(Hook 本身写在 hooks.json)",
|
|
70
|
+
"hooks.timeoutMs": "单个 Hook 命令的缺省超时(毫秒)",
|
|
71
|
+
ui: "终端界面",
|
|
72
|
+
"ui.theme": "配色主题:dark、light,或 auto(按 COLORFGBG 猜,不发终端查询,猜不出用 dark)",
|
|
73
|
+
"ui.markdown": "按 Markdown 渲染回复",
|
|
74
|
+
"ui.showThinking": "思考内容的显示方式",
|
|
75
|
+
"ui.tuiMode": "终端界面形态(目前只有 regular)",
|
|
76
|
+
"ui.quietStartup": "启动画面详略",
|
|
77
|
+
"ui.ascii": "ASCII 字形(> * L、+ - |);不写时自动检测:区域设置不含 UTF-8、TERM=linux、旧 conhost 时开启;AMA_ASCII=1/0 覆盖",
|
|
78
|
+
"ui.compact": "消息区块间不空行、启动头不画框",
|
|
79
|
+
"ui.animation": "false:运行中 spinner 静止,只在秒数变化时重绘",
|
|
80
|
+
skills: "Skill",
|
|
81
|
+
"skills.dirs": "追加的 Skill 目录;各层累加",
|
|
82
|
+
cache: "提示缓存;整段只认用户级",
|
|
83
|
+
request: "模型请求;整段只认用户级 / profile",
|
|
84
|
+
"request.idleTimeoutMs": "流空闲超时(毫秒):等响应头或两块数据之间超过即判卡住并按可重试错误重试;0 关闭;AMA_IDLE_TIMEOUT_MS 覆盖",
|
|
85
|
+
"cache.warming": "保温:off 关闭,streaming 生成期间保温,idle 空闲时也保温",
|
|
86
|
+
"cache.retention": "缓存时长档:none、short、long(供应商支持时)",
|
|
87
|
+
"cache.minSavingsUsd": "保温的最低期望节省(美元)",
|
|
88
|
+
"cache.missNotices": "在消息区提示缓存未命中与上下文余量",
|
|
89
|
+
"cache.warmSubagents": "子会话(task)也保温",
|
|
90
|
+
});
|
|
91
|
+
/** 叶子路径(段落不算)。 */
|
|
92
|
+
export function documentedLeaves() {
|
|
93
|
+
const keys = Object.keys(CONFIG_KEY_DOCS);
|
|
94
|
+
return keys.filter((key) => !keys.some((other) => other.startsWith(`${key}.`)));
|
|
95
|
+
}
|
|
96
|
+
/** 键路径的缺省值(DISPLAY_DEFAULTS 里取;没有返回 undefined)。 */
|
|
97
|
+
export function defaultFor(path) {
|
|
98
|
+
let node = DISPLAY_DEFAULTS;
|
|
99
|
+
for (const key of path.split(".")) {
|
|
100
|
+
if (typeof node !== "object" || node === null || Array.isArray(node))
|
|
101
|
+
return undefined;
|
|
102
|
+
node = node[key];
|
|
103
|
+
}
|
|
104
|
+
return node;
|
|
105
|
+
}
|
package/dist/config/merge.d.ts
CHANGED
|
@@ -2,14 +2,15 @@
|
|
|
2
2
|
* 配置层级合并(设计 §7.2、§10.2)。[B5]
|
|
3
3
|
*
|
|
4
4
|
* 顺序:内置缺省 ← 用户级 ← profile.config ← 项目级(受限字段,只能收紧)← 命令行。
|
|
5
|
-
* - 对象深合并;数组整体替换,例外是「累加型」列表:`permission.allow / deny`、
|
|
5
|
+
* - 对象深合并;数组整体替换,例外是「累加型」列表:`permission.allow / deny / autoSafeCommands`、
|
|
6
6
|
* `tools.disabled`、`skills.dirs` 跨层拼接去重。
|
|
7
|
-
* - 项目级 `.ama/config.json` 只接受:`permission.deny`(追加)、`permission.mode
|
|
7
|
+
* - 项目级 `.ama/config.json` 只接受:`permission.deny`(追加)、`permission.mode`(只能更严,且不能是
|
|
8
|
+
* auto / full-auto)、
|
|
8
9
|
* `compaction`、`tools.disabled`、`tools.preset`(只能更严)、`codemode.mode: "off"`、`ui`;
|
|
9
|
-
* 其它字段与放宽项(含 `permission.builtinDeny`)被忽略并记 warning。
|
|
10
|
+
* 其它字段与放宽项(含 `permission.builtinDeny / autoModel / autoSafeCommands`)被忽略并记 warning。
|
|
10
11
|
* - 同时产出带来源的权限规则清单(`ruleSpecs`),交给权限管线(B3 的 rules.ts 解析)。
|
|
11
12
|
*/
|
|
12
|
-
import type { AmaConfig, CodemodeMode,
|
|
13
|
+
import type { AmaConfig, CodemodeMode, ToolsPresetInput } from "./types.js";
|
|
13
14
|
import type { PermissionMode, RuleSource } from "../permissions/types.js";
|
|
14
15
|
import type { ModelThinkingLevel } from "../ai/types.js";
|
|
15
16
|
export declare const DEFAULT_CONFIG: Readonly<AmaConfig>;
|
|
@@ -28,13 +29,13 @@ export interface RestrictResult {
|
|
|
28
29
|
accepted: Partial<AmaConfig>;
|
|
29
30
|
warnings: string[];
|
|
30
31
|
}
|
|
31
|
-
/** 预设 a 是否比 b 更严或相同(coordinator 最严,codemode
|
|
32
|
-
export declare function isPresetStricterOrEqual(a:
|
|
32
|
+
/** 预设 a 是否比 b 更严或相同(coordinator 最严,codemode-only 最宽;别名按规范名比)。 */
|
|
33
|
+
export declare function isPresetStricterOrEqual(a: ToolsPresetInput, b: ToolsPresetInput): boolean;
|
|
33
34
|
/**
|
|
34
35
|
* 把项目级配置裁剪为受限字段(§7.2);`currentMode` / `currentPreset` 是合并到此为止的
|
|
35
36
|
* 权限模式与工具预设。
|
|
36
37
|
*/
|
|
37
|
-
export declare function restrictProjectConfig(project: AmaConfig, currentMode: PermissionMode, label?: string, currentPreset?:
|
|
38
|
+
export declare function restrictProjectConfig(project: AmaConfig, currentMode: PermissionMode, label?: string, currentPreset?: ToolsPresetInput): RestrictResult;
|
|
38
39
|
/** 命令行对配置的覆盖(只含与 config 同名的那部分参数)。 */
|
|
39
40
|
export interface CliConfigOverrides {
|
|
40
41
|
thinkingLevel?: ModelThinkingLevel | undefined;
|
|
@@ -45,7 +46,7 @@ export interface CliConfigOverrides {
|
|
|
45
46
|
tuiMode?: "regular" | undefined;
|
|
46
47
|
skillDirs?: readonly string[] | undefined;
|
|
47
48
|
/** `--tools-preset`。 */
|
|
48
|
-
toolsPreset?:
|
|
49
|
+
toolsPreset?: ToolsPresetInput | undefined;
|
|
49
50
|
/** `--codemode`。 */
|
|
50
51
|
codemode?: CodemodeMode | undefined;
|
|
51
52
|
}
|
package/dist/config/merge.js
CHANGED
|
@@ -2,14 +2,15 @@
|
|
|
2
2
|
* 配置层级合并(设计 §7.2、§10.2)。[B5]
|
|
3
3
|
*
|
|
4
4
|
* 顺序:内置缺省 ← 用户级 ← profile.config ← 项目级(受限字段,只能收紧)← 命令行。
|
|
5
|
-
* - 对象深合并;数组整体替换,例外是「累加型」列表:`permission.allow / deny`、
|
|
5
|
+
* - 对象深合并;数组整体替换,例外是「累加型」列表:`permission.allow / deny / autoSafeCommands`、
|
|
6
6
|
* `tools.disabled`、`skills.dirs` 跨层拼接去重。
|
|
7
|
-
* - 项目级 `.ama/config.json` 只接受:`permission.deny`(追加)、`permission.mode
|
|
7
|
+
* - 项目级 `.ama/config.json` 只接受:`permission.deny`(追加)、`permission.mode`(只能更严,且不能是
|
|
8
|
+
* auto / full-auto)、
|
|
8
9
|
* `compaction`、`tools.disabled`、`tools.preset`(只能更严)、`codemode.mode: "off"`、`ui`;
|
|
9
|
-
* 其它字段与放宽项(含 `permission.builtinDeny`)被忽略并记 warning。
|
|
10
|
+
* 其它字段与放宽项(含 `permission.builtinDeny / autoModel / autoSafeCommands`)被忽略并记 warning。
|
|
10
11
|
* - 同时产出带来源的权限规则清单(`ruleSpecs`),交给权限管线(B3 的 rules.ts 解析)。
|
|
11
12
|
*/
|
|
12
|
-
import { CONFIG_FILE_VERSION, TOOLS_PRESETS_STRICT_FIRST } from "./types.js";
|
|
13
|
+
import { CONFIG_FILE_VERSION, TOOLS_PRESETS_STRICT_FIRST, canonicalPreset } from "./types.js";
|
|
13
14
|
import { isAtLeastAsStrict } from "../permissions/rules.js";
|
|
14
15
|
export const DEFAULT_CONFIG = Object.freeze({
|
|
15
16
|
version: CONFIG_FILE_VERSION,
|
|
@@ -43,6 +44,7 @@ const RULE_SOURCE = {
|
|
|
43
44
|
const ACCUMULATING = new Set([
|
|
44
45
|
"permission.allow",
|
|
45
46
|
"permission.deny",
|
|
47
|
+
"permission.autoSafeCommands",
|
|
46
48
|
"tools.disabled",
|
|
47
49
|
"skills.dirs",
|
|
48
50
|
]);
|
|
@@ -78,11 +80,15 @@ export function mergeConfig(base, over) {
|
|
|
78
80
|
return structuredCloneSafe(base);
|
|
79
81
|
const merged = mergeValue(base, over, "");
|
|
80
82
|
merged.version = CONFIG_FILE_VERSION;
|
|
83
|
+
// 别名(`codemode`)在合并后折成规范名:下游只见规范名。
|
|
84
|
+
if (merged.tools?.preset !== undefined)
|
|
85
|
+
merged.tools.preset = canonicalPreset(merged.tools.preset);
|
|
81
86
|
return merged;
|
|
82
87
|
}
|
|
83
|
-
/** 预设 a 是否比 b 更严或相同(coordinator 最严,codemode
|
|
88
|
+
/** 预设 a 是否比 b 更严或相同(coordinator 最严,codemode-only 最宽;别名按规范名比)。 */
|
|
84
89
|
export function isPresetStricterOrEqual(a, b) {
|
|
85
|
-
return TOOLS_PRESETS_STRICT_FIRST.indexOf(a) <=
|
|
90
|
+
return (TOOLS_PRESETS_STRICT_FIRST.indexOf(canonicalPreset(a)) <=
|
|
91
|
+
TOOLS_PRESETS_STRICT_FIRST.indexOf(canonicalPreset(b)));
|
|
86
92
|
}
|
|
87
93
|
/**
|
|
88
94
|
* 把项目级配置裁剪为受限字段(§7.2);`currentMode` / `currentPreset` 是合并到此为止的
|
|
@@ -155,7 +161,16 @@ function restrictPermission(permission, currentMode, label, warnings) {
|
|
|
155
161
|
if (permission.builtinDeny !== undefined) {
|
|
156
162
|
warnings.push(`${label}: 项目级不能改内置 deny 表,忽略 permission.builtinDeny`);
|
|
157
163
|
}
|
|
158
|
-
if (permission.
|
|
164
|
+
if (permission.autoModel !== undefined) {
|
|
165
|
+
warnings.push(`${label}: 项目级不能设 permission.autoModel,已忽略`);
|
|
166
|
+
}
|
|
167
|
+
if (permission.autoSafeCommands !== undefined && permission.autoSafeCommands.length > 0) {
|
|
168
|
+
warnings.push(`${label}: 项目级不能追加 permission.autoSafeCommands(放宽),已忽略`);
|
|
169
|
+
}
|
|
170
|
+
if (permission.mode === "auto" || permission.mode === "full-auto") {
|
|
171
|
+
warnings.push(`${label}: 项目级不能把权限模式设为 ${permission.mode}(放宽,只能在用户级配置、profile 或命令行设),已忽略`);
|
|
172
|
+
}
|
|
173
|
+
else if (permission.mode !== undefined) {
|
|
159
174
|
if (isAtLeastAsStrict(permission.mode, currentMode)) {
|
|
160
175
|
result.mode = permission.mode;
|
|
161
176
|
}
|
package/dist/config/schema.d.ts
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import type { AmaConfig, AuthFile, ProfileFile, TrustFile } from "./types.js";
|
|
9
9
|
import type { HookConfig } from "../hooks/types.js";
|
|
10
|
-
export type { AmaConfig, AuthFile, ProfileFile, TrustFile, TrustEntry, ProviderConfig, PermissionConfig, CompactionConfig, RetryConfig, ToolsConfig, ToolsPreset, CodemodeConfig, CodemodeMode, HooksSettings, UiConfig, SkillsConfig, CacheConfig, ModelConfig, ModelOverride, ChannelConfig, } from "./types.js";
|
|
10
|
+
export type { AmaConfig, AuthFile, ProfileFile, TrustFile, TrustEntry, ProviderConfig, PermissionConfig, CompactionConfig, RetryConfig, ToolsConfig, ToolsPreset, ToolsPresetInput, CodemodeConfig, CodemodeMode, HooksSettings, UiConfig, SkillsConfig, CacheConfig, ModelConfig, ModelOverride, ChannelConfig, } from "./types.js";
|
|
11
11
|
export { CONFIG_FILE_VERSION } from "./types.js";
|
|
12
12
|
export type { HookConfig } from "../hooks/types.js";
|
|
13
13
|
export interface Diagnostic {
|
package/dist/config/schema.js
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
import { HOOK_EVENTS } from "../hooks/types.js";
|
|
9
9
|
import { PERMISSION_MODES_STRICT_FIRST } from "../permissions/types.js";
|
|
10
10
|
import { WARMING_MODES } from "../ai/cache/types.js";
|
|
11
|
-
import { CACHE_RETENTIONS, CHANNEL_NAME_PATTERN, CODEMODE_MODES,
|
|
11
|
+
import { CACHE_RETENTIONS, CHANNEL_NAME_PATTERN, CODEMODE_MODES, TOOLS_PRESET_INPUTS, } from "./types.js";
|
|
12
12
|
export { CONFIG_FILE_VERSION } from "./types.js";
|
|
13
13
|
export const THINKING_LEVELS = ["off", "minimal", "low", "medium", "high", "xhigh"];
|
|
14
14
|
export const HOOK_TIMEOUT_MAX_MS = 600_000;
|
|
@@ -116,6 +116,7 @@ const CONFIG_KEYS = [
|
|
|
116
116
|
"ui",
|
|
117
117
|
"skills",
|
|
118
118
|
"cache",
|
|
119
|
+
"request",
|
|
119
120
|
"$schema",
|
|
120
121
|
];
|
|
121
122
|
const PROVIDER_KEYS = [
|
|
@@ -278,10 +279,13 @@ export function validateConfig(value) {
|
|
|
278
279
|
checkProvider(c, provider, join("providers", id));
|
|
279
280
|
}
|
|
280
281
|
}
|
|
281
|
-
|
|
282
|
+
const permissionKeys = ["mode", "allow", "deny", "builtinDeny", "autoModel", "autoSafeCommands"];
|
|
283
|
+
checkSection(c, value, "permission", permissionKeys, (s, p) => {
|
|
282
284
|
c.oneOf(s, "mode", p, PERMISSION_MODES_STRICT_FIRST);
|
|
283
285
|
c.stringArray(s, "allow", p);
|
|
284
286
|
c.stringArray(s, "deny", p);
|
|
287
|
+
c.string(s, "autoModel", p);
|
|
288
|
+
c.stringArray(s, "autoSafeCommands", p);
|
|
285
289
|
const builtinDeny = s["builtinDeny"];
|
|
286
290
|
if (builtinDeny !== undefined &&
|
|
287
291
|
typeof builtinDeny !== "boolean" &&
|
|
@@ -301,7 +305,7 @@ export function validateConfig(value) {
|
|
|
301
305
|
c.number(s, "maxDelayMs", p);
|
|
302
306
|
});
|
|
303
307
|
checkSection(c, value, "tools", ["preset", "default", "maxToolResultChars", "bashTimeoutMs", "disabled"], (s, p) => {
|
|
304
|
-
c.oneOf(s, "preset", p,
|
|
308
|
+
c.oneOf(s, "preset", p, TOOLS_PRESET_INPUTS);
|
|
305
309
|
c.stringArray(s, "default", p);
|
|
306
310
|
c.number(s, "maxToolResultChars", p, 1);
|
|
307
311
|
c.number(s, "bashTimeoutMs", p, 1);
|
|
@@ -315,14 +319,29 @@ export function validateConfig(value) {
|
|
|
315
319
|
checkSection(c, value, "hooks", ["timeoutMs"], (s, p) => {
|
|
316
320
|
c.number(s, "timeoutMs", p, 1, HOOK_TIMEOUT_MAX_MS);
|
|
317
321
|
});
|
|
318
|
-
checkSection(c, value, "ui", [
|
|
319
|
-
|
|
322
|
+
checkSection(c, value, "ui", [
|
|
323
|
+
"theme",
|
|
324
|
+
"markdown",
|
|
325
|
+
"showThinking",
|
|
326
|
+
"tuiMode",
|
|
327
|
+
"quietStartup",
|
|
328
|
+
"ascii",
|
|
329
|
+
"compact",
|
|
330
|
+
"animation",
|
|
331
|
+
], (s, p) => {
|
|
332
|
+
c.oneOf(s, "theme", p, ["dark", "light", "auto"]);
|
|
320
333
|
c.boolean(s, "markdown", p);
|
|
321
334
|
c.oneOf(s, "showThinking", p, ["full", "collapsed", "hidden"]);
|
|
322
335
|
c.oneOf(s, "tuiMode", p, ["regular"]);
|
|
323
336
|
c.oneOf(s, "quietStartup", p, ["normal", "header", "silent"]);
|
|
337
|
+
c.boolean(s, "ascii", p);
|
|
338
|
+
c.boolean(s, "compact", p);
|
|
339
|
+
c.boolean(s, "animation", p);
|
|
324
340
|
});
|
|
325
341
|
checkSection(c, value, "skills", ["dirs"], (s, p) => c.stringArray(s, "dirs", p));
|
|
342
|
+
checkSection(c, value, "request", ["idleTimeoutMs"], (s, p) => {
|
|
343
|
+
c.number(s, "idleTimeoutMs", p, 0);
|
|
344
|
+
});
|
|
326
345
|
checkSection(c, value, "cache", ["warming", "retention", "minSavingsUsd", "missNotices", "warmSubagents"], (s, p) => {
|
|
327
346
|
c.oneOf(s, "warming", p, WARMING_MODES);
|
|
328
347
|
c.oneOf(s, "retention", p, CACHE_RETENTIONS);
|
package/dist/config/types.d.ts
CHANGED
|
@@ -65,6 +65,10 @@ export interface PermissionConfig {
|
|
|
65
65
|
* 数组 = 要移除的规则原文。放宽项,只认用户级 / profile,项目级忽略并 warning。
|
|
66
66
|
*/
|
|
67
67
|
builtinDeny?: boolean | string[];
|
|
68
|
+
/** auto 模式分类器的模型(`provider/model`);缺省 = 当前会话模型。放宽项,项目级忽略。 */
|
|
69
|
+
autoModel?: string;
|
|
70
|
+
/** auto 模式安全名单追加(词前缀或含 `*` 的通配)。放宽项,项目级忽略;各层累加。 */
|
|
71
|
+
autoSafeCommands?: string[];
|
|
68
72
|
}
|
|
69
73
|
export interface CompactionConfig {
|
|
70
74
|
enabled?: boolean;
|
|
@@ -77,13 +81,22 @@ export interface RetryConfig {
|
|
|
77
81
|
baseDelayMs?: number;
|
|
78
82
|
maxDelayMs?: number;
|
|
79
83
|
}
|
|
80
|
-
/** 工具预设(设计 §5.6
|
|
81
|
-
export type ToolsPreset = "default" | "minimal" | "codemode" | "coordinator";
|
|
82
|
-
/**
|
|
84
|
+
/** 工具预设(设计 §5.6):模型直接看到的工具集合(规范名)。 */
|
|
85
|
+
export type ToolsPreset = "default" | "minimal" | "codemode-only" | "coordinator";
|
|
86
|
+
/** 预设别名 → 规范名:`codemode` 是 0.3.0 的旧名(行为同 `codemode-only`)。 */
|
|
87
|
+
export declare const TOOLS_PRESET_ALIASES: Readonly<Record<string, ToolsPreset>>;
|
|
88
|
+
/** 配置文件、命令行、RPC、SDK 接受的写法:规范名或别名。 */
|
|
89
|
+
export type ToolsPresetInput = ToolsPreset | "codemode";
|
|
90
|
+
/** 从严到宽:项目级只能把预设改成不比当前更宽的那个(coordinator 最严,codemode-only 最宽)。 */
|
|
83
91
|
export declare const TOOLS_PRESETS_STRICT_FIRST: readonly ToolsPreset[];
|
|
92
|
+
/** 全部可接受的写法(规范名在前,别名在后;schema 与命令行校验用)。 */
|
|
93
|
+
export declare const TOOLS_PRESET_INPUTS: readonly ToolsPresetInput[];
|
|
94
|
+
/** 规范名;未知名字原样返回(校验由 schema 负责)。 */
|
|
95
|
+
export declare function canonicalPreset(name: ToolsPresetInput): ToolsPreset;
|
|
96
|
+
export declare function canonicalPreset(name: string | undefined): ToolsPreset | undefined;
|
|
84
97
|
export interface ToolsConfig {
|
|
85
|
-
/** 缺省 `default`;命令行 `--tools-preset
|
|
86
|
-
preset?:
|
|
98
|
+
/** 缺省 `default`;命令行 `--tools-preset`;`codemode` 是 `codemode-only` 的别名。 */
|
|
99
|
+
preset?: ToolsPresetInput;
|
|
87
100
|
/**
|
|
88
101
|
* 在预设上微调(设计 §5.6):`+name` 加、`-name` 去;不带前缀的名字整组替换预设的内置工具。
|
|
89
102
|
* 只认用户级 / profile(项目级忽略并 warning)。
|
|
@@ -108,12 +121,19 @@ export interface HooksSettings {
|
|
|
108
121
|
timeoutMs?: number;
|
|
109
122
|
}
|
|
110
123
|
export interface UiConfig {
|
|
111
|
-
|
|
124
|
+
/** auto 按 `COLORFGBG` / `TERM_PROGRAM` 猜(不发查询序列),猜不出用 dark。 */
|
|
125
|
+
theme?: "dark" | "light" | "auto";
|
|
112
126
|
markdown?: boolean;
|
|
113
127
|
showThinking?: "full" | "collapsed" | "hidden";
|
|
114
128
|
/** 第一期只有 regular(§12.10)。 */
|
|
115
129
|
tuiMode?: "regular";
|
|
116
130
|
quietStartup?: "normal" | "header" | "silent";
|
|
131
|
+
/** ASCII 字形(`AMA_ASCII=1` 等价);缺省按区域设置 / TERM 自动检测。 */
|
|
132
|
+
ascii?: boolean;
|
|
133
|
+
/** 消息区块间不空行、启动头无框,缺省 false。 */
|
|
134
|
+
compact?: boolean;
|
|
135
|
+
/** false:运行中 spinner 固定为 `·`,缺省 true。 */
|
|
136
|
+
animation?: boolean;
|
|
117
137
|
}
|
|
118
138
|
export interface SkillsConfig {
|
|
119
139
|
dirs?: string[];
|
|
@@ -136,6 +156,13 @@ export interface CacheConfig {
|
|
|
136
156
|
warmSubagents?: boolean;
|
|
137
157
|
}
|
|
138
158
|
export declare const DEFAULT_CACHE_CONFIG: Readonly<Required<CacheConfig>>;
|
|
159
|
+
/**
|
|
160
|
+
* 模型请求(W4-C)。只认用户级 / profile;环境变量 `AMA_IDLE_TIMEOUT_MS` 覆盖 `idleTimeoutMs`。
|
|
161
|
+
*/
|
|
162
|
+
export interface RequestConfig {
|
|
163
|
+
/** 等响应头与流中两块数据之间的最长间隔(毫秒),收到任何字节即重新计时;缺省 300 000,0 关闭。 */
|
|
164
|
+
idleTimeoutMs?: number;
|
|
165
|
+
}
|
|
139
166
|
/** config.json(用户级 / 项目级 / profile.config 同形状;项目级只接受受限字段,§10.2)。 */
|
|
140
167
|
export interface AmaConfig {
|
|
141
168
|
version: typeof CONFIG_FILE_VERSION;
|
|
@@ -152,6 +179,7 @@ export interface AmaConfig {
|
|
|
152
179
|
ui?: UiConfig;
|
|
153
180
|
skills?: SkillsConfig;
|
|
154
181
|
cache?: CacheConfig;
|
|
182
|
+
request?: RequestConfig;
|
|
155
183
|
}
|
|
156
184
|
/** auth.json(0600)。 */
|
|
157
185
|
export interface AuthFile {
|
package/dist/config/types.js
CHANGED
|
@@ -11,13 +11,29 @@
|
|
|
11
11
|
export const CONFIG_FILE_VERSION = 1;
|
|
12
12
|
/** 渠道名:不含 `/` 与 `@`(`provider/model@channel`)。 */
|
|
13
13
|
export const CHANNEL_NAME_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_-]{0,31}$/;
|
|
14
|
-
/**
|
|
14
|
+
/** 预设别名 → 规范名:`codemode` 是 0.3.0 的旧名(行为同 `codemode-only`)。 */
|
|
15
|
+
export const TOOLS_PRESET_ALIASES = Object.freeze({
|
|
16
|
+
codemode: "codemode-only",
|
|
17
|
+
});
|
|
18
|
+
/** 从严到宽:项目级只能把预设改成不比当前更宽的那个(coordinator 最严,codemode-only 最宽)。 */
|
|
15
19
|
export const TOOLS_PRESETS_STRICT_FIRST = [
|
|
16
20
|
"coordinator",
|
|
17
21
|
"minimal",
|
|
18
22
|
"default",
|
|
23
|
+
"codemode-only",
|
|
24
|
+
];
|
|
25
|
+
/** 全部可接受的写法(规范名在前,别名在后;schema 与命令行校验用)。 */
|
|
26
|
+
export const TOOLS_PRESET_INPUTS = [
|
|
27
|
+
...TOOLS_PRESETS_STRICT_FIRST,
|
|
19
28
|
"codemode",
|
|
20
29
|
];
|
|
30
|
+
export function canonicalPreset(name) {
|
|
31
|
+
if (name === undefined)
|
|
32
|
+
return undefined;
|
|
33
|
+
return Object.hasOwn(TOOLS_PRESET_ALIASES, name)
|
|
34
|
+
? TOOLS_PRESET_ALIASES[name]
|
|
35
|
+
: name;
|
|
36
|
+
}
|
|
21
37
|
export const CODEMODE_MODES = ["off", "on", "only"];
|
|
22
38
|
export const CACHE_RETENTIONS = ["none", "short", "long"];
|
|
23
39
|
export const DEFAULT_CACHE_CONFIG = Object.freeze({
|
|
@@ -13,7 +13,7 @@ import { AgentSessionImpl } from "../agent/session.js";
|
|
|
13
13
|
import { WARMING_MODES } from "../ai/cache/types.js";
|
|
14
14
|
import { THINKING_LEVELS } from "../ai/thinking.js";
|
|
15
15
|
import { AmaError } from "../errors.js";
|
|
16
|
-
import {
|
|
16
|
+
import { PERMISSION_MODE_ORDER, parsePermissionMode, permissionModeLabel, } from "../permissions/modes.js";
|
|
17
17
|
import { describeCache, describeFingerprint, describeSession } from "./session-report.js";
|
|
18
18
|
export { describeSession } from "./session-report.js";
|
|
19
19
|
export const BUILTIN_COMMANDS = [
|
|
@@ -133,11 +133,12 @@ export async function runSlashCommand(line, ctx) {
|
|
|
133
133
|
case "permission": {
|
|
134
134
|
if (args === "")
|
|
135
135
|
return { kind: "pick", what: "permission" };
|
|
136
|
-
|
|
137
|
-
|
|
136
|
+
const mode = parsePermissionMode(args);
|
|
137
|
+
if (mode === undefined) {
|
|
138
|
+
throw new AmaError("invalid_arguments", `权限模式应为 ${PERMISSION_MODE_ORDER.join(" | ")}(也可写显示名,如 "Accept edits")`);
|
|
138
139
|
}
|
|
139
|
-
session.setPermissionMode(
|
|
140
|
-
return { kind: "handled", message: `权限模式:${
|
|
140
|
+
session.setPermissionMode(mode);
|
|
141
|
+
return { kind: "handled", message: `权限模式:${permissionModeLabel(mode)}` };
|
|
141
142
|
}
|
|
142
143
|
case "tools": {
|
|
143
144
|
if (args !== "")
|
|
@@ -7,7 +7,11 @@
|
|
|
7
7
|
* - 执行前预览(W3-B9a-2,`request.preview`):输入摘要之后列出会碰到的路径与规模,danger 红、
|
|
8
8
|
* warn 黄、info 暗色;`other` 类预览与输入摘要重复,不显示;
|
|
9
9
|
* - 原因:mode(当前权限模式需要确认)/ dangerous / hook + Hook 给的文本;
|
|
10
|
-
* -
|
|
10
|
+
* - 选项(终端界面视觉设计 v1 §3.11):编号列表 `1. 允许 y` / `2. 本会话允许同类 a` / `3. 拒绝 n Esc`,
|
|
11
|
+
* 选中行 `›` + selection 底色;缺省选中:危险命令 → 拒绝,其余 → 允许。按键 `y / a / n / Esc / Ctrl+C /
|
|
12
|
+
* 1 2 3 / ↑↓ Enter / v` 都有效;
|
|
13
|
+
* - 标题按原因:需要确认 / 危险命令 / Hook 要求确认(子 Agent 发起前缀 `[task] `);边框颜色随预览严重度
|
|
14
|
+
* (danger error、warn warning);宽 < 56 时紧凑:工具名单独一行、去掉空行、按键提示缩短;
|
|
11
15
|
* - 超时与中断:broker 链在超时(缺省 10 分钟)或运行被中断时 abort `signal`,对话框关闭并返回
|
|
12
16
|
* undefined(链按 deny 处理),消息区留一行说明。
|
|
13
17
|
*
|
|
@@ -29,13 +33,24 @@ export interface ApprovalHost {
|
|
|
29
33
|
/** 结果说明(消息区一行)。 */
|
|
30
34
|
report?(request: ApprovalRequest, outcome: ApprovalDecision | "cancelled"): void;
|
|
31
35
|
}
|
|
32
|
-
|
|
33
|
-
export declare function describeRequest(request: ApprovalRequest, theme: Theme, options?: {
|
|
36
|
+
export interface DescribeOptions {
|
|
34
37
|
cwd?: string;
|
|
35
38
|
permissionMode?: string;
|
|
36
39
|
expanded?: boolean;
|
|
37
|
-
|
|
38
|
-
|
|
40
|
+
/** 紧凑(窄屏):首行只放工具名(原因已在标题上)。 */
|
|
41
|
+
compact?: boolean;
|
|
42
|
+
}
|
|
43
|
+
/** 原因 → 标题文字(子 Agent 发起加 `[task] `)。 */
|
|
44
|
+
export declare function approvalTitle(request: ApprovalRequest): string;
|
|
45
|
+
/** 对话框正文(不含选项与按键行)。 */
|
|
46
|
+
export declare function describeRequest(request: ApprovalRequest, theme: Theme, options?: DescribeOptions): string[];
|
|
47
|
+
interface ApprovalOption {
|
|
48
|
+
decision: ApprovalDecision;
|
|
49
|
+
label: string;
|
|
50
|
+
/** 右侧按键提示。 */
|
|
51
|
+
keys: string;
|
|
52
|
+
}
|
|
53
|
+
export declare const APPROVAL_OPTIONS: readonly ApprovalOption[];
|
|
39
54
|
/** UI broker:每个请求开一个底部覆盖层,等用户按键或 signal abort。 */
|
|
40
55
|
export declare class ApprovalDialogBroker implements ApprovalBroker {
|
|
41
56
|
private readonly host;
|
|
@@ -46,3 +61,4 @@ export declare class ApprovalDialogBroker implements ApprovalBroker {
|
|
|
46
61
|
}
|
|
47
62
|
/** 结果的一行说明(消息区)。 */
|
|
48
63
|
export declare function approvalOutcomeText(request: ApprovalRequest, outcome: ApprovalDecision | "cancelled"): string;
|
|
64
|
+
export {};
|