@crewx/sdk 0.9.0-rc.30 → 0.9.0-rc.31
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/dist/esm/index.js +59 -59
- package/dist/esm/plugins/index.js +28 -28
- package/dist/esm/repository/index.js +81 -81
- package/dist/index.js +61 -61
- package/dist/migrations/0012_blue_turbo.sql +23 -0
- package/dist/migrations/meta/0012_snapshot.json +1494 -0
- package/dist/migrations/meta/_journal.json +7 -0
- package/dist/plugins/index.js +28 -28
- package/dist/repository/index.d.ts +2 -0
- package/dist/repository/index.js +81 -81
- package/dist/repository/notification.repository.d.ts +58 -0
- package/dist/schema/index.d.ts +1 -0
- package/dist/schema/notifications.d.ts +303 -0
- package/dist/utils/id.d.ts +1 -1
- package/package.json +1 -1
- package/templates/agents/default.yaml +27 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { BaseSqliteRepository } from './base-sqlite-repository.js';
|
|
2
|
+
import { notifications, notification_reads } from '../schema/index.js';
|
|
3
|
+
export declare const DEFAULT_NOTIFICATION_CAP = 500;
|
|
4
|
+
export type NotificationRow = typeof notifications.$inferSelect;
|
|
5
|
+
export type NewNotification = typeof notifications.$inferInsert;
|
|
6
|
+
export type NotificationReadRow = typeof notification_reads.$inferSelect;
|
|
7
|
+
export type NotificationLevel = 'info' | 'warning' | 'critical';
|
|
8
|
+
export type NotificationSource = 'agent' | 'system';
|
|
9
|
+
export interface CreateNotificationInput {
|
|
10
|
+
workspaceId: string;
|
|
11
|
+
agentId?: string | null;
|
|
12
|
+
taskId?: string | null;
|
|
13
|
+
threadId?: string | null;
|
|
14
|
+
source?: NotificationSource;
|
|
15
|
+
level?: NotificationLevel;
|
|
16
|
+
title: string;
|
|
17
|
+
body?: string | null;
|
|
18
|
+
targetUserId?: string | null;
|
|
19
|
+
metadata?: string | null;
|
|
20
|
+
}
|
|
21
|
+
export interface NotificationListItem extends NotificationRow {
|
|
22
|
+
read: boolean;
|
|
23
|
+
read_at: string | null;
|
|
24
|
+
}
|
|
25
|
+
export interface ListNotificationsParams {
|
|
26
|
+
workspaceId: string;
|
|
27
|
+
userId: string;
|
|
28
|
+
limit?: number;
|
|
29
|
+
}
|
|
30
|
+
export interface UserScope {
|
|
31
|
+
workspaceId: string;
|
|
32
|
+
userId: string;
|
|
33
|
+
}
|
|
34
|
+
export interface MarkReadParams {
|
|
35
|
+
notificationId: string;
|
|
36
|
+
workspaceId: string;
|
|
37
|
+
userId: string;
|
|
38
|
+
}
|
|
39
|
+
export declare const DEFAULT_LIST_LIMIT = 50;
|
|
40
|
+
export declare class NotificationRepository extends BaseSqliteRepository {
|
|
41
|
+
private readonly dbPath?;
|
|
42
|
+
private readonly cap;
|
|
43
|
+
constructor(opts?: {
|
|
44
|
+
dbPath?: string;
|
|
45
|
+
dbRoot?: string;
|
|
46
|
+
cap?: number;
|
|
47
|
+
});
|
|
48
|
+
resolveDbPath(): string;
|
|
49
|
+
private openHandle;
|
|
50
|
+
create(input: CreateNotificationInput): {
|
|
51
|
+
id: string;
|
|
52
|
+
};
|
|
53
|
+
private enforceCap;
|
|
54
|
+
list(params: ListNotificationsParams): NotificationListItem[];
|
|
55
|
+
unreadCount(params: UserScope): number;
|
|
56
|
+
markRead(params: MarkReadParams): boolean;
|
|
57
|
+
markAllRead(params: UserScope): number;
|
|
58
|
+
}
|
package/dist/schema/index.d.ts
CHANGED
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
export declare const notifications: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
|
|
2
|
+
name: "notifications";
|
|
3
|
+
schema: undefined;
|
|
4
|
+
columns: {
|
|
5
|
+
id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
6
|
+
name: "id";
|
|
7
|
+
tableName: "notifications";
|
|
8
|
+
dataType: "string";
|
|
9
|
+
columnType: "SQLiteText";
|
|
10
|
+
data: string;
|
|
11
|
+
driverParam: string;
|
|
12
|
+
notNull: true;
|
|
13
|
+
hasDefault: false;
|
|
14
|
+
isPrimaryKey: true;
|
|
15
|
+
isAutoincrement: false;
|
|
16
|
+
hasRuntimeDefault: false;
|
|
17
|
+
enumValues: [string, ...string[]];
|
|
18
|
+
baseColumn: never;
|
|
19
|
+
identity: undefined;
|
|
20
|
+
generated: undefined;
|
|
21
|
+
}, {}, {
|
|
22
|
+
length: number | undefined;
|
|
23
|
+
}>;
|
|
24
|
+
workspace_id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
25
|
+
name: "workspace_id";
|
|
26
|
+
tableName: "notifications";
|
|
27
|
+
dataType: "string";
|
|
28
|
+
columnType: "SQLiteText";
|
|
29
|
+
data: string;
|
|
30
|
+
driverParam: string;
|
|
31
|
+
notNull: true;
|
|
32
|
+
hasDefault: false;
|
|
33
|
+
isPrimaryKey: false;
|
|
34
|
+
isAutoincrement: false;
|
|
35
|
+
hasRuntimeDefault: false;
|
|
36
|
+
enumValues: [string, ...string[]];
|
|
37
|
+
baseColumn: never;
|
|
38
|
+
identity: undefined;
|
|
39
|
+
generated: undefined;
|
|
40
|
+
}, {}, {
|
|
41
|
+
length: number | undefined;
|
|
42
|
+
}>;
|
|
43
|
+
agent_id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
44
|
+
name: "agent_id";
|
|
45
|
+
tableName: "notifications";
|
|
46
|
+
dataType: "string";
|
|
47
|
+
columnType: "SQLiteText";
|
|
48
|
+
data: string;
|
|
49
|
+
driverParam: string;
|
|
50
|
+
notNull: false;
|
|
51
|
+
hasDefault: false;
|
|
52
|
+
isPrimaryKey: false;
|
|
53
|
+
isAutoincrement: false;
|
|
54
|
+
hasRuntimeDefault: false;
|
|
55
|
+
enumValues: [string, ...string[]];
|
|
56
|
+
baseColumn: never;
|
|
57
|
+
identity: undefined;
|
|
58
|
+
generated: undefined;
|
|
59
|
+
}, {}, {
|
|
60
|
+
length: number | undefined;
|
|
61
|
+
}>;
|
|
62
|
+
task_id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
63
|
+
name: "task_id";
|
|
64
|
+
tableName: "notifications";
|
|
65
|
+
dataType: "string";
|
|
66
|
+
columnType: "SQLiteText";
|
|
67
|
+
data: string;
|
|
68
|
+
driverParam: string;
|
|
69
|
+
notNull: false;
|
|
70
|
+
hasDefault: false;
|
|
71
|
+
isPrimaryKey: false;
|
|
72
|
+
isAutoincrement: false;
|
|
73
|
+
hasRuntimeDefault: false;
|
|
74
|
+
enumValues: [string, ...string[]];
|
|
75
|
+
baseColumn: never;
|
|
76
|
+
identity: undefined;
|
|
77
|
+
generated: undefined;
|
|
78
|
+
}, {}, {
|
|
79
|
+
length: number | undefined;
|
|
80
|
+
}>;
|
|
81
|
+
thread_id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
82
|
+
name: "thread_id";
|
|
83
|
+
tableName: "notifications";
|
|
84
|
+
dataType: "string";
|
|
85
|
+
columnType: "SQLiteText";
|
|
86
|
+
data: string;
|
|
87
|
+
driverParam: string;
|
|
88
|
+
notNull: false;
|
|
89
|
+
hasDefault: false;
|
|
90
|
+
isPrimaryKey: false;
|
|
91
|
+
isAutoincrement: false;
|
|
92
|
+
hasRuntimeDefault: false;
|
|
93
|
+
enumValues: [string, ...string[]];
|
|
94
|
+
baseColumn: never;
|
|
95
|
+
identity: undefined;
|
|
96
|
+
generated: undefined;
|
|
97
|
+
}, {}, {
|
|
98
|
+
length: number | undefined;
|
|
99
|
+
}>;
|
|
100
|
+
source: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
101
|
+
name: "source";
|
|
102
|
+
tableName: "notifications";
|
|
103
|
+
dataType: "string";
|
|
104
|
+
columnType: "SQLiteText";
|
|
105
|
+
data: string;
|
|
106
|
+
driverParam: string;
|
|
107
|
+
notNull: true;
|
|
108
|
+
hasDefault: true;
|
|
109
|
+
isPrimaryKey: false;
|
|
110
|
+
isAutoincrement: false;
|
|
111
|
+
hasRuntimeDefault: false;
|
|
112
|
+
enumValues: [string, ...string[]];
|
|
113
|
+
baseColumn: never;
|
|
114
|
+
identity: undefined;
|
|
115
|
+
generated: undefined;
|
|
116
|
+
}, {}, {
|
|
117
|
+
length: number | undefined;
|
|
118
|
+
}>;
|
|
119
|
+
level: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
120
|
+
name: "level";
|
|
121
|
+
tableName: "notifications";
|
|
122
|
+
dataType: "string";
|
|
123
|
+
columnType: "SQLiteText";
|
|
124
|
+
data: string;
|
|
125
|
+
driverParam: string;
|
|
126
|
+
notNull: true;
|
|
127
|
+
hasDefault: true;
|
|
128
|
+
isPrimaryKey: false;
|
|
129
|
+
isAutoincrement: false;
|
|
130
|
+
hasRuntimeDefault: false;
|
|
131
|
+
enumValues: [string, ...string[]];
|
|
132
|
+
baseColumn: never;
|
|
133
|
+
identity: undefined;
|
|
134
|
+
generated: undefined;
|
|
135
|
+
}, {}, {
|
|
136
|
+
length: number | undefined;
|
|
137
|
+
}>;
|
|
138
|
+
title: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
139
|
+
name: "title";
|
|
140
|
+
tableName: "notifications";
|
|
141
|
+
dataType: "string";
|
|
142
|
+
columnType: "SQLiteText";
|
|
143
|
+
data: string;
|
|
144
|
+
driverParam: string;
|
|
145
|
+
notNull: true;
|
|
146
|
+
hasDefault: false;
|
|
147
|
+
isPrimaryKey: false;
|
|
148
|
+
isAutoincrement: false;
|
|
149
|
+
hasRuntimeDefault: false;
|
|
150
|
+
enumValues: [string, ...string[]];
|
|
151
|
+
baseColumn: never;
|
|
152
|
+
identity: undefined;
|
|
153
|
+
generated: undefined;
|
|
154
|
+
}, {}, {
|
|
155
|
+
length: number | undefined;
|
|
156
|
+
}>;
|
|
157
|
+
body: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
158
|
+
name: "body";
|
|
159
|
+
tableName: "notifications";
|
|
160
|
+
dataType: "string";
|
|
161
|
+
columnType: "SQLiteText";
|
|
162
|
+
data: string;
|
|
163
|
+
driverParam: string;
|
|
164
|
+
notNull: false;
|
|
165
|
+
hasDefault: false;
|
|
166
|
+
isPrimaryKey: false;
|
|
167
|
+
isAutoincrement: false;
|
|
168
|
+
hasRuntimeDefault: false;
|
|
169
|
+
enumValues: [string, ...string[]];
|
|
170
|
+
baseColumn: never;
|
|
171
|
+
identity: undefined;
|
|
172
|
+
generated: undefined;
|
|
173
|
+
}, {}, {
|
|
174
|
+
length: number | undefined;
|
|
175
|
+
}>;
|
|
176
|
+
target_user_id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
177
|
+
name: "target_user_id";
|
|
178
|
+
tableName: "notifications";
|
|
179
|
+
dataType: "string";
|
|
180
|
+
columnType: "SQLiteText";
|
|
181
|
+
data: string;
|
|
182
|
+
driverParam: string;
|
|
183
|
+
notNull: false;
|
|
184
|
+
hasDefault: false;
|
|
185
|
+
isPrimaryKey: false;
|
|
186
|
+
isAutoincrement: false;
|
|
187
|
+
hasRuntimeDefault: false;
|
|
188
|
+
enumValues: [string, ...string[]];
|
|
189
|
+
baseColumn: never;
|
|
190
|
+
identity: undefined;
|
|
191
|
+
generated: undefined;
|
|
192
|
+
}, {}, {
|
|
193
|
+
length: number | undefined;
|
|
194
|
+
}>;
|
|
195
|
+
created_at: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
196
|
+
name: "created_at";
|
|
197
|
+
tableName: "notifications";
|
|
198
|
+
dataType: "string";
|
|
199
|
+
columnType: "SQLiteText";
|
|
200
|
+
data: string;
|
|
201
|
+
driverParam: string;
|
|
202
|
+
notNull: true;
|
|
203
|
+
hasDefault: false;
|
|
204
|
+
isPrimaryKey: false;
|
|
205
|
+
isAutoincrement: false;
|
|
206
|
+
hasRuntimeDefault: false;
|
|
207
|
+
enumValues: [string, ...string[]];
|
|
208
|
+
baseColumn: never;
|
|
209
|
+
identity: undefined;
|
|
210
|
+
generated: undefined;
|
|
211
|
+
}, {}, {
|
|
212
|
+
length: number | undefined;
|
|
213
|
+
}>;
|
|
214
|
+
metadata: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
215
|
+
name: "metadata";
|
|
216
|
+
tableName: "notifications";
|
|
217
|
+
dataType: "string";
|
|
218
|
+
columnType: "SQLiteText";
|
|
219
|
+
data: string;
|
|
220
|
+
driverParam: string;
|
|
221
|
+
notNull: false;
|
|
222
|
+
hasDefault: false;
|
|
223
|
+
isPrimaryKey: false;
|
|
224
|
+
isAutoincrement: false;
|
|
225
|
+
hasRuntimeDefault: false;
|
|
226
|
+
enumValues: [string, ...string[]];
|
|
227
|
+
baseColumn: never;
|
|
228
|
+
identity: undefined;
|
|
229
|
+
generated: undefined;
|
|
230
|
+
}, {}, {
|
|
231
|
+
length: number | undefined;
|
|
232
|
+
}>;
|
|
233
|
+
};
|
|
234
|
+
dialect: "sqlite";
|
|
235
|
+
}>;
|
|
236
|
+
export declare const notification_reads: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
|
|
237
|
+
name: "notification_reads";
|
|
238
|
+
schema: undefined;
|
|
239
|
+
columns: {
|
|
240
|
+
notification_id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
241
|
+
name: "notification_id";
|
|
242
|
+
tableName: "notification_reads";
|
|
243
|
+
dataType: "string";
|
|
244
|
+
columnType: "SQLiteText";
|
|
245
|
+
data: string;
|
|
246
|
+
driverParam: string;
|
|
247
|
+
notNull: true;
|
|
248
|
+
hasDefault: false;
|
|
249
|
+
isPrimaryKey: false;
|
|
250
|
+
isAutoincrement: false;
|
|
251
|
+
hasRuntimeDefault: false;
|
|
252
|
+
enumValues: [string, ...string[]];
|
|
253
|
+
baseColumn: never;
|
|
254
|
+
identity: undefined;
|
|
255
|
+
generated: undefined;
|
|
256
|
+
}, {}, {
|
|
257
|
+
length: number | undefined;
|
|
258
|
+
}>;
|
|
259
|
+
user_id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
260
|
+
name: "user_id";
|
|
261
|
+
tableName: "notification_reads";
|
|
262
|
+
dataType: "string";
|
|
263
|
+
columnType: "SQLiteText";
|
|
264
|
+
data: string;
|
|
265
|
+
driverParam: string;
|
|
266
|
+
notNull: true;
|
|
267
|
+
hasDefault: false;
|
|
268
|
+
isPrimaryKey: false;
|
|
269
|
+
isAutoincrement: false;
|
|
270
|
+
hasRuntimeDefault: false;
|
|
271
|
+
enumValues: [string, ...string[]];
|
|
272
|
+
baseColumn: never;
|
|
273
|
+
identity: undefined;
|
|
274
|
+
generated: undefined;
|
|
275
|
+
}, {}, {
|
|
276
|
+
length: number | undefined;
|
|
277
|
+
}>;
|
|
278
|
+
read_at: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
279
|
+
name: "read_at";
|
|
280
|
+
tableName: "notification_reads";
|
|
281
|
+
dataType: "string";
|
|
282
|
+
columnType: "SQLiteText";
|
|
283
|
+
data: string;
|
|
284
|
+
driverParam: string;
|
|
285
|
+
notNull: true;
|
|
286
|
+
hasDefault: false;
|
|
287
|
+
isPrimaryKey: false;
|
|
288
|
+
isAutoincrement: false;
|
|
289
|
+
hasRuntimeDefault: false;
|
|
290
|
+
enumValues: [string, ...string[]];
|
|
291
|
+
baseColumn: never;
|
|
292
|
+
identity: undefined;
|
|
293
|
+
generated: undefined;
|
|
294
|
+
}, {}, {
|
|
295
|
+
length: number | undefined;
|
|
296
|
+
}>;
|
|
297
|
+
};
|
|
298
|
+
dialect: "sqlite";
|
|
299
|
+
}>;
|
|
300
|
+
export type Notification = typeof notifications.$inferSelect;
|
|
301
|
+
export type NewNotification = typeof notifications.$inferInsert;
|
|
302
|
+
export type NotificationRead = typeof notification_reads.$inferSelect;
|
|
303
|
+
export type NewNotificationRead = typeof notification_reads.$inferInsert;
|
package/dist/utils/id.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type EntityPrefix = 'tsk' | 'thd' | 'msg' | 'box' | 'prj' | 'mem' | 'spn' | 'cron' | 'wbs' | 'job' | 'tcl' | 'req' | 'ws' | 'wfr';
|
|
1
|
+
export type EntityPrefix = 'tsk' | 'thd' | 'msg' | 'box' | 'prj' | 'mem' | 'spn' | 'cron' | 'wbs' | 'job' | 'tcl' | 'req' | 'ws' | 'wfr' | 'ntf';
|
|
2
2
|
export type PrefixedId<P extends EntityPrefix> = `${P}_${string}`;
|
|
3
3
|
export declare function generateId<P extends EntityPrefix>(prefix: P): PrefixedId<P>;
|
|
4
4
|
export declare function generateFingerprint<P extends EntityPrefix>(prefix: P, input: string): PrefixedId<P>;
|
package/package.json
CHANGED
|
@@ -128,6 +128,26 @@ layouts:
|
|
|
128
128
|
</cli_options>
|
|
129
129
|
{{/if}}
|
|
130
130
|
</session>
|
|
131
|
+
|
|
132
|
+
<delegation_lifecycle>
|
|
133
|
+
You are running as a SINGLE-SHOT CLI process (print mode). There is no next turn:
|
|
134
|
+
- The moment you emit your final answer, this process exits and every child
|
|
135
|
+
process it spawned — including backgrounded Bash commands — is killed (SIGTERM).
|
|
136
|
+
- Harness messages like "running in the background" or "you will be notified
|
|
137
|
+
when it completes" are NOT true in this mode. That notification will never
|
|
138
|
+
arrive; trusting it silently kills the delegated work.
|
|
139
|
+
|
|
140
|
+
Rules for delegation and long-running commands:
|
|
141
|
+
- Run delegations (npx crewx q / npx crewx x) in the FOREGROUND and wait for
|
|
142
|
+
the result within the same turn. Never use run_in_background, `&`, or nohup
|
|
143
|
+
for a CrewX delegation.
|
|
144
|
+
- If the harness force-moves a long command to the background (e.g. on
|
|
145
|
+
timeout), do NOT end your turn. Keep checking completion with short
|
|
146
|
+
foreground status checks until it actually finishes.
|
|
147
|
+
- A PID, a "running" status, a partially created file, or a --thread link is
|
|
148
|
+
NOT evidence of completion. Report success only after the command has
|
|
149
|
+
exited and returned its final result.
|
|
150
|
+
</delegation_lifecycle>
|
|
131
151
|
</agent_profile>
|
|
132
152
|
{{/if}}
|
|
133
153
|
|
|
@@ -246,6 +266,13 @@ layouts:
|
|
|
246
266
|
```
|
|
247
267
|
|
|
248
268
|
→ Full usage: `{{env.CREWX_CLI}} workflow --help`
|
|
269
|
+
|
|
270
|
+
### Notify (`{{env.CREWX_CLI}} notify`)
|
|
271
|
+
Send an in-app notification to the user's CrewX dashboard. Use for signals that need the user's attention or judgment after a run (e.g. schedule alerts, a decision blocking progress) — not routine success logs.
|
|
272
|
+
|
|
273
|
+
```bash
|
|
274
|
+
{{env.CREWX_CLI}} notify "<title>" [--level=info|warning|critical] [--body="..."]
|
|
275
|
+
```
|
|
249
276
|
</builtin_tools>
|
|
250
277
|
{{/if}}
|
|
251
278
|
|