@wtfalch/foundry 0.76.1 → 0.77.1

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 (125) hide show
  1. package/dist/app-canary-worker.d.ts +35 -0
  2. package/dist/app-canary-worker.js +56 -0
  3. package/dist/audit/connector.d.ts +6 -2
  4. package/dist/audit/connector.js +3 -2
  5. package/dist/audit/evidence.d.ts +4 -0
  6. package/dist/audit/evidence.js +14 -2
  7. package/dist/audit/host-store.d.ts +58 -0
  8. package/dist/audit/host-store.js +147 -0
  9. package/dist/audit/host.d.ts +53 -0
  10. package/dist/audit/host.js +294 -0
  11. package/dist/audit/index.d.ts +2 -0
  12. package/dist/audit/index.js +2 -0
  13. package/dist/audit/registry.d.ts +14 -0
  14. package/dist/audit/sealer-role.d.ts +12 -0
  15. package/dist/audit/sealer-role.js +26 -2
  16. package/dist/audit/tick.d.ts +10 -2
  17. package/dist/audit/tick.js +15 -2
  18. package/dist/catalogue/copy-en.js +5 -0
  19. package/dist/catalogue/integrations.js +5 -0
  20. package/dist/entry-rules.d.ts +35 -0
  21. package/dist/entry-rules.js +35 -0
  22. package/dist/hosted-label.js +2 -1
  23. package/dist/index.d.ts +11 -3
  24. package/dist/index.js +6 -1
  25. package/dist/migrations/0072_audit_host.sql +46 -0
  26. package/dist/migrations/0074_platform_app_canary.sql +11 -0
  27. package/dist/modules/ai.js +15 -1
  28. package/dist/modules/assistants.js +3 -0
  29. package/dist/modules/email.d.ts +6 -1
  30. package/dist/modules/email.js +88 -5
  31. package/dist/modules/files.js +79 -2
  32. package/dist/modules/index.js +7 -0
  33. package/dist/modules/jobs.d.ts +5 -1
  34. package/dist/modules/jobs.js +74 -4
  35. package/dist/modules/reporting.d.ts +9 -0
  36. package/dist/modules/reporting.js +29 -0
  37. package/dist/modules/sign-in.js +20 -2
  38. package/dist/modules/types.d.ts +2 -0
  39. package/dist/modules/workspaces.js +3 -0
  40. package/dist/org.d.ts +114 -13
  41. package/dist/org.js +233 -20
  42. package/dist/plan/ai-boule-key-apply.d.ts +65 -0
  43. package/dist/plan/ai-boule-key-apply.js +169 -0
  44. package/dist/plan/ai-boule-key.d.ts +89 -0
  45. package/dist/plan/ai-boule-key.js +195 -0
  46. package/dist/plan/analytics.d.ts +8 -1
  47. package/dist/plan/analytics.js +8 -1
  48. package/dist/plan/app-canary-apply.d.ts +49 -0
  49. package/dist/plan/app-canary-apply.js +232 -0
  50. package/dist/plan/app-canary.d.ts +44 -0
  51. package/dist/plan/app-canary.js +110 -0
  52. package/dist/plan/blue-green-apply.d.ts +6 -2
  53. package/dist/plan/blue-green-apply.js +14 -3
  54. package/dist/plan/broker-entries.js +20 -5
  55. package/dist/plan/company-backups.js +2 -0
  56. package/dist/plan/diff.d.ts +22 -0
  57. package/dist/plan/diff.js +231 -18
  58. package/dist/plan/entry-files-key.d.ts +39 -3
  59. package/dist/plan/entry-files-key.js +103 -6
  60. package/dist/plan/entry-jobs-boule-key-apply.d.ts +65 -0
  61. package/dist/plan/entry-jobs-boule-key-apply.js +192 -0
  62. package/dist/plan/entry-jobs-boule-key.d.ts +59 -0
  63. package/dist/plan/entry-jobs-boule-key.js +141 -0
  64. package/dist/plan/entry-jobs.d.ts +2 -0
  65. package/dist/plan/entry-reporting-key.d.ts +36 -0
  66. package/dist/plan/entry-reporting-key.js +136 -0
  67. package/dist/plan/executor.d.ts +108 -1
  68. package/dist/plan/executor.js +669 -23
  69. package/dist/plan/files-boule-key-apply.d.ts +73 -0
  70. package/dist/plan/files-boule-key-apply.js +223 -0
  71. package/dist/plan/files-boule-key.d.ts +92 -0
  72. package/dist/plan/files-boule-key.js +175 -0
  73. package/dist/plan/hostnames.js +4 -0
  74. package/dist/plan/index.d.ts +4 -0
  75. package/dist/plan/index.js +2 -0
  76. package/dist/plan/jobs-scheduler-http.d.ts +13 -0
  77. package/dist/plan/jobs-scheduler-http.js +39 -0
  78. package/dist/plan/live.d.ts +1 -1
  79. package/dist/plan/locked-hostnames.d.ts +1 -1
  80. package/dist/plan/locked-hostnames.js +4 -1
  81. package/dist/plan/login-host.js +2 -2
  82. package/dist/plan/org-names.js +3 -0
  83. package/dist/plan/own-diff.js +3 -2
  84. package/dist/plan/own-jobs-route.d.ts +5 -2
  85. package/dist/plan/own-jobs-route.js +6 -2
  86. package/dist/plan/own-limits.d.ts +6 -0
  87. package/dist/plan/own-limits.js +1 -0
  88. package/dist/plan/plan-apply.d.ts +24 -0
  89. package/dist/plan/plan-apply.js +39 -4
  90. package/dist/plan/platform-diff.d.ts +2 -0
  91. package/dist/plan/platform-diff.js +15 -1
  92. package/dist/plan/platform-providers.d.ts +9 -0
  93. package/dist/plan/platform-providers.js +24 -0
  94. package/dist/plan/providers-readers.js +25 -1
  95. package/dist/plan/registered-app-env.d.ts +31 -0
  96. package/dist/plan/registered-app-env.js +63 -0
  97. package/dist/plan/registered-app.d.ts +121 -0
  98. package/dist/plan/registered-app.js +262 -0
  99. package/dist/plan/release-host.js +2 -1
  100. package/dist/plan/reporting-boule.d.ts +18 -0
  101. package/dist/plan/reporting-boule.js +44 -0
  102. package/dist/plan/reporting.d.ts +90 -0
  103. package/dist/plan/reporting.js +135 -0
  104. package/dist/plan/stage-env.js +1 -0
  105. package/dist/plan/stage-isolation.d.ts +3 -1
  106. package/dist/plan/stage-isolation.js +20 -2
  107. package/dist/plan/stage-services.d.ts +3 -1
  108. package/dist/plan/stage-services.js +8 -1
  109. package/dist/plan/stage-sink.d.ts +2 -2
  110. package/dist/plan/stage-sink.js +2 -2
  111. package/dist/plan/workspace-client.d.ts +1 -1
  112. package/dist/plan/workspace-client.js +2 -1
  113. package/dist/plan/workspace-sign-in.d.ts +1 -1
  114. package/dist/plan/workspace-sign-in.js +39 -7
  115. package/dist/platform.d.ts +25 -0
  116. package/dist/platform.js +20 -0
  117. package/dist/service-labels.d.ts +8 -0
  118. package/dist/service-labels.js +8 -0
  119. package/dist/slug.d.ts +1 -1
  120. package/dist/slug.js +5 -2
  121. package/dist/store/postgres.js +13 -0
  122. package/dist/store/schema.d.ts +485 -2
  123. package/dist/store/schema.js +38 -1
  124. package/dist/worker-app-config.js +2 -2
  125. package/package.json +1 -1
