@usine/engine 0.0.1 → 0.1.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 (96) hide show
  1. package/README.md +66 -2
  2. package/dist/cursor/model.d.ts +5 -0
  3. package/dist/cursor/model.d.ts.map +1 -0
  4. package/dist/cursor/model.js +4 -0
  5. package/dist/cursor/model.js.map +1 -0
  6. package/dist/cursor/store.d.ts +18 -0
  7. package/dist/cursor/store.d.ts.map +1 -0
  8. package/dist/cursor/store.js +54 -0
  9. package/dist/cursor/store.js.map +1 -0
  10. package/dist/database/database.d.ts +15 -0
  11. package/dist/database/database.d.ts.map +1 -0
  12. package/dist/database/database.js +5 -0
  13. package/dist/database/database.js.map +1 -0
  14. package/dist/database/local-sqlite.d.ts +17 -0
  15. package/dist/database/local-sqlite.d.ts.map +1 -0
  16. package/dist/database/local-sqlite.js +45 -0
  17. package/dist/database/local-sqlite.js.map +1 -0
  18. package/dist/database/schema.d.ts +1096 -0
  19. package/dist/database/schema.d.ts.map +1 -0
  20. package/dist/database/schema.js +171 -0
  21. package/dist/database/schema.js.map +1 -0
  22. package/dist/engine.d.ts +39 -0
  23. package/dist/engine.d.ts.map +1 -0
  24. package/dist/engine.js +179 -0
  25. package/dist/engine.js.map +1 -0
  26. package/dist/index.d.ts +16 -4
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +16 -4
  29. package/dist/index.js.map +1 -1
  30. package/dist/item-projection/model.d.ts +21 -0
  31. package/dist/item-projection/model.d.ts.map +1 -0
  32. package/dist/item-projection/model.js +16 -0
  33. package/dist/item-projection/model.js.map +1 -0
  34. package/dist/item-projection/service.d.ts +25 -0
  35. package/dist/item-projection/service.d.ts.map +1 -0
  36. package/dist/item-projection/service.js +98 -0
  37. package/dist/item-projection/service.js.map +1 -0
  38. package/dist/loop-control.d.ts +16 -0
  39. package/dist/loop-control.d.ts.map +1 -0
  40. package/dist/loop-control.js +69 -0
  41. package/dist/loop-control.js.map +1 -0
  42. package/dist/model.d.ts +185 -0
  43. package/dist/model.d.ts.map +1 -0
  44. package/dist/model.js +174 -0
  45. package/dist/model.js.map +1 -0
  46. package/dist/repository-label-projection/model.d.ts +10 -0
  47. package/dist/repository-label-projection/model.d.ts.map +1 -0
  48. package/dist/repository-label-projection/model.js +11 -0
  49. package/dist/repository-label-projection/model.js.map +1 -0
  50. package/dist/repository-label-projection/service.d.ts +20 -0
  51. package/dist/repository-label-projection/service.d.ts.map +1 -0
  52. package/dist/repository-label-projection/service.js +73 -0
  53. package/dist/repository-label-projection/service.js.map +1 -0
  54. package/dist/run-reader.d.ts +20 -0
  55. package/dist/run-reader.d.ts.map +1 -0
  56. package/dist/run-reader.js +19 -0
  57. package/dist/run-reader.js.map +1 -0
  58. package/dist/step-executor.d.ts +21 -0
  59. package/dist/step-executor.d.ts.map +1 -0
  60. package/dist/step-executor.js +8 -0
  61. package/dist/step-executor.js.map +1 -0
  62. package/dist/store/codec.d.ts +431 -0
  63. package/dist/store/codec.d.ts.map +1 -0
  64. package/dist/store/codec.js +140 -0
  65. package/dist/store/codec.js.map +1 -0
  66. package/dist/store/queries.d.ts +75 -0
  67. package/dist/store/queries.d.ts.map +1 -0
  68. package/dist/store/queries.js +508 -0
  69. package/dist/store/queries.js.map +1 -0
  70. package/dist/store/store.d.ts +83 -0
  71. package/dist/store/store.d.ts.map +1 -0
  72. package/dist/store/store.js +374 -0
  73. package/dist/store/store.js.map +1 -0
  74. package/dist/workflow.d.ts +14 -0
  75. package/dist/workflow.d.ts.map +1 -0
  76. package/dist/workflow.js +105 -0
  77. package/dist/workflow.js.map +1 -0
  78. package/drizzle/20260825055549_initial_runtime/migration.sql +73 -0
  79. package/drizzle/20260825055549_initial_runtime/snapshot.json +592 -0
  80. package/drizzle/20260830191125_polling_cursors/migration.sql +5 -0
  81. package/drizzle/20260830191125_polling_cursors/snapshot.json +629 -0
  82. package/drizzle/20260831073158_attempt_channel/migration.sql +36 -0
  83. package/drizzle/20260831073158_attempt_channel/snapshot.json +845 -0
  84. package/drizzle/20260831133534_agent_context/migration.sql +49 -0
  85. package/drizzle/20260831133534_agent_context/snapshot.json +897 -0
  86. package/drizzle/20260831134612_attempt_brain/migration.sql +26 -0
  87. package/drizzle/20260831134612_attempt_brain/snapshot.json +923 -0
  88. package/drizzle/20260831194605_loop_runtime/migration.sql +4 -0
  89. package/drizzle/20260831194605_loop_runtime/snapshot.json +954 -0
  90. package/drizzle/20260901073233_projection_revision/migration.sql +55 -0
  91. package/drizzle/20260901073233_projection_revision/snapshot.json +991 -0
  92. package/drizzle/20260901180433_item_projections/migration.sql +22 -0
  93. package/drizzle/20260901180433_item_projections/snapshot.json +1110 -0
  94. package/drizzle/20260901185146_repository_label_projections/migration.sql +17 -0
  95. package/drizzle/20260901185146_repository_label_projections/snapshot.json +1147 -0
  96. package/package.json +21 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/database/schema.ts"],"names":[],"mappings":"AAgCA,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EASlB,CAAC;AAEF,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyBzB,CAAC;AAEF,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwBhB,CAAC;AAEF,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiBjB,CAAC;AAEF,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6BpB,CAAC;AAEF,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2B9B,CAAC;AAEF,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUpB,CAAC;AAEH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYzB,CAAC;AAEF,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgB5B,CAAC;AAEF,yEAAyE;AACzE,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAOnB,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgB3B,CAAC;AAEF,wEAAwE;AACxE,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYtC,CAAC;AAEF,iGAAiG;AACjG,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGtB,CAAC;AAEH,oEAAoE;AACpE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAO9B,CAAC"}
