sigrank 1.0.46 → 1.0.48

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.
@@ -19,14 +19,14 @@ It does not persist that content or send it to the SigRank service; it appends
19
19
  only provider-reported token counts, model/backend metadata, and timestamps to
20
20
  `~/.sigrank-mcp/proxy-sessions.jsonl`.
21
21
 
22
- - **Signed path** (`submit_verified`, `watch_tokenpull` with `submit:true`): the four numbers travel with the device's public key, codename, window, and an ed25519 signature. The board verifies the signature without seeing your data.
23
- - **Paste path** (`submit_paste`, `tokenpull_submit`): the MCP parses your pasted token counts locally, then sends only the four canonical numbers to the server's web-paste endpoint. Even if you paste mixed text (prose + numbers), only the extracted token counts are transmitted — the raw text never leaves your machine.
22
+ - **Signed path** (`submit_verified`, `watch_tokenpull` with `submit:true`; both require `confirm:true`, so nothing publishes without your approval): the four numbers travel with the device's public key, codename, window, and an ed25519 signature. The board verifies the signature without seeing your data.
23
+ - **Preview tools** (`submit_paste`, `tokenpull_submit`): compute your cascade locally and send nothing. They do not publish to the board; publishing goes through the signed path or the signalaf.com web UI.
24
24
 
25
25
  ## How it works
26
26
 
27
27
  1. **Local-first:** All token pulling happens on your machine. Upsilon reads usage metadata from session logs in ~/.claude, ~/.codex, ~/.local/share/amp, etc. The optional proxy also runs only on loopback and only when manually started.
28
- 2. **Token-only persistence:** Local-log adapters extract integer counts from log metadata without reading conversation content. The optional proxy forwards request/response bytes transiently but persists only usage metadata. On the paste path, the MCP parses the paste locally and sends only the four extracted numbers — the raw paste text stays on your machine.
29
- 3. **Signed submission:** Ranked submissions (`submit_verified`, `watch_tokenpull` with `submit:true`) are ed25519-signed with a device-bound key generated locally at enrollment. The board verifies the signature without seeing your data. Paste submissions (`submit_paste`, `tokenpull_submit`) are unsigned and go through the web-paste endpoint with a codename only — but still send only the four token counts, not the raw paste.
28
+ 2. **Token-only persistence:** Local-log adapters extract integer counts from log metadata without reading conversation content. The optional proxy forwards request/response bytes transiently but persists only usage metadata. Paste parsing (`submit_paste`, `rank_paste`) happens locally and nothing is transmitted.
29
+ 3. **Signed submission:** Ranked submissions (`submit_verified`, `watch_tokenpull` with `submit:true`) are ed25519-signed with a device-bound key generated locally at enrollment. The board verifies the signature without seeing your data. `submit_paste` and `tokenpull_submit` are preview-only and never submit.
30
30
  4. **Read tools need no auth:** No API keys, no OAuth, no account needed to read the leaderboard or operator profiles. **Enrollment requires a connect code** from signalaf.com → Settings → New key (the code binds your device's public key to your operator server-side); a codename alone is not enough for the signed/ranked path.
31
31
 
32
32
  ## What the Upsilon service can NOT see
@@ -17,7 +17,7 @@ import {
17
17
  export const TOOL_DEF = {
18
18
  name: "watch_tokenpull",
19
19
  description:
20
- "One poll per call: pulls your local token logs and returns the current cascade for the watched window — the tool never blocks or loops. Re-call at your desired cadence to watch for changes (interval_s is advisory only and echoed back as poll_interval_s). With submit:true (and an enrolled device) each call may also sign + publish the watched window to the board, rate-limited to once per 5 min per platform+window; default is preview-only (no submit).",
20
+ "One poll per call: pulls your local token logs and returns the current cascade for the watched window — the tool never blocks or loops. Re-call at your desired cadence to watch for changes (interval_s is advisory only and echoed back as poll_interval_s). With submit:true AND confirm:true (and an enrolled device) each call may also sign + publish the watched window to the public board, rate-limited to once per 5 min per platform+window. Publishing requires confirm: true (ask the user first); default is preview-only (no submit).",
21
21
  annotations: {
22
22
  title: "Watch token pull",
23
23
  ...ANNOTATIONS.idempotentHint,
@@ -45,7 +45,12 @@ export const TOOL_DEF = {
45
45
  submit: {
46
46
  type: "boolean",
47
47
  description:
48
- "auto-submit the watched window to the board as a VERIFIED operator each poll (requires `enroll`; default false = preview only)",
48
+ "auto-submit the watched window to the board as a VERIFIED operator each poll (requires `enroll` and confirm:true; default false = preview only)",
49
+ },
50
+ confirm: {
51
+ type: "boolean",
52
+ description:
53
+ "REQUIRED with submit:true: must be true, set only after the user has explicitly approved publishing to the public board.",
49
54
  },
50
55
  },
51
56
  },
@@ -78,7 +83,13 @@ export async function handleWatchTokenpull(args, ctx) {
78
83
  // watched window to the verified ingest path. Default OFF = preview only. The server
79
84
  // dedups identical re-submits (exact snapshot_hash → 422), so re-calling is safe.
80
85
  let auth_submit = null;
81
- if (args?.submit === true) {
86
+ if (args?.submit === true && args?.confirm !== true) {
87
+ auth_submit = {
88
+ status: "confirmation_required",
89
+ detail:
90
+ "watch_tokenpull with submit:true publishes to the public board. Ask the user for approval, then call again with confirm: true.",
91
+ };
92
+ } else if (args?.submit === true) {
82
93
  const id = ctx.opts.identity || ensureIdentity();
83
94
  if (id.codename && id.operator_id && id.private_key_pkcs8_b64) {
84
95
  // E3: client-side cooldown — at most one auto-submit per platform+window per 5 min.