opencode-swarm 6.30.2 → 6.31.1
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/cli/index.js +25 -12
- package/dist/config/schema.d.ts +22 -0
- package/dist/hooks/curator-drift-advisory.test.d.ts +1 -0
- package/dist/hooks/curator-drift.d.ts +1 -1
- package/dist/hooks/delegation-ledger.d.ts +37 -0
- package/dist/hooks/delegation-ledger.test.d.ts +11 -0
- package/dist/hooks/scope-guard-throw-behavior.test.d.ts +15 -0
- package/dist/hooks/scope-guard.adversarial.test.d.ts +1 -0
- package/dist/hooks/scope-guard.d.ts +43 -0
- package/dist/hooks/scope-guard.test.d.ts +14 -0
- package/dist/hooks/self-review.d.ts +14 -0
- package/dist/hooks/self-review.test.d.ts +14 -0
- package/dist/hooks/slop-detector.adversarial.test.d.ts +1 -0
- package/dist/hooks/watchdog.integration.test.d.ts +9 -0
- package/dist/index.js +918 -236
- package/dist/tools/curator-analyze.d.ts +7 -0
- package/dist/tools/curator-analyze.test.d.ts +1 -0
- package/dist/tools/diff.d.ts +2 -2
- package/dist/tools/gitingest.d.ts +2 -2
- package/dist/tools/imports.d.ts +2 -2
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/knowledge-add.d.ts +2 -0
- package/dist/tools/knowledge-recall.d.ts +2 -0
- package/dist/tools/knowledge-remove.d.ts +2 -0
- package/dist/tools/knowledge-tools.integration.test.d.ts +1 -0
- package/dist/tools/lint.d.ts +1 -1
- package/dist/tools/phase-complete.d.ts +1 -1
- package/dist/tools/pre-check-batch.d.ts +1 -1
- package/dist/tools/retrieve-summary.d.ts +2 -2
- package/dist/tools/secretscan.d.ts +2 -2
- package/dist/tools/test-runner.d.ts +1 -1
- package/dist/tools/update-task-status.adversarial.test.d.ts +13 -0
- package/dist/tools/update-task-status.test.d.ts +1 -0
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -18070,6 +18070,15 @@ var GuardrailsConfigSchema = exports_external.object({
|
|
|
18070
18070
|
}).optional(),
|
|
18071
18071
|
profiles: exports_external.record(exports_external.string(), GuardrailsProfileSchema).optional()
|
|
18072
18072
|
});
|
|
18073
|
+
var WatchdogConfigSchema = exports_external.object({
|
|
18074
|
+
scope_guard: exports_external.boolean().default(true),
|
|
18075
|
+
skip_in_turbo: exports_external.boolean().default(false),
|
|
18076
|
+
delegation_ledger: exports_external.boolean().default(true)
|
|
18077
|
+
});
|
|
18078
|
+
var SelfReviewConfigSchema = exports_external.object({
|
|
18079
|
+
enabled: exports_external.boolean().default(true),
|
|
18080
|
+
skip_in_turbo: exports_external.boolean().default(true)
|
|
18081
|
+
});
|
|
18073
18082
|
var ToolFilterConfigSchema = exports_external.object({
|
|
18074
18083
|
enabled: exports_external.boolean().default(true),
|
|
18075
18084
|
overrides: exports_external.record(exports_external.string(), exports_external.array(exports_external.string())).default({})
|
|
@@ -18141,7 +18150,8 @@ var SlopDetectorConfigSchema = exports_external.object({
|
|
|
18141
18150
|
enabled: exports_external.boolean().default(true),
|
|
18142
18151
|
classThreshold: exports_external.number().int().min(1).default(3),
|
|
18143
18152
|
commentStripThreshold: exports_external.number().int().min(1).default(5),
|
|
18144
|
-
diffLineThreshold: exports_external.number().int().min(10).default(200)
|
|
18153
|
+
diffLineThreshold: exports_external.number().int().min(10).default(200),
|
|
18154
|
+
importHygieneThreshold: exports_external.number().int().min(1).default(2)
|
|
18145
18155
|
});
|
|
18146
18156
|
var IncrementalVerifyConfigSchema = exports_external.object({
|
|
18147
18157
|
enabled: exports_external.boolean().default(true),
|
|
@@ -18168,6 +18178,8 @@ var PluginConfigSchema = exports_external.object({
|
|
|
18168
18178
|
gates: GateConfigSchema.optional(),
|
|
18169
18179
|
context_budget: ContextBudgetConfigSchema.optional(),
|
|
18170
18180
|
guardrails: GuardrailsConfigSchema.optional(),
|
|
18181
|
+
watchdog: WatchdogConfigSchema.optional(),
|
|
18182
|
+
self_review: SelfReviewConfigSchema.optional(),
|
|
18171
18183
|
tool_filter: ToolFilterConfigSchema.optional(),
|
|
18172
18184
|
plan_cursor: PlanCursorConfigSchema.optional(),
|
|
18173
18185
|
evidence: EvidenceConfigSchema.optional(),
|
|
@@ -36001,14 +36013,14 @@ function detectAdditionalLinter(cwd) {
|
|
|
36001
36013
|
return null;
|
|
36002
36014
|
}
|
|
36003
36015
|
async function detectAvailableLinter(directory) {
|
|
36004
|
-
const
|
|
36005
|
-
const projectDir = directory
|
|
36016
|
+
const _DETECT_TIMEOUT = 2000;
|
|
36017
|
+
const projectDir = directory || process.cwd();
|
|
36006
36018
|
const isWindows = process.platform === "win32";
|
|
36007
36019
|
const biomeBin = isWindows ? path17.join(projectDir, "node_modules", ".bin", "biome.EXE") : path17.join(projectDir, "node_modules", ".bin", "biome");
|
|
36008
36020
|
const eslintBin = isWindows ? path17.join(projectDir, "node_modules", ".bin", "eslint.cmd") : path17.join(projectDir, "node_modules", ".bin", "eslint");
|
|
36009
36021
|
return _detectAvailableLinter(projectDir, biomeBin, eslintBin);
|
|
36010
36022
|
}
|
|
36011
|
-
async function _detectAvailableLinter(
|
|
36023
|
+
async function _detectAvailableLinter(_projectDir, biomeBin, eslintBin) {
|
|
36012
36024
|
const DETECT_TIMEOUT = 2000;
|
|
36013
36025
|
try {
|
|
36014
36026
|
const biomeProc = Bun.spawn(["npx", "biome", "--version"], {
|
|
@@ -36703,19 +36715,20 @@ function findScannableFiles(dir, excludeExact, excludeGlobs, scanDir, visited, s
|
|
|
36703
36715
|
}
|
|
36704
36716
|
return files;
|
|
36705
36717
|
}
|
|
36706
|
-
var secretscan =
|
|
36718
|
+
var secretscan = createSwarmTool({
|
|
36707
36719
|
description: "Scan directory for potential secrets (API keys, tokens, passwords) using regex patterns and entropy heuristics. Returns metadata-only findings with redacted previews - NEVER returns raw secrets. Excludes common directories (node_modules, .git, dist, etc.) by default. Supports glob patterns (e.g. **/.svelte-kit/**, **/*.test.ts) and reads .secretscanignore at the scan root.",
|
|
36708
36720
|
args: {
|
|
36709
36721
|
directory: tool.schema.string().describe('Directory to scan for secrets (e.g., "." or "./src")'),
|
|
36710
36722
|
exclude: tool.schema.array(tool.schema.string()).optional().describe("Patterns to exclude: plain directory names (e.g. node_modules), relative paths, or globs (e.g. **/.svelte-kit/**, **/*.test.ts). Added to default exclusions.")
|
|
36711
36723
|
},
|
|
36712
|
-
async execute(args,
|
|
36724
|
+
async execute(args, _directory, _ctx) {
|
|
36725
|
+
const typedArgs = args;
|
|
36713
36726
|
let directory;
|
|
36714
36727
|
let exclude;
|
|
36715
36728
|
try {
|
|
36716
|
-
if (
|
|
36717
|
-
directory =
|
|
36718
|
-
exclude =
|
|
36729
|
+
if (typedArgs && typeof typedArgs === "object") {
|
|
36730
|
+
directory = typedArgs.directory;
|
|
36731
|
+
exclude = typedArgs.exclude;
|
|
36719
36732
|
}
|
|
36720
36733
|
} catch {}
|
|
36721
36734
|
if (directory === undefined) {
|
|
@@ -37610,7 +37623,7 @@ function parseTestOutput(framework, output) {
|
|
|
37610
37623
|
return { totals, coveragePercent };
|
|
37611
37624
|
}
|
|
37612
37625
|
async function runTests(framework, scope, files, coverage, timeout_ms, cwd) {
|
|
37613
|
-
const command = buildTestCommand(framework, scope, files, coverage, cwd
|
|
37626
|
+
const command = buildTestCommand(framework, scope, files, coverage, cwd);
|
|
37614
37627
|
if (!command) {
|
|
37615
37628
|
return {
|
|
37616
37629
|
success: false,
|
|
@@ -37635,7 +37648,7 @@ async function runTests(framework, scope, files, coverage, timeout_ms, cwd) {
|
|
|
37635
37648
|
const proc = Bun.spawn(command, {
|
|
37636
37649
|
stdout: "pipe",
|
|
37637
37650
|
stderr: "pipe",
|
|
37638
|
-
cwd
|
|
37651
|
+
cwd
|
|
37639
37652
|
});
|
|
37640
37653
|
const exitPromise = proc.exited;
|
|
37641
37654
|
const timeoutPromise = new Promise((resolve7) => setTimeout(() => {
|
|
@@ -38151,7 +38164,7 @@ async function runLintCheck(dir, linter, timeoutMs) {
|
|
|
38151
38164
|
async function runTestsCheck(_dir, scope, timeoutMs) {
|
|
38152
38165
|
const startTime = Date.now();
|
|
38153
38166
|
try {
|
|
38154
|
-
const result = await runTests("none", scope, [], false, timeoutMs);
|
|
38167
|
+
const result = await runTests("none", scope, [], false, timeoutMs, _dir);
|
|
38155
38168
|
if (!result.success) {
|
|
38156
38169
|
return {
|
|
38157
38170
|
type: "tests",
|
package/dist/config/schema.d.ts
CHANGED
|
@@ -324,6 +324,17 @@ export declare const GuardrailsConfigSchema: z.ZodObject<{
|
|
|
324
324
|
}, z.core.$strip>>>;
|
|
325
325
|
}, z.core.$strip>;
|
|
326
326
|
export type GuardrailsConfig = z.infer<typeof GuardrailsConfigSchema>;
|
|
327
|
+
export declare const WatchdogConfigSchema: z.ZodObject<{
|
|
328
|
+
scope_guard: z.ZodDefault<z.ZodBoolean>;
|
|
329
|
+
skip_in_turbo: z.ZodDefault<z.ZodBoolean>;
|
|
330
|
+
delegation_ledger: z.ZodDefault<z.ZodBoolean>;
|
|
331
|
+
}, z.core.$strip>;
|
|
332
|
+
export type WatchdogConfig = z.infer<typeof WatchdogConfigSchema>;
|
|
333
|
+
export declare const SelfReviewConfigSchema: z.ZodObject<{
|
|
334
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
335
|
+
skip_in_turbo: z.ZodDefault<z.ZodBoolean>;
|
|
336
|
+
}, z.core.$strip>;
|
|
337
|
+
export type SelfReviewConfig = z.infer<typeof SelfReviewConfigSchema>;
|
|
327
338
|
/**
|
|
328
339
|
* Resolves guardrails configuration for a specific agent.
|
|
329
340
|
*
|
|
@@ -430,6 +441,7 @@ export declare const SlopDetectorConfigSchema: z.ZodObject<{
|
|
|
430
441
|
classThreshold: z.ZodDefault<z.ZodNumber>;
|
|
431
442
|
commentStripThreshold: z.ZodDefault<z.ZodNumber>;
|
|
432
443
|
diffLineThreshold: z.ZodDefault<z.ZodNumber>;
|
|
444
|
+
importHygieneThreshold: z.ZodDefault<z.ZodNumber>;
|
|
433
445
|
}, z.core.$strip>;
|
|
434
446
|
export type SlopDetectorConfig = z.infer<typeof SlopDetectorConfigSchema>;
|
|
435
447
|
export declare const IncrementalVerifyConfigSchema: z.ZodObject<{
|
|
@@ -580,6 +592,15 @@ export declare const PluginConfigSchema: z.ZodObject<{
|
|
|
580
592
|
idle_timeout_minutes: z.ZodOptional<z.ZodNumber>;
|
|
581
593
|
}, z.core.$strip>>>;
|
|
582
594
|
}, z.core.$strip>>;
|
|
595
|
+
watchdog: z.ZodOptional<z.ZodObject<{
|
|
596
|
+
scope_guard: z.ZodDefault<z.ZodBoolean>;
|
|
597
|
+
skip_in_turbo: z.ZodDefault<z.ZodBoolean>;
|
|
598
|
+
delegation_ledger: z.ZodDefault<z.ZodBoolean>;
|
|
599
|
+
}, z.core.$strip>>;
|
|
600
|
+
self_review: z.ZodOptional<z.ZodObject<{
|
|
601
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
602
|
+
skip_in_turbo: z.ZodDefault<z.ZodBoolean>;
|
|
603
|
+
}, z.core.$strip>>;
|
|
583
604
|
tool_filter: z.ZodOptional<z.ZodObject<{
|
|
584
605
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
585
606
|
overrides: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>>;
|
|
@@ -722,6 +743,7 @@ export declare const PluginConfigSchema: z.ZodObject<{
|
|
|
722
743
|
classThreshold: z.ZodDefault<z.ZodNumber>;
|
|
723
744
|
commentStripThreshold: z.ZodDefault<z.ZodNumber>;
|
|
724
745
|
diffLineThreshold: z.ZodDefault<z.ZodNumber>;
|
|
746
|
+
importHygieneThreshold: z.ZodDefault<z.ZodNumber>;
|
|
725
747
|
}, z.core.$strip>>;
|
|
726
748
|
incremental_verify: z.ZodOptional<z.ZodObject<{
|
|
727
749
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -19,7 +19,7 @@ export declare function writeDriftReport(directory: string, report: DriftReport)
|
|
|
19
19
|
* On any error: emits 'curator.error' event and returns a safe default result.
|
|
20
20
|
* NEVER throws — drift failures must not block phase_complete.
|
|
21
21
|
*/
|
|
22
|
-
export declare function runCriticDriftCheck(directory: string, phase: number, curatorResult: CuratorPhaseResult, config: CuratorConfig): Promise<CriticDriftResult>;
|
|
22
|
+
export declare function runCriticDriftCheck(directory: string, phase: number, curatorResult: CuratorPhaseResult, config: CuratorConfig, injectAdvisory?: (message: string) => void): Promise<CriticDriftResult>;
|
|
23
23
|
/**
|
|
24
24
|
* Build a truncated summary suitable for architect context injection.
|
|
25
25
|
* Format: "<drift_report>Phase N: {alignment} ({drift_score}) — {key finding}. {correction if any}.</drift_report>"
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DELEGATION LEDGER (v6.31 Task 3.2)
|
|
3
|
+
*
|
|
4
|
+
* tool.execute.after hook that maintains a per-session in-memory ledger of tool calls
|
|
5
|
+
* made during a delegation. When the architect session receives a message (resume),
|
|
6
|
+
* injects a compact DELEGATION SUMMARY via pendingAdvisoryMessages.
|
|
7
|
+
*
|
|
8
|
+
* No file I/O — fully in-memory.
|
|
9
|
+
*/
|
|
10
|
+
export interface LedgerEntry {
|
|
11
|
+
agent: string;
|
|
12
|
+
tool: string;
|
|
13
|
+
file?: string;
|
|
14
|
+
duration_ms: number;
|
|
15
|
+
success: boolean;
|
|
16
|
+
timestamp: number;
|
|
17
|
+
}
|
|
18
|
+
export interface DelegationLedgerConfig {
|
|
19
|
+
enabled: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Creates the delegation ledger hook pair (toolAfter + summary injection).
|
|
23
|
+
*/
|
|
24
|
+
export declare function createDelegationLedgerHook(config: Partial<DelegationLedgerConfig>, _directory: string, // reserved for future use
|
|
25
|
+
injectAdvisory: (sessionId: string, message: string) => void): {
|
|
26
|
+
toolAfter: (input: {
|
|
27
|
+
tool: string;
|
|
28
|
+
sessionID: string;
|
|
29
|
+
callID: string;
|
|
30
|
+
args?: Record<string, unknown>;
|
|
31
|
+
}, output: {
|
|
32
|
+
title: string;
|
|
33
|
+
output: string;
|
|
34
|
+
metadata: unknown;
|
|
35
|
+
}) => Promise<void>;
|
|
36
|
+
onArchitectResume: (sessionId: string) => void;
|
|
37
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* delegation-ledger.test.ts
|
|
3
|
+
*
|
|
4
|
+
* Tests for delegation-ledger hook (Task 3.2):
|
|
5
|
+
* 1. toolAfter records entries in ledgerBySession
|
|
6
|
+
* 2. onArchitectResume generates DELEGATION SUMMARY when non-architect tool calls exist
|
|
7
|
+
* 3. onArchitectResume is no-op when no entries exist
|
|
8
|
+
* 4. Success is false when output starts with 'Error:'
|
|
9
|
+
* 5. Success is true for normal output
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smoke test: documents the confirmed behavior that tool.execute.before hook
|
|
3
|
+
* throws propagate as tool rejection, not session crash.
|
|
4
|
+
*
|
|
5
|
+
* VERIFIED from src/hooks/guardrails.ts existing patterns:
|
|
6
|
+
* - Loop circuit breaker (count >= 5): throw new Error('CIRCUIT BREAKER...')
|
|
7
|
+
* - Full test suite block: throw new Error('BLOCKED: Full test suite...')
|
|
8
|
+
* - Plan state violation: throw new Error('PLAN STATE VIOLATION...')
|
|
9
|
+
* All throw in toolBefore, and the plugin propagates as tool rejection.
|
|
10
|
+
*
|
|
11
|
+
* SAFE MECHANISM for scope-guard.ts:
|
|
12
|
+
* throw new Error(`SCOPE VIOLATION: [agent] attempted to modify [file] not in task [id] scope`)
|
|
13
|
+
* This is the CORRECT blocking pattern. DO NOT use return-value signals.
|
|
14
|
+
*/
|
|
15
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SCOPE GUARD (v6.31 Task 3.1)
|
|
3
|
+
*
|
|
4
|
+
* CONFIRMED THROW MECHANISM: throwing in tool.execute.before propagates as tool rejection,
|
|
5
|
+
* NOT as session crash. Verified from guardrails.ts multiple existing throw sites.
|
|
6
|
+
* Safe blocking pattern: throw new Error(`SCOPE VIOLATION: ...`)
|
|
7
|
+
*
|
|
8
|
+
* Fires BEFORE write/edit tools execute. When a non-architect agent attempts to
|
|
9
|
+
* modify a file outside the declared task scope, blocks the call and injects an advisory.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Configuration for scope guard behavior.
|
|
13
|
+
*/
|
|
14
|
+
export interface ScopeGuardConfig {
|
|
15
|
+
/** Whether scope guard is enabled (default: true) */
|
|
16
|
+
enabled: boolean;
|
|
17
|
+
/** Whether to skip in turbo mode (default: false — NOT skippable by design) */
|
|
18
|
+
skip_in_turbo: boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Creates the scope-guard hook that blocks out-of-scope writes.
|
|
22
|
+
* @param config - ScopeGuardConfig (enabled, skip_in_turbo)
|
|
23
|
+
* @param _directory - The workspace directory (reserved for future use)
|
|
24
|
+
* @param injectAdvisory - Optional callback to push advisory to architect session
|
|
25
|
+
*/
|
|
26
|
+
export declare function createScopeGuardHook(config: Partial<ScopeGuardConfig>, _directory: string, injectAdvisory?: (sessionId: string, message: string) => void): {
|
|
27
|
+
toolBefore: (input: {
|
|
28
|
+
tool: string;
|
|
29
|
+
sessionID: string;
|
|
30
|
+
callID: string;
|
|
31
|
+
}, output: {
|
|
32
|
+
args: unknown;
|
|
33
|
+
}) => Promise<void>;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Check if a file path is within declared scope entries.
|
|
37
|
+
* Handles exact match and directory containment.
|
|
38
|
+
*
|
|
39
|
+
* @param filePath - The file path to check
|
|
40
|
+
* @param scopeEntries - Array of declared scope entries (files or directories)
|
|
41
|
+
* @returns true if the file is within scope, false otherwise
|
|
42
|
+
*/
|
|
43
|
+
export declare function isFileInScope(filePath: string, scopeEntries: string[]): boolean;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scope-guard.test.ts
|
|
3
|
+
*
|
|
4
|
+
* Tests for scope-guard hook (Task 3.1):
|
|
5
|
+
* 1. Returns early (no throw) when guard is disabled (config.enabled = false)
|
|
6
|
+
* 2. Returns early when tool is not in WRITE_TOOLS set (e.g., 'read')
|
|
7
|
+
* 3. Returns early when session is the architect (agentName = 'Architect')
|
|
8
|
+
* 4. Returns early when declaredCoderScope is null (no scope declared)
|
|
9
|
+
* 5. Throws 'SCOPE VIOLATION' when non-architect writes file outside declared scope
|
|
10
|
+
* 6. Does NOT throw when non-architect writes file INSIDE declared scope
|
|
11
|
+
* 7. Sanitizes path with \r\n to prevent log injection (SEC-1 fix)
|
|
12
|
+
* 8. isFileInScope correctly handles exact match and directory containment
|
|
13
|
+
*/
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface SelfReviewConfig {
|
|
2
|
+
enabled: boolean;
|
|
3
|
+
skip_in_turbo: boolean;
|
|
4
|
+
}
|
|
5
|
+
export declare function createSelfReviewHook(config: Partial<SelfReviewConfig>, injectAdvisory: (sessionId: string, message: string) => void): {
|
|
6
|
+
toolAfter: (input: {
|
|
7
|
+
tool: string;
|
|
8
|
+
sessionID: string;
|
|
9
|
+
callID: string;
|
|
10
|
+
}, output: {
|
|
11
|
+
args?: Record<string, unknown>;
|
|
12
|
+
output?: unknown;
|
|
13
|
+
}) => Promise<void>;
|
|
14
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* self-review.test.ts
|
|
3
|
+
*
|
|
4
|
+
* Tests for self-review hook (Task 4.1):
|
|
5
|
+
* 1. Advisory injected when architect calls update_task_status with status=in_progress
|
|
6
|
+
* 2. NOT injected when status=completed (not in_progress)
|
|
7
|
+
* 3. NOT injected when calling session is not architect
|
|
8
|
+
* 4. Turbo-skip: NOT injected when session.turboMode=true and skip_in_turbo=true
|
|
9
|
+
* 5. Disabled: NOT injected when enabled=false
|
|
10
|
+
* 6. Advisory text contains self-review focus items
|
|
11
|
+
* 7. injectAdvisory errors are caught (non-blocking)
|
|
12
|
+
* 8. No advisory for other tools (not update_task_status)
|
|
13
|
+
*/
|
|
14
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WATCHDOG INTEGRATION TEST (v6.31 Task 3.5)
|
|
3
|
+
*
|
|
4
|
+
* Integration test covering coordinated watchdog behaviour across:
|
|
5
|
+
* - scope-guard (3.1): toolBefore hook blocks out-of-scope writes by throwing
|
|
6
|
+
* - delegation-ledger (3.2): toolAfter hook records tool calls, onArchitectResume generates DELEGATION SUMMARY
|
|
7
|
+
* - loop-detector enhancement (3.3): at count=3, structured escalation message includes loop pattern + accomplishment + alternative suggestion
|
|
8
|
+
*/
|
|
9
|
+
export {};
|