@yattalo/task-system 0.4.0 → 0.5.0

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 (57) hide show
  1. package/README.md +48 -0
  2. package/dashboard-app/assets/spa-entry-CnIKatv4.js +24 -0
  3. package/dashboard-app/assets/styles-CAIFwsCh.css +1 -0
  4. package/dashboard-app/index.html +14 -0
  5. package/dist/commands/dashboard.d.ts +2 -0
  6. package/dist/commands/dashboard.d.ts.map +1 -1
  7. package/dist/commands/dashboard.js +133 -6
  8. package/dist/commands/dashboard.js.map +1 -1
  9. package/dist/commands/init.d.ts.map +1 -1
  10. package/dist/commands/init.js +35 -1
  11. package/dist/commands/init.js.map +1 -1
  12. package/dist/generators/mgrep-setup.d.ts +6 -0
  13. package/dist/generators/mgrep-setup.d.ts.map +1 -0
  14. package/dist/generators/mgrep-setup.js +191 -0
  15. package/dist/generators/mgrep-setup.js.map +1 -0
  16. package/dist/generators/mgrep-skill.d.ts +6 -0
  17. package/dist/generators/mgrep-skill.d.ts.map +1 -0
  18. package/dist/generators/mgrep-skill.js +173 -0
  19. package/dist/generators/mgrep-skill.js.map +1 -0
  20. package/dist/generators/uca-functions.d.ts +8 -0
  21. package/dist/generators/uca-functions.d.ts.map +1 -0
  22. package/dist/generators/uca-functions.js +57 -0
  23. package/dist/generators/uca-functions.js.map +1 -0
  24. package/dist/generators/uca-reexports.d.ts +8 -0
  25. package/dist/generators/uca-reexports.d.ts.map +1 -0
  26. package/dist/generators/uca-reexports.js +112 -0
  27. package/dist/generators/uca-reexports.js.map +1 -0
  28. package/dist/generators/uca-schema.d.ts +8 -0
  29. package/dist/generators/uca-schema.d.ts.map +1 -0
  30. package/dist/generators/uca-schema.js +650 -0
  31. package/dist/generators/uca-schema.js.map +1 -0
  32. package/dist/index.js +3 -1
  33. package/dist/index.js.map +1 -1
  34. package/dist/presets/research.d.ts.map +1 -1
  35. package/dist/presets/research.js +10 -0
  36. package/dist/presets/research.js.map +1 -1
  37. package/dist/presets/software.d.ts.map +1 -1
  38. package/dist/presets/software.js +10 -0
  39. package/dist/presets/software.js.map +1 -1
  40. package/dist/utils/detect.d.ts.map +1 -1
  41. package/dist/utils/detect.js +15 -0
  42. package/dist/utils/detect.js.map +1 -1
  43. package/dist/utils/merge.d.ts.map +1 -1
  44. package/dist/utils/merge.js +2 -0
  45. package/dist/utils/merge.js.map +1 -1
  46. package/package.json +5 -3
  47. package/templates/uca/agents.ts +59 -0
  48. package/templates/uca/contextEntries.ts +125 -0
  49. package/templates/uca/cronManager.ts +255 -0
  50. package/templates/uca/cronUtils.ts +99 -0
  51. package/templates/uca/driftEvents.ts +106 -0
  52. package/templates/uca/heartbeats.ts +167 -0
  53. package/templates/uca/hooks.ts +430 -0
  54. package/templates/uca/memory.ts +326 -0
  55. package/templates/uca/sessionBridge.ts +238 -0
  56. package/templates/uca/skills.ts +284 -0
  57. package/templates/uca/ucaTasks.ts +500 -0
