@xwss/agentbell 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.
Files changed (74) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/LICENSE +21 -0
  3. package/README.md +969 -0
  4. package/RELEASE.md +31 -0
  5. package/dist/cli.d.ts +2 -0
  6. package/dist/cli.js +106 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/commands/doctor.d.ts +4 -0
  9. package/dist/commands/doctor.js +159 -0
  10. package/dist/commands/doctor.js.map +1 -0
  11. package/dist/commands/init.d.ts +3 -0
  12. package/dist/commands/init.js +92 -0
  13. package/dist/commands/init.js.map +1 -0
  14. package/dist/commands/initHooks.d.ts +9 -0
  15. package/dist/commands/initHooks.js +455 -0
  16. package/dist/commands/initHooks.js.map +1 -0
  17. package/dist/commands/project.d.ts +14 -0
  18. package/dist/commands/project.js +62 -0
  19. package/dist/commands/project.js.map +1 -0
  20. package/dist/commands/send.d.ts +5 -0
  21. package/dist/commands/send.js +70 -0
  22. package/dist/commands/send.js.map +1 -0
  23. package/dist/commands/setup.d.ts +13 -0
  24. package/dist/commands/setup.js +270 -0
  25. package/dist/commands/setup.js.map +1 -0
  26. package/dist/commands/test.d.ts +9 -0
  27. package/dist/commands/test.js +40 -0
  28. package/dist/commands/test.js.map +1 -0
  29. package/dist/commands/verify.d.ts +78 -0
  30. package/dist/commands/verify.js +725 -0
  31. package/dist/commands/verify.js.map +1 -0
  32. package/dist/config.d.ts +123 -0
  33. package/dist/config.js +72 -0
  34. package/dist/config.js.map +1 -0
  35. package/dist/hooks/claudeCode.d.ts +5 -0
  36. package/dist/hooks/claudeCode.js +88 -0
  37. package/dist/hooks/claudeCode.js.map +1 -0
  38. package/dist/hooks/codex.d.ts +4 -0
  39. package/dist/hooks/codex.js +74 -0
  40. package/dist/hooks/codex.js.map +1 -0
  41. package/dist/hooks/vscodeAgent.d.ts +3 -0
  42. package/dist/hooks/vscodeAgent.js +45 -0
  43. package/dist/hooks/vscodeAgent.js.map +1 -0
  44. package/dist/notify/index.d.ts +3 -0
  45. package/dist/notify/index.js +8 -0
  46. package/dist/notify/index.js.map +1 -0
  47. package/dist/notify/local.d.ts +2 -0
  48. package/dist/notify/local.js +34 -0
  49. package/dist/notify/local.js.map +1 -0
  50. package/dist/notify/ntfy.d.ts +10 -0
  51. package/dist/notify/ntfy.js +57 -0
  52. package/dist/notify/ntfy.js.map +1 -0
  53. package/dist/types.d.ts +65 -0
  54. package/dist/types.js +2 -0
  55. package/dist/types.js.map +1 -0
  56. package/dist/utils/context.d.ts +92 -0
  57. package/dist/utils/context.js +198 -0
  58. package/dist/utils/context.js.map +1 -0
  59. package/dist/utils/logger.d.ts +5 -0
  60. package/dist/utils/logger.js +12 -0
  61. package/dist/utils/logger.js.map +1 -0
  62. package/dist/utils/mask.d.ts +1 -0
  63. package/dist/utils/mask.js +10 -0
  64. package/dist/utils/mask.js.map +1 -0
  65. package/dist/utils/paths.d.ts +16 -0
  66. package/dist/utils/paths.js +93 -0
  67. package/dist/utils/paths.js.map +1 -0
  68. package/dist/utils/shell.d.ts +1 -0
  69. package/dist/utils/shell.js +21 -0
  70. package/dist/utils/shell.js.map +1 -0
  71. package/dist/utils/topic.d.ts +2 -0
  72. package/dist/utils/topic.js +20 -0
  73. package/dist/utils/topic.js.map +1 -0
  74. package/package.json +57 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ntfy.js","sourceRoot":"","sources":["../../src/notify/ntfy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import type { AgentBellConfig } from './config.js';
