@usine/engine 0.0.0 → 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 (97) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +69 -1
  3. package/dist/cursor/model.d.ts +5 -0
  4. package/dist/cursor/model.d.ts.map +1 -0
  5. package/dist/cursor/model.js +4 -0
  6. package/dist/cursor/model.js.map +1 -0
  7. package/dist/cursor/store.d.ts +18 -0
  8. package/dist/cursor/store.d.ts.map +1 -0
  9. package/dist/cursor/store.js +54 -0
  10. package/dist/cursor/store.js.map +1 -0
  11. package/dist/database/database.d.ts +15 -0
  12. package/dist/database/database.d.ts.map +1 -0
  13. package/dist/database/database.js +5 -0
  14. package/dist/database/database.js.map +1 -0
  15. package/dist/database/local-sqlite.d.ts +17 -0
  16. package/dist/database/local-sqlite.d.ts.map +1 -0
  17. package/dist/database/local-sqlite.js +45 -0
  18. package/dist/database/local-sqlite.js.map +1 -0
  19. package/dist/database/schema.d.ts +1096 -0
  20. package/dist/database/schema.d.ts.map +1 -0
  21. package/dist/database/schema.js +171 -0
  22. package/dist/database/schema.js.map +1 -0
  23. package/dist/engine.d.ts +39 -0
  24. package/dist/engine.d.ts.map +1 -0
  25. package/dist/engine.js +179 -0
  26. package/dist/engine.js.map +1 -0
  27. package/dist/index.d.ts +20 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +20 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/item-projection/model.d.ts +21 -0
  32. package/dist/item-projection/model.d.ts.map +1 -0
  33. package/dist/item-projection/model.js +16 -0
  34. package/dist/item-projection/model.js.map +1 -0
  35. package/dist/item-projection/service.d.ts +25 -0
  36. package/dist/item-projection/service.d.ts.map +1 -0
  37. package/dist/item-projection/service.js +98 -0
  38. package/dist/item-projection/service.js.map +1 -0
  39. package/dist/loop-control.d.ts +16 -0
  40. package/dist/loop-control.d.ts.map +1 -0
  41. package/dist/loop-control.js +69 -0
  42. package/dist/loop-control.js.map +1 -0
  43. package/dist/model.d.ts +185 -0
  44. package/dist/model.d.ts.map +1 -0
  45. package/dist/model.js +174 -0
  46. package/dist/model.js.map +1 -0
  47. package/dist/repository-label-projection/model.d.ts +10 -0
  48. package/dist/repository-label-projection/model.d.ts.map +1 -0
  49. package/dist/repository-label-projection/model.js +11 -0
  50. package/dist/repository-label-projection/model.js.map +1 -0
  51. package/dist/repository-label-projection/service.d.ts +20 -0
  52. package/dist/repository-label-projection/service.d.ts.map +1 -0
  53. package/dist/repository-label-projection/service.js +73 -0
  54. package/dist/repository-label-projection/service.js.map +1 -0
  55. package/dist/run-reader.d.ts +20 -0
  56. package/dist/run-reader.d.ts.map +1 -0
  57. package/dist/run-reader.js +19 -0
  58. package/dist/run-reader.js.map +1 -0
  59. package/dist/step-executor.d.ts +21 -0
  60. package/dist/step-executor.d.ts.map +1 -0
  61. package/dist/step-executor.js +8 -0
  62. package/dist/step-executor.js.map +1 -0
  63. package/dist/store/codec.d.ts +431 -0
  64. package/dist/store/codec.d.ts.map +1 -0
  65. package/dist/store/codec.js +140 -0
  66. package/dist/store/codec.js.map +1 -0
  67. package/dist/store/queries.d.ts +75 -0
  68. package/dist/store/queries.d.ts.map +1 -0
  69. package/dist/store/queries.js +508 -0
  70. package/dist/store/queries.js.map +1 -0
  71. package/dist/store/store.d.ts +83 -0
  72. package/dist/store/store.d.ts.map +1 -0
  73. package/dist/store/store.js +374 -0
  74. package/dist/store/store.js.map +1 -0
  75. package/dist/workflow.d.ts +14 -0
  76. package/dist/workflow.d.ts.map +1 -0
  77. package/dist/workflow.js +105 -0
  78. package/dist/workflow.js.map +1 -0
  79. package/drizzle/20260825055549_initial_runtime/migration.sql +73 -0
  80. package/drizzle/20260825055549_initial_runtime/snapshot.json +592 -0
  81. package/drizzle/20260830191125_polling_cursors/migration.sql +5 -0
  82. package/drizzle/20260830191125_polling_cursors/snapshot.json +629 -0
  83. package/drizzle/20260831073158_attempt_channel/migration.sql +36 -0
  84. package/drizzle/20260831073158_attempt_channel/snapshot.json +845 -0
  85. package/drizzle/20260831133534_agent_context/migration.sql +49 -0
  86. package/drizzle/20260831133534_agent_context/snapshot.json +897 -0
  87. package/drizzle/20260831134612_attempt_brain/migration.sql +26 -0
  88. package/drizzle/20260831134612_attempt_brain/snapshot.json +923 -0
  89. package/drizzle/20260831194605_loop_runtime/migration.sql +4 -0
  90. package/drizzle/20260831194605_loop_runtime/snapshot.json +954 -0
  91. package/drizzle/20260901073233_projection_revision/migration.sql +55 -0
  92. package/drizzle/20260901073233_projection_revision/snapshot.json +991 -0
  93. package/drizzle/20260901180433_item_projections/migration.sql +22 -0
  94. package/drizzle/20260901180433_item_projections/snapshot.json +1110 -0
  95. package/drizzle/20260901185146_repository_label_projections/migration.sql +17 -0
  96. package/drizzle/20260901185146_repository_label_projections/snapshot.json +1147 -0
  97. package/package.json +53 -4
