crewly 1.5.11 → 1.5.12

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 (172) hide show
  1. package/config/constants.ts +3 -3
  2. package/config/orchestrator_tasks/prompts/orchestrator-prompt.md +73 -0
  3. package/config/roles/architect/prompt.md +9 -0
  4. package/config/roles/backend-developer/prompt.md +9 -0
  5. package/config/roles/content-strategist/prompt.md +10 -0
  6. package/config/roles/designer/prompt.md +9 -0
  7. package/config/roles/developer/prompt.md +9 -0
  8. package/config/roles/frontend-developer/prompt.md +9 -0
  9. package/config/roles/fullstack-dev/prompt.md +9 -0
  10. package/config/roles/generalist/prompt.md +9 -0
  11. package/config/roles/ops/prompt.md +9 -0
  12. package/config/roles/product-manager/prompt.md +9 -0
  13. package/config/roles/qa/prompt.md +9 -0
  14. package/config/roles/qa-engineer/prompt.md +9 -0
  15. package/config/roles/researcher/prompt.md +9 -0
  16. package/config/roles/sales/prompt.md +9 -0
  17. package/config/roles/support/prompt.md +9 -0
  18. package/config/roles/team-leader/prompt.md +11 -0
  19. package/config/roles/tpm/prompt.md +9 -0
  20. package/config/roles/ux-designer/prompt.md +9 -0
  21. package/config/skills/agent/core/block-task/execute.sh +3 -1
  22. package/config/skills/agent/core/pipe-to-sink/execute.sh +41 -0
  23. package/config/skills/agent/core/read-task/execute.sh +3 -1
  24. package/config/skills/agent/core/report-progress/execute.sh +3 -1
  25. package/config/skills/agent/screenshot-compare/SKILL.md +75 -0
  26. package/config/skills/agent/screenshot-compare/execute.sh +182 -0
  27. package/config/skills/agent/screenshot-compare/skill.json +10 -0
  28. package/config/skills/agent/xiaoyuzhoufm-transcript/SKILL.md +85 -0
  29. package/config/skills/agent/xiaoyuzhoufm-transcript/execute.sh +306 -0
  30. package/config/skills/agent/xiaoyuzhoufm-transcript/skill.json +10 -0
  31. package/config/skills/orchestrator/cancel-cron/SKILL.md +44 -0
  32. package/config/skills/orchestrator/create-cron/SKILL.md +58 -0
  33. package/config/skills/orchestrator/list-cron/SKILL.md +51 -0
  34. package/config/skills/orchestrator/update-cron/SKILL.md +52 -0
  35. package/dist/backend/backend/src/constants.d.ts +7 -4
  36. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  37. package/dist/backend/backend/src/constants.js +6 -3
  38. package/dist/backend/backend/src/constants.js.map +1 -1
  39. package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts +21 -2
  40. package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts.map +1 -1
  41. package/dist/backend/backend/src/controllers/browser/browser.controller.js +167 -29
  42. package/dist/backend/backend/src/controllers/browser/browser.controller.js.map +1 -1
  43. package/dist/backend/backend/src/controllers/browser/browser.routes.d.ts +1 -1
  44. package/dist/backend/backend/src/controllers/browser/browser.routes.d.ts.map +1 -1
  45. package/dist/backend/backend/src/controllers/browser/browser.routes.js +7 -3
  46. package/dist/backend/backend/src/controllers/browser/browser.routes.js.map +1 -1
  47. package/dist/backend/backend/src/controllers/data/data.controller.d.ts +47 -0
  48. package/dist/backend/backend/src/controllers/data/data.controller.d.ts.map +1 -0
  49. package/dist/backend/backend/src/controllers/data/data.controller.js +201 -0
  50. package/dist/backend/backend/src/controllers/data/data.controller.js.map +1 -0
  51. package/dist/backend/backend/src/controllers/data/data.routes.d.ts +18 -0
  52. package/dist/backend/backend/src/controllers/data/data.routes.d.ts.map +1 -0
  53. package/dist/backend/backend/src/controllers/data/data.routes.js +44 -0
  54. package/dist/backend/backend/src/controllers/data/data.routes.js.map +1 -0
  55. package/dist/backend/backend/src/controllers/monitoring/token-usage.controller.d.ts +3 -2
  56. package/dist/backend/backend/src/controllers/monitoring/token-usage.controller.d.ts.map +1 -1
  57. package/dist/backend/backend/src/controllers/monitoring/token-usage.controller.js +5 -3
  58. package/dist/backend/backend/src/controllers/monitoring/token-usage.controller.js.map +1 -1
  59. package/dist/backend/backend/src/controllers/system/cron-task.controller.d.ts +4 -0
  60. package/dist/backend/backend/src/controllers/system/cron-task.controller.d.ts.map +1 -1
  61. package/dist/backend/backend/src/controllers/system/cron-task.controller.js +20 -0
  62. package/dist/backend/backend/src/controllers/system/cron-task.controller.js.map +1 -1
  63. package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts.map +1 -1
  64. package/dist/backend/backend/src/controllers/task-management/task-management.controller.js +18 -0
  65. package/dist/backend/backend/src/controllers/task-management/task-management.controller.js.map +1 -1
  66. package/dist/backend/backend/src/controllers/team/team-export.controller.d.ts +32 -0
  67. package/dist/backend/backend/src/controllers/team/team-export.controller.d.ts.map +1 -0
  68. package/dist/backend/backend/src/controllers/team/team-export.controller.js +61 -0
  69. package/dist/backend/backend/src/controllers/team/team-export.controller.js.map +1 -0
  70. package/dist/backend/backend/src/controllers/team/team.routes.d.ts.map +1 -1
  71. package/dist/backend/backend/src/controllers/team/team.routes.js +7 -0
  72. package/dist/backend/backend/src/controllers/team/team.routes.js.map +1 -1
  73. package/dist/backend/backend/src/index.d.ts.map +1 -1
  74. package/dist/backend/backend/src/index.js +37 -7
  75. package/dist/backend/backend/src/index.js.map +1 -1
  76. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  77. package/dist/backend/backend/src/routes/api.routes.js +4 -1
  78. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  79. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  80. package/dist/backend/backend/src/services/agent/agent-registration.service.js +6 -2
  81. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  82. package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts.map +1 -1
  83. package/dist/backend/backend/src/services/agent/idle-detection.service.js +17 -2
  84. package/dist/backend/backend/src/services/agent/idle-detection.service.js.map +1 -1
  85. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts +1 -1
  86. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js +2 -2
  87. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
  88. package/dist/backend/backend/src/services/agent/task-planning.service.d.ts +134 -0
  89. package/dist/backend/backend/src/services/agent/task-planning.service.d.ts.map +1 -0
  90. package/dist/backend/backend/src/services/agent/task-planning.service.js +291 -0
  91. package/dist/backend/backend/src/services/agent/task-planning.service.js.map +1 -0
  92. package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.d.ts.map +1 -1
  93. package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.js +8 -0
  94. package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.js.map +1 -1
  95. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
  96. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +3 -3
  97. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  98. package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts +13 -9
  99. package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts.map +1 -1
  100. package/dist/backend/backend/src/services/browser/browser-bridge.service.js +44 -12
  101. package/dist/backend/backend/src/services/browser/browser-bridge.service.js.map +1 -1
  102. package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts +176 -0
  103. package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts.map +1 -0
  104. package/dist/backend/backend/src/services/browser/browser-proxy.service.js +441 -0
  105. package/dist/backend/backend/src/services/browser/browser-proxy.service.js.map +1 -0
  106. package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.d.ts +162 -0
  107. package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.d.ts.map +1 -0
  108. package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.js +350 -0
  109. package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.js.map +1 -0
  110. package/dist/backend/backend/src/services/cloud/cloud-initializer.d.ts +8 -0
  111. package/dist/backend/backend/src/services/cloud/cloud-initializer.d.ts.map +1 -1
  112. package/dist/backend/backend/src/services/cloud/cloud-initializer.js +27 -0
  113. package/dist/backend/backend/src/services/cloud/cloud-initializer.js.map +1 -1
  114. package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts +1 -1
  115. package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
  116. package/dist/backend/backend/src/services/cloud/cloud-sync.types.js +2 -0
  117. package/dist/backend/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
  118. package/dist/backend/backend/src/services/core/team-export.service.d.ts +103 -0
  119. package/dist/backend/backend/src/services/core/team-export.service.d.ts.map +1 -0
  120. package/dist/backend/backend/src/services/core/team-export.service.js +182 -0
  121. package/dist/backend/backend/src/services/core/team-export.service.js.map +1 -0
  122. package/dist/backend/backend/src/services/data/data-object-store.service.d.ts +160 -0
  123. package/dist/backend/backend/src/services/data/data-object-store.service.d.ts.map +1 -0
  124. package/dist/backend/backend/src/services/data/data-object-store.service.js +434 -0
  125. package/dist/backend/backend/src/services/data/data-object-store.service.js.map +1 -0
  126. package/dist/backend/backend/src/services/data/data-object.types.d.ts +190 -0
  127. package/dist/backend/backend/src/services/data/data-object.types.d.ts.map +1 -0
  128. package/dist/backend/backend/src/services/data/data-object.types.js +143 -0
  129. package/dist/backend/backend/src/services/data/data-object.types.js.map +1 -0
  130. package/dist/backend/backend/src/services/data/schema-registry.service.d.ts +108 -0
  131. package/dist/backend/backend/src/services/data/schema-registry.service.d.ts.map +1 -0
  132. package/dist/backend/backend/src/services/data/schema-registry.service.js +290 -0
  133. package/dist/backend/backend/src/services/data/schema-registry.service.js.map +1 -0
  134. package/dist/backend/backend/src/services/data/sink-registry.service.d.ts +87 -0
  135. package/dist/backend/backend/src/services/data/sink-registry.service.d.ts.map +1 -0
  136. package/dist/backend/backend/src/services/data/sink-registry.service.js +188 -0
  137. package/dist/backend/backend/src/services/data/sink-registry.service.js.map +1 -0
  138. package/dist/backend/backend/src/services/messaging/message-router.service.d.ts.map +1 -1
  139. package/dist/backend/backend/src/services/messaging/message-router.service.js +7 -0
  140. package/dist/backend/backend/src/services/messaging/message-router.service.js.map +1 -1
  141. package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts +55 -2
  142. package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
  143. package/dist/backend/backend/src/services/monitoring/token-usage.service.js +89 -5
  144. package/dist/backend/backend/src/services/monitoring/token-usage.service.js.map +1 -1
  145. package/dist/backend/backend/src/services/session/pty/pty-session-backend.js +1 -1
  146. package/dist/backend/backend/src/services/session/pty/pty-session-backend.js.map +1 -1
  147. package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts +105 -14
  148. package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts.map +1 -1
  149. package/dist/backend/backend/src/services/workflow/cron-task.service.js +400 -123
  150. package/dist/backend/backend/src/services/workflow/cron-task.service.js.map +1 -1
  151. package/dist/backend/backend/src/types/cron-task.types.d.ts +1 -1
  152. package/dist/backend/backend/src/types/data-object.types.d.ts +117 -0
  153. package/dist/backend/backend/src/types/data-object.types.d.ts.map +1 -0
  154. package/dist/backend/backend/src/types/data-object.types.js +23 -0
  155. package/dist/backend/backend/src/types/data-object.types.js.map +1 -0
  156. package/dist/backend/backend/src/types/settings.types.js +1 -1
  157. package/dist/backend/config/constants.d.ts +3 -3
  158. package/dist/backend/config/constants.js +3 -3
  159. package/dist/backend/config/constants.js.map +1 -1
  160. package/dist/cli/backend/src/constants.d.ts +7 -4
  161. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  162. package/dist/cli/backend/src/constants.js +6 -3
  163. package/dist/cli/backend/src/constants.js.map +1 -1
  164. package/dist/cli/backend/src/types/settings.types.js +1 -1
  165. package/dist/cli/config/constants.d.ts +3 -3
  166. package/dist/cli/config/constants.js +3 -3
  167. package/dist/cli/config/constants.js.map +1 -1
  168. package/frontend/dist/assets/index-371b68d4.css +33 -0
  169. package/frontend/dist/assets/{index-9af2ea40.js → index-506f70da.js} +321 -321
  170. package/frontend/dist/index.html +2 -2
  171. package/package.json +1 -1
  172. package/frontend/dist/assets/index-b19b2478.css +0 -33
