daily-focus 1.1.1-dev.3 → 1.2.0-dev.10

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 CHANGED
@@ -64,13 +64,6 @@ since you completed something that advanced your objective.
64
64
  - Mark tasks **Done** when you've handled them.
65
65
  - **Snooze** an item until a date, or **Dismiss** it if it doesn't need attention.
66
66
  - Leave a **Note** for the next brief, such as "already replied on Slack".
67
- - Press **f** for focus mode, which shows your top item and agenda.
68
- - Press **p** on an item to start a focus timer. Its countdown appears in the tab
69
- title, and the session becomes part of the next brief's context.
70
-
71
- The timer keeps counting after its target time. On macOS, it ends a session when
72
- you've been away from the machine, excluding the time you were away. On systems
73
- without idle detection, a two-hour limit caps the recorded session.
74
67
 
75
68
  You can undo item actions except notes. The page updates as new data arrives, and
76
69
  the theme button switches between system, light, and dark mode.
@@ -90,8 +83,10 @@ The second tab shows your open pull requests in seven buckets:
90
83
  | Drafts | Pull requests you haven't marked ready for review. |
91
84
 
92
85
  Park a pull request until a date, leave a note, or click **Nudged** after asking
93
- for a review. Nudged records a note; it doesn't send a message. Completing a task
94
- about a pull request in the brief doesn't remove that pull request from the board.
86
+ for a review. Nudged records that you asked; it doesn't send a message. The pull
87
+ request moves to a Nudged section for a day, then goes back to Waiting on reviewers
88
+ with "time to ask" if nobody has reviewed it. Completing a task about a pull
89
+ request in the brief doesn't remove that pull request from the board.
95
90
 
96
91
  Cancelled checks appear as "cancelled, no verdict" rather than failures.
97
92
  When a check is rerun, the board uses its newest workflow run or attempt.
@@ -111,6 +106,14 @@ Draft pull requests count as open. Closed pull requests don't prove that a ticke
111
106
  is finished, so the board leaves that decision to you. Park a reminder or leave a
112
107
  note when there's more work planned.
113
108
 
109
+ Jira can take days to hear that a pull request merged, so the board also checks
110
+ GitHub. It searches your open pull requests and the ones closed in the last 60
111
+ days, and matches them to tickets by the key in the title, branch, description
112
+ or commit messages. An open pull request on GitHub always counts. GitHub can
113
+ also mark a ticket's pull requests as all closed, but only when it found at least
114
+ as many as Jira has linked. A row that GitHub changed lists those pull requests
115
+ under **GitHub, ahead of Jira**.
116
+
114
117
  Switch to **Working on** to see your in-progress tickets grouped by status,
115
118
  including ones that also need a status check. You can narrow this view in