@@ -0,0 +1,171 @@
1
+ import { Agent, Attempt, AttemptChannel, Event, Item, Loop, Repository, Run, Step, Worker, } from "@usine/core";
2
+ import { sql } from "drizzle-orm";
3
+ import { check, foreignKey, index, integer, primaryKey, snakeCase, text, uniqueIndex, } from "drizzle-orm/sqlite-core";
4
+ import { APPROVAL_REQUIREMENTS, IGNORED_REASONS, WORKFLOW_COMMANDS, } from "../model.js";
5
+ export const events = snakeCase.table("usine_events", {
6
+ eventId: text().$type().primaryKey(),
7
+ dedupKey: text().$type().notNull().unique(),
8
+ payloadJson: text({ mode: "json" }).$type().notNull(),
9
+ receivedAt: text().notNull(),
10
+ }, (table) => [check("usine_events_payload_json_valid", sql `json_valid(${table.payloadJson})`)]);
11
+ export const triggerEvents = snakeCase.table("usine_trigger_events", {
12
+ eventId: text()
13
+ .$type()
14
+ .primaryKey()
15
+ .references(() => events.eventId),
16
+ itemKey: text().$type().notNull(),
17
+ loopName: text().$type().notNull(),
18
+ stepName: text().$type().notNull(),
19
+ approval: text({ enum: APPROVAL_REQUIREMENTS }).$type().notNull(),
20
+ // The submitted execution context, part of the immutable Event fact. A
21
+ // queued Event (blocked behind a running Run) is claimed later from these
22
+ // columns; the Run's own copy below is what execution reads.
23
+ repository: text().$type().notNull(),
24
+ revision: text().$type().notNull(),
25
+ task: text().$type().notNull(),
26
+ agentJson: text({ mode: "json" }).$type().notNull(),
27
+ parentModel: text().$type(),
28
+ }, (table) => [
29
+ check("usine_trigger_events_approval", sql `${table.approval} in ('none', 'required')`),
30
+ check("usine_trigger_events_agent_json_valid", sql `json_valid(${table.agentJson})`),
31
+ index("usine_trigger_events_item").on(table.loopName, table.itemKey),
32
+ ]);
33
+ export const runs = snakeCase.table("usine_runs", {
34
+ runId: text().$type().primaryKey(),
35
+ eventId: text()
36
+ .$type()
37
+ .notNull()
38
+ .unique()
39
+ .references(() => triggerEvents.eventId),
40
+ loopName: text().$type().notNull(),
41
+ stateJson: text({ mode: "json" }).$type().notNull(),
42
+ openedAt: text().notNull(),
43
+ // The Run's *effective* context, seeded from the claiming submission.
44
+ // ADR 0018's edit-and-retry amends these; the Event columns never change.
45
+ repository: text().$type().notNull(),
46
+ revision: text().$type().notNull(),
47
+ task: text().$type().notNull(),
48
+ agentJson: text({ mode: "json" }).$type().notNull(),
49
+ parentModel: text().$type(),
50
+ }, (table) => [
51
+ check("usine_runs_state_json_valid", sql `json_valid(${table.stateJson})`),
52
+ check("usine_runs_agent_json_valid", sql `json_valid(${table.agentJson})`),
53
+ ]);
54
+ export const steps = snakeCase.table("usine_steps", {
55
+ runId: text()
56
+ .$type()
57
+ .notNull()
58
+ .references(() => runs.runId),
59
+ stepName: text().$type().notNull(),
60
+ result: text({ mode: "json" }).$type(),
61
+ }, (table) => [
62
+ primaryKey({ columns: [table.runId, table.stepName] }),
63
+ check("usine_steps_result_json_valid", sql `${table.result} is null or json_valid(${table.result})`),
64
+ ]);
65
+ export const attempts = snakeCase.table("usine_attempts", {
66
+ attemptId: text().$type().primaryKey(),
67
+ runId: text().$type().notNull(),
68
+ stepName: text().$type().notNull(),
69
+ workerName: text().$type().notNull(),
70
+ attemptNumber: integer({ mode: "number" }).$type().notNull(),
71
+ brainJson: text({ mode: "json" }).$type().notNull(),
72
+ parentModel: text().$type(),
73
+ startedAt: text().notNull(),
74
+ outcomeJson: text({ mode: "json" }).$type(),
75
+ }, (table) => [
76
+ check("usine_attempts_number", sql `${table.attemptNumber} >= 1`),
77
+ check("usine_attempts_brain_json_valid", sql `json_valid(${table.brainJson})`),
78
+ check("usine_attempts_outcome_json_valid", sql `${table.outcomeJson} is null or json_valid(${table.outcomeJson})`),
79
+ uniqueIndex("usine_attempt_number").on(table.runId, table.stepName, table.attemptNumber),
80
+ uniqueIndex("usine_one_in_flight_attempt")
81
+ .on(table.runId)
82
+ .where(sql `${table.outcomeJson} is null`),
83
+ foreignKey({
84
+ columns: [table.runId, table.stepName],
85
+ foreignColumns: [steps.runId, steps.stepName],
86
+ }),
87
+ ]);
88
+ export const attemptTranscripts = snakeCase.table("usine_attempt_transcripts", {
89
+ sequence: integer({ mode: "number" }).primaryKey({ autoIncrement: true }),
90
+ attemptId: text()
91
+ .$type()
92
+ .notNull()
93
+ .references(() => attempts.attemptId),
94
+ direction: text({ enum: AttemptChannel.DIRECTIONS }).notNull(),
95
+ channelSequence: integer({ mode: "number" }).$type().notNull(),
96
+ envelope: text({ mode: "json" }).$type().notNull(),
97
+ receivedAt: text().notNull(),
98
+ }, (table) => [
99
+ check("usine_attempt_transcripts_direction", sql `${table.direction} in ('inbound', 'outbound')`),
100
+ check("usine_attempt_transcripts_sequence", sql `${table.channelSequence} >= 1`),
101
+ check("usine_attempt_transcripts_envelope_json_valid", sql `json_valid(${table.envelope})`),
102
+ uniqueIndex("usine_attempt_transcript_envelope").on(table.attemptId, table.direction, table.channelSequence),
103
+ index("usine_attempt_transcript_tail").on(table.attemptId, table.sequence),
104
+ ]);
105
+ export const approvals = snakeCase.table("usine_approvals", {
106
+ runId: text()
107
+ .$type()
108
+ .primaryKey()
109
+ .references(() => runs.runId),
110
+ eventId: text()
111
+ .$type()
112
+ .notNull()
113
+ .unique()
114
+ .references(() => events.eventId),
115
+ });
116
+ export const ignoredEvents = snakeCase.table("usine_ignored_events", {
117
+ eventId: text()
118
+ .$type()
119
+ .primaryKey()
120
+ .references(() => triggerEvents.eventId),
121
+ reason: text({ enum: IGNORED_REASONS }).$type().notNull(),
122
+ }, (table) => [
123
+ check("usine_ignored_events_reason", sql `${table.reason} in ('superseded', 'revoked')`),
124
+ ]);
125
+ export const workflowCommands = snakeCase.table("usine_workflow_commands", {
126
+ runId: text()
127
+ .$type()
128
+ .notNull()
129
+ .references(() => runs.runId),
130
+ command: text({ enum: WORKFLOW_COMMANDS }).$type().notNull(),
131
+ }, (table) => [
132
+ check("usine_workflow_commands_command", sql `${table.command} in ('Approve', 'Continue', 'Interrupt', 'Resume')`),
133
+ primaryKey({ columns: [table.runId, table.command] }),
134
+ ]);
135
+ /** Opaque, owner-validated cursors for efficiency-only trigger state. */
136
+ export const cursors = snakeCase.table("usine_cursors", {
137
+ cursorKey: text().primaryKey(),
138
+ valueJson: text({ mode: "json" }).$type().notNull(),
139
+ }, (table) => [check("usine_cursors_value_json_valid", sql `json_valid(${table.valueJson})`)]);
140
+ /** Latest trigger-owned payload for each Item, projected for operator reads. */
141
+ export const itemProjections = snakeCase.table("usine_item_projections", {
142
+ itemKey: text().$type().primaryKey(),
143
+ repository: text().$type().notNull(),
144
+ source: text().notNull(),
145
+ itemNumber: integer({ mode: "number" }).notNull(),
146
+ contentHash: text().notNull(),
147
+ payloadJson: text({ mode: "json" }).$type().notNull(),
148
+ }, (table) => [
149
+ check("usine_item_projections_number", sql `${table.itemNumber} >= 1`),
150
+ check("usine_item_projections_payload_json_valid", sql `json_valid(${table.payloadJson})`),
151
+ uniqueIndex("usine_item_projection_number").on(table.repository, table.itemNumber),
152
+ index("usine_item_projection_repository").on(table.repository, table.itemNumber),
153
+ ]);
154
+ /** Latest complete GitHub label catalog for each managed repository. */
155
+ export const repositoryLabelProjections = snakeCase.table("usine_repository_label_projections", {
156
+ repository: text().$type().primaryKey(),
157
+ labelsJson: text({ mode: "json" }).$type().notNull(),
158
+ }, (table) => [
159
+ check("usine_repository_label_projections_labels_json_valid", sql `json_valid(${table.labelsJson})`),
160
+ ]);
161
+ /** Operator-owned runtime toggles; deliberately separate from authored Loop files (ADR 0009). */
162
+ export const loopRuntime = snakeCase.table("usine_loop_runtime", {
163
+ loopName: text().$type().primaryKey(),
164
+ paused: integer({ mode: "boolean" }).notNull(),
165
+ });
166
+ /** Singleton invalidation token for cached operator projections. */
167
+ export const projectionRevision = snakeCase.table("usine_projection_revision", {
168
+ singleton: integer({ mode: "number" }).primaryKey().default(1),
169
+ revision: integer({ mode: "number" }).notNull().default(0),
170
+ }, (table) => [check("usine_projection_revision_singleton", sql `${table.singleton} = 1`)]);
171
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/database/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { Event, Item, Loop, Run } from "@usine/core";
2
+ import { Context, Crypto, Effect, Layer } from "effect";
3
+ import { SqlClient } from "effect/unstable/sql";
4
+ import { RunDatabase } from "./database/database.ts";
5
+ import { type RunEngineError, type RunSnapshot, type Submission, type SubmissionResult, type TranscriptEntry, type TranscriptQuery } from "./model.ts";
6
+ import { RunReader } from "./run-reader.ts";
7
+ import { ItemProjectionReader, ItemProjectionWriter } from "./item-projection/service.ts";
8
+ import { RepositoryLabelProjectionReader, RepositoryLabelProjectionWriter } from "./repository-label-projection/service.ts";
9
+ import { StepExecutor } from "./step-executor.ts";
10
+ import { CursorStore } from "./cursor/store.ts";
11
+ import { LoopControl } from "./loop-control.ts";
12
+ declare const RunEngine_base: Context.ServiceClass<RunEngine, "@usine/engine/RunEngine", {
13
+ readonly approve: (runId: Run.RunId, approval: Event.Event) => Effect.Effect<void, RunEngineError>;
14
+ readonly cancel: (runId: Run.RunId) => Effect.Effect<void, RunEngineError>;
15
+ readonly inspect: (runId: Run.RunId) => Effect.Effect<RunSnapshot, RunEngineError>;
16
+ readonly reconcile: () => Effect.Effect<void, RunEngineError>;
17
+ readonly retry: (runId: Run.RunId) => Effect.Effect<void, RunEngineError>;
18
+ readonly revoke: (loop: Loop.LoopName, itemKey: Item.ItemKey) => Effect.Effect<ReadonlyArray<Run.RunId>, RunEngineError>;
19
+ readonly submit: (submission: Submission) => Effect.Effect<SubmissionResult, RunEngineError>;
20
+ readonly transcript: (query: TranscriptQuery) => Effect.Effect<ReadonlyArray<TranscriptEntry>, RunEngineError>;
21
+ }>;
22
+ /**
23
+ * The public run-engine service. The interface below is the package's declared
24
+ * API — widen it deliberately, never by letting an implementation change leak
25
+ * through inference.
26
+ */
27
+ export declare class RunEngine extends RunEngine_base {
28
+ }
29
+ /**
30
+ * Builds the durable runtime on a caller-selected SQLite-compatible database.
31
+ * The adapter must provide both Drizzle's run database and the matching Effect
32
+ * SQL client so run projections and cluster tables stay co-located. This entry
33
+ * is platform-free: the deployment supplies its platform `Crypto` (the cluster
34
+ * hashes over-length deduplication keys with it) next to the `StepExecutor`
35
+ * port — see `database/local-sqlite.ts` for the Node composition.
36
+ */
37
+ export declare const layerWithDatabase: <DatabaseError, DatabaseRequirements>(database: Layer.Layer<RunDatabase | SqlClient.SqlClient, DatabaseError, DatabaseRequirements>) => Layer.Layer<CursorStore | ItemProjectionReader | ItemProjectionWriter | LoopControl | RepositoryLabelProjectionReader | RepositoryLabelProjectionWriter | RunEngine | RunReader, RunEngineError | DatabaseError, Crypto.Crypto | StepExecutor | DatabaseRequirements>;
38
+ export {};
39
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAkB,MAAM,QAAQ,CAAC;AAExE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,eAAe,EACrB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAC1F,OAAO,EACL,+BAA+B,EAC/B,+BAA+B,EAChC,MAAM,0CAA0C,CAAC;AAQlD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;;sBAyL1B,CAChB,KAAK,EAAE,GAAG,CAAC,KAAK,EAChB,QAAQ,EAAE,KAAK,CAAC,KAAK,KAClB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC;qBACvB,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC;sBACxD,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC;wBAC9D,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC;oBAC7C,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC;qBACxD,CACf,IAAI,EAAE,IAAI,CAAC,QAAQ,EACnB,OAAO,EAAE,IAAI,CAAC,OAAO,KAClB,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC;qBAC3C,CAAC,UAAU,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,cAAc,CAAC;yBACvE,CACnB,KAAK,EAAE,eAAe,KACnB,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,eAAe,CAAC,EAAE,cAAc,CAAC;;AAvBtE;;;;GAIG;AACH,qBAAa,SAAU,SAAQ,cAoBD;CAAG;AAEjC;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,GAAI,aAAa,EAAE,oBAAoB,YACzD,KAAK,CAAC,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC,SAAS,EAAE,aAAa,EAAE,oBAAoB,CAAC,KAC5F,KAAK,CAAC,KAAK,CACV,WAAW,GACX,oBAAoB,GACpB,oBAAoB,GACpB,WAAW,GACX,+BAA+B,GAC/B,+BAA+B,GAC/B,SAAS,GACT,SAAS,EACX,cAAc,GAAG,aAAa,EAC9B,MAAM,CAAC,MAAM,GAAG,YAAY,GAAG,oBAAoB,CA2BpD,CAAC"}
package/dist/engine.js ADDED
@@ -0,0 +1,179 @@
1
+ import { Event, Item, Loop, Run } from "@usine/core";
2
+ import { Context, Crypto, Effect, Layer, Option, Result } from "effect";
3
+ import { ClusterWorkflowEngine, SingleRunner } from "effect/unstable/cluster";
4
+ import { SqlClient } from "effect/unstable/sql";
5
+ import { DurableDeferred, WorkflowEngine } from "effect/unstable/workflow";
6
+ import { RunDatabase } from "./database/database.js";
7
+ import { AttemptCancellationError, } from "./model.js";
8
+ import { RunStore } from "./store/store.js";
9
+ import { RunReader } from "./run-reader.js";
10
+ import { ItemProjectionReader, ItemProjectionWriter } from "./item-projection/service.js";
11
+ import { RepositoryLabelProjectionReader, RepositoryLabelProjectionWriter, } from "./repository-label-projection/service.js";
12
+ import { ApprovalGate, DurableRun, continueWithNewest, durableRunLayer, runIdFor, } from "./workflow.js";
13
+ import { StepExecutor } from "./step-executor.js";
14
+ import { CursorStore } from "./cursor/store.js";
15
+ import { LoopControl } from "./loop-control.js";
16
+ const MAX_SETTLEMENT_POLLS = 500;
17
+ const makeRunEngine = Effect.gen(function* () {
18
+ const store = yield* RunStore;
19
+ const stepExecutor = yield* StepExecutor;
20
+ const workflowEngine = yield* WorkflowEngine.WorkflowEngine;
21
+ const provideWorkflowEngine = (effect) => Effect.provideService(effect, WorkflowEngine.WorkflowEngine, workflowEngine);
22
+ const launch = Effect.fn("RunEngine.launch")(function* (submission) {
23
+ yield* DurableRun.execute({ submission }, { discard: true }).pipe(provideWorkflowEngine);
24
+ });
25
+ const deliverInterrupt = Effect.fn("RunEngine.deliverInterrupt")(function* (runId) {
26
+ yield* DurableRun.interrupt(runId).pipe(provideWorkflowEngine);
27
+ yield* store.completeWorkflowCommand(runId, "Interrupt");
28
+ });
29
+ const deliverApproval = Effect.fn("RunEngine.deliverApproval")(function* (runId) {
30
+ const token = DurableDeferred.tokenFromExecutionId(ApprovalGate, {
31
+ workflow: DurableRun,
32
+ executionId: runId,
33
+ });
34
+ yield* DurableDeferred.succeed(ApprovalGate, { token, value: undefined }).pipe(provideWorkflowEngine);
35
+ yield* store.completeWorkflowCommand(runId, "Approve");
36
+ });
37
+ const deliverContinuation = Effect.fn("RunEngine.deliverContinuation")(function* (runId) {
38
+ yield* continueWithNewest(store, runId).pipe(provideWorkflowEngine);
39
+ });
40
+ const awaitWorkflowSettlement = Effect.fn("RunEngine.awaitWorkflowSettlement")(function* (runId) {
41
+ // A Failed projection is committed before the workflow finishes suspending.
42
+ // Poll across that short handover so an immediate operator retry is not
43
+ // lost. A workflow still absent at the deadline is a corrupted instance
44
+ // database, not a race — die loudly instead of hanging delivery forever.
45
+ for (let poll = 0; poll < MAX_SETTLEMENT_POLLS; poll += 1) {
46
+ const status = yield* DurableRun.poll(runId).pipe(provideWorkflowEngine);
47
+ if (Option.isSome(status))
48
+ return status.value;
49
+ yield* Effect.sleep("10 millis");
50
+ }
51
+ return yield* Effect.die(new Error(`Run ${runId} has no durable workflow execution to settle`));
52
+ });
53
+ const deliverResume = Effect.fn("RunEngine.deliverResume")(function* (runId) {
54
+ const status = yield* awaitWorkflowSettlement(runId);
55
+ if (status._tag === "Complete") {
56
+ yield* store.reconcileCompletion(runId, status);
57
+ yield* store.completeWorkflowCommand(runId, "Resume");
58
+ yield* deliverContinuation(runId);
59
+ return;
60
+ }
61
+ yield* DurableRun.resume(runId).pipe(provideWorkflowEngine);
62
+ yield* store.completeWorkflowCommand(runId, "Resume");
63
+ });
64
+ const commandHandlers = {
65
+ Approve: deliverApproval,
66
+ Continue: deliverContinuation,
67
+ Interrupt: deliverInterrupt,
68
+ Resume: deliverResume,
69
+ };
70
+ const submit = Effect.fn("RunEngine.submit")(function* (submission) {
71
+ const requestedRunId = yield* runIdFor(submission);
72
+ const claim = yield* store.recordAndClaim(submission, requestedRunId);
73
+ if (Option.isSome(claim.supersededRun)) {
74
+ yield* deliverInterrupt(claim.supersededRun.value);
75
+ }
76
+ if (claim.result._tag === "Claimed") {
77
+ yield* launch(claim.submission);
78
+ }
79
+ return claim.result;
80
+ });
81
+ const approve = Effect.fn("RunEngine.approve")(function* (runId, approval) {
82
+ yield* store.approve(runId, approval);
83
+ yield* deliverApproval(runId);
84
+ });
85
+ const retry = Effect.fn("RunEngine.retry")(function* (runId) {
86
+ yield* store.retry(runId);
87
+ yield* deliverResume(runId);
88
+ });
89
+ const cancel = Effect.fn("RunEngine.cancel")(function* (runId) {
90
+ // The closing transaction decides both facts at once: whether the run was
91
+ // still open, and which attempt (if any) was in flight when it closed.
92
+ const outcome = yield* store.cancel(runId);
93
+ if (outcome._tag === "AlreadyClosed") {
94
+ yield* Effect.logDebug("Cancel was a no-op; the run was already closed", { runId });
95
+ return;
96
+ }
97
+ yield* Effect.logInfo("Run canceled", {
98
+ runId,
99
+ openAttempt: Option.getOrElse(outcome.openAttempt, () => "none"),
100
+ });
101
+ const handshake = Option.isSome(outcome.openAttempt)
102
+ ? yield* stepExecutor.interrupt(outcome.openAttempt.value).pipe(Effect.result)
103
+ : Result.succeed(undefined);
104
+ yield* deliverInterrupt(runId);
105
+ yield* deliverContinuation(runId);
106
+ if (Option.isSome(outcome.openAttempt) && Result.isFailure(handshake)) {
107
+ return yield* new AttemptCancellationError({
108
+ attemptId: outcome.openAttempt.value,
109
+ cause: handshake.failure,
110
+ });
111
+ }
112
+ });
113
+ const revoke = Effect.fn("RunEngine.revoke")(function* (loop, itemKey) {
114
+ const revoked = yield* store.revoke(loop, itemKey);
115
+ yield* Effect.forEach(revoked, deliverInterrupt, {
116
+ concurrency: "unbounded",
117
+ discard: true,
118
+ });
119
+ return revoked;
120
+ });
121
+ const inspect = Effect.fn("RunEngine.inspect")(function* (runId) {
122
+ return yield* store.snapshot(runId);
123
+ });
124
+ const transcript = Effect.fn("RunEngine.transcript")(function* (query) {
125
+ return yield* store.transcript(query);
126
+ });
127
+ const reconcile = Effect.fn("RunEngine.reconcile")(function* () {
128
+ yield* Effect.forEach(yield* store.pendingWorkflowCommands, ({ command, runId }) => commandHandlers[command](runId), { discard: true });
129
+ const recoverable = yield* store.recoverable;
130
+ yield* Effect.forEach(recoverable, ({ runId, state, submission }) => Effect.gen(function* () {
131
+ const status = yield* DurableRun.poll(runId).pipe(provideWorkflowEngine);
132
+ if (Option.isSome(status) && status.value._tag === "Complete") {
133
+ yield* store.reconcileCompletion(runId, status.value);
134
+ yield* deliverContinuation(runId);
135
+ return;
136
+ }
137
+ if (Option.isSome(status) && status.value._tag === "Suspended") {
138
+ if (state._tag === "Running") {
139
+ yield* deliverResume(runId);
140
+ }
141
+ return;
142
+ }
143
+ yield* launch(submission);
144
+ }), { concurrency: "unbounded", discard: true });
145
+ });
146
+ yield* reconcile();
147
+ return { approve, cancel, inspect, reconcile, retry, revoke, submit, transcript };
148
+ });
149
+ /**
150
+ * The public run-engine service. The interface below is the package's declared
151
+ * API — widen it deliberately, never by letting an implementation change leak
152
+ * through inference.
153
+ */
154
+ export class RunEngine extends Context.Service()("@usine/engine/RunEngine") {
155
+ }
156
+ /**
157
+ * Builds the durable runtime on a caller-selected SQLite-compatible database.
158
+ * The adapter must provide both Drizzle's run database and the matching Effect
159
+ * SQL client so run projections and cluster tables stay co-located. This entry
160
+ * is platform-free: the deployment supplies its platform `Crypto` (the cluster
161
+ * hashes over-length deduplication keys with it) next to the `StepExecutor`
162
+ * port — see `database/local-sqlite.ts` for the Node composition.
163
+ */
164
+ export const layerWithDatabase = (database) => {
165
+ const store = RunStore.layer.pipe(Layer.provide(database));
166
+ const cluster = SingleRunner.layer({
167
+ runnerStorage: "memory",
168
+ shardingConfig: {
169
+ availableShardGroups: ["default", "workflow"],
170
+ assignedShardGroups: ["default", "workflow"],
171
+ entityTerminationTimeout: 0,
172
+ },
173
+ }).pipe(Layer.provide(database), Layer.orDie);
174
+ const workflowEngine = ClusterWorkflowEngine.layer.pipe(Layer.provide(cluster));
175
+ const runtime = durableRunLayer.pipe(Layer.provideMerge(workflowEngine), Layer.provideMerge(store));
176
+ const runEngine = Layer.effect(RunEngine, makeRunEngine).pipe(Layer.provide(runtime));
177
+ return Layer.mergeAll(runEngine, RunReader.layer.pipe(Layer.provide(database)), CursorStore.layer.pipe(Layer.provide(database)), ItemProjectionReader.layer.pipe(Layer.provide(database)), ItemProjectionWriter.layer.pipe(Layer.provide(database)), RepositoryLabelProjectionReader.layer.pipe(Layer.provide(database)), RepositoryLabelProjectionWriter.layer.pipe(Layer.provide(database)), LoopControl.layer.pipe(Layer.provide(database)));
178
+ };
179
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,8 +1,20 @@
1
1
  /**
2
- * @usine/engine — The usine run engine: event ledger, dedup/supersede/revoke, run scheduling, durable-execution seam, SQLite store.
2
+ * @usine/engine — durable Event → Run → Step → Attempt execution.
3
3
  *
4
- * Not implemented yet: this 0.0.x release reserves the block's seam while the
5
- * engine grows.
4
+ * This entry is platform-free: compose it with a database adapter through
5
+ * `layerWithDatabase`, or import the Node local adapter from
6
+ * `@usine/engine/local-sqlite`.
6
7
  */
