sessionkit 0.3.3__tar.gz → 0.4.0__tar.gz

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.
@@ -0,0 +1,162 @@
1
+ Metadata-Version: 2.4
2
+ Name: sessionkit
3
+ Version: 0.4.0
4
+ Summary: Session Kit gives your Claude Code sessions voice, mail, a phone line and a tmux sidebar, in one install.
5
+ Author: Mike Bailey
6
+ Author-email: Mike Bailey <mike@sessionkit.ai>
7
+ License-Expression: AGPL-3.0-or-later
8
+ License-File: LICENSE
9
+ Classifier: Development Status :: 3 - Alpha
10
+ Requires-Dist: click>=8.1
11
+ Requires-Dist: sessionmail>=0.4.0
12
+ Requires-Dist: sessiontools>=0.4.0
13
+ Requires-Dist: sessionphone[media]>=0.4.0
14
+ Requires-Dist: sessionview>=0.4.0
15
+ Requires-Dist: sessionvoice[capture]>=0.4.0
16
+ Requires-Dist: settled[kit]>=0.1.0
17
+ Requires-Python: >=3.11, <3.15
18
+ Project-URL: Homepage, https://github.com/sessionkit/sessionkit
19
+ Project-URL: Repository, https://github.com/sessionkit/sessionkit
20
+ Description-Content-Type: text/markdown
21
+
22
+ # Session Kit
23
+
24
+ Session Kit gives your Claude Code sessions a voice, a phone line and a
25
+ mailbox. From the people who brought you [VoiceMode][voicemode].
26
+
27
+ ```bash
28
+ curl -fsSL https://sessionkit.ai/install.sh | bash
29
+ ```
30
+
31
+ This repo is the kit's home: the installer, the [manual steps][manual]
32
+ and the docs.
33
+
34
+ <!-- Hero image goes here: Talk on a phone, mid-conversation. -->
35
+
36
+ ## Features
37
+
38
+ - **Voice.** Your session hears the room and answers aloud.
39
+ - **A phone line.** Text or ring your session from Delta Chat on your phone.
40
+ - **Mail.** Agents mail each other, and an idle agent wakes when mail lands
41
+ ([mail between agents][mail]).
42
+ - **A crew.** One agent starts another and hands it the work.
43
+ - **Talk.** Watch the conversation live in a browser.
44
+
45
+ ## Quick start
46
+
47
+ After the install, do what its last screen lists (sign in to Claude Code
48
+ once), then start your first session, in whatever folder you're in:
49
+
50
+ ```bash
51
+ session start
52
+ ```
53
+
54
+ Ask Claude to call you. It shows a QR code: scan it with your phone and
55
+ follow the steps to install Delta Chat. Then you can text or ring your
56
+ session. Asking Claude to call you, or ringing your session, is when you
57
+ agree to be heard, and recorded if recording is on.
58
+
59
+ ## What it installs
60
+
61
+ Session Kit installs the family in one go: five packages, each with its
62
+ Claude Code plugin, and the Settings page.
63
+
64
+ - [sessionmail][pkg-mail]: mail for agent memory and communication
65
+ ([the paper][paper]).
66
+ - [sessiontools][pkg-tools]: your live sessions, and starting new ones.
67
+ - [sessionvoice][pkg-voice]: the ears hear the room; the mouth speaks.
68
+ - [sessionphone][pkg-phone]: a phone line to your session, over Delta Chat.
69
+ - [sessionview][pkg-view]: a tmux sidebar of your projects and agents.
70
+ - [settled][settled]: the kit's settings page, on your own Mac.
71
+
72
+ Every command answers `--help`. Commands, services and folders:
73
+ [components][components].
74
+
75
+ ## Requirements
76
+
77
+ - [x] macOS on Apple silicon (tested on an M5 MacBook Air, 16 GB, macOS 27)
78
+ - [ ] Linux (preliminary testing; no install steps yet)
79
+ - [ ] WSL
80
+ - [ ] Windows
81
+
82
+ You need:
83
+
84
+ - [Homebrew][brew]
85
+ - [uv][uv]
86
+ - [Claude Code][claude-code]
87
+ - About 8 GB of free disk
88
+
89
+ The installer adds any of the first three that are missing.
90
+
91
+ ## Installation
92
+
93
+ The one line at the top checks your Mac, lists what it will add, and asks
94
+ before it installs anything. Rather run each step yourself? With the
95
+ requirements in place (the speech server is about 4 GB):
96
+
97
+ ```bash
98
+ brew install tmux ffmpeg notmuch
99
+ uv tool install --python 3.14 sessionkit
100
+ claude plugin marketplace add sessionkit/sessionkit
101
+ claude plugin install sessionkit@sessionkit
102
+ ears install
103
+ ears services install --agent claude
104
+ sessionkit setup
105
+ pager settings hooks on
106
+ ```
107
+
108
+ Then quit Claude Code, every window, so the plugins load. Check it with
109
+ `sessionkit doctor`. More detail: [step by step][install]. To remove it:
110
+ [uninstall][uninstall].
111
+
112
+ **Already using VoiceMode?** It keeps working. Use either one, or both side
113
+ by side.
114
+
115
+ ## Configuration
116
+
117
+ Each package's settings: [configuration][config]. How they stack:
118
+ [settings][settings].
119
+
120
+ ## Logs
121
+
122
+ Where each log is: [logs][logs]. Which to read for a symptom:
123
+ [troubleshooting][trouble]. Restarting a service: [service][service].
124
+ **Health:** `sessionkit doctor`.
125
+
126
+ ## Development
127
+
128
+ `make install`, then `make check`. The rules: [AGENTS.md][agents].
129
+
130
+ Working across the family? With your clones of the five packages beside this
131
+ one, `make install-dev` installs the whole kit from them (`DRY_RUN=1` first
132
+ to see the command).
133
+
134
+ ## Status
135
+
136
+ Alpha, 0.4.0. A new release most Sundays. [Known gaps][gaps] · Licence
137
+ [AGPL-3.0][licence].
138
+
139
+ [voicemode]: https://voicemode.dev
140
+ [brew]: https://brew.sh
141
+ [uv]: https://docs.astral.sh/uv/
142
+ [claude-code]: https://code.claude.com/docs/en/overview
143
+ [install]: https://github.com/sessionkit/sessionkit/blob/HEAD/INSTALL.md
144
+ [manual]: #installation
145
+ [mail]: https://github.com/sessionkit/sessionkit/blob/HEAD/INSTALL.md#mail-between-agents
146
+ [gaps]: https://github.com/sessionkit/sessionkit/blob/HEAD/INSTALL.md#7-known-gaps-you-will-hit
147
+ [uninstall]: https://github.com/sessionkit/sessionkit/blob/HEAD/INSTALL.md#8-uninstall
148
+ [components]: https://github.com/sessionkit/sessionkit/blob/HEAD/docs/components.md
149
+ [config]: https://github.com/sessionkit/sessionkit/blob/HEAD/docs/configuration.md
150
+ [settings]: https://github.com/sessionkit/sessionkit/blob/HEAD/docs/settings.md
151
+ [service]: https://github.com/sessionkit/sessionkit/blob/HEAD/docs/service.md
152
+ [logs]: https://github.com/sessionkit/sessionkit/blob/HEAD/docs/components.md#logs
153
+ [trouble]: https://github.com/sessionkit/sessionkit/blob/HEAD/docs/troubleshooting.md
154
+ [agents]: https://github.com/sessionkit/sessionkit/blob/HEAD/AGENTS.md
155
+ [licence]: https://github.com/sessionkit/sessionkit/blob/HEAD/LICENSE
156
+ [pkg-mail]: https://github.com/sessionkit/sessionmail
157
+ [paper]: https://cora7.com/blog/the-mailbox-is-the-memory/
158
+ [pkg-tools]: https://github.com/sessionkit/sessiontools
159
+ [pkg-voice]: https://github.com/sessionkit/sessionvoice
160
+ [pkg-phone]: https://github.com/sessionkit/sessionphone
161
+ [pkg-view]: https://github.com/sessionkit/sessionview
162
+ [settled]: https://github.com/sessionkit/settled
@@ -0,0 +1,141 @@
1
+ # Session Kit
2
+
3
+ Session Kit gives your Claude Code sessions a voice, a phone line and a
4
+ mailbox. From the people who brought you [VoiceMode][voicemode].
5
+
6
+ ```bash
7
+ curl -fsSL https://sessionkit.ai/install.sh | bash
8
+ ```
9
+
10
+ This repo is the kit's home: the installer, the [manual steps][manual]
11
+ and the docs.
12
+
13
+ <!-- Hero image goes here: Talk on a phone, mid-conversation. -->
14
+
15
+ ## Features
16
+
17
+ - **Voice.** Your session hears the room and answers aloud.
18
+ - **A phone line.** Text or ring your session from Delta Chat on your phone.
19
+ - **Mail.** Agents mail each other, and an idle agent wakes when mail lands
20
+ ([mail between agents][mail]).
21
+ - **A crew.** One agent starts another and hands it the work.
22
+ - **Talk.** Watch the conversation live in a browser.
23
+
24
+ ## Quick start
25
+
26
+ After the install, do what its last screen lists (sign in to Claude Code
27
+ once), then start your first session, in whatever folder you're in:
28
+
29
+ ```bash
30
+ session start
31
+ ```
32
+
33
+ Ask Claude to call you. It shows a QR code: scan it with your phone and
34
+ follow the steps to install Delta Chat. Then you can text or ring your
35
+ session. Asking Claude to call you, or ringing your session, is when you
36
+ agree to be heard, and recorded if recording is on.
37
+
38
+ ## What it installs
39
+
40
+ Session Kit installs the family in one go: five packages, each with its
41
+ Claude Code plugin, and the Settings page.
42
+
43
+ - [sessionmail][pkg-mail]: mail for agent memory and communication
44
+ ([the paper][paper]).
45
+ - [sessiontools][pkg-tools]: your live sessions, and starting new ones.
46
+ - [sessionvoice][pkg-voice]: the ears hear the room; the mouth speaks.
47
+ - [sessionphone][pkg-phone]: a phone line to your session, over Delta Chat.
48
+ - [sessionview][pkg-view]: a tmux sidebar of your projects and agents.
49
+ - [settled][settled]: the kit's settings page, on your own Mac.
50
+
51
+ Every command answers `--help`. Commands, services and folders:
52
+ [components][components].
53
+
54
+ ## Requirements
55
+
56
+ - [x] macOS on Apple silicon (tested on an M5 MacBook Air, 16 GB, macOS 27)
57
+ - [ ] Linux (preliminary testing; no install steps yet)
58
+ - [ ] WSL
59
+ - [ ] Windows
60
+
61
+ You need:
62
+
63
+ - [Homebrew][brew]
64
+ - [uv][uv]
65
+ - [Claude Code][claude-code]
66
+ - About 8 GB of free disk
67
+
68
+ The installer adds any of the first three that are missing.
69
+
70
+ ## Installation
71
+
72
+ The one line at the top checks your Mac, lists what it will add, and asks
73
+ before it installs anything. Rather run each step yourself? With the
74
+ requirements in place (the speech server is about 4 GB):
75
+
76
+ ```bash
77
+ brew install tmux ffmpeg notmuch
78
+ uv tool install --python 3.14 sessionkit
79
+ claude plugin marketplace add sessionkit/sessionkit
80
+ claude plugin install sessionkit@sessionkit
81
+ ears install
82
+ ears services install --agent claude
83
+ sessionkit setup
84
+ pager settings hooks on
85
+ ```
86
+
87
+ Then quit Claude Code, every window, so the plugins load. Check it with
88
+ `sessionkit doctor`. More detail: [step by step][install]. To remove it:
89
+ [uninstall][uninstall].
90
+
91
+ **Already using VoiceMode?** It keeps working. Use either one, or both side
92
+ by side.
93
+
94
+ ## Configuration
95
+
96
+ Each package's settings: [configuration][config]. How they stack:
97
+ [settings][settings].
98
+
99
+ ## Logs
100
+
101
+ Where each log is: [logs][logs]. Which to read for a symptom:
102
+ [troubleshooting][trouble]. Restarting a service: [service][service].
103
+ **Health:** `sessionkit doctor`.
104
+
105
+ ## Development
106
+
107
+ `make install`, then `make check`. The rules: [AGENTS.md][agents].
108
+
109
+ Working across the family? With your clones of the five packages beside this
110
+ one, `make install-dev` installs the whole kit from them (`DRY_RUN=1` first
111
+ to see the command).
112
+
113
+ ## Status
114
+
115
+ Alpha, 0.4.0. A new release most Sundays. [Known gaps][gaps] · Licence
116
+ [AGPL-3.0][licence].
117
+
118
+ [voicemode]: https://voicemode.dev
119
+ [brew]: https://brew.sh
120
+ [uv]: https://docs.astral.sh/uv/
121
+ [claude-code]: https://code.claude.com/docs/en/overview
122
+ [install]: https://github.com/sessionkit/sessionkit/blob/HEAD/INSTALL.md
123
+ [manual]: #installation
124
+ [mail]: https://github.com/sessionkit/sessionkit/blob/HEAD/INSTALL.md#mail-between-agents
125
+ [gaps]: https://github.com/sessionkit/sessionkit/blob/HEAD/INSTALL.md#7-known-gaps-you-will-hit
126
+ [uninstall]: https://github.com/sessionkit/sessionkit/blob/HEAD/INSTALL.md#8-uninstall
127
+ [components]: https://github.com/sessionkit/sessionkit/blob/HEAD/docs/components.md
128
+ [config]: https://github.com/sessionkit/sessionkit/blob/HEAD/docs/configuration.md
129
+ [settings]: https://github.com/sessionkit/sessionkit/blob/HEAD/docs/settings.md
130
+ [service]: https://github.com/sessionkit/sessionkit/blob/HEAD/docs/service.md
131
+ [logs]: https://github.com/sessionkit/sessionkit/blob/HEAD/docs/components.md#logs
132
+ [trouble]: https://github.com/sessionkit/sessionkit/blob/HEAD/docs/troubleshooting.md
133
+ [agents]: https://github.com/sessionkit/sessionkit/blob/HEAD/AGENTS.md
134
+ [licence]: https://github.com/sessionkit/sessionkit/blob/HEAD/LICENSE
135
+ [pkg-mail]: https://github.com/sessionkit/sessionmail
136
+ [paper]: https://cora7.com/blog/the-mailbox-is-the-memory/
137
+ [pkg-tools]: https://github.com/sessionkit/sessiontools
138
+ [pkg-voice]: https://github.com/sessionkit/sessionvoice
139
+ [pkg-phone]: https://github.com/sessionkit/sessionphone
140
+ [pkg-view]: https://github.com/sessionkit/sessionview
141
+ [settled]: https://github.com/sessionkit/settled
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sessionkit"
3
- version = "0.3.3"
3
+ version = "0.4.0"
4
4
  description = "Session Kit gives your Claude Code sessions voice, mail, a phone line and a tmux sidebar, in one install."
