@usine/engine 0.5.1-next.276.g9af38cb → 0.5.1-next.278.g7bf348a

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/README.md CHANGED
@@ -182,3 +182,7 @@ pnpm --filter @usine/engine db:generate --name <migration_name>
182
182
  `TranscriptWorkerQuery` returns an attempt's latest `WorkerUnresponsive` or `WorkerResponsive` notice. Later session output does not hide the notice, and recovery replaces the outage in this query.
183
183
 
184
184
  `prune(current)` deletes acknowledgements whose ID and revision don't match any of the supplied current entries. Pass the complete list, including dismissed entries; an empty list clears all acknowledgements. Pruning preserves matching records and invalidates projections only when it deletes rows.
185
+
186
+ ## Project migration
187
+
188
+ `migrateProjectLoops` from `/database` accepts repository-to-project assignments and migrates stored loop references before the engine starts. The caller runs it in the configuration transaction. It preserves run and event IDs, deduplication, suppression, pause state, cycle budgets, and attention acknowledgements. Repeating the migration leaves qualified identities unchanged. The implementation uses the supplied `SqlClient` and requires no Node adapter.
@@ -11,5 +11,5 @@ declare const RunDatabase_base: Context.ServiceClass<RunDatabase, "@usine/engine
11
11
  export declare class RunDatabase extends RunDatabase_base {
12
12
  static readonly layer: (database: RunDatabaseClient) => Layer.Layer<RunDatabase, never, never>;
13
13
  }
14
- export {};
14
+ export { RepositoryProject, migrateProjectLoops } from "./project-migration.ts";
15
15
  //# sourceMappingURL=database.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/database/database.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC3F,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAExC,UAAU,iBAAkB,SAAQ,kBAAkB;IACpD,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,uBAAuB,CAAC;CACzC;AAED,sFAAsF;AACtF,MAAM,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;;AAEjF,qBAAa,WAAY,SAAQ,gBAEhC;IACC,MAAM,CAAC,QAAQ,CAAC,KAAK,aAAc,iBAAiB,4CAA0C;CAC/F"}
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/database/database.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC3F,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAExC,UAAU,iBAAkB,SAAQ,kBAAkB;IACpD,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,uBAAuB,CAAC;CACzC;AAED,sFAAsF;AACtF,MAAM,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;;AAEjF,qBAAa,WAAY,SAAQ,gBAEhC;IACC,MAAM,CAAC,QAAQ,CAAC,KAAK,aAAc,iBAAiB,4CAA0C;CAC/F;AAED,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -2,4 +2,5 @@ import { Context, Layer } from "effect";
2
2
  export class RunDatabase extends Context.Service()("@usine/engine/internal/RunDatabase") {
3
3
  static layer = (database) => Layer.succeed(RunDatabase)(database);
4
4
  }
