@knpkv/jcf-web 0.2.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 (62) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +315 -0
  3. package/dist/client/assets/AgentSettingsPanel-NhTzwiq6.js +1 -0
  4. package/dist/client/assets/Schema-DUFTUil2.js +2 -0
  5. package/dist/client/assets/UrlParams-ZN2s8OM_.js +6 -0
  6. package/dist/client/assets/agentSettings-nw9lCgBQ.js +1 -0
  7. package/dist/client/assets/api-BQCWhiKV.js +4 -0
  8. package/dist/client/assets/decoding-CebF86HD.js +1 -0
  9. package/dist/client/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
  10. package/dist/client/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2 +0 -0
  11. package/dist/client/assets/index-Ch0W9DhA.css +1 -0
  12. package/dist/client/assets/index-N2vhoKYl.js +51 -0
  13. package/dist/client/assets/rolldown-runtime-hePW80VL.js +1 -0
  14. package/dist/client/assets/transport-AcByYfLh.js +1 -0
  15. package/dist/client/index.html +19 -0
  16. package/dist/index.d.ts +11 -0
  17. package/dist/index.js +12 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/main.d.ts +2 -0
  20. package/dist/main.js +32 -0
  21. package/dist/main.js.map +1 -0
  22. package/dist/server/Api.d.ts +789 -0
  23. package/dist/server/Api.js +98 -0
  24. package/dist/server/Api.js.map +1 -0
  25. package/dist/server/Confirm.d.ts +94 -0
  26. package/dist/server/Confirm.js +243 -0
  27. package/dist/server/Confirm.js.map +1 -0
  28. package/dist/server/Handlers.d.ts +14 -0
  29. package/dist/server/Handlers.js +157 -0
  30. package/dist/server/Handlers.js.map +1 -0
  31. package/dist/server/HttpApplication.d.ts +7 -0
  32. package/dist/server/HttpApplication.js +62 -0
  33. package/dist/server/HttpApplication.js.map +1 -0
  34. package/dist/server/OwnerSession.d.ts +62 -0
  35. package/dist/server/OwnerSession.js +219 -0
  36. package/dist/server/OwnerSession.js.map +1 -0
  37. package/dist/server/RowDescriptions.d.ts +19 -0
  38. package/dist/server/RowDescriptions.js +42 -0
  39. package/dist/server/RowDescriptions.js.map +1 -0
  40. package/dist/server/SavedEntryOperations.d.ts +27 -0
  41. package/dist/server/SavedEntryOperations.js +171 -0
  42. package/dist/server/SavedEntryOperations.js.map +1 -0
  43. package/dist/server/Server.d.ts +13 -0
  44. package/dist/server/Server.js +29 -0
  45. package/dist/server/Server.js.map +1 -0
  46. package/dist/server/WeekPlan.d.ts +110 -0
  47. package/dist/server/WeekPlan.js +258 -0
  48. package/dist/server/WeekPlan.js.map +1 -0
  49. package/dist/server/WeekPlans.d.ts +30 -0
  50. package/dist/server/WeekPlans.js +190 -0
  51. package/dist/server/WeekPlans.js.map +1 -0
  52. package/dist/server/WeekRead.d.ts +435 -0
  53. package/dist/server/WeekRead.js +189 -0
  54. package/dist/server/WeekRead.js.map +1 -0
  55. package/dist/shared/contracts.d.ts +901 -0
  56. package/dist/shared/contracts.js +365 -0
  57. package/dist/shared/contracts.js.map +1 -0
  58. package/dist/shared/writePlanning.d.ts +6 -0
  59. package/dist/shared/writePlanning.js +19 -0
  60. package/dist/shared/writePlanning.js.map +1 -0
  61. package/dist/tsconfig.tsbuildinfo +1 -0
  62. package/package.json +60 -0
