@techdigger/humanode-agentlink-cli 0.3.1 → 0.3.3

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.
@@ -15,5 +15,5 @@ export interface AuthorizeLinkOverrides {
15
15
  export interface AuthorizeLinkDeps {
16
16
  createAgentLinkConsent: typeof createAgentLinkConsent;
17
17
  }
18
- export declare function parseAuthorizeLinkOptions(argv: string[], env: EnvSource, now: Date, overrides?: AuthorizeLinkOverrides): AuthorizeLinkOptions;
18
+ export declare function parseAuthorizeLinkOptions(argv: string[], env: EnvSource, now: Date, overrides?: AuthorizeLinkOverrides): Promise<AuthorizeLinkOptions>;
19
19
  export declare function runAuthorizeLink(options: AuthorizeLinkOptions, deps?: Partial<AuthorizeLinkDeps>): Promise<AgentLinkConsentOutput>;
@@ -1,13 +1,28 @@
1
+ import { isAddress } from 'viem';
1
2
  import { createAgentLinkConsent } from '@techdigger/humanode-agentlink';
2
- import { CliError, assertNoExtraPositionals, parseFlags, parseFutureDeadline, parseRequiredAddress, resolveNetwork, resolvePrivateKey, resolveRegistryAddress, resolveRpcUrl, } from '../lib/core.js';
3
- export function parseAuthorizeLinkOptions(argv, env, now, overrides = {}) {
3
+ import { CliError, assertNoExtraPositionals, createConsolePrompter, defaultDeadline, parseFlags, parseFutureDeadline, parseRequiredAddress, resolveNetwork, resolvePrivateKey, resolveRegistryAddress, resolveRpcUrl, } from '../lib/core.js';
4
+ export async function parseAuthorizeLinkOptions(argv, env, now, overrides = {}) {
4
5
  const parsed = parseFlags(argv);
5
6
  assertNoExtraPositionals('authorize-link', parsed.positionals);
7
+ let ownerValue = parsed.values.owner;
8
+ if (!ownerValue) {
9
+ const prompter = createConsolePrompter();
10
+ try {
11
+ ownerValue = await prompter.text({ message: 'Owner wallet address (biomapped)' });
12
+ }
13
+ finally {
14
+ prompter.close();
15
+ }
16
+ }
17
+ if (!isAddress(ownerValue)) {
18
+ throw new CliError(`Invalid --owner. Expected a checksummed or lowercase EVM address.`);
19
+ }
20
+ const network = resolveNetwork(parsed.values.network, env);
6
21
  return {
7
- owner: parseRequiredAddress('owner', parsed.values.owner),
8
- registry: resolveRegistryAddress(parsed.values.registry, env),
9
- deadline: parseFutureDeadline(parsed.values.deadline, now),
10
- network: resolveNetwork(parsed.values.network, env),
22
+ owner: ownerValue,
23
+ registry: resolveRegistryAddress(parsed.values.registry, env, network),
24
+ deadline: parsed.values.deadline ? parseFutureDeadline(parsed.values.deadline, now) : defaultDeadline(now, 1),
25
+ network,
11
26
  privateKey: resolvePrivateKey(parsed.values['private-key'], env, overrides.privateKey),
12
27
  rpcUrl: resolveRpcUrl(parsed.values['rpc-url'], env),
13
28
  };
@@ -1,8 +1,7 @@
1
1
  import path from 'node:path';
2
2
  import { buildTemplateFiles } from '../templates.js';
3
- import { CliError, PACKAGE_MANAGERS, TEMPLATE_NAMES, createConsolePrompter, ensureTargetDirectoryIsWritable, getPackageManagerInstallCommand, getPackageManagerRunCommand, installProjectDependencies, parseAddressOrPlaceholder, parseFlags, resolveHumanodePackageSpecs, resolveNetwork, resolvePackageManager, resolvePackageSource, resolveTemplateName, toPackageName, writeGeneratedFiles, } from '../lib/core.js';
3
+ import { CliError, NETWORKS, PACKAGE_MANAGERS, TEMPLATE_NAMES, createConsolePrompter, ensureTargetDirectoryIsWritable, getPackageManagerInstallCommand, getPackageManagerRunCommand, installProjectDependencies, parseAddressOrPlaceholder, parseFlags, resolveHumanodePackageSpecs, resolveNetwork, resolvePackageManager, resolvePackageSource, resolveTemplateName, toPackageName, writeGeneratedFiles, } from '../lib/core.js';
4
4
  const DEFAULT_PROJECT_DIR = 'biomapper-agent';
5
- const DEFAULT_REGISTRY = '0xYourRegistryDeployment';
6
5
  export function parseInitOptions(argv, env) {
7
6
  const parsed = parseFlags(argv);
8
7
  if (parsed.positionals.length > 1) {
@@ -52,10 +51,11 @@ export async function runInit(options, depsInput = {}) {
52
51
  ],
53
52
  defaultValue: resolveNetwork(undefined, env),
54
53
  }));
55
- const registry = await resolveInteractiveValue(options.registry, options.yes, () => env.BIOMAPPER_REGISTRY ?? DEFAULT_REGISTRY, async () => parseAddressOrPlaceholder('registry', await getPrompter().text({
54
+ const networkDefaultRegistry = NETWORKS[network].defaultRegistry;
55
+ const registry = await resolveInteractiveValue(options.registry, options.yes, () => env.BIOMAPPER_REGISTRY ?? networkDefaultRegistry, async () => parseAddressOrPlaceholder('registry', await getPrompter().text({
56
56
  message: 'Biomapper registry address',
57
- defaultValue: env.BIOMAPPER_REGISTRY ?? DEFAULT_REGISTRY,
58
- }), DEFAULT_REGISTRY));
57
+ defaultValue: env.BIOMAPPER_REGISTRY ?? networkDefaultRegistry,
58
+ }), networkDefaultRegistry));
59
59
  const packageManager = await resolveInteractiveValue(options.packageManager, options.yes, () => 'npm', () => getPrompter().select({
60
60
  message: 'Package manager',
61
61
  options: PACKAGE_MANAGERS.map(value => ({ value, label: value })),
@@ -33,6 +33,6 @@ export interface LinkDeps {
33
33
  buildLinkUrl: (baseUrl: string, session: AgentLinkSession) => string;
34
34
  openUrl: (url: string) => Promise<void>;
35
35
  }
36
- export declare function parseLinkOptions(argv: string[], env: EnvSource, now: Date, overrides?: LinkOptionOverrides): LinkOptions;
36
+ export declare function parseLinkOptions(argv: string[], env: EnvSource, now: Date, overrides?: LinkOptionOverrides): Promise<LinkOptions>;
37
37
  export declare function runLink(options: LinkOptions, deps?: Partial<LinkDeps>): Promise<LinkResult>;
38
38
  export declare function formatLinkOutput(result: LinkResult, json?: boolean): string;
@@ -1,12 +1,27 @@
1
+ import { isAddress } from 'viem';
1
2
  import { buildEmbeddedHostedLinkUrl, createAgentLinkConsent, createLinkSession, } from '@techdigger/humanode-agentlink';
2
- import { CliError, NETWORKS, assertNoExtraPositionals, defaultDeadline, formatJson, parseFlags, parseFutureDeadline, parseRequiredAddress, resolveLinkerUrl, resolveNetwork, resolvePrivateKey, resolveRegistryAddress, resolveRpcUrl, openUrlInBrowser, } from '../lib/core.js';
3
- export function parseLinkOptions(argv, env, now, overrides = {}) {
3
+ import { CliError, NETWORKS, assertNoExtraPositionals, createConsolePrompter, defaultDeadline, formatJson, parseFlags, parseFutureDeadline, resolveLinkerUrl, resolveNetwork, resolvePrivateKey, resolveRegistryAddress, resolveRpcUrl, openUrlInBrowser, } from '../lib/core.js';
4
+ export async function parseLinkOptions(argv, env, now, overrides = {}) {
4
5
  const parsed = parseFlags(argv);
5
6
  assertNoExtraPositionals('link', parsed.positionals);
7
+ let ownerValue = parsed.values.owner;
8
+ if (!ownerValue) {
9
+ const prompter = createConsolePrompter();
10
+ try {
11
+ ownerValue = await prompter.text({ message: 'Owner wallet address (biomapped)' });
12
+ }
13
+ finally {
14
+ prompter.close();
15
+ }
16
+ }
17
+ if (!isAddress(ownerValue)) {
18
+ throw new CliError(`Invalid --owner. Expected a checksummed or lowercase EVM address.`);
19
+ }
20
+ const network = resolveNetwork(parsed.values.network, env);
6
21
  return {
7
- owner: parseRequiredAddress('owner', parsed.values.owner),
8
- registry: resolveRegistryAddress(parsed.values.registry, env),
9
- network: resolveNetwork(parsed.values.network, env),
22
+ owner: ownerValue,
23
+ registry: resolveRegistryAddress(parsed.values.registry, env, network),
24
+ network,
10
25
  deadline: parsed.values.deadline ? parseFutureDeadline(parsed.values.deadline, now) : defaultDeadline(now),
11
26
  privateKey: resolvePrivateKey(parsed.values['private-key'], env, overrides.privateKey),
12
27
  rpcUrl: resolveRpcUrl(parsed.values['rpc-url'], env),
@@ -11,10 +11,11 @@ export function parseStatusOptions(argv, env, overrides = {}) {
11
11
  const privateKey = resolvePrivateKey(parsed.values['private-key'], env, overrides.privateKey);
12
12
  agent = deriveAgentAddress(privateKey);
13
13
  }
14
+ const network = resolveNetwork(parsed.values.network, env);
14
15
  return {
15
- registry: resolveRegistryAddress(parsed.values.registry, env),
16
+ registry: resolveRegistryAddress(parsed.values.registry, env, network),
16
17
  agent,
17
- network: resolveNetwork(parsed.values.network, env),
18
+ network,
18
19
  rpcUrl: resolveRpcUrl(parsed.values['rpc-url'], env),
19
20
  json: parsed.flags.has('json'),
20
21
  };
package/dist/help.js CHANGED
@@ -14,8 +14,8 @@ Flags:
14
14
  Run agentlink <command> --help for command-specific options.
15
15
 
16
16
  Environment:
17
- BIOMAPPER_NETWORK Default network (base | base-sepolia)
18
- BIOMAPPER_REGISTRY Default BiomapperAgentRegistry address
17
+ BIOMAPPER_NETWORK Override network (base | base-sepolia) — default: base-sepolia
18
+ BIOMAPPER_REGISTRY Override registry address — default: built-in address for the selected network
19
19
  BIOMAPPER_RPC_URL Optional RPC URL override
20
20
  AGENTLINK_TELEMETRY Optional override for the saved CLI telemetry choice (on | off)
21
21
  AGENTLINK_POSTHOG_KEY Optional PostHog API key for CLI telemetry
package/dist/index.js CHANGED
@@ -83,7 +83,7 @@ export async function runCli(argv = process.argv.slice(2), overrides = {}) {
83
83
  return 0;
84
84
  }
85
85
  const authorizePrivateKey = await readPrivateKeyFromStdin(args, runtime);
86
- writeLine(runtime.stdout, formatJson(await runAuthorizeLink(parseAuthorizeLinkOptions(args, runtime.env, runtime.now, {
86
+ writeLine(runtime.stdout, formatJson(await runAuthorizeLink(await parseAuthorizeLinkOptions(args, runtime.env, runtime.now, {
87
87
  privateKey: authorizePrivateKey,
88
88
  }), {
89
89
  createAgentLinkConsent: runtime.createAgentLinkConsent,
@@ -136,7 +136,7 @@ export async function runCli(argv = process.argv.slice(2), overrides = {}) {
136
136
  return 0;
137
137
  }
138
138
  const linkPrivateKey = await readPrivateKeyFromStdin(args, runtime);
139
- const options = parseLinkOptions(args, runtime.env, runtime.now, {
139
+ const options = await parseLinkOptions(args, runtime.env, runtime.now, {
140
140
  privateKey: linkPrivateKey,
141
141
  });
142
142
  const result = await runLink(options, {
@@ -3,10 +3,12 @@ export declare const NETWORKS: {
3
3
  readonly base: {
4
4
  readonly label: "Base mainnet";
5
5
  readonly biomapperAppUrl: string;
6
+ readonly defaultRegistry: Address;
6
7
  };
7
8
  readonly 'base-sepolia': {
8
9
  readonly label: "Base Sepolia";
9
10
  readonly biomapperAppUrl: string;
11
+ readonly defaultRegistry: Address;
10
12
  };
11
13
  };
12
14
  export type NetworkName = keyof typeof NETWORKS;
@@ -64,7 +66,7 @@ export declare function assertNoExtraPositionals(command: string, positionals: s
64
66
  export declare function resolveNetwork(value: string | undefined, env: EnvSource): NetworkName;
65
67
  export declare function parseRequiredAddress(name: string, value: string | undefined): Address;
66
68
  export declare function parseAddressOrPlaceholder(name: string, value: string | undefined, fallback: string): string;
67
- export declare function resolveRegistryAddress(value: string | undefined, env: EnvSource): Address;
69
+ export declare function resolveRegistryAddress(value: string | undefined, env: EnvSource, network?: NetworkName): Address;
68
70
  export declare function resolveRpcUrl(value: string | undefined, env: EnvSource): string | undefined;
69
71
  export declare function resolveLinkerUrl(value: string | undefined, env: EnvSource): string;
70
72
  export declare function readPassword(prompt: string): Promise<string>;
package/dist/lib/core.js CHANGED
@@ -11,10 +11,12 @@ export const NETWORKS = {
11
11
  base: {
12
12
  label: 'Base mainnet',
13
13
  biomapperAppUrl: BIOMAPPER_APP_URLS.base,
14
+ defaultRegistry: '0x', // populated at mainnet launch
14
15
  },
15
16
  'base-sepolia': {
16
17
  label: 'Base Sepolia',
17
18
  biomapperAppUrl: BIOMAPPER_APP_URLS['base-sepolia'],
19
+ defaultRegistry: '0xc0fb26BaACe7E1BCb3aFFD547AD5f2cAc4A4F51b',
18
20
  },
19
21
  };
20
22
  export const TEMPLATE_NAMES = ['langchain', 'vercel-ai-sdk', 'mcp'];
@@ -127,8 +129,16 @@ export function parseAddressOrPlaceholder(name, value, fallback) {
127
129
  }
128
130
  return candidate;
129
131
  }
130
- export function resolveRegistryAddress(value, env) {
131
- return parseRequiredAddress('registry', value ?? env.BIOMAPPER_REGISTRY);
132
+ export function resolveRegistryAddress(value, env, network) {
133
+ const explicit = value ?? env.BIOMAPPER_REGISTRY;
134
+ if (explicit)
135
+ return parseRequiredAddress('registry', explicit);
136
+ if (network) {
137
+ const defaultRegistry = NETWORKS[network].defaultRegistry;
138
+ if (defaultRegistry !== '0x')
139
+ return defaultRegistry;
140
+ }
141
+ throw new CliError('Missing --registry. Set BIOMAPPER_REGISTRY or pass --registry.');
132
142
  }
133
143
  export function resolveRpcUrl(value, env) {
134
144
  return value ?? env.BIOMAPPER_RPC_URL;
package/dist/templates.js CHANGED
@@ -7,16 +7,11 @@ const MCP_SDK_VERSION = '^1.12.1';
7
7
  const DOTENV_VERSION = '^17.3.1';
8
8
  const TSX_VERSION = '^4.19.4';
9
9
  const TYPESCRIPT_VERSION = '^5.8.3';
10
- function buildCommonEnv(input, includeOpenAI) {
10
+ function buildCommonEnv(input, _includeOpenAI) {
11
11
  const lines = [
12
- `AGENT_PRIVATE_KEY=0xyouragentprivatekey`,
13
12
  `BIOMAPPER_NETWORK=${input.network}`,
14
13
  `BIOMAPPER_REGISTRY=${input.registry}`,
15
- `BIOMAPPER_LINKER_URL=http://localhost:5173/`,
16
14
  ];
17
- if (includeOpenAI) {
18
- lines.unshift('OPENAI_API_KEY=your-openai-api-key', 'OPENAI_MODEL=gpt-4.1-mini');
19
- }
20
15
  return `${lines.join('\n')}\n`;
21
16
  }
22
17
  function buildGitIgnore() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@techdigger/humanode-agentlink-cli",
3
- "version": "0.3.1",
3
+ "version": "0.3.3",
4
4
  "description": "Scaffold, link, and inspect Biomapper-ready agent projects.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",