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.
- package/config/constants.ts +3 -3
- package/config/orchestrator_tasks/prompts/orchestrator-prompt.md +73 -0
- package/config/roles/architect/prompt.md +9 -0
- package/config/roles/backend-developer/prompt.md +9 -0
- package/config/roles/content-strategist/prompt.md +10 -0
- package/config/roles/designer/prompt.md +9 -0
- package/config/roles/developer/prompt.md +9 -0
- package/config/roles/frontend-developer/prompt.md +9 -0
- package/config/roles/fullstack-dev/prompt.md +9 -0
- package/config/roles/generalist/prompt.md +9 -0
- package/config/roles/ops/prompt.md +9 -0
- package/config/roles/product-manager/prompt.md +9 -0
- package/config/roles/qa/prompt.md +9 -0
- package/config/roles/qa-engineer/prompt.md +9 -0
- package/config/roles/researcher/prompt.md +9 -0
- package/config/roles/sales/prompt.md +9 -0
- package/config/roles/support/prompt.md +9 -0
- package/config/roles/team-leader/prompt.md +11 -0
- package/config/roles/tpm/prompt.md +9 -0
- package/config/roles/ux-designer/prompt.md +9 -0
- package/config/skills/agent/core/block-task/execute.sh +3 -1
- package/config/skills/agent/core/pipe-to-sink/execute.sh +41 -0
- package/config/skills/agent/core/read-task/execute.sh +3 -1
- package/config/skills/agent/core/report-progress/execute.sh +3 -1
- package/config/skills/agent/screenshot-compare/SKILL.md +75 -0
- package/config/skills/agent/screenshot-compare/execute.sh +182 -0
- package/config/skills/agent/screenshot-compare/skill.json +10 -0
- package/config/skills/agent/xiaoyuzhoufm-transcript/SKILL.md +85 -0
- package/config/skills/agent/xiaoyuzhoufm-transcript/execute.sh +306 -0
- package/config/skills/agent/xiaoyuzhoufm-transcript/skill.json +10 -0
- package/config/skills/orchestrator/cancel-cron/SKILL.md +44 -0
- package/config/skills/orchestrator/create-cron/SKILL.md +58 -0
- package/config/skills/orchestrator/list-cron/SKILL.md +51 -0
- package/config/skills/orchestrator/update-cron/SKILL.md +52 -0
- package/dist/backend/backend/src/constants.d.ts +7 -4
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +6 -3
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts +21 -2
- package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.controller.js +167 -29
- package/dist/backend/backend/src/controllers/browser/browser.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.routes.d.ts +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.routes.js +7 -3
- package/dist/backend/backend/src/controllers/browser/browser.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/data/data.controller.d.ts +47 -0
- package/dist/backend/backend/src/controllers/data/data.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/data/data.controller.js +201 -0
- package/dist/backend/backend/src/controllers/data/data.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/data/data.routes.d.ts +18 -0
- package/dist/backend/backend/src/controllers/data/data.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/data/data.routes.js +44 -0
- package/dist/backend/backend/src/controllers/data/data.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/monitoring/token-usage.controller.d.ts +3 -2
- package/dist/backend/backend/src/controllers/monitoring/token-usage.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/token-usage.controller.js +5 -3
- package/dist/backend/backend/src/controllers/monitoring/token-usage.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/system/cron-task.controller.d.ts +4 -0
- package/dist/backend/backend/src/controllers/system/cron-task.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/system/cron-task.controller.js +20 -0
- package/dist/backend/backend/src/controllers/system/cron-task.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.js +18 -0
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/team/team-export.controller.d.ts +32 -0
- package/dist/backend/backend/src/controllers/team/team-export.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/team/team-export.controller.js +61 -0
- package/dist/backend/backend/src/controllers/team/team-export.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/team/team.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.routes.js +7 -0
- package/dist/backend/backend/src/controllers/team/team.routes.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +37 -7
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +4 -1
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js +6 -2
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/idle-detection.service.js +17 -2
- package/dist/backend/backend/src/services/agent/idle-detection.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts +1 -1
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js +2 -2
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
- package/dist/backend/backend/src/services/agent/task-planning.service.d.ts +134 -0
- package/dist/backend/backend/src/services/agent/task-planning.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/task-planning.service.js +291 -0
- package/dist/backend/backend/src/services/agent/task-planning.service.js.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.js +8 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +3 -3
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts +13 -9
- package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-bridge.service.js +44 -12
- package/dist/backend/backend/src/services/browser/browser-bridge.service.js.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts +176 -0
- package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/browser/browser-proxy.service.js +441 -0
- package/dist/backend/backend/src/services/browser/browser-proxy.service.js.map +1 -0
- package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.d.ts +162 -0
- package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.js +350 -0
- package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-initializer.d.ts +8 -0
- package/dist/backend/backend/src/services/cloud/cloud-initializer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-initializer.js +27 -0
- package/dist/backend/backend/src/services/cloud/cloud-initializer.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.js +2 -0
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
- package/dist/backend/backend/src/services/core/team-export.service.d.ts +103 -0
- package/dist/backend/backend/src/services/core/team-export.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/core/team-export.service.js +182 -0
- package/dist/backend/backend/src/services/core/team-export.service.js.map +1 -0
- package/dist/backend/backend/src/services/data/data-object-store.service.d.ts +160 -0
- package/dist/backend/backend/src/services/data/data-object-store.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/data/data-object-store.service.js +434 -0
- package/dist/backend/backend/src/services/data/data-object-store.service.js.map +1 -0
- package/dist/backend/backend/src/services/data/data-object.types.d.ts +190 -0
- package/dist/backend/backend/src/services/data/data-object.types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/data/data-object.types.js +143 -0
- package/dist/backend/backend/src/services/data/data-object.types.js.map +1 -0
- package/dist/backend/backend/src/services/data/schema-registry.service.d.ts +108 -0
- package/dist/backend/backend/src/services/data/schema-registry.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/data/schema-registry.service.js +290 -0
- package/dist/backend/backend/src/services/data/schema-registry.service.js.map +1 -0
- package/dist/backend/backend/src/services/data/sink-registry.service.d.ts +87 -0
- package/dist/backend/backend/src/services/data/sink-registry.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/data/sink-registry.service.js +188 -0
- package/dist/backend/backend/src/services/data/sink-registry.service.js.map +1 -0
- package/dist/backend/backend/src/services/messaging/message-router.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/message-router.service.js +7 -0
- package/dist/backend/backend/src/services/messaging/message-router.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts +55 -2
- package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/token-usage.service.js +89 -5
- package/dist/backend/backend/src/services/monitoring/token-usage.service.js.map +1 -1
- package/dist/backend/backend/src/services/session/pty/pty-session-backend.js +1 -1
- package/dist/backend/backend/src/services/session/pty/pty-session-backend.js.map +1 -1
- package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts +105 -14
- package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/workflow/cron-task.service.js +400 -123
- package/dist/backend/backend/src/services/workflow/cron-task.service.js.map +1 -1
- package/dist/backend/backend/src/types/cron-task.types.d.ts +1 -1
- package/dist/backend/backend/src/types/data-object.types.d.ts +117 -0
- package/dist/backend/backend/src/types/data-object.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/data-object.types.js +23 -0
- package/dist/backend/backend/src/types/data-object.types.js.map +1 -0
- package/dist/backend/backend/src/types/settings.types.js +1 -1
- package/dist/backend/config/constants.d.ts +3 -3
- package/dist/backend/config/constants.js +3 -3
- package/dist/backend/config/constants.js.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +7 -4
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +6 -3
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/types/settings.types.js +1 -1
- package/dist/cli/config/constants.d.ts +3 -3
- package/dist/cli/config/constants.js +3 -3
- package/dist/cli/config/constants.js.map +1 -1
- package/frontend/dist/assets/index-371b68d4.css +33 -0
- package/frontend/dist/assets/{index-9af2ea40.js → index-506f70da.js} +321 -321
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
- 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":"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"}
|
|
@@ -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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"}
|