116
119
  [SETUP.md](SETUP.md#jira).
@@ -127,15 +130,28 @@ why is CI red, what does this thread actually want from me. With
127
130
  `DAILY_FOCUS_ASSISTANT` set to `claude` or `codex`, every item's panel gets an
128
131
  assistant that runs that CLI headless against the item, with quick actions for the
129
132
  common asks and a field for anything else. Click a card to open its panel, where its
130
- notes live too; the reply streams in there, and you can follow up in the same
131
- conversation. The panel stays on the item it was opened for while you move through
132
- the list.
133
-
134
- It reads and drafts, and that is all. An email reply is created as a Gmail draft on
135
- the thread, so it is waiting there when you open the mail; a reply to a reviewer is
136
- handed back as text for you to post. It never sends, posts, or edits a file, and it
137
- has no checkout: fixing conflicts or a build is work for a real coding session, and
138
- this is for the questions you would otherwise answer by opening six tabs.
133
+ notes live too. While the assistant works, the panel shows what it is doing: each
134
+ command it runs and each page, thread or ticket it reads, with a clock, and a cross
135
+ on anything that failed, such as a repository it couldn't see. Once it answers,
136
+ that trail folds away under the answer. The answer has buttons to copy it, or any
137
+ block in it meant for pasting, and to open a draft it created. The field stays at
138
+ the foot of the panel, so you can follow up in the same conversation. The panel
139
+ stays on the item it was opened for while you move through the list.
140
+
141
+ It can also answer before you ask. With **Answer ahead** on in the settings, when a
142
+ pull request starts waiting on you because someone reviewed it or a check failed,
143
+ the assistant assesses the review or explains the failure on its own. The first
144
+ line of its answer appears on the row, such as "Flaky, not yours: the Safari job
145
+ timed out", so the card already says what to do. It asks about each state once,
146
+ one at a time, and no more than ten times a day unless you change the limit.
147
+
148
+ It is told to read and draft, and nothing more. An email reply is created as a Gmail
149
+ draft on the thread, so it is waiting there when you open the mail; a reply to a
150
+ reviewer is handed back as text for you to post. It is told never to send, post, or
151
+ edit a file, and it has no checkout: fixing conflicts or a build is work for a real
152
+ coding session, and this is for the questions you would otherwise answer by opening
153
+ six tabs. How much of that the CLI itself enforces differs between Claude Code and
154
+ Codex; see [What the assistant can do](SETUP.md#what-the-assistant-can-do).
139
155
 
140
156
  ## The morning agent
141
157
 
@@ -165,8 +181,6 @@ Press **?** in the dashboard to see the shortcuts.
165
181
  | `a` | Open the panel, ready to ask the assistant |
166
182
  | `o` | Open the source link |
167
183
  | `u` | Undo the last action |
168
- | `f` | Toggle focus mode |
169
- | `p` | Start / stop a focus session |
170
184
  | `r` | Refresh the current board |
171
185
  | `w` | Switch Jira views |
172
186
  | `,` | Settings |
package/SETUP.md CHANGED
@@ -126,21 +126,30 @@ it finishes, and a chat where you can ask it why it did what it did. See
126
126
  The agent reaches your sources the way the CLI does:
127
127
 
128
128
  - **Codex** runs in its workspace-write sandbox with network access, confined to the
129
- store. Connectors from the Codex app are found through its plugin catalogue. There
130
- is nobody to approve a command outside the sandbox, so the agent reports that
131
- restriction for any `gh` command that needs it, such as switching accounts.
129
+ store. Connectors from the Codex app are found through its plugin catalogue, and
130
+ every write through one is refused: a connector tool counts as a write unless it
131
+ is marked read-only. A command that needs to leave the sandbox, such as `gh`
132
+ switching accounts, is decided by your own Codex approval settings, as it would be
133
+ in your Codex. With nobody set to approve, the agent reports that restriction; with
134
+ Codex's automatic reviewer, the reviewer decides. The dashboard won't start a run
135
+ on a Codex older than 0.144.0, which would ignore the refusal of connector writes;
136
+ update Codex if a run fails saying so.
132
137
  - **Claude Code** may write `items.json` and nothing else in the store, and reach
133
138
  its sources with only what `DAILY_FOCUS_AGENT_TOOLS` allows. The default covers
134
139
  GitHub, Jira, web pages and the claude.ai Gmail connector. Add your calendar, chat
135
140
  and document connectors to the list by name, or the brief will report them as
136
- unreachable.
141
+ unreachable. The default allows every Gmail tool, sending included, and `gh` and
142
+ `acli` can write as well as read; the agent's instructions forbid changing
143
+ anything. To narrow Gmail to reading, name its tools instead of the connector, as
144
+ [What the assistant can do](#what-the-assistant-can-do) shows, without the two
145
+ draft tools.
137
146
 
138
147
  Set `DAILY_FOCUS_AGENT_MODEL` and `DAILY_FOCUS_AGENT_EFFORT` if the CLI's own
139
148
  defaults are not what you want for a brief; a brief is worth a high effort. If the
140
149
  server can't find the CLI, set `DAILY_FOCUS_AGENT_BIN`.
141
150
 
142
- The agent writes `items.json`. The dashboard records your actions and focus sessions
143
- for the next run to read.
151
+ The agent writes `items.json`. The dashboard records your actions for the next run
152
+ to read.
144
153
 
145
154
  After the first run, read its report (click "updated … ago"): it says which sources
146
155
  it couldn't reach. To check the brief against the payload contract, run:
@@ -228,6 +237,11 @@ Clicking a status in the dashboard writes one transition to Jira. All other Jira
228
237
  access is read-only. See the [ticket board guide](README.md#the-jira-ticket-board)
229
238
  for workflow limits and undo behavior.
230
239
 
240
+ The board also asks GitHub about your pull requests, because Jira can learn of
241
+ them days late. It uses the pull request board's accounts and scope, and nothing
242
+ else needs to be configured. With `DAILY_FOCUS_GITHUB=off`, the ticket board uses
243
+ Jira alone.
244
+
231
245
  Set `DAILY_FOCUS_JIRA=off` to disable the board.
232
246
 
233
247
  ### Live calendar on macOS
@@ -277,14 +291,72 @@ the CLI is configured with; `DAILY_FOCUS_ASSISTANT_MODEL` and
277
291
  `DAILY_FOCUS_ASSISTANT_EFFORT` override them. If the server can't find the CLI,
278
292
  set `DAILY_FOCUS_ASSISTANT_BIN` to its path.
279
293
 
280
- The assistant reads and drafts; it never sends, posts or edits anything, and it has
281
- no checkout to work in. That is deliberate. Fixing merge conflicts or a failing build
282
- belongs in a real coding session; this panel is for the questions you'd otherwise
283
- answer by opening six tabs. The Gmail draft is the one thing it creates, through the
284
- Gmail tool the CLI has: with Claude Code that is the claude.ai Gmail connector, which
285
- `DAILY_FOCUS_ASSISTANT_TOOLS` allows by default; with Codex it is the Gmail plugin
286
- from the Codex app, which the CLI finds through its plugin catalogue. Without either,
287
- the assistant hands you the text instead and says so.
294
+ The assistant is told to read and draft, and never to send, post or edit anything,
295
+ and it has no checkout to work in. That is deliberate. Fixing merge conflicts or a
296
+ failing build belongs in a real coding session; this panel is for the questions you'd
297
+ otherwise answer by opening six tabs. The Gmail draft is the one thing it creates,
298
+ and revises when you ask, through the Gmail tool the CLI has: with Claude Code that
299
+ is the claude.ai Gmail connector, which `DAILY_FOCUS_ASSISTANT_TOOLS` allows by
300
+ default; with Codex it is the Gmail app linked to your ChatGPT account, which the CLI
301
+ finds through its plugin catalogue. Without either, the assistant hands you the text
302
+ instead and says so.
303
+
304
+ ### What the assistant can do
305
+
306
+ The assistant runs the CLI you already use, with the access that CLI already has.
307
+ The dashboard narrows some of that, and leaves the rest to the assistant's
308
+ instructions. What the CLI itself enforces:
309
+
310
+ - **Claude Code** may use only the tools in `DAILY_FOCUS_ASSISTANT_TOOLS`, and never
311
+ its file-editing tools, whatever the list says; anything else is refused rather
312
+ than asked about. Rules in your own Claude Code settings that allow a tool still
313
+ apply. The default list is broader than the assistant needs:
314
+ `mcp__claude_ai_Gmail` allows every tool on the Gmail connector, sending and
315
+ deleting included, and `gh` and `acli` can comment, merge and move tickets as well
316
+ as read. Only the instructions keep it from doing those. To hold it to reading
317
+ mail and drafting replies, name the Gmail tools instead of the connector:
318
+
319
+ ```dotenv
320
+ DAILY_FOCUS_ASSISTANT_TOOLS=Bash(gh *),Bash(acli *),WebFetch,mcp__claude_ai_Gmail__search_threads,mcp__claude_ai_Gmail__get_thread,mcp__claude_ai_Gmail__get_message,mcp__claude_ai_Gmail__list_labels,mcp__claude_ai_Gmail__list_drafts,mcp__claude_ai_Gmail__get_draft,mcp__claude_ai_Gmail__create_draft,mcp__claude_ai_Gmail__update_draft
321
+ ```
322
+
323
+ A tool left off the list is refused, so if the connector renames one, the
324
+ assistant reports that it can't reach your mail rather than working around it.
325
+ - **Codex** refuses every write through a connector (Gmail, Calendar, Drive, GitHub
326
+ and the other apps your ChatGPT account links) except creating and revising a
327
+ Gmail draft. A connector tool counts as a write unless it is marked read-only. A
328
+ tool you have told Codex to always allow, or an app given approval settings of its
329
+ own in your Codex config, keeps them. Computer use, the plugins that act in your
330
+ apps and browser with your sign-ins, is off unless you turn on
331
+ `DAILY_FOCUS_ASSISTANT_COMPUTER_USE`; the dashboard checks with Codex that it is
332
+ off before each session, and refuses to start one it can't confirm. Shell
333
+ commands follow your own Codex config: the sandbox keeps writes in the
334
+ assistant's working directory, and a command that needs to leave it is decided
335
+ by your Codex approval settings, as it would be in your own Codex. That keeps
336
+ `gh` working, and means it can write. All of this needs Codex 0.149.0 or
337
+ newer, and the page warns when yours is older. Before 0.144.0 Codex silently
338
+ ignores the refusal of connector writes, so the dashboard won't start the
339
+ assistant or the morning agent on it at all; before 0.149.0 it can't switch
340
+ computer use off, so the assistant won't answer while that setting is off.
341
+
342
+ ### Answer ahead
343
+
344
+ With `DAILY_FOCUS_ASSISTANT_AUTO=on`, the dashboard asks the assistant before you
345
+ do. When a pull request lands in *Waiting on you* because someone reviewed or
346
+ commented, it asks the assistant to assess the review. When a check fails, it asks
347
+ for an explanation of the failure. The first line of the answer appears on the row,
348
+ on the board and on the brief item for the same pull request, while it still
349
+ matches the pull request's state. The whole answer is in the panel, as a turn you
350
+ can follow up on.
351
+
352
+ It asks about each state once. A new comment or a new failure is a new question;
353
+ the same checks failing again on the same commit are not. It runs one question at a
354
+ time and never on a row you're asking about, and it starts no more than
355
+ `DAILY_FOCUS_ASSISTANT_AUTO_LIMIT` a day (10 by default). It uses only those two
356
+ quick actions, which read and answer, and never one that drafts. It follows the
357
+ board, which reads only while a tab is open, so it asks while you have the
358
+ dashboard open. It is off by default because it spends the CLI's usage without
359
+ you pressing anything.
288
360
 
289
361
  Its instructions live in `prompts/assistant.md`, linked into the store as
290
362
  `assistant.md` each time the dashboard starts. What it says stays in the chat in the panel: it
@@ -408,7 +480,7 @@ DAILY_FOCUS_PROFILE=personal
408
480
  The dashboard then links the personal prompt, `prompts/morning-brief-personal.md`,
409
481
  into the store as `prompt.md`, and the source list starts from a template with
410
482
  sections for those sources. The profile also switches off
411
- the Jira board and away detection, and gives the tab a green house icon instead of the blue briefcase. The pull request
483
+ the Jira board, and gives the tab a green house icon instead of the blue briefcase. The pull request
412
484
  board stays on for side projects; point it at your personal account with
413
485
  `DAILY_FOCUS_GITHUB_ACCOUNTS`, or set `DAILY_FOCUS_GITHUB=off`.
414
486
 
@@ -469,9 +541,7 @@ matters when `DAILY_FOCUS_FREE_WINDOWS` is off.
469
541
  | `DAILY_FOCUS_MIN_FREE_WINDOW` | `45` | Minutes before a gap counts as a focus window |
470
542
  | `DAILY_FOCUS_STALE_AFTER_HOURS` | `24` | When to expect a refresh. Shows an informational message for 45 minutes before warning that the agent may not have run. Counted only in hours a run was due, so days off never trip it |
471
543
  | `DAILY_FOCUS_AGENT_DAYS` | `1-5` | Weekdays the dashboard runs the agent on, cron-style and cron-numbered: `1-5` for Monday to Friday, `0-4` for Sunday to Thursday, `0,6` for a weekend-only run |
472
- | `DAILY_FOCUS_SESSION_MINUTES` | `25` | Default focus session length |
473
- | `DAILY_FOCUS_AWAY_AFTER` | `10`; `0` for personal | Minutes of an untouched machine before a session is closed at the last sign of life. `0` turns it off |
474
- | `DAILY_FOCUS_GITHUB` | `on` | `off` disables the pull request board; nothing is polled |
544
+ | `DAILY_FOCUS_GITHUB` | `on` | `off` disables the pull request board, and the ticket board stops checking GitHub; nothing is polled |
475
545
  | `DAILY_FOCUS_GITHUB_ACCOUNTS` | *gh's active account* | Logins to poll as, comma-separated, each resolved with `gh auth token --user` |
476
546
  | `DAILY_FOCUS_GITHUB_SCOPE` | *everything* | Organisations or `owner/repo` entries to limit the board to, comma-separated |
477
547
  | `DAILY_FOCUS_GITHUB_MERGE_GATE_CHECKS` | *none* | Check names that stand for a repository's whole merge policy, comma-separated and matched exactly. Their rows get the *Waiting on merge gate* bucket |
@@ -493,13 +563,16 @@ matters when `DAILY_FOCUS_FREE_WINDOWS` is off.
493
563
  | `DAILY_FOCUS_ASSISTANT_BIN` | *the CLI's name* | Path to the assistant's CLI, for when the server's PATH lacks it. `~` is expanded |
494
564
  | `DAILY_FOCUS_ASSISTANT_MODEL` | *the CLI's own* | Model passed to the CLI untouched: an alias like `opus`, or a full id. Unset passes no flag |
495
565
  | `DAILY_FOCUS_ASSISTANT_EFFORT` | *the CLI's own* | Effort passed to the CLI untouched: `low`, `medium`, `high`, `xhigh` or `max`. Unset passes no flag |
496
- | `DAILY_FOCUS_ASSISTANT_TOOLS` | `Bash(gh *),Bash(acli *),WebFetch,mcp__claude_ai_Gmail` | What Claude Code may use without asking, in its permission syntax, comma-separated. Editing tools are denied regardless. Ignored by Codex |
566
+ | `DAILY_FOCUS_ASSISTANT_TOOLS` | `Bash(gh *),Bash(acli *),WebFetch,mcp__claude_ai_Gmail` | What Claude Code may use without asking, in its permission syntax, comma-separated. Editing tools are denied regardless. The default allows every Gmail tool, sending included; see [What the assistant can do](#what-the-assistant-can-do) to narrow it. Ignored by Codex |
567
+ | `DAILY_FOCUS_ASSISTANT_COMPUTER_USE` | `off` | `on` lets the assistant use Codex's computer-use and browser plugins, which act in your apps and browser with your sign-ins. `off` switches them off for its runs. Ignored by Claude Code, which uses only the tools in its list |
568
+ | `DAILY_FOCUS_ASSISTANT_AUTO` | `off` | `on` asks the assistant ahead about pull requests waiting on you, after a review or a failing check, and puts the answer's first line on the row. See [Answer ahead](#answer-ahead) |
569
+ | `DAILY_FOCUS_ASSISTANT_AUTO_LIMIT` | `10` | How many times a day the assistant may start on its own, from 1 to 100 |
497
570
  | `DAILY_FOCUS_AGENT` | `off` | `codex` or `claude` lets the dashboard run the morning agent through that CLI: each scheduled morning, and from the refresh icon beside the brief's age. `off` hides it |
498
571
  | `DAILY_FOCUS_AGENT_AT` | `07:00` | Local time, `HH:MM`, at which the dashboard starts the agent on each scheduled day, or as soon as it is running after that. `off` means it never starts one on its own; the refresh icon still does. Needs `DAILY_FOCUS_AGENT` |
499
572
  | `DAILY_FOCUS_AGENT_BIN` | *the CLI's name* | Path to that CLI, for when the server's PATH lacks it. `~` is expanded |
500
573
  | `DAILY_FOCUS_AGENT_MODEL` | *the CLI's own* | Model passed to the CLI untouched. Unset passes no flag |
501
574
  | `DAILY_FOCUS_AGENT_EFFORT` | *the CLI's own* | Effort passed to the CLI untouched. Unset passes no flag |
502
- | `DAILY_FOCUS_AGENT_TOOLS` | `Bash(gh *),Bash(acli *),WebFetch,mcp__claude_ai_Gmail` | What Claude Code may use to reach your sources, in its permission syntax, comma-separated. Writing `items.json`, and nothing else in the store, is allowed regardless. Ignored by Codex |
575
+ | `DAILY_FOCUS_AGENT_TOOLS` | `Bash(gh *),Bash(acli *),WebFetch,mcp__claude_ai_Gmail` | What Claude Code may use to reach your sources, in its permission syntax, comma-separated. Writing `items.json`, and nothing else in the store, is allowed regardless. The default allows every Gmail tool, sending included. Ignored by Codex |
503
576
 
504
577
  ## If something looks wrong
505
578
 
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  readSystemZone,
3
3
  startingZone
4
- } from "./chunk-AUBJ2IDQ.js";
4
+ } from "./chunk-Z4SFMMRQ.js";
5
5
  import {
6
6
  linkState
7
7
  } from "./chunk-QKT2FAB5.js";
@@ -11,8 +11,9 @@ import {
11
11
  parseBrief,
12
12
  readArchiveIndex,
13
13
  resolveItems,
14
- runContractChecks
15
- } from "./chunk-C6FXWHGT.js";
14
+ runContractChecks,
15
+ setsStatus
16
+ } from "./chunk-RZNQJ6UG.js";
16
17
  import {
17
18
  BRIEF_REFRESH_GRACE_HOURS,
18
19
  describeSchedule,
@@ -22,7 +23,7 @@ import {
22
23
  resolveSchedule,
23
24
  runsOn,
24
25
  workingMsBetween
25
- } from "./chunk-NWYOCDUU.js";
26
+ } from "./chunk-J7ZYVUG6.js";
26
27
  import {
27
28
  command
28
29
  } from "./chunk-BC2W7NND.js";
@@ -180,7 +181,7 @@ if (!previous) {
180
181
  const reproduced = [...previousIds].filter((id) => currentIds.has(id));
181
182
  const dropped = [...previousIds].filter((id) => !currentIds.has(id));
182
183
  const added = [...currentIds].filter((id) => !previousIds.has(id));
183
- const actedOn = new Set(actions.filter((a) => a.action !== "note").map((a) => a.id));
184
+ const actedOn = new Set(actions.filter(setsStatus).map((a) => a.id));
184
185
  const addedFingerprints = new Map(added.map((id) => [fingerprintId(id), id]));
185
186
  const handled = dropped.filter((id) => actedOn.has(id));
186
187
  const drifted = dropped.filter((id) => !actedOn.has(id) && addedFingerprints.has(fingerprintId(id)));
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  localDateKey
3
- } from "./chunk-NWYOCDUU.js";
3
+ } from "./chunk-J7ZYVUG6.js";
4
4
 
5
5
  // src/sample.ts
6
6
  function timeOn(now, hour, minute = 0) {
@@ -353,7 +353,10 @@ function envAssistant(env) {
353
353
  binPath: expandHome((env.DAILY_FOCUS_ASSISTANT_BIN ?? "").trim() || (agent ?? "claude")),
354
354
  model: envString("DAILY_FOCUS_ASSISTANT_MODEL", "", env) || null,
355
355
  effort: envString("DAILY_FOCUS_ASSISTANT_EFFORT", "", env) || null,
356
- tools: tools.length > 0 ? tools : DEFAULT_ASSISTANT_TOOLS
356
+ tools: tools.length > 0 ? tools : DEFAULT_ASSISTANT_TOOLS,
357
+ computerUse: envFlag("DAILY_FOCUS_ASSISTANT_COMPUTER_USE", false, env),
358
+ auto: envFlag("DAILY_FOCUS_ASSISTANT_AUTO", false, env),
359
+ autoLimit: envBounded("DAILY_FOCUS_ASSISTANT_AUTO_LIMIT", 10, 1, 100, env)
357
360
  };
358
361
  }
359
362
  var DEFAULT_ASSISTANT_TOOLS = ["Bash(gh *)", "Bash(acli *)", "WebFetch", "mcp__claude_ai_Gmail"];
@@ -439,15 +442,10 @@ function loadConfig(env = loadEnv()) {
439
442
  schemaFile: resolve2(dataDir, "items.schema.json"),
440
443
  schemaSource: resolve2(import.meta.dirname, "..", "schema", "items.schema.json"),
441
444
  archiveDir: resolve2(dataDir, "archive"),
442
- sessionFile: resolve2(dataDir, "session.json"),
443
- sessionsLogFile: resolve2(dataDir, "sessions.jsonl"),
444
445
  pullsFile: resolve2(dataDir, "prs.json"),
445
446
  calendarFile: resolve2(dataDir, "calendar.json"),
446
447
  ticketsFile: resolve2(dataDir, "tickets.json"),
447
448
  timeZoneFile: resolve2(dataDir, "timezone.json"),
448
- // The same 1 to 120 the session endpoint holds a start to.
449
- sessionMinutes: envBounded("DAILY_FOCUS_SESSION_MINUTES", 25, 1, 120, env),
450
- awayAfterMinutes: envBounded("DAILY_FOCUS_AWAY_AFTER", profile === "personal" ? 0 : 10, 0, 24 * 60, env),
451
449
  port: envBounded("DAILY_FOCUS_PORT", 4321, 0, 65535, env),
452
450
  host: envString("DAILY_FOCUS_HOST", "127.0.0.1", env),
453
451
  freeWindows: envFlag("DAILY_FOCUS_FREE_WINDOWS", profile !== "personal", env),