7
- export {};
8
+ export { ApprovalRequirement, AttemptCancellationError, Claimed, EnginePersistenceError, Ignored, IgnoreReason, InstanceDirectory, LoopRuntimeState, Queued, ProjectionRevision, RunEngineError, RunNotFoundError, RunOperationRejectedError, RunSnapshot, RunStoreError, RunSummary, StepExecution, Submission, SubmissionResult, TranscriptEntry, TranscriptAllQuery, TranscriptPageQuery, TranscriptQuery, TranscriptSequence, TranscriptTailQuery, } from "./model.ts";
9
+ export { ItemContentHash, ItemNumber, ItemProjection, ItemProjectionSource, } from "./item-projection/model.ts";
10
+ export { type ItemProjectionListOptions, ItemProjectionReader, ItemProjectionWriter, } from "./item-projection/service.ts";
11
+ export { RepositoryLabelProjection } from "./repository-label-projection/model.ts";
12
+ export { RepositoryLabelProjectionReader, RepositoryLabelProjectionWriter, } from "./repository-label-projection/service.ts";
13
+ export { RunDatabase, type RunDatabaseClient } from "./database/database.ts";
14
+ export { CursorKey } from "./cursor/model.ts";
15
+ export { CursorStore } from "./cursor/store.ts";
16
+ export { layerWithDatabase, RunEngine } from "./engine.ts";
17
+ export { RunReader } from "./run-reader.ts";
18
+ export { LoopControl } from "./loop-control.ts";
19
+ export { StepExecutor, type WorkerLease } from "./step-executor.ts";
8
20
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,OAAO,EACP,sBAAsB,EACtB,OAAO,EACP,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,MAAM,EACN,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,yBAAyB,EACzB,WAAW,EACX,aAAa,EACb,UAAU,EACV,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,eAAe,EACf,UAAU,EACV,cAAc,EACd,oBAAoB,GACrB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,KAAK,yBAAyB,EAC9B,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAC;AACnF,OAAO,EACL,+BAA+B,EAC/B,+BAA+B,GAChC,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC"}
package/dist/index.js CHANGED
@@ -1,8 +1,20 @@
1
1
  /**
2
- * @usine/engine — The usine run engine: event ledger, dedup/supersede/revoke, run scheduling, durable-execution seam, SQLite store.
2
+ * @usine/engine — durable Event → Run → Step → Attempt execution.
3
3
  *
4
- * Not implemented yet: this 0.0.x release reserves the block's seam while the
5
- * engine grows.
4
+ * This entry is platform-free: compose it with a database adapter through
5
+ * `layerWithDatabase`, or import the Node local adapter from
6
+ * `@usine/engine/local-sqlite`.
6
7
  */
