@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.
Files changed (154) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +198 -0
  3. package/config/default-triggers.json +119 -0
  4. package/dist/adapters/runtime-adapter.d.ts +124 -0
  5. package/dist/adapters/runtime-adapter.d.ts.map +1 -0
  6. package/dist/adapters/runtime-adapter.js +5 -0
  7. package/dist/adapters/runtime-adapter.js.map +1 -0
  8. package/dist/config/datacore-constants.d.ts +21 -0
  9. package/dist/config/datacore-constants.d.ts.map +1 -0
  10. package/dist/config/datacore-constants.js +68 -0
  11. package/dist/config/datacore-constants.js.map +1 -0
  12. package/dist/domain/embeddable.d.ts +19 -0
  13. package/dist/domain/embeddable.d.ts.map +1 -0
  14. package/dist/domain/embeddable.js +106 -0
  15. package/dist/domain/embeddable.js.map +1 -0
  16. package/dist/domain/gold-store.d.ts +11 -0
  17. package/dist/domain/gold-store.d.ts.map +1 -0
  18. package/dist/domain/gold-store.js +210 -0
  19. package/dist/domain/gold-store.js.map +1 -0
  20. package/dist/domain/inbox.d.ts +14 -0
  21. package/dist/domain/inbox.d.ts.map +1 -0
  22. package/dist/domain/inbox.js +138 -0
  23. package/dist/domain/inbox.js.map +1 -0
  24. package/dist/domain/office-status.d.ts +31 -0
  25. package/dist/domain/office-status.d.ts.map +1 -0
  26. package/dist/domain/office-status.js +138 -0
  27. package/dist/domain/office-status.js.map +1 -0
  28. package/dist/domain/questions.d.ts +3 -0
  29. package/dist/domain/questions.d.ts.map +1 -0
  30. package/dist/domain/questions.js +60 -0
  31. package/dist/domain/questions.js.map +1 -0
  32. package/dist/domain/run-manager.d.ts +14 -0
  33. package/dist/domain/run-manager.d.ts.map +1 -0
  34. package/dist/domain/run-manager.js +25 -0
  35. package/dist/domain/run-manager.js.map +1 -0
  36. package/dist/domain/task-event-index.d.ts +31 -0
  37. package/dist/domain/task-event-index.d.ts.map +1 -0
  38. package/dist/domain/task-event-index.js +117 -0
  39. package/dist/domain/task-event-index.js.map +1 -0
  40. package/dist/domain/tasks.d.ts +3 -0
  41. package/dist/domain/tasks.d.ts.map +1 -0
  42. package/dist/domain/tasks.js +112 -0
  43. package/dist/domain/tasks.js.map +1 -0
  44. package/dist/domain/warm-start-builders.d.ts +18 -0
  45. package/dist/domain/warm-start-builders.d.ts.map +1 -0
  46. package/dist/domain/warm-start-builders.js +157 -0
  47. package/dist/domain/warm-start-builders.js.map +1 -0
  48. package/dist/domain/warm-start-extractors.d.ts +37 -0
  49. package/dist/domain/warm-start-extractors.d.ts.map +1 -0
  50. package/dist/domain/warm-start-extractors.js +372 -0
  51. package/dist/domain/warm-start-extractors.js.map +1 -0
  52. package/dist/domain/warm-start.d.ts +17 -0
  53. package/dist/domain/warm-start.d.ts.map +1 -0
  54. package/dist/domain/warm-start.js +225 -0
  55. package/dist/domain/warm-start.js.map +1 -0
  56. package/dist/index.d.ts +7 -0
  57. package/dist/index.d.ts.map +1 -0
  58. package/dist/index.js +8 -0
  59. package/dist/index.js.map +1 -0
  60. package/dist/mcp-slim-ack.d.ts +12 -0
  61. package/dist/mcp-slim-ack.d.ts.map +1 -0
  62. package/dist/mcp-slim-ack.js +16 -0
  63. package/dist/mcp-slim-ack.js.map +1 -0
  64. package/dist/routing/capability-registry.d.ts +38 -0
  65. package/dist/routing/capability-registry.d.ts.map +1 -0
  66. package/dist/routing/capability-registry.js +52 -0
  67. package/dist/routing/capability-registry.js.map +1 -0
  68. package/dist/routing/runtime-target-resolver.d.ts +42 -0
  69. package/dist/routing/runtime-target-resolver.d.ts.map +1 -0
  70. package/dist/routing/runtime-target-resolver.js +139 -0
  71. package/dist/routing/runtime-target-resolver.js.map +1 -0
  72. package/dist/search/azure-search-client.d.ts +53 -0
  73. package/dist/search/azure-search-client.d.ts.map +1 -0
  74. package/dist/search/azure-search-client.js +191 -0
  75. package/dist/search/azure-search-client.js.map +1 -0
  76. package/dist/search/circuit-breaker.d.ts +46 -0
  77. package/dist/search/circuit-breaker.d.ts.map +1 -0
  78. package/dist/search/circuit-breaker.js +87 -0
  79. package/dist/search/circuit-breaker.js.map +1 -0
  80. package/dist/search/deep-search.d.ts +24 -0
  81. package/dist/search/deep-search.d.ts.map +1 -0
  82. package/dist/search/deep-search.js +98 -0
  83. package/dist/search/deep-search.js.map +1 -0
  84. package/dist/search/search.d.ts +3 -0
  85. package/dist/search/search.d.ts.map +1 -0
  86. package/dist/search/search.js +76 -0
  87. package/dist/search/search.js.map +1 -0
  88. package/dist/server.d.ts +3 -0
  89. package/dist/server.d.ts.map +1 -0
  90. package/dist/server.js +39 -0
  91. package/dist/server.js.map +1 -0
  92. package/dist/skills/index.d.ts +3 -0
  93. package/dist/skills/index.d.ts.map +1 -0
  94. package/dist/skills/index.js +8 -0
  95. package/dist/skills/index.js.map +1 -0
  96. package/dist/skills/knowledge.d.ts +3 -0
  97. package/dist/skills/knowledge.d.ts.map +1 -0
  98. package/dist/skills/knowledge.js +78 -0
  99. package/dist/skills/knowledge.js.map +1 -0
  100. package/dist/skills/task-workflow.d.ts +3 -0
  101. package/dist/skills/task-workflow.d.ts.map +1 -0
  102. package/dist/skills/task-workflow.js +205 -0
  103. package/dist/skills/task-workflow.js.map +1 -0
  104. package/dist/storage/active-backend.d.ts +4 -0
  105. package/dist/storage/active-backend.d.ts.map +1 -0
  106. package/dist/storage/active-backend.js +12 -0
  107. package/dist/storage/active-backend.js.map +1 -0
  108. package/dist/storage/backend.d.ts +12 -0
  109. package/dist/storage/backend.d.ts.map +1 -0
  110. package/dist/storage/backend.js +5 -0
  111. package/dist/storage/backend.js.map +1 -0
  112. package/dist/storage/cosmos-client.d.ts +6 -0
  113. package/dist/storage/cosmos-client.d.ts.map +1 -0
  114. package/dist/storage/cosmos-client.js +38 -0
  115. package/dist/storage/cosmos-client.js.map +1 -0
  116. package/dist/storage/lancedb-backend.d.ts +13 -0
  117. package/dist/storage/lancedb-backend.d.ts.map +1 -0
  118. package/dist/storage/lancedb-backend.js +373 -0
  119. package/dist/storage/lancedb-backend.js.map +1 -0
  120. package/dist/storage/store.d.ts +8 -0
  121. package/dist/storage/store.d.ts.map +1 -0
  122. package/dist/storage/store.js +294 -0
  123. package/dist/storage/store.js.map +1 -0
  124. package/dist/storage/task-compaction.d.ts +12 -0
  125. package/dist/storage/task-compaction.d.ts.map +1 -0
  126. package/dist/storage/task-compaction.js +112 -0
  127. package/dist/storage/task-compaction.js.map +1 -0
  128. package/dist/storage/task-context-snapshot.d.ts +6 -0
  129. package/dist/storage/task-context-snapshot.d.ts.map +1 -0
  130. package/dist/storage/task-context-snapshot.js +87 -0
  131. package/dist/storage/task-context-snapshot.js.map +1 -0
  132. package/dist/storage/trigger-engine.d.ts +39 -0
  133. package/dist/storage/trigger-engine.d.ts.map +1 -0
  134. package/dist/storage/trigger-engine.js +212 -0
  135. package/dist/storage/trigger-engine.js.map +1 -0
  136. package/dist/tools.d.ts +3 -0
  137. package/dist/tools.d.ts.map +1 -0
  138. package/dist/tools.js +413 -0
  139. package/dist/tools.js.map +1 -0
  140. package/dist/transport/client.d.ts +68 -0
  141. package/dist/transport/client.d.ts.map +1 -0
  142. package/dist/transport/client.js +210 -0
  143. package/dist/transport/client.js.map +1 -0
  144. package/dist/transport/http-server.d.ts +3 -0
  145. package/dist/transport/http-server.d.ts.map +1 -0
  146. package/dist/transport/http-server.js +337 -0
  147. package/dist/transport/http-server.js.map +1 -0
  148. package/dist/types.d.ts +185 -0
  149. package/dist/types.d.ts.map +1 -0
  150. package/dist/types.js +3 -0
  151. package/dist/types.js.map +1 -0
  152. package/package.json +71 -0
  153. package/scripts/run-server.mjs +3 -0
  154. package/scripts/stdio-only.mjs +23 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 David Xu
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,198 @@
1
+ # agentcore
2
+
3
+ > Shared memory and coordination layer for multi-agent AI workflows.
4
+ > MCP server + REST API. Works locally with zero config. Scales to Azure.
5
+
6
+ Any AI tool that speaks MCP — Cursor, Claude Code, Copilot CLI, Codex — connects to
7
+ this server and gains persistent memory, task coordination, and shared knowledge across
8
+ every session.
9
+
10
+ ---
11
+
12
+ ## Quick start
13
+
14
+ ```bash
15
+ npx agentcore
16
+ ```
17
+
18
+ That's it. The server starts on port 3001, stores data locally in `~/.agentcore/` using
19
+ LanceDB, and is immediately available to any MCP client. No account, no API key, no config.
20
+
21
+ ---
22
+
23
+ ## Connect your AI tool
24
+
25
+ Add to your MCP client config (Claude Code, Cursor, Copilot, etc.):
26
+
27
+ ```json
28
+ {
29
+ "mcpServers": {
30
+ "datacore": {
31
+ "command": "npx",
32
+ "args": ["agentcore"]
33
+ }
34
+ }
35
+ }
36
+ ```
37
+
38
+ For **Claude Desktop**, add to `~/Library/Application Support/Claude/claude_desktop_config.json`:
39
+
40
+ ```json
41
+ {
42
+ "mcpServers": {
43
+ "datacore": {
44
+ "command": "npx",
45
+ "args": ["agentcore"]
46
+ }
47
+ }
48
+ }
49
+ ```
50
+
51
+ ---
52
+
53
+ ## What's included
54
+
55
+ ### 17 MCP tools across 4 categories
56
+
57
+ **Context**
58
+ | Tool | What it does |
59
+ |---|---|
60
+ | `warm_start` | Assemble full task context: spec, gotchas, knowledge graph, retry history |
61
+
62
+ **Memory & search**
63
+ | Tool | What it does |
64
+ |---|---|
65
+ | `log_event` | Append any event to the Bronze memory layer |
66
+ | `search` | Full-text search across all events |
67
+ | `deep_search` | Semantic (vector) search — finds by meaning, not keyword |
68
+ | `get_facts` | Query curated Gold entities (decisions, lessons, skills) |
69
+ | `get_linked` | Traverse the knowledge graph from any entity |
70
+ | `add_entity` | Create or update a Gold entity |
71
+ | `get_tasks` | Read the task board |
72
+ | `get_questions` | Read async AI-to-AI questions |
73
+
74
+ **Task lifecycle**
75
+ | Tool | What it does |
76
+ |---|---|
77
+ | `start_task` | Mark a task in progress |
78
+ | `complete_task` | Mark complete — auto-captures tool sequence |
79
+ | `update_task` | Log progress (loop detection at 4×, compaction at 8×) |
80
+ | `block_task` | Record a blocker |
81
+ | `fail_task` | Record a failure |
82
+
83
+ **Knowledge**
84
+ | Tool | What it does |
85
+ |---|---|
86
+ | `save_lesson` | Extract a reusable lesson from a task |
87
+ | `save_decision` | Record an architecture decision with rationale |
88
+ | `ask_team` | Post an async question to another agent |
89
+
90
+ ### Skills
91
+
92
+ Datacore ships with a set of AI-callable skills in `skills/datacore/`. These are
93
+ standalone scripts any agent can invoke as part of completing a task:
94
+
95
+ | Skill | What it does |
96
+ |---|---|
97
+ | `promote-to-gold.mjs` | Promote Bronze events → curated Gold entities |
98
+ | `backfill-search.mjs` | Index Bronze events into the Silver search layer |
99
+ | `backfill-links.mjs` | Build knowledge graph links between entities |
100
+ | `enrich-memory.mjs` | Enrich session startup context |
101
+ | `export-obsidian.mjs` | Export the knowledge graph to Obsidian markdown |
102
+
103
+ ---
104
+
105
+ ## Data architecture
106
+
107
+ Datacore stores everything in a three-layer medallion pattern:
108
+
109
+ ```
110
+ Bronze Append-only event log. Every agent action lands here.
111
+ Local: LanceDB in ~/.agentcore/ Cloud: Azure Cosmos DB
112
+
113
+ Silver Vector-indexed for semantic search.
114
+ Local: LanceDB full-text index Cloud: Azure AI Search
115
+
116
+ Gold Curated facts — decisions, lessons, skills, agent journals.
117
+ 225+ entities. Queried via get_facts() and get_linked().
118
+ ```
119
+
120
+ ---
121
+
122
+ ## Upgrade to Azure (cloud mode)
123
+
124
+ To persist across machines and share memory between a real team,
125
+ set Cosmos DB credentials and the engine switches to cloud mode automatically:
126
+
127
+ ```bash
128
+ export COSMOS_ENDPOINT="https://your-cosmos.documents.azure.com:443/"
129
+ export COSMOS_KEY="your-key"
130
+ npx agentcore
131
+ ```
132
+
133
+ Optional: add Azure AI Search for semantic search across large event volumes:
134
+
135
+ ```bash
136
+ export AZURE_SEARCH_ENDPOINT="https://your-search.search.windows.net"
137
+ export AZURE_SEARCH_KEY="your-key"
138
+ ```
139
+
140
+ No code changes. No config file. The engine detects credentials at startup
141
+ and selects the right backend automatically.
142
+
143
+ ---
144
+
145
+ ## HTTP API
146
+
147
+ The engine also exposes a REST API on port 3001 alongside the MCP server.
148
+ Useful for shell scripts, cron jobs, or any tool that can't run MCP:
149
+
150
+ ```bash
151
+ # Log an event
152
+ curl -X POST http://localhost:3001/events \
153
+ -H "Content-Type: application/json" \
154
+ -d '{"source":"my-tool","type":"note","content":"built the widget"}'
155
+
156
+ # Search
157
+ curl "http://localhost:3001/search?q=widget"
158
+
159
+ # Task board
160
+ curl http://localhost:3001/tasks
161
+ ```
162
+
163
+ Full reference: `API.md` in the datacore repo.
164
+
165
+ ---
166
+
167
+ ## Requirements
168
+
169
+ - Node.js >= 22
170
+ - No other dependencies for local mode
171
+
172
+ ---
173
+
174
+ ## Use as a library
175
+
176
+ ```typescript
177
+ import { appendEvent, queryEntities } from 'agentcore';
178
+ import type { BronzeRecord, GoldEntity } from 'agentcore/types';
179
+
180
+ await appendEvent({
181
+ source: 'my-agent',
182
+ type: 'task_completed',
183
+ content: 'Finished building the widget',
184
+ project: 'my-project',
185
+ });
186
+
187
+ const { entities } = await queryEntities({ entity_type: 'decision' });
188
+ ```
189
+
190
+ ---
191
+
192
+ ## License
193
+
194
+ MIT
195
+
196
+ ---
197
+
198
+ *Built by [David Xu](https://github.com/david3xu) · Part of the Datacore project*
@@ -0,0 +1,119 @@
1
+ {
2
+ "_comment": "Default trigger rules bundled with @datacore/engine. Uses log_event actions only — works standalone without any dispatch scripts. Override by placing triggers.json in ~/.datacore/triggers.json.",
3
+ "rules": [
4
+ {
5
+ "rule_id": "TR-001",
6
+ "name": "Queue review on task completion",
7
+ "condition": {
8
+ "event_type": "task_completed"
9
+ },
10
+ "action": {
11
+ "type": "log_event",
12
+ "event": {
13
+ "type": "task_assigned",
14
+ "source": "datacore",
15
+ "content": "Review queued for ${context.task_id} — assigned to claude-desktop.",
16
+ "context": {
17
+ "task_id": "${context.task_id}",
18
+ "assigned_to": "claude-desktop",
19
+ "status": "assigned",
20
+ "review": true
21
+ }
22
+ }
23
+ },
24
+ "enabled": true
25
+ },
26
+ {
27
+ "rule_id": "TR-002",
28
+ "name": "Re-queue task on review failure",
29
+ "condition": {
30
+ "event_type": "task_reviewed",
31
+ "context.verdict": "fail"
32
+ },
33
+ "action": {
34
+ "type": "log_event",
35
+ "event": {
36
+ "type": "task_assigned",
37
+ "source": "datacore",
38
+ "content": "Retry: ${context.task_id} failed review. Re-assigning to ${context.assigned_to}.",
39
+ "context": {
40
+ "task_id": "${context.task_id}",
41
+ "assigned_to": "${context.assigned_to}",
42
+ "status": "assigned",
43
+ "retry": true
44
+ }
45
+ }
46
+ },
47
+ "enabled": true
48
+ },
49
+ {
50
+ "rule_id": "TR-003",
51
+ "name": "Queue lesson extraction on review pass",
52
+ "condition": {
53
+ "event_type": "task_reviewed",
54
+ "context.verdict": "pass"
55
+ },
56
+ "action": {
57
+ "type": "log_event",
58
+ "event": {
59
+ "type": "task_assigned",
60
+ "source": "datacore",
61
+ "content": "Lesson extraction queued for ${context.task_id}.",
62
+ "context": {
63
+ "task_id": "${context.task_id}",
64
+ "assigned_to": "claude-desktop",
65
+ "status": "assigned",
66
+ "lesson_extraction": true
67
+ }
68
+ }
69
+ },
70
+ "enabled": true
71
+ },
72
+ {
73
+ "rule_id": "TR-006",
74
+ "name": "Loop detection — flag stuck tasks",
75
+ "condition": {
76
+ "event_type": "task_loop_detected"
77
+ },
78
+ "action": {
79
+ "type": "log_event",
80
+ "event": {
81
+ "type": "task_assigned",
82
+ "source": "datacore",
83
+ "content": "Loop detected on ${context.task_id} after ${context.progress_count} progress events. Manual review required.",
84
+ "context": {
85
+ "task_id": "${context.task_id}",
86
+ "assigned_to": "claude-desktop",
87
+ "status": "assigned",
88
+ "loop_intervention": true,
89
+ "progress_count": "${context.progress_count}"
90
+ }
91
+ }
92
+ },
93
+ "enabled": true
94
+ },
95
+ {
96
+ "rule_id": "TR-009",
97
+ "name": "Context compaction — flag for briefing",
98
+ "condition": {
99
+ "event_type": "task_compaction_needed"
100
+ },
101
+ "action": {
102
+ "type": "log_event",
103
+ "event": {
104
+ "type": "task_assigned",
105
+ "source": "datacore",
106
+ "content": "Compaction needed for ${context.task_id} — ${context.progress_count} progress events logged.",
107
+ "context": {
108
+ "task_id": "${context.task_id}",
109
+ "assigned_to": "claude-desktop",
110
+ "status": "assigned",
111
+ "compaction": true,
112
+ "progress_count": "${context.progress_count}"
113
+ }
114
+ }
115
+ },
116
+ "enabled": true
117
+ }
118
+ ]
119
+ }
@@ -0,0 +1,124 @@
1
+ export type CostClass = "free" | "low" | "medium" | "high";
2
+ export type QuotaClass = "unlimited" | "subscription" | "pay-per-use" | "rate-limited";
3
+ export type ReliabilityClass = "high" | "medium" | "experimental";
4
+ export type AgentRole = "planner" | "builder" | "reviewer" | "architect" | "researcher" | "ops" | "director";
5
+ export type TaskStage = "planning" | "implementation" | "review" | "rework" | "validation" | "release";
6
+ export interface AdapterMetadata {
7
+ runtime_id: string;
8
+ provider: string;
9
+ surfaces: string[];
10
+ supports_mcp: boolean;
11
+ supports_hooks: boolean;
12
+ supports_transcript_export: boolean;
13
+ supports_isolation: boolean;
14
+ supports_review_mode: boolean;
15
+ supports_parallel_subagents: boolean;
16
+ cost_class: CostClass;
17
+ quota_class: QuotaClass;
18
+ reliability_class: ReliabilityClass;
19
+ ideal_roles: AgentRole[];
20
+ ideal_stages: TaskStage[];
21
+ }
22
+ export interface NormalizedTask {
23
+ task_id: string;
24
+ parent_task_id?: string;
25
+ project_id: string;
26
+ title: string;
27
+ description: string;
28
+ stage: TaskStage;
29
+ priority: "low" | "medium" | "high" | "critical";
30
+ risk_level: "low" | "medium" | "high";
31
+ required_capabilities: string[];
32
+ preferred_role: AgentRole;
33
+ review_required: boolean;
34
+ worktree_mode: "shared_workspace" | "isolated_worktree" | "sandboxed_runtime";
35
+ acceptance_criteria: string[];
36
+ budget_policy?: DispatchPolicy;
37
+ attachments?: string[];
38
+ warm_start_ref?: string;
39
+ }
40
+ export interface TaskContext {
41
+ run_id: string;
42
+ warm_start?: string;
43
+ prior_attempts: number;
44
+ review_findings?: string[];
45
+ workspace_path?: string;
46
+ }
47
+ export interface DispatchPolicy {
48
+ max_cost_class?: CostClass;
49
+ max_retries?: number;
50
+ require_review?: boolean;
51
+ require_isolation?: boolean;
52
+ budget_cap_usd?: number;
53
+ }
54
+ export interface PreflightResult {
55
+ ok: boolean;
56
+ runtime_id: string;
57
+ failure_reason?: "auth_failure" | "quota_failure" | "mcp_unavailable" | "executable_missing" | "policy_denied" | "workspace_unavailable";
58
+ detail?: string;
59
+ }
60
+ export interface RunHandle {
61
+ run_id: string;
62
+ runtime_id: string;
63
+ task_id: string;
64
+ started_at: string;
65
+ workspace_path?: string;
66
+ }
67
+ export interface RunStatus {
68
+ run_id: string;
69
+ task_id: string;
70
+ status: "starting" | "running" | "review" | "done" | "failed" | "cancelled";
71
+ runtime_id: string;
72
+ last_heartbeat?: string;
73
+ model_in_use?: string;
74
+ artifact_refs: string[];
75
+ }
76
+ export interface CancelResult {
77
+ run_id: string;
78
+ reason: "user" | "policy" | "timeout" | "superseded" | "dependency_failure";
79
+ cancelled_at: string;
80
+ }
81
+ export interface TranscriptRef {
82
+ ref: string;
83
+ runtime_id: string;
84
+ task_id: string;
85
+ run_id: string;
86
+ path?: string;
87
+ }
88
+ export interface HealthcheckResult {
89
+ ok: boolean;
90
+ executable_found: boolean;
91
+ config_present: boolean;
92
+ service_reachable: boolean;
93
+ mcp_reachable: boolean;
94
+ log_path_writable: boolean;
95
+ detail?: string;
96
+ }
97
+ export interface AuthState {
98
+ authenticated: boolean;
99
+ account_id?: string;
100
+ token_expiry?: string;
101
+ provider_host?: string;
102
+ interactive_reauth_required: boolean;
103
+ mcp_auth_issues: string[];
104
+ }
105
+ export interface RuntimeAdapter {
106
+ readonly runtime_id: string;
107
+ /** Check auth, quota, MCP, workspace before dispatch. */
108
+ preflight(task: NormalizedTask, context: TaskContext, policy: DispatchPolicy): Promise<PreflightResult>;
109
+ /** Launch a run. Returns a handle for status polling. */
110
+ start(task: NormalizedTask, context: TaskContext): Promise<RunHandle>;
111
+ /** Current state of a run. */
112
+ status(task_id: string): Promise<RunStatus>;
113
+ /** Stop a run intentionally. */
114
+ cancel(task_id: string, reason: CancelResult["reason"]): Promise<CancelResult>;
115
+ /** Export transcript or ref pointer for the run. */
116
+ export_transcript(task_id: string): Promise<TranscriptRef>;
117
+ /** Is the runtime operational right now? */
118
+ healthcheck(): Promise<HealthcheckResult>;
119
+ /** What can this runtime do? (used by router for scoring) */
120
+ capabilities(): AdapterMetadata;
121
+ /** Auth + credential readiness. */
122
+ auth_state(): Promise<AuthState>;
123
+ }
124
+ //# sourceMappingURL=runtime-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/runtime-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ // runtime-adapter.ts — What must every provider adapter implement?
2
+ // Self-contained: all adapter-layer types are defined here.
3
+ // Spec: docs/design/DC-T11-adapter-contracts.md §§1-2, §5
4
+ export {};
5
+ //# sourceMappingURL=runtime-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-adapter.js","sourceRoot":"","sources":["../../src/adapters/runtime-adapter.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,4DAA4D;AAC5D,0DAA0D"}
@@ -0,0 +1,21 @@
1
+ /** Semantic version from this package's package.json (MCP server metadata). */
2
+ export declare function getMcpServerPackageVersion(): string;
3
+ export declare function getCosmosDatabaseName(): string;
4
+ export declare function getCosmosBronzeContainerName(): string;
5
+ export declare function getCosmosGoldContainerName(): string;
6
+ /** Display / API string for the active bronze Cosmos path (not a real URL scheme). */
7
+ export declare function getCosmosBronzeUriString(): string;
8
+ /** Display / API string for the gold Cosmos path. */
9
+ export declare function getCosmosGoldUriString(): string;
10
+ /** HTTP listen port (default 3001). */
11
+ export declare function getHttpPort(): number;
12
+ /** Base URL for HTTP clients. */
13
+ export declare function getHttpBaseUrl(): string;
14
+ /**
15
+ * Resolved API key for HTTP auth: production callers should set MCP_API_KEY.
16
+ * In dev, falls back to AGENTCORE_DEV_KEY / DATACORE_HTTP_DEV_FALLBACK_KEY.
17
+ */
18
+ export declare function getApiKey(): string;
19
+ /** Insecure dev-only API key when MCP_API_KEY is unset (non-production only). */
20
+ export declare function getHttpDevFallbackApiKey(): string;
21
+ //# sourceMappingURL=datacore-constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datacore-constants.d.ts","sourceRoot":"","sources":["../../src/config/datacore-constants.ts"],"names":[],"mappings":"AAWA,+EAA+E;AAC/E,wBAAgB,0BAA0B,IAAI,MAAM,CAQnD;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAM9C;AAED,wBAAgB,4BAA4B,IAAI,MAAM,CAMrD;AAED,wBAAgB,0BAA0B,IAAI,MAAM,CAMnD;AAED,sFAAsF;AACtF,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD;AAED,qDAAqD;AACrD,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,uCAAuC;AACvC,wBAAgB,WAAW,IAAI,MAAM,CAKpC;AAED,iCAAiC;AACjC,wBAAgB,cAAc,IAAI,MAAM,CAMvC;AAED;;;GAGG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAOlC;AAED,iFAAiF;AACjF,wBAAgB,wBAAwB,IAAI,MAAM,CAMjD"}
@@ -0,0 +1,68 @@
1
+ // agentcore-constants.ts — Single source for package version and Cosmos display URIs.
2
+ // Database / container names are overridable for non-default Cosmos layouts.
3
+ // Env vars: AGENTCORE_* preferred; DATACORE_* accepted as legacy aliases.
4
+ import { readFileSync } from "node:fs";
5
+ import { dirname, join } from "node:path";
6
+ import { fileURLToPath } from "node:url";
7
+ const packageDir = dirname(fileURLToPath(import.meta.url));
8
+ let cachedPackageVersion;
9
+ /** Semantic version from this package's package.json (MCP server metadata). */
10
+ export function getMcpServerPackageVersion() {
11
+ if (cachedPackageVersion === undefined) {
12
+ const pkgPath = join(packageDir, "..", "..", "package.json");
13
+ const raw = readFileSync(pkgPath, "utf8");
14
+ const pkg = JSON.parse(raw);
15
+ cachedPackageVersion = pkg.version ?? "0.0.0";
16
+ }
17
+ return cachedPackageVersion;
18
+ }
19
+ export function getCosmosDatabaseName() {
20
+ return (process.env.AGENTCORE_COSMOS_DATABASE ??
21
+ process.env.DATACORE_COSMOS_DATABASE ??
22
+ "datacore");
23
+ }
24
+ export function getCosmosBronzeContainerName() {
25
+ return (process.env.AGENTCORE_COSMOS_BRONZE_CONTAINER ??
26
+ process.env.DATACORE_COSMOS_BRONZE_CONTAINER ??
27
+ "bronze");
28
+ }
29
+ export function getCosmosGoldContainerName() {
30
+ return (process.env.AGENTCORE_COSMOS_GOLD_CONTAINER ??
31
+ process.env.DATACORE_COSMOS_GOLD_CONTAINER ??
32
+ "gold");
33
+ }
34
+ /** Display / API string for the active bronze Cosmos path (not a real URL scheme). */
35
+ export function getCosmosBronzeUriString() {
36
+ return `cosmos://${getCosmosDatabaseName()}/${getCosmosBronzeContainerName()}`;
37
+ }
38
+ /** Display / API string for the gold Cosmos path. */
39
+ export function getCosmosGoldUriString() {
40
+ return `cosmos://${getCosmosDatabaseName()}/${getCosmosGoldContainerName()}`;
41
+ }
42
+ /** HTTP listen port (default 3001). */
43
+ export function getHttpPort() {
44
+ return parseInt(process.env.AGENTCORE_PORT ?? process.env.DATACORE_HTTP_PORT ?? "3001", 10);
45
+ }
46
+ /** Base URL for HTTP clients. */
47
+ export function getHttpBaseUrl() {
48
+ return (process.env.AGENTCORE_BASE_URL ??
49
+ process.env.DATACORE_HTTP_BASE_URL ??
50
+ `http://localhost:${getHttpPort()}`);
51
+ }
52
+ /**
53
+ * Resolved API key for HTTP auth: production callers should set MCP_API_KEY.
54
+ * In dev, falls back to AGENTCORE_DEV_KEY / DATACORE_HTTP_DEV_FALLBACK_KEY.
55
+ */
56
+ export function getApiKey() {
57
+ return (process.env.MCP_API_KEY ??
58
+ process.env.AGENTCORE_DEV_KEY ??
59
+ process.env.DATACORE_HTTP_DEV_FALLBACK_KEY ??
60
+ "dev-key-change-me");
61
+ }
62
+ /** Insecure dev-only API key when MCP_API_KEY is unset (non-production only). */
63
+ export function getHttpDevFallbackApiKey() {
64
+ return (process.env.AGENTCORE_DEV_KEY ??
65
+ process.env.DATACORE_HTTP_DEV_FALLBACK_KEY ??
66
+ "dev-key-change-me");
67
+ }
68
+ //# sourceMappingURL=datacore-constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datacore-constants.js","sourceRoot":"","sources":["../../src/config/datacore-constants.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,6EAA6E;AAC7E,0EAA0E;AAE1E,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3D,IAAI,oBAAwC,CAAC;AAE7C,+EAA+E;AAC/E,MAAM,UAAU,0BAA0B;IACxC,IAAI,oBAAoB,KAAK,SAAS,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;QAC7D,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;QACpD,oBAAoB,GAAG,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;IAChD,CAAC;IACD,OAAO,oBAAoB,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,yBAAyB;QACrC,OAAO,CAAC,GAAG,CAAC,wBAAwB;QACpC,UAAU,CACX,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B;IAC1C,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,iCAAiC;QAC7C,OAAO,CAAC,GAAG,CAAC,gCAAgC;QAC5C,QAAQ,CACT,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B;IACxC,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,+BAA+B;QAC3C,OAAO,CAAC,GAAG,CAAC,8BAA8B;QAC1C,MAAM,CACP,CAAC;AACJ,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,wBAAwB;IACtC,OAAO,YAAY,qBAAqB,EAAE,IAAI,4BAA4B,EAAE,EAAE,CAAC;AACjF,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,sBAAsB;IACpC,OAAO,YAAY,qBAAqB,EAAE,IAAI,0BAA0B,EAAE,EAAE,CAAC;AAC/E,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,WAAW;IACzB,OAAO,QAAQ,CACb,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,MAAM,EACtE,EAAE,CACH,CAAC;AACJ,CAAC;AAED,iCAAiC;AACjC,MAAM,UAAU,cAAc;IAC5B,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,kBAAkB;QAC9B,OAAO,CAAC,GAAG,CAAC,sBAAsB;QAClC,oBAAoB,WAAW,EAAE,EAAE,CACpC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,WAAW;QACvB,OAAO,CAAC,GAAG,CAAC,iBAAiB;QAC7B,OAAO,CAAC,GAAG,CAAC,8BAA8B;QAC1C,mBAAmB,CACpB,CAAC;AACJ,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,wBAAwB;IACtC,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,iBAAiB;QAC7B,OAAO,CAAC,GAAG,CAAC,8BAA8B;QAC1C,mBAAmB,CACpB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ export declare const EMBEDDABLE_TYPES: Set<string>;
2
+ export declare const MIN_CONTENT_LENGTH = 50;
3
+ export declare function shouldEmbed(record: {
4
+ type?: string;
5
+ content?: string;
6
+ }): boolean;
7
+ export declare const KNOWN_SOURCES: Set<string>;
8
+ export interface ValidationResult {
9
+ valid: boolean;
10
+ reasons: string[];
11
+ }
12
+ export declare function validateForSilver(record: Record<string, unknown>): ValidationResult;
13
+ /**
14
+ * Extract a compact summary from event content for better Silver embeddings.
15
+ * Rule-based only — no LLM calls. For content >200 chars: first sentence + key entities.
16
+ * Returns null for short content (embed as-is).
17
+ */
18
+ export declare function extractContentSummary(content: string | null | undefined): string | null;
19
+ //# sourceMappingURL=embeddable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddable.d.ts","sourceRoot":"","sources":["../../src/domain/embeddable.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,gBAAgB,aAsB3B,CAAC;AAEH,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC,wBAAgB,WAAW,CAAC,MAAM,EAAE;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAIV;AAGD,eAAO,MAAM,aAAa,aAexB,CAAC;AAKH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,gBAAgB,CAkClB;AAID;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACjC,MAAM,GAAG,IAAI,CAoBf"}