workday-daemon 0.7.3 → 0.9.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 (38) hide show
  1. package/README.md +0 -1
  2. package/dist/cli.js +6 -66
  3. package/dist/cli.js.map +1 -1
  4. package/dist/collectors/git-client.d.ts +27 -1
  5. package/dist/collectors/git-client.js +94 -0
  6. package/dist/collectors/git-client.js.map +1 -1
  7. package/dist/collectors/git-tracker.d.ts +2 -2
  8. package/dist/collectors/git-tracker.js +14 -3
  9. package/dist/collectors/git-tracker.js.map +1 -1
  10. package/dist/collectors/ledger-collector.d.ts +13 -0
  11. package/dist/collectors/ledger-collector.js +73 -0
  12. package/dist/collectors/ledger-collector.js.map +1 -0
  13. package/dist/core/commit-ledger.d.ts +46 -0
  14. package/dist/core/commit-ledger.js +173 -0
  15. package/dist/core/commit-ledger.js.map +1 -0
  16. package/dist/core/config.d.ts +0 -2
  17. package/dist/core/config.js +0 -20
  18. package/dist/core/config.js.map +1 -1
  19. package/dist/core/constants.d.ts +1 -1
  20. package/dist/core/constants.js +1 -1
  21. package/dist/core/daily-log.d.ts +11 -26
  22. package/dist/core/daily-log.js +15 -80
  23. package/dist/core/daily-log.js.map +1 -1
  24. package/dist/core/session-tracker.d.ts +18 -16
  25. package/dist/core/session-tracker.js +96 -57
  26. package/dist/core/session-tracker.js.map +1 -1
  27. package/dist/core/status-renderer.js +8 -19
  28. package/dist/core/status-renderer.js.map +1 -1
  29. package/dist/core/types.d.ts +65 -11
  30. package/dist/core/types.js +1 -0
  31. package/dist/core/types.js.map +1 -1
  32. package/dist/daemon.d.ts +0 -1
  33. package/dist/daemon.js +2 -11
  34. package/dist/daemon.js.map +1 -1
  35. package/dist/http-server.d.ts +0 -2
  36. package/dist/http-server.js +5 -61
  37. package/dist/http-server.js.map +1 -1
  38. package/package.json +2 -2
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Reflog entries fetched per tick. Far above any realistic number of branch
3
+ * operations between two polls (or across a same-day daemon restart) — when
4
+ * the stored pointer still falls outside this window, the collector degrades
5
+ * to a resync instead of replaying.
6
+ */
7
+ const REFLOG_WINDOW = 200;
8
+ /**
9
+ * Builds the per-tick LedgerUpdate for a repo: seeds a fresh ledger when no
10
+ * session context exists yet, otherwise turns branch-reflog entries since
11
+ * the stored pointer into old→new transitions with full commit metadata.
12
+ *
13
+ * Everything is computed relative to the default branch: commits reachable
14
+ * from it are never "added" (upstream work entering via merge/rebase) and
15
+ * never "removed" (own work merged upstream survives squashes of the local
16
+ * branch).
17
+ */
18
+ export async function collectLedgerUpdate(gitClient, repoPath, branch, mergeBaseSha, defaultBranchRef, query) {
19
+ const reflog = await gitClient.getBranchReflog(repoPath, branch, REFLOG_WINDOW);
20
+ if (reflog.length === 0) {
21
+ // No branch reflog (core.logAllRefUpdates off) — ledger can't work here.
22
+ return null;
23
+ }
24
+ const currentPointer = { sha: reflog[0].sha, ts: reflog[0].ts };
25
+ if (query === null || query.branch !== branch || query.pointer === null) {
26
+ return buildSeed(gitClient, repoPath, mergeBaseSha, currentPointer);
27
+ }
28
+ // Newest occurrence of the stored pointer. Entries above it are unprocessed.
29
+ const pointerIndex = reflog.findIndex(e => e.sha === query.pointer.sha && e.ts === query.pointer.ts);
30
+ if (pointerIndex === -1) {
31
+ // Pointer fell out of the window (long downtime / reflog expired) —
32
+ // rebuild flags from the current branch state instead of replaying.
33
+ return buildResync(gitClient, repoPath, mergeBaseSha, defaultBranchRef, query, currentPointer);
34
+ }
35
+ const transitions = [];
36
+ let oldSha = query.pointer.sha;
37
+ for (let i = pointerIndex - 1; i >= 0; i--) {
38
+ const entry = reflog[i];
39
+ if (entry.sha !== oldSha) {
40
+ const removedShas = await gitClient.revListShas(repoPath, oldSha, [entry.sha, defaultBranchRef]);
41
+ const addedShas = await gitClient.revListShas(repoPath, entry.sha, [oldSha, defaultBranchRef]);
42
+ const added = await gitClient.getCommitsMeta(repoPath, addedShas);
43
+ transitions.push({ ts: entry.ts, removedShas, added });
44
+ }
45
+ oldSha = entry.sha;
46
+ }
47
+ return { kind: 'transitions', transitions, pointer: currentPointer };
48
+ }
49
+ /**
50
+ * Fresh ledger: all commits currently on the branch (vs merge-base). The
51
+ * SessionTracker marks them pre-session at apply time — a new session always
52
+ * starts counting from zero.
53
+ */
54
+ async function buildSeed(gitClient, repoPath, mergeBaseSha, pointer) {
55
+ const shas = await gitClient.revListShas(repoPath, 'HEAD', [mergeBaseSha]);
56
+ const commits = await gitClient.getCommitsMeta(repoPath, shas);
57
+ return { kind: 'seed', commits, pointer };
58
+ }
59
+ async function buildResync(gitClient, repoPath, mergeBaseSha, defaultBranchRef, query, pointer) {
60
+ const liveShas = await gitClient.revListShas(repoPath, 'HEAD', [mergeBaseSha]);
61
+ const liveSet = new Set(liveShas);
62
+ const mergedShas = [];
63
+ for (const sha of query.knownShas) {
64
+ if (!liveSet.has(sha) && await gitClient.isAncestor(repoPath, sha, defaultBranchRef)) {
65
+ mergedShas.push(sha);
66
+ }
67
+ }
68
+ const known = new Set(query.knownShas);
69
+ const unknownShas = liveShas.filter(sha => !known.has(sha));
70
+ const unknownCommits = await gitClient.getCommitsMeta(repoPath, unknownShas);
71
+ return { kind: 'resync', liveShas, mergedShas, unknownCommits, pointer };
72
+ }
73
+ //# sourceMappingURL=ledger-collector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger-collector.js","sourceRoot":"","sources":["../../src/collectors/ledger-collector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import type { CommitLedgerState, CommitMeta, LedgerUpdate } from './types.js';
2
+ /**
3
+ * Commit ledger — exact accounting of "how many commits did this session
4
+ * actually produce", robust to any git operation happening between polls.
5
+ *
6
+ * The 30-second poll can never reconstruct events from counter samples:
7
+ * commit + squash inside one tick shows a net jump of 0 or +1. So instead
8
+ * of counting, the ledger tracks commit *identities* and replays the branch
9
+ * reflog — a complete, persistent journal of every branch-tip move — one
10
+ * transition at a time. Each transition is small and unambiguous.
11
+ *
12
+ * The counter is strictly session-scoped: a fresh session starts at zero,
13
+ * seeded with everything already on the branch as pre-session, and nothing
14
+ * done outside a session (daemon down, session closed) is ever counted.
15
+ *
16
+ * Rewrite matching cascade for a commit that appears in a transition:
17
+ * 0. Known SHA → resurrect (reset back to an old tip).
18
+ * 1. Tree match → squash: the new commit's tree equals the tree
19
+ * of a commit removed earlier; it absorbs the whole chain removed in
20
+ * that same transition and inherits sessionCreated as OR over the
21
+ * chain. This is why squashing a session commit INTO a pre-session
22
+ * commit keeps the counter (the session's work survived, inside a
23
+ * rewritten commit), while squashing two session commits drops 2 → 1.
24
+ * 2. (authorEmail, authorTs) match → rebase pick / amend / reword: git
25
+ * preserves the author timestamp through these, so the rewritten
26
+ * commit inherits the original's membership. Rebasing pre-session
27
+ * commits does NOT count them (committer ts is fresh but the author
28
+ * identity says "old").
29
+ * 3. No match → genuinely new commit; counts when its
30
+ * committer timestamp falls after the session started (`isSessionTs`).
31
+ *
32
+ * Commits merged into the default branch never appear as "removed" (the
33
+ * collector excludes ^defaultRef), so merged work stays counted — it is
34
+ * the most real work of all.
35
+ */
36
+ /** Number of live commits created within this session. */
37
+ export declare function countSessionCommits(state: CommitLedgerState): number;
38
+ /**
39
+ * Apply one poll's ledger update. `countsAsSession(meta)` decides whether an
40
+ * unmatched commit was created by this session — typically: committer
41
+ * timestamp after the session opened (minus a small slack, so the commit
42
+ * that itself triggered the session counts) and not already accounted for
43
+ * by an earlier session's ledger.
44
+ */
45
+ export declare function applyLedgerUpdate(state: CommitLedgerState, update: LedgerUpdate, countsAsSession: (meta: CommitMeta) => boolean): void;
46
+ export declare function createEmptyLedger(): CommitLedgerState;
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Commit ledger — exact accounting of "how many commits did this session
3
+ * actually produce", robust to any git operation happening between polls.
4
+ *
5
+ * The 30-second poll can never reconstruct events from counter samples:
6
+ * commit + squash inside one tick shows a net jump of 0 or +1. So instead
7
+ * of counting, the ledger tracks commit *identities* and replays the branch
8
+ * reflog — a complete, persistent journal of every branch-tip move — one
9
+ * transition at a time. Each transition is small and unambiguous.
10
+ *
11
+ * The counter is strictly session-scoped: a fresh session starts at zero,
12
+ * seeded with everything already on the branch as pre-session, and nothing
13
+ * done outside a session (daemon down, session closed) is ever counted.
14
+ *
15
+ * Rewrite matching cascade for a commit that appears in a transition:
16
+ * 0. Known SHA → resurrect (reset back to an old tip).
17
+ * 1. Tree match → squash: the new commit's tree equals the tree
18
+ * of a commit removed earlier; it absorbs the whole chain removed in
19
+ * that same transition and inherits sessionCreated as OR over the
20
+ * chain. This is why squashing a session commit INTO a pre-session
21
+ * commit keeps the counter (the session's work survived, inside a
22
+ * rewritten commit), while squashing two session commits drops 2 → 1.
23
+ * 2. (authorEmail, authorTs) match → rebase pick / amend / reword: git
24
+ * preserves the author timestamp through these, so the rewritten
25
+ * commit inherits the original's membership. Rebasing pre-session
26
+ * commits does NOT count them (committer ts is fresh but the author
27
+ * identity says "old").
28
+ * 3. No match → genuinely new commit; counts when its
29
+ * committer timestamp falls after the session started (`isSessionTs`).
30
+ *
31
+ * Commits merged into the default branch never appear as "removed" (the
32
+ * collector excludes ^defaultRef), so merged work stays counted — it is
33
+ * the most real work of all.
34
+ */
35
+ /** Number of live commits created within this session. */
36
+ export function countSessionCommits(state) {
37
+ let count = 0;
38
+ for (const commit of state.commits) {
39
+ if (commit.live && commit.sessionCreated)
40
+ count++;
41
+ }
42
+ return count;
43
+ }
44
+ /**
45
+ * Apply one poll's ledger update. `countsAsSession(meta)` decides whether an
46
+ * unmatched commit was created by this session — typically: committer
47
+ * timestamp after the session opened (minus a small slack, so the commit
48
+ * that itself triggered the session counts) and not already accounted for
49
+ * by an earlier session's ledger.
50
+ */
51
+ export function applyLedgerUpdate(state, update, countsAsSession) {
52
+ switch (update.kind) {
53
+ case 'seed':
54
+ seedLedger(state, update.commits, countsAsSession);
55
+ break;
56
+ case 'transitions':
57
+ for (const transition of update.transitions) {
58
+ applyTransition(state, transition, countsAsSession);
59
+ }
60
+ break;
61
+ case 'resync':
62
+ applyResync(state, update.liveShas, update.mergedShas, update.unknownCommits, countsAsSession);
63
+ break;
64
+ }
65
+ state.pointer = update.pointer;
66
+ }
67
+ /**
68
+ * Seed a fresh ledger from the commits currently on the branch. Everything
69
+ * already there is pre-session (counter starts at zero) — except commits
70
+ * landing within the slack window right before the session opened, i.e. the
71
+ * commit that itself triggered the session.
72
+ */
73
+ function seedLedger(state, commits, countsAsSession) {
74
+ for (const meta of commits) {
75
+ if (findCommit(state, meta.sha))
76
+ continue;
77
+ state.commits.push(newLedgerCommit(meta, meta.parentCount < 2 && countsAsSession(meta)));
78
+ }
79
+ }
80
+ function applyTransition(state, transition, countsAsSession) {
81
+ const seq = ++state.seq;
82
+ // 1. Commits that left the branch (and are not on the default branch).
83
+ for (const sha of transition.removedShas) {
84
+ const entry = findCommit(state, sha);
85
+ if (entry && entry.live) {
86
+ entry.live = false;
87
+ entry.removedAtSeq = seq;
88
+ }
89
+ }
90
+ // 2. Commits that entered the branch, parent-first.
91
+ for (const meta of transition.added) {
92
+ const known = findCommit(state, meta.sha);
93
+ if (known) {
94
+ // Resurrect: reset back onto a previously-seen tip.
95
+ known.live = true;
96
+ known.removedAtSeq = null;
97
+ known.absorbedBy = null;
98
+ continue;
99
+ }
100
+ if (meta.parentCount >= 2) {
101
+ // Merge commits are recorded but never counted as created work.
102
+ state.commits.push(newLedgerCommit(meta, false));
103
+ continue;
104
+ }
105
+ const pool = matchPool(state);
106
+ // Cascade 1: tree match → squash of the chain removed in one transition.
107
+ const treeMatch = pool.find(c => c.tree === meta.tree);
108
+ if (treeMatch) {
109
+ const chain = pool.filter(c => c.removedAtSeq === treeMatch.removedAtSeq);
110
+ const inherited = chain.some(c => c.sessionCreated);
111
+ for (const absorbed of chain)
112
+ absorbed.absorbedBy = meta.sha;
113
+ state.commits.push(newLedgerCommit(meta, inherited));
114
+ continue;
115
+ }
116
+ // Cascade 2: author identity match → rebase pick / amend / reword.
117
+ const authorMatch = pool.find(c => c.authorEmail === meta.authorEmail && c.authorTs === meta.authorTs);
118
+ if (authorMatch) {
119
+ authorMatch.absorbedBy = meta.sha;
120
+ state.commits.push(newLedgerCommit(meta, authorMatch.sessionCreated));
121
+ continue;
122
+ }
123
+ // Cascade 3: genuinely new commit. The countsAsSession test keeps
124
+ // commits resurrected from outside the session (e.g. reset --hard onto
125
+ // a tip built while the daemon was down) out of the counter.
126
+ state.commits.push(newLedgerCommit(meta, countsAsSession(meta)));
127
+ }
128
+ }
129
+ /**
130
+ * Pointer fell out of the reflog window — rebuild flags from current state
131
+ * instead of replaying. Known commits: live when still on the branch OR
132
+ * merged into the default branch. Unknown commits on the branch are adopted
133
+ * with the committer-timestamp session test (no lineage available).
134
+ */
135
+ function applyResync(state, liveShas, mergedShas, unknownCommits, countsAsSession) {
136
+ const live = new Set(liveShas);
137
+ const merged = new Set(mergedShas);
138
+ for (const commit of state.commits) {
139
+ if (live.has(commit.sha)) {
140
+ commit.live = true;
141
+ commit.removedAtSeq = null;
142
+ commit.absorbedBy = null;
143
+ }
144
+ else if (!merged.has(commit.sha)) {
145
+ commit.live = false;
146
+ }
147
+ }
148
+ seedLedger(state, unknownCommits, countsAsSession);
149
+ }
150
+ /** Gone-but-unabsorbed commits — the pool rewrite matching runs against. */
151
+ function matchPool(state) {
152
+ return state.commits.filter(c => !c.live && c.absorbedBy === null);
153
+ }
154
+ function findCommit(state, sha) {
155
+ return state.commits.find(c => c.sha === sha);
156
+ }
157
+ function newLedgerCommit(meta, sessionCreated) {
158
+ return {
159
+ sha: meta.sha,
160
+ tree: meta.tree,
161
+ authorEmail: meta.authorEmail,
162
+ authorTs: meta.authorTs,
163
+ committerTs: meta.committerTs,
164
+ sessionCreated,
165
+ live: true,
166
+ removedAtSeq: null,
167
+ absorbedBy: null,
168
+ };
169
+ }
170
+ export function createEmptyLedger() {
171
+ return { commits: [], pointer: null, seq: 0 };
172
+ }
173
+ //# sourceMappingURL=commit-ledger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-ledger.js","sourceRoot":"","sources":["../../src/core/commit-ledger.ts"],"names":[],"mappings":"AAQA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,0DAA0D;AAC1D,MAAM,UAAU,mBAAmB,CAAC,KAAwB;IAC1D,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACnC,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,cAAc;YAAE,KAAK,EAAE,CAAC;IACpD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAwB,EACxB,MAAoB,EACpB,eAA8C;IAE9C,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,MAAM;YACT,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;YACnD,MAAM;QACR,KAAK,aAAa;YAChB,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;gBAC5C,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;YACtD,CAAC;YACD,MAAM;QACR,KAAK,QAAQ;YACX,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;YAC/F,MAAM;IACV,CAAC;IACD,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;AACjC,CAAC;AAED;;;;;GAKG;AACH,SAAS,UAAU,CACjB,KAAwB,EACxB,OAA8B,EAC9B,eAA8C;IAE9C,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC;YAAE,SAAS;QAC1C,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3F,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CACtB,KAAwB,EACxB,UAA4B,EAC5B,eAA8C;IAE9C,MAAM,GAAG,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC;IAExB,uEAAuE;IACvE,KAAK,MAAM,GAAG,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACrC,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC;YACnB,KAAK,CAAC,YAAY,GAAG,GAAG,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,oDAAoD;IACpD,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,KAAK,EAAE,CAAC;YACV,oDAAoD;YACpD,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;YAClB,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;YAC1B,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC;YACxB,SAAS;QACX,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,EAAE,CAAC;YAC1B,gEAAgE;YAChE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;YACjD,SAAS;QACX,CAAC;QAED,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAE9B,yEAAyE;QACzE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,SAAS,CAAC,YAAY,CAAC,CAAC;YAC1E,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;YACpD,KAAK,MAAM,QAAQ,IAAI,KAAK;gBAAE,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC;YAC7D,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;YACrD,SAAS;QACX,CAAC;QAED,mEAAmE;QACnE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAC3B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,CACxE,CAAC;QACF,IAAI,WAAW,EAAE,CAAC;YAChB,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC;YAClC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC;YACtE,SAAS;QACX,CAAC;QAED,kEAAkE;QAClE,uEAAuE;QACvE,6DAA6D;QAC7D,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,WAAW,CAClB,KAAwB,EACxB,QAA2B,EAC3B,UAA6B,EAC7B,cAAqC,EACrC,eAA8C;IAE9C,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IACnC,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACnC,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;YACnB,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC;YAC3B,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC;QAC3B,CAAC;aAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IACD,UAAU,CAAC,KAAK,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC;AACrD,CAAC;AAED,4EAA4E;AAC5E,SAAS,SAAS,CAAC,KAAwB;IACzC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,UAAU,CAAC,KAAwB,EAAE,GAAW;IACvD,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,eAAe,CAAC,IAAgB,EAAE,cAAuB;IAChE,OAAO;QACL,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,cAAc;QACd,IAAI,EAAE,IAAI;QACV,YAAY,EAAE,IAAI;QAClB,UAAU,EAAE,IAAI;KACjB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;AAChD,CAAC"}
@@ -36,7 +36,5 @@ export declare function formatDate(timestamp: number, timezone: string): string;
36
36
  * dayBoundaryHour is 24h format (e.g. 4 = 04:00 AM).
