workday-daemon 0.5.1 → 0.7.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 (46) hide show
  1. package/dist/cli.js +246 -44
  2. package/dist/cli.js.map +1 -1
  3. package/dist/collectors/churn-scanner.d.ts +19 -0
  4. package/dist/collectors/churn-scanner.js +80 -0
  5. package/dist/collectors/churn-scanner.js.map +1 -0
  6. package/dist/collectors/git-client.js +4 -1
  7. package/dist/collectors/git-client.js.map +1 -1
  8. package/dist/collectors/git-tracker.js +15 -6
  9. package/dist/collectors/git-tracker.js.map +1 -1
  10. package/dist/collectors/snapshot-parser.d.ts +30 -10
  11. package/dist/collectors/snapshot-parser.js +80 -19
  12. package/dist/collectors/snapshot-parser.js.map +1 -1
  13. package/dist/core/activity-evaluator.d.ts +2 -2
  14. package/dist/core/activity-evaluator.js +19 -10
  15. package/dist/core/activity-evaluator.js.map +1 -1
  16. package/dist/core/constants.d.ts +27 -0
  17. package/dist/core/constants.js +51 -0
  18. package/dist/core/constants.js.map +1 -1
  19. package/dist/core/daily-log.d.ts +28 -2
  20. package/dist/core/daily-log.js +114 -5
  21. package/dist/core/daily-log.js.map +1 -1
  22. package/dist/core/session-tracker.d.ts +26 -1
  23. package/dist/core/session-tracker.js +32 -2
  24. package/dist/core/session-tracker.js.map +1 -1
  25. package/dist/core/types.d.ts +59 -0
  26. package/dist/core/types.js.map +1 -1
  27. package/dist/core/update-manager.d.ts +42 -0
  28. package/dist/core/update-manager.js +86 -0
  29. package/dist/core/update-manager.js.map +1 -0
  30. package/dist/daemon.d.ts +27 -1
  31. package/dist/daemon.js +120 -1
  32. package/dist/daemon.js.map +1 -1
  33. package/dist/http-server.d.ts +10 -1
  34. package/dist/http-server.js +123 -2
  35. package/dist/http-server.js.map +1 -1
  36. package/dist/push/activity-types.d.ts +10 -0
  37. package/dist/push/activity-types.js +75 -0
  38. package/dist/push/activity-types.js.map +1 -0
  39. package/dist/push/report-builder.js +18 -1
  40. package/dist/push/report-builder.js.map +1 -1
  41. package/dist/push/tempo-client.d.ts +13 -0
  42. package/dist/push/tempo-client.js +17 -14
  43. package/dist/push/tempo-client.js.map +1 -1
  44. package/dist/push/tempo-pusher.js +86 -80
  45. package/dist/push/tempo-pusher.js.map +1 -1
  46. package/package.json +2 -2
@@ -35,6 +35,8 @@ export class GitClient {
35
35
  `git -C "${repoPath}" status --porcelain`,
36
36
  `echo ${GIT_BATCH_SEPARATOR}`,
37
37
  `git -C "${repoPath}" reflog -${this.reflogCount} --date=iso --format="%gd %gs"`,
38
+ `echo ${GIT_BATCH_SEPARATOR}`,
39
+ `git -C "${repoPath}" ls-files --others --exclude-standard`,
38
40
  ];
