fuli-context 0.7.4-beta.3 → 0.7.6
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 +77 -6
- package/README.zh-CN.md +69 -6
- package/compose.graphiti.yml +6 -6
- package/dist/web/assets/AboutPage-sLV9WChi.js +1 -0
- package/dist/web/assets/ConnectionsPage-BWn4ywGJ.js +1 -0
- package/dist/web/assets/KnowledgeEditDialog-CZ5ziPrD.js +1 -0
- package/dist/web/assets/KnowledgeInspector-CRQWOaos.js +1 -0
- package/dist/web/assets/KnowledgeOrganizerPage-Dfj3vIpU.js +1 -0
- package/dist/web/assets/KnowledgePage-BRYC9S5Y.js +1 -0
- package/dist/web/assets/KnowledgeWorkspace-ChEB5Bwk.js +4 -0
- package/dist/web/assets/OverviewPage-Cd66M0RT.js +1 -0
- package/dist/web/assets/PersonalProfilePage-RCFHL0Wz.js +1 -0
- package/dist/web/assets/PersonalProjectsPage-DEh8XWby.js +1 -0
- package/dist/web/assets/ProjectAgentsPage-Crh7PrXa.css +1 -0
- package/dist/web/assets/ProjectAgentsPage-DPnaH-TR.js +11 -0
- package/dist/web/assets/PublicProjectsPage-mstPEjHe.js +1 -0
- package/dist/web/assets/ReviewPage-6Y1SmfZy.js +1 -0
- package/dist/web/assets/SearchableSelect-D3HM8YF8.js +1 -0
- package/dist/web/assets/SettingsPage--LdTMUm7.js +1 -0
- package/dist/web/assets/SettingsPage-CwZp2ka4.css +1 -0
- package/dist/web/assets/WritingTastePage-CIpKswvs.js +1 -0
- package/dist/web/assets/{console-D_2zC4lm.js → console-BT1P2Db4.js} +1 -1
- package/dist/web/assets/{conversation-launcher-settings-DQmMH2j7.js → conversation-launcher-settings-DrJEotdf.js} +1 -1
- package/dist/web/assets/i18n-js6gfc7j.js +9 -0
- package/dist/web/assets/{identity-DmGcY3Y6.js → identity-CfDfanpa.js} +1 -1
- package/dist/web/assets/index-BnH5mcZx.css +1 -0
- package/dist/web/assets/index-GqJf1xqg.js +2 -0
- package/dist/web/assets/{model-CVoOdRsL.js → model-DJkLAJsg.js} +1 -1
- package/dist/web/assets/{useApi-CROJJdhE-CBNg4CdH.js → useApi-CROJJdhE-BdSti7Y2.js} +1 -1
- package/dist/web/assets/vue-router-Kk67EaCP.js +1 -0
- package/dist/web/index.html +6 -6
- package/graph-provider/fuli_graph/app.py +8 -0
- package/graph-provider/fuli_graph/collaboration_context.py +69 -6
- package/graph-provider/fuli_graph/knowledge_search.py +84 -5
- package/graph-provider/fuli_graph/model_validation.py +130 -0
- package/graph-provider/fuli_graph/models.py +24 -5
- package/graph-provider/fuli_graph/project_agent_access.py +54 -0
- package/graph-provider/fuli_graph/project_agent_coordination_models.py +22 -0
- package/graph-provider/fuli_graph/project_agent_executor_models.py +635 -0
- package/graph-provider/fuli_graph/project_agent_models.py +278 -0
- package/graph-provider/fuli_graph/project_agent_routes.py +626 -0
- package/graph-provider/fuli_graph/project_agent_task_models.py +545 -0
- package/graph-provider/fuli_graph/runtime.py +259 -0
- package/graph-provider/fuli_graph/search_projection.py +3 -0
- package/graph-provider/fuli_graph/store.py +6 -0
- package/graph-provider/fuli_graph/store_knowledge.py +62 -9
- package/graph-provider/fuli_graph/store_project_agent_coordination_policy.py +122 -0
- package/graph-provider/fuli_graph/store_project_agent_executor_learning.py +756 -0
- package/graph-provider/fuli_graph/store_project_agent_executor_routing.py +601 -0
- package/graph-provider/fuli_graph/store_project_agent_executors.py +1087 -0
- package/graph-provider/fuli_graph/store_project_agent_task_reads.py +458 -0
- package/graph-provider/fuli_graph/store_project_agent_task_recruitment.py +705 -0
- package/graph-provider/fuli_graph/store_project_agent_task_staffing.py +586 -0
- package/graph-provider/fuli_graph/store_project_agent_tasks.py +1151 -0
- package/graph-provider/fuli_graph/store_project_agents.py +965 -0
- package/graph-provider/pyproject.toml +2 -1
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
- package/skills/capturing-session-knowledge/SKILL.md +39 -0
- package/src/adaptive-runtime/executor-pool.js +127 -0
- package/src/adaptive-runtime/graph-services.js +166 -0
- package/src/adaptive-runtime/lease-client.js +335 -0
- package/src/adaptive-runtime/runtime-broker.js +318 -0
- package/src/adaptive-runtime/settings.js +111 -0
- package/src/adaptive-runtime/state.js +74 -0
- package/src/agent-tools/graph-definitions.js +419 -0
- package/src/agent-tools/graph-handlers.js +65 -0
- package/src/agent-tools/project-agent-definitions.js +307 -0
- package/src/backup/graph-backup.js +289 -0
- package/src/backup/identity-reconciliation.js +208 -0
- package/src/backup/runtime-adapters.js +269 -0
- package/src/cli/command-registry.js +6 -2
- package/src/cli/graph-data-command.js +112 -0
- package/src/cli/local-runtime-command.js +16 -2
- package/src/cli/setup-command.js +19 -3
- package/src/cli/update-command.js +4 -0
- package/src/cli.js +6 -0
- package/src/graphiti/collaboration-preference-projection.js +29 -1
- package/src/graphiti/collaboration-preference-workflow.js +121 -0
- package/src/graphiti/federated-application.js +53 -90
- package/src/graphiti/project-agent-control-plane.js +275 -0
- package/src/graphiti/project-agent-mapping.js +1024 -0
- package/src/graphiti/project-agent-workflows.js +576 -0
- package/src/graphiti/provider-client.js +282 -1
- package/src/http/api-router.js +63 -9
- package/src/http/graph-api-router.js +290 -0
- package/src/local-runtime/lifecycle.js +46 -10
- package/src/mcp/context-resources.js +15 -6
- package/src/mcp/create-mcp-server.js +51 -16
- package/src/mcp/instructions.js +7 -5
- package/src/mcp/runtime.js +17 -5
- package/src/mcp/session-id.js +38 -1
- package/src/mcp/tool-annotations.js +71 -0
- package/src/mcp-server.js +23 -6
- package/src/native-runtime/runtime.js +717 -0
- package/src/server.js +6 -2
- package/src/setup/agent-installation-status.js +7 -1
- package/src/setup/agents.js +3 -1
- package/src/setup/claude-code-config.js +3 -1
- package/src/setup/codex-bootstrap.js +11 -10
- package/src/setup/codex-config.js +7 -1
- package/src/setup/cursor-config.js +3 -1
- package/src/setup/graph-runtime.js +158 -13
- package/src/setup/neo4j-memory-profile.js +43 -0
- package/src/setup/options.js +38 -2
- package/src/setup/paths.js +14 -0
- package/src/setup/setup.js +37 -1
- package/src/system/resource-monitor.js +181 -16
- package/src/system/runtime-settings.js +10 -1
- package/src/system/system-service.js +27 -2
- package/dist/web/assets/AboutPage-Dpf5fRWv.js +0 -1
- package/dist/web/assets/ConnectionsPage-D21aUDCP.js +0 -1
- package/dist/web/assets/KnowledgeEditDialog-u7lpfN3j.js +0 -1
- package/dist/web/assets/KnowledgeInspector-k4xnHtXd.js +0 -1
- package/dist/web/assets/KnowledgeOrganizerPage-Bdj7Rn84.js +0 -1
- package/dist/web/assets/KnowledgePage-UHVAbC1W.js +0 -1
- package/dist/web/assets/KnowledgeWorkspace-Lq3d-MeC.js +0 -4
- package/dist/web/assets/OverviewPage-CycAgA1V.js +0 -1
- package/dist/web/assets/PersonalProfilePage-U9oIV5FT.js +0 -1
- package/dist/web/assets/PersonalProjectsPage-C5RpXKcA.js +0 -1
- package/dist/web/assets/PublicProjectsPage-DiWxm35E.js +0 -1
- package/dist/web/assets/ReviewPage-jxRfGSJK.js +0 -1
- package/dist/web/assets/SearchableSelect-B3-5IPup.js +0 -1
- package/dist/web/assets/SettingsPage-BqfGDOho.js +0 -1
- package/dist/web/assets/SettingsPage-CAfz4qiV.css +0 -1
- package/dist/web/assets/WritingTastePage-BJxhMqJR.js +0 -1
- package/dist/web/assets/i18n-CwqXDI1C.js +0 -5
- package/dist/web/assets/index-IUGLt4lG.js +0 -2
- package/dist/web/assets/index-X2j29j8i.css +0 -1
- package/dist/web/assets/vue-router-CWSsUUio.js +0 -1
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { chmodSync } from 'node:fs';
|
|
2
|
+
|
|
3
|
+
import { readJsonFile, writeJsonFileAtomic } from '../storage/json-file.js';
|
|
4
|
+
|
|
5
|
+
export const ADAPTIVE_RUNTIME_SETTINGS_VERSION = 1;
|
|
6
|
+
|
|
7
|
+
// These are product defaults, not measured hardware limits. They favor low idle
|
|
8
|
+
// memory while leaving enough time for short bursts of related Agent requests.
|
|
9
|
+
export const DEFAULT_ADAPTIVE_RUNTIME_SETTINGS = deepFreeze({
|
|
10
|
+
version: ADAPTIVE_RUNTIME_SETTINGS_VERSION,
|
|
11
|
+
enabled: false,
|
|
12
|
+
providerIdleSeconds: 60,
|
|
13
|
+
databaseIdleSeconds: 180,
|
|
14
|
+
executorIdleSeconds: 60,
|
|
15
|
+
leaseTtlSeconds: 180
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
export function readAdaptiveRuntimeSettings(path, {
|
|
19
|
+
fallback = DEFAULT_ADAPTIVE_RUNTIME_SETTINGS,
|
|
20
|
+
read = readJsonFile
|
|
21
|
+
} = {}) {
|
|
22
|
+
if (!path) return normalizeAdaptiveRuntimeSettings(fallback);
|
|
23
|
+
return normalizeAdaptiveRuntimeSettings(read(path, null) ?? fallback, { base: fallback });
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function writeAdaptiveRuntimeSettings(path, input, {
|
|
27
|
+
write = writeJsonFileAtomic,
|
|
28
|
+
secure = (filePath) => chmodSync(filePath, 0o600)
|
|
29
|
+
} = {}) {
|
|
30
|
+
if (!path) throw new TypeError('Adaptive runtime settings path is required');
|
|
31
|
+
const settings = normalizeAdaptiveRuntimeSettings(input, { strict: true });
|
|
32
|
+
write(path, settings);
|
|
33
|
+
secure(path);
|
|
34
|
+
return settings;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function normalizeAdaptiveRuntimeSettings(input, {
|
|
38
|
+
base = DEFAULT_ADAPTIVE_RUNTIME_SETTINGS,
|
|
39
|
+
strict = false
|
|
40
|
+
} = {}) {
|
|
41
|
+
if (!input || typeof input !== 'object' || Array.isArray(input)) {
|
|
42
|
+
throw new TypeError('Adaptive runtime settings must be an object');
|
|
43
|
+
}
|
|
44
|
+
if (
|
|
45
|
+
input.version !== undefined &&
|
|
46
|
+
input.version !== ADAPTIVE_RUNTIME_SETTINGS_VERSION
|
|
47
|
+
) {
|
|
48
|
+
throw new TypeError('Unsupported adaptive runtime settings version');
|
|
49
|
+
}
|
|
50
|
+
if (strict && typeof input.enabled !== 'boolean') {
|
|
51
|
+
throw new TypeError('enabled is required');
|
|
52
|
+
}
|
|
53
|
+
const enabled = input.enabled ?? base.enabled;
|
|
54
|
+
if (typeof enabled !== 'boolean') throw new TypeError('enabled must be a boolean');
|
|
55
|
+
const providerIdleSeconds = duration(
|
|
56
|
+
input.providerIdleSeconds ?? base.providerIdleSeconds,
|
|
57
|
+
'providerIdleSeconds',
|
|
58
|
+
15,
|
|
59
|
+
86_400
|
|
60
|
+
);
|
|
61
|
+
const databaseIdleSeconds = duration(
|
|
62
|
+
input.databaseIdleSeconds ?? base.databaseIdleSeconds,
|
|
63
|
+
'databaseIdleSeconds',
|
|
64
|
+
providerIdleSeconds,
|
|
65
|
+
604_800
|
|
66
|
+
);
|
|
67
|
+
const executorIdleSeconds = duration(
|
|
68
|
+
input.executorIdleSeconds ?? base.executorIdleSeconds,
|
|
69
|
+
'executorIdleSeconds',
|
|
70
|
+
15,
|
|
71
|
+
86_400
|
|
72
|
+
);
|
|
73
|
+
const leaseTtlSeconds = duration(
|
|
74
|
+
input.leaseTtlSeconds ?? base.leaseTtlSeconds,
|
|
75
|
+
'leaseTtlSeconds',
|
|
76
|
+
30,
|
|
77
|
+
3_600
|
|
78
|
+
);
|
|
79
|
+
return {
|
|
80
|
+
version: ADAPTIVE_RUNTIME_SETTINGS_VERSION,
|
|
81
|
+
enabled,
|
|
82
|
+
providerIdleSeconds,
|
|
83
|
+
databaseIdleSeconds,
|
|
84
|
+
executorIdleSeconds,
|
|
85
|
+
leaseTtlSeconds
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export function adaptiveRuntimeSettingsWithOverrides(settings, {
|
|
90
|
+
enabled = null
|
|
91
|
+
} = {}) {
|
|
92
|
+
return normalizeAdaptiveRuntimeSettings({
|
|
93
|
+
...settings,
|
|
94
|
+
...(enabled === null ? {} : { enabled })
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function duration(value, label, minimum, maximum) {
|
|
99
|
+
if (!Number.isInteger(value) || value < minimum || value > maximum) {
|
|
100
|
+
throw new TypeError(`${label} must be an integer between ${minimum} and ${maximum}`);
|
|
101
|
+
}
|
|
102
|
+
return value;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function deepFreeze(value) {
|
|
106
|
+
Object.freeze(value);
|
|
107
|
+
for (const child of Object.values(value)) {
|
|
108
|
+
if (child && typeof child === 'object' && !Object.isFrozen(child)) deepFreeze(child);
|
|
109
|
+
}
|
|
110
|
+
return value;
|
|
111
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { readJsonFile, writeJsonFileAtomic } from '../storage/json-file.js';
|
|
2
|
+
|
|
3
|
+
export const ADAPTIVE_RUNTIME_STATE_VERSION = 1;
|
|
4
|
+
export const ADAPTIVE_RUNTIME_STAGES = Object.freeze([
|
|
5
|
+
'always-on',
|
|
6
|
+
'awake',
|
|
7
|
+
'provider-sleeping',
|
|
8
|
+
'sleeping',
|
|
9
|
+
'waking',
|
|
10
|
+
'degraded'
|
|
11
|
+
]);
|
|
12
|
+
|
|
13
|
+
export function readAdaptiveRuntimeState(path, {
|
|
14
|
+
read = readJsonFile
|
|
15
|
+
} = {}) {
|
|
16
|
+
if (!path) return null;
|
|
17
|
+
try {
|
|
18
|
+
return normalizeAdaptiveRuntimeState(read(path, null));
|
|
19
|
+
} catch {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function writeAdaptiveRuntimeState(path, state, {
|
|
25
|
+
write = writeJsonFileAtomic
|
|
26
|
+
} = {}) {
|
|
27
|
+
if (!path) return null;
|
|
28
|
+
const normalized = normalizeAdaptiveRuntimeState(state, { required: true });
|
|
29
|
+
write(path, normalized);
|
|
30
|
+
return normalized;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function initialAdaptiveRuntimeState({ enabled, now = new Date() }) {
|
|
34
|
+
const timestamp = dateIso(now);
|
|
35
|
+
return {
|
|
36
|
+
version: ADAPTIVE_RUNTIME_STATE_VERSION,
|
|
37
|
+
stage: enabled ? 'awake' : 'always-on',
|
|
38
|
+
lastActivityAt: timestamp,
|
|
39
|
+
updatedAt: timestamp,
|
|
40
|
+
lastError: null
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function normalizeAdaptiveRuntimeState(input, { required = false } = {}) {
|
|
45
|
+
if (input == null && !required) return null;
|
|
46
|
+
if (!input || typeof input !== 'object' || Array.isArray(input)) {
|
|
47
|
+
throw new TypeError('Adaptive runtime state must be an object');
|
|
48
|
+
}
|
|
49
|
+
if (input.version !== ADAPTIVE_RUNTIME_STATE_VERSION) {
|
|
50
|
+
throw new TypeError('Unsupported adaptive runtime state version');
|
|
51
|
+
}
|
|
52
|
+
if (!ADAPTIVE_RUNTIME_STAGES.includes(input.stage)) {
|
|
53
|
+
throw new TypeError('Unsupported adaptive runtime stage');
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
version: ADAPTIVE_RUNTIME_STATE_VERSION,
|
|
57
|
+
stage: input.stage,
|
|
58
|
+
lastActivityAt: dateIso(input.lastActivityAt),
|
|
59
|
+
updatedAt: dateIso(input.updatedAt),
|
|
60
|
+
lastError: optionalText(input.lastError, 500)
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function dateIso(value) {
|
|
65
|
+
const date = value instanceof Date ? value : new Date(value);
|
|
66
|
+
if (Number.isNaN(date.getTime())) throw new TypeError('Adaptive runtime date is invalid');
|
|
67
|
+
return date.toISOString();
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function optionalText(value, maximumLength) {
|
|
71
|
+
if (value === undefined || value === null || value === '') return null;
|
|
72
|
+
if (typeof value !== 'string') throw new TypeError('Adaptive runtime error must be text');
|
|
73
|
+
return value.replace(/[\r\n\t]+/g, ' ').trim().slice(0, maximumLength) || null;
|
|
74
|
+
}
|
|
@@ -8,11 +8,35 @@ import {
|
|
|
8
8
|
objectSchema,
|
|
9
9
|
stringSchema
|
|
10
10
|
} from './schema.js';
|
|
11
|
+
import {
|
|
12
|
+
executorActualReportInput,
|
|
13
|
+
executorAuthorizationStatus,
|
|
14
|
+
executorHealthStatus,
|
|
15
|
+
executorModel,
|
|
16
|
+
executorProfile,
|
|
17
|
+
executorRoutingRuleInput,
|
|
18
|
+
nullableProjectAgentStatus,
|
|
19
|
+
projectAgentAssignmentEndInput,
|
|
20
|
+
projectAgentAssignmentInput,
|
|
21
|
+
projectAgentAssignmentReplaceInput,
|
|
22
|
+
projectAgentAssignmentStatus,
|
|
23
|
+
projectAgentModelStrategy,
|
|
24
|
+
projectAgentProfile,
|
|
25
|
+
projectAgentTaskActivityInput,
|
|
26
|
+
projectAgentTaskCoordinateInput,
|
|
27
|
+
projectAgentTaskOutcomeInput,
|
|
28
|
+
projectAgentTaskSubmitInput,
|
|
29
|
+
recruitmentConfirmationMode,
|
|
30
|
+
recruitmentDecision,
|
|
31
|
+
recruitmentStatus,
|
|
32
|
+
routingRuleScope
|
|
33
|
+
} from './project-agent-definitions.js';
|
|
11
34
|
|
|
12
35
|
const id = boundedString(256);
|
|
13
36
|
const label = boundedString(512);
|
|
14
37
|
const shortText = boundedString(2048);
|
|
15
38
|
const longText = boundedString(8192);
|
|
39
|
+
const idempotencyKey = { ...boundedString(256), minLength: 8 };
|
|
16
40
|
const dateTime = { ...boundedString(64), format: 'date-time' };
|
|
17
41
|
const sourceUri = {
|
|
18
42
|
type: ['string', 'null'],
|
|
@@ -161,6 +185,7 @@ const projectProfile = objectSchema({
|
|
|
161
185
|
assessment: { ...projectAssessment, type: ['object', 'null'] }
|
|
162
186
|
}, ['name']);
|
|
163
187
|
|
|
188
|
+
|
|
164
189
|
const personalProjectActionIntent = {
|
|
165
190
|
personalSpaceId: id,
|
|
166
191
|
itemKind: enumSchema(['entity']),
|
|
@@ -286,6 +311,7 @@ export const GRAPH_TOOL_DEFINITIONS = [
|
|
|
286
311
|
projectPath: boundedString(4096),
|
|
287
312
|
taskPrompt: boundedString(8192),
|
|
288
313
|
personalProjectId: nullableStringSchema(),
|
|
314
|
+
projectAgentId: nullableStringSchema(),
|
|
289
315
|
limit: integerSchema({ minimum: 1, maximum: 200 })
|
|
290
316
|
}, ['projectPath'])
|
|
291
317
|
},
|
|
@@ -332,6 +358,10 @@ export const GRAPH_TOOL_DEFINITIONS = [
|
|
|
332
358
|
...nullableStringSchema(),
|
|
333
359
|
description: 'Local personal project scope. Only meaningful with targetKind "personal".'
|
|
334
360
|
},
|
|
361
|
+
projectAgentId: {
|
|
362
|
+
...nullableStringSchema(),
|
|
363
|
+
description: 'Optional project Agent owner for this knowledge. Requires targetKind "personal" and personalProjectId. Agent-scoped preferences and memory are excluded from every other Agent and from ordinary project-only retrieval.'
|
|
364
|
+
},
|
|
335
365
|
providerUrl: {
|
|
336
366
|
...nullableStringSchema(),
|
|
337
367
|
description: 'Required with targetKind "project" and ignored for "personal".'
|
|
@@ -411,6 +441,7 @@ export const GRAPH_TOOL_DEFINITIONS = [
|
|
|
411
441
|
personalSpaceId: id,
|
|
412
442
|
query: shortText,
|
|
413
443
|
personalProjectId: nullableStringSchema(),
|
|
444
|
+
projectAgentId: nullableStringSchema(),
|
|
414
445
|
contextPersonalProjectIds: arraySchema(id, { maxItems: 15 }),
|
|
415
446
|
personalProjectScope: enumSchema(['bounded', 'all_local_confirmed']),
|
|
416
447
|
projectIds: arraySchema(id, { maxItems: 32 }),
|
|
@@ -597,6 +628,394 @@ export const GRAPH_TOOL_DEFINITIONS = [
|
|
|
597
628
|
description: 'List local personal project profiles and their current evidence-backed coverage summaries.',
|
|
598
629
|
inputSchema: objectSchema({ personalSpaceId: id })
|
|
599
630
|
},
|
|
631
|
+
{
|
|
632
|
+
name: 'upsert_project_agent',
|
|
633
|
+
title: 'WRITE · Create or update a project Agent',
|
|
634
|
+
description: 'Create or update one model-independent long-lived Agent bound to an existing local personal project. The profile is a lightweight project directory record: name, responsibility, capabilities, initial preferences, and status. This does not start a model or copy project knowledge into the Agent.',
|
|
635
|
+
inputSchema: objectSchema({
|
|
636
|
+
personalSpaceId: id,
|
|
637
|
+
personalProjectId: nullableStringSchema(),
|
|
638
|
+
agentId: boundedString(128),
|
|
639
|
+
profile: projectAgentProfile
|
|
640
|
+
}, ['personalSpaceId', 'agentId', 'profile'])
|
|
641
|
+
},
|
|
642
|
+
{
|
|
643
|
+
name: 'list_project_agents',
|
|
644
|
+
title: 'READ · Find project Agents by responsibility',
|
|
645
|
+
description: 'Resolve the exact local project from projectPath and return its lightweight Agent directory. Optionally filter active/inactive/archived records or find Agents whose capabilities or responsibility match a capability query. This never loads another Agent\'s private memory.',
|
|
646
|
+
inputSchema: objectSchema({
|
|
647
|
+
projectPath: boundedString(4096),
|
|
648
|
+
status: nullableProjectAgentStatus,
|
|
649
|
+
capability: nullableStringSchema()
|
|
650
|
+
}, ['projectPath'])
|
|
651
|
+
},
|
|
652
|
+
{
|
|
653
|
+
name: 'get_project_agent_context',
|
|
654
|
+
title: 'READ · Assemble one project Agent context',
|
|
655
|
+
description: 'Resolve one active project Agent and assemble only the context needed for the task: personal-global rules, exact and authorized inherited project knowledge, this Agent\'s preferences and memory, and focused query results. It excludes every other project Agent. Fuli remains a control layer; the calling host Agent performs reasoning and execution.',
|
|
656
|
+
inputSchema: objectSchema({
|
|
657
|
+
projectPath: boundedString(4096),
|
|
658
|
+
agentId: boundedString(128),
|
|
659
|
+
queries: arraySchema(shortText, { minItems: 1, maxItems: 10 }),
|
|
660
|
+
limitPerQuery: integerSchema({ minimum: 1, maximum: 50 }),
|
|
661
|
+
includePending: booleanSchema()
|
|
662
|
+
}, ['projectPath', 'agentId', 'queries'])
|
|
663
|
+
},
|
|
664
|
+
{
|
|
665
|
+
name: 'get_project_agent',
|
|
666
|
+
title: 'READ · Get one space-level Agent',
|
|
667
|
+
description: 'Read one FULI space-level Agent identity, assignments, recruitment source, memory boundary, configured status, observed clients, and actual task state. Configured status is not a connection or online claim.',
|
|
668
|
+
inputSchema: objectSchema({
|
|
669
|
+
personalSpaceId: id,
|
|
670
|
+
personalProjectId: nullableStringSchema(),
|
|
671
|
+
agentId: id
|
|
672
|
+
}, ['personalSpaceId', 'agentId'])
|
|
673
|
+
},
|
|
674
|
+
{
|
|
675
|
+
name: 'delete_project_agent',
|
|
676
|
+
title: 'WRITE · Archive one Agent identity',
|
|
677
|
+
description: 'Archive one space-level Agent identity through the Provider after an explicit reason. Active assignments end, but task history, recruitment records, and routing audit remain preserved; the system coordinator cannot be archived.',
|
|
678
|
+
inputSchema: objectSchema({
|
|
679
|
+
personalSpaceId: id,
|
|
680
|
+
agentId: id,
|
|
681
|
+
reason: shortText
|
|
682
|
+
}, ['personalSpaceId', 'agentId', 'reason'])
|
|
683
|
+
},
|
|
684
|
+
{
|
|
685
|
+
name: 'cleanup_test_project_agents',
|
|
686
|
+
title: 'WRITE · Archive test Agent roles',
|
|
687
|
+
description: 'Archive only test-marked Project Agents for one explicit test source through the Provider. Durable production identities are not touched; the result reports the number archived for cleanup verification.',
|
|
688
|
+
inputSchema: objectSchema({
|
|
689
|
+
personalSpaceId: id,
|
|
690
|
+
testSource: boundedString(256)
|
|
691
|
+
}, ['personalSpaceId', 'testSource'])
|
|
692
|
+
},
|
|
693
|
+
{
|
|
694
|
+
name: 'create_project_agent_assignment',
|
|
695
|
+
title: 'WRITE · Assign an Agent to a project',
|
|
696
|
+
description: 'Create one project-specific Agent assignment. The same space-level Agent may have many assignments; responsibility, capabilities, model override, and memory boundary stay project-scoped.',
|
|
697
|
+
inputSchema: projectAgentAssignmentInput
|
|
698
|
+
},
|
|
699
|
+
{
|
|
700
|
+
name: 'list_project_agent_assignments',
|
|
701
|
+
title: 'READ · List Agent assignments',
|
|
702
|
+
description: 'List project-Agent assignments and their full active/ended history. Never infer a runtime connection from assignment status.',
|
|
703
|
+
inputSchema: objectSchema({
|
|
704
|
+
personalSpaceId: id,
|
|
705
|
+
personalProjectId: nullableStringSchema(),
|
|
706
|
+
agentId: nullableStringSchema(),
|
|
707
|
+
status: { ...projectAgentAssignmentStatus, type: ['string', 'null'] }
|
|
708
|
+
}, ['personalSpaceId'])
|
|
709
|
+
},
|
|
710
|
+
{
|
|
711
|
+
name: 'end_project_agent_assignment',
|
|
712
|
+
title: 'WRITE · End an Agent assignment',
|
|
713
|
+
description: 'End one project-Agent assignment with an expected revision. Stale revisions are rejected; the Agent and task history remain intact.',
|
|
714
|
+
inputSchema: projectAgentAssignmentEndInput
|
|
715
|
+
},
|
|
716
|
+
{
|
|
717
|
+
name: 'replace_project_agent_assignment',
|
|
718
|
+
title: 'WRITE · Replace an Agent assignment',
|
|
719
|
+
description: 'Atomically end one assignment and create its replacement, preserving replacement history and explicit reason.',
|
|
720
|
+
inputSchema: projectAgentAssignmentReplaceInput
|
|
721
|
+
},
|
|
722
|
+
{
|
|
723
|
+
name: 'coordinate_project_agent_task',
|
|
724
|
+
title: 'WRITE · Prepare a host-executed Agent team',
|
|
725
|
+
description: 'Resolve the exact local project, let the Provider coordinator route one durable task, and assemble an isolated context bundle for every selected lead/collaborator. The result is a truthful host execution plan: Fuli persists identity, staffing, and memory scope, while the calling host must start real workers, report their concrete worker/executor evidence, and finish their lifecycle. This tool never claims that a selected Agent is online or that a worker was started.',
|
|
726
|
+
inputSchema: projectAgentTaskCoordinateInput
|
|
727
|
+
},
|
|
728
|
+
{
|
|
729
|
+
name: 'acquire_runtime_lease',
|
|
730
|
+
title: 'WRITE · Keep adaptive runtime awake',
|
|
731
|
+
description: 'Acquire a host-held local adaptive-runtime lease before starting real project Agent workers. The MCP process heartbeats the lease until release; disabled adaptive mode returns a safe no-op handle. Use graph for Provider/database work and executor only for an executor managed by Fuli.',
|
|
732
|
+
inputSchema: objectSchema({
|
|
733
|
+
kind: enumSchema(['graph', 'executor']),
|
|
734
|
+
executorId: nullableStringSchema(),
|
|
735
|
+
owner: boundedString(256)
|
|
736
|
+
}, ['kind', 'owner'])
|
|
737
|
+
},
|
|
738
|
+
{
|
|
739
|
+
name: 'refresh_runtime_lease',
|
|
740
|
+
title: 'WRITE · Refresh adaptive runtime lease',
|
|
741
|
+
description: 'Explicitly refresh one lease owned by this MCP process. Automatic heartbeat normally makes this unnecessary; a missing or expired handle returns refreshed=false.',
|
|
742
|
+
inputSchema: objectSchema({ leaseId: id }, ['leaseId'])
|
|
743
|
+
},
|
|
744
|
+
{
|
|
745
|
+
name: 'release_runtime_lease',
|
|
746
|
+
title: 'WRITE · Release adaptive runtime lease',
|
|
747
|
+
description: 'Stop the heartbeat and release one host-held adaptive-runtime lease in a finally path. Repeated release is safe and returns released=false.',
|
|
748
|
+
inputSchema: objectSchema({ leaseId: id }, ['leaseId'])
|
|
749
|
+
},
|
|
750
|
+
{
|
|
751
|
+
name: 'submit_project_agent_task',
|
|
752
|
+
title: 'WRITE · Submit a routed Agent task',
|
|
753
|
+
description: 'Submit one durable task to the FULI control plane. Existing matching durable Agents are preferred; no anonymous temporary Agent is created. The Agent locked executor policy outranks task, assignment, project, and space rules; explicit user priority is never lowered for token savings. The space coordinator, complexity, model strategy, routing decision, boundaries, actual executor/model/rule/fallback audit fields, and any HR disclosure are persisted by the Provider.',
|
|
754
|
+
inputSchema: projectAgentTaskSubmitInput
|
|
755
|
+
},
|
|
756
|
+
{
|
|
757
|
+
name: 'view_project_agent_task',
|
|
758
|
+
title: 'READ · View task, routing, and events',
|
|
759
|
+
description: 'View one task with lead/collaborator assignments, routing decision, effective model strategy, source client/session, event history, actual executor/model, routing rule, and fallback audit. Missing connected state is not synthesized.',
|
|
760
|
+
inputSchema: objectSchema({
|
|
761
|
+
personalSpaceId: id,
|
|
762
|
+
taskId: id,
|
|
763
|
+
includeEvents: booleanSchema()
|
|
764
|
+
}, ['personalSpaceId', 'taskId'])
|
|
765
|
+
},
|
|
766
|
+
{
|
|
767
|
+
name: 'record_project_agent_task_activity',
|
|
768
|
+
title: 'WRITE · Record task activity',
|
|
769
|
+
description: 'Record one explicit task event, including real terminal activity and actual executor/model/client attribution. Terminal activity is the only source for per-Agent activity summaries.',
|
|
770
|
+
inputSchema: projectAgentTaskActivityInput
|
|
771
|
+
},
|
|
772
|
+
{
|
|
773
|
+
name: 'view_project_agent_activity',
|
|
774
|
+
title: 'READ · View Agent terminal activity',
|
|
775
|
+
description: 'Return actual per-Agent daily completed/failed/cancelled activity and verifiable summaries. No history is fabricated and configured Agent status is not treated as running state.',
|
|
776
|
+
inputSchema: objectSchema({
|
|
777
|
+
personalSpaceId: id,
|
|
778
|
+
agentId: id,
|
|
779
|
+
fromDate: nullableStringSchema(),
|
|
780
|
+
toDate: nullableStringSchema()
|
|
781
|
+
}, ['personalSpaceId', 'agentId'])
|
|
782
|
+
},
|
|
783
|
+
{
|
|
784
|
+
name: 'get_project_agent_coordination_policy',
|
|
785
|
+
title: 'READ · Get project Agent continuity policy',
|
|
786
|
+
description: 'Read the exact project policy for asking before recruitment and automatically reusing the previous effective Agent. Both switches default on.',
|
|
787
|
+
inputSchema: objectSchema({
|
|
788
|
+
personalSpaceId: id,
|
|
789
|
+
personalProjectId: id
|
|
790
|
+
}, ['personalSpaceId', 'personalProjectId'])
|
|
791
|
+
},
|
|
792
|
+
{
|
|
793
|
+
name: 'update_project_agent_coordination_policy',
|
|
794
|
+
title: 'WRITE · Set project Agent continuity policy',
|
|
795
|
+
description: 'Persist the exact project switches for asking before recruitment and automatically reusing its previous effective Agent. This changes policy only and never starts a worker.',
|
|
796
|
+
inputSchema: objectSchema({
|
|
797
|
+
personalSpaceId: id,
|
|
798
|
+
personalProjectId: id,
|
|
799
|
+
askBeforeRecruitment: booleanSchema(),
|
|
800
|
+
autoReusePreviousAgent: booleanSchema()
|
|
801
|
+
}, [
|
|
802
|
+
'personalSpaceId', 'personalProjectId',
|
|
803
|
+
'askBeforeRecruitment', 'autoReusePreviousAgent'
|
|
804
|
+
])
|
|
805
|
+
},
|
|
806
|
+
{
|
|
807
|
+
name: 'get_project_agent_recruitment_policy',
|
|
808
|
+
title: 'READ · Get recruitment policy',
|
|
809
|
+
description: 'Read the persisted recruitment confirmation mode. The default is automatic; require_confirmation creates only a pending recruitment event.',
|
|
810
|
+
inputSchema: objectSchema({ personalSpaceId: id }, ['personalSpaceId'])
|
|
811
|
+
},
|
|
812
|
+
{
|
|
813
|
+
name: 'update_project_agent_recruitment_policy',
|
|
814
|
+
title: 'WRITE · Set recruitment policy',
|
|
815
|
+
description: 'Persist automatic or require_confirmation recruitment authorization. This changes policy only; it does not create an Agent or recruitment record by itself.',
|
|
816
|
+
inputSchema: objectSchema({
|
|
817
|
+
personalSpaceId: id,
|
|
818
|
+
confirmationMode: recruitmentConfirmationMode
|
|
819
|
+
}, ['personalSpaceId', 'confirmationMode'])
|
|
820
|
+
},
|
|
821
|
+
{
|
|
822
|
+
name: 'list_project_agent_recruitments',
|
|
823
|
+
title: 'READ · List recruitment records',
|
|
824
|
+
description: 'List auditable HR recruitment records with trigger client/session, role, capabilities, position kind, reason, status, and created/recruited Agent.',
|
|
825
|
+
inputSchema: objectSchema({
|
|
826
|
+
personalSpaceId: id,
|
|
827
|
+
personalProjectId: nullableStringSchema(),
|
|
828
|
+
taskId: nullableStringSchema(),
|
|
829
|
+
status: { ...recruitmentStatus, type: ['string', 'null'] }
|
|
830
|
+
}, ['personalSpaceId'])
|
|
831
|
+
},
|
|
832
|
+
{
|
|
833
|
+
name: 'decide_project_agent_recruitment',
|
|
834
|
+
title: 'WRITE · Approve or cancel recruitment',
|
|
835
|
+
description: 'Approve or cancel one pending HR recruitment event with an expected revision. Approval creates only the declared durable or bounded temporary role through the Provider.',
|
|
836
|
+
inputSchema: objectSchema({
|
|
837
|
+
personalSpaceId: id,
|
|
838
|
+
personalProjectId: id,
|
|
839
|
+
recruitmentId: id,
|
|
840
|
+
expectedRevision: integerSchema({ minimum: 0 }),
|
|
841
|
+
decision: recruitmentDecision,
|
|
842
|
+
reason: shortText
|
|
843
|
+
}, ['personalSpaceId', 'personalProjectId', 'recruitmentId', 'expectedRevision', 'decision', 'reason'])
|
|
844
|
+
},
|
|
845
|
+
{
|
|
846
|
+
name: 'upsert_executor',
|
|
847
|
+
title: 'WRITE · Register executor',
|
|
848
|
+
description: 'Create or update one provider-neutral executor directory entry. Registration is configuration and authorization metadata; it does not claim the executor is connected or running.',
|
|
849
|
+
inputSchema: executorProfile
|
|
850
|
+
},
|
|
851
|
+
{
|
|
852
|
+
name: 'list_executors',
|
|
853
|
+
title: 'READ · List executors',
|
|
854
|
+
description: 'List executor directory entries with separate registration, permission, preflight, and health states. A connected field is returned only when the Provider has evidence; missing connected evidence stays absent.',
|
|
855
|
+
inputSchema: objectSchema({
|
|
856
|
+
personalSpaceId: id,
|
|
857
|
+
capability: nullableStringSchema(),
|
|
858
|
+
availableOnly: booleanSchema()
|
|
859
|
+
}, ['personalSpaceId'])
|
|
860
|
+
},
|
|
861
|
+
{
|
|
862
|
+
name: 'get_executor',
|
|
863
|
+
title: 'READ · Get executor',
|
|
864
|
+
description: 'Inspect one executor directory entry and its preflight/audit fields without probing or fabricating a live connection.',
|
|
865
|
+
inputSchema: objectSchema({ personalSpaceId: id, executorId: id }, ['personalSpaceId', 'executorId'])
|
|
866
|
+
},
|
|
867
|
+
{
|
|
868
|
+
name: 'delete_executor',
|
|
869
|
+
title: 'WRITE · Archive executor',
|
|
870
|
+
description: 'Archive one executor directory entry through the Provider while retaining routing and outcome audit history.',
|
|
871
|
+
inputSchema: objectSchema({ personalSpaceId: id, executorId: id }, ['personalSpaceId', 'executorId'])
|
|
872
|
+
},
|
|
873
|
+
{
|
|
874
|
+
name: 'preflight_executor',
|
|
875
|
+
title: 'WRITE · Report executor preflight',
|
|
876
|
+
description: 'Record a real executor preflight report. The Provider verifies workspace permission and at least one advertised model before marking preflight passed; this tool never invokes work or fabricates availability.',
|
|
877
|
+
inputSchema: objectSchema({
|
|
878
|
+
personalSpaceId: id,
|
|
879
|
+
executorId: id,
|
|
880
|
+
status: enumSchema(['passed', 'failed']),
|
|
881
|
+
workspacePermission: booleanSchema(),
|
|
882
|
+
capabilities: arraySchema(boundedString(512), { maxItems: 64 }),
|
|
883
|
+
availableModels: arraySchema(executorModel, { maxItems: 64 }),
|
|
884
|
+
reason: nullableStringSchema(),
|
|
885
|
+
checkedAt: dateTime,
|
|
886
|
+
idempotencyKey,
|
|
887
|
+
sourceApplication,
|
|
888
|
+
sourceSessionId: nullableStringSchema()
|
|
889
|
+
}, ['personalSpaceId', 'executorId', 'status', 'workspacePermission', 'idempotencyKey', 'checkedAt'])
|
|
890
|
+
},
|
|
891
|
+
{
|
|
892
|
+
name: 'authorize_executor',
|
|
893
|
+
title: 'WRITE · Authorize executor workspace',
|
|
894
|
+
description: 'Persist an explicit executor permission decision. Authorization is auditable metadata and does not claim the executor is connected or healthy.',
|
|
895
|
+
inputSchema: objectSchema({
|
|
896
|
+
personalSpaceId: id,
|
|
897
|
+
executorId: id,
|
|
898
|
+
status: executorAuthorizationStatus,
|
|
899
|
+
reason: shortText,
|
|
900
|
+
expectedRevision: integerSchema({ minimum: 0 }),
|
|
901
|
+
idempotencyKey
|
|
902
|
+
}, ['personalSpaceId', 'executorId', 'status', 'reason', 'idempotencyKey'])
|
|
903
|
+
},
|
|
904
|
+
{
|
|
905
|
+
name: 'report_executor_health',
|
|
906
|
+
title: 'WRITE · Report executor health',
|
|
907
|
+
description: 'Record a real executor health observation with its timestamp and source. This does not fabricate a connection or execute work.',
|
|
908
|
+
inputSchema: objectSchema({
|
|
909
|
+
personalSpaceId: id,
|
|
910
|
+
executorId: id,
|
|
911
|
+
status: executorHealthStatus,
|
|
912
|
+
reason: nullableStringSchema(),
|
|
913
|
+
checkedAt: dateTime,
|
|
914
|
+
idempotencyKey,
|
|
915
|
+
sourceApplication,
|
|
916
|
+
sourceSessionId: nullableStringSchema()
|
|
917
|
+
}, ['personalSpaceId', 'executorId', 'status', 'checkedAt', 'idempotencyKey'])
|
|
918
|
+
},
|
|
919
|
+
{
|
|
920
|
+
name: 'record_project_agent_executor_actual',
|
|
921
|
+
title: 'WRITE · Report actual executor use',
|
|
922
|
+
description: 'Record one real executor/model report after execution. The Provider rejects reports unless the executor is registered and the model was available in a passing preflight; Agent locked policy is checked before the report is accepted. Provider/model/client attribution is retained as audit evidence.',
|
|
923
|
+
inputSchema: executorActualReportInput
|
|
924
|
+
},
|
|
925
|
+
{
|
|
926
|
+
name: 'upsert_executor_routing_rule',
|
|
927
|
+
title: 'WRITE · Configure executor routing rule',
|
|
928
|
+
description: 'Create or update one explicit space, project, or task routing rule. Agent locked allow-lists outrank all other rules; user rules outrank coordinator rules; the default rule set is empty and no work-kind mapping is hardcoded.',
|
|
929
|
+
inputSchema: executorRoutingRuleInput
|
|
930
|
+
},
|
|
931
|
+
{
|
|
932
|
+
name: 'update_executor_routing_rule',
|
|
933
|
+
title: 'WRITE · Update executor routing rule',
|
|
934
|
+
description: 'Update one routing rule status with an expected revision. Existing task decisions and outcome evidence remain immutable.',
|
|
935
|
+
inputSchema: objectSchema({
|
|
936
|
+
personalSpaceId: id,
|
|
937
|
+
ruleId: id,
|
|
938
|
+
expectedRevision: integerSchema({ minimum: 0 }),
|
|
939
|
+
status: enumSchema(['active', 'disabled', 'ended']),
|
|
940
|
+
reason: shortText,
|
|
941
|
+
idempotencyKey
|
|
942
|
+
}, ['personalSpaceId', 'ruleId', 'expectedRevision', 'status', 'reason', 'idempotencyKey'])
|
|
943
|
+
},
|
|
944
|
+
{
|
|
945
|
+
name: 'list_executor_routing_rules',
|
|
946
|
+
title: 'READ · List executor routing rules',
|
|
947
|
+
description: 'List routing rules in explicit space → project → task scope order. Agent locked allow-lists outrank every scope; explicit user priority outranks coordinator defaults. The result includes source owner and actual fallback audit.',
|
|
948
|
+
inputSchema: objectSchema({
|
|
949
|
+
personalSpaceId: id,
|
|
950
|
+
scope: { ...routingRuleScope, type: ['string', 'null'] },
|
|
951
|
+
personalProjectId: nullableStringSchema(),
|
|
952
|
+
taskId: nullableStringSchema(),
|
|
953
|
+
status: {
|
|
954
|
+
type: ['string', 'null'],
|
|
955
|
+
enum: ['active', 'disabled', 'ended', null]
|
|
956
|
+
}
|
|
957
|
+
}, ['personalSpaceId'])
|
|
958
|
+
},
|
|
959
|
+
{
|
|
960
|
+
name: 'get_executor_routing_rule',
|
|
961
|
+
title: 'READ · Get routing rule',
|
|
962
|
+
description: 'Read one routing rule and its audit metadata without applying it locally.',
|
|
963
|
+
inputSchema: objectSchema({ personalSpaceId: id, ruleId: id }, ['personalSpaceId', 'ruleId'])
|
|
964
|
+
},
|
|
965
|
+
{
|
|
966
|
+
name: 'delete_executor_routing_rule',
|
|
967
|
+
title: 'WRITE · Remove routing rule',
|
|
968
|
+
description: 'Remove one explicit routing rule. Existing task decisions and outcome evidence remain immutable history.',
|
|
969
|
+
inputSchema: objectSchema({ personalSpaceId: id, ruleId: id }, ['personalSpaceId', 'ruleId'])
|
|
970
|
+
},
|
|
971
|
+
{
|
|
972
|
+
name: 'record_project_agent_task_outcome',
|
|
973
|
+
title: 'WRITE · Record explicit routing outcome evidence',
|
|
974
|
+
description: 'Record only explicit acceptance/satisfaction evidence such as rework_requested, repeated_negative_feedback, explicit_praise, test/acceptance pass or fail, or an explicit rating. Natural-language text is never used to infer satisfaction.',
|
|
975
|
+
inputSchema: projectAgentTaskOutcomeInput
|
|
976
|
+
},
|
|
977
|
+
{
|
|
978
|
+
name: 'list_project_agent_routing_learning',
|
|
979
|
+
title: 'READ · View routing-learning evidence',
|
|
980
|
+
description: 'List routing-learning evidence and flexible same-level tie-break weights with contribution, asOf, halfLife, and neutral/ignored status. Agent locked policy and explicit task/assignment/project/space priority always win; learning never overrides them or turns missing evidence into a preference.',
|
|
981
|
+
inputSchema: objectSchema({
|
|
982
|
+
personalSpaceId: id,
|
|
983
|
+
personalProjectId: nullableStringSchema(),
|
|
984
|
+
workKind: nullableStringSchema(),
|
|
985
|
+
agentId: nullableStringSchema(),
|
|
986
|
+
executorId: nullableStringSchema()
|
|
987
|
+
}, ['personalSpaceId'])
|
|
988
|
+
},
|
|
989
|
+
{
|
|
990
|
+
name: 'ignore_project_agent_routing_learning',
|
|
991
|
+
title: 'WRITE · Ignore routing-learning evidence',
|
|
992
|
+
description: 'Mark one routing-learning item ignored with an explicit reason; it remains auditable and cannot silently rewrite task history.',
|
|
993
|
+
inputSchema: objectSchema({
|
|
994
|
+
personalSpaceId: id,
|
|
995
|
+
personalProjectId: id,
|
|
996
|
+
agentId: id,
|
|
997
|
+
evidenceId: id,
|
|
998
|
+
idempotencyKey,
|
|
999
|
+
reason: shortText
|
|
1000
|
+
}, ['personalSpaceId', 'personalProjectId', 'agentId', 'evidenceId', 'idempotencyKey', 'reason'])
|
|
1001
|
+
},
|
|
1002
|
+
{
|
|
1003
|
+
name: 'reset_project_agent_routing_learning',
|
|
1004
|
+
title: 'WRITE · Reset routing-learning weights',
|
|
1005
|
+
description: 'Reset selected routing-learning evidence or scope through the Provider. Reset records remain auditable and do not change historical routing decisions.',
|
|
1006
|
+
inputSchema: objectSchema({
|
|
1007
|
+
personalSpaceId: id,
|
|
1008
|
+
personalProjectId: id,
|
|
1009
|
+
workKind: boundedString(128),
|
|
1010
|
+
agentId: id,
|
|
1011
|
+
executorId: id,
|
|
1012
|
+
modelStrategy: projectAgentModelStrategy,
|
|
1013
|
+
modelStrategyKey: nullableStringSchema(),
|
|
1014
|
+
idempotencyKey,
|
|
1015
|
+
resetAt: dateTime,
|
|
1016
|
+
reason: shortText
|
|
1017
|
+
}, ['personalSpaceId', 'personalProjectId', 'workKind', 'agentId', 'executorId', 'idempotencyKey', 'resetAt', 'reason'])
|
|
1018
|
+
},
|
|
600
1019
|
{
|
|
601
1020
|
name: 'start_knowledge_review',
|
|
602
1021
|
title: 'REVIEW · Start or resume personal knowledge review',
|