promptkaizen-agent 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 (70) hide show
  1. package/README.md +131 -0
  2. package/dist/batcher.d.ts +25 -0
  3. package/dist/batcher.d.ts.map +1 -0
  4. package/dist/batcher.js +117 -0
  5. package/dist/batcher.js.map +1 -0
  6. package/dist/cli/init.d.ts +12 -0
  7. package/dist/cli/init.d.ts.map +1 -0
  8. package/dist/cli/init.js +138 -0
  9. package/dist/cli/init.js.map +1 -0
  10. package/dist/cli/install-launchd.d.ts +17 -0
  11. package/dist/cli/install-launchd.d.ts.map +1 -0
  12. package/dist/cli/install-launchd.js +128 -0
  13. package/dist/cli/install-launchd.js.map +1 -0
  14. package/dist/cli/start.d.ts +8 -0
  15. package/dist/cli/start.d.ts.map +1 -0
  16. package/dist/cli/start.js +170 -0
  17. package/dist/cli/start.js.map +1 -0
  18. package/dist/cli/status.d.ts +12 -0
  19. package/dist/cli/status.d.ts.map +1 -0
  20. package/dist/cli/status.js +172 -0
  21. package/dist/cli/status.js.map +1 -0
  22. package/dist/cli/uninstall-launchd.d.ts +8 -0
  23. package/dist/cli/uninstall-launchd.d.ts.map +1 -0
  24. package/dist/cli/uninstall-launchd.js +55 -0
  25. package/dist/cli/uninstall-launchd.js.map +1 -0
  26. package/dist/config.d.ts +114 -0
  27. package/dist/config.d.ts.map +1 -0
  28. package/dist/config.js +78 -0
  29. package/dist/config.js.map +1 -0
  30. package/dist/index.d.ts +3 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +71 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/logger.d.ts +7 -0
  35. package/dist/logger.d.ts.map +1 -0
  36. package/dist/logger.js +33 -0
  37. package/dist/logger.js.map +1 -0
  38. package/dist/offset-store.d.ts +22 -0
  39. package/dist/offset-store.d.ts.map +1 -0
  40. package/dist/offset-store.js +76 -0
  41. package/dist/offset-store.js.map +1 -0
  42. package/dist/parser.d.ts +20 -0
  43. package/dist/parser.d.ts.map +1 -0
  44. package/dist/parser.js +118 -0
  45. package/dist/parser.js.map +1 -0
  46. package/dist/pii-masker.d.ts +19 -0
  47. package/dist/pii-masker.d.ts.map +1 -0
  48. package/dist/pii-masker.js +136 -0
  49. package/dist/pii-masker.js.map +1 -0
  50. package/dist/sender.d.ts +21 -0
  51. package/dist/sender.d.ts.map +1 -0
  52. package/dist/sender.js +69 -0
  53. package/dist/sender.js.map +1 -0
  54. package/dist/source.d.ts +3 -0
  55. package/dist/source.d.ts.map +1 -0
  56. package/dist/source.js +31 -0
  57. package/dist/source.js.map +1 -0
  58. package/dist/types.d.ts +20 -0
  59. package/dist/types.d.ts.map +1 -0
  60. package/dist/types.js +3 -0
  61. package/dist/types.js.map +1 -0
  62. package/dist/version.d.ts +2 -0
  63. package/dist/version.d.ts.map +1 -0
  64. package/dist/version.js +6 -0
  65. package/dist/version.js.map +1 -0
  66. package/dist/watcher.d.ts +22 -0
  67. package/dist/watcher.d.ts.map +1 -0
  68. package/dist/watcher.js +63 -0
  69. package/dist/watcher.js.map +1 -0
  70. package/package.json +39 -0
