am-i-vibing 0.2.0 → 0.3.0

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.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { i as isInteractive, n as isAgent, r as isHybrid, t as detectAgenticEnvironment } from "./detector-BAdXY3uq.mjs";
2
+ import { i as isInteractive, n as isAgent, r as isHybrid, t as detectAgenticEnvironment } from "./detector-BrdjJAFA.mjs";
3
3
  import { getProcessAncestry } from "process-ancestry";
4
4
  import { parseArgs } from "node:util";
5
5
  //#region src/cli.ts
@@ -129,6 +129,24 @@ const providers = [
129
129
  ] }],
130
130
  processChecks: ["crush"]
131
131
  },
132
+ {
133
+ id: "amp",
134
+ name: "Amp",
135
+ type: "agent",
136
+ envVars: [{ any: ["AMP_CURRENT_THREAD_ID", ["AGENT", "amp"]] }]
137
+ },
138
+ {
139
+ id: "auggie",
140
+ name: "Auggie",
141
+ type: "agent",
142
+ envVars: [["AUGMENT_AGENT", "1"]]
143
+ },
144
+ {
145
+ id: "qwen-code",
146
+ name: "Qwen Code",
147
+ type: "agent",
148
+ envVars: [["QWEN_CODE", "1"]]
149
+ },
132
150
  {
133
151
  id: "vscode-copilot-agent",
134
152
  name: "GitHub Copilot in VS Code",
@@ -146,6 +164,18 @@ const providers = [
146
164
  name: "Octofriend",
147
165
  type: "agent",
148
166
  processChecks: ["octofriend"]
167
+ },
168
+ {
169
+ id: "devin",
170
+ name: "Devin",
171
+ type: "agent",
172
+ processChecks: ["devin"]
173
+ },
174
+ {
175
+ id: "droid",
176
+ name: "Factory Droid",
177
+ type: "agent",
178
+ processChecks: ["droid"]
149
179
  }
150
180
  ];
