apptvty 0.2.1 → 0.2.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/dist/cli.js CHANGED
@@ -46,12 +46,13 @@ async function register(options) {
46
46
  trialEndsAt: data.trial_ends_at,
47
47
  email: data.email ?? null,
48
48
  setup: {
49
- envVars: data.setup?.env_vars ?? {
49
+ envFile: data.env_file || (data.framework === "nextjs" ? ".env.local" : ".env"),
50
+ envVars: data.env_vars || {
50
51
  APPTVTY_SITE_ID: data.site_id,
51
52
  APPTVTY_API_KEY: data.api_key
52
53
  },
53
- files: data.setup?.files,
54
- x402: data.setup?.x402
54
+ files: data.files,
55
+ x402: data.x402
55
56
  }
56
57
  };
57
58
  }
@@ -250,7 +251,7 @@ async function runInit() {
250
251
  if (!isNonInteractive) {
251
252
  console.log(" done\n");
252
253
  }
253
- const envFile = framework === "nextjs" ? ".env.local" : ".env";
254
+ const envFile = result.setup.envFile || (framework === "nextjs" ? ".env.local" : ".env");
254
255
  appendEnvFile(envFile, result.setup.envVars);
255
256
  const scaffolded = [];
256
257
  if (result.setup.files && !isNonInteractive) {
package/dist/setup.d.mts CHANGED
@@ -31,9 +31,12 @@ interface RegisterResult {
31
31
  trialEndsAt: string;
32
32
  email: string | null;
33
33
  setup: {
34
+ envFile: string;
34
35
  envVars: {
35
36
  APPTVTY_SITE_ID: string;
36
37
  APPTVTY_API_KEY: string;
38
+ APPTVTY_DASHBOARD_SECRET: string;
39
+ APPTVTY_CLAIM_TOKEN: string;
37
40
  };
38
41
  files?: Record<string, string>;
39
42
  x402?: {
package/dist/setup.d.ts CHANGED
@@ -31,9 +31,12 @@ interface RegisterResult {
31
31
  trialEndsAt: string;
32
32
  email: string | null;
33
33
  setup: {
34
+ envFile: string;
34
35
  envVars: {
35
36
  APPTVTY_SITE_ID: string;
36
37
  APPTVTY_API_KEY: string;
38
+ APPTVTY_DASHBOARD_SECRET: string;
39
+ APPTVTY_CLAIM_TOKEN: string;
37
40
  };
38
41
  files?: Record<string, string>;
39
42
  x402?: {
package/dist/setup.js CHANGED
@@ -66,12 +66,13 @@ async function register(options) {
66
66
  trialEndsAt: data.trial_ends_at,
67
67
  email: data.email ?? null,
68
68
  setup: {
69
- envVars: data.setup?.env_vars ?? {
69
+ envFile: data.env_file || (data.framework === "nextjs" ? ".env.local" : ".env"),
70
+ envVars: data.env_vars || {
70
71
  APPTVTY_SITE_ID: data.site_id,
71
72
  APPTVTY_API_KEY: data.api_key
72
73
  },
73
- files: data.setup?.files,
74
- x402: data.setup?.x402
74
+ files: data.files,
75
+ x402: data.x402
75
76
  }
76
77
  };
77
78
  }
package/dist/setup.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/setup.ts"],"sourcesContent":["/**\n * Programmatic registration for coding agents.\n *\n * Usage (in a setup script or agent tool call):\n *\n * import { register } from 'apptvty/setup';\n * const result = await register({ domain: 'mysite.com', framework: 'nextjs' });\n * console.log(result.api_key, result.dashboard_url);\n *\n * No email required — a Crossmint wallet is created automatically using\n * the generated company_id as the owner identifier.\n */\n\nconst DEFAULT_API_URL: string =\n (typeof process !== 'undefined' ? process.env?.APPTVTY_API_URL : undefined) ??\n 'https://api.apptvty.com';\n\nexport interface RegisterOptions {\n domain: string;\n framework?: 'nextjs' | 'express' | 'other';\n /** Optional — passed to the API for analytics on agent type */\n agentId?: string;\n /** Optional — email to associate with this account so the human can claim it via magic link */\n email?: string;\n /** Override the API base URL (useful for self-hosted / staging) */\n apiUrl?: string;\n}\n\nexport interface RegisterResult {\n siteId: string;\n apiKey: string;\n companyId: string;\n walletAddress: string | null;\n platformDepositAddress: string | null;\n dashboardUrl: string;\n claimTokenExpiresAt: string;\n trialEndsAt: string;\n email: string | null;\n setup: {\n envVars: { APPTVTY_SITE_ID: string; APPTVTY_API_KEY: string };\n files?: Record<string, string>;\n x402?: {\n protocol: string;\n chain: string;\n currency: string;\n };\n };\n}\n\nexport class RegistrationError extends Error {\n constructor(\n public readonly code: string,\n message: string,\n ) {\n super(message);\n this.name = 'RegistrationError';\n }\n}\n\n/**\n * Register a new site with Apptvty.\n *\n * Idempotent per domain — if the domain is already registered, throws\n * RegistrationError with code DOMAIN_TAKEN.\n */\nexport async function register(options: RegisterOptions): Promise<RegisterResult> {\n const apiUrl = (options.apiUrl ?? DEFAULT_API_URL).replace(/\\/$/, '');\n\n const response = await fetch(`${apiUrl}/v1/register`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n domain: options.domain,\n framework: options.framework ?? 'other',\n agent_id: options.agentId,\n ...(options.email && { email: options.email }),\n }),\n signal: AbortSignal.timeout(20_000),\n });\n\n const json = await response.json() as any;\n\n if (!response.ok) {\n throw new RegistrationError(\n json.error?.code ?? 'REGISTRATION_FAILED',\n json.error?.message ?? `Registration failed with status ${response.status}`,\n );\n }\n\n const data = json.data ?? json;\n\n return {\n siteId: data.site_id,\n apiKey: data.api_key,\n companyId: data.company_id,\n walletAddress: data.wallet_address ?? null,\n platformDepositAddress: data.platform_deposit_address ?? null,\n dashboardUrl: data.dashboard_url,\n claimTokenExpiresAt: data.claim_token_expires_at,\n trialEndsAt: data.trial_ends_at,\n email: data.email ?? null,\n setup: {\n envVars: data.setup?.env_vars ?? {\n APPTVTY_SITE_ID: data.site_id,\n APPTVTY_API_KEY: data.api_key,\n },\n files: data.setup?.files,\n x402: data.setup?.x402,\n },\n };\n}\n\n// ─── Migrate (reindex / re-crawl) ─────────────────────────────────────────────\n\nexport interface MigrateOptions {\n siteId: string;\n apiKey: string;\n /** Override API base URL (useful for self-hosted / staging) */\n apiUrl?: string;\n}\n\nexport interface MigrateResult {\n message: string;\n siteId: string;\n domain: string;\n}\n\nexport class MigrateError extends Error {\n constructor(\n public readonly code: string,\n message: string,\n ) {\n super(message);\n this.name = 'MigrateError';\n }\n}\n\n/**\n * Trigger an immediate re-crawl/reindex of a site.\n *\n * Use after publishing new content or updating your sitemap.\n * The crawl runs asynchronously — the endpoint returns 202 immediately.\n */\nexport async function migrate(options: MigrateOptions): Promise<MigrateResult> {\n const apiUrl = (options.apiUrl ?? DEFAULT_API_URL).replace(/\\/$/, '');\n\n const response = await fetch(`${apiUrl}/v1/sites/${options.siteId}/reindex`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${options.apiKey}`,\n 'Content-Type': 'application/json',\n },\n signal: AbortSignal.timeout(20_000),\n });\n\n const json = (await response.json()) as {\n error?: { code?: string; message?: string };\n data?: { message?: string; siteId?: string; domain?: string };\n message?: string;\n siteId?: string;\n domain?: string;\n };\n const data = json.data ?? json;\n const err = json.error;\n\n if (!response.ok) {\n throw new MigrateError(err?.code ?? 'MIGRATE_FAILED', err?.message ?? `Migrate failed with status ${response.status}`);\n }\n\n return {\n message: (data as { message?: string }).message ?? 'Reindex started.',\n siteId: (data as { siteId?: string }).siteId ?? options.siteId,\n domain: (data as { domain?: string }).domain ?? '',\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaA,IAAM,mBACH,OAAO,YAAY,cAAc,QAAQ,KAAK,kBAAkB,WACjE;AAkCK,IAAM,oBAAN,cAAgC,MAAM;AAAA,EAC3C,YACkB,MAChB,SACA;AACA,UAAM,OAAO;AAHG;AAIhB,SAAK,OAAO;AAAA,EACd;AACF;AAQA,eAAsB,SAAS,SAAmD;AAChF,QAAM,UAAU,QAAQ,UAAU,iBAAiB,QAAQ,OAAO,EAAE;AAEpE,QAAM,WAAW,MAAM,MAAM,GAAG,MAAM,gBAAgB;AAAA,IACpD,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU;AAAA,MACnB,QAAQ,QAAQ;AAAA,MAChB,WAAW,QAAQ,aAAa;AAAA,MAChC,UAAU,QAAQ;AAAA,MAClB,GAAI,QAAQ,SAAS,EAAE,OAAO,QAAQ,MAAM;AAAA,IAC9C,CAAC;AAAA,IACD,QAAQ,YAAY,QAAQ,GAAM;AAAA,EACpC,CAAC;AAED,QAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI;AAAA,MACR,KAAK,OAAO,QAAQ;AAAA,MACpB,KAAK,OAAO,WAAW,mCAAmC,SAAS,MAAM;AAAA,IAC3E;AAAA,EACF;AAEA,QAAM,OAAO,KAAK,QAAQ;AAE1B,SAAO;AAAA,IACL,QAAQ,KAAK;AAAA,IACb,QAAQ,KAAK;AAAA,IACb,WAAW,KAAK;AAAA,IAChB,eAAe,KAAK,kBAAkB;AAAA,IACtC,wBAAwB,KAAK,4BAA4B;AAAA,IACzD,cAAc,KAAK;AAAA,IACnB,qBAAqB,KAAK;AAAA,IAC1B,aAAa,KAAK;AAAA,IAClB,OAAO,KAAK,SAAS;AAAA,IACrB,OAAO;AAAA,MACL,SAAS,KAAK,OAAO,YAAY;AAAA,QAC/B,iBAAiB,KAAK;AAAA,QACtB,iBAAiB,KAAK;AAAA,MACxB;AAAA,MACA,OAAO,KAAK,OAAO;AAAA,MACnB,MAAM,KAAK,OAAO;AAAA,IACpB;AAAA,EACF;AACF;AAiBO,IAAM,eAAN,cAA2B,MAAM;AAAA,EACtC,YACkB,MAChB,SACA;AACA,UAAM,OAAO;AAHG;AAIhB,SAAK,OAAO;AAAA,EACd;AACF;AAQA,eAAsB,QAAQ,SAAiD;AAC7E,QAAM,UAAU,QAAQ,UAAU,iBAAiB,QAAQ,OAAO,EAAE;AAEpE,QAAM,WAAW,MAAM,MAAM,GAAG,MAAM,aAAa,QAAQ,MAAM,YAAY;AAAA,IAC3E,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,eAAe,UAAU,QAAQ,MAAM;AAAA,MACvC,gBAAgB;AAAA,IAClB;AAAA,IACA,QAAQ,YAAY,QAAQ,GAAM;AAAA,EACpC,CAAC;AAED,QAAM,OAAQ,MAAM,SAAS,KAAK;AAOlC,QAAM,OAAO,KAAK,QAAQ;AAC1B,QAAM,MAAM,KAAK;AAEjB,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,aAAa,KAAK,QAAQ,kBAAkB,KAAK,WAAW,8BAA8B,SAAS,MAAM,EAAE;AAAA,EACvH;AAEA,SAAO;AAAA,IACL,SAAU,KAA8B,WAAW;AAAA,IACnD,QAAS,KAA6B,UAAU,QAAQ;AAAA,IACxD,QAAS,KAA6B,UAAU;AAAA,EAClD;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/setup.ts"],"sourcesContent":["/**\n * Programmatic registration for coding agents.\n *\n * Usage (in a setup script or agent tool call):\n *\n * import { register } from 'apptvty/setup';\n * const result = await register({ domain: 'mysite.com', framework: 'nextjs' });\n * console.log(result.api_key, result.dashboard_url);\n *\n * No email required — a Crossmint wallet is created automatically using\n * the generated company_id as the owner identifier.\n */\n\nconst DEFAULT_API_URL: string =\n (typeof process !== 'undefined' ? process.env?.APPTVTY_API_URL : undefined) ??\n 'https://api.apptvty.com';\n\nexport interface RegisterOptions {\n domain: string;\n framework?: 'nextjs' | 'express' | 'other';\n /** Optional — passed to the API for analytics on agent type */\n agentId?: string;\n /** Optional — email to associate with this account so the human can claim it via magic link */\n email?: string;\n /** Override the API base URL (useful for self-hosted / staging) */\n apiUrl?: string;\n}\n\nexport interface RegisterResult {\n siteId: string;\n apiKey: string;\n companyId: string;\n walletAddress: string | null;\n platformDepositAddress: string | null;\n dashboardUrl: string;\n claimTokenExpiresAt: string;\n trialEndsAt: string;\n email: string | null;\n setup: {\n envFile: string;\n envVars: { \n APPTVTY_SITE_ID: string; \n APPTVTY_API_KEY: string;\n APPTVTY_DASHBOARD_SECRET: string;\n APPTVTY_CLAIM_TOKEN: string;\n };\n files?: Record<string, string>;\n x402?: {\n protocol: string;\n chain: string;\n currency: string;\n };\n };\n}\n\nexport class RegistrationError extends Error {\n constructor(\n public readonly code: string,\n message: string,\n ) {\n super(message);\n this.name = 'RegistrationError';\n }\n}\n\n/**\n * Register a new site with Apptvty.\n *\n * Idempotent per domain — if the domain is already registered, throws\n * RegistrationError with code DOMAIN_TAKEN.\n */\nexport async function register(options: RegisterOptions): Promise<RegisterResult> {\n const apiUrl = (options.apiUrl ?? DEFAULT_API_URL).replace(/\\/$/, '');\n\n const response = await fetch(`${apiUrl}/v1/register`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n domain: options.domain,\n framework: options.framework ?? 'other',\n agent_id: options.agentId,\n ...(options.email && { email: options.email }),\n }),\n signal: AbortSignal.timeout(20_000),\n });\n\n const json = await response.json() as any;\n\n if (!response.ok) {\n throw new RegistrationError(\n json.error?.code ?? 'REGISTRATION_FAILED',\n json.error?.message ?? `Registration failed with status ${response.status}`,\n );\n }\n\n const data = json.data ?? json;\n\n return {\n siteId: data.site_id,\n apiKey: data.api_key,\n companyId: data.company_id,\n walletAddress: data.wallet_address ?? null,\n platformDepositAddress: data.platform_deposit_address ?? null,\n dashboardUrl: data.dashboard_url,\n claimTokenExpiresAt: data.claim_token_expires_at,\n trialEndsAt: data.trial_ends_at,\n email: data.email ?? null,\n setup: {\n envFile: data.env_file || (data.framework === 'nextjs' ? '.env.local' : '.env'),\n envVars: data.env_vars || {\n APPTVTY_SITE_ID: data.site_id,\n APPTVTY_API_KEY: data.api_key,\n },\n files: data.files,\n x402: data.x402,\n },\n };\n}\n\n// ─── Migrate (reindex / re-crawl) ─────────────────────────────────────────────\n\nexport interface MigrateOptions {\n siteId: string;\n apiKey: string;\n /** Override API base URL (useful for self-hosted / staging) */\n apiUrl?: string;\n}\n\nexport interface MigrateResult {\n message: string;\n siteId: string;\n domain: string;\n}\n\nexport class MigrateError extends Error {\n constructor(\n public readonly code: string,\n message: string,\n ) {\n super(message);\n this.name = 'MigrateError';\n }\n}\n\n/**\n * Trigger an immediate re-crawl/reindex of a site.\n *\n * Use after publishing new content or updating your sitemap.\n * The crawl runs asynchronously — the endpoint returns 202 immediately.\n */\nexport async function migrate(options: MigrateOptions): Promise<MigrateResult> {\n const apiUrl = (options.apiUrl ?? DEFAULT_API_URL).replace(/\\/$/, '');\n\n const response = await fetch(`${apiUrl}/v1/sites/${options.siteId}/reindex`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${options.apiKey}`,\n 'Content-Type': 'application/json',\n },\n signal: AbortSignal.timeout(20_000),\n });\n\n const json = (await response.json()) as {\n error?: { code?: string; message?: string };\n data?: { message?: string; siteId?: string; domain?: string };\n message?: string;\n siteId?: string;\n domain?: string;\n };\n const data = json.data ?? json;\n const err = json.error;\n\n if (!response.ok) {\n throw new MigrateError(err?.code ?? 'MIGRATE_FAILED', err?.message ?? `Migrate failed with status ${response.status}`);\n }\n\n return {\n message: (data as { message?: string }).message ?? 'Reindex started.',\n siteId: (data as { siteId?: string }).siteId ?? options.siteId,\n domain: (data as { domain?: string }).domain ?? '',\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaA,IAAM,mBACH,OAAO,YAAY,cAAc,QAAQ,KAAK,kBAAkB,WACjE;AAwCK,IAAM,oBAAN,cAAgC,MAAM;AAAA,EAC3C,YACkB,MAChB,SACA;AACA,UAAM,OAAO;AAHG;AAIhB,SAAK,OAAO;AAAA,EACd;AACF;AAQA,eAAsB,SAAS,SAAmD;AAChF,QAAM,UAAU,QAAQ,UAAU,iBAAiB,QAAQ,OAAO,EAAE;AAEpE,QAAM,WAAW,MAAM,MAAM,GAAG,MAAM,gBAAgB;AAAA,IACpD,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU;AAAA,MACnB,QAAQ,QAAQ;AAAA,MAChB,WAAW,QAAQ,aAAa;AAAA,MAChC,UAAU,QAAQ;AAAA,MAClB,GAAI,QAAQ,SAAS,EAAE,OAAO,QAAQ,MAAM;AAAA,IAC9C,CAAC;AAAA,IACD,QAAQ,YAAY,QAAQ,GAAM;AAAA,EACpC,CAAC;AAED,QAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI;AAAA,MACR,KAAK,OAAO,QAAQ;AAAA,MACpB,KAAK,OAAO,WAAW,mCAAmC,SAAS,MAAM;AAAA,IAC3E;AAAA,EACF;AAEA,QAAM,OAAO,KAAK,QAAQ;AAE1B,SAAO;AAAA,IACL,QAAQ,KAAK;AAAA,IACb,QAAQ,KAAK;AAAA,IACb,WAAW,KAAK;AAAA,IAChB,eAAe,KAAK,kBAAkB;AAAA,IACtC,wBAAwB,KAAK,4BAA4B;AAAA,IACzD,cAAc,KAAK;AAAA,IACnB,qBAAqB,KAAK;AAAA,IAC1B,aAAa,KAAK;AAAA,IAClB,OAAO,KAAK,SAAS;AAAA,IACrB,OAAO;AAAA,MACL,SAAS,KAAK,aAAa,KAAK,cAAc,WAAW,eAAe;AAAA,MACxE,SAAS,KAAK,YAAY;AAAA,QACxB,iBAAiB,KAAK;AAAA,QACtB,iBAAiB,KAAK;AAAA,MACxB;AAAA,MACA,OAAO,KAAK;AAAA,MACZ,MAAM,KAAK;AAAA,IACb;AAAA,EACF;AACF;AAiBO,IAAM,eAAN,cAA2B,MAAM;AAAA,EACtC,YACkB,MAChB,SACA;AACA,UAAM,OAAO;AAHG;AAIhB,SAAK,OAAO;AAAA,EACd;AACF;AAQA,eAAsB,QAAQ,SAAiD;AAC7E,QAAM,UAAU,QAAQ,UAAU,iBAAiB,QAAQ,OAAO,EAAE;AAEpE,QAAM,WAAW,MAAM,MAAM,GAAG,MAAM,aAAa,QAAQ,MAAM,YAAY;AAAA,IAC3E,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,eAAe,UAAU,QAAQ,MAAM;AAAA,MACvC,gBAAgB;AAAA,IAClB;AAAA,IACA,QAAQ,YAAY,QAAQ,GAAM;AAAA,EACpC,CAAC;AAED,QAAM,OAAQ,MAAM,SAAS,KAAK;AAOlC,QAAM,OAAO,KAAK,QAAQ;AAC1B,QAAM,MAAM,KAAK;AAEjB,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,aAAa,KAAK,QAAQ,kBAAkB,KAAK,WAAW,8BAA8B,SAAS,MAAM,EAAE;AAAA,EACvH;AAEA,SAAO;AAAA,IACL,SAAU,KAA8B,WAAW;AAAA,IACnD,QAAS,KAA6B,UAAU,QAAQ;AAAA,IACxD,QAAS,KAA6B,UAAU;AAAA,EAClD;AACF;","names":[]}
package/dist/setup.mjs CHANGED
@@ -39,12 +39,13 @@ async function register(options) {
39
39
  trialEndsAt: data.trial_ends_at,
40
40
  email: data.email ?? null,
41
41
  setup: {
42
- envVars: data.setup?.env_vars ?? {
42
+ envFile: data.env_file || (data.framework === "nextjs" ? ".env.local" : ".env"),
43
+ envVars: data.env_vars || {
43
44
  APPTVTY_SITE_ID: data.site_id,
44
45
  APPTVTY_API_KEY: data.api_key
45
46
  },
46
- files: data.setup?.files,
47
- x402: data.setup?.x402
47
+ files: data.files,
48
+ x402: data.x402
48
49
  }
49
50
  };
50
51
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/setup.ts"],"sourcesContent":["/**\n * Programmatic registration for coding agents.\n *\n * Usage (in a setup script or agent tool call):\n *\n * import { register } from 'apptvty/setup';\n * const result = await register({ domain: 'mysite.com', framework: 'nextjs' });\n * console.log(result.api_key, result.dashboard_url);\n *\n * No email required — a Crossmint wallet is created automatically using\n * the generated company_id as the owner identifier.\n */\n\nconst DEFAULT_API_URL: string =\n (typeof process !== 'undefined' ? process.env?.APPTVTY_API_URL : undefined) ??\n 'https://api.apptvty.com';\n\nexport interface RegisterOptions {\n domain: string;\n framework?: 'nextjs' | 'express' | 'other';\n /** Optional — passed to the API for analytics on agent type */\n agentId?: string;\n /** Optional — email to associate with this account so the human can claim it via magic link */\n email?: string;\n /** Override the API base URL (useful for self-hosted / staging) */\n apiUrl?: string;\n}\n\nexport interface RegisterResult {\n siteId: string;\n apiKey: string;\n companyId: string;\n walletAddress: string | null;\n platformDepositAddress: string | null;\n dashboardUrl: string;\n claimTokenExpiresAt: string;\n trialEndsAt: string;\n email: string | null;\n setup: {\n envVars: { APPTVTY_SITE_ID: string; APPTVTY_API_KEY: string };\n files?: Record<string, string>;\n x402?: {\n protocol: string;\n chain: string;\n currency: string;\n };\n };\n}\n\nexport class RegistrationError extends Error {\n constructor(\n public readonly code: string,\n message: string,\n ) {\n super(message);\n this.name = 'RegistrationError';\n }\n}\n\n/**\n * Register a new site with Apptvty.\n *\n * Idempotent per domain — if the domain is already registered, throws\n * RegistrationError with code DOMAIN_TAKEN.\n */\nexport async function register(options: RegisterOptions): Promise<RegisterResult> {\n const apiUrl = (options.apiUrl ?? DEFAULT_API_URL).replace(/\\/$/, '');\n\n const response = await fetch(`${apiUrl}/v1/register`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n domain: options.domain,\n framework: options.framework ?? 'other',\n agent_id: options.agentId,\n ...(options.email && { email: options.email }),\n }),\n signal: AbortSignal.timeout(20_000),\n });\n\n const json = await response.json() as any;\n\n if (!response.ok) {\n throw new RegistrationError(\n json.error?.code ?? 'REGISTRATION_FAILED',\n json.error?.message ?? `Registration failed with status ${response.status}`,\n );\n }\n\n const data = json.data ?? json;\n\n return {\n siteId: data.site_id,\n apiKey: data.api_key,\n companyId: data.company_id,\n walletAddress: data.wallet_address ?? null,\n platformDepositAddress: data.platform_deposit_address ?? null,\n dashboardUrl: data.dashboard_url,\n claimTokenExpiresAt: data.claim_token_expires_at,\n trialEndsAt: data.trial_ends_at,\n email: data.email ?? null,\n setup: {\n envVars: data.setup?.env_vars ?? {\n APPTVTY_SITE_ID: data.site_id,\n APPTVTY_API_KEY: data.api_key,\n },\n files: data.setup?.files,\n x402: data.setup?.x402,\n },\n };\n}\n\n// ─── Migrate (reindex / re-crawl) ─────────────────────────────────────────────\n\nexport interface MigrateOptions {\n siteId: string;\n apiKey: string;\n /** Override API base URL (useful for self-hosted / staging) */\n apiUrl?: string;\n}\n\nexport interface MigrateResult {\n message: string;\n siteId: string;\n domain: string;\n}\n\nexport class MigrateError extends Error {\n constructor(\n public readonly code: string,\n message: string,\n ) {\n super(message);\n this.name = 'MigrateError';\n }\n}\n\n/**\n * Trigger an immediate re-crawl/reindex of a site.\n *\n * Use after publishing new content or updating your sitemap.\n * The crawl runs asynchronously — the endpoint returns 202 immediately.\n */\nexport async function migrate(options: MigrateOptions): Promise<MigrateResult> {\n const apiUrl = (options.apiUrl ?? DEFAULT_API_URL).replace(/\\/$/, '');\n\n const response = await fetch(`${apiUrl}/v1/sites/${options.siteId}/reindex`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${options.apiKey}`,\n 'Content-Type': 'application/json',\n },\n signal: AbortSignal.timeout(20_000),\n });\n\n const json = (await response.json()) as {\n error?: { code?: string; message?: string };\n data?: { message?: string; siteId?: string; domain?: string };\n message?: string;\n siteId?: string;\n domain?: string;\n };\n const data = json.data ?? json;\n const err = json.error;\n\n if (!response.ok) {\n throw new MigrateError(err?.code ?? 'MIGRATE_FAILED', err?.message ?? `Migrate failed with status ${response.status}`);\n }\n\n return {\n message: (data as { message?: string }).message ?? 'Reindex started.',\n siteId: (data as { siteId?: string }).siteId ?? options.siteId,\n domain: (data as { domain?: string }).domain ?? '',\n };\n}\n"],"mappings":";AAaA,IAAM,mBACH,OAAO,YAAY,cAAc,QAAQ,KAAK,kBAAkB,WACjE;AAkCK,IAAM,oBAAN,cAAgC,MAAM;AAAA,EAC3C,YACkB,MAChB,SACA;AACA,UAAM,OAAO;AAHG;AAIhB,SAAK,OAAO;AAAA,EACd;AACF;AAQA,eAAsB,SAAS,SAAmD;AAChF,QAAM,UAAU,QAAQ,UAAU,iBAAiB,QAAQ,OAAO,EAAE;AAEpE,QAAM,WAAW,MAAM,MAAM,GAAG,MAAM,gBAAgB;AAAA,IACpD,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU;AAAA,MACnB,QAAQ,QAAQ;AAAA,MAChB,WAAW,QAAQ,aAAa;AAAA,MAChC,UAAU,QAAQ;AAAA,MAClB,GAAI,QAAQ,SAAS,EAAE,OAAO,QAAQ,MAAM;AAAA,IAC9C,CAAC;AAAA,IACD,QAAQ,YAAY,QAAQ,GAAM;AAAA,EACpC,CAAC;AAED,QAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI;AAAA,MACR,KAAK,OAAO,QAAQ;AAAA,MACpB,KAAK,OAAO,WAAW,mCAAmC,SAAS,MAAM;AAAA,IAC3E;AAAA,EACF;AAEA,QAAM,OAAO,KAAK,QAAQ;AAE1B,SAAO;AAAA,IACL,QAAQ,KAAK;AAAA,IACb,QAAQ,KAAK;AAAA,IACb,WAAW,KAAK;AAAA,IAChB,eAAe,KAAK,kBAAkB;AAAA,IACtC,wBAAwB,KAAK,4BAA4B;AAAA,IACzD,cAAc,KAAK;AAAA,IACnB,qBAAqB,KAAK;AAAA,IAC1B,aAAa,KAAK;AAAA,IAClB,OAAO,KAAK,SAAS;AAAA,IACrB,OAAO;AAAA,MACL,SAAS,KAAK,OAAO,YAAY;AAAA,QAC/B,iBAAiB,KAAK;AAAA,QACtB,iBAAiB,KAAK;AAAA,MACxB;AAAA,MACA,OAAO,KAAK,OAAO;AAAA,MACnB,MAAM,KAAK,OAAO;AAAA,IACpB;AAAA,EACF;AACF;AAiBO,IAAM,eAAN,cAA2B,MAAM;AAAA,EACtC,YACkB,MAChB,SACA;AACA,UAAM,OAAO;AAHG;AAIhB,SAAK,OAAO;AAAA,EACd;AACF;AAQA,eAAsB,QAAQ,SAAiD;AAC7E,QAAM,UAAU,QAAQ,UAAU,iBAAiB,QAAQ,OAAO,EAAE;AAEpE,QAAM,WAAW,MAAM,MAAM,GAAG,MAAM,aAAa,QAAQ,MAAM,YAAY;AAAA,IAC3E,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,eAAe,UAAU,QAAQ,MAAM;AAAA,MACvC,gBAAgB;AAAA,IAClB;AAAA,IACA,QAAQ,YAAY,QAAQ,GAAM;AAAA,EACpC,CAAC;AAED,QAAM,OAAQ,MAAM,SAAS,KAAK;AAOlC,QAAM,OAAO,KAAK,QAAQ;AAC1B,QAAM,MAAM,KAAK;AAEjB,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,aAAa,KAAK,QAAQ,kBAAkB,KAAK,WAAW,8BAA8B,SAAS,MAAM,EAAE;AAAA,EACvH;AAEA,SAAO;AAAA,IACL,SAAU,KAA8B,WAAW;AAAA,IACnD,QAAS,KAA6B,UAAU,QAAQ;AAAA,IACxD,QAAS,KAA6B,UAAU;AAAA,EAClD;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/setup.ts"],"sourcesContent":["/**\n * Programmatic registration for coding agents.\n *\n * Usage (in a setup script or agent tool call):\n *\n * import { register } from 'apptvty/setup';\n * const result = await register({ domain: 'mysite.com', framework: 'nextjs' });\n * console.log(result.api_key, result.dashboard_url);\n *\n * No email required — a Crossmint wallet is created automatically using\n * the generated company_id as the owner identifier.\n */\n\nconst DEFAULT_API_URL: string =\n (typeof process !== 'undefined' ? process.env?.APPTVTY_API_URL : undefined) ??\n 'https://api.apptvty.com';\n\nexport interface RegisterOptions {\n domain: string;\n framework?: 'nextjs' | 'express' | 'other';\n /** Optional — passed to the API for analytics on agent type */\n agentId?: string;\n /** Optional — email to associate with this account so the human can claim it via magic link */\n email?: string;\n /** Override the API base URL (useful for self-hosted / staging) */\n apiUrl?: string;\n}\n\nexport interface RegisterResult {\n siteId: string;\n apiKey: string;\n companyId: string;\n walletAddress: string | null;\n platformDepositAddress: string | null;\n dashboardUrl: string;\n claimTokenExpiresAt: string;\n trialEndsAt: string;\n email: string | null;\n setup: {\n envFile: string;\n envVars: { \n APPTVTY_SITE_ID: string; \n APPTVTY_API_KEY: string;\n APPTVTY_DASHBOARD_SECRET: string;\n APPTVTY_CLAIM_TOKEN: string;\n };\n files?: Record<string, string>;\n x402?: {\n protocol: string;\n chain: string;\n currency: string;\n };\n };\n}\n\nexport class RegistrationError extends Error {\n constructor(\n public readonly code: string,\n message: string,\n ) {\n super(message);\n this.name = 'RegistrationError';\n }\n}\n\n/**\n * Register a new site with Apptvty.\n *\n * Idempotent per domain — if the domain is already registered, throws\n * RegistrationError with code DOMAIN_TAKEN.\n */\nexport async function register(options: RegisterOptions): Promise<RegisterResult> {\n const apiUrl = (options.apiUrl ?? DEFAULT_API_URL).replace(/\\/$/, '');\n\n const response = await fetch(`${apiUrl}/v1/register`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n domain: options.domain,\n framework: options.framework ?? 'other',\n agent_id: options.agentId,\n ...(options.email && { email: options.email }),\n }),\n signal: AbortSignal.timeout(20_000),\n });\n\n const json = await response.json() as any;\n\n if (!response.ok) {\n throw new RegistrationError(\n json.error?.code ?? 'REGISTRATION_FAILED',\n json.error?.message ?? `Registration failed with status ${response.status}`,\n );\n }\n\n const data = json.data ?? json;\n\n return {\n siteId: data.site_id,\n apiKey: data.api_key,\n companyId: data.company_id,\n walletAddress: data.wallet_address ?? null,\n platformDepositAddress: data.platform_deposit_address ?? null,\n dashboardUrl: data.dashboard_url,\n claimTokenExpiresAt: data.claim_token_expires_at,\n trialEndsAt: data.trial_ends_at,\n email: data.email ?? null,\n setup: {\n envFile: data.env_file || (data.framework === 'nextjs' ? '.env.local' : '.env'),\n envVars: data.env_vars || {\n APPTVTY_SITE_ID: data.site_id,\n APPTVTY_API_KEY: data.api_key,\n },\n files: data.files,\n x402: data.x402,\n },\n };\n}\n\n// ─── Migrate (reindex / re-crawl) ─────────────────────────────────────────────\n\nexport interface MigrateOptions {\n siteId: string;\n apiKey: string;\n /** Override API base URL (useful for self-hosted / staging) */\n apiUrl?: string;\n}\n\nexport interface MigrateResult {\n message: string;\n siteId: string;\n domain: string;\n}\n\nexport class MigrateError extends Error {\n constructor(\n public readonly code: string,\n message: string,\n ) {\n super(message);\n this.name = 'MigrateError';\n }\n}\n\n/**\n * Trigger an immediate re-crawl/reindex of a site.\n *\n * Use after publishing new content or updating your sitemap.\n * The crawl runs asynchronously — the endpoint returns 202 immediately.\n */\nexport async function migrate(options: MigrateOptions): Promise<MigrateResult> {\n const apiUrl = (options.apiUrl ?? DEFAULT_API_URL).replace(/\\/$/, '');\n\n const response = await fetch(`${apiUrl}/v1/sites/${options.siteId}/reindex`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${options.apiKey}`,\n 'Content-Type': 'application/json',\n },\n signal: AbortSignal.timeout(20_000),\n });\n\n const json = (await response.json()) as {\n error?: { code?: string; message?: string };\n data?: { message?: string; siteId?: string; domain?: string };\n message?: string;\n siteId?: string;\n domain?: string;\n };\n const data = json.data ?? json;\n const err = json.error;\n\n if (!response.ok) {\n throw new MigrateError(err?.code ?? 'MIGRATE_FAILED', err?.message ?? `Migrate failed with status ${response.status}`);\n }\n\n return {\n message: (data as { message?: string }).message ?? 'Reindex started.',\n siteId: (data as { siteId?: string }).siteId ?? options.siteId,\n domain: (data as { domain?: string }).domain ?? '',\n };\n}\n"],"mappings":";AAaA,IAAM,mBACH,OAAO,YAAY,cAAc,QAAQ,KAAK,kBAAkB,WACjE;AAwCK,IAAM,oBAAN,cAAgC,MAAM;AAAA,EAC3C,YACkB,MAChB,SACA;AACA,UAAM,OAAO;AAHG;AAIhB,SAAK,OAAO;AAAA,EACd;AACF;AAQA,eAAsB,SAAS,SAAmD;AAChF,QAAM,UAAU,QAAQ,UAAU,iBAAiB,QAAQ,OAAO,EAAE;AAEpE,QAAM,WAAW,MAAM,MAAM,GAAG,MAAM,gBAAgB;AAAA,IACpD,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU;AAAA,MACnB,QAAQ,QAAQ;AAAA,MAChB,WAAW,QAAQ,aAAa;AAAA,MAChC,UAAU,QAAQ;AAAA,MAClB,GAAI,QAAQ,SAAS,EAAE,OAAO,QAAQ,MAAM;AAAA,IAC9C,CAAC;AAAA,IACD,QAAQ,YAAY,QAAQ,GAAM;AAAA,EACpC,CAAC;AAED,QAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI;AAAA,MACR,KAAK,OAAO,QAAQ;AAAA,MACpB,KAAK,OAAO,WAAW,mCAAmC,SAAS,MAAM;AAAA,IAC3E;AAAA,EACF;AAEA,QAAM,OAAO,KAAK,QAAQ;AAE1B,SAAO;AAAA,IACL,QAAQ,KAAK;AAAA,IACb,QAAQ,KAAK;AAAA,IACb,WAAW,KAAK;AAAA,IAChB,eAAe,KAAK,kBAAkB;AAAA,IACtC,wBAAwB,KAAK,4BAA4B;AAAA,IACzD,cAAc,KAAK;AAAA,IACnB,qBAAqB,KAAK;AAAA,IAC1B,aAAa,KAAK;AAAA,IAClB,OAAO,KAAK,SAAS;AAAA,IACrB,OAAO;AAAA,MACL,SAAS,KAAK,aAAa,KAAK,cAAc,WAAW,eAAe;AAAA,MACxE,SAAS,KAAK,YAAY;AAAA,QACxB,iBAAiB,KAAK;AAAA,QACtB,iBAAiB,KAAK;AAAA,MACxB;AAAA,MACA,OAAO,KAAK;AAAA,MACZ,MAAM,KAAK;AAAA,IACb;AAAA,EACF;AACF;AAiBO,IAAM,eAAN,cAA2B,MAAM;AAAA,EACtC,YACkB,MAChB,SACA;AACA,UAAM,OAAO;AAHG;AAIhB,SAAK,OAAO;AAAA,EACd;AACF;AAQA,eAAsB,QAAQ,SAAiD;AAC7E,QAAM,UAAU,QAAQ,UAAU,iBAAiB,QAAQ,OAAO,EAAE;AAEpE,QAAM,WAAW,MAAM,MAAM,GAAG,MAAM,aAAa,QAAQ,MAAM,YAAY;AAAA,IAC3E,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,eAAe,UAAU,QAAQ,MAAM;AAAA,MACvC,gBAAgB;AAAA,IAClB;AAAA,IACA,QAAQ,YAAY,QAAQ,GAAM;AAAA,EACpC,CAAC;AAED,QAAM,OAAQ,MAAM,SAAS,KAAK;AAOlC,QAAM,OAAO,KAAK,QAAQ;AAC1B,QAAM,MAAM,KAAK;AAEjB,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,aAAa,KAAK,QAAQ,kBAAkB,KAAK,WAAW,8BAA8B,SAAS,MAAM,EAAE;AAAA,EACvH;AAEA,SAAO;AAAA,IACL,SAAU,KAA8B,WAAW;AAAA,IACnD,QAAS,KAA6B,UAAU,QAAQ;AAAA,IACxD,QAAS,KAA6B,UAAU;AAAA,EAClD;AACF;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "apptvty",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "description": "Server-side analytics and AEO (Agent Experience Optimization) SDK for websites. Logs agentic traffic, exposes a structured query endpoint for AI agents, and serves relevant ads on agent queries.",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",