@@ -1486,7 +1486,7 @@ export declare const foundryAuditEvents: import("drizzle-orm/pg-core").PgTableWi
1486
1486
  tableName: "foundry_audit_events";
1487
1487
  dataType: "string";
1488
1488
  columnType: "PgText";
1489
- data: "apply" | "plan" | "destroy";
1489
+ data: "apply" | "destroy" | "plan";
1490
1490
  driverParam: string;
1491
1491
  notNull: true;
1492
1492
  hasDefault: false;
@@ -1498,7 +1498,7 @@ export declare const foundryAuditEvents: import("drizzle-orm/pg-core").PgTableWi
1498
1498
  identity: undefined;
1499
1499
  generated: undefined;
1500
1500
  }, {}, {
1501
- $type: "apply" | "plan" | "destroy";
1501
+ $type: "apply" | "destroy" | "plan";
1502
1502
  }>;
1503
1503
  actorId: import("drizzle-orm/pg-core").PgColumn<{
1504
1504
  name: "actor_id";
@@ -2500,6 +2500,57 @@ export declare const foundryDeclaredPlatform: import("drizzle-orm/pg-core").PgTa
2500
2500
  identity: undefined;
2501
2501
  generated: undefined;
2502
2502
  }, {}, {}>;
2503
+ appCanaryEnabled: import("drizzle-orm/pg-core").PgColumn<{
2504
+ name: "app_canary_enabled";
2505
+ tableName: "foundry_declared_platform";
2506
+ dataType: "boolean";
2507
+ columnType: "PgBoolean";
2508
+ data: boolean;
2509
+ driverParam: boolean;
2510
+ notNull: true;
2511
+ hasDefault: true;
2512
+ isPrimaryKey: false;
2513
+ isAutoincrement: false;
2514
+ hasRuntimeDefault: false;
2515
+ enumValues: undefined;
2516
+ baseColumn: never;
2517
+ identity: undefined;
2518
+ generated: undefined;
2519
+ }, {}, {}>;
2520
+ appCanaryTag: import("drizzle-orm/pg-core").PgColumn<{
2521
+ name: "app_canary_tag";
2522
+ tableName: "foundry_declared_platform";
2523
+ dataType: "string";
2524
+ columnType: "PgText";
2525
+ data: string;
2526
+ driverParam: string;
2527
+ notNull: true;
2528
+ hasDefault: true;
2529
+ isPrimaryKey: false;
2530
+ isAutoincrement: false;
2531
+ hasRuntimeDefault: false;
2532
+ enumValues: [string, ...string[]];
2533
+ baseColumn: never;
2534
+ identity: undefined;
2535
+ generated: undefined;
2536
+ }, {}, {}>;
2537
+ appCanarySha256: import("drizzle-orm/pg-core").PgColumn<{
2538
+ name: "app_canary_sha256";
2539
+ tableName: "foundry_declared_platform";
2540
+ dataType: "string";
2541
+ columnType: "PgText";
2542
+ data: string;
2543
+ driverParam: string;
2544
+ notNull: true;
2545
+ hasDefault: true;
2546
+ isPrimaryKey: false;
2547
+ isAutoincrement: false;
2548
+ hasRuntimeDefault: false;
2549
+ enumValues: [string, ...string[]];
2550
+ baseColumn: never;
2551
+ identity: undefined;
2552
+ generated: undefined;
2553
+ }, {}, {}>;
2503
2554
  heartbeatsProvider: import("drizzle-orm/pg-core").PgColumn<{
2504
2555
  name: "heartbeats_provider";
2505
2556
  tableName: "foundry_declared_platform";
@@ -3066,3 +3117,435 @@ export type RequestedChangeRow = typeof foundryRequestedChanges.$inferSelect;
3066
3117
  export type NewRequestedChangeRow = typeof foundryRequestedChanges.$inferInsert;
3067
3118
  export type AppliedVersionRow = typeof foundryAppliedVersions.$inferSelect;
3068
3119
  export type NewAppliedVersionRow = typeof foundryAppliedVersions.$inferInsert;
3120
+ /** Mirrors `migrations/0072_audit_host.sql`: a company's audit host key, as its sha256 only. */
3121
+ export declare const foundryAuditHostKeys: import("drizzle-orm/pg-core").PgTableWithColumns<{
3122
+ name: "foundry_audit_host_keys";
3123
+ schema: undefined;
3124
+ columns: {
3125
+ orgId: import("drizzle-orm/pg-core").PgColumn<{
3126
+ name: "org_id";
3127
+ tableName: "foundry_audit_host_keys";
3128
+ dataType: "string";
3129
+ columnType: "PgText";
3130
+ data: string;
3131
+ driverParam: string;
3132
+ notNull: true;
3133
+ hasDefault: false;
3134
+ isPrimaryKey: true;
3135
+ isAutoincrement: false;
3136
+ hasRuntimeDefault: false;
3137
+ enumValues: [string, ...string[]];
3138
+ baseColumn: never;
3139
+ identity: undefined;
3140
+ generated: undefined;
3141
+ }, {}, {}>;
3142
+ keySha256: import("drizzle-orm/pg-core").PgColumn<{
3143
+ name: "key_sha256";
3144
+ tableName: "foundry_audit_host_keys";
3145
+ dataType: "string";
3146
+ columnType: "PgText";
3147
+ data: string;
3148
+ driverParam: string;
3149
+ notNull: true;
3150
+ hasDefault: false;
3151
+ isPrimaryKey: false;
3152
+ isAutoincrement: false;
3153
+ hasRuntimeDefault: false;
3154
+ enumValues: [string, ...string[]];
3155
+ baseColumn: never;
3156
+ identity: undefined;
3157
+ generated: undefined;
3158
+ }, {}, {}>;
3159
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
3160
+ name: "created_at";
3161
+ tableName: "foundry_audit_host_keys";
3162
+ dataType: "date";
3163
+ columnType: "PgTimestamp";
3164
+ data: Date;
3165
+ driverParam: string;
3166
+ notNull: true;
3167
+ hasDefault: true;
3168
+ isPrimaryKey: false;
3169
+ isAutoincrement: false;
3170
+ hasRuntimeDefault: false;
3171
+ enumValues: undefined;
3172
+ baseColumn: never;
3173
+ identity: undefined;
3174
+ generated: undefined;
3175
+ }, {}, {}>;
3176
+ };
3177
+ dialect: "pg";
3178
+ }>;
3179
+ /** Mirrors `migrations/0072_audit_host.sql`: a ledger a company's Boule registered; the password is held, not here. */
3180
+ export declare const foundryAuditLedgerRegistrations: import("drizzle-orm/pg-core").PgTableWithColumns<{
3181
+ name: "foundry_audit_ledger_registrations";
3182
+ schema: undefined;
3183
+ columns: {
3184
+ orgId: import("drizzle-orm/pg-core").PgColumn<{
3185
+ name: "org_id";
3186
+ tableName: "foundry_audit_ledger_registrations";
3187
+ dataType: "string";
3188
+ columnType: "PgText";
3189
+ data: string;
3190
+ driverParam: string;
3191
+ notNull: true;
3192
+ hasDefault: false;
3193
+ isPrimaryKey: false;
3194
+ isAutoincrement: false;
3195
+ hasRuntimeDefault: false;
3196
+ enumValues: [string, ...string[]];
3197
+ baseColumn: never;
3198
+ identity: undefined;
3199
+ generated: undefined;
3200
+ }, {}, {}>;
3201
+ entryKey: import("drizzle-orm/pg-core").PgColumn<{
3202
+ name: "entry_key";
3203
+ tableName: "foundry_audit_ledger_registrations";
3204
+ dataType: "string";
3205
+ columnType: "PgText";
3206
+ data: string;
3207
+ driverParam: string;
3208
+ notNull: true;
3209
+ hasDefault: false;
3210
+ isPrimaryKey: false;
3211
+ isAutoincrement: false;
3212
+ hasRuntimeDefault: false;
3213
+ enumValues: [string, ...string[]];
3214
+ baseColumn: never;
3215
+ identity: undefined;
3216
+ generated: undefined;
3217
+ }, {}, {}>;
3218
+ copy: import("drizzle-orm/pg-core").PgColumn<{
3219
+ name: "copy";
3220
+ tableName: "foundry_audit_ledger_registrations";
3221
+ dataType: "string";
3222
+ columnType: "PgText";
3223
+ data: string;
3224
+ driverParam: string;
3225
+ notNull: true;
3226
+ hasDefault: false;
3227
+ isPrimaryKey: false;
3228
+ isAutoincrement: false;
3229
+ hasRuntimeDefault: false;
3230
+ enumValues: [string, ...string[]];
3231
+ baseColumn: never;
3232
+ identity: undefined;
3233
+ generated: undefined;
3234
+ }, {}, {}>;
3235
+ dbHost: import("drizzle-orm/pg-core").PgColumn<{
3236
+ name: "db_host";
3237
+ tableName: "foundry_audit_ledger_registrations";
3238
+ dataType: "string";
3239
+ columnType: "PgText";
3240
+ data: string;
3241
+ driverParam: string;
3242
+ notNull: true;
3243
+ hasDefault: false;
3244
+ isPrimaryKey: false;
3245
+ isAutoincrement: false;
3246
+ hasRuntimeDefault: false;
3247
+ enumValues: [string, ...string[]];
3248
+ baseColumn: never;
3249
+ identity: undefined;
3250
+ generated: undefined;
3251
+ }, {}, {}>;
3252
+ dbPort: import("drizzle-orm/pg-core").PgColumn<{
3253
+ name: "db_port";
3254
+ tableName: "foundry_audit_ledger_registrations";
3255
+ dataType: "number";
3256
+ columnType: "PgInteger";
3257
+ data: number;
3258
+ driverParam: string | number;
3259
+ notNull: true;
3260
+ hasDefault: false;
3261
+ isPrimaryKey: false;
3262
+ isAutoincrement: false;
3263
+ hasRuntimeDefault: false;
3264
+ enumValues: undefined;
3265
+ baseColumn: never;
3266
+ identity: undefined;
3267
+ generated: undefined;
3268
+ }, {}, {}>;
3269
+ dbName: import("drizzle-orm/pg-core").PgColumn<{
3270
+ name: "db_name";
3271
+ tableName: "foundry_audit_ledger_registrations";
3272
+ dataType: "string";
3273
+ columnType: "PgText";
3274
+ data: string;
3275
+ driverParam: string;
3276
+ notNull: true;
3277
+ hasDefault: false;
3278
+ isPrimaryKey: false;
3279
+ isAutoincrement: false;
3280
+ hasRuntimeDefault: false;
3281
+ enumValues: [string, ...string[]];
3282
+ baseColumn: never;
3283
+ identity: undefined;
3284
+ generated: undefined;
3285
+ }, {}, {}>;
3286
+ dbUser: import("drizzle-orm/pg-core").PgColumn<{
3287
+ name: "db_user";
3288
+ tableName: "foundry_audit_ledger_registrations";
3289
+ dataType: "string";
3290
+ columnType: "PgText";
3291
+ data: string;
3292
+ driverParam: string;
3293
+ notNull: true;
3294
+ hasDefault: false;
3295
+ isPrimaryKey: false;
3296
+ isAutoincrement: false;
3297
+ hasRuntimeDefault: false;
3298
+ enumValues: [string, ...string[]];
3299
+ baseColumn: never;
3300
+ identity: undefined;
3301
+ generated: undefined;
3302
+ }, {}, {}>;
3303
+ sslmode: import("drizzle-orm/pg-core").PgColumn<{
3304
+ name: "sslmode";
3305
+ tableName: "foundry_audit_ledger_registrations";
3306
+ dataType: "string";
3307
+ columnType: "PgText";
3308
+ data: string;
3309
+ driverParam: string;
3310
+ notNull: false;
3311
+ hasDefault: false;
3312
+ isPrimaryKey: false;
3313
+ isAutoincrement: false;
3314
+ hasRuntimeDefault: false;
3315
+ enumValues: [string, ...string[]];
3316
+ baseColumn: never;
3317
+ identity: undefined;
3318
+ generated: undefined;
3319
+ }, {}, {}>;
3320
+ passwordRef: import("drizzle-orm/pg-core").PgColumn<{
3321
+ name: "password_ref";
3322
+ tableName: "foundry_audit_ledger_registrations";
3323
+ dataType: "string";
3324
+ columnType: "PgText";
3325
+ data: string;
3326
+ driverParam: string;
3327
+ notNull: true;
3328
+ hasDefault: false;
3329
+ isPrimaryKey: false;
3330
+ isAutoincrement: false;
3331
+ hasRuntimeDefault: false;
3332
+ enumValues: [string, ...string[]];
3333
+ baseColumn: never;
3334
+ identity: undefined;
3335
+ generated: undefined;
3336
+ }, {}, {}>;
3337
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
3338
+ name: "created_at";
3339
+ tableName: "foundry_audit_ledger_registrations";
3340
+ dataType: "date";
3341
+ columnType: "PgTimestamp";
3342
+ data: Date;
3343
+ driverParam: string;
3344
+ notNull: true;
3345
+ hasDefault: true;
3346
+ isPrimaryKey: false;
3347
+ isAutoincrement: false;
3348
+ hasRuntimeDefault: false;
3349
+ enumValues: undefined;
3350
+ baseColumn: never;
3351
+ identity: undefined;
3352
+ generated: undefined;
3353
+ }, {}, {}>;
3354
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
3355
+ name: "updated_at";
3356
+ tableName: "foundry_audit_ledger_registrations";
3357
+ dataType: "date";
3358
+ columnType: "PgTimestamp";
3359
+ data: Date;
3360
+ driverParam: string;
3361
+ notNull: true;
3362
+ hasDefault: true;
3363
+ isPrimaryKey: false;
3364
+ isAutoincrement: false;
3365
+ hasRuntimeDefault: false;
3366
+ enumValues: undefined;
3367
+ baseColumn: never;
3368
+ identity: undefined;
3369
+ generated: undefined;
3370
+ }, {}, {}>;
3371
+ };
3372
+ dialect: "pg";
3373
+ }>;
3374
+ /** Mirrors `migrations/0072_audit_host.sql`: one seal tick's result for one ledger, kept for 12 hours. */
3375
+ export declare const foundryAuditSealResults: import("drizzle-orm/pg-core").PgTableWithColumns<{
3376
+ name: "foundry_audit_seal_results";
3377
+ schema: undefined;
3378
+ columns: {
3379
+ id: import("drizzle-orm/pg-core").PgColumn<{
3380
+ name: "id";
3381
+ tableName: "foundry_audit_seal_results";
3382
+ dataType: "number";
3383
+ columnType: "PgBigSerial53";
3384
+ data: number;
3385
+ driverParam: number;
3386
+ notNull: true;
3387
+ hasDefault: true;
3388
+ isPrimaryKey: true;
3389
+ isAutoincrement: false;
3390
+ hasRuntimeDefault: false;
3391
+ enumValues: undefined;
3392
+ baseColumn: never;
3393
+ identity: undefined;
3394
+ generated: undefined;
3395
+ }, {}, {}>;
3396
+ orgId: import("drizzle-orm/pg-core").PgColumn<{
3397
+ name: "org_id";
3398
+ tableName: "foundry_audit_seal_results";
3399
+ dataType: "string";
3400
+ columnType: "PgText";
3401
+ data: string;
3402
+ driverParam: string;
3403
+ notNull: true;
3404
+ hasDefault: false;
3405
+ isPrimaryKey: false;
3406
+ isAutoincrement: false;
3407
+ hasRuntimeDefault: false;
3408
+ enumValues: [string, ...string[]];
3409
+ baseColumn: never;
3410
+ identity: undefined;
3411
+ generated: undefined;
3412
+ }, {}, {}>;
3413
+ entryKey: import("drizzle-orm/pg-core").PgColumn<{
3414
+ name: "entry_key";
3415
+ tableName: "foundry_audit_seal_results";
3416
+ dataType: "string";
3417
+ columnType: "PgText";
3418
+ data: string;
3419
+ driverParam: string;
3420
+ notNull: true;
3421
+ hasDefault: false;
3422
+ isPrimaryKey: false;
3423
+ isAutoincrement: false;
3424
+ hasRuntimeDefault: false;
3425
+ enumValues: [string, ...string[]];
3426
+ baseColumn: never;
3427
+ identity: undefined;
3428
+ generated: undefined;
3429
+ }, {}, {}>;
3430
+ ledger: import("drizzle-orm/pg-core").PgColumn<{
3431
+ name: "ledger";
3432
+ tableName: "foundry_audit_seal_results";
3433
+ dataType: "string";
3434
+ columnType: "PgText";
3435
+ data: string;
3436
+ driverParam: string;
3437
+ notNull: true;
3438
+ hasDefault: false;
3439
+ isPrimaryKey: false;
3440
+ isAutoincrement: false;
3441
+ hasRuntimeDefault: false;
3442
+ enumValues: [string, ...string[]];
3443
+ baseColumn: never;
3444
+ identity: undefined;
3445
+ generated: undefined;
3446
+ }, {}, {}>;
3447
+ outcome: import("drizzle-orm/pg-core").PgColumn<{
3448
+ name: "outcome";
3449
+ tableName: "foundry_audit_seal_results";
3450
+ dataType: "string";
3451
+ columnType: "PgText";
3452
+ data: string;
3453
+ driverParam: string;
3454
+ notNull: true;
3455
+ hasDefault: false;
3456
+ isPrimaryKey: false;
3457
+ isAutoincrement: false;
3458
+ hasRuntimeDefault: false;
3459
+ enumValues: [string, ...string[]];
3460
+ baseColumn: never;
3461
+ identity: undefined;
3462
+ generated: undefined;
3463
+ }, {}, {}>;
3464
+ treeSize: import("drizzle-orm/pg-core").PgColumn<{
3465
+ name: "tree_size";
3466
+ tableName: "foundry_audit_seal_results";
3467
+ dataType: "number";
3468
+ columnType: "PgInteger";
3469
+ data: number;
3470
+ driverParam: string | number;
3471
+ notNull: false;
3472
+ hasDefault: false;
3473
+ isPrimaryKey: false;
3474
+ isAutoincrement: false;
3475
+ hasRuntimeDefault: false;
3476
+ enumValues: undefined;
3477
+ baseColumn: never;
3478
+ identity: undefined;
3479
+ generated: undefined;
3480
+ }, {}, {}>;
3481
+ anchored: import("drizzle-orm/pg-core").PgColumn<{
3482
+ name: "anchored";
3483
+ tableName: "foundry_audit_seal_results";
3484
+ dataType: "number";
3485
+ columnType: "PgInteger";
3486
+ data: number;
3487
+ driverParam: string | number;
3488
+ notNull: true;
3489
+ hasDefault: true;
3490
+ isPrimaryKey: false;
3491
+ isAutoincrement: false;
3492
+ hasRuntimeDefault: false;
3493
+ enumValues: undefined;
3494
+ baseColumn: never;
3495
+ identity: undefined;
3496
+ generated: undefined;
3497
+ }, {}, {}>;
3498
+ erasures: import("drizzle-orm/pg-core").PgColumn<{
3499
+ name: "erasures";
3500
+ tableName: "foundry_audit_seal_results";
3501
+ dataType: "number";
3502
+ columnType: "PgInteger";
3503
+ data: number;
3504
+ driverParam: string | number;
3505
+ notNull: true;
3506
+ hasDefault: true;
3507
+ isPrimaryKey: false;
3508
+ isAutoincrement: false;
3509
+ hasRuntimeDefault: false;
3510
+ enumValues: undefined;
3511
+ baseColumn: never;
3512
+ identity: undefined;
3513
+ generated: undefined;
3514
+ }, {}, {}>;
3515
+ reason: import("drizzle-orm/pg-core").PgColumn<{
3516
+ name: "reason";
3517
+ tableName: "foundry_audit_seal_results";
3518
+ dataType: "string";
3519
+ columnType: "PgText";
3520
+ data: string;
3521
+ driverParam: string;
3522
+ notNull: false;
3523
+ hasDefault: false;
3524
+ isPrimaryKey: false;
3525
+ isAutoincrement: false;
3526
+ hasRuntimeDefault: false;
3527
+ enumValues: [string, ...string[]];
3528
+ baseColumn: never;
3529
+ identity: undefined;
3530
+ generated: undefined;
3531
+ }, {}, {}>;
3532
+ at: import("drizzle-orm/pg-core").PgColumn<{
3533
+ name: "at";
3534
+ tableName: "foundry_audit_seal_results";
3535
+ dataType: "date";
3536
+ columnType: "PgTimestamp";
3537
+ data: Date;
3538
+ driverParam: string;
3539
+ notNull: true;
3540
+ hasDefault: false;
3541
+ isPrimaryKey: false;
3542
+ isAutoincrement: false;
3543
+ hasRuntimeDefault: false;
3544
+ enumValues: undefined;
3545
+ baseColumn: never;
3546
+ identity: undefined;
3547
+ generated: undefined;
3548
+ }, {}, {}>;
3549
+ };
3550
+ dialect: "pg";
3551
+ }>;
@@ -1,5 +1,5 @@
1
1
  import { sql } from 'drizzle-orm';