5
5
  readme = "README.md"
6
6
  license = "AGPL-3.0-or-later"
@@ -9,11 +9,11 @@ classifiers = ["Development Status :: 3 - Alpha"]
9
9
  requires-python = ">=3.11,<3.15"
10
10
  dependencies = [
11
11
  "click>=8.1",
12
- "sessionmail>=0.3.3",
13
- "sessiontools>=0.3.3",
14
- "sessionphone[media]>=0.3.3",
15
- "sessionview>=0.3.3",
16
- "sessionvoice[capture]>=0.3.3",
12
+ "sessionmail>=0.4.0",
13
+ "sessiontools>=0.4.0",
14
+ "sessionphone[media]>=0.4.0",
15
+ "sessionview>=0.4.0",
16
+ "sessionvoice[capture]>=0.4.0",
17
17
  "settled[kit]>=0.1.0",
18
18
  ]
19
19
 
@@ -32,14 +32,29 @@ pager = "sessionmail.pager:cli"
32
32
  memory = "sessionmail.memory:cli"
33
33
  session = "sessiontools.cli:main"
34
34
  sessionphone = "sessionphone.cli:main"
35
+ dc-answer = "sessionphone.dctools:main"
36
+ dc-call = "sessionphone.dctools:main"
37
+ dc-call-mix = "sessionphone.dctools:main"
38
+ dc-delete = "sessionphone.dctools:main"
39
+ dc-dm = "sessionphone.dctools:main"
40
+ dc-fetch = "sessionphone.dctools:main"
41
+ dc-hangup = "sessionphone.dctools:main"
42
+ dc-invite = "sessionphone.dctools:main"
43
+ dc-live = "sessionphone.dctools:main"
44
+ dc-log = "sessionphone.dctools:main"
45
+ dc-log-web = "sessionphone.dctools:main"
46
+ dc-react = "sessionphone.dctools:main"
47
+ dc-ring = "sessionphone.dctools:main"
48
+ dc-say = "sessionphone.dctools:main"
49
+ dc-send-file = "sessionphone.dctools:main"
50
+ dc-xdc-realtime = "sessionphone.dctools:main"
51
+ dc-xdc-update = "sessionphone.dctools:main"
35
52
  sessionview = "sessionview:main"