151
181
  /**
@@ -275,4 +305,4 @@ function isHybrid(envOrOptions, legacyAncestry) {
275
305
  //#endregion
276
306
  export { isProvider as a, providers as c, isInteractive as i, isAgent as n, getProvider as o, isHybrid as r, getProvidersByType as s, detectAgenticEnvironment as t };
277
307
 
278
- //# sourceMappingURL=detector-BAdXY3uq.mjs.map
308
+ //# sourceMappingURL=detector-BrdjJAFA.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector-BrdjJAFA.mjs","names":[],"sources":["../src/providers.ts","../src/detector.ts"],"sourcesContent":["import type { ProviderConfig } from \"./types.js\";\n\n/**\n * Provider configurations for major AI coding tools\n */\nexport const providers: ProviderConfig[] = [\n {\n id: \"opencode\",\n name: \"OpenCode\",\n type: \"agent\",\n envVars: [\n {\n any: [\n \"OPENCODE\",\n \"OPENCODE_BIN_PATH\",\n \"OPENCODE_SERVER\",\n \"OPENCODE_APP_INFO\",\n \"OPENCODE_MODES\",\n ],\n },\n ],\n },\n {\n id: \"jules\",\n name: \"Jules\",\n type: \"agent\",\n envVars: [\n {\n all: [\n [\"HOME\", \"/home/jules\"],\n [\"USER\", \"swebot\"],\n ],\n },\n ],\n },\n {\n id: \"claude-code\",\n name: \"Claude Code\",\n type: \"agent\",\n envVars: [\"CLAUDECODE\"],\n },\n {\n id: \"cursor-agent\",\n name: \"Cursor Agent\",\n type: \"agent\",\n envVars: [\n {\n all: [\"CURSOR_TRACE_ID\", [\"PAGER\", \"head -n 10000 | cat\"]],\n },\n ],\n },\n {\n id: \"cursor\",\n name: \"Cursor\",\n type: \"interactive\",\n envVars: [\"CURSOR_TRACE_ID\"],\n },\n {\n id: \"gemini-agent\",\n name: \"Gemini CLI\",\n type: \"agent\",\n // Gemini CLI sets GEMINI_CLI=1 on every shell command and MCP server it spawns.\n // See: https://github.com/google-gemini/gemini-cli/blob/main/packages/core/src/services/shellExecutionService.ts\n envVars: [[\"GEMINI_CLI\", \"1\"]],\n processChecks: [\"gemini\"],\n },\n {\n id: \"codex\",\n name: \"OpenAI Codex\",\n type: \"agent\",\n // Codex injects CODEX_THREAD_ID (the session conversation id) into every shell command it runs.\n // See: https://github.com/openai/codex/blob/main/codex-rs/protocol/src/shell_environment.rs\n envVars: [\"CODEX_THREAD_ID\"],\n processChecks: [\"codex\"],\n },\n {\n id: \"replit\",\n name: \"Replit\",\n type: \"agent\",\n envVars: [\"REPL_ID\"],\n },\n {\n id: \"aider\",\n name: \"Aider\",\n type: \"agent\",\n envVars: [\"AIDER_API_KEY\"],\n processChecks: [\"aider\"],\n },\n {\n id: \"bolt-agent\",\n name: \"Bolt.new Agent\",\n type: \"agent\",\n envVars: [\n {\n all: [[\"SHELL\", \"/bin/jsh\"], \"npm_config_yes\"],\n },\n ],\n },\n {\n id: \"bolt\",\n name: \"Bolt.new\",\n type: \"interactive\",\n envVars: [\n {\n all: [[\"SHELL\", \"/bin/jsh\"]],\n none: [\"npm_config_yes\"],\n },\n ],\n },\n {\n id: \"zed-agent\",\n name: \"Zed Agent\",\n type: \"agent\",\n envVars: [\n {\n all: [\n [\"TERM_PROGRAM\", \"zed\"],\n [\"PAGER\", \"cat\"],\n ],\n },\n ],\n },\n {\n id: \"zed\",\n name: \"Zed\",\n type: \"interactive\",\n envVars: [\n {\n all: [[\"TERM_PROGRAM\", \"zed\"]],\n none: [[\"PAGER\", \"cat\"]],\n },\n ],\n },\n {\n id: \"replit-assistant\",\n name: \"Replit Assistant\",\n type: \"agent\",\n envVars: [\n {\n all: [\"REPL_ID\", [\"REPLIT_MODE\", \"assistant\"]],\n },\n ],\n },\n {\n id: \"replit\",\n name: \"Replit\",\n type: \"interactive\",\n envVars: [\n {\n all: [\"REPL_ID\"],\n none: [[\"REPLIT_MODE\", \"assistant\"]],\n },\n ],\n },\n {\n id: \"windsurf\",\n name: \"Windsurf\",\n type: \"agent\",\n envVars: [\"CODEIUM_EDITOR_APP_ROOT\"],\n },\n {\n id: \"crush\",\n name: \"Crush\",\n type: \"agent\",\n // Crush sets CRUSH=1 (and AGENT=crush, AI_AGENT=crush) on every shell exec.\n // See: https://github.com/charmbracelet/crush/blob/main/internal/shell/shell.go\n envVars: [\n {\n any: [\n [\"CRUSH\", \"1\"],\n [\"AGENT\", \"crush\"],\n [\"AI_AGENT\", \"crush\"],\n ],\n },\n ],\n processChecks: [\"crush\"],\n },\n {\n id: \"amp\",\n name: \"Amp\",\n type: \"agent\",\n // Sourcegraph Amp injects AGENT=amp, AGENT_THREAD_ID, and AMP_CURRENT_THREAD_ID\n // into every shell tool execution.\n // See: https://www.npmjs.com/package/@sourcegraph/amp\n envVars: [\n {\n any: [\"AMP_CURRENT_THREAD_ID\", [\"AGENT\", \"amp\"]],\n },\n ],\n },\n {\n id: \"auggie\",\n name: \"Auggie\",\n type: \"agent\",\n // Augment Code's Auggie CLI sets AUGMENT_AGENT=1 in the shell tool's env on\n // every command execution.\n // See: https://www.npmjs.com/package/@augmentcode/auggie\n envVars: [[\"AUGMENT_AGENT\", \"1\"]],\n },\n {\n id: \"qwen-code\",\n name: \"Qwen Code\",\n type: \"agent\",\n // Qwen Code (Alibaba's gemini-cli fork) sets QWEN_CODE=1 on every shell exec.\n // See: https://www.npmjs.com/package/@qwen-code/qwen-code\n envVars: [[\"QWEN_CODE\", \"1\"]],\n },\n {\n id: \"vscode-copilot-agent\",\n name: \"GitHub Copilot in VS Code\",\n type: \"agent\",\n envVars: [\n {\n all: [\n [\"TERM_PROGRAM\", \"vscode\"],\n [\"GIT_PAGER\", \"cat\"],\n ],\n },\n ],\n },\n {\n id: \"warp\",\n name: \"Warp Terminal\",\n type: \"hybrid\",\n envVars: [\n {\n all: [[\"TERM_PROGRAM\", \"WarpTerminal\"]],\n },\n ],\n },\n {\n id: \"octofriend\",\n name: \"Octofriend\",\n type: \"agent\",\n // Octofriend does not currently expose an environment variable signal, so it\n // can only be detected via process ancestry (opt-in).\n processChecks: [\"octofriend\"],\n },\n {\n id: \"devin\",\n name: \"Devin\",\n type: \"agent\",\n // Devin for Terminal does not inject any DEVIN_* env var into shell tool\n // executions (DEVIN_PROJECT_DIR is only set inside hook commands, and\n // DEVIN_SESSION_ID/DEVIN_WRAPPER_ACTIVE only exist in the opt-in `devin shell`\n // integration where the user runs commands themselves). Process ancestry is\n // the only available signal, so detection is opt-in via processAncestry.\n processChecks: [\"devin\"],\n },\n {\n id: \"droid\",\n name: \"Factory Droid\",\n type: \"agent\",\n // Factory's Droid CLI sets DROID_PROJECT_DIR / FACTORY_PROJECT_DIR only inside\n // hook command invocations, not on regular shell tool exec. Process ancestry\n // is the only reliable signal, so detection is opt-in via processAncestry.\n processChecks: [\"droid\"],\n },\n];\n\n/**\n * Get provider configuration by name\n */\nexport function getProvider(name: string): ProviderConfig | undefined {\n return providers.find((p) => p.name === name);\n}\n\n/**\n * Get all providers of a specific type\n */\nexport function getProvidersByType(\n type: \"agent\" | \"interactive\" | \"hybrid\",\n): ProviderConfig[] {\n return providers.filter((p) => p.type === type);\n}\n","import type {\n DetectionResult,\n DetectOptions,\n ProviderConfig,\n EnvVarDefinition,\n EnvVarGroup,\n} from \"./types.js\";\nimport { providers } from \"./providers.js\";\nimport { getProcessAncestry } from \"process-ancestry\";\n\n/**\n * Check if a specific environment variable exists (handles both strings and tuples)\n */\nfunction checkEnvVar(\n envVarDef: EnvVarDefinition,\n env: Record<string, string | undefined> = process.env,\n): boolean {\n const [envVar, expectedValue] =\n typeof envVarDef === \"string\" ? [envVarDef, undefined] : envVarDef;\n\n const actualValue = env[envVar];\n return Boolean(\n actualValue && (!expectedValue || actualValue === expectedValue),\n );\n}\n\n/**\n * Check if a process is running in the process tree\n */\nfunction checkProcess(\n processName: string,\n processAncestry: Array<{ command?: string }>,\n): boolean {\n for (const ancestorProcess of processAncestry) {\n if (ancestorProcess.command?.includes(processName)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Check if an environment variable group matches based on its properties\n */\nfunction checkEnvVars(\n definition: EnvVarGroup | EnvVarDefinition,\n env: Record<string, string | undefined> = process.env,\n): boolean {\n if (typeof definition === \"string\" || Array.isArray(definition)) {\n return checkEnvVar(definition, env);\n }\n\n const { any, all, none } = definition;\n\n // Check ANY conditions (OR logic) - at least one must pass\n const anyResult =\n !any?.length || any.some((envVar) => checkEnvVar(envVar, env));\n\n // Check ALL conditions (AND logic) - all must pass\n const allResult =\n !all?.length || all.every((envVar) => checkEnvVar(envVar, env));\n\n // Check NONE conditions (NOT logic) - none should pass\n const noneResult =\n !none?.length || !none.some((envVar) => checkEnvVar(envVar, env));\n\n return anyResult && allResult && noneResult;\n}\n\n/**\n * Run custom detectors for a provider\n */\nfunction runCustomDetectors(provider: ProviderConfig): boolean {\n return (\n provider.customDetectors?.some((detector) => {\n try {\n return detector();\n } catch {\n return false;\n }\n }) ?? false\n );\n}\n\n/**\n * Create a positive detection result\n */\nfunction createDetectedResult(provider: ProviderConfig): DetectionResult {\n return {\n isAgentic: true,\n id: provider.id,\n name: provider.name,\n type: provider.type,\n };\n}\n\n/**\n * Normalize the various supported argument shapes into a DetectOptions object.\n *\n * Supported shapes:\n * - detectAgenticEnvironment()\n * - detectAgenticEnvironment(options)\n * - detectAgenticEnvironment(env) // legacy\n * - detectAgenticEnvironment(env, processAncestry) // legacy\n */\nfunction normalizeOptions(\n envOrOptions?: Record<string, string | undefined> | DetectOptions,\n legacyAncestry?: Array<{ command?: string }>,\n): Required<Pick<DetectOptions, \"env\" | \"checkProcesses\">> & {\n processAncestry?: Array<{ command?: string }>;\n} {\n // Distinguish a DetectOptions object from a raw env record. DetectOptions\n // has at least one of the known keys; an env record is a flat string map.\n const looksLikeOptions =\n envOrOptions != null &&\n typeof envOrOptions === \"object\" &&\n (\"env\" in envOrOptions ||\n \"processAncestry\" in envOrOptions ||\n \"checkProcesses\" in envOrOptions);\n\n if (looksLikeOptions) {\n const opts = envOrOptions as DetectOptions;\n return {\n env: opts.env ?? process.env,\n processAncestry: opts.processAncestry,\n // If the caller pre-supplied an ancestry, default checkProcesses to true\n // unless they explicitly opted out.\n checkProcesses:\n opts.checkProcesses ?? opts.processAncestry !== undefined,\n };\n }\n\n return {\n env:\n (envOrOptions as Record<string, string | undefined> | undefined) ??\n process.env,\n processAncestry: legacyAncestry,\n // Legacy callers that explicitly passed an ancestry are presumed to want\n // process checks; otherwise default off.\n checkProcesses: legacyAncestry !== undefined,\n };\n}\n\n/**\n * Detect agentic coding environment\n */\nexport function detectAgenticEnvironment(\n options?: DetectOptions,\n): DetectionResult;\n/**\n * @deprecated Pass an options object instead. This signature is retained for\n * backwards compatibility and will be removed in a future major release.\n */\nexport function detectAgenticEnvironment(\n env: Record<string, string | undefined>,\n processAncestry?: Array<{ command?: string }>,\n): DetectionResult;\nexport function detectAgenticEnvironment(\n envOrOptions?: Record<string, string | undefined> | DetectOptions,\n legacyAncestry?: Array<{ command?: string }>,\n): DetectionResult {\n const { env, processAncestry, checkProcesses } = normalizeOptions(\n envOrOptions,\n legacyAncestry,\n );\n\n // Fast path: check all environment variables first\n for (const provider of providers) {\n if (provider.envVars?.some((group) => checkEnvVars(group, env))) {\n return createDetectedResult(provider);\n }\n }\n\n // Custom detectors next (cheap, in-process)\n for (const provider of providers) {\n if (runCustomDetectors(provider)) {\n return createDetectedResult(provider);\n }\n }\n\n // Slow path: process ancestry checks. Opt-in only because reading the process\n // tree spawns a subprocess (notably slow on Windows).\n if (checkProcesses) {\n let cachedAncestry = processAncestry;\n const getAncestry = () => {\n if (cachedAncestry === undefined) {\n try {\n cachedAncestry = getProcessAncestry();\n } catch {\n cachedAncestry = [];\n }\n }\n return cachedAncestry;\n };\n\n for (const provider of providers) {\n if (\n provider.processChecks?.some((processName) =>\n checkProcess(processName, getAncestry()),\n )\n ) {\n return createDetectedResult(provider);\n }\n }\n }\n\n // No provider detected\n return {\n isAgentic: false,\n id: null,\n name: null,\n type: null,\n };\n}\n\n/**\n * Check if currently running in a specific provider\n */\nexport function isProvider(\n providerName: string,\n options?: DetectOptions,\n): boolean;\n/**\n * @deprecated Pass an options object instead.\n */\nexport function isProvider(\n providerName: string,\n env: Record<string, string | undefined>,\n processAncestry?: Array<{ command?: string }>,\n): boolean;\nexport function isProvider(\n providerName: string,\n envOrOptions?: Record<string, string | undefined> | DetectOptions,\n legacyAncestry?: Array<{ command?: string }>,\n): boolean {\n const result = detectAgenticEnvironment(\n envOrOptions as DetectOptions,\n legacyAncestry as Array<{ command?: string }> | undefined,\n );\n return result.name === providerName;\n}\n\n/**\n * Check if currently running in any agent environment\n */\nexport function isAgent(options?: DetectOptions): boolean;\n/**\n * @deprecated Pass an options object instead.\n */\nexport function isAgent(\n env: Record<string, string | undefined>,\n processAncestry?: Array<{ command?: string }>,\n): boolean;\nexport function isAgent(\n envOrOptions?: Record<string, string | undefined> | DetectOptions,\n legacyAncestry?: Array<{ command?: string }>,\n): boolean {\n const result = detectAgenticEnvironment(\n envOrOptions as DetectOptions,\n legacyAncestry as Array<{ command?: string }> | undefined,\n );\n return result.type === \"agent\" || result.type === \"hybrid\";\n}\n\n/**\n * Check if currently running in any interactive AI environment\n */\nexport function isInteractive(options?: DetectOptions): boolean;\n/**\n * @deprecated Pass an options object instead.\n */\nexport function isInteractive(\n env: Record<string, string | undefined>,\n processAncestry?: Array<{ command?: string }>,\n): boolean;\nexport function isInteractive(\n envOrOptions?: Record<string, string | undefined> | DetectOptions,\n legacyAncestry?: Array<{ command?: string }>,\n): boolean {\n const result = detectAgenticEnvironment(\n envOrOptions as DetectOptions,\n legacyAncestry as Array<{ command?: string }> | undefined,\n );\n return result.type === \"interactive\" || result.type === \"hybrid\";\n}\n\n/**\n * Check if currently running in any hybrid AI environment\n */\nexport function isHybrid(options?: DetectOptions): boolean;\n/**\n * @deprecated Pass an options object instead.\n */\nexport function isHybrid(\n env: Record<string, string | undefined>,\n processAncestry?: Array<{ command?: string }>,\n): boolean;\nexport function isHybrid(\n envOrOptions?: Record<string, string | undefined> | DetectOptions,\n legacyAncestry?: Array<{ command?: string }>,\n): boolean {\n const result = detectAgenticEnvironment(\n envOrOptions as DetectOptions,\n legacyAncestry as Array<{ command?: string }> | undefined,\n );\n return result.type === \"hybrid\";\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/providers.ts","../src/detector.ts"],"mappings":";;AAGA;;KAAY,WAAA;;;AAKZ;KAAY,gBAAA;;;;UAKK,WAAA;EAAW;EAE1B,GAAA,GAAM,gBAAA;EAAA;EAGN,GAAA,GAAM,gBAAA;EAGC;EAAP,IAAA,GAAO,gBAAA;AAAA;;;;UAMQ,cAAA;EANf;EAQA,EAAA;EARuB;EAWvB,IAAA;EALe;EAQf,IAAA,EAAM,WAAA;;EAGN,OAAA,GAAU,KAAA,CAAM,WAAA,GAAc,gBAAA;EAAd;EAGhB,aAAA;EAHU;EAMV,eAAA;AAAA;;;;UAMe,eAAA;EAZf;EAcA,SAAA;EAdgB;EAiBhB,EAAA;EAdA;EAiBA,IAAA;EAde;EAiBf,IAAA,EAAM,WAAA;AAAA;;;;UAMS,aAAA;EAZf;;;EAgBA,GAAA,GAAM,MAAA;EAVW;;AAMnB;;;EAWE,eAAA,GAAkB,KAAA;IAAQ,OAAA;EAAA;EAA1B;;;;;;;;;EAWA,cAAA;AAAA;;;AAtFF;;;AAAA,cCEa,SAAA,EAAW,cAAA;;ADGxB;;iBC6MgB,WAAA,CAAY,IAAA,WAAe,cAAA;;;ADxM3C;iBC+MgB,kBAAA,CACd,IAAA,uCACC,cAAA;;;AD3NH;;;AAAA,iBE+IgB,wBAAA,CACd,OAAA,GAAU,aAAA,GACT,eAAA;;AF5IH;;;iBEiJgB,wBAAA,CACd,GAAA,EAAK,MAAA,8BACL,eAAA,GAAkB,KAAA;EAAQ,OAAA;AAAA,KACzB,eAAA;;;;iBA8Da,UAAA,CACd,YAAA,UACA,OAAA,GAAU,aAAA;;;;iBAKI,UAAA,CACd,YAAA,UACA,GAAA,EAAK,MAAA,8BACL,eAAA,GAAkB,KAAA;EAAQ,OAAA;AAAA;;;;iBAiBZ,OAAA,CAAQ,OAAA,GAAU,aAAA;;AF1NlC;;iBE8NgB,OAAA,CACd,GAAA,EAAK,MAAA,8BACL,eAAA,GAAkB,KAAA;EAAQ,OAAA;AAAA;;;;iBAgBZ,aAAA,CAAc,OAAA,GAAU,aAAA;;;;iBAIxB,aAAA,CACd,GAAA,EAAK,MAAA,8BACL,eAAA,GAAkB,KAAA;EAAQ,OAAA;AAAA;;;;iBAgBZ,QAAA,CAAS,OAAA,GAAU,aAAA;;;AF/OnC;iBEmPgB,QAAA,CACd,GAAA,EAAK,MAAA,8BACL,eAAA,GAAkB,KAAA;EAAQ,OAAA;AAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/providers.ts","../src/detector.ts"],"mappings":";;AAGA;;KAAY,WAAA;;;AAKZ;KAAY,gBAAA;;;;UAKK,WAAA;EAAW;EAE1B,GAAA,GAAM,gBAAA;EAAA;EAGN,GAAA,GAAM,gBAAA;EAGC;EAAP,IAAA,GAAO,gBAAA;AAAA;;;;UAMQ,cAAA;EANf;EAQA,EAAA;EARuB;EAWvB,IAAA;EALe;EAQf,IAAA,EAAM,WAAA;;EAGN,OAAA,GAAU,KAAA,CAAM,WAAA,GAAc,gBAAA;EAAd;EAGhB,aAAA;EAHU;EAMV,eAAA;AAAA;;;;UAMe,eAAA;EAZf;EAcA,SAAA;EAdgB;EAiBhB,EAAA;EAdA;EAiBA,IAAA;EAde;EAiBf,IAAA,EAAM,WAAA;AAAA;;;;UAMS,aAAA;EAZf;;;EAgBA,GAAA,GAAM,MAAA;EAVW;;AAMnB;;;EAWE,eAAA,GAAkB,KAAA;IAAQ,OAAA;EAAA;EAA1B;;;;;;;;;EAWA,cAAA;AAAA;;;AAtFF;;;AAAA,cCEa,SAAA,EAAW,cAAA;;ADGxB;;iBC+PgB,WAAA,CAAY,IAAA,WAAe,cAAA;;;AD1P3C;iBCiQgB,kBAAA,CACd,IAAA,uCACC,cAAA;;;AD7QH;;;AAAA,iBE+IgB,wBAAA,CACd,OAAA,GAAU,aAAA,GACT,eAAA;;AF5IH;;;iBEiJgB,wBAAA,CACd,GAAA,EAAK,MAAA,8BACL,eAAA,GAAkB,KAAA;EAAQ,OAAA;AAAA,KACzB,eAAA;;;;iBA8Da,UAAA,CACd,YAAA,UACA,OAAA,GAAU,aAAA;;;;iBAKI,UAAA,CACd,YAAA,UACA,GAAA,EAAK,MAAA,8BACL,eAAA,GAAkB,KAAA;EAAQ,OAAA;AAAA;;;;iBAiBZ,OAAA,CAAQ,OAAA,GAAU,aAAA;;AF1NlC;;iBE8NgB,OAAA,CACd,GAAA,EAAK,MAAA,8BACL,eAAA,GAAkB,KAAA;EAAQ,OAAA;AAAA;;;;iBAgBZ,aAAA,CAAc,OAAA,GAAU,aAAA;;;;iBAIxB,aAAA,CACd,GAAA,EAAK,MAAA,8BACL,eAAA,GAAkB,KAAA;EAAQ,OAAA;AAAA;;;;iBAgBZ,QAAA,CAAS,OAAA,GAAU,aAAA;;;AF/OnC;iBEmPgB,QAAA,CACd,GAAA,EAAK,MAAA,8BACL,eAAA,GAAkB,KAAA;EAAQ,OAAA;AAAA"}
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { a as isProvider, c as providers, i as isInteractive, n as isAgent, o as getProvider, r as isHybrid, s as getProvidersByType, t as detectAgenticEnvironment } from "./detector-BAdXY3uq.mjs";
1
+ import { a as isProvider, c as providers, i as isInteractive, n as isAgent, o as getProvider, r as isHybrid, s as getProvidersByType, t as detectAgenticEnvironment } from "./detector-BrdjJAFA.mjs";
2
2
  //#region src/index.ts