37
37
  */
38
38
  export declare function computeWorkingDate(timestamp: number, dayBoundaryHour: number, timezone: string): string;
39
- /** Build ISO timestamp from date + hour:minute in timezone */
40
- export declare function buildTimestamp(date: string, hour: number, minute: number, timezone: string): string;
41
39
  /** Extract task key from branch name. Returns null for generic/foreign branches. */
42
40
  export declare function extractTask(branch: string, taskPattern: string, developer: string, genericBranches: readonly string[]): string | null;
@@ -250,26 +250,6 @@ export function computeWorkingDate(timestamp, dayBoundaryHour, timezone) {
250
250
  }
251
251
  return formatDate(timestamp, timezone);
252
252
  }
253
- /** Build ISO timestamp from date + hour:minute in timezone */
254
- export function buildTimestamp(date, hour, minute, timezone) {
255
- const [year, month, day] = date.split('-').map(Number);
256
- const guess = new Date(Date.UTC(year, month - 1, day, hour, minute, 0));
257
- const parts = new Intl.DateTimeFormat('en-US', {
258
- timeZone: timezone,
259
- hour: 'numeric',
260
- hour12: false,
261
- minute: 'numeric',
262
- }).formatToParts(guess);
263
- const hourPart = parts.find(p => p.type === 'hour');
264
- const minutePart = parts.find(p => p.type === 'minute');
265
- if (!hourPart || !minutePart)
266
- throw new Error(`Failed to parse time in timezone ${timezone}`);
267
- const actualHour = parseInt(hourPart.value);
268
- const actualMinute = parseInt(minutePart.value);
269
- const h = actualHour === 24 ? 0 : actualHour;
270
- const diffMs = ((hour - h) * 60 + (minute - actualMinute)) * 60_000;
271
- return new Date(guess.getTime() + diffMs).toISOString();
272
- }
273
253
  /** Extract task key from branch name. Returns null for generic/foreign branches. */