36
- sessionview-config = "sessionview:main"
37
- sessionview-session = "sessionview:main"
38
- sessionview-messages = "sessionview:main"
39
53
  ears = "ears.cli:main"
40
54
  ears-serve = "ears.serve:main"
41
55
  mouth = "mouth.__main__:main"
42
56
  talk = "talk.cli:main"
57
+ sessionvoice-web = "talk.web:main"
43
58
  settled = "settled.cli:main"
44
59
 
45
60
  [build-system]
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sessionkit"
3
- version = "0.3.3"
3
+ version = "0.4.0"
4
4
  description = "Session Kit gives your Claude Code sessions voice, mail, a phone line and a tmux sidebar, in one install."
5
5
  readme = "README.md"
6
6
  license = "AGPL-3.0-or-later"
@@ -14,15 +14,18 @@ requires-python = ">=3.11,<3.15"
14
14
  # with the family's 0.3.0, so it needs every family package at 0.3.0 or
15
15
  # later, and PyPI's 0.0.1 name placeholders and the 0.1.0 alphas must never
16
16
  # satisfy these.
17
- # Within the 0.3.3 floor below, `sessionkit setup` asks sessiontools for
17
+ # Within the 0.4.0 floor below, `sessionkit setup` asks sessiontools for
18
18
  # `session agent default`, and INSTALL.md describes sessionmail's one-run
