@commonlyai/cli 0.1.163 → 0.1.165

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@commonlyai/cli",
3
- "version": "0.1.163",
3
+ "version": "0.1.165",
4
4
  "license": "Apache-2.0",
5
5
  "description": "The Commonly CLI — connect agents, manage pods, iterate fast",
6
6
  "type": "module",
@@ -1681,7 +1681,7 @@ export const performRun = ({
1681
1681
 
1682
1682
  if (adapter.requiresModel) {
1683
1683
  try {
1684
- requireSeatModel(seatEnvironment, adapter.name);
1684
+ requireSeatModel(seatEnvironment, adapter.name, true);
1685
1685
  } catch (error) {
1686
1686
  if (error.code === 'seat_model_missing' && eventPodId && !missingModelNotices.has(eventPodId)) {
1687
1687
  try {
@@ -43,7 +43,7 @@
43
43
  * SIGKILL escalation is a post-v1 concern (ADR-005 §Spawning semantics).
44
44
  */
45
45
 
46
- import { requireSeatModel } from './seat-model.js';
46
+ import { requireSeatModel, seatModelRequired } from './seat-model.js';
47
47
  import { spawn as childSpawn, spawnSync } from 'child_process';
48
48
  import { createHash, randomUUID } from 'crypto';
49
49
  import { accessSync, constants, realpathSync } from 'fs';
@@ -726,7 +726,7 @@ const prepareArgv = async (innerArgv, ctx) => {
726
726
  };
727
727
 
728
728
  export default {
729
- requiresModel: true,
729
+ get requiresModel() { return seatModelRequired(); },
730
730
  name: 'claude',
731
731
  // Identity-bearing runtime tag written into AgentInstallation.config.runtime
732
732
  // by `commonly agent attach`. The CLI command stays `commonly agent attach
@@ -812,7 +812,7 @@ export default {
812
812
  // session-recovery retry, or a retry runs at a different effort than the
813
813
  // turn it replaces.
814
814
  const modelArgs = [
815
- '--model', seatModel,
815
+ ...(seatModel ? ['--model', seatModel] : []),
816
816
  ...(ctx.environment?.effort ? ['--effort', String(ctx.environment.effort)] : []),
817
817
  ];
818
818
  const baseArgs = ['-p', fullPrompt, '--output-format', 'text', sessionFlag, sessionId, ...modelArgs];
@@ -37,7 +37,7 @@
37
37
  * SIGKILL escalation is a post-v1 concern (ADR-005 §Spawning semantics).
38
38
  */
39
39
 
40
- import { requireSeatModel } from './seat-model.js';
40
+ import { requireSeatModel, seatModelRequired } from './seat-model.js';
41
41
  import { spawn as childSpawn, spawnSync } from 'child_process';
42
42
  import { createHash } from 'crypto';
43
43
  import { accessSync, constants } from 'fs';
@@ -617,7 +617,7 @@ const runCodex = ({ args, cwd, env, timeoutMs, credentials = [], spawnImpl = chi
617
617
  });
618
618
 
619
619
  export default {
620
- requiresModel: true,
620
+ get requiresModel() { return seatModelRequired(); },
621
621
  name: 'codex',
622
622
  // See claude.js for the rationale — identity-bearing runtime tag persisted
623
623
  // to AgentInstallation.config.runtime (paired with host:'byo') so a CLI-
@@ -248,7 +248,7 @@ export default {
248
248
  },
249
249
 
250
250
  async spawn(prompt, ctx = {}) {
251
- const seatModel = requireSeatModel(ctx.environment, 'dsh');
251
+ const seatModel = requireSeatModel(ctx.environment, 'dsh', true);
252
252
  assertPrivateDsh(ctx.environment);
253
253
  if (!ctx.environment?.provider || !ctx.environment?.model) {
254
254
  throw new Error('dsh requires environment.provider and environment.model');
@@ -194,7 +194,7 @@ export default {
194
194
  },
195
195
 
196
196
  async spawn(prompt, ctx = {}) {
197
- const seatModel = requireSeatModel(ctx.environment, 'goose');
197
+ const seatModel = requireSeatModel(ctx.environment, 'goose', true);
198
198
  const keyFile = await this.validateEnvironment(ctx.environment, ctx.cwd);
199
199
  const sourceEnv = ctx.env || process.env;
200
200
  const configured = ctx.environment?.provider;
@@ -1,5 +1,5 @@
1
1
  /** Hermes 0.22.2 local CLI wrapper. Hermes owns provider I/O; this file only spawns it. */
2
- import { requireSeatModel } from './seat-model.js';
2
+ import { requireSeatModel, seatModelRequired } from './seat-model.js';
3
3
  import { spawn as childSpawn, spawnSync } from 'child_process';
4
4
  import { createHash } from 'crypto';
5
5
  import { mkdir } from 'fs/promises';
@@ -138,7 +138,7 @@ const runHermes = ({ args, prompt, cwd, env, timeoutMs, spawnImpl, credentials }
138
138
  });
139
139
 
140
140
  export default {
141
- requiresModel: true,
141
+ get requiresModel() { return seatModelRequired(); },
142
142
  name: 'hermes',
143
143
  runtimeType: 'hermes',
144
144
  supportsProvider: false,
@@ -180,7 +180,7 @@ export default {
180
180
  }
181
181
  const args = ['chat', '--oneshot', '--query-file', '-', '--format', 'stream-json',
182
182
  '--provider', 'openrouter', '--source', 'tool', '--no-restore-cwd'];
183
- args.push('--model', seatModel);
183
+ if (seatModel) args.push('--model', seatModel);
184
184
  if (ctx.sessionId) args.push('--resume', ctx.sessionId);
185
185
  const fullPrompt = buildMemoryPreamble(prompt, ctx.memoryLongTerm, {
186
186
  freshSession: !ctx.sessionId,
@@ -19,7 +19,7 @@
19
19
  * `text.part.text`, and token counts in `step_finish.part.tokens`.
20
20
  */
21
21
 
22
- import { requireSeatModel } from './seat-model.js';
22
+ import { requireSeatModel, seatModelRequired } from './seat-model.js';
23
23
  import { spawn as childSpawn, spawnSync } from 'child_process';
24
24
  import { createHash } from 'crypto';
25
25
  import { realpathSync } from 'fs';
@@ -623,7 +623,7 @@ const describeOpenCodeVersionMismatch = (installedVersion) => {
623
623
  };
624
624
 
625
625
  export default {
626
- requiresModel: true,
626
+ get requiresModel() { return seatModelRequired(); },
627
627
  name: 'opencode',
628
628
  runtimeType: 'opencode',
629
629
  supportsProvider: true,
@@ -410,7 +410,7 @@ export default {
410
410
  },
411
411
 
412
412
  async spawn(prompt, ctx = {}) {
413
- const seatModel = requireSeatModel(ctx.environment, 'pi');
413
+ const seatModel = requireSeatModel(ctx.environment, 'pi', true);
414
414
  // pi has no enforced sandbox. claude.js and codex.js refuse a public-trust
415
415
  // seat they cannot confine; so does this adapter, and it refuses any declared
416
416
  // sandbox mode rather than run unconfined under a spec that promised one.
@@ -232,7 +232,7 @@ export default {
232
232
  },
233
233
 
234
234
  async spawn(prompt, ctx = {}) {
235
- const seatModel = requireSeatModel(ctx.environment, 'qwen');
235
+ const seatModel = requireSeatModel(ctx.environment, 'qwen', true);
236
236
  const sandbox = normalizeSandboxTrust(ctx.environment?.sandbox);
237
237
  const isPublic = sandbox?.trust === 'public';
238
238
  const mode = isPublic ? resolvePublicSandboxMode(sandbox) : null;
@@ -1,7 +1,10 @@
1
- /** A seat must choose its model independently of the operator's CLI defaults. */
2
- export const requireSeatModel = (environment, adapterName) => {
1
+ /** Fleet runners opt in; BYO users retain their own CLI's model default. */
2
+ export const seatModelRequired = () => process.env.COMMONLY_REQUIRE_SEAT_MODEL === '1';
3
+
4
+ export const requireSeatModel = (environment, adapterName, required = seatModelRequired()) => {
3
5
  const model = environment?.model;
4
6
  if (typeof model !== 'string' || !model.trim()) {
7
+ if (!required) return undefined;
5
8
  const error = new Error(
6
9
  `${adapterName} requires environment.model; set the seat model with commonly agent config <name> --model <model> before running`,
7
10
  );