@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
@@ -0,0 +1,106 @@
1
+ // embeddable.ts — Which event types are worth embedding? What's valid for Silver?
2
+ // Shared logic for export-for-databricks and export-daily scripts.
3
+ // Single source of truth for what goes to Databricks Silver layer.
4
+ export const EMBEDDABLE_TYPES = new Set([
5
+ "assistant_message",
6
+ "human_message",
7
+ "conversation",
8
+ "decision",
9
+ "action",
10
+ "insight",
11
+ "problem",
12
+ "task_created",
13
+ "task_context",
14
+ "task_completed",
15
+ "task_reviewed",
16
+ "task_started",
17
+ "message_preprocessed",
18
+ "message_sent",
19
+ "tool_summary",
20
+ "response_message",
21
+ "agent_message",
22
+ "message",
23
+ "tool_result",
24
+ "record",
25
+ "reasoning",
26
+ ]);
27
+ export const MIN_CONTENT_LENGTH = 50;
28
+ export function shouldEmbed(record) {
29
+ if (!EMBEDDABLE_TYPES.has(record.type ?? ""))
30
+ return false;
31
+ if ((record.content ?? "").length < MIN_CONTENT_LENGTH)
32
+ return false;
33
+ return true;
34
+ }
35
+ // Known sources — events from unknown sources get flagged
36
+ export const KNOWN_SOURCES = new Set([
37
+ "claude",
38
+ "claude-agent",
39
+ "claude.ai",
40
+ "claude-desktop",
41
+ "claude-web",
42
+ "claude-cowork",
43
+ "codex",
44
+ "codex-session",
45
+ "gemini",
46
+ "gemini-session",
47
+ "openclaw",
48
+ "openclaw-session",
49
+ "log-session-sh",
50
+ "datacore",
51
+ ]);
52
+ const MAX_CONTENT_LENGTH = 50_000;
53
+ const ISO_DATE_RE = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/;
54
+ export function validateForSilver(record) {
55
+ const reasons = [];
56
+ if (!record._event_id)
57
+ reasons.push("missing _event_id");
58
+ if (!record._timestamp) {
59
+ reasons.push("missing _timestamp");
60
+ }
61
+ else if (!ISO_DATE_RE.test(String(record._timestamp))) {
62
+ reasons.push(`invalid _timestamp: ${String(record._timestamp).slice(0, 30)}`);
63
+ }
64
+ const source = (record._source ?? record.source);
65
+ if (!source) {
66
+ reasons.push("missing source");
67
+ }
68
+ else if (!KNOWN_SOURCES.has(source)) {
69
+ reasons.push(`unknown source: ${source}`);
70
+ }
71
+ if (!record.type)
72
+ reasons.push("missing type");
73
+ const content = record.content ?? "";
74
+ if (typeof content !== "string") {
75
+ reasons.push("content is not a string");
76
+ }
77
+ else if (content.length < MIN_CONTENT_LENGTH) {
78
+ reasons.push(`content too short (${content.length} < ${MIN_CONTENT_LENGTH})`);
79
+ }
80
+ else if (content.length > MAX_CONTENT_LENGTH) {
81
+ reasons.push(`content too long (${content.length} > ${MAX_CONTENT_LENGTH})`);
82
+ }
83
+ return { valid: reasons.length === 0, reasons };
84
+ }
85
+ const SUMMARY_MIN_CONTENT_LENGTH = 200;
86
+ /**
87
+ * Extract a compact summary from event content for better Silver embeddings.
88
+ * Rule-based only — no LLM calls. For content >200 chars: first sentence + key entities.
89
+ * Returns null for short content (embed as-is).
90
+ */
91
+ export function extractContentSummary(content) {
92
+ if (!content || content.length < SUMMARY_MIN_CONTENT_LENGTH) {
93
+ return null;
94
+ }
95
+ const firstSentenceMatch = content.match(/^(.{20,300}?[.!?])(?:\s|$)/s);
96
+ const firstSentence = firstSentenceMatch
97
+ ? firstSentenceMatch[1].trim()
98
+ : content.slice(0, 200).trim();
99
+ const entityPattern = /\b([A-Z][a-z]+(?:\s[A-Z][a-z]+)*|[A-Z]{2,}|v\d+\.\d+[\w.]*|R\d{1,3}(?:-\w+)?)\b/g;
100
+ const entities = [...new Set(content.match(entityPattern) ?? [])].slice(0, 8);
101
+ const summary = entities.length > 0
102
+ ? `${firstSentence} [${entities.join(", ")}]`
103
+ : firstSentence;
104
+ return summary.length < content.length * 0.8 ? summary : null;
105
+ }
106
+ //# sourceMappingURL=embeddable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddable.js","sourceRoot":"","sources":["../../src/domain/embeddable.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { GoldEntity, AddEntityInput, AddEntityResult, GetFactsInput, GetFactsResult, GetLinkedResult } from "../types.js";
2
+ export declare function getGoldDir(): string;
3
+ export declare function readGoldEntities(entityType?: string): Promise<GoldEntity[]>;
4
+ export declare function upsertEntity(input: AddEntityInput): Promise<AddEntityResult>;
5
+ export declare function queryEntities(input: GetFactsInput): Promise<GetFactsResult>;
6
+ /**
7
+ * Traverse Gold graph: entity by id, outbound links_to targets, inbound linkers (DC-T12).
8
+ * NOTE: inbound discovery requires a full-container scan (no reverse-index today); intentional until scale demands it.
9
+ */
10
+ export declare function getLinkedEntities(entity_id: string): Promise<GetLinkedResult>;
11
+ //# sourceMappingURL=gold-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gold-store.d.ts","sourceRoot":"","sources":["../../src/domain/gold-store.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,eAAe,EACf,aAAa,EACb,cAAc,EACd,eAAe,EAChB,MAAM,aAAa,CAAC;AAIrB,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAkED,wBAAsB,gBAAgB,CACpC,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,UAAU,EAAE,CAAC,CAgBvB;AASD,wBAAsB,YAAY,CAChC,KAAK,EAAE,cAAc,GACpB,OAAO,CAAC,eAAe,CAAC,CAgE1B;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,aAAa,GACnB,OAAO,CAAC,cAAc,CAAC,CAwEzB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,eAAe,CAAC,CAqB1B"}
@@ -0,0 +1,210 @@
1
+ // gold-store.ts — How are Gold entities stored and retrieved?
2
+ // Cloud mode: Azure Cosmos DB. Local mode: LanceDB (via activeBackend).
3
+ import { activeBackend } from "../storage/active-backend.js";
4
+ import fs from "node:fs/promises";
5
+ import os from "node:os";
6
+ import path from "node:path";
7
+ import { randomUUID, createHash } from "node:crypto";
8
+ import { getGoldContainer, isCosmosEnabled } from "../storage/cosmos-client.js";
9
+ import { getCosmosGoldUriString } from "../config/datacore-constants.js";
10
+ export function getGoldDir() {
11
+ return getCosmosGoldUriString();
12
+ }
13
+ async function readGoldEntitiesFromJsonl(entityType) {
14
+ const goldDir = process.env.DATACORE_GOLD_DIR ||
15
+ path.join(os.homedir(), ".datacore", "gold");
16
+ let entries;
17
+ try {
18
+ entries = await fs.readdir(goldDir, { withFileTypes: true });
19
+ }
20
+ catch (err) {
21
+ if (err.code === "ENOENT") {
22
+ return [];
23
+ }
24
+ throw err;
25
+ }
26
+ const expectedFile = entityType ? `${entityType}s.jsonl`.toLowerCase() : null;
27
+ const fileNames = entries
28
+ .filter((entry) => entry.isFile() && entry.name.endsWith(".jsonl"))
29
+ .map((entry) => entry.name)
30
+ .filter((name) => !expectedFile || name.toLowerCase() === expectedFile);
31
+ if (fileNames.length === 0) {
32
+ return [];
33
+ }
34
+ const entities = [];
35
+ for (const name of fileNames) {
36
+ const filePath = path.join(goldDir, name);
37
+ let raw;
38
+ try {
39
+ raw = await fs.readFile(filePath, "utf8");
40
+ }
41
+ catch (err) {
42
+ if (err.code === "ENOENT") {
43
+ continue;
44
+ }
45
+ throw err;
46
+ }
47
+ for (const line of raw.split(/\r?\n/).filter(Boolean)) {
48
+ try {
49
+ const entity = JSON.parse(line);
50
+ if (!entityType || entity.entity_type === entityType) {
51
+ entities.push(entity);
52
+ }
53
+ }
54
+ catch {
55
+ // Ignore malformed JSONL rows
56
+ }
57
+ }
58
+ }
59
+ return entities;
60
+ }
61
+ function contentHash(summary, project) {
62
+ return createHash("sha256")
63
+ .update(`${summary.toLowerCase().trim()}::${(project ?? "").toLowerCase().trim()}`)
64
+ .digest("hex")
65
+ .slice(0, 16);
66
+ }
67
+ export async function readGoldEntities(entityType) {
68
+ if (!isCosmosEnabled()) {
69
+ return readGoldEntitiesFromJsonl(entityType);
70
+ }
71
+ const container = await getGoldContainer();
72
+ const querySpec = entityType
73
+ ? {
74
+ query: "SELECT * FROM c WHERE c.entity_type = @et",
75
+ parameters: [{ name: "@et", value: entityType }],
76
+ }
77
+ : { query: "SELECT * FROM c" };
78
+ const { resources } = await container.items
79
+ .query(querySpec)
80
+ .fetchAll();
81
+ return resources;
82
+ }
83
+ function mergeLinks(existing, incoming) {
84
+ return Array.from(new Set([...(existing ?? []), ...(incoming ?? [])]));
85
+ }
86
+ export async function upsertEntity(input) {
87
+ if (activeBackend)
88
+ return activeBackend.upsertEntity(input);
89
+ const container = await getGoldContainer();
90
+ const { entity_type, summary, project = "", tags = [], links_to = [], source_events = [], data, } = input;
91
+ const hash = contentHash(summary, project);
92
+ const now = new Date().toISOString();
93
+ // NOTE: loads all rows for entity_type then JS hash match — fine at current scale; add a deterministic id or indexed field if Gold grows large.
94
+ const { resources } = await container.items
95
+ .query({
96
+ query: "SELECT * FROM c WHERE c.entity_type = @et",
97
+ parameters: [{ name: "@et", value: entity_type }],
98
+ })
99
+ .fetchAll();
100
+ const duplicate = resources.find((e) => contentHash(e.summary, e.project ?? "") === hash);
101
+ if (duplicate) {
102
+ const updated = {
103
+ ...duplicate,
104
+ tags: Array.from(new Set([...(duplicate.tags ?? []), ...tags])),
105
+ links_to: mergeLinks(duplicate.links_to, links_to),
106
+ source_events: Array.from(new Set([...(duplicate.source_events ?? []), ...source_events])),
107
+ data: data !== undefined ? data : duplicate.data,
108
+ updated_at: now,
109
+ };
110
+ await container.items.upsert({ ...updated, id: duplicate.entity_id });
111
+ return {
112
+ entity_id: updated.entity_id,
113
+ file_path: getCosmosGoldUriString(),
114
+ action: "updated",
115
+ };
116
+ }
117
+ const entity = {
118
+ entity_type,
119
+ entity_id: randomUUID(),
120
+ summary,
121
+ project: project || undefined,
122
+ tags,
123
+ ...(links_to.length > 0 ? { links_to } : {}),
124
+ source_events,
125
+ data,
126
+ created_at: now,
127
+ updated_at: now,
128
+ };
129
+ await container.items.create({ ...entity, id: entity.entity_id });
130
+ return {
131
+ entity_id: entity.entity_id,
132
+ file_path: getCosmosGoldUriString(),
133
+ action: "created",
134
+ };
135
+ }
136
+ export async function queryEntities(input) {
137
+ if (activeBackend)
138
+ return activeBackend.queryEntities(input);
139
+ const { entity_type, project, tag, query } = input;
140
+ if (!isCosmosEnabled()) {
141
+ const entities = await readGoldEntities(entity_type);
142
+ let filtered = entities;
143
+ if (project) {
144
+ const projectLower = project.toLowerCase();
145
+ filtered = filtered.filter((e) => (e.project ?? "").toLowerCase().includes(projectLower));
146
+ }
147
+ if (tag) {
148
+ const tagLower = tag.toLowerCase();
149
+ filtered = filtered.filter((e) => (e.tags ?? []).some((t) => t.toLowerCase().includes(tagLower)));
150
+ }
151
+ if (query) {
152
+ const queryLower = query.toLowerCase();
153
+ filtered = filtered.filter((e) => e.summary.toLowerCase().includes(queryLower) ||
154
+ JSON.stringify(e.data ?? "")
155
+ .toLowerCase()
156
+ .includes(queryLower));
157
+ }
158
+ return { entities: filtered, total: filtered.length };
159
+ }
160
+ const container = await getGoldContainer();
161
+ const parameters = [];
162
+ const conditions = [];
163
+ if (entity_type) {
164
+ conditions.push("c.entity_type = @entity_type");
165
+ parameters.push({ name: "@entity_type", value: entity_type });
166
+ }
167
+ if (project) {
168
+ conditions.push("(IS_STRING(c.project) AND CONTAINS(c.project, @project, true))");
169
+ parameters.push({ name: "@project", value: project });
170
+ }
171
+ if (tag) {
172
+ conditions.push("(IS_ARRAY(c.tags) AND ARRAY_CONTAINS(c.tags, @tag))");
173
+ parameters.push({ name: "@tag", value: tag });
174
+ }
175
+ if (query) {
176
+ conditions.push("(CONTAINS(c.summary, @query, true) OR CONTAINS(STRINGIFY(c.data), @query, true))");
177
+ parameters.push({ name: "@query", value: query });
178
+ }
179
+ const whereClause = conditions.length > 0 ? ` WHERE ${conditions.join(" AND ")}` : "";
180
+ const cosmosQuery = `SELECT * FROM c${whereClause}`;
181
+ const { resources } = await container.items
182
+ .query({ query: cosmosQuery, parameters })
183
+ .fetchAll();
184
+ return { entities: resources, total: resources.length };
185
+ }
186
+ /**
187
+ * Traverse Gold graph: entity by id, outbound links_to targets, inbound linkers (DC-T12).
188
+ * NOTE: inbound discovery requires a full-container scan (no reverse-index today); intentional until scale demands it.
189
+ */
190
+ export async function getLinkedEntities(entity_id) {
191
+ if (activeBackend)
192
+ return activeBackend.getLinkedEntities(entity_id);
193
+ const all = await readGoldEntities();
194
+ const entity = all.find((e) => e.entity_id === entity_id) ?? null;
195
+ if (!entity) {
196
+ return { entity: null, links_out: [], links_in: [], total_connections: 0 };
197
+ }
198
+ const outIds = entity.links_to ?? [];
199
+ const links_out = outIds
200
+ .map((id) => all.find((e) => e.entity_id === id))
201
+ .filter((e) => e !== undefined);
202
+ const links_in = all.filter((e) => (e.links_to ?? []).includes(entity_id));
203
+ return {
204
+ entity,
205
+ links_out,
206
+ links_in,
207
+ total_connections: links_out.length + links_in.length,
208
+ };
209
+ }
210
+ //# sourceMappingURL=gold-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gold-store.js","sourceRoot":"","sources":["../../src/domain/gold-store.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,wEAAwE;AAExE,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAE7D,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAElC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AASrD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAEzE,MAAM,UAAU,UAAU;IACxB,OAAO,sBAAsB,EAAE,CAAC;AAClC,CAAC;AAED,KAAK,UAAU,yBAAyB,CACtC,UAAmB;IAEnB,MAAM,OAAO,GACX,OAAO,CAAC,GAAG,CAAC,iBAAiB;QAC7B,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IAE/C,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrD,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,MAAM,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9E,MAAM,SAAS,GAAG,OAAO;SACtB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;SAClE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;SAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,YAAY,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,YAAY,CAAC,CAAC;IAE1E,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,QAAQ,GAAiB,EAAE,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC1C,IAAI,GAAW,CAAC;QAChB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrD,SAAS;YACX,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAe,CAAC;gBAC9C,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;oBACrD,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,8BAA8B;YAChC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,WAAW,CAAC,OAAe,EAAE,OAAe;IACnD,OAAO,UAAU,CAAC,QAAQ,CAAC;SACxB,MAAM,CACL,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAC3E;SACA,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,UAAmB;IAEnB,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QACvB,OAAO,yBAAyB,CAAC,UAAU,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG,UAAU;QAC1B,CAAC,CAAC;YACE,KAAK,EAAE,2CAA2C;YAClD,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;SACjD;QACH,CAAC,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;IACjC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,SAAS,CAAC,KAAK;SACxC,KAAK,CAAa,SAAS,CAAC;SAC5B,QAAQ,EAAE,CAAC;IACd,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,UAAU,CACjB,QAA8B,EAC9B,QAA8B;IAE9B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,KAAqB;IAErB,IAAI,aAAa;QAAE,OAAO,aAAa,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAC3C,MAAM,EACJ,WAAW,EACX,OAAO,EACP,OAAO,GAAG,EAAE,EACZ,IAAI,GAAG,EAAE,EACT,QAAQ,GAAG,EAAE,EACb,aAAa,GAAG,EAAE,EAClB,IAAI,GACL,GAAG,KAAK,CAAC;IACV,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAErC,gJAAgJ;IAChJ,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,SAAS,CAAC,KAAK;SACxC,KAAK,CAA8B;QAClC,KAAK,EAAE,2CAA2C;QAClD,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;KAClD,CAAC;SACD,QAAQ,EAAE,CAAC;IAEd,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAC9B,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,KAAK,IAAI,CACxD,CAAC;IAEF,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,OAAO,GAAe;YAC1B,GAAG,SAAS;YACZ,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;YAC/D,QAAQ,EAAE,UAAU,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC;YAClD,aAAa,EAAE,KAAK,CAAC,IAAI,CACvB,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,IAAI,EAAE,CAAC,EAAE,GAAG,aAAa,CAAC,CAAC,CAChE;YACD,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI;YAChD,UAAU,EAAE,GAAG;SAChB,CAAC;QACF,MAAM,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,OAAO,EAAE,EAAE,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC;QACtE,OAAO;YACL,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,SAAS,EAAE,sBAAsB,EAAE;YACnC,MAAM,EAAE,SAAS;SAClB,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAe;QACzB,WAAW;QACX,SAAS,EAAE,UAAU,EAAE;QACvB,OAAO;QACP,OAAO,EAAE,OAAO,IAAI,SAAS;QAC7B,IAAI;QACJ,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,aAAa;QACb,IAAI;QACJ,UAAU,EAAE,GAAG;QACf,UAAU,EAAE,GAAG;KAChB,CAAC;IACF,MAAM,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IAClE,OAAO;QACL,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,SAAS,EAAE,sBAAsB,EAAE;QACnC,MAAM,EAAE,SAAS;KAClB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAoB;IAEpB,IAAI,aAAa;QAAE,OAAO,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC7D,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IACnD,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAC;QACrD,IAAI,QAAQ,GAAG,QAAQ,CAAC;QAExB,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;YAC3C,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAC/B,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CACvD,CAAC;QACJ,CAAC;QAED,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;YACnC,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAC/B,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAC/D,CAAC;QACJ,CAAC;QAED,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;YACvC,QAAQ,GAAG,QAAQ,CAAC,MAAM,CACxB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAC5C,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;qBACzB,WAAW,EAAE;qBACb,QAAQ,CAAC,UAAU,CAAC,CAC1B,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;IACxD,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAC3C,MAAM,UAAU,GAAsC,EAAE,CAAC;IACzD,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,IAAI,WAAW,EAAE,CAAC;QAChB,UAAU,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAChD,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,UAAU,CAAC,IAAI,CACb,gEAAgE,CACjE,CAAC;QACF,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,GAAG,EAAE,CAAC;QACR,UAAU,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QACvE,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACV,UAAU,CAAC,IAAI,CACb,kFAAkF,CACnF,CAAC;QACF,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,WAAW,GACf,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACpE,MAAM,WAAW,GAAG,kBAAkB,WAAW,EAAE,CAAC;IAEpD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,SAAS,CAAC,KAAK;SACxC,KAAK,CAAa,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;SACrD,QAAQ,EAAE,CAAC;IAEd,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC;AAC1D,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,SAAiB;IAEjB,IAAI,aAAa;QAAE,OAAO,aAAa,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACrE,MAAM,GAAG,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACrC,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,IAAI,IAAI,CAAC;IAClE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;IAC7E,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;IACrC,MAAM,SAAS,GAAG,MAAM;SACrB,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC;SAChD,MAAM,CAAC,CAAC,CAAC,EAAmB,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;IAEnD,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IAE3E,OAAO;QACL,MAAM;QACN,SAAS;QACT,QAAQ;QACR,iBAAiB,EAAE,SAAS,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM;KACtD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ export interface InboxItem {
2
+ type: string;
3
+ priority: "high" | "medium" | "low";
4
+ summary: string;
5
+ context: Record<string, unknown>;
6
+ age_minutes: number;
7
+ }
8
+ export interface InboxResult {
9
+ agent: string;
10
+ attention: InboxItem[];
11
+ total: number;
12
+ }
13
+ export declare function buildInbox(agent: string): Promise<InboxResult>;
14
+ //# sourceMappingURL=inbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbox.d.ts","sourceRoot":"","sources":["../../src/domain/inbox.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,SAAS,EAAE,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAkJpE"}
@@ -0,0 +1,138 @@
1
+ // inbox.ts — What needs this agent's attention?
2
+ // Domain logic for /inbox endpoint. Aggregates tasks, questions,
3
+ // and proposals into a prioritized attention list per agent.
4
+ import { getQuestions } from "./questions.js";
5
+ import { searchEvents } from "../search/search.js";
6
+ import { loadTaskEventIndex } from "./task-event-index.js";
7
+ export async function buildInbox(agent) {
8
+ const items = [];
9
+ const now = Date.now();
10
+ const { tasks: taskMap } = await loadTaskEventIndex();
11
+ function minutesSince(timestamp) {
12
+ if (!timestamp)
13
+ return 0;
14
+ const value = Date.parse(timestamp);
15
+ if (Number.isNaN(value))
16
+ return 0;
17
+ return Math.max(0, Math.round((now - value) / 60000));
18
+ }
19
+ function summarize(text) {
20
+ if (!text)
21
+ return "";
22
+ const trimmed = text.replace(/\s+/g, " ").trim();
23
+ return trimmed.length > 120 ? `${trimmed.slice(0, 117)}…` : trimmed;
24
+ }
25
+ const sameAgent = (a, b) => !!a && a.toLowerCase() === b.toLowerCase();
26
+ for (const timeline of taskMap.values()) {
27
+ // Review assignments directed to this agent that are still outstanding
28
+ for (const assignment of timeline.reviewAssignments) {
29
+ if (!sameAgent(assignment.assignedTo, agent))
30
+ continue;
31
+ const reviewed = timeline.reviewedTimestamps.some((ts) => ts >= assignment.timestamp);
32
+ if (reviewed)
33
+ continue;
34
+ items.push({
35
+ type: "review_needed",
36
+ priority: "high",
37
+ summary: `Review ${timeline.taskId}: ${summarize(timeline.createdContent ?? timeline.latestContent)}`,
38
+ context: {
39
+ task_id: timeline.taskId,
40
+ assigned_to: timeline.assignedTo,
41
+ requested_by: assignment.source ?? undefined,
42
+ },
43
+ age_minutes: minutesSince(assignment.timestamp),
44
+ });
45
+ }
46
+ // Active task assignments for this agent (no start event yet)
47
+ const latestAssignment = [...timeline.assignments]
48
+ .reverse()
49
+ .find((entry) => sameAgent(entry.assignedTo, agent));
50
+ if (latestAssignment) {
51
+ const startedAfterAssignment = timeline.startedTimestamps.some((ts) => ts >= latestAssignment.timestamp);
52
+ const completedAfterAssignment = timeline.completedTimestamps.some((ts) => ts >= latestAssignment.timestamp);
53
+ const blocked = timeline.blocked;
54
+ if (!completedAfterAssignment && !startedAfterAssignment) {
55
+ items.push({
56
+ type: "task_assigned",
57
+ priority: blocked ? "high" : "medium",
58
+ summary: `${timeline.taskId}: ${summarize(timeline.createdContent ?? timeline.latestContent)}`,
59
+ context: {
60
+ task_id: timeline.taskId,
61
+ status: timeline.status,
62
+ has_context_snapshot: timeline.contextTimestamps.length > 0,
63
+ },
64
+ age_minutes: minutesSince(latestAssignment.timestamp),
65
+ });
66
+ }
67
+ else if (!completedAfterAssignment && blocked) {
68
+ items.push({
69
+ type: "task_blocked",
70
+ priority: "high",
71
+ summary: `${timeline.taskId}: ${summarize(timeline.createdContent ?? timeline.latestContent)}`,
72
+ context: {
73
+ task_id: timeline.taskId,
74
+ status: "blocked",
75
+ },
76
+ age_minutes: minutesSince(timeline.latestTimestamp),
77
+ });
78
+ }
79
+ }
80
+ }
81
+ // 2. Questions directed to this agent
82
+ const questionsResult = await getQuestions({
83
+ directed_to: agent,
84
+ status: "open",
85
+ });
86
+ for (const q of questionsResult.questions) {
87
+ items.push({
88
+ type: "question_waiting",
89
+ priority: "medium",
90
+ summary: `Question from ${q.asked_by}: ${(q.question ?? "").slice(0, 80)}`,
91
+ context: {
92
+ thread_id: q.thread_id,
93
+ task_id: q.task_id,
94
+ asked_by: q.asked_by,
95
+ },
96
+ age_minutes: Math.round((now - new Date(q.asked_at ?? "").getTime()) / 60000),
97
+ });
98
+ }
99
+ // 3. Open proposals needing analysis
100
+ const proposalSearch = await searchEvents({
101
+ query: "proposal",
102
+ type: "proposal",
103
+ maxResults: 20,
104
+ });
105
+ for (const p of proposalSearch.results) {
106
+ const snippet = p.snippet ?? "";
107
+ if (snippet.includes(agent)) {
108
+ const rfcMatch = snippet.match(/RFC-\d+/);
109
+ if (rfcMatch) {
110
+ const analysisSearch = await searchEvents({
111
+ query: rfcMatch[0],
112
+ type: "analysis",
113
+ source: agent,
114
+ maxResults: 1,
115
+ });
116
+ if (analysisSearch.totalMatches === 0) {
117
+ items.push({
118
+ type: "rfc_needs_analysis",
119
+ priority: "medium",
120
+ summary: `RFC ${rfcMatch[0]} needs your analysis`,
121
+ context: { rfc_id: rfcMatch[0] },
122
+ age_minutes: Math.round((now - new Date(p.timestamp ?? "").getTime()) / 60000),
123
+ });
124
+ }
125
+ }
126
+ }
127
+ }
128
+ // Sort: high priority first, then oldest first
129
+ const priorityOrder = { high: 0, medium: 1, low: 2 };
130
+ items.sort((a, b) => {
131
+ const pd = priorityOrder[a.priority] - priorityOrder[b.priority];
132
+ if (pd !== 0)
133
+ return pd;
134
+ return b.age_minutes - a.age_minutes;
135
+ });
136
+ return { agent, attention: items, total: items.length };
137
+ }
138
+ //# sourceMappingURL=inbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbox.js","sourceRoot":"","sources":["../../src/domain/inbox.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ export interface OfficeStatus {
2
+ task_wall: {
3
+ created: number;
4
+ in_progress: number;
5
+ review: number;
6
+ blocked: number;
7
+ completed_today: number;
8
+ };
9
+ meeting_rooms: {
10
+ open_rfcs: Array<{
11
+ rfc_id: string;
12
+ age_hours: number;
13
+ }>;
14
+ decided_today: number;
15
+ };
16
+ desks: Record<string, {
17
+ status: string;
18
+ task?: string;
19
+ last_seen?: string;
20
+ }>;
21
+ operations: {
22
+ triggers_fired_today: number;
23
+ escalations: number;
24
+ };
25
+ library: {
26
+ new_decisions_today: number;
27
+ new_lessons_today: number;
28
+ };
29
+ }
30
+ export declare function buildStatus(): Promise<OfficeStatus>;
31
+ //# sourceMappingURL=office-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"office-status.d.ts","sourceRoot":"","sources":["../../src/domain/office-status.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE;QACT,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,aAAa,EAAE;QACb,SAAS,EAAE,KAAK,CAAC;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACxD,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7E,UAAU,EAAE;QAAE,oBAAoB,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAClE,OAAO,EAAE;QAAE,mBAAmB,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAA;KAAE,CAAC;CACrE;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,YAAY,CAAC,CAkLzD"}