2
- import { bigint, bigserial, boolean, index, integer, jsonb, pgTable, text, timestamp, } from 'drizzle-orm/pg-core';
2
+ import { bigint, bigserial, boolean, index, integer, jsonb, pgTable, primaryKey, text, timestamp, } from 'drizzle-orm/pg-core';
3
3
  /**
4
4
  * Mirrors `migrations/0001_declared_org.sql`, which is the source of truth:
5
5
  * the SQL carries the CHECKs drizzle-kit does not generate here (this
@@ -236,6 +236,10 @@ export const foundryDeclaredPlatform = pgTable('foundry_declared_platform', {
236
236
  usageTailEnabled: boolean('usage_tail_enabled').notNull().default(false),
237
237
  usageTailTag: text('usage_tail_tag').notNull().default(''),
238
238
  usageTailSha256: text('usage_tail_sha256').notNull().default(''),
239
+ /** foundry#1133, `migrations/0074_platform_app_canary.sql`: the app-layer canary and its artifact pin. */
240
+ appCanaryEnabled: boolean('app_canary_enabled').notNull().default(false),
241
+ appCanaryTag: text('app_canary_tag').notNull().default(''),
242
+ appCanarySha256: text('app_canary_sha256').notNull().default(''),
239
243
  /** foundry#544, `migrations/0053_heartbeats_provider.sql`: which Healthchecks instance manages the heartbeat checks, decoupled from `hcEnabled` above. */
