@agentshouse/kit 0.2.1-c15804a0fa28d → 0.2.1-c3895fcff473b

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/dist/agents.js CHANGED
@@ -3,13 +3,16 @@ import { readFile, realpath } from 'node:fs/promises';
3
3
  import { killTree, startAdapter } from './acp.js';
4
4
  import { CLIS, KIT_VERSION, below, installAdapter, installCli, locate, run, versionOf } from './clis.js';
5
5
  import { agentBase, kitHome } from './home.js';
6
- const SIGNED_OUT = { signed_in: false, models: [] };
6
+ const SIGNED_OUT = { signed_in: false, models: [], modes: [] };
7
7
  function select(options, category) {
8
8
  const option = options.find((candidate) => candidate.category === category);
9
9
  return option?.type === 'select' ? option : undefined;
10
10
  }
11
+ function choices(options) {
12
+ return options.flatMap((entry) => ('group' in entry ? entry.options : [entry]));
13
+ }
11
14
  function values(options) {
12
- return options.flatMap((entry) => ('group' in entry ? entry.options : [entry])).map((entry) => entry.value);
15
+ return choices(options).map((entry) => entry.value);
13
16
  }
14
17
  function causeOf(error) {
15
18
  return error instanceof Error ? error.message : String(error);
@@ -21,9 +24,11 @@ async function models(kind, adapter, known) {
21
24
  const agent = adapter.connection.agent;
22
25
  const opened = await agent.request('session/new', { cwd: kitHome(), mcpServers: [] });
23
26
  let options = opened.configOptions ?? [];
27
+ const mode = select(options, 'mode');
28
+ const modes = mode === undefined ? [] : choices(mode.options).map(({ value, name }) => ({ mode: value, name }));
24
29
  const model = select(options, 'model');
25
30
  if (model === undefined)
26
- return [];
31
+ return { models: [], modes };
27
32
  const offered = [];
28
33
  for (const value of values(model.options)) {
29
34
  if (select(options, 'model')?.currentValue !== value) {
@@ -39,7 +44,7 @@ async function models(kind, adapter, known) {
39
44
  const effort = select(options, 'thought_level');
40
45
  offered.push({ model: value, efforts: effort === undefined ? [] : values(effort.options) });
41
46
  }
42
- return offered;
47
+ return { models: offered, modes };
43
48
  }
44
49
  async function offer(kind, cli, known) {
45
50
  const probe = CLIS[kind].signedIn;
@@ -53,11 +58,15 @@ async function offer(kind, cli, known) {
53
58
  if (typeof method !== 'string' || method.length === 0)
54
59
  return SIGNED_OUT;
55
60
  }
56
- return { signed_in: true, models: await models(kind, adapter, known.models) };
61
+ return { signed_in: true, ...(await models(kind, adapter, known.models)) };
57
62
  }
58
63
  catch (error) {
59
64
  process.stderr.write(`kit: ${kind} did not offer its models: ${causeOf(error)}\n`);
60
- return { signed_in: adapter === undefined && 'initializeMeta' in probe ? known.signed_in : true, models: known.models };
65
+ return {
66
+ signed_in: adapter === undefined && 'initializeMeta' in probe ? known.signed_in : true,
67
+ models: known.models,
68
+ modes: known.modes,
69
+ };
61
70
  }
62
71
  finally {
63
72
  if (adapter !== undefined)
@@ -72,6 +81,8 @@ function reported(kind, reading) {
72
81
  failure: reading.failure,
73
82
  signed_in: reading.signed_in,
74
83
  models: reading.models,
84
+ modes: reading.modes,
85
+ full_access: CLIS[kind].fullAccess,
75
86
  };
76
87
  }
77
88
  function tooOld(kind, release) {
@@ -130,7 +141,7 @@ export class Agents {
130
141
  const known = this.readings.get(kind);
131
142
  const kept = known?.release === null || known?.minimum !== undefined ? SIGNED_OUT : (known ?? SIGNED_OUT);
132
143
  if (known?.release !== release || known.minimum !== undefined) {
133
- this.update(kind, { release, failure: null, signed_in: kept.signed_in, models: kept.models });
144
+ this.update(kind, { release, failure: null, signed_in: kept.signed_in, models: kept.models, modes: kept.modes });
134
145
  }
135
146
  const read = this.nextRead(kind);
136
147
  offer(kind, cli, kept)
@@ -1,23 +1,23 @@
1
1
  {
2
2
  "schemaVersion": 2,
3
- "version": "0.2.1-c15804a0fa28d",
3
+ "version": "0.2.1-c3895fcff473b",
4
4
  "hosts": {
5
5
  "macos": {
6
6
  "asset": {
7
7
  "name": "connect-linux.sh",
8
- "url": "https://github.com/agentshouse/kit/releases/download/v0.2.1-c15804a0fa28d/connect-linux.sh"
8
+ "url": "https://github.com/agentshouse/kit/releases/download/v0.2.1-c3895fcff473b/connect-linux.sh"
9
9
  }
10
10
  },
11
11
  "linux": {
12
12
  "asset": {
13
13
  "name": "connect-linux.sh",
14
- "url": "https://github.com/agentshouse/kit/releases/download/v0.2.1-c15804a0fa28d/connect-linux.sh"
14
+ "url": "https://github.com/agentshouse/kit/releases/download/v0.2.1-c3895fcff473b/connect-linux.sh"
15
15
  }
16
16
  },
17
17
  "windows": {
18
18
  "asset": {
19
19
  "name": "connect-windows.ps1",
20
- "url": "https://github.com/agentshouse/kit/releases/download/v0.2.1-c15804a0fa28d/connect-windows.ps1"
20
+ "url": "https://github.com/agentshouse/kit/releases/download/v0.2.1-c3895fcff473b/connect-windows.ps1"
21
21
  }
22
22
  }
23
23
  }
package/dist/clis.js CHANGED
@@ -1,10 +1,16 @@
1
1
  import { spawn } from 'node:child_process';
2
2
  import { readFileSync } from 'node:fs';
3
- import { readFile } from 'node:fs/promises';
4
- import { userInfo } from 'node:os';
3
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
4
+ import { homedir, userInfo } from 'node:os';
5
5
  import { join } from 'node:path';
6
6
  import { kitHome } from './home.js';
7
7
  const RUNNING_JOB = new Set(['running', 'paused']);
8
+ async function allowHouseInCodex() {
9
+ const rules = join(process.env.CODEX_HOME || join(homedir(), '.codex'), 'rules');
10
+ await mkdir(rules, { recursive: true });
11
+ await writeFile(join(rules, 'house.rules'), 'prefix_rule(pattern = ["house"], decision = "allow")\n');
12
+ }
13
+ async function nothing() { }
8
14
  function threadStatus({ method, params }) {
9
15
  if (method !== 'session/update' || params?.update?.sessionUpdate !== 'session_info_update')
10
16
  return undefined;
@@ -36,6 +42,9 @@ export const CLIS = {
36
42
  install: 'curl -fsSL https://chatgpt.com/codex/install.sh | sh',
37
43
  adapter: { package: '@agentclientprotocol/codex-acp', bin: 'codex-acp', executable: 'CODEX_PATH', env: {} },
38
44
  args: [],
45
+ fullAccess: 'agent-full-access',
46
+ sessionMeta: {},
47
+ allowHouse: allowHouseInCodex,
39
48
  signedIn: { command: ['login', 'status'] },
40
49
  login: { args: ['login', '--device-auth'], code: 'show' },
41
50
  queues: false,
@@ -52,9 +61,12 @@ export const CLIS = {
52
61
  package: '@agentclientprotocol/claude-agent-acp',
53
62
  bin: 'claude-agent-acp',
54
63
  executable: 'CLAUDE_CODE_EXECUTABLE',
55
- env: { CLAUDE_CODE_ENTRYPOINT: 'claude-agent-acp' },
64
+ env: { CLAUDE_CODE_ENTRYPOINT: 'claude-agent-acp', IS_SANDBOX: '1' },
56
65
  },
57
66
  args: [],
67
+ fullAccess: 'bypassPermissions',
68
+ sessionMeta: { claudeCode: { options: { allowedTools: ['Bash(house:*)'] } } },
69
+ allowHouse: nothing,
58
70
  signedIn: { command: ['auth', 'status'] },
59
71
  login: { args: ['auth', 'login', '--claudeai'], code: 'collect', rejected: 'Invalid code' },
60
72
  queues: false,
@@ -70,7 +82,10 @@ export const CLIS = {
70
82
  minimum: '1.0.46',
71
83
  install: 'curl -fsSL https://x.ai/cli/install.sh | bash',
72
84
  adapter: null,
73
- args: ['agent', '--no-leader', 'stdio'],
85
+ args: ['agent', '--always-approve', '--no-leader', 'stdio'],
86
+ fullAccess: null,
87
+ sessionMeta: {},
88
+ allowHouse: nothing,
74
89
  signedIn: { initializeMeta: 'defaultAuthMethodId' },
75
90
  login: { args: ['login', '--device-auth'], code: 'show' },
76
91
  queues: true,
@@ -285,13 +285,15 @@ export class Conversations {
285
285
  conversation.opening = bridge;
286
286
  try {
287
287
  await unlessAborted(createHowWeWork(bridge), conversation.killed.signal);
288
+ await CLIS[route.kind].allowHouse();
288
289
  const adapter = await startAdapter(route.kind, cli, route.working_directory, app, (job) => this.job(conversation, job), bridge.env);
289
290
  void adapter.exited.then(() => bridge.close());
290
291
  const agent = adapter.connection.agent;
291
292
  const cwd = route.working_directory;
293
+ const _meta = CLIS[route.kind].sessionMeta;
292
294
  const opened = sessionId === null
293
- ? await agent.request('session/new', { cwd, mcpServers: [] })
294
- : { ...(await agent.request('session/resume', { sessionId, cwd, mcpServers: [] })), sessionId };
295
+ ? await agent.request('session/new', { cwd, mcpServers: [], _meta })
296
+ : { ...(await agent.request('session/resume', { sessionId, cwd, mcpServers: [], _meta })), sessionId };
295
297
  const running = {
296
298
  adapter,
297
299
  bridge,
@@ -321,6 +323,7 @@ export class Conversations {
321
323
  async launchSettings(running, route, offered) {
322
324
  let options = offered;
323
325
  const settings = [
326
+ ['mode', route.mode ?? CLIS[route.kind].fullAccess],
324
327
  ['model', route.model],
325
328
  ['thought_level', route.effort],
326
329
  ];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentshouse/kit",
3
- "version": "0.2.1-c15804a0fa28d",
3
+ "version": "0.2.1-c3895fcff473b",
4
4
  "description": "House Kit connects an Environment to agents.house.",
5
5
  "license": "MIT",
6
6
  "repository": {