19
19
  # mail setup. Setup also asks sessiontools for the agents folder with
20
20
  # `session path agent --config --json`.
21
- # That verb ships in sessiontools 0.3.3, the floor below; with a sessiontools
21
+ # That verb ships in sessiontools 0.3.3, below the floor; with a sessiontools
22
22
  # that lacks it, setup writes no agent file and says so.
23
- # All five are floored at 0.3.3: the family is released together, and an older
24
- # copy of one package beside the others splits its state between the old
25
- # and new folders.
23
+ # All five are floored at 0.4.0 or later: the family is released together, and
24
+ # an older copy of one package beside the others splits its state between the
25
+ # old and new folders.
26
+ # sessionview from 0.4.0 has its helpers as verbs, and the kit links
27
+ # `sessionview` alone. An older sessionview still types
28
+ # `sessionview-messages` into its messages tab, which the kit no longer links.
26
29
  # sessionphone with its media extra: the bot, calls and `sessionphone web` need it.
27
30
  # sessionvoice with its capture extra, so the ears can hear the room.
28
31
  # settled, the Settings app, is required too: a hard dependency, never an
@@ -31,17 +34,17 @@ requires-python = ">=3.11,<3.15"
31
34
  # its kit extra brings the kit's tool registry and jsonschema, without which