7
- export {};
8
+ export { ApprovalRequirement, AttemptCancellationError, Claimed, EnginePersistenceError, Ignored, IgnoreReason, InstanceDirectory, LoopRuntimeState, Queued, ProjectionRevision, RunEngineError, RunNotFoundError, RunOperationRejectedError, RunSnapshot, RunStoreError, RunSummary, StepExecution, Submission, SubmissionResult, TranscriptEntry, TranscriptAllQuery, TranscriptPageQuery, TranscriptQuery, TranscriptSequence, TranscriptTailQuery, } from "./model.js";
9
+ export { ItemContentHash, ItemNumber, ItemProjection, ItemProjectionSource, } from "./item-projection/model.js";
10
+ export { ItemProjectionReader, ItemProjectionWriter, } from "./item-projection/service.js";
11
+ export { RepositoryLabelProjection } from "./repository-label-projection/model.js";
12
+ export { RepositoryLabelProjectionReader, RepositoryLabelProjectionWriter, } from "./repository-label-projection/service.js";
13
+ export { RunDatabase } from "./database/database.js";
14
+ export { CursorKey } from "./cursor/model.js";
15
+ export { CursorStore } from "./cursor/store.js";
16
+ export { layerWithDatabase, RunEngine } from "./engine.js";
17
+ export { RunReader } from "./run-reader.js";
18
+ export { LoopControl } from "./loop-control.js";
19
+ export { StepExecutor } from "./step-executor.js";
8
20
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,OAAO,EACP,sBAAsB,EACtB,OAAO,EACP,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,MAAM,EACN,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,yBAAyB,EACzB,WAAW,EACX,aAAa,EACb,UAAU,EACV,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,eAAe,EACf,UAAU,EACV,cAAc,EACd,oBAAoB,GACrB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAEL,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAC;AACnF,OAAO,EACL,+BAA+B,EAC/B,+BAA+B,GAChC,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,WAAW,EAA0B,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAoB,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { Item } from "@usine/core";
2
+ import { Schema } from "effect";
3
+ export declare const ItemProjectionSource: Schema.brand<Schema.NonEmptyString, "ItemProjectionSource">;
4
+ export type ItemProjectionSource = typeof ItemProjectionSource.Type;
5
+ export declare const ItemNumber: Schema.brand<Schema.Int, "ItemNumber">;
6
+ export type ItemNumber = Item.Number;
7
+ export declare const ItemContentHash: Schema.brand<Schema.NonEmptyString, "ItemContentHash">;
8
+ export type ItemContentHash = typeof ItemContentHash.Type;
9
+ declare const ItemProjection_base: Schema.Class<ItemProjection, Schema.Struct<{
10
+ readonly itemKey: Schema.brand<Schema.NonEmptyString, "ItemKey">;
11
+ readonly repository: Schema.brand<Schema.String, "RepoName">;
12
+ readonly source: Schema.brand<Schema.NonEmptyString, "ItemProjectionSource">;
13
+ readonly number: Schema.brand<Schema.Int, "ItemNumber">;
14
+ readonly contentHash: Schema.brand<Schema.NonEmptyString, "ItemContentHash">;
15
+ readonly payload: Schema.$Record<Schema.String, Schema.Codec<Schema.Json, Schema.Json, never, never>>;
16
+ }>, {}>;
17
+ /** Latest trigger-observed payload for one Item, independent of its source adapter. */
18
+ export declare class ItemProjection extends ItemProjection_base {
19
+ }
20
+ export {};
21
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/item-projection/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAc,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,eAAO,MAAM,oBAAoB,6DAEhC,CAAC;AACF,MAAM,MAAM,oBAAoB,GAAG,OAAO,oBAAoB,CAAC,IAAI,CAAC;AAEpE,eAAO,MAAM,UAAU,wCAAc,CAAC;AACtC,MAAM,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;AAErC,eAAO,MAAM,eAAe,wDAA8D,CAAC;AAC3F,MAAM,MAAM,eAAe,GAAG,OAAO,eAAe,CAAC,IAAI,CAAC;;;;;;;;;AAE1D,uFAAuF;AACvF,qBAAa,cAAe,SAAQ,mBAOlC;CAAG"}
@@ -0,0 +1,16 @@
1
+ import { Item, Repository } from "@usine/core";
2
+ import { Schema } from "effect";
3
+ export const ItemProjectionSource = Schema.NonEmptyString.pipe(Schema.brand("ItemProjectionSource"));
4
+ export const ItemNumber = Item.Number;
5
+ export const ItemContentHash = Schema.NonEmptyString.pipe(Schema.brand("ItemContentHash"));
6
+ /** Latest trigger-observed payload for one Item, independent of its source adapter. */
7
+ export class ItemProjection extends Schema.Class("@usine/engine/ItemProjection")({
8
+ itemKey: Item.ItemKey,
9
+ repository: Repository.Name,
10
+ source: ItemProjectionSource,
11
+ number: ItemNumber,
12
+ contentHash: ItemContentHash,
13
+ payload: Schema.JsonObject,
14
+ }) {
15
+ }
16
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/item-projection/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAC5D,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CACrC,CAAC;AAGF,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;AAGtC,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAG3F,uFAAuF;AACvF,MAAM,OAAO,cAAe,SAAQ,MAAM,CAAC,KAAK,CAAiB,8BAA8B,CAAC,CAAC;IAC/F,OAAO,EAAE,IAAI,CAAC,OAAO;IACrB,UAAU,EAAE,UAAU,CAAC,IAAI;IAC3B,MAAM,EAAE,oBAAoB;IAC5B,MAAM,EAAE,UAAU;IAClB,WAAW,EAAE,eAAe;IAC5B,OAAO,EAAE,MAAM,CAAC,UAAU;CAC3B,CAAC;CAAG"}
@@ -0,0 +1,25 @@
1
+ import { Repository } from "@usine/core";
2
+ import { Context, Effect, Layer } from "effect";
3
+ import { RunDatabase } from "../database/database.ts";
4
+ import { EnginePersistenceError } from "../model.ts";
5
+ import { ItemProjection } from "./model.ts";
6
+ /** Newest Items first; the bound keeps a long-lived repository's Board response finite. */
7
+ export interface ItemProjectionListOptions {
8
+ readonly limit: number;
9
+ }
10
+ declare const ItemProjectionReader_base: Context.ServiceClass<ItemProjectionReader, "@usine/engine/ItemProjectionReader", {
11
+ /** The newest `limit` Item projections of one repository, highest number first. */
12
+ readonly list: (repository: Repository.Name, options: ItemProjectionListOptions) => Effect.Effect<ReadonlyArray<ItemProjection>, EnginePersistenceError>;
13
+ }>;
14
+ export declare class ItemProjectionReader extends ItemProjectionReader_base {
15
+ static readonly layer: Layer.Layer<ItemProjectionReader, never, RunDatabase>;
16
+ }
17
+ declare const ItemProjectionWriter_base: Context.ServiceClass<ItemProjectionWriter, "@usine/engine/ItemProjectionWriter", {
18
+ /** `true` means the durable projection changed. */
19
+ readonly upsert: (item: ItemProjection) => Effect.Effect<boolean, EnginePersistenceError>;
20
+ }>;
21
+ export declare class ItemProjectionWriter extends ItemProjectionWriter_base {
22
+ static readonly layer: Layer.Layer<ItemProjectionWriter, never, RunDatabase>;
23
+ }
24
+ export {};
25
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/item-projection/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAU,MAAM,QAAQ,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAA+B,cAAc,EAAwB,MAAM,YAAY,CAAC;AAmB/F,2FAA2F;AAC3F,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;;IAqFG,mFAAmF;mBACpE,CACb,UAAU,EAAE,UAAU,CAAC,IAAI,EAC3B,OAAO,EAAE,yBAAyB,KAC/B,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE,sBAAsB,CAAC;;AAP7E,qBAAa,oBAAqB,SAAQ,yBASD;IACvC,MAAM,CAAC,QAAQ,CAAC,KAAK,wDAAkD;CACxE;;IAKG,mDAAmD;qBAClC,CAAC,IAAI,EAAE,cAAc,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,sBAAsB,CAAC;;AAJ7F,qBAAa,oBAAqB,SAAQ,yBAMD;IACvC,MAAM,CAAC,QAAQ,CAAC,KAAK,wDAAkD;CACxE"}