274
254
  export function extractTask(branch, taskPattern, developer, genericBranches) {
275
255
  if (/^[0-9a-f]{7,40}$/.test(branch))
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,aAAa,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEhK,gEAAgE;AAChE,SAAS,eAAe;IACtB,IAAI,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,OAAO,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;YAAE,OAAO,GAAG,CAAC;QACtD,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;AACzE,CAAC;AAED;;;;;GAKG;AACH,SAAS,kBAAkB;IACzB,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAC9D,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;IAClC,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;QAAE,OAAO,OAAO,CAAC;IAChE,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;AACvC,MAAM,YAAY,GAAG,kBAAkB,EAAE,CAAC;AAE1C,SAAS,QAAQ,CAAI,QAAgB;IACnC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;IACjD,CAAC;IACD,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAC;AAC9B,CAAC;AAED,SAAS,eAAe,CAAC,EAAU;IACjC,IAAI,CAAC;QACH,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAiB;IAC9C,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC7G,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,GAAG,EAAE,EAAE,CAAC;QACxG,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;QAClG,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,kCAAkC,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;IACxE,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,eAAe,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,6CAA6C,MAAM,CAAC,WAAW,CAAC,OAAO,GAAG,CAAC,CAAC;IAC9F,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;QACvE,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,4CAA4C,IAAI,MAAM,KAAK,GAAG,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,aAAa,KAAK,SAAS,IAAI,OAAO,MAAM,CAAC,aAAa,KAAK,QAAQ,EAAE,CAAC;QACnF,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,MAAM,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;QACzC,IAAI,OAAO,MAAM,CAAC,eAAe,KAAK,QAAQ,IAAI,MAAM,CAAC,eAAe,KAAK,IAAI,EAAE,CAAC;YAClF,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC;YAClE,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,oBAAoB,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa;IACvC,OAAO,KAAK,KAAK,gBAAgB,CAAC,GAAG;WAChC,KAAK,KAAK,gBAAgB,CAAC,MAAM;WACjC,KAAK,KAAK,gBAAgB,CAAC,OAAO;WAClC,KAAK,KAAK,gBAAgB,CAAC,QAAQ,CAAC;AAC3C,CAAC;AAED,SAAS,eAAe,CAAC,OAAgB;IACvC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;IACxD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,qBAAqB,UAAU,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,GAAG,GAAG,QAAQ,CAA0B,UAAU,CAAC,CAAC;IAC1D,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC;IAExE,kDAAkD;IAClD,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAO,GAAG,CAAC,eAAe,KAAK,QAAQ,EAAE,CAAC;QAC7D,GAAG,CAAC,QAAQ,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,eAAe,EAAE,CAAC;QACvD,OAAO,GAAG,CAAC,eAAe,CAAC;IAC7B,CAAC;IAED,MAAM,cAAc,GAAG,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAA+B,CAAC;IAC7E,MAAM,WAAW,GAAsB;QACrC,OAAO,EAAE,cAAc,CAAC,OAAO,IAAK,mBAAwC;QAC5E,OAAO,EAAE,cAAc,CAAC,OAAO,IAAI,EAAE;KACtC,CAAC;IAEF,MAAM,MAAM,GAAG;QACb,GAAG,GAAG;QACN,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE;QAC/C,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,gBAAgB;QACxC,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,cAAc;QACxC,WAAW;KACC,CAAC;IACf,cAAc,CAAC,MAAM,CAAC,CAAC;IACvB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,WAAW,CAAC,MAAiB;IAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,UAAU,GAAG,aAAa,CAAC;IAC3C,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IACxE,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAClC,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,WAAW,GAAG,aAAa,CAAC;IAC5C,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IACzE,UAAU,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AACnC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAkB,EAAE,KAAyB;IAC9E,MAAM,MAAM,GAAc;QACxB,GAAG,OAAO;QACV,GAAG,KAAK;QACR,QAAQ,EAAE,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE;QAC5D,WAAW,EAAE;YACX,OAAO,EAAE,KAAK,CAAC,WAAW,EAAE,OAAO,IAAI,OAAO,CAAC,WAAW,CAAC,OAAO;YAClE,OAAO,EAAE,KAAK,CAAC,WAAW,EAAE,OAAO,IAAI,OAAO,CAAC,WAAW,CAAC,OAAO;SACnE;KACF,CAAC;IACF,cAAc,CAAC,MAAM,CAAC,CAAC;IACvB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,oGAAoG;AACpG,MAAM,UAAU,qBAAqB,CAAC,MAAiB,EAAE,IAAY;IACnE,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;AAC5G,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,8BAA8B,CAAC,MAAiB,EAAE,QAAgB;IAChF,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAChC,OAAO,MAAM,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC;WAChC,MAAM,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC;WAClC,MAAM,CAAC,aAAa,CAAC;AAC5B,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,uBAAuB,CACrC,KAAuB,EACvB,WAAmB;IAEnB,OAAO;QACL,QAAQ,EAAE,oBAAoB,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,WAAW;QACxD,iBAAiB,EAAE,KAAK,KAAK,gBAAgB,CAAC,QAAQ;KACvD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;IAC1D,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,sBAAsB,WAAW,EAAE,CAAC,CAAC;QACnD,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,OAAO,GAAG,QAAQ,CAAU,WAAW,CAAC,CAAC;IAC/C,eAAe,CAAC,OAAO,CAAC,CAAC;IACzB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;AAC3C,CAAC;AAED,iDAAiD;AACjD,SAAS,iBAAiB,CAAC,SAAiB,EAAE,QAAgB;IAC5D,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;QAC7C,QAAQ,EAAE,QAAQ;QAClB,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,KAAK;KACd,CAAC,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAEtC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IACpD,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,EAAE,CAAC,CAAC;IAC/E,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtC,uEAAuE;IACvE,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAChC,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,UAAU,CAAC,SAAiB,EAAE,QAAgB;IAC5D,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;QAC7C,QAAQ,EAAE,QAAQ;QAClB,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,SAAS;KACf,CAAC,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAEtC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;IAClD,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,EAAE,CAAC,CAAC;IACzG,OAAO,GAAG,QAAQ,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;AACjE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAiB,EAAE,eAAuB,EAAE,QAAgB;IAC7F,MAAM,IAAI,GAAG,iBAAiB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACpD,IAAI,IAAI,GAAG,eAAe,EAAE,CAAC;QAC3B,OAAO,UAAU,CAAC,SAAS,GAAG,UAAU,EAAE,QAAQ,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,UAAU,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AACzC,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,WAAmB,EAAE,SAAiB,EAAE,eAAkC;IACpH,IAAI,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,IAAI,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IAClD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;IACpD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACjC,CAAC"}
@@ -7,7 +7,7 @@ export declare const BACKUP_EXTENSION = ".bak";
7
7
  export declare const DAEMON_SCRIPT_TS = "daemon.ts";
8
8
  export declare const DAEMON_SCRIPT_JS = "daemon.js";
9
9
  export declare const DEFAULT_API_PORT = 9213;
10
- export declare const API_VERSION = 6;
10
+ export declare const API_VERSION = 7;
11
11
  export declare const NPM_PACKAGE_NAME = "workday-daemon";
12
12
  export declare const NPM_REGISTRY_LATEST_URL = "https://registry.npmjs.org/workday-daemon/latest";
13
13
  /** Registry check timeout — fail fast, the next scheduled check will retry */
@@ -15,7 +15,7 @@ export const DEFAULT_API_PORT = 9213;
15
15
  // pick it up (they re-check every 6h), THEN npm-publish the daemon —
16
16
  // a tray with the old exact-match check meeting a newer apiVersion would
17
17
  // reinstall-loop the daemon.
18
- export const API_VERSION = 6;
18
+ export const API_VERSION = 7;
19
19
  // ─── Auto-update ────────────────────────────────────────────────────────
20
20
  export const NPM_PACKAGE_NAME = 'workday-daemon';
21
21
  export const NPM_REGISTRY_LATEST_URL = `https://registry.npmjs.org/${NPM_PACKAGE_NAME}/latest`;
@@ -41,31 +41,30 @@ export declare function resolveSessionTarget(log: DailyLog, target: string): Ses
41
41
  export declare function computeManualMinutes(session: Session): number;
42
42
  /** Effective duration including manual adjustments (ms) */
43
43
  export declare function computeFullEffectiveDuration(session: Session): number;
44
- /** Resolve dayStart timestamp using priority chain: manualStart → dayStartedAt → first session */
45
- export declare function computeDayStart(log: DailyLog, config: AppConfig): number;
46
44
  /**
47
- * UI-only resolver for the day-start indicator. Unlike `computeDayStart`,
48
- * this returns null when nothing meaningful is set yet, so the client can
49
- * hide the indicator until the user either marks it manually or the first
50
- * session reaches ACTIVE.
45
+ * UI-only resolver for the day-start indicator. Returns null when no session
46
+ * has reached ACTIVE yet, so the client hides the indicator until then.
51
47
  *
52
- * The fallback is the EARLIEST `activatedAt` across all sessions (first
48
+ * The result is the EARLIEST `activatedAt` across all sessions (first
53
49
  * CONFIRMED work), NOT `sessions[0]`. Array order follows repo discovery,
54
50
  * so the first entry may be a session that activated much later — anchoring
55
- * to it would push the indicator past the real start. This matches the
56
- * upper-bound logic in `setDayManualStart`.
51
+ * to it would push the indicator past the real start.
57
52
  */
58
53
  export declare function resolveUiDayStart(log: DailyLog): string | null;
59
54
  /** Compute day end timestamp (next day boundary) */
60
55
  export declare function computeDayEnd(date: string, dayBoundaryHour: number, timezone: string): number;
61
- /** Compute total budget in ms */
56
+ /**
57
+ * Budget v2: the full physical day window (boundary hour → next boundary
58
+ * hour, ~24h). Depends only on log.date and config — never on sessions,
59
+ * dayStartedAt or the daemon lifecycle, so restarts mid-day don't shrink it.
60
+ * On DST transition days the window is honestly 23/25h — the physical day
61
+ * length, not a bug.
62
+ */
62
63
  export declare function computeBudgetMs(log: DailyLog, config: AppConfig): number;
63
64
  /** Sum of all manual entries' minutes (ms) */
64
65
  export declare function computeTotalManualEntryMs(log: DailyLog): number;
65
66
  /** Sum of all sessions' full effective duration + manual entries (ms) */
66
67
  export declare function computeTotalClaimedMs(log: DailyLog): number;
67
- /** Check if day budget is exhausted */
68
- export declare function isBudgetExhausted(log: DailyLog, config: AppConfig): boolean;
69
68
  /** Remaining budget in ms, clamped >= 0 */
70
69
  export declare function getRemainingBudgetMs(log: DailyLog, config: AppConfig): number;
71
70
  /** Compute per-session active intervals (pauses excluded, no cross-session merge). */
@@ -96,19 +95,5 @@ export declare function editManualEntry(log: DailyLog, id: string, patch: {
96
95
  description?: string;
97
96
  activity?: string;
98
97
  }, config: AppConfig): void;
99
- /**
100
- * Set manual day start. Passing null clears the override.
101
- *
102
- * Rules:
103
- * - Lower bound: schedule.start (the tracking-window start hour).
104
- * - Upper bound: the earliest session's `activatedAt` (first CONFIRMED work).
105
- * Real logged activity wins — the user may only shift the start earlier, never
106
- * past the moment real work began. We anchor to `activatedAt`, NOT `startedAt`:
107
- * a PENDING session's `startedAt` is just when the daemon first saw the branch
108
- * (often the moment the tracker launched), not when work actually started.
109
- * - If no session has activated yet there is no confirmed activity to anchor to,
110
- * so the only constraint is that the start cannot be in the future.
111
- */
112
- export declare function setDayManualStart(log: DailyLog, isoTimestamp: string | null, config: AppConfig): void;
113
98
  /** Add signal with deduplication for diff_dynamics (same repo, accumulate deltas) */
114
99
  export declare function addSignal(log: DailyLog, signal: Signal, deduplicationSeconds: number): void;
@@ -43,7 +43,6 @@ export function createEmptyLog(date, config) {
43
43
  date,
44
44
  status: DayStatus.Draft,
45
45
  dayType: determineDayType(date, config),
46
- manualStart: null,
47
46
  dayStartedAt: null,
48
47
  sessions: [],
49
48
  signals: [],
@@ -308,37 +307,16 @@ export function computeManualMinutes(session) {
308
307
  export function computeFullEffectiveDuration(session) {
309
308
  return computeEffectiveDuration(session) + computeManualMinutes(session) * MS_PER_MINUTE;
310
309
  }
311
- /** Resolve dayStart timestamp using priority chain: manualStart → dayStartedAt → first session */
312
- export function computeDayStart(log, config) {
313
- if (log.manualStart) {
314
- return new Date(log.manualStart).getTime();
315
- }
316
- if (log.dayStartedAt) {
317
- return new Date(log.dayStartedAt).getTime();
318
- }
319
- // Fallback: first activated session
320
- for (const s of log.sessions) {
321
- if (s.activatedAt)
322
- return new Date(s.activatedAt).getTime();
323
- }
324
- // No sessions yet — use day boundary start (date + dayBoundaryHour in timezone)
325
- return parseDateWithHour(log.date, config.schedule.end, config.timezone);
326
- }
327
310
  /**
328
- * UI-only resolver for the day-start indicator. Unlike `computeDayStart`,
329
- * this returns null when nothing meaningful is set yet, so the client can
330
- * hide the indicator until the user either marks it manually or the first
331
- * session reaches ACTIVE.
311
+ * UI-only resolver for the day-start indicator. Returns null when no session
312
+ * has reached ACTIVE yet, so the client hides the indicator until then.
332
313
  *
333
- * The fallback is the EARLIEST `activatedAt` across all sessions (first
314
+ * The result is the EARLIEST `activatedAt` across all sessions (first
334
315
  * CONFIRMED work), NOT `sessions[0]`. Array order follows repo discovery,
335
316
  * so the first entry may be a session that activated much later — anchoring
336
- * to it would push the indicator past the real start. This matches the
337
- * upper-bound logic in `setDayManualStart`.
317
+ * to it would push the indicator past the real start.
338
318
  */
339
319
  export function resolveUiDayStart(log) {
340
- if (log.manualStart)
341
- return log.manualStart;
342
320
  let earliest = null;
343
321
  for (const s of log.sessions) {
344
322
  if (!s.activatedAt)
@@ -357,9 +335,15 @@ export function computeDayEnd(date, dayBoundaryHour, timezone) {
357
335
  const nextDateStr = `${nextDay.getUTCFullYear()}-${String(nextDay.getUTCMonth() + 1).padStart(2, '0')}-${String(nextDay.getUTCDate()).padStart(2, '0')}`;
358
336
  return parseDateWithHour(nextDateStr, dayBoundaryHour, timezone);
359
337
  }
360
- /** Compute total budget in ms */
338
+ /**
339
+ * Budget v2: the full physical day window (boundary hour → next boundary
340
+ * hour, ~24h). Depends only on log.date and config — never on sessions,
341
+ * dayStartedAt or the daemon lifecycle, so restarts mid-day don't shrink it.
342
+ * On DST transition days the window is honestly 23/25h — the physical day
343
+ * length, not a bug.
344
+ */
361
345
  export function computeBudgetMs(log, config) {
362
- const dayStart = computeDayStart(log, config);
346
+ const dayStart = parseDateWithHour(log.date, config.schedule.end, config.timezone);
363
347
  const dayEnd = computeDayEnd(log.date, config.schedule.end, config.timezone);
364
348
  return Math.max(0, dayEnd - dayStart);
365
349
  }
@@ -372,10 +356,6 @@ export function computeTotalClaimedMs(log) {
372
356
  const sessionsMs = log.sessions.reduce((sum, s) => sum + computeFullEffectiveDuration(s), 0);
373
357
  return sessionsMs + computeTotalManualEntryMs(log);
374
358
  }
375
- /** Check if day budget is exhausted */
376
- export function isBudgetExhausted(log, config) {
377
- return computeTotalClaimedMs(log) >= computeBudgetMs(log, config);
378
- }
379
359
  /** Remaining budget in ms, clamped >= 0 */
380
360
  export function getRemainingBudgetMs(log, config) {
381
361
  return Math.max(0, computeBudgetMs(log, config) - computeTotalClaimedMs(log));
@@ -441,7 +421,7 @@ export function addManualAdjustment(log, sessionId, minutes, reason, config) {
441
421
  const budget = computeBudgetMs(log, config);
442
422
  if (currentClaimed + addMs > budget) {
443
423
  const remainMinutes = Math.floor(getRemainingBudgetMs(log, config) / MS_PER_MINUTE);
444
- throw new Error(`Exceeds day budget. Remaining: ${remainMinutes}m. Use set-start to extend.`);
424
+ throw new Error(`Exceeds 24h day window. Remaining: ${remainMinutes}m.`);
445
425
  }
446
426
  if (!session.manualAdjustments) {
447
427
  session.manualAdjustments = [];
@@ -499,7 +479,7 @@ export function addManualEntry(log, input, config) {
499
479
  const addMs = input.minutes * MS_PER_MINUTE;
500
480
  if (computeTotalClaimedMs(log) + addMs > computeBudgetMs(log, config)) {
501
481
  const remainMinutes = Math.floor(getRemainingBudgetMs(log, config) / MS_PER_MINUTE);
502
- throw new Error(`Exceeds day budget. Remaining: ${remainMinutes}m. Use set-start to extend.`);
482
+ throw new Error(`Exceeds 24h day window. Remaining: ${remainMinutes}m.`);
503
483
  }
504
484
  unsealForEdit(log);
505
485
  if (!log.manualEntries)
@@ -533,7 +513,7 @@ export function editManualEntry(log, id, patch, config) {
533
513
  const deltaMs = (patch.minutes - entry.minutes) * MS_PER_MINUTE;
534
514
  if (deltaMs > 0 && computeTotalClaimedMs(log) + deltaMs > computeBudgetMs(log, config)) {
535
515
  const remainMinutes = Math.floor(getRemainingBudgetMs(log, config) / MS_PER_MINUTE);
536
- throw new Error(`Exceeds day budget. Remaining: ${remainMinutes}m. Use set-start to extend.`);
516
+ throw new Error(`Exceeds 24h day window. Remaining: ${remainMinutes}m.`);
537
517
  }
538
518
  entry.minutes = patch.minutes;
539
519
  }
@@ -551,51 +531,6 @@ export function editManualEntry(log, id, patch, config) {
551
531
  }
552
532
  unsealForEdit(log);
553
533
  }
554
- /**
555
- * Set manual day start. Passing null clears the override.
556
- *
557
- * Rules:
558
- * - Lower bound: schedule.start (the tracking-window start hour).
559
- * - Upper bound: the earliest session's `activatedAt` (first CONFIRMED work).
560
- * Real logged activity wins — the user may only shift the start earlier, never
561
- * past the moment real work began. We anchor to `activatedAt`, NOT `startedAt`:
562
- * a PENDING session's `startedAt` is just when the daemon first saw the branch
563
- * (often the moment the tracker launched), not when work actually started.
564
- * - If no session has activated yet there is no confirmed activity to anchor to,
565
- * so the only constraint is that the start cannot be in the future.
566
- */
567
- export function setDayManualStart(log, isoTimestamp, config) {
568
- if (isoTimestamp === null) {
569
- log.manualStart = null;
570
- return;
571
- }
572
- const newStart = new Date(isoTimestamp).getTime();
573
- const lowerBound = parseDateWithHour(log.date, config.schedule.start, config.timezone);
574
- if (newStart < lowerBound) {
575
- throw new Error(`Cannot start before ${String(config.schedule.start).padStart(2, '0')}:00 (tracking window)`);
576
- }
577
- // Upper bound = first CONFIRMED activity (earliest activatedAt), not startedAt.
578
- let firstActivated = null;
579
- for (const s of log.sessions) {
580
- if (!s.activatedAt)
581
- continue;
582
- const t = new Date(s.activatedAt).getTime();
583
- if (firstActivated === null || t < firstActivated)
584
- firstActivated = t;
585
- }
586
- if (firstActivated !== null) {
587
- if (newStart > firstActivated) {
588
- const d = new Date(firstActivated);
589
- const hhmm = `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`;
590
- throw new Error(`Cannot start after the first activity (${hhmm})`);
591
- }
592
- }
593
- else if (newStart > Date.now()) {
594
- // No confirmed work yet — only forbid a future start.
595
- throw new Error('Cannot start in the future');
596
- }
597
- log.manualStart = isoTimestamp;
598
- }
599
534
  /** Parse a date string + hour into a timestamp in the given timezone */
600
535
  function parseDateWithHour(date, hour, timezone) {
601
536
  // Build a date at noon UTC, then adjust by finding the offset