@somacheck/vibecheck 0.1.1 → 0.2.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/dist/api.js +112 -1
- package/dist/api.js.map +1 -1
- package/dist/server.js +148 -5
- package/dist/server.js.map +1 -1
- package/dist/vibecheck.js +20 -1
- package/dist/vibecheck.js.map +1 -1
- package/package.json +1 -1
package/dist/api.js
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
import { BackendTooOldError, StatementPendingError } from "./vibecheck.js";
|
|
2
|
+
/**
|
|
3
|
+
* Marker raised by somacheck_engine.agent_request_create when rule 1 refuses a
|
|
4
|
+
* second statement. PostgREST maps the SQLSTATE (PT409) onto HTTP 409; the
|
|
5
|
+
* marker is the fallback for any hop that flattens the status.
|
|
6
|
+
*/
|
|
7
|
+
const STATEMENT_PENDING_MARKER = "SC_VC_STATEMENT_PENDING";
|
|
1
8
|
const STATUSES = new Set(["pending", "answered", "expired", "cancelled"]);
|
|
2
9
|
const VERDICTS = new Set(["aligned", "unaligned", "inconclusive"]);
|
|
3
10
|
function firstRow(value) {
|
|
@@ -14,6 +21,97 @@ function requiredString(row, key) {
|
|
|
14
21
|
}
|
|
15
22
|
return value;
|
|
16
23
|
}
|
|
24
|
+
function asObject(value) {
|
|
25
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
26
|
+
throw new Error("SomaCheck returned an unexpected response.");
|
|
27
|
+
}
|
|
28
|
+
return value;
|
|
29
|
+
}
|
|
30
|
+
function asBoolean(row, key) {
|
|
31
|
+
const value = row[key];
|
|
32
|
+
if (typeof value !== "boolean") {
|
|
33
|
+
throw new Error("SomaCheck returned an incomplete response.");
|
|
34
|
+
}
|
|
35
|
+
return value;
|
|
36
|
+
}
|
|
37
|
+
function asInteger(row, key) {
|
|
38
|
+
const value = row[key];
|
|
39
|
+
if (typeof value !== "number" || !Number.isFinite(value) || !Number.isInteger(value)) {
|
|
40
|
+
throw new Error("SomaCheck returned an incomplete response.");
|
|
41
|
+
}
|
|
42
|
+
return value;
|
|
43
|
+
}
|
|
44
|
+
function asNumber(row, key) {
|
|
45
|
+
const value = row[key];
|
|
46
|
+
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
47
|
+
throw new Error("SomaCheck returned an incomplete response.");
|
|
48
|
+
}
|
|
49
|
+
return value;
|
|
50
|
+
}
|
|
51
|
+
function nullableString(row, key) {
|
|
52
|
+
const value = row[key];
|
|
53
|
+
if (value === null || value === undefined) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
if (typeof value !== "string") {
|
|
57
|
+
throw new Error("SomaCheck returned an incomplete response.");
|
|
58
|
+
}
|
|
59
|
+
return value;
|
|
60
|
+
}
|
|
61
|
+
function parseCadence(value) {
|
|
62
|
+
// A backend that has not had the cadence migration applied returns the
|
|
63
|
+
// first-run keys and nothing else. Say so precisely: reporting it as a link
|
|
64
|
+
// failure sends the user off re-pairing a link that is perfectly fine.
|
|
65
|
+
if (value === undefined || value === null) {
|
|
66
|
+
throw new BackendTooOldError();
|
|
67
|
+
}
|
|
68
|
+
const row = asObject(value);
|
|
69
|
+
const blocking = row.blocking_request;
|
|
70
|
+
let blockingRequest = null;
|
|
71
|
+
if (blocking !== null && blocking !== undefined) {
|
|
72
|
+
const parsed = asObject(blocking);
|
|
73
|
+
blockingRequest = {
|
|
74
|
+
id: requiredString(parsed, "id"),
|
|
75
|
+
created_at: requiredString(parsed, "created_at"),
|
|
76
|
+
age_seconds: asNumber(parsed, "age_seconds"),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
as_of: requiredString(row, "as_of"),
|
|
81
|
+
may_create_now: asBoolean(row, "may_create_now"),
|
|
82
|
+
reason: requiredString(row, "reason"),
|
|
83
|
+
blocking_request: blockingRequest,
|
|
84
|
+
last_answered_at: nullableString(row, "last_answered_at"),
|
|
85
|
+
create_due_at: nullableString(row, "create_due_at"),
|
|
86
|
+
create_overdue: asBoolean(row, "create_overdue"),
|
|
87
|
+
stale_after_hours: asNumber(row, "stale_after_hours"),
|
|
88
|
+
followup_within_hours: asNumber(row, "followup_within_hours"),
|
|
89
|
+
guidance: requiredString(row, "guidance"),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
function parseStatusResponse(row) {
|
|
93
|
+
const firstRunIntro = asObject(row.first_run_intro);
|
|
94
|
+
const copyGuidance = asObject(row.copy_guidance);
|
|
95
|
+
const policy = copyGuidance.policy;
|
|
96
|
+
const framing = copyGuidance.framing;
|
|
97
|
+
const fallback = copyGuidance.fallback;
|
|
98
|
+
if (typeof policy !== "string" || typeof framing !== "string" || typeof fallback !== "string") {
|
|
99
|
+
throw new Error("SomaCheck returned an incomplete response.");
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
linked: true,
|
|
103
|
+
no_prior_requests: asBoolean(row, "no_prior_requests"),
|
|
104
|
+
prior_request_count: asInteger(row, "prior_request_count"),
|
|
105
|
+
has_pending_request: asBoolean(row, "has_pending_request"),
|
|
106
|
+
first_run_intro: {
|
|
107
|
+
eligible: asBoolean(firstRunIntro, "eligible"),
|
|
108
|
+
should_offer_now: asBoolean(firstRunIntro, "should_offer_now"),
|
|
109
|
+
},
|
|
110
|
+
cadence: parseCadence(row.cadence),
|
|
111
|
+
recommended_action: requiredString(row, "recommended_action"),
|
|
112
|
+
copy_guidance: { policy, framing, fallback },
|
|
113
|
+
};
|
|
114
|
+
}
|
|
17
115
|
export class SupabaseAgentApi {
|
|
18
116
|
#endpoint;
|
|
19
117
|
#apiKey;
|
|
@@ -29,7 +127,12 @@ export class SupabaseAgentApi {
|
|
|
29
127
|
}
|
|
30
128
|
async createRequest(token, question) {
|
|
31
129
|
const row = await this.#rpc("agent_request_create", { token, question });
|
|
32
|
-
return
|
|
130
|
+
return {
|
|
131
|
+
request_id: requiredString(row, "request_id"),
|
|
132
|
+
// Absent until the cadence migration is applied; the caller treats a null
|
|
133
|
+
// stale_at as "unknown", never as "never goes stale".
|
|
134
|
+
stale_at: nullableString(row, "expires_at"),
|
|
135
|
+
};
|
|
33
136
|
}
|
|
34
137
|
async pollRequest(token, requestId) {
|
|
35
138
|
const row = await this.#rpc("agent_request_poll", { token, request_id: requestId });
|
|
@@ -56,6 +159,10 @@ export class SupabaseAgentApi {
|
|
|
56
159
|
latency_s: latency,
|
|
57
160
|
};
|
|
58
161
|
}
|
|
162
|
+
async statusRequest(token) {
|
|
163
|
+
const row = await this.#rpc("agent_request_status", { token });
|
|
164
|
+
return parseStatusResponse(row);
|
|
165
|
+
}
|
|
59
166
|
async #rpc(name, body) {
|
|
60
167
|
const response = await this.#fetch(`${this.#endpoint}/rest/v1/rpc/${name}`, {
|
|
61
168
|
method: "POST",
|
|
@@ -69,6 +176,10 @@ export class SupabaseAgentApi {
|
|
|
69
176
|
body: JSON.stringify(body),
|
|
70
177
|
});
|
|
71
178
|
if (!response.ok) {
|
|
179
|
+
const body = await response.text().catch(() => "");
|
|
180
|
+
if (response.status === 409 || body.includes(STATEMENT_PENDING_MARKER)) {
|
|
181
|
+
throw new StatementPendingError();
|
|
182
|
+
}
|
|
72
183
|
throw new Error(`SomaCheck request failed (HTTP ${response.status}).`);
|
|
73
184
|
}
|
|
74
185
|
try {
|
package/dist/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
package/dist/server.js
CHANGED
|
@@ -1,16 +1,157 @@
|
|
|
1
1
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
import { z } from "zod";
|
|
3
|
-
import { performVibecheck } from "./vibecheck.js";
|
|
3
|
+
import { BackendTooOldError, performVibecheck, StatementPendingError } from "./vibecheck.js";
|
|
4
4
|
const outcomeSchema = {
|
|
5
5
|
verdict: z.enum(["aligned", "unaligned", "inconclusive"]),
|
|
6
6
|
confidence: z.number(),
|
|
7
7
|
latency_s: z.number(),
|
|
8
8
|
};
|
|
9
|
+
const statusSchema = {
|
|
10
|
+
linked: z.literal(true),
|
|
11
|
+
no_prior_requests: z.boolean(),
|
|
12
|
+
prior_request_count: z.number().int(),
|
|
13
|
+
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
|
+
}),
|
|
32
|
+
recommended_action: z.string(),
|
|
33
|
+
copy_guidance: z.object({
|
|
34
|
+
policy: z.string(),
|
|
35
|
+
framing: z.string(),
|
|
36
|
+
fallback: z.string(),
|
|
37
|
+
}),
|
|
38
|
+
};
|
|
39
|
+
const postStatementSchema = {
|
|
40
|
+
request_id: z.string(),
|
|
41
|
+
stale_at: z.string().nullable(),
|
|
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.
|
|
70
|
+
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.",
|
|
80
|
+
].join(" ");
|
|
9
81
|
export function createVibecheckServer(dependencies) {
|
|
10
|
-
const server = new McpServer({ name: "@somacheck/vibecheck", version: "0.
|
|
82
|
+
const server = new McpServer({ name: "@somacheck/vibecheck", version: "0.2.0" }, { instructions: SERVER_INSTRUCTIONS });
|
|
83
|
+
server.registerTool("get_vibecheck_status", {
|
|
84
|
+
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.",
|
|
86
|
+
inputSchema: {},
|
|
87
|
+
outputSchema: statusSchema,
|
|
88
|
+
}, async () => {
|
|
89
|
+
try {
|
|
90
|
+
const token = await dependencies.loadToken();
|
|
91
|
+
const status = await dependencies.api.statusRequest(token);
|
|
92
|
+
return {
|
|
93
|
+
content: [{ type: "text", text: summarise(status) }],
|
|
94
|
+
structuredContent: { ...status },
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
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
|
+
};
|
|
109
|
+
}
|
|
110
|
+
});
|
|
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
|
+
server.registerTool("post_vibecheck_statement", {
|
|
117
|
+
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.",
|
|
119
|
+
inputSchema: {
|
|
120
|
+
statement: z.string().min(1).describe("The statement for the person to test."),
|
|
121
|
+
},
|
|
122
|
+
outputSchema: postStatementSchema,
|
|
123
|
+
}, async ({ statement }) => {
|
|
124
|
+
try {
|
|
125
|
+
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}.`;
|
|
128
|
+
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 },
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
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
|
+
};
|
|
150
|
+
}
|
|
151
|
+
});
|
|
11
152
|
server.registerTool("vibecheck", {
|
|
12
153
|
title: "Vibecheck",
|
|
13
|
-
description: "Ask the person for an embodied answer right now. Blocks while SomaCheck waits for their next wrist gesture.",
|
|
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.",
|
|
14
155
|
inputSchema: {
|
|
15
156
|
question: z.string().optional().describe("The question to ask the person."),
|
|
16
157
|
timeout_s: z.number().positive().default(120).describe("How long to wait for a gesture, in seconds."),
|
|
@@ -34,7 +175,7 @@ export function createVibecheckServer(dependencies) {
|
|
|
34
175
|
structuredContent,
|
|
35
176
|
};
|
|
36
177
|
}
|
|
37
|
-
catch {
|
|
178
|
+
catch (error) {
|
|
38
179
|
const endedAt = dependencies.now?.() ?? Date.now();
|
|
39
180
|
const latencySeconds = Math.max(0, (endedAt - startedAt) / 1_000);
|
|
40
181
|
const outcome = {
|
|
@@ -47,7 +188,9 @@ export function createVibecheckServer(dependencies) {
|
|
|
47
188
|
content: [
|
|
48
189
|
{
|
|
49
190
|
type: "text",
|
|
50
|
-
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.",
|
|
51
194
|
},
|
|
52
195
|
],
|
|
53
196
|
structuredContent: outcome,
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/vibecheck.js
CHANGED
|
@@ -1,3 +1,21 @@
|
|
|
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
|
+
export class StatementPendingError extends Error {
|
|
14
|
+
constructor() {
|
|
15
|
+
super("A statement is already waiting for this person.");
|
|
16
|
+
this.name = "StatementPendingError";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
1
19
|
const POLL_INTERVAL_MS = 2_000;
|
|
2
20
|
const defaultSleep = async (milliseconds) => {
|
|
3
21
|
await new Promise((resolve) => setTimeout(resolve, milliseconds));
|
|
@@ -11,7 +29,8 @@ export async function performVibecheck(options) {
|
|
|
11
29
|
const sleep = options.sleep ?? defaultSleep;
|
|
12
30
|
const calledAt = now();
|
|
13
31
|
const deadline = calledAt + timeoutSeconds * 1_000;
|
|
14
|
-
const
|
|
32
|
+
const created = await options.api.createRequest(options.token, options.question?.trim() || null);
|
|
33
|
+
const requestId = created.request_id;
|
|
15
34
|
while (now() < deadline) {
|
|
16
35
|
const waitMilliseconds = Math.min(POLL_INTERVAL_MS, deadline - now());
|
|
17
36
|
await sleep(waitMilliseconds);
|
package/dist/vibecheck.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vibecheck.js","sourceRoot":"","sources":["../src/vibecheck.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"vibecheck.js","sourceRoot":"","sources":["../src/vibecheck.ts"],"names":[],"mappings":"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"}
|