@@ -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":"AAAA,OAAO,EACL,KAAK,EACL,OAAO,EACP,cAAc,EACd,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,UAAU,EACV,GAAG,EACH,IAAI,EACJ,MAAM,GACP,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EACL,KAAK,EACL,UAAU,EACV,KAAK,EACL,OAAO,EACP,UAAU,EACV,SAAS,EACT,IAAI,EACJ,WAAW,GACZ,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,iBAAiB,GAIlB,MAAM,aAAa,CAAC;AAErB,MAAM,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CACnC,cAAc,EACd;IACE,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,EAAiB,CAAC,UAAU,EAAE;IACnD,QAAQ,EAAE,IAAI,EAAE,CAAC,KAAK,EAAkB,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE;IAC3D,WAAW,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAW,CAAC,OAAO,EAAE;IAC9D,UAAU,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE;CAC7B,EACD,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,iCAAiC,EAAE,GAAG,CAAA,cAAc,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,CAC7F,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAC,KAAK,CAC1C,sBAAsB,EACtB;IACE,OAAO,EAAE,IAAI,EAAE;SACZ,KAAK,EAAiB;SACtB,UAAU,EAAE;SACZ,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;IACnC,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,EAAgB,CAAC,OAAO,EAAE;IAC/C,QAAQ,EAAE,IAAI,EAAE,CAAC,KAAK,EAAiB,CAAC,OAAO,EAAE;IACjD,QAAQ,EAAE,IAAI,EAAE,CAAC,KAAK,EAAiB,CAAC,OAAO,EAAE;IACjD,QAAQ,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC,CAAC,KAAK,EAAuB,CAAC,OAAO,EAAE;IACtF,uEAAuE;IACvE,0EAA0E;IAC1E,6DAA6D;IAC7D,UAAU,EAAE,IAAI,EAAE,CAAC,KAAK,EAAmB,CAAC,OAAO,EAAE;IACrD,QAAQ,EAAE,IAAI,EAAE,CAAC,KAAK,EAAuB,CAAC,OAAO,EAAE;IACvD,IAAI,EAAE,IAAI,EAAE,CAAC,KAAK,EAAuB,CAAC,OAAO,EAAE;IACnD,SAAS,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAW,CAAC,OAAO,EAAE;IAC5D,WAAW,EAAE,IAAI,EAAE,CAAC,KAAK,EAAiB;CAC3C,EACD,CAAC,KAAK,EAAE,EAAE,CAAC;IACT,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAA,GAAG,KAAK,CAAC,QAAQ,0BAA0B,CAAC;IACtF,KAAK,CAAC,uCAAuC,EAAE,GAAG,CAAA,cAAc,KAAK,CAAC,SAAS,GAAG,CAAC;IACnF,KAAK,CAAC,2BAA2B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC;CACrE,CACF,CAAC;AAEF,MAAM,CAAC,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CACjC,YAAY,EACZ;IACE,KAAK,EAAE,IAAI,EAAE,CAAC,KAAK,EAAa,CAAC,UAAU,EAAE;IAC7C,OAAO,EAAE,IAAI,EAAE;SACZ,KAAK,EAAiB;SACtB,OAAO,EAAE;SACT,MAAM,EAAE;SACR,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC;IAC1C,QAAQ,EAAE,IAAI,EAAE,CAAC,KAAK,EAAiB,CAAC,OAAO,EAAE;IACjD,SAAS,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAW,CAAC,OAAO,EAAE;IAC5D,QAAQ,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE;IAC1B,sEAAsE;IACtE,0EAA0E;IAC1E,UAAU,EAAE,IAAI,EAAE,CAAC,KAAK,EAAmB,CAAC,OAAO,EAAE;IACrD,QAAQ,EAAE,IAAI,EAAE,CAAC,KAAK,EAAuB,CAAC,OAAO,EAAE;IACvD,IAAI,EAAE,IAAI,EAAE,CAAC,KAAK,EAAuB,CAAC,OAAO,EAAE;IACnD,SAAS,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAW,CAAC,OAAO,EAAE;IAC5D,WAAW,EAAE,IAAI,EAAE,CAAC,KAAK,EAAiB;CAC3C,EACD,CAAC,KAAK,EAAE,EAAE,CAAC;IACT,KAAK,CAAC,6BAA6B,EAAE,GAAG,CAAA,cAAc,KAAK,CAAC,SAAS,GAAG,CAAC;IACzE,KAAK,CAAC,6BAA6B,EAAE,GAAG,CAAA,cAAc,KAAK,CAAC,SAAS,GAAG,CAAC;CAC1E,CACF,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAClC,aAAa,EACb;IACE,KAAK,EAAE,IAAI,EAAE;SACV,KAAK,EAAa;SAClB,OAAO,EAAE;SACT,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;IAC/B,QAAQ,EAAE,IAAI,EAAE,CAAC,KAAK,EAAiB,CAAC,OAAO,EAAE;IACjD,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAW;CAChD,EACD,CAAC,KAAK,EAAE,EAAE,CAAC;IACT,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;IACtD,KAAK,CACH,+BAA+B,EAC/B,GAAG,CAAA,GAAG,KAAK,CAAC,MAAM,0BAA0B,KAAK,CAAC,MAAM,GAAG,CAC5D;CACF,CACF,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CACrC,gBAAgB,EAChB;IACE,SAAS,EAAE,IAAI,EAAE,CAAC,KAAK,EAAqB,CAAC,UAAU,EAAE;IACzD,KAAK,EAAE,IAAI,EAAE,CAAC,KAAK,EAAa,CAAC,OAAO,EAAE;IAC1C,QAAQ,EAAE,IAAI,EAAE,CAAC,KAAK,EAAiB,CAAC,OAAO,EAAE;IACjD,UAAU,EAAE,IAAI,EAAE,CAAC,KAAK,EAAe,CAAC,OAAO,EAAE;IACjD,aAAa,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAyB,CAAC,OAAO,EAAE;IACnF,SAAS,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAW,CAAC,OAAO,EAAE;IAC5D,WAAW,EAAE,IAAI,EAAE,CAAC,KAAK,EAAiB;IAC1C,SAAS,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE;IAC3B,WAAW,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAW;CACrD,EACD,CAAC,KAAK,EAAE,EAAE,CAAC;IACT,KAAK,CAAC,uBAAuB,EAAE,GAAG,CAAA,GAAG,KAAK,CAAC,aAAa,OAAO,CAAC;IAChE,KAAK,CAAC,iCAAiC,EAAE,GAAG,CAAA,cAAc,KAAK,CAAC,SAAS,GAAG,CAAC;IAC7E,KAAK,CACH,mCAAmC,EACnC,GAAG,CAAA,GAAG,KAAK,CAAC,WAAW,0BAA0B,KAAK,CAAC,WAAW,GAAG,CACtE;IACD,WAAW,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC;IACxF,WAAW,CAAC,6BAA6B,CAAC;SACvC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;SACf,KAAK,CAAC,GAAG,CAAA,GAAG,KAAK,CAAC,WAAW,UAAU,CAAC;IAC3C,UAAU,CAAC;QACT,OAAO,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC;QACtC,cAAc,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC;KAC9C,CAAC;CACH,CACF,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,SAAS,CAAC,KAAK,CAC/C,2BAA2B,EAC3B;IACE,QAAQ,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,UAAU,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IACzE,SAAS,EAAE,IAAI,EAAE;SACd,KAAK,EAAqB;SAC1B,OAAO,EAAE;SACT,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;IACvC,SAAS,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE;IAC9D,eAAe,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAA2B,CAAC,OAAO,EAAE;IACvF,QAAQ,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAW,CAAC,OAAO,EAAE;IAC3D,UAAU,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE;CAC7B,EACD,CAAC,KAAK,EAAE,EAAE,CAAC;IACT,KAAK,CACH,qCAAqC,EACrC,GAAG,CAAA,GAAG,KAAK,CAAC,SAAS,6BAA6B,CACnD;IACD,KAAK,CAAC,oCAAoC,EAAE,GAAG,CAAA,GAAG,KAAK,CAAC,eAAe,OAAO,CAAC;IAC/E,KAAK,CAAC,+CAA+C,EAAE,GAAG,CAAA,cAAc,KAAK,CAAC,QAAQ,GAAG,CAAC;IAC1F,WAAW,CAAC,mCAAmC,CAAC,CAAC,EAAE,CACjD,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,eAAe,CACtB;IACD,KAAK,CAAC,+BAA+B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC;CAC3E,CACF,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,iBAAiB,EAAE;IAC1D,KAAK,EAAE,IAAI,EAAE;SACV,KAAK,EAAa;SAClB,UAAU,EAAE;SACZ,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;IAC/B,OAAO,EAAE,IAAI,EAAE;SACZ,KAAK,EAAiB;SACtB,OAAO,EAAE;SACT,MAAM,EAAE;SACR,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;CACpC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAC,KAAK,CAC1C,sBAAsB,EACtB;IACE,OAAO,EAAE,IAAI,EAAE;SACZ,KAAK,EAAiB;SACtB,UAAU,EAAE;SACZ,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC;IAC1C,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC,KAAK,EAAgB,CAAC,OAAO,EAAE;CACxE,EACD,CAAC,KAAK,EAAE,EAAE,CAAC;IACT,KAAK,CAAC,6BAA6B,EAAE,GAAG,CAAA,GAAG,KAAK,CAAC,MAAM,+BAA+B,CAAC;CACxF,CACF,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,SAAS,CAAC,KAAK,CAC7C,yBAAyB,EACzB;IACE,KAAK,EAAE,IAAI,EAAE;SACV,KAAK,EAAa;SAClB,OAAO,EAAE;SACT,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;IAC/B,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC,KAAK,EAAmB,CAAC,OAAO,EAAE;CAC9E,EACD,CAAC,KAAK,EAAE,EAAE,CAAC;IACT,KAAK,CACH,iCAAiC,EACjC,GAAG,CAAA,GAAG,KAAK,CAAC,OAAO,oDAAoD,CACxE;IACD,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;CACtD,CACF,CAAC;AAEF,yEAAyE;AACzE,MAAM,CAAC,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CACpC,eAAe,EACf;IACE,SAAS,EAAE,IAAI,EAAE,CAAC,UAAU,EAAE;IAC9B,SAAS,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAW,CAAC,OAAO,EAAE;CAC7D,EACD,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,gCAAgC,EAAE,GAAG,CAAA,cAAc,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAC1F,CAAC;AAEF,gFAAgF;AAChF,MAAM,CAAC,MAAM,eAAe,GAAG,SAAS,CAAC,KAAK,CAC5C,wBAAwB,EACxB;IACE,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,EAAgB,CAAC,UAAU,EAAE;IAClD,UAAU,EAAE,IAAI,EAAE,CAAC,KAAK,EAAmB,CAAC,OAAO,EAAE;IACrD,MAAM,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE;IACxB,UAAU,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;IACjD,WAAW,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE;IAC7B,WAAW,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAW,CAAC,OAAO,EAAE;CAC/D,EACD,CAAC,KAAK,EAAE,EAAE,CAAC;IACT,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAA,GAAG,KAAK,CAAC,UAAU,OAAO,CAAC;IACrE,KAAK,CAAC,2CAA2C,EAAE,GAAG,CAAA,cAAc,KAAK,CAAC,WAAW,GAAG,CAAC;IACzF,WAAW,CAAC,8BAA8B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC;IAClF,KAAK,CAAC,kCAAkC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC;CACjF,CACF,CAAC;AAEF,wEAAwE;AACxE,MAAM,CAAC,MAAM,0BAA0B,GAAG,SAAS,CAAC,KAAK,CACvD,oCAAoC,EACpC;IACE,UAAU,EAAE,IAAI,EAAE,CAAC,KAAK,EAAmB,CAAC,UAAU,EAAE;IACxD,UAAU,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAW,CAAC,OAAO,EAAE;CAC9D,EACD,CAAC,KAAK,EAAE,EAAE,CAAC;IACT,KAAK,CACH,sDAAsD,EACtD,GAAG,CAAA,cAAc,KAAK,CAAC,UAAU,GAAG,CACrC;CACF,CACF,CAAC;AAEF,iGAAiG;AACjG,MAAM,CAAC,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,oBAAoB,EAAE;IAC/D,QAAQ,EAAE,IAAI,EAAE,CAAC,KAAK,EAAiB,CAAC,UAAU,EAAE;IACpD,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;CAC/C,CAAC,CAAC;AAEH,oEAAoE;AACpE,MAAM,CAAC,MAAM,kBAAkB,GAAG,SAAS,CAAC,KAAK,CAC/C,2BAA2B,EAC3B;IACE,SAAS,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9D,QAAQ,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;CAC3D,EACD,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,qCAAqC,EAAE,GAAG,CAAA,GAAG,KAAK,CAAC,SAAS,MAAM,CAAC,CAAC,CACvF,CAAC"}
@@ -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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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * @usine/engine — durable Event → Run → Step → Attempt execution.
3
+ *
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`.
7
+ */
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";
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
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 ADDED
@@ -0,0 +1,20 @@
1
+ /**
2
+ * @usine/engine — durable Event → Run → Step → Attempt execution.
3
+ *
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`.
7
+ */
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";
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
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"}