@bluewombat/work-ledger 0.8.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/SPECS.md +120 -94
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/ledger/feature-commands.d.ts +71 -0
- package/dist/ledger/feature-commands.d.ts.map +1 -0
- package/dist/ledger/feature-commands.js +272 -0
- package/dist/ledger/feature-commands.js.map +1 -0
- package/dist/ledger/open-work-ledger.d.ts +38 -55
- package/dist/ledger/open-work-ledger.d.ts.map +1 -1
- package/dist/ledger/open-work-ledger.js +228 -300
- package/dist/ledger/open-work-ledger.js.map +1 -1
- package/dist/ledger/results.d.ts +11 -0
- package/dist/ledger/results.d.ts.map +1 -0
- package/dist/ledger/results.js +4 -0
- package/dist/ledger/results.js.map +1 -0
- package/dist/persist/port.d.ts +4 -4
- package/dist/persist/port.d.ts.map +1 -1
- package/dist/records.d.ts +122 -41
- package/dist/records.d.ts.map +1 -1
- package/dist/records.js +6 -1
- package/dist/records.js.map +1 -1
- package/package.json +2 -2
- package/dist/ledger/check-plan.d.ts +0 -17
- package/dist/ledger/check-plan.d.ts.map +0 -1
- package/dist/ledger/check-plan.js +0 -73
- package/dist/ledger/check-plan.js.map +0 -1
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import { isFeatureAggregate, isFeatureSummary } from "../records.js";
|
|
2
|
+
import { refused } from "./results.js";
|
|
3
|
+
/** States in which a Feature holds its Project: nothing else opens beside it. */
|
|
4
|
+
const HOLDING = new Set(["open", "submitted", "escalated"]);
|
|
5
|
+
function cloneIntention(feature) {
|
|
6
|
+
const intention = {
|
|
7
|
+
key: feature.key,
|
|
8
|
+
project: feature.project,
|
|
9
|
+
fingerprint: feature.fingerprint,
|
|
10
|
+
priority: feature.priority,
|
|
11
|
+
intention: feature.intention,
|
|
12
|
+
blocked_by: [...feature.blocked_by],
|
|
13
|
+
merge_when_ready: feature.merge_when_ready,
|
|
14
|
+
};
|
|
15
|
+
if (feature.skip_e2e === true) {
|
|
16
|
+
intention.skip_e2e = true;
|
|
17
|
+
}
|
|
18
|
+
if (feature.title !== undefined) {
|
|
19
|
+
intention.title = feature.title;
|
|
20
|
+
}
|
|
21
|
+
if (feature.manager !== undefined) {
|
|
22
|
+
intention.manager = feature.manager;
|
|
23
|
+
}
|
|
24
|
+
if (feature.external_id !== undefined) {
|
|
25
|
+
intention.external_id = feature.external_id;
|
|
26
|
+
}
|
|
27
|
+
if (feature.source !== undefined) {
|
|
28
|
+
intention.source = { ...feature.source };
|
|
29
|
+
}
|
|
30
|
+
return intention;
|
|
31
|
+
}
|
|
32
|
+
export function openFeatureCommands(options) {
|
|
33
|
+
const { persist, now } = options;
|
|
34
|
+
const loadFeature = async (key) => {
|
|
35
|
+
const found = await persist.load(key);
|
|
36
|
+
return found !== undefined && isFeatureAggregate(found) ? found : undefined;
|
|
37
|
+
};
|
|
38
|
+
const write = async (aggregate) => {
|
|
39
|
+
const saved = await persist.save(aggregate.intention.key, aggregate);
|
|
40
|
+
return saved.ok ? { ok: true } : refused("persist-failed");
|
|
41
|
+
};
|
|
42
|
+
const summaries = async () => (await persist.listSummaries()).filter(isFeatureSummary);
|
|
43
|
+
/** Load, check the state, change, write. */
|
|
44
|
+
const transition = async (key, from, change) => {
|
|
45
|
+
const found = await loadFeature(key);
|
|
46
|
+
if (found === undefined) {
|
|
47
|
+
return refused("not-found");
|
|
48
|
+
}
|
|
49
|
+
if (!from.includes(found.state)) {
|
|
50
|
+
return refused("illegal-transition");
|
|
51
|
+
}
|
|
52
|
+
const next = structuredClone(found);
|
|
53
|
+
change(next);
|
|
54
|
+
return await write(next);
|
|
55
|
+
};
|
|
56
|
+
return {
|
|
57
|
+
async admitFeature(feature) {
|
|
58
|
+
const existing = await loadFeature(feature.key);
|
|
59
|
+
if (existing === undefined) {
|
|
60
|
+
return await write({
|
|
61
|
+
kind: "feature",
|
|
62
|
+
intention: cloneIntention(feature),
|
|
63
|
+
state: "waiting",
|
|
64
|
+
received_at: now(),
|
|
65
|
+
tickets: [],
|
|
66
|
+
resumes: 0,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
if (existing.state === "done") {
|
|
70
|
+
return refused("too-late");
|
|
71
|
+
}
|
|
72
|
+
if (existing.state === "cancelled") {
|
|
73
|
+
return refused("illegal-transition");
|
|
74
|
+
}
|
|
75
|
+
if (existing.state === "waiting") {
|
|
76
|
+
if (existing.intention.fingerprint === feature.fingerprint) {
|
|
77
|
+
return { ok: true };
|
|
78
|
+
}
|
|
79
|
+
const next = structuredClone(existing);
|
|
80
|
+
next.intention = cloneIntention(feature);
|
|
81
|
+
return await write(next);
|
|
82
|
+
}
|
|
83
|
+
if (feature.fingerprint === existing.intention.fingerprint ||
|
|
84
|
+
feature.fingerprint === existing.pending_fingerprint) {
|
|
85
|
+
return { ok: true };
|
|
86
|
+
}
|
|
87
|
+
const next = structuredClone(existing);
|
|
88
|
+
next.pending_fingerprint = feature.fingerprint;
|
|
89
|
+
return await write(next);
|
|
90
|
+
},
|
|
91
|
+
async nextFeature(project) {
|
|
92
|
+
const all = await summaries();
|
|
93
|
+
if (all.some((s) => s.project === project && HOLDING.has(s.state))) {
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
96
|
+
const waiting = all
|
|
97
|
+
.filter((s) => s.project === project && s.state === "waiting")
|
|
98
|
+
.sort((a, b) => b.priority - a.priority || a.received_at - b.received_at);
|
|
99
|
+
for (const candidate of waiting) {
|
|
100
|
+
const loaded = await loadFeature(candidate.key);
|
|
101
|
+
if (loaded === undefined) {
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
let unblocked = true;
|
|
105
|
+
for (const blocker of loaded.intention.blocked_by) {
|
|
106
|
+
if ((await loadFeature(blocker))?.state !== "done") {
|
|
107
|
+
unblocked = false;
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (unblocked) {
|
|
112
|
+
return candidate;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return undefined;
|
|
116
|
+
},
|
|
117
|
+
async openFeature(input) {
|
|
118
|
+
const found = await loadFeature(input.key);
|
|
119
|
+
if (found === undefined) {
|
|
120
|
+
return refused("not-found");
|
|
121
|
+
}
|
|
122
|
+
if (found.state !== "waiting") {
|
|
123
|
+
return refused("illegal-transition");
|
|
124
|
+
}
|
|
125
|
+
const all = await summaries();
|
|
126
|
+
if (all.some((s) => s.project === found.intention.project && HOLDING.has(s.state))) {
|
|
127
|
+
return refused("project-busy");
|
|
128
|
+
}
|
|
129
|
+
const next = structuredClone(found);
|
|
130
|
+
next.state = "open";
|
|
131
|
+
if (input.line !== undefined) {
|
|
132
|
+
next.line = input.line;
|
|
133
|
+
}
|
|
134
|
+
next.tickets = [...input.tickets];
|
|
135
|
+
return await write(next);
|
|
136
|
+
},
|
|
137
|
+
async markFeatureSubmitted(input) {
|
|
138
|
+
return await transition(input.key, ["open"], (aggregate) => {
|
|
139
|
+
aggregate.state = "submitted";
|
|
140
|
+
// Rebuilt field by field so what was spent on the line is carried on
|
|
141
|
+
// purpose: offered again, it is the same delivery with new content.
|
|
142
|
+
const previous = aggregate.submission;
|
|
143
|
+
aggregate.submission = {
|
|
144
|
+
reference: input.reference,
|
|
145
|
+
submitted_at: previous?.submitted_at ?? now(),
|
|
146
|
+
...(previous?.refusals === undefined ? {} : { refusals: previous.refusals }),
|
|
147
|
+
...(previous?.realigns === undefined ? {} : { realigns: previous.realigns }),
|
|
148
|
+
...(previous?.last_report === undefined ? {} : { last_report: previous.last_report }),
|
|
149
|
+
...(previous?.last_refused_by === undefined
|
|
150
|
+
? {}
|
|
151
|
+
: { last_refused_by: previous.last_refused_by }),
|
|
152
|
+
};
|
|
153
|
+
});
|
|
154
|
+
},
|
|
155
|
+
async recordFeatureRefusal(input) {
|
|
156
|
+
return await transition(input.key, ["submitted"], (aggregate) => {
|
|
157
|
+
if (aggregate.submission === undefined) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
aggregate.submission = {
|
|
161
|
+
...aggregate.submission,
|
|
162
|
+
refusals: (aggregate.submission.refusals ?? 0) + 1,
|
|
163
|
+
last_report: input.report,
|
|
164
|
+
...(input.refusedBy === undefined ? {} : { last_refused_by: input.refusedBy }),
|
|
165
|
+
};
|
|
166
|
+
aggregate.state = "open";
|
|
167
|
+
// A parked refusal from before the line was offered is stale the moment
|
|
168
|
+
// a Submission has its own: two reports would leave the fix guessing.
|
|
169
|
+
delete aggregate.parked_refusal;
|
|
170
|
+
});
|
|
171
|
+
},
|
|
172
|
+
async recordFeatureRealign(key) {
|
|
173
|
+
return await transition(key, ["submitted"], (aggregate) => {
|
|
174
|
+
if (aggregate.submission === undefined) {
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
// What an earlier refusal said was repaired already; left in place it
|
|
178
|
+
// would send the next round to repair it again.
|
|
179
|
+
const { last_report: _report, last_refused_by: _by, ...kept } = aggregate.submission;
|
|
180
|
+
aggregate.submission = { ...kept, realigns: (kept.realigns ?? 0) + 1 };
|
|
181
|
+
aggregate.state = "open";
|
|
182
|
+
delete aggregate.parked_refusal;
|
|
183
|
+
});
|
|
184
|
+
},
|
|
185
|
+
async recordFeatureParkedRefusal(input) {
|
|
186
|
+
return await transition(input.key, ["open"], (aggregate) => {
|
|
187
|
+
aggregate.parked_refusal = {
|
|
188
|
+
report: input.report,
|
|
189
|
+
...(input.refusedBy === undefined ? {} : { refused_by: input.refusedBy }),
|
|
190
|
+
};
|
|
191
|
+
aggregate.parked_refusals = (aggregate.parked_refusals ?? 0) + 1;
|
|
192
|
+
});
|
|
193
|
+
},
|
|
194
|
+
async clearFeatureParkedRefusal(key) {
|
|
195
|
+
const found = await loadFeature(key);
|
|
196
|
+
if (found === undefined) {
|
|
197
|
+
return refused("not-found");
|
|
198
|
+
}
|
|
199
|
+
if (found.parked_refusal === undefined) {
|
|
200
|
+
return { ok: true };
|
|
201
|
+
}
|
|
202
|
+
const next = structuredClone(found);
|
|
203
|
+
delete next.parked_refusal;
|
|
204
|
+
return await write(next);
|
|
205
|
+
},
|
|
206
|
+
async markFeatureDone(key, input) {
|
|
207
|
+
return await transition(key, ["submitted"], (aggregate) => {
|
|
208
|
+
aggregate.state = "done";
|
|
209
|
+
if (input?.reference !== undefined) {
|
|
210
|
+
aggregate.integration_reference = input.reference;
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
},
|
|
214
|
+
async escalateFeature(input) {
|
|
215
|
+
return await transition(input.key, ["open", "submitted"], (aggregate) => {
|
|
216
|
+
aggregate.state = "escalated";
|
|
217
|
+
if (input.report !== undefined && input.report.trim().length > 0) {
|
|
218
|
+
aggregate.escalation = { report: input.report };
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
aggregate.escalation = {};
|
|
222
|
+
}
|
|
223
|
+
delete aggregate.pending_fingerprint;
|
|
224
|
+
});
|
|
225
|
+
},
|
|
226
|
+
async resumeFeature(key) {
|
|
227
|
+
return await transition(key, ["escalated"], (aggregate) => {
|
|
228
|
+
aggregate.state = "open";
|
|
229
|
+
aggregate.resumes += 1;
|
|
230
|
+
delete aggregate.escalation;
|
|
231
|
+
});
|
|
232
|
+
},
|
|
233
|
+
async setFeatureSkipE2e(input) {
|
|
234
|
+
return await transition(input.key, ["waiting", "open", "escalated"], (aggregate) => {
|
|
235
|
+
if (input.skip) {
|
|
236
|
+
aggregate.intention.skip_e2e = true;
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
delete aggregate.intention.skip_e2e;
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
},
|
|
243
|
+
async cancelFeature(key) {
|
|
244
|
+
const found = await loadFeature(key);
|
|
245
|
+
if (found === undefined) {
|
|
246
|
+
return refused("not-found");
|
|
247
|
+
}
|
|
248
|
+
if (found.state === "done") {
|
|
249
|
+
return refused("point-of-no-return");
|
|
250
|
+
}
|
|
251
|
+
if (found.state === "cancelled") {
|
|
252
|
+
return { ok: true };
|
|
253
|
+
}
|
|
254
|
+
const next = structuredClone(found);
|
|
255
|
+
next.state = "cancelled";
|
|
256
|
+
return await write(next);
|
|
257
|
+
},
|
|
258
|
+
async getFeature(key) {
|
|
259
|
+
const found = await loadFeature(key);
|
|
260
|
+
return found === undefined
|
|
261
|
+
? { ok: false, code: "not-found" }
|
|
262
|
+
: { ok: true, aggregate: found };
|
|
263
|
+
},
|
|
264
|
+
async listFeatures() {
|
|
265
|
+
return await summaries();
|
|
266
|
+
},
|
|
267
|
+
async activeFeatureOn(project) {
|
|
268
|
+
return (await summaries()).find((s) => s.project === project && HOLDING.has(s.state));
|
|
269
|
+
},
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=feature-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-commands.js","sourceRoot":"","sources":["../../src/ledger/feature-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,9 @@
|
|
|
1
1
|
import type { PersistencePort } from "../persist/port.js";
|
|
2
|
-
import type { EscalationKind,
|
|
3
|
-
import { type
|
|
4
|
-
|
|
5
|
-
export type
|
|
6
|
-
|
|
7
|
-
};
|
|
8
|
-
export type CommandRefused = {
|
|
9
|
-
ok: false;
|
|
10
|
-
code: RefusalCode;
|
|
11
|
-
};
|
|
12
|
-
export type CommandResult = CommandOk | CommandRefused;
|
|
2
|
+
import type { EscalationKind, TicketAggregate, TicketIntention, TicketSummary, TraceRecord } from "../records.js";
|
|
3
|
+
import { type FeatureCommands } from "./feature-commands.js";
|
|
4
|
+
import { type CommandRefused, type CommandResult } from "./results.js";
|
|
5
|
+
export type TicketAdmission = TicketIntention;
|
|
6
|
+
export type { CommandOk, CommandRefused, CommandResult } from "./results.js";
|
|
13
7
|
export type ClaimResult = {
|
|
14
8
|
ok: true;
|
|
15
9
|
key: string;
|
|
@@ -19,7 +13,7 @@ export type ClaimResult = {
|
|
|
19
13
|
} | CommandRefused;
|
|
20
14
|
export type GetResult = {
|
|
21
15
|
ok: true;
|
|
22
|
-
aggregate:
|
|
16
|
+
aggregate: TicketAggregate;
|
|
23
17
|
} | {
|
|
24
18
|
ok: false;
|
|
25
19
|
code: "not-found";
|
|
@@ -32,33 +26,24 @@ export type OpenWorkLedgerOptions = {
|
|
|
32
26
|
export type EscalateInput = {
|
|
33
27
|
key: string;
|
|
34
28
|
kind: EscalationKind;
|
|
35
|
-
subtaskId?: string;
|
|
36
29
|
/** Why it stopped. Kept so the person who reads the escalation is told. */
|
|
37
30
|
report?: string;
|
|
38
31
|
};
|
|
39
32
|
export type RecordAttemptInput = {
|
|
40
33
|
key: string;
|
|
41
|
-
subtaskId: string;
|
|
42
34
|
number: number;
|
|
43
35
|
trace?: TraceRecord;
|
|
44
36
|
};
|
|
45
37
|
export type DeclareWorkspaceInput = {
|
|
46
38
|
key: string;
|
|
47
|
-
|
|
48
|
-
subtask?: string;
|
|
49
|
-
};
|
|
50
|
-
export type ClearWorkspaceInput = {
|
|
51
|
-
key: string;
|
|
52
|
-
feature?: boolean;
|
|
53
|
-
subtask?: boolean;
|
|
39
|
+
path: string;
|
|
54
40
|
};
|
|
55
41
|
export type DeclaredWorkspace = {
|
|
56
42
|
key: string;
|
|
57
|
-
|
|
58
|
-
subtask?: string;
|
|
43
|
+
path: string;
|
|
59
44
|
};
|
|
60
|
-
export type WorkLedger = {
|
|
61
|
-
admit(
|
|
45
|
+
export type WorkLedger = FeatureCommands & {
|
|
46
|
+
admit(ticket: TicketAdmission): Promise<CommandResult>;
|
|
62
47
|
recordInvalid(input: {
|
|
63
48
|
key: string;
|
|
64
49
|
project: string;
|
|
@@ -68,26 +53,17 @@ export type WorkLedger = {
|
|
|
68
53
|
fingerprint?: string;
|
|
69
54
|
priority?: number;
|
|
70
55
|
}): Promise<CommandResult>;
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
refusePlan(input: {
|
|
78
|
-
key: string;
|
|
79
|
-
code: string;
|
|
80
|
-
reason: string;
|
|
81
|
-
}): Promise<CommandResult>;
|
|
82
|
-
startSubtask(input: {
|
|
83
|
-
key: string;
|
|
84
|
-
subtaskId: string;
|
|
85
|
-
}): Promise<CommandResult>;
|
|
56
|
+
/**
|
|
57
|
+
* Take the next Ticket that may start. `limit` is how many Tickets of the
|
|
58
|
+
* Project may be active at once; default 1. Two calls never take the same
|
|
59
|
+
* Ticket or go past the limit.
|
|
60
|
+
*/
|
|
61
|
+
claim(project: string, limit?: number): Promise<ClaimResult>;
|
|
86
62
|
recordAttempt(input: RecordAttemptInput): Promise<CommandResult>;
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
63
|
+
/** The unit starts: from here the Ticket holds a lease until it ends. */
|
|
64
|
+
startUnit(key: string): Promise<CommandResult>;
|
|
65
|
+
/** The unit passed its Gates: the work is assembled and judged next. */
|
|
66
|
+
markIntegrating(key: string): Promise<CommandResult>;
|
|
91
67
|
markSubmitted(input: {
|
|
92
68
|
key: string;
|
|
93
69
|
reference: string;
|
|
@@ -97,6 +73,10 @@ export type WorkLedger = {
|
|
|
97
73
|
report: string;
|
|
98
74
|
refusedBy?: string;
|
|
99
75
|
}): Promise<CommandResult>;
|
|
76
|
+
/** The line moved on while the Submission waited: back to `integrating` to be aligned again. */
|
|
77
|
+
recordRealign(input: {
|
|
78
|
+
key: string;
|
|
79
|
+
}): Promise<CommandResult>;
|
|
100
80
|
recordParkedRefusal(input: {
|
|
101
81
|
key: string;
|
|
102
82
|
report: string;
|
|
@@ -108,25 +88,28 @@ export type WorkLedger = {
|
|
|
108
88
|
reference?: string | undefined;
|
|
109
89
|
}): Promise<CommandResult>;
|
|
110
90
|
escalate(input: EscalateInput): Promise<CommandResult>;
|
|
111
|
-
|
|
91
|
+
resumeTicket(key: string): Promise<CommandResult>;
|
|
112
92
|
cancel(key: string): Promise<CommandResult>;
|
|
113
93
|
declareWorkspace(input: DeclareWorkspaceInput): Promise<CommandResult>;
|
|
114
|
-
clearWorkspace(
|
|
94
|
+
clearWorkspace(key: string): Promise<CommandResult>;
|
|
95
|
+
/** The stage made before the producer is complete in the declared workspace. */
|
|
96
|
+
markFirstStageDone(key: string): Promise<CommandResult>;
|
|
115
97
|
expireBail(key: string): Promise<CommandResult>;
|
|
116
98
|
/**
|
|
117
|
-
* Drop a held
|
|
118
|
-
*
|
|
99
|
+
* Drop a held unit without waiting for the bail clock. Unlike an expired bail it spends no
|
|
100
|
+
* Attempt: the unit stopped on purpose and recorded the Attempts it finished.
|
|
119
101
|
*/
|
|
120
102
|
releaseBail(key: string): Promise<CommandResult>;
|
|
121
103
|
renewBail(key: string): Promise<CommandResult>;
|
|
122
104
|
get(key: string): Promise<GetResult>;
|
|
123
|
-
/** Every known
|
|
124
|
-
list(): Promise<
|
|
125
|
-
/** Every
|
|
126
|
-
listInFlight(): Promise<
|
|
127
|
-
activeOn(project: string): Promise<
|
|
128
|
-
|
|
129
|
-
|
|
105
|
+
/** Every known Ticket, whatever its state. */
|
|
106
|
+
list(): Promise<TicketSummary[]>;
|
|
107
|
+
/** Every Ticket mid-flight, whatever its Project. */
|
|
108
|
+
listInFlight(): Promise<TicketSummary[]>;
|
|
109
|
+
activeOn(project: string): Promise<TicketSummary | undefined>;
|
|
110
|
+
/** Every active Ticket of a Project, escalated ones included. */
|
|
111
|
+
activeTickets(project: string): Promise<TicketSummary[]>;
|
|
112
|
+
nextReceived(project: string): Promise<TicketSummary | undefined>;
|
|
130
113
|
listDeclaredWorkspaces(): Promise<DeclaredWorkspace[]>;
|
|
131
114
|
};
|
|
132
115
|
export declare function openWorkLedger(options: OpenWorkLedgerOptions): WorkLedger;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open-work-ledger.d.ts","sourceRoot":"","sources":["../../src/ledger/open-work-ledger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"open-work-ledger.d.ts","sourceRoot":"","sources":["../../src/ledger/open-work-ledger.ts"],"names":[],"mappings":"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"}
|