32
35
  # it shows none of the kit's tools.
33
36
  # That extra asks for sessiontools 0.3.3, which the sessiontools line below
34
- # now floors.
37
+ # covers.
35
38
  # This is the RULED list, kept in tests/_ruled_deps.py with the ruling;
36
39
  # tests/test_dependency_gate.py fails when these lines, the built wheel or
37
40
  # uv.lock drift from it.
38
41
  dependencies = [
39
42
  "click>=8.1",
40
- "sessionmail>=0.3.3",
41
- "sessiontools>=0.3.3",
42
- "sessionphone[media]>=0.3.3",
43
- "sessionview>=0.3.3",
44
- "sessionvoice[capture]>=0.3.3",
43
+ "sessionmail>=0.4.0",
44
+ "sessiontools>=0.4.0",
45
+ "sessionphone[media]>=0.4.0",
46
+ "sessionview>=0.4.0",
47
+ "sessionvoice[capture]>=0.4.0",
45
48
  "settled[kit]>=0.1.0",
46
49
  ]
47
50
 
@@ -59,8 +62,8 @@ Repository = "https://github.com/sessionkit/sessionkit"
59
62
  # mail 8e4d9476, tools 8d089699, phone ac402a39, view 3942f119, voice ebc1b65c.
60
63
  # settled: from the settings repo's pyproject at 1487963 and its 0.1.0
