@robbeverhelst/do 1.94.0 → 1.95.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 (2) hide show
  1. package/dist/do.js +233 -161
  2. package/package.json +1 -1
package/dist/do.js CHANGED
@@ -4753,8 +4753,8 @@ var connectionSyncState = pgTable("connection_sync_state", {
4753
4753
  var calendarEventLinks = pgTable("calendar_event_links", {
4754
4754
  id: text("id").primaryKey(),
4755
4755
  tenantId: text("tenant_id").notNull().references(() => tenants.id),
4756
- connectionId: text("connection_id").notNull().references(() => connections.id),
4757
- nodeId: text("node_id").notNull().references(() => nodes.id),
4756
+ connectionId: text("connection_id").notNull().references(() => connections.id, { onDelete: "cascade" }),
4757
+ nodeId: text("node_id").notNull().references(() => nodes.id, { onDelete: "cascade" }),
4758
4758
  externalCalendarId: text("external_calendar_id").notNull(),
4759
4759
  externalEventId: text("external_event_id").notNull(),
4760
4760
  etag: text("etag"),
@@ -4767,6 +4767,25 @@ var calendarEventLinks = pgTable("calendar_event_links", {
4767
4767
  unique("calendar_event_links_connection_event_uniq").on(t.connectionId, t.externalEventId),
4768
4768
  index("calendar_event_links_tenant_connection_idx").on(t.tenantId, t.connectionId)
4769
4769
  ]);
4770
+ // ../../packages/schema/src/db/media.ts
4771
+ var bytea = customType({
4772
+ dataType() {
4773
+ return "bytea";
4774
+ }
4775
+ });
4776
+ var mediaAssets = pgTable("media_assets", {
4777
+ id: text("id").primaryKey(),
4778
+ tenantId: text("tenant_id").notNull().references(() => tenants.id),
4779
+ contentHash: text("content_hash").notNull(),
4780
+ contentType: text("content_type").notNull(),
4781
+ byteSize: integer("byte_size").notNull(),
4782
+ data: bytea("data").notNull(),
4783
+ sourceUrl: text("source_url"),
4784
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow()
4785
+ }, (t) => [
4786
+ unique("media_assets_tenant_hash_uniq").on(t.tenantId, t.contentHash),
4787
+ index("media_assets_tenant_idx").on(t.tenantId)
4788
+ ]);
4770
4789
  // ../../packages/schema/src/db/api-keys.ts
4771
4790
  var apiKeys = pgTable("api_keys", {
4772
4791
  id: text("id").primaryKey(),
@@ -5037,6 +5056,26 @@ var challengeParticipants = pgTable("challenge_participants", {
5037
5056
  index("challenge_participants_tenant_idx").on(t.tenantId),
5038
5057
  index("challenge_participants_user_idx").on(t.tenantId, t.userId)
5039
5058
  ]);
5059
+ // ../../packages/schema/src/db/user-presets.ts
5060
+ var userPresets = pgTable("user_presets", {
5061
+ id: text("id").primaryKey(),
5062
+ tenantId: text("tenant_id").notNull().references(() => tenants.id, { onDelete: "cascade" }),
5063
+ authorUserId: text("author_user_id").notNull().references(() => users.id),
5064
+ entity: text("entity").notNull(),
5065
+ name: text("name").notNull(),
5066
+ description: text("description").notNull(),
5067
+ icon: text("icon").notNull(),
5068
+ color: text("color").notNull(),
5069
+ category: text("category").notNull(),
5070
+ displayKind: text("display_kind"),
5071
+ recipe: jsonb("recipe").$type().notNull(),
5072
+ visibility: text("visibility").notNull().default("private"),
5073
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
5074
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow()
5075
+ }, (t) => [
5076
+ index("user_presets_tenant_idx").on(t.tenantId),
5077
+ index("user_presets_visibility_idx").on(t.visibility)
5078
+ ]);
5040
5079
  // ../../packages/schema/src/db/gamification.ts
5041
5080
  var gamificationProfiles = pgTable("gamification_profiles", {
5042
5081
  id: text("id").primaryKey(),
@@ -21729,6 +21768,197 @@ var selfComparisonSchema = exports_external.object({
21729
21768
  weekStart: exports_external.coerce.date(),
21730
21769
  metrics: exports_external.array(selfComparisonMetricSchema)
21731
21770
  });
21771
+ // ../../packages/schema/src/presets/recipe.ts
21772
+ var presetEntitySchema = exports_external.enum([
21773
+ "habit",
21774
+ "list",
21775
+ "inventory",
21776
+ "routine",
21777
+ "area",
21778
+ "project",
21779
+ "recipe",
21780
+ "contact",
21781
+ "challenge",
21782
+ "automation"
21783
+ ]);
21784
+ var recipeNodeBase = {
21785
+ ref: exports_external.string().min(1),
21786
+ parentRef: exports_external.string().min(1).nullish()
21787
+ };
21788
+ var recipeHabitNodeSchema = exports_external.object({
21789
+ ...recipeNodeBase,
21790
+ kind: exports_external.literal("habit"),
21791
+ title: exports_external.string().min(1),
21792
+ measurementType: habitMeasurementTypeSchema,
21793
+ targetValue: exports_external.number().nonnegative().nullish(),
21794
+ targetUnit: exports_external.string().min(1).nullish(),
21795
+ period: habitPeriodSchema.optional(),
21796
+ frequencyCount: exports_external.number().int().positive().optional()
21797
+ });
21798
+ var recipeShoppingItemSchema = exports_external.object({
21799
+ title: exports_external.string().min(1),
21800
+ quantity: exports_external.number().positive().nullish(),
21801
+ unit: exports_external.string().min(1).nullish(),
21802
+ notes: exports_external.string().min(1).nullish(),
21803
+ facet: itemFacetSchema.nullish()
21804
+ });
21805
+ var recipeShoppingListNodeSchema = exports_external.object({
21806
+ ...recipeNodeBase,
21807
+ kind: exports_external.literal("shopping_list"),
21808
+ title: exports_external.string().min(1),
21809
+ notes: exports_external.string().min(1).nullish(),
21810
+ displayKind: exports_external.string().min(1).optional(),
21811
+ items: exports_external.array(recipeShoppingItemSchema).optional()
21812
+ });
21813
+ var recipeInventoryNodeSchema = exports_external.object({
21814
+ ...recipeNodeBase,
21815
+ kind: exports_external.literal("inventory_item"),
21816
+ title: exports_external.string().min(1),
21817
+ quantity: exports_external.number().min(0).optional(),
21818
+ unit: exports_external.string().min(1).nullish(),
21819
+ category: exports_external.string().min(1).nullish(),
21820
+ location: exports_external.string().min(1).nullish(),
21821
+ lowStockThreshold: exports_external.number().min(0).nullish()
21822
+ });
21823
+ var recipeRoutineStepSchema = exports_external.object({
21824
+ title: exports_external.string().min(1),
21825
+ durationMinutes: exports_external.number().int().positive().nullish(),
21826
+ notes: exports_external.string().min(1).nullish()
21827
+ });
21828
+ var recipeRoutineNodeSchema = exports_external.object({
21829
+ ...recipeNodeBase,
21830
+ kind: exports_external.literal("routine"),
21831
+ title: exports_external.string().min(1),
21832
+ routineKind: routineKindSchema.optional(),
21833
+ notes: exports_external.string().min(1).nullish(),
21834
+ steps: exports_external.array(recipeRoutineStepSchema).optional()
21835
+ });
21836
+ var recipeAreaNodeSchema = exports_external.object({
21837
+ ...recipeNodeBase,
21838
+ kind: exports_external.literal("area"),
21839
+ title: exports_external.string().min(1),
21840
+ color: areaColorSchema.optional(),
21841
+ icon: exports_external.string().min(1).nullish(),
21842
+ reviewCadence: reviewCadenceSchema.nullish()
21843
+ });
21844
+ var recipeProjectNodeSchema = exports_external.object({
21845
+ ...recipeNodeBase,
21846
+ kind: exports_external.literal("project"),
21847
+ title: exports_external.string().min(1),
21848
+ status: projectStatusSchema.optional(),
21849
+ notes: exports_external.string().min(1).nullish(),
21850
+ milestones: exports_external.array(exports_external.object({ title: exports_external.string().min(1) })).optional()
21851
+ });
21852
+ var recipeIngredientItemSchema = exports_external.object({
21853
+ name: exports_external.string().min(1),
21854
+ quantity: exports_external.number().positive().nullish(),
21855
+ unit: exports_external.string().min(1).nullish()
21856
+ });
21857
+ var recipeRecipeNodeSchema = exports_external.object({
21858
+ ...recipeNodeBase,
21859
+ kind: exports_external.literal("recipe"),
21860
+ title: exports_external.string().min(1),
21861
+ description: exports_external.string().min(1).nullish(),
21862
+ instructions: exports_external.string().min(1).nullish(),
21863
+ servings: exports_external.number().int().positive().nullish(),
21864
+ prepMinutes: exports_external.number().int().min(0).nullish(),
21865
+ cookMinutes: exports_external.number().int().min(0).nullish(),
21866
+ tags: exports_external.array(exports_external.string().min(1)).optional(),
21867
+ ingredients: exports_external.array(recipeIngredientItemSchema).optional()
21868
+ });
21869
+ var recipeContactNodeSchema = exports_external.object({
21870
+ ...recipeNodeBase,
21871
+ kind: exports_external.literal("contact"),
21872
+ title: exports_external.string().min(1),
21873
+ company: exports_external.string().min(1).nullish(),
21874
+ notes: exports_external.string().min(1).nullish(),
21875
+ tags: exports_external.array(exports_external.string().min(1)).optional()
21876
+ });
21877
+ var recipeChallengeNodeSchema = exports_external.object({
21878
+ ...recipeNodeBase,
21879
+ kind: exports_external.literal("challenge"),
21880
+ title: exports_external.string().min(1),
21881
+ description: exports_external.string().min(1).nullish(),
21882
+ metric: exports_external.string().min(1),
21883
+ target: exports_external.number().int().positive(),
21884
+ durationDays: exports_external.number().int().positive()
21885
+ });
21886
+ var recipeAutomationNodeSchema = exports_external.object({
21887
+ ...recipeNodeBase,
21888
+ kind: exports_external.literal("automation"),
21889
+ name: exports_external.string().min(1),
21890
+ enabled: exports_external.boolean().optional(),
21891
+ trigger: automationTriggerSchema,
21892
+ condition: automationConditionSchema.nullish(),
21893
+ action: automationActionSchema
21894
+ });
21895
+ var recipeNodeSchema = exports_external.discriminatedUnion("kind", [
21896
+ recipeHabitNodeSchema,
21897
+ recipeShoppingListNodeSchema,
21898
+ recipeInventoryNodeSchema,
21899
+ recipeRoutineNodeSchema,
21900
+ recipeAreaNodeSchema,
21901
+ recipeProjectNodeSchema,
21902
+ recipeRecipeNodeSchema,
21903
+ recipeContactNodeSchema,
21904
+ recipeChallengeNodeSchema,
21905
+ recipeAutomationNodeSchema
21906
+ ]);
21907
+ var presetRecipeSchema = exports_external.object({
21908
+ nodes: exports_external.array(recipeNodeSchema).min(1)
21909
+ });
21910
+ var presetSchema = exports_external.object({
21911
+ key: exports_external.string().min(1),
21912
+ entity: presetEntitySchema,
21913
+ name: exports_external.string().min(1),
21914
+ description: exports_external.string().min(1),
21915
+ icon: exports_external.string().min(1),
21916
+ color: exports_external.string().regex(/^#[0-9a-fA-F]{6}$/),
21917
+ category: exports_external.string().min(1),
21918
+ displayKind: exports_external.string().min(1).optional(),
21919
+ featured: exports_external.boolean().optional(),
21920
+ recipe: presetRecipeSchema
21921
+ });
21922
+ var presetInstallResultSchema = exports_external.object({
21923
+ key: exports_external.string().min(1),
21924
+ entity: presetEntitySchema,
21925
+ nodeIds: exports_external.array(exports_external.string()),
21926
+ nodeCount: exports_external.number().int().nonnegative()
21927
+ });
21928
+ var MS_PER_DAY = 24 * 60 * 60 * 1000;
21929
+
21930
+ // ../../packages/schema/src/contracts/user-presets.ts
21931
+ var userPresetVisibilitySchema = exports_external.enum(["private", "shared"]);
21932
+ var hexColor = exports_external.string().regex(/^#[0-9a-fA-F]{6}$/, "color must be a #rrggbb hex string");
21933
+ var userPresetSchema = createSelectSchema(userPresets, {
21934
+ entity: presetEntitySchema,
21935
+ color: hexColor,
21936
+ recipe: presetRecipeSchema,
21937
+ visibility: userPresetVisibilitySchema,
21938
+ createdAt: exports_external.coerce.date(),
21939
+ updatedAt: exports_external.coerce.date()
21940
+ });
21941
+ var sharedUserPresetSchema = userPresetSchema.omit({
21942
+ tenantId: true,
21943
+ authorUserId: true
21944
+ });
21945
+ var createUserPresetInputSchema = createInsertSchema(userPresets, {
21946
+ name: exports_external.string().min(1).max(120),
21947
+ description: exports_external.string().min(1).max(500),
21948
+ icon: exports_external.string().min(1).max(16),
21949
+ color: hexColor,
21950
+ category: exports_external.string().min(1).max(80),
21951
+ entity: presetEntitySchema,
21952
+ displayKind: exports_external.string().min(1).max(80).nullish(),
21953
+ recipe: presetRecipeSchema,
21954
+ visibility: userPresetVisibilitySchema.optional()
21955
+ }).omit({
21956
+ id: true,
21957
+ tenantId: true,
21958
+ authorUserId: true,
21959
+ createdAt: true,
21960
+ updatedAt: true
21961
+ }).strict();
21732
21962
  // ../../packages/schema/src/contracts/gamification.ts
21733
21963
  var gamificationProfileSchema = createSelectSchema(gamificationProfiles, {
21734
21964
  createdAt: exports_external.coerce.date(),
@@ -22327,164 +22557,6 @@ var TRACKING_TYPES = {
22327
22557
  }
22328
22558
  };
22329
22559
  var TRACKING_TYPE_LIST = trackingTypeValues.map((k) => TRACKING_TYPES[k]);
22330
- // ../../packages/schema/src/presets/recipe.ts
22331
- var presetEntitySchema = exports_external.enum([
22332
- "habit",
22333
- "list",
22334
- "inventory",
22335
- "routine",
22336
- "area",
22337
- "project",
22338
- "recipe",
22339
- "contact",
22340
- "challenge",
22341
- "automation"
22342
- ]);
22343
- var recipeNodeBase = {
22344
- ref: exports_external.string().min(1),
22345
- parentRef: exports_external.string().min(1).nullish()
22346
- };
22347
- var recipeHabitNodeSchema = exports_external.object({
22348
- ...recipeNodeBase,
22349
- kind: exports_external.literal("habit"),
22350
- title: exports_external.string().min(1),
22351
- measurementType: habitMeasurementTypeSchema,
22352
- targetValue: exports_external.number().nonnegative().nullish(),
22353
- targetUnit: exports_external.string().min(1).nullish(),
22354
- period: habitPeriodSchema.optional(),
22355
- frequencyCount: exports_external.number().int().positive().optional()
22356
- });
22357
- var recipeShoppingItemSchema = exports_external.object({
22358
- title: exports_external.string().min(1),
22359
- quantity: exports_external.number().positive().nullish(),
22360
- unit: exports_external.string().min(1).nullish(),
22361
- notes: exports_external.string().min(1).nullish(),
22362
- facet: itemFacetSchema.nullish()
22363
- });
22364
- var recipeShoppingListNodeSchema = exports_external.object({
22365
- ...recipeNodeBase,
22366
- kind: exports_external.literal("shopping_list"),
22367
- title: exports_external.string().min(1),
22368
- notes: exports_external.string().min(1).nullish(),
22369
- displayKind: exports_external.string().min(1).optional(),
22370
- items: exports_external.array(recipeShoppingItemSchema).optional()
22371
- });
22372
- var recipeInventoryNodeSchema = exports_external.object({
22373
- ...recipeNodeBase,
22374
- kind: exports_external.literal("inventory_item"),
22375
- title: exports_external.string().min(1),
22376
- quantity: exports_external.number().min(0).optional(),
22377
- unit: exports_external.string().min(1).nullish(),
22378
- category: exports_external.string().min(1).nullish(),
22379
- location: exports_external.string().min(1).nullish(),
22380
- lowStockThreshold: exports_external.number().min(0).nullish()
22381
- });
22382
- var recipeRoutineStepSchema = exports_external.object({
22383
- title: exports_external.string().min(1),
22384
- durationMinutes: exports_external.number().int().positive().nullish(),
22385
- notes: exports_external.string().min(1).nullish()
22386
- });
22387
- var recipeRoutineNodeSchema = exports_external.object({
22388
- ...recipeNodeBase,
22389
- kind: exports_external.literal("routine"),
22390
- title: exports_external.string().min(1),
22391
- routineKind: routineKindSchema.optional(),
22392
- notes: exports_external.string().min(1).nullish(),
22393
- steps: exports_external.array(recipeRoutineStepSchema).optional()
22394
- });
22395
- var recipeAreaNodeSchema = exports_external.object({
22396
- ...recipeNodeBase,
22397
- kind: exports_external.literal("area"),
22398
- title: exports_external.string().min(1),
22399
- color: areaColorSchema.optional(),
22400
- icon: exports_external.string().min(1).nullish(),
22401
- reviewCadence: reviewCadenceSchema.nullish()
22402
- });
22403
- var recipeProjectNodeSchema = exports_external.object({
22404
- ...recipeNodeBase,
22405
- kind: exports_external.literal("project"),
22406
- title: exports_external.string().min(1),
22407
- status: projectStatusSchema.optional(),
22408
- notes: exports_external.string().min(1).nullish(),
22409
- milestones: exports_external.array(exports_external.object({ title: exports_external.string().min(1) })).optional()
22410
- });
22411
- var recipeIngredientItemSchema = exports_external.object({
22412
- name: exports_external.string().min(1),
22413
- quantity: exports_external.number().positive().nullish(),
22414
- unit: exports_external.string().min(1).nullish()
22415
- });
22416
- var recipeRecipeNodeSchema = exports_external.object({
22417
- ...recipeNodeBase,
22418
- kind: exports_external.literal("recipe"),
22419
- title: exports_external.string().min(1),
22420
- description: exports_external.string().min(1).nullish(),
22421
- instructions: exports_external.string().min(1).nullish(),
22422
- servings: exports_external.number().int().positive().nullish(),
22423
- prepMinutes: exports_external.number().int().min(0).nullish(),
22424
- cookMinutes: exports_external.number().int().min(0).nullish(),
22425
- tags: exports_external.array(exports_external.string().min(1)).optional(),
22426
- ingredients: exports_external.array(recipeIngredientItemSchema).optional()
22427
- });
22428
- var recipeContactNodeSchema = exports_external.object({
22429
- ...recipeNodeBase,
22430
- kind: exports_external.literal("contact"),
22431
- title: exports_external.string().min(1),
22432
- company: exports_external.string().min(1).nullish(),
22433
- notes: exports_external.string().min(1).nullish(),
22434
- tags: exports_external.array(exports_external.string().min(1)).optional()
22435
- });
22436
- var recipeChallengeNodeSchema = exports_external.object({
22437
- ...recipeNodeBase,
22438
- kind: exports_external.literal("challenge"),
22439
- title: exports_external.string().min(1),
22440
- description: exports_external.string().min(1).nullish(),
22441
- metric: exports_external.string().min(1),
22442
- target: exports_external.number().int().positive(),
22443
- durationDays: exports_external.number().int().positive()
22444
- });
22445
- var recipeAutomationNodeSchema = exports_external.object({
22446
- ...recipeNodeBase,
22447
- kind: exports_external.literal("automation"),
22448
- name: exports_external.string().min(1),
22449
- enabled: exports_external.boolean().optional(),
22450
- trigger: automationTriggerSchema,
22451
- condition: automationConditionSchema.nullish(),
22452
- action: automationActionSchema
22453
- });
22454
- var recipeNodeSchema = exports_external.discriminatedUnion("kind", [
22455
- recipeHabitNodeSchema,
22456
- recipeShoppingListNodeSchema,
22457
- recipeInventoryNodeSchema,
22458
- recipeRoutineNodeSchema,
22459
- recipeAreaNodeSchema,
22460
- recipeProjectNodeSchema,
22461
- recipeRecipeNodeSchema,
22462
- recipeContactNodeSchema,
22463
- recipeChallengeNodeSchema,
22464
- recipeAutomationNodeSchema
22465
- ]);
22466
- var presetRecipeSchema = exports_external.object({
22467
- nodes: exports_external.array(recipeNodeSchema).min(1)
22468
- });
22469
- var presetSchema = exports_external.object({
22470
- key: exports_external.string().min(1),
22471
- entity: presetEntitySchema,
22472
- name: exports_external.string().min(1),
22473
- description: exports_external.string().min(1),
22474
- icon: exports_external.string().min(1),
22475
- color: exports_external.string().regex(/^#[0-9a-fA-F]{6}$/),
22476
- category: exports_external.string().min(1),
22477
- displayKind: exports_external.string().min(1).optional(),
22478
- featured: exports_external.boolean().optional(),
22479
- recipe: presetRecipeSchema
22480
- });
22481
- var presetInstallResultSchema = exports_external.object({
22482
- key: exports_external.string().min(1),
22483
- entity: presetEntitySchema,
22484
- nodeIds: exports_external.array(exports_external.string()),
22485
- nodeCount: exports_external.number().int().nonnegative()
22486
- });
22487
- var MS_PER_DAY = 24 * 60 * 60 * 1000;
22488
22560
  // ../../packages/schema/src/presets/features/areas.ts
22489
22561
  var areaBundleDefs = [
22490
22562
  {
@@ -24143,7 +24215,7 @@ function parseCapture2(input, now) {
24143
24215
 
24144
24216
  // src/meta.ts
24145
24217
  var CLI_NAME = "do";
24146
- var VERSION = "1.94.0";
24218
+ var VERSION = "1.95.0";
24147
24219
  var API_PREFIX = "/api/v1";
24148
24220
  var DEFAULT_API_URL = "http://localhost:3001";
24149
24221
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@robbeverhelst/do",
3
- "version": "1.94.0",
3
+ "version": "1.95.0",
4
4
  "private": false,
5
5
  "description": "do — the agent-drivable CLI over the public /api/v1 surface",
6
6
  "type": "module",