@@ -0,0 +1,650 @@
1
+ // ============================================================
2
+ // Generator: UCA Dashboard Schema
3
+ // Generates convex/taskSystem/ucaSchema.ts with all UCA tables
4
+ // These tables power the full SPA dashboard and are always generated
5
+ // ============================================================
6
+ import { writeFileSync } from "node:fs";
7
+ import { join } from "node:path";
8
+ import { getTableName } from "@yattalo/task-system-core";
9
+ export function generateUcaSchema(ctx) {
10
+ const { config, targetDir, dryRun } = ctx;
11
+ const tableName = getTableName(config);
12
+ // Build the tasks table definition only if the configurable table isn't already "tasks"
13
+ const tasksTable = tableName !== "tasks" ? `
14
+ // UCA tasks table (fixed name — powers dashboard SPA)
15
+ tasks: defineTable({
16
+ taskId: v.string(),
17
+ projectId: v.string(),
18
+ agent: v.string(),
19
+ title: v.string(),
20
+ description: v.string(),
21
+ status: v.union(
22
+ v.literal("backlog"),
23
+ v.literal("todo"),
24
+ v.literal("in_progress"),
25
+ v.literal("blocked"),
26
+ v.literal("review"),
27
+ v.literal("done"),
28
+ v.literal("archived"),
29
+ ),
30
+ priority: v.union(
31
+ v.literal("critical"),
32
+ v.literal("high"),
33
+ v.literal("medium"),
34
+ v.literal("low"),
35
+ ),
36
+ category: v.optional(v.string()),
37
+ phaseId: v.optional(v.string()),
38
+ tags: v.optional(v.array(v.string())),
39
+ dependencies: v.optional(v.array(v.string())),
40
+ blocks: v.optional(v.array(v.string())),
41
+ linkedJobId: v.optional(v.string()),
42
+ linkedRunId: v.optional(v.string()),
43
+ parentTaskId: v.optional(v.string()),
44
+ childTaskIds: v.optional(v.array(v.string())),
45
+ createdAt: v.optional(v.number()),
46
+ startedAt: v.optional(v.number()),
47
+ completedAt: v.optional(v.number()),
48
+ updatedAt: v.optional(v.number()),
49
+ statusHistory: v.optional(
50
+ v.array(
51
+ v.object({
52
+ status: v.string(),
53
+ timestamp: v.number(),
54
+ agent: v.optional(v.string()),
55
+ note: v.optional(v.string()),
56
+ commitHash: v.optional(v.string()),
57
+ }),
58
+ ),
59
+ ),
60
+ commits: v.optional(
61
+ v.array(
62
+ v.object({
63
+ hash: v.string(),
64
+ message: v.string(),
65
+ timestamp: v.number(),
66
+ filesChanged: v.optional(v.array(v.string())),
67
+ agent: v.optional(v.string()),
68
+ }),
69
+ ),
70
+ ),
71
+ estimatedHours: v.optional(v.number()),
72
+ actualHours: v.optional(v.number()),
73
+ blockers: v.optional(
74
+ v.array(
75
+ v.object({
76
+ reason: v.string(),
77
+ createdAt: v.number(),
78
+ resolvedAt: v.optional(v.number()),
79
+ resolvedBy: v.optional(v.string()),
80
+ }),
81
+ ),
82
+ ),
83
+ notes: v.optional(v.string()),
84
+ contextEntryIds: v.optional(v.array(v.string())),
85
+ driftEventIds: v.optional(v.array(v.string())),
86
+ })
87
+ .index("by_projectId", ["projectId"])
88
+ .index("by_status", ["status"])
89
+ .index("by_agent", ["agent"])
90
+ .index("by_phase", ["phaseId"])
91
+ .index("by_taskId", ["taskId"])
92
+ .index("by_parentTaskId", ["parentTaskId"])
93
+ .index("by_linkedJobId", ["linkedJobId"]),
94
+ ` : "";
95
+ const content = `// ============================================================
96
+ // UCA Dashboard Schema — generated by @yattalo/task-system
97
+ // These tables power the full UCA dashboard SPA
98
+ // DO NOT EDIT MANUALLY — re-run 'npx @yattalo/task-system init' to update
99
+ // ============================================================
100
+
101
+ import { defineTable } from "convex/server";
102
+ import { v } from "convex/values";
103
+
104
+ const laneType = v.union(v.literal("main"), v.literal("cron"), v.literal("subagent"));
105
+
106
+ const taskPriority = v.union(
107
+ v.literal("critical"),
108
+ v.literal("high"),
109
+ v.literal("medium"),
110
+ v.literal("low"),
111
+ );
112
+
113
+ const runStatus = v.union(
114
+ v.literal("queued"),
115
+ v.literal("running"),
116
+ v.literal("success"),
117
+ v.literal("failed"),
118
+ v.literal("cancelled"),
119
+ v.literal("timeout"),
120
+ );
121
+
122
+ export const ucaTables = {
123
+ ${tasksTable}
124
+ // ── Context Entries ──
125
+ contextEntries: defineTable({
126
+ entryId: v.string(),
127
+ projectId: v.string(),
128
+ type: v.string(),
129
+ content: v.string(),
130
+ summary: v.optional(v.string()),
131
+ tier: v.union(v.literal("draft"), v.literal("reviewed"), v.literal("curated")),
132
+ promotionHistory: v.array(
133
+ v.object({
134
+ from: v.string(),
135
+ to: v.string(),
136
+ promotedBy: v.string(),
137
+ reason: v.optional(v.string()),
138
+ timestamp: v.number(),
139
+ }),
140
+ ),
141
+ confidenceScore: v.optional(v.number()),
142
+ validatedBy: v.optional(v.array(v.string())),
143
+ taskId: v.optional(v.string()),
144
+ tags: v.array(v.string()),
145
+ createdBy: v.string(),
146
+ createdAt: v.number(),
147
+ updatedAt: v.number(),
148
+ })
149
+ .index("by_projectId", ["projectId"])
150
+ .index("by_tier", ["tier"])
151
+ .index("by_task", ["taskId"]),
152
+
153
+ // ── Drift Events ──
154
+ driftEvents: defineTable({
155
+ eventId: v.string(),
156
+ projectId: v.string(),
157
+ taskId: v.optional(v.string()),
158
+ agent: v.string(),
159
+ driftType: v.union(
160
+ v.literal("scope_creep"),
161
+ v.literal("time_overrun"),
162
+ v.literal("context_switch"),
163
+ v.literal("quality_drop"),
164
+ v.literal("assumption_introduced"),
165
+ ),
166
+ description: v.string(),
167
+ severity: v.union(v.literal("low"), v.literal("medium"), v.literal("high"), v.literal("critical")),
168
+ status: v.union(
169
+ v.literal("open"),
170
+ v.literal("acknowledged"),
171
+ v.literal("resolved"),
172
+ v.literal("dismissed"),
173
+ ),
174
+ resolvedBy: v.optional(v.string()),
175
+ resolvedAt: v.optional(v.number()),
176
+ resolution: v.optional(v.string()),
177
+ detectedAt: v.number(),
178
+ })
179
+ .index("by_projectId", ["projectId"])
180
+ .index("by_status", ["status"])
181
+ .index("by_severity", ["severity"]),
182
+
183
+ // ── Agent Registry ──
184
+ agentRegistry: defineTable({
185
+ agentId: v.string(),
186
+ projectId: v.string(),
187
+ label: v.string(),
188
+ type: v.union(v.literal("ai"), v.literal("human")),
189
+ capabilities: v.array(v.string()),
190
+ preferredCategories: v.array(v.string()),
191
+ currentStatus: v.union(v.literal("active"), v.literal("idle"), v.literal("offline")),
192
+ currentTaskIds: v.array(v.string()),
193
+ totalTasksCompleted: v.number(),
194
+ avgCompletionRate: v.number(),
195
+ driftEventsTriggered: v.number(),
196
+ color: v.string(),
197
+ icon: v.string(),
198
+ })
199
+ .index("by_projectId", ["projectId"])
200
+ .index("by_status", ["currentStatus"])
201
+ .index("by_agentId", ["agentId"]),
202
+
203
+ // ── Agent-Ops Jobs (UCA-compatible) ──
204
+ agentOpsJobs: defineTable({
205
+ jobId: v.string(),
206
+ taskId: v.optional(v.string()),
207
+ name: v.string(),
208
+ description: v.optional(v.string()),
209
+ agent: v.string(),
210
+ lane: laneType,
211
+ scheduleType: v.union(
212
+ v.literal("manual"),
213
+ v.literal("cron"),
214
+ v.literal("interval"),
215
+ v.literal("webhook"),
216
+ v.literal("event"),
217
+ ),
218
+ cronExpression: v.optional(v.string()),
219
+ intervalMinutes: v.optional(v.number()),
220
+ enabled: v.boolean(),
221
+ status: v.union(v.literal("active"), v.literal("paused")),
222
+ triggerEvent: v.optional(v.string()),
223
+ triggerFilter: v.optional(v.any()),
224
+ prompt: v.string(),
225
+ metadata: v.optional(v.any()),
226
+ lastRunAt: v.optional(v.number()),
227
+ nextRunAt: v.optional(v.number()),
228
+ totalRuns: v.number(),
229
+ successRuns: v.number(),
230
+ failureRuns: v.number(),
231
+ createdAt: v.number(),
232
+ updatedAt: v.number(),
233
+ })
234
+ .index("by_jobId", ["jobId"])
235
+ .index("by_taskId", ["taskId"])
236
+ .index("by_agent", ["agent"])
237
+ .index("by_lane", ["lane"])
238
+ .index("by_status", ["status"])
239
+ .index("by_enabled", ["enabled"])
240
+ .index("by_nextRunAt", ["nextRunAt"]),
241
+
242
+ // ── Agent-Ops Runs (UCA-compatible) ──
243
+ agentOpsRuns: defineTable({
244
+ runId: v.string(),
245
+ jobId: v.string(),
246
+ taskId: v.optional(v.string()),
247
+ agent: v.string(),
248
+ lane: laneType,
249
+ status: runStatus,
250
+ triggeredBy: v.union(
251
+ v.literal("manual"),
252
+ v.literal("schedule"),
253
+ v.literal("webhook"),
254
+ v.literal("hook"),
255
+ v.literal("a2a"),
256
+ v.literal("dispatch"),
257
+ v.literal("retry"),
258
+ ),
259
+ queuedAt: v.number(),
260
+ startedAt: v.optional(v.number()),
261
+ completedAt: v.optional(v.number()),
262
+ summary: v.optional(v.string()),
263
+ error: v.optional(v.string()),
264
+ commitHash: v.optional(v.string()),
265
+ logs: v.array(
266
+ v.object({
267
+ timestamp: v.number(),
268
+ level: v.union(v.literal("info"), v.literal("warn"), v.literal("error"), v.literal("debug")),
269
+ message: v.string(),
270
+ }),
271
+ ),
272
+ metadata: v.optional(v.any()),
273
+ })
274
+ .index("by_runId", ["runId"])
275
+ .index("by_jobId", ["jobId"])
276
+ .index("by_taskId", ["taskId"])
277
+ .index("by_status", ["status"])
278
+ .index("by_lane", ["lane"])
279
+ .index("by_agent", ["agent"])
280
+ .index("by_queuedAt", ["queuedAt"]),
281
+
282
+ // ── Cron Schedules ──
283
+ cronSchedules: defineTable({
284
+ scheduleId: v.string(),
285
+ name: v.string(),
286
+ jobId: v.optional(v.string()),
287
+ lane: laneType,
288
+ cronExpression: v.string(),
289
+ timezone: v.optional(v.string()),
290
+ enabled: v.boolean(),
291
+ lastRunAt: v.optional(v.number()),
292
+ nextRunAt: v.optional(v.number()),
293
+ createdBy: v.string(),
294
+ createdAt: v.number(),
295
+ updatedAt: v.number(),
296
+ })
297
+ .index("by_scheduleId", ["scheduleId"])
298
+ .index("by_enabled", ["enabled"])
299
+ .index("by_lane", ["lane"])
300
+ .index("by_nextRunAt", ["nextRunAt"]),
301
+
302
+ // ── Execution Queue ──
303
+ executionQueue: defineTable({
304
+ queueId: v.string(),
305
+ lane: laneType,
306
+ status: v.union(
307
+ v.literal("queued"),
308
+ v.literal("claimed"),
309
+ v.literal("running"),
310
+ v.literal("done"),
311
+ v.literal("failed"),
312
+ v.literal("cancelled"),
313
+ ),
314
+ taskId: v.optional(v.string()),
315
+ jobId: v.optional(v.string()),
316
+ runId: v.optional(v.string()),
317
+ agent: v.optional(v.string()),
318
+ payload: v.optional(v.any()),
319
+ priority: taskPriority,
320
+ attempts: v.number(),
321
+ availableAt: v.number(),
322
+ claimedAt: v.optional(v.number()),
323
+ completedAt: v.optional(v.number()),
324
+ createdAt: v.number(),
325
+ updatedAt: v.number(),
326
+ })
327
+ .index("by_queueId", ["queueId"])
328
+ .index("by_lane_status", ["lane", "status"])
329
+ .index("by_status", ["status"])
330
+ .index("by_availableAt", ["availableAt"])
331
+ .index("by_taskId", ["taskId"]),
332
+
333
+ // ── Agent Heartbeats ──
334
+ agentHeartbeats: defineTable({
335
+ agentId: v.string(),
336
+ sessionId: v.optional(v.string()),
337
+ protocol: v.literal("HEARTBEAT_OK"),
338
+ status: v.union(v.literal("green"), v.literal("yellow"), v.literal("red")),
339
+ heartbeatAt: v.number(),
340
+ lastSeenAt: v.number(),
341
+ expiresAt: v.number(),
342
+ latencyMs: v.optional(v.number()),
343
+ details: v.optional(v.string()),
344
+ updatedAt: v.number(),
345
+ })
346
+ .index("by_agentId", ["agentId"])
347
+ .index("by_status", ["status"])
348
+ .index("by_expiresAt", ["expiresAt"]),
349
+
350
+ // ── Agent Memory ──
351
+ agentMemory: defineTable({
352
+ memoryId: v.string(),
353
+ agentId: v.string(),
354
+ taskId: v.optional(v.string()),
355
+ tier: v.union(v.literal("hot"), v.literal("warm"), v.literal("cold")),
356
+ content: v.string(),
357
+ summary: v.optional(v.string()),
358
+ tokens: v.number(),
359
+ embedding: v.optional(v.array(v.number())),
360
+ tags: v.array(v.string()),
361
+ linkedContextEntryId: v.optional(v.string()),
362
+ consolidatedFrom: v.optional(v.array(v.string())),
363
+ createdAt: v.number(),
364
+ updatedAt: v.number(),
365
+ expiresAt: v.optional(v.number()),
366
+ })
367
+ .index("by_memoryId", ["memoryId"])
368
+ .index("by_agentId", ["agentId"])
369
+ .index("by_tier", ["tier"])
370
+ .index("by_taskId", ["taskId"])
371
+ .index("by_agent_tier", ["agentId", "tier"])
372
+ .index("by_updatedAt", ["updatedAt"]),
373
+
374
+ // ── Memory Consolidations ──
375
+ memoryConsolidations: defineTable({
376
+ consolidationId: v.string(),
377
+ agentId: v.string(),
378
+ sourceTier: v.union(v.literal("hot"), v.literal("warm"), v.literal("cold")),
379
+ targetTier: v.union(v.literal("hot"), v.literal("warm"), v.literal("cold")),
380
+ sourceMemoryIds: v.array(v.string()),
381
+ resultMemoryId: v.string(),
382
+ totalTokens: v.number(),
383
+ createdAt: v.number(),
384
+ })
385
+ .index("by_agentId", ["agentId"])
386
+ .index("by_createdAt", ["createdAt"]),
387
+
388
+ // ── Skill Registry ──
389
+ skillRegistry: defineTable({
390
+ skillId: v.string(),
391
+ name: v.string(),
392
+ version: v.string(),
393
+ description: v.optional(v.string()),
394
+ promptTemplate: v.string(),
395
+ tags: v.array(v.string()),
396
+ owner: v.string(),
397
+ status: v.union(v.literal("active"), v.literal("deprecated")),
398
+ createdAt: v.number(),
399
+ updatedAt: v.number(),
400
+ })
401
+ .index("by_skillId", ["skillId"])
402
+ .index("by_owner", ["owner"])
403
+ .index("by_status", ["status"]),
404
+
405
+ // ── Agent Skills ──
406
+ agentSkills: defineTable({
407
+ bindingId: v.string(),
408
+ agentId: v.string(),
409
+ skillId: v.string(),
410
+ enabled: v.boolean(),
411
+ proficiency: v.optional(v.number()),
412
+ config: v.optional(v.any()),
413
+ assignedAt: v.number(),
414
+ updatedAt: v.number(),
415
+ })
416
+ .index("by_bindingId", ["bindingId"])
417
+ .index("by_agentId", ["agentId"])
418
+ .index("by_skillId", ["skillId"])
419
+ .index("by_agent_skill", ["agentId", "skillId"]),
420
+
421
+ // ── Sub-Agent Dispatches ──
422
+ subAgentDispatches: defineTable({
423
+ dispatchId: v.string(),
424
+ parentTaskId: v.string(),
425
+ childTaskId: v.string(),
426
+ orchestratorAgent: v.string(),
427
+ workerAgent: v.string(),
428
+ requiredCapabilities: v.array(v.string()),
429
+ status: v.union(
430
+ v.literal("queued"),
431
+ v.literal("assigned"),
432
+ v.literal("running"),
433
+ v.literal("done"),
434
+ v.literal("failed"),
435
+ v.literal("cancelled"),
436
+ ),
437
+ priority: taskPriority,
438
+ reason: v.optional(v.string()),
439
+ resultSummary: v.optional(v.string()),
440
+ error: v.optional(v.string()),
441
+ createdAt: v.number(),
442
+ updatedAt: v.number(),
443
+ startedAt: v.optional(v.number()),
444
+ completedAt: v.optional(v.number()),
445
+ })
446
+ .index("by_dispatchId", ["dispatchId"])
447
+ .index("by_parentTaskId", ["parentTaskId"])
448
+ .index("by_childTaskId", ["childTaskId"])
449
+ .index("by_workerAgent", ["workerAgent"])
450
+ .index("by_status", ["status"]),
451
+
452
+ // ── Webhook Endpoints ──
453
+ webhookEndpoints: defineTable({
454
+ webhookId: v.string(),
455
+ name: v.string(),
456
+ path: v.string(),
457
+ secret: v.optional(v.string()),
458
+ enabled: v.boolean(),
459
+ eventType: v.string(),
460
+ rules: v.optional(v.any()),
461
+ targetAgent: v.optional(v.string()),
462
+ createTask: v.boolean(),
463
+ createJob: v.boolean(),
464
+ createdBy: v.string(),
465
+ lastTriggeredAt: v.optional(v.number()),
466
+ createdAt: v.number(),
467
+ updatedAt: v.number(),
468
+ })
469
+ .index("by_webhookId", ["webhookId"])
470
+ .index("by_path", ["path"])
471
+ .index("by_enabled", ["enabled"])
472
+ .index("by_eventType", ["eventType"]),
473
+
474
+ // ── Webhook Deliveries ──
475
+ webhookDeliveries: defineTable({
476
+ deliveryId: v.string(),
477
+ webhookId: v.string(),
478
+ eventId: v.optional(v.string()),
479
+ status: v.union(
480
+ v.literal("received"),
481
+ v.literal("processed"),
482
+ v.literal("rejected"),
483
+ v.literal("failed"),
484
+ ),
485
+ payload: v.optional(v.any()),
486
+ error: v.optional(v.string()),
487
+ receivedAt: v.number(),
488
+ processedAt: v.optional(v.number()),
489
+ })
490
+ .index("by_deliveryId", ["deliveryId"])
491
+ .index("by_webhookId", ["webhookId"])
492
+ .index("by_status", ["status"])
493
+ .index("by_receivedAt", ["receivedAt"]),
494
+
495
+ // ── Agent Events ──
496
+ agentEvents: defineTable({
497
+ eventId: v.string(),
498
+ eventType: v.string(),
499
+ source: v.string(),
500
+ sourceId: v.optional(v.string()),
501
+ taskId: v.optional(v.string()),
502
+ payload: v.optional(v.any()),
503
+ handled: v.boolean(),
504
+ handledAt: v.optional(v.number()),
505
+ createdAt: v.number(),
506
+ })
507
+ .index("by_eventId", ["eventId"])
508
+ .index("by_eventType", ["eventType"])
509
+ .index("by_source", ["source"])
510
+ .index("by_taskId", ["taskId"])
511
+ .index("by_handled", ["handled"])
512
+ .index("by_createdAt", ["createdAt"]),
513
+
514
+ // ── A2A Agent Cards ──
515
+ a2aAgentCards: defineTable({
516
+ cardId: v.string(),
517
+ agentId: v.string(),
518
+ name: v.string(),
519
+ description: v.optional(v.string()),
520
+ capabilities: v.array(v.string()),
521
+ skills: v.array(v.string()),
522
+ endpoint: v.optional(v.string()),
523
+ version: v.string(),
524
+ status: v.union(v.literal("active"), v.literal("inactive")),
525
+ metadata: v.optional(v.any()),
526
+ updatedAt: v.number(),
527
+ })
528
+ .index("by_cardId", ["cardId"])
529
+ .index("by_agentId", ["agentId"])
530
+ .index("by_status", ["status"]),
531
+
532
+ // ── A2A Tasks ──
533
+ a2aTasks: defineTable({
534
+ a2aTaskId: v.string(),
535
+ fromAgent: v.string(),
536
+ toAgent: v.string(),
537
+ intent: v.string(),
538
+ title: v.string(),
539
+ description: v.optional(v.string()),
540
+ input: v.optional(v.any()),
541
+ status: v.union(
542
+ v.literal("pending"),
543
+ v.literal("accepted"),
544
+ v.literal("in_progress"),
545
+ v.literal("completed"),
546
+ v.literal("failed"),
547
+ v.literal("cancelled"),
548
+ ),
549
+ linkedTaskId: v.optional(v.string()),
550
+ linkedJobId: v.optional(v.string()),
551
+ result: v.optional(v.any()),
552
+ error: v.optional(v.string()),
553
+ createdAt: v.number(),
554
+ updatedAt: v.number(),
555
+ })
556
+ .index("by_a2aTaskId", ["a2aTaskId"])
557
+ .index("by_toAgent_status", ["toAgent", "status"])
558
+ .index("by_fromAgent", ["fromAgent"])
559
+ .index("by_linkedTaskId", ["linkedTaskId"]),
560
+
561
+ // ── A2A Task Events ──
562
+ a2aTaskEvents: defineTable({
563
+ eventId: v.string(),
564
+ a2aTaskId: v.string(),
565
+ type: v.string(),
566
+ payload: v.optional(v.any()),
567
+ createdAt: v.number(),
568
+ })
569
+ .index("by_eventId", ["eventId"])
570
+ .index("by_a2aTaskId", ["a2aTaskId"])
571
+ .index("by_createdAt", ["createdAt"]),
572
+
573
+ // ── Session Bridge Messages ──
574
+ sessionBridgeMessages: defineTable({
575
+ messageId: v.string(),
576
+ fromSessionId: v.string(),
577
+ toSessionId: v.optional(v.string()),
578
+ fromAgent: v.string(),
579
+ toAgent: v.optional(v.string()),
580
+ taskId: v.optional(v.string()),
581
+ messageType: v.union(
582
+ v.literal("handoff"),
583
+ v.literal("notification"),
584
+ v.literal("request"),
585
+ v.literal("response"),
586
+ v.literal("broadcast"),
587
+ ),
588
+ content: v.string(),
589
+ summary: v.optional(v.string()),
590
+ status: v.union(
591
+ v.literal("pending"),
592
+ v.literal("delivered"),
593
+ v.literal("acknowledged"),
594
+ v.literal("expired"),
595
+ ),
596
+ createdAt: v.number(),
597
+ deliveredAt: v.optional(v.number()),
598
+ acknowledgedAt: v.optional(v.number()),
599
+ expiresAt: v.optional(v.number()),
600
+ })
601
+ .index("by_messageId", ["messageId"])
602
+ .index("by_toSession_status", ["toSessionId", "status"])
603
+ .index("by_toAgent_status", ["toAgent", "status"])
604
+ .index("by_fromSessionId", ["fromSessionId"])
605
+ .index("by_taskId", ["taskId"])
606
+ .index("by_status", ["status"])
607
+ .index("by_createdAt", ["createdAt"]),
608
+
609
+ // ── Commit Captures ──
610
+ commitCaptures: defineTable({
611
+ captureId: v.string(),
612
+ taskId: v.string(),
613
+ commitHash: v.string(),
614
+ message: v.string(),
615
+ source: v.union(
616
+ v.literal("status_done"),
617
+ v.literal("hook"),
618
+ v.literal("manual"),
619
+ v.literal("backfill"),
620
+ ),
621
+ filesChanged: v.optional(v.array(v.string())),
622
+ capturedBy: v.optional(v.string()),
623
+ capturedAt: v.number(),
624
+ })
625
+ .index("by_captureId", ["captureId"])
626
+ .index("by_taskId", ["taskId"])
627
+ .index("by_commitHash", ["commitHash"]),
628
+
629
+ // ── Pending Commit Captures ──
630
+ pendingCommitCaptures: defineTable({
631
+ requestId: v.string(),
632
+ taskId: v.string(),
633
+ status: v.union(v.literal("pending"), v.literal("resolved"), v.literal("expired")),
634
+ note: v.optional(v.string()),
635
+ requestedAt: v.number(),
636
+ resolvedAt: v.optional(v.number()),
637
+ })
638
+ .index("by_requestId", ["requestId"])
639
+ .index("by_taskId", ["taskId"])
640
+ .index("by_status", ["status"]),
641
+ };
642
+ `;
643
+ const filePath = join(targetDir, "convex", "taskSystem", "ucaSchema.ts");
644
+ const lineCount = content.split("\n").length;
645
+ if (!dryRun) {
646
+ writeFileSync(filePath, content, "utf-8");
647
+ }
648
+ return { file: "convex/taskSystem/ucaSchema.ts", lines: lineCount };
649
+ }
650
+ //# sourceMappingURL=uca-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uca-schema.js","sourceRoot":"","sources":["../../src/generators/uca-schema.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,kCAAkC;AAClC,+DAA+D;AAC/D,qEAAqE;AACrE,+DAA+D;AAE/D,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAOzD,MAAM,UAAU,iBAAiB,CAAC,GAAqB;IACrD,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IAC1C,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAEvC,wFAAwF;IACxF,MAAM,UAAU,GAAG,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiF5C,CAAC,CAAC,CAAC,EAAE,CAAC;IAEL,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BhB,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAugBX,CAAC;IAEA,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,CAAC,CAAC;IACzE,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IAE7C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,gCAAgC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AACtE,CAAC"}
package/dist/index.js CHANGED
@@ -48,9 +48,11 @@ program
48
48
  .action(kanbanCommand);
49
49
  program
50
50
  .command("dashboard")
51
- .description("Serve HTML dashboard in browser")
51
+ .description("Serve UCA dashboard in browser")
52
52
  .option("--dir <dir>", "Project directory", process.cwd())
53
53
  .option("--port <port>", "Port number", "3456")
54
+ .option("--lite", "Serve lightweight Alpine.js dashboard instead of full SPA")
55
+ .option("--url <url>", "Convex deployment URL (overrides .env.local)")
54
56
  .action(dashboardCommand);
55
57
  program
56
58
  .command("report")
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"research.d.ts","sourceRoot":"","sources":["../../src/presets/research.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAElE,eAAO,MAAM,cAAc,EAAE,gBA0D5B,CAAC"}
1
+ {"version":3,"file":"research.d.ts","sourceRoot":"","sources":["../../src/presets/research.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAElE,eAAO,MAAM,cAAc,EAAE,gBAqE5B,CAAC"}