@hraness/peopleblade 0.1.1 → 0.2.1
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 +60 -7
- package/THIRD_PARTY_NOTICES.md +2 -2
- package/dist/cli.ts +31 -0
- package/dist/cloud-sync-client.js +1836 -0
- package/dist/migrations/016_source_binding_metadata_incarnations.sql +205 -0
- package/dist/migrations/017_person_note_content_revisions.sql +151 -0
- package/dist/peopleblade.js +2704 -690
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -10,10 +10,12 @@ and sync are optional.
|
|
|
10
10
|
- macOS or Linux for the currently tested local workflows
|
|
11
11
|
- Provider-specific setup only for live sources you choose to import
|
|
12
12
|
|
|
13
|
+
Installation includes the pinned runtime dependencies Zod 4.4.3 and Effect 3.22.1.
|
|
14
|
+
|
|
13
15
|
## Install
|
|
14
16
|
|
|
15
17
|
```bash
|
|
16
|
-
bun add --global @hraness/peopleblade@0.
|
|
18
|
+
bun add --global @hraness/peopleblade@0.2.1
|
|
17
19
|
peopleblade --version
|
|
18
20
|
peopleblade init
|
|
19
21
|
peopleblade stats --json
|
|
@@ -41,12 +43,12 @@ The package does not install Wrench, browser automation, KB, native model runtim
|
|
|
41
43
|
or provider credentials. Beeper, Google, and WhatsApp live sync commands delegate
|
|
42
44
|
through a separately reviewed `wrench` executable on `PATH` (or the absolute
|
|
43
45
|
`PEOPLEBLADE_WRENCH_EXECUTABLE` path). PeopleBlade bundles only the pinned Wrench
|
|
44
|
-
0.16.
|
|
46
|
+
0.16.8 client validators needed to fence requests and receipts; it does not bundle
|
|
45
47
|
or silently download Wrench's execution runtime.
|
|
46
48
|
|
|
47
|
-
PeopleBlade 0.
|
|
49
|
+
PeopleBlade 0.2.1 contains the reviewed Wrench-backed Beeper, Google, and WhatsApp
|
|
48
50
|
live sync commands. Running them requires the separately installed public
|
|
49
|
-
`@hraness/wrench` 0.16.
|
|
51
|
+
`@hraness/wrench` 0.16.8 package. Beeper support is bounded to account-aware
|
|
50
52
|
`contacts.list@3` reads, `contacts.search@1`, `messaging.search@2`, and the separate
|
|
51
53
|
body-free interaction exporter. `contacts.search@1` executes the official Beeper
|
|
52
54
|
CLI 0.6.2 executable pinned by Wrench; `contacts.list@3` and `messaging.search@2`
|
|
@@ -54,21 +56,72 @@ use Wrench's bounded Desktop-loopback read paths. The exporter is macOS arm64 on
|
|
|
54
56
|
and reports lower-bound interaction counts from complete one-to-one conversations
|
|
55
57
|
only. See
|
|
56
58
|
[peopleblade.com/sources](https://peopleblade.com/sources) for the complete provider
|
|
57
|
-
guide. PeopleBlade
|
|
59
|
+
guide. A database previously synced by PeopleBlade 0.1.1 through Wrench 0.16.7
|
|
60
|
+
must run `peopleblade beeper rebind --auth beeper-main --confirm --json` once after
|
|
61
|
+
installing Wrench 0.16.8. The command appends reviewed metadata for the same source
|
|
62
|
+
identity only after both complete account inventories match. Do not force-bind
|
|
63
|
+
Wrench unless its authenticated Desktop target changed. PeopleBlade calls no
|
|
58
64
|
Beeper interface directly and exposes none of Wrench's Beeper send or action
|
|
59
65
|
operations. Archive imports, Apple Contacts, iMessage, notes, identity review,
|
|
60
66
|
backups, and optional PeopleBlade cloud commands do not require Wrench.
|
|
61
67
|
|
|
68
|
+
## Browse and edit locally
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
peopleblade capabilities --json
|
|
72
|
+
peopleblade query --search "Ada" --sort name --direction asc --json
|
|
73
|
+
peopleblade people show 12 --json
|
|
74
|
+
peopleblade ui
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
`capabilities` is offline discovery, not proof that a provider is configured.
|
|
78
|
+
`query` supports source, email, phone and do-not-contact filters, up to 100 rows
|
|
79
|
+
per page, source facets, and `nextOffset` continuation. Pages are a live view;
|
|
80
|
+
imports and identity reviews can move rows between requests. `list` retains its
|
|
81
|
+
legacy shape for existing clients.
|
|
82
|
+
|
|
83
|
+
`ui` starts a local workspace on a random `127.0.0.1` port. Open the printed URL
|
|
84
|
+
and select its owner-only access file. The capability stays in tab memory; the
|
|
85
|
+
page loads no remote assets and performs no provider or cloud calls. Ctrl+C
|
|
86
|
+
stops the workspace and invalidates access. A process running as your OS user
|
|
87
|
+
can access your local files; this is not a sandbox against that process.
|
|
88
|
+
|
|
89
|
+
The workspace supports contact details, note search, Markdown creation/editing,
|
|
90
|
+
safe preview, history and draft recovery. Note edits append immutable user
|
|
91
|
+
revisions; original source content and attribution remain intact. No raw HTML
|
|
92
|
+
or remote images are rendered. Notes never enter cloud sync or agent packets.
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
peopleblade notes show 42 --json
|
|
96
|
+
peopleblade notes update 42 --expected-revision 0 \
|
|
97
|
+
--expected-context CONTEXT_SHA256 --request-id REQUEST_UUID \
|
|
98
|
+
--body-file /private/path/note.md --json
|
|
99
|
+
peopleblade notes history 42 --json
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Read the revision and context digest from `notes show`. Use a fresh UUID for a
|
|
103
|
+
new edit; retry an uncertain edit with the same UUID and exact input. Stale
|
|
104
|
+
content or identity context fails without overwriting a newer edit. `--body-file -`
|
|
105
|
+
reads bounded UTF-8 stdin. `--title` changes the title, `--clear-title` clears it,
|
|
106
|
+
and omission retains the title from the expected revision.
|
|
107
|
+
|
|
108
|
+
The versioned `research prepare` envelope can be filled and passed directly to
|
|
109
|
+
`research apply`. Keep its subject and instructions unchanged; fill only `result`.
|
|
110
|
+
The envelope binds this database and its current identity evidence. The strict
|
|
111
|
+
legacy three-field input remains supported. JSON-mode errors are one structured
|
|
112
|
+
`peopleblade.error.v1` object on stderr; successful results stay on stdout.
|
|
113
|
+
|
|
62
114
|
## Privacy boundary
|
|
63
115
|
|
|
64
116
|
PeopleBlade's provider import paths never retain, search, enrich from, or upload
|
|
65
117
|
message text. The optional cloud projection excludes source records, raw archives,
|
|
66
|
-
local paths, provider credentials, and message bodies. Ambiguous identity links
|
|
118
|
+
local paths, provider credentials, note bodies and revisions, and message bodies. Ambiguous identity links
|
|
67
119
|
remain reviewable instead of being silently merged.
|
|
68
120
|
|
|
69
121
|
This npm artifact contains only the bundled local CLI, its pinned Wrench client
|
|
70
122
|
validators and executable bridge, SQLite migrations, and package documentation.
|
|
71
|
-
It
|
|
123
|
+
It includes the self-contained loopback workspace, but not the Wrench execution
|
|
124
|
+
runtime, hosted PeopleBlade web server, billing
|
|
72
125
|
implementation, operational tooling, tests, or private product documentation.
|
|
73
126
|
|
|
74
127
|
## Update or remove
|
package/THIRD_PARTY_NOTICES.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# Third-party notices
|
|
2
2
|
|
|
3
3
|
The PeopleBlade CLI bundle includes reviewed client-boundary code from
|
|
4
|
-
`@hraness/wrench` 0.16.
|
|
5
|
-
`
|
|
4
|
+
`@hraness/wrench` 0.16.8 (commit
|
|
5
|
+
`b0cf2ecbc1113fcc8ef673a824be475c3d7bbb46`) and message-bundle contract code
|
|
6
6
|
from `@hraness/message-like-me` 0.7.0. Those portions are provided under the
|
|
7
7
|
following license. The PeopleBlade CLI package has its own MIT grant in
|
|
8
8
|
`LICENSE`; this notice preserves the attribution for the bundled portions.
|
package/dist/cli.ts
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
import { accessSync, constants, realpathSync } from "node:fs";
|
|
4
4
|
import { isAbsolute, resolve } from "node:path";
|
|
5
5
|
|
|
6
|
+
const reviewedWrenchVersion = "0.16.8";
|
|
6
7
|
const configured = process.env.PEOPLEBLADE_WRENCH_EXECUTABLE;
|
|
7
8
|
const executable = configured === undefined
|
|
8
9
|
? Bun.which("wrench")
|
|
@@ -32,6 +33,36 @@ if (process.argv[1] !== undefined && canonicalExecutable === realpathSync(proces
|
|
|
32
33
|
process.exit(127);
|
|
33
34
|
}
|
|
34
35
|
|
|
36
|
+
let versionProbe: ReturnType<typeof Bun.spawnSync> | null = null;
|
|
37
|
+
try {
|
|
38
|
+
versionProbe = Bun.spawnSync([canonicalExecutable, "--version"], {
|
|
39
|
+
cwd: process.cwd(),
|
|
40
|
+
env: process.env,
|
|
41
|
+
stdin: "ignore",
|
|
42
|
+
stdout: "pipe",
|
|
43
|
+
stderr: "pipe",
|
|
44
|
+
timeout: 5_000,
|
|
45
|
+
killSignal: "SIGKILL",
|
|
46
|
+
maxBuffer: 1_024,
|
|
47
|
+
});
|
|
48
|
+
} catch {
|
|
49
|
+
// Collapse process, timeout, and output-limit failures into one public error.
|
|
50
|
+
}
|
|
51
|
+
if (
|
|
52
|
+
versionProbe === null
|
|
53
|
+
|| versionProbe.exitCode !== 0
|
|
54
|
+
|| versionProbe.signalCode !== undefined
|
|
55
|
+
|| versionProbe.exitedDueToTimeout === true
|
|
56
|
+
|| versionProbe.exitedDueToMaxBuffer === true
|
|
57
|
+
|| versionProbe.stdout?.toString() !== `${reviewedWrenchVersion}\n`
|
|
58
|
+
|| versionProbe.stderr?.byteLength !== 0
|
|
59
|
+
) {
|
|
60
|
+
console.error(
|
|
61
|
+
`PeopleBlade Wrench-backed sources require the exact reviewed Wrench ${reviewedWrenchVersion} executable.`,
|
|
62
|
+
);
|
|
63
|
+
process.exit(126);
|
|
64
|
+
}
|
|
65
|
+
|
|
35
66
|
const child = Bun.spawn([canonicalExecutable, ...process.argv.slice(2)], {
|
|
36
67
|
cwd: process.cwd(),
|
|
37
68
|
env: process.env,
|