@sellable/install 0.1.778 → 0.1.780

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.
@@ -3,12 +3,12 @@ FROM ${HERMES_IMAGE}
3
3
 
4
4
  USER root
5
5
 
6
- ARG INSTALLER_PACKAGE=@sellable/install@0.1.778
6
+ ARG INSTALLER_PACKAGE=@sellable/install@0.1.780
7
7
  ARG MCP_PACKAGE=@sellable/mcp@0.1.947
8
8
  ARG INSTALLER_INTEGRITY
9
9
  ARG MCP_INTEGRITY=sha512-3/IoWRHWyTjdh7OjYHdYS+Na6v9TkYhGXKSYX4rYjhqm4b7MtyV2HaRlZVYKUv8afS1UzZcCUXUx7kqF/Mzk4A==
10
10
 
11
- RUN test "${INSTALLER_PACKAGE}" = "@sellable/install@0.1.778" \
11
+ RUN test "${INSTALLER_PACKAGE}" = "@sellable/install@0.1.780" \
12
12
  && test "${MCP_PACKAGE}" = "@sellable/mcp@0.1.947" \
13
13
  && test -n "${INSTALLER_INTEGRITY}" \
14
14
  && test "$(npm view "${INSTALLER_PACKAGE}" dist.integrity)" = "${INSTALLER_INTEGRITY}" \
@@ -23,9 +23,9 @@ RUN test "${INSTALLER_PACKAGE}" = "@sellable/install@0.1.778" \
23
23
  && mkdir -p /opt/sellable-agent/install-root /opt/sellable-agent/mcp-root \
24
24
  && npm install --prefix /opt/sellable-agent/install-root --omit=dev --ignore-scripts --no-audit --no-fund "${INSTALLER_PACKAGE}" \
25
25
  && npm install --prefix /opt/sellable-agent/mcp-root --omit=dev --ignore-scripts --no-audit --no-fund "${MCP_PACKAGE}" \
26
- && node --input-type=module -e "import { readFileSync } from 'node:fs'; const install = JSON.parse(readFileSync('/opt/sellable-agent/install-root/node_modules/@sellable/install/package.json')); const mcp = JSON.parse(readFileSync('/opt/sellable-agent/mcp-root/node_modules/@sellable/mcp/package.json')); if (install.name !== '@sellable/install' || install.version !== '0.1.778' || mcp.name !== '@sellable/mcp' || mcp.version !== '0.1.947') throw new Error('package identity rejected');" \
26
+ && node --input-type=module -e "import { readFileSync } from 'node:fs'; const install = JSON.parse(readFileSync('/opt/sellable-agent/install-root/node_modules/@sellable/install/package.json')); const mcp = JSON.parse(readFileSync('/opt/sellable-agent/mcp-root/node_modules/@sellable/mcp/package.json')); if (install.name !== '@sellable/install' || install.version !== '0.1.780' || mcp.name !== '@sellable/mcp' || mcp.version !== '0.1.947') throw new Error('package identity rejected');" \
27
27
  && node --input-type=module -e "import { buildExternalRuntimeClosure } from '/opt/sellable-agent/install-root/node_modules/@sellable/install/lib/sellable-agent/external-runtime-builder.mjs'; const built = buildExternalRuntimeClosure({ mcpPackageRoot: '/opt/sellable-agent/mcp-root/node_modules/@sellable/mcp', mcpNodeModulesRoot: '/opt/sellable-agent/mcp-root/node_modules', hermesSourceRoot: '/opt/hermes', ownerUid: 0, ownerGid: 0 }); if (!built.closureDigest) throw new Error('runtime closure rejected');" \
28
- && node --input-type=module -e "import { chmodSync, writeFileSync } from 'node:fs'; const release = { installerPackage: '@sellable/install@0.1.778', installerIntegrity: process.argv[1], mcpPackage: '@sellable/mcp@0.1.947', mcpIntegrity: process.argv[2] }; writeFileSync('/opt/sellable-agent/release.json', JSON.stringify(release) + '\\n', { mode: 0o444 }); chmodSync('/opt/sellable-agent/release.json', 0o444);" "${INSTALLER_INTEGRITY}" "${MCP_INTEGRITY}" \
28
+ && node --input-type=module -e "import { chmodSync, writeFileSync } from 'node:fs'; const release = { installerPackage: '@sellable/install@0.1.780', installerIntegrity: process.argv[1], mcpPackage: '@sellable/mcp@0.1.947', mcpIntegrity: process.argv[2] }; writeFileSync('/opt/sellable-agent/release.json', JSON.stringify(release) + '\\n', { mode: 0o444 }); chmodSync('/opt/sellable-agent/release.json', 0o444);" "${INSTALLER_INTEGRITY}" "${MCP_INTEGRITY}" \
29
29
  && npm cache clean --force
30
30
 
31
31
  COPY entrypoint.sh /usr/local/bin/sellable-agent-container-entrypoint