@@ -0,0 +1,30 @@
1
+ /** Server-held evidence for six recent week/scope pairs. Restoring it never reads sessions. */
2
+ import { ConfigService, ReconcileService, SavedEntries, SessionAttributor } from "@knpkv/jira-clockify";
3
+ import { Context, Crypto, Effect, FileSystem, Layer, Path } from "effect";
4
+ import type { PlatformError } from "effect";
5
+ import { ApiError, PlanExpiredError, ProposalRejectedError } from "../shared/contracts.js";
6
+ import type { DescribeRowRequest, DescribeRowResponse, DescribeSavedEntryRequest, DescribeSavedEntryResponse, UpdateSavedEntryRequest, UpdateSavedEntryResponse, WeekScopeName } from "../shared/contracts.js";
7
+ import { type HeldPlan } from "./WeekPlan.js";
8
+ export interface WeekPlansContract {
9
+ readonly nextPlanId: Effect.Effect<string, PlatformError.PlatformError>;
10
+ /** Capture before reading provider state; a save invalidates every in-flight provider snapshot. */
11
+ readonly readGeneration: Effect.Effect<number>;
12
+ /** Retain a plan, returning the existing scan if a recorded-only read raced with it. */
13
+ readonly keep: (plan: HeldPlan, generation: number) => Effect.Effect<HeldPlan, PlanExpiredError>;
14
+ /** Compare-and-set for provider refreshes; an older read cannot replace an edited or rescanned plan. */
15
+ readonly replace: (expected: HeldPlan, replacement: HeldPlan, generation: number) => Effect.Effect<HeldPlan, PlanExpiredError>;
16
+ readonly forWeek: (monday: string, scope: WeekScopeName) => Effect.Effect<HeldPlan | undefined>;
17
+ readonly find: (planId: string) => Effect.Effect<HeldPlan | undefined>;
18
+ readonly describe: (request: DescribeRowRequest) => Effect.Effect<DescribeRowResponse, ApiError | PlanExpiredError>;
19
+ readonly describeSaved: (request: DescribeSavedEntryRequest) => Effect.Effect<DescribeSavedEntryResponse, ApiError | PlanExpiredError>;
20
+ readonly updateSaved: (request: UpdateSavedEntryRequest) => Effect.Effect<UpdateSavedEntryResponse, ApiError | PlanExpiredError | ProposalRejectedError>;
21
+ /** Call before and after changing agent settings so even pending lookups cannot reuse old results. */
22
+ readonly invalidateDescriptions: Effect.Effect<void>;
23
+ /** Serialize a live provider tally and the writes it authorizes. */
24
+ readonly withConfirmationPermit: <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E | ProposalRejectedError, R>;
25
+ }
26
+ declare const WeekPlans_base: Context.ServiceClass<WeekPlans, "@knpkv/jcf-web/WeekPlans", WeekPlansContract>;
27
+ export declare class WeekPlans extends WeekPlans_base {
28
+ }
29
+ export declare const layer: Layer.Layer<WeekPlans, never, ConfigService.ConfigService | Crypto.Crypto | FileSystem.FileSystem | Path.Path | ReconcileService.ReconcileService | SavedEntries.SavedEntries | SessionAttributor.SessionAttributor>;
30
+ export {};
@@ -0,0 +1,190 @@
1
+ /** Server-held evidence for six recent week/scope pairs. Restoring it never reads sessions. */
2
+ import { ConfigService, ReconcileService, SavedEntries, SessionAttributor, WriterGuard } from "@knpkv/jira-clockify";
3
+ import { Cache, Context, Crypto, Effect, FileSystem, Layer, Path, Ref, Semaphore } from "effect";
4
+ import { ApiError, PlanExpiredError, ProposalRejectedError } from "../shared/contracts.js";
5
+ import { agentSettingsKey, makeRowDescriptions } from "./RowDescriptions.js";
6
+ import { describeSavedEntry, findSavedEntry, replaceSavedEntry, savedEntryFailure, validateSavedUpdate } from "./SavedEntryOperations.js";
7
+ import { reconcileConsumption, withProjectedConsumption } from "./WeekPlan.js";
8
+ /** Weeks kept at once. Enough for stepping back through a month one week at a time. */
9
+ const RETAINED_PLANS = 6;
10
+ export class WeekPlans extends Context.Service()("@knpkv/jcf-web/WeekPlans") {
11
+ }
12
+ /** Tells the browser user what to do when the machine writer guard refuses a write. */
13
+ const browserGuardMessage = (error) => {
14
+ switch (error.reason) {
15
+ case "taken":
16
+ return "jcf watch is writing time. Stop it before changing provider entries in the browser.";
17
+ case "unavailable":
18
+ return `Could not take the machine writer guard: ${error.message}.`;
19
+ case "lost":
20
+ case "missing":
21
+ return error.message;
22
+ }
23
+ };
24
+ export const layer = Layer.effect(WeekPlans, Effect.gen(function* () {
25
+ const cryptoService = yield* Crypto.Crypto;
26
+ const config = yield* ConfigService.ConfigService;
27
+ const fileSystem = yield* FileSystem.FileSystem;
28
+ const path = yield* Path.Path;
29
+ const reconcile = yield* ReconcileService.ReconcileService;
30
+ const savedEntries = yield* SavedEntries.SavedEntries;
31
+ const attributor = yield* SessionAttributor.SessionAttributor;
32
+ const mutations = yield* Semaphore.make(1);
33
+ const revision = yield* Ref.make(0);
34
+ const readGeneration = yield* Ref.make(0);
35
+ const plans = yield* Ref.make([]);
36
+ const find = (planId) => Ref.get(plans).pipe(Effect.map((held) => held.find(({ plan }) => plan.planId === planId)?.plan));
37
+ const provideGuard = (effect) => effect.pipe(Effect.provideService(ConfigService.ConfigService, config), Effect.provideService(FileSystem.FileSystem, fileSystem), Effect.provideService(Path.Path, path));
38
+ const withProviderPermit = (effect) => mutations.withPermits(1)(provideGuard(WriterGuard.withWriterGuard(effect)).pipe(Effect.mapError((error) => WriterGuard.isWriterGuardError(error)
39
+ ? new ProposalRejectedError({ message: browserGuardMessage(error) })
40
+ : error)));
41
+ return WeekPlans.of({
42
+ withConfirmationPermit: withProviderPermit,
43
+ readGeneration: Ref.get(readGeneration),
44
+ forWeek: (monday, scope) => Ref.get(plans).pipe(Effect.map((held) => held.find(({ plan }) => plan.plan.monday === monday && plan.plan.scope === scope)?.plan)),
45
+ find,
46
+ replace: Effect.fn("WeekPlans.replace")(function* (expected, replacement, generation) {
47
+ const current = yield* find(expected.planId);
48
+ if (current === undefined) {
49
+ return yield* new PlanExpiredError({ message: "This week was replaced while refreshing. Reload it." });
50
+ }
51
+ if (current !== expected || (yield* Ref.get(readGeneration)) !== generation) {
52
+ return yield* new PlanExpiredError({ message: "Saved entries changed during refresh. Retry Refresh totals." });
53
+ }
54
+ if ((current.boundScopes.clockify !== null && replacement.boundScopes.clockify !== null &&
55
+ current.boundScopes.clockify !== replacement.boundScopes.clockify) ||
56
+ (current.boundScopes.jira !== null && replacement.boundScopes.jira !== null &&
57
+ current.boundScopes.jira !== replacement.boundScopes.jira)) {
58
+ return yield* new PlanExpiredError({
59
+ message: "The provider account changed during refresh. Reload this week before confirming."
60
+ });
61
+ }
62
+ const retained = {
63
+ ...replacement,
64
+ boundScopes: {
65
+ clockify: current.boundScopes.clockify ?? replacement.boundScopes.clockify,
66
+ jira: current.boundScopes.jira ?? replacement.boundScopes.jira
67
+ }
68
+ };
69
+ yield* Ref.update(plans, (held) => held.map((entry) => entry.plan === expected ? { ...entry, plan: retained } : entry));
70
+ return retained;
71
+ }, mutations.withPermit),
72
+ updateSaved: Effect.fn("WeekPlans.updateSaved")(function* (request) {
73
+ const plan = yield* find(request.planId);
74
+ const expected = plan === undefined ? undefined : findSavedEntry(plan, request);
75
+ if (plan === undefined || expected === undefined) {
76
+ return yield* new PlanExpiredError({ message: "That saved entry is not part of a retained week. Reload it." });
77
+ }
78
+ if (expected.revision !== request.revision) {
79
+ return yield* new PlanExpiredError({
80
+ message: "That saved entry changed since you opened it. Reload before saving."
81
+ });
82
+ }
83
+ yield* validateSavedUpdate(plan, expected, request);
84
+ const nextRevision = yield* cryptoService.randomUUIDv4.pipe(Effect.mapError(() => new ApiError({ message: "Could not create an entry revision. Retry the save." })));
85
+ const saved = yield* savedEntries.update({
86
+ expected,
87
+ startMs: request.startMs,
88
+ endMs: request.endMs,
89
+ description: request.description
90
+ }).pipe(Effect.mapError(savedEntryFailure));
91
+ const entry = { ...saved, revision: nextRevision };
92
+ const replacement = replaceSavedEntry(plan, entry);
93
+ const descriptions = yield* makeRowDescriptions({
94
+ plan: find(replacement.planId),
95
+ config,
96
+ reconcile,
97
+ revision: Ref.get(revision)
98
+ });
99
+ yield* Ref.update(plans, (held) => held.map((retained) => retained.plan === plan ? { plan: replacement, descriptions } : retained));
100
+ yield* Ref.update(readGeneration, (value) => value + 1);
101
+ return { planId: request.planId, entry };
102
+ }, withProviderPermit),
103
+ describeSaved: Effect.fn("WeekPlans.describeSaved")(function* (request) {
104
+ const plan = yield* find(request.planId);
105
+ const entry = plan === undefined ? undefined : findSavedEntry(plan, request);
106
+ if (plan === undefined || entry === undefined) {
107
+ return yield* new PlanExpiredError({ message: "That saved entry is not part of a retained week. Reload it." });
108
+ }
109
+ const currentRevision = yield* Ref.get(revision);
110
+ const settings = agentSettingsKey((yield* config.get).sessionAgent);
111
+ const result = yield* describeSavedEntry({ plan, entry, attributor });
112
+ const current = yield* find(request.planId);
113
+ if (current === undefined || findSavedEntry(current, request)?.revision !== entry.revision) {
114
+ return yield* new PlanExpiredError({
115
+ message: "The saved entry changed while generating its description. Reload it."
116
+ });
117
+ }
118
+ if ((yield* Ref.get(revision)) !== currentRevision ||
119
+ agentSettingsKey((yield* config.get).sessionAgent) !== settings) {
120
+ return yield* new ApiError({ message: "Agent settings changed while generating the description. Retry." });
121
+ }
122
+ return { ...request, ...result };
123
+ }),
124
+ describe: Effect.fn("WeekPlans.describe")(function* (request) {
125
+ const retained = (yield* Ref.get(plans)).find(({ plan }) => plan.planId === request.planId);
126
+ if (retained === undefined || !retained.plan.evidence.has(request.rowId)) {
127
+ return yield* new PlanExpiredError({ message: "That row is not part of a retained week — reload it" });
128
+ }
129
+ const currentRevision = yield* Ref.get(revision);
130
+ const settings = (yield* config.get).sessionAgent;
131
+ const note = yield* Cache.get(retained.descriptions, {
132
+ rowId: request.rowId,
133
+ settings: agentSettingsKey(settings),
134
+ revision: currentRevision
135
+ });
136
+ if (!(yield* Ref.get(plans)).some(({ plan }) => plan.planId === request.planId)) {
137
+ return yield* new PlanExpiredError({ message: "This week was replaced while generating the description" });
138
+ }
139
+ return { ...request, note };
140
+ }),
141
+ invalidateDescriptions: Effect.gen(function* () {
142
+ yield* Ref.update(revision, (value) => value + 1);
143
+ yield* Effect.forEach(yield* Ref.get(plans), ({ descriptions }) => Cache.invalidateAll(descriptions));
144
+ }),
145
+ keep: Effect.fn("WeekPlans.keep")(function* (plan, generation) {
146
+ if ((yield* Ref.get(readGeneration)) !== generation) {
147
+ return yield* new PlanExpiredError({
148
+ message: "Saved entries changed during this read. Retry the week read."
149
+ });
150
+ }
151
+ const descriptions = yield* makeRowDescriptions({
152
+ plan: find(plan.planId),
153
+ config,
154
+ reconcile,
155
+ revision: Ref.get(revision)
156
+ });
157
+ return yield* Ref.modify(plans, (held) => {
158
+ const scanned = held.find(({ plan: existing }) => existing.plan.monday === plan.plan.monday && existing.plan.scope === plan.plan.scope &&
159
+ existing.plan.sessionScanAvailable !== false);
160
+ const consumptionOwner = held.find(({ plan: existing }) => existing.plan.monday === plan.plan.monday && existing.plan.sessionScanAvailable !== false);
161
+ if (plan.plan.sessionScanAvailable === false && scanned !== undefined)
162
+ return [scanned.plan, held];
163
+ const previous = held.find(({ plan: existing }) => existing.planId === plan.planId);
164
+ // A new session scan changes the plan id, not which source blocks this server already
165
+ // wrote under a corrected ticket. Carry that consumption across the replacement.
166
+ const retainedPlan = consumptionOwner === undefined
167
+ ? plan
168
+ : {
169
+ ...withProjectedConsumption(plan, reconcileConsumption(plan.report, consumptionOwner.plan.consumption)),
170
+ boundScopes: {
171
+ clockify: plan.boundScopes.clockify ?? consumptionOwner.plan.boundScopes.clockify,
172
+ jira: plan.boundScopes.jira ?? consumptionOwner.plan.boundScopes.jira
173
+ },
174
+ jiraReceiptIssueKeys: consumptionOwner.plan.jiraReceiptIssueKeys
175
+ };
176
+ return [
177
+ retainedPlan,
178
+ [
179
+ { plan: retainedPlan, descriptions: previous?.descriptions ?? descriptions },
180
+ // Re-reading the same week replaces its plan rather than filling the window with copies.
181
+ ...held.filter(({ plan: existing }) => existing.planId !== plan.planId &&
182
+ (existing.plan.monday !== plan.plan.monday || existing.plan.scope !== plan.plan.scope))
183
+ ].slice(0, RETAINED_PLANS)
184
+ ];
185
+ });
186
+ }, mutations.withPermit),
187
+ nextPlanId: cryptoService.randomUUIDv4
188
+ });
189
+ }));
190
+ //# sourceMappingURL=WeekPlans.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WeekPlans.js","sourceRoot":"","sources":["../../src/server/WeekPlans.ts"],"names":[],"mappings":"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"}