39
41
  if (baseSha) {
40
42
  parts.push(`echo ${GIT_BATCH_SEPARATOR}`,
@@ -118,7 +120,7 @@ export class GitClient {
118
120
  const normalized = raw.replace(/\r\n/g, '\n');
119
121
  // Windows echo may add trailing space: "---WORKDAY-SEP--- \n"
120
122
  const sections = normalized.split(new RegExp(GIT_BATCH_SEPARATOR + '\\s*\\n'));
121
- let idx = 5; // fixed: branch, head, diff, status, reflog
123
+ let idx = 6; // fixed: branch, head, diff, status, reflog, untracked
122
124
  const diffSinceBase = withBase ? (sections[idx++] ?? '').trim() : undefined;
123
125
  const commitsSinceBase = withBase ? (sections[idx++] ?? '').trim() : undefined;
124
126
  return {
@@ -127,6 +129,7 @@ export class GitClient {
127
129
  diffNumstat: (sections[2] ?? '').trim(),
128
130
  statusPorcelain: (sections[3] ?? '').trim(),
129
131
  reflog: (sections[4] ?? '').trim(),
132
+ untrackedFiles: (sections[5] ?? '').trim(),
130
133
  diffSinceBase,
131
134
  commitsSinceBase,
132
135
  };
@@ -1 +1 @@
1
- {"version":3,"file":"git-client.js","sourceRoot":"","sources":["../../src/collectors/git-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"git-client.js","sourceRoot":"","sources":["../../src/collectors/git-client.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ import { extractTask, getConfiguredDefaultBranchName } from '../core/config.js';
4
4
  import { GitClient } from './git-client.js';
5
5
  import { ReflogParser } from './reflog-parser.js';
6
6
  import { SnapshotParser } from './snapshot-parser.js'; // static methods only
7
+ import { buildChurnFiles } from './churn-scanner.js';
7
8
  /**
8
9
  * Final fallback list when no config and no `origin/HEAD` are available.
9
10
  * Tried in order; the first ref that actually exists wins.
@@ -102,8 +103,17 @@ export class GitTracker {
102
103
  // Branch filter: only track developer's branches
103
104
  const task = extractTask(raw.branch, this.config.taskPattern, this.developer, this.config.genericBranches);
104
105
  const state = this.getOrCreateRepoState(repoPath);
106
+ // Churn sources: per-file evidence diff (sees committed + staged +
107
+ // worktree; falls back to the plain worktree diff when no base yet)
108
+ // and untracked files (invisible to any git diff — read from disk).
109
+ const evidenceDiff = raw.diffSinceBase !== undefined
110
+ ? SnapshotParser.parseDiffNumstatFiles(raw.diffSinceBase)
111
+ : null;
112
+ const churnSource = evidenceDiff ?? SnapshotParser.parseDiffNumstatFiles(raw.diffNumstat);
113
+ const untrackedPaths = SnapshotParser.parseUntrackedList(raw.untrackedFiles);
114
+ const churnFiles = await buildChurnFiles(repoPath, churnSource.files, untrackedPaths, state.previousSnapshot?.churnFiles ?? null);
105
115
  // Parse snapshot and compute delta
106
- const snapshot = SnapshotParser.parseSnapshot(raw, now);
116
+ const snapshot = SnapshotParser.parseSnapshot(raw, now, churnFiles);
107
117
  const delta = SnapshotParser.computeDelta(state.previousSnapshot, snapshot);
108
118
  // Parse reflog, filter to new entries only
109
119
  const allEntries = this.reflogParser.parseEntries(raw.reflog);
@@ -125,14 +135,13 @@ export class GitTracker {
125
135
  // AND git accepted it — fetchRepoState transparently drops it on bad-ref).
126
136
  let evidenceSnapshot = null;
127
137
  let evidenceBasis = null;
128
- if (raw.diffSinceBase !== undefined && raw.commitsSinceBase !== undefined) {
129
- const { added, removed, fileCount } = SnapshotParser.parseDiffNumstatTotals(raw.diffSinceBase);
138
+ if (evidenceDiff !== null && raw.commitsSinceBase !== undefined) {
130
139
  const commits = parseInt(raw.commitsSinceBase, 10);
131
140
  evidenceSnapshot = {
132
141
  commits: Number.isFinite(commits) ? commits : 0,
133
- linesAdded: added,
134
- linesRemoved: removed,
135
- filesChanged: fileCount,
142
+ linesAdded: evidenceDiff.totals.added,
143
+ linesRemoved: evidenceDiff.totals.removed,
144
+ filesChanged: evidenceDiff.totals.fileCount,
136
145
  };
137
146
  evidenceBasis = mergeBaseSha !== null ? 'merge_base' : 'base_sha';
138
147
  }
@@ -1 +1 @@
1
- {"version":3,"file":"git-tracker.js","sourceRoot":"","sources":["../../src/collectors/git-tracker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"git-tracker.js","sourceRoot":"","sources":["../../src/collectors/git-tracker.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,11 @@
1
- import type { RawGitOutput, GitSnapshot, GitDelta } from '../core/types.js';
1
+ import type { RawGitOutput, GitSnapshot, GitDelta, ChurnFile } from '../core/types.js';
2
2
  /**
3
3
  * Parses git diff --numstat and status --porcelain output into GitSnapshot.
4
4
  * Computes delta between consecutive snapshots.
5
5
  *
6
- * New logic (not in legacy) diff dynamics is the primary activity signal.
6
+ * Activity volume (delta.magnitude) is measured per file over the churn map,
7
+ * never over summed totals — totals net out cross-file movement and are blind
8
+ * to rewrites of already-modified lines and to untracked files.
7
9
  */
8
10
  export declare class SnapshotParser {
9
11
  /**
@@ -11,30 +13,48 @@ export declare class SnapshotParser {
11
13
  *
12
14
  * diff --numstat format: "added\tremoved\tfilename" per line
13
15
  * status --porcelain: "?? filename" for untracked files
16
+ * churnFiles: built by churn-scanner from the evidence diff + untracked files
14
17
  */
15
- static parseSnapshot(raw: RawGitOutput, timestamp: number): GitSnapshot;
18
+ static parseSnapshot(raw: RawGitOutput, timestamp: number, churnFiles?: ReadonlyMap<string, ChurnFile>): GitSnapshot;
16
19
  /**
17
20
  * Compute delta between previous and current snapshot.
18
- * Delta = change in tracked lines + change in untracked file count.
21
+ *
22
+ * addedDelta/removedDelta/untrackedDelta keep the worktree-totals semantics
23
+ * (used for signal logging). magnitude is the real churn estimate:
24
+ * - per-file |Δadded| + |Δremoved| across the churn map;
25
+ * - a file entering the map counts whole (new untracked file, first edit);
26
+ * - a file leaving counts its last known size (revert / re-anchor);
27
+ * - a flat file whose content hash changed counts IN_PLACE_CHURN_LINES.
19
28
  *
20
29
  * Returns null delta (hasDynamics=false) if previous is null (first tick after start).
21
30
  */
22
31
  static computeDelta(previous: GitSnapshot | null, current: GitSnapshot): GitDelta;
32
+ private static computeChurnMagnitude;
23
33
  /**
24
- * Public alias — used by GitTracker to parse a `diff <baseSha> --numstat`
25
- * output for the PR-equivalent evidence snapshot.
34
+ * Public alias — used by GitTracker to parse a `diff <base> --numstat`
35
+ * output for the PR-equivalent evidence snapshot and the churn file map.
26
36
  */
27
- static parseDiffNumstatTotals(text: string): {
28
- readonly added: number;
29
- readonly removed: number;
30
- readonly fileCount: number;
37
+ static parseDiffNumstatFiles(text: string): {
38
+ readonly totals: {
39
+ readonly added: number;
40
+ readonly removed: number;
41
+ readonly fileCount: number;
42
+ };
43
+ readonly files: ReadonlyMap<string, {
44
+ readonly added: number;
45
+ readonly removed: number;
46
+ }>;
31
47
  };
32
48
  /**
33
49
  * Parse "git diff --numstat" output.
34
50
  * Each line: "added\tremoved\tfilename"
35
51
  * Binary files show "-\t-\tfilename" → skip.
52
+ * Unusual paths come quoted from git — quotes are stripped (escapes kept:
53
+ * keys only need to be stable between ticks; fs reads on them just miss).
36
54
  */
37
55
  private static parseDiffNumstat;
56
+ /** Parse `git ls-files --others --exclude-standard` output into paths. */
57
+ static parseUntrackedList(text: string): string[];
38
58
  /**
39
59
  * Count untracked files from "git status --porcelain" output.
40
60
  * Untracked files start with "?? ".
@@ -1,8 +1,11 @@
1
+ import { IN_PLACE_CHURN_LINES } from '../core/constants.js';
1
2
  /**
2
3
  * Parses git diff --numstat and status --porcelain output into GitSnapshot.
3
4
  * Computes delta between consecutive snapshots.
4
5
  *
5
- * New logic (not in legacy) diff dynamics is the primary activity signal.
6
+ * Activity volume (delta.magnitude) is measured per file over the churn map,
7
+ * never over summed totals — totals net out cross-file movement and are blind
8
+ * to rewrites of already-modified lines and to untracked files.
6
9
  */
7
10
  export class SnapshotParser {
8
11
  /**
@@ -10,9 +13,10 @@ export class SnapshotParser {
10
13
  *
11
14
  * diff --numstat format: "added\tremoved\tfilename" per line
12
15
  * status --porcelain: "?? filename" for untracked files
16
+ * churnFiles: built by churn-scanner from the evidence diff + untracked files
13
17
  */
14
- static parseSnapshot(raw, timestamp) {
15
- const { added, removed, fileCount } = SnapshotParser.parseDiffNumstat(raw.diffNumstat);
18
+ static parseSnapshot(raw, timestamp, churnFiles = new Map()) {
19
+ const { added, removed, fileCount } = SnapshotParser.parseDiffNumstat(raw.diffNumstat).totals;
16
20
  const untrackedCount = SnapshotParser.parseUntrackedCount(raw.statusPorcelain);
17
21
  return {
18
22
  branch: raw.branch,
@@ -20,52 +24,109 @@ export class SnapshotParser {
20
24
  trackedFileCount: fileCount,
21
25
  untrackedCount,
22
26
  timestamp,
27
+ churnFiles,
23
28
  };
24
29
  }
25
30
  /**
26
31
  * Compute delta between previous and current snapshot.
27
- * Delta = change in tracked lines + change in untracked file count.
32
+ *
33
+ * addedDelta/removedDelta/untrackedDelta keep the worktree-totals semantics
34
+ * (used for signal logging). magnitude is the real churn estimate:
35
+ * - per-file |Δadded| + |Δremoved| across the churn map;
36
+ * - a file entering the map counts whole (new untracked file, first edit);
37
+ * - a file leaving counts its last known size (revert / re-anchor);
38
+ * - a flat file whose content hash changed counts IN_PLACE_CHURN_LINES.
28
39
  *
29
40
  * Returns null delta (hasDynamics=false) if previous is null (first tick after start).
30
41
  */
31
42
  static computeDelta(previous, current) {
32
43
  if (previous === null) {
33
44
  // First tick = baseline, no dynamics
34
- return { addedDelta: 0, removedDelta: 0, untrackedDelta: 0, hasDynamics: false };
45
+ return { addedDelta: 0, removedDelta: 0, untrackedDelta: 0, hasDynamics: false, magnitude: 0 };
35
46
  }
36
47
  const addedDelta = current.trackedLines.added - previous.trackedLines.added;
37
48
  const removedDelta = current.trackedLines.removed - previous.trackedLines.removed;
38
49
  const untrackedDelta = current.untrackedCount - previous.untrackedCount;
39
- const hasDynamics = addedDelta !== 0 || removedDelta !== 0 || untrackedDelta !== 0;
40
- return { addedDelta, removedDelta, untrackedDelta, hasDynamics };
50
+ const magnitude = SnapshotParser.computeChurnMagnitude(previous.churnFiles, current.churnFiles);
51
+ const hasDynamics = magnitude > 0 || addedDelta !== 0 || removedDelta !== 0 || untrackedDelta !== 0;
52
+ return { addedDelta, removedDelta, untrackedDelta, hasDynamics, magnitude };
53
+ }
54
+ static computeChurnMagnitude(prev, cur) {
55
+ let magnitude = 0;
56
+ for (const [path, c] of cur) {
57
+ const p = prev.get(path);
58
+ if (p === undefined) {
59
+ magnitude += c.added + c.removed;
60
+ continue;
61
+ }
62
+ const d = Math.abs(c.added - p.added) + Math.abs(c.removed - p.removed);
63
+ if (d > 0) {
64
+ magnitude += d;
65
+ }
66
+ else if (c.hash !== null && p.hash !== null && c.hash !== p.hash) {
67
+ magnitude += IN_PLACE_CHURN_LINES;
68
+ }
69
+ }
70
+ for (const [path, p] of prev) {
71
+ if (!cur.has(path)) {
72
+ magnitude += p.added + p.removed;
73
+ }
74
+ }
75
+ return magnitude;
41
76
  }
42
77
  /**
43
- * Public alias — used by GitTracker to parse a `diff <baseSha> --numstat`
44
- * output for the PR-equivalent evidence snapshot.
78
+ * Public alias — used by GitTracker to parse a `diff <base> --numstat`
79
+ * output for the PR-equivalent evidence snapshot and the churn file map.
45
80
  */
46
- static parseDiffNumstatTotals(text) {
81
+ static parseDiffNumstatFiles(text) {
47
82
  return SnapshotParser.parseDiffNumstat(text);
48
83
  }
49
84
  /**
50
85
  * Parse "git diff --numstat" output.
51
86
  * Each line: "added\tremoved\tfilename"
52
87
  * Binary files show "-\t-\tfilename" → skip.
88
+ * Unusual paths come quoted from git — quotes are stripped (escapes kept:
89
+ * keys only need to be stable between ticks; fs reads on them just miss).
53
90
  */
54
91
  static parseDiffNumstat(text) {
55
- if (!text)
56
- return { added: 0, removed: 0, fileCount: 0 };
92
+ const files = new Map();
57
93
  let added = 0;
58
94
  let removed = 0;
59
95
  let fileCount = 0;
96
+ if (text) {
97
+ for (const line of text.split('\n')) {
98
+ const match = line.match(/^(\d+)\t(\d+)\t(.+)$/);
99
+ if (!match)
100
+ continue; // skip binary files or empty lines
101
+ const a = parseInt(match[1], 10);
102
+ const r = parseInt(match[2], 10);
103
+ let path = match[3];
104
+ if (path.startsWith('"') && path.endsWith('"')) {
105
+ path = path.slice(1, -1);
106
+ }
107
+ added += a;
108
+ removed += r;
109
+ fileCount++;
110
+ files.set(path, { added: a, removed: r });
111
+ }
112
+ }
113
+ return { totals: { added, removed, fileCount }, files };
114
+ }
115
+ /** Parse `git ls-files --others --exclude-standard` output into paths. */
116
+ static parseUntrackedList(text) {
117
+ if (!text)
118
+ return [];
119
+ const paths = [];
60
120
  for (const line of text.split('\n')) {
61
- const match = line.match(/^(\d+)\t(\d+)\t/);
62
- if (!match)
63
- continue; // skip binary files or empty lines
64
- added += parseInt(match[1], 10);
65
- removed += parseInt(match[2], 10);
66
- fileCount++;
121
+ let path = line.trim();
122
+ if (!path)
123
+ continue;
124
+ if (path.startsWith('"') && path.endsWith('"')) {
125
+ path = path.slice(1, -1);
126
+ }
127
+ paths.push(path);
67
128
  }
68
- return { added, removed, fileCount };
129
+ return paths;
69
130
  }
70
131
  /**
71
132
  * Count untracked files from "git status --porcelain" output.
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot-parser.js","sourceRoot":"","sources":["../../src/collectors/snapshot-parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"snapshot-parser.js","sourceRoot":"","sources":["../../src/collectors/snapshot-parser.ts"],"names":[],"mappings":"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"}
@@ -59,8 +59,8 @@ export declare class ActivityEvaluator {
59
59
  /**
60
60
  * Ticks until score hits 0 with no further activity. With asymmetric decay
61
61
  * this is no longer score/BASE_DECAY — simulate the fade (EMA cools too,
62
- * so the drain slows over time). Bounded by the score itself (decay ≥ 1),
63
- * i.e. at most maxTicks iterations.
62
+ * and the boost stops at the floor). Bounded by the score itself
63
+ * (decay ≥ 1), i.e. at most maxTicks iterations.
64
64
  */
65
65
  private estimateIdleTicks;
66
66
  /** Remove session state on close */
@@ -74,11 +74,18 @@ export class ActivityEvaluator {
74
74
  // 6. Cap at the sensitivity ceiling
75
75
  st.score = Math.min(st.score, tick.maxTicks);
76
76
  }
77
- // 7. Decay — asymmetric: idle ticks after dense work drain faster
78
- const decay = hasActivity
79
- ? BASE_DECAY
80
- : BASE_DECAY + DECAY_BOOST * Math.min(1, st.ema);
81
- st.score = Math.max(0, st.score - decay);
77
+ // 7. Decay — asymmetric: idle ticks after dense work drain faster, but
78
+ // the boost only eats the earned part above the floor. Below the
79
+ // floor the fade is always 1/tick, so the "any touch buys
80
+ // floor-minutes" guarantee holds at any EMA.
81
+ const floorTicks = tick.maxTicks * STAMINA_FLOOR_RATIO;
82
+ if (!hasActivity && st.score > floorTicks) {
83
+ const boosted = BASE_DECAY + DECAY_BOOST * Math.min(1, st.ema);
84
+ st.score = Math.max(floorTicks, st.score - boosted);
85
+ }
86
+ else {
87
+ st.score = Math.max(0, st.score - BASE_DECAY);
88
+ }
82
89
  // Build result for this session
83
90
  const normalizedScore = tick.maxTicks > 0 ? st.score / tick.maxTicks : 0;
84
91
  scores.set(tick.sessionId, {
@@ -86,7 +93,7 @@ export class ActivityEvaluator {
86
93
  maxScore: tick.maxTicks,
87
94
  normalizedScore,
88
95
  ema: st.ema,
89
- etaTicks: this.estimateIdleTicks(st),
96
+ etaTicks: this.estimateIdleTicks(st, floorTicks),
90
97
  isIdleTimeout: st.score === 0 && !tick.ignoreIdleTimeout,
91
98
  });
92
99
  }
@@ -130,16 +137,18 @@ export class ActivityEvaluator {
130
137
  /**
131
138
  * Ticks until score hits 0 with no further activity. With asymmetric decay
132
139
  * this is no longer score/BASE_DECAY — simulate the fade (EMA cools too,
133
- * so the drain slows over time). Bounded by the score itself (decay ≥ 1),
134
- * i.e. at most maxTicks iterations.
140
+ * and the boost stops at the floor). Bounded by the score itself
141
+ * (decay ≥ 1), i.e. at most maxTicks iterations.
135
142
  */
136
- estimateIdleTicks(st) {
143
+ estimateIdleTicks(st, floorTicks) {
137
144
  let score = st.score;
138
145
  let ema = st.ema;
139
146
  let ticks = 0;
140
147
  while (score > 0) {
141
148
  ema *= 1 - this.emaAlpha;
142
- score -= BASE_DECAY + DECAY_BOOST * Math.min(1, ema);
149
+ score = score > floorTicks
150
+ ? Math.max(floorTicks, score - (BASE_DECAY + DECAY_BOOST * Math.min(1, ema)))
151
+ : score - BASE_DECAY;
143
152
  ticks++;
144
153
  }
145
154
  return ticks;
@@ -1 +1 @@
1
- {"version":3,"file":"activity-evaluator.js","sourceRoot":"","sources":["../../src/core/activity-evaluator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"activity-evaluator.js","sourceRoot":"","sources":["../../src/core/activity-evaluator.ts"],"names":[],"mappings":"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"}
@@ -8,11 +8,29 @@ 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
10
  export declare const API_VERSION = 6;
11
+ export declare const NPM_PACKAGE_NAME = "workday-daemon";
12
+ export declare const NPM_REGISTRY_LATEST_URL = "https://registry.npmjs.org/workday-daemon/latest";
13
+ /** Registry check timeout — fail fast, the next scheduled check will retry */
14
+ export declare const UPDATE_CHECK_TIMEOUT_MS = 5000;
15
+ /** npm install -g can be slow on cold cache / slow network — be generous */
16
+ export declare const NPM_INSTALL_TIMEOUT_MS = 180000;
17
+ /** Daemon checks the registry this often (~2-4 times per working day) */
18
+ export declare const UPDATE_CHECK_INTERVAL_HOURS = 6;
19
+ /** Random startup delay before the first scheduled check (thundering-herd hygiene) */
20
+ export declare const UPDATE_CHECK_JITTER_MINUTES = 10;
11
21
  export declare const LOCK_EXTENSION = ".lock";
12
22
  export declare const LOCK_STALE_MS = 10000;
13
23
  export declare const GIT_BATCH_SEPARATOR = "---WORKDAY-SEP---";
14
24
  export declare const GIT_MAX_BUFFER_BYTES: number;
15
25
  export declare const MAX_ADJUSTMENT_MINUTES = 480;
26
+ export declare const ACTIVITY_ATTRIBUTE_KEY = "_Activity_";
27
+ export declare const DEFAULT_ACTIVITY = "Development";
28
+ export declare const DEFAULT_MANUAL_ACTIVITY = "Other";
29
+ export declare const WORK_ATTRIBUTES_CACHE_FILE = "work-attributes-cache.json";
30
+ export declare const FALLBACK_ACTIVITIES: ReadonlyArray<{
31
+ readonly value: string;
32
+ readonly name: string;
33
+ }>;
16
34
  export declare const ISSUE_CACHE_FILE = "issue-cache.json";
17
35
  export declare const PUSH_LOG_FILE = "push-log.json";
18
36
  export declare const TEMPO_REPORT_DIR = "tempo";
@@ -49,6 +67,15 @@ export declare const FREQUENCY_GAIN_MAX = 2;
49
67
  export declare const STAMINA_LINES_PER_MINUTE = 10;
50
68
  /** Cap on the volume contribution per tick (reached at 20 changed lines at 30s ticks) */
51
69
  export declare const VOLUME_GAIN_MAX = 4;
70
+ /**
71
+ * Line-equivalent granted per file whose content changed while its diff
72
+ * numbers stayed flat (rewrite-in-place: lines already differed from the
73
+ * base, so numstat can't see the churn). Detected via content hashing.
74
+ */
75
+ export declare const IN_PLACE_CHURN_LINES = 8;
76
+ /** Churn scanner caps: don't read/hash absurd working sets */
77
+ export declare const CHURN_MAX_FILES = 100;
78
+ export declare const CHURN_MAX_FILE_BYTES: number;
52
79
  /** "Free" score on commit (in seconds, converted to ticks) */
53
80
  export declare const COMMIT_BONUS_SECONDS = 150;
54
81
  /** Constant per-tick score drain */
@@ -10,7 +10,23 @@ export const DAEMON_SCRIPT_TS = 'daemon.ts';
10
10
  export const DAEMON_SCRIPT_JS = 'daemon.js';
11
11
  // ─── HTTP API ──────────────────────────────────────────────────────────
12
12
  export const DEFAULT_API_PORT = 9213;
13
+ // Bump ONLY on breaking API changes (additive endpoints/fields don't count).
14
+ // Release ritual for a bump: ship the tray release first, let live trays
15
+ // pick it up (they re-check every 6h), THEN npm-publish the daemon —
16
+ // a tray with the old exact-match check meeting a newer apiVersion would
17
+ // reinstall-loop the daemon.
13
18
  export const API_VERSION = 6;
19
+ // ─── Auto-update ────────────────────────────────────────────────────────
20
+ export const NPM_PACKAGE_NAME = 'workday-daemon';
21
+ export const NPM_REGISTRY_LATEST_URL = `https://registry.npmjs.org/${NPM_PACKAGE_NAME}/latest`;
22
+ /** Registry check timeout — fail fast, the next scheduled check will retry */
23
+ export const UPDATE_CHECK_TIMEOUT_MS = 5_000;
24
+ /** npm install -g can be slow on cold cache / slow network — be generous */
25
+ export const NPM_INSTALL_TIMEOUT_MS = 180_000;
26
+ /** Daemon checks the registry this often (~2-4 times per working day) */
27
+ export const UPDATE_CHECK_INTERVAL_HOURS = 6;
28
+ /** Random startup delay before the first scheduled check (thundering-herd hygiene) */
29
+ export const UPDATE_CHECK_JITTER_MINUTES = 10;
14
30
  // ─── File locking ──────────────────────────────────────────────────────
15
31
  export const LOCK_EXTENSION = '.lock';
16
32
  export const LOCK_STALE_MS = 10_000;
@@ -19,6 +35,32 @@ export const GIT_BATCH_SEPARATOR = '---WORKDAY-SEP---';
19
35
  export const GIT_MAX_BUFFER_BYTES = 10 * 1024 * 1024;
20
36
  // ─── Budget / Manual adjustment ─────────────────────────────────────────
21
37
  export const MAX_ADJUSTMENT_MINUTES = 480;
38
+ // ─── Manual entry / Activity types ──────────────────────────────────────
39
+ export const ACTIVITY_ATTRIBUTE_KEY = '_Activity_';
40
+ export const DEFAULT_ACTIVITY = 'Development'; // sessions (value == name)
41
+ export const DEFAULT_MANUAL_ACTIVITY = 'Other'; // manual entry, when unspecified
42
+ export const WORK_ATTRIBUTES_CACHE_FILE = 'work-attributes-cache.json';
43
+ // Fallback _Activity_ values (value/name) used only when no Tempo token /
44
+ // fetch fails. Mirrors the live instance — refreshed into cache on first
45
+ // successful GET /4/work-attributes.
46
+ export const FALLBACK_ACTIVITIES = [
47
+ { value: 'AutomationPerformanceTesting', name: 'Automation/Performance Testing' },
48
+ { value: 'Bugfixing', name: 'Bugfixing' },
49
+ { value: 'CodeReview', name: 'Code Review' },
50
+ { value: 'CodeReviewFixes', name: 'Code Review Fixes' },
51
+ { value: 'DesignAnalysis', name: 'Design/Analysis' },
52
+ { value: 'Development', name: 'Development' },
53
+ { value: 'EnvironmentSetup', name: 'Environment Setup' },
54
+ { value: 'Estimation', name: 'Estimation' },
55
+ { value: 'IntegrationTesting', name: 'Integration Testing' },
56
+ { value: 'Merge', name: 'Merge' },
57
+ { value: 'Other', name: 'Other' },
58
+ { value: "QAlead'sactivities", name: "QA lead's activities" },
59
+ { value: 'PM', name: 'PM' },
60
+ { value: 'TechnicalControl', name: 'Technical Control' },
61
+ { value: 'Testing', name: 'Testing' },
62
+ { value: 'TestReview', name: 'Test Review' },
63
+ ];
22
64
  // ─── Push / Tempo ───────────────────────────────────────────────────────
23
65
  export const ISSUE_CACHE_FILE = 'issue-cache.json';
24
66
  export const PUSH_LOG_FILE = 'push-log.json';
@@ -61,6 +103,15 @@ export const FREQUENCY_GAIN_MAX = 2;
61
103
  export const STAMINA_LINES_PER_MINUTE = 10;
62
104
  /** Cap on the volume contribution per tick (reached at 20 changed lines at 30s ticks) */
63
105
  export const VOLUME_GAIN_MAX = 4;
106
+ /**
107
+ * Line-equivalent granted per file whose content changed while its diff
108
+ * numbers stayed flat (rewrite-in-place: lines already differed from the
109
+ * base, so numstat can't see the churn). Detected via content hashing.
110
+ */
111
+ export const IN_PLACE_CHURN_LINES = 8;
112
+ /** Churn scanner caps: don't read/hash absurd working sets */
113
+ export const CHURN_MAX_FILES = 100;
114
+ export const CHURN_MAX_FILE_BYTES = 2 * 1024 * 1024;
64
115
  /** "Free" score on commit (in seconds, converted to ticks) */
65
116
  export const COMMIT_BONUS_SECONDS = 150;
66
117
  /** Constant per-tick score drain */
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/core/constants.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/core/constants.ts"],"names":[],"mappings":"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"}