@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.
- package/container/Dockerfile +4 -4
- package/container/README.md +1 -1
- package/lib/sellable-agent/fly-admin-image/admin-runtime.mjs +1 -1
- package/lib/sellable-agent/fly-customer-image/Dockerfile +1 -1
- package/lib/sellable-agent/fly-customer-image/customer-runtime.mjs +1 -1
- package/lib/sellable-agent/hermes-memory-snapshot.mjs +10 -4
- package/lib/sellable-agent/host-bootstrap.mjs +1 -1
- package/lib/sellable-agent/host-worker.mjs +1 -1
- package/lib/sellable-agent/model-auth-reconciler.mjs +1 -1
- package/lib/sellable-agent/profile-materializer.mjs +1 -1
- package/lib/sellable-agent/provisioning-adapter.mjs +1 -1
- package/package.json +1 -1
package/container/Dockerfile
CHANGED
|
@@ -3,12 +3,12 @@ FROM ${HERMES_IMAGE}
|
|
|
3
3
|
|
|
4
4
|
USER root
|
|
5
5
|
|
|
6
|
-
ARG INSTALLER_PACKAGE=@sellable/install@0.1.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
package/container/README.md
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
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 ===
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|