@somacheck/vibecheck 0.2.0 → 0.3.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.
@@ -0,0 +1,135 @@
1
+ import { readConfig } from "./config.js";
2
+ import { SomaCheckCompatibilityError, SomaCheckHttpError } from "./api.js";
3
+ import { clientDisplayName, clientRegistrationState, detectLegacyHostedRegistration, isClientInstalled, manualLegacyHostedRemoveCommand, manualRemoveCommand, manualSetupCommand, } from "./client-setup.js";
4
+ export async function checkReadiness(dependencies) {
5
+ let token;
6
+ try {
7
+ token = (await readConfig(dependencies.home)).token;
8
+ dependencies.output("✓ Link credential found.");
9
+ }
10
+ catch {
11
+ dependencies.output("✗ This computer is not linked to SomaCheck.");
12
+ dependencies.output(" Open SomaCheck → Settings → Agent and run the command shown there.");
13
+ return {
14
+ linked: false,
15
+ backendReachable: false,
16
+ backendCompatible: false,
17
+ registeredClients: [],
18
+ readyClients: [],
19
+ ready: false,
20
+ };
21
+ }
22
+ let statusProbeOk = false;
23
+ let contextProbeOk = false;
24
+ try {
25
+ await dependencies.api.statusRequest(token);
26
+ statusProbeOk = true;
27
+ await dependencies.api.contextRequest(token);
28
+ contextProbeOk = true;
29
+ dependencies.output("✓ SomaCheck can receive requests and return gesture context.");
30
+ }
31
+ catch (error) {
32
+ if (error instanceof SomaCheckHttpError && (error.status === 401 || error.status === 403)) {
33
+ dependencies.output("✗ The SomaCheck link was rejected or revoked.");
34
+ dependencies.output(" Reconnect from SomaCheck → Settings → Agent.");
35
+ }
36
+ else if (error instanceof SomaCheckHttpError && error.status === 404) {
37
+ dependencies.output("✗ This link is valid, but the required agent backend version is not deployed.");
38
+ dependencies.output(" Your credential is safe. Run doctor again after the backend update.");
39
+ }
40
+ else if (error instanceof SomaCheckHttpError && error.status >= 500) {
41
+ dependencies.output("✗ SomaCheck's agent backend is temporarily unavailable.");
42
+ dependencies.output(" Your credential is safe. Try doctor again shortly.");
43
+ }
44
+ else {
45
+ dependencies.output("✗ Could not reach SomaCheck's agent backend.");
46
+ dependencies.output(" Check this computer's internet connection, then run doctor again.");
47
+ }
48
+ }
49
+ const backendReachable = statusProbeOk && contextProbeOk;
50
+ const clients = ["codex", "claude"];
51
+ let installedClientCount = 0;
52
+ let hasLegacyHostedRegistration = false;
53
+ const registeredClients = [];
54
+ for (const client of clients) {
55
+ if (!(await isClientInstalled(client, dependencies.runner)))
56
+ continue;
57
+ installedClientCount += 1;
58
+ const legacyHosted = await detectLegacyHostedRegistration(client, dependencies.runner);
59
+ if (legacyHosted !== null) {
60
+ hasLegacyHostedRegistration = true;
61
+ const authNote = legacyHosted.status === "needs_authentication"
62
+ ? " It currently reports: Needs authentication."
63
+ : "";
64
+ dependencies.output(`○ ${clientDisplayName(client)} also has a separate legacy server named "somacheck".${authNote}`);
65
+ dependencies.output(' SomaCheck MCP 0.3 uses "vibecheck"; the legacy entry was not changed.');
66
+ dependencies.output(` Optional manual cleanup: ${manualLegacyHostedRemoveCommand(client)}`);
67
+ }
68
+ const registration = await clientRegistrationState(client, dependencies.runner);
69
+ if (registration === "current") {
70
+ registeredClients.push(client);
71
+ dependencies.output(`✓ ${clientDisplayName(client)} is configured.`);
72
+ }
73
+ else if (registration === "needs_update") {
74
+ dependencies.output(`✗ ${clientDisplayName(client)} is configured with a different SomaCheck command or version.`);
75
+ dependencies.output(` Run: ${manualRemoveCommand(client)}`);
76
+ dependencies.output(` Then: ${manualSetupCommand(client)}`);
77
+ }
78
+ else {
79
+ dependencies.output(`✗ ${clientDisplayName(client)} is installed but not configured.`);
80
+ dependencies.output(` Run: ${manualSetupCommand(client)}`);
81
+ }
82
+ }
83
+ if (registeredClients.length === 0) {
84
+ dependencies.output("✗ No supported agent client has the current SomaCheck 0.3 configuration.");
85
+ if (installedClientCount === 0) {
86
+ dependencies.output(" Install Codex or Claude Code, then run the matching setup command.");
87
+ }
88
+ }
89
+ let backendCompatible = false;
90
+ const readyClients = [];
91
+ if (backendReachable && !hasLegacyHostedRegistration) {
92
+ for (const client of registeredClients) {
93
+ try {
94
+ const handshake = await dependencies.api.clientHandshake(token, {
95
+ client_key: client,
96
+ client_label: clientDisplayName(client),
97
+ registration_exact: true,
98
+ status_probe_ok: true,
99
+ context_probe_ok: true,
100
+ });
101
+ if (handshake.readiness_status === "ready") {
102
+ backendCompatible = true;
103
+ readyClients.push(client);
104
+ dependencies.output(`✓ ${clientDisplayName(client)} completed the SomaCheck protocol-3 health check.`);
105
+ }
106
+ else {
107
+ dependencies.output(`✗ ${clientDisplayName(client)} is not ready yet (${handshake.readiness_status}).`);
108
+ }
109
+ }
110
+ catch (error) {
111
+ if (error instanceof SomaCheckCompatibilityError) {
112
+ const packageText = error.requiredPackageVersion === null
113
+ ? "the required package version"
114
+ : `@somacheck/vibecheck@${error.requiredPackageVersion}`;
115
+ dependencies.output(`✗ SomaCheck's backend requires ${packageText}; this package is not compatible.`);
116
+ }
117
+ else if (error instanceof SomaCheckHttpError && error.status >= 500) {
118
+ dependencies.output("✗ SomaCheck's protocol handshake is temporarily unavailable.");
119
+ }
120
+ else {
121
+ dependencies.output(`✗ ${clientDisplayName(client)} could not complete the SomaCheck protocol handshake.`);
122
+ }
123
+ }
124
+ }
125
+ }
126
+ if (hasLegacyHostedRegistration) {
127
+ dependencies.output('✗ Remove the legacy "somacheck" connector before this setup can be Ready.');
128
+ }
129
+ const ready = readyClients.length > 0;
130
+ dependencies.output(ready
131
+ ? "Ready. Restart your agent client, then ask it to check your SomaCheck status."
132
+ : "Setup is not complete yet. Fix the items marked ✗, then run: vibecheck doctor");
133
+ return { linked: true, backendReachable, backendCompatible, registeredClients, readyClients, ready };
134
+ }
135
+ //# sourceMappingURL=readiness.js.map
package/dist/server.js CHANGED
@@ -1,90 +1,103 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
2
  import { z } from "zod";