5
+ export { RepositoryProject, migrateProjectLoops } from "./project-migration.js";
5
6
  //# sourceMappingURL=database.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/database/database.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAUxC,MAAM,OAAO,WAAY,SAAQ,OAAO,CAAC,OAAO,EAAkC,CAChF,oCAAoC,CACrC;IACC,MAAM,CAAU,KAAK,GAAG,CAAC,QAA2B,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC;CAC/F"}
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/database/database.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAUxC,MAAM,OAAO,WAAY,SAAQ,OAAO,CAAC,OAAO,EAAkC,CAChF,oCAAoC,CACrC;IACC,MAAM,CAAU,KAAK,GAAG,CAAC,QAA2B,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC;CAC/F;AAED,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { Effect, Schema } from "effect";
2
+ import { SqlClient } from "effect/sql";
3
+ import { EnginePersistenceError } from "../engine/error.ts";
4
+ declare const RepositoryProject_base: Schema.Class<RepositoryProject, Schema.Struct<{
5
+ readonly repository: Schema.brand<Schema.String, "RepositoryName">;
6
+ readonly project: Schema.brand<Schema.String, "ProjectId">;
7
+ /** Qualified identities of the project's authored loops. */
8
+ readonly loops: Schema.$Array<Schema.brand<Schema.NonEmptyString, "LoopName">>;
9
+ }>, {}>;
10
+ export declare class RepositoryProject extends RepositoryProject_base {
11
+ }
12
+ /** Runs inside the caller's configuration transaction, before the engine starts. */
13
+ export declare const migrateProjectLoops: (projects: readonly RepositoryProject[]) => Effect.Effect<void, EnginePersistenceError, SqlClient.SqlClient>;
14
+ export {};
15
+ //# sourceMappingURL=project-migration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-migration.d.ts","sourceRoot":"","sources":["../../src/database/project-migration.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,MAAM,EAAqB,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;;;;IAK1D,4DAA4D;;;AAH9D,qBAAa,iBAAkB,SAAQ,sBAKrC;CAAG;AAyBL,oFAAoF;AACpF,eAAO,MAAM,mBAAmB,8GAsH/B,CAAC"}
@@ -0,0 +1,134 @@
1
+ import { getTableName } from "drizzle-orm";
2
+ import { loopItems, events, triggerEvents, cycleReservations, itemCycleBudgets, runs, loopRuntime, cycleAskClosures, attentionAcknowledgements, } from "./schema.js";
3
+ import { ProjectId } from "@usine/core/project";
4
+ import { LoopName } from "@usine/core/loop";
5
+ import { RepositoryName } from "@usine/core/repository";
6
+ import { Effect, Option, Predicate, Schema } from "effect";
7
+ import { SqlClient } from "effect/sql";
8
+ import { EnginePersistenceError } from "../engine/error.js";
9
+ export class RepositoryProject extends Schema.Class("RepositoryProject")({
10
+ repository: RepositoryName,
11
+ project: ProjectId,
12
+ /** Qualified identities of the project's authored loops. */
13
+ loops: Schema.Array(LoopName),
14
+ }) {
15
+ }
16
+ const Json = Schema.fromJsonString(Schema.Json);
17
+ const isJsonObject = (value) => Predicate.isObject(value);
18
+ const qualifyJson = (value, project, namespaces) => {
19
+ if (Array.isArray(value))
20
+ return value.map((entry) => qualifyJson(entry, project, namespaces));
21
+ if (!isJsonObject(value))
22
+ return value;
23
+ const owner = Predicate.isString(value.repository)
24
+ ? (namespaces.get(value.repository.toLowerCase()) ?? project)
25
+ : project;
26
+ return Object.fromEntries(Object.entries(value).map(([key, entry]) => [
27
+ key,
28
+ key === "loop" && Predicate.isString(entry) && !entry.includes("/")
29
+ ? `${owner}/${entry}`
30
+ : qualifyJson(entry, owner, namespaces),
31
+ ]));
32
+ };
33
+ /** Runs inside the caller's configuration transaction, before the engine starts. */
34
+ export const migrateProjectLoops = Effect.fn("RunDatabase.migrateProjectLoops")(function* (projects) {
35
+ const sql = yield* SqlClient.SqlClient;
36
+ const namespaces = new Map(projects.map(({ repository, project }) => [repository.toLowerCase(), project]));
37
+ yield* Effect.annotateCurrentSpan({
38
+ repositories: projects.map(({ repository }) => repository),
39
+ });
40
+ for (const { repository, project, loops } of projects) {
41
+ // Item identities keep their repository, including schedule items without a number.
42
+ yield* sql `UPDATE ${sql(getTableName(loopItems))} SET loop_name = ${project} || '/' || loop_name
43
+ WHERE instr(loop_name, '/') = 0 AND (item_key IN
44
+ (SELECT item_key FROM ${sql(getTableName(triggerEvents))} WHERE lower(repository) = lower(${repository}))
45
+ OR CASE WHEN json_valid(item_key) THEN lower(json_extract(item_key, '$[1]')) = lower(${repository}) ELSE 0 END)`;
46
+ yield* sql `UPDATE ${sql(getTableName(events))} AS event SET dedup_key = json_set(event.dedup_key, '$[0]', ${project} || '/' || json_extract(event.dedup_key, '$[0]'))
47
+ WHERE json_valid(event.dedup_key) AND EXISTS (
48
+ SELECT 1 FROM ${sql(getTableName(triggerEvents))} AS trigger
49
+ WHERE trigger.event_id = event.event_id AND lower(trigger.repository) = lower(${repository})
50
+ AND instr(trigger.loop_name, '/') = 0 AND json_extract(event.dedup_key, '$[0]') = trigger.loop_name)`;
51
+ yield* sql `UPDATE ${sql(getTableName(cycleReservations))} SET loop = ${project} || '/' || loop
52
+ WHERE instr(loop, '/') = 0 AND item_key IN
53
+ (SELECT item_key FROM ${sql(getTableName(itemCycleBudgets))} WHERE lower(repository) = lower(${repository}))`;
54
+ yield* sql `UPDATE ${sql(getTableName(triggerEvents))} SET loop_name = ${project} || '/' || loop_name
55
+ WHERE lower(repository) = lower(${repository}) AND instr(loop_name, '/') = 0`;
56
+ yield* sql `UPDATE ${sql(getTableName(runs))} SET loop_name = ${project} || '/' || loop_name
57
+ WHERE lower(repository) = lower(${repository}) AND instr(loop_name, '/') = 0`;
58
+ if (loops.length > 0) {
59
+ yield* sql `INSERT INTO ${sql(getTableName(loopRuntime))} (loop_name, paused)
60
+ SELECT ${project} || '/' || loop_name, paused FROM ${sql(getTableName(loopRuntime))}
61
+ WHERE instr(loop_name, '/') = 0 AND ${sql.in("loop_name", loops.map((loop) => loop.slice(project.length + 1)))}
62
+ ON CONFLICT(loop_name) DO UPDATE SET paused = excluded.paused`;
63
+ }
64
+ const asks = yield* sql `SELECT item_key AS key, ask_json AS value FROM ${sql(getTableName(itemCycleBudgets))}
65
+ WHERE lower(repository) = lower(${repository}) AND ask_json IS NOT NULL`;
66
+ for (const row of asks) {
67
+ const decoded = yield* Schema.decodeUnknownEffect(Schema.Struct({ key: Schema.String, value: Json }))(row);
68
+ yield* sql `UPDATE ${sql(getTableName(itemCycleBudgets))} SET ask_json = ${JSON.stringify(qualifyJson(decoded.value, project, namespaces))} WHERE item_key = ${decoded.key}`;
69
+ }
70
+ const closed = yield* sql `SELECT ask_id AS key, ask_json AS value FROM ${sql(getTableName(cycleAskClosures))}
71
+ WHERE lower(json_extract(ask_json, '$.repository')) = lower(${repository})`;
72
+ for (const row of closed) {
73
+ const decoded = yield* Schema.decodeUnknownEffect(Schema.Struct({ key: Schema.String, value: Json }))(row);
74
+ yield* sql `UPDATE ${sql(getTableName(cycleAskClosures))} SET ask_json = ${JSON.stringify(qualifyJson(decoded.value, project, namespaces))} WHERE ask_id = ${decoded.key}`;
75
+ }
76
+ }
77
+ const acknowledgements = yield* sql `SELECT id, revision, dismissed_by, dismissed_at FROM ${sql(getTableName(attentionAcknowledgements))}`;
78
+ for (const row of acknowledgements) {
79
+ const saved = yield* Schema.decodeUnknownEffect(Schema.Struct({
80
+ id: Schema.String,
81
+ revision: Schema.String,
82
+ dismissed_by: Schema.NullOr(Schema.String),
83
+ dismissed_at: Schema.String,
84
+ }))(row);
85
+ const decoded = Schema.decodeUnknownOption(Json)(saved.revision);
86
+ if (Option.isNone(decoded)) {
87
+ yield* Effect.logDebug("Preserved opaque attention revision during project migration", {
88
+ id: saved.id,
89
+ });
90
+ continue;
91
+ }
92
+ const value = decoded.value;
93
+ const references = new Set();
94
+ const collectRepositories = (entry) => {
95
+ if (Array.isArray(entry)) {
96
+ entry.forEach(collectRepositories);
97
+ return;
98
+ }
99
+ if (!isJsonObject(entry))
100
+ return;
101
+ for (const [key, child] of Object.entries(entry)) {
102
+ if (key === "repository" && Predicate.isString(child))
103
+ references.add(child.toLowerCase());
104
+ else
105
+ collectRepositories(child);
106
+ }
107
+ };
108
+ collectRepositories(value);
109
+ const applicable = projects.filter(({ repository }) => references.size === 0 || references.has(repository.toLowerCase()));
110
+ for (const { project } of applicable) {
111
+ let updated = qualifyJson(value, project, namespaces);
112
+ let id = saved.id;
113
+ if (id.startsWith("schedule-failure:")) {
114
+ const parts = yield* Schema.decodeUnknownEffect(Schema.fromJsonString(Schema.Array(Schema.Json)))(id.slice("schedule-failure:".length));
115
+ if (Predicate.isString(parts[0]) && !parts[0].includes("/")) {
116
+ id = `schedule-failure:${JSON.stringify([`${project}/${parts[0]}`, ...parts.slice(1)])}`;
117
+ if (isJsonObject(updated))
118
+ updated = { ...updated, id };
119
+ }
120
+ }
121
+ const revision = JSON.stringify(updated);
122
+ if (revision === saved.revision && id === saved.id)
123
+ continue;
124
+ yield* sql `INSERT INTO ${sql(getTableName(attentionAcknowledgements))} (id, revision, dismissed_by, dismissed_at)
125
+ VALUES (${id}, ${revision}, ${saved.dismissed_by}, ${saved.dismissed_at}) ON CONFLICT DO NOTHING`;
126
+ yield* sql `DELETE FROM ${sql(getTableName(attentionAcknowledgements))} WHERE id = ${saved.id} AND revision = ${saved.revision}`;
127
+ }
128
+ }
129
+ yield* sql `DELETE FROM ${sql(getTableName(loopRuntime))} WHERE instr(loop_name, '/') = 0`;
130
+ yield* Effect.logInfo("Migrated runtime loop identities to projects", {
131
+ repositories: projects.length,
132
+ });
133
+ }, Effect.mapError((cause) => new EnginePersistenceError({ operation: "migrate project loop identities", cause })));
134
+ //# sourceMappingURL=project-migration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-migration.js","sourceRoot":"","sources":["../../src/database/project-migration.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@usine/engine",
3
- "version": "0.5.1-next.276.g9af38cb",
3
+ "version": "0.5.1-next.278.g7bf348a",
4
4
  "description": "The usine run engine: event ledger, dedup/supersede/revoke, run scheduling and restart recovery, SQLite store.",
5
5
  "license": "AGPL-3.0-only",
6
6
  "repository": {
@@ -81,7 +81,7 @@
81
81
  "@effect/platform-node-shared": "4.0.6",
82
82
  "@effect/sql-sqlite-node": "4.0.6",
83
83
  "drizzle-orm": "1.0.0-rc.5",
84
- "@usine/core": "0.5.1-next.276.g9af38cb"
84
+ "@usine/core": "0.5.1-next.278.g7bf348a"
85
85
  },
86
86
  "devDependencies": {
87
87
  "@effect/vitest": "4.0.6",