@mrrlin-dev/mcp 0.4.121 → 0.4.123

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.
Files changed (2) hide show
  1. package/dist/bin.cjs +47 -5
  2. package/package.json +1 -1
package/dist/bin.cjs CHANGED
@@ -39070,7 +39070,25 @@ var mrrlinProjectRenameSchema = external_exports.object({
39070
39070
  intentJudgeEnabled: external_exports.boolean().optional(),
39071
39071
  clientName: external_exports.string().trim().max(80).nullable().optional(),
39072
39072
  scopeDescription: external_exports.string().trim().max(240).nullable().optional(),
39073
- codeHost: mrrlinProjectCodeHostSchema.nullable().optional()
39073
+ codeHost: mrrlinProjectCodeHostSchema.nullable().optional(),
39074
+ // local-git-delivery: compare-and-set for codeHost. When true, codeHost is written only while the
39075
+ // stored value is still null, in one conditional UPDATE, so a background writer (the bridge applying
39076
+ // an answered code-host question) can never overwrite a host the operator chose meanwhile.
39077
+ codeHostOnlyIfUnset: external_exports.boolean().optional()
39078
+ }).superRefine((value, ctx) => {
39079
+ if (!value.codeHostOnlyIfUnset)
39080
+ return;
39081
+ const others = ["displayName", "intentJudgeEnabled", "clientName", "scopeDescription"].filter((key) => value[key] !== void 0);
39082
+ if (others.length > 0) {
39083
+ ctx.addIssue({
39084
+ code: external_exports.ZodIssueCode.custom,
39085
+ path: ["codeHostOnlyIfUnset"],
39086
+ message: `codeHostOnlyIfUnset updates codeHost alone; also sent: ${others.join(", ")}`
39087
+ });
39088
+ }
39089
+ if (value.codeHost === void 0 || value.codeHost === null) {
39090
+ ctx.addIssue({ code: external_exports.ZodIssueCode.custom, path: ["codeHost"], message: "codeHostOnlyIfUnset requires a non-null codeHost" });
39091
+ }
39074
39092
  });
39075
39093
  var ONBOARDING_KICKOFF_TRANSITIONS = [
39076
39094
  { from: null, to: "pending" },
@@ -62102,7 +62120,7 @@ Do NOT derail the current task - if the operator has an in-flight question, answ
62102
62120
  }
62103
62121
 
62104
62122
  // src/_generated/version.ts
62105
- var PKG_VERSION = "0.4.121";
62123
+ var PKG_VERSION = "0.4.123";
62106
62124
 
62107
62125
  // src/receipt-signing.ts
62108
62126
  var import_node_crypto13 = __toESM(require("node:crypto"), 1);
@@ -66503,7 +66521,7 @@ async function assertRunCompletionReady(deps, projectSlug, taskId, runId, allowe
66503
66521
  if (!allowedStatuses.has(task.status)) {
66504
66522
  return {
66505
66523
  ok: false,
66506
- reason: `Codex turn completed but task ${task.id} remained in status ${task.status}.`,
66524
+ reason: `Agent turn completed but task ${task.id} remained in status ${task.status}.`,
66507
66525
  task
66508
66526
  };
66509
66527
  }
@@ -66520,7 +66538,7 @@ async function assertRunCompletionReady(deps, projectSlug, taskId, runId, allowe
66520
66538
  if (!hasEvidence) {
66521
66539
  return {
66522
66540
  ok: false,
66523
- reason: `Codex turn completed and task ${task.id} closed, but task lineage for run ${runId} has no durable completion evidence artifact.`,
66541
+ reason: `Agent turn completed and task ${task.id} closed, but task lineage for run ${runId} has no durable completion evidence artifact.`,
66524
66542
  task
66525
66543
  };
66526
66544
  }
@@ -68064,7 +68082,7 @@ async function askCodeHostOnce(deps, projectSlug, taskId) {
68064
68082
  try {
68065
68083
  const snapshot = await deps.client.getProjectSnapshot(projectSlug);
68066
68084
  if (snapshot.project.codeHost != null) return;
68067
- await deps.client.createInboxItem(projectSlug, {
68085
+ const item = await deps.client.createInboxItem(projectSlug, {
68068
68086
  id: codeHostQuestionId(projectSlug),
68069
68087
  kind: "question",
68070
68088
  taskId,
@@ -68075,6 +68093,30 @@ async function askCodeHostOnce(deps, projectSlug, taskId) {
68075
68093
  { label: "Also put it on GitLab", answer: "gitlab", description: "You will be asked to connect GitLab." }
68076
68094
  ]
68077
68095
  });
68096
+ if (item?.answer === "github" || item?.answer === "gitlab") {
68097
+ const host = item.answer === "github" ? "GitHub" : "GitLab";
68098
+ await deps.client.createInboxItem(projectSlug, {
68099
+ id: `${codeHostQuestionId(projectSlug)}-connect`,
68100
+ kind: "info",
68101
+ // Project-scoped on purpose: closing a task acknowledges that task's pending info items, which
68102
+ // would hide this note before the operator saw it (and its stable id prevents re-filing).
68103
+ body: `You asked for this project's code to also go to ${host}. Until ${host} is connected, code keeps being saved only on this computer. Connect it in Settings \u2192 Integrations, or ask the Director to help you connect ${host}.`
68104
+ });
68105
+ return;
68106
+ }
68107
+ if (item?.answer === "local") {
68108
+ try {
68109
+ await deps.client.renameProject(projectSlug, { codeHost: "local", codeHostOnlyIfUnset: true });
68110
+ } catch (error51) {
68111
+ console.warn(
68112
+ JSON.stringify({
68113
+ event: "code_host_answer_apply_failed",
68114
+ projectSlug,
68115
+ error: error51 instanceof Error ? error51.message : String(error51)
68116
+ })
68117
+ );
68118
+ }
68119
+ }
68078
68120
  } catch {
68079
68121
  }
68080
68122
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mrrlin-dev/mcp",
3
- "version": "0.4.121",
3
+ "version": "0.4.123",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "mrrlin-mcp": "dist/bin.cjs"