@davidjinguoxu/agentcore 0.4.1
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.md +198 -0
- package/config/default-triggers.json +119 -0
- package/dist/adapters/runtime-adapter.d.ts +124 -0
- package/dist/adapters/runtime-adapter.d.ts.map +1 -0
- package/dist/adapters/runtime-adapter.js +5 -0
- package/dist/adapters/runtime-adapter.js.map +1 -0
- package/dist/config/datacore-constants.d.ts +21 -0
- package/dist/config/datacore-constants.d.ts.map +1 -0
- package/dist/config/datacore-constants.js +68 -0
- package/dist/config/datacore-constants.js.map +1 -0
- package/dist/domain/embeddable.d.ts +19 -0
- package/dist/domain/embeddable.d.ts.map +1 -0
- package/dist/domain/embeddable.js +106 -0
- package/dist/domain/embeddable.js.map +1 -0
- package/dist/domain/gold-store.d.ts +11 -0
- package/dist/domain/gold-store.d.ts.map +1 -0
- package/dist/domain/gold-store.js +210 -0
- package/dist/domain/gold-store.js.map +1 -0
- package/dist/domain/inbox.d.ts +14 -0
- package/dist/domain/inbox.d.ts.map +1 -0
- package/dist/domain/inbox.js +138 -0
- package/dist/domain/inbox.js.map +1 -0
- package/dist/domain/office-status.d.ts +31 -0
- package/dist/domain/office-status.d.ts.map +1 -0
- package/dist/domain/office-status.js +138 -0
- package/dist/domain/office-status.js.map +1 -0
- package/dist/domain/questions.d.ts +3 -0
- package/dist/domain/questions.d.ts.map +1 -0
- package/dist/domain/questions.js +60 -0
- package/dist/domain/questions.js.map +1 -0
- package/dist/domain/run-manager.d.ts +14 -0
- package/dist/domain/run-manager.d.ts.map +1 -0
- package/dist/domain/run-manager.js +25 -0
- package/dist/domain/run-manager.js.map +1 -0
- package/dist/domain/task-event-index.d.ts +31 -0
- package/dist/domain/task-event-index.d.ts.map +1 -0
- package/dist/domain/task-event-index.js +117 -0
- package/dist/domain/task-event-index.js.map +1 -0
- package/dist/domain/tasks.d.ts +3 -0
- package/dist/domain/tasks.d.ts.map +1 -0
- package/dist/domain/tasks.js +112 -0
- package/dist/domain/tasks.js.map +1 -0
- package/dist/domain/warm-start-builders.d.ts +18 -0
- package/dist/domain/warm-start-builders.d.ts.map +1 -0
- package/dist/domain/warm-start-builders.js +157 -0
- package/dist/domain/warm-start-builders.js.map +1 -0
- package/dist/domain/warm-start-extractors.d.ts +37 -0
- package/dist/domain/warm-start-extractors.d.ts.map +1 -0
- package/dist/domain/warm-start-extractors.js +372 -0
- package/dist/domain/warm-start-extractors.js.map +1 -0
- package/dist/domain/warm-start.d.ts +17 -0
- package/dist/domain/warm-start.d.ts.map +1 -0
- package/dist/domain/warm-start.js +225 -0
- package/dist/domain/warm-start.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-slim-ack.d.ts +12 -0
- package/dist/mcp-slim-ack.d.ts.map +1 -0
- package/dist/mcp-slim-ack.js +16 -0
- package/dist/mcp-slim-ack.js.map +1 -0
- package/dist/routing/capability-registry.d.ts +38 -0
- package/dist/routing/capability-registry.d.ts.map +1 -0
- package/dist/routing/capability-registry.js +52 -0
- package/dist/routing/capability-registry.js.map +1 -0
- package/dist/routing/runtime-target-resolver.d.ts +42 -0
- package/dist/routing/runtime-target-resolver.d.ts.map +1 -0
- package/dist/routing/runtime-target-resolver.js +139 -0
- package/dist/routing/runtime-target-resolver.js.map +1 -0
- package/dist/search/azure-search-client.d.ts +53 -0
- package/dist/search/azure-search-client.d.ts.map +1 -0
- package/dist/search/azure-search-client.js +191 -0
- package/dist/search/azure-search-client.js.map +1 -0
- package/dist/search/circuit-breaker.d.ts +46 -0
- package/dist/search/circuit-breaker.d.ts.map +1 -0
- package/dist/search/circuit-breaker.js +87 -0
- package/dist/search/circuit-breaker.js.map +1 -0
- package/dist/search/deep-search.d.ts +24 -0
- package/dist/search/deep-search.d.ts.map +1 -0
- package/dist/search/deep-search.js +98 -0
- package/dist/search/deep-search.js.map +1 -0
- package/dist/search/search.d.ts +3 -0
- package/dist/search/search.d.ts.map +1 -0
- package/dist/search/search.js +76 -0
- package/dist/search/search.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +39 -0
- package/dist/server.js.map +1 -0
- package/dist/skills/index.d.ts +3 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +8 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/knowledge.d.ts +3 -0
- package/dist/skills/knowledge.d.ts.map +1 -0
- package/dist/skills/knowledge.js +78 -0
- package/dist/skills/knowledge.js.map +1 -0
- package/dist/skills/task-workflow.d.ts +3 -0
- package/dist/skills/task-workflow.d.ts.map +1 -0
- package/dist/skills/task-workflow.js +205 -0
- package/dist/skills/task-workflow.js.map +1 -0
- package/dist/storage/active-backend.d.ts +4 -0
- package/dist/storage/active-backend.d.ts.map +1 -0
- package/dist/storage/active-backend.js +12 -0
- package/dist/storage/active-backend.js.map +1 -0
- package/dist/storage/backend.d.ts +12 -0
- package/dist/storage/backend.d.ts.map +1 -0
- package/dist/storage/backend.js +5 -0
- package/dist/storage/backend.js.map +1 -0
- package/dist/storage/cosmos-client.d.ts +6 -0
- package/dist/storage/cosmos-client.d.ts.map +1 -0
- package/dist/storage/cosmos-client.js +38 -0
- package/dist/storage/cosmos-client.js.map +1 -0
- package/dist/storage/lancedb-backend.d.ts +13 -0
- package/dist/storage/lancedb-backend.d.ts.map +1 -0
- package/dist/storage/lancedb-backend.js +373 -0
- package/dist/storage/lancedb-backend.js.map +1 -0
- package/dist/storage/store.d.ts +8 -0
- package/dist/storage/store.d.ts.map +1 -0
- package/dist/storage/store.js +294 -0
- package/dist/storage/store.js.map +1 -0
- package/dist/storage/task-compaction.d.ts +12 -0
- package/dist/storage/task-compaction.d.ts.map +1 -0
- package/dist/storage/task-compaction.js +112 -0
- package/dist/storage/task-compaction.js.map +1 -0
- package/dist/storage/task-context-snapshot.d.ts +6 -0
- package/dist/storage/task-context-snapshot.d.ts.map +1 -0
- package/dist/storage/task-context-snapshot.js +87 -0
- package/dist/storage/task-context-snapshot.js.map +1 -0
- package/dist/storage/trigger-engine.d.ts +39 -0
- package/dist/storage/trigger-engine.d.ts.map +1 -0
- package/dist/storage/trigger-engine.js +212 -0
- package/dist/storage/trigger-engine.js.map +1 -0
- package/dist/tools.d.ts +3 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +413 -0
- package/dist/tools.js.map +1 -0
- package/dist/transport/client.d.ts +68 -0
- package/dist/transport/client.d.ts.map +1 -0
- package/dist/transport/client.js +210 -0
- package/dist/transport/client.js.map +1 -0
- package/dist/transport/http-server.d.ts +3 -0
- package/dist/transport/http-server.d.ts.map +1 -0
- package/dist/transport/http-server.js +337 -0
- package/dist/transport/http-server.js.map +1 -0
- package/dist/types.d.ts +185 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +71 -0
- package/scripts/run-server.mjs +3 -0
- package/scripts/stdio-only.mjs +23 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// index.ts — aggregate skill registration for Datacore MCP server.
|
|
2
|
+
import { registerTaskWorkflowSkills } from "./task-workflow.js";
|
|
3
|
+
import { registerKnowledgeSkills } from "./knowledge.js";
|
|
4
|
+
export function registerSkills(server) {
|
|
5
|
+
registerTaskWorkflowSkills(server);
|
|
6
|
+
registerKnowledgeSkills(server);
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAAA,mEAAmE;AAGnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,MAAM,UAAU,cAAc,CAAC,MAAiB;IAC9C,0BAA0B,CAAC,MAAM,CAAC,CAAC;IACnC,uBAAuB,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge.d.ts","sourceRoot":"","sources":["../../src/skills/knowledge.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAazE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiG/D"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// knowledge.ts — MCP skills for saving lessons, decisions, and team questions.
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { appendEvent } from "../storage/store.js";
|
|
4
|
+
import { bronzeWriteAck } from "../mcp-slim-ack.js";
|
|
5
|
+
function toTextResult(text, structuredContent) {
|
|
6
|
+
return {
|
|
7
|
+
content: [{ type: "text", text }],
|
|
8
|
+
...(structuredContent !== undefined
|
|
9
|
+
? { structuredContent: structuredContent }
|
|
10
|
+
: {}),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export function registerKnowledgeSkills(server) {
|
|
14
|
+
const annotations = {
|
|
15
|
+
readOnlyHint: false,
|
|
16
|
+
destructiveHint: true,
|
|
17
|
+
idempotentHint: false,
|
|
18
|
+
openWorldHint: false,
|
|
19
|
+
};
|
|
20
|
+
server.tool("save_lesson", "Capture a task-specific lesson learned. Writes insight events with the related task_id.", {
|
|
21
|
+
agent_id: z
|
|
22
|
+
.string()
|
|
23
|
+
.min(1)
|
|
24
|
+
.describe("Agent identifier writing the lesson (e.g. codex-session)"),
|
|
25
|
+
task_id: z
|
|
26
|
+
.string()
|
|
27
|
+
.min(1)
|
|
28
|
+
.describe("Task identifier that the lesson applies to"),
|
|
29
|
+
lesson: z.string().min(1).describe("Lesson learned in plain text"),
|
|
30
|
+
}, annotations, async ({ agent_id, task_id, lesson }) => {
|
|
31
|
+
const record = await appendEvent({
|
|
32
|
+
source: agent_id,
|
|
33
|
+
type: "insight",
|
|
34
|
+
content: `${task_id} lessons: ${lesson}`,
|
|
35
|
+
context: { task_id },
|
|
36
|
+
});
|
|
37
|
+
return toTextResult("save_lesson logged insight event", bronzeWriteAck(record.record));
|
|
38
|
+
});
|
|
39
|
+
server.tool("save_decision", "Record a decision with rationale. Writes decision events with summary in context.", {
|
|
40
|
+
agent_id: z
|
|
41
|
+
.string()
|
|
42
|
+
.min(1)
|
|
43
|
+
.describe("Agent identifier recording the decision"),
|
|
44
|
+
summary: z.string().min(1).describe("Decision summary in one sentence"),
|
|
45
|
+
rationale: z
|
|
46
|
+
.string()
|
|
47
|
+
.min(1)
|
|
48
|
+
.describe("Supporting rationale explaining the decision"),
|
|
49
|
+
}, annotations, async ({ agent_id, summary, rationale }) => {
|
|
50
|
+
const record = await appendEvent({
|
|
51
|
+
source: agent_id,
|
|
52
|
+
type: "decision",
|
|
53
|
+
content: `${summary}. Rationale: ${rationale}`,
|
|
54
|
+
context: { summary },
|
|
55
|
+
});
|
|
56
|
+
return toTextResult("save_decision logged decision event", bronzeWriteAck(record.record));
|
|
57
|
+
});
|
|
58
|
+
server.tool("ask_team", "Log a question to the team with a directed recipient. Writes question events with status=open.", {
|
|
59
|
+
agent_id: z
|
|
60
|
+
.string()
|
|
61
|
+
.min(1)
|
|
62
|
+
.describe("Agent identifier asking the question"),
|
|
63
|
+
question: z.string().min(1).describe("Question text to log"),
|
|
64
|
+
directed_to: z
|
|
65
|
+
.string()
|
|
66
|
+
.min(1)
|
|
67
|
+
.describe("Intended recipient agent (e.g. claude-desktop, openclaw)"),
|
|
68
|
+
}, annotations, async ({ agent_id, question, directed_to }) => {
|
|
69
|
+
const record = await appendEvent({
|
|
70
|
+
source: agent_id,
|
|
71
|
+
type: "question",
|
|
72
|
+
content: question,
|
|
73
|
+
context: { directed_to, status: "open" },
|
|
74
|
+
});
|
|
75
|
+
return toTextResult("ask_team logged question event", bronzeWriteAck(record.record));
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=knowledge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge.js","sourceRoot":"","sources":["../../src/skills/knowledge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-workflow.d.ts","sourceRoot":"","sources":["../../src/skills/task-workflow.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA0FzE,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuMlE"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
// task-workflow.ts — MCP skill wrappers for consistent task lifecycle logging.
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { appendEvent } from "../storage/store.js";
|
|
4
|
+
import { getTasks } from "../domain/tasks.js";
|
|
5
|
+
import { bronzeWriteAck } from "../mcp-slim-ack.js";
|
|
6
|
+
const LOOP_DETECT_THRESHOLD = 4; // emit task_loop_detected every N progress events
|
|
7
|
+
const COMPACT_THRESHOLD = 8; // emit task_compaction_needed every N progress events
|
|
8
|
+
// ── DC-T8 Tier 1: session buffer (server-side auto-capture) ───────────────
|
|
9
|
+
// Tracks Datacore task lifecycle tool calls per task_id.
|
|
10
|
+
// Flushed as tool_sequence event on complete_task / block_task / fail_task.
|
|
11
|
+
// Module-level map persists for the lifetime of the server process.
|
|
12
|
+
const sessionBuffers = new Map();
|
|
13
|
+
function trackTool(taskId, toolName) {
|
|
14
|
+
const buf = sessionBuffers.get(taskId) ?? [];
|
|
15
|
+
buf.push(toolName);
|
|
16
|
+
sessionBuffers.set(taskId, buf);
|
|
17
|
+
}
|
|
18
|
+
const TOOL_SEQUENCE_MIN = 3; // minimum calls before logging tool_sequence
|
|
19
|
+
async function flushSessionBuffer(agentId, taskId) {
|
|
20
|
+
const tools = sessionBuffers.get(taskId);
|
|
21
|
+
if (!tools || tools.length < TOOL_SEQUENCE_MIN) {
|
|
22
|
+
sessionBuffers.delete(taskId);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
await appendEvent({
|
|
27
|
+
source: agentId,
|
|
28
|
+
type: "tool_sequence",
|
|
29
|
+
content: `${taskId}: ${tools.join(" → ")}. ${tools.length} Datacore tool calls (Tier 1 auto-capture).`,
|
|
30
|
+
context: {
|
|
31
|
+
task_id: taskId,
|
|
32
|
+
tools,
|
|
33
|
+
tool_count: tools.length,
|
|
34
|
+
capture_tier: 1,
|
|
35
|
+
agent: agentId,
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// Non-fatal — observability must never block the main task event
|
|
41
|
+
}
|
|
42
|
+
sessionBuffers.delete(taskId);
|
|
43
|
+
}
|
|
44
|
+
function toTextResult(text, structuredContent) {
|
|
45
|
+
return {
|
|
46
|
+
content: [{ type: "text", text }],
|
|
47
|
+
...(structuredContent !== undefined
|
|
48
|
+
? { structuredContent: structuredContent }
|
|
49
|
+
: {}),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
async function writeTaskEvent(options) {
|
|
53
|
+
const { agentId, taskId, eventType, status, content, extraContext } = options;
|
|
54
|
+
return appendEvent({
|
|
55
|
+
source: agentId,
|
|
56
|
+
type: eventType,
|
|
57
|
+
content,
|
|
58
|
+
context: {
|
|
59
|
+
task_id: taskId,
|
|
60
|
+
status,
|
|
61
|
+
...(extraContext ?? {}),
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
export function registerTaskWorkflowSkills(server) {
|
|
66
|
+
const baseAnnotations = {
|
|
67
|
+
readOnlyHint: false,
|
|
68
|
+
destructiveHint: true,
|
|
69
|
+
idempotentHint: false,
|
|
70
|
+
openWorldHint: false,
|
|
71
|
+
};
|
|
72
|
+
const baseSchema = {
|
|
73
|
+
agent_id: z
|
|
74
|
+
.string()
|
|
75
|
+
.min(1)
|
|
76
|
+
.describe("Agent identifier (e.g. claude-desktop, codex-session)"),
|
|
77
|
+
task_id: z.string().min(1).describe("Task identifier (e.g. DC-T1)"),
|
|
78
|
+
};
|
|
79
|
+
server.tool("start_task", "Mark a task as in progress. Writes task_started with enforced status/context fields.", {
|
|
80
|
+
...baseSchema,
|
|
81
|
+
summary: z
|
|
82
|
+
.string()
|
|
83
|
+
.min(1)
|
|
84
|
+
.describe("One-line summary of the work beginning"),
|
|
85
|
+
}, baseAnnotations, async ({ agent_id, task_id, summary }) => {
|
|
86
|
+
trackTool(task_id, "start_task");
|
|
87
|
+
const record = await writeTaskEvent({
|
|
88
|
+
agentId: agent_id,
|
|
89
|
+
taskId: task_id,
|
|
90
|
+
eventType: "task_started",
|
|
91
|
+
status: "in_progress",
|
|
92
|
+
content: `${task_id} — ${summary}`,
|
|
93
|
+
extraContext: { summary },
|
|
94
|
+
});
|
|
95
|
+
return toTextResult(`start_task logged task_started for ${task_id} as in_progress`, bronzeWriteAck(record.record));
|
|
96
|
+
});
|
|
97
|
+
server.tool("complete_task", "Mark a task as completed. Writes task_completed with proof and status=completed.", {
|
|
98
|
+
...baseSchema,
|
|
99
|
+
proof: z
|
|
100
|
+
.string()
|
|
101
|
+
.min(1)
|
|
102
|
+
.describe("Proof of completion: commands run, artifacts, or summary"),
|
|
103
|
+
}, baseAnnotations, async ({ agent_id, task_id, proof }) => {
|
|
104
|
+
trackTool(task_id, "complete_task");
|
|
105
|
+
await flushSessionBuffer(agent_id, task_id);
|
|
106
|
+
const record = await writeTaskEvent({
|
|
107
|
+
agentId: agent_id,
|
|
108
|
+
taskId: task_id,
|
|
109
|
+
eventType: "task_completed",
|
|
110
|
+
status: "completed",
|
|
111
|
+
content: `${task_id} — ${proof}`,
|
|
112
|
+
extraContext: { proof },
|
|
113
|
+
});
|
|
114
|
+
return toTextResult(`complete_task logged task_completed for ${task_id} as completed`, bronzeWriteAck(record.record));
|
|
115
|
+
});
|
|
116
|
+
server.tool("block_task", "Indicate a task is blocked. Writes task_blocked with reason and status=blocked.", {
|
|
117
|
+
...baseSchema,
|
|
118
|
+
reason: z
|
|
119
|
+
.string()
|
|
120
|
+
.min(1)
|
|
121
|
+
.describe("Blocking issue preventing further progress"),
|
|
122
|
+
}, baseAnnotations, async ({ agent_id, task_id, reason: blockReason }) => {
|
|
123
|
+
trackTool(task_id, "block_task");
|
|
124
|
+
await flushSessionBuffer(agent_id, task_id);
|
|
125
|
+
const record = await writeTaskEvent({
|
|
126
|
+
agentId: agent_id,
|
|
127
|
+
taskId: task_id,
|
|
128
|
+
eventType: "task_blocked",
|
|
129
|
+
status: "blocked",
|
|
130
|
+
content: `${task_id} — ${blockReason}`,
|
|
131
|
+
extraContext: { reason: blockReason },
|
|
132
|
+
});
|
|
133
|
+
return toTextResult(`block_task logged task_blocked for ${task_id} as blocked`, bronzeWriteAck(record.record));
|
|
134
|
+
});
|
|
135
|
+
server.tool("fail_task", "Record that a task failed. Writes task_failed with status=failed.", {
|
|
136
|
+
...baseSchema,
|
|
137
|
+
reason: z
|
|
138
|
+
.string()
|
|
139
|
+
.min(1)
|
|
140
|
+
.describe("Why the task failed and next steps, if any"),
|
|
141
|
+
}, baseAnnotations, async ({ agent_id, task_id, reason: failReason }) => {
|
|
142
|
+
trackTool(task_id, "fail_task");
|
|
143
|
+
await flushSessionBuffer(agent_id, task_id);
|
|
144
|
+
const record = await writeTaskEvent({
|
|
145
|
+
agentId: agent_id,
|
|
146
|
+
taskId: task_id,
|
|
147
|
+
eventType: "task_failed",
|
|
148
|
+
status: "failed",
|
|
149
|
+
content: `${task_id} — ${failReason}`,
|
|
150
|
+
extraContext: { reason: failReason },
|
|
151
|
+
});
|
|
152
|
+
return toTextResult(`fail_task logged task_failed for ${task_id} as failed`, bronzeWriteAck(record.record));
|
|
153
|
+
});
|
|
154
|
+
server.tool("update_task", "Log intermediate progress on a task. Writes task_progress with status=in_progress.", {
|
|
155
|
+
...baseSchema,
|
|
156
|
+
progress: z.string().min(1).describe("Progress update in plain text"),
|
|
157
|
+
}, baseAnnotations, async ({ agent_id, task_id, progress }) => {
|
|
158
|
+
trackTool(task_id, "update_task");
|
|
159
|
+
const record = await writeTaskEvent({
|
|
160
|
+
agentId: agent_id,
|
|
161
|
+
taskId: task_id,
|
|
162
|
+
eventType: "task_progress",
|
|
163
|
+
status: "in_progress",
|
|
164
|
+
content: `${task_id} — ${progress}`,
|
|
165
|
+
extraContext: { progress },
|
|
166
|
+
});
|
|
167
|
+
// Count progress events — fire threshold alerts for loop detection and compaction
|
|
168
|
+
try {
|
|
169
|
+
const result = await getTasks({ task_id });
|
|
170
|
+
// getTasks({task_id}) returns TaskHistoryResult with an `events` array
|
|
171
|
+
const events = "events" in result ? result.events : [];
|
|
172
|
+
const progressCount = events.filter((e) => e.type === "task_progress").length;
|
|
173
|
+
if (progressCount > 0 && progressCount % LOOP_DETECT_THRESHOLD === 0) {
|
|
174
|
+
await appendEvent({
|
|
175
|
+
source: "datacore",
|
|
176
|
+
type: "task_loop_detected",
|
|
177
|
+
content: `${task_id} — ${progressCount} progress events without completion. Possible loop.`,
|
|
178
|
+
context: {
|
|
179
|
+
task_id,
|
|
180
|
+
progress_count: progressCount,
|
|
181
|
+
assigned_to: agent_id,
|
|
182
|
+
},
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
if (progressCount > 0 && progressCount % COMPACT_THRESHOLD === 0) {
|
|
186
|
+
// session_briefing is appended in store.ts from this row (dedup in buildCompactionSessionBriefingAppendInput).
|
|
187
|
+
await appendEvent({
|
|
188
|
+
source: "datacore",
|
|
189
|
+
type: "task_compaction_needed",
|
|
190
|
+
content: `${task_id} — ${progressCount} progress events. Context compaction recommended.`,
|
|
191
|
+
context: {
|
|
192
|
+
task_id,
|
|
193
|
+
progress_count: progressCount,
|
|
194
|
+
assigned_to: agent_id,
|
|
195
|
+
},
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
// Non-fatal: threshold checks are best-effort, don't block the progress log
|
|
201
|
+
}
|
|
202
|
+
return toTextResult(`update_task logged task_progress for ${task_id} as in_progress`, bronzeWriteAck(record.record));
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=task-workflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-workflow.js","sourceRoot":"","sources":["../../src/skills/task-workflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"active-backend.d.ts","sourceRoot":"","sources":["../../src/storage/active-backend.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAQnD,eAAO,MAAM,aAAa,EAAE,cAAc,GAAG,IAErB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// active-backend.ts — Selects the active StorageBackend at startup.
|
|
2
|
+
// Cosmos mode (COSMOS_ENDPOINT + COSMOS_KEY set): null — store.ts uses Cosmos directly.
|
|
3
|
+
// Local mode (no Cosmos credentials): LanceDbBackend — zero config, no Azure needed.
|
|
4
|
+
// NOTE: aligns with isCosmosEnabled() in cosmos-client.ts which requires BOTH keys.
|
|
5
|
+
import { LanceDbBackend } from "./lancedb-backend.js";
|
|
6
|
+
// Must match isCosmosEnabled() — requires both endpoint AND key
|
|
7
|
+
const cosmosConfigured = !!(process.env.COSMOS_ENDPOINT && process.env.COSMOS_KEY);
|
|
8
|
+
// Singleton — created once at module load
|
|
9
|
+
export const activeBackend = cosmosConfigured
|
|
10
|
+
? null // Cloud mode: Cosmos via store.ts + gold-store.ts directly
|
|
11
|
+
: new LanceDbBackend(); // Local mode: LanceDB, zero config
|
|
12
|
+
//# sourceMappingURL=active-backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"active-backend.js","sourceRoot":"","sources":["../../src/storage/active-backend.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,wFAAwF;AACxF,qFAAqF;AACrF,oFAAoF;AAEpF,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAKtD,gEAAgE;AAChE,MAAM,gBAAgB,GAAG,CAAC,CAAC,CACzB,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CACtD,CAAC;AAEF,0CAA0C;AAC1C,MAAM,CAAC,MAAM,aAAa,GAA0B,gBAAgB;IAClE,CAAC,CAAC,IAAI,CAAC,2DAA2D;IAClE,CAAC,CAAC,IAAI,cAAc,EAAE,CAAC,CAAC,mCAAmC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { BronzeRecord, AppendEventInput, AppendEventResult, Filters, ReadAllResult, AddEntityInput, AddEntityResult, GetFactsInput, GetFactsResult, GetLinkedResult } from "../types.js";
|
|
2
|
+
export interface StorageBackend {
|
|
3
|
+
getBronzeDir(): string;
|
|
4
|
+
append(input: AppendEventInput): Promise<AppendEventResult>;
|
|
5
|
+
readAll(filters?: Filters): Promise<ReadAllResult>;
|
|
6
|
+
search(query: string, project?: string): Promise<BronzeRecord[]>;
|
|
7
|
+
getGoldDir(): string;
|
|
8
|
+
upsertEntity(input: AddEntityInput): Promise<AddEntityResult>;
|
|
9
|
+
queryEntities(input: GetFactsInput): Promise<GetFactsResult>;
|
|
10
|
+
getLinkedEntities(entity_id: string): Promise<GetLinkedResult>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=backend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/storage/backend.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,OAAO,EACP,aAAa,EACb,cAAc,EACd,eAAe,EACf,aAAa,EACb,cAAc,EACd,eAAe,EAChB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,cAAc;IAE7B,YAAY,IAAI,MAAM,CAAC;IACvB,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC5D,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACnD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAGjE,UAAU,IAAI,MAAM,CAAC;IACrB,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC9D,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7D,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CAChE"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// backend.ts — StorageBackend interface: single contract for local (LanceDB) + cloud (Cosmos).
|
|
2
|
+
// store.ts and gold-store.ts delegate to the active backend.
|
|
3
|
+
// Active backend is selected once at startup based on COSMOS_ENDPOINT env var.
|
|
4
|
+
export {};
|
|
5
|
+
//# sourceMappingURL=backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.js","sourceRoot":"","sources":["../../src/storage/backend.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,6DAA6D;AAC7D,+EAA+E"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type Container } from "@azure/cosmos";
|
|
2
|
+
export declare function isCosmosEnabled(): boolean;
|
|
3
|
+
export declare function getBronzeContainer(): Promise<Container>;
|
|
4
|
+
export declare function getGoldContainer(): Promise<Container>;
|
|
5
|
+
export declare function pingCosmos(): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=cosmos-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cosmos-client.d.ts","sourceRoot":"","sources":["../../src/storage/cosmos-client.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgB,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAS7D,wBAAgB,eAAe,IAAI,OAAO,CAKzC;AAcD,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,SAAS,CAAC,CAI7D;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,SAAS,CAAC,CAI3D;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAGhD"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// cosmos-client.ts — How does the MCP server connect to Cosmos DB?
|
|
2
|
+
// Lazy singleton. Enabled when COSMOS_ENDPOINT + COSMOS_KEY are set
|
|
3
|
+
// AND DATACORE_BRONZE_DIR is not set (BRONZE_DIR = test isolation mode).
|
|
4
|
+
import { CosmosClient } from "@azure/cosmos";
|
|
5
|
+
import { getCosmosDatabaseName, getCosmosBronzeContainerName, getCosmosGoldContainerName, } from "../config/datacore-constants.js";
|
|
6
|
+
let client = null;
|
|
7
|
+
export function isCosmosEnabled() {
|
|
8
|
+
// DATACORE_BRONZE_DIR is set by tests to force JSONL isolation — never use Cosmos in that case.
|
|
9
|
+
if (process.env.DATACORE_BRONZE_DIR || process.env.DATACORE_GOLD_DIR)
|
|
10
|
+
return false;
|
|
11
|
+
return !!(process.env.COSMOS_ENDPOINT && process.env.COSMOS_KEY);
|
|
12
|
+
}
|
|
13
|
+
function getClient() {
|
|
14
|
+
if (!client) {
|
|
15
|
+
const endpoint = process.env.COSMOS_ENDPOINT;
|
|
16
|
+
const key = process.env.COSMOS_KEY;
|
|
17
|
+
if (!endpoint || !key) {
|
|
18
|
+
throw new Error("COSMOS_ENDPOINT and COSMOS_KEY must be set");
|
|
19
|
+
}
|
|
20
|
+
client = new CosmosClient({ endpoint, key });
|
|
21
|
+
}
|
|
22
|
+
return client;
|
|
23
|
+
}
|
|
24
|
+
export async function getBronzeContainer() {
|
|
25
|
+
return getClient()
|
|
26
|
+
.database(getCosmosDatabaseName())
|
|
27
|
+
.container(getCosmosBronzeContainerName());
|
|
28
|
+
}
|
|
29
|
+
export async function getGoldContainer() {
|
|
30
|
+
return getClient()
|
|
31
|
+
.database(getCosmosDatabaseName())
|
|
32
|
+
.container(getCosmosGoldContainerName());
|
|
33
|
+
}
|
|
34
|
+
export async function pingCosmos() {
|
|
35
|
+
const db = getClient().database(getCosmosDatabaseName());
|
|
36
|
+
await db.read();
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=cosmos-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cosmos-client.js","sourceRoot":"","sources":["../../src/storage/cosmos-client.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,oEAAoE;AACpE,yEAAyE;AAEzE,OAAO,EAAE,YAAY,EAAkB,MAAM,eAAe,CAAC;AAC7D,OAAO,EACL,qBAAqB,EACrB,4BAA4B,EAC5B,0BAA0B,GAC3B,MAAM,iCAAiC,CAAC;AAEzC,IAAI,MAAM,GAAwB,IAAI,CAAC;AAEvC,MAAM,UAAU,eAAe;IAC7B,gGAAgG;IAChG,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB;QAClE,OAAO,KAAK,CAAC;IACf,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,SAAS;IAChB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;QAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;QACnC,IAAI,CAAC,QAAQ,IAAI,CAAC,GAAG,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,OAAO,SAAS,EAAE;SACf,QAAQ,CAAC,qBAAqB,EAAE,CAAC;SACjC,SAAS,CAAC,4BAA4B,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,OAAO,SAAS,EAAE;SACf,QAAQ,CAAC,qBAAqB,EAAE,CAAC;SACjC,SAAS,CAAC,0BAA0B,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC,QAAQ,CAAC,qBAAqB,EAAE,CAAC,CAAC;IACzD,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { StorageBackend } from "./backend.js";
|
|
2
|
+
import type { BronzeRecord, AppendEventInput, AppendEventResult, Filters, ReadAllResult, AddEntityInput, AddEntityResult, GetFactsInput, GetFactsResult, GetLinkedResult } from "../types.js";
|
|
3
|
+
export declare class LanceDbBackend implements StorageBackend {
|
|
4
|
+
getBronzeDir(): string;
|
|
5
|
+
getGoldDir(): string;
|
|
6
|
+
append(input: AppendEventInput): Promise<AppendEventResult>;
|
|
7
|
+
readAll(filters?: Filters): Promise<ReadAllResult>;
|
|
8
|
+
search(query: string, project?: string): Promise<BronzeRecord[]>;
|
|
9
|
+
upsertEntity(input: AddEntityInput): Promise<AddEntityResult>;
|
|
10
|
+
queryEntities(input: GetFactsInput): Promise<GetFactsResult>;
|
|
11
|
+
getLinkedEntities(entity_id: string): Promise<GetLinkedResult>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=lancedb-backend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lancedb-backend.d.ts","sourceRoot":"","sources":["../../src/storage/lancedb-backend.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,OAAO,EACP,aAAa,EAEb,cAAc,EACd,eAAe,EACf,aAAa,EACb,cAAc,EACd,eAAe,EAChB,MAAM,aAAa,CAAC;AAqNrB,qBAAa,cAAe,YAAW,cAAc;IACnD,YAAY,IAAI,MAAM;IAGtB,UAAU,IAAI,MAAM;IAId,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAwB3D,OAAO,CAAC,OAAO,GAAE,OAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IAyBtD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAwChE,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;IAoD7D,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IA2B5D,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;CAyBrE"}
|