@@ -0,0 +1,434 @@
1
+ /**
2
+ * DataObjectStore — file-based CRUD service for the Unified DataObject Model.
3
+ *
4
+ * Persists DataObjects as individual JSON files organised by namespace:
5
+ * - scope=agent → `{projectPath}/.crewly/agents/{owner_id}/data/{id}.json`
6
+ * - scope=project → `{projectPath}/.crewly/data/{namespace}/{id}.json`
7
+ * - scope=global → `~/.crewly/data/{namespace}/{id}.json`
8
+ *
9
+ * @see specs/crewly-data-architecture-v2.md
10
+ */
11
+ import * as fs from 'fs/promises';
12
+ import * as path from 'path';
13
+ import * as os from 'os';
14
+ import { v4 as uuidv4 } from 'uuid';
15
+ import { LoggerService } from '../core/logger.service.js';
16
+ import { atomicWriteFile, ensureDir } from '../../utils/file-io.utils.js';
17
+ import { isDataObject, } from './data-object.types.js';
18
+ /**
19
+ * File-based CRUD store for DataObjects.
20
+ *
21
+ * Uses a singleton pattern consistent with other Crewly services.
22
+ * Each DataObject is stored as a separate JSON file so that
23
+ * concurrent agents can write without lock contention.
24
+ */
25
+ export class DataObjectStore {
26
+ static instance = null;
27
+ static instanceProjectPath = null;
28
+ projectPath;
29
+ logger;
30
+ /**
31
+ * @param projectPath - Absolute path to the Crewly project root.
32
+ * Used to resolve scope-based storage directories.
33
+ */
34
+ constructor(projectPath) {
35
+ this.projectPath = projectPath;
36
+ this.logger = LoggerService.getInstance().createComponentLogger('DataObjectStore');
37
+ this.logger.info('DataObjectStore initialised', { projectPath });
38
+ }
39
+ // -----------------------------------------------------------------------
40
+ // Singleton
41
+ // -----------------------------------------------------------------------
42
+ /**
43
+ * Returns the singleton DataObjectStore instance.
44
+ *
45
+ * If `projectPath` differs from the current instance, a new one is created.
46
+ *
47
+ * @param projectPath - Absolute path to the Crewly project root
48
+ * @returns Singleton DataObjectStore
49
+ */
50
+ static getInstance(projectPath) {
51
+ if (DataObjectStore.instance &&
52
+ DataObjectStore.instanceProjectPath === projectPath) {
53
+ return DataObjectStore.instance;
54
+ }
55
+ DataObjectStore.instance = new DataObjectStore(projectPath);
56
+ DataObjectStore.instanceProjectPath = projectPath;
57
+ return DataObjectStore.instance;
58
+ }
59
+ /**
60
+ * Clears the singleton (useful for tests).
61
+ */
62
+ static clearInstance() {
63
+ DataObjectStore.instance = null;
64
+ DataObjectStore.instanceProjectPath = null;
65
+ }
66
+ // -----------------------------------------------------------------------
67
+ // CRUD
68
+ // -----------------------------------------------------------------------
69
+ /**
70
+ * Creates a new DataObject, persists it to disk, and returns it.
71
+ *
72
+ * Generates a UUID, sets timestamps, and applies sensible defaults.
73
+ *
74
+ * @param input - Fields for the new DataObject
75
+ * @returns The persisted DataObject
76
+ */
77
+ async create(input) {
78
+ const now = new Date().toISOString();
79
+ const obj = {
80
+ id: uuidv4(),
81
+ type: input.type,
82
+ scope: input.scope,
83
+ schema_id: input.schema_id,
84
+ status: input.status ?? 'new',
85
+ owner_id: input.owner_id,
86
+ namespace: input.namespace,
87
+ payload: input.payload,
88
+ metadata: {
89
+ created_at: now,
90
+ updated_at: now,
91
+ source_thread_id: input.source_thread_id,
92
+ confidence_score: input.confidence_score,
93
+ tags: input.tags ?? [],
94
+ },
95
+ sync_state: input.sync_state ?? 'local',
96
+ };
97
+ await this.persist(obj);
98
+ this.logger.info('DataObject created', { id: obj.id, type: obj.type, namespace: obj.namespace });
99
+ return obj;
100
+ }
101
+ /**
102
+ * Retrieves a DataObject by its ID.
103
+ *
104
+ * Scans all namespace directories because the caller may not know
105
+ * the namespace. For hot-path lookups, prefer `listByNamespace`.
106
+ *
107
+ * @param id - UUID of the DataObject
108
+ * @returns The DataObject, or null if not found
109
+ */
110
+ async getById(id) {
111
+ const bases = this.allBaseDirs();
112
+ for (const base of bases) {
113
+ const found = await this.findInBase(base, id);
114
+ if (found)
115
+ return found;
116
+ }
117
+ return null;
118
+ }
119
+ /**
120
+ * Lists DataObjects matching the supplied filters.
121
+ *
122
+ * @param filters - Optional field constraints
123
+ * @returns Array of matching DataObjects
124
+ */
125
+ async list(filters = {}) {
126
+ const bases = this.baseDirsForFilters(filters);
127
+ const results = [];
128
+ for (const base of bases) {
129
+ const objects = await this.readAllFromBase(base);
130
+ for (const obj of objects) {
131
+ if (this.matchesFilters(obj, filters)) {
132
+ results.push(obj);
133
+ }
134
+ }
135
+ }
136
+ return results;
137
+ }
138
+ /**
139
+ * Applies a partial update to an existing DataObject.
140
+ *
141
+ * Only the fields present in `patch` are overwritten; the rest
142
+ * are preserved. `metadata.updated_at` is always refreshed.
143
+ *
144
+ * @param id - UUID of the DataObject to update
145
+ * @param patch - Fields to overwrite
146
+ * @returns The updated DataObject
147
+ * @throws Error if the DataObject does not exist
148
+ */
149
+ async update(id, patch) {
150
+ const existing = await this.getById(id);
151
+ if (!existing) {
152
+ throw new Error(`DataObject not found: ${id}`);
153
+ }
154
+ const updated = {
155
+ ...existing,
156
+ ...patch,
157
+ id: existing.id, // id is immutable
158
+ metadata: {
159
+ ...existing.metadata,
160
+ ...(patch.metadata ?? {}),
161
+ updated_at: new Date().toISOString(),
162
+ },
163
+ };
164
+ // If namespace or scope changed, remove old file first
165
+ const oldPath = this.filePath(existing);
166
+ const newPath = this.filePath(updated);
167
+ if (oldPath !== newPath) {
168
+ await this.safeDelete(oldPath);
169
+ }
170
+ await this.persist(updated);
171
+ this.logger.info('DataObject updated', { id });
172
+ return updated;
173
+ }
174
+ /**
175
+ * Deletes a DataObject by ID.
176
+ *
177
+ * @param id - UUID of the DataObject to delete
178
+ * @returns true if the object existed and was deleted, false otherwise
179
+ */
180
+ async delete(id) {
181
+ const existing = await this.getById(id);
182
+ if (!existing)
183
+ return false;
184
+ await this.safeDelete(this.filePath(existing));
185
+ this.logger.info('DataObject deleted', { id });
186
+ return true;
187
+ }
188
+ // -----------------------------------------------------------------------
189
+ // Namespace helpers
190
+ // -----------------------------------------------------------------------
191
+ /**
192
+ * Lists all DataObjects within a given namespace.
193
+ *
194
+ * @param namespace - The namespace to scan, e.g. "marketing/steve-inputs"
195
+ * @returns Array of DataObjects in that namespace
196
+ */
197
+ async listByNamespace(namespace) {
198
+ const results = [];
199
+ // Check all possible scope roots for this namespace
200
+ const dirs = [
201
+ path.join(this.projectPath, '.crewly', 'data', namespace),
202
+ path.join(os.homedir(), '.crewly', 'data', namespace),
203
+ ];
204
+ // Also check agent-scoped dirs (agents/{owner}/data/)
205
+ const agentsBase = path.join(this.projectPath, '.crewly', 'agents');
206
+ if (await this.dirExists(agentsBase)) {
207
+ const owners = await this.safeReaddir(agentsBase);
208
+ for (const owner of owners) {
209
+ dirs.push(path.join(agentsBase, owner, 'data'));
210
+ }
211
+ }
212
+ for (const dir of dirs) {
213
+ const objects = await this.readAllFromDir(dir);
214
+ for (const obj of objects) {
215
+ if (obj.namespace === namespace) {
216
+ results.push(obj);
217
+ }
218
+ }
219
+ }
220
+ return results;
221
+ }
222
+ // -----------------------------------------------------------------------
223
+ // Storage path resolution
224
+ // -----------------------------------------------------------------------
225
+ /**
226
+ * Resolves the absolute file path for a DataObject based on its scope.
227
+ *
228
+ * @param obj - The DataObject (or partial with scope, namespace, owner_id, id)
229
+ * @returns Absolute path to the JSON file
230
+ */
231
+ filePath(obj) {
232
+ switch (obj.scope) {
233
+ case 'agent':
234
+ return path.join(this.projectPath, '.crewly', 'agents', obj.owner_id, 'data', `${obj.id}.json`);
235
+ case 'project':
236
+ return path.join(this.projectPath, '.crewly', 'data', obj.namespace, `${obj.id}.json`);
237
+ case 'global':
238
+ return path.join(os.homedir(), '.crewly', 'data', obj.namespace, `${obj.id}.json`);
239
+ default:
240
+ throw new Error(`Unknown scope: ${obj.scope}`);
241
+ }
242
+ }
243
+ // -----------------------------------------------------------------------
244
+ // Internal I/O helpers
245
+ // -----------------------------------------------------------------------
246
+ /**
247
+ * Persists a DataObject to its resolved file path using atomic writes.
248
+ */
249
+ async persist(obj) {
250
+ const fp = this.filePath(obj);
251
+ await ensureDir(path.dirname(fp));
252
+ await atomicWriteFile(fp, JSON.stringify(obj, null, 2));
253
+ }
254
+ /**
255
+ * Safely deletes a file, ignoring ENOENT errors.
256
+ */
257
+ async safeDelete(fp) {
258
+ try {
259
+ await fs.unlink(fp);
260
+ }
261
+ catch (err) {
262
+ if (err.code !== 'ENOENT')
263
+ throw err;
264
+ }
265
+ }
266
+ /**
267
+ * Lists entries in a directory, returning empty array if it doesn't exist.
268
+ */
269
+ async safeReaddir(dirPath) {
270
+ try {
271
+ return await fs.readdir(dirPath);
272
+ }
273
+ catch {
274
+ return [];
275
+ }
276
+ }
277
+ /**
278
+ * Checks if a directory exists.
279
+ */
280
+ async dirExists(dirPath) {
281
+ try {
282
+ const stat = await fs.stat(dirPath);
283
+ return stat.isDirectory();
284
+ }
285
+ catch {
286
+ return false;
287
+ }
288
+ }
289
+ /**
290
+ * Reads all DataObject JSON files from a single directory.
291
+ */
292
+ async readAllFromDir(dirPath) {
293
+ const entries = await this.safeReaddir(dirPath);
294
+ const results = [];
295
+ for (const entry of entries) {
296
+ if (!entry.endsWith('.json'))
297
+ continue;
298
+ try {
299
+ const raw = await fs.readFile(path.join(dirPath, entry), 'utf-8');
300
+ const parsed = JSON.parse(raw);
301
+ if (isDataObject(parsed)) {
302
+ results.push(parsed);
303
+ }
304
+ }
305
+ catch (err) {
306
+ this.logger.warn('Failed to read DataObject file', {
307
+ file: entry,
308
+ error: String(err),
309
+ });
310
+ }
311
+ }
312
+ return results;
313
+ }
314
+ /**
315
+ * Recursively reads all DataObject JSON files from a directory tree
316
+ * up to a configurable depth. Handles both shallow (data/{ns}/)
317
+ * and deep (agents/{owner}/data/) hierarchies.
318
+ *
319
+ * @param dir - Root directory to scan
320
+ * @param maxDepth - Maximum directory depth to descend (default 3)
321
+ */
322
+ async readAllRecursive(dir, maxDepth = 3) {
323
+ if (maxDepth < 0)
324
+ return [];
325
+ const results = [];
326
+ // Read JSON files in this directory
327
+ results.push(...await this.readAllFromDir(dir));
328
+ // Recurse into subdirectories
329
+ const entries = await this.safeReaddir(dir);
330
+ for (const entry of entries) {
331
+ const entryPath = path.join(dir, entry);
332
+ if (await this.dirExists(entryPath)) {
333
+ results.push(...await this.readAllRecursive(entryPath, maxDepth - 1));
334
+ }
335
+ }
336
+ return results;
337
+ }
338
+ /**
339
+ * Reads all DataObjects from a base directory tree.
340
+ */
341
+ async readAllFromBase(base) {
342
+ return this.readAllRecursive(base);
343
+ }
344
+ /**
345
+ * Searches for a specific ID within a base directory tree (recursive).
346
+ */
347
+ async findInBase(base, id) {
348
+ return this.findInDir(base, id, 3);
349
+ }
350
+ /**
351
+ * Recursively searches for a DataObject by ID in a directory tree.
352
+ */
353
+ async findInDir(dir, id, maxDepth) {
354
+ if (maxDepth < 0)
355
+ return null;
356
+ // Check direct file
357
+ const file = path.join(dir, `${id}.json`);
358
+ const found = await this.tryReadFile(file);
359
+ if (found)
360
+ return found;
361
+ // Recurse into subdirectories
362
+ const entries = await this.safeReaddir(dir);
363
+ for (const entry of entries) {
364
+ const entryPath = path.join(dir, entry);
365
+ if (await this.dirExists(entryPath)) {
366
+ const result = await this.findInDir(entryPath, id, maxDepth - 1);
367
+ if (result)
368
+ return result;
369
+ }
370
+ }
371
+ return null;
372
+ }
373
+ /**
374
+ * Tries to read and parse a single DataObject JSON file.
375
+ * Returns null on any failure.
376
+ */
377
+ async tryReadFile(fp) {
378
+ try {
379
+ const raw = await fs.readFile(fp, 'utf-8');
380
+ const parsed = JSON.parse(raw);
381
+ return isDataObject(parsed) ? parsed : null;
382
+ }
383
+ catch {
384
+ return null;
385
+ }
386
+ }
387
+ /**
388
+ * Returns all possible base directories to scan.
389
+ */
390
+ allBaseDirs() {
391
+ return [
392
+ path.join(this.projectPath, '.crewly', 'data'),
393
+ path.join(this.projectPath, '.crewly', 'agents'),
394
+ path.join(os.homedir(), '.crewly', 'data'),
395
+ ];
396
+ }
397
+ /**
398
+ * Narrows base directories based on scope filter, if provided.
399
+ */
400
+ baseDirsForFilters(filters) {
401
+ if (filters.scope === 'project') {
402
+ return [path.join(this.projectPath, '.crewly', 'data')];
403
+ }
404
+ if (filters.scope === 'agent') {
405
+ return [path.join(this.projectPath, '.crewly', 'agents')];
406
+ }
407
+ if (filters.scope === 'global') {
408
+ return [path.join(os.homedir(), '.crewly', 'data')];
409
+ }
410
+ return this.allBaseDirs();
411
+ }
412
+ /**
413
+ * Tests whether a DataObject matches all non-undefined filter fields.
414
+ */
415
+ matchesFilters(obj, filters) {
416
+ if (filters.type !== undefined && obj.type !== filters.type)
417
+ return false;
418
+ if (filters.scope !== undefined && obj.scope !== filters.scope)
419
+ return false;
420
+ if (filters.status !== undefined && obj.status !== filters.status)
421
+ return false;
422
+ if (filters.owner_id !== undefined && obj.owner_id !== filters.owner_id)
423
+ return false;
424
+ if (filters.namespace !== undefined && obj.namespace !== filters.namespace)
425
+ return false;
426
+ if (filters.tags !== undefined && filters.tags.length > 0) {
427
+ const hasAllTags = filters.tags.every((tag) => obj.metadata.tags.includes(tag));
428
+ if (!hasAllTags)
429
+ return false;
430
+ }
431
+ return true;
432
+ }
433
+ }
434
+ //# sourceMappingURL=data-object-store.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-object-store.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/data/data-object-store.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,EAAE,aAAa,EAAmB,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAIL,YAAY,GACb,MAAM,wBAAwB,CAAC;AAEhC;;;;;;GAMG;AACH,MAAM,OAAO,eAAe;IAClB,MAAM,CAAC,QAAQ,GAA2B,IAAI,CAAC;IAC/C,MAAM,CAAC,mBAAmB,GAAkB,IAAI,CAAC;IAEjD,WAAW,CAAS;IACpB,MAAM,CAAkB;IAEhC;;;OAGG;IACH,YAAY,WAAmB;QAC7B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,CAAC;QACnF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,0EAA0E;IAC1E,YAAY;IACZ,0EAA0E;IAE1E;;;;;;;OAOG;IACI,MAAM,CAAC,WAAW,CAAC,WAAmB;QAC3C,IACE,eAAe,CAAC,QAAQ;YACxB,eAAe,CAAC,mBAAmB,KAAK,WAAW,EACnD,CAAC;YACD,OAAO,eAAe,CAAC,QAAQ,CAAC;QAClC,CAAC;QACD,eAAe,CAAC,QAAQ,GAAG,IAAI,eAAe,CAAC,WAAW,CAAC,CAAC;QAC5D,eAAe,CAAC,mBAAmB,GAAG,WAAW,CAAC;QAClD,OAAO,eAAe,CAAC,QAAQ,CAAC;IAClC,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,aAAa;QACzB,eAAe,CAAC,QAAQ,GAAG,IAAI,CAAC;QAChC,eAAe,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAC7C,CAAC;IAED,0EAA0E;IAC1E,OAAO;IACP,0EAA0E;IAE1E;;;;;;;OAOG;IACH,KAAK,CAAC,MAAM,CAAC,KAA4B;QACvC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAErC,MAAM,GAAG,GAAe;YACtB,EAAE,EAAE,MAAM,EAAE;YACZ,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,KAAK;YAC7B,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,QAAQ,EAAE;gBACR,UAAU,EAAE,GAAG;gBACf,UAAU,EAAE,GAAG;gBACf,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;gBACxC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;gBACxC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE;aACvB;YACD,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,OAAO;SACxC,CAAC;QAEF,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;QACjG,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,OAAO,CAAC,EAAU;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAEjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC9C,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC;QAC1B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,IAAI,CAAC,UAA6B,EAAE;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAiB,EAAE,CAAC;QAEjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACjD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;gBAC1B,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC;oBACtC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACpB,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,KAA0B;QACjD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,OAAO,GAAe;YAC1B,GAAG,QAAQ;YACX,GAAG,KAAK;YACR,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,kBAAkB;YACnC,QAAQ,EAAE;gBACR,GAAG,QAAQ,CAAC,QAAQ;gBACpB,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC;gBACzB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACrC;SACF,CAAC;QAEF,uDAAuD;QACvD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;YACxB,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC;QAED,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/C,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QAE5B,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,0EAA0E;IAC1E,oBAAoB;IACpB,0EAA0E;IAE1E;;;;;OAKG;IACH,KAAK,CAAC,eAAe,CAAC,SAAiB;QACrC,MAAM,OAAO,GAAiB,EAAE,CAAC;QAEjC,oDAAoD;QACpD,MAAM,IAAI,GAAG;YACX,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC;YACzD,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC;SACtD,CAAC;QAEF,sDAAsD;QACtD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QACpE,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;YAClD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YAC/C,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;gBAC1B,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;oBAChC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACpB,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,0EAA0E;IAC1E,0BAA0B;IAC1B,0EAA0E;IAE1E;;;;;OAKG;IACK,QAAQ,CAAC,GAAgE;QAC/E,QAAQ,GAAG,CAAC,KAAK,EAAE,CAAC;YAClB,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,IAAI,CACd,IAAI,CAAC,WAAW,EAChB,SAAS,EACT,QAAQ,EACR,GAAG,CAAC,QAAQ,EACZ,MAAM,EACN,GAAG,GAAG,CAAC,EAAE,OAAO,CACjB,CAAC;YACJ,KAAK,SAAS;gBACZ,OAAO,IAAI,CAAC,IAAI,CACd,IAAI,CAAC,WAAW,EAChB,SAAS,EACT,MAAM,EACN,GAAG,CAAC,SAAS,EACb,GAAG,GAAG,CAAC,EAAE,OAAO,CACjB,CAAC;YACJ,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,IAAI,CACd,EAAE,CAAC,OAAO,EAAE,EACZ,SAAS,EACT,MAAM,EACN,GAAG,CAAC,SAAS,EACb,GAAG,GAAG,CAAC,EAAE,OAAO,CACjB,CAAC;YACJ;gBACE,MAAM,IAAI,KAAK,CAAC,kBAAmB,GAAkB,CAAC,KAAK,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,uBAAuB;IACvB,0EAA0E;IAE1E;;OAEG;IACK,KAAK,CAAC,OAAO,CAAC,GAAe;QACnC,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QAClC,MAAM,eAAe,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,UAAU,CAAC,EAAU;QACjC,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACtB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,GAAG,CAAC;QAClE,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,WAAW,CAAC,OAAe;QACvC,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,SAAS,CAAC,OAAe;QACrC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,cAAc,CAAC,OAAe;QAC1C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAChD,MAAM,OAAO,GAAiB,EAAE,CAAC;QAEjC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,SAAS;YACvC,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;gBAClE,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACxC,IAAI,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;oBACzB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE;oBACjD,IAAI,EAAE,KAAK;oBACX,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;iBACnB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;;;;OAOG;IACK,KAAK,CAAC,gBAAgB,CAAC,GAAW,EAAE,WAAmB,CAAC;QAC9D,IAAI,QAAQ,GAAG,CAAC;YAAE,OAAO,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAiB,EAAE,CAAC;QAEjC,oCAAoC;QACpC,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;QAEhD,8BAA8B;QAC9B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC5C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACxC,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;gBACpC,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,eAAe,CAAC,IAAY;QACxC,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,UAAU,CAAC,IAAY,EAAE,EAAU;QAC/C,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,SAAS,CAAC,GAAW,EAAE,EAAU,EAAE,QAAgB;QAC/D,IAAI,QAAQ,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAE9B,oBAAoB;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;QAExB,8BAA8B;QAC9B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC5C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACxC,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;gBACpC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;gBACjE,IAAI,MAAM;oBAAE,OAAO,MAAM,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,WAAW,CAAC,EAAU;QAClC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;YAC3C,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACxC,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACK,WAAW;QACjB,OAAO;YACL,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC;YAC9C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,CAAC;YAChD,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC;SAC3C,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,OAA0B;QACnD,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,OAAO,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,GAAe,EAAE,OAA0B;QAChE,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QAC1E,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,GAAG,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QAC7E,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAChF,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QACtF,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,GAAG,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS;YAAE,OAAO,KAAK,CAAC;QACzF,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1D,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;YAChF,IAAI,CAAC,UAAU;gBAAE,OAAO,KAAK,CAAC;QAChC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC"}
@@ -0,0 +1,190 @@
1
+ /**
2
+ * Data Architecture V2.2 — Unified DataObject Model (UDM)
3
+ *
4
+ * Defines the core types for the structured data fabric:
5
+ * DataObject, SchemaDefinition, SinkDefinition, and related types.
6
+ *
7
+ * @see specs/crewly-data-architecture-v2.md
8
+ */
9
+ /** The kind of data stored in a DataObject */
10
+ export type DataObjectType = 'memory' | 'knowledge' | 'sink_entry';
11
+ /** Visibility / ownership scope */
12
+ export type DataObjectScope = 'agent' | 'project' | 'global';
13
+ /** Lifecycle status of a DataObject */
14
+ export type DataObjectStatus = 'new' | 'processed' | 'archived';
15
+ /** Synchronisation state between local and cloud */
16
+ export type SyncState = 'local' | 'synced' | 'conflict';
17
+ /** Primitive types accepted by schema fields */
18
+ export type SchemaFieldType = 'string' | 'number' | 'boolean' | 'enum' | 'array' | 'datetime' | 'object';
19
+ /** How strictly payload validation is applied */
20
+ export type ValidationLevel = 'strict' | 'loose' | 'none';
21
+ /** Whether a sink stores a finite collection or an append-only log */
22
+ export type SinkType = 'collection' | 'log';
23
+ /** Serialisation format used by a sink on disk */
24
+ export type SinkFormat = 'markdown' | 'json' | 'jsonl';
25
+ /**
26
+ * Metadata attached to every DataObject.
27
+ *
28
+ * Captures provenance, confidence, and free-form tags for filtering.
29
+ */
30
+ export interface DataObjectMetadata {
31
+ /** ISO-8601 creation timestamp */
32
+ created_at: string;
33
+ /** ISO-8601 last-update timestamp */
34
+ updated_at: string;
35
+ /** Thread / conversation that produced this object (optional) */
36
+ source_thread_id?: string;
37
+ /** AI-assigned confidence in the payload accuracy (0-1, optional) */
38
+ confidence_score?: number;
39
+ /** Free-form classification tags */
40
+ tags: string[];
41
+ }
42
+ /**
43
+ * The Unified DataObject — the single polymorphic model that replaces
44
+ * separate Memory, Knowledge, and Sink-entry tables.
45
+ *
46
+ * Every persisted piece of information in Crewly V2 is a DataObject.
47
+ */
48
+ export interface DataObject {
49
+ /** UUID v4 unique identifier */
50
+ id: string;
51
+ /** Discriminator: what kind of data this is */
52
+ type: DataObjectType;
53
+ /** Ownership scope — agent, project, or global */
54
+ scope: DataObjectScope;
55
+ /** Reference to the SchemaDefinition that governs this object's payload */
56
+ schema_id: string;
57
+ /** Lifecycle status */
58
+ status: DataObjectStatus;
59
+ /** Agent ID or User ID that owns this object */
60
+ owner_id: string;
61
+ /** Hierarchical namespace, e.g. "marketing/steve-inputs" */
62
+ namespace: string;
63
+ /** The actual data — shape governed by the referenced schema */
64
+ payload: Record<string, unknown>;
65
+ /** Provenance and classification metadata */
66
+ metadata: DataObjectMetadata;
67
+ /** Local/cloud sync state */
68
+ sync_state: SyncState;
69
+ }
70
+ /**
71
+ * Describes a single field inside a SchemaDefinition.
72
+ */
73
+ export interface SchemaField {
74
+ /** Primitive type of the field */
75
+ type: SchemaFieldType;
76
+ /** Whether the field must be present in every payload (default false) */
77
+ required?: boolean;
78
+ /** Maximum character length (applies to string fields) */
79
+ max_length?: number;
80
+ /** Allowed values (applies to enum fields) */
81
+ options?: string[];
82
+ /** Element type when field type is "array" */
83
+ item_type?: string;
84
+ /** Minimum number of elements when field type is "array" */
85
+ min_items?: number;
86
+ }
87
+ /**
88
+ * Controls how strictly writes are validated against a schema.
89
+ */
90
+ export interface WritePolicy {
91
+ /** If true, payloads without a matching schema are still accepted */
92
+ allow_unstructured: boolean;
93
+ /** How strictly the schema is enforced */
94
+ validation_level: ValidationLevel;
95
+ /** Auto-archive objects older than this many days (optional) */
96
+ auto_archive_after_days?: number;
97
+ }
98
+ /**
99
+ * Defines the structure and governance rules for a category of DataObjects.
100
+ */
101
+ export interface SchemaDefinition {
102
+ /** Unique schema identifier, e.g. "schema-steve-input-v1" */
103
+ id: string;
104
+ /** Human-readable name */
105
+ name: string;
106
+ /** Semantic version string */
107
+ version: string;
108
+ /** Field definitions keyed by field name */
109
+ fields: Record<string, SchemaField>;
110
+ /** Controls validation behaviour on writes */
111
+ write_policy: WritePolicy;
112
+ }
113
+ /**
114
+ * A SinkDefinition declares where a particular category of DataObjects
115
+ * is persisted and who is responsible for writing to it.
116
+ */
117
+ export interface SinkDefinition {
118
+ /** Unique sink identifier */
119
+ id: string;
120
+ /** Human-readable name */
121
+ name: string;
122
+ /** Whether the sink is a bounded collection or an append-only log */
123
+ type: SinkType;
124
+ /** Relative file path for on-disk storage */
125
+ path: string;
126
+ /** Serialisation format */
127
+ format: SinkFormat;
128
+ /** Optional reference to a governing schema */
129
+ schema_id?: string;
130
+ /** Agent session name that has exclusive write access */
131
+ responsible_agent: string;
132
+ /** Agent session names to notify on new writes */
133
+ notify: string[];
134
+ /** Human-readable description of the sink's purpose */
135
+ description: string;
136
+ }
137
+ /**
138
+ * Input shape for creating a new DataObject.
139
+ * The store generates `id`, timestamps, and defaults.
140
+ */
141
+ export interface CreateDataObjectInput {
142
+ type: DataObjectType;
143
+ scope: DataObjectScope;
144
+ schema_id: string;
145
+ owner_id: string;
146
+ namespace: string;
147
+ payload: Record<string, unknown>;
148
+ tags?: string[];
149
+ source_thread_id?: string;
150
+ confidence_score?: number;
151
+ status?: DataObjectStatus;
152
+ sync_state?: SyncState;
153
+ }
154
+ /**
155
+ * Filters for querying DataObjects from the store.
156
+ * All fields are optional — omitted fields are not filtered on.
157
+ */
158
+ export interface DataObjectFilters {
159
+ type?: DataObjectType;
160
+ scope?: DataObjectScope;
161
+ status?: DataObjectStatus;
162
+ owner_id?: string;
163
+ namespace?: string;
164
+ tags?: string[];
165
+ }
166
+ /**
167
+ * Runtime check that a value is a valid DataObject.
168
+ *
169
+ * Validates the presence and types of all required top-level fields
170
+ * and the nested metadata structure.
171
+ *
172
+ * @param value - The value to check
173
+ * @returns true if value satisfies the DataObject interface
174
+ */
175
+ export declare function isDataObject(value: unknown): value is DataObject;
176
+ /**
177
+ * Runtime check that a value is a valid SchemaDefinition.
178
+ *
179
+ * @param value - The value to check
180
+ * @returns true if value satisfies the SchemaDefinition interface
181
+ */
182
+ export declare function isSchemaDefinition(value: unknown): value is SchemaDefinition;
183
+ /**
184
+ * Runtime check that a value is a valid SinkDefinition.
185
+ *
186
+ * @param value - The value to check
187
+ * @returns true if value satisfies the SinkDefinition interface
188
+ */
189
+ export declare function isSinkDefinition(value: unknown): value is SinkDefinition;
190
+ //# sourceMappingURL=data-object.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-object.types.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/data/data-object.types.ts"],"names":[],"mappings":"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"}