samograph 0.6.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.
- package/LICENSE +176 -0
- package/README.md +228 -0
- package/dictionaries/postgresfm.txt +100 -0
- package/dist/cli.js +3376 -0
- package/package.json +49 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
Apache License
|
|
2
|
+
Version 2.0, January 2004
|
|
3
|
+
http://www.apache.org/licenses/
|
|
4
|
+
|
|
5
|
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
6
|
+
|
|
7
|
+
1. Definitions.
|
|
8
|
+
|
|
9
|
+
"License" shall mean the terms and conditions for use, reproduction,
|
|
10
|
+
and distribution as defined by Sections 1 through 9 of this document.
|
|
11
|
+
|
|
12
|
+
"Licensor" shall mean the copyright owner or entity authorized by
|
|
13
|
+
the copyright owner that is granting the License.
|
|
14
|
+
|
|
15
|
+
"Legal Entity" shall mean the union of the acting entity and all
|
|
16
|
+
other entities that control, are controlled by, or are under common
|
|
17
|
+
control with that entity. For the purposes of this definition,
|
|
18
|
+
"control" means (i) the power, direct or indirect, to cause the
|
|
19
|
+
direction or management of such entity, whether by contract or
|
|
20
|
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
21
|
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
22
|
+
|
|
23
|
+
"You" (or "Your") shall mean an individual or Legal Entity
|
|
24
|
+
exercising permissions granted by this License.
|
|
25
|
+
|
|
26
|
+
"Source" form shall mean the preferred form for making modifications,
|
|
27
|
+
including but not limited to software source code, documentation
|
|
28
|
+
source, and configuration files.
|
|
29
|
+
|
|
30
|
+
"Object" form shall mean any form resulting from mechanical
|
|
31
|
+
transformation or translation of a Source form, including but
|
|
32
|
+
not limited to compiled object code, generated documentation,
|
|
33
|
+
and conversions to other media types.
|
|
34
|
+
|
|
35
|
+
"Work" shall mean the work of authorship, whether in Source or
|
|
36
|
+
Object form, made available under the License, as indicated by a
|
|
37
|
+
copyright notice that is included in or attached to the work
|
|
38
|
+
(an example is provided in the Appendix below).
|
|
39
|
+
|
|
40
|
+
"Derivative Works" shall mean any work, whether in Source or Object
|
|
41
|
+
form, that is based on (or derived from) the Work and for which the
|
|
42
|
+
editorial revisions, annotations, elaborations, or other modifications
|
|
43
|
+
represent, as a whole, an original work of authorship. For the purposes
|
|
44
|
+
of this License, Derivative Works shall not include works that remain
|
|
45
|
+
separable from, or merely link (or bind by name) to the interfaces of,
|
|
46
|
+
the Work and Derivative Works thereof.
|
|
47
|
+
|
|
48
|
+
"Contribution" shall mean any work of authorship, including
|
|
49
|
+
the original version of the Work and any modifications or additions
|
|
50
|
+
to that Work or Derivative Works thereof, that is intentionally
|
|
51
|
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
52
|
+
or by an individual or Legal Entity authorized to submit on behalf of
|
|
53
|
+
the copyright owner. For the purposes of this definition, "submitted"
|
|
54
|
+
means any form of electronic, verbal, or written communication sent
|
|
55
|
+
to the Licensor or its representatives, including but not limited to
|
|
56
|
+
communication on electronic mailing lists, source code control systems,
|
|
57
|
+
and issue tracking systems that are managed by, or on behalf of, the
|
|
58
|
+
Licensor for the purpose of discussing and improving the Work, but
|
|
59
|
+
excluding communication that is conspicuously marked or otherwise
|
|
60
|
+
designated in writing by the copyright owner as "Not a Contribution."
|
|
61
|
+
|
|
62
|
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
63
|
+
on behalf of whom a Contribution has been received by Licensor and
|
|
64
|
+
subsequently incorporated within the Work.
|
|
65
|
+
|
|
66
|
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
67
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
68
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
69
|
+
copyright license to reproduce, prepare Derivative Works of,
|
|
70
|
+
publicly display, publicly perform, sublicense, and distribute the
|
|
71
|
+
Work and such Derivative Works in Source or Object form.
|
|
72
|
+
|
|
73
|
+
3. Grant of Patent License. Subject to the terms and conditions of
|
|
74
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
75
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
76
|
+
(except as stated in this section) patent license to make, have made,
|
|
77
|
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
78
|
+
where such license applies only to those patent claims licensable
|
|
79
|
+
by such Contributor that are necessarily infringed by their
|
|
80
|
+
Contribution(s) alone or by combination of their Contribution(s)
|
|
81
|
+
with the Work to which such Contribution(s) was submitted. If You
|
|
82
|
+
institute patent litigation against any entity (including a
|
|
83
|
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
84
|
+
or a Contribution incorporated within the Work constitutes direct
|
|
85
|
+
or contributory patent infringement, then any patent licenses
|
|
86
|
+
granted to You under this License for that Work shall terminate
|
|
87
|
+
as of the date such litigation is filed.
|
|
88
|
+
|
|
89
|
+
4. Redistribution. You may reproduce and distribute copies of the
|
|
90
|
+
Work or Derivative Works thereof in any medium, with or without
|
|
91
|
+
modifications, and in Source or Object form, provided that You
|
|
92
|
+
meet the following conditions:
|
|
93
|
+
|
|
94
|
+
(a) You must give any other recipients of the Work or
|
|
95
|
+
Derivative Works a copy of this License; and
|
|
96
|
+
|
|
97
|
+
(b) You must cause any modified files to carry prominent notices
|
|
98
|
+
stating that You changed the files; and
|
|
99
|
+
|
|
100
|
+
(c) You must retain, in the Source form of any Derivative Works
|
|
101
|
+
that You distribute, all copyright, patent, trademark, and
|
|
102
|
+
attribution notices from the Source form of the Work,
|
|
103
|
+
excluding those notices that do not pertain to any part of
|
|
104
|
+
the Derivative Works; and
|
|
105
|
+
|
|
106
|
+
(d) If the Work includes a "NOTICE" text file as part of its
|
|
107
|
+
distribution, then any Derivative Works that You distribute must
|
|
108
|
+
include a readable copy of the attribution notices contained
|
|
109
|
+
within such NOTICE file, excluding those notices that do not
|
|
110
|
+
pertain to any part of the Derivative Works, in at least one
|
|
111
|
+
of the following places: within a NOTICE text file distributed
|
|
112
|
+
as part of the Derivative Works; within the Source form or
|
|
113
|
+
documentation, if provided along with the Derivative Works; or,
|
|
114
|
+
within a display generated by the Derivative Works, if and
|
|
115
|
+
wherever such third-party notices normally appear. The contents
|
|
116
|
+
of the NOTICE file are for informational purposes only and
|
|
117
|
+
do not modify the License. You may add Your own attribution
|
|
118
|
+
notices within Derivative Works that You distribute, alongside
|
|
119
|
+
or as an addendum to the NOTICE text from the Work, provided
|
|
120
|
+
that such additional attribution notices cannot be construed
|
|
121
|
+
as modifying the License.
|
|
122
|
+
|
|
123
|
+
You may add Your own copyright statement to Your modifications and
|
|
124
|
+
may provide additional or different license terms and conditions
|
|
125
|
+
for use, reproduction, or distribution of Your modifications, or
|
|
126
|
+
for any such Derivative Works as a whole, provided Your use,
|
|
127
|
+
reproduction, and distribution of the Work otherwise complies with
|
|
128
|
+
the conditions stated in this License.
|
|
129
|
+
|
|
130
|
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
131
|
+
any Contribution intentionally submitted for inclusion in the Work
|
|
132
|
+
by You to the Licensor shall be under the terms and conditions of
|
|
133
|
+
this License, without any additional terms or conditions.
|
|
134
|
+
Notwithstanding the above, nothing herein shall supersede or modify
|
|
135
|
+
the terms of any separate license agreement you may have executed
|
|
136
|
+
with Licensor regarding such Contributions.
|
|
137
|
+
|
|
138
|
+
6. Trademarks. This License does not grant permission to use the trade
|
|
139
|
+
names, trademarks, service marks, or product names of the Licensor,
|
|
140
|
+
except as required for reasonable and customary use in describing the
|
|
141
|
+
origin of the Work and reproducing the content of the NOTICE file.
|
|
142
|
+
|
|
143
|
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
144
|
+
agreed to in writing, Licensor provides the Work (and each
|
|
145
|
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
146
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
147
|
+
implied, including, without limitation, any warranties or conditions
|
|
148
|
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
149
|
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
150
|
+
appropriateness of using or redistributing the Work and assume any
|
|
151
|
+
risks associated with Your exercise of permissions under this License.
|
|
152
|
+
|
|
153
|
+
8. Limitation of Liability. In no event and under no legal theory,
|
|
154
|
+
whether in tort (including negligence), contract, or otherwise,
|
|
155
|
+
unless required by applicable law (such as deliberate and grossly
|
|
156
|
+
negligent acts) or agreed to in writing, shall any Contributor be
|
|
157
|
+
liable to You for damages, including any direct, indirect, special,
|
|
158
|
+
incidental, or consequential damages of any character arising as a
|
|
159
|
+
result of this License or out of the use or inability to use the
|
|
160
|
+
Work (including but not limited to damages for loss of goodwill,
|
|
161
|
+
work stoppage, computer failure or malfunction, or any and all
|
|
162
|
+
other commercial damages or losses), even if such Contributor
|
|
163
|
+
has been advised of the possibility of such damages.
|
|
164
|
+
|
|
165
|
+
9. Accepting Warranty or Additional Liability. While redistributing
|
|
166
|
+
the Work or Derivative Works thereof, You may choose to offer,
|
|
167
|
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
168
|
+
or other liability obligations and/or rights consistent with this
|
|
169
|
+
License. However, in accepting such obligations, You may act only
|
|
170
|
+
on Your own behalf and on Your sole responsibility, not on behalf
|
|
171
|
+
of any other Contributor, and only if You agree to indemnify,
|
|
172
|
+
defend, and hold each Contributor harmless for any liability
|
|
173
|
+
incurred by, or claims asserted against, such Contributor by reason
|
|
174
|
+
of your accepting any such warranty or additional liability.
|
|
175
|
+
|
|
176
|
+
END OF TERMS AND CONDITIONS
|
package/README.md
ADDED
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
# samograph
|
|
2
|
+
|
|
3
|
+
> Build agents that show up to the meeting, not just the codebase.
|
|
4
|
+
|
|
5
|
+
samograph lets your AI agent (Claude Code, Codex, and others) join Zoom and Google Meet calls as an active participant — listening, responding, and taking action in real time.
|
|
6
|
+
|
|
7
|
+
Give this CLI, a meeting URL, and the needed tokens to your AI agent. samograph handles the meeting plumbing through Recall.ai: joining calls, streaming the live transcript, sending explicit chat messages, and inspecting the current call view on demand.
|
|
8
|
+
|
|
9
|
+
## Setup
|
|
10
|
+
|
|
11
|
+
Requirements:
|
|
12
|
+
|
|
13
|
+
- Bun.
|
|
14
|
+
- `RECALL_API_KEY`.
|
|
15
|
+
- `ngrok` installed and authenticated (free plan is enough for transcription; the presence camera needs an interstitial-free tunnel — see Dynamic Bot Presence). `join` starts and manages ngrok automatically — you don't run it yourself. ngrok is optional when using `--webhook-base` with an external tunnel (localtunnel, cloudflared, etc.).
|
|
16
|
+
|
|
17
|
+
Install the CLI from npm:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npm install -g samograph
|
|
21
|
+
export RECALL_API_KEY=...
|
|
22
|
+
samograph join "https://meet.google.com/..." --name Leo
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
During development use `bun install`, `bun run build`, then `bun run samograph ...`.
|
|
26
|
+
|
|
27
|
+
## What It Provides
|
|
28
|
+
|
|
29
|
+
samograph gives an AI agent a small set of meeting tools:
|
|
30
|
+
|
|
31
|
+
- `join` - bring a Recall.ai bot into a Zoom or Google Meet call.
|
|
32
|
+
- `watch` - stream live transcript lines to the agent.
|
|
33
|
+
- `notes` - maintain a structured Google Doc agenda with important points, decisions, and action items.
|
|
34
|
+
- `chat` - send a deliberate message into the meeting chat.
|
|
35
|
+
- `presence` - update the bot camera state shown in the meeting.
|
|
36
|
+
- `frame` - export the current call view on demand.
|
|
37
|
+
- `leave` - remove the bot and clean up local state.
|
|
38
|
+
- `status` - show the current Recall bot state.
|
|
39
|
+
- `transcript` - print the transcript (local file, or post-call from Recall).
|
|
40
|
+
- `screenshot` - capture the local Mac screen (fallback when no call frame is available).
|
|
41
|
+
- `dicts` - list available Deepgram keyword dictionaries.
|
|
42
|
+
- `doctor` - check local prerequisites before joining a call.
|
|
43
|
+
|
|
44
|
+
The agent still decides what to say, when to inspect a frame, and how to use the meeting context. samograph is the local adapter that exposes those call capabilities.
|
|
45
|
+
|
|
46
|
+
```text
|
|
47
|
+
AI agent
|
|
48
|
+
| runs CLI tools
|
|
49
|
+
v
|
|
50
|
+
samograph on your machine
|
|
51
|
+
| starts bot + local callback server + ngrok tunnel (or external tunnel via --webhook-base)
|
|
52
|
+
v
|
|
53
|
+
Recall.ai bot in Zoom/Meet
|
|
54
|
+
| transcript, chat, WebSocket video events
|
|
55
|
+
v
|
|
56
|
+
samograph watch/notes/chat/frame
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Integration
|
|
60
|
+
|
|
61
|
+
`join` starts a local callback server and exposes it with `ngrok http` so Recall.ai can deliver HTTPS/WSS events back to your machine. The free ngrok HTTP plan is enough for webhooks and transcription, but its browser interstitial blocks the presence camera page — `join` then warns and joins without the camera (see Dynamic Bot Presence). Alternatively, pass `--webhook-base <URL>` to use an existing external tunnel (localtunnel, cloudflared, etc.) and skip spawning ngrok entirely; localtunnel has the same interstitial limitation.
|
|
62
|
+
|
|
63
|
+
ngrok TCP is only needed for the optional RTMP path (`--rtmp`) and requires a credit/debit card on file at ngrok.com (free plan — the card is not charged). The standard WebSocket frame path does not need TCP or card verification.
|
|
64
|
+
|
|
65
|
+
Webhook, frame, and presence routes are token-protected, and default runtime files stay under `~/.samograph/`.
|
|
66
|
+
|
|
67
|
+
## Agent Workflow
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
samograph join "https://meet.google.com/..." --name Leo --dict postgresfm
|
|
71
|
+
samograph watch
|
|
72
|
+
samograph notes init --doc-id 1abc... --credentials ~/.samograph/google.json --title "Customer migration call"
|
|
73
|
+
samograph notes point "Migration risk is the blocker" --speaker Alice
|
|
74
|
+
samograph notes decision "Use logical replication for phase 1"
|
|
75
|
+
samograph notes action "Open migration checklist issue" --owner Nik --due 2026-06-07
|
|
76
|
+
samograph presence thinking "Checking the shared screen"
|
|
77
|
+
samograph frame
|
|
78
|
+
samograph chat "I can see the screen now."
|
|
79
|
+
samograph leave
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Run `watch` immediately after `join` and keep it running for the whole call. It prints one utterance per line:
|
|
83
|
+
|
|
84
|
+
```text
|
|
85
|
+
[2026-05-30 15:42:10] Speaker Name: words spoken in the meeting
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
`watch` exits automatically when `leave` is run. If there is no active session, it prints `No active session.` to stderr and exits.
|
|
89
|
+
|
|
90
|
+
Use `chat` only when you intentionally want to write into the meeting chat. Otherwise respond in your agent session.
|
|
91
|
+
|
|
92
|
+
## Dynamic Bot Presence
|
|
93
|
+
|
|
94
|
+
`join` gives the Recall bot a token-protected local camera page through the same public tunnel used for webhooks. The page URL carries a read-only token (valid only for viewing the page; `/presence.json` requires the same token in the `X-Samograph-Presence-Token` header, which the page sends when polling); presence updates require a separate write token that `join` keeps in local state and `samograph presence` sends in a header. The page starts as `listening` and refreshes itself from the local callback server every second. Pick the background mode with `join --presence-bg <sphere|field|static|cycle>` (`sphere` is the default; `static` is the cheapest to render; `cycle` alternates between field and sphere; unknown values fall back to `sphere`). The mode is fixed at join time.
|
|
95
|
+
|
|
96
|
+
The presence camera requires the tunnel to serve the page cleanly to a browser. Free-ngrok and localtunnel show an interstitial page to browser user agents, which blocks the camera: `join` detects this in a preflight check, prints a warning, and joins **without** the presence camera — transcription, chat, and frames are unaffected, but `samograph presence` is unavailable for that call. Use a paid/clean tunnel (e.g. a paid ngrok plan or cloudflared) for the presence camera, or pass `join --no-presence` to skip the camera and the preflight entirely.
|
|
97
|
+
|
|
98
|
+
Update it from the agent loop:
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
samograph presence listening
|
|
102
|
+
samograph presence thinking "Checking logs"
|
|
103
|
+
samograph presence speaking "Answering in chat"
|
|
104
|
+
samograph presence acting "Opening PR review"
|
|
105
|
+
samograph presence idle
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Presence is in-memory runtime state. It is meant for lightweight meeting signaling, not persistence.
|
|
109
|
+
|
|
110
|
+
## Google Doc Notes
|
|
111
|
+
|
|
112
|
+
`notes` follows GitLab-style live doc meetings: the doc is an agenda and collaboration surface, not a transcript dump. The agent watches the transcript, decides what matters, then writes concise points into the right section.
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
export GOOGLE_DOC_ID=1abc...
|
|
116
|
+
export GOOGLE_APPLICATION_CREDENTIALS=~/.samograph/google-service-account.json
|
|
117
|
+
samograph notes init --title "Customer migration call"
|
|
118
|
+
samograph notes point "Customer is blocked on cutover risk" --speaker Alice
|
|
119
|
+
samograph notes decision "Run a shadow replay before scheduling cutover"
|
|
120
|
+
samograph notes action "Create replay checklist issue" --owner Nik --due 2026-06-07
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
The credentials file must be a Google service-account JSON key, and the target doc must be shared with that service account's `client_email` as an editor.
|
|
124
|
+
|
|
125
|
+
If you really want raw transcript mirroring, make that explicit:
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
samograph notes transcript --from-start
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Frames
|
|
132
|
+
|
|
133
|
+
Frame capture is on by default. Recall sends separate PNG frames over WebSocket; samograph keeps the latest frames in memory, indexed by source, and only writes to disk when you call `frame`.
|
|
134
|
+
|
|
135
|
+
`frame` fails with `FRAME_UNAVAILABLE` if no frame has arrived yet — call it after the bot has been in the meeting for a few seconds.
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
samograph frames
|
|
139
|
+
samograph frame
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
By default it writes outside the repo:
|
|
143
|
+
|
|
144
|
+
```text
|
|
145
|
+
~/.samograph/frames/latest.png
|
|
146
|
+
~/.samograph/frames/latest.json
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Use `--out` for an explicit path, or `--archive` to create a timestamped copy alongside the latest:
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
samograph frame --source screen --out /tmp/screen.png
|
|
153
|
+
samograph frame --source participant:100
|
|
154
|
+
samograph frame --out /tmp/call.png
|
|
155
|
+
samograph frame --archive
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
`frames` lists buffered source keys such as `type:screen_share` or `participant:100`. `frame --source` accepts those keys, plus aliases like `screen`, `screen_share`, and `webcam`.
|
|
159
|
+
|
|
160
|
+
Archive filenames include call id, UTC timestamp, source type, and participant id. Source type and participant id come from the Recall event metadata and may be `unknown` if Recall does not provide them.
|
|
161
|
+
|
|
162
|
+
## Important Flags
|
|
163
|
+
|
|
164
|
+
- `join --no-ws-video` - disable the default WebSocket frame path (e.g. when using RTMP instead).
|
|
165
|
+
- `join --webhook-base URL` - use an existing public tunnel (localtunnel, cloudflared quick tunnel, etc.) pointing at `--port` instead of starting ngrok. Useful when ngrok is unavailable or its free-tier bandwidth cap is hit (`ERR_NGROK_727`): run `npx localtunnel --port 8080`, then pass the printed `https://*.loca.lt` URL here.
|
|
166
|
+
- `join --variant web_4_core` - ask Recall to run the output-media webpage on a larger bot instance. Use this when the camera webpage reports low render FPS or looks choppy. `web` is the default Recall instance; `web_gpu` is available for WebGL-heavy pages.
|
|
167
|
+
- `join --no-presence` - join without the presence camera page and skip the camera preflight (e.g. when the tunnel serves an interstitial).
|
|
168
|
+
- `join --presence-bg MODE` - presence camera background: `sphere` (default), `field`, `static` (cheapest), or `cycle` (alternates field/sphere); fixed at join time.
|
|
169
|
+
- `join --frame-dir DIR` - where on-demand frame files are written.
|
|
170
|
+
- `join --dict postgresfm` - Deepgram keyterm hints from `dictionaries/postgresfm.txt`.
|
|
171
|
+
- `join --transcript-dir DIR` - timestamped transcript file location, default `~/.samograph/`.
|
|
172
|
+
- `join --rtmp` - mixed-video RTMP path using ngrok TCP; requires ngrok card verification.
|
|
173
|
+
- `join --rtmp-url rtmp://host:1935/live/call` - explicit mixed-video RTMP receiver.
|
|
174
|
+
- `notes --doc-id ID` - Google Doc ID or URL for live meeting notes; defaults to `GOOGLE_DOC_ID`.
|
|
175
|
+
- `notes --credentials FILE` - Google service-account JSON; defaults to `GOOGLE_APPLICATION_CREDENTIALS`.
|
|
176
|
+
- `notes --section NAME` - section for `notes point`, such as `important`, `agenda`, `decisions`, or `actions`.
|
|
177
|
+
- `notes --speaker NAME` - speaker prefix for `notes point`.
|
|
178
|
+
- `notes --owner NAME` and `--due DATE` - action-item metadata.
|
|
179
|
+
- `notes --from-start` - with `notes transcript`, replay existing transcript lines before tailing live lines.
|
|
180
|
+
- `frame --source SOURCE` - select `latest`, `screen`, `webcam`, `type:<type>`, or `participant:<id>`.
|
|
181
|
+
|
|
182
|
+
## Commands
|
|
183
|
+
|
|
184
|
+
- `join <meeting-url>` - start local server, ngrok tunnel, and Recall bot.
|
|
185
|
+
- `watch` - stream live transcript until `leave` writes the end sentinel; exits immediately if no session is active.
|
|
186
|
+
- `notes init` - add a live meeting doc template.
|
|
187
|
+
- `notes point <text>` - add an important point under a section.
|
|
188
|
+
- `notes decision <text>` - add a decision.
|
|
189
|
+
- `notes action <text>` - add an action item.
|
|
190
|
+
- `notes transcript [--from-start]` - explicitly mirror raw transcript lines.
|
|
191
|
+
- `chat <message>` - send meeting chat.
|
|
192
|
+
- `presence <listening|thinking|speaking|acting|idle> [message]` - update the bot camera state; explicit messages are shown as live Comments activity on the camera page, bare state toggles only switch the state with its default message, and transcript webhooks add recent "heard" lines automatically without changing the agent-set state.
|
|
193
|
+
- `frames` - list buffered WebSocket frame sources and metadata.
|
|
194
|
+
- `frame [--source SOURCE] [--out FILE] [--archive]` - write an in-memory frame to disk on demand.
|
|
195
|
+
- `status` - show bot id, name, Recall status code, transcript line count, transcript file path, and frame source metadata.
|
|
196
|
+
- `transcript` - print the Recall post-call transcript if available, otherwise print the local transcript file.
|
|
197
|
+
- `screenshot [--out FILE]` - capture the local Mac screen with `screencapture`; use as a fallback when frame is not available.
|
|
198
|
+
- `leave` - remove bot, stop local processes, and clean state.
|
|
199
|
+
- `dicts` - list keyword dictionaries.
|
|
200
|
+
|
|
201
|
+
## Storage
|
|
202
|
+
|
|
203
|
+
Runtime files live under `~/.samograph/` by default:
|
|
204
|
+
|
|
205
|
+
- `state.json` - active bot id, process ids, URLs, paths.
|
|
206
|
+
- `YYYYMMDD_HHMMSS_transcript.txt` - per-call live transcript; `join` never overwrites older transcripts.
|
|
207
|
+
- `frames/latest.png` and `frames/latest.json` - written only by `samograph frame`.
|
|
208
|
+
|
|
209
|
+
Generated runtime files are ignored by git. Do not point `--frame-dir` or `--out` into the repo unless you intentionally want a local artifact.
|
|
210
|
+
|
|
211
|
+
## Environment Variables
|
|
212
|
+
|
|
213
|
+
`join` sets these automatically when it spawns the callback server (`_serve`); set them yourself only when running `samograph _serve` manually behind your own tunnel:
|
|
214
|
+
|
|
215
|
+
- `SAMOGRAPH_WEBHOOK_TOKEN` - token required by `POST /webhook` (`?token=` query parameter).
|
|
216
|
+
- `SAMOGRAPH_FRAME_TOKEN` - token required by the frame routes and `/video-ws`.
|
|
217
|
+
- `SAMOGRAPH_PRESENCE_TOKEN` - read token for the presence page and `/presence.json`.
|
|
218
|
+
- `SAMOGRAPH_PRESENCE_WRITE_TOKEN` - write token required by `POST /presence`.
|
|
219
|
+
|
|
220
|
+
Path overrides, mainly for tests and packaging:
|
|
221
|
+
|
|
222
|
+
- `SAMOGRAPH_HOME` - base directory for runtime files (default: your home directory; files live in `<base>/.samograph/`).
|
|
223
|
+
- `SAMOGRAPH_STATE_FILE` - path of `state.json` (default: `~/.samograph/state.json`).
|
|
224
|
+
- `SAMOGRAPH_DICT_DIR` - directory containing keyword dictionaries (default: `dictionaries/` in the package).
|
|
225
|
+
|
|
226
|
+
## License
|
|
227
|
+
|
|
228
|
+
Apache License 2.0. See [LICENSE](LICENSE).
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
Nikolay Samokhvalov
|
|
2
|
+
Michael Christofides
|
|
3
|
+
Oleg Bartunov
|
|
4
|
+
Heikki Linnakangas
|
|
5
|
+
Andres Freund
|
|
6
|
+
Peter Geoghegan
|
|
7
|
+
Melanie Plageman
|
|
8
|
+
Alexander Korotkov
|
|
9
|
+
Alicja Kucharczyk
|
|
10
|
+
Álvaro Hernández
|
|
11
|
+
Lætitia Avrot
|
|
12
|
+
Markus Winand
|
|
13
|
+
Tomas Vondra
|
|
14
|
+
Masahiko Sawada
|
|
15
|
+
Tom Lane
|
|
16
|
+
Robert Haas
|
|
17
|
+
Peter Eisentraut
|
|
18
|
+
Bruce Momjian
|
|
19
|
+
Lukas Fittl
|
|
20
|
+
Jonathan Katz
|
|
21
|
+
Andrew Atkinson
|
|
22
|
+
Chelsea Dole
|
|
23
|
+
Haki Benita
|
|
24
|
+
Laurenz Albe
|
|
25
|
+
Claire Giordano
|
|
26
|
+
Andreas Scherbaum
|
|
27
|
+
Brendan Gregg
|
|
28
|
+
Erwin Brandstetter
|
|
29
|
+
Andrey Borodin
|
|
30
|
+
Alexander Kukushkin
|
|
31
|
+
Franck Pachot
|
|
32
|
+
Andrei Lepikhov
|
|
33
|
+
Gülçin Yıldırım Jelínek
|
|
34
|
+
Ryan Lambert
|
|
35
|
+
Joe Nelson
|
|
36
|
+
Ian Barwick
|
|
37
|
+
Kirk Wolak
|
|
38
|
+
Regina Obe
|
|
39
|
+
Paul Ramsey
|
|
40
|
+
pgvector
|
|
41
|
+
pgvectorscale
|
|
42
|
+
pgBackRest
|
|
43
|
+
Patroni
|
|
44
|
+
PgBouncer
|
|
45
|
+
PostGIS
|
|
46
|
+
TimescaleDB
|
|
47
|
+
Citus
|
|
48
|
+
OrioleDB
|
|
49
|
+
WAL-G
|
|
50
|
+
CloudNativePG
|
|
51
|
+
Spilo
|
|
52
|
+
repmgr
|
|
53
|
+
pg_auto_failover
|
|
54
|
+
pganalyze
|
|
55
|
+
pgBadger
|
|
56
|
+
pg_stat_statements
|
|
57
|
+
pg_stat_kcache
|
|
58
|
+
pg_wait_sampling
|
|
59
|
+
pg_buffercache
|
|
60
|
+
pg_qualstats
|
|
61
|
+
pg_repack
|
|
62
|
+
pg_partman
|
|
63
|
+
pg_cron
|
|
64
|
+
pg_duckdb
|
|
65
|
+
pg_ivm
|
|
66
|
+
pg_upgrade
|
|
67
|
+
pg_basebackup
|
|
68
|
+
pg_amcheck
|
|
69
|
+
pg_hint_plan
|
|
70
|
+
pg_squeeze
|
|
71
|
+
pg_stat_io
|
|
72
|
+
pg_stat_wal
|
|
73
|
+
pg_stat_monitor
|
|
74
|
+
pg_profile
|
|
75
|
+
pg_ash
|
|
76
|
+
pg_tle
|
|
77
|
+
pgmq
|
|
78
|
+
pgreplay
|
|
79
|
+
pgcopydb
|
|
80
|
+
Neon
|
|
81
|
+
Supabase
|
|
82
|
+
Crunchy Data
|
|
83
|
+
EnterpriseDB
|
|
84
|
+
Tembo
|
|
85
|
+
Xata
|
|
86
|
+
PeerDB
|
|
87
|
+
PlanetScale
|
|
88
|
+
YugabyteDB
|
|
89
|
+
AlloyDB
|
|
90
|
+
ClickHouse
|
|
91
|
+
DuckDB
|
|
92
|
+
FerretDB
|
|
93
|
+
MVCC
|
|
94
|
+
TOAST
|
|
95
|
+
PITR
|
|
96
|
+
autovacuum
|
|
97
|
+
WAL-E
|
|
98
|
+
HyperLogLog
|
|
99
|
+
HNSW
|
|
100
|
+
ivfflat
|