3
- import { BackendTooOldError, performVibecheck, StatementPendingError } from "./vibecheck.js";
4
- const outcomeSchema = {
5
- verdict: z.enum(["aligned", "unaligned", "inconclusive"]),
6
- confidence: z.number(),
7
- latency_s: z.number(),
8
- };
3
+ import { StatementPendingError } from "./vibecheck.js";
4
+ import { SomaCheckCompatibilityError, SomaCheckHttpError } from "./api.js";
5
+ import { PACKAGE_NAME, PACKAGE_VERSION } from "./constants.js";
6
+ const cadenceSchema = z.object({
7
+ reason: z.string(),
8
+ create_due_at: z.string().nullable(),
9
+ create_overdue: z.boolean(),
10
+ may_create_now: z.boolean(),
11
+ last_answered_at: z.string().nullable(),
12
+ blocking_request_id: z.string().nullable(),
13
+ stale_after_seconds: z.number(),
14
+ followup_within_seconds: z.number(),
15
+ });
9
16
  const statusSchema = {
10
17
  linked: z.literal(true),
11
18
  no_prior_requests: z.boolean(),
12
19
  prior_request_count: z.number().int(),
13
20
  has_pending_request: z.boolean(),
14
- first_run_intro: z.object({
15
- eligible: z.boolean(),
16
- should_offer_now: z.boolean(),
17
- }),
18
- cadence: z.object({
19
- as_of: z.string(),
20
- may_create_now: z.boolean(),
21
- reason: z.string(),
22
- blocking_request: z
23
- .object({ id: z.string(), created_at: z.string(), age_seconds: z.number() })
24
- .nullable(),
25
- last_answered_at: z.string().nullable(),
26
- create_due_at: z.string().nullable(),
27
- create_overdue: z.boolean(),
28
- stale_after_hours: z.number(),
29
- followup_within_hours: z.number(),
30
- guidance: z.string(),
31
- }),
21
+ pending_proposition_count: z.number().int(),
22
+ queued_proposition_count: z.number().int(),
23
+ propositions_needed: z.number().int(),
24
+ replenishment_requested_at: z.string().nullable(),
25
+ first_run_intro: z.object({ eligible: z.boolean(), should_offer_now: z.boolean() }),
26
+ cadence: cadenceSchema,
32
27
  recommended_action: z.string(),
33
- copy_guidance: z.object({
34
- policy: z.string(),
35
- framing: z.string(),
36
- fallback: z.string(),
37
- }),
28
+ copy_guidance: z.object({ policy: z.string(), framing: z.string(), fallback: z.string() }),
38
29
  };
