@noodleseed/one 0.10.0 → 0.11.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.
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +16 -4
- package/dist/cli.js.map +1 -1
- package/dist/commands/archive-ops.d.ts +3 -0
- package/dist/commands/archive-ops.d.ts.map +1 -0
- package/dist/commands/archive-ops.js +168 -0
- package/dist/commands/archive-ops.js.map +1 -0
- package/dist/commands/org-admin.d.ts +17 -0
- package/dist/commands/org-admin.d.ts.map +1 -0
- package/dist/commands/org-admin.js +241 -0
- package/dist/commands/org-admin.js.map +1 -0
- package/dist/commands/policy-ops.d.ts.map +1 -1
- package/dist/commands/policy-ops.js +94 -1
- package/dist/commands/policy-ops.js.map +1 -1
- package/dist/commands/session.d.ts +1 -15
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +15 -170
- package/dist/commands/session.js.map +1 -1
- package/dist/commands/shared.d.ts.map +1 -1
- package/dist/commands/shared.js +13 -5
- package/dist/commands/shared.js.map +1 -1
- package/dist/commands/update-ops.d.ts +29 -0
- package/dist/commands/update-ops.d.ts.map +1 -0
- package/dist/commands/update-ops.js +315 -0
- package/dist/commands/update-ops.js.map +1 -0
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/update-binary.d.ts +38 -0
- package/dist/update-binary.d.ts.map +1 -0
- package/dist/update-binary.js +144 -0
- package/dist/update-binary.js.map +1 -0
- package/dist/update-check.d.ts +40 -0
- package/dist/update-check.d.ts.map +1 -0
- package/dist/update-check.js +212 -0
- package/dist/update-check.js.map +1 -0
- package/dist/update-render.d.ts +17 -0
- package/dist/update-render.d.ts.map +1 -0
- package/dist/update-render.js +39 -0
- package/dist/update-render.js.map +1 -0
- package/dist/update.d.ts +10 -9
- package/dist/update.d.ts.map +1 -1
- package/dist/update.js +21 -89
- package/dist/update.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.d.ts.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.js +13 -1
- package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.d.ts.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js +2 -0
- package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
- package/node_modules/@noodle-borg/service/dist/archive-sweeper.d.ts +43 -0
- package/node_modules/@noodle-borg/service/dist/archive-sweeper.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/archive-sweeper.js +122 -0
- package/node_modules/@noodle-borg/service/dist/archive-sweeper.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/commercial-plans.d.ts +11 -0
- package/node_modules/@noodle-borg/service/dist/commercial-plans.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/commercial-plans.js +119 -0
- package/node_modules/@noodle-borg/service/dist/commercial-plans.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/deployment-versioning.d.ts +2 -0
- package/node_modules/@noodle-borg/service/dist/deployment-versioning.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/deployment-versioning.js +1 -1
- package/node_modules/@noodle-borg/service/dist/deployment-versioning.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/index.d.ts +3 -1
- package/node_modules/@noodle-borg/service/dist/index.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/index.js +2 -0
- package/node_modules/@noodle-borg/service/dist/index.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/options.d.ts +9 -0
- package/node_modules/@noodle-borg/service/dist/options.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/registry-state.d.ts +25 -0
- package/node_modules/@noodle-borg/service/dist/registry-state.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/registry-state.js +119 -0
- package/node_modules/@noodle-borg/service/dist/registry-state.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/registry.d.ts +7 -6
- package/node_modules/@noodle-borg/service/dist/registry.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/registry.js +44 -44
- package/node_modules/@noodle-borg/service/dist/registry.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/archive.d.ts +16 -0
- package/node_modules/@noodle-borg/service/dist/routes/archive.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/routes/archive.js +83 -0
- package/node_modules/@noodle-borg/service/dist/routes/archive.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/routes/control-plane.d.ts +1 -18
- package/node_modules/@noodle-borg/service/dist/routes/control-plane.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/control-plane.js +18 -260
- package/node_modules/@noodle-borg/service/dist/routes/control-plane.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/deployments.d.ts +17 -0
- package/node_modules/@noodle-borg/service/dist/routes/deployments.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/routes/deployments.js +88 -0
- package/node_modules/@noodle-borg/service/dist/routes/deployments.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/routes/org-admin.d.ts +40 -0
- package/node_modules/@noodle-borg/service/dist/routes/org-admin.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/routes/org-admin.js +353 -0
- package/node_modules/@noodle-borg/service/dist/routes/org-admin.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/routes/paths.d.ts +15 -0
- package/node_modules/@noodle-borg/service/dist/routes/paths.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/paths.js +47 -0
- package/node_modules/@noodle-borg/service/dist/routes/paths.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/plans.d.ts +20 -0
- package/node_modules/@noodle-borg/service/dist/routes/plans.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/routes/plans.js +159 -0
- package/node_modules/@noodle-borg/service/dist/routes/plans.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/routes/policies.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/policies.js +7 -0
- package/node_modules/@noodle-borg/service/dist/routes/policies.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/rollback.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/rollback.js +19 -1
- package/node_modules/@noodle-borg/service/dist/routes/rollback.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/service.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/service.js +107 -4
- package/node_modules/@noodle-borg/service/dist/service.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/store/control-plane.d.ts +14 -0
- package/node_modules/@noodle-borg/service/dist/store/control-plane.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/store/control-plane.js +38 -0
- package/node_modules/@noodle-borg/service/dist/store/control-plane.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/store/json-file.d.ts +25 -0
- package/node_modules/@noodle-borg/service/dist/store/json-file.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/store/json-file.js +163 -0
- package/node_modules/@noodle-borg/service/dist/store/json-file.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/store/postgres-control-plane.d.ts +14 -0
- package/node_modules/@noodle-borg/service/dist/store/postgres-control-plane.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/store/postgres-control-plane.js +16 -0
- package/node_modules/@noodle-borg/service/dist/store/postgres-control-plane.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/store/postgres-rows.d.ts +60 -0
- package/node_modules/@noodle-borg/service/dist/store/postgres-rows.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/store/postgres-rows.js +101 -0
- package/node_modules/@noodle-borg/service/dist/store/postgres-rows.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/store/postgres-schema.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/store/postgres-schema.js +8 -0
- package/node_modules/@noodle-borg/service/dist/store/postgres-schema.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/store/postgres.d.ts +20 -6
- package/node_modules/@noodle-borg/service/dist/store/postgres.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/store/postgres.js +74 -122
- package/node_modules/@noodle-borg/service/dist/store/postgres.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/store/records.d.ts +35 -0
- package/node_modules/@noodle-borg/service/dist/store/records.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/store/records.js +87 -0
- package/node_modules/@noodle-borg/service/dist/store/records.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/store/validate.d.ts +19 -0
- package/node_modules/@noodle-borg/service/dist/store/validate.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/store/validate.js +61 -0
- package/node_modules/@noodle-borg/service/dist/store/validate.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/store.d.ts +68 -44
- package/node_modules/@noodle-borg/service/dist/store.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/store.js +48 -213
- package/node_modules/@noodle-borg/service/dist/store.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Opportunistic retention sweeper for archived apps (ADR 0117 §3). No scheduler: the service
|
|
3
|
+
* handler fires one sweep at construction (boot) and piggybacks a throttled, fire-and-forget
|
|
4
|
+
* `maybeSweep()` on the deploy and deployments-list control-plane paths. A sweep hard-deletes
|
|
5
|
+
* every deployment record archived before the retention cutoff, reclaims the purged app's managed
|
|
6
|
+
* config (app scope + the swept environments' env scopes — org scope is shared and untouched),
|
|
7
|
+
* and emits one `app.purged` audit event per org/app.
|
|
8
|
+
*/
|
|
9
|
+
import { type Logger } from '@noodle-borg/transport-http';
|
|
10
|
+
import type { ServerRegistry } from './registry.js';
|
|
11
|
+
import type { AuditSink } from './store/audit.js';
|
|
12
|
+
import { type ConfigStore } from './store.js';
|
|
13
|
+
/** Platform default retention: archived apps are hard-deleted after this many days. */
|
|
14
|
+
export declare const DEFAULT_ARCHIVE_RETENTION_DAYS = 30;
|
|
15
|
+
/** Piggybacked sweeps run at most this often per instance; boot always sweeps once. */
|
|
16
|
+
export declare const ARCHIVE_SWEEP_INTERVAL_MS: number;
|
|
17
|
+
/** Resolve the retention override from env. Fails closed on a malformed value (boot-time error). */
|
|
18
|
+
export declare function resolveArchiveRetentionDays(env: NodeJS.ProcessEnv): number;
|
|
19
|
+
export interface ArchiveSweeperOptions {
|
|
20
|
+
readonly registry: ServerRegistry;
|
|
21
|
+
readonly configStore: ConfigStore;
|
|
22
|
+
readonly audit: AuditSink;
|
|
23
|
+
readonly retentionDays: number;
|
|
24
|
+
/** Injectable clock for deterministic retention tests. Default: `new Date()`. */
|
|
25
|
+
readonly clock?: () => Date;
|
|
26
|
+
readonly logger?: Logger;
|
|
27
|
+
/** Throttle for {@link maybeSweep}. Default {@link ARCHIVE_SWEEP_INTERVAL_MS}. */
|
|
28
|
+
readonly intervalMs?: number;
|
|
29
|
+
}
|
|
30
|
+
export declare class ArchiveSweeper {
|
|
31
|
+
#private;
|
|
32
|
+
constructor(options: ArchiveSweeperOptions);
|
|
33
|
+
/**
|
|
34
|
+
* Throttled, fire-and-forget sweep for request-path piggybacking: never blocks or fails the
|
|
35
|
+
* carrying request. The first call (boot) always sweeps.
|
|
36
|
+
*/
|
|
37
|
+
maybeSweep(): void;
|
|
38
|
+
sweepNow(): Promise<{
|
|
39
|
+
readonly deletedDeployments: number;
|
|
40
|
+
readonly purgedApps: number;
|
|
41
|
+
}>;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=archive-sweeper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive-sweeper.d.ts","sourceRoot":"","sources":["../src/archive-sweeper.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,KAAK,MAAM,EAAc,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EACL,KAAK,WAAW,EAIjB,MAAM,YAAY,CAAC;AAEpB,uFAAuF;AACvF,eAAO,MAAM,8BAA8B,KAAK,CAAC;AACjD,uFAAuF;AACvF,eAAO,MAAM,yBAAyB,QAAqB,CAAC;AAK5D,oGAAoG;AACpG,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAQ1E;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,iFAAiF;IACjF,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,kFAAkF;IAClF,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AASD,qBAAa,cAAc;;gBAUb,OAAO,EAAE,qBAAqB;IAU1C;;;OAGG;IACH,UAAU,IAAI,IAAI;IAgBZ,QAAQ,IAAI,OAAO,CAAC;QAAE,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CA0ChG"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Opportunistic retention sweeper for archived apps (ADR 0117 §3). No scheduler: the service
|
|
3
|
+
* handler fires one sweep at construction (boot) and piggybacks a throttled, fire-and-forget
|
|
4
|
+
* `maybeSweep()` on the deploy and deployments-list control-plane paths. A sweep hard-deletes
|
|
5
|
+
* every deployment record archived before the retention cutoff, reclaims the purged app's managed
|
|
6
|
+
* config (app scope + the swept environments' env scopes — org scope is shared and untouched),
|
|
7
|
+
* and emits one `app.purged` audit event per org/app.
|
|
8
|
+
*/
|
|
9
|
+
import { noopLogger } from '@noodle-borg/transport-http';
|
|
10
|
+
import { resolveConfigScope, } from './store.js';
|
|
11
|
+
/** Platform default retention: archived apps are hard-deleted after this many days. */
|
|
12
|
+
export const DEFAULT_ARCHIVE_RETENTION_DAYS = 30;
|
|
13
|
+
/** Piggybacked sweeps run at most this often per instance; boot always sweeps once. */
|
|
14
|
+
export const ARCHIVE_SWEEP_INTERVAL_MS = 6 * 60 * 60 * 1000;
|
|
15
|
+
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
16
|
+
const CONFIG_KINDS = ['secret', 'variable'];
|
|
17
|
+
/** Resolve the retention override from env. Fails closed on a malformed value (boot-time error). */
|
|
18
|
+
export function resolveArchiveRetentionDays(env) {
|
|
19
|
+
const raw = env.NOODLE_ARCHIVE_RETENTION_DAYS;
|
|
20
|
+
if (raw === undefined || raw.trim() === '')
|
|
21
|
+
return DEFAULT_ARCHIVE_RETENTION_DAYS;
|
|
22
|
+
const parsed = Number(raw);
|
|
23
|
+
if (!Number.isInteger(parsed) || parsed < 1) {
|
|
24
|
+
throw new Error('NOODLE_ARCHIVE_RETENTION_DAYS must be a positive integer number of days');
|
|
25
|
+
}
|
|
26
|
+
return parsed;
|
|
27
|
+
}
|
|
28
|
+
export class ArchiveSweeper {
|
|
29
|
+
#registry;
|
|
30
|
+
#configStore;
|
|
31
|
+
#audit;
|
|
32
|
+
#retentionDays;
|
|
33
|
+
#clock;
|
|
34
|
+
#logger;
|
|
35
|
+
#intervalMs;
|
|
36
|
+
#lastSweepStartedAt;
|
|
37
|
+
constructor(options) {
|
|
38
|
+
this.#registry = options.registry;
|
|
39
|
+
this.#configStore = options.configStore;
|
|
40
|
+
this.#audit = options.audit;
|
|
41
|
+
this.#retentionDays = options.retentionDays;
|
|
42
|
+
this.#clock = options.clock ?? (() => new Date());
|
|
43
|
+
this.#logger = options.logger ?? noopLogger;
|
|
44
|
+
this.#intervalMs = options.intervalMs ?? ARCHIVE_SWEEP_INTERVAL_MS;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Throttled, fire-and-forget sweep for request-path piggybacking: never blocks or fails the
|
|
48
|
+
* carrying request. The first call (boot) always sweeps.
|
|
49
|
+
*/
|
|
50
|
+
maybeSweep() {
|
|
51
|
+
const now = this.#clock().getTime();
|
|
52
|
+
if (this.#lastSweepStartedAt !== undefined &&
|
|
53
|
+
now - this.#lastSweepStartedAt < this.#intervalMs) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
this.#lastSweepStartedAt = now;
|
|
57
|
+
void this.sweepNow().catch((error) => {
|
|
58
|
+
this.#logger.warn('archive.sweep.failed', {
|
|
59
|
+
message: error instanceof Error ? error.message : String(error),
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
async sweepNow() {
|
|
64
|
+
const cutoff = new Date(this.#clock().getTime() - this.#retentionDays * DAY_MS).toISOString();
|
|
65
|
+
const deleted = await this.#registry.sweepArchived(cutoff);
|
|
66
|
+
if (deleted.length === 0)
|
|
67
|
+
return { deletedDeployments: 0, purgedApps: 0 };
|
|
68
|
+
const apps = groupByApp(deleted);
|
|
69
|
+
for (const entry of apps.values()) {
|
|
70
|
+
await this.#deleteAppConfig(entry);
|
|
71
|
+
await this.#audit.emit({
|
|
72
|
+
eventType: 'app.purged',
|
|
73
|
+
org: entry.org,
|
|
74
|
+
app: entry.app,
|
|
75
|
+
decision: 'allow',
|
|
76
|
+
reasonCode: 'retention_elapsed',
|
|
77
|
+
details: {
|
|
78
|
+
deletedDeployments: entry.count,
|
|
79
|
+
retentionDays: this.#retentionDays,
|
|
80
|
+
archivedBefore: cutoff,
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
this.#logger.info('archive.sweep.completed', {
|
|
85
|
+
deletedDeployments: deleted.length,
|
|
86
|
+
purgedApps: apps.size,
|
|
87
|
+
});
|
|
88
|
+
return { deletedDeployments: deleted.length, purgedApps: apps.size };
|
|
89
|
+
}
|
|
90
|
+
/** Reclaim the purged app's managed config: app scope + each swept environment's env scope. */
|
|
91
|
+
async #deleteAppConfig(entry) {
|
|
92
|
+
const scopes = [
|
|
93
|
+
resolveConfigScope({ org: entry.org, app: entry.app }),
|
|
94
|
+
...[...entry.envs].map((env) => resolveConfigScope({ org: entry.org, app: entry.app, env })),
|
|
95
|
+
];
|
|
96
|
+
for (const scope of scopes) {
|
|
97
|
+
for (const kind of CONFIG_KINDS) {
|
|
98
|
+
const values = await this.#configStore.listConfigValues(kind, scope);
|
|
99
|
+
for (const value of values) {
|
|
100
|
+
await this.#configStore.deleteConfigValue(kind, scope, value.name);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function groupByApp(deleted) {
|
|
107
|
+
const apps = new Map();
|
|
108
|
+
for (const record of deleted) {
|
|
109
|
+
const key = `${record.orgSlug}/${record.appSlug}`;
|
|
110
|
+
const entry = apps.get(key) ?? {
|
|
111
|
+
org: record.orgSlug,
|
|
112
|
+
app: record.appSlug,
|
|
113
|
+
envs: new Set(),
|
|
114
|
+
count: 0,
|
|
115
|
+
};
|
|
116
|
+
entry.envs.add(record.environment);
|
|
117
|
+
entry.count += 1;
|
|
118
|
+
apps.set(key, entry);
|
|
119
|
+
}
|
|
120
|
+
return apps;
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=archive-sweeper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive-sweeper.js","sourceRoot":"","sources":["../src/archive-sweeper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { PolicyDocument } from './policy.js';
|
|
2
|
+
export type CommercialPlanName = 'free' | 'pro' | 'scale' | 'enterprise';
|
|
3
|
+
export type CommercialPlanCatalog = Readonly<Record<CommercialPlanName, PolicyDocument>>;
|
|
4
|
+
export declare const COMMERCIAL_PLAN_NAMES: readonly CommercialPlanName[];
|
|
5
|
+
export declare const DEFAULT_COMMERCIAL_PLAN_CATALOG: CommercialPlanCatalog;
|
|
6
|
+
export declare function commercialPlanPolicyId(org: string): string;
|
|
7
|
+
export declare function isCommercialPlanPolicyId(id: string): boolean;
|
|
8
|
+
export declare function isCommercialPlanName(value: unknown): value is CommercialPlanName;
|
|
9
|
+
export declare function resolveCommercialPlanCatalog(override: CommercialPlanCatalog | undefined): CommercialPlanCatalog;
|
|
10
|
+
export declare function planNameForPolicy(policy: PolicyDocument, catalog: CommercialPlanCatalog): CommercialPlanName | undefined;
|
|
11
|
+
//# sourceMappingURL=commercial-plans.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commercial-plans.d.ts","sourceRoot":"","sources":["../src/commercial-plans.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,YAAY,CAAC;AAEzE,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC,MAAM,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAC,CAAC;AAEzF,eAAO,MAAM,qBAAqB,EAAE,SAAS,kBAAkB,EAK9D,CAAC;AAEF,eAAO,MAAM,+BAA+B,EAAE,qBAwE7C,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAS5D;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAEhF;AAED,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,qBAAqB,GAAG,SAAS,GAC1C,qBAAqB,CAEvB;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,qBAAqB,GAC7B,kBAAkB,GAAG,SAAS,CAMhC"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { validateSlug } from './store.js';
|
|
2
|
+
export const COMMERCIAL_PLAN_NAMES = [
|
|
3
|
+
'free',
|
|
4
|
+
'pro',
|
|
5
|
+
'scale',
|
|
6
|
+
'enterprise',
|
|
7
|
+
];
|
|
8
|
+
export const DEFAULT_COMMERCIAL_PLAN_CATALOG = {
|
|
9
|
+
free: {
|
|
10
|
+
schemaVersion: 1,
|
|
11
|
+
categories: {
|
|
12
|
+
execute: {
|
|
13
|
+
reason: 'free_plan_quota',
|
|
14
|
+
quota: { limit: 1_000_000, windowSeconds: 2_592_000 },
|
|
15
|
+
rate: {
|
|
16
|
+
algorithm: 'token-bucket',
|
|
17
|
+
limit: 60,
|
|
18
|
+
refillSeconds: 60,
|
|
19
|
+
burst: 120,
|
|
20
|
+
partitionBy: 'subject',
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
discovery: { rate: commonReadRate() },
|
|
24
|
+
read: { rate: commonReadRate() },
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
pro: {
|
|
28
|
+
schemaVersion: 1,
|
|
29
|
+
categories: {
|
|
30
|
+
execute: {
|
|
31
|
+
reason: 'pro_plan_quota',
|
|
32
|
+
quota: { limit: 10_000_000, windowSeconds: 2_592_000 },
|
|
33
|
+
rate: {
|
|
34
|
+
algorithm: 'token-bucket',
|
|
35
|
+
limit: 300,
|
|
36
|
+
refillSeconds: 60,
|
|
37
|
+
burst: 600,
|
|
38
|
+
partitionBy: 'subject',
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
discovery: { rate: commonReadRate() },
|
|
42
|
+
read: { rate: commonReadRate() },
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
scale: {
|
|
46
|
+
schemaVersion: 1,
|
|
47
|
+
categories: {
|
|
48
|
+
execute: {
|
|
49
|
+
reason: 'scale_plan_quota',
|
|
50
|
+
quota: { limit: 100_000_000, windowSeconds: 2_592_000 },
|
|
51
|
+
rate: {
|
|
52
|
+
algorithm: 'token-bucket',
|
|
53
|
+
limit: 1_000,
|
|
54
|
+
refillSeconds: 60,
|
|
55
|
+
burst: 2_000,
|
|
56
|
+
partitionBy: 'subject',
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
discovery: { rate: commonReadRate() },
|
|
60
|
+
read: { rate: commonReadRate() },
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
enterprise: {
|
|
64
|
+
schemaVersion: 1,
|
|
65
|
+
categories: {
|
|
66
|
+
execute: {
|
|
67
|
+
reason: 'enterprise_plan_rate',
|
|
68
|
+
rate: {
|
|
69
|
+
algorithm: 'token-bucket',
|
|
70
|
+
limit: 2_000,
|
|
71
|
+
refillSeconds: 60,
|
|
72
|
+
burst: 4_000,
|
|
73
|
+
partitionBy: 'subject',
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
discovery: { rate: commonReadRate() },
|
|
77
|
+
read: { rate: commonReadRate() },
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
export function commercialPlanPolicyId(org) {
|
|
82
|
+
return `org:${validateSlug('org', org)}:commercial-plan`;
|
|
83
|
+
}
|
|
84
|
+
export function isCommercialPlanPolicyId(id) {
|
|
85
|
+
const match = /^org:([^:]+):commercial-plan$/.exec(id);
|
|
86
|
+
if (!match)
|
|
87
|
+
return false;
|
|
88
|
+
try {
|
|
89
|
+
validateSlug('org', match[1]);
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
export function isCommercialPlanName(value) {
|
|
97
|
+
return typeof value === 'string' && COMMERCIAL_PLAN_NAMES.includes(value);
|
|
98
|
+
}
|
|
99
|
+
export function resolveCommercialPlanCatalog(override) {
|
|
100
|
+
return override ?? DEFAULT_COMMERCIAL_PLAN_CATALOG;
|
|
101
|
+
}
|
|
102
|
+
export function planNameForPolicy(policy, catalog) {
|
|
103
|
+
const fingerprint = JSON.stringify(policy);
|
|
104
|
+
for (const name of COMMERCIAL_PLAN_NAMES) {
|
|
105
|
+
if (JSON.stringify(catalog[name]) === fingerprint)
|
|
106
|
+
return name;
|
|
107
|
+
}
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
function commonReadRate() {
|
|
111
|
+
return {
|
|
112
|
+
algorithm: 'token-bucket',
|
|
113
|
+
limit: 120,
|
|
114
|
+
refillSeconds: 60,
|
|
115
|
+
burst: 240,
|
|
116
|
+
partitionBy: 'subject',
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=commercial-plans.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commercial-plans.js","sourceRoot":"","sources":["../src/commercial-plans.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,8 @@ export interface DeploymentVersionRecord {
|
|
|
5
5
|
readonly active: boolean;
|
|
6
6
|
readonly deploymentVersion: number;
|
|
7
7
|
readonly serverVersion?: string;
|
|
8
|
+
/** Soft-delete stamp (ADR 0117). An archived record never resolves as an active deployment. */
|
|
9
|
+
readonly archivedAt?: string;
|
|
8
10
|
}
|
|
9
11
|
export interface TenantVersionRef {
|
|
10
12
|
readonly org: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deployment-versioning.d.ts","sourceRoot":"","sources":["../src/deployment-versioning.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"deployment-versioning.d.ts","sourceRoot":"","sources":["../src/deployment-versioning.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,+FAA+F;IAC/F,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,IAAI,CAAC,uBAAuB,EAAE,SAAS,GAAG,SAAS,GAAG,aAAa,CAAC,EAC5E,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC,uBAAuB,EAAE,SAAS,GAAG,SAAS,GAAG,aAAa,CAAC,GAC9F,OAAO,CAaT;AAED,wBAAgB,mBAAmB,CACjC,CAAC,EAAE,uBAAuB,EAC1B,CAAC,EAAE,uBAAuB,GACzB,OAAO,CAET;AAED,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,uBAAuB,EACnE,OAAO,EAAE,SAAS,CAAC,EAAE,EACrB,GAAG,EAAE,gBAAgB,GACpB,CAAC,GAAG,SAAS,CAaf;AAED,wBAAgB,oCAAoC,CAAC,CAAC,SAAS,uBAAuB,EACpF,CAAC,EAAE,CAAC,EACJ,CAAC,EAAE,CAAC,GACH,MAAM,CAGR"}
|
|
@@ -13,7 +13,7 @@ export function sameDeploymentScope(a, b) {
|
|
|
13
13
|
return sameTenantRecord(a, b) && a.serverVersion === b.serverVersion;
|
|
14
14
|
}
|
|
15
15
|
export function defaultActiveRecord(records, ref) {
|
|
16
|
-
const active = records.filter((record) => record.active && sameTenantRecord(record, ref));
|
|
16
|
+
const active = records.filter((record) => record.active && record.archivedAt === undefined && sameTenantRecord(record, ref));
|
|
17
17
|
const versioned = active
|
|
18
18
|
.filter((record) => record.serverVersion !== undefined)
|
|
19
19
|
.sort(compareDeployRecordVersionDescending);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deployment-versioning.js","sourceRoot":"","sources":["../src/deployment-versioning.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"deployment-versioning.js","sourceRoot":"","sources":["../src/deployment-versioning.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAmB5D,MAAM,UAAU,gBAAgB,CAC9B,MAA4E,EAC5E,MAA+F;IAE/F,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;QACpB,OAAO,CACL,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,GAAG;YAC7B,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,GAAG;YAC7B,MAAM,CAAC,WAAW,KAAK,MAAM,CAAC,GAAG,CAClC,CAAC;IACJ,CAAC;IACD,OAAO,CACL,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO;QACjC,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO;QACjC,MAAM,CAAC,WAAW,KAAK,MAAM,CAAC,WAAW,CAC1C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,CAA0B,EAC1B,CAA0B;IAE1B,OAAO,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,KAAK,CAAC,CAAC,aAAa,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,OAAqB,EACrB,GAAqB;IAErB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAC3B,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,gBAAgB,CAAC,MAAM,EAAE,GAAG,CAAC,CAC9F,CAAC;IACF,MAAM,SAAS,GAAG,MAAM;SACrB,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,KAAK,SAAS,CAAC;SACtD,IAAI,CAAC,oCAAoC,CAAC,CAAC;IAC9C,OAAO,CACL,SAAS,CAAC,CAAC,CAAC;QACZ,MAAM;aACH,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,KAAK,SAAS,CAAC;aACtD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,GAAG,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAChE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oCAAoC,CAClD,CAAI,EACJ,CAAI;IAEJ,MAAM,SAAS,GAAG,qBAAqB,CAAC,CAAC,CAAC,aAAuB,EAAE,CAAC,CAAC,aAAuB,CAAC,CAAC;IAC9F,OAAO,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,GAAG,CAAC,CAAC,iBAAiB,CAAC;AACjF,CAAC"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
export { ensureAuditSchema, PostgresAuditStore } from '@noodle-borg/module-audit';
|
|
2
|
+
export { ARCHIVE_SWEEP_INTERVAL_MS, ArchiveSweeper, type ArchiveSweeperOptions, DEFAULT_ARCHIVE_RETENTION_DAYS, resolveArchiveRetentionDays, } from './archive-sweeper.js';
|
|
2
3
|
export { type AssetAdapterKind, type AssetConfigInput, type AssetConfigResolution, type AssetQuotaOverride, createAssetStore, type ResolvedAssetConfig, resolveAssetConfig, } from './asset-config.js';
|
|
3
4
|
export { type AssetStore, type AssetUploadPlan, type AssetUploadTarget, InMemoryAssetStore, type InMemoryAssetStoreOptions, } from './assets.js';
|
|
4
5
|
export { allowAllGate, bearerToken, type ControlPlaneAuthResult, type ControlPlaneIdentity, constantTimeEqual, type DeployAuthGate, GoogleControlPlaneGate, type GoogleIdTokenVerifier, NoodleOAuthControlPlaneGate, } from './auth/deploy-gate.js';
|
|
5
6
|
export { type BuildInfo, resolveBuildInfo } from './build-info.js';
|
|
7
|
+
export { COMMERCIAL_PLAN_NAMES, type CommercialPlanCatalog, type CommercialPlanName, commercialPlanPolicyId, DEFAULT_COMMERCIAL_PLAN_CATALOG, isCommercialPlanName, isCommercialPlanPolicyId, planNameForPolicy, resolveCommercialPlanCatalog, } from './commercial-plans.js';
|
|
6
8
|
export { type CustomerVerifierFactoryOptions, createCustomerVerifierFactory, createFirebaseIdTokenVerifier, } from './customer-verifier.js';
|
|
7
9
|
export { ORG_DOMAIN_TXT_LABEL, type OrgDomainVerificationResult, type TxtResolver, verifyOrgDomainDns, } from './domain-verification.js';
|
|
8
10
|
export { type EnsureFreeTierDefaultOptions, ensureFreeTierDefault, FREE_TIER_PLAN, FREE_TIER_POLICY_ID, } from './free-tier.js';
|
|
@@ -20,5 +22,5 @@ export { InMemoryControlPlaneStore } from './store/control-plane.js';
|
|
|
20
22
|
export { PostgresArtifactStore, type PostgresStoreOptions } from './store/postgres.js';
|
|
21
23
|
export { ensureStateHandleSchema, PostgresStateHandleStore, type PostgresStateHandleStoreOptions, } from './store/postgres-state-handles.js';
|
|
22
24
|
export { InMemoryUserAppLogStore, type InMemoryUserAppLogStoreOptions, type UserAppLogEvent, type UserAppLogFilter, type UserAppLogInput, type UserAppLogLevel, type UserAppLogSink, type UserAppLogStore, } from './store/user-app-logs.js';
|
|
23
|
-
export { type ArtifactStore, CONFIG_NAME_PATTERN, type ConfigScope, type ConfigStore, type ConfigValueMetadata, type ControlPlaneStore, DEPLOYMENT_ID_PATTERN, type DeploymentSummary, type DeployRecord, DOMAIN_PATTERN, InMemoryArtifactStore, InMemoryConfigStore, JsonFileArtifactStore, type ManagedConfigKind, type OrgDomainRecord, type OrgInvitationRecord, type OrgMemberRecord, type OrgRecord, type OrgRole, resolveConfigScope, type SecretEnvelope, type SignupAllowlistKind, type SignupAllowlistRecord, SLUG_PATTERN, scopeChain, type TenantAuthConfig, type TenantRef, validateConfigName, validateConfigScope, validateDomain, validateOrgRole, validateSignupAllowlistKind, validateSlug, validateTenantRef, } from './store.js';
|
|
25
|
+
export { type AppArchiveResult, type AppRestoreResult, type ArtifactStore, CONFIG_NAME_PATTERN, type ConfigScope, type ConfigStore, type ConfigValueMetadata, type ControlPlaneStore, DEPLOYMENT_ID_PATTERN, type DeploymentListFilter, type DeploymentSummary, type DeployRecord, DOMAIN_PATTERN, InMemoryArtifactStore, InMemoryConfigStore, JsonFileArtifactStore, type ManagedConfigKind, type OrgDomainRecord, type OrgInvitationRecord, type OrgMemberRecord, type OrgRecord, type OrgRole, resolveConfigScope, type SecretEnvelope, type SignupAllowlistKind, type SignupAllowlistRecord, SLUG_PATTERN, scopeChain, type TenantAuthConfig, type TenantRef, validateConfigName, validateConfigScope, validateDomain, validateOrgRole, validateSignupAllowlistKind, validateSlug, validateTenantRef, } from './store.js';
|
|
24
26
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
export { ensureAuditSchema, PostgresAuditStore } from '@noodle-borg/module-audit';
|
|
2
|
+
export { ARCHIVE_SWEEP_INTERVAL_MS, ArchiveSweeper, DEFAULT_ARCHIVE_RETENTION_DAYS, resolveArchiveRetentionDays, } from './archive-sweeper.js';
|
|
2
3
|
export { createAssetStore, resolveAssetConfig, } from './asset-config.js';
|
|
3
4
|
export { InMemoryAssetStore, } from './assets.js';
|
|
4
5
|
export { allowAllGate, bearerToken, constantTimeEqual, GoogleControlPlaneGate, NoodleOAuthControlPlaneGate, } from './auth/deploy-gate.js';
|
|
5
6
|
export { resolveBuildInfo } from './build-info.js';
|
|
7
|
+
export { COMMERCIAL_PLAN_NAMES, commercialPlanPolicyId, DEFAULT_COMMERCIAL_PLAN_CATALOG, isCommercialPlanName, isCommercialPlanPolicyId, planNameForPolicy, resolveCommercialPlanCatalog, } from './commercial-plans.js';
|
|
6
8
|
export { createCustomerVerifierFactory, createFirebaseIdTokenVerifier, } from './customer-verifier.js';
|
|
7
9
|
export { ORG_DOMAIN_TXT_LABEL, verifyOrgDomainDns, } from './domain-verification.js';
|
|
8
10
|
export { ensureFreeTierDefault, FREE_TIER_PLAN, FREE_TIER_POLICY_ID, } from './free-tier.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAClF,OAAO,EAKL,gBAAgB,EAEhB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAIL,kBAAkB,GAEnB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,YAAY,EACZ,WAAW,EAGX,iBAAiB,EAEjB,sBAAsB,EAEtB,2BAA2B,GAC5B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAkB,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAEL,6BAA6B,EAC7B,6BAA6B,GAC9B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,oBAAoB,EAGpB,kBAAkB,GACnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAEL,qBAAqB,EACrB,cAAc,EACd,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,8BAA8B,EAE9B,6BAA6B,EAC7B,wBAAwB,EAIxB,mBAAmB,EAQnB,sBAAsB,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,4BAA4B,GAE7B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAKL,cAAc,GACf,MAAM,eAAe,CAAC;AACvB,OAAO,EAEL,uBAAuB,GAExB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAuB,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EAMpB,sBAAsB,EACtB,0BAA0B,GAE3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,oBAAoB,EAQpB,kBAAkB,EAElB,SAAS,EACT,aAAa,EACb,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAA6B,MAAM,qBAAqB,CAAC;AACvF,OAAO,EACL,uBAAuB,EACvB,wBAAwB,GAEzB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,uBAAuB,GAQxB,MAAM,0BAA0B,CAAC;AAClC,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAClF,OAAO,EACL,yBAAyB,EACzB,cAAc,EAEd,8BAA8B,EAC9B,2BAA2B,GAC5B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAKL,gBAAgB,EAEhB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAIL,kBAAkB,GAEnB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,YAAY,EACZ,WAAW,EAGX,iBAAiB,EAEjB,sBAAsB,EAEtB,2BAA2B,GAC5B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAkB,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EACL,qBAAqB,EAGrB,sBAAsB,EACtB,+BAA+B,EAC/B,oBAAoB,EACpB,wBAAwB,EACxB,iBAAiB,EACjB,4BAA4B,GAC7B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAEL,6BAA6B,EAC7B,6BAA6B,GAC9B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,oBAAoB,EAGpB,kBAAkB,GACnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAEL,qBAAqB,EACrB,cAAc,EACd,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,8BAA8B,EAE9B,6BAA6B,EAC7B,wBAAwB,EAIxB,mBAAmB,EAQnB,sBAAsB,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,4BAA4B,GAE7B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAKL,cAAc,GACf,MAAM,eAAe,CAAC;AACvB,OAAO,EAEL,uBAAuB,GAExB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAuB,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EAMpB,sBAAsB,EACtB,0BAA0B,GAE3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,oBAAoB,EAQpB,kBAAkB,EAElB,SAAS,EACT,aAAa,EACb,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAA6B,MAAM,qBAAqB,CAAC;AACvF,OAAO,EACL,uBAAuB,EACvB,wBAAwB,GAEzB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,uBAAuB,GAQxB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAIL,mBAAmB,EAKnB,qBAAqB,EAIrB,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EAOrB,kBAAkB,EAIlB,YAAY,EACZ,UAAU,EAGV,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,2BAA2B,EAC3B,YAAY,EACZ,iBAAiB,GAClB,MAAM,YAAY,CAAC"}
|
|
@@ -4,6 +4,7 @@ import type { JSONWebKeySet } from 'jose';
|
|
|
4
4
|
import type { AssetStore } from './assets.js';
|
|
5
5
|
import type { ControlPlaneSignupMode, DeployAuthGate } from './auth/deploy-gate.js';
|
|
6
6
|
import type { BuildInfo } from './build-info.js';
|
|
7
|
+
import type { CommercialPlanCatalog } from './commercial-plans.js';
|
|
7
8
|
import type { LoadedServiceModule } from './modules/host.js';
|
|
8
9
|
import type { PolicyAssignmentStore, PolicyCounterStore } from './policy.js';
|
|
9
10
|
import type { AuditSink } from './store/audit.js';
|
|
@@ -32,6 +33,12 @@ export interface ServiceOptions {
|
|
|
32
33
|
readonly assetPublicBaseUrl?: string;
|
|
33
34
|
/** Optional service clock for deterministic tests around time-windowed policy and admission behavior. */
|
|
34
35
|
readonly clock?: () => Date;
|
|
36
|
+
/**
|
|
37
|
+
* Retention window for archived apps (ADR 0117): the opportunistic sweeper hard-deletes an app's
|
|
38
|
+
* deployment records + managed config this many days after it was archived, and restores past the
|
|
39
|
+
* window answer 410 Gone. Default: 30, overridable via `NOODLE_ARCHIVE_RETENTION_DAYS`.
|
|
40
|
+
*/
|
|
41
|
+
readonly archiveRetentionDays?: number;
|
|
35
42
|
/** Structured logger for deploy + request lifecycle events. Default: a no-op logger. */
|
|
36
43
|
readonly logger?: Logger;
|
|
37
44
|
/**
|
|
@@ -75,6 +82,8 @@ export interface ServiceOptions {
|
|
|
75
82
|
readonly policyCacheTtlMs?: number;
|
|
76
83
|
/** Mutable quota/rate counter plane for managed policy enforcement. */
|
|
77
84
|
readonly policyCounterStore?: PolicyCounterStore;
|
|
85
|
+
/** Override the commercial plan catalog for deterministic tests or self-hosted policy tuning. */
|
|
86
|
+
readonly commercialPlanCatalog?: CommercialPlanCatalog;
|
|
78
87
|
/**
|
|
79
88
|
* Tenant-safe developer-facing app log store (M3, [ADR 0101](../../../docs/decisions/0101-tenant-safe-user-app-logs.md)).
|
|
80
89
|
* Backs `GET /v1/orgs/{org}/apps/{app}/envs/{env}/logs` and `noodle logs`. Records are tenant-scoped and
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry state operations that work over the {@link ServerRegistry}'s private maps: the no-store
|
|
3
|
+
* in-memory activation fallback and the app archive/restore/sweep cache reconciliation (ADR 0117).
|
|
4
|
+
* The registry passes a {@link RegistryStateView} of its private fields; store-backed calls hit the
|
|
5
|
+
* durable store first, then reconcile the in-process caches so no instance keeps serving stale state.
|
|
6
|
+
*/
|
|
7
|
+
import type { ServedTarget } from '@noodle-borg/transport-http';
|
|
8
|
+
import type { AppArchiveResult, AppRestoreResult, ArtifactStore, DeployRecord, TenantRef } from './store.js';
|
|
9
|
+
export interface RegistryStateView {
|
|
10
|
+
readonly store: ArtifactStore | undefined;
|
|
11
|
+
readonly records: Map<string, DeployRecord>;
|
|
12
|
+
readonly servers: Map<string, ServedTarget>;
|
|
13
|
+
readonly activeTenants: Map<string, string>;
|
|
14
|
+
}
|
|
15
|
+
/** No-store activation fallback (moved verbatim from `ServerRegistry.#activateInMemory`). */
|
|
16
|
+
export declare function activateInMemory(records: Map<string, DeployRecord>, ref: TenantRef, deploymentId: string): {
|
|
17
|
+
readonly active: DeployRecord;
|
|
18
|
+
readonly previousActive?: DeployRecord;
|
|
19
|
+
readonly alreadyActive: boolean;
|
|
20
|
+
} | undefined;
|
|
21
|
+
export declare function registryAppArchivedAt(state: RegistryStateView, org: string, app: string): Promise<string | undefined>;
|
|
22
|
+
export declare function registryArchiveApp(state: RegistryStateView, org: string, app: string, at: string): Promise<AppArchiveResult | undefined>;
|
|
23
|
+
export declare function registryRestoreApp(state: RegistryStateView, org: string, app: string): Promise<AppRestoreResult | undefined>;
|
|
24
|
+
export declare function registrySweepArchived(state: RegistryStateView, before: string): Promise<readonly DeployRecord[]>;
|
|
25
|
+
//# sourceMappingURL=registry-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-state.d.ts","sourceRoot":"","sources":["../src/registry-state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAShE,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,SAAS,EACV,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC5C,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC5C,QAAQ,CAAC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7C;AAED,6FAA6F;AAC7F,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EAClC,GAAG,EAAE,SAAS,EACd,YAAY,EAAE,MAAM,GAElB;IACE,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,cAAc,CAAC,EAAE,YAAY,CAAC;IACvC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;CACjC,GACD,SAAS,CAyBZ;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,iBAAiB,EACxB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAK7B;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,iBAAiB,EACxB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAYvC;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,iBAAiB,EACxB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAYvC;AAED,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC,CAgBlC"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { recordMatchesTenant } from './registry-targets.js';
|
|
2
|
+
import { appArchivedAt, planAppArchive, planAppRestore, withoutArchiveStamp, } from './store/records.js';
|
|
3
|
+
import { validateSlug } from './store/validate.js';
|
|
4
|
+
/** No-store activation fallback (moved verbatim from `ServerRegistry.#activateInMemory`). */
|
|
5
|
+
export function activateInMemory(records, ref, deploymentId) {
|
|
6
|
+
const target = records.get(deploymentId);
|
|
7
|
+
if (target === undefined || !recordMatchesTenant(target, ref))
|
|
8
|
+
return undefined;
|
|
9
|
+
const previousActive = [...records.values()]
|
|
10
|
+
.filter((record) => record.active && recordMatchesTenant(record, ref))
|
|
11
|
+
.filter((record) => record.serverVersion === target.serverVersion)
|
|
12
|
+
.sort((a, b) => b.deploymentVersion - a.deploymentVersion)[0];
|
|
13
|
+
const alreadyActive = previousActive?.deploymentId === deploymentId;
|
|
14
|
+
if (!alreadyActive) {
|
|
15
|
+
for (const [id, record] of records) {
|
|
16
|
+
if (record.active &&
|
|
17
|
+
recordMatchesTenant(record, ref) &&
|
|
18
|
+
record.serverVersion === target.serverVersion) {
|
|
19
|
+
records.set(id, { ...record, active: false });
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
records.set(deploymentId, { ...target, active: true });
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
active: { ...target, active: true },
|
|
26
|
+
...(previousActive !== undefined ? { previousActive } : {}),
|
|
27
|
+
alreadyActive,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export function registryAppArchivedAt(state, org, app) {
|
|
31
|
+
const safeOrg = validateSlug('org', org);
|
|
32
|
+
const safeApp = validateSlug('app', app);
|
|
33
|
+
if (state.store !== undefined)
|
|
34
|
+
return state.store.getAppArchivedAt(safeOrg, safeApp);
|
|
35
|
+
return Promise.resolve(appArchivedAt(appRecordsFromMap(state.records, safeOrg, safeApp)));
|
|
36
|
+
}
|
|
37
|
+
export async function registryArchiveApp(state, org, app, at) {
|
|
38
|
+
const safeOrg = validateSlug('org', org);
|
|
39
|
+
const safeApp = validateSlug('app', app);
|
|
40
|
+
if (state.store !== undefined) {
|
|
41
|
+
const result = await state.store.archiveApp(safeOrg, safeApp, at);
|
|
42
|
+
if (result !== undefined)
|
|
43
|
+
evictArchivedApp(state, safeOrg, safeApp, result.archivedAt);
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
const plan = planAppArchive(appRecordsFromMap(state.records, safeOrg, safeApp), at);
|
|
47
|
+
if (plan === undefined)
|
|
48
|
+
return undefined;
|
|
49
|
+
evictArchivedApp(state, safeOrg, safeApp, plan.result.archivedAt);
|
|
50
|
+
return plan.result;
|
|
51
|
+
}
|
|
52
|
+
export async function registryRestoreApp(state, org, app) {
|
|
53
|
+
const safeOrg = validateSlug('org', org);
|
|
54
|
+
const safeApp = validateSlug('app', app);
|
|
55
|
+
if (state.store !== undefined) {
|
|
56
|
+
const result = await state.store.restoreApp(safeOrg, safeApp);
|
|
57
|
+
if (result !== undefined)
|
|
58
|
+
clearCachedArchiveStamps(state, safeOrg, safeApp);
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
const plan = planAppRestore(appRecordsFromMap(state.records, safeOrg, safeApp));
|
|
62
|
+
if (plan === undefined)
|
|
63
|
+
return undefined;
|
|
64
|
+
clearCachedArchiveStamps(state, safeOrg, safeApp);
|
|
65
|
+
return plan.result;
|
|
66
|
+
}
|
|
67
|
+
export async function registrySweepArchived(state, before) {
|
|
68
|
+
let deleted;
|
|
69
|
+
if (state.store !== undefined) {
|
|
70
|
+
deleted = await state.store.sweepArchived(before);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
deleted = [...state.records.values()].filter((record) => record.archivedAt !== undefined && record.archivedAt < before);
|
|
74
|
+
}
|
|
75
|
+
const ids = new Set(deleted.map((record) => record.deploymentId));
|
|
76
|
+
for (const id of ids) {
|
|
77
|
+
state.records.delete(id);
|
|
78
|
+
state.servers.delete(id);
|
|
79
|
+
}
|
|
80
|
+
purgeActiveTenantEntries(state, ids);
|
|
81
|
+
return deleted;
|
|
82
|
+
}
|
|
83
|
+
function appRecordsFromMap(records, org, app) {
|
|
84
|
+
return [...records.values()].filter((record) => record.orgSlug === org && record.appSlug === app);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Stamp cached records and drop the app's active-tenant pointers so this instance stops serving
|
|
88
|
+
* immediately (`ServerRegistry.get` fails closed on a stamped record). With a durable store the
|
|
89
|
+
* compiled servers are also dropped — a restore recompiles lazily from the store. Without a store
|
|
90
|
+
* the compiled servers are the only copy, so they stay cached (blocked by the record stamp) and
|
|
91
|
+
* restore resumes serving instantly. Records already stamped keep their original stamp.
|
|
92
|
+
*/
|
|
93
|
+
function evictArchivedApp(state, org, app, archivedAt) {
|
|
94
|
+
const ids = new Set();
|
|
95
|
+
for (const [id, record] of state.records) {
|
|
96
|
+
if (record.orgSlug !== org || record.appSlug !== app)
|
|
97
|
+
continue;
|
|
98
|
+
ids.add(id);
|
|
99
|
+
if (record.archivedAt === undefined)
|
|
100
|
+
state.records.set(id, { ...record, archivedAt });
|
|
101
|
+
if (state.store !== undefined)
|
|
102
|
+
state.servers.delete(id);
|
|
103
|
+
}
|
|
104
|
+
purgeActiveTenantEntries(state, ids);
|
|
105
|
+
}
|
|
106
|
+
function clearCachedArchiveStamps(state, org, app) {
|
|
107
|
+
for (const [id, record] of state.records) {
|
|
108
|
+
if (record.orgSlug === org && record.appSlug === app && record.archivedAt !== undefined) {
|
|
109
|
+
state.records.set(id, withoutArchiveStamp(record));
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
function purgeActiveTenantEntries(state, ids) {
|
|
114
|
+
for (const [key, id] of state.activeTenants) {
|
|
115
|
+
if (ids.has(id))
|
|
116
|
+
state.activeTenants.delete(key);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=registry-state.js.map
|