@tokentestai/ais 0.1.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/LICENSE +21 -0
- package/README.en.md +238 -0
- package/README.fr.md +238 -0
- package/README.ja.md +234 -0
- package/README.ko.md +234 -0
- package/README.md +234 -0
- package/dist/chunk-WVTDLVUU.js +1400 -0
- package/dist/chunk-WVTDLVUU.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +6145 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +547 -0
- package/dist/index.js +5784 -0
- package/dist/index.js.map +1 -0
- package/dist/postinstall.d.ts +27 -0
- package/dist/postinstall.js +54 -0
- package/dist/postinstall.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/automation/state.ts","../src/automation/model.ts","../src/config.ts","../src/ais/state.ts","../src/vault/types.ts","../src/protect/index.ts"],"sourcesContent":["import { chmodSync, existsSync } from 'node:fs';\nimport { mkdir, readFile, rename, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { dirname, join } from 'node:path';\n\nimport {\n PROTECT_TOOLS,\n isProtectTool,\n isUpdateChannel,\n type ProtectTool,\n type UpdateChannel,\n} from './model.js';\n\nconst STATE_FILE_MODE = 0o600;\n\nexport const DEFAULT_AUTOMATION_STATE_PATH_DISPLAY = '~/.ais/automation-state.json';\n\nexport type UpdateCheckResult =\n | 'available'\n | 'failed'\n | 'never'\n | 'skipped'\n | 'up-to-date'\n | 'updated';\n\nexport interface ProtectToolRuntimeState {\n backupPath?: string;\n installed: boolean;\n lastChangedAt?: number;\n lastError?: string;\n managedPath?: string;\n originalCommandPath?: string;\n suspended: boolean;\n}\n\nexport interface AutomationState {\n protect: {\n tools: Record<ProtectTool, ProtectToolRuntimeState>;\n };\n update: {\n lastChannel?: UpdateChannel;\n lastCheckedAt?: number;\n lastError?: string;\n lastLocalVersion?: string;\n lastRemoteVersion?: string;\n lastResult: UpdateCheckResult;\n skipNextCheck: boolean;\n };\n}\n\nexport interface LoadedAutomationState {\n exists: boolean;\n path: string;\n recoveredFrom?: string;\n recoveryReason?: string;\n state: AutomationState;\n}\n\nexport function createDefaultAutomationState(): AutomationState {\n return {\n protect: {\n tools: Object.fromEntries(\n PROTECT_TOOLS.map((tool) => [tool, createDefaultProtectToolRuntimeState()]),\n ) as Record<ProtectTool, ProtectToolRuntimeState>,\n },\n update: {\n lastResult: 'never',\n skipNextCheck: false,\n },\n };\n}\n\nexport function createDefaultProtectToolRuntimeState(): ProtectToolRuntimeState {\n return {\n installed: false,\n suspended: false,\n };\n}\n\nexport function resolveAutomationStatePath(path?: string): string {\n return expandHomePath(path ?? DEFAULT_AUTOMATION_STATE_PATH_DISPLAY);\n}\n\nexport async function loadAutomationState(path?: string): Promise<LoadedAutomationState> {\n const resolvedPath = resolveAutomationStatePath(path);\n\n if (!existsSync(resolvedPath)) {\n return {\n exists: false,\n path: resolvedPath,\n state: createDefaultAutomationState(),\n };\n }\n\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(await readFile(resolvedPath, 'utf8'));\n } catch (error) {\n return recoverAutomationState(resolvedPath, error);\n }\n\n try {\n return {\n exists: true,\n path: resolvedPath,\n state: mergeAutomationState(parsed),\n };\n } catch (error) {\n return recoverAutomationState(resolvedPath, error);\n }\n}\n\nexport async function saveAutomationState(state: AutomationState, path?: string): Promise<void> {\n const resolvedPath = resolveAutomationStatePath(path);\n const payload = `${JSON.stringify(state, null, 2)}\\n`;\n\n await mkdir(dirname(resolvedPath), { recursive: true });\n await writeFile(resolvedPath, payload, { mode: STATE_FILE_MODE });\n chmodSync(resolvedPath, STATE_FILE_MODE);\n}\n\nexport function clearProtectRuntimeState(\n state: AutomationState,\n tool?: ProtectTool,\n now = Date.now(),\n): AutomationState {\n const next = cloneAutomationState(state);\n const targets = tool ? [tool] : PROTECT_TOOLS;\n\n for (const currentTool of targets) {\n next.protect.tools[currentTool] = {\n ...createDefaultProtectToolRuntimeState(),\n lastChangedAt: now,\n };\n }\n\n return next;\n}\n\nexport function cloneAutomationState(state: AutomationState): AutomationState {\n return {\n protect: {\n tools: Object.fromEntries(\n PROTECT_TOOLS.map((tool) => [\n tool,\n {\n ...state.protect.tools[tool],\n },\n ]),\n ) as Record<ProtectTool, ProtectToolRuntimeState>,\n },\n update: {\n ...state.update,\n },\n };\n}\n\nfunction mergeAutomationState(raw: unknown): AutomationState {\n if (!isRecord(raw)) {\n throw new Error('Failed to load automation state: root must be an object');\n }\n\n const state = createDefaultAutomationState();\n\n if ('update' in raw) {\n const update = expectObject(raw.update, 'update');\n\n if ('lastResult' in update) {\n state.update.lastResult = expectUpdateCheckResult(update.lastResult, 'update.lastResult');\n }\n\n if ('skipNextCheck' in update) {\n state.update.skipNextCheck = expectBoolean(update.skipNextCheck, 'update.skipNextCheck');\n }\n\n if ('lastCheckedAt' in update) {\n state.update.lastCheckedAt = expectOptionalFiniteNumber(update.lastCheckedAt, 'update.lastCheckedAt');\n }\n\n if ('lastChannel' in update) {\n state.update.lastChannel = expectOptionalUpdateChannel(update.lastChannel, 'update.lastChannel');\n }\n\n if ('lastLocalVersion' in update) {\n state.update.lastLocalVersion = expectOptionalString(update.lastLocalVersion, 'update.lastLocalVersion');\n }\n\n if ('lastRemoteVersion' in update) {\n state.update.lastRemoteVersion = expectOptionalString(update.lastRemoteVersion, 'update.lastRemoteVersion');\n }\n\n if ('lastError' in update) {\n state.update.lastError = expectOptionalString(update.lastError, 'update.lastError');\n }\n }\n\n if ('protect' in raw) {\n const protect = expectObject(raw.protect, 'protect');\n if ('tools' in protect) {\n const tools = expectObject(protect.tools, 'protect.tools');\n for (const [key, value] of Object.entries(tools)) {\n if (!isProtectTool(key)) {\n throw new Error(`Failed to load automation state: protect.tools.${key} is not supported`);\n }\n\n state.protect.tools[key] = parseProtectToolRuntimeState(value, `protect.tools.${key}`);\n }\n }\n }\n\n return state;\n}\n\nfunction parseProtectToolRuntimeState(value: unknown, path: string): ProtectToolRuntimeState {\n const toolState = expectObject(value, path);\n const parsed = createDefaultProtectToolRuntimeState();\n\n if ('installed' in toolState) {\n parsed.installed = expectBoolean(toolState.installed, `${path}.installed`);\n }\n\n if ('suspended' in toolState) {\n parsed.suspended = expectBoolean(toolState.suspended, `${path}.suspended`);\n }\n\n if ('managedPath' in toolState) {\n parsed.managedPath = expectOptionalString(toolState.managedPath, `${path}.managedPath`);\n }\n\n if ('backupPath' in toolState) {\n parsed.backupPath = expectOptionalString(toolState.backupPath, `${path}.backupPath`);\n }\n\n if ('originalCommandPath' in toolState) {\n parsed.originalCommandPath = expectOptionalString(\n toolState.originalCommandPath,\n `${path}.originalCommandPath`,\n );\n }\n\n if ('lastError' in toolState) {\n parsed.lastError = expectOptionalString(toolState.lastError, `${path}.lastError`);\n }\n\n if ('lastChangedAt' in toolState) {\n parsed.lastChangedAt = expectOptionalFiniteNumber(toolState.lastChangedAt, `${path}.lastChangedAt`);\n }\n\n return parsed;\n}\n\nasync function recoverAutomationState(path: string, error: unknown): Promise<LoadedAutomationState> {\n const message = error instanceof Error ? error.message : String(error);\n const backupPath = `${path}.corrupt-${Date.now()}`;\n\n let recoveredFrom: string | undefined;\n try {\n await rename(path, backupPath);\n recoveredFrom = backupPath;\n } catch {\n recoveredFrom = path;\n }\n\n return {\n exists: false,\n path,\n recoveredFrom,\n recoveryReason: message,\n state: createDefaultAutomationState(),\n };\n}\n\nfunction expectUpdateCheckResult(value: unknown, path: string): UpdateCheckResult {\n if (\n value !== 'available' &&\n value !== 'failed' &&\n value !== 'never' &&\n value !== 'skipped' &&\n value !== 'up-to-date' &&\n value !== 'updated'\n ) {\n throw new Error(`Failed to load automation state: ${path} must be a valid update result`);\n }\n\n return value;\n}\n\nfunction expectBoolean(value: unknown, path: string): boolean {\n if (typeof value !== 'boolean') {\n throw new Error(`Failed to load automation state: ${path} must be a boolean`);\n }\n\n return value;\n}\n\nfunction expectObject(value: unknown, path: string): Record<string, unknown> {\n if (!isRecord(value)) {\n throw new Error(`Failed to load automation state: ${path} must be an object`);\n }\n\n return value;\n}\n\nfunction expectOptionalFiniteNumber(value: unknown, path: string): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw new Error(`Failed to load automation state: ${path} must be a finite number`);\n }\n\n return value;\n}\n\nfunction expectOptionalString(value: unknown, path: string): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value !== 'string') {\n throw new Error(`Failed to load automation state: ${path} must be a string`);\n }\n\n return value;\n}\n\nfunction expectOptionalUpdateChannel(value: unknown, path: string): UpdateChannel | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value !== 'string' || !isUpdateChannel(value)) {\n throw new Error(`Failed to load automation state: ${path} must be one of ${UPDATE_CHANNELS_LABEL}`);\n }\n\n return value;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction expandHomePath(path: string): string {\n if (path === '~') {\n return homedir();\n }\n\n if (path.startsWith('~/')) {\n return join(homedir(), path.slice(2));\n }\n\n return path;\n}\n\nconst UPDATE_CHANNELS_LABEL = 'latest, next';\n","export const PROTECT_TOOLS = ['claude', 'codex', 'openclaw'] as const;\nexport const UPDATE_CHANNELS = ['latest', 'next'] as const;\n\nexport type ProtectTool = (typeof PROTECT_TOOLS)[number];\nexport type UpdateChannel = (typeof UPDATE_CHANNELS)[number];\n\nexport function isProtectTool(value: string): value is ProtectTool {\n return PROTECT_TOOLS.includes(value as ProtectTool);\n}\n\nexport function isUpdateChannel(value: string): value is UpdateChannel {\n return UPDATE_CHANNELS.includes(value as UpdateChannel);\n}\n","import { chmodSync, existsSync } from 'node:fs';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { dirname, join } from 'node:path';\n\nimport { DEFAULT_AIS_STATE_PATH_DISPLAY } from './ais/state.js';\nimport {\n DEFAULT_AUTOMATION_STATE_PATH_DISPLAY,\n isUpdateChannel,\n type UpdateChannel,\n} from './automation/index.js';\nimport { isSecretType, type SecretType } from './vault/types.js';\n\nconst CONFIG_FILE_MODE = 0o600;\nexport const DEFAULT_CONFIG_PATH = join(homedir(), '.ais', 'config.json');\nexport const DEFAULT_VAULT_PATH_DISPLAY = '~/.ais/vault.enc';\n\nexport interface CustomPatternConfig {\n id: string;\n regex: string;\n type: SecretType;\n}\n\nexport interface AisConfig {\n ais: {\n recentLimit: number;\n statePath: string;\n };\n automation: {\n statePath: string;\n };\n customPatterns: CustomPatternConfig[];\n detection: {\n context: boolean;\n entropy: boolean;\n entropyThreshold: number;\n patterns: boolean;\n };\n display: {\n debug: boolean;\n };\n protect: {\n enabled: boolean;\n tools: {\n claude: boolean;\n codex: boolean;\n openclaw: boolean;\n };\n };\n storage: {\n persistSecrets: boolean;\n vaultPath: string;\n };\n update: {\n channel: UpdateChannel;\n checkIntervalMinutes: number;\n enabled: boolean;\n silent: boolean;\n };\n}\n\nexport interface LoadedConfig {\n config: AisConfig;\n exists: boolean;\n path: string;\n}\n\nexport function createDefaultConfig(): AisConfig {\n return {\n ais: {\n recentLimit: 20,\n statePath: DEFAULT_AIS_STATE_PATH_DISPLAY,\n },\n automation: {\n statePath: DEFAULT_AUTOMATION_STATE_PATH_DISPLAY,\n },\n customPatterns: [],\n detection: {\n patterns: true,\n context: true,\n entropy: false,\n entropyThreshold: 4,\n },\n display: {\n debug: false,\n },\n protect: {\n enabled: true,\n tools: {\n claude: true,\n codex: true,\n openclaw: true,\n },\n },\n storage: {\n persistSecrets: false,\n vaultPath: DEFAULT_VAULT_PATH_DISPLAY,\n },\n update: {\n channel: 'latest',\n checkIntervalMinutes: 1440,\n enabled: true,\n silent: true,\n },\n };\n}\n\nexport function expandHomePath(path: string): string {\n if (path === '~') {\n return homedir();\n }\n\n if (path.startsWith('~/')) {\n return join(homedir(), path.slice(2));\n }\n\n return path;\n}\n\nexport function resolveConfigPath(path?: string): string {\n return expandHomePath(path ?? DEFAULT_CONFIG_PATH);\n}\n\nexport async function loadConfig(path?: string): Promise<LoadedConfig> {\n const resolvedPath = resolveConfigPath(path);\n\n if (!existsSync(resolvedPath)) {\n return {\n config: createDefaultConfig(),\n exists: false,\n path: resolvedPath,\n };\n }\n\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(await readFile(resolvedPath, 'utf8'));\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to load config: ${message}`);\n }\n\n return {\n config: mergeConfig(parsed),\n exists: true,\n path: resolvedPath,\n };\n}\n\nexport async function saveConfig(config: AisConfig, path?: string): Promise<void> {\n const resolvedPath = resolveConfigPath(path);\n const payload = `${JSON.stringify(config, null, 2)}\\n`;\n\n await mkdir(dirname(resolvedPath), { recursive: true });\n await writeFile(resolvedPath, payload, { mode: CONFIG_FILE_MODE });\n chmodSync(resolvedPath, CONFIG_FILE_MODE);\n}\n\nfunction mergeConfig(raw: unknown): AisConfig {\n if (!isRecord(raw)) {\n throw new Error('Failed to load config: root must be an object');\n }\n\n const config = createDefaultConfig();\n\n if ('detection' in raw) {\n const detection = expectObject(raw.detection, 'detection');\n\n if ('patterns' in detection) {\n config.detection.patterns = expectBoolean(detection.patterns, 'detection.patterns');\n }\n\n if ('context' in detection) {\n config.detection.context = expectBoolean(detection.context, 'detection.context');\n }\n\n if ('entropy' in detection) {\n config.detection.entropy = expectBoolean(detection.entropy, 'detection.entropy');\n }\n\n if ('entropyThreshold' in detection) {\n config.detection.entropyThreshold = expectFiniteNumber(\n detection.entropyThreshold,\n 'detection.entropyThreshold',\n );\n }\n }\n\n if ('ais' in raw) {\n const ais = expectObject(raw.ais, 'ais');\n\n if ('recentLimit' in ais) {\n config.ais.recentLimit = expectPositiveInteger(ais.recentLimit, 'ais.recentLimit');\n }\n\n if ('statePath' in ais) {\n config.ais.statePath = expectString(ais.statePath, 'ais.statePath');\n }\n }\n\n if ('automation' in raw) {\n const automation = expectObject(raw.automation, 'automation');\n\n if ('statePath' in automation) {\n config.automation.statePath = expectString(automation.statePath, 'automation.statePath');\n }\n }\n\n if ('display' in raw) {\n const display = expectObject(raw.display, 'display');\n\n if ('debug' in display) {\n config.display.debug = expectBoolean(display.debug, 'display.debug');\n }\n }\n\n if ('storage' in raw) {\n const storage = expectObject(raw.storage, 'storage');\n\n if ('persistSecrets' in storage) {\n config.storage.persistSecrets = expectBoolean(storage.persistSecrets, 'storage.persistSecrets');\n }\n\n if ('vaultPath' in storage) {\n config.storage.vaultPath = expectString(storage.vaultPath, 'storage.vaultPath');\n }\n }\n\n if ('update' in raw) {\n const update = expectObject(raw.update, 'update');\n\n if ('enabled' in update) {\n config.update.enabled = expectBoolean(update.enabled, 'update.enabled');\n }\n\n if ('channel' in update) {\n config.update.channel = expectUpdateChannel(update.channel, 'update.channel');\n }\n\n if ('checkIntervalMinutes' in update) {\n config.update.checkIntervalMinutes = expectPositiveInteger(\n update.checkIntervalMinutes,\n 'update.checkIntervalMinutes',\n );\n }\n\n if ('silent' in update) {\n config.update.silent = expectBoolean(update.silent, 'update.silent');\n }\n }\n\n if ('protect' in raw) {\n const protect = expectObject(raw.protect, 'protect');\n\n if ('enabled' in protect) {\n config.protect.enabled = expectBoolean(protect.enabled, 'protect.enabled');\n }\n\n if ('tools' in protect) {\n const tools = expectObject(protect.tools, 'protect.tools');\n\n if ('claude' in tools) {\n config.protect.tools.claude = expectBoolean(tools.claude, 'protect.tools.claude');\n }\n\n if ('codex' in tools) {\n config.protect.tools.codex = expectBoolean(tools.codex, 'protect.tools.codex');\n }\n\n if ('openclaw' in tools) {\n config.protect.tools.openclaw = expectBoolean(tools.openclaw, 'protect.tools.openclaw');\n }\n }\n }\n\n if ('customPatterns' in raw) {\n if (!Array.isArray(raw.customPatterns)) {\n throw new Error('Failed to load config: customPatterns must be an array');\n }\n\n config.customPatterns = raw.customPatterns.map((value, index) => parseCustomPattern(value, index));\n }\n\n return config;\n}\n\nfunction parseCustomPattern(value: unknown, index: number): CustomPatternConfig {\n const pattern = expectObject(value, `customPatterns[${index}]`);\n const id = expectString(pattern.id, `customPatterns[${index}].id`);\n const regex = expectString(pattern.regex, `customPatterns[${index}].regex`);\n const type = expectString(pattern.type, `customPatterns[${index}].type`);\n\n if (!isSecretType(type)) {\n throw new Error(`Failed to load config: customPatterns[${index}].type is invalid`);\n }\n\n try {\n new RegExp(regex, 'g');\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to load config: customPatterns[${index}].regex is invalid: ${message}`);\n }\n\n return {\n id,\n regex,\n type,\n };\n}\n\nfunction expectBoolean(value: unknown, path: string): boolean {\n if (typeof value !== 'boolean') {\n throw new Error(`Failed to load config: ${path} must be a boolean`);\n }\n\n return value;\n}\n\nfunction expectFiniteNumber(value: unknown, path: string): number {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw new Error(`Failed to load config: ${path} must be a finite number`);\n }\n\n return value;\n}\n\nfunction expectPositiveInteger(value: unknown, path: string): number {\n const parsed = expectFiniteNumber(value, path);\n if (!Number.isInteger(parsed) || parsed < 1) {\n throw new Error(`Failed to load config: ${path} must be a positive integer`);\n }\n\n return parsed;\n}\n\nfunction expectUpdateChannel(value: unknown, path: string): UpdateChannel {\n if (typeof value !== 'string' || !isUpdateChannel(value)) {\n throw new Error(`Failed to load config: ${path} must be \"latest\" or \"next\"`);\n }\n\n return value;\n}\n\nfunction expectObject(value: unknown, path: string): Record<string, unknown> {\n if (!isRecord(value)) {\n throw new Error(`Failed to load config: ${path} must be an object`);\n }\n\n return value;\n}\n\nfunction expectString(value: unknown, path: string): string {\n if (typeof value !== 'string') {\n throw new Error(`Failed to load config: ${path} must be a string`);\n }\n\n return value;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n","import { createHash } from 'node:crypto';\nimport { chmodSync, existsSync } from 'node:fs';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { dirname, join } from 'node:path';\n\nimport {\n isSecretSource,\n isSecretType,\n type SecretSource,\n type SecretType,\n} from '../vault/types.js';\n\nconst STATE_FILE_MODE = 0o600;\n\nexport const DEFAULT_AIS_STATE_PATH_DISPLAY = '~/.ais/ais-state.json';\n\nexport interface AisRecentRecord {\n id: string;\n createdAt: number;\n lastSeenAt: number;\n name?: string;\n preview: string;\n seenCount: number;\n source: SecretSource;\n type: SecretType;\n}\n\nexport interface AisState {\n excludedRecordIds: string[];\n excludedTypes: SecretType[];\n recentRecords: AisRecentRecord[];\n}\n\nexport interface AisStoreOptions {\n path?: string;\n recentLimit?: number;\n}\n\nexport interface RecordSecretOptions {\n name?: string;\n source: SecretSource;\n timestamp?: number;\n}\n\nexport function createDefaultAisState(): AisState {\n return {\n excludedRecordIds: [],\n excludedTypes: [],\n recentRecords: [],\n };\n}\n\nexport function buildAisRecordId(secret: string): string {\n return createHash('sha256').update(secret).digest('hex').slice(0, 12);\n}\n\nexport function resolveAisStatePath(path?: string): string {\n return expandHomePath(path ?? DEFAULT_AIS_STATE_PATH_DISPLAY);\n}\n\nexport class AisStore {\n private dirty = false;\n private loaded = false;\n private state = createDefaultAisState();\n\n constructor(private readonly options: AisStoreOptions = {}) {}\n\n async load(): Promise<AisState> {\n if (this.loaded) {\n return this.getState();\n }\n\n const statePath = this.getPath();\n if (!existsSync(statePath)) {\n this.loaded = true;\n return this.getState();\n }\n\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(await readFile(statePath, 'utf8'));\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to load AIS state: ${message}`);\n }\n\n this.state = mergeAisState(parsed);\n this.loaded = true;\n return this.getState();\n }\n\n async save(): Promise<void> {\n if (!this.loaded || !this.dirty) {\n return;\n }\n\n const statePath = this.getPath();\n const payload = `${JSON.stringify(this.state, null, 2)}\\n`;\n await mkdir(dirname(statePath), { recursive: true });\n await writeFile(statePath, payload, { mode: STATE_FILE_MODE });\n chmodSync(statePath, STATE_FILE_MODE);\n this.dirty = false;\n }\n\n getPath(): string {\n return resolveAisStatePath(this.options.path);\n }\n\n getState(): AisState {\n return {\n excludedRecordIds: [...this.state.excludedRecordIds],\n excludedTypes: [...this.state.excludedTypes],\n recentRecords: this.state.recentRecords.map((record) => ({ ...record })),\n };\n }\n\n isExcluded(secret: string, type: SecretType): boolean {\n this.assertLoaded();\n return this.state.excludedTypes.includes(type) || this.state.excludedRecordIds.includes(buildAisRecordId(secret));\n }\n\n recordSecret(secret: string, type: SecretType, options: RecordSecretOptions): AisRecentRecord {\n this.assertLoaded();\n const id = buildAisRecordId(secret);\n const timestamp = options.timestamp ?? Date.now();\n const preview = buildPreview(secret);\n const existing = this.state.recentRecords.find((record) => record.id === id);\n\n if (existing) {\n existing.lastSeenAt = timestamp;\n existing.seenCount += 1;\n existing.type = type;\n existing.source = options.source;\n existing.preview = preview;\n existing.name = normalizeName(options.name) ?? existing.name;\n this.sortRecentRecords();\n this.dirty = true;\n return { ...existing };\n }\n\n const record: AisRecentRecord = {\n id,\n createdAt: timestamp,\n lastSeenAt: timestamp,\n name: normalizeName(options.name),\n preview,\n seenCount: 1,\n source: options.source,\n type,\n };\n this.state.recentRecords.unshift(record);\n this.trimRecentRecords();\n this.sortRecentRecords();\n this.dirty = true;\n return { ...record };\n }\n\n setRecordExcluded(id: string, excluded: boolean): boolean {\n this.assertLoaded();\n const normalizedId = id.trim();\n if (!this.state.recentRecords.some((record) => record.id === normalizedId)) {\n return false;\n }\n\n const nextIds = new Set(this.state.excludedRecordIds);\n const hadValue = nextIds.has(normalizedId);\n if (excluded) {\n nextIds.add(normalizedId);\n } else {\n nextIds.delete(normalizedId);\n }\n\n if (hadValue === excluded) {\n return true;\n }\n\n this.state.excludedRecordIds = Array.from(nextIds).sort();\n this.dirty = true;\n return true;\n }\n\n setTypeExcluded(type: SecretType, excluded: boolean): void {\n this.assertLoaded();\n const nextTypes = new Set(this.state.excludedTypes);\n const hadValue = nextTypes.has(type);\n if (excluded) {\n nextTypes.add(type);\n } else {\n nextTypes.delete(type);\n }\n\n if (hadValue === excluded) {\n return;\n }\n\n this.state.excludedTypes = Array.from(nextTypes).sort();\n this.dirty = true;\n }\n\n private assertLoaded(): void {\n if (!this.loaded) {\n throw new Error('AIS state must be loaded before use.');\n }\n }\n\n private sortRecentRecords(): void {\n this.state.recentRecords.sort((left, right) => right.lastSeenAt - left.lastSeenAt);\n }\n\n private trimRecentRecords(): void {\n const recentLimit = Math.max(1, this.options.recentLimit ?? 20);\n if (this.state.recentRecords.length > recentLimit) {\n this.state.recentRecords.length = recentLimit;\n }\n }\n}\n\nfunction buildPreview(secret: string): string {\n const singleLine = secret.replace(/\\s+/g, ' ').trim();\n if (singleLine.length <= 6) {\n return `${singleLine.slice(0, 1)}***${singleLine.slice(-1)}`;\n }\n\n if (singleLine.length <= 12) {\n return `${singleLine.slice(0, 2)}***${singleLine.slice(-2)}`;\n }\n\n return `${singleLine.slice(0, 4)}***${singleLine.slice(-4)}`;\n}\n\nfunction mergeAisState(raw: unknown): AisState {\n if (!isRecord(raw)) {\n throw new Error('Failed to load AIS state: root must be an object');\n }\n\n const state = createDefaultAisState();\n\n if ('excludedRecordIds' in raw) {\n if (!Array.isArray(raw.excludedRecordIds) || !raw.excludedRecordIds.every((value) => typeof value === 'string')) {\n throw new Error('Failed to load AIS state: excludedRecordIds must be a string array');\n }\n\n state.excludedRecordIds = raw.excludedRecordIds.map((value) => value.trim()).filter(Boolean);\n }\n\n if ('excludedTypes' in raw) {\n if (!Array.isArray(raw.excludedTypes) || !raw.excludedTypes.every(isSecretType)) {\n throw new Error('Failed to load AIS state: excludedTypes must contain valid secret types');\n }\n\n state.excludedTypes = [...raw.excludedTypes];\n }\n\n if ('recentRecords' in raw) {\n if (!Array.isArray(raw.recentRecords)) {\n throw new Error('Failed to load AIS state: recentRecords must be an array');\n }\n\n state.recentRecords = raw.recentRecords.map((value, index) => parseRecentRecord(value, index));\n }\n\n return state;\n}\n\nfunction parseRecentRecord(value: unknown, index: number): AisRecentRecord {\n if (!isRecord(value)) {\n throw new Error(`Failed to load AIS state: recentRecords[${index}] must be an object`);\n }\n\n const id = expectString(value.id, `recentRecords[${index}].id`);\n const createdAt = expectNumber(value.createdAt, `recentRecords[${index}].createdAt`);\n const lastSeenAt = expectNumber(value.lastSeenAt, `recentRecords[${index}].lastSeenAt`);\n const preview = expectString(value.preview, `recentRecords[${index}].preview`);\n const seenCount = expectNumber(value.seenCount, `recentRecords[${index}].seenCount`);\n const source = expectSecretSource(value.source, `recentRecords[${index}].source`);\n const type = expectSecretType(value.type, `recentRecords[${index}].type`);\n\n return {\n id,\n createdAt,\n lastSeenAt,\n name: normalizeName(expectOptionalString(value.name, `recentRecords[${index}].name`)),\n preview,\n seenCount,\n source,\n type,\n };\n}\n\nfunction expectNumber(value: unknown, path: string): number {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw new Error(`Failed to load AIS state: ${path} must be a finite number`);\n }\n\n return value;\n}\n\nfunction expectOptionalString(value: unknown, path: string): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n return expectString(value, path);\n}\n\nfunction expectSecretSource(value: unknown, path: string): SecretSource {\n if (!isSecretSource(value)) {\n throw new Error(`Failed to load AIS state: ${path} must be a valid source`);\n }\n\n return value;\n}\n\nfunction expectSecretType(value: unknown, path: string): SecretType {\n if (!isSecretType(value)) {\n throw new Error(`Failed to load AIS state: ${path} must be a valid type`);\n }\n\n return value;\n}\n\nfunction expectString(value: unknown, path: string): string {\n if (typeof value !== 'string') {\n throw new Error(`Failed to load AIS state: ${path} must be a string`);\n }\n\n return value;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction normalizeName(name: string | undefined): string | undefined {\n if (name === undefined) {\n return undefined;\n }\n\n const trimmed = name.trim();\n return trimmed.length === 0 ? undefined : trimmed;\n}\n\nexport function getDefaultAisStatePath(baseDirectory = '~/.ais'): string {\n return join(baseDirectory, 'ais-state.json');\n}\n\nfunction expandHomePath(path: string): string {\n if (path === '~') {\n return homedir();\n }\n\n if (path.startsWith('~/')) {\n return join(homedir(), path.slice(2));\n }\n\n return path;\n}\n","export const SECRET_TYPES = [\n 'PASSWORD',\n 'APIKEY',\n 'DBCONN',\n 'PRIVATE_KEY',\n 'BEARER_TOKEN',\n 'JWT',\n 'GENERIC',\n] as const;\n\nexport type SecretType = (typeof SECRET_TYPES)[number];\n\nexport const SECRET_SOURCES = ['manual', 'argv', 'stdin', 'proxy'] as const;\n\nexport type SecretSource = (typeof SECRET_SOURCES)[number];\n\nexport interface VaultEntry {\n token: string;\n secret: string;\n type: SecretType;\n createdAt: number;\n hitCount: number;\n name?: string;\n source?: SecretSource;\n}\n\nexport type TokenGenerator = (\n secret: string,\n type: SecretType,\n sessionId: string,\n) => string;\n\nexport function isSecretType(value: unknown): value is SecretType {\n return typeof value === 'string' && SECRET_TYPES.includes(value as SecretType);\n}\n\nexport function isSecretSource(value: unknown): value is SecretSource {\n return typeof value === 'string' && SECRET_SOURCES.includes(value as SecretSource);\n}\n","import { spawn } from 'node:child_process';\nimport { constants, existsSync } from 'node:fs';\nimport { access, chmod, lstat, mkdir, readFile, readlink, rename, rm, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { basename, delimiter, dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport {\n PROTECT_TOOLS,\n cloneAutomationState,\n createDefaultProtectToolRuntimeState,\n type AutomationState,\n type ProtectTool,\n type ProtectToolRuntimeState,\n} from '../automation/index.js';\nimport type { AisConfig } from '../config.js';\n\nconst EXECUTABLE_MODE = 0o755;\nconst MANAGED_WRAPPER_MARKER = '# AIS protect wrapper';\nconst SHELL_BLOCK_START = '# >>> AIS protect >>>';\nconst SHELL_BLOCK_END = '# <<< AIS protect <<<';\n\nexport interface ProtectShellCommandResult {\n exitCode: number;\n stderr: string;\n stdout: string;\n}\n\nexport type ProtectShellRunner = (\n command: string,\n args: string[],\n options: {\n env?: NodeJS.ProcessEnv;\n },\n) => Promise<ProtectShellCommandResult>;\n\nexport interface ProtectRuntimeOptions {\n aisCliPath?: string;\n env?: NodeJS.ProcessEnv;\n homeDir?: string;\n nodePath?: string;\n now?: () => number;\n shellPath?: string;\n shellRunner?: ProtectShellRunner;\n}\n\nexport interface ProtectSyncResult {\n changed: boolean;\n errors: string[];\n state: AutomationState;\n warnings: string[];\n}\n\nexport interface ProtectRestoreResult extends ProtectSyncResult {\n config: AisConfig;\n}\n\ninterface ProtectContext {\n aisCliPath: string;\n backupRootDir: string;\n env: NodeJS.ProcessEnv;\n homeDir: string;\n managedBinDir: string;\n nodePath: string;\n now: () => number;\n shellPath?: string;\n shellRunner: ProtectShellRunner;\n}\n\ninterface ToolCommandInfo {\n collision?: 'alias' | 'function';\n firstPath?: string;\n paths: string[];\n}\n\ninterface ToolOperationResult {\n error?: string;\n runtime: ProtectToolRuntimeState;\n usesManagedBin: boolean;\n warning?: string;\n}\n\nexport async function syncProtectRuntime(\n config: AisConfig,\n state: AutomationState,\n options: ProtectRuntimeOptions = {},\n): Promise<ProtectSyncResult> {\n const context = createContext(options);\n const nextState = cloneAutomationState(state);\n const warnings: string[] = [];\n const errors: string[] = [];\n let managedBinNeeded = false;\n\n for (const tool of PROTECT_TOOLS) {\n const desired = config.protect.enabled && config.protect.tools[tool];\n const result = desired\n ? await installToolTakeover(tool, nextState.protect.tools[tool], context)\n : await removeToolTakeover(tool, nextState.protect.tools[tool], context, true);\n\n nextState.protect.tools[tool] = result.runtime;\n managedBinNeeded ||= result.usesManagedBin;\n if (result.warning) {\n warnings.push(result.warning);\n }\n if (result.error) {\n errors.push(result.error);\n }\n }\n\n const shellChanged = managedBinNeeded\n ? await ensureShellBlock(context)\n : await removeShellBlock(context);\n\n return {\n changed: shellChanged || hasStateChanged(state, nextState),\n errors,\n state: nextState,\n warnings,\n };\n}\n\nexport async function refreshProtectRuntime(\n state: AutomationState,\n options: ProtectRuntimeOptions = {},\n): Promise<ProtectSyncResult> {\n const context = createContext(options);\n const nextState = cloneAutomationState(state);\n const warnings: string[] = [];\n\n for (const tool of PROTECT_TOOLS) {\n const current = nextState.protect.tools[tool];\n const inspection = await inspectToolRuntime(tool, current, context);\n nextState.protect.tools[tool] = inspection.runtime;\n if (inspection.warning) {\n warnings.push(inspection.warning);\n }\n }\n\n return {\n changed: hasStateChanged(state, nextState),\n errors: [],\n state: nextState,\n warnings,\n };\n}\n\nexport async function restoreProtectRuntime(\n config: AisConfig,\n state: AutomationState,\n options: ProtectRuntimeOptions = {},\n): Promise<ProtectRestoreResult> {\n const context = createContext(options);\n const nextState = cloneAutomationState(state);\n const warnings: string[] = [];\n const errors: string[] = [];\n\n for (const tool of PROTECT_TOOLS) {\n const result = await removeToolTakeover(tool, nextState.protect.tools[tool], context, false);\n nextState.protect.tools[tool] = result.runtime;\n if (result.warning) {\n warnings.push(result.warning);\n }\n if (result.error) {\n errors.push(result.error);\n }\n }\n\n const shellChanged = await removeShellBlock(context);\n const nextConfig = structuredClone(config);\n nextConfig.protect.enabled = false;\n nextConfig.protect.tools.claude = false;\n nextConfig.protect.tools.codex = false;\n nextConfig.protect.tools.openclaw = false;\n\n return {\n changed: shellChanged || hasStateChanged(state, nextState) || JSON.stringify(config.protect) !== JSON.stringify(nextConfig.protect),\n config: nextConfig,\n errors,\n state: nextState,\n warnings,\n };\n}\n\nexport async function resolveProtectedCommand(\n command: string,\n env: NodeJS.ProcessEnv = process.env,\n options: Pick<ProtectRuntimeOptions, 'homeDir'> = {},\n): Promise<string> {\n if (\n env.AIS_PROTECT_WRAPPER_ACTIVE !== '1' ||\n env.AIS_PROTECT_TOOL !== command ||\n !PROTECT_TOOLS.includes(command as ProtectTool)\n ) {\n return command;\n }\n\n const explicitCommand = env.AIS_PROTECT_REAL_COMMAND?.trim();\n const wrapperPath = env.AIS_PROTECT_WRAPPER_PATH?.trim();\n if (explicitCommand && explicitCommand !== wrapperPath && (await isExecutablePath(explicitCommand))) {\n return explicitCommand;\n }\n\n const homeDir = options.homeDir ?? env.HOME ?? homedir();\n const managedBinDir = env.AIS_PROTECT_WRAPPER_DIR?.trim() || join(homeDir, '.ais', 'bin');\n const found = await findCommandPaths(command as ProtectTool, env.PATH ?? process.env.PATH ?? '', {\n excludeDirs: [managedBinDir],\n excludePaths: wrapperPath ? [wrapperPath] : [],\n });\n\n if (found.paths[0]) {\n return found.paths[0];\n }\n\n throw new Error(\n `Protected command ${command} does not have a real target yet. Install the original tool first, or run \"ais protect off ${command}\".`,\n );\n}\n\nfunction createContext(options: ProtectRuntimeOptions): ProtectContext {\n const env = options.env ?? process.env;\n const homeDir = options.homeDir ?? env.HOME ?? homedir();\n return {\n aisCliPath: options.aisCliPath ?? resolveManagedCliPath(),\n backupRootDir: join(homeDir, '.ais', 'backups'),\n env,\n homeDir,\n managedBinDir: join(homeDir, '.ais', 'bin'),\n nodePath: options.nodePath ?? process.execPath,\n now: options.now ?? Date.now,\n shellPath: options.shellPath ?? env.SHELL,\n shellRunner: options.shellRunner ?? runShellCommand,\n };\n}\n\nfunction resolveManagedCliPath(): string {\n const candidatePaths = [\n fileURLToPath(new URL('../../dist/cli.js', import.meta.url)),\n fileURLToPath(new URL('../cli.js', import.meta.url)),\n process.argv[1] ? resolve(process.argv[1]) : undefined,\n ].filter((value): value is string => typeof value === 'string' && value.length > 0);\n\n const foundPath = candidatePaths.find((candidatePath) => existsSync(candidatePath));\n if (foundPath) {\n return foundPath;\n }\n\n return resolve(join(process.cwd(), 'dist', 'cli.js'));\n}\n\nasync function installToolTakeover(\n tool: ProtectTool,\n runtime: ProtectToolRuntimeState,\n context: ProtectContext,\n): Promise<ToolOperationResult> {\n const commandInfo = await findCommandPaths(tool, context.env.PATH ?? process.env.PATH ?? '', {\n context,\n excludeDirs: [context.managedBinDir],\n });\n const collisionMessage = formatCollisionMessage(tool, commandInfo.collision);\n\n if (runtime.installed && runtime.managedPath && (await isManagedWrapper(runtime.managedPath))) {\n if (runtime.managedPath.startsWith(context.managedBinDir)) {\n const rewritten = await installPrependTakeover(tool, runtime, commandInfo, context);\n if (collisionMessage && !rewritten.warning) {\n rewritten.warning = collisionMessage;\n }\n return rewritten;\n }\n\n const rewritten = await installInPlaceTakeover(\n tool,\n runtime.managedPath,\n runtime.originalCommandPath ?? runtime.managedPath,\n runtime.backupPath,\n context,\n );\n if (collisionMessage && !rewritten.warning) {\n rewritten.warning = collisionMessage;\n }\n return rewritten;\n }\n\n if (commandInfo.firstPath && (await shouldUseInPlaceTakeover(commandInfo.firstPath, context.homeDir))) {\n const installed = await installInPlaceTakeover(tool, commandInfo.firstPath, commandInfo.firstPath, undefined, context);\n if (collisionMessage && !installed.warning) {\n installed.warning = collisionMessage;\n }\n return installed;\n }\n\n const prepended = await installPrependTakeover(tool, runtime, commandInfo, context);\n if (collisionMessage && !prepended.warning) {\n prepended.warning = collisionMessage;\n }\n return prepended;\n}\n\nasync function installInPlaceTakeover(\n tool: ProtectTool,\n managedPath: string,\n originalCommandPath: string,\n currentBackupPath: string | undefined,\n context: ProtectContext,\n): Promise<ToolOperationResult> {\n const backupPath = currentBackupPath ?? join(context.backupRootDir, tool, basename(originalCommandPath));\n const wrapper = createWrapperScript(tool, managedPath, context, backupPath);\n let warning: string | undefined;\n\n if (currentBackupPath && !existsSync(currentBackupPath)) {\n warning = `${tool}: backup target is missing, fallback lookup will be used until it is rebuilt.`;\n }\n\n if (await isManagedWrapper(managedPath)) {\n await writeExecutableFile(managedPath, wrapper);\n return {\n runtime: buildRuntimeState({\n backupPath,\n installed: true,\n lastError: warning,\n managedPath,\n originalCommandPath,\n suspended: false,\n }, context),\n usesManagedBin: false,\n warning,\n };\n }\n\n await mkdir(dirname(backupPath), { recursive: true });\n if (existsSync(backupPath)) {\n await rm(backupPath, { force: true, recursive: true });\n }\n\n let renamed = false;\n try {\n await rename(managedPath, backupPath);\n renamed = true;\n await writeExecutableFile(managedPath, wrapper);\n\n return {\n runtime: buildRuntimeState({\n backupPath,\n installed: true,\n lastError: warning,\n managedPath,\n originalCommandPath,\n suspended: false,\n }, context),\n usesManagedBin: false,\n warning,\n };\n } catch (error) {\n if (renamed) {\n await rm(managedPath, { force: true }).catch(() => undefined);\n await rename(backupPath, managedPath).catch(() => undefined);\n }\n\n return {\n error: `${tool}: failed to install in-place takeover (${toErrorMessage(error)})`,\n runtime: buildRuntimeState({\n installed: false,\n lastError: `install failed: ${toErrorMessage(error)}`,\n originalCommandPath,\n suspended: false,\n }, context),\n usesManagedBin: false,\n };\n }\n}\n\nasync function installPrependTakeover(\n tool: ProtectTool,\n runtime: ProtectToolRuntimeState,\n commandInfo: ToolCommandInfo,\n context: ProtectContext,\n): Promise<ToolOperationResult> {\n if (runtime.installed && runtime.managedPath && !runtime.managedPath.startsWith(context.managedBinDir)) {\n const removed = await removeToolTakeover(tool, runtime, context, false);\n if (removed.error) {\n return removed;\n }\n }\n\n const managedPath = join(context.managedBinDir, tool);\n await mkdir(context.managedBinDir, { recursive: true });\n await writeExecutableFile(managedPath, createWrapperScript(tool, managedPath, context));\n\n const warningParts: string[] = [];\n if (!commandInfo.firstPath) {\n warningParts.push(`${tool}: original command is not installed yet; AIS will wait for it to appear later.`);\n }\n const collisionMessage = formatCollisionMessage(tool, commandInfo.collision);\n if (collisionMessage) {\n warningParts.push(collisionMessage);\n }\n\n return {\n runtime: buildRuntimeState({\n installed: true,\n lastError: warningParts.length === 0 ? undefined : warningParts.join(' '),\n managedPath,\n originalCommandPath: commandInfo.firstPath,\n suspended: false,\n }, context),\n usesManagedBin: true,\n warning: warningParts.length === 0 ? undefined : warningParts.join(' '),\n };\n}\n\nasync function removeToolTakeover(\n tool: ProtectTool,\n runtime: ProtectToolRuntimeState,\n context: ProtectContext,\n keepSuspended: boolean,\n): Promise<ToolOperationResult> {\n const managedPath = runtime.managedPath;\n const backupPath = runtime.backupPath;\n const originalCommandPath = runtime.originalCommandPath;\n\n if (managedPath && managedPath.startsWith(context.managedBinDir)) {\n if (existsSync(managedPath)) {\n await rm(managedPath, { force: true }).catch(() => undefined);\n }\n\n const commandInfo = await findCommandPaths(tool, context.env.PATH ?? process.env.PATH ?? '', {\n context,\n excludeDirs: [context.managedBinDir],\n });\n\n return {\n runtime: buildRuntimeState({\n installed: false,\n lastError: undefined,\n originalCommandPath: commandInfo.firstPath ?? originalCommandPath,\n suspended: keepSuspended,\n }, context),\n usesManagedBin: false,\n };\n }\n\n if (managedPath && backupPath && existsSync(backupPath)) {\n const managedIsWrapper = await isManagedWrapper(managedPath);\n\n try {\n if (managedIsWrapper) {\n await rm(managedPath, { force: true });\n await rename(backupPath, originalCommandPath ?? managedPath);\n } else if (!existsSync(originalCommandPath ?? managedPath)) {\n await rename(backupPath, originalCommandPath ?? managedPath);\n } else {\n await rm(backupPath, { force: true, recursive: true });\n }\n\n return {\n runtime: buildRuntimeState({\n installed: false,\n lastError: undefined,\n originalCommandPath: originalCommandPath ?? managedPath,\n suspended: keepSuspended,\n }, context),\n usesManagedBin: false,\n };\n } catch (error) {\n return {\n error: `${tool}: failed to restore original command (${toErrorMessage(error)})`,\n runtime: buildRuntimeState({\n backupPath,\n installed: managedIsWrapper,\n lastError: `restore failed: ${toErrorMessage(error)}`,\n managedPath,\n originalCommandPath: originalCommandPath ?? managedPath,\n suspended: keepSuspended,\n }, context),\n usesManagedBin: false,\n };\n }\n }\n\n const commandInfo = await findCommandPaths(tool, context.env.PATH ?? process.env.PATH ?? '', {\n context,\n excludeDirs: [context.managedBinDir],\n });\n\n return {\n runtime: buildRuntimeState({\n installed: false,\n lastError: undefined,\n originalCommandPath: commandInfo.firstPath ?? originalCommandPath,\n suspended: keepSuspended,\n }, context),\n usesManagedBin: false,\n };\n}\n\nasync function inspectToolRuntime(\n tool: ProtectTool,\n runtime: ProtectToolRuntimeState,\n context: ProtectContext,\n): Promise<ToolOperationResult> {\n const nextRuntime = {\n ...runtime,\n };\n\n const commandInfo = await findCommandPaths(tool, context.env.PATH ?? process.env.PATH ?? '', {\n context,\n excludeDirs: [context.managedBinDir],\n excludePaths: runtime.managedPath ? [runtime.managedPath] : [],\n });\n\n if (!runtime.managedPath) {\n nextRuntime.installed = false;\n nextRuntime.originalCommandPath = commandInfo.firstPath;\n nextRuntime.lastError = undefined;\n return {\n runtime: nextRuntime,\n usesManagedBin: false,\n };\n }\n\n const installed = await isManagedWrapper(runtime.managedPath);\n const warningParts: string[] = [];\n const collisionMessage = formatCollisionMessage(tool, commandInfo.collision);\n if (collisionMessage) {\n warningParts.push(collisionMessage);\n }\n if (runtime.managedPath.startsWith(context.managedBinDir) && !commandInfo.firstPath) {\n warningParts.push(`${tool}: original command is not installed yet.`);\n }\n if (!installed) {\n warningParts.push(`${tool}: managed entry is missing or has been replaced.`);\n }\n\n nextRuntime.installed = installed;\n nextRuntime.originalCommandPath = commandInfo.firstPath ?? runtime.originalCommandPath;\n nextRuntime.lastError = warningParts.length === 0 ? undefined : warningParts.join(' ');\n return {\n runtime: nextRuntime,\n usesManagedBin: runtime.managedPath.startsWith(context.managedBinDir),\n warning: warningParts.length === 0 ? undefined : warningParts.join(' '),\n };\n}\n\nasync function shouldUseInPlaceTakeover(commandPath: string, homeDir: string): Promise<boolean> {\n const normalized = resolve(commandPath);\n if (!normalized.startsWith(resolve(homeDir))) {\n return false;\n }\n\n const lower = normalized.toLowerCase();\n if (\n lower.includes('/.npm-global/bin/') ||\n lower.includes('/.npm/bin/') ||\n lower.includes('/node_modules/.bin/')\n ) {\n return true;\n }\n\n try {\n const entry = await lstat(commandPath);\n if (entry.isSymbolicLink()) {\n const linked = resolve(dirname(commandPath), await readlink(commandPath)).toLowerCase();\n return linked.includes('/node_modules/');\n }\n } catch {\n return false;\n }\n\n return false;\n}\n\nasync function findCommandPaths(\n tool: ProtectTool,\n pathValue: string,\n options: {\n context?: ProtectContext;\n excludeDirs?: string[];\n excludePaths?: string[];\n } = {},\n): Promise<ToolCommandInfo> {\n const directories = pathValue\n .split(delimiter)\n .map((entry) => entry.trim())\n .filter(Boolean)\n .map((entry) => resolve(entry));\n const excludeDirs = new Set((options.excludeDirs ?? []).map((entry) => resolve(entry)));\n const excludePaths = new Set((options.excludePaths ?? []).filter(Boolean).map((entry) => resolve(entry)));\n const paths: string[] = [];\n\n for (const directory of directories) {\n if (excludeDirs.has(directory)) {\n continue;\n }\n\n const candidate = resolve(directory, tool);\n if (excludePaths.has(candidate)) {\n continue;\n }\n\n if (!(await isExecutablePath(candidate))) {\n continue;\n }\n\n paths.push(candidate);\n }\n\n const shellInspection = await inspectShellCommand(tool, options.context);\n return {\n collision: shellInspection.collision,\n firstPath: paths[0],\n paths,\n };\n}\n\nasync function inspectShellCommand(\n tool: ProtectTool,\n context?: ProtectContext,\n): Promise<Pick<ToolCommandInfo, 'collision'>> {\n if (!context?.shellPath) {\n return {};\n }\n\n try {\n const result = await context.shellRunner(context.shellPath, ['-lic', `type -a ${tool}`], {\n env: context.env,\n });\n if (result.exitCode !== 0) {\n return {};\n }\n\n const firstLine = result.stdout\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .find((line) => line.length > 0);\n if (!firstLine) {\n return {};\n }\n\n if (/\\b(alias|aliased)\\b/i.test(firstLine)) {\n return { collision: 'alias' };\n }\n\n if (/\\bfunction\\b/i.test(firstLine)) {\n return { collision: 'function' };\n }\n } catch {\n return {};\n }\n\n return {};\n}\n\nasync function ensureShellBlock(context: ProtectContext): Promise<boolean> {\n const targets = await resolveShellTargets(context);\n const block = buildShellBlock();\n let changed = false;\n\n for (const target of targets) {\n const current = existsSync(target) ? await readFile(target, 'utf8') : '';\n const next = stripShellBlock(current).replace(/\\s+$/, '');\n const content = next.length === 0 ? `${block}\\n` : `${next}\\n\\n${block}\\n`;\n\n if (current === content) {\n continue;\n }\n\n await mkdir(dirname(target), { recursive: true });\n await writeFile(target, content, 'utf8');\n changed = true;\n }\n\n return changed;\n}\n\nasync function removeShellBlock(context: ProtectContext): Promise<boolean> {\n const targets = await resolveShellTargets(context, true);\n let changed = false;\n\n for (const target of targets) {\n if (!existsSync(target)) {\n continue;\n }\n\n const current = await readFile(target, 'utf8');\n const next = stripShellBlock(current).replace(/\\s+$/, '');\n const content = next.length === 0 ? '' : `${next}\\n`;\n if (current === content) {\n continue;\n }\n\n await writeFile(target, content, 'utf8');\n changed = true;\n }\n\n return changed;\n}\n\nasync function resolveShellTargets(context: ProtectContext, includeAllExisting = false): Promise<string[]> {\n const candidates = [\n join(context.homeDir, '.zshrc'),\n join(context.homeDir, '.zprofile'),\n join(context.homeDir, '.bashrc'),\n join(context.homeDir, '.bash_profile'),\n ];\n const existing = candidates.filter((target) => existsSync(target));\n if (includeAllExisting) {\n return existing;\n }\n\n if (existing.length > 0) {\n return existing;\n }\n\n const shellPath = context.shellPath ?? '';\n if (shellPath.includes('bash')) {\n return [join(context.homeDir, '.bashrc')];\n }\n\n return [join(context.homeDir, '.zshrc')];\n}\n\nfunction buildShellBlock(): string {\n return [\n SHELL_BLOCK_START,\n 'if [ -d \"$HOME/.ais/bin\" ]; then',\n ' export PATH=\"$HOME/.ais/bin:$PATH\"',\n 'fi',\n SHELL_BLOCK_END,\n ].join('\\n');\n}\n\nfunction stripShellBlock(content: string): string {\n const pattern = new RegExp(`${escapeForRegExp(SHELL_BLOCK_START)}[\\\\s\\\\S]*?${escapeForRegExp(SHELL_BLOCK_END)}\\\\n?`, 'g');\n return content.replace(pattern, '');\n}\n\nfunction escapeForRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction createWrapperScript(\n tool: ProtectTool,\n managedPath: string,\n context: ProtectContext,\n realCommandPath?: string,\n): string {\n return [\n '#!/bin/sh',\n MANAGED_WRAPPER_MARKER,\n `export AIS_PROTECT_WRAPPER_ACTIVE=${quoteForShell('1')}`,\n `export AIS_PROTECT_TOOL=${quoteForShell(tool)}`,\n `export AIS_PROTECT_WRAPPER_PATH=${quoteForShell(managedPath)}`,\n `export AIS_PROTECT_WRAPPER_DIR=${quoteForShell(context.managedBinDir)}`,\n `export AIS_PROTECT_REAL_COMMAND=${quoteForShell(realCommandPath ?? '')}`,\n `exec ${quoteForShell(context.nodePath)} ${quoteForShell(context.aisCliPath)} ${quoteForShell(tool)} \"$@\"`,\n '',\n ].join('\\n');\n}\n\nfunction buildRuntimeState(\n state: Partial<ProtectToolRuntimeState>,\n context: ProtectContext,\n): ProtectToolRuntimeState {\n return {\n ...createDefaultProtectToolRuntimeState(),\n ...state,\n lastChangedAt: context.now(),\n };\n}\n\nfunction formatCollisionMessage(tool: ProtectTool, collision: ToolCommandInfo['collision']): string | undefined {\n if (!collision) {\n return undefined;\n }\n\n return `${tool}: your current shell still has a ${collision} ahead of AIS, so direct launches may keep hitting that ${collision}.`;\n}\n\nfunction quoteForShell(value: string): string {\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nasync function isManagedWrapper(filePath: string): Promise<boolean> {\n if (!existsSync(filePath)) {\n return false;\n }\n\n try {\n const content = await readFile(filePath, 'utf8');\n return content.includes(MANAGED_WRAPPER_MARKER);\n } catch {\n return false;\n }\n}\n\nasync function isExecutablePath(path: string): Promise<boolean> {\n try {\n const stats = await lstat(path);\n if (stats.isDirectory()) {\n return false;\n }\n await access(path, constants.X_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function writeExecutableFile(path: string, content: string): Promise<void> {\n await writeFile(path, content, 'utf8');\n await chmod(path, EXECUTABLE_MODE);\n}\n\nasync function runShellCommand(\n command: string,\n args: string[],\n options: {\n env?: NodeJS.ProcessEnv;\n },\n): Promise<ProtectShellCommandResult> {\n return await new Promise((resolvePromise, reject) => {\n const child = spawn(command, args, {\n env: options.env,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n let stdout = '';\n let stderr = '';\n\n child.stdout.on('data', (chunk: Buffer | string) => {\n stdout += chunk.toString();\n });\n child.stderr.on('data', (chunk: Buffer | string) => {\n stderr += chunk.toString();\n });\n child.on('error', reject);\n child.on('close', (exitCode) => {\n resolvePromise({\n exitCode: exitCode ?? 1,\n stderr,\n stdout,\n });\n });\n });\n}\n\nfunction hasStateChanged(previous: AutomationState, next: AutomationState): boolean {\n return JSON.stringify(previous) !== JSON.stringify(next);\n}\n\nfunction toErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n"],"mappings":"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","names":["chmodSync","existsSync","mkdir","readFile","writeFile","homedir","dirname","join","chmodSync","existsSync","mkdir","readFile","writeFile","homedir","dirname","join","STATE_FILE_MODE","expandHomePath","existsSync","readFile","mkdir","dirname","writeFile","chmodSync","record","isRecord","expectOptionalString","expandHomePath","homedir","join","join","homedir","expandHomePath","existsSync","readFile","mkdir","dirname","writeFile","chmodSync","isRecord","expectObject","expectBoolean","expectString","existsSync","mkdir","readFile","rename","writeFile","homedir","dirname","join","homedir","join","existsSync","rewritten","mkdir","dirname","rename","commandInfo","readFile","writeFile"]}
|
package/dist/cli.d.ts
ADDED