3
3
  var src_default = detectAgenticEnvironment;
4
4
  //#endregion
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "am-i-vibing",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Detect agentic coding environments and AI assistant tools",
5
5
  "type": "module",
6
6
  "main": "dist/index.mjs",
@@ -1 +0,0 @@
1
- {"version":3,"file":"detector-BAdXY3uq.mjs","names":[],"sources":["../src/providers.ts","../src/detector.ts"],"sourcesContent":["import type { ProviderConfig } from \"./types.js\";\n\n/**\n * Provider configurations for major AI coding tools\n */\nexport const providers: ProviderConfig[] = [\n {\n id: \"opencode\",\n name: \"OpenCode\",\n type: \"agent\",\n envVars: [\n {\n any: [\n \"OPENCODE\",\n \"OPENCODE_BIN_PATH\",\n \"OPENCODE_SERVER\",\n \"OPENCODE_APP_INFO\",\n \"OPENCODE_MODES\",\n ],\n },\n ],\n },\n {\n id: \"jules\",\n name: \"Jules\",\n type: \"agent\",\n envVars: [\n {\n all: [\n [\"HOME\", \"/home/jules\"],\n [\"USER\", \"swebot\"],\n ],\n },\n ],\n },\n {\n id: \"claude-code\",\n name: \"Claude Code\",\n type: \"agent\",\n envVars: [\"CLAUDECODE\"],\n },\n {\n id: \"cursor-agent\",\n name: \"Cursor Agent\",\n type: \"agent\",\n envVars: [\n {\n all: [\"CURSOR_TRACE_ID\", [\"PAGER\", \"head -n 10000 | cat\"]],\n },\n ],\n },\n {\n id: \"cursor\",\n name: \"Cursor\",\n type: \"interactive\",\n envVars: [\"CURSOR_TRACE_ID\"],\n },\n {\n id: \"gemini-agent\",\n name: \"Gemini CLI\",\n type: \"agent\",\n // Gemini CLI sets GEMINI_CLI=1 on every shell command and MCP server it spawns.\n // See: https://github.com/google-gemini/gemini-cli/blob/main/packages/core/src/services/shellExecutionService.ts\n envVars: [[\"GEMINI_CLI\", \"1\"]],\n processChecks: [\"gemini\"],\n },\n {\n id: \"codex\",\n name: \"OpenAI Codex\",\n type: \"agent\",\n // Codex injects CODEX_THREAD_ID (the session conversation id) into every shell command it runs.\n // See: https://github.com/openai/codex/blob/main/codex-rs/protocol/src/shell_environment.rs\n envVars: [\"CODEX_THREAD_ID\"],\n processChecks: [\"codex\"],\n },\n {\n id: \"replit\",\n name: \"Replit\",\n type: \"agent\",\n envVars: [\"REPL_ID\"],\n },\n {\n id: \"aider\",\n name: \"Aider\",\n type: \"agent\",\n envVars: [\"AIDER_API_KEY\"],\n processChecks: [\"aider\"],\n },\n {\n id: \"bolt-agent\",\n name: \"Bolt.new Agent\",\n type: \"agent\",\n envVars: [\n {\n all: [[\"SHELL\", \"/bin/jsh\"], \"npm_config_yes\"],\n },\n ],\n },\n {\n id: \"bolt\",\n name: \"Bolt.new\",\n type: \"interactive\",\n envVars: [\n {\n all: [[\"SHELL\", \"/bin/jsh\"]],\n none: [\"npm_config_yes\"],\n },\n ],\n },\n {\n id: \"zed-agent\",\n name: \"Zed Agent\",\n type: \"agent\",\n envVars: [\n {\n all: [\n [\"TERM_PROGRAM\", \"zed\"],\n [\"PAGER\", \"cat\"],\n ],\n },\n ],\n },\n {\n id: \"zed\",\n name: \"Zed\",\n type: \"interactive\",\n envVars: [\n {\n all: [[\"TERM_PROGRAM\", \"zed\"]],\n none: [[\"PAGER\", \"cat\"]],\n },\n ],\n },\n {\n id: \"replit-assistant\",\n name: \"Replit Assistant\",\n type: \"agent\",\n envVars: [\n {\n all: [\"REPL_ID\", [\"REPLIT_MODE\", \"assistant\"]],\n },\n ],\n },\n {\n id: \"replit\",\n name: \"Replit\",\n type: \"interactive\",\n envVars: [\n {\n all: [\"REPL_ID\"],\n none: [[\"REPLIT_MODE\", \"assistant\"]],\n },\n ],\n },\n {\n id: \"windsurf\",\n name: \"Windsurf\",\n type: \"agent\",\n envVars: [\"CODEIUM_EDITOR_APP_ROOT\"],\n },\n {\n id: \"crush\",\n name: \"Crush\",\n type: \"agent\",\n // Crush sets CRUSH=1 (and AGENT=crush, AI_AGENT=crush) on every shell exec.\n // See: https://github.com/charmbracelet/crush/blob/main/internal/shell/shell.go\n envVars: [\n {\n any: [\n [\"CRUSH\", \"1\"],\n [\"AGENT\", \"crush\"],\n [\"AI_AGENT\", \"crush\"],\n ],\n },\n ],\n processChecks: [\"crush\"],\n },\n {\n id: \"vscode-copilot-agent\",\n name: \"GitHub Copilot in VS Code\",\n type: \"agent\",\n envVars: [\n {\n all: [\n [\"TERM_PROGRAM\", \"vscode\"],\n [\"GIT_PAGER\", \"cat\"],\n ],\n },\n ],\n },\n {\n id: \"warp\",\n name: \"Warp Terminal\",\n type: \"hybrid\",\n envVars: [\n {\n all: [[\"TERM_PROGRAM\", \"WarpTerminal\"]],\n },\n ],\n },\n {\n id: \"octofriend\",\n name: \"Octofriend\",\n type: \"agent\",\n // Octofriend does not currently expose an environment variable signal, so it\n // can only be detected via process ancestry (opt-in).\n processChecks: [\"octofriend\"],\n },\n];\n\n/**\n * Get provider configuration by name\n */\nexport function getProvider(name: string): ProviderConfig | undefined {\n return providers.find((p) => p.name === name);\n}\n\n/**\n * Get all providers of a specific type\n */\nexport function getProvidersByType(\n type: \"agent\" | \"interactive\" | \"hybrid\",\n): ProviderConfig[] {\n return providers.filter((p) => p.type === type);\n}\n","import type {\n DetectionResult,\n DetectOptions,\n ProviderConfig,\n EnvVarDefinition,\n EnvVarGroup,\n} from \"./types.js\";\nimport { providers } from \"./providers.js\";\nimport { getProcessAncestry } from \"process-ancestry\";\n\n/**\n * Check if a specific environment variable exists (handles both strings and tuples)\n */\nfunction checkEnvVar(\n envVarDef: EnvVarDefinition,\n env: Record<string, string | undefined> = process.env,\n): boolean {\n const [envVar, expectedValue] =\n typeof envVarDef === \"string\" ? [envVarDef, undefined] : envVarDef;\n\n const actualValue = env[envVar];\n return Boolean(\n actualValue && (!expectedValue || actualValue === expectedValue),\n );\n}\n\n/**\n * Check if a process is running in the process tree\n */\nfunction checkProcess(\n processName: string,\n processAncestry: Array<{ command?: string }>,\n): boolean {\n for (const ancestorProcess of processAncestry) {\n if (ancestorProcess.command?.includes(processName)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Check if an environment variable group matches based on its properties\n */\nfunction checkEnvVars(\n definition: EnvVarGroup | EnvVarDefinition,\n env: Record<string, string | undefined> = process.env,\n): boolean {\n if (typeof definition === \"string\" || Array.isArray(definition)) {\n return checkEnvVar(definition, env);\n }\n\n const { any, all, none } = definition;\n\n // Check ANY conditions (OR logic) - at least one must pass\n const anyResult =\n !any?.length || any.some((envVar) => checkEnvVar(envVar, env));\n\n // Check ALL conditions (AND logic) - all must pass\n const allResult =\n !all?.length || all.every((envVar) => checkEnvVar(envVar, env));\n\n // Check NONE conditions (NOT logic) - none should pass\n const noneResult =\n !none?.length || !none.some((envVar) => checkEnvVar(envVar, env));\n\n return anyResult && allResult && noneResult;\n}\n\n/**\n * Run custom detectors for a provider\n */\nfunction runCustomDetectors(provider: ProviderConfig): boolean {\n return (\n provider.customDetectors?.some((detector) => {\n try {\n return detector();\n } catch {\n return false;\n }\n }) ?? false\n );\n}\n\n/**\n * Create a positive detection result\n */\nfunction createDetectedResult(provider: ProviderConfig): DetectionResult {\n return {\n isAgentic: true,\n id: provider.id,\n name: provider.name,\n type: provider.type,\n };\n}\n\n/**\n * Normalize the various supported argument shapes into a DetectOptions object.\n *\n * Supported shapes:\n * - detectAgenticEnvironment()\n * - detectAgenticEnvironment(options)\n * - detectAgenticEnvironment(env) // legacy\n * - detectAgenticEnvironment(env, processAncestry) // legacy\n */\nfunction normalizeOptions(\n envOrOptions?: Record<string, string | undefined> | DetectOptions,\n legacyAncestry?: Array<{ command?: string }>,\n): Required<Pick<DetectOptions, \"env\" | \"checkProcesses\">> & {\n processAncestry?: Array<{ command?: string }>;\n} {\n // Distinguish a DetectOptions object from a raw env record. DetectOptions\n // has at least one of the known keys; an env record is a flat string map.\n const looksLikeOptions =\n envOrOptions != null &&\n typeof envOrOptions === \"object\" &&\n (\"env\" in envOrOptions ||\n \"processAncestry\" in envOrOptions ||\n \"checkProcesses\" in envOrOptions);\n\n if (looksLikeOptions) {\n const opts = envOrOptions as DetectOptions;\n return {\n env: opts.env ?? process.env,\n processAncestry: opts.processAncestry,\n // If the caller pre-supplied an ancestry, default checkProcesses to true\n // unless they explicitly opted out.\n checkProcesses:\n opts.checkProcesses ?? opts.processAncestry !== undefined,\n };\n }\n\n return {\n env:\n (envOrOptions as Record<string, string | undefined> | undefined) ??\n process.env,\n processAncestry: legacyAncestry,\n // Legacy callers that explicitly passed an ancestry are presumed to want\n // process checks; otherwise default off.\n checkProcesses: legacyAncestry !== undefined,\n };\n}\n\n/**\n * Detect agentic coding environment\n */\nexport function detectAgenticEnvironment(\n options?: DetectOptions,\n): DetectionResult;\n/**\n * @deprecated Pass an options object instead. This signature is retained for\n * backwards compatibility and will be removed in a future major release.\n */\nexport function detectAgenticEnvironment(\n env: Record<string, string | undefined>,\n processAncestry?: Array<{ command?: string }>,\n): DetectionResult;\nexport function detectAgenticEnvironment(\n envOrOptions?: Record<string, string | undefined> | DetectOptions,\n legacyAncestry?: Array<{ command?: string }>,\n): DetectionResult {\n const { env, processAncestry, checkProcesses } = normalizeOptions(\n envOrOptions,\n legacyAncestry,\n );\n\n // Fast path: check all environment variables first\n for (const provider of providers) {\n if (provider.envVars?.some((group) => checkEnvVars(group, env))) {\n return createDetectedResult(provider);\n }\n }\n\n // Custom detectors next (cheap, in-process)\n for (const provider of providers) {\n if (runCustomDetectors(provider)) {\n return createDetectedResult(provider);\n }\n }\n\n // Slow path: process ancestry checks. Opt-in only because reading the process\n // tree spawns a subprocess (notably slow on Windows).\n if (checkProcesses) {\n let cachedAncestry = processAncestry;\n const getAncestry = () => {\n if (cachedAncestry === undefined) {\n try {\n cachedAncestry = getProcessAncestry();\n } catch {\n cachedAncestry = [];\n }\n }\n return cachedAncestry;\n };\n\n for (const provider of providers) {\n if (\n provider.processChecks?.some((processName) =>\n checkProcess(processName, getAncestry()),\n )\n ) {\n return createDetectedResult(provider);\n }\n }\n }\n\n // No provider detected\n return {\n isAgentic: false,\n id: null,\n name: null,\n type: null,\n };\n}\n\n/**\n * Check if currently running in a specific provider\n */\nexport function isProvider(\n providerName: string,\n options?: DetectOptions,\n): boolean;\n/**\n * @deprecated Pass an options object instead.\n */\nexport function isProvider(\n providerName: string,\n env: Record<string, string | undefined>,\n processAncestry?: Array<{ command?: string }>,\n): boolean;\nexport function isProvider(\n providerName: string,\n envOrOptions?: Record<string, string | undefined> | DetectOptions,\n legacyAncestry?: Array<{ command?: string }>,\n): boolean {\n const result = detectAgenticEnvironment(\n envOrOptions as DetectOptions,\n legacyAncestry as Array<{ command?: string }> | undefined,\n );\n return result.name === providerName;\n}\n\n/**\n * Check if currently running in any agent environment\n */\nexport function isAgent(options?: DetectOptions): boolean;\n/**\n * @deprecated Pass an options object instead.\n */\nexport function isAgent(\n env: Record<string, string | undefined>,\n processAncestry?: Array<{ command?: string }>,\n): boolean;\nexport function isAgent(\n envOrOptions?: Record<string, string | undefined> | DetectOptions,\n legacyAncestry?: Array<{ command?: string }>,\n): boolean {\n const result = detectAgenticEnvironment(\n envOrOptions as DetectOptions,\n legacyAncestry as Array<{ command?: string }> | undefined,\n );\n return result.type === \"agent\" || result.type === \"hybrid\";\n}\n\n/**\n * Check if currently running in any interactive AI environment\n */\nexport function isInteractive(options?: DetectOptions): boolean;\n/**\n * @deprecated Pass an options object instead.\n */\nexport function isInteractive(\n env: Record<string, string | undefined>,\n processAncestry?: Array<{ command?: string }>,\n): boolean;\nexport function isInteractive(\n envOrOptions?: Record<string, string | undefined> | DetectOptions,\n legacyAncestry?: Array<{ command?: string }>,\n): boolean {\n const result = detectAgenticEnvironment(\n envOrOptions as DetectOptions,\n legacyAncestry as Array<{ command?: string }> | undefined,\n );\n return result.type === \"interactive\" || result.type === \"hybrid\";\n}\n\n/**\n * Check if currently running in any hybrid AI environment\n */\nexport function isHybrid(options?: DetectOptions): boolean;\n/**\n * @deprecated Pass an options object instead.\n */\nexport function isHybrid(\n env: Record<string, string | undefined>,\n processAncestry?: Array<{ command?: string }>,\n): boolean;\nexport function isHybrid(\n envOrOptions?: Record<string, string | undefined> | DetectOptions,\n legacyAncestry?: Array<{ command?: string }>,\n): boolean {\n const result = detectAgenticEnvironment(\n envOrOptions as DetectOptions,\n legacyAncestry as Array<{ command?: string }> | undefined,\n );\n return result.type === \"hybrid\";\n}\n"],"mappings":"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"}