@router-agent/runtime 0.0.0-stage → 0.3.31
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/dist/agents/claude.d.ts +51 -0
- package/dist/agents/claude.js +270 -0
- package/dist/agents/claude.js.map +1 -0
- package/dist/agents/codex.d.ts +36 -0
- package/dist/agents/codex.js +292 -0
- package/dist/agents/codex.js.map +1 -0
- package/dist/agents/profile.d.ts +39 -0
- package/dist/agents/profile.js +2 -0
- package/dist/agents/profile.js.map +1 -0
- package/dist/agents/registry.d.ts +21 -0
- package/dist/agents/registry.js +78 -0
- package/dist/agents/registry.js.map +1 -0
- package/dist/errors.d.ts +4 -0
- package/dist/errors.js +9 -0
- package/dist/errors.js.map +1 -0
- package/dist/evidence-gate.d.ts +78 -0
- package/dist/evidence-gate.js +196 -0
- package/dist/evidence-gate.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/naming.d.ts +23 -0
- package/dist/naming.js +40 -0
- package/dist/naming.js.map +1 -0
- package/dist/orca/commands.js +60 -0
- package/dist/orca/commands.js.map +1 -0
- package/dist/orca/index.js +452 -0
- package/dist/orca/index.js.map +1 -0
- package/dist/orca/options.js +33 -0
- package/dist/orca/options.js.map +1 -0
- package/dist/orca/report-poller.js +143 -0
- package/dist/orca/report-poller.js.map +1 -0
- package/dist/permissions/acp.d.ts +21 -0
- package/dist/permissions/acp.js +73 -0
- package/dist/permissions/acp.js.map +1 -0
- package/dist/permissions.d.ts +1 -0
- package/dist/permissions.js +2 -0
- package/dist/permissions.js.map +1 -0
- package/dist/plugins/loader.d.ts +46 -0
- package/dist/plugins/loader.js +117 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/types.d.ts +52 -0
- package/dist/plugins/types.js +2 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/port.d.ts +295 -0
- package/dist/port.js +17 -0
- package/dist/port.js.map +1 -0
- package/dist/registry.d.ts +13 -0
- package/dist/registry.js +35 -0
- package/dist/registry.js.map +1 -0
- package/dist/report-poller.d.ts +58 -0
- package/dist/report-poller.js +130 -0
- package/dist/report-poller.js.map +1 -0
- package/dist/resume.d.ts +52 -0
- package/dist/resume.js +109 -0
- package/dist/resume.js.map +1 -0
- package/dist/runtimes/acp/admin.js +470 -0
- package/dist/runtimes/acp/admin.js.map +1 -0
- package/dist/runtimes/acp/agents.js +167 -0
- package/dist/runtimes/acp/agents.js.map +1 -0
- package/dist/runtimes/acp/detect.js +379 -0
- package/dist/runtimes/acp/detect.js.map +1 -0
- package/dist/runtimes/acp/index.js +633 -0
- package/dist/runtimes/acp/index.js.map +1 -0
- package/dist/runtimes/acp/install.js +264 -0
- package/dist/runtimes/acp/install.js.map +1 -0
- package/dist/runtimes/acp/permissions.js +83 -0
- package/dist/runtimes/acp/permissions.js.map +1 -0
- package/dist/runtimes/acp/protocol.js +207 -0
- package/dist/runtimes/acp/protocol.js.map +1 -0
- package/dist/runtimes/acp-agents.d.ts +85 -0
- package/dist/runtimes/acp-agents.js +167 -0
- package/dist/runtimes/acp-agents.js.map +1 -0
- package/dist/runtimes/acp-detect-utils.d.ts +4 -0
- package/dist/runtimes/acp-detect-utils.js +35 -0
- package/dist/runtimes/acp-detect-utils.js.map +1 -0
- package/dist/runtimes/builtin-options.d.ts +3 -0
- package/dist/runtimes/builtin-options.js +44 -0
- package/dist/runtimes/builtin-options.js.map +1 -0
- package/dist/runtimes/catalog.d.ts +31 -0
- package/dist/runtimes/catalog.js +75 -0
- package/dist/runtimes/catalog.js.map +1 -0
- package/dist/runtimes/claude-code/index.js +544 -0
- package/dist/runtimes/claude-code/index.js.map +1 -0
- package/dist/runtimes/claude-code/inject.js +71 -0
- package/dist/runtimes/claude-code/inject.js.map +1 -0
- package/dist/runtimes/codex/client.js +203 -0
- package/dist/runtimes/codex/client.js.map +1 -0
- package/dist/runtimes/codex/detect.js +240 -0
- package/dist/runtimes/codex/detect.js.map +1 -0
- package/dist/runtimes/codex/index.js +1066 -0
- package/dist/runtimes/codex/index.js.map +1 -0
- package/dist/runtimes/herdr/agents.js +38 -0
- package/dist/runtimes/herdr/agents.js.map +1 -0
- package/dist/runtimes/herdr/commands.js +68 -0
- package/dist/runtimes/herdr/commands.js.map +1 -0
- package/dist/runtimes/herdr/index.js +712 -0
- package/dist/runtimes/herdr/index.js.map +1 -0
- package/dist/runtimes/herdr/options.js +29 -0
- package/dist/runtimes/herdr/options.js.map +1 -0
- package/dist/runtimes/herdr/server.js +75 -0
- package/dist/runtimes/herdr/server.js.map +1 -0
- package/dist/runtimes/options.d.ts +60 -0
- package/dist/runtimes/options.js +89 -0
- package/dist/runtimes/options.js.map +1 -0
- package/dist/spec/contract.md +120 -0
- package/dist/spec/index.d.ts +35 -0
- package/dist/spec/index.js +59 -0
- package/dist/spec/index.js.map +1 -0
- package/dist/spec/prompt-mode.md +176 -0
- package/dist/spec/reader.d.ts +5 -0
- package/dist/spec/reader.js +32 -0
- package/dist/spec/reader.js.map +1 -0
- package/dist/status.d.ts +8 -0
- package/dist/status.js +22 -0
- package/dist/status.js.map +1 -0
- package/dist/workspaces/git-worktree.d.ts +44 -0
- package/dist/workspaces/git-worktree.js +183 -0
- package/dist/workspaces/git-worktree.js.map +1 -0
- package/dist/workspaces/overview.d.ts +66 -0
- package/dist/workspaces/overview.js +12 -0
- package/dist/workspaces/overview.js.map +1 -0
- package/package.json +36 -4
- package/README.md +0 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../../../packages/runtime/src/agents/codex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent 档案:与「谁在跑这个工单」有关的固有知识。
|
|
3
|
+
*
|
|
4
|
+
* 运行时(Orca / Claude Code / ACP …)只决定「在哪跑」,Agent 档案决定
|
|
5
|
+
* 「会话记录在哪、怎么读、人工怎么接回去」。两者解耦后,换 Agent 不需要动内核。
|
|
6
|
+
*/
|
|
7
|
+
import type { SessionSnapshot } from '../port.js';
|
|
8
|
+
export interface AgentSessionReadOptions {
|
|
9
|
+
/** 只读文件尾部这么多字节,避免把大会话全量读进内存。 */
|
|
10
|
+
maxBytes?: number;
|
|
11
|
+
/** 最多保留多少条最近活动。 */
|
|
12
|
+
maxEvents?: number;
|
|
13
|
+
/** 覆盖 Agent 的会话记录根目录(测试注入)。 */
|
|
14
|
+
root?: string;
|
|
15
|
+
/** 精确匹配会话 id;找不到返回 null,不退化成「最新文件」。 */
|
|
16
|
+
sessionId?: string;
|
|
17
|
+
}
|
|
18
|
+
/** Agent 会话记录读取器。 */
|
|
19
|
+
export interface AgentSessionReader {
|
|
20
|
+
/** 按 workdir 找到最近一次会话的 id。 */
|
|
21
|
+
latestSessionId(workdir: string, opts?: AgentSessionReadOptions): string | null;
|
|
22
|
+
/** 读取该 workdir 最近的活动;读不到返回 null,由调用方退回终端屏幕。 */
|
|
23
|
+
read(workdir: string, opts?: AgentSessionReadOptions): SessionSnapshot | null;
|
|
24
|
+
}
|
|
25
|
+
/** 人工恢复命令模板;`{sessionId}` 会被真实会话 id 替换。 */
|
|
26
|
+
export interface AgentResumeTemplate {
|
|
27
|
+
command: string;
|
|
28
|
+
args: readonly string[];
|
|
29
|
+
note?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface AgentProfile {
|
|
32
|
+
/** Agent id,与外部工具的 agent id 对齐(例如 orca --agent codex)。 */
|
|
33
|
+
id: string;
|
|
34
|
+
label: string;
|
|
35
|
+
/** 人工接回会话的命令模板。 */
|
|
36
|
+
resume?: AgentResumeTemplate;
|
|
37
|
+
/** 会话记录读取器;没有则活动巡检退回终端屏幕。 */
|
|
38
|
+
session?: AgentSessionReader;
|
|
39
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../../../../../packages/runtime/src/agents/profile.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { AgentProfile, AgentSessionReader } from './profile.js';
|
|
2
|
+
export declare const AGENT_PROFILES: readonly AgentProfile[];
|
|
3
|
+
export declare function agentProfileOf(id?: string | null): AgentProfile | null;
|
|
4
|
+
export interface ResolveSessionOptions {
|
|
5
|
+
/** 各 Agent 的会话记录根目录覆盖(测试注入)。 */
|
|
6
|
+
roots?: Record<string, string>;
|
|
7
|
+
}
|
|
8
|
+
/** 命中的 Agent 档案与它的读取器。 */
|
|
9
|
+
export interface ResolvedSession {
|
|
10
|
+
profile: AgentProfile;
|
|
11
|
+
reader: AgentSessionReader;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* 解析某个 workdir 该用哪个会话读取器。
|
|
15
|
+
*
|
|
16
|
+
* 指定了 agent 就用它的档案;没指定(跟随运行时默认)时按注册表顺序探测,
|
|
17
|
+
* 谁在这个 workdir 留下了会话记录就用谁 —— 这样运行时不必知道自己跑的是哪种 Agent。
|
|
18
|
+
*/
|
|
19
|
+
export declare function resolveSession(workdir: string, agentId?: string | null, opts?: ResolveSessionOptions): ResolvedSession | null;
|
|
20
|
+
/** 找到 workdir 对应的会话 id;指定了 agent 就用它,否则自动探测。 */
|
|
21
|
+
export declare function resolveSessionId(workdir: string, agentId?: string | null, opts?: ResolveSessionOptions): string | null;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent 档案注册表:id 与外部工具的 agent id 对齐(orca --agent codex、ACP 的 agent 等)。
|
|
3
|
+
*
|
|
4
|
+
* 新增一种 Agent 只要在这里加一条档案 —— 会话读取与人工恢复都从档案里取,
|
|
5
|
+
* 运行时与内核不需要知道具体是哪个 Agent。
|
|
6
|
+
*/
|
|
7
|
+
import { claudeSessionReader } from './claude.js';
|
|
8
|
+
import { codexSessionReader } from './codex.js';
|
|
9
|
+
export const AGENT_PROFILES = [
|
|
10
|
+
{
|
|
11
|
+
id: 'claude',
|
|
12
|
+
label: 'Claude Code',
|
|
13
|
+
resume: { command: 'claude', args: ['--resume', '{sessionId}'] },
|
|
14
|
+
session: claudeSessionReader,
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
id: 'codex',
|
|
18
|
+
label: 'Codex',
|
|
19
|
+
resume: {
|
|
20
|
+
command: 'codex',
|
|
21
|
+
args: ['resume', '{sessionId}'],
|
|
22
|
+
note: 'Codex 会话恢复为 best-effort;若找不到会话,请在 worktree 内运行 codex resume 选择历史会话。',
|
|
23
|
+
},
|
|
24
|
+
session: codexSessionReader,
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
id: 'opencode',
|
|
28
|
+
label: 'OpenCode',
|
|
29
|
+
resume: { command: 'opencode', args: ['--session', '{sessionId}'] },
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
export function agentProfileOf(id) {
|
|
33
|
+
const value = String(id ?? '').trim();
|
|
34
|
+
if (!value)
|
|
35
|
+
return null;
|
|
36
|
+
return AGENT_PROFILES.find(profile => profile.id === value) ?? null;
|
|
37
|
+
}
|
|
38
|
+
/** 把读取器绑定到指定的数据根目录;读取时统一用它。 */
|
|
39
|
+
function bindRoot(reader, root) {
|
|
40
|
+
if (!root)
|
|
41
|
+
return reader;
|
|
42
|
+
return {
|
|
43
|
+
latestSessionId: (workdir, opts) => reader.latestSessionId(workdir, { ...opts, root }),
|
|
44
|
+
read: (workdir, opts) => reader.read(workdir, { ...opts, root }),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* 解析某个 workdir 该用哪个会话读取器。
|
|
49
|
+
*
|
|
50
|
+
* 指定了 agent 就用它的档案;没指定(跟随运行时默认)时按注册表顺序探测,
|
|
51
|
+
* 谁在这个 workdir 留下了会话记录就用谁 —— 这样运行时不必知道自己跑的是哪种 Agent。
|
|
52
|
+
*/
|
|
53
|
+
export function resolveSession(workdir, agentId, opts = {}) {
|
|
54
|
+
if (!workdir)
|
|
55
|
+
return null;
|
|
56
|
+
const profile = agentProfileOf(agentId);
|
|
57
|
+
if (profile?.session) {
|
|
58
|
+
// 指定了 agent 却还没落盘会话时,仍然用它的读取器:读不到由调用方退回终端屏幕。
|
|
59
|
+
return { profile, reader: bindRoot(profile.session, opts.roots?.[profile.id]) };
|
|
60
|
+
}
|
|
61
|
+
if (agentId)
|
|
62
|
+
return null;
|
|
63
|
+
for (const candidate of AGENT_PROFILES) {
|
|
64
|
+
if (!candidate.session)
|
|
65
|
+
continue;
|
|
66
|
+
const root = opts.roots?.[candidate.id];
|
|
67
|
+
if (candidate.session.latestSessionId(workdir, root ? { root } : {})) {
|
|
68
|
+
return { profile: candidate, reader: bindRoot(candidate.session, root) };
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
/** 找到 workdir 对应的会话 id;指定了 agent 就用它,否则自动探测。 */
|
|
74
|
+
export function resolveSessionId(workdir, agentId, opts = {}) {
|
|
75
|
+
const resolved = resolveSession(workdir, agentId, opts);
|
|
76
|
+
return resolved?.reader.latestSessionId(workdir) ?? null;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../../packages/runtime/src/agents/registry.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
package/dist/errors.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../packages/runtime/src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAEhC;IADX,YACW,IAAkE,EAC3E,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAA;QAHL,SAAI,GAAJ,IAAI,CAA8D;QAI3E,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAA;IAClC,CAAC;CACF"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { CommandRunner } from '@router-agent/infra/process.js';
|
|
2
|
+
import type { PrInfo } from '@router-agent/core/pr.js';
|
|
3
|
+
/** 门禁档位:off=关闭;warn=只记日志不拦;enforce=拦截 ready。 */
|
|
4
|
+
export type UiEvidenceMode = 'off' | 'warn' | 'enforce';
|
|
5
|
+
export declare const UI_EVIDENCE_MODES: readonly UiEvidenceMode[];
|
|
6
|
+
/** 门禁需要的最小上报字段。 */
|
|
7
|
+
export interface EvidenceReport {
|
|
8
|
+
state: string;
|
|
9
|
+
summary: string;
|
|
10
|
+
prNumber: number;
|
|
11
|
+
prUrl: string;
|
|
12
|
+
/** Worker 显式声明:true=改了 UI,false=明确没改 UI,undefined=交给路径推断。 */
|
|
13
|
+
uiChange?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface EvidenceContext {
|
|
16
|
+
ticketId: string;
|
|
17
|
+
repo: string;
|
|
18
|
+
branch: string;
|
|
19
|
+
workdir?: string;
|
|
20
|
+
mode: UiEvidenceMode;
|
|
21
|
+
}
|
|
22
|
+
export interface EvidenceDeps {
|
|
23
|
+
git: CommandRunner;
|
|
24
|
+
/** 查询 PR / MR 详情(需要 body)。 */
|
|
25
|
+
prView: (repo: string, number: number, hint: {
|
|
26
|
+
url?: string;
|
|
27
|
+
cwd?: string;
|
|
28
|
+
}) => Promise<PrInfo | null>;
|
|
29
|
+
}
|
|
30
|
+
export type EvidenceMissingReason = 'no-pr' | 'missing-labels' | 'missing-images';
|
|
31
|
+
export type EvidenceUnverifiedReason = 'workdir-missing' | 'changed-files-unknown' | 'pr-unavailable' | 'pr-body-unavailable';
|
|
32
|
+
export interface EvidenceDecision {
|
|
33
|
+
/** 是否真正执行了 UI 判定。 */
|
|
34
|
+
checked: boolean;
|
|
35
|
+
ui: boolean;
|
|
36
|
+
action: 'allow' | 'reject';
|
|
37
|
+
/** 缺证据时命中的原因(warn 模式下 action 仍是 allow)。 */
|
|
38
|
+
reason?: EvidenceMissingReason;
|
|
39
|
+
/** 缺证据的细节,直接用于日志与 422 文案。 */
|
|
40
|
+
missing: string[];
|
|
41
|
+
/** 无法判断时给出的降级原因。 */
|
|
42
|
+
unverified?: EvidenceUnverifiedReason;
|
|
43
|
+
/** UI 判定的来源:显式声明或改动文件。 */
|
|
44
|
+
source?: 'declared' | 'paths';
|
|
45
|
+
}
|
|
46
|
+
/** 证据缺失且当前档位为 enforce 时抛出;由 API 层映射成 422。 */
|
|
47
|
+
export declare class ReportRejectedError extends Error {
|
|
48
|
+
readonly code: 'evidence-missing';
|
|
49
|
+
readonly detail: Record<string, unknown>;
|
|
50
|
+
constructor(code: 'evidence-missing', message: string, detail?: Record<string, unknown>);
|
|
51
|
+
}
|
|
52
|
+
/** 改动文件是否属于前端路径。 */
|
|
53
|
+
export declare function isUiPath(file: string): boolean;
|
|
54
|
+
/** 统计描述里的截图 / 录屏链接数量(去重)。 */
|
|
55
|
+
export declare function countVisualLinks(body: string): number;
|
|
56
|
+
export interface EvidenceBodyFacts {
|
|
57
|
+
before: boolean;
|
|
58
|
+
after: boolean;
|
|
59
|
+
imageLinks: number;
|
|
60
|
+
missing: string[];
|
|
61
|
+
}
|
|
62
|
+
/** 解析 PR / MR 描述:必须同时出现 Before / After 标识,且至少两个可视化链接。 */
|
|
63
|
+
export declare function analyzeEvidenceBody(body: string): EvidenceBodyFacts;
|
|
64
|
+
/**
|
|
65
|
+
* 计算工作分支相对起始分支的改动文件。
|
|
66
|
+
* 依次尝试 origin/<base> 的 merge-base、本地 <base>;用 `git diff <sha>` 同时覆盖已提交与未提交改动,
|
|
67
|
+
* 再补上未跟踪文件。全部失败返回 null。
|
|
68
|
+
*/
|
|
69
|
+
export declare function changedFilesSince(git: CommandRunner, workdir: string, baseBranch: string): Promise<string[] | null>;
|
|
70
|
+
/**
|
|
71
|
+
* 评估一次上报。
|
|
72
|
+
* `action: reject` 只在 enforce 且确认缺证据时出现;warn 模式返回 allow 但带 reason。
|
|
73
|
+
*/
|
|
74
|
+
export declare function evaluateUiEvidence(report: EvidenceReport, ctx: EvidenceContext, deps: EvidenceDeps): Promise<EvidenceDecision>;
|
|
75
|
+
/** 把判定结果落成日志字段,warn / reject 共用。 */
|
|
76
|
+
export declare function decisionLogDetail(decision: EvidenceDecision, ctx: Pick<EvidenceContext, 'ticketId' | 'mode'>): Record<string, unknown>;
|
|
77
|
+
/** 422 返回给 Worker 的文案:给补证路径,也给「确实截不了」的退路。 */
|
|
78
|
+
export declare function evidenceRejectedMessage(decision: EvidenceDecision): string;
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI 证据门禁:Worker 报 ready 前检查 PR / MR 描述里是否有 Before / After 对比证据。
|
|
3
|
+
*
|
|
4
|
+
* 判定顺序:
|
|
5
|
+
* 1. 只处理 `ready`;progress / blocked / failed 一律放行。
|
|
6
|
+
* 2. UI 工单判定优先用 Worker 的显式声明(`--ui-change`),未声明时按改动文件路径推断。
|
|
7
|
+
* 3. 无法完成判断(workdir 丢失、git 查询失败、PR 查询失败)时放行并记 `report:evidence-unverified`,
|
|
8
|
+
* 避免把「验证不了」误判成「缺证据」;真正缺失才拦截或告警。
|
|
9
|
+
*/
|
|
10
|
+
import { existsSync } from 'node:fs';
|
|
11
|
+
export const UI_EVIDENCE_MODES = ['off', 'warn', 'enforce'];
|
|
12
|
+
/** 证据缺失且当前档位为 enforce 时抛出;由 API 层映射成 422。 */
|
|
13
|
+
export class ReportRejectedError extends Error {
|
|
14
|
+
code;
|
|
15
|
+
detail;
|
|
16
|
+
constructor(code, message, detail = {}) {
|
|
17
|
+
super(message);
|
|
18
|
+
this.code = code;
|
|
19
|
+
this.detail = detail;
|
|
20
|
+
this.name = 'ReportRejectedError';
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/** 前端常见扩展名;测试、快照、故事文件不算 UI 改动。 */
|
|
24
|
+
const UI_EXTENSION = /\.(tsx|jsx|vue|svelte|astro|css|scss|sass|less|styl|html?|hbs|handlebars|ejs|pug)$/i;
|
|
25
|
+
/** 前端常见目录;只命中这些目录下的文件才推断为 UI 改动。 */
|
|
26
|
+
const UI_DIRECTORY = /(^|\/)(web|frontend|client|ui|pages|components|views|styles|layouts|templates)\//i;
|
|
27
|
+
/** 测试 / 快照 / 脚手架文件不改变线上界面。 */
|
|
28
|
+
const NON_UI_FILE = /(^|\/)(__tests__|__snapshots__|stories|storybook)\/|\.(test|spec|stories)\.[^/]+$/i;
|
|
29
|
+
/** 改动文件是否属于前端路径。 */
|
|
30
|
+
export function isUiPath(file) {
|
|
31
|
+
const path = file.trim().replace(/\\/g, '/');
|
|
32
|
+
if (!path || NON_UI_FILE.test(path))
|
|
33
|
+
return false;
|
|
34
|
+
return UI_EXTENSION.test(path) || UI_DIRECTORY.test(path);
|
|
35
|
+
}
|
|
36
|
+
const BEFORE_LABEL = /(^|[^a-z])before([^a-z]|$)|改动前|变更前|修改前|之前/i;
|
|
37
|
+
const AFTER_LABEL = /(^|[^a-z])after([^a-z]|$)|改动后|变更后|修改后|之后/i;
|
|
38
|
+
const MARKDOWN_IMAGE = /!\[[^\]]*\]\(([^)\s]+)(?:\s+["'][^"']*["'])?\)/g;
|
|
39
|
+
const HTML_IMAGE = /<img[^>]+src=["']([^"']+)["'][^>]*>/gi;
|
|
40
|
+
const HTML_VIDEO = /<(?:video|source)[^>]+src=["']([^"']+)["'][^>]*>/gi;
|
|
41
|
+
const RAW_VISUAL_URL = /https?:\/\/[^\s<>()"']+\.(?:png|jpe?g|gif|webp|avif|svg|mp4|webm|mov|m4v)(?:\?[^\s<>()"']*)?/gi;
|
|
42
|
+
/** 统计描述里的截图 / 录屏链接数量(去重)。 */
|
|
43
|
+
export function countVisualLinks(body) {
|
|
44
|
+
const links = new Set();
|
|
45
|
+
for (const re of [MARKDOWN_IMAGE, HTML_IMAGE, HTML_VIDEO, RAW_VISUAL_URL]) {
|
|
46
|
+
re.lastIndex = 0;
|
|
47
|
+
for (const match of body.matchAll(re)) {
|
|
48
|
+
const value = (match[1] ?? match[0]).trim();
|
|
49
|
+
if (value)
|
|
50
|
+
links.add(value);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return links.size;
|
|
54
|
+
}
|
|
55
|
+
/** 解析 PR / MR 描述:必须同时出现 Before / After 标识,且至少两个可视化链接。 */
|
|
56
|
+
export function analyzeEvidenceBody(body) {
|
|
57
|
+
const before = BEFORE_LABEL.test(body);
|
|
58
|
+
const after = AFTER_LABEL.test(body);
|
|
59
|
+
const imageLinks = countVisualLinks(body);
|
|
60
|
+
const missing = [];
|
|
61
|
+
if (!before)
|
|
62
|
+
missing.push('Before 标识');
|
|
63
|
+
if (!after)
|
|
64
|
+
missing.push('After 标识');
|
|
65
|
+
if (imageLinks < 2)
|
|
66
|
+
missing.push(`至少 2 个截图或录屏链接(当前 ${imageLinks} 个)`);
|
|
67
|
+
return { before, after, imageLinks, missing };
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 计算工作分支相对起始分支的改动文件。
|
|
71
|
+
* 依次尝试 origin/<base> 的 merge-base、本地 <base>;用 `git diff <sha>` 同时覆盖已提交与未提交改动,
|
|
72
|
+
* 再补上未跟踪文件。全部失败返回 null。
|
|
73
|
+
*/
|
|
74
|
+
export async function changedFilesSince(git, workdir, baseBranch) {
|
|
75
|
+
const base = baseBranch.trim();
|
|
76
|
+
const refs = [`origin/${base}`, base].filter(ref => ref !== 'origin/');
|
|
77
|
+
for (const ref of refs) {
|
|
78
|
+
try {
|
|
79
|
+
const mergeBase = await git.run(['merge-base', 'HEAD', ref], { cwd: workdir, timeoutMs: 10_000 });
|
|
80
|
+
const sha = mergeBase.stdout.trim();
|
|
81
|
+
if (mergeBase.code !== 0 || !sha)
|
|
82
|
+
continue;
|
|
83
|
+
const diff = await git.run(['diff', '--name-only', sha], { cwd: workdir, timeoutMs: 10_000 });
|
|
84
|
+
if (diff.code !== 0)
|
|
85
|
+
continue;
|
|
86
|
+
const untracked = await git.run(['ls-files', '--others', '--exclude-standard'], { cwd: workdir, timeoutMs: 10_000 });
|
|
87
|
+
return unique([...splitLines(diff.stdout), ...splitLines(untracked.code === 0 ? untracked.stdout : '')]);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
// 单个 ref 查询失败继续试下一个;最终仍失败由调用方按「无法判断」放行。
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
const diff = await git.run(['diff', '--name-only', 'HEAD'], { cwd: workdir, timeoutMs: 10_000 });
|
|
95
|
+
if (diff.code === 0)
|
|
96
|
+
return splitLines(diff.stdout);
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// 交给调用方降级。
|
|
100
|
+
}
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
function splitLines(value) {
|
|
104
|
+
return value.split('\n').map(line => line.trim()).filter(Boolean);
|
|
105
|
+
}
|
|
106
|
+
function unique(values) {
|
|
107
|
+
return [...new Set(values)];
|
|
108
|
+
}
|
|
109
|
+
/** 判断这次上报是否需要 UI 证据;无法推断时返回 unverified。 */
|
|
110
|
+
async function detectUiChange(report, ctx, git) {
|
|
111
|
+
if (report.uiChange === true)
|
|
112
|
+
return { ui: true, source: 'declared' };
|
|
113
|
+
if (report.uiChange === false)
|
|
114
|
+
return { ui: false, source: 'declared' };
|
|
115
|
+
if (!ctx.workdir || !existsSync(ctx.workdir))
|
|
116
|
+
return { ui: false, unverified: 'workdir-missing' };
|
|
117
|
+
const files = await changedFilesSince(git, ctx.workdir, ctx.branch);
|
|
118
|
+
if (files === null)
|
|
119
|
+
return { ui: false, unverified: 'changed-files-unknown' };
|
|
120
|
+
return { ui: files.some(isUiPath), source: 'paths' };
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* 评估一次上报。
|
|
124
|
+
* `action: reject` 只在 enforce 且确认缺证据时出现;warn 模式返回 allow 但带 reason。
|
|
125
|
+
*/
|
|
126
|
+
export async function evaluateUiEvidence(report, ctx, deps) {
|
|
127
|
+
const allow = (extra = {}) => ({
|
|
128
|
+
checked: false,
|
|
129
|
+
ui: false,
|
|
130
|
+
action: 'allow',
|
|
131
|
+
missing: [],
|
|
132
|
+
...extra,
|
|
133
|
+
});
|
|
134
|
+
if (ctx.mode === 'off' || report.state !== 'ready')
|
|
135
|
+
return allow();
|
|
136
|
+
const detected = await detectUiChange(report, ctx, deps.git);
|
|
137
|
+
if (detected.unverified)
|
|
138
|
+
return allow(detected);
|
|
139
|
+
if (!detected.ui)
|
|
140
|
+
return allow(detected);
|
|
141
|
+
const base = { checked: true, ui: true, action: 'allow', missing: [], ...(detected.source ? { source: detected.source } : {}) };
|
|
142
|
+
if (report.prNumber <= 0) {
|
|
143
|
+
return {
|
|
144
|
+
...base,
|
|
145
|
+
action: ctx.mode === 'enforce' ? 'reject' : 'allow',
|
|
146
|
+
reason: 'no-pr',
|
|
147
|
+
missing: ['PR / MR 编号或链接'],
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
let pr = null;
|
|
151
|
+
try {
|
|
152
|
+
pr = await deps.prView(ctx.repo, report.prNumber, {
|
|
153
|
+
...(report.prUrl ? { url: report.prUrl } : {}),
|
|
154
|
+
...(ctx.workdir ? { cwd: ctx.workdir } : {}),
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
return allow({ ...base, checked: false, ui: true, unverified: 'pr-unavailable' });
|
|
159
|
+
}
|
|
160
|
+
if (!pr)
|
|
161
|
+
return allow({ ...base, checked: false, ui: true, unverified: 'pr-unavailable' });
|
|
162
|
+
if (typeof pr.body !== 'string') {
|
|
163
|
+
return allow({ ...base, checked: false, ui: true, unverified: 'pr-body-unavailable' });
|
|
164
|
+
}
|
|
165
|
+
const facts = analyzeEvidenceBody(pr.body);
|
|
166
|
+
if (facts.missing.length === 0)
|
|
167
|
+
return base;
|
|
168
|
+
return {
|
|
169
|
+
...base,
|
|
170
|
+
action: ctx.mode === 'enforce' ? 'reject' : 'allow',
|
|
171
|
+
reason: !facts.before || !facts.after ? 'missing-labels' : 'missing-images',
|
|
172
|
+
missing: facts.missing,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
/** 把判定结果落成日志字段,warn / reject 共用。 */
|
|
176
|
+
export function decisionLogDetail(decision, ctx) {
|
|
177
|
+
return {
|
|
178
|
+
ticketId: ctx.ticketId,
|
|
179
|
+
mode: ctx.mode,
|
|
180
|
+
action: decision.action,
|
|
181
|
+
...(decision.source ? { source: decision.source } : {}),
|
|
182
|
+
...(decision.reason ? { reason: decision.reason } : {}),
|
|
183
|
+
...(decision.unverified ? { unverified: decision.unverified } : {}),
|
|
184
|
+
...(decision.missing.length > 0 ? { missing: decision.missing.join(';') } : {}),
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
/** 422 返回给 Worker 的文案:给补证路径,也给「确实截不了」的退路。 */
|
|
188
|
+
export function evidenceRejectedMessage(decision) {
|
|
189
|
+
const detail = decision.missing.length > 0 ? decision.missing.join(';') : '未找到 Before / After 证据';
|
|
190
|
+
return [
|
|
191
|
+
`UI 工单缺少 PR / MR 证据:${detail}。`,
|
|
192
|
+
'请补齐 Before / After 截图或录屏后,重新用 --state ready 上报。',
|
|
193
|
+
'如果确实无法截图(没有可用环境、需要登录态、拿不到真实基线等),请改用 --state blocked,并在 --human-action 里说明具体限制。',
|
|
194
|
+
].join('\n');
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=evidence-gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence-gate.js","sourceRoot":"","sources":["../../../../packages/runtime/src/evidence-gate.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export * from './port.js';
|
|
2
|
+
export { RuntimeRegistry, createRuntimes } from './registry.js';
|
|
3
|
+
export { parseVersion, resolveExecutable } from './runtimes/acp-detect-utils.js';
|
|
4
|
+
export * from './runtimes/catalog.js';
|
|
5
|
+
export * from './runtimes/acp-agents.js';
|
|
6
|
+
export * from './runtimes/options.js';
|
|
7
|
+
export * from './status.js';
|
|
8
|
+
export * from './naming.js';
|
|
9
|
+
export * from './resume.js';
|
|
10
|
+
export * from './report-poller.js';
|
|
11
|
+
export * from './evidence-gate.js';
|
|
12
|
+
export { readWorkerSpec, workerSpecPath, bundledWorkerSpecPath } from './spec/reader.js';
|
|
13
|
+
export { buildWorkerPrompt, buildNeutralContract } from './spec/index.js';
|
|
14
|
+
export { GitWorktreeProvider } from './workspaces/git-worktree.js';
|
|
15
|
+
export { AGENT_PROFILES, agentProfileOf, resolveSession, resolveSessionId } from './agents/registry.js';
|
|
16
|
+
export { claudeTranscriptPath, readClaudeSession, readTranscriptSince, transcriptSize, } from './agents/claude.js';
|
|
17
|
+
export { decidePermission, isAllowed, shellAllowed, commandOf } from './permissions.js';
|
|
18
|
+
export type { AcpPermissionOption, AcpToolCallInfo, AcpToolKind } from './permissions.js';
|
|
19
|
+
export * from './errors.js';
|
|
20
|
+
export * from './plugins/types.js';
|
|
21
|
+
export { DEFAULT_RUNTIME_PLUGINS, describePluginLoadError, loadRuntimePlugins, pluginEntryOf } from './plugins/loader.js';
|
|
22
|
+
export type { LoadedRuntimePlugins, RuntimePluginConfigView, RuntimePluginDeps } from './plugins/loader.js';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export * from './port.js';
|
|
2
|
+
export { RuntimeRegistry, createRuntimes } from './registry.js';
|
|
3
|
+
export { parseVersion, resolveExecutable } from './runtimes/acp-detect-utils.js';
|
|
4
|
+
export * from './runtimes/catalog.js';
|
|
5
|
+
export * from './runtimes/acp-agents.js';
|
|
6
|
+
export * from './runtimes/options.js';
|
|
7
|
+
export * from './status.js';
|
|
8
|
+
export * from './naming.js';
|
|
9
|
+
export * from './resume.js';
|
|
10
|
+
export * from './report-poller.js';
|
|
11
|
+
export * from './evidence-gate.js';
|
|
12
|
+
export { readWorkerSpec, workerSpecPath, bundledWorkerSpecPath } from './spec/reader.js';
|
|
13
|
+
export { buildWorkerPrompt, buildNeutralContract } from './spec/index.js';
|
|
14
|
+
export { GitWorktreeProvider } from './workspaces/git-worktree.js';
|
|
15
|
+
export { AGENT_PROFILES, agentProfileOf, resolveSession, resolveSessionId } from './agents/registry.js';
|
|
16
|
+
export { claudeTranscriptPath, readClaudeSession, readTranscriptSince, transcriptSize, } from './agents/claude.js';
|
|
17
|
+
export { decidePermission, isAllowed, shellAllowed, commandOf } from './permissions.js';
|
|
18
|
+
export * from './errors.js';
|
|
19
|
+
export * from './plugins/types.js';
|
|
20
|
+
export { DEFAULT_RUNTIME_PLUGINS, describePluginLoadError, loadRuntimePlugins, pluginEntryOf } from './plugins/loader.js';
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/runtime/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC/D,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAChF,cAAc,uBAAuB,CAAA;AACrC,cAAc,0BAA0B,CAAA;AACxC,cAAc,uBAAuB,CAAA;AACrC,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,oBAAoB,CAAA;AAClC,cAAc,oBAAoB,CAAA;AAClC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AACxF,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAClE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvG,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,GACf,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAEvF,cAAc,aAAa,CAAA;AAC3B,cAAc,oBAAoB,CAAA;AAClC,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA"}
|
package/dist/naming.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Ticket } from '@router-agent/core/model.js';
|
|
2
|
+
/** 分支名前缀;与 worker 手册里的 `ra/<工单号>-<语义>` 保持一致。 */
|
|
3
|
+
export declare const BRANCH_PREFIX = "ra";
|
|
4
|
+
/**
|
|
5
|
+
* 把工单标题压成分支名可用的语义 slug。
|
|
6
|
+
*
|
|
7
|
+
* - 标题里有足够英文/数字时优先用它们(`修复 login timeout` → `login-timeout`),
|
|
8
|
+
* 这类分支名在任何平台上都不用转义;
|
|
9
|
+
* - 纯中文标题没有可用的 ASCII 词,就保留中文本身(git 允许 UTF-8 分支名),
|
|
10
|
+
* 总比退化成 `tk-12` 这个纯编号更有语义;
|
|
11
|
+
* - 实在取不到内容时用 `task` 兜底。
|
|
12
|
+
*/
|
|
13
|
+
export declare function ticketSlug(title: string, maxLength?: number): string;
|
|
14
|
+
/**
|
|
15
|
+
* Orca worktree 名:与工作分支一一对应,只把 `/` 换成 `-`。
|
|
16
|
+
*
|
|
17
|
+
* 例如分支 `ra/tk-12-fix-login-timeout` 对应目录 `ra-tk-12-fix-login-timeout`,
|
|
18
|
+
* 在 `orca worktree list` 和文件系统里都能一眼对上,不会再出现「目录 ra-tk-12、
|
|
19
|
+
* 分支 ra/tk-12-fix-login-timeout」这种对不上的情况。
|
|
20
|
+
*/
|
|
21
|
+
export declare function worktreeName(ticket: Pick<Ticket, 'id' | 'title'>): string;
|
|
22
|
+
/** 实际工作分支:`ra/tk-12-<语义 slug>`,由 Orca 的 `--branch` 直接落成 git 分支名。 */
|
|
23
|
+
export declare function workBranch(ticket: Pick<Ticket, 'id' | 'title'>): string;
|
package/dist/naming.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/** 分支名的语义部分最多保留多少字符,避免超出 git / 平台的显示长度。 */
|
|
2
|
+
const MAX_SLUG_LENGTH = 36;
|
|
3
|
+
/** 分支名前缀;与 worker 手册里的 `ra/<工单号>-<语义>` 保持一致。 */
|
|
4
|
+
export const BRANCH_PREFIX = 'ra';
|
|
5
|
+
/**
|
|
6
|
+
* 把工单标题压成分支名可用的语义 slug。
|
|
7
|
+
*
|
|
8
|
+
* - 标题里有足够英文/数字时优先用它们(`修复 login timeout` → `login-timeout`),
|
|
9
|
+
* 这类分支名在任何平台上都不用转义;
|
|
10
|
+
* - 纯中文标题没有可用的 ASCII 词,就保留中文本身(git 允许 UTF-8 分支名),
|
|
11
|
+
* 总比退化成 `tk-12` 这个纯编号更有语义;
|
|
12
|
+
* - 实在取不到内容时用 `task` 兜底。
|
|
13
|
+
*/
|
|
14
|
+
export function ticketSlug(title, maxLength = MAX_SLUG_LENGTH) {
|
|
15
|
+
const normalized = title.normalize('NFKC').toLowerCase();
|
|
16
|
+
const ascii = normalized.match(/[a-z0-9]+/g)?.join('-') ?? '';
|
|
17
|
+
const cjk = normalized.match(/[㐀-䶿一-鿿]+/g)?.join('') ?? '';
|
|
18
|
+
const base = ascii.length >= 3 ? ascii : cjk || ascii;
|
|
19
|
+
const slug = base
|
|
20
|
+
.replace(/-+/g, '-')
|
|
21
|
+
.replace(/^-+|-+$/g, '')
|
|
22
|
+
.slice(0, maxLength)
|
|
23
|
+
.replace(/-+$/g, '');
|
|
24
|
+
return slug || 'task';
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Orca worktree 名:与工作分支一一对应,只把 `/` 换成 `-`。
|
|
28
|
+
*
|
|
29
|
+
* 例如分支 `ra/tk-12-fix-login-timeout` 对应目录 `ra-tk-12-fix-login-timeout`,
|
|
30
|
+
* 在 `orca worktree list` 和文件系统里都能一眼对上,不会再出现「目录 ra-tk-12、
|
|
31
|
+
* 分支 ra/tk-12-fix-login-timeout」这种对不上的情况。
|
|
32
|
+
*/
|
|
33
|
+
export function worktreeName(ticket) {
|
|
34
|
+
return workBranch(ticket).replace(/\//g, '-');
|
|
35
|
+
}
|
|
36
|
+
/** 实际工作分支:`ra/tk-12-<语义 slug>`,由 Orca 的 `--branch` 直接落成 git 分支名。 */
|
|
37
|
+
export function workBranch(ticket) {
|
|
38
|
+
return `${BRANCH_PREFIX}/${ticket.id}-${ticketSlug(ticket.title)}`;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=naming.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naming.js","sourceRoot":"","sources":["../../../../packages/runtime/src/naming.ts"],"names":[],"mappings":"AAEA,2CAA2C;AAC3C,MAAM,eAAe,GAAG,EAAE,CAAA;AAE1B,gDAAgD;AAChD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAA;AAEjC;;;;;;;;GAQG;AACH,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,SAAS,GAAG,eAAe;IACnE,MAAM,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAA;IACxD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;IAC7D,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAA;IAC1D,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,CAAA;IACrD,MAAM,IAAI,GAAG,IAAI;SACd,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC;SACnB,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IACtB,OAAO,IAAI,IAAI,MAAM,CAAA;AACvB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,MAAoC;IAC/D,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;AAC/C,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,UAAU,CAAC,MAAoC;IAC7D,OAAO,GAAG,aAAa,IAAI,MAAM,CAAC,EAAE,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAA;AACpE,CAAC"}
|