promptkaizen-agent 0.6.3 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/dist/analyze/index.d.ts.map +1 -1
- package/dist/analyze/index.js +1 -1
- package/dist/analyze/index.js.map +1 -1
- package/dist/analyze/optimize-rules-fetcher.d.ts +1 -2
- package/dist/analyze/optimize-rules-fetcher.d.ts.map +1 -1
- package/dist/analyze/optimize-rules-fetcher.js +5 -2
- package/dist/analyze/optimize-rules-fetcher.js.map +1 -1
- package/dist/batcher.d.ts +18 -1
- package/dist/batcher.d.ts.map +1 -1
- package/dist/batcher.js +77 -36
- package/dist/batcher.js.map +1 -1
- package/dist/cli/disable-hooks.d.ts +2 -0
- package/dist/cli/disable-hooks.d.ts.map +1 -0
- package/dist/cli/disable-hooks.js +117 -0
- package/dist/cli/disable-hooks.js.map +1 -0
- package/dist/cli/hook.d.ts.map +1 -1
- package/dist/cli/hook.js +15 -5
- package/dist/cli/hook.js.map +1 -1
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +4 -2
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/mcp.js +1 -1
- package/dist/cli/mcp.js.map +1 -1
- package/dist/cli/start.d.ts.map +1 -1
- package/dist/cli/start.js +11 -3
- package/dist/cli/start.js.map +1 -1
- package/dist/cli/status.d.ts.map +1 -1
- package/dist/cli/status.js +15 -1
- package/dist/cli/status.js.map +1 -1
- package/dist/config.d.ts +71 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +76 -3
- package/dist/config.js.map +1 -1
- package/dist/detection/engine.d.ts +149 -0
- package/dist/detection/engine.d.ts.map +1 -0
- package/dist/detection/engine.js +0 -0
- package/dist/detection/engine.js.map +1 -0
- package/dist/detection/index.d.ts +3 -0
- package/dist/detection/index.d.ts.map +1 -0
- package/dist/detection/index.js +24 -0
- package/dist/detection/index.js.map +1 -0
- package/dist/detection/rules.d.ts +103 -0
- package/dist/detection/rules.d.ts.map +1 -0
- package/dist/detection/rules.js +586 -0
- package/dist/detection/rules.js.map +1 -0
- package/dist/hooks/claude-hook.d.ts +31 -4
- package/dist/hooks/claude-hook.d.ts.map +1 -1
- package/dist/hooks/claude-hook.js +131 -16
- package/dist/hooks/claude-hook.js.map +1 -1
- package/dist/hooks/hook-pause.d.ts +34 -0
- package/dist/hooks/hook-pause.d.ts.map +1 -0
- package/dist/hooks/hook-pause.js +111 -0
- package/dist/hooks/hook-pause.js.map +1 -0
- package/dist/hooks/pretooluse-policy.d.ts +34 -0
- package/dist/hooks/pretooluse-policy.d.ts.map +1 -0
- package/dist/hooks/pretooluse-policy.js +97 -0
- package/dist/hooks/pretooluse-policy.js.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/mask-rules-fetcher.d.ts +5 -0
- package/dist/mask-rules-fetcher.d.ts.map +1 -1
- package/dist/mask-rules-fetcher.js +9 -2
- package/dist/mask-rules-fetcher.js.map +1 -1
- package/dist/pii-masker.d.ts.map +1 -1
- package/dist/pii-masker.js.map +1 -1
- package/dist/secret-detector.d.ts +51 -27
- package/dist/secret-detector.d.ts.map +1 -1
- package/dist/secret-detector.js +108 -439
- package/dist/secret-detector.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/dist/suppress-sea-warning.d.ts +0 -2
- package/dist/suppress-sea-warning.d.ts.map +0 -1
- package/dist/suppress-sea-warning.js +0 -21
- package/dist/suppress-sea-warning.js.map +0 -1
package/README.md
CHANGED
|
@@ -20,6 +20,30 @@ Phase 0 初期実装で proxy 方式(リバースプロキシ経由で Anthrop
|
|
|
20
20
|
|
|
21
21
|
詳細は `../proxy/README.md` の凍結ノートと `docs/architecture.md`(追って整備)を参照。
|
|
22
22
|
|
|
23
|
+
## 送信のオン/オフ (3 状態)
|
|
24
|
+
|
|
25
|
+
| 状態 | 設定 | 観測データの送信 | 組織辞書・ルールの取得 | ローカル SQLite |
|
|
26
|
+
|---|---|:--:|:--:|:--:|
|
|
27
|
+
| 既定 | — | ✅ 送る | ✅ 取得する | ✅ 保存する |
|
|
28
|
+
| **記録だけ止める** | `privacy.sendObservations: false` | ❌ 送らない | ✅ **取得する** | ✅ 保存する |
|
|
29
|
+
| 完全ローカル動作 | `apiEndpoint` / `apiKey` 未設定 | ❌ 送らない | ❌ 取得しない | ✅ 保存する |
|
|
30
|
+
|
|
31
|
+
中間状態(`sendObservations: false`)は「配られた辞書は使いたいが、何を書いたかの記録は
|
|
32
|
+
上げたくない」組織向け。ブラウザ拡張の「観測データの送信」と同じ意味・同じ既定値。
|
|
33
|
+
|
|
34
|
+
- 止まるのは **上り** だけ: `receiveObservations` / `receiveFailureModes` /
|
|
35
|
+
`receiveOptimizeStats` / `receiveOptimizeRuleCandidates`
|
|
36
|
+
- 続くのは **下り**: `getAgentMaskRules` / `getOptimizeRules` と `agentHeartbeat`
|
|
37
|
+
(送るのは `agentVersion` のみ・観測データではない)
|
|
38
|
+
- OFF の間の分を溜めて後から送ることはしない(オフセットはその場で進む)
|
|
39
|
+
- 現在の状態は `promptkaizen-agent status` の `mode` 行で確認できる
|
|
40
|
+
|
|
41
|
+
送信を足すときは `hasCloudToken` ではなく **`canUploadObservations`** で判定すること
|
|
42
|
+
(`tests/send-observations.test.ts` が呼び出し元を走査して検査する)。
|
|
43
|
+
|
|
44
|
+
プロンプト本文だけを落としたい場合は `privacy.sendPromptBody: false`(メタのみ送信)。
|
|
45
|
+
2 つは独立していて、「本文は送るが記録は上げない」も表現できる。
|
|
46
|
+
|
|
23
47
|
## ステータス
|
|
24
48
|
|
|
25
49
|
✅ **Phase A〜G 完了**。SAKAMA 内本格運用 (Phase H) 開始可能。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analyze/index.ts"],"names":[],"mappings":"AAQA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analyze/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAyB,KAAK,WAAW,EAAE,MAAM,WAAW,CAAA;AAEnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAoB,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAEtE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAI9C,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AACtE,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AACtF,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC1E,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAChF,OAAO,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3G,cAAc,iBAAiB,CAAA;AAE/B,yDAAyD;AACzD,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE,OAAO,KAAK,GAAG,YAAY,CAWvF;AAED,0DAA0D;AAC1D,wBAAsB,WAAW,CAC/B,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,WAAW,EACnB,MAAM,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAQpC;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,CA6ChC"}
|
package/dist/analyze/index.js
CHANGED
|
@@ -103,7 +103,7 @@ async function startAnalysisScheduler(store, config) {
|
|
|
103
103
|
await (0, analyzer_1.runAnalysisCycle)(store, client, opts);
|
|
104
104
|
// オンライン時のみ、失敗モードの**メタ**を dashboard 集計用に送信 (#209)。
|
|
105
105
|
// signal・本文・session_id は送らない (送信ゼロの徹底)。完全ローカル時はスキップ。
|
|
106
|
-
if ((0, config_1.
|
|
106
|
+
if ((0, config_1.canUploadObservations)(config)) {
|
|
107
107
|
await (0, failure_mode_sender_1.flushFailureModes)(store, { apiEndpoint: config.apiEndpoint, apiKey: config.apiKey });
|
|
108
108
|
// 最適化ルール候補のローカル生成 + 送信 (#214、opt-in)。pattern/hint のみ送る。
|
|
109
109
|
// 候補は cloud で自動有効化されず、dashboard 承認で初めて配信される。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analyze/index.ts"],"names":[],"mappings":";AAAA,gDAAgD;AAChD,0DAA0D;AAC1D,gDAAgD;AAChD,EAAE;AACF,oEAAoE;AACpE,0DAA0D;AAC1D,yDAAyD;;;;;;;;;;;;;;;;;AAmBzD,kCAWC;AAGD,kCAYC;AAQD,wDAgDC;AAnGD,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analyze/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,7 @@ export declare function sendOptimizeStats(hits: Array<{
|
|
|
11
11
|
ruleId: string;
|
|
12
12
|
sessionId?: string | null;
|
|
13
13
|
}>, opts: OptimizeRulesIO): Promise<number>;
|
|
14
|
-
declare const OptimizeRuleSchema: z.ZodObject<{
|
|
14
|
+
export declare const OptimizeRuleSchema: z.ZodObject<{
|
|
15
15
|
ruleId: z.ZodString;
|
|
16
16
|
pattern: z.ZodString;
|
|
17
17
|
hint: z.ZodString;
|
|
@@ -49,5 +49,4 @@ export declare function fetchOptimizeRules(opts: OptimizeRulesIO): Promise<Fetch
|
|
|
49
49
|
* 戻り値は送信した候補数 (0 = 送信なし or 失敗)。
|
|
50
50
|
*/
|
|
51
51
|
export declare function sendOptimizeRuleCandidates(candidates: CandidateRule[], opts: OptimizeRulesIO): Promise<number>;
|
|
52
|
-
export {};
|
|
53
52
|
//# sourceMappingURL=optimize-rules-fetcher.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"optimize-rules-fetcher.d.ts","sourceRoot":"","sources":["../../src/analyze/optimize-rules-fetcher.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAErD,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE5D;AACD,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEzD;AACD,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,EAC1D,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,MAAM,CAAC,CAajB;
|
|
1
|
+
{"version":3,"file":"optimize-rules-fetcher.d.ts","sourceRoot":"","sources":["../../src/analyze/optimize-rules-fetcher.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAErD,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE5D;AACD,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEzD;AACD,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,EAC1D,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,MAAM,CAAC,CAajB;AAKD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;EAO7B,CAAA;AAYF,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAEpE,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CACzB;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,mBAAmB,EAAE,GAAG,IAAI,CAAC,CAkBrG;AAED;;;GAGG;AACH,wBAAsB,0BAA0B,CAC9C,UAAU,EAAE,aAAa,EAAE,EAC3B,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,MAAM,CAAC,CAmBjB"}
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
// 認証は getAgentMaskRules / receiveObservations と同じ Bearer apiKey。
|
|
9
9
|
// 候補送信は pattern/hint のみ (生プロンプト本文は含まない)。
|
|
10
10
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.OptimizeRuleSchema = void 0;
|
|
11
12
|
exports.optimizeRulesUrl = optimizeRulesUrl;
|
|
12
13
|
exports.candidatesUrl = candidatesUrl;
|
|
13
14
|
exports.optimizeStatsUrl = optimizeStatsUrl;
|
|
@@ -47,7 +48,9 @@ async function sendOptimizeStats(hits, opts) {
|
|
|
47
48
|
}
|
|
48
49
|
}
|
|
49
50
|
// cloud 側 (functions/src/agent/optimizeRulesConfig.ts) の schema と整合させること。
|
|
50
|
-
|
|
51
|
+
// 同一性は functions/src/agent/__tests__/optimizeRules.sync.test.ts が担保する
|
|
52
|
+
// (このミラーだけを変えるとテストが落ちる) ため export している。
|
|
53
|
+
exports.OptimizeRuleSchema = zod_1.z.object({
|
|
51
54
|
ruleId: zod_1.z.string(),
|
|
52
55
|
pattern: zod_1.z.string(),
|
|
53
56
|
hint: zod_1.z.string(),
|
|
@@ -59,7 +62,7 @@ const GetResponseSchema = zod_1.z.object({
|
|
|
59
62
|
success: zod_1.z.boolean(),
|
|
60
63
|
rules: zod_1.z
|
|
61
64
|
.object({
|
|
62
|
-
rules: zod_1.z.array(OptimizeRuleSchema),
|
|
65
|
+
rules: zod_1.z.array(exports.OptimizeRuleSchema),
|
|
63
66
|
updatedAt: zod_1.z.number().optional(),
|
|
64
67
|
})
|
|
65
68
|
.nullable(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"optimize-rules-fetcher.js","sourceRoot":"","sources":["../../src/analyze/optimize-rules-fetcher.ts"],"names":[],"mappings":";AAAA,gDAAgD;AAChD,kDAAkD;AAClD,gDAAgD;AAChD,EAAE;AACF,8EAA8E;AAC9E,yEAAyE;AACzE,iEAAiE;AACjE,yCAAyC
|
|
1
|
+
{"version":3,"file":"optimize-rules-fetcher.js","sourceRoot":"","sources":["../../src/analyze/optimize-rules-fetcher.ts"],"names":[],"mappings":"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"}
|
package/dist/batcher.d.ts
CHANGED
|
@@ -3,8 +3,20 @@ import type { ParsedEntry } from './types';
|
|
|
3
3
|
export interface BatcherOptions {
|
|
4
4
|
intervalMs: number;
|
|
5
5
|
maxEntries: number;
|
|
6
|
+
/**
|
|
7
|
+
* flush 失敗 (sender のリトライ込み) を何回まで再試行するか。
|
|
8
|
+
* 超過したら entries を破棄し、offset も進めて (onFlushed 呼び出し)
|
|
9
|
+
* 同じバッチを再読込・再送し続ける無限ループを断つ。
|
|
10
|
+
*
|
|
11
|
+
* 背景 (2026-07-09〜10 PROD 5xx 障害): 旧実装は失敗時に entries を
|
|
12
|
+
* 破棄しつつ offset を進めなかったため、ファイル更新のたびに同じ
|
|
13
|
+
* 毒バッチが再読込 → 再送され、約 17 時間 5xx が続いた。
|
|
14
|
+
*/
|
|
15
|
+
maxFlushAttempts?: number;
|
|
16
|
+
/** 1 リクエストあたりの送信 entry 数上限 (cloud 側の Firestore batch limit と同値)。 */
|
|
17
|
+
chunkSize?: number;
|
|
6
18
|
}
|
|
7
|
-
/** flush
|
|
19
|
+
/** flush 成功時 (または再試行を諦めて破棄した時) に呼ばれる callback (offset 更新用) */
|
|
8
20
|
export type OnFlushed = (flushedCount: number, filepath: string) => Promise<void> | void;
|
|
9
21
|
export declare class Batcher {
|
|
10
22
|
private opts;
|
|
@@ -14,11 +26,16 @@ export declare class Batcher {
|
|
|
14
26
|
private timer;
|
|
15
27
|
private flushing;
|
|
16
28
|
private pendingFlush;
|
|
29
|
+
private readonly maxFlushAttempts;
|
|
30
|
+
private readonly chunkSize;
|
|
17
31
|
constructor(opts: BatcherOptions, sender: Sender, onFlushed: OnFlushed);
|
|
18
32
|
add(filepath: string, entries: ParsedEntry[], consumed: number): void;
|
|
19
33
|
/** 即時 flush (graceful shutdown / maxEntries 超過時) */
|
|
20
34
|
flush(): Promise<void>;
|
|
21
35
|
private doFlush;
|
|
36
|
+
private flushQueue;
|
|
37
|
+
/** 失敗した queue を戻す。flush 中に届いた新規 entries があれば前に繋ぐ (元の順序を保つ)。 */
|
|
38
|
+
private requeue;
|
|
22
39
|
private totalEntries;
|
|
23
40
|
private scheduleIfNeeded;
|
|
24
41
|
}
|
package/dist/batcher.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batcher.d.ts","sourceRoot":"","sources":["../src/batcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAE1C,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,
|
|
1
|
+
{"version":3,"file":"batcher.d.ts","sourceRoot":"","sources":["../src/batcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAE1C,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB;;;;;;;;OAQG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,8DAA8D;AAC9D,MAAM,MAAM,SAAS,GAAG,CACtB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,KACb,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;AAazB,qBAAa,OAAO;IAShB,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,SAAS;IAVnB,OAAO,CAAC,MAAM,CAAqC;IACnD,OAAO,CAAC,KAAK,CAA8B;IAC3C,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAQ;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;gBAGxB,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS;IAM9B,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAerE,oDAAoD;IAC9C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAYd,OAAO;YAoBP,UAAU;IAqDxB,+DAA+D;IAC/D,OAAO,CAAC,OAAO;IAWf,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,gBAAgB;CAOzB"}
|
package/dist/batcher.js
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Batcher = void 0;
|
|
4
4
|
const logger_1 = require("./logger");
|
|
5
|
+
const DEFAULT_MAX_FLUSH_ATTEMPTS = 5;
|
|
6
|
+
const DEFAULT_CHUNK_SIZE = 500;
|
|
5
7
|
class Batcher {
|
|
6
8
|
opts;
|
|
7
9
|
sender;
|
|
@@ -10,10 +12,14 @@ class Batcher {
|
|
|
10
12
|
timer = null;
|
|
11
13
|
flushing = false;
|
|
12
14
|
pendingFlush = null;
|
|
15
|
+
maxFlushAttempts;
|
|
16
|
+
chunkSize;
|
|
13
17
|
constructor(opts, sender, onFlushed) {
|
|
14
18
|
this.opts = opts;
|
|
15
19
|
this.sender = sender;
|
|
16
20
|
this.onFlushed = onFlushed;
|
|
21
|
+
this.maxFlushAttempts = opts.maxFlushAttempts ?? DEFAULT_MAX_FLUSH_ATTEMPTS;
|
|
22
|
+
this.chunkSize = opts.chunkSize ?? DEFAULT_CHUNK_SIZE;
|
|
17
23
|
}
|
|
18
24
|
add(filepath, entries, consumed) {
|
|
19
25
|
if (entries.length === 0 && consumed === 0)
|
|
@@ -24,7 +30,7 @@ class Batcher {
|
|
|
24
30
|
existing.consumed += consumed;
|
|
25
31
|
}
|
|
26
32
|
else {
|
|
27
|
-
this.queues.set(filepath, { filepath, entries: [...entries], consumed });
|
|
33
|
+
this.queues.set(filepath, { filepath, entries: [...entries], consumed, attempts: 0 });
|
|
28
34
|
}
|
|
29
35
|
this.scheduleIfNeeded();
|
|
30
36
|
if (this.totalEntries() >= this.opts.maxEntries) {
|
|
@@ -55,47 +61,82 @@ class Batcher {
|
|
|
55
61
|
}
|
|
56
62
|
const snapshot = Array.from(this.queues.values());
|
|
57
63
|
this.queues.clear();
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
// entry はないが consumed (skip 行) はあるかも → offset 進める
|
|
63
|
-
for (const q of snapshot) {
|
|
64
|
-
if (q.consumed > 0)
|
|
65
|
-
await this.onFlushed(q.consumed, q.filepath);
|
|
66
|
-
}
|
|
67
|
-
return;
|
|
64
|
+
// ファイル単位で送信する。offset (onFlushed) がファイル単位のため、
|
|
65
|
+
// 送信の成否とその帰属を 1:1 に保つ (他ファイルの失敗の巻き添えを防ぐ)。
|
|
66
|
+
for (const q of snapshot) {
|
|
67
|
+
await this.flushQueue(q);
|
|
68
68
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
this.flushing = false;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
async flushQueue(q) {
|
|
75
|
+
if (q.entries.length === 0) {
|
|
76
|
+
// entry はないが consumed (skip 行) はあるかも → offset 進める
|
|
77
|
+
if (q.consumed > 0)
|
|
78
|
+
await this.onFlushed(q.consumed, q.filepath);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
// Cloud 側 (receiveObservations) は Firestore batch limit に合わせて
|
|
83
|
+
// 1 リクエスト 500 entries 上限。同 limit に合わせて分割送信。
|
|
84
|
+
let totalReceived = 0;
|
|
85
|
+
let chunks = 0;
|
|
86
|
+
while (q.entries.length > 0) {
|
|
87
|
+
const slice = q.entries.slice(0, this.chunkSize);
|
|
88
|
+
const ack = await this.sender.send(slice);
|
|
89
|
+
totalReceived += ack.received;
|
|
90
|
+
chunks++;
|
|
91
|
+
// 成功したチャンクは再試行対象から除外する
|
|
92
|
+
// (途中失敗 → 再試行時に成功済み分を再送して重複させない)
|
|
93
|
+
q.entries = q.entries.slice(slice.length);
|
|
88
94
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
95
|
+
logger_1.logger.info('Batcher flush ok', {
|
|
96
|
+
filepath: q.filepath,
|
|
97
|
+
received: totalReceived,
|
|
98
|
+
chunks,
|
|
99
|
+
});
|
|
100
|
+
if (q.consumed > 0)
|
|
101
|
+
await this.onFlushed(q.consumed, q.filepath);
|
|
102
|
+
}
|
|
103
|
+
catch (e) {
|
|
104
|
+
q.attempts++;
|
|
105
|
+
if (q.attempts >= this.maxFlushAttempts) {
|
|
106
|
+
// 何度送っても失敗するバッチ。破棄した上で offset も進め、
|
|
107
|
+
// ファイル更新のたびに同じバッチを再読込 → 再送する無限ループを断つ。
|
|
108
|
+
// (データはローカル SQLite / 元 JSONL に残るため backfill で救済可能)
|
|
109
|
+
logger_1.logger.error('Batcher flush gave up (entries dropped, offset advanced)', {
|
|
110
|
+
filepath: q.filepath,
|
|
111
|
+
dropped: q.entries.length,
|
|
112
|
+
attempts: q.attempts,
|
|
93
113
|
error: e.message,
|
|
94
114
|
});
|
|
115
|
+
if (q.consumed > 0)
|
|
116
|
+
await this.onFlushed(q.consumed, q.filepath);
|
|
117
|
+
return;
|
|
95
118
|
}
|
|
119
|
+
logger_1.logger.warn('Batcher flush failed (will retry)', {
|
|
120
|
+
filepath: q.filepath,
|
|
121
|
+
remaining: q.entries.length,
|
|
122
|
+
attempt: q.attempts,
|
|
123
|
+
maxAttempts: this.maxFlushAttempts,
|
|
124
|
+
error: e.message,
|
|
125
|
+
});
|
|
126
|
+
this.requeue(q);
|
|
127
|
+
this.scheduleIfNeeded();
|
|
96
128
|
}
|
|
97
|
-
|
|
98
|
-
|
|
129
|
+
}
|
|
130
|
+
/** 失敗した queue を戻す。flush 中に届いた新規 entries があれば前に繋ぐ (元の順序を保つ)。 */
|
|
131
|
+
requeue(q) {
|
|
132
|
+
const existing = this.queues.get(q.filepath);
|
|
133
|
+
if (existing) {
|
|
134
|
+
existing.entries = [...q.entries, ...existing.entries];
|
|
135
|
+
existing.consumed += q.consumed;
|
|
136
|
+
existing.attempts = q.attempts;
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
this.queues.set(q.filepath, q);
|
|
99
140
|
}
|
|
100
141
|
}
|
|
101
142
|
totalEntries() {
|
package/dist/batcher.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batcher.js","sourceRoot":"","sources":["../src/batcher.ts"],"names":[],"mappings":";;;AAAA,qCAAiC;
|
|
1
|
+
{"version":3,"file":"batcher.js","sourceRoot":"","sources":["../src/batcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disable-hooks.d.ts","sourceRoot":"","sources":["../../src/cli/disable-hooks.ts"],"names":[],"mappings":"AA+CA,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsDnE"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runDisableHooks = runDisableHooks;
|
|
4
|
+
const hook_pause_1 = require("../hooks/hook-pause");
|
|
5
|
+
// =============================================
|
|
6
|
+
// `promptkaizen-agent disable-hooks` — ブロックの一時停止
|
|
7
|
+
// =============================================
|
|
8
|
+
//
|
|
9
|
+
// 誤検知で PreToolUse の deny が続いたときの正規の逃げ道。
|
|
10
|
+
// 従来は ~/.claude/settings.json から hook 登録を手で外して作業後に戻すしかなく、
|
|
11
|
+
// それは全プロジェクトに対する無効化で、しかも戻し忘れに気付けなかった。
|
|
12
|
+
//
|
|
13
|
+
// promptkaizen-agent disable-hooks --pre-tool-use --duration 10m
|
|
14
|
+
// promptkaizen-agent disable-hooks --status
|
|
15
|
+
// promptkaizen-agent disable-hooks --clear
|
|
16
|
+
//
|
|
17
|
+
// 停止するのは「実行を拒否する判断」だけ。観測・記録・送信前マスクは動き続ける。
|
|
18
|
+
const USAGE = `promptkaizen-agent disable-hooks — 検知によるブロックを一時的に止める
|
|
19
|
+
|
|
20
|
+
Usage:
|
|
21
|
+
promptkaizen-agent disable-hooks [--pre-tool-use] [--prompt-submit] [--all]
|
|
22
|
+
[--duration 10m] [--here] [--reason "..."]
|
|
23
|
+
promptkaizen-agent disable-hooks --status
|
|
24
|
+
promptkaizen-agent disable-hooks --clear
|
|
25
|
+
|
|
26
|
+
Options:
|
|
27
|
+
--pre-tool-use ツール実行の事前ブロック (PreToolUse) を止める (既定)
|
|
28
|
+
--prompt-submit プロンプト送信前の block (UserPromptSubmit) を止める
|
|
29
|
+
--all 両方を止める
|
|
30
|
+
--duration <d> 停止時間。30s / 10m / 2h の形式。既定 10m、上限 24h
|
|
31
|
+
--here 現在のディレクトリ配下だけで止める (他のプロジェクトはそのまま)
|
|
32
|
+
--reason <text> なぜ止めたかのメモ (--status で表示)
|
|
33
|
+
--status 現在の停止状態を表示
|
|
34
|
+
--clear 停止を解除して元に戻す
|
|
35
|
+
|
|
36
|
+
止めるのは「ツール実行・プロンプト送信を拒否する判断」だけです。
|
|
37
|
+
検知・記録・クラウド送信前のマスクは停止中も従来どおり動きます。
|
|
38
|
+
期限が過ぎれば自動的に元へ戻るため、戻し忘れは起きません。
|
|
39
|
+
`;
|
|
40
|
+
async function runDisableHooks(argv) {
|
|
41
|
+
if (argv.includes('--help') || argv.includes('-h')) {
|
|
42
|
+
console.log(USAGE);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (argv.includes('--status')) {
|
|
46
|
+
await printStatus();
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (argv.includes('--clear') || argv.includes('--resume')) {
|
|
50
|
+
const removed = await (0, hook_pause_1.clearHookPause)();
|
|
51
|
+
console.log(removed
|
|
52
|
+
? '✅ 一時停止を解除しました。ブロックは通常どおり動きます。'
|
|
53
|
+
: 'ℹ️ 一時停止は設定されていません (すでに通常動作です)。');
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const scopes = [];
|
|
57
|
+
if (argv.includes('--all'))
|
|
58
|
+
scopes.push('preToolUse', 'promptSubmit');
|
|
59
|
+
else {
|
|
60
|
+
if (argv.includes('--pre-tool-use'))
|
|
61
|
+
scopes.push('preToolUse');
|
|
62
|
+
if (argv.includes('--prompt-submit'))
|
|
63
|
+
scopes.push('promptSubmit');
|
|
64
|
+
}
|
|
65
|
+
// 範囲指定なしは PreToolUse のみ (誤検知で困るのはほぼここ)。
|
|
66
|
+
if (scopes.length === 0)
|
|
67
|
+
scopes.push('preToolUse');
|
|
68
|
+
const durationArg = readOption(argv, '--duration') ?? '10m';
|
|
69
|
+
const ms = (0, hook_pause_1.parseDuration)(durationArg);
|
|
70
|
+
if (ms === null) {
|
|
71
|
+
console.error(`❌ --duration の値が不正です: ${durationArg}`);
|
|
72
|
+
console.error(' 30s / 10m / 2h の形式で、24h 以内を指定してください。');
|
|
73
|
+
process.exitCode = 1;
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const now = Date.now();
|
|
77
|
+
await (0, hook_pause_1.writeHookPause)({
|
|
78
|
+
scopes: [...new Set(scopes)],
|
|
79
|
+
until: new Date(now + ms).toISOString(),
|
|
80
|
+
cwd: argv.includes('--here') ? process.cwd() : null,
|
|
81
|
+
createdAt: new Date(now).toISOString(),
|
|
82
|
+
reason: readOption(argv, '--reason'),
|
|
83
|
+
});
|
|
84
|
+
const scopeLabel = scopes.map(scopeName).join(' / ');
|
|
85
|
+
console.log(`✅ ${scopeLabel} のブロックを一時停止しました。`);
|
|
86
|
+
console.log(` 期限: ${new Date(now + ms).toLocaleString()} (${(0, hook_pause_1.formatRemaining)(new Date(now + ms).toISOString(), now)})`);
|
|
87
|
+
if (argv.includes('--here'))
|
|
88
|
+
console.log(` 範囲: ${process.cwd()} 配下のみ`);
|
|
89
|
+
console.log(' 検知・記録・送信前のマスクは停止中も動き続けます。');
|
|
90
|
+
console.log(' すぐ戻す場合: promptkaizen-agent disable-hooks --clear');
|
|
91
|
+
}
|
|
92
|
+
async function printStatus() {
|
|
93
|
+
const pause = await (0, hook_pause_1.readHookPause)();
|
|
94
|
+
if (!pause) {
|
|
95
|
+
console.log('ブロックは通常どおり有効です (一時停止なし)。');
|
|
96
|
+
console.log(`設定ファイル: ${(0, hook_pause_1.hookPausePath)()} (未作成 or 期限切れ)`);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
console.log('⏸ ブロックを一時停止中です。');
|
|
100
|
+
console.log(` 範囲: ${pause.scopes.map(scopeName).join(' / ')}`);
|
|
101
|
+
console.log(` 期限: ${new Date(pause.until).toLocaleString()} (${(0, hook_pause_1.formatRemaining)(pause.until)})`);
|
|
102
|
+
console.log(` 対象: ${pause.cwd ? `${pause.cwd} 配下のみ` : '全プロジェクト'}`);
|
|
103
|
+
if (pause.reason)
|
|
104
|
+
console.log(` 理由: ${pause.reason}`);
|
|
105
|
+
console.log(' 解除: promptkaizen-agent disable-hooks --clear');
|
|
106
|
+
}
|
|
107
|
+
function scopeName(scope) {
|
|
108
|
+
return scope === 'preToolUse' ? 'ツール実行の事前ブロック' : 'プロンプト送信前の block';
|
|
109
|
+
}
|
|
110
|
+
function readOption(argv, name) {
|
|
111
|
+
const i = argv.indexOf(name);
|
|
112
|
+
if (i === -1)
|
|
113
|
+
return undefined;
|
|
114
|
+
const v = argv[i + 1];
|
|
115
|
+
return v && !v.startsWith('--') ? v : undefined;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=disable-hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disable-hooks.js","sourceRoot":"","sources":["../../src/cli/disable-hooks.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/hook.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../src/cli/hook.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../src/cli/hook.ts"],"names":[],"mappings":"AAiDA,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+K3D"}
|
package/dist/cli/hook.js
CHANGED
|
@@ -11,6 +11,7 @@ const local_store_1 = require("../store/local-store");
|
|
|
11
11
|
const version_1 = require("../version");
|
|
12
12
|
const block_store_1 = require("../hooks/block-store");
|
|
13
13
|
const claude_hook_1 = require("../hooks/claude-hook");
|
|
14
|
+
const hook_pause_1 = require("../hooks/hook-pause");
|
|
14
15
|
const platforms_1 = require("../hooks/platforms");
|
|
15
16
|
const continuity_1 = require("../hooks/continuity");
|
|
16
17
|
const optimize_hints_1 = require("../hooks/optimize-hints");
|
|
@@ -65,11 +66,17 @@ async function runHook(argv) {
|
|
|
65
66
|
hmacSecret: await (0, detection_secret_1.loadOrCreateDetectionSecret)(config.detection.hmacSecret),
|
|
66
67
|
})
|
|
67
68
|
: null;
|
|
69
|
+
// 一時停止 (disable-hooks)。期限切れ・未設定なら null が返る。
|
|
70
|
+
const pause = await (0, hook_pause_1.readHookPause)().catch(() => null);
|
|
71
|
+
const hookCwd = typeof input.cwd === 'string' ? input.cwd : null;
|
|
68
72
|
// 1. PreToolUse: 事前ブロック判定 (ツール実行=exfiltration 防止)。
|
|
69
73
|
if (event === 'PreToolUse') {
|
|
70
74
|
if (!detector)
|
|
71
75
|
process.exit(0);
|
|
72
|
-
const evaluation = (0, claude_hook_1.evaluateHook)(event, input, detector
|
|
76
|
+
const evaluation = (0, claude_hook_1.evaluateHook)(event, input, detector, {
|
|
77
|
+
preToolUse: config.security.preToolUse,
|
|
78
|
+
paused: (0, hook_pause_1.isPaused)(pause, 'preToolUse', hookCwd),
|
|
79
|
+
});
|
|
73
80
|
if (evaluation.blocked && evaluation.output) {
|
|
74
81
|
// ブロックイベントを記録 (best-effort)。生機密は含まない。
|
|
75
82
|
// Issue #68: SQLite (blocks テーブル) を優先、無効時のみ JSONL にフォールバック。
|
|
@@ -87,7 +94,10 @@ async function runHook(argv) {
|
|
|
87
94
|
}
|
|
88
95
|
// 1b. UserPromptSubmit の block (#205, opt-in): 貼り付けた機密がモデルに到達する前に止める。
|
|
89
96
|
// block 時はプロンプトが context から消えるため、観測 entry は記録だけして送信経路へ進ませず exit。
|
|
90
|
-
if (event === 'UserPromptSubmit' &&
|
|
97
|
+
if (event === 'UserPromptSubmit' &&
|
|
98
|
+
detector &&
|
|
99
|
+
config.security.blockOnPromptSubmit &&
|
|
100
|
+
!(0, hook_pause_1.isPaused)(pause, 'promptSubmit', hookCwd)) {
|
|
91
101
|
const evaluation = (0, claude_hook_1.evaluateHook)(event, input, detector, {
|
|
92
102
|
blockOnPromptSubmit: true,
|
|
93
103
|
blockPromptThreshold: config.security.blockPromptThreshold,
|
|
@@ -139,7 +149,7 @@ async function runHook(argv) {
|
|
|
139
149
|
const hits = (0, optimize_hints_1.matchOptimizeHints)(prompt, rules);
|
|
140
150
|
additionalContext = (0, optimize_hints_1.buildHintText)(hits);
|
|
141
151
|
// 効果計測 (#216): 発火したヒットのメタ (ruleId/session) を送る。online のみ・best-effort。
|
|
142
|
-
if (hits.length > 0 && (0, config_1.
|
|
152
|
+
if (hits.length > 0 && (0, config_1.canUploadObservations)(config)) {
|
|
143
153
|
const sessionId = typeof input.session_id === 'string' ? input.session_id : null;
|
|
144
154
|
await (0, optimize_rules_fetcher_1.sendOptimizeStats)(hits.map((h) => ({ ruleId: h.ruleId, sessionId })), { apiEndpoint: config.apiEndpoint, apiKey: config.apiKey }).catch(() => undefined);
|
|
145
155
|
}
|
|
@@ -166,7 +176,7 @@ async function runHook(argv) {
|
|
|
166
176
|
}
|
|
167
177
|
}
|
|
168
178
|
// 2b. 送信 (online のみ)。プロンプト本文は組織 opt-in 時だけ送る。
|
|
169
|
-
if ((0, config_1.
|
|
179
|
+
if ((0, config_1.canUploadObservations)(config)) {
|
|
170
180
|
const [outgoing] = (0, privacy_1.applyPrivacyGate)([entry], {
|
|
171
181
|
sendPromptBody: config.privacy.sendPromptBody,
|
|
172
182
|
});
|
|
@@ -352,7 +362,7 @@ async function runContinuity(event, input, config) {
|
|
|
352
362
|
if (!restore)
|
|
353
363
|
return;
|
|
354
364
|
// マーカーを cloud にも送る (#69 計測用)。失敗しても注入は行う。
|
|
355
|
-
if ((0, config_1.
|
|
365
|
+
if ((0, config_1.canUploadObservations)(config)) {
|
|
356
366
|
const [outgoing] = (0, privacy_1.applyPrivacyGate)([restore.markerEntry], {
|
|
357
367
|
sendPromptBody: config.privacy.sendPromptBody,
|
|
358
368
|
});
|