61
64
  # wheel, sha256 d796d326 (re-measure from the staged 0.1.0 wheel, by sha256).
62
- # sessionview's four commands share one target: `sessionview:main` reads the
63
- # name it was run as and runs that command.
65
+ # sessionview ships one command. Its helpers are verbs of it, `sessionview
66
+ # config`, `sessionview session` and `sessionview messages`, never on the PATH.
64
67
  # The kit itself still ships no `session` of its own: `session` below is
65
68
  # sessiontools' command, re-exported, not a second implementation.
66
69
  [project.scripts]
@@ -73,16 +76,36 @@ memory = "sessionmail.memory:cli"
73
76
  session = "sessiontools.cli:main"
74
77
  # sessionphone
75
78
  sessionphone = "sessionphone.cli:main"
79
+ # sessionphone's dc-* tools: one console-script target, sessionphone.dctools:main,
80
+ # which runs the tool named by argv[0]. uv links only the kit's own scripts, so
81
+ # without these lines a kit install leaves them off PATH.
82
+ # dc-env (a library the tools source), bridge-check and bin/sessionphone never ship.
83
+ dc-answer = "sessionphone.dctools:main"
84
+ dc-call = "sessionphone.dctools:main"
85
+ dc-call-mix = "sessionphone.dctools:main"
86
+ dc-delete = "sessionphone.dctools:main"
87
+ dc-dm = "sessionphone.dctools:main"
88
+ dc-fetch = "sessionphone.dctools:main"
89
+ dc-hangup = "sessionphone.dctools:main"
90
+ dc-invite = "sessionphone.dctools:main"
91
+ dc-live = "sessionphone.dctools:main"
92
+ dc-log = "sessionphone.dctools:main"
93
+ dc-log-web = "sessionphone.dctools:main"
94
+ dc-react = "sessionphone.dctools:main"
95
+ dc-ring = "sessionphone.dctools:main"
96
+ dc-say = "sessionphone.dctools:main"
97
+ dc-send-file = "sessionphone.dctools:main"
98
+ dc-xdc-realtime = "sessionphone.dctools:main"
99
+ dc-xdc-update = "sessionphone.dctools:main"
76
100
  # sessionview
77
101
  sessionview = "sessionview:main"
