@te-river/opencode-team-mode 1.6.1 → 1.7.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/README.md +117 -118
- package/README.zh-CN.md +98 -100
- package/dist/agents.d.ts.map +1 -1
- package/dist/agents.js +89 -79
- package/dist/agents.js.map +1 -1
- package/dist/approval-gate.d.ts +8 -9
- package/dist/approval-gate.d.ts.map +1 -1
- package/dist/approval-gate.js +13 -14
- package/dist/approval-gate.js.map +1 -1
- package/dist/capabilities.d.ts +11 -37
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +11 -141
- package/dist/capabilities.js.map +1 -1
- package/dist/commands.js +1 -1
- package/dist/envprotect/hook.d.ts +12 -31
- package/dist/envprotect/hook.d.ts.map +1 -1
- package/dist/envprotect/hook.js +13 -91
- package/dist/envprotect/hook.js.map +1 -1
- package/dist/envprotect/patterns.d.ts +6 -4
- package/dist/envprotect/patterns.d.ts.map +1 -1
- package/dist/envprotect/patterns.js +6 -4
- package/dist/envprotect/patterns.js.map +1 -1
- package/dist/envprotect.d.ts +1 -1
- package/dist/envprotect.d.ts.map +1 -1
- package/dist/envprotect.js +1 -1
- package/dist/envprotect.js.map +1 -1
- package/dist/host/note.d.ts.map +1 -1
- package/dist/host/note.js +8 -5
- package/dist/host/note.js.map +1 -1
- package/dist/host/v2-browser-gate.d.ts +19 -1
- package/dist/host/v2-browser-gate.d.ts.map +1 -1
- package/dist/host/v2-browser-gate.js +47 -6
- package/dist/host/v2-browser-gate.js.map +1 -1
- package/dist/host/v2-capabilities.d.ts +43 -0
- package/dist/host/v2-capabilities.d.ts.map +1 -1
- package/dist/host/v2-capabilities.js +77 -1
- package/dist/host/v2-capabilities.js.map +1 -1
- package/dist/host/v2-compaction.d.ts +129 -0
- package/dist/host/v2-compaction.d.ts.map +1 -0
- package/dist/host/v2-compaction.js +346 -0
- package/dist/host/v2-compaction.js.map +1 -0
- package/dist/host/v2-default-agent.d.ts +37 -0
- package/dist/host/v2-default-agent.d.ts.map +1 -0
- package/dist/host/v2-default-agent.js +128 -0
- package/dist/host/v2-default-agent.js.map +1 -0
- package/dist/host/v2-events.d.ts +2 -0
- package/dist/host/v2-events.d.ts.map +1 -1
- package/dist/host/v2-events.js +27 -0
- package/dist/host/v2-events.js.map +1 -1
- package/dist/host/v2-guard.d.ts +178 -0
- package/dist/host/v2-guard.d.ts.map +1 -1
- package/dist/host/v2-guard.js +324 -8
- package/dist/host/v2-guard.js.map +1 -1
- package/dist/host/v2-offload.d.ts +1 -1
- package/dist/host/v2-offload.js +2 -2
- package/dist/host/v2-permissions.d.ts +45 -44
- package/dist/host/v2-permissions.d.ts.map +1 -1
- package/dist/host/v2-permissions.js +48 -49
- package/dist/host/v2-permissions.js.map +1 -1
- package/dist/host/v2-probe-chain.d.ts +93 -0
- package/dist/host/v2-probe-chain.d.ts.map +1 -0
- package/dist/host/v2-probe-chain.js +146 -0
- package/dist/host/v2-probe-chain.js.map +1 -0
- package/dist/host/v2-prune.d.ts +157 -0
- package/dist/host/v2-prune.d.ts.map +1 -0
- package/dist/host/v2-prune.js +507 -0
- package/dist/host/v2-prune.js.map +1 -0
- package/dist/host/v2-retry.d.ts +143 -0
- package/dist/host/v2-retry.d.ts.map +1 -0
- package/dist/host/v2-retry.js +315 -0
- package/dist/host/v2-retry.js.map +1 -0
- package/dist/host/v2-scope.d.ts.map +1 -1
- package/dist/host/v2-scope.js +14 -7
- package/dist/host/v2-scope.js.map +1 -1
- package/dist/host/v2-session-client.d.ts +62 -7
- package/dist/host/v2-session-client.d.ts.map +1 -1
- package/dist/host/v2-session-client.js +485 -26
- package/dist/host/v2-session-client.js.map +1 -1
- package/dist/host/v2-session.d.ts +72 -1
- package/dist/host/v2-session.d.ts.map +1 -1
- package/dist/host/v2-session.js +154 -10
- package/dist/host/v2-session.js.map +1 -1
- package/dist/host/v2-tool.d.ts +2 -3
- package/dist/host/v2-tool.d.ts.map +1 -1
- package/dist/host/v2-tool.js +2 -3
- package/dist/host/v2-tool.js.map +1 -1
- package/dist/host/v2-types.d.ts +25 -0
- package/dist/host/v2-types.d.ts.map +1 -1
- package/dist/host/v2.d.ts +14 -12
- package/dist/host/v2.d.ts.map +1 -1
- package/dist/host/v2.js +648 -74
- package/dist/host/v2.js.map +1 -1
- package/dist/identity.d.ts +27 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +34 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +9 -24
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -27
- package/dist/index.js.map +1 -1
- package/dist/prompts/lead.d.ts +1 -1
- package/dist/prompts/lead.d.ts.map +1 -1
- package/dist/prompts/lead.js +44 -27
- package/dist/prompts/lead.js.map +1 -1
- package/dist/prompts/shared.d.ts +2 -2
- package/dist/prompts/shared.d.ts.map +1 -1
- package/dist/prompts/shared.js +74 -57
- package/dist/prompts/shared.js.map +1 -1
- package/dist/prompts/specialists.d.ts +2 -2
- package/dist/prompts/specialists.d.ts.map +1 -1
- package/dist/prompts/specialists.js +53 -83
- package/dist/prompts/specialists.js.map +1 -1
- package/dist/tm/args-schema.d.ts +7 -32
- package/dist/tm/args-schema.d.ts.map +1 -1
- package/dist/tm/args-schema.js +12 -153
- package/dist/tm/args-schema.js.map +1 -1
- package/dist/tm/board.d.ts +10 -9
- package/dist/tm/board.d.ts.map +1 -1
- package/dist/tm/board.js +11 -10
- package/dist/tm/board.js.map +1 -1
- package/dist/tm/config-files.d.ts +81 -0
- package/dist/tm/config-files.d.ts.map +1 -0
- package/dist/tm/config-files.js +209 -0
- package/dist/tm/config-files.js.map +1 -0
- package/dist/tm/config-layers.d.ts +117 -0
- package/dist/tm/config-layers.d.ts.map +1 -0
- package/dist/tm/config-layers.js +320 -0
- package/dist/tm/config-layers.js.map +1 -0
- package/dist/tm/config.d.ts +10 -101
- package/dist/tm/config.d.ts.map +1 -1
- package/dist/tm/config.js +17 -71
- package/dist/tm/config.js.map +1 -1
- package/dist/tm/dispatch.d.ts +154 -22
- package/dist/tm/dispatch.d.ts.map +1 -1
- package/dist/tm/dispatch.js +559 -80
- package/dist/tm/dispatch.js.map +1 -1
- package/dist/tm/egress.d.ts +19 -7
- package/dist/tm/egress.d.ts.map +1 -1
- package/dist/tm/egress.js +21 -9
- package/dist/tm/egress.js.map +1 -1
- package/dist/tm/index.d.ts +23 -20
- package/dist/tm/index.d.ts.map +1 -1
- package/dist/tm/index.js +117 -116
- package/dist/tm/index.js.map +1 -1
- package/dist/tm/ledger.d.ts +9 -2
- package/dist/tm/ledger.d.ts.map +1 -1
- package/dist/tm/ledger.js +4 -1
- package/dist/tm/ledger.js.map +1 -1
- package/dist/tm/perm-ask.d.ts +3 -3
- package/dist/tm/perm-ask.d.ts.map +1 -1
- package/dist/tm/perm-ask.js +3 -3
- package/dist/tm/perm-ask.js.map +1 -1
- package/dist/tm/pipelines.d.ts +12 -11
- package/dist/tm/pipelines.d.ts.map +1 -1
- package/dist/tm/pipelines.js +40 -207
- package/dist/tm/pipelines.js.map +1 -1
- package/dist/tm/preview.d.ts +1 -1
- package/dist/tm/preview.js +3 -3
- package/dist/tm/preview.js.map +1 -1
- package/dist/tm/refs.d.ts +31 -4
- package/dist/tm/refs.d.ts.map +1 -1
- package/dist/tm/refs.js +48 -4
- package/dist/tm/refs.js.map +1 -1
- package/dist/tm/result.d.ts +1 -1
- package/dist/tm/result.d.ts.map +1 -1
- package/dist/tm/result.js +4 -3
- package/dist/tm/result.js.map +1 -1
- package/dist/tm/search.d.ts +2 -2
- package/dist/tm/search.js +7 -7
- package/dist/tm/search.js.map +1 -1
- package/dist/tm/serp-loop.d.ts +19 -7
- package/dist/tm/serp-loop.d.ts.map +1 -1
- package/dist/tm/serp-loop.js +24 -9
- package/dist/tm/serp-loop.js.map +1 -1
- package/dist/tm/stats.d.ts +31 -27
- package/dist/tm/stats.d.ts.map +1 -1
- package/dist/tm/stats.js +170 -58
- package/dist/tm/stats.js.map +1 -1
- package/dist/tm/store.d.ts +18 -5
- package/dist/tm/store.d.ts.map +1 -1
- package/dist/tm/store.js +39 -9
- package/dist/tm/store.js.map +1 -1
- package/dist/tm/tools.d.ts +7 -5
- package/dist/tm/tools.d.ts.map +1 -1
- package/dist/tm/tools.js +10 -41
- package/dist/tm/tools.js.map +1 -1
- package/dist/tm/webfetch.d.ts +1 -1
- package/dist/tm/webfetch.d.ts.map +1 -1
- package/dist/tm/webfetch.js +38 -23
- package/dist/tm/webfetch.js.map +1 -1
- package/dist/types.d.ts +40 -123
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +7 -21
- package/dist/types.js.map +1 -1
- package/docs/installation-v2.md +124 -39
- package/docs/installation.md +9 -0
- package/docs/research/browser-pane.md +5 -0
- package/docs/v2-port-notes.md +500 -315
- package/package.json +1 -1
- package/scripts/gen-v2-config.mjs +246 -94
- package/scripts/lib/fake-ctx.mjs +244 -146
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layered `team-mode` configuration — the PURE layer (package ①, 2026-10-06).
|
|
3
|
+
*
|
|
4
|
+
* Two file layers only, per the user's decision (2026-10-06): the host's own
|
|
5
|
+
* config has NO session layer (opencode.ai/v2/docs/config), so neither do we.
|
|
6
|
+
*
|
|
7
|
+
* env < global < project
|
|
8
|
+
*
|
|
9
|
+
* A file WINS over env for the same key. Within the project layer the
|
|
10
|
+
* `.opencode/` file wins over the direct one, mirroring the host's own
|
|
11
|
+
* discovery order (direct files merged farthest→closest, then `.opencode/`
|
|
12
|
+
* dirs in the same order — every discovered `.opencode` config overrides
|
|
13
|
+
* every direct config).
|
|
14
|
+
*
|
|
15
|
+
* This module is deliberately IO-free: it takes raw JSONC text (or null when
|
|
16
|
+
* a file does not exist) and returns a resolved view. Reading the files,
|
|
17
|
+
* the scope gate and the trajectory line are package ②'s job.
|
|
18
|
+
*
|
|
19
|
+
* Three rules the design pins, each implemented here:
|
|
20
|
+
* - a layer that fails to PARSE is skipped WHOLE and reported — never a
|
|
21
|
+
* half-applied config (a syntax error in a project file must not take the
|
|
22
|
+
* global layer down with it, and must not apply "the keys that happened to
|
|
23
|
+
* parse");
|
|
24
|
+
* - a single key with the WRONG TYPE is dropped from that layer only, and
|
|
25
|
+
* the next layer down answers for it;
|
|
26
|
+
* - a RED-LINE key written in a file is IGNORED outright and always resolves
|
|
27
|
+
* from env/default (see RED_LINE_EXEMPT_KEYS).
|
|
28
|
+
*/
|
|
29
|
+
/**
|
|
30
|
+
* The honored-key registry. Extend it when a new knob is wired — an
|
|
31
|
+
* unlisted real knob would be reported as "unknown", a false positive.
|
|
32
|
+
*
|
|
33
|
+
* The first block mirrors `resolveTmConfig` (src/tm/config.ts) one-for-one;
|
|
34
|
+
* the red-line block adds the three knobs that live OUTSIDE TmConfig
|
|
35
|
+
* (envProtect / r6FineAsk / privateSpace) plus the four the design names as
|
|
36
|
+
* file-overridable but that are read directly from process.env.
|
|
37
|
+
*/
|
|
38
|
+
export const CONFIG_KEYS = [
|
|
39
|
+
// ---- resolveTmConfig surface (src/tm/config.ts:379) ----
|
|
40
|
+
{ key: "offloadThreshold", env: "TM_OFFLOAD_THRESHOLD", type: "number" },
|
|
41
|
+
{ key: "previewLines", env: "TM_PREVIEW_LINES", type: "number" },
|
|
42
|
+
{ key: "previewMaxTokens", env: "TM_PREVIEW_MAX_TOKENS", type: "number" },
|
|
43
|
+
{ key: "fetchMaxLines", env: "TM_FETCH_MAX_LINES", type: "number" },
|
|
44
|
+
{ key: "blackboardDir", env: "TM_BLACKBOARD_DIR", type: "string" },
|
|
45
|
+
{ key: "trajectoryDir", env: "TM_TRAJECTORY_DIR", type: "string" },
|
|
46
|
+
{ key: "blackboardTtlDays", env: "TM_BLACKBOARD_TTL", type: "number" },
|
|
47
|
+
{ key: "bashReadonlyAllowed", env: "TM_BASH_READONLY_ALLOWED", type: "string[]" },
|
|
48
|
+
{ key: "webfetchAllowedDomains", env: "TM_WEBFETCH_ALLOWED_DOMAINS", type: "string[]" },
|
|
49
|
+
{ key: "memoryGlobalDir", env: "TM_MEMORY_GLOBAL_DIR", type: "string" },
|
|
50
|
+
{ key: "memorySessionTtlMin", env: "TM_MEMORY_SESSION_TTL_MIN", type: "number" },
|
|
51
|
+
{ key: "memoryMaxEntries", env: "TM_MEMORY_MAX_ENTRIES", type: "number" },
|
|
52
|
+
{ key: "memoryStaleDays", env: "TM_MEMORY_STALE_DAYS", type: "number" },
|
|
53
|
+
{ key: "memorySessionPersist", env: "TM_MEMORY_SESSION_PERSIST", type: "string" },
|
|
54
|
+
{ key: "searchDefaultEngine", env: "TM_SEARCH_DEFAULT_ENGINE", type: "string" },
|
|
55
|
+
{ key: "searchMaxHits", env: "TM_SEARCH_MAX_HITS", type: "number" },
|
|
56
|
+
{ key: "searchWeights", env: "TM_SEARCH_WEIGHTS", type: "record" },
|
|
57
|
+
{ key: "searchDisabledEngines", env: "TM_SEARCH_DISABLED_ENGINES", type: "string[]" },
|
|
58
|
+
{ key: "searchRelevanceFloor", env: "TM_SEARCH_RELEVANCE_FLOOR", type: "number" },
|
|
59
|
+
{ key: "offloadThresholdText", env: "TM_OFFLOAD_THRESHOLD_TEXT", type: "number" },
|
|
60
|
+
{ key: "offloadThresholdData", env: "TM_OFFLOAD_THRESHOLD_DATA", type: "number" },
|
|
61
|
+
{ key: "webCacheTtlSec", env: "TM_WEB_CACHE_TTL_SEC", type: "number" },
|
|
62
|
+
{ key: "joinMaxWaitMs", env: "TM_JOIN_MAX_WAIT_MS", type: "number" },
|
|
63
|
+
{ key: "boardMaxChars", env: "TM_BOARD_MAX_CHARS", type: "number" },
|
|
64
|
+
{ key: "boardMaxFiles", env: "TM_BOARD_MAX_FILES", type: "number" },
|
|
65
|
+
{ key: "taskOffload", env: "TM_TASK_OFFLOAD", type: "string" },
|
|
66
|
+
{ key: "storeReclaim", env: "TM_STORE_RECLAIM", type: "string" },
|
|
67
|
+
{ key: "askTimeoutFloorMin", env: "TM_ASK_TIMEOUT_FLOOR_MIN", type: "number" },
|
|
68
|
+
{ key: "bashTimeoutMaxMs", env: "TM_BASH_TIMEOUT_MAX_MS", type: "number" },
|
|
69
|
+
{ key: "bashTimeoutProbeMs", env: "TM_BASH_TIMEOUT_PROBE_MS", type: "number" },
|
|
70
|
+
// ---- knobs read directly from process.env (design §4 names them file-overridable) ----
|
|
71
|
+
{ key: "nativeOffload", env: "TM_NATIVE_OFFLOAD", type: "string" },
|
|
72
|
+
{ key: "compactTrigger", env: "TM_COMPACT_TRIGGER", type: "string" },
|
|
73
|
+
{ key: "compactAtPercent", env: "TM_COMPACT_AT_PERCENT", type: "number" },
|
|
74
|
+
{ key: "compactMinMs", env: "TM_COMPACT_MIN_MS", type: "number" },
|
|
75
|
+
{ key: "ptcWebBridge", env: "TM_PTC_WEB_BRIDGE", type: "string" },
|
|
76
|
+
{ key: "hitBlacklist", env: "TM_HIT_BLACKLIST", type: "string[]" },
|
|
77
|
+
{ key: "envProtectExtraDeny", env: "TM_ENV_PROTECT_EXTRA_DENY", type: "string" },
|
|
78
|
+
{ key: "shellEnv", env: "TM_SHELL_ENV", type: "string" },
|
|
79
|
+
{ key: "agentTemperature", env: "TM_AGENT_TEMPERATURE", type: "string" },
|
|
80
|
+
{ key: "compactionContext", env: "TM_COMPACTION_CONTEXT", type: "string" },
|
|
81
|
+
// ---- RED-LINE knobs: a file value is ignored, always env/default ----
|
|
82
|
+
{
|
|
83
|
+
key: "envProtect",
|
|
84
|
+
env: "TM_ENV_PROTECT",
|
|
85
|
+
type: "string",
|
|
86
|
+
redLine: true,
|
|
87
|
+
redLineReason: "R6 判定模式,off 即关掉环境防护;项目文件可被提交共享,不得关掉红线",
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
key: "r6FineAsk",
|
|
91
|
+
env: "TM_R6_FINE_ASK",
|
|
92
|
+
type: "string",
|
|
93
|
+
redLine: true,
|
|
94
|
+
redLineReason: "R6 ask 策略,决定每条命令是否走细粒度判定;文件不得放宽",
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
key: "privateSpace",
|
|
98
|
+
env: "TM_PRIVATE_SPACE",
|
|
99
|
+
type: "string",
|
|
100
|
+
redLine: true,
|
|
101
|
+
redLineReason: "地址红线门,allow 会放开整段私网;文件不得放宽",
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
key: "webfetchAllowedDomains",
|
|
105
|
+
env: "TM_WEBFETCH_ALLOWED_DOMAINS",
|
|
106
|
+
type: "string[]",
|
|
107
|
+
redLine: true,
|
|
108
|
+
redLineReason: "网络出网白名单;项目文件可被提交共享,不得放宽",
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
key: "bashReadonlyAllowed",
|
|
112
|
+
env: "TM_BASH_READONLY_ALLOWED",
|
|
113
|
+
type: "string[]",
|
|
114
|
+
redLine: true,
|
|
115
|
+
redLineReason: "P3 只读门;放宽即扩大可执行命令面",
|
|
116
|
+
},
|
|
117
|
+
];
|
|
118
|
+
/** The red-line keys, derived from the registry (single source of truth). */
|
|
119
|
+
export const RED_LINE_EXEMPT_KEYS = CONFIG_KEYS.filter((k) => k.redLine).map((k) => k.key);
|
|
120
|
+
const KEY_BY_NAME = new Map(CONFIG_KEYS.map((k) => [k.key, k]));
|
|
121
|
+
// ---------------------------------------------------------------------------
|
|
122
|
+
// JSONC
|
|
123
|
+
// ---------------------------------------------------------------------------
|
|
124
|
+
/**
|
|
125
|
+
* Mask `//` and block comments to spaces at IDENTICAL offsets, so a
|
|
126
|
+
* commented-out key can never be mistaken for a live one. String contents
|
|
127
|
+
* (including a `//` inside a string) are preserved byte-for-byte. Ported
|
|
128
|
+
* from scripts/lib/config-surgery.cjs:19 — deliberately re-implemented here
|
|
129
|
+
* rather than imported, so the pure layer carries no CJS dependency.
|
|
130
|
+
*/
|
|
131
|
+
export function maskJsoncComments(src) {
|
|
132
|
+
let out = "";
|
|
133
|
+
let i = 0;
|
|
134
|
+
let inStr = false;
|
|
135
|
+
let esc = false;
|
|
136
|
+
while (i < src.length) {
|
|
137
|
+
const c = src[i];
|
|
138
|
+
if (inStr) {
|
|
139
|
+
out += c;
|
|
140
|
+
if (esc)
|
|
141
|
+
esc = false;
|
|
142
|
+
else if (c === "\\")
|
|
143
|
+
esc = true;
|
|
144
|
+
else if (c === '"')
|
|
145
|
+
inStr = false;
|
|
146
|
+
i++;
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
if (c === '"') {
|
|
150
|
+
inStr = true;
|
|
151
|
+
out += c;
|
|
152
|
+
i++;
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
if (c === "/" && src[i + 1] === "/") {
|
|
156
|
+
while (i < src.length && src[i] !== "\n") {
|
|
157
|
+
out += " ";
|
|
158
|
+
i++;
|
|
159
|
+
}
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
if (c === "/" && src[i + 1] === "*") {
|
|
163
|
+
while (i < src.length && !(src[i] === "*" && src[i + 1] === "/")) {
|
|
164
|
+
out += src[i] === "\n" ? "\n" : " ";
|
|
165
|
+
i++;
|
|
166
|
+
}
|
|
167
|
+
out += " ";
|
|
168
|
+
i += 2;
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
out += c;
|
|
172
|
+
i++;
|
|
173
|
+
}
|
|
174
|
+
return out;
|
|
175
|
+
}
|
|
176
|
+
/** Drop a comma that is followed (past whitespace) by `}` or `]`, outside
|
|
177
|
+
* strings. The host tolerates a trailing comma; JSON.parse does not. */
|
|
178
|
+
function stripTrailingCommas(masked) {
|
|
179
|
+
let out = "";
|
|
180
|
+
let i = 0;
|
|
181
|
+
let inStr = false;
|
|
182
|
+
let esc = false;
|
|
183
|
+
while (i < masked.length) {
|
|
184
|
+
const c = masked[i];
|
|
185
|
+
if (inStr) {
|
|
186
|
+
out += c;
|
|
187
|
+
if (esc)
|
|
188
|
+
esc = false;
|
|
189
|
+
else if (c === "\\")
|
|
190
|
+
esc = true;
|
|
191
|
+
else if (c === '"')
|
|
192
|
+
inStr = false;
|
|
193
|
+
i++;
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
if (c === '"') {
|
|
197
|
+
inStr = true;
|
|
198
|
+
out += c;
|
|
199
|
+
i++;
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
if (c === ",") {
|
|
203
|
+
let j = i + 1;
|
|
204
|
+
while (j < masked.length && /\s/.test(masked[j]))
|
|
205
|
+
j++;
|
|
206
|
+
if (masked[j] === "}" || masked[j] === "]") {
|
|
207
|
+
i++; // drop the trailing comma
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
out += c;
|
|
212
|
+
i++;
|
|
213
|
+
}
|
|
214
|
+
return out;
|
|
215
|
+
}
|
|
216
|
+
/** Parse JSONC (comments + trailing commas) into a value. Throws on a real
|
|
217
|
+
* syntax error — the caller turns that into a whole-layer skip. */
|
|
218
|
+
export function parseJsonc(src) {
|
|
219
|
+
return JSON.parse(stripTrailingCommas(maskJsoncComments(src)));
|
|
220
|
+
}
|
|
221
|
+
// ---------------------------------------------------------------------------
|
|
222
|
+
// Merge
|
|
223
|
+
// ---------------------------------------------------------------------------
|
|
224
|
+
function isPlainObject(v) {
|
|
225
|
+
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
226
|
+
}
|
|
227
|
+
function typeOk(type, v) {
|
|
228
|
+
switch (type) {
|
|
229
|
+
case "number":
|
|
230
|
+
return typeof v === "number" && Number.isFinite(v);
|
|
231
|
+
case "string":
|
|
232
|
+
return typeof v === "string";
|
|
233
|
+
case "string[]":
|
|
234
|
+
return Array.isArray(v) && v.every((x) => typeof x === "string");
|
|
235
|
+
case "record":
|
|
236
|
+
return isPlainObject(v) && Object.values(v).every((x) => typeof x === "number");
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
/** `TM_CONFIG_ENV_ONLY` is truthy on 1/true/on/yes (case-insensitive). */
|
|
240
|
+
function envOnlyFromEnv(env) {
|
|
241
|
+
const raw = env.TM_CONFIG_ENV_ONLY;
|
|
242
|
+
return typeof raw === "string" && /^(1|true|on|yes)$/i.test(raw.trim());
|
|
243
|
+
}
|
|
244
|
+
function projectLayerList(projectLayer) {
|
|
245
|
+
if (projectLayer == null)
|
|
246
|
+
return [];
|
|
247
|
+
const texts = Array.isArray(projectLayer) ? projectLayer : [projectLayer];
|
|
248
|
+
const out = [];
|
|
249
|
+
texts.forEach((text, i) => {
|
|
250
|
+
if (typeof text !== "string")
|
|
251
|
+
return;
|
|
252
|
+
out.push({ name: i === 0 ? "project" : "project:.opencode", text });
|
|
253
|
+
});
|
|
254
|
+
return out;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Resolve the layered config. Pure: no IO, no globals read except the `env`
|
|
258
|
+
* record handed in. See the module header for the three rules.
|
|
259
|
+
*/
|
|
260
|
+
export function resolveLayeredConfig(input) {
|
|
261
|
+
const { env } = input;
|
|
262
|
+
const exempt = new Set(input.exempt ?? RED_LINE_EXEMPT_KEYS);
|
|
263
|
+
const envOnlyActive = input.envOnly ?? envOnlyFromEnv(env);
|
|
264
|
+
// Ordered low→high. envOnly removes every file layer BEFORE any parse.
|
|
265
|
+
const fileLayers = [];
|
|
266
|
+
if (!envOnlyActive) {
|
|
267
|
+
if (typeof input.globalLayer === "string")
|
|
268
|
+
fileLayers.push({ name: "global", text: input.globalLayer });
|
|
269
|
+
fileLayers.push(...projectLayerList(input.projectLayer));
|
|
270
|
+
}
|
|
271
|
+
const skippedLayers = [];
|
|
272
|
+
const ignoredRedLineKeys = [];
|
|
273
|
+
const unknownKeys = [];
|
|
274
|
+
// key -> {value, source}; later layers overwrite earlier ones.
|
|
275
|
+
const fileValues = new Map();
|
|
276
|
+
for (const layer of fileLayers) {
|
|
277
|
+
let obj;
|
|
278
|
+
try {
|
|
279
|
+
obj = parseJsonc(layer.text);
|
|
280
|
+
}
|
|
281
|
+
catch (e) {
|
|
282
|
+
skippedLayers.push({ name: layer.name, reason: e instanceof Error ? e.message : String(e) });
|
|
283
|
+
continue;
|
|
284
|
+
}
|
|
285
|
+
if (!isPlainObject(obj)) {
|
|
286
|
+
skippedLayers.push({ name: layer.name, reason: "顶层不是 JSON 对象" });
|
|
287
|
+
continue;
|
|
288
|
+
}
|
|
289
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
290
|
+
if (exempt.has(key)) {
|
|
291
|
+
ignoredRedLineKeys.push({ key, layer: layer.name, value });
|
|
292
|
+
continue;
|
|
293
|
+
}
|
|
294
|
+
const spec = KEY_BY_NAME.get(key);
|
|
295
|
+
if (!spec) {
|
|
296
|
+
unknownKeys.push({ key, layer: layer.name });
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
299
|
+
if (!typeOk(spec.type, value))
|
|
300
|
+
continue; // drop this key from THIS layer only
|
|
301
|
+
fileValues.set(key, { value, source: layer.name });
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
// env is the lowest layer; files override it.
|
|
305
|
+
const values = {};
|
|
306
|
+
const perKeySource = {};
|
|
307
|
+
for (const spec of CONFIG_KEYS) {
|
|
308
|
+
const raw = env[spec.env];
|
|
309
|
+
if (typeof raw === "string" && raw.trim() !== "") {
|
|
310
|
+
values[spec.key] = raw;
|
|
311
|
+
perKeySource[spec.key] = "env";
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
for (const [key, { value, source }] of fileValues) {
|
|
315
|
+
values[key] = value;
|
|
316
|
+
perKeySource[key] = source;
|
|
317
|
+
}
|
|
318
|
+
return { values, perKeySource, skippedLayers, ignoredRedLineKeys, unknownKeys, envOnlyActive };
|
|
319
|
+
}
|
|
320
|
+
//# sourceMappingURL=config-layers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-layers.js","sourceRoot":"","sources":["../../src/tm/config-layers.ts"],"names":[],"mappings":"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"}
|
package/dist/tm/config.d.ts
CHANGED
|
@@ -34,8 +34,8 @@ export declare const DEFAULT_BASH_READONLY_ALLOWED: readonly string[];
|
|
|
34
34
|
* agents bouncing off baike.baidu.com and mzh.moegirl.org.cn (the agent-install flow points
|
|
35
35
|
* agents at the installation guide on exactly these hosts). A site's OWN
|
|
36
36
|
* asset CDN on a brand-unrelated domain has to be seeded too — same-site
|
|
37
|
-
* cannot infer it, and blocking it is what makes
|
|
38
|
-
*
|
|
37
|
+
* cannot infer it, and blocking it is what makes a page render blank
|
|
38
|
+
* (bdimg.com below is that case, measured). Subdomains of
|
|
39
39
|
* an entry are included;
|
|
40
40
|
* TM_WEBFETCH_ALLOWED_DOMAINS overrides the list (comma/semicolon
|
|
41
41
|
* separated; a lone "*" opens every host — keep the engine hosts or
|
|
@@ -66,16 +66,6 @@ export interface TmConfig {
|
|
|
66
66
|
/** tm_memory GLOBAL scope dir. Empty = auto (~/.opencode-team/memories/global
|
|
67
67
|
* — user-level, follows the user across projects). */
|
|
68
68
|
memoryGlobalDir: string;
|
|
69
|
-
/** Hard cap on a PTC program source string length (chars). */
|
|
70
|
-
ptcMaxProgramChars: number;
|
|
71
|
-
/** Ceiling for per-run bridge-call budget (callers may only tighten). */
|
|
72
|
-
ptcMaxCalls: number;
|
|
73
|
-
/** Ceiling for per-run error budget (callers may only tighten). */
|
|
74
|
-
ptcMaxErrors: number;
|
|
75
|
-
/** Ceiling for per-run wall-clock timeout in ms (callers may only tighten). */
|
|
76
|
-
ptcTimeoutMs: number;
|
|
77
|
-
/** Engine selection: auto (worker→inline fallback) | worker | inline. */
|
|
78
|
-
ptcEngine: "auto" | "worker" | "inline";
|
|
79
69
|
/** tm_memory session-scope entry TTL in minutes (lazy + boot sweep).
|
|
80
70
|
* Consumed by memory.ts (T1). */
|
|
81
71
|
memorySessionTtlMin: number;
|
|
@@ -122,52 +112,6 @@ export interface TmConfig {
|
|
|
122
112
|
* explicit `TM_OFFLOAD_THRESHOLD_DATA` always wins. Consumed by
|
|
123
113
|
* pipelines.ts `offloadThresholdFor` (T4 tiering — now live). */
|
|
124
114
|
offloadThresholdData: number;
|
|
125
|
-
/** tm_browser engine: "playwright" (default; a failed playwright-core
|
|
126
|
-
* import degrades to legacy CDP at runtime) | "cdp-legacy".
|
|
127
|
-
* Consumed by browser.ts (T5). */
|
|
128
|
-
browserEngine: "playwright" | "cdp-legacy";
|
|
129
|
-
/** Hard cap (estimated tokens) for tm_browser snapshot payloads.
|
|
130
|
-
* Consumed by browser.ts (T5). */
|
|
131
|
-
browserSnapshotMaxTokens: number;
|
|
132
|
-
/** tm_browser SUBRESOURCE policy — what the in-page network gate does with
|
|
133
|
-
* everything a page pulls AFTER the navigation itself was allowed.
|
|
134
|
-
* Gating subresources by the CONTENT allowlist (the pre-v1.5.13 behavior)
|
|
135
|
-
* silently aborts every img/css/js the site serves from its own CDN, so
|
|
136
|
-
* pages render picture-less and the agent reports "no images".
|
|
137
|
-
* same-site (default) — passive types (image/media/font/stylesheet)
|
|
138
|
-
* always pass; an EXECUTABLE resource (script/xhr/fetch/document/…)
|
|
139
|
-
* passes only when its registrable site is one this session actually
|
|
140
|
-
* navigated to;
|
|
141
|
-
* passive — passive types pass, everything else stays on the allowlist;
|
|
142
|
-
* off — the legacy verbatim behavior (every request re-checked).
|
|
143
|
-
* Consumed by browser.ts. */
|
|
144
|
-
browserSubresource: "same-site" | "passive" | "off";
|
|
145
|
-
/** TM_BROWSER_ASK_EVAL (default on) — `evaluate_script` runs arbitrary JS in
|
|
146
|
-
* the user's OWN browser, which is the one verb the domain allowlist cannot
|
|
147
|
-
* cover: the allowlist limits where we NAVIGATE, not what a loaded page
|
|
148
|
-
* hands back (cookies, localStorage, any token in the DOM). So this verb
|
|
149
|
-
* asks the official dialog once per browser session, and refuses when the
|
|
150
|
-
* host gives us no ask bridge (tm_pty's rule). `off` restores the
|
|
151
|
-
* pre-v1.5.14 behaviour; result redaction is NOT switchable. */
|
|
152
|
-
browserAskEval: "on" | "off";
|
|
153
|
-
/** Ceiling on PNG bytes tm_browser will base64-inline as a tool-result
|
|
154
|
-
* attachment (an oversized screenshot stays path-only + says why).
|
|
155
|
-
* Consumed by browser.ts. */
|
|
156
|
-
browserImageMaxBytes: number;
|
|
157
|
-
/** Idle wall-clock after which tm_browser closes an untouched session on
|
|
158
|
-
* its own — the safety net for the "agent claims it closed the window but
|
|
159
|
-
* it is still on screen" class. 0 disables the reaper. Consumed by
|
|
160
|
-
* browser.ts. */
|
|
161
|
-
browserIdleCloseMs: number;
|
|
162
|
-
/** Ceiling on concurrent tm_pty sessions this plugin started (issue #6's
|
|
163
|
-
* async shell): each one is a real process the user approved, so the
|
|
164
|
-
* count is bounded rather than left to the model's enthusiasm.
|
|
165
|
-
* Consumed by pty.ts. */
|
|
166
|
-
ptyMax: number;
|
|
167
|
-
/** tm_ptc_run web bridge: "on" (default) exposes tm.search/tm.webfetch
|
|
168
|
-
* facades to PTC programs; "off" removes them from the bridge set.
|
|
169
|
-
* Consumed by ptc/* (T6). */
|
|
170
|
-
ptcWebBridge: "on" | "off";
|
|
171
115
|
/** TM_WEB_CACHE_TTL_SEC (default 300; 0 disables) — how long a governed
|
|
172
116
|
* fetch body may be re-served for the SAME URL. The web channel is the
|
|
173
117
|
* slowest thing the team does and the most duplicated (lead + researcher
|
|
@@ -186,7 +130,7 @@ export interface TmConfig {
|
|
|
186
130
|
joinMaxWaitMs: number;
|
|
187
131
|
/** tm_board_write: one board file's character cap and one session folder's file cap.
|
|
188
132
|
* The board is the ONLY oversized-deliverable channel, and the roles that
|
|
189
|
-
* need it most (architect / researcher) own no file tool
|
|
133
|
+
* need it most (architect / researcher) own no write-capable file tool, so the caps
|
|
190
134
|
* are what keeps a governed writer from becoming a disk leak. */
|
|
191
135
|
boardMaxChars: number;
|
|
192
136
|
boardMaxFiles: number;
|
|
@@ -204,25 +148,22 @@ export interface TmConfig {
|
|
|
204
148
|
* TTL-expired entries — never a live run. `off` keeps the disk as is; the
|
|
205
149
|
* test runner sets it so a suite cannot mutate the developer's real Temp. */
|
|
206
150
|
storeReclaim: "on" | "off";
|
|
207
|
-
/** Floor (minutes) for the approval-gate ask timeout.
|
|
208
|
-
* approval-gate.ts `resolveAskTimeoutMs
|
|
209
|
-
*
|
|
210
|
-
*
|
|
211
|
-
* DEFAULTED TO 1
|
|
212
|
-
* closed request is classified benign `already-closed` by T2's
|
|
213
|
-
* classifyReplyFailure, so the ~120s replied-event bus lag no longer
|
|
214
|
-
* forces a 3-min floor — an unanswered dialog auto-rejects after 1 min. */
|
|
151
|
+
/** Floor (minutes) for the (v1) approval-gate ask timeout. ORPHANED: its
|
|
152
|
+
* only consumer, approval-gate.ts `resolveAskTimeoutMs`, was deleted with
|
|
153
|
+
* the v1 personality (v2 raises no plugin dialog, so there is no timer to
|
|
154
|
+
* floor). The knob is still parsed so an existing config keeps resolving;
|
|
155
|
+
* nothing reads it. DEFAULTED TO 1. */
|
|
215
156
|
askTimeoutFloorMin: number;
|
|
216
157
|
/** Ceiling (ms) forced onto the built-in bash tool's `timeout` ARG through
|
|
217
158
|
* the official `tool.execute.before` hook. 0 (default) = no cap: a build
|
|
218
159
|
* or test run stays whatever the model asked for. Consumed by
|
|
219
|
-
*
|
|
160
|
+
* src/host/v2-guard.ts (applyV2ShellTimeoutClamp). */
|
|
220
161
|
bashTimeoutMaxMs: number;
|
|
221
162
|
/** Ceiling (ms) for a bash command that the P3 read-only allowlist already
|
|
222
163
|
* classifies as a pure probe (ls/grep/rg/cat/Get-ChildItem …). Those
|
|
223
164
|
* never legitimately need the host's 120 s default, and models routinely
|
|
224
165
|
* set 120000+ on them, so this one ships ENABLED. 0 disables.
|
|
225
|
-
* Consumed by
|
|
166
|
+
* Consumed by src/host/v2-guard.ts (applyV2ShellTimeoutClamp). */
|
|
226
167
|
bashTimeoutProbeMs: number;
|
|
227
168
|
}
|
|
228
169
|
export declare const TM_CONFIG_DEFAULTS: {
|
|
@@ -233,11 +174,6 @@ export declare const TM_CONFIG_DEFAULTS: {
|
|
|
233
174
|
readonly blackboardDir: "";
|
|
234
175
|
readonly trajectoryDir: "";
|
|
235
176
|
readonly blackboardTtlDays: 7;
|
|
236
|
-
readonly ptcMaxProgramChars: 4000;
|
|
237
|
-
readonly ptcMaxCalls: 20;
|
|
238
|
-
readonly ptcMaxErrors: 3;
|
|
239
|
-
readonly ptcTimeoutMs: 60000;
|
|
240
|
-
readonly ptcEngine: "auto";
|
|
241
177
|
readonly memorySessionTtlMin: 240;
|
|
242
178
|
readonly memoryMaxEntries: 200;
|
|
243
179
|
readonly memoryStaleDays: 30;
|
|
@@ -249,14 +185,6 @@ export declare const TM_CONFIG_DEFAULTS: {
|
|
|
249
185
|
readonly searchRelevanceFloor: 0.35;
|
|
250
186
|
readonly offloadThresholdText: 4000;
|
|
251
187
|
readonly offloadThresholdData: 2000;
|
|
252
|
-
readonly browserEngine: "playwright";
|
|
253
|
-
readonly browserSnapshotMaxTokens: 1200;
|
|
254
|
-
readonly browserSubresource: "same-site";
|
|
255
|
-
readonly browserAskEval: "on";
|
|
256
|
-
readonly browserImageMaxBytes: 400000;
|
|
257
|
-
readonly browserIdleCloseMs: 180000;
|
|
258
|
-
readonly ptyMax: 4;
|
|
259
|
-
readonly ptcWebBridge: "on";
|
|
260
188
|
readonly webCacheTtlSec: 300;
|
|
261
189
|
readonly joinMaxWaitMs: 60000;
|
|
262
190
|
readonly boardMaxChars: 200000;
|
|
@@ -267,25 +195,6 @@ export declare const TM_CONFIG_DEFAULTS: {
|
|
|
267
195
|
readonly bashTimeoutMaxMs: 0;
|
|
268
196
|
readonly bashTimeoutProbeMs: 60000;
|
|
269
197
|
};
|
|
270
|
-
/** Inclusive ceilings/floors for the PTC budgets (design §4.3). */
|
|
271
|
-
export declare const PTC_BUDGET_BOUNDS: {
|
|
272
|
-
readonly maxCalls: {
|
|
273
|
-
readonly min: 1;
|
|
274
|
-
readonly max: 200;
|
|
275
|
-
};
|
|
276
|
-
readonly maxErrors: {
|
|
277
|
-
readonly min: 1;
|
|
278
|
-
readonly max: 50;
|
|
279
|
-
};
|
|
280
|
-
readonly timeoutMs: {
|
|
281
|
-
readonly min: 5000;
|
|
282
|
-
readonly max: 600000;
|
|
283
|
-
};
|
|
284
|
-
readonly programChars: {
|
|
285
|
-
readonly min: 200;
|
|
286
|
-
readonly max: 200000;
|
|
287
|
-
};
|
|
288
|
-
};
|
|
289
198
|
type EnvLike = Record<string, string | undefined>;
|
|
290
199
|
/** TM_SEARCH_WEIGHTS — `bing=0.2,hn=0.3` into a partial weight table. A
|
|
291
200
|
* malformed pair is dropped (not the whole var), so one typo cannot silently
|
package/dist/tm/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/tm/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH;0EAC0E;AAC1E,eAAO,MAAM,6BAA6B,EAAE,SAAS,MAAM,EAa1D,CAAA;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,wBAAwB,EAAE,SAAS,MAAM,EA+BrD,CAAA;AAED,MAAM,WAAW,QAAQ;IACvB,6EAA6E;IAC7E,gBAAgB,EAAE,MAAM,CAAA;IACxB,+DAA+D;IAC/D,YAAY,EAAE,MAAM,CAAA;IACpB,gFAAgF;IAChF,gBAAgB,EAAE,MAAM,CAAA;IACxB,4CAA4C;IAC5C,aAAa,EAAE,MAAM,CAAA;IACrB;oFACgF;IAChF,aAAa,EAAE,MAAM,CAAA;IACrB;oFACgF;IAChF,aAAa,EAAE,MAAM,CAAA;IACrB,2EAA2E;IAC3E,iBAAiB,EAAE,MAAM,CAAA;IACzB,kDAAkD;IAClD,mBAAmB,EAAE,MAAM,EAAE,CAAA;IAC7B,0EAA0E;IAC1E,sBAAsB,EAAE,MAAM,EAAE,CAAA;IAChC;2DACuD;IACvD,eAAe,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/tm/config.ts"],"names":[],"mappings":"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"}
|