240
244
  heartbeatsProvider: text('heartbeats_provider').notNull().default('self-hosted'),
241
245
  /** `migrations/0018_platform_apply.sql`: the platform's applied state, `system:kind:key` to provider id. */
@@ -290,3 +294,36 @@ export const foundryReleaseEvents = pgTable('foundry_release_events', {
290
294
  kind: text('kind').notNull(),
291
295
  payload: jsonb('payload').notNull().$type().default({}),
292
296
  });
297
+ /** Mirrors `migrations/0072_audit_host.sql`: a company's audit host key, as its sha256 only. */
298
+ export const foundryAuditHostKeys = pgTable('foundry_audit_host_keys', {
299
+ orgId: text('org_id').primaryKey(),
300
+ keySha256: text('key_sha256').notNull().unique(),
301
+ createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),
302
+ });
303
+ /** Mirrors `migrations/0072_audit_host.sql`: a ledger a company's Boule registered; the password is held, not here. */
304
+ export const foundryAuditLedgerRegistrations = pgTable('foundry_audit_ledger_registrations', {
305
+ orgId: text('org_id').notNull(),
306
+ entryKey: text('entry_key').notNull(),
307
+ copy: text('copy').notNull(),
308
+ dbHost: text('db_host').notNull(),
309
+ dbPort: integer('db_port').notNull(),
310
+ dbName: text('db_name').notNull(),
311
+ dbUser: text('db_user').notNull(),
312
+ sslmode: text('sslmode'),
313
+ passwordRef: text('password_ref').notNull(),
314
+ createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),
315
+ updatedAt: timestamp('updated_at', { withTimezone: true }).notNull().defaultNow(),
316
+ }, (t) => [primaryKey({ columns: [t.orgId, t.entryKey] })]);
317
+ /** Mirrors `migrations/0072_audit_host.sql`: one seal tick's result for one ledger, kept for 12 hours. */
318
+ export const foundryAuditSealResults = pgTable('foundry_audit_seal_results', {
319
+ id: bigserial('id', { mode: 'number' }).primaryKey(),
320
+ orgId: text('org_id').notNull(),
321
+ entryKey: text('entry_key').notNull(),
322
+ ledger: text('ledger').notNull(),
323
+ outcome: text('outcome').notNull(),
324
+ treeSize: integer('tree_size'),
325
+ anchored: integer('anchored').notNull().default(0),
326
+ erasures: integer('erasures').notNull().default(0),
327
+ reason: text('reason'),
328
+ at: timestamp('at', { withTimezone: true }).notNull(),
329
+ });
@@ -196,9 +196,9 @@ export function validateEntryWorkerApp(entry, hosting, names) {
196
196
  if (Object.keys(entry.env).length > 0) {
197
197
  return `${at} has no Coolify app, so env does not apply: use workerApp.vars or workerApp.secrets`;
198
198
  }
199
- const unsupported = Object.keys(entry.uses ?? {}).find((use) => use !== 'auth' && use !== 'audit' && use !== 'analytics');
199
+ const unsupported = Object.keys(entry.uses ?? {}).find((use) => use !== 'auth' && use !== 'audit' && use !== 'analytics' && use !== 'reporting');
200
200
  if (unsupported)
201
- return `${at} supports uses.auth, uses.audit and uses.analytics only, not uses.${unsupported}`;
201
+ return `${at} supports uses.auth, uses.audit, uses.analytics and uses.reporting only, not uses.${unsupported}`;
202
202
  if (entry.key.length > WORKER_NAME_MAX_LENGTH - WORKER_NAME_FIXED_LENGTH) {
203
203
  return `${at} entry key is too long: the deployed Worker's name (an 8-character org hash, the key, and "${WORKER_APP_NAME_SUFFIX}") must fit Cloudflare's ${WORKER_NAME_MAX_LENGTH}-character limit`;
204
204
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wtfalch/foundry",
3
- "version": "0.76.1",
3
+ "version": "0.77.1",
4
4
  "description": "Foundry's SDK: the declared org's types, the plan and apply contracts, and the state store's interface.",
5
5
  "repository": {
6
6
  "type": "git",