39
- const postStatementSchema = {
30
+ const createdPropositionSchema = z.object({
40
31
  request_id: z.string(),
32
+ presentation_state: z.enum(["presented", "queued"]),
41
33
  stale_at: z.string().nullable(),
34
+ });
35
+ const postSchema = { propositions: z.array(createdPropositionSchema) };
36
+ const resultSchema = {
37
+ request_id: z.string(),
38
+ status: z.enum(["queued", "pending", "answered", "expired", "cancelled"]),
39
+ verdict: z.enum(["aligned", "unaligned"]).nullable(),
40
+ confidence: z.number().nullable(),
41
+ latency_s: z.number().nullable(),
42
42
  };
43
- function summarise(status) {
44
- const cadence = status.cadence;
45
- if (!cadence.may_create_now) {
46
- const age = cadence.blocking_request
47
- ? ` It has been waiting ${Math.round(cadence.blocking_request.age_seconds / 60)} minutes.`
48
- : "";
49
- return `A statement is already waiting for this person to check in.${age} Do not post another one until they do, or until it goes stale after ${cadence.stale_after_hours} hours.`;
50
- }
51
- if (status.first_run_intro.should_offer_now) {
52
- return "Linked: yes. No prior requests: yes. Offer the first-run intro now, then post the first statement.";
53
- }
54
- if (cadence.create_overdue) {
55
- return `The channel is empty and the follow-up was due at ${cadence.create_due_at}. Post a statement now.`;
56
- }
57
- if (cadence.create_due_at !== null) {
58
- return `They checked in. The channel is empty: post the next statement by ${cadence.create_due_at}.`;
59
- }
60
- return "The channel is empty. Post a statement drawn from your own context about this person.";
61
- }
62
- // Mike's direction (2026-07-29): one sentence, trust a capable model, do not
63
- // hand it a ruleset. The single framing rule dissolves the fabrication risk.
64
- //
65
- // The cadence sentences are the exception: they are not a style ruleset, they
66
- // are the protocol that keeps the channel alive. The server decides the three
67
- // rules; these sentences only tell the agent when to read the decision and what
68
- // to do about it. Statements themselves still come from the agent's own context
69
- // about its user, which is the one thing the server cannot supply.
43
+ const contextItemSchema = z.object({
44
+ request_id: z.string(),
45
+ statement: z.string(),
46
+ verdict: z.enum(["aligned", "unaligned"]),
47
+ confidence: z.number().min(0).max(1),
48
+ answered_at: z.string().datetime({ offset: true }),
49
+ });
50
+ const contextSchema = { checkins: z.array(contextItemSchema) };
70
51
  const SERVER_INSTRUCTIONS = [
71
- "SomaCheck lets you ask the person for an embodied answer through a quick phone check-in.",
72
- "Call get_vibecheck_status at the start of a session, and again whenever a check-in completes.",
73
- "If first_run_intro.should_offer_now is true, introduce the ritual and create the first vibecheck.",
74
- "The first prompt is a statement for the user to test — one that helps them identify where they are out of alignment.",
75
- "Offer the statement as something to test, never as a claim of fact about the user.",
76
- "When cadence.may_create_now is true the channel is empty: post exactly one statement with post_vibecheck_statement, drawn from your own context about this person.",
77
- "When cadence.may_create_now is false a statement is still live, so wait for the check-in instead of queueing another.",
78
- "If cadence.create_overdue is true the follow-up window already passed while you were away; post it at your first opportunity.",
79
- "Fire once. If the user ignores or declines, do not nag.",
52
+ "SomaCheck lets you offer the person a statement to test through a quick phone check-in.",
53
+ "Call get_vibecheck_context and get_vibecheck_status at the start of a session or background run, and call status again after a completed check-in.",
54
+ "Treat gesture outcomes as contextual signals, never fixed facts or blanket authorization.",
55
+ "Maintain three distinct propositions drawn from your own context about this person.",
56
+ "When propositions_needed is greater than zero, post exactly that many in one call.",
57
+ "Offer each statement as something to test, never as a claim of fact about the user.",
58
+ "Retain every request_id returned by post_vibecheck_statement and call get_vibecheck_result later.",
59
+ "Do not poll continuously. Queued means the proposition is cached until the person advances their feed.",
80
60
  ].join(" ");
81
61
  export function createVibecheckServer(dependencies) {
82
- const server = new McpServer({ name: "@somacheck/vibecheck", version: "0.2.0" }, { instructions: SERVER_INSTRUCTIONS });
62
+ const server = new McpServer({ name: PACKAGE_NAME, version: PACKAGE_VERSION }, { instructions: SERVER_INSTRUCTIONS });
63
+ server.registerTool("get_vibecheck_context", {
64
+ title: "Vibecheck Context",
65
+ description: "Read recent completed check-ins for this linked agent, newest first. Use the outcomes as contextual signals and replenish the feed when status requests it.",
66
+ inputSchema: {},
67
+ outputSchema: contextSchema,
68
+ annotations: {
69
+ readOnlyHint: true,
70
+ destructiveHint: false,
71
+ idempotentHint: true,
72
+ openWorldHint: false,
73
+ },
74
+ }, async () => {
75
+ try {
76
+ const token = await dependencies.loadToken();
77
+ const checkins = await dependencies.api.contextRequest(token);
78
+ const text = checkins.length === 0
79
+ ? "No completed SomaCheck gestures yet."
80
+ : [
81
+ `Loaded ${checkins.length} completed gesture${checkins.length === 1 ? "" : "s"}. Treat them as contextual signals, not fixed conclusions:`,
82
+ ...checkins.map((item) => `${Math.round(item.confidence * 100)}% ${item.verdict} — ${JSON.stringify(item.statement)}`),
83
+ ].join("\n");
84
+ return { content: [{ type: "text", text }], structuredContent: { checkins } };
85
+ }
86
+ catch (error) {
87
+ return failureMessage("read SomaCheck context", error);
88
+ }
89
+ });
83
90
  server.registerTool("get_vibecheck_status", {
84
91
  title: "Vibecheck Status",
85
- description: "Ask whether you should post a statement for this person right now, and why. Returns cadence.may_create_now (false while a statement is still live and unchecked), cadence.create_due_at (the follow-up deadline after their last check-in) and cadence.create_overdue. Also reports whether to offer the first-run intro. Call this before the first vibecheck in a conversation, right after a newly linked account is detected, and again after any check-in completes.",
92
+ description: "Read the live SomaCheck cache before posting. Reports how many personalized propositions are needed, when routine replenishment is due, and whether this is the agent's first contact.",
86
93
  inputSchema: {},
87
94
  outputSchema: statusSchema,
95
+ annotations: {
96
+ readOnlyHint: true,
97
+ destructiveHint: false,
98
+ idempotentHint: true,
99
+ openWorldHint: false,
100
+ },
88
101
  }, async () => {
89
102
  try {
90
103
  const token = await dependencies.loadToken();
@@ -95,108 +108,115 @@ export function createVibecheckServer(dependencies) {
95
108
  };
96
109
  }
97
110
  catch (error) {
98
- return {
99
- isError: true,
100
- content: [
101
- {
102
- type: "text",
103
- text: error instanceof BackendTooOldError
104
- ? "This SomaCheck backend does not report statement cadence yet, so the cadence rules cannot be enforced. Your link is fine. Ask the SomaCheck team to apply the cadence migration."
105
- : "Could not read SomaCheck status. Check your link and try again.",
106
- },
107
- ],
108
- };
111
+ return failureMessage("read SomaCheck status", error);
109
112
  }
110
113
  });
111
- // The cadence statement is asynchronous by nature: the agent posts it from its
112
- // own context and the person checks in whenever they next pick up the phone.
113
- // `vibecheck` blocks for an answer, which is the wrong shape for that -- it
114
- // would hold the agent's turn open for minutes against a phone nobody is
115
- // holding. This tool posts and returns.
116
114
  server.registerTool("post_vibecheck_statement", {
117
115
  title: "Post Vibecheck Statement",
118
- description: "Post one statement for the person to test with a wrist gesture whenever they next open SomaCheck, and return immediately. Use this to keep the cadence: call get_vibecheck_status first and only post when cadence.may_create_now is true. Draw the statement from your own context about this person. It is refused while another statement is still live and unchecked.",
116
+ description: "Fill the person's SomaCheck cache with one to three personalized statements and return immediately. Call get_vibecheck_status first and submit exactly propositions_needed statements.",
119
117
  inputSchema: {
120
- statement: z.string().min(1).describe("The statement for the person to test."),
118
+ statements: z.array(z.string().min(1)).min(1).max(3)
119
+ .describe("Distinct personalized statements for this person to test, ordered most useful first."),
120
+ },
121
+ outputSchema: postSchema,
122
+ annotations: {
123
+ readOnlyHint: false,
124
+ destructiveHint: false,
125
+ idempotentHint: false,
126
+ openWorldHint: false,
121
127
  },
122
- outputSchema: postStatementSchema,
123
- }, async ({ statement }) => {
128
+ }, async ({ statements }) => {
124
129
  try {
125
130
  const token = await dependencies.loadToken();
126
- const created = await dependencies.api.createRequest(token, statement.trim() || null);
127
- const staleNote = created.stale_at === null ? "" : ` It stays live until ${created.stale_at}.`;
131
+ const created = await dependencies.api.createRequests(token, statements.map((statement) => statement.trim()));
132
+ const presented = created.filter((item) => item.presentation_state === "presented").length;
133
+ const queued = created.length - presented;
128
134
  return {
129
- content: [
130
- {
131
- type: "text",
132
- text: `Posted. It is waiting in SomaCheck for their next check-in.${staleNote}`,
133
- },
134
- ],
135
- structuredContent: { ...created, stale_at: created.stale_at },
135
+ content: [{ type: "text", text: `Added ${created.length}: ${presented} presented, ${queued} cached.` }],
136
+ structuredContent: { propositions: created },
136
137
  };
137
138
  }
138
139
  catch (error) {
139
- return {
140
- isError: true,
141
- content: [
142
- {
143
- type: "text",
144
- text: error instanceof StatementPendingError
145
- ? "A statement is already waiting for this person. Do not post another one until they check in."
146
- : "Could not post the statement. Check your link and try again.",
147
- },
148
- ],
149
- };
140
+ return failure(error instanceof StatementPendingError
141
+ ? "Three propositions are already available. Wait for a check-in, refresh, or expiry."
142
+ : operationalFailureText("add SomaCheck propositions", error));
150
143
  }
151
144
  });
152
- server.registerTool("vibecheck", {
153
- title: "Vibecheck",
154
- description: "Ask the person for an embodied answer right now. Blocks while SomaCheck waits for their next wrist gesture. On a fresh link, call get_vibecheck_status first to learn whether to introduce the ritual. For a statement they answer in their own time, use post_vibecheck_statement instead.",
145
+ server.registerTool("get_vibecheck_result", {
146
+ title: "Get Vibecheck Result",
147
+ description: "Read one proposition by request_id. This is a single non-blocking read: queued is cached, and pending is presented but not answered.",
155
148
  inputSchema: {
156
- question: z.string().optional().describe("The question to ask the person."),
157
- timeout_s: z.number().positive().default(120).describe("How long to wait for a gesture, in seconds."),
149
+ request_id: z.string().min(1).describe("The request_id returned by post_vibecheck_statement."),
150
+ },
151
+ outputSchema: resultSchema,
152
+ annotations: {
153
+ readOnlyHint: true,
154
+ destructiveHint: false,
155
+ idempotentHint: true,
156
+ openWorldHint: false,
158
157
  },
159
- outputSchema: outcomeSchema,
160
- }, async ({ question, timeout_s }) => {
161
- const startedAt = dependencies.now?.() ?? Date.now();
158
+ }, async ({ request_id }) => {
162
159
  try {
163
160
  const token = await dependencies.loadToken();
164
- const run = await performVibecheck({
165
- api: dependencies.api,
166
- token,
167
- ...(question === undefined ? {} : { question }),
168
- timeoutSeconds: timeout_s,
169
- ...(dependencies.now === undefined ? {} : { now: dependencies.now }),
170
- ...(dependencies.sleep === undefined ? {} : { sleep: dependencies.sleep }),
171
- });
172
- const structuredContent = { ...run.outcome };
173
- return {
174
- content: [{ type: "text", text: run.message }],
175
- structuredContent,
176
- };
161
+ const result = await dependencies.api.pollRequest(token, request_id);
162
+ const structuredContent = { request_id, ...result };
163
+ const text = result.status === "answered"
164
+ ? `Answered: ${Math.round((result.confidence ?? 0) * 100)}% ${result.verdict}.`
165
+ : result.status === "queued"
166
+ ? "Queued. The proposition is cached until the person advances their feed."
167
+ : result.status === "pending"
168
+ ? "Pending. The person has not completed this check-in yet."
169
+ : `The request is ${result.status}.`;
170
+ return { content: [{ type: "text", text }], structuredContent };
177
171
  }
178
172
  catch (error) {
179
- const endedAt = dependencies.now?.() ?? Date.now();
180
- const latencySeconds = Math.max(0, (endedAt - startedAt) / 1_000);
181
- const outcome = {
182
- verdict: "inconclusive",
183
- confidence: 0,
184
- latency_s: latencySeconds,
185
- };
186
- return {
187
- isError: true,
188
- content: [
189
- {
190
- type: "text",
191
- text: error instanceof StatementPendingError
192
- ? "A statement is already waiting for this person to check in. Wait for that one instead of asking again."
193
- : "Vibecheck could not complete. Check your link and try again.",
194
- },
195
- ],
196
- structuredContent: outcome,
197
- };
173
+ return failureMessage("read that SomaCheck result", error);
198
174
  }
199
175
  });
200
176
  return server;
201
177
  }
178
+ function summarise(status) {
179
+ const cadence = status.cadence;
180
+ if (status.first_run_intro.should_offer_now) {
181
+ return `This is your first contact. Introduce the SomaCheck ritual, then create exactly ${status.propositions_needed} distinct personalized propositions.`;
182
+ }
183
+ if (status.propositions_needed > 0) {
184
+ const requested = status.replenishment_requested_at === null
185
+ ? ""
186
+ : ` The person requested replenishment at ${status.replenishment_requested_at}.`;
187
+ return `The cache has ${status.pending_proposition_count} of 3 propositions. Create exactly ${status.propositions_needed} distinct personalized proposition${status.propositions_needed === 1 ? "" : "s"} now.${requested}`;
188
+ }
189
+ return `The cache is full: one proposition is presented and ${status.queued_proposition_count} are queued. Routine replenishment uses a ${formatDuration(cadence.followup_within_seconds)} floor.`;
190
+ }
191
+ function formatDuration(seconds) {
192
+ const hours = seconds / 3600;
193
+ return Number.isInteger(hours) ? `${hours}-hour` : `${Math.round(seconds / 60)}-minute`;
194
+ }
195
+ function failure(text) {
196
+ return {
197
+ isError: true,
198
+ content: [{ type: "text", text }],
199
+ };
200
+ }
201
+ function failureMessage(operation, error) {
202
+ return failure(operationalFailureText(operation, error));
203
+ }
204
+ function operationalFailureText(operation, error) {
205
+ const doctor = "Run: npx -y @somacheck/vibecheck@0.3.0 doctor";
206
+ if (error instanceof SomaCheckCompatibilityError) {
207
+ return `Could not ${operation}: this MCP package and the SomaCheck backend are incompatible. ${doctor}`;
208
+ }
209
+ if (error instanceof SomaCheckHttpError) {
210
+ if (error.status === 401 || error.status === 403) {
211
+ return `Could not ${operation}: this SomaCheck link was rejected or revoked. Reconnect in the app. ${doctor}`;
212
+ }
213
+ if (error.status === 404) {
214
+ return `Could not ${operation}: the required SomaCheck agent backend is not deployed. ${doctor}`;
215
+ }
216
+ if (error.status >= 500) {
217
+ return `Could not ${operation}: the SomaCheck backend is temporarily unavailable. Try again shortly. ${doctor}`;
218
+ }
219
+ }
220
+ return `Could not ${operation}: the local link or network check failed. ${doctor}`;
221
+ }
202
222
  //# sourceMappingURL=server.js.map
package/dist/vibecheck.js CHANGED
@@ -1,70 +1,7 @@
1
- /**
2
- * The backend predates the cadence migration, so it cannot answer "may I create
3
- * now?" and cannot enforce rule 1 either. Distinct from a link failure: nothing
4
- * is wrong with the user's link and re-linking will not help.
5
- */
6
- export class BackendTooOldError extends Error {
7
- constructor() {
8
- super("This SomaCheck backend does not report statement cadence yet.");
9
- this.name = "BackendTooOldError";
10
- }
11
- }
12
- /** Rule 1 refusal from the backend: a live statement is still unchecked. */
13
1
  export class StatementPendingError extends Error {
14
2
  constructor() {
15
- super("A statement is already waiting for this person.");
3
+ super("A statement is already pending.");
16
4
  this.name = "StatementPendingError";
17
5
  }
18
6
  }
19
- const POLL_INTERVAL_MS = 2_000;
20
- const defaultSleep = async (milliseconds) => {
21
- await new Promise((resolve) => setTimeout(resolve, milliseconds));
22
- };
23
- export async function performVibecheck(options) {
24
- const timeoutSeconds = options.timeoutSeconds ?? 120;
25
- if (!Number.isFinite(timeoutSeconds) || timeoutSeconds <= 0) {
26
- throw new Error("timeout_s must be a positive number.");
27
- }
28
- const now = options.now ?? Date.now;
29
- const sleep = options.sleep ?? defaultSleep;
30
- const calledAt = now();
31
- const deadline = calledAt + timeoutSeconds * 1_000;
32
- const created = await options.api.createRequest(options.token, options.question?.trim() || null);
33
- const requestId = created.request_id;
34
- while (now() < deadline) {
35
- const waitMilliseconds = Math.min(POLL_INTERVAL_MS, deadline - now());
36
- await sleep(waitMilliseconds);
37
- // Always poll after sleeping, including the window that ends exactly on the
38
- // deadline. Breaking out before this poll loses a gesture that landed during
39
- // the final wait -- the answer is already recorded, so reporting it
40
- // inconclusive would be wrong.
41
- const response = await options.api.pollRequest(options.token, requestId);
42
- if (response.status === "pending") {
43
- continue;
44
- }
45
- if (response.status === "answered") {
46
- if (response.verdict === null || response.confidence === null || response.latency_s === null) {
47
- throw new Error("SomaCheck returned an incomplete answer.");
48
- }
49
- const outcome = {
50
- verdict: response.verdict,
51
- confidence: response.confidence,
52
- latency_s: response.latency_s,
53
- };
54
- return {
55
- outcome,
56
- message: `Your embodied answer is ${outcome.verdict} (${Math.round(outcome.confidence * 100)}% confidence, ${outcome.latency_s}s).`,
57
- };
58
- }
59
- const elapsedSeconds = (now() - calledAt) / 1_000;
60
- return {
61
- outcome: { verdict: "inconclusive", confidence: 0, latency_s: elapsedSeconds },
62
- message: `The vibecheck request ${response.status}. Open SomaCheck and try again.`,
63
- };
64
- }
65
- return {
66
- outcome: { verdict: "inconclusive", confidence: 0, latency_s: timeoutSeconds },
67
- message: `No gesture arrived within ${timeoutSeconds} seconds. Open SomaCheck and try again.`,
68
- };
69
- }
70
7
  //# sourceMappingURL=vibecheck.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@somacheck/vibecheck",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Ask your embodied sense for an answer through SomaCheck.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -10,11 +10,12 @@
10
10
  ".": "./dist/server.js"
11
11
  },
12
12
  "files": [
13
- "dist"
13
+ "dist/*.js"
14
14
  ],
15
15
  "scripts": {
16
16
  "build": "tsc -p tsconfig.json",
17
- "test": "npm run build && node --import tsx --test test/api.test.ts && node --import tsx --test test/link.test.ts && node --import tsx --test test/vibecheck.test.ts && node --test test/server.test.mjs",
17
+ "test": "npm run build && node --import tsx --test test/*.test.ts && node --test test/server.test.mjs",
18
+ "test:release-artifacts": "bash ./verify-release-artifacts.sh",
18
19
  "typecheck": "tsc -p tsconfig.json --noEmit",
19
20
  "prepack": "npm run build"
20
21
  },
package/dist/api.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
package/dist/cli.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,wBAAwB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,GAAG,GAAG,IAAI,gBAAgB,CAAC,YAAY,EAAE,wBAAwB,CAAC,CAAC;AAEzE,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QACD,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE;YAC7B,IAAI,EAAE,OAAO,EAAE;YACf,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;YACtC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC;SACpD,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,MAAM,GAAG,qBAAqB,CAAC;QACnC,GAAG;QACH,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK;KAC3D,CAAC,CAAC;IACH,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;AACnD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAClF,MAAM,OAAO,GAAG,YAAY;QAC1B,CAAC,CAAC,KAAK,CAAC,OAAO;QACf,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM;YAC1B,CAAC,CAAC,iEAAiE;YACnE,CAAC,CAAC,mCAAmC,CAAC;IAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;IACrC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACjF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAMjC,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY;IAC3C,IAAI,KAAc,CAAC;IACnB,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;IACxF,CAAC;IAED,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,IAAI,KAAK,CAAC,EAAE,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IACD,MAAM,KAAK,GAAI,KAA6B,CAAC,KAAK,CAAC;IACnD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,MAAuB;IACrE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,gBAAgB,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAEnF,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACzD,MAAM,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC9B,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;YACjE,QAAQ,EAAE,MAAM;YAChB,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QACrC,MAAM,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;AACH,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,uGAAuG;AACvG,MAAM,CAAC,MAAM,YAAY,GAAG,0CAA0C,CAAC;AACvE,MAAM,CAAC,MAAM,wBAAwB,GAAG,gDAAgD,CAAC"}
package/dist/link.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"link.js","sourceRoot":"","sources":["../src/link.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAQ1C,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAY,EAAE,YAA8B;IAC1E,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IACxD,MAAM,WAAW,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAChD,YAAY,CAAC,MAAM,CAAC,yDAAyD,CAAC,CAAC;AACjF,CAAC"}