@somacheck/vibecheck 0.1.1 → 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,59 +1,222 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
2
  import { z } from "zod";
3
- import { performVibecheck } from "./vibecheck.js";
4
- const outcomeSchema = {
5
- verdict: z.enum(["aligned", "unaligned", "inconclusive"]),
6
- confidence: z.number(),
7
- latency_s: z.number(),
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
+ });
16
+ const statusSchema = {
17
+ linked: z.literal(true),
18
+ no_prior_requests: z.boolean(),
19
+ prior_request_count: z.number().int(),
20
+ has_pending_request: z.boolean(),
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,
27
+ recommended_action: z.string(),
28
+ copy_guidance: z.object({ policy: z.string(), framing: z.string(), fallback: z.string() }),
8
29
  };
30
+ const createdPropositionSchema = z.object({
31
+ request_id: z.string(),
32
+ presentation_state: z.enum(["presented", "queued"]),
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
+ };
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) };
51
+ const SERVER_INSTRUCTIONS = [
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.",
60
+ ].join(" ");
9
61
  export function createVibecheckServer(dependencies) {
10
- const server = new McpServer({ name: "@somacheck/vibecheck", version: "0.1.0" });
11
- server.registerTool("vibecheck", {
12
- title: "Vibecheck",
13
- description: "Ask the person for an embodied answer right now. Blocks while SomaCheck waits for their next wrist gesture.",
14
- inputSchema: {
15
- question: z.string().optional().describe("The question to ask the person."),
16
- timeout_s: z.number().positive().default(120).describe("How long to wait for a gesture, in seconds."),
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,
17
73
  },
18
- outputSchema: outcomeSchema,
19
- }, async ({ question, timeout_s }) => {
20
- const startedAt = dependencies.now?.() ?? Date.now();
74
+ }, async () => {
21
75
  try {
22
76
  const token = await dependencies.loadToken();
23
- const run = await performVibecheck({
24
- api: dependencies.api,
25
- token,
26
- ...(question === undefined ? {} : { question }),
27
- timeoutSeconds: timeout_s,
28
- ...(dependencies.now === undefined ? {} : { now: dependencies.now }),
29
- ...(dependencies.sleep === undefined ? {} : { sleep: dependencies.sleep }),
30
- });
31
- const structuredContent = { ...run.outcome };
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
+ });
90
+ server.registerTool("get_vibecheck_status", {
91
+ title: "Vibecheck Status",
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.",
93
+ inputSchema: {},
94
+ outputSchema: statusSchema,
95
+ annotations: {
96
+ readOnlyHint: true,
97
+ destructiveHint: false,
98
+ idempotentHint: true,
99
+ openWorldHint: false,
100
+ },
101
+ }, async () => {
102
+ try {
103
+ const token = await dependencies.loadToken();
104
+ const status = await dependencies.api.statusRequest(token);
32
105
  return {
33
- content: [{ type: "text", text: run.message }],
34
- structuredContent,
106
+ content: [{ type: "text", text: summarise(status) }],
107
+ structuredContent: { ...status },
35
108
  };
36
109
  }
37
- catch {
38
- const endedAt = dependencies.now?.() ?? Date.now();
39
- const latencySeconds = Math.max(0, (endedAt - startedAt) / 1_000);
40
- const outcome = {
41
- verdict: "inconclusive",
42
- confidence: 0,
43
- latency_s: latencySeconds,
44
- };
110
+ catch (error) {
111
+ return failureMessage("read SomaCheck status", error);
112
+ }
113
+ });
114
+ server.registerTool("post_vibecheck_statement", {
115
+ title: "Post Vibecheck Statement",
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.",
117
+ inputSchema: {
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,
127
+ },
128
+ }, async ({ statements }) => {
129
+ try {
130
+ const token = await dependencies.loadToken();
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;
45
134
  return {
46
- isError: true,
47
- content: [
48
- {
49
- type: "text",
50
- text: "Vibecheck could not complete. Check your link and try again.",
51
- },
52
- ],
53
- structuredContent: outcome,
135
+ content: [{ type: "text", text: `Added ${created.length}: ${presented} presented, ${queued} cached.` }],
136
+ structuredContent: { propositions: created },
54
137
  };
55
138
  }
139
+ catch (error) {
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));
143
+ }
144
+ });
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.",
148
+ inputSchema: {
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,
157
+ },
158
+ }, async ({ request_id }) => {
159
+ try {
160
+ const token = await dependencies.loadToken();
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 };
171
+ }
172
+ catch (error) {
173
+ return failureMessage("read that SomaCheck result", error);
174
+ }
56
175
  });
57
176
  return server;
58
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
+ }
59
222
  //# sourceMappingURL=server.js.map
