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 +34 -20
- package/SETUP.md +93 -20
- package/dist/{audit-B5GKGH2P.js → audit-7ZCLKF46.js} +6 -5
- package/dist/{chunk-YWHADSKR.js → chunk-64XB7UDN.js} +1 -1
- package/dist/{chunk-NWYOCDUU.js → chunk-J7ZYVUG6.js} +4 -6
- package/dist/chunk-ODJGQCM3.js +1003 -0
- package/dist/{chunk-C6FXWHGT.js → chunk-RZNQJ6UG.js} +123 -282
- package/dist/{chunk-AUBJ2IDQ.js → chunk-Z4SFMMRQ.js} +2 -2
- package/dist/cli.js +9 -8
- package/dist/{demo-AMK3Y4JZ.js → demo-BYLLMKSQ.js} +135 -32
- package/dist/{init-YGOPPELJ.js → init-EMZDG2I7.js} +1 -9
- package/dist/{seed-57RJGU4Y.js → seed-JU4LQ33D.js} +3 -3
- package/dist/{server-5HCA62YY.js → server-WQYUOKB3.js} +416 -384
- package/dist/{service-63U4WBUH.js → service-PUJ3YDH5.js} +1 -1
- package/package.json +2 -2
- package/prompts/README.md +2 -3
- package/prompts/assistant.md +14 -3
- package/prompts/morning-brief-personal.md +1 -25
- package/prompts/morning-brief-work.md +8 -33
- package/public/app.js +440 -441
- package/public/style.css +192 -181
- package/dist/chunk-GFCWPYEI.js +0 -456
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
|
|
94
|
-
|
|
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
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
the
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
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
|
|
130
|
-
|
|
131
|
-
|
|
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
|
|
143
|
-
|
|
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
|
|
281
|
-
no checkout to work in. That is deliberate. Fixing merge conflicts or a
|
|
282
|
-
belongs in a real coding session; this panel is for the questions you'd
|
|
283
|
-
answer by opening six tabs. The Gmail draft is the one thing it creates,
|
|
284
|
-
Gmail tool the CLI has: with Claude Code that
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
the assistant hands you the text
|
|
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
|
|
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
|
-
| `
|
|
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-
|
|
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
|
-
|
|
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-
|
|
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(
|
|
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)));
|
|
@@ -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),
|