external-subagent 0.3.1 → 0.3.2

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/cli/constants.mjs CHANGED
@@ -8,7 +8,7 @@ const IS_DEBUG_VARIANT = process.env.EXTERNAL_SUBAGENT_VARIANT === 'debug';
8
8
 
9
9
  export const PRODUCT_NAME = IS_DEBUG_VARIANT ? 'external-subagent-debug' : 'external-subagent';
10
10
  export const PRODUCT_ID = IS_DEBUG_VARIANT ? 'external_subagent_debug' : 'external_subagent';
11
- export const VERSION = '0.3.1';
11
+ export const VERSION = '0.3.2';
12
12
  export const LAUNCH_AGENT_LABEL = IS_DEBUG_VARIANT ? 'com.external-subagent-debug.daemon' : 'com.external-subagent.daemon';
13
13
  export const DAEMON_BIN_NAME = IS_DEBUG_VARIANT ? 'external-subagent-debugd' : 'external-subagentd';
14
14
  export const MCP_BIN_NAME = IS_DEBUG_VARIANT ? 'external-subagent-debug-mcp' : 'external-subagent-mcp';
@@ -1,20 +1,20 @@
1
1
  {
2
2
  "schema_version": 1,
3
3
  "product": "external-subagent",
4
- "version": "0.3.1",
4
+ "version": "0.3.2",
5
5
  "platform": "darwin-arm64",
6
6
  "files": [
7
7
  {
8
8
  "name": "external-subagentd",
9
- "bytes": 9911616,
9
+ "bytes": 9907776,
10
10
  "mode": "755",
11
- "sha256": "d3f6d45a32d7675ba68fa059e70cca4c85f1ed781441b53dddfa7585751ea339"
11
+ "sha256": "b0dc9625006f6bbce38e78e46aa7ada47c9ba00c193e51b54f430302d931bfa6"
12
12
  },
13
13
  {
14
14
  "name": "external-subagent-mcp",
15
15
  "bytes": 935760,
16
16
  "mode": "755",
17
- "sha256": "504256978a7cf0cc16b13c8f53d75bca3c53bf65d1286a3c9bc22dc923cd0476"
17
+ "sha256": "0b26f44eaa3407016529aec3b948a56e3318cbc29f6d9b169056f426440b8478"
18
18
  }
19
19
  ]
20
20
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "external-subagent",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "description": "Manage bounded ZCode, DeepSeek Harness (DSH), Codex, and Google Antigravity (agy) subagent tasks through a local MCP service for any local host (Codex, ZCode, or a custom MCP client)",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -1,8 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  // Controlled-prefix install check for the packed artifact: install the tgz
3
3
  // into a throwaway npm prefix with an isolated HOME and npm cache, then verify
4
- // the staged bin entries, install-only HOME purity, an explicit init (with
5
- // launchd neutralized), and the resulting LaunchAgent/binding/registry files.
4
+ // the staged bin entries, install-only HOME purity, an explicit host-neutral
5
+ // init (with launchd neutralized), and the resulting standalone-service
6
+ // artifacts (LaunchAgent, config, activation state, retained payload bytes).
6
7
  // This never touches the real user HOME, the real ~/.codex, or launchd.
7
8
  // Usage: test-installed-tarball.mjs [package.tgz]
8
9
  import fs from 'node:fs';
@@ -47,27 +48,28 @@ try {
47
48
  process.exit(1);
48
49
  }
49
50
 
50
- // Use the real codex CLI when present (it only ever sees the throwaway
51
- // CODEX_HOME); otherwise fall back to an explicit skip so the check still
52
- // verifies the install/service layer without pretending Codex ran.
53
- const codexAvailable = spawnSync('codex', ['--version'], { encoding: 'utf8' }).status === 0;
54
- const initArgs = ['init', '--skip-runtime-probe'];
55
- if (!codexAvailable) initArgs.push('--skip-codex-plugin');
56
- const init = JSON.parse(run(cli, initArgs, { env }).stdout);
57
- if (!init.ok || !init.installed) {
51
+ // Host-neutral init: the standalone service layer only. Codex is never
52
+ // invoked and no host binding is staged — those belong to install-plugin /
53
+ // install-mcp and are covered by the install test suite, not this smoke.
54
+ const init = JSON.parse(run(cli, ['init'], { env }).stdout);
55
+ if (!init.ok || !init.completed?.includes('publish-active-payload')) {
58
56
  process.stderr.write(`init did not complete: ${JSON.stringify(init)}\n`);
59
57
  process.exit(1);
60
58
  }
59
+ const data = path.join(home, 'Library', 'Application Support', 'external-subagent');
61
60
  const expectedArtifacts = [
62
61
  path.join(home, 'Library', 'LaunchAgents', 'com.external-subagent.daemon.plist'),
63
- path.join(home, 'Library', 'Application Support', 'external-subagent', 'config.json'),
64
- path.join(home, 'plugins', 'external-subagent', '.mcp.json'),
62
+ path.join(data, 'config.json'),
63
+ path.join(data, 'install-state.json'),
64
+ path.join(data, 'payload-store', init.payload.version, 'external-subagentd'),
65
65
  ];
66
- if (codexAvailable) expectedArtifacts.push(path.join(home, '.agents', 'plugins', 'marketplace.json'));
67
66
  for (const target of expectedArtifacts) {
68
67
  if (!fs.existsSync(target)) { process.stderr.write(`init artifact missing: ${target}\n`); process.exit(1); }
69
68
  }
70
- process.stdout.write(`${JSON.stringify({ installed: true, codex_cli: codexAvailable ? 'real' : 'skipped', prefix: `${prefix} (removed)`, payload: init.payload, service: init.service }, null, 2)}\n`);
69
+ for (const forbidden of [path.join(home, 'plugins', 'external-subagent'), path.join(home, '.agents')]) {
70
+ if (fs.existsSync(forbidden)) { process.stderr.write(`init must bind no host: ${forbidden} exists\n`); process.exit(1); }
71
+ }
72
+ process.stdout.write(`${JSON.stringify({ installed: true, prefix: `${prefix} (removed)`, payload: init.payload, service: init.service }, null, 2)}\n`);
71
73
  } finally {
72
74
  fs.rmSync(work, { recursive: true, force: true });
73
75
  }