@@ -0,0 +1,170 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runStart = runStart;
7
+ const fs_1 = require("fs");
8
+ const readline_1 = __importDefault(require("readline"));
9
+ const batcher_1 = require("../batcher");
10
+ const config_1 = require("../config");
11
+ const logger_1 = require("../logger");
12
+ const offset_store_1 = require("../offset-store");
13
+ const parser_1 = require("../parser");
14
+ const pii_masker_1 = require("../pii-masker");
15
+ const sender_1 = require("../sender");
16
+ const version_1 = require("../version");
17
+ const watcher_1 = require("../watcher");
18
+ const HEARTBEAT_INTERVAL_MS = 5 * 60 * 1000; // 5 分
19
+ /**
20
+ * `promptkaizen-agent start [--config <path>]`
21
+ *
22
+ * agent 本体を foreground で起動。launchd 配下では plist の RunAtLoad で
23
+ * これが呼ばれる。手動デバッグ時は素でターミナルから叩く。
24
+ */
25
+ async function runStart(argv) {
26
+ const configPathArg = readArg(argv, '--config');
27
+ const config = await (0, config_1.loadConfig)(configPathArg);
28
+ process.env.PROMPTKAIZEN_AGENT_LOG_LEVEL ??= config.telemetry.level;
29
+ const offsetStore = new offset_store_1.OffsetStore();
30
+ await offsetStore.load();
31
+ const parser = new parser_1.JsonlParser(offsetStore);
32
+ const masker = new pii_masker_1.PiiMasker(config.pii);
33
+ const sender = new sender_1.Sender({
34
+ apiEndpoint: config.apiEndpoint,
35
+ apiKey: config.apiKey,
36
+ agentVersion: version_1.AGENT_VERSION,
37
+ });
38
+ const batcher = new batcher_1.Batcher(config.batch, sender, async (consumed, filepath) => {
39
+ offsetStore.advance(filepath, consumed);
40
+ });
41
+ const watcher = new watcher_1.LogWatcher({
42
+ watchPaths: config.watchPaths,
43
+ exclude: config.exclude,
44
+ });
45
+ // 起動時の初期スキャン完了判定。初期スキャン中の add イベントは「既存ファイル」、
46
+ // ready 後の add イベントは「新規作成ファイル」と区別する。
47
+ let initialScanDone = false;
48
+ let backlogSkipped = 0;
49
+ watcher.on('ready', () => {
50
+ initialScanDone = true;
51
+ if (config.agent.skipInitialBacklog && backlogSkipped > 0) {
52
+ logger_1.logger.info('Initial backlog skipped', {
53
+ files: backlogSkipped,
54
+ hint: 'set config.agent.skipInitialBacklog=false to send historical entries on first run',
55
+ });
56
+ }
57
+ });
58
+ watcher.on('fileChange', async ({ filepath, type }) => {
59
+ try {
60
+ // 既存ファイル (ready 前の add) を skipInitialBacklog=true 時に「読了扱い」
61
+ if (type === 'add' &&
62
+ !initialScanDone &&
63
+ config.agent.skipInitialBacklog &&
64
+ offsetStore.get(filepath) === 0) {
65
+ const lines = await countLines(filepath);
66
+ offsetStore.set(filepath, lines);
67
+ backlogSkipped++;
68
+ return;
69
+ }
70
+ const { entries, consumed } = await parser.parseDelta(filepath);
71
+ if (entries.length === 0 && consumed === 0)
72
+ return;
73
+ const masked = masker.maskAll(entries);
74
+ batcher.add(filepath, masked, consumed);
75
+ }
76
+ catch (e) {
77
+ logger_1.logger.error('fileChange handler error', {
78
+ filepath,
79
+ error: e.message,
80
+ });
81
+ }
82
+ });
83
+ watcher.on('error', (err) => {
84
+ logger_1.logger.error('watcher emitted error', { error: err.message });
85
+ });
86
+ watcher.start();
87
+ logger_1.logger.info('PromptKaizen Agent started', {
88
+ version: version_1.AGENT_VERSION,
89
+ apiEndpoint: config.apiEndpoint,
90
+ watchPaths: config.watchPaths,
91
+ skipInitialBacklog: config.agent.skipInitialBacklog,
92
+ });
93
+ // 5 分ごとに heartbeat (Claude Code を使っていない時間帯も生存報告)
94
+ const heartbeatTimer = startHeartbeat(config);
95
+ setupShutdown(batcher, offsetStore, watcher, heartbeatTimer);
96
+ }
97
+ /** receiveObservations と同じ apiKey/endpoint pattern で /agentHeartbeat を叩く */
98
+ function startHeartbeat(config) {
99
+ const heartbeatUrl = config.apiEndpoint.replace(/\/receiveObservations\/?$/, '/agentHeartbeat');
100
+ const sendBeat = async () => {
101
+ try {
102
+ const res = await fetch(heartbeatUrl, {
103
+ method: 'POST',
104
+ headers: {
105
+ 'Content-Type': 'application/json',
106
+ Authorization: `Bearer ${config.apiKey}`,
107
+ },
108
+ body: JSON.stringify({ agentVersion: version_1.AGENT_VERSION }),
109
+ });
110
+ if (!res.ok) {
111
+ logger_1.logger.warn('Heartbeat non-OK', { status: res.status });
112
+ }
113
+ }
114
+ catch (e) {
115
+ logger_1.logger.warn('Heartbeat failed', { error: e.message });
116
+ }
117
+ };
118
+ // 起動直後に 1 回送信
119
+ void sendBeat();
120
+ return setInterval(() => void sendBeat(), HEARTBEAT_INTERVAL_MS);
121
+ }
122
+ /**
123
+ * ファイルの行数 (末尾改行のみの空行は除外)。
124
+ * 巨大な Codex rollout (数百MB〜) でもメモリが破綻しないよう streaming で数える。
125
+ */
126
+ async function countLines(filepath) {
127
+ return new Promise((resolve) => {
128
+ let count = 0;
129
+ const stream = (0, fs_1.createReadStream)(filepath, { encoding: 'utf8' });
130
+ const rl = readline_1.default.createInterface({ input: stream, crlfDelay: Infinity });
131
+ rl.on('line', () => {
132
+ count++;
133
+ });
134
+ rl.on('close', () => resolve(count));
135
+ stream.on('error', () => {
136
+ rl.close();
137
+ resolve(0);
138
+ });
139
+ });
140
+ }
141
+ function readArg(argv, name) {
142
+ const idx = argv.indexOf(name);
143
+ if (idx >= 0 && idx + 1 < argv.length)
144
+ return argv[idx + 1];
145
+ return undefined;
146
+ }
147
+ function setupShutdown(batcher, offsetStore, watcher, heartbeatTimer) {
148
+ let shutting = false;
149
+ const shutdown = async (signal) => {
150
+ if (shutting)
151
+ return;
152
+ shutting = true;
153
+ logger_1.logger.info('Shutdown initiated', { signal });
154
+ try {
155
+ clearInterval(heartbeatTimer);
156
+ await batcher.flush();
157
+ await offsetStore.flush();
158
+ await watcher.stop();
159
+ logger_1.logger.info('Shutdown complete');
160
+ process.exit(0);
161
+ }
162
+ catch (e) {
163
+ logger_1.logger.error('Shutdown failed', { error: e.message });
164
+ process.exit(1);
165
+ }
166
+ };
167
+ process.on('SIGINT', () => void shutdown('SIGINT'));
168
+ process.on('SIGTERM', () => void shutdown('SIGTERM'));
169
+ }
170
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/cli/start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * `promptkaizen-agent status`
3
+ *
4
+ * 1 画面で稼働状況を診断:
5
+ * - config の有無
6
+ * - launchd plist の有無
7
+ * - 実プロセス (pgrep)
8
+ * - offset ファイルの mtime / 件数
9
+ * - apiEndpoint への簡易疎通 (HEAD) — failure は warn 扱い
10
+ */
11
+ export declare function runStatus(_argv: string[]): Promise<void>;
12
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/cli/status.ts"],"names":[],"mappings":"AASA;;;;;;;;;GASG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsF9D"}
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runStatus = runStatus;
7
+ const child_process_1 = require("child_process");
8
+ const promises_1 = __importDefault(require("fs/promises"));
9
+ const os_1 = __importDefault(require("os"));
10
+ const path_1 = __importDefault(require("path"));
11
+ const config_1 = require("../config");
12
+ const install_launchd_1 = require("./install-launchd");
13
+ const OFFSET_PATH = path_1.default.join(os_1.default.homedir(), '.promptkaizen', 'offsets.json');
14
+ /**
15
+ * `promptkaizen-agent status`
16
+ *
17
+ * 1 画面で稼働状況を診断:
18
+ * - config の有無
19
+ * - launchd plist の有無
20
+ * - 実プロセス (pgrep)
21
+ * - offset ファイルの mtime / 件数
22
+ * - apiEndpoint への簡易疎通 (HEAD) — failure は warn 扱い
23
+ */
24
+ async function runStatus(_argv) {
25
+ const lines = [];
26
+ const push = (icon, label, value) => {
27
+ lines.push(`${icon} ${label.padEnd(22)} ${value}`);
28
+ };
29
+ // 1. config
30
+ let config = null;
31
+ try {
32
+ config = await (0, config_1.loadConfig)();
33
+ push('✅', 'config', 'loaded');
34
+ push(' ', ' endpoint', config.apiEndpoint);
35
+ push(' ', ' apiKey', `${config.apiKey.slice(0, 6)}…(${config.apiKey.length} chars)`);
36
+ push(' ', ' watchPaths', config.watchPaths.join(', '));
37
+ }
38
+ catch (e) {
39
+ push('❌', 'config', `not loaded: ${e.message}`);
40
+ }
41
+ // 1b. 観測対象ツールの検出 (Claude Code / OpenAI Codex CLI)
42
+ const claudeDir = path_1.default.join(os_1.default.homedir(), '.claude', 'projects');
43
+ const codexDir = path_1.default.join(os_1.default.homedir(), '.codex', 'sessions');
44
+ const watched = config?.watchPaths ?? [];
45
+ const claudeWatched = watched.some((p) => p.includes('.claude'));
46
+ const codexWatched = watched.some((p) => p.includes('.codex'));
47
+ if (await fileExists(claudeDir)) {
48
+ push(claudeWatched ? '✅' : '⚠️ ', 'Claude Code', claudeWatched ? 'detected & watched' : 'detected but NOT in watchPaths');
49
+ }
50
+ if (await fileExists(codexDir)) {
51
+ push(codexWatched ? '✅' : '⚠️ ', 'OpenAI Codex', codexWatched
52
+ ? 'detected & watched'
53
+ : 'detected — add "~/.codex/sessions/**/*.jsonl" to watchPaths (re-run init)');
54
+ }
55
+ // 2. launchd plist
56
+ if (process.platform === 'darwin') {
57
+ const plistOk = await fileExists((0, install_launchd_1.plistPath)());
58
+ push(plistOk ? '✅' : '⚠️ ', 'launchd plist', plistOk ? (0, install_launchd_1.plistPath)() : 'not installed (run install-launchd)');
59
+ }
60
+ else {
61
+ push(' ', 'launchd plist', '(skipped — not macOS)');
62
+ }
63
+ // 3. process + resource usage (Phase H 指標 spec section 9-3)
64
+ const procs = listAgentPids();
65
+ if (procs.length > 0) {
66
+ const usage = readProcessUsage(procs[0]);
67
+ const pidLabel = procs.length === 1 ? `PID ${procs[0]}` : `PIDs ${procs.join(', ')}`;
68
+ push('✅', 'process', `running (${pidLabel})`);
69
+ if (usage) {
70
+ const memOk = usage.rssMb <= 50;
71
+ const cpuOk = usage.cpuPct <= 5; // 計測スポット値なので 1% より緩めの 5% を quick check threshold に
72
+ push(memOk ? ' ' : '⚠️ ', ' memory', `${usage.rssMb.toFixed(1)} MB${memOk ? '' : ' (>50MB target)'}`);
73
+ push(cpuOk ? ' ' : '⚠️ ', ' cpu', `${usage.cpuPct.toFixed(1)} %${cpuOk ? '' : ' (>5% spike)'}`);
74
+ }
75
+ }
76
+ else {
77
+ push('⚠️ ', 'process', 'not running');
78
+ }
79
+ // 4. offsets
80
+ try {
81
+ const st = await promises_1.default.stat(OFFSET_PATH);
82
+ const raw = await promises_1.default.readFile(OFFSET_PATH, 'utf8');
83
+ const obj = JSON.parse(raw);
84
+ const fileCount = Object.keys(obj).length;
85
+ const totalLines = Object.values(obj).reduce((s, v) => s + v, 0);
86
+ push('✅', 'offsets', `${fileCount} files / ${totalLines.toLocaleString()} lines / saved ${formatAgo(st.mtimeMs)}`);
87
+ }
88
+ catch (e) {
89
+ const code = e.code;
90
+ if (code === 'ENOENT') {
91
+ push('⚠️ ', 'offsets', 'no offsets yet (agent never sent)');
92
+ }
93
+ else {
94
+ push('❌', 'offsets', `error: ${e.message}`);
95
+ }
96
+ }
97
+ // 5. endpoint reachability
98
+ if (config) {
99
+ const reach = await pingEndpoint(config.apiEndpoint);
100
+ push(reach.ok ? '✅' : '⚠️ ', 'endpoint', reach.message);
101
+ }
102
+ console.log('PromptKaizen Agent — status\n');
103
+ console.log(lines.join('\n'));
104
+ }
105
+ function listAgentPids() {
106
+ try {
107
+ const out = (0, child_process_1.execSync)('pgrep -f "agent/dist/index.js" 2>/dev/null || true', {
108
+ encoding: 'utf8',
109
+ }).trim();
110
+ if (!out)
111
+ return [];
112
+ return out
113
+ .split('\n')
114
+ .map((s) => parseInt(s, 10))
115
+ .filter((n) => !Number.isNaN(n));
116
+ }
117
+ catch {
118
+ return [];
119
+ }
120
+ }
121
+ /** ps -o rss=,%cpu= で指定 PID の resident memory (KB) と CPU% を取得 */
122
+ function readProcessUsage(pid) {
123
+ try {
124
+ const out = (0, child_process_1.execSync)(`ps -o rss=,%cpu= -p ${pid} 2>/dev/null`, { encoding: 'utf8' }).trim();
125
+ if (!out)
126
+ return null;
127
+ const parts = out.split(/\s+/).filter(Boolean);
128
+ if (parts.length < 2)
129
+ return null;
130
+ const rssKb = parseFloat(parts[0]);
131
+ const cpuPct = parseFloat(parts[1]);
132
+ if (Number.isNaN(rssKb) || Number.isNaN(cpuPct))
133
+ return null;
134
+ return { rssMb: rssKb / 1024, cpuPct };
135
+ }
136
+ catch {
137
+ return null;
138
+ }
139
+ }
140
+ async function fileExists(p) {
141
+ try {
142
+ await promises_1.default.access(p);
143
+ return true;
144
+ }
145
+ catch {
146
+ return false;
147
+ }
148
+ }
149
+ function formatAgo(epochMs) {
150
+ const sec = Math.floor((Date.now() - epochMs) / 1000);
151
+ if (sec < 60)
152
+ return `${sec}s ago`;
153
+ if (sec < 3600)
154
+ return `${Math.floor(sec / 60)}m ago`;
155
+ if (sec < 86400)
156
+ return `${Math.floor(sec / 3600)}h ago`;
157
+ return `${Math.floor(sec / 86400)}d ago`;
158
+ }
159
+ async function pingEndpoint(url) {
160
+ try {
161
+ // 認証なしの簡易疎通 (OPTIONS or HEAD)。401 でも reachable とみなす
162
+ const res = await fetch(url, { method: 'OPTIONS' });
163
+ if (res.status < 500) {
164
+ return { ok: true, message: `reachable (HTTP ${res.status})` };
165
+ }
166
+ return { ok: false, message: `HTTP ${res.status} (server error)` };
167
+ }
168
+ catch (e) {
169
+ return { ok: false, message: `unreachable: ${e.message}` };
170
+ }
171
+ }
172
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/cli/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `promptkaizen-agent uninstall-launchd`
3
+ *
4
+ * launchd 登録を解除して plist を削除。設定ファイル (~/.promptkaizen/agent.config.json) と
5
+ * オフセット (~/.promptkaizen/offsets.json) は残す。
6
+ */
7
+ export declare function runUninstallLaunchd(_argv: string[]): Promise<void>;
8
+ //# sourceMappingURL=uninstall-launchd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall-launchd.d.ts","sourceRoot":"","sources":["../../src/cli/uninstall-launchd.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmCxE"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runUninstallLaunchd = runUninstallLaunchd;
7
+ const child_process_1 = require("child_process");
8
+ const promises_1 = __importDefault(require("fs/promises"));
9
+ const install_launchd_1 = require("./install-launchd");
10
+ /**
11
+ * `promptkaizen-agent uninstall-launchd`
12
+ *
13
+ * launchd 登録を解除して plist を削除。設定ファイル (~/.promptkaizen/agent.config.json) と
14
+ * オフセット (~/.promptkaizen/offsets.json) は残す。
15
+ */
16
+ async function runUninstallLaunchd(_argv) {
17
+ if (process.platform !== 'darwin') {
18
+ console.error('uninstall-launchd is macOS only.');
19
+ process.exit(1);
20
+ }
21
+ const dst = (0, install_launchd_1.plistPath)();
22
+ let removed = false;
23
+ try {
24
+ (0, child_process_1.execSync)(`launchctl unload ${shellEscape(dst)}`, { stdio: 'ignore' });
25
+ console.log(`✅ launchctl unloaded ${install_launchd_1.LAUNCH_AGENT_LABEL}`);
26
+ }
27
+ catch {
28
+ console.log(`(launchctl unload skipped — already unloaded or never registered)`);
29
+ }
30
+ try {
31
+ await promises_1.default.unlink(dst);
32
+ console.log(`✅ Removed plist: ${dst}`);
33
+ removed = true;
34
+ }
35
+ catch (e) {
36
+ const code = e.code;
37
+ if (code === 'ENOENT') {
38
+ console.log(`(plist not present at ${dst})`);
39
+ }
40
+ else {
41
+ console.error(`Failed to remove plist: ${e.message}`);
42
+ process.exit(1);
43
+ }
44
+ }
45
+ if (!removed) {
46
+ console.log('Nothing to do.');
47
+ }
48
+ else {
49
+ console.log('\nConfig and offsets preserved under ~/.promptkaizen/.');
50
+ }
51
+ }
52
+ function shellEscape(s) {
53
+ return `'${s.replaceAll("'", "'\\''")}'`;
54
+ }
55
+ //# sourceMappingURL=uninstall-launchd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall-launchd.js","sourceRoot":"","sources":["../../src/cli/uninstall-launchd.ts"],"names":[],"mappings":";;;;;AAUA,kDAmCC;AA7CD,iDAAwC;AACxC,2DAA4B;AAC5B,uDAAiE;AAEjE;;;;;GAKG;AACI,KAAK,UAAU,mBAAmB,CAAC,KAAe;IACvD,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAA;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,GAAG,GAAG,IAAA,2BAAS,GAAE,CAAA;IACvB,IAAI,OAAO,GAAG,KAAK,CAAA;IAEnB,IAAI,CAAC;QACH,IAAA,wBAAQ,EAAC,oBAAoB,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;QACrE,OAAO,CAAC,GAAG,CAAC,wBAAwB,oCAAkB,EAAE,CAAC,CAAA;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAA;IAClF,CAAC;IAED,IAAI,CAAC;QACH,MAAM,kBAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACpB,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,EAAE,CAAC,CAAA;QACtC,OAAO,GAAG,IAAI,CAAA;IAChB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,GAAI,CAA2B,CAAC,IAAI,CAAA;QAC9C,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,yBAAyB,GAAG,GAAG,CAAC,CAAA;QAC9C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,2BAA4B,CAAW,CAAC,OAAO,EAAE,CAAC,CAAA;YAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;IAC/B,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAA;IACvE,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,CAAS;IAC5B,OAAO,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAA;AAC1C,CAAC"}
@@ -0,0 +1,114 @@
1
+ import { z } from 'zod';
2
+ export declare const AgentConfigSchema: z.ZodObject<{
3
+ apiEndpoint: z.ZodString;
4
+ apiKey: z.ZodString;
5
+ watchPaths: z.ZodArray<z.ZodString, "many">;
6
+ exclude: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
7
+ batch: z.ZodDefault<z.ZodObject<{
8
+ intervalMs: z.ZodDefault<z.ZodNumber>;
9
+ maxEntries: z.ZodDefault<z.ZodNumber>;
10
+ }, "strip", z.ZodTypeAny, {
11
+ intervalMs: number;
12
+ maxEntries: number;
13
+ }, {
14
+ intervalMs?: number | undefined;
15
+ maxEntries?: number | undefined;
16
+ }>>;
17
+ agent: z.ZodDefault<z.ZodObject<{
18
+ skipInitialBacklog: z.ZodDefault<z.ZodBoolean>;
19
+ }, "strip", z.ZodTypeAny, {
20
+ skipInitialBacklog: boolean;
21
+ }, {
22
+ skipInitialBacklog?: boolean | undefined;
23
+ }>>;
24
+ pii: z.ZodDefault<z.ZodObject<{
25
+ maskFilePaths: z.ZodDefault<z.ZodBoolean>;
26
+ maskApiKeys: z.ZodDefault<z.ZodBoolean>;
27
+ maskEmails: z.ZodDefault<z.ZodBoolean>;
28
+ customPatterns: z.ZodDefault<z.ZodArray<z.ZodObject<{
29
+ pattern: z.ZodString;
30
+ replacement: z.ZodString;
31
+ }, "strip", z.ZodTypeAny, {
32
+ pattern: string;
33
+ replacement: string;
34
+ }, {
35
+ pattern: string;
36
+ replacement: string;
37
+ }>, "many">>;
38
+ }, "strip", z.ZodTypeAny, {
39
+ maskFilePaths: boolean;
40
+ maskApiKeys: boolean;
41
+ maskEmails: boolean;
42
+ customPatterns: {
43
+ pattern: string;
44
+ replacement: string;
45
+ }[];
46
+ }, {
47
+ maskFilePaths?: boolean | undefined;
48
+ maskApiKeys?: boolean | undefined;
49
+ maskEmails?: boolean | undefined;
50
+ customPatterns?: {
51
+ pattern: string;
52
+ replacement: string;
53
+ }[] | undefined;
54
+ }>>;
55
+ telemetry: z.ZodDefault<z.ZodObject<{
56
+ level: z.ZodDefault<z.ZodEnum<["debug", "info", "warn", "error"]>>;
57
+ }, "strip", z.ZodTypeAny, {
58
+ level: "debug" | "info" | "warn" | "error";
59
+ }, {
60
+ level?: "debug" | "info" | "warn" | "error" | undefined;
61
+ }>>;
62
+ }, "strip", z.ZodTypeAny, {
63
+ apiEndpoint: string;
64
+ apiKey: string;
65
+ watchPaths: string[];
66
+ exclude: string[];
67
+ batch: {
68
+ intervalMs: number;
69
+ maxEntries: number;
70
+ };
71
+ agent: {
72
+ skipInitialBacklog: boolean;
73
+ };
74
+ pii: {
75
+ maskFilePaths: boolean;
76
+ maskApiKeys: boolean;
77
+ maskEmails: boolean;
78
+ customPatterns: {
79
+ pattern: string;
80
+ replacement: string;
81
+ }[];
82
+ };
83
+ telemetry: {
84
+ level: "debug" | "info" | "warn" | "error";
85
+ };
86
+ }, {
87
+ apiEndpoint: string;
88
+ apiKey: string;
89
+ watchPaths: string[];
90
+ exclude?: string[] | undefined;
91
+ batch?: {
92
+ intervalMs?: number | undefined;
93
+ maxEntries?: number | undefined;
94
+ } | undefined;
95
+ agent?: {
96
+ skipInitialBacklog?: boolean | undefined;
97
+ } | undefined;
98
+ pii?: {
99
+ maskFilePaths?: boolean | undefined;
100
+ maskApiKeys?: boolean | undefined;
101
+ maskEmails?: boolean | undefined;
102
+ customPatterns?: {
103
+ pattern: string;
104
+ replacement: string;
105
+ }[] | undefined;
106
+ } | undefined;
107
+ telemetry?: {
108
+ level?: "debug" | "info" | "warn" | "error" | undefined;
109
+ } | undefined;
110
+ }>;
111
+ export type AgentConfig = z.infer<typeof AgentConfigSchema>;
112
+ export declare function expandHome(p: string): string;
113
+ export declare function loadConfig(explicitPath?: string): Promise<AgentConfig>;
114
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiC5B,CAAA;AAEF,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAI3D,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAG5C;AAED,wBAAsB,UAAU,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAwB5E"}
package/dist/config.js ADDED
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AgentConfigSchema = void 0;
7
+ exports.expandHome = expandHome;
8
+ exports.loadConfig = loadConfig;
9
+ const promises_1 = __importDefault(require("fs/promises"));
10
+ const os_1 = __importDefault(require("os"));
11
+ const path_1 = __importDefault(require("path"));
12
+ const zod_1 = require("zod");
13
+ exports.AgentConfigSchema = zod_1.z.object({
14
+ apiEndpoint: zod_1.z.string().url(),
15
+ apiKey: zod_1.z.string().min(1),
16
+ watchPaths: zod_1.z.array(zod_1.z.string()).min(1),
17
+ exclude: zod_1.z.array(zod_1.z.string()).default([]),
18
+ batch: zod_1.z
19
+ .object({
20
+ intervalMs: zod_1.z.number().int().positive().default(5000),
21
+ maxEntries: zod_1.z.number().int().positive().default(50),
22
+ })
23
+ .default({ intervalMs: 5000, maxEntries: 50 }),
24
+ agent: zod_1.z
25
+ .object({
26
+ // true なら起動時の既存 .jsonl は「読了扱い」にして送信しない (新規 install 時の負荷回避)。
27
+ // false なら chokidar の add イベントで全 entries を送る (旧挙動)。
28
+ skipInitialBacklog: zod_1.z.boolean().default(true),
29
+ })
30
+ .default({ skipInitialBacklog: true }),
31
+ pii: zod_1.z
32
+ .object({
33
+ maskFilePaths: zod_1.z.boolean().default(true),
34
+ maskApiKeys: zod_1.z.boolean().default(true),
35
+ maskEmails: zod_1.z.boolean().default(false),
36
+ customPatterns: zod_1.z
37
+ .array(zod_1.z.object({ pattern: zod_1.z.string(), replacement: zod_1.z.string() }))
38
+ .default([]),
39
+ })
40
+ .default({ maskFilePaths: true, maskApiKeys: true, maskEmails: false, customPatterns: [] }),
41
+ telemetry: zod_1.z
42
+ .object({
43
+ level: zod_1.z.enum(['debug', 'info', 'warn', 'error']).default('info'),
44
+ })
45
+ .default({ level: 'info' }),
46
+ });
47
+ const DEFAULT_CONFIG_PATH = path_1.default.join(os_1.default.homedir(), '.promptkaizen', 'agent.config.json');
48
+ function expandHome(p) {
49
+ if (p.startsWith('~'))
50
+ return path_1.default.join(os_1.default.homedir(), p.slice(1));
51
+ return p;
52
+ }
53
+ async function loadConfig(explicitPath) {
54
+ const configPath = explicitPath ?? process.env.PROMPTKAIZEN_AGENT_CONFIG ?? DEFAULT_CONFIG_PATH;
55
+ let raw;
56
+ try {
57
+ raw = await promises_1.default.readFile(configPath, 'utf8');
58
+ }
59
+ catch (e) {
60
+ throw new Error(`Cannot read agent config at ${configPath}. ` +
61
+ `Set PROMPTKAIZEN_AGENT_CONFIG or place a config file at ${DEFAULT_CONFIG_PATH}.`);
62
+ }
63
+ let json;
64
+ try {
65
+ json = JSON.parse(raw);
66
+ }
67
+ catch (e) {
68
+ throw new Error(`Invalid JSON in ${configPath}: ${e.message}`);
69
+ }
70
+ const parsed = exports.AgentConfigSchema.safeParse(json);
71
+ if (!parsed.success) {
72
+ throw new Error(`Invalid agent config: ${parsed.error.message}`);
73
+ }
74
+ // ~ を絶対パスに展開
75
+ parsed.data.watchPaths = parsed.data.watchPaths.map(expandHome);
76
+ return parsed.data;
77
+ }
78
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}