feique 1.1.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/LICENSE +21 -0
- package/README.en.md +220 -0
- package/README.md +265 -0
- package/dist/backend/claude.d.ts +36 -0
- package/dist/backend/claude.js +358 -0
- package/dist/backend/claude.js.map +1 -0
- package/dist/backend/codex.d.ts +31 -0
- package/dist/backend/codex.js +100 -0
- package/dist/backend/codex.js.map +1 -0
- package/dist/backend/factory.d.ts +9 -0
- package/dist/backend/factory.js +56 -0
- package/dist/backend/factory.js.map +1 -0
- package/dist/backend/types.d.ts +54 -0
- package/dist/backend/types.js +2 -0
- package/dist/backend/types.js.map +1 -0
- package/dist/bridge/commands.d.ts +135 -0
- package/dist/bridge/commands.js +860 -0
- package/dist/bridge/commands.js.map +1 -0
- package/dist/bridge/service.d.ts +160 -0
- package/dist/bridge/service.js +3785 -0
- package/dist/bridge/service.js.map +1 -0
- package/dist/bridge/task-queue.d.ts +14 -0
- package/dist/bridge/task-queue.js +81 -0
- package/dist/bridge/task-queue.js.map +1 -0
- package/dist/bridge/types.d.ts +39 -0
- package/dist/bridge/types.js +2 -0
- package/dist/bridge/types.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +1199 -0
- package/dist/cli.js.map +1 -0
- package/dist/codex/capabilities.d.ts +20 -0
- package/dist/codex/capabilities.js +41 -0
- package/dist/codex/capabilities.js.map +1 -0
- package/dist/codex/runner.d.ts +47 -0
- package/dist/codex/runner.js +294 -0
- package/dist/codex/runner.js.map +1 -0
- package/dist/codex/session-index.d.ts +22 -0
- package/dist/codex/session-index.js +205 -0
- package/dist/codex/session-index.js.map +1 -0
- package/dist/collaboration/awareness.d.ts +36 -0
- package/dist/collaboration/awareness.js +107 -0
- package/dist/collaboration/awareness.js.map +1 -0
- package/dist/collaboration/digest.d.ts +65 -0
- package/dist/collaboration/digest.js +178 -0
- package/dist/collaboration/digest.js.map +1 -0
- package/dist/collaboration/handoff.d.ts +66 -0
- package/dist/collaboration/handoff.js +94 -0
- package/dist/collaboration/handoff.js.map +1 -0
- package/dist/collaboration/insights.d.ts +24 -0
- package/dist/collaboration/insights.js +243 -0
- package/dist/collaboration/insights.js.map +1 -0
- package/dist/collaboration/knowledge.d.ts +26 -0
- package/dist/collaboration/knowledge.js +105 -0
- package/dist/collaboration/knowledge.js.map +1 -0
- package/dist/collaboration/timeline.d.ts +31 -0
- package/dist/collaboration/timeline.js +150 -0
- package/dist/collaboration/timeline.js.map +1 -0
- package/dist/collaboration/trust.d.ts +49 -0
- package/dist/collaboration/trust.js +176 -0
- package/dist/collaboration/trust.js.map +1 -0
- package/dist/config/codex-skill.d.ts +7 -0
- package/dist/config/codex-skill.js +44 -0
- package/dist/config/codex-skill.js.map +1 -0
- package/dist/config/doctor.d.ts +12 -0
- package/dist/config/doctor.js +314 -0
- package/dist/config/doctor.js.map +1 -0
- package/dist/config/init.d.ts +3 -0
- package/dist/config/init.js +123 -0
- package/dist/config/init.js.map +1 -0
- package/dist/config/load.d.ts +33 -0
- package/dist/config/load.js +252 -0
- package/dist/config/load.js.map +1 -0
- package/dist/config/mutate.d.ts +21 -0
- package/dist/config/mutate.js +86 -0
- package/dist/config/mutate.js.map +1 -0
- package/dist/config/paths.d.ts +3 -0
- package/dist/config/paths.js +33 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/schema.d.ts +308 -0
- package/dist/config/schema.js +250 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/control-plane/project-session.d.ts +67 -0
- package/dist/control-plane/project-session.js +234 -0
- package/dist/control-plane/project-session.js.map +1 -0
- package/dist/feishu/base.d.ts +19 -0
- package/dist/feishu/base.js +93 -0
- package/dist/feishu/base.js.map +1 -0
- package/dist/feishu/cards.d.ts +22 -0
- package/dist/feishu/cards.js +144 -0
- package/dist/feishu/cards.js.map +1 -0
- package/dist/feishu/client.d.ts +61 -0
- package/dist/feishu/client.js +315 -0
- package/dist/feishu/client.js.map +1 -0
- package/dist/feishu/diagnostics.d.ts +42 -0
- package/dist/feishu/diagnostics.js +194 -0
- package/dist/feishu/diagnostics.js.map +1 -0
- package/dist/feishu/doc.d.ts +13 -0
- package/dist/feishu/doc.js +59 -0
- package/dist/feishu/doc.js.map +1 -0
- package/dist/feishu/extractors.d.ts +7 -0
- package/dist/feishu/extractors.js +215 -0
- package/dist/feishu/extractors.js.map +1 -0
- package/dist/feishu/long-connection.d.ts +12 -0
- package/dist/feishu/long-connection.js +41 -0
- package/dist/feishu/long-connection.js.map +1 -0
- package/dist/feishu/message-resource.d.ts +14 -0
- package/dist/feishu/message-resource.js +309 -0
- package/dist/feishu/message-resource.js.map +1 -0
- package/dist/feishu/replay.d.ts +37 -0
- package/dist/feishu/replay.js +114 -0
- package/dist/feishu/replay.js.map +1 -0
- package/dist/feishu/task.d.ts +18 -0
- package/dist/feishu/task.js +86 -0
- package/dist/feishu/task.js.map +1 -0
- package/dist/feishu/text.d.ts +23 -0
- package/dist/feishu/text.js +155 -0
- package/dist/feishu/text.js.map +1 -0
- package/dist/feishu/webhook.d.ts +23 -0
- package/dist/feishu/webhook.js +130 -0
- package/dist/feishu/webhook.js.map +1 -0
- package/dist/feishu/wiki.d.ts +52 -0
- package/dist/feishu/wiki.js +300 -0
- package/dist/feishu/wiki.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/knowledge/search.d.ts +11 -0
- package/dist/knowledge/search.js +83 -0
- package/dist/knowledge/search.js.map +1 -0
- package/dist/logging.d.ts +3 -0
- package/dist/logging.js +40 -0
- package/dist/logging.js.map +1 -0
- package/dist/mcp/server.d.ts +34 -0
- package/dist/mcp/server.js +1196 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/memory/embedding-factory.d.ts +6 -0
- package/dist/memory/embedding-factory.js +20 -0
- package/dist/memory/embedding-factory.js.map +1 -0
- package/dist/memory/embeddings.d.ts +40 -0
- package/dist/memory/embeddings.js +150 -0
- package/dist/memory/embeddings.js.map +1 -0
- package/dist/memory/ollama-embeddings.d.ts +63 -0
- package/dist/memory/ollama-embeddings.js +215 -0
- package/dist/memory/ollama-embeddings.js.map +1 -0
- package/dist/memory/retrieve.d.ts +17 -0
- package/dist/memory/retrieve.js +29 -0
- package/dist/memory/retrieve.js.map +1 -0
- package/dist/memory/summarize.d.ts +13 -0
- package/dist/memory/summarize.js +58 -0
- package/dist/memory/summarize.js.map +1 -0
- package/dist/observability/cost.d.ts +12 -0
- package/dist/observability/cost.js +22 -0
- package/dist/observability/cost.js.map +1 -0
- package/dist/observability/dashboard-html.d.ts +5 -0
- package/dist/observability/dashboard-html.js +304 -0
- package/dist/observability/dashboard-html.js.map +1 -0
- package/dist/observability/metrics.d.ts +36 -0
- package/dist/observability/metrics.js +230 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/observability/readiness.d.ts +31 -0
- package/dist/observability/readiness.js +57 -0
- package/dist/observability/readiness.js.map +1 -0
- package/dist/observability/server.d.ts +84 -0
- package/dist/observability/server.js +181 -0
- package/dist/observability/server.js.map +1 -0
- package/dist/projects/paths.d.ts +9 -0
- package/dist/projects/paths.js +30 -0
- package/dist/projects/paths.js.map +1 -0
- package/dist/runtime/instance-lock.d.ts +12 -0
- package/dist/runtime/instance-lock.js +99 -0
- package/dist/runtime/instance-lock.js.map +1 -0
- package/dist/runtime/process.d.ts +2 -0
- package/dist/runtime/process.js +43 -0
- package/dist/runtime/process.js.map +1 -0
- package/dist/runtime/shutdown.d.ts +11 -0
- package/dist/runtime/shutdown.js +38 -0
- package/dist/runtime/shutdown.js.map +1 -0
- package/dist/security/access.d.ts +13 -0
- package/dist/security/access.js +160 -0
- package/dist/security/access.js.map +1 -0
- package/dist/service/install.d.ts +19 -0
- package/dist/service/install.js +35 -0
- package/dist/service/install.js.map +1 -0
- package/dist/service/templates.d.ts +22 -0
- package/dist/service/templates.js +118 -0
- package/dist/service/templates.js.map +1 -0
- package/dist/state/audit-log.d.ts +33 -0
- package/dist/state/audit-log.js +116 -0
- package/dist/state/audit-log.js.map +1 -0
- package/dist/state/config-history-store.d.ts +27 -0
- package/dist/state/config-history-store.js +65 -0
- package/dist/state/config-history-store.js.map +1 -0
- package/dist/state/handoff-store.d.ts +20 -0
- package/dist/state/handoff-store.js +97 -0
- package/dist/state/handoff-store.js.map +1 -0
- package/dist/state/idempotency-store.d.ts +19 -0
- package/dist/state/idempotency-store.js +84 -0
- package/dist/state/idempotency-store.js.map +1 -0
- package/dist/state/memory-store.d.ts +137 -0
- package/dist/state/memory-store.js +713 -0
- package/dist/state/memory-store.js.map +1 -0
- package/dist/state/pending-command-store.d.ts +30 -0
- package/dist/state/pending-command-store.js +108 -0
- package/dist/state/pending-command-store.js.map +1 -0
- package/dist/state/run-state-store.d.ts +58 -0
- package/dist/state/run-state-store.js +269 -0
- package/dist/state/run-state-store.js.map +1 -0
- package/dist/state/session-store.d.ts +56 -0
- package/dist/state/session-store.js +275 -0
- package/dist/state/session-store.js.map +1 -0
- package/dist/state/trust-store.d.ts +15 -0
- package/dist/state/trust-store.js +53 -0
- package/dist/state/trust-store.js.map +1 -0
- package/dist/utils/fs.d.ts +4 -0
- package/dist/utils/fs.js +26 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/json.d.ts +1 -0
- package/dist/utils/json.js +9 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/utils/path.d.ts +3 -0
- package/dist/utils/path.js +22 -0
- package/dist/utils/path.js.map +1 -0
- package/dist/utils/serial-executor.d.ts +5 -0
- package/dist/utils/serial-executor.js +12 -0
- package/dist/utils/serial-executor.js.map +1 -0
- package/package.json +71 -0
- package/skills/feique-session/SKILL.md +27 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Direction 6: 上下文连续性 — Context Continuity
|
|
3
|
+
*
|
|
4
|
+
* Builds project timelines from audit/run/memory data and generates
|
|
5
|
+
* onboarding context for new team members.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Build a chronological timeline for a project from multiple data sources.
|
|
9
|
+
*/
|
|
10
|
+
export function buildProjectTimeline(runs, memories, auditEvents, projectAlias, limit = 30) {
|
|
11
|
+
const events = [];
|
|
12
|
+
// Runs → timeline events
|
|
13
|
+
for (const run of runs) {
|
|
14
|
+
if (run.project_alias !== projectAlias)
|
|
15
|
+
continue;
|
|
16
|
+
if (run.status === 'success') {
|
|
17
|
+
events.push({
|
|
18
|
+
type: 'run_completed',
|
|
19
|
+
at: run.finished_at ?? run.updated_at,
|
|
20
|
+
actor_id: run.actor_id,
|
|
21
|
+
project_alias: projectAlias,
|
|
22
|
+
summary: `完成任务: "${truncate(run.prompt_excerpt, 60)}"`,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
else if (run.status === 'failure') {
|
|
26
|
+
events.push({
|
|
27
|
+
type: 'run_failed',
|
|
28
|
+
at: run.finished_at ?? run.updated_at,
|
|
29
|
+
actor_id: run.actor_id,
|
|
30
|
+
project_alias: projectAlias,
|
|
31
|
+
summary: `任务失败: "${truncate(run.prompt_excerpt, 60)}"`,
|
|
32
|
+
detail: run.error,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// Memories → timeline events
|
|
37
|
+
for (const mem of memories) {
|
|
38
|
+
if (mem.project_alias !== projectAlias)
|
|
39
|
+
continue;
|
|
40
|
+
if (mem.archived_at)
|
|
41
|
+
continue;
|
|
42
|
+
events.push({
|
|
43
|
+
type: 'knowledge_added',
|
|
44
|
+
at: mem.created_at,
|
|
45
|
+
actor_id: mem.created_by,
|
|
46
|
+
project_alias: projectAlias,
|
|
47
|
+
summary: `知识沉淀: ${mem.title}`,
|
|
48
|
+
detail: truncate(mem.content, 100),
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
// Audit events → timeline events (selective)
|
|
52
|
+
for (const event of auditEvents) {
|
|
53
|
+
if (event.type === 'project.selected') {
|
|
54
|
+
events.push({
|
|
55
|
+
type: 'project_switch',
|
|
56
|
+
at: event.at,
|
|
57
|
+
actor_id: event.actor_id,
|
|
58
|
+
project_alias: projectAlias,
|
|
59
|
+
summary: `切换到项目 ${event.alias ?? projectAlias}`,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Sort by time descending, limit
|
|
64
|
+
events.sort((a, b) => b.at.localeCompare(a.at));
|
|
65
|
+
return events.slice(0, limit);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Generate an onboarding context summary for a new team member.
|
|
69
|
+
* This is injected into the AI prompt when a new actor_id appears.
|
|
70
|
+
*/
|
|
71
|
+
export function buildOnboardingContext(timeline, memories, projectAlias, maxChars = 1200) {
|
|
72
|
+
const parts = [];
|
|
73
|
+
parts.push(`[项目 ${projectAlias} 历史上下文]`);
|
|
74
|
+
// Key knowledge first
|
|
75
|
+
const pinnedMemories = memories.filter((m) => m.pinned && !m.archived_at);
|
|
76
|
+
if (pinnedMemories.length > 0) {
|
|
77
|
+
parts.push('\n关键知识:');
|
|
78
|
+
for (const mem of pinnedMemories.slice(0, 5)) {
|
|
79
|
+
parts.push(`- ${mem.title}: ${truncate(mem.content, 80)}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Recent activity summary
|
|
83
|
+
const recentRuns = timeline
|
|
84
|
+
.filter((e) => e.type === 'run_completed' || e.type === 'run_failed')
|
|
85
|
+
.slice(0, 5);
|
|
86
|
+
if (recentRuns.length > 0) {
|
|
87
|
+
parts.push('\n近期活动:');
|
|
88
|
+
for (const event of recentRuns) {
|
|
89
|
+
const actor = event.actor_id ? `${event.actor_id}: ` : '';
|
|
90
|
+
parts.push(`- ${actor}${event.summary}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Recent knowledge additions
|
|
94
|
+
const recentKnowledge = timeline
|
|
95
|
+
.filter((e) => e.type === 'knowledge_added')
|
|
96
|
+
.slice(0, 3);
|
|
97
|
+
if (recentKnowledge.length > 0) {
|
|
98
|
+
parts.push('\n近期沉淀:');
|
|
99
|
+
for (const event of recentKnowledge) {
|
|
100
|
+
parts.push(`- ${event.summary}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
let result = parts.join('\n');
|
|
104
|
+
if (result.length > maxChars) {
|
|
105
|
+
result = result.slice(0, maxChars - 3) + '...';
|
|
106
|
+
}
|
|
107
|
+
return result;
|
|
108
|
+
}
|
|
109
|
+
export function formatTimeline(events) {
|
|
110
|
+
if (events.length === 0) {
|
|
111
|
+
return '该项目暂无活动记录。';
|
|
112
|
+
}
|
|
113
|
+
const lines = ['📅 项目时间线\n'];
|
|
114
|
+
let lastDate = '';
|
|
115
|
+
for (const event of events) {
|
|
116
|
+
const date = event.at.slice(0, 10);
|
|
117
|
+
if (date !== lastDate) {
|
|
118
|
+
lines.push(`\n── ${date} ──`);
|
|
119
|
+
lastDate = date;
|
|
120
|
+
}
|
|
121
|
+
const time = event.at.slice(11, 16);
|
|
122
|
+
const icon = EVENT_ICONS[event.type] ?? '•';
|
|
123
|
+
const actor = event.actor_id ? ` [${event.actor_id}]` : '';
|
|
124
|
+
lines.push(` ${time} ${icon}${actor} ${event.summary}`);
|
|
125
|
+
if (event.detail) {
|
|
126
|
+
lines.push(` ${truncate(event.detail, 80)}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return lines.join('\n');
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Detect if an actor is new to a project (never seen in run history).
|
|
133
|
+
*/
|
|
134
|
+
export function isNewActor(actorId, runs, projectAlias) {
|
|
135
|
+
return !runs.some((r) => r.actor_id === actorId && r.project_alias === projectAlias);
|
|
136
|
+
}
|
|
137
|
+
const EVENT_ICONS = {
|
|
138
|
+
run_completed: '✅',
|
|
139
|
+
run_failed: '❌',
|
|
140
|
+
knowledge_added: '💡',
|
|
141
|
+
handoff: '🤝',
|
|
142
|
+
config_change: '⚙️',
|
|
143
|
+
project_switch: '🔀',
|
|
144
|
+
};
|
|
145
|
+
function truncate(text, maxLength) {
|
|
146
|
+
if (text.length <= maxLength)
|
|
147
|
+
return text;
|
|
148
|
+
return text.slice(0, maxLength - 1) + '…';
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=timeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeline.js","sourceRoot":"","sources":["../../src/collaboration/timeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Direction 5: 渐进式信任边界 — Progressive Trust Boundaries
|
|
3
|
+
*
|
|
4
|
+
* Defines operation risk levels and trust tiers that determine
|
|
5
|
+
* what AI is allowed to do autonomously vs. with approval.
|
|
6
|
+
*/
|
|
7
|
+
export type TrustLevel = 'observe' | 'suggest' | 'execute' | 'autonomous';
|
|
8
|
+
export type OperationClass = 'read' | 'write' | 'dangerous';
|
|
9
|
+
export interface TrustPolicy {
|
|
10
|
+
/** Default trust level for new projects. */
|
|
11
|
+
default_level: TrustLevel;
|
|
12
|
+
/** Automatically promote trust after N consecutive successes. */
|
|
13
|
+
auto_promote: boolean;
|
|
14
|
+
promote_after_successes: number;
|
|
15
|
+
/** Demote trust after N consecutive failures. */
|
|
16
|
+
demote_after_failures: number;
|
|
17
|
+
}
|
|
18
|
+
export interface TrustState {
|
|
19
|
+
project_alias: string;
|
|
20
|
+
current_level: TrustLevel;
|
|
21
|
+
consecutive_successes: number;
|
|
22
|
+
consecutive_failures: number;
|
|
23
|
+
total_runs: number;
|
|
24
|
+
total_successes: number;
|
|
25
|
+
total_failures: number;
|
|
26
|
+
last_evaluated_at: string;
|
|
27
|
+
promoted_at?: string;
|
|
28
|
+
demoted_at?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface TrustDecision {
|
|
31
|
+
allowed: boolean;
|
|
32
|
+
requires_approval: boolean;
|
|
33
|
+
reason?: string;
|
|
34
|
+
}
|
|
35
|
+
export declare const DEFAULT_TRUST_POLICY: TrustPolicy;
|
|
36
|
+
export declare function createInitialTrustState(projectAlias: string, level?: TrustLevel): TrustState;
|
|
37
|
+
/**
|
|
38
|
+
* Record a run outcome and potentially adjust trust level.
|
|
39
|
+
*/
|
|
40
|
+
export declare function recordRunOutcome(state: TrustState, success: boolean, policy: TrustPolicy): TrustState;
|
|
41
|
+
/**
|
|
42
|
+
* Classify an operation's risk level from the prompt text.
|
|
43
|
+
*/
|
|
44
|
+
export declare function classifyOperation(prompt: string): OperationClass;
|
|
45
|
+
/**
|
|
46
|
+
* Check if an operation is allowed at the current trust level.
|
|
47
|
+
*/
|
|
48
|
+
export declare function enforceTrustBoundary(trustLevel: TrustLevel, operationClass: OperationClass): TrustDecision;
|
|
49
|
+
export declare function formatTrustState(state: TrustState): string;
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Direction 5: 渐进式信任边界 — Progressive Trust Boundaries
|
|
3
|
+
*
|
|
4
|
+
* Defines operation risk levels and trust tiers that determine
|
|
5
|
+
* what AI is allowed to do autonomously vs. with approval.
|
|
6
|
+
*/
|
|
7
|
+
const TRUST_ORDER = ['observe', 'suggest', 'execute', 'autonomous'];
|
|
8
|
+
export const DEFAULT_TRUST_POLICY = {
|
|
9
|
+
default_level: 'execute',
|
|
10
|
+
auto_promote: true,
|
|
11
|
+
promote_after_successes: 10,
|
|
12
|
+
demote_after_failures: 3,
|
|
13
|
+
};
|
|
14
|
+
export function createInitialTrustState(projectAlias, level) {
|
|
15
|
+
return {
|
|
16
|
+
project_alias: projectAlias,
|
|
17
|
+
current_level: level ?? DEFAULT_TRUST_POLICY.default_level,
|
|
18
|
+
consecutive_successes: 0,
|
|
19
|
+
consecutive_failures: 0,
|
|
20
|
+
total_runs: 0,
|
|
21
|
+
total_successes: 0,
|
|
22
|
+
total_failures: 0,
|
|
23
|
+
last_evaluated_at: new Date().toISOString(),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Record a run outcome and potentially adjust trust level.
|
|
28
|
+
*/
|
|
29
|
+
export function recordRunOutcome(state, success, policy) {
|
|
30
|
+
const updated = {
|
|
31
|
+
...state,
|
|
32
|
+
total_runs: state.total_runs + 1,
|
|
33
|
+
last_evaluated_at: new Date().toISOString(),
|
|
34
|
+
};
|
|
35
|
+
if (success) {
|
|
36
|
+
updated.consecutive_successes = state.consecutive_successes + 1;
|
|
37
|
+
updated.consecutive_failures = 0;
|
|
38
|
+
updated.total_successes = state.total_successes + 1;
|
|
39
|
+
// Check for promotion
|
|
40
|
+
if (policy.auto_promote && updated.consecutive_successes >= policy.promote_after_successes) {
|
|
41
|
+
const promoted = promoteTrust(updated.current_level);
|
|
42
|
+
if (promoted !== updated.current_level) {
|
|
43
|
+
updated.current_level = promoted;
|
|
44
|
+
updated.consecutive_successes = 0;
|
|
45
|
+
updated.promoted_at = updated.last_evaluated_at;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
updated.consecutive_failures = state.consecutive_failures + 1;
|
|
51
|
+
updated.consecutive_successes = 0;
|
|
52
|
+
updated.total_failures = state.total_failures + 1;
|
|
53
|
+
// Check for demotion
|
|
54
|
+
if (updated.consecutive_failures >= policy.demote_after_failures) {
|
|
55
|
+
const demoted = demoteTrust(updated.current_level);
|
|
56
|
+
if (demoted !== updated.current_level) {
|
|
57
|
+
updated.current_level = demoted;
|
|
58
|
+
updated.consecutive_failures = 0;
|
|
59
|
+
updated.demoted_at = updated.last_evaluated_at;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return updated;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Classify an operation's risk level from the prompt text.
|
|
67
|
+
*/
|
|
68
|
+
export function classifyOperation(prompt) {
|
|
69
|
+
const lower = prompt.toLowerCase();
|
|
70
|
+
// Dangerous patterns
|
|
71
|
+
const dangerousPatterns = [
|
|
72
|
+
/\brm\s+-rf\b/,
|
|
73
|
+
/\bdrop\s+(table|database)\b/,
|
|
74
|
+
/\bdelete\s+(all|everything)\b/,
|
|
75
|
+
/\bforce\s*push\b/,
|
|
76
|
+
/\bgit\s+reset\s+--hard\b/,
|
|
77
|
+
/\b(deploy|push)\s+(to\s+)?(prod|production|master|main)\b/,
|
|
78
|
+
/删除所有/,
|
|
79
|
+
/强制推送/,
|
|
80
|
+
/部署到生产/,
|
|
81
|
+
];
|
|
82
|
+
for (const pattern of dangerousPatterns) {
|
|
83
|
+
if (pattern.test(lower))
|
|
84
|
+
return 'dangerous';
|
|
85
|
+
}
|
|
86
|
+
// Write patterns
|
|
87
|
+
const writePatterns = [
|
|
88
|
+
/\b(create|write|modify|update|edit|change|fix|refactor|add|remove|delete|rename)\b/,
|
|
89
|
+
/\b(install|uninstall|upgrade|downgrade)\b/,
|
|
90
|
+
/\b(commit|merge|rebase|cherry.pick)\b/,
|
|
91
|
+
/创建|修改|编辑|添加|删除|重命名|安装|提交|合并/,
|
|
92
|
+
];
|
|
93
|
+
for (const pattern of writePatterns) {
|
|
94
|
+
if (pattern.test(lower))
|
|
95
|
+
return 'write';
|
|
96
|
+
}
|
|
97
|
+
// Default to read
|
|
98
|
+
return 'read';
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Check if an operation is allowed at the current trust level.
|
|
102
|
+
*/
|
|
103
|
+
export function enforceTrustBoundary(trustLevel, operationClass) {
|
|
104
|
+
switch (trustLevel) {
|
|
105
|
+
case 'observe':
|
|
106
|
+
return {
|
|
107
|
+
allowed: operationClass === 'read',
|
|
108
|
+
requires_approval: false,
|
|
109
|
+
reason: operationClass !== 'read'
|
|
110
|
+
? '当前项目信任等级为"观察",只允许只读操作。使用 /trust set suggest 开启审批模式。'
|
|
111
|
+
: undefined,
|
|
112
|
+
};
|
|
113
|
+
case 'suggest':
|
|
114
|
+
return {
|
|
115
|
+
allowed: true,
|
|
116
|
+
requires_approval: operationClass !== 'read',
|
|
117
|
+
reason: operationClass !== 'read'
|
|
118
|
+
? '当前项目信任等级为"建议",写操作需要审批'
|
|
119
|
+
: undefined,
|
|
120
|
+
};
|
|
121
|
+
case 'execute':
|
|
122
|
+
if (operationClass === 'dangerous') {
|
|
123
|
+
return {
|
|
124
|
+
allowed: true,
|
|
125
|
+
requires_approval: true,
|
|
126
|
+
reason: '高危操作需要审批确认',
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
return { allowed: true, requires_approval: false };
|
|
130
|
+
case 'autonomous':
|
|
131
|
+
return { allowed: true, requires_approval: false };
|
|
132
|
+
default:
|
|
133
|
+
return { allowed: false, requires_approval: true, reason: '未知信任等级' };
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
export function formatTrustState(state) {
|
|
137
|
+
const levelLabels = {
|
|
138
|
+
observe: '🔍 观察 (只读)',
|
|
139
|
+
suggest: '💡 建议 (写操作需审批)',
|
|
140
|
+
execute: '⚡ 执行 (高危需审批)',
|
|
141
|
+
autonomous: '🚀 自主 (完全自主)',
|
|
142
|
+
};
|
|
143
|
+
const lines = [];
|
|
144
|
+
lines.push(`🛡️ 信任状态: ${state.project_alias}`);
|
|
145
|
+
lines.push(` 等级: ${levelLabels[state.current_level]}`);
|
|
146
|
+
lines.push(` 总运行: ${state.total_runs} 次 (成功 ${state.total_successes} / 失败 ${state.total_failures})`);
|
|
147
|
+
lines.push(` 连续成功: ${state.consecutive_successes} 次`);
|
|
148
|
+
if (state.promoted_at) {
|
|
149
|
+
lines.push(` 上次提升: ${formatDate(state.promoted_at)}`);
|
|
150
|
+
}
|
|
151
|
+
if (state.demoted_at) {
|
|
152
|
+
lines.push(` 上次降级: ${formatDate(state.demoted_at)}`);
|
|
153
|
+
}
|
|
154
|
+
return lines.join('\n');
|
|
155
|
+
}
|
|
156
|
+
function promoteTrust(current) {
|
|
157
|
+
const index = TRUST_ORDER.indexOf(current);
|
|
158
|
+
if (index < 0 || index >= TRUST_ORDER.length - 1)
|
|
159
|
+
return current;
|
|
160
|
+
return TRUST_ORDER[index + 1] ?? current;
|
|
161
|
+
}
|
|
162
|
+
function demoteTrust(current) {
|
|
163
|
+
const index = TRUST_ORDER.indexOf(current);
|
|
164
|
+
if (index <= 0)
|
|
165
|
+
return current;
|
|
166
|
+
return TRUST_ORDER[index - 1] ?? current;
|
|
167
|
+
}
|
|
168
|
+
function formatDate(iso) {
|
|
169
|
+
return new Date(iso).toLocaleString('zh-CN', {
|
|
170
|
+
month: '2-digit',
|
|
171
|
+
day: '2-digit',
|
|
172
|
+
hour: '2-digit',
|
|
173
|
+
minute: '2-digit',
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=trust.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trust.js","sourceRoot":"","sources":["../../src/collaboration/trust.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAkCH,MAAM,WAAW,GAAiB,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;AAElF,MAAM,CAAC,MAAM,oBAAoB,GAAgB;IAC/C,aAAa,EAAE,SAAS;IACxB,YAAY,EAAE,IAAI;IAClB,uBAAuB,EAAE,EAAE;IAC3B,qBAAqB,EAAE,CAAC;CACzB,CAAC;AAEF,MAAM,UAAU,uBAAuB,CAAC,YAAoB,EAAE,KAAkB;IAC9E,OAAO;QACL,aAAa,EAAE,YAAY;QAC3B,aAAa,EAAE,KAAK,IAAI,oBAAoB,CAAC,aAAa;QAC1D,qBAAqB,EAAE,CAAC;QACxB,oBAAoB,EAAE,CAAC;QACvB,UAAU,EAAE,CAAC;QACb,eAAe,EAAE,CAAC;QAClB,cAAc,EAAE,CAAC;QACjB,iBAAiB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KAC5C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAiB,EACjB,OAAgB,EAChB,MAAmB;IAEnB,MAAM,OAAO,GAAe;QAC1B,GAAG,KAAK;QACR,UAAU,EAAE,KAAK,CAAC,UAAU,GAAG,CAAC;QAChC,iBAAiB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KAC5C,CAAC;IAEF,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,qBAAqB,GAAG,KAAK,CAAC,qBAAqB,GAAG,CAAC,CAAC;QAChE,OAAO,CAAC,oBAAoB,GAAG,CAAC,CAAC;QACjC,OAAO,CAAC,eAAe,GAAG,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC;QAEpD,sBAAsB;QACtB,IAAI,MAAM,CAAC,YAAY,IAAI,OAAO,CAAC,qBAAqB,IAAI,MAAM,CAAC,uBAAuB,EAAE,CAAC;YAC3F,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YACrD,IAAI,QAAQ,KAAK,OAAO,CAAC,aAAa,EAAE,CAAC;gBACvC,OAAO,CAAC,aAAa,GAAG,QAAQ,CAAC;gBACjC,OAAO,CAAC,qBAAqB,GAAG,CAAC,CAAC;gBAClC,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC;YAClD,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,oBAAoB,GAAG,KAAK,CAAC,oBAAoB,GAAG,CAAC,CAAC;QAC9D,OAAO,CAAC,qBAAqB,GAAG,CAAC,CAAC;QAClC,OAAO,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC;QAElD,qBAAqB;QACrB,IAAI,OAAO,CAAC,oBAAoB,IAAI,MAAM,CAAC,qBAAqB,EAAE,CAAC;YACjE,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YACnD,IAAI,OAAO,KAAK,OAAO,CAAC,aAAa,EAAE,CAAC;gBACtC,OAAO,CAAC,aAAa,GAAG,OAAO,CAAC;gBAChC,OAAO,CAAC,oBAAoB,GAAG,CAAC,CAAC;gBACjC,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,iBAAiB,CAAC;YACjD,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IAEnC,qBAAqB;IACrB,MAAM,iBAAiB,GAAG;QACxB,cAAc;QACd,6BAA6B;QAC7B,+BAA+B;QAC/B,kBAAkB;QAClB,0BAA0B;QAC1B,2DAA2D;QAC3D,MAAM;QACN,MAAM;QACN,OAAO;KACR,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,iBAAiB,EAAE,CAAC;QACxC,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,WAAW,CAAC;IAC9C,CAAC;IAED,iBAAiB;IACjB,MAAM,aAAa,GAAG;QACpB,oFAAoF;QACpF,2CAA2C;QAC3C,uCAAuC;QACvC,6BAA6B;KAC9B,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE,CAAC;QACpC,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC;IAC1C,CAAC;IAED,kBAAkB;IAClB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,UAAsB,EACtB,cAA8B;IAE9B,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,SAAS;YACZ,OAAO;gBACL,OAAO,EAAE,cAAc,KAAK,MAAM;gBAClC,iBAAiB,EAAE,KAAK;gBACxB,MAAM,EACJ,cAAc,KAAK,MAAM;oBACvB,CAAC,CAAC,qDAAqD;oBACvD,CAAC,CAAC,SAAS;aAChB,CAAC;QAEJ,KAAK,SAAS;YACZ,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,iBAAiB,EAAE,cAAc,KAAK,MAAM;gBAC5C,MAAM,EACJ,cAAc,KAAK,MAAM;oBACvB,CAAC,CAAC,uBAAuB;oBACzB,CAAC,CAAC,SAAS;aAChB,CAAC;QAEJ,KAAK,SAAS;YACZ,IAAI,cAAc,KAAK,WAAW,EAAE,CAAC;gBACnC,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,iBAAiB,EAAE,IAAI;oBACvB,MAAM,EAAE,YAAY;iBACrB,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC;QAErD,KAAK,YAAY;YACf,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC;QAErD;YACE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACzE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAiB;IAChD,MAAM,WAAW,GAA+B;QAC9C,OAAO,EAAE,YAAY;QACrB,OAAO,EAAE,gBAAgB;QACzB,OAAO,EAAE,cAAc;QACvB,UAAU,EAAE,cAAc;KAC3B,CAAC;IAEF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,aAAa,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC;IAC/C,KAAK,CAAC,IAAI,CAAC,SAAS,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IACxD,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,UAAU,UAAU,KAAK,CAAC,eAAe,SAAS,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC;IACtG,KAAK,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,qBAAqB,IAAI,CAAC,CAAC;IAEvD,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,WAAW,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,WAAW,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,YAAY,CAAC,OAAmB;IACvC,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC;IACjE,OAAO,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC;AAC3C,CAAC;AAED,SAAS,WAAW,CAAC,OAAmB;IACtC,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC;IAC/B,OAAO,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC;AAC3C,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE;QAC3C,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;KAClB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import * as toml from '@iarna/toml';
|
|
5
|
+
import { ensureDir, fileExists } from '../utils/fs.js';
|
|
6
|
+
export async function installBundledCodexSkill(options) {
|
|
7
|
+
const skillName = options.skillName ?? 'feique-session';
|
|
8
|
+
const skillTargetDir = path.join(os.homedir(), '.codex', 'skills', skillName);
|
|
9
|
+
const codexConfigPath = path.join(os.homedir(), '.codex', 'config.toml');
|
|
10
|
+
await fs.rm(skillTargetDir, { recursive: true, force: true });
|
|
11
|
+
await ensureDir(path.dirname(skillTargetDir));
|
|
12
|
+
await fs.cp(options.skillSourceDir, skillTargetDir, { recursive: true });
|
|
13
|
+
const config = (await loadCodexConfig(codexConfigPath)) ?? {};
|
|
14
|
+
const existingSkills = Array.isArray(config.skills?.config) ? config.skills.config : [];
|
|
15
|
+
const normalizedSkillPath = path.resolve(skillTargetDir);
|
|
16
|
+
const hasEntry = existingSkills.some((entry) => isSkillEntry(entry, normalizedSkillPath));
|
|
17
|
+
if (!hasEntry) {
|
|
18
|
+
existingSkills.push({ path: normalizedSkillPath, enabled: true });
|
|
19
|
+
}
|
|
20
|
+
config.skills = {
|
|
21
|
+
...(isObject(config.skills) ? config.skills : {}),
|
|
22
|
+
config: existingSkills,
|
|
23
|
+
};
|
|
24
|
+
await ensureDir(path.dirname(codexConfigPath));
|
|
25
|
+
await fs.writeFile(codexConfigPath, toml.stringify(config), 'utf8');
|
|
26
|
+
return { skillPath: skillTargetDir, configPath: codexConfigPath };
|
|
27
|
+
}
|
|
28
|
+
async function loadCodexConfig(configPath) {
|
|
29
|
+
if (!(await fileExists(configPath))) {
|
|
30
|
+
return {};
|
|
31
|
+
}
|
|
32
|
+
const content = await fs.readFile(configPath, 'utf8');
|
|
33
|
+
return toml.parse(content);
|
|
34
|
+
}
|
|
35
|
+
function isObject(value) {
|
|
36
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
37
|
+
}
|
|
38
|
+
function isSkillEntry(value, expectedPath) {
|
|
39
|
+
if (!isObject(value)) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
return typeof value.path === 'string' && path.resolve(value.path) === expectedPath;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=codex-skill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-skill.js","sourceRoot":"","sources":["../../src/config/codex-skill.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { BridgeConfig } from './schema.js';
|
|
2
|
+
import { type FeishuInspectResult } from '../feishu/diagnostics.js';
|
|
3
|
+
export interface DoctorFinding {
|
|
4
|
+
level: 'info' | 'warn' | 'error';
|
|
5
|
+
message: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function hasDoctorErrors(findings: DoctorFinding[]): boolean;
|
|
8
|
+
export declare function formatDoctorFinding(finding: DoctorFinding): string;
|
|
9
|
+
export declare function runDoctor(config: BridgeConfig): Promise<DoctorFinding[]>;
|
|
10
|
+
export declare function findMissingEnvRefs(configPaths: string[]): Promise<DoctorFinding[]>;
|
|
11
|
+
export declare function runRemoteDoctor(config: BridgeConfig): Promise<DoctorFinding[]>;
|
|
12
|
+
export declare function mapInspectResultToDoctorFindings(result: FeishuInspectResult): DoctorFinding[];
|