2
+ export type AgentTool = 'claude-code' | 'codex' | 'vscode-agent' | 'custom' | string;
3
+ export type AgentEvent = 'stop' | 'notification' | 'error' | 'permission' | 'custom' | string;
4
+ export type NotificationPriority = 'min' | 'low' | 'default' | 'high' | 'urgent' | string;
5
+ export interface NotificationInput {
6
+ tool: AgentTool;
7
+ event: AgentEvent;
8
+ title: string;
9
+ message: string;
10
+ priority?: NotificationPriority;
11
+ tags?: string[];
12
+ config: AgentBellConfig;
13
+ }
14
+ export interface NotificationProvider {
15
+ send(input: NotificationInput): Promise<void>;
16
+ }
17
+ export interface SendOptions {
18
+ tool?: string;
19
+ event?: string;
20
+ title?: string;
21
+ message?: string;
22
+ priority?: string;
23
+ tags?: string;
24
+ config?: string;
25
+ project?: string;
26
+ task?: string;
27
+ cwd?: string;
28
+ branch?: string;
29
+ templateTitle?: string;
30
+ templateMessage?: string;
31
+ }
32
+ export interface HookInstallResult {
33
+ target: string;
34
+ configPath: string;
35
+ snippetPath?: string;
36
+ backedUpTo?: string;
37
+ extraFiles?: Array<{
38
+ path: string;
39
+ label: string;
40
+ backedUpTo?: string;
41
+ }>;
42
+ mode: 'written' | 'merged' | 'snippet-only';
43
+ notes: string[];
44
+ manualVerification?: string[];
45
+ }
46
+ export interface HookPreviewResult {
47
+ target: string;
48
+ configPath: string;
49
+ snippetPath?: string;
50
+ configExists: boolean;
51
+ mode: 'written' | 'merged' | 'snippet-only';
52
+ template: Record<string, unknown>;
53
+ snippet?: Record<string, unknown>;
54
+ extraFiles?: Array<{
55
+ path: string;
56
+ label: string;
57
+ content: string;
58
+ exists: boolean;
59
+ wouldBackup: boolean;
60
+ }>;
61
+ mergePreview: unknown;
62
+ wouldBackup: boolean;
63
+ notes: string[];
64
+ manualVerification: string[];
65
+ }
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,92 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { z } from 'zod';
3
+ import type { AgentBellConfig } from '../config.js';
4
+ declare const execFileAsync: typeof execFile.__promisify__;
5
+ export declare const notificationTemplateSchema: z.ZodDefault<z.ZodObject<{
6
+ titleTemplate: z.ZodOptional<z.ZodString>;
7
+ messageTemplate: z.ZodOptional<z.ZodString>;
8
+ }, "strip", z.ZodTypeAny, {
9
+ titleTemplate?: string | undefined;
10
+ messageTemplate?: string | undefined;
11
+ }, {
12
+ titleTemplate?: string | undefined;
13
+ messageTemplate?: string | undefined;
14
+ }>>;
15
+ export declare const projectConfigSchema: z.ZodDefault<z.ZodObject<{
16
+ projectName: z.ZodOptional<z.ZodString>;
17
+ defaultTaskName: z.ZodOptional<z.ZodString>;
18
+ notification: z.ZodOptional<z.ZodDefault<z.ZodObject<{
19
+ titleTemplate: z.ZodOptional<z.ZodString>;
20
+ messageTemplate: z.ZodOptional<z.ZodString>;
21
+ }, "strip", z.ZodTypeAny, {
22
+ titleTemplate?: string | undefined;
23
+ messageTemplate?: string | undefined;
24
+ }, {
25
+ titleTemplate?: string | undefined;
26
+ messageTemplate?: string | undefined;
27
+ }>>>;
28
+ }, "strip", z.ZodTypeAny, {
29
+ notification?: {
30
+ titleTemplate?: string | undefined;
31
+ messageTemplate?: string | undefined;
32
+ } | undefined;
33
+ projectName?: string | undefined;
34
+ defaultTaskName?: string | undefined;
35
+ }, {
36
+ notification?: {
37
+ titleTemplate?: string | undefined;
38
+ messageTemplate?: string | undefined;
39
+ } | undefined;
40
+ projectName?: string | undefined;
41
+ defaultTaskName?: string | undefined;
42
+ }>>;
43
+ export type NotificationTemplateConfig = z.infer<typeof notificationTemplateSchema>;
44
+ export type ProjectConfig = z.infer<typeof projectConfigSchema>;
45
+ export interface ProjectConfigLoadResult {
46
+ config: ProjectConfig;
47
+ path: string;
48
+ exists: boolean;
49
+ warnings: string[];
50
+ }
51
+ export interface NotificationContextOptions {
52
+ config: AgentBellConfig;
53
+ tool?: string;
54
+ event?: string;
55
+ cwd?: string;
56
+ project?: string;
57
+ task?: string;
58
+ branch?: string;
59
+ titleTemplate?: string;
60
+ messageTemplate?: string;
61
+ now?: Date;
62
+ }
63
+ export interface NotificationContextResult {
64
+ context: Record<string, string | undefined>;
65
+ projectConfig: ProjectConfigLoadResult;
66
+ warnings: string[];
67
+ }
68
+ export interface RenderedNotification {
69
+ title: string;
70
+ message: string;
71
+ context: Record<string, string | undefined>;
72
+ warnings: string[];
73
+ }
74
+ export declare function renderTemplate(template: string, context: Record<string, string | undefined>): string;
75
+ export declare function toolDisplayName(toolRaw: string | undefined): string;
76
+ export declare function eventDisplayLabel(eventRaw: string | undefined): string;
77
+ export declare function eventLabelSuffix(eventRaw: string | undefined): string;
78
+ export declare function formatLocalTimestamp(date?: Date): string;
79
+ export declare function loadProjectConfig(cwd?: string): Promise<ProjectConfigLoadResult>;
80
+ export declare function getProjectName(cwd?: string, projectConfig?: ProjectConfig): Promise<string>;
81
+ export declare function getGitBranch(cwd: string, runner?: typeof execFileAsync): Promise<string | undefined>;
82
+ export declare function defaultTitleTemplate(context: Record<string, string | undefined>): string;
83
+ export declare const defaultMessageTemplate = "\u9879\u76EE\uFF1A{{project}}\n\u8DEF\u5F84\uFF1A{{cwd}}\n\u5206\u652F\uFF1A{{branch}}\n\u4E8B\u4EF6\uFF1A{{event}}\n\u65F6\u95F4\uFF1A{{timestamp}}";
84
+ export declare const defaultTestTitleTemplate = "{{machine}} \u00B7 AgentBell \u6D4B\u8BD5";
85
+ export declare const defaultTestMessageTemplate = "\u5982\u679C\u4F60\u770B\u5230\u4E86\u8FD9\u6761\u901A\u77E5\uFF0C\u8BF4\u660E AgentBell \u5DF2\u7ECF\u914D\u7F6E\u6210\u529F\u3002\n\u673A\u5668\uFF1A{{machine}}\n\u9879\u76EE\uFF1A{{project}}\n\u8DEF\u5F84\uFF1A{{cwd}}\n\u65F6\u95F4\uFF1A{{timestamp}}";
86
+ export declare function buildNotificationContext(options: NotificationContextOptions): Promise<NotificationContextResult>;
87
+ export declare function renderNotification(contextResult: NotificationContextResult, config: AgentBellConfig, overrides?: {
88
+ titleTemplate?: string;
89
+ messageTemplate?: string;
90
+ testMode?: boolean;
91
+ }): RenderedNotification;
92
+ export {};
@@ -0,0 +1,198 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { readFile } from 'node:fs/promises';
3
+ import os from 'node:os';
4
+ import path from 'node:path';
5
+ import { promisify } from 'node:util';
6
+ import { z } from 'zod';
7
+ const execFileAsync = promisify(execFile);
8
+ export const notificationTemplateSchema = z
9
+ .object({
10
+ titleTemplate: z.string().optional(),
11
+ messageTemplate: z.string().optional()
12
+ })
13
+ .default({});
14
+ export const projectConfigSchema = z
15
+ .object({
16
+ projectName: z.string().trim().min(1).optional(),
17
+ defaultTaskName: z.string().trim().min(1).optional(),
18
+ notification: notificationTemplateSchema.optional()
19
+ })
20
+ .default({});
21
+ function clean(value) {
22
+ if (typeof value !== 'string') {
23
+ return undefined;
24
+ }
25
+ const trimmed = value.trim();
26
+ return trimmed || undefined;
27
+ }
28
+ function fallback(value, fallbackValue) {
29
+ return value && value.trim() ? value : fallbackValue;
30
+ }
31
+ export function renderTemplate(template, context) {
32
+ return template.replace(/{{\s*([A-Za-z0-9_]+)\s*}}/g, (_match, key) => context[key] ?? '');
33
+ }
34
+ export function toolDisplayName(toolRaw) {
35
+ const tool = toolRaw || 'custom';
36
+ const known = {
37
+ codex: 'Codex',
38
+ 'claude-code': 'Claude Code',
39
+ 'vscode-agent': 'Copilot Agent',
40
+ custom: 'Custom'
41
+ };
42
+ if (known[tool]) {
43
+ return known[tool];
44
+ }
45
+ return tool
46
+ .split(/[-_\s]+/)
47
+ .filter(Boolean)
48
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
49
+ .join(' ') || tool;
50
+ }
51
+ export function eventDisplayLabel(eventRaw) {
52
+ const event = eventRaw || 'custom';
53
+ const labels = {
54
+ stop: '\u4efb\u52a1\u7ed3\u675f',
55
+ notification: '\u9700\u8981\u5904\u7406',
56
+ permission: '\u9700\u8981\u6743\u9650',
57
+ error: '\u51fa\u9519',
58
+ test: '\u6d4b\u8bd5',
59
+ custom: '\u81ea\u5b9a\u4e49\u4e8b\u4ef6'
60
+ };
61
+ return labels[event] ?? event;
62
+ }
63
+ export function eventLabelSuffix(eventRaw) {
64
+ const event = eventRaw || 'custom';
65
+ const suffixes = {
66
+ stop: '\u7ed3\u675f',
67
+ notification: '\u9700\u8981\u5904\u7406',
68
+ permission: '\u9700\u8981\u6743\u9650',
69
+ error: '\u51fa\u9519',
70
+ test: '\u6d4b\u8bd5',
71
+ custom: '\u5b8c\u6210'
72
+ };
73
+ return suffixes[event] ?? event;
74
+ }
75
+ export function formatLocalTimestamp(date = new Date()) {
76
+ const pad = (value) => String(value).padStart(2, '0');
77
+ return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ${pad(date.getHours())}:${pad(date.getMinutes())}`;
78
+ }
79
+ export async function loadProjectConfig(cwd = process.cwd()) {
80
+ const filePath = path.join(cwd, '.agentbell.json');
81
+ const warnings = [];
82
+ try {
83
+ const text = await readFile(filePath, 'utf8');
84
+ const parsed = JSON.parse(text);
85
+ return {
86
+ config: projectConfigSchema.parse(parsed),
87
+ path: filePath,
88
+ exists: true,
89
+ warnings
90
+ };
91
+ }
92
+ catch (error) {
93
+ const nodeError = error;
94
+ if (nodeError.code === 'ENOENT') {
95
+ return {
96
+ config: {},
97
+ path: filePath,
98
+ exists: false,
99
+ warnings
100
+ };
101
+ }
102
+ warnings.push(`Could not read .agentbell.json: ${error.message}`);
103
+ return {
104
+ config: {},
105
+ path: filePath,
106
+ exists: true,
107
+ warnings
108
+ };
109
+ }
110
+ }
111
+ async function packageName(cwd) {
112
+ try {
113
+ const text = await readFile(path.join(cwd, 'package.json'), 'utf8');
114
+ const parsed = JSON.parse(text);
115
+ return clean(parsed.name);
116
+ }
117
+ catch {
118
+ return undefined;
119
+ }
120
+ }
121
+ export async function getProjectName(cwd = process.cwd(), projectConfig) {
122
+ const configured = clean(projectConfig?.projectName);
123
+ if (configured) {
124
+ return configured;
125
+ }
126
+ return (await packageName(cwd)) ?? path.basename(path.resolve(cwd));
127
+ }
128
+ export async function getGitBranch(cwd, runner = execFileAsync) {
129
+ try {
130
+ const { stdout } = await runner('git', ['-C', cwd, 'branch', '--show-current'], {
131
+ timeout: 3000,
132
+ windowsHide: true
133
+ });
134
+ return clean(stdout);
135
+ }
136
+ catch {
137
+ return undefined;
138
+ }
139
+ }
140
+ export function defaultTitleTemplate(context) {
141
+ return context.task
142
+ ? '{{machine}} \u00b7 {{tool}} {{task}}{{eventLabelSuffix}}'
143
+ : '{{machine}} \u00b7 {{tool}} {{eventLabel}}';
144
+ }
145
+ export const defaultMessageTemplate = '\u9879\u76ee\uff1a{{project}}\n\u8def\u5f84\uff1a{{cwd}}\n\u5206\u652f\uff1a{{branch}}\n\u4e8b\u4ef6\uff1a{{event}}\n\u65f6\u95f4\uff1a{{timestamp}}';
146
+ export const defaultTestTitleTemplate = '{{machine}} \u00b7 AgentBell \u6d4b\u8bd5';
147
+ export const defaultTestMessageTemplate = '\u5982\u679c\u4f60\u770b\u5230\u4e86\u8fd9\u6761\u901a\u77e5\uff0c\u8bf4\u660e AgentBell \u5df2\u7ecf\u914d\u7f6e\u6210\u529f\u3002\n\u673a\u5668\uff1a{{machine}}\n\u9879\u76ee\uff1a{{project}}\n\u8def\u5f84\uff1a{{cwd}}\n\u65f6\u95f4\uff1a{{timestamp}}';
148
+ export async function buildNotificationContext(options) {
149
+ const cwd = path.resolve(options.cwd ?? process.cwd());
150
+ const projectConfig = await loadProjectConfig(cwd);
151
+ const hostname = os.hostname();
152
+ const toolRaw = fallback(options.tool, 'custom');
153
+ const event = fallback(options.event, 'custom');
154
+ const task = clean(options.task) ?? clean(projectConfig.config.defaultTaskName) ?? '\u4efb\u52a1';
155
+ const now = options.now ?? new Date();
156
+ const branch = clean(options.branch) ?? (await getGitBranch(cwd));
157
+ const project = clean(options.project) ?? (await getProjectName(cwd, projectConfig.config));
158
+ const machine = clean(options.config.profile.name) ?? hostname;
159
+ return {
160
+ projectConfig,
161
+ warnings: projectConfig.warnings,
162
+ context: {
163
+ machine,
164
+ hostname,
165
+ tool: toolDisplayName(toolRaw),
166
+ toolRaw,
167
+ event,
168
+ eventLabel: eventDisplayLabel(event),
169
+ eventLabelSuffix: eventLabelSuffix(event),
170
+ task,
171
+ project,
172
+ cwd,
173
+ branch: branch ?? 'unknown',
174
+ timestamp: formatLocalTimestamp(now),
175
+ isoTimestamp: now.toISOString(),
176
+ duration: 'unknown'
177
+ }
178
+ };
179
+ }
180
+ export function renderNotification(contextResult, config, overrides = {}) {
181
+ const projectTemplates = contextResult.projectConfig.config.notification ?? {};
182
+ const globalTemplates = config.notification ?? {};
183
+ const titleTemplate = overrides.titleTemplate ??
184
+ projectTemplates.titleTemplate ??
185
+ globalTemplates.titleTemplate ??
186
+ (overrides.testMode ? defaultTestTitleTemplate : defaultTitleTemplate(contextResult.context));
187
+ const messageTemplate = overrides.messageTemplate ??
188
+ projectTemplates.messageTemplate ??
189
+ globalTemplates.messageTemplate ??
190
+ (overrides.testMode ? defaultTestMessageTemplate : defaultMessageTemplate);
191
+ return {
192
+ title: renderTemplate(titleTemplate, contextResult.context),
193
+ message: renderTemplate(messageTemplate, contextResult.context),
194
+ context: contextResult.context,
195
+ warnings: contextResult.warnings
196
+ };
197
+ }
198
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/utils/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare const logger: {
2
+ info(message: string): void;
3
+ warn(message: string): void;
4
+ error(message: string): void;
5
+ };
@@ -0,0 +1,12 @@
1
+ export const logger = {
2
+ info(message) {
3
+ console.log(message);
4
+ },
5
+ warn(message) {
6
+ console.warn(`Warning: ${message}`);
7
+ },
8
+ error(message) {
9
+ console.error(`Error: ${message}`);
10
+ }
11
+ };
12
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IACD,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,IAAI,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,KAAK,CAAC,OAAe;QACnB,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;IACrC,CAAC;CACF,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function maskSecret(value: string | undefined, visible?: number): string;
@@ -0,0 +1,10 @@
1
+ export function maskSecret(value, visible = 4) {
2
+ if (!value) {
3
+ return '<empty>';
4
+ }
5
+ if (value.length <= visible * 2) {
6
+ return `${value.slice(0, 1)}***${value.slice(-1)}`;
7
+ }
8
+ return `${value.slice(0, visible)}...${value.slice(-visible)}`;
9
+ }
10
+ //# sourceMappingURL=mask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mask.js","sourceRoot":"","sources":["../../src/utils/mask.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CAAC,KAAyB,EAAE,OAAO,GAAG,CAAC;IAC/D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChC,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACrD,CAAC;IAED,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;AACjE,CAAC"}
@@ -0,0 +1,16 @@
1
+ export declare function projectRoot(): string;
2
+ export declare function expandHome(input: string): string;
3
+ export declare function agentBellDir(): string;
4
+ export declare function defaultConfigPath(): string;
5
+ export declare function snippetsDir(): string;
6
+ export declare function hookWrappersDir(): string;
7
+ export declare function codexStopWrapperPath(): string;
8
+ export declare function claudeStopWrapperPath(): string;
9
+ export declare function claudeNotificationWrapperPath(): string;
10
+ export declare function claudeSettingsPath(): string;
11
+ export declare function codexHooksPath(): string;
12
+ export declare function vscodeAgentHookPath(cwd?: string): string;
13
+ export declare function copilotStopWrapperPath(): string;
14
+ export declare function currentCliInvocation(): string;
15
+ export declare function currentCliScriptPath(): string;
16
+ export declare function quoteArg(value: string): string;
@@ -0,0 +1,93 @@
1
+ import os from 'node:os';
2
+ import path from 'node:path';
3
+ import { realpathSync } from 'node:fs';
4
+ function homeDir() {
5
+ return process.env.AGENTBELL_TEST_HOME || os.homedir();
6
+ }
7
+ export function projectRoot() {
8
+ if (process.env.AGENTBELL_TEST_PROJECT_ROOT) {
9
+ return process.env.AGENTBELL_TEST_PROJECT_ROOT;
10
+ }
11
+ try {
12
+ return realpathSync.native(process.cwd());
13
+ }
14
+ catch {
15
+ return process.cwd();
16
+ }
17
+ }
18
+ export function expandHome(input) {
19
+ if (input === '~') {
20
+ return homeDir();
21
+ }
22
+ if (input.startsWith(`~${path.sep}`) || input.startsWith('~/')) {
23
+ return path.join(homeDir(), input.slice(2));
24
+ }
25
+ return input;
26
+ }
27
+ export function agentBellDir() {
28
+ return path.join(homeDir(), '.agentbell');
29
+ }
30
+ export function defaultConfigPath() {
31
+ return path.join(agentBellDir(), 'config.json');
32
+ }
33
+ export function snippetsDir() {
34
+ return path.join(agentBellDir(), 'snippets');
35
+ }
36
+ export function hookWrappersDir() {
37
+ return path.join(agentBellDir(), 'hooks');
38
+ }
39
+ export function codexStopWrapperPath() {
40
+ return path.join(hookWrappersDir(), process.platform === 'win32' ? 'codex-stop.cmd' : 'codex-stop.sh');
41
+ }
42
+ export function claudeStopWrapperPath() {
43
+ if (process.platform === 'win32') {
44
+ return path.join(projectRoot(), '.agentbell-hooks', 'claude-stop.sh');
45
+ }
46
+ return path.join(hookWrappersDir(), 'claude-stop.sh');
47
+ }
48
+ export function claudeNotificationWrapperPath() {
49
+ if (process.platform === 'win32') {
50
+ return path.join(projectRoot(), '.agentbell-hooks', 'claude-notification.sh');
51
+ }
52
+ return path.join(hookWrappersDir(), 'claude-notification.sh');
53
+ }
54
+ export function claudeSettingsPath() {
55
+ return path.join(homeDir(), '.claude', 'settings.json');
56
+ }
57
+ export function codexHooksPath() {
58
+ return path.join(homeDir(), '.codex', 'hooks.json');
59
+ }
60
+ export function vscodeAgentHookPath(cwd = process.cwd()) {
61
+ return path.join(cwd, '.github', 'hooks', 'agentbell.json');
62
+ }
63
+ export function copilotStopWrapperPath() {
64
+ return path.join(projectRoot(), '.agentbell-hooks', process.platform === 'win32' ? 'copilot-stop.cmd' : 'copilot-stop.sh');
65
+ }
66
+ export function currentCliInvocation() {
67
+ const script = process.argv[1];
68
+ // Installed global binaries should use the stable command name. During local
69
+ // development we expose the exact Node invocation so hook snippets still work.
70
+ if (script && script.includes(`${path.sep}dist${path.sep}cli.js`)) {
71
+ return `${quoteArg(process.execPath)} ${quoteArg(script)}`;
72
+ }
73
+ return 'agentbell';
74
+ }
75
+ export function currentCliScriptPath() {
76
+ const script = process.argv[1];
77
+ if (!script) {
78
+ return 'agentbell';
79
+ }
80
+ try {
81
+ return realpathSync.native(script);
82
+ }
83
+ catch {
84
+ return script;
85
+ }
86
+ }
87
+ export function quoteArg(value) {
88
+ if (/^[A-Za-z0-9_./:=-]+$/.test(value)) {
89
+ return value;
90
+ }
91
+ return `"${value.replaceAll('"', '\\"')}"`;
92
+ }
93
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function commandExists(command: string): Promise<boolean>;
@@ -0,0 +1,21 @@
1
+ import { access } from 'node:fs/promises';
2
+ import { constants } from 'node:fs';
3
+ import { delimiter, join } from 'node:path';
4
+ export async function commandExists(command) {
5
+ const candidates = (process.env.PATH ?? '').split(delimiter).filter(Boolean);
6
+ const extensions = process.platform === 'win32' ? (process.env.PATHEXT ?? '.EXE;.CMD;.BAT').split(';') : [''];
7
+ for (const directory of candidates) {
8
+ for (const extension of extensions) {
9
+ const fullPath = join(directory, process.platform === 'win32' ? `${command}${extension}` : command);
10
+ try {
11
+ await access(fullPath, constants.X_OK);
12
+ return true;
13
+ }
14
+ catch {
15
+ // Keep searching PATH.
16
+ }
17
+ }
18
+ }
19
+ return false;
20
+ }
21
+ //# sourceMappingURL=shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/utils/shell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe;IACjD,MAAM,UAAU,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7E,MAAM,UAAU,GACd,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,gBAAgB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAE7F,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACpG,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;gBACvC,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,MAAM,CAAC;gBACP,uBAAuB;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function generateTopic(prefix?: string): string;
2
+ export declare function isWeakTopic(topic: string): boolean;
@@ -0,0 +1,20 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ const alphabet = 'abcdefghijklmnopqrstuvwxyz0123456789';
3
+ const weakTopics = new Set(['test', 'hello', 'agentbell', 'default', 'topic', 'ntfy']);
4
+ export function generateTopic(prefix = 'agentbell') {
5
+ const randomLength = 22;
6
+ const bytes = randomBytes(randomLength);
7
+ let random = '';
8
+ for (const byte of bytes) {
9
+ random += alphabet[byte % alphabet.length];
10
+ }
11
+ return `${prefix}-${random}`;
12
+ }
13
+ export function isWeakTopic(topic) {
14
+ const normalized = topic.trim().toLowerCase();
15
+ if (normalized.length < 12) {
16
+ return true;
17
+ }
18
+ return weakTopics.has(normalized);
19
+ }
20
+ //# sourceMappingURL=topic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topic.js","sourceRoot":"","sources":["../../src/utils/topic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,QAAQ,GAAG,sCAAsC,CAAC;AACxD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAEvF,MAAM,UAAU,aAAa,CAAC,MAAM,GAAG,WAAW;IAChD,MAAM,YAAY,GAAG,EAAE,CAAC;IACxB,MAAM,KAAK,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;IACxC,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,QAAQ,CAAC,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,GAAG,MAAM,IAAI,MAAM,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAE9C,IAAI,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AACpC,CAAC"}