package/dist/vibecheck.js CHANGED
@@ -1,51 +1,7 @@
1
- const POLL_INTERVAL_MS = 2_000;
2
- const defaultSleep = async (milliseconds) => {
3
- await new Promise((resolve) => setTimeout(resolve, milliseconds));
4
- };
5
- export async function performVibecheck(options) {
6
- const timeoutSeconds = options.timeoutSeconds ?? 120;
7
- if (!Number.isFinite(timeoutSeconds) || timeoutSeconds <= 0) {
8
- throw new Error("timeout_s must be a positive number.");
1
+ export class StatementPendingError extends Error {
2
+ constructor() {
3
+ super("A statement is already pending.");
4
+ this.name = "StatementPendingError";
9
5
  }
10
- const now = options.now ?? Date.now;
11
- const sleep = options.sleep ?? defaultSleep;
12
- const calledAt = now();
13
- const deadline = calledAt + timeoutSeconds * 1_000;
14
- const requestId = await options.api.createRequest(options.token, options.question?.trim() || null);
15
- while (now() < deadline) {
16
- const waitMilliseconds = Math.min(POLL_INTERVAL_MS, deadline - now());
17
- await sleep(waitMilliseconds);
18
- // Always poll after sleeping, including the window that ends exactly on the
19
- // deadline. Breaking out before this poll loses a gesture that landed during
20
- // the final wait -- the answer is already recorded, so reporting it
21
- // inconclusive would be wrong.
22
- const response = await options.api.pollRequest(options.token, requestId);
23
- if (response.status === "pending") {
24
- continue;
25
- }
26
- if (response.status === "answered") {
27
- if (response.verdict === null || response.confidence === null || response.latency_s === null) {
28
- throw new Error("SomaCheck returned an incomplete answer.");
29
- }
30
- const outcome = {
31
- verdict: response.verdict,
32
- confidence: response.confidence,
33
- latency_s: response.latency_s,
34
- };
35
- return {
36
- outcome,
37
- message: `Your embodied answer is ${outcome.verdict} (${Math.round(outcome.confidence * 100)}% confidence, ${outcome.latency_s}s).`,
38
- };
39
- }
40
- const elapsedSeconds = (now() - calledAt) / 1_000;
41
- return {
42
- outcome: { verdict: "inconclusive", confidence: 0, latency_s: elapsedSeconds },
43
- message: `The vibecheck request ${response.status}. Open SomaCheck and try again.`,
44
- };
45
- }
46
- return {
47
- outcome: { verdict: "inconclusive", confidence: 0, latency_s: timeoutSeconds },
48
- message: `No gesture arrived within ${timeoutSeconds} seconds. Open SomaCheck and try again.`,
49
- };
50
6
  }
51
7
  //# sourceMappingURL=vibecheck.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@somacheck/vibecheck",
3
- "version": "0.1.1",
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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"vibecheck.js","sourceRoot":"","sources":["../src/vibecheck.ts"],"names":[],"mappings":"AAmCA,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAE/B,MAAM,YAAY,GAAG,KAAK,EAAE,YAAoB,EAAiB,EAAE;IACjE,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;AAC1E,CAAC,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAyB;IAC9D,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,GAAG,CAAC;IACrD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,cAAc,IAAI,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACpC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,YAAY,CAAC;IAC5C,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC;IACvB,MAAM,QAAQ,GAAG,QAAQ,GAAG,cAAc,GAAG,KAAK,CAAC;IACnD,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,CAAC;IAEnG,OAAO,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QACxB,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,QAAQ,GAAG,GAAG,EAAE,CAAC,CAAC;QACtE,MAAM,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAE9B,4EAA4E;QAC5E,6EAA6E;QAC7E,oEAAoE;QACpE,+BAA+B;QAC/B,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACzE,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAClC,SAAS;QACX,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACnC,IAAI,QAAQ,CAAC,OAAO,KAAK,IAAI,IAAI,QAAQ,CAAC,UAAU,KAAK,IAAI,IAAI,QAAQ,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;gBAC7F,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;YAC9D,CAAC;YACD,MAAM,OAAO,GAAG;gBACd,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,SAAS,EAAE,QAAQ,CAAC,SAAS;aACH,CAAC;YAC7B,OAAO;gBACL,OAAO;gBACP,OAAO,EAAE,2BAA2B,OAAO,CAAC,OAAO,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,GAAG,GAAG,CAAC,iBAAiB,OAAO,CAAC,SAAS,KAAK;aACpI,CAAC;QACJ,CAAC;QAED,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,GAAG,KAAK,CAAC;QAClD,OAAO;YACL,OAAO,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE;YAC9E,OAAO,EAAE,yBAAyB,QAAQ,CAAC,MAAM,iCAAiC;SACnF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE;QAC9E,OAAO,EAAE,6BAA6B,cAAc,yCAAyC;KAC9F,CAAC;AACJ,CAAC"}