@strongkeep/watchdog 0.1.1 → 0.1.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/dist/appliers/add-hook.js +14 -3
- package/dist/appliers/add-hook.js.map +1 -1
- package/dist/appliers/applier.d.ts +7 -0
- package/dist/appliers/applier.js.map +1 -1
- package/dist/appliers/block-domain.js +3 -1
- package/dist/appliers/block-domain.js.map +1 -1
- package/dist/appliers/fs-guard.d.ts +2 -0
- package/dist/appliers/fs-guard.js +9 -0
- package/dist/appliers/fs-guard.js.map +1 -1
- package/dist/appliers/min-version.js +3 -2
- package/dist/appliers/min-version.js.map +1 -1
- package/dist/appliers/pin-mcp.js +12 -2
- package/dist/appliers/pin-mcp.js.map +1 -1
- package/dist/appliers/set-config.js +12 -1
- package/dist/appliers/set-config.js.map +1 -1
- package/dist/appliers/update-rule-file.js +14 -3
- package/dist/appliers/update-rule-file.js.map +1 -1
- package/dist/cli/guard-check.d.ts +9 -3
- package/dist/cli/guard-check.js +13 -5
- package/dist/cli/guard-check.js.map +1 -1
- package/dist/cli/poll.js +1 -1
- package/dist/cli/poll.js.map +1 -1
- package/dist/feed-client.js +29 -11
- package/dist/feed-client.js.map +1 -1
- package/dist/pipeline.d.ts +7 -0
- package/dist/pipeline.js +16 -1
- package/dist/pipeline.js.map +1 -1
- package/package.json +1 -1
|
@@ -16,7 +16,7 @@ import { mkdir, rm, writeFile } from 'node:fs/promises';
|
|
|
16
16
|
import { dirname, join } from 'node:path';
|
|
17
17
|
import { verifyPayloadHash } from '@strongkeep/core';
|
|
18
18
|
import { RefusedActionError } from './applier.js';
|
|
19
|
-
import { resolveInsideHarness, readIfExists, backupFile, restoreBackup } from './fs-guard.js';
|
|
19
|
+
import { resolveInsideHarness, readIfExists, backupFile, restoreBackup, bytesEqual } from './fs-guard.js';
|
|
20
20
|
/** Where hook packs land, relative to the harness root. */
|
|
21
21
|
export const HOOK_PACKS_DIR = '.strongkeep/hook-packs';
|
|
22
22
|
/** Content written for a pack with no payloadRef: a pointer to the watchdog's built-in pack. */
|
|
@@ -51,7 +51,18 @@ export const addHookApplier = {
|
|
|
51
51
|
}
|
|
52
52
|
const relPath = join(HOOK_PACKS_DIR, `${action.hook_pack_id}.yaml`);
|
|
53
53
|
const absPath = resolveInsideHarness(ctx.harnessRoot, relPath);
|
|
54
|
-
const
|
|
54
|
+
const existingBytes = await readIfExists(absPath);
|
|
55
|
+
const existedBefore = existingBytes !== undefined;
|
|
56
|
+
// Idempotency: the pack already exists with EXACTLY this (hash-verified) content → nothing
|
|
57
|
+
// to do. Skip the write and the backup; the pipeline logs no undo record for this.
|
|
58
|
+
if (existingBytes !== undefined && bytesEqual(existingBytes, content)) {
|
|
59
|
+
return {
|
|
60
|
+
summary: `hook pack "${action.hook_pack_id}" already installed at ${relPath} (no change)`,
|
|
61
|
+
inverse: { kind: 'add_hook', hookPackId: action.hook_pack_id, existedBefore, path: relPath },
|
|
62
|
+
diffPreview: `(no change) ${relPath} already matches the verified content`,
|
|
63
|
+
changed: false,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
55
66
|
const inverse = { kind: 'add_hook', hookPackId: action.hook_pack_id, existedBefore, path: relPath };
|
|
56
67
|
const summary = `installed hook pack "${action.hook_pack_id}" -> ${relPath}`;
|
|
57
68
|
const diffPreview = `+ ${relPath} (${content.byteLength} bytes, hash-verified)`;
|
|
@@ -61,7 +72,7 @@ export const addHookApplier = {
|
|
|
61
72
|
await mkdir(dirname(absPath), { recursive: true });
|
|
62
73
|
await writeFile(absPath, content);
|
|
63
74
|
}
|
|
64
|
-
return { summary, inverse, diffPreview };
|
|
75
|
+
return { summary, inverse, diffPreview, changed: true };
|
|
65
76
|
},
|
|
66
77
|
async revert(inverse, ctx) {
|
|
67
78
|
if (inverse.kind !== 'add_hook')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-hook.js","sourceRoot":"","sources":["../../src/appliers/add-hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"add-hook.js","sourceRoot":"","sources":["../../src/appliers/add-hook.ts"],"names":[],"mappings":"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"}
|
|
@@ -50,6 +50,13 @@ export interface ApplyResult {
|
|
|
50
50
|
inverse: UndoInverse;
|
|
51
51
|
/** A unified-diff-style preview for the propose/stage UX. */
|
|
52
52
|
diffPreview: string;
|
|
53
|
+
/**
|
|
54
|
+
* False when the target is ALREADY in the desired state (idempotency): the applier wrote
|
|
55
|
+
* nothing, took no backup, and the pipeline must not log an undo record or stage a diff for
|
|
56
|
+
* it. Computed identically in dryRun and live modes. An inherently advisory/no-write applier
|
|
57
|
+
* (min_version) reports `changed: false` always — it never mutates anything.
|
|
58
|
+
*/
|
|
59
|
+
changed: boolean;
|
|
53
60
|
}
|
|
54
61
|
/**
|
|
55
62
|
* An allowlisted applier for exactly one action type. `apply` performs the config write (or,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"applier.js","sourceRoot":"","sources":["../../src/appliers/applier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"applier.js","sourceRoot":"","sources":["../../src/appliers/applier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AA4DrD,gGAAgG;AAChG,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IACzB,IAAI,GAAG,oBAAoB,CAAC;CAC/C;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAA2C;IAC9D,UAAU,EAAE,gBAA2B;IACvC,QAAQ,EAAE,cAAyB;IACnC,YAAY,EAAE,kBAA6B;IAC3C,OAAO,EAAE,aAAwB;IACjC,gBAAgB,EAAE,qBAAgC;IAClD,WAAW,EAAE,iBAA4B;CAC1C,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAyB,EAAE,GAAiB;IAC5E,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAwB,CAAC;IAC7D,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,kBAAkB,CAAC,wBAAyB,MAA2B,CAAC,IAAI,2BAA2B,CAAC,CAAC;IACrH,CAAC;IACD,OAAO,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,+FAA+F;AAC/F,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAoB,EAAE,GAAiB;IACzE,yDAAyD;IACzD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAwB,CAAC;IAC9D,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,kBAAkB,CAAC,2BAA2B,OAAO,CAAC,IAAI,2BAA2B,CAAC,CAAC;IACnG,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -61,7 +61,9 @@ export const blockDomainApplier = {
|
|
|
61
61
|
if (!ctx.dryRun && !existedBefore) {
|
|
62
62
|
await blocker.block(action.domain);
|
|
63
63
|
}
|
|
64
|
-
|
|
64
|
+
// Idempotency: an already-blocked domain (via DnsBlocker or the local blocklist) is a
|
|
65
|
+
// no-op — changed:false, and the pipeline logs no undo record for it.
|
|
66
|
+
return { summary, inverse, diffPreview, changed: !existedBefore };
|
|
65
67
|
},
|
|
66
68
|
async revert(inverse, ctx) {
|
|
67
69
|
if (inverse.kind !== 'block_domain')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block-domain.js","sourceRoot":"","sources":["../../src/appliers/block-domain.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"block-domain.js","sourceRoot":"","sources":["../../src/appliers/block-domain.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,8 @@ export declare const BACKUPS_DIR = ".strongkeep/backups";
|
|
|
14
14
|
* path-escape guard (T-APP-5): absolute paths and any `..` traversal are refused loudly.
|
|
15
15
|
*/
|
|
16
16
|
export declare function resolveInsideHarness(harnessRoot: string, relPath: string): string;
|
|
17
|
+
/** Byte-exact equality of two buffers (idempotency checks: "already in the desired state"). */
|
|
18
|
+
export declare function bytesEqual(a: Uint8Array, b: Uint8Array): boolean;
|
|
17
19
|
/** Read a file's bytes, or undefined when it does not exist. */
|
|
18
20
|
export declare function readIfExists(path: string): Promise<Uint8Array | undefined>;
|
|
19
21
|
/**
|
|
@@ -28,6 +28,15 @@ export function resolveInsideHarness(harnessRoot, relPath) {
|
|
|
28
28
|
}
|
|
29
29
|
return target;
|
|
30
30
|
}
|
|
31
|
+
/** Byte-exact equality of two buffers (idempotency checks: "already in the desired state"). */
|
|
32
|
+
export function bytesEqual(a, b) {
|
|
33
|
+
if (a.byteLength !== b.byteLength)
|
|
34
|
+
return false;
|
|
35
|
+
for (let i = 0; i < a.byteLength; i++)
|
|
36
|
+
if (a[i] !== b[i])
|
|
37
|
+
return false;
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
31
40
|
/** Read a file's bytes, or undefined when it does not exist. */
|
|
32
41
|
export async function readIfExists(path) {
|
|
33
42
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs-guard.js","sourceRoot":"","sources":["../../src/appliers/fs-guard.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fs-guard.js","sourceRoot":"","sources":["../../src/appliers/fs-guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,8 +35,9 @@ export const minVersionApplier = {
|
|
|
35
35
|
else {
|
|
36
36
|
summary = `advisory: ${action.tool} ${installed} meets the safe floor ${action.version}`;
|
|
37
37
|
}
|
|
38
|
-
// Never mutates anything, in dryRun or not.
|
|
39
|
-
|
|
38
|
+
// Never mutates anything, in dryRun or not → changed:false always. The advisory text still
|
|
39
|
+
// reaches the human: the pipeline includes this summary in its `unchanged` message.
|
|
40
|
+
return { summary, inverse: NOOP_INVERSE, diffPreview: '(advisory — no change)', changed: false };
|
|
40
41
|
},
|
|
41
42
|
async revert(inverse, _ctx) {
|
|
42
43
|
if (inverse.kind !== 'min_version')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"min-version.js","sourceRoot":"","sources":["../../src/appliers/min-version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAGlD,4FAA4F;AAC5F,MAAM,UAAU,eAAe,CAAC,CAAS,EAAE,CAAS;IAClD,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAChE,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAChE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACxD,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACzC,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;IAC9B,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,YAAY,GAAgB,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAEtE,MAAM,CAAC,MAAM,iBAAiB,GAA8B;IAC1D,IAAI,EAAE,aAAa;IAEnB,KAAK,CAAC,KAAK,CAAC,MAAwB,EAAE,GAAiB;QACrD,MAAM,SAAS,GAAG,GAAG,CAAC,uBAAuB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7D,IAAI,OAAe,CAAC;QACpB,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,GAAG,2CAA2C,MAAM,CAAC,IAAI,gCAAgC,MAAM,CAAC,OAAO,EAAE,CAAC;QACnH,CAAC;aAAM,IAAI,eAAe,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1D,OAAO,GAAG,aAAa,MAAM,CAAC,IAAI,IAAI,SAAS,4BAA4B,MAAM,CAAC,OAAO,aAAa,MAAM,CAAC,IAAI,MAAM,CAAC;QAC1H,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,aAAa,MAAM,CAAC,IAAI,IAAI,SAAS,yBAAyB,MAAM,CAAC,OAAO,EAAE,CAAC;QAC3F,CAAC;QACD,
|
|
1
|
+
{"version":3,"file":"min-version.js","sourceRoot":"","sources":["../../src/appliers/min-version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAGlD,4FAA4F;AAC5F,MAAM,UAAU,eAAe,CAAC,CAAS,EAAE,CAAS;IAClD,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAChE,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAChE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACxD,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACzC,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;IAC9B,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,YAAY,GAAgB,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAEtE,MAAM,CAAC,MAAM,iBAAiB,GAA8B;IAC1D,IAAI,EAAE,aAAa;IAEnB,KAAK,CAAC,KAAK,CAAC,MAAwB,EAAE,GAAiB;QACrD,MAAM,SAAS,GAAG,GAAG,CAAC,uBAAuB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7D,IAAI,OAAe,CAAC;QACpB,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,GAAG,2CAA2C,MAAM,CAAC,IAAI,gCAAgC,MAAM,CAAC,OAAO,EAAE,CAAC;QACnH,CAAC;aAAM,IAAI,eAAe,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1D,OAAO,GAAG,aAAa,MAAM,CAAC,IAAI,IAAI,SAAS,4BAA4B,MAAM,CAAC,OAAO,aAAa,MAAM,CAAC,IAAI,MAAM,CAAC;QAC1H,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,aAAa,MAAM,CAAC,IAAI,IAAI,SAAS,yBAAyB,MAAM,CAAC,OAAO,EAAE,CAAC;QAC3F,CAAC;QACD,2FAA2F;QAC3F,oFAAoF;QACpF,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,wBAAwB,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACnG,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAoB,EAAE,IAAkB;QACnD,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa;YAAE,MAAM,IAAI,kBAAkB,CAAC,wCAAwC,CAAC,CAAC;QAC3G,OAAO,EAAE,OAAO,EAAE,kEAAkE,EAAE,CAAC;IACzF,CAAC;CACF,CAAC"}
|
package/dist/appliers/pin-mcp.js
CHANGED
|
@@ -52,6 +52,7 @@ export const pinMcpApplier = {
|
|
|
52
52
|
summary,
|
|
53
53
|
inverse: { kind: 'pin_mcp', server: ALL_CONFIGURED_MCP, priorVersion: undefined },
|
|
54
54
|
diffPreview: `(audit only) pinned: [${pinned.join(', ')}] unpinned: [${unpinned.join(', ')}]`,
|
|
55
|
+
changed: false, // audit mode never writes — nothing to undo, nothing to re-apply
|
|
55
56
|
};
|
|
56
57
|
}
|
|
57
58
|
const spec = servers[action.server];
|
|
@@ -64,14 +65,23 @@ export const pinMcpApplier = {
|
|
|
64
65
|
}
|
|
65
66
|
const targetVersion = action.version ?? token.version; // no version = pin to current
|
|
66
67
|
const inverse = { kind: 'pin_mcp', server: action.server, priorVersion: token.version };
|
|
68
|
+
// Idempotency: already pinned to exactly the target version → no write, no backup.
|
|
69
|
+
if (targetVersion === token.version) {
|
|
70
|
+
return {
|
|
71
|
+
summary: `MCP server "${action.server}" already pinned to ${token.name}@${targetVersion} (no change)`,
|
|
72
|
+
inverse,
|
|
73
|
+
diffPreview: `(no change) ${token.name}@${targetVersion} already pinned`,
|
|
74
|
+
changed: false,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
67
77
|
const summary = `pinned MCP server "${action.server}" to ${token.name}@${targetVersion} (was @${token.version})`;
|
|
68
78
|
const diffPreview = `- ${token.name}@${token.version}\n+ ${token.name}@${targetVersion}`;
|
|
69
|
-
if (!ctx.dryRun
|
|
79
|
+
if (!ctx.dryRun) {
|
|
70
80
|
inverse.backupRef = await backupFile(ctx.harnessRoot, absPath); // backup BEFORE write
|
|
71
81
|
spec.args[token.index] = `${token.name}@${targetVersion}`;
|
|
72
82
|
await writeJsonConfig(absPath, config);
|
|
73
83
|
}
|
|
74
|
-
return { summary, inverse, diffPreview };
|
|
84
|
+
return { summary, inverse, diffPreview, changed: true };
|
|
75
85
|
},
|
|
76
86
|
async revert(inverse, ctx) {
|
|
77
87
|
if (inverse.kind !== 'pin_mcp')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pin-mcp.js","sourceRoot":"","sources":["../../src/appliers/pin-mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,eAAe,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEjH,8EAA8E;AAC9E,MAAM,CAAC,MAAM,eAAe,GAAG,WAAW,CAAC;AAE3C,qEAAqE;AACrE,MAAM,OAAO,GAAG,yBAAyB,CAAC;AAO1C,8FAA8F;AAC9F,SAAS,aAAa,CAAC,IAAgB;IACrC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAC7D,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,KAAK,IAAI;YAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC;IACnE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAA0B;IAClD,IAAI,EAAE,SAAS;IAEf,KAAK,CAAC,KAAK,CAAC,MAAoB,EAAE,GAAiB;QACjD,MAAM,OAAO,GAAG,oBAAoB,CAAC,GAAG,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QACvE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;QACjE,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,kBAAkB,CAAC,uBAAuB,eAAe,kBAAkB,CAAC,CAAC;QACrG,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,CAA+B,CAAC;QAE3E,IAAI,MAAM,CAAC,MAAM,KAAK,kBAAkB,EAAE,CAAC;YACzC,sFAAsF;YACtF,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;YAC9B,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnD,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrE,CAAC;YACD,MAAM,OAAO,GACX,cAAc,MAAM,CAAC,MAAM,mCAAmC;gBAC9D,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,iCAAiC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtF,OAAO;gBACL,OAAO;gBACP,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,kBAAkB,EAAE,YAAY,EAAE,SAAS,EAAE;gBACjF,WAAW,EAAE,yBAAyB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;
|
|
1
|
+
{"version":3,"file":"pin-mcp.js","sourceRoot":"","sources":["../../src/appliers/pin-mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,6 +21,17 @@ export const setConfigApplier = {
|
|
|
21
21
|
throw new RefusedActionError(`refused set_config: "${action.keypath}" holds a non-scalar value`);
|
|
22
22
|
}
|
|
23
23
|
const priorValue = rawPrior;
|
|
24
|
+
// Idempotency: the keypath already holds the desired scalar → nothing to do. Scalars only
|
|
25
|
+
// (the parser enforces this), so strict equality IS deep equality here. Skip the write AND
|
|
26
|
+
// the backup entirely — repeated polls must not churn the file or mint duplicate reverts.
|
|
27
|
+
if (existed && priorValue === action.value) {
|
|
28
|
+
return {
|
|
29
|
+
summary: `${action.keypath} already ${JSON.stringify(action.value)} in ${action.file} (no change)`,
|
|
30
|
+
inverse: { kind: 'set_config', file: action.file, keypath: action.keypath, priorValue, fileExistedBefore: existed },
|
|
31
|
+
diffPreview: `(no change) ${action.keypath} already ${JSON.stringify(action.value)}`,
|
|
32
|
+
changed: false,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
24
35
|
const inverse = {
|
|
25
36
|
kind: 'set_config',
|
|
26
37
|
file: action.file,
|
|
@@ -41,7 +52,7 @@ export const setConfigApplier = {
|
|
|
41
52
|
setKeypath(config, action.keypath, action.value);
|
|
42
53
|
await writeJsonConfig(absPath, config);
|
|
43
54
|
}
|
|
44
|
-
return { summary, inverse, diffPreview };
|
|
55
|
+
return { summary, inverse, diffPreview, changed: true };
|
|
45
56
|
},
|
|
46
57
|
async revert(inverse, ctx) {
|
|
47
58
|
if (inverse.kind !== 'set_config')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set-config.js","sourceRoot":"","sources":["../../src/appliers/set-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,UAAU,EACV,UAAU,EACV,UAAU,EACV,aAAa,GACd,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAEtC,MAAM,CAAC,MAAM,gBAAgB,GAA6B;IACxD,IAAI,EAAE,YAAY;IAElB,KAAK,CAAC,KAAK,CAAC,MAAuB,EAAE,GAAiB;QACpD,MAAM,OAAO,GAAG,oBAAoB,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QACnE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;QAEjE,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACpD,IAAI,QAAQ,KAAK,SAAS,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC3D,wFAAwF;YACxF,MAAM,IAAI,kBAAkB,CAAC,wBAAwB,MAAM,CAAC,OAAO,4BAA4B,CAAC,CAAC;QACnG,CAAC;QACD,MAAM,UAAU,GAAG,QAAiD,CAAC;QAErE,MAAM,OAAO,GAAgB;YAC3B,IAAI,EAAE,YAAY;YAClB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,UAAU;YACV,iBAAiB,EAAE,OAAO;SAC3B,CAAC;QACF,MAAM,WAAW,GAAG;YAClB,OAAO,MAAM,CAAC,IAAI,EAAE;YACpB,OAAO,MAAM,CAAC,IAAI,EAAE;YACpB,KAAK,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE;YACpD,KAAK,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;SACvD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,OAAO,GAAG,OAAO,MAAM,CAAC,OAAO,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;QAE5F,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,OAAO;gBAAE,OAAO,CAAC,SAAS,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,sBAAsB;YACnG,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YACjD,MAAM,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"set-config.js","sourceRoot":"","sources":["../../src/appliers/set-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,7 +14,7 @@ import { mkdir, rm, writeFile } from 'node:fs/promises';
|
|
|
14
14
|
import { dirname } from 'node:path';
|
|
15
15
|
import { verifyPayloadHash } from '@strongkeep/core';
|
|
16
16
|
import { RefusedActionError } from './applier.js';
|
|
17
|
-
import { resolveInsideHarness, readIfExists, backupFile, restoreBackup } from './fs-guard.js';
|
|
17
|
+
import { resolveInsideHarness, readIfExists, backupFile, restoreBackup, bytesEqual } from './fs-guard.js';
|
|
18
18
|
export const updateRuleFileApplier = {
|
|
19
19
|
type: 'update_rule_file',
|
|
20
20
|
async apply(action, ctx) {
|
|
@@ -39,7 +39,18 @@ export const updateRuleFileApplier = {
|
|
|
39
39
|
if (!check.ok) {
|
|
40
40
|
throw new RefusedActionError(`refused update_rule_file "${action.path}": ${check.reason} — nothing written`);
|
|
41
41
|
}
|
|
42
|
-
const
|
|
42
|
+
const existingBytes = await readIfExists(absPath);
|
|
43
|
+
const existedBefore = existingBytes !== undefined;
|
|
44
|
+
// Idempotency: the rule file is already byte-identical to the (hash-verified) target →
|
|
45
|
+
// nothing to do. Skip the write and the backup; the pipeline logs no undo record for this.
|
|
46
|
+
if (existingBytes !== undefined && bytesEqual(existingBytes, bytes)) {
|
|
47
|
+
return {
|
|
48
|
+
summary: `rule file ${action.path} already up to date (hash-verified, no change)`,
|
|
49
|
+
inverse: { kind: 'update_rule_file', path: action.path, existedBefore },
|
|
50
|
+
diffPreview: `(no change) ${action.path} already matches sha256 ${action.content_hash.slice(0, 12)}…`,
|
|
51
|
+
changed: false,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
43
54
|
const inverse = { kind: 'update_rule_file', path: action.path, existedBefore };
|
|
44
55
|
const summary = `${existedBefore ? 'refreshed' : 'wrote'} rule file ${action.path} (hash-verified)`;
|
|
45
56
|
const diffPreview = `${existedBefore ? '~' : '+'} ${action.path} (${bytes.byteLength} bytes, sha256 ${action.content_hash.slice(0, 12)}…)`;
|
|
@@ -49,7 +60,7 @@ export const updateRuleFileApplier = {
|
|
|
49
60
|
await mkdir(dirname(absPath), { recursive: true });
|
|
50
61
|
await writeFile(absPath, bytes);
|
|
51
62
|
}
|
|
52
|
-
return { summary, inverse, diffPreview };
|
|
63
|
+
return { summary, inverse, diffPreview, changed: true };
|
|
53
64
|
},
|
|
54
65
|
async revert(inverse, ctx) {
|
|
55
66
|
if (inverse.kind !== 'update_rule_file')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-rule-file.js","sourceRoot":"","sources":["../../src/appliers/update-rule-file.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"update-rule-file.js","sourceRoot":"","sources":["../../src/appliers/update-rule-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,8 +3,9 @@
|
|
|
3
3
|
* strongkeep-guard-check — the PreToolUse hook entrypoint that evaluates a tool call against
|
|
4
4
|
* the guard rules, records any fire (metadata only, fires.ndjson), and signals the harness.
|
|
5
5
|
*
|
|
6
|
-
* Reads the Claude Code hook payload as JSON on stdin, extracts the candidate command
|
|
7
|
-
*
|
|
6
|
+
* Reads the Claude Code hook payload as JSON on stdin, extracts the candidate command — ONLY
|
|
7
|
+
* the Bash tool's `tool_input.command`; other tools' payloads are never matched (a scan report
|
|
8
|
+
* that merely MENTIONS "rm -rf" in prose must not trip gr-001) — evaluates it, and:
|
|
8
9
|
* - exits 0 when nothing fires or the strongest action is advise/warn (the call proceeds;
|
|
9
10
|
* a warn prints a one-line reason to stderr),
|
|
10
11
|
* - exits 2 on `block` (Claude Code treats non-zero PreToolUse as "deny the tool call").
|
|
@@ -12,5 +13,10 @@
|
|
|
12
13
|
* It NEVER prints or logs the command itself. The fire log carries rule ids only.
|
|
13
14
|
* Installed into the PreToolUse hook by strongkeep-init alongside the poll hook.
|
|
14
15
|
*/
|
|
15
|
-
/**
|
|
16
|
+
/**
|
|
17
|
+
* Pull the candidate command out of a Claude Code hook payload. The guard rules are shell-
|
|
18
|
+
* command patterns, so ONLY the Bash tool's actual `tool_input.command` is a candidate.
|
|
19
|
+
* Any other tool (or a payload with no string command) yields '' — never a JSON dump of the
|
|
20
|
+
* whole input, which made prose mentioning "rm -rf" in e.g. a Write/report payload trip gr-001.
|
|
21
|
+
*/
|
|
16
22
|
export declare function extractCommand(payload: unknown): string;
|
package/dist/cli/guard-check.js
CHANGED
|
@@ -3,8 +3,9 @@
|
|
|
3
3
|
* strongkeep-guard-check — the PreToolUse hook entrypoint that evaluates a tool call against
|
|
4
4
|
* the guard rules, records any fire (metadata only, fires.ndjson), and signals the harness.
|
|
5
5
|
*
|
|
6
|
-
* Reads the Claude Code hook payload as JSON on stdin, extracts the candidate command
|
|
7
|
-
*
|
|
6
|
+
* Reads the Claude Code hook payload as JSON on stdin, extracts the candidate command — ONLY
|
|
7
|
+
* the Bash tool's `tool_input.command`; other tools' payloads are never matched (a scan report
|
|
8
|
+
* that merely MENTIONS "rm -rf" in prose must not trip gr-001) — evaluates it, and:
|
|
8
9
|
* - exits 0 when nothing fires or the strongest action is advise/warn (the call proceeds;
|
|
9
10
|
* a warn prints a one-line reason to stderr),
|
|
10
11
|
* - exits 2 on `block` (Claude Code treats non-zero PreToolUse as "deny the tool call").
|
|
@@ -25,16 +26,23 @@ async function readStdin() {
|
|
|
25
26
|
chunks.push(chunk);
|
|
26
27
|
return Buffer.concat(chunks).toString('utf8');
|
|
27
28
|
}
|
|
28
|
-
/**
|
|
29
|
+
/**
|
|
30
|
+
* Pull the candidate command out of a Claude Code hook payload. The guard rules are shell-
|
|
31
|
+
* command patterns, so ONLY the Bash tool's actual `tool_input.command` is a candidate.
|
|
32
|
+
* Any other tool (or a payload with no string command) yields '' — never a JSON dump of the
|
|
33
|
+
* whole input, which made prose mentioning "rm -rf" in e.g. a Write/report payload trip gr-001.
|
|
34
|
+
*/
|
|
29
35
|
export function extractCommand(payload) {
|
|
30
36
|
if (typeof payload !== 'object' || payload === null)
|
|
31
37
|
return '';
|
|
32
|
-
const
|
|
38
|
+
const p = payload;
|
|
39
|
+
if (p['tool_name'] !== 'Bash')
|
|
40
|
+
return '';
|
|
41
|
+
const input = p['tool_input'];
|
|
33
42
|
if (typeof input === 'object' && input !== null) {
|
|
34
43
|
const cmd = input['command'];
|
|
35
44
|
if (typeof cmd === 'string')
|
|
36
45
|
return cmd;
|
|
37
|
-
return JSON.stringify(input);
|
|
38
46
|
}
|
|
39
47
|
return '';
|
|
40
48
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guard-check.js","sourceRoot":"","sources":["../../src/cli/guard-check.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"guard-check.js","sourceRoot":"","sources":["../../src/cli/guard-check.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/poll.js
CHANGED
|
@@ -76,7 +76,7 @@ async function main() {
|
|
|
76
76
|
const badge = poll.freshness.state === 'fresh'
|
|
77
77
|
? `feed fresh (verified ${poll.freshness.verifiedAt})`
|
|
78
78
|
: `FEED ${poll.freshness.state.toUpperCase()} since ${poll.freshness.lastGoodAt} — ${poll.freshness.reason}`;
|
|
79
|
-
process.stdout.write([badge, ...summary.messages, `reported ${summary.reported} | staged ${summary.staged} | applied ${summary.applied} | refused ${summary.refused}`].join('\n') + '\n');
|
|
79
|
+
process.stdout.write([badge, ...summary.messages, `reported ${summary.reported} | staged ${summary.staged} | applied ${summary.applied} | unchanged ${summary.unchanged} | refused ${summary.refused}`].join('\n') + '\n');
|
|
80
80
|
// AUTH-REJECTED (HTTP 401/403): a billing/credentials condition, NOT a tamper event.
|
|
81
81
|
// Calm, actionable message + a distinct non-zero exit (3) so callers can tell it apart
|
|
82
82
|
// from success (0) and hard/tamper errors (2). Note: exit 2 would BLOCK the agent's tool
|
package/dist/cli/poll.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"poll.js","sourceRoot":"","sources":["../../src/cli/poll.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"poll.js","sourceRoot":"","sources":["../../src/cli/poll.ts"],"names":[],"mappings":"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"}
|
package/dist/feed-client.js
CHANGED
|
@@ -51,6 +51,11 @@ export class FeedAuthError extends Error {
|
|
|
51
51
|
this.name = 'FeedAuthError';
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
|
+
/** Per-request fetch timeout (ms). Guards against a single stuck connection freezing a poll. */
|
|
55
|
+
const FETCH_TIMEOUT_MS = 20_000;
|
|
56
|
+
/** Max entry fetches in flight at once. Bounds load on the feed host while keeping a cold
|
|
57
|
+
* first poll (empty cache, hundreds of entries) to seconds instead of one-at-a-time minutes. */
|
|
58
|
+
const ENTRY_FETCH_CONCURRENCY = 16;
|
|
54
59
|
/** Fetch bytes from the feed. file:// reads disk (local/test feeds); http(s) uses global fetch. */
|
|
55
60
|
async function fetchBytes(url, token) {
|
|
56
61
|
if (url.startsWith('file://')) {
|
|
@@ -59,7 +64,9 @@ async function fetchBytes(url, token) {
|
|
|
59
64
|
// Only send an authorization header when we actually hold a token; a tokenless client
|
|
60
65
|
// (public-read feed) sends none rather than a bogus "Bearer undefined".
|
|
61
66
|
const headers = typeof token === 'string' && token !== '' ? { authorization: `Bearer ${token}` } : {};
|
|
62
|
-
|
|
67
|
+
// A per-request timeout so one stuck connection can never hang the whole poll (which reads
|
|
68
|
+
// as a freeze during a cold first poll). Node 20+ has AbortSignal.timeout.
|
|
69
|
+
const response = await fetch(url, { headers, signal: AbortSignal.timeout(FETCH_TIMEOUT_MS) });
|
|
63
70
|
// 401/403 = the TOKEN was rejected (billing/credentials), not a broken feed — distinct error.
|
|
64
71
|
if (response.status === 401 || response.status === 403)
|
|
65
72
|
throw new FeedAuthError(response.status);
|
|
@@ -77,17 +84,28 @@ async function verifyAndParse(manifestBytes, getEntryBytes, pinnedKey) {
|
|
|
77
84
|
const sig = verifyManifestSignatureAny(manifest, pinnedSet);
|
|
78
85
|
if (!sig.ok)
|
|
79
86
|
throw new Error(`verification failed: ${sig.code}: ${sig.reason}`);
|
|
80
|
-
|
|
87
|
+
// Fetch + hash-verify entries with bounded concurrency. Results are stored by index so the
|
|
88
|
+
// returned order matches the manifest exactly (deterministic apply), regardless of which
|
|
89
|
+
// fetch finished first. Fail-safe is preserved: any fetch or hash failure rejects, which
|
|
90
|
+
// propagates to pollFeed's catch and falls back to the last-good cache.
|
|
91
|
+
const records = manifest.entries;
|
|
92
|
+
const parsed = new Array(records.length);
|
|
81
93
|
const entryBytes = new Map();
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
94
|
+
let cursor = 0;
|
|
95
|
+
const runWorker = async () => {
|
|
96
|
+
for (let i = cursor++; i < records.length; i = cursor++) {
|
|
97
|
+
const record = records[i];
|
|
98
|
+
const bytes = await getEntryBytes(record.file);
|
|
99
|
+
const hash = verifyEntryHash(bytes, record);
|
|
100
|
+
if (!hash.ok)
|
|
101
|
+
throw new Error(`verification failed: ${hash.code}: ${hash.reason}`);
|
|
102
|
+
parsed[i] = parseEntry(bytes);
|
|
103
|
+
entryBytes.set(record.file, bytes);
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
const workers = Math.min(ENTRY_FETCH_CONCURRENCY, records.length);
|
|
107
|
+
await Promise.all(Array.from({ length: workers }, () => runWorker()));
|
|
108
|
+
return { manifest, entries: parsed, entryBytes };
|
|
91
109
|
}
|
|
92
110
|
/**
|
|
93
111
|
* Poll the feed once: fetch → verify signature → verify per-entry hashes → parse. On ANY
|
package/dist/feed-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feed-client.js","sourceRoot":"","sources":["../src/feed-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAElH,iFAAiF;AACjF,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE5D,gEAAgE;AAChE,MAAM,aAAa,GAAG,WAAW,CAAC;AAClC,2DAA2D;AAC3D,MAAM,gBAAgB,GAAG,iBAAiB,CAAC;AAgD3C;;;;GAIG;AACH,MAAM,OAAO,aAAc,SAAQ,KAAK;IAEjB;IADZ,IAAI,GAAG,eAAwB,CAAC;IACzC,YAAqB,MAAc;QACjC,KAAK,CACH,uDAAuD,MAAM,2BAA2B;YACtF,2FAA2F;YAC3F,sFAAsF;YACtF,mCAAmC,CACtC,CAAC;QANiB,WAAM,GAAN,MAAM,CAAQ;QAOjC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,mGAAmG;AACnG,KAAK,UAAU,UAAU,CAAC,GAAW,EAAE,KAAyB;IAC9D,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,UAAU,CAAC,MAAM,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC;IACD,sFAAsF;IACtF,wEAAwE;IACxE,MAAM,OAAO,GACX,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACxF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"feed-client.js","sourceRoot":"","sources":["../src/feed-client.ts"],"names":[],"mappings":"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"}
|
package/dist/pipeline.d.ts
CHANGED
|
@@ -30,6 +30,13 @@ export interface PipelineRunSummary {
|
|
|
30
30
|
staged: number;
|
|
31
31
|
applied: number;
|
|
32
32
|
refused: number;
|
|
33
|
+
/**
|
|
34
|
+
* Actions whose target was ALREADY in the desired state (ApplyResult.changed === false):
|
|
35
|
+
* nothing written, no undo record logged, no diff staged. This is what makes the pipeline
|
|
36
|
+
* idempotent under the per-tool-call poll hooks — a re-poll of an already-applied entry
|
|
37
|
+
* counts here instead of re-applying and minting duplicate revert ids.
|
|
38
|
+
*/
|
|
39
|
+
unchanged: number;
|
|
33
40
|
/** Plain-language lines for the human (report advisories, refusal reasons, apply summaries). */
|
|
34
41
|
messages: string[];
|
|
35
42
|
}
|
package/dist/pipeline.js
CHANGED
|
@@ -29,7 +29,7 @@ export const PENDING_DIR = 'pending';
|
|
|
29
29
|
* Aggregates per-action failures (refusals) instead of aborting the whole run.
|
|
30
30
|
*/
|
|
31
31
|
export async function runPipeline(entries, config) {
|
|
32
|
-
const summary = { reported: 0, staged: 0, applied: 0, refused: 0, messages: [] };
|
|
32
|
+
const summary = { reported: 0, staged: 0, applied: 0, refused: 0, unchanged: 0, messages: [] };
|
|
33
33
|
for (const entry of entries) {
|
|
34
34
|
const fm = entry.frontmatter;
|
|
35
35
|
for (const action of fm.actions) {
|
|
@@ -44,6 +44,13 @@ export async function runPipeline(entries, config) {
|
|
|
44
44
|
if (disposition === 'stage') {
|
|
45
45
|
// Dry-run computes the diff + inverse without writing anything live.
|
|
46
46
|
const result = await applyAction(action, { ...config.applyCtx, dryRun: true });
|
|
47
|
+
if (!result.changed) {
|
|
48
|
+
// Already in the desired state: staging a diff every poll would pile up redundant
|
|
49
|
+
// pending records. Count it, tell the human, write nothing.
|
|
50
|
+
summary.unchanged++;
|
|
51
|
+
summary.messages.push(`unchanged ${fm.id}: already in effect (${result.summary})`);
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
47
54
|
const record = {
|
|
48
55
|
id: randomUUID(),
|
|
49
56
|
entryId: fm.id,
|
|
@@ -63,6 +70,14 @@ export async function runPipeline(entries, config) {
|
|
|
63
70
|
}
|
|
64
71
|
// apply: the applier writes its out-of-log backup BEFORE the live write.
|
|
65
72
|
const result = await applyAction(action, { ...config.applyCtx, dryRun: false });
|
|
73
|
+
if (!result.changed) {
|
|
74
|
+
// Idempotent re-apply (the poll hooks run on every tool call): the target is already
|
|
75
|
+
// in the desired state, so there is NO new write to undo — logging a record here is
|
|
76
|
+
// what grew testers' undo logs with duplicate reverts. Count it and move on.
|
|
77
|
+
summary.unchanged++;
|
|
78
|
+
summary.messages.push(`unchanged ${fm.id}: already in effect (${result.summary})`);
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
66
81
|
await appendUndoRecord(config.logDir, {
|
|
67
82
|
id: randomUUID(),
|
|
68
83
|
entryId: fm.id,
|
package/dist/pipeline.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@strongkeep/watchdog",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Consumer (subscriber-side) config pack for the AI Security feed (D6 — NOT a daemon). strongkeep-init writes hooks/rules/skill/MCP config into the subscriber's own harness; the feed client verifies + applies signed ConstrainedActions per autonomy tier with a paired undo; strongkeep-revert is one-click self-serve undo.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|