78
- sessionview-config = "sessionview:main"
79
- sessionview-session = "sessionview:main"
80
- sessionview-messages = "sessionview:main"
81
102
  # sessionvoice
82
103
  ears = "ears.cli:main"
83
104
  ears-serve = "ears.serve:main"
84
105
  mouth = "mouth.__main__:main"
85
106
  talk = "talk.cli:main"
107
+ # the front door asks it for Talk's room: `sessionvoice-web web-room` (docs/family-web.md)
108
+ sessionvoice-web = "talk.web:main"
86
109
  # settled
87
110
  settled = "settled.cli:main"
88
111
 
@@ -86,7 +86,7 @@ def _shape(check):
86
86
  metavar="NAME",
87
87
  callback=_shape(operator_setup.check_mailbox_shape),
88
88
  help="Your mail box: a box `message box path NAME` finds. "
89
- "Default: your OS account name, if sessionmail has a box by that name.",
89
+ "Default: the box sessionmail names as the operator's, if it exists.",
90
90
  )
91
91
  @click.option(
92
92
  "--address",
@@ -142,7 +142,10 @@ def setup(
142
142
 
143
143
  Before that step it adds the wake seat with `ears wake add`: NAME when
144
144
  --agent is given, else the default seat, so saying "hey" and its name
145
- wakes it. Without `ears` on the PATH, or when it refuses, it says one line
145
+ wakes it once the ears' services run. It asks `ears services status`,
146
+ read only: unless the keeper and the mail service both run, the line
147
+ says "hey NAME" works once they do and names `ears services install`.
148
+ Without `ears` on the PATH, or when it refuses, it says one line
146
149
  with the step to run; that line never changes the exit. It never runs
147
150
  `ears services install`. Then it asks `ears backends`, read only. If
148
151
  the ears' voice-activity model is missing, it says one line naming
@@ -37,6 +37,9 @@ from collections.abc import Callable, Mapping
37
37
  from dataclasses import dataclass, field
38
38
  from pathlib import Path
39
39
 
40
+ from sessionkit import phoneowner
41
+ from sessionkit.setup import REPOSITORY
42
+
40
43
  # install.sh --check's exits, passed straight through.
41
44
  EXIT_OK = 0
42
45
  EXIT_MISSING = 1
@@ -97,7 +100,8 @@ HOOKS_ON = "pager settings hooks on"
97
100
  # install.sh's HOOKS_BY_HAND, for a pager with no hooks verb: the file is
98
101
  # sessionmail's, so the doctor names the edit and never makes it.
99
102
  HOOKS_BY_HAND = 'set "hooks": true in {shown}, and change no other key'
100
- HOOKS_SECTION = 'the README\'s Installation, "The mail hooks start off"'
103
+ # INSTALL.md ships in neither the wheel nor the sdist: the hint names the repo.
104
+ HOOKS_SECTION = f'INSTALL.md section 4, "Turn the mail hooks on", in {REPOSITORY}'
101
105
  # How long the pager's help may take. A pager that does not answer in time is
102
106
  # read as one with no verb: the hand edit works with any pager.
103
107
  HELP_TIMEOUT = 10
@@ -170,7 +174,14 @@ def phone_row(env: Mapping[str, str]) -> Row:
170
174
  """The phone bot: optional, so it never fails the run. sessionphone names
171
175
  the bot as its own install would, and asks launchd, read-only. Never
172
176
  `sessionphone bot status`: that sends a clip to the job's speech URL,
173
- which can be any host."""
177
+ which can be any host. Under it, the owner's key pin, read from
178
+ sessionphone's callers readers (phoneowner): info, never missing."""
179
+ row = _bot_row(env)
180
+ row.under += phoneowner.doctor_lines(env)
181
+ return row
182
+
183
+
184
+ def _bot_row(env: Mapping[str, str]) -> Row:
174
185
  what = "📞 Phone bot (optional, for calls)"
175
186
  # The call ear is not checked: sessionphone has no read-only check for it
176
187
  # yet. A row for it waits for the release that adds one.