@@ -3,7 +3,7 @@
3
3
  This image is a dedicated Agent worker/runtime boundary beside an existing Hermes dashboard. It never replaces or reconfigures the dashboard container.
4
4
 
5
5
  Build from this directory after
6
- `@sellable/install@0.1.778` is
6
+ `@sellable/install@0.1.780` is
7
7
  published:
8
8
 
9
9
  ```sh
@@ -1225,7 +1225,7 @@ async function materializeAdminProfile({
1225
1225
  productConfigPath,
1226
1226
  // The pinned Admin installer validates this bootstrap template model.
1227
1227
  // installAdminModelConfig below replaces it with the managed model
1228
- // (currently GPT-6 Sol high) before promotion or gateway startup.
1228
+ // (currently GPT-6.1 Sol high) before promotion or gateway startup.
1229
1229
  model: "gpt-5.6-sol",
1230
1230
  reasoningEffort: "high",
1231
1231
  soul: stagedAuthority,
@@ -8,7 +8,7 @@ ENV PLAYWRIGHT_BROWSERS_PATH=/opt/hermes/.playwright
8
8
 
9
9
  ARG MCP_PACKAGE=@sellable/mcp@0.1.947
10
10
  ARG MCP_INTEGRITY=sha512-3/IoWRHWyTjdh7OjYHdYS+Na6v9TkYhGXKSYX4rYjhqm4b7MtyV2HaRlZVYKUv8afS1UzZcCUXUx7kqF/Mzk4A==
11
- ARG INSTALLER_PACKAGE=@sellable/install@0.1.778
11
+ ARG INSTALLER_PACKAGE=@sellable/install@0.1.780
12
12
  ARG ADMIN_MCP_PACKAGE=@sellable/admin-mcp@0.1.202
13
13
  ARG ADMIN_MCP_INTEGRITY=sha512-ym3aye/0vQ8tfULJlKz9JFOxvIQsl1G+n3np+TTgK/tecwNblBo/j3AkTnRqH9iomKzPbZzP+n4tEQsvsU8ByA==
14
14
  ARG TUS_JS_CLIENT_VERSION=4.3.1
@@ -123,7 +123,7 @@ const RUNTIME_GENERATION = Number(
123
123
  const BOOT_SESSION_ID = randomUUID();
124
124
  const HERMES_VERSION = process.env.SELLABLE_AGENT_HERMES_VERSION ?? "0.21.5";
125
125
  const INSTALLER_PACKAGE =
126
- process.env.SELLABLE_AGENT_INSTALLER_PACKAGE ?? "@sellable/install@0.1.778";
126
+ process.env.SELLABLE_AGENT_INSTALLER_PACKAGE ?? "@sellable/install@0.1.780";
127
127
  const MCP_PACKAGE =
128
128
  process.env.SELLABLE_AGENT_MCP_PACKAGE ?? "@sellable/mcp@0.1.947";
129
129
  export const ENDPOINT_MAX_CONCURRENT_RUNS = 10;
@@ -141,7 +141,6 @@ export const HERMES_CUSTOMER_PROGRAM_CRONS = Object.freeze([
141
141
  // single weekday tick is enough and a missed one is harmless.
142
142
  export const HERMES_REFILL_SENDS_CRON = Object.freeze({
143
143
  name: "sellable-default-refill-sends",
144
- schedule: "0 14 * * 1-5",
145
144
  deliver: "local",
146
145
  skills: Object.freeze(["sellable-refill-sends"]),
147
146
  enabledToolsets: Object.freeze(["safe", "sellable", "mcp"]),
@@ -1953,11 +1952,17 @@ function opportunitySequenceIdentity(profileRoot) {
1953
1952
  );
1954
1953
  }
1955
1954
 
1955
+ // Weekdays between 14:00 and 14:49 UTC, one stable minute per agent: every agent
1956
+ // starting refill at 14:00:00 crowded the product's database pool (Sep 30).
1957
+ export function refillSendsSchedule(profileId) {
1958
+ const minute = parseInt(sha256(profileId).slice(0, 8), 16) % 50;
1959
+ return `${minute} 14 * * 1-5`;
1960
+ }
1961
+
1956
1962
  function refillSendsPrompt(workspaceId) {
1957
1963
  return [
1958
1964
  "Run the installed refill-sends skill with --yolo for this workspace.",
1959
1965
  "Call refill_v3_advance with yolo true and scope {kind: sender_local_horizon, days: 2}, then continue exactly as the skill says until the run is complete, awaiting an external change, or blocked.",
1960
- "Budget: make at most five refill_v3_advance calls, then stop even if the run is not complete; the next weekday run continues.",
1961
1966
  "Post nothing: reply [SILENT] whatever the outcome. The daily review names anything only the customer can fix, and the next results update reports what was added.",
1962
1967
  `workspaceId: ${workspaceId}`,
1963
1968
  ].join("\n");
@@ -1981,6 +1986,7 @@ export async function ensureHermesRefillSendsCron({
1981
1986
  try {
1982
1987
  const cron = HERMES_REFILL_SENDS_CRON;
1983
1988
  const prompt = refillSendsPrompt(workspaceId);
1989
+ const schedule = refillSendsSchedule(profileId);
1984
1990
  const expected = (job) =>
1985
1991
  Boolean(
1986
1992
  job?.id &&
@@ -1992,7 +1998,7 @@ export async function ensureHermesRefillSendsCron({
1992
1998
  sameJson(job.skills, cron.skills) &&
1993
1999
  sameJson(job.enabled_toolsets, cron.enabledToolsets) &&
1994
2000
  job.schedule?.kind === "cron" &&
1995
- job.schedule?.expr === cron.schedule
2001
+ job.schedule?.expr === schedule
1996
2002
  );
1997
2003
  const mutate = (jobId = null) =>
1998
2004
  childRunner(runChild)({
@@ -2002,7 +2008,7 @@ export async function ensureHermesRefillSendsCron({
2002
2008
  OPPORTUNITY_SEQUENCE_CRON_PYTHON,
2003
2009
  JSON.stringify({
2004
2010
  prompt,
2005
- schedule: cron.schedule,
2011
+ schedule,
2006
2012
  name: cron.name,
2007
2013
  deliver: cron.deliver,
2008
2014
  skills: [...cron.skills],
@@ -38,7 +38,7 @@ import { installAgentHostServices } from "./service-installer.mjs";
38
38
  const PACKAGE_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "../..");
39
39
  const VERSION = "sellable-agent-host-bootstrap/v1";
40
40
  const RECEIPT_VERSION = "sellable-agent-host-registration/v1";
41
- const INSTALLER_PACKAGE = "@sellable/install@0.1.778";
41
+ const INSTALLER_PACKAGE = "@sellable/install@0.1.780";
42
42
  const MCP_PACKAGE = "@sellable/mcp@0.1.947";
43
43
  const HERMES_VERSION = "0.18.0";
44
44
  const SHA256 = /^[a-f0-9]{64}$/;
@@ -1546,7 +1546,7 @@ export function compileClaimToProfileDesired(activeClaim, config) {
1546
1546
  ]) ||
1547
1547
  pinned.hermesCli !== "hermes" ||
1548
1548
  pinned.hermesVersion !== "0.18.0" ||
1549
- pinned.installerPackage !== "@sellable/install@0.1.778" ||
1549
+ pinned.installerPackage !== "@sellable/install@0.1.780" ||
1550
1550
  pinned.mcpPackage !== "@sellable/mcp@0.1.947" ||
1551
1551
  !Array.isArray(policy.toolInclude) ||
1552
1552
  policy.toolInclude.length === 0 ||
@@ -19,7 +19,7 @@ export const MODEL_AUTH_LEGACY_READBACK_SCHEMA =
19
19
  "sellable-agent-model-auth-readback/v2";
20
20
  export const MODEL_AUTH_MINIMUM_VALIDITY_MS = 20 * 60 * 1000;
21
21
  export const MODEL_AUTH_PROVIDER = "openai-codex";
22
- export const MODEL_AUTH_DEFAULT_MODEL = "gpt-6-sol";
22
+ export const MODEL_AUTH_DEFAULT_MODEL = "gpt-6.1-sol";
23
23
  export const MODEL_AUTH_REASONING_EFFORT = "high";
24
24
 
25
25
  const LEGACY_MARKER_VERSION = 2;
@@ -312,7 +312,7 @@ function validateDesired(desired) {
312
312
  desired.serviceCredentialGeneration < 1 ||
313
313
  desired.hermesCli !== "hermes" ||
314
314
  desired.hermesVersion !== "0.18.0" ||
315
- desired.installerPackage !== "@sellable/install@0.1.778" ||
315
+ desired.installerPackage !== "@sellable/install@0.1.780" ||
316
316
  desired.mcpPackage !== "@sellable/mcp@0.1.947" ||
317
317
  !Array.isArray(desired.toolInclude) ||
318
318
  desired.toolInclude.length === 0 ||
@@ -25,7 +25,7 @@ import { fileURLToPath } from "node:url";
25
25
  import { deriveContainedProfileId } from "./profile-materializer.mjs";
26
26
 
27
27
  export const PROVISIONING_ACTION = "PROVISION_HERMES_PROFILE";
28
- export const PINNED_INSTALL_PACKAGE = "@sellable/install@0.1.778";
28
+ export const PINNED_INSTALL_PACKAGE = "@sellable/install@0.1.780";
29
29
  export const PINNED_MCP_PACKAGE = "@sellable/mcp@0.1.947";
30
30
  const PINNED_INSTALL_VERSION = PINNED_INSTALL_PACKAGE.slice(
31
31
  PINNED_INSTALL_PACKAGE.lastIndexOf("@") + 1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/install",
3
- "version": "0.1.778",
3
+ "version": "0.1.780",
4
4
  "type": "module",
5
5
  "description": "One-command installer for Sellable MCP in Claude Code, Codex, and Hermes",
6
6
  "bin": {