@sellable/install 0.1.408 → 0.1.410-wip.phase112015.boot-session.20260724150835

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.408
6
+ ARG INSTALLER_PACKAGE=@sellable/install@0.1.410-wip.phase112015.boot-session.20260724150835
7
7
  ARG MCP_PACKAGE=@sellable/mcp@0.1.644
8
8
  ARG INSTALLER_INTEGRITY
9
9
  ARG MCP_INTEGRITY=sha512-Q2+bBeQCKy/tZ9hMslOZ1Tw/kTLKBjiv77zQqX38IFrNevLiOhRG4rsxvVPqfHkOIIOSKFl/ECTgFD0pcmhAXg==
10
10
 
11
- RUN test "${INSTALLER_PACKAGE}" = "@sellable/install@0.1.408" \
11
+ RUN test "${INSTALLER_PACKAGE}" = "@sellable/install@0.1.410-wip.phase112015.boot-session.20260724150835" \
12
12
  && test "${MCP_PACKAGE}" = "@sellable/mcp@0.1.644" \
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.408" \
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.408' || mcp.name !== '@sellable/mcp' || mcp.version !== '0.1.644') 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.410-wip.phase112015.boot-session.20260724150835' || mcp.name !== '@sellable/mcp' || mcp.version !== '0.1.644') 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.408', installerIntegrity: process.argv[1], mcpPackage: '@sellable/mcp@0.1.644', 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.410-wip.phase112015.boot-session.20260724150835', installerIntegrity: process.argv[1], mcpPackage: '@sellable/mcp@0.1.644', 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,13 +3,13 @@
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.408` is
6
+ `@sellable/install@0.1.410-wip.phase112015.boot-session.20260724150835` is
7
7
  published:
8
8
 
9
9
  ```sh
10
10
  docker build --platform linux/amd64 \
11
11
  --build-arg INSTALLER_INTEGRITY='sha512-…' \
12
- --tag sellable-agent-host:0.1.408 .
12
+ --tag sellable-agent-host:0.1.410-wip.phase112015.boot-session.20260724150835 .
13
13
  ```
14
14
 
15
15
  Create a private `bootstrap/` directory owned by root with mode `0700`. It must contain `bootstrap.json`, `provider-auth`, and `slack-app`, each owned by root with mode `0600`. `bootstrap.json` contains only non-secret identities, hashes, package integrities, and the control-plane URL. The other two files contain the provider JSON and global Slack app token whose hashes are pinned by `bootstrap.json`.
@@ -5,7 +5,7 @@ USER root
5
5
 
6
6
  ARG MCP_PACKAGE=@sellable/mcp@0.1.710-uat.refill-zero-shot.20260723123117
7
7
  ARG MCP_INTEGRITY=sha512-KvIRcIPQR/3iviWNcpq4EgrR/gEuOOqV9fngbaF/Ch/E7bBx0oAsFDu+0YrKvPc+l95ia/ddyvxWmpuRpMGHGw==
8
- ARG INSTALLER_PACKAGE=@sellable/install@0.1.408
8
+ ARG INSTALLER_PACKAGE=@sellable/install@0.1.410-wip.phase112015.boot-session.20260724150835
9
9
  ARG HERMES_VERSION=0.19.0
10
10
  ARG MCP_TRUST_ROOT_B64
11
11
  ARG TIRITH_VERSION=0.3.3
@@ -42,7 +42,7 @@ RUN test -n "${MCP_TRUST_ROOT_B64}" \
42
42
  /etc/cont-init.d/02-reconcile-profiles \
43
43
  && npm cache clean --force
44
44
 
45
- COPY mcp-context-proxy.mjs fly-customer-worker.mjs profile-materializer.mjs hermes-bridge.mjs fly-runtime-identity.mjs \
45
+ COPY mcp-context-proxy.mjs fly-customer-model.mjs fly-customer-worker.mjs profile-materializer.mjs hermes-bridge.mjs fly-runtime-identity.mjs \
46
46
  /usr/local/lib/sellable-agent/
47
47
  COPY fly-customer-image/customer-runtime.mjs /usr/local/lib/sellable-agent/fly-customer-image/customer-runtime.mjs
48
48
  COPY fly-customer-image/rootfs/ /
@@ -19,6 +19,12 @@ import {
19
19
  clearCustomerRuntimeSecrets,
20
20
  installCustomerRuntimeSecrets,
21
21
  } from "../fly-customer-worker.mjs";
22
+ import {
23
+ FLY_CUSTOMER_MODEL_ID,
24
+ FLY_CUSTOMER_MODEL_PROVIDER,
25
+ FLY_CUSTOMER_MODEL_REASONING_EFFORT,
26
+ parseFlyCustomerModelCredential,
27
+ } from "../fly-customer-model.mjs";
22
28
  import {
23
29
  createFlyCustomerControlClient,
24
30
  dropFlyRuntimePrivileges,
@@ -51,10 +57,11 @@ const RUNTIME_GENERATION = Number(
51
57
  process.env.SELLABLE_RUNTIME_GENERATION ??
52
58
  "0"
53
59
  );
60
+ const BOOT_SESSION_ID = randomUUID();
54
61
  const HERMES_VERSION = process.env.SELLABLE_AGENT_HERMES_VERSION ?? "0.19.0";
55
62
  const INSTALLER_PACKAGE =
56
63
  process.env.SELLABLE_AGENT_INSTALLER_PACKAGE ??
57
- "@sellable/install@0.1.408";
64
+ "@sellable/install@0.1.410-wip.phase112015.boot-session.20260724150835";
58
65
  const MCP_PACKAGE =
59
66
  process.env.SELLABLE_AGENT_MCP_PACKAGE ??
60
67
  "@sellable/mcp@0.1.710-uat.refill-zero-shot.20260723123117";
@@ -354,6 +361,7 @@ function writeRuntimeHermesConfig({
354
361
  const testModelOrigin = allowTestProviders()
355
362
  ? process.env.SELLABLE_AGENT_TEST_MODEL_ORIGIN
356
363
  : null;
364
+ const modelCredential = parseFlyCustomerModelCredential(secrets.modelCodex);
357
365
  atomicJson(runtimeConfigPath, {
358
366
  ...baseConfig,
359
367
  ...(testModelOrigin
@@ -375,7 +383,14 @@ function writeRuntimeHermesConfig({
375
383
  },
376
384
  ],
377
385
  }
378
- : {}),
386
+ : {
387
+ model: {
388
+ default: FLY_CUSTOMER_MODEL_ID,
389
+ provider: FLY_CUSTOMER_MODEL_PROVIDER,
390
+ reasoning_effort: FLY_CUSTOMER_MODEL_REASONING_EFFORT,
391
+ generation: desired.modelCredentialGeneration,
392
+ },
393
+ }),
379
394
  mcp_servers: {
380
395
  ...baseConfig.mcp_servers,
381
396
  sellable: {
@@ -400,8 +415,6 @@ function writeRuntimeHermesConfig({
400
415
  },
401
416
  },
402
417
  });
403
- const modelAuthPath = join(secretRoot, "auth.json");
404
- atomicFile(modelAuthPath, secrets.modelCodex, 0o600);
405
418
  const gatesPath = join(secretRoot, "gates.json");
406
419
  atomicJson(gatesPath, {
407
420
  lifecycle: "ON",
@@ -425,8 +438,8 @@ function writeRuntimeHermesConfig({
425
438
  runtimeHome: runtimeConfigRoot,
426
439
  runtimeConfigPath,
427
440
  runtimeMcpPath,
428
- modelAuthPath,
429
441
  gatesPath,
442
+ modelCredential,
430
443
  };
431
444
  }
432
445
 
@@ -464,7 +477,6 @@ function applicationRuntimeEnv({ desired, runtimeConfig, secrets }) {
464
477
  HOME: DATA_ROOT,
465
478
  HERMES_HOME: DATA_ROOT,
466
479
  HERMES_CONFIG_PATH: runtimeConfig.runtimeConfigPath,
467
- HERMES_AUTH_PATH: runtimeConfig.modelAuthPath,
468
480
  CODEX_HOME: join(SECRET_ROOT, desired.profileId),
469
481
  SELLABLE_AGENT_RUNTIME: "1",
470
482
  SELLABLE_AGENT_RUNTIME_GATE_FILE: runtimeConfig.gatesPath,
@@ -475,10 +487,15 @@ function applicationRuntimeEnv({ desired, runtimeConfig, secrets }) {
475
487
  SLACK_STRICT_MENTION: "true",
476
488
  SLACK_ALLOW_BOTS: "false",
477
489
  ...(allowTestProviders()
478
- ? { SELLABLE_AGENT_TEST_MODEL_KEY: secrets.modelCodex }
479
- : {}),
490
+ ? {
491
+ SELLABLE_AGENT_TEST_MODEL_KEY:
492
+ runtimeConfig.modelCredential.apiKey,
493
+ }
494
+ : { OPENAI_API_KEY: runtimeConfig.modelCredential.apiKey }),
480
495
  NO_COLOR: "1",
481
496
  };
497
+ delete env.OPENAI_BASE_URL;
498
+ delete env.OPENROUTER_API_KEY;
482
499
  delete env.SLACK_APP_TOKEN;
483
500
  delete env.SLACK_BOT_TOKEN;
484
501
  return env;
@@ -870,6 +887,7 @@ async function main() {
870
887
  runtimeId: RUNTIME_ID,
871
888
  audience: AUDIENCE,
872
889
  identity,
890
+ bootSessionId: BOOT_SESSION_ID,
873
891
  oidcToken,
874
892
  });
875
893
  oidcToken = null;
@@ -899,6 +917,7 @@ async function main() {
899
917
  runtimeId: RUNTIME_ID,
900
918
  audience: AUDIENCE,
901
919
  identity,
920
+ bootSessionId: BOOT_SESSION_ID,
902
921
  runtimeGeneration: RUNTIME_GENERATION,
903
922
  });
904
923
  exchange = renewed.exchange;
@@ -0,0 +1,33 @@
1
+ export const FLY_CUSTOMER_MODEL_PROVIDER = "openai-api";
2
+ export const FLY_CUSTOMER_MODEL_ID = "gpt-5.6-sol";
3
+ export const FLY_CUSTOMER_MODEL_REASONING_EFFORT = "high";
4
+
5
+ const MODEL_CREDENTIAL_KEYS = ["OPENAI_API_KEY", "authMode"];
6
+ const OPENAI_API_KEY = /^sk-[A-Za-z0-9_-]{16,512}$/;
7
+
8
+ export function parseFlyCustomerModelCredential(secret) {
9
+ let value;
10
+ try {
11
+ value = JSON.parse(secret);
12
+ } catch {
13
+ throw new Error("customer_model_credential_rejected");
14
+ }
15
+ if (
16
+ !value ||
17
+ typeof value !== "object" ||
18
+ Array.isArray(value) ||
19
+ Object.keys(value).sort().join("\0") !==
20
+ [...MODEL_CREDENTIAL_KEYS].sort().join("\0") ||
21
+ value.authMode !== "api-key" ||
22
+ typeof value.OPENAI_API_KEY !== "string" ||
23
+ !OPENAI_API_KEY.test(value.OPENAI_API_KEY)
24
+ ) {
25
+ throw new Error("customer_model_credential_rejected");
26
+ }
27
+ return Object.freeze({
28
+ provider: FLY_CUSTOMER_MODEL_PROVIDER,
29
+ model: FLY_CUSTOMER_MODEL_ID,
30
+ reasoningEffort: FLY_CUSTOMER_MODEL_REASONING_EFFORT,
31
+ apiKey: value.OPENAI_API_KEY,
32
+ });
33
+ }
@@ -13,6 +13,7 @@ import {
13
13
  writeFileSync,
14
14
  } from "node:fs";
15
15
  import { basename, dirname, isAbsolute, join, relative } from "node:path";
16
+ import { parseFlyCustomerModelCredential } from "./fly-customer-model.mjs";
16
17
 
17
18
  const SAFE_ID = /^[A-Za-z0-9_-]{1,128}$/;
18
19
  const SHA256 = /^[a-f0-9]{64}$/;
@@ -150,6 +151,13 @@ function validEnvelope(envelope, contract, expected) {
150
151
  envelope.generation !== expected[contract.generation]
151
152
  )
152
153
  return false;
154
+ if (contract.purpose === "model-codex-auth") {
155
+ try {
156
+ parseFlyCustomerModelCredential(envelope.secret);
157
+ } catch {
158
+ return false;
159
+ }
160
+ }
153
161
  return BINDING_KEYS.every(
154
162
  (key) =>
155
163
  envelope.binding[key] ===
@@ -319,6 +319,7 @@ function exactHttpsOrigin(value) {
319
319
  * runtimeId: string;
320
320
  * audience: string;
321
321
  * identity: { publicKeyPem: string; publicKeyHash: string };
322
+ * bootSessionId: string;
322
323
  * oidcToken?: string | null;
323
324
  * env?: NodeJS.ProcessEnv;
324
325
  * fetchImpl?: typeof fetch;
@@ -329,6 +330,7 @@ export async function exchangeFlyCustomerIdentity({
329
330
  runtimeId,
330
331
  audience,
331
332
  identity,
333
+ bootSessionId,
332
334
  oidcToken = null,
333
335
  env = process.env,
334
336
  fetchImpl = fetch,
@@ -340,6 +342,13 @@ export async function exchangeFlyCustomerIdentity({
340
342
  if (!identity || !SHA256.test(identity.publicKeyHash ?? "")) {
341
343
  throw new Error("fly_runtime_public_key_rejected");
342
344
  }
345
+ if (
346
+ !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/.test(
347
+ bootSessionId ?? ""
348
+ )
349
+ ) {
350
+ throw new Error("fly_boot_session_invalid");
351
+ }
343
352
  const workloadToken =
344
353
  oidcToken === null
345
354
  ? await obtainFlyOidcToken({ audience, env })
@@ -352,7 +361,11 @@ export async function exchangeFlyCustomerIdentity({
352
361
  authorization: `${FLY_OIDC_AUTHORIZATION_SCHEME} ${workloadToken}`,
353
362
  "content-type": "application/json",
354
363
  },
355
- body: JSON.stringify({ runtimeId, publicKeyPem: identity.publicKeyPem }),
364
+ body: JSON.stringify({
365
+ runtimeId,
366
+ publicKeyPem: identity.publicKeyPem,
367
+ bootSessionId,
368
+ }),
356
369
  signal: AbortSignal.timeout(15_000),
357
370
  }
358
371
  );
@@ -476,6 +489,7 @@ export async function renewFlyCustomerControlSession({
476
489
  runtimeId,
477
490
  audience,
478
491
  identity,
492
+ bootSessionId,
479
493
  runtimeGeneration,
480
494
  obtainOidcTokenImpl = obtainFlyOidcToken,
481
495
  exchangeFlyCustomerIdentityImpl = exchangeFlyCustomerIdentity,
@@ -484,6 +498,9 @@ export async function renewFlyCustomerControlSession({
484
498
  if (
485
499
  !Number.isSafeInteger(runtimeGeneration) ||
486
500
  runtimeGeneration < 1 ||
501
+ !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/.test(
502
+ bootSessionId ?? ""
503
+ ) ||
487
504
  typeof obtainOidcTokenImpl !== "function" ||
488
505
  typeof exchangeFlyCustomerIdentityImpl !== "function" ||
489
506
  typeof createFlyCustomerControlClientImpl !== "function"
@@ -498,6 +515,7 @@ export async function renewFlyCustomerControlSession({
498
515
  runtimeId,
499
516
  audience,
500
517
  identity,
518
+ bootSessionId,
501
519
  oidcToken,
502
520
  });
503
521
  } finally {
@@ -39,7 +39,7 @@ 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
41
  const INSTALLER_PACKAGE =
42
- "@sellable/install@0.1.408";
42
+ "@sellable/install@0.1.410-wip.phase112015.boot-session.20260724150835";
43
43
  const MCP_PACKAGE = "@sellable/mcp@0.1.644";
44
44
  const HERMES_VERSION = "0.18.0";
45
45
  const SHA256 = /^[a-f0-9]{64}$/;
@@ -1514,7 +1514,7 @@ export function compileClaimToProfileDesired(activeClaim, config) {
1514
1514
  pinned.hermesCli !== "hermes" ||
1515
1515
  pinned.hermesVersion !== "0.18.0" ||
1516
1516
  pinned.installerPackage !==
1517
- "@sellable/install@0.1.408" ||
1517
+ "@sellable/install@0.1.410-wip.phase112015.boot-session.20260724150835" ||
1518
1518
  pinned.mcpPackage !== "@sellable/mcp@0.1.644" ||
1519
1519
  !Array.isArray(policy.toolInclude) ||
1520
1520
  policy.toolInclude.length === 0 ||
@@ -24,6 +24,11 @@ import {
24
24
  resolve,
25
25
  } from "node:path";
26
26
  import { HERMES_AGENT_BRIDGE_CONTRACT } from "./hermes-bridge.mjs";
27
+ import {
28
+ FLY_CUSTOMER_MODEL_ID,
29
+ FLY_CUSTOMER_MODEL_PROVIDER,
30
+ FLY_CUSTOMER_MODEL_REASONING_EFFORT,
31
+ } from "./fly-customer-model.mjs";
27
32
 
28
33
  export const PROFILE_MATERIALIZER_PORTS = Object.freeze({
29
34
  hostAppSecret: ["resolveHostSecret"],
@@ -188,7 +193,7 @@ function validateDesired(desired) {
188
193
  desired.hermesCli !== "hermes" ||
189
194
  desired.hermesVersion !== "0.18.0" ||
190
195
  desired.installerPackage !==
191
- "@sellable/install@0.1.408" ||
196
+ "@sellable/install@0.1.410-wip.phase112015.boot-session.20260724150835" ||
192
197
  desired.mcpPackage !== "@sellable/mcp@0.1.644" ||
193
198
  !Array.isArray(desired.toolInclude) ||
194
199
  desired.toolInclude.length === 0 ||
@@ -2121,7 +2126,9 @@ function nativeSlackCustomerFiles(desired) {
2121
2126
  runtimeInstallAllowed: false,
2122
2127
  },
2123
2128
  model: {
2124
- authFile: `${runtimeSecretRoot}/auth.json`,
2129
+ provider: FLY_CUSTOMER_MODEL_PROVIDER,
2130
+ default: FLY_CUSTOMER_MODEL_ID,
2131
+ reasoning_effort: FLY_CUSTOMER_MODEL_REASONING_EFFORT,
2125
2132
  generation: desired.modelCredentialGeneration,
2126
2133
  },
2127
2134
  slack: {
@@ -26,7 +26,7 @@ import { deriveContainedProfileId } from "./profile-materializer.mjs";
26
26
 
27
27
  export const PROVISIONING_ACTION = "PROVISION_HERMES_PROFILE";
28
28
  export const PINNED_INSTALL_PACKAGE =
29
- "@sellable/install@0.1.408";
29
+ "@sellable/install@0.1.410-wip.phase112015.boot-session.20260724150835";
30
30
  export const PINNED_MCP_PACKAGE = "@sellable/mcp@0.1.644";
31
31
 
32
32
  export function deriveAgentProfileId(workspaceId, agentId, hostId) {
@@ -613,7 +613,7 @@ function inspectProvisionedProfile({
613
613
  manifest.serviceCredentialReference !== serviceCredentialReference ||
614
614
  manifest.installerPackage !== PINNED_INSTALL_PACKAGE ||
615
615
  manifest.installerVersion !==
616
- "0.1.408" ||
616
+ "0.1.410-wip.phase112015.boot-session.20260724150835" ||
617
617
  manifest.mcpPackage !== PINNED_MCP_PACKAGE ||
618
618
  manifest.credentialKeyVersion !== credentialKeyVersion ||
619
619
  !/^[a-f0-9]{16}$/.test(manifest.credentialFingerprint) ||
@@ -827,7 +827,7 @@ function successReceipt({
827
827
  subject: `agent-profile:${observed.profileId}`,
828
828
  cli: {
829
829
  installPackage: PINNED_INSTALL_PACKAGE,
830
- installVersion: "0.1.408",
830
+ installVersion: "0.1.410-wip.phase112015.boot-session.20260724150835",
831
831
  mcpPackage: PINNED_MCP_PACKAGE,
832
832
  command: "hermes profile bootstrap",
833
833
  },
@@ -875,7 +875,7 @@ function failure(code, stages, extra = {}, request = null) {
875
875
  : "agent-profile:unbound",
876
876
  cli: {
877
877
  installPackage: PINNED_INSTALL_PACKAGE,
878
- installVersion: "0.1.408",
878
+ installVersion: "0.1.410-wip.phase112015.boot-session.20260724150835",
879
879
  mcpPackage: PINNED_MCP_PACKAGE,
880
880
  command: "hermes profile bootstrap",
881
881
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/install",
3
- "version": "0.1.408",
3
+ "version": "0.1.410-wip.phase112015.boot-session.20260724150835",
4
4
  "type": "module",
5
5
  "description": "One-command installer for Sellable MCP in Claude Code, Codex, and Hermes",
6
6
  "bin": {