@aiassesstech/nole 0.4.15 → 0.6.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.
- package/agent/AGENTS.md +18 -0
- package/dist/intel/intel-store.d.ts +62 -0
- package/dist/intel/intel-store.d.ts.map +1 -0
- package/dist/intel/intel-store.js +242 -0
- package/dist/intel/intel-store.js.map +1 -0
- package/dist/intel/provenance.d.ts +16 -0
- package/dist/intel/provenance.d.ts.map +1 -0
- package/dist/intel/provenance.js +23 -0
- package/dist/intel/provenance.js.map +1 -0
- package/dist/intel/sensitivity-scanner.d.ts +25 -0
- package/dist/intel/sensitivity-scanner.d.ts.map +1 -0
- package/dist/intel/sensitivity-scanner.js +37 -0
- package/dist/intel/sensitivity-scanner.js.map +1 -0
- package/dist/pipeline/prospect-store.js +2 -2
- package/dist/pipeline/prospect-store.js.map +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +53 -30
- package/dist/plugin.js.map +1 -1
- package/dist/resilience/circuit-breaker.d.ts +46 -0
- package/dist/resilience/circuit-breaker.d.ts.map +1 -0
- package/dist/resilience/circuit-breaker.js +102 -0
- package/dist/resilience/circuit-breaker.js.map +1 -0
- package/dist/resilience/index.d.ts +8 -0
- package/dist/resilience/index.d.ts.map +1 -0
- package/dist/resilience/index.js +8 -0
- package/dist/resilience/index.js.map +1 -0
- package/dist/resilience/post-queue.d.ts +41 -0
- package/dist/resilience/post-queue.d.ts.map +1 -0
- package/dist/resilience/post-queue.js +106 -0
- package/dist/resilience/post-queue.js.map +1 -0
- package/dist/resilience/queue-drain.d.ts +35 -0
- package/dist/resilience/queue-drain.d.ts.map +1 -0
- package/dist/resilience/queue-drain.js +92 -0
- package/dist/resilience/queue-drain.js.map +1 -0
- package/dist/resilience/resilient-client.d.ts +54 -0
- package/dist/resilience/resilient-client.d.ts.map +1 -0
- package/dist/resilience/resilient-client.js +120 -0
- package/dist/resilience/resilient-client.js.map +1 -0
- package/dist/resilience/retry.d.ts +22 -0
- package/dist/resilience/retry.d.ts.map +1 -0
- package/dist/resilience/retry.js +68 -0
- package/dist/resilience/retry.js.map +1 -0
- package/dist/resilience/service-configs.d.ts +14 -0
- package/dist/resilience/service-configs.d.ts.map +1 -0
- package/dist/resilience/service-configs.js +45 -0
- package/dist/resilience/service-configs.js.map +1 -0
- package/dist/resilience/service-registry.d.ts +39 -0
- package/dist/resilience/service-registry.d.ts.map +1 -0
- package/dist/resilience/service-registry.js +82 -0
- package/dist/resilience/service-registry.js.map +1 -0
- package/dist/store/json-store.d.ts.map +1 -1
- package/dist/store/json-store.js +6 -7
- package/dist/store/json-store.js.map +1 -1
- package/dist/tools/nole-intel.d.ts +53 -0
- package/dist/tools/nole-intel.d.ts.map +1 -0
- package/dist/tools/nole-intel.js +178 -0
- package/dist/tools/nole-intel.js.map +1 -0
- package/openclaw.plugin.json +15 -7
- package/package.json +3 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/resilience/retry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAED,eAAO,MAAM,oBAAoB,EAAE,WAOlC,CAAC;AAEF,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,CAK3E;AAED,wBAAgB,WAAW,CACzB,aAAa,EAAE,MAAM,GAAG,KAAK,EAC7B,MAAM,EAAE,WAAW,GAClB,OAAO,CAkBT;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,GAAG,IAAI,CAkB1F;AAED,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAYrE"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry logic — exponential backoff with jitter, Retry-After support.
|
|
3
|
+
*
|
|
4
|
+
* Retry is separate from the circuit breaker: the breaker decides whether
|
|
5
|
+
* to attempt at all, retry decides how many times to reattempt on failure.
|
|
6
|
+
*
|
|
7
|
+
* @see SPEC-nole-operational-resilience.md §4
|
|
8
|
+
*/
|
|
9
|
+
export const DEFAULT_RETRY_CONFIG = {
|
|
10
|
+
maxRetries: 3,
|
|
11
|
+
baseDelayMs: 1_000,
|
|
12
|
+
maxDelayMs: 30_000,
|
|
13
|
+
jitterFactor: 0.25,
|
|
14
|
+
retryableStatusCodes: [429, 500, 502, 503, 504],
|
|
15
|
+
retryOnNetworkError: true,
|
|
16
|
+
};
|
|
17
|
+
export function calculateDelay(attempt, config) {
|
|
18
|
+
const exponentialDelay = config.baseDelayMs * Math.pow(2, attempt);
|
|
19
|
+
const cappedDelay = Math.min(exponentialDelay, config.maxDelayMs);
|
|
20
|
+
const jitter = cappedDelay * config.jitterFactor * (Math.random() * 2 - 1);
|
|
21
|
+
return Math.max(0, Math.round(cappedDelay + jitter));
|
|
22
|
+
}
|
|
23
|
+
export function isRetryable(statusOrError, config) {
|
|
24
|
+
if (typeof statusOrError === 'number') {
|
|
25
|
+
return config.retryableStatusCodes.includes(statusOrError);
|
|
26
|
+
}
|
|
27
|
+
if (!config.retryOnNetworkError)
|
|
28
|
+
return false;
|
|
29
|
+
const msg = statusOrError.message.toLowerCase();
|
|
30
|
+
return (msg.includes('econnrefused') ||
|
|
31
|
+
msg.includes('econnreset') ||
|
|
32
|
+
msg.includes('etimedout') ||
|
|
33
|
+
msg.includes('enotfound') ||
|
|
34
|
+
msg.includes('epipe') ||
|
|
35
|
+
msg.includes('socket hang up') ||
|
|
36
|
+
msg.includes('fetch failed') ||
|
|
37
|
+
msg.includes('abort'));
|
|
38
|
+
}
|
|
39
|
+
export function extractRetryAfter(headers) {
|
|
40
|
+
const value = headers instanceof Headers
|
|
41
|
+
? headers.get('retry-after')
|
|
42
|
+
: headers['retry-after'];
|
|
43
|
+
if (!value)
|
|
44
|
+
return null;
|
|
45
|
+
const seconds = parseInt(value, 10);
|
|
46
|
+
if (!isNaN(seconds)) {
|
|
47
|
+
return seconds * 1000;
|
|
48
|
+
}
|
|
49
|
+
const date = new Date(value);
|
|
50
|
+
if (!isNaN(date.getTime())) {
|
|
51
|
+
return Math.max(0, date.getTime() - Date.now());
|
|
52
|
+
}
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
export function sleep(ms, signal) {
|
|
56
|
+
return new Promise((resolve, reject) => {
|
|
57
|
+
if (signal?.aborted) {
|
|
58
|
+
reject(new Error('Aborted'));
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const timer = setTimeout(resolve, ms);
|
|
62
|
+
signal?.addEventListener('abort', () => {
|
|
63
|
+
clearTimeout(timer);
|
|
64
|
+
reject(new Error('Aborted'));
|
|
65
|
+
}, { once: true });
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/resilience/retry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-service circuit breaker configurations.
|
|
3
|
+
*
|
|
4
|
+
* Each service has different failure characteristics — these configs
|
|
5
|
+
* are tuned to match expected behavior and recovery patterns.
|
|
6
|
+
*
|
|
7
|
+
* @see SPEC-nole-operational-resilience.md §3.3
|
|
8
|
+
*/
|
|
9
|
+
import type { CircuitBreakerConfig } from './circuit-breaker.js';
|
|
10
|
+
export declare const PLATFORM_API_BREAKER: Omit<CircuitBreakerConfig, 'onStateChange'>;
|
|
11
|
+
export declare const X_API_BREAKER: Omit<CircuitBreakerConfig, 'onStateChange'>;
|
|
12
|
+
export declare const MOLTBOOK_API_BREAKER: Omit<CircuitBreakerConfig, 'onStateChange'>;
|
|
13
|
+
export declare const BLOCKCHAIN_BREAKER: Omit<CircuitBreakerConfig, 'onStateChange'>;
|
|
14
|
+
//# sourceMappingURL=service-configs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-configs.d.ts","sourceRoot":"","sources":["../../src/resilience/service-configs.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,eAAO,MAAM,oBAAoB,EAAE,IAAI,CAAC,oBAAoB,EAAE,eAAe,CAQ5E,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,IAAI,CAAC,oBAAoB,EAAE,eAAe,CAQrE,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,IAAI,CAAC,oBAAoB,EAAE,eAAe,CAQ5E,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,IAAI,CAAC,oBAAoB,EAAE,eAAe,CAQ1E,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-service circuit breaker configurations.
|
|
3
|
+
*
|
|
4
|
+
* Each service has different failure characteristics — these configs
|
|
5
|
+
* are tuned to match expected behavior and recovery patterns.
|
|
6
|
+
*
|
|
7
|
+
* @see SPEC-nole-operational-resilience.md §3.3
|
|
8
|
+
*/
|
|
9
|
+
export const PLATFORM_API_BREAKER = {
|
|
10
|
+
name: 'platform-api',
|
|
11
|
+
failureThreshold: 3,
|
|
12
|
+
failureWindowMs: 60_000,
|
|
13
|
+
cooldownMs: 30_000,
|
|
14
|
+
maxCooldownMs: 5 * 60_000,
|
|
15
|
+
cooldownMultiplier: 2,
|
|
16
|
+
failureStatusCodes: [500, 502, 503, 504],
|
|
17
|
+
};
|
|
18
|
+
export const X_API_BREAKER = {
|
|
19
|
+
name: 'x-twitter',
|
|
20
|
+
failureThreshold: 5,
|
|
21
|
+
failureWindowMs: 5 * 60_000,
|
|
22
|
+
cooldownMs: 2 * 60_000,
|
|
23
|
+
maxCooldownMs: 30 * 60_000,
|
|
24
|
+
cooldownMultiplier: 2,
|
|
25
|
+
failureStatusCodes: [500, 502, 503, 504],
|
|
26
|
+
};
|
|
27
|
+
export const MOLTBOOK_API_BREAKER = {
|
|
28
|
+
name: 'moltbook',
|
|
29
|
+
failureThreshold: 3,
|
|
30
|
+
failureWindowMs: 2 * 60_000,
|
|
31
|
+
cooldownMs: 60_000,
|
|
32
|
+
maxCooldownMs: 10 * 60_000,
|
|
33
|
+
cooldownMultiplier: 2,
|
|
34
|
+
failureStatusCodes: [500, 502, 503, 504],
|
|
35
|
+
};
|
|
36
|
+
export const BLOCKCHAIN_BREAKER = {
|
|
37
|
+
name: 'blockchain',
|
|
38
|
+
failureThreshold: 5,
|
|
39
|
+
failureWindowMs: 10 * 60_000,
|
|
40
|
+
cooldownMs: 5 * 60_000,
|
|
41
|
+
maxCooldownMs: 60 * 60_000,
|
|
42
|
+
cooldownMultiplier: 2,
|
|
43
|
+
failureStatusCodes: [500, 502, 503, 504],
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=service-configs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-configs.js","sourceRoot":"","sources":["../../src/resilience/service-configs.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,MAAM,CAAC,MAAM,oBAAoB,GAAgD;IAC/E,IAAI,EAAE,cAAc;IACpB,gBAAgB,EAAE,CAAC;IACnB,eAAe,EAAE,MAAM;IACvB,UAAU,EAAE,MAAM;IAClB,aAAa,EAAE,CAAC,GAAG,MAAM;IACzB,kBAAkB,EAAE,CAAC;IACrB,kBAAkB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;CACzC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAgD;IACxE,IAAI,EAAE,WAAW;IACjB,gBAAgB,EAAE,CAAC;IACnB,eAAe,EAAE,CAAC,GAAG,MAAM;IAC3B,UAAU,EAAE,CAAC,GAAG,MAAM;IACtB,aAAa,EAAE,EAAE,GAAG,MAAM;IAC1B,kBAAkB,EAAE,CAAC;IACrB,kBAAkB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;CACzC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAgD;IAC/E,IAAI,EAAE,UAAU;IAChB,gBAAgB,EAAE,CAAC;IACnB,eAAe,EAAE,CAAC,GAAG,MAAM;IAC3B,UAAU,EAAE,MAAM;IAClB,aAAa,EAAE,EAAE,GAAG,MAAM;IAC1B,kBAAkB,EAAE,CAAC;IACrB,kBAAkB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;CACzC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAgD;IAC7E,IAAI,EAAE,YAAY;IAClB,gBAAgB,EAAE,CAAC;IACnB,eAAe,EAAE,EAAE,GAAG,MAAM;IAC5B,UAAU,EAAE,CAAC,GAAG,MAAM;IACtB,aAAa,EAAE,EAAE,GAAG,MAAM;IAC1B,kBAAkB,EAAE,CAAC;IACrB,kBAAkB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;CACzC,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service Registry — Degraded-mode management.
|
|
3
|
+
*
|
|
4
|
+
* Tracks which external services are healthy, degraded, or down.
|
|
5
|
+
* Nole's business logic queries this to adapt behavior.
|
|
6
|
+
* Writes a status file that Mighty Mark can read (read-only contract).
|
|
7
|
+
*
|
|
8
|
+
* @see SPEC-nole-operational-resilience.md §6
|
|
9
|
+
*/
|
|
10
|
+
import type { ResilientClient } from './resilient-client.js';
|
|
11
|
+
export type ServiceHealth = 'healthy' | 'degraded' | 'down';
|
|
12
|
+
export interface ServiceStatus {
|
|
13
|
+
name: string;
|
|
14
|
+
health: ServiceHealth;
|
|
15
|
+
circuitState: string;
|
|
16
|
+
failureCount: number;
|
|
17
|
+
lastSuccessfulCall: number | null;
|
|
18
|
+
lastFailedCall: number | null;
|
|
19
|
+
recentErrors: string[];
|
|
20
|
+
}
|
|
21
|
+
export interface RegistrySnapshot {
|
|
22
|
+
timestamp: number;
|
|
23
|
+
overallHealth: ServiceHealth;
|
|
24
|
+
services: Record<string, ServiceStatus>;
|
|
25
|
+
}
|
|
26
|
+
export declare class ServiceRegistry {
|
|
27
|
+
private clients;
|
|
28
|
+
private lastSuccess;
|
|
29
|
+
private lastFailure;
|
|
30
|
+
register(client: ResilientClient): void;
|
|
31
|
+
recordSuccess(serviceName: string): void;
|
|
32
|
+
recordFailure(serviceName: string): void;
|
|
33
|
+
getHealth(serviceName: string): ServiceHealth;
|
|
34
|
+
getOverallHealth(): ServiceHealth;
|
|
35
|
+
getSnapshot(): RegistrySnapshot;
|
|
36
|
+
writeStatusFile(dataDir: string): Promise<void>;
|
|
37
|
+
isAvailable(serviceName: string): boolean;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=service-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-registry.d.ts","sourceRoot":"","sources":["../../src/resilience/service-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,aAAa,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CACzC;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,WAAW,CAA6B;IAEhD,QAAQ,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAIvC,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAIxC,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAIxC,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa;IAc7C,gBAAgB,IAAI,aAAa;IAUjC,WAAW,IAAI,gBAAgB;IAuBzB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAerD,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;CAG1C"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service Registry — Degraded-mode management.
|
|
3
|
+
*
|
|
4
|
+
* Tracks which external services are healthy, degraded, or down.
|
|
5
|
+
* Nole's business logic queries this to adapt behavior.
|
|
6
|
+
* Writes a status file that Mighty Mark can read (read-only contract).
|
|
7
|
+
*
|
|
8
|
+
* @see SPEC-nole-operational-resilience.md §6
|
|
9
|
+
*/
|
|
10
|
+
import fs from 'node:fs';
|
|
11
|
+
import path from 'node:path';
|
|
12
|
+
export class ServiceRegistry {
|
|
13
|
+
clients = new Map();
|
|
14
|
+
lastSuccess = new Map();
|
|
15
|
+
lastFailure = new Map();
|
|
16
|
+
register(client) {
|
|
17
|
+
this.clients.set(client.serviceName, client);
|
|
18
|
+
}
|
|
19
|
+
recordSuccess(serviceName) {
|
|
20
|
+
this.lastSuccess.set(serviceName, Date.now());
|
|
21
|
+
}
|
|
22
|
+
recordFailure(serviceName) {
|
|
23
|
+
this.lastFailure.set(serviceName, Date.now());
|
|
24
|
+
}
|
|
25
|
+
getHealth(serviceName) {
|
|
26
|
+
const client = this.clients.get(serviceName);
|
|
27
|
+
if (!client)
|
|
28
|
+
return 'down';
|
|
29
|
+
const status = client.getCircuitStatus();
|
|
30
|
+
switch (status.state) {
|
|
31
|
+
case 'open': return 'down';
|
|
32
|
+
case 'half-open': return 'degraded';
|
|
33
|
+
case 'closed':
|
|
34
|
+
return status.failureCount > 0 ? 'degraded' : 'healthy';
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
getOverallHealth() {
|
|
38
|
+
let worst = 'healthy';
|
|
39
|
+
for (const [name] of this.clients) {
|
|
40
|
+
const health = this.getHealth(name);
|
|
41
|
+
if (health === 'down')
|
|
42
|
+
return 'down';
|
|
43
|
+
if (health === 'degraded')
|
|
44
|
+
worst = 'degraded';
|
|
45
|
+
}
|
|
46
|
+
return worst;
|
|
47
|
+
}
|
|
48
|
+
getSnapshot() {
|
|
49
|
+
const services = {};
|
|
50
|
+
for (const [name, client] of this.clients) {
|
|
51
|
+
const circuit = client.getCircuitStatus();
|
|
52
|
+
services[name] = {
|
|
53
|
+
name,
|
|
54
|
+
health: this.getHealth(name),
|
|
55
|
+
circuitState: circuit.state,
|
|
56
|
+
failureCount: circuit.failureCount,
|
|
57
|
+
lastSuccessfulCall: this.lastSuccess.get(name) ?? null,
|
|
58
|
+
lastFailedCall: this.lastFailure.get(name) ?? null,
|
|
59
|
+
recentErrors: circuit.recentFailures,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
timestamp: Date.now(),
|
|
64
|
+
overallHealth: this.getOverallHealth(),
|
|
65
|
+
services,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
async writeStatusFile(dataDir) {
|
|
69
|
+
const snapshot = this.getSnapshot();
|
|
70
|
+
const statusPath = path.join(dataDir, 'service-health.json');
|
|
71
|
+
try {
|
|
72
|
+
await fs.promises.writeFile(statusPath, JSON.stringify(snapshot, null, 2), 'utf-8');
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// Non-fatal — status file is informational
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
isAvailable(serviceName) {
|
|
79
|
+
return this.getHealth(serviceName) !== 'down';
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=service-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-registry.js","sourceRoot":"","sources":["../../src/resilience/service-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-store.d.ts","sourceRoot":"","sources":["../../src/store/json-store.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"json-store.d.ts","sourceRoot":"","sources":["../../src/store/json-store.ts"],"names":[],"mappings":"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"}
|
package/dist/store/json-store.js
CHANGED
|
@@ -56,7 +56,7 @@ export class JsonNoleStore {
|
|
|
56
56
|
async saveGovernanceResult(result) {
|
|
57
57
|
await this.writeJson(join('governance', 'results', `${result.proposalId}.json`), result);
|
|
58
58
|
await this.writeMemory({
|
|
59
|
-
type: 'governance
|
|
59
|
+
type: 'governance',
|
|
60
60
|
tags: ['governance', result.finalOutcome, result.proposal.riskLevel],
|
|
61
61
|
title: `Governance Decision: ${result.finalOutcome} — ${result.proposalId}`,
|
|
62
62
|
body: `Proposal \`${result.proposalId}\` resulted in **${result.finalOutcome}**.\n\nRisk level: ${result.proposal.riskLevel}`,
|
|
@@ -92,8 +92,8 @@ export class JsonNoleStore {
|
|
|
92
92
|
async saveVetoRecord(record) {
|
|
93
93
|
await this.writeJson(join('governance', 'vetoes', `${record.proposalId}.json`), record);
|
|
94
94
|
await this.writeMemory({
|
|
95
|
-
type: '
|
|
96
|
-
tags: ['veto', record.actionType, record.proposalId],
|
|
95
|
+
type: 'governance',
|
|
96
|
+
tags: ['governance', 'veto', record.actionType, record.proposalId],
|
|
97
97
|
title: `Veto: ${record.proposalId}`,
|
|
98
98
|
body: `Proposal \`${record.proposalId}\` was vetoed.\n\nExplanation: ${record.explanation}\nAction type: ${record.actionType}`,
|
|
99
99
|
metadata: { actionType: record.actionType },
|
|
@@ -141,7 +141,7 @@ export class JsonNoleStore {
|
|
|
141
141
|
async saveAssessmentRecord(record) {
|
|
142
142
|
await this.writeJson(join('assessments', `${record.id}.json`), record);
|
|
143
143
|
await this.writeMemory({
|
|
144
|
-
type: '
|
|
144
|
+
type: 'assessment',
|
|
145
145
|
tags: ['assessment', record.trigger.type, record.id],
|
|
146
146
|
title: `Assessment Record: ${record.id}`,
|
|
147
147
|
body: `Assessment \`${record.id}\` triggered by **${record.trigger.type}**.\n\nGrillo archetype: ${record.grilloResult.archetype}`,
|
|
@@ -158,7 +158,7 @@ export class JsonNoleStore {
|
|
|
158
158
|
async savePublishedScore(score) {
|
|
159
159
|
await this.writeJson(join('scores', `${score.date}.json`), score);
|
|
160
160
|
await this.writeMemory({
|
|
161
|
-
type: '
|
|
161
|
+
type: 'financial',
|
|
162
162
|
tags: ['score', 'daily', score.date],
|
|
163
163
|
title: `Daily Score Published: ${score.date}`,
|
|
164
164
|
body: `Nole published daily score for **${score.date}**.`,
|
|
@@ -170,9 +170,8 @@ export class JsonNoleStore {
|
|
|
170
170
|
// --- Social Interactions ---
|
|
171
171
|
async saveSocialInteraction(interaction) {
|
|
172
172
|
await this.writeJson(join('social', 'interactions', `${interaction.id}.json`), interaction);
|
|
173
|
-
const memoryType = `social-outreach-${interaction.platform}`;
|
|
174
173
|
await this.writeMemory({
|
|
175
|
-
type:
|
|
174
|
+
type: 'communication',
|
|
176
175
|
tags: ['social', interaction.platform, interaction.action],
|
|
177
176
|
title: `Social: ${interaction.platform} ${interaction.action}`,
|
|
178
177
|
body: `${interaction.action} on ${interaction.platform}: ${interaction.contentPreview}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-store.js","sourceRoot":"","sources":["../../src/store/json-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAMrC,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,aAAa;IACP,OAAO,CAAS;IAChB,YAAY,CAAoB;IAEjD,YAAY,OAAe,EAAE,YAA+B;QAC1D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,GAAG;YACX,sBAAsB;YACtB,oBAAoB;YACpB,mBAAmB;YACnB,oBAAoB;YACpB,aAAa;YACb,QAAQ;YACR,OAAO;YACP,qBAAqB;YACrB,wBAAwB;SACzB,CAAC;QACF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,mCAAmC;IACrC,CAAC;IAED,qBAAqB;IAErB,KAAK,CAAC,YAAY,CAAC,QAAwB;QACzC,MAAM,IAAI,CAAC,SAAS,CAClB,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,QAAQ,CAAC,EAAE,OAAO,CAAC,EACtD,QAAQ,CACT,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,EAAU;QAC1B,OAAO,IAAI,CAAC,QAAQ,CAClB,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,EAAE,OAAO,CAAC,CAC9C,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAAK,GAAG,GAAG;QAC7B,OAAO,IAAI,CAAC,WAAW,CACrB,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,EAC/B,KAAK,CACN,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,MAAwB;QACjD,MAAM,IAAI,CAAC,SAAS,CAClB,IAAI,CAAC,YAAY,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,UAAU,OAAO,CAAC,EAC1D,MAAM,CACP,CAAC;QACF,MAAM,IAAI,CAAC,WAAW,CAAC;YACrB,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"json-store.js","sourceRoot":"","sources":["../../src/store/json-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* nole_intel — Intelligence wiki tool for Nole.
|
|
3
|
+
*
|
|
4
|
+
* SPEC-fleet-knowledge-base-v1.2 §4.4:
|
|
5
|
+
* Same pattern as jessie_wiki (read-only operations, compilation via
|
|
6
|
+
* Sam dispatch) with Nole-specific compilation rules and intel categories.
|
|
7
|
+
*/
|
|
8
|
+
import type { IntelStore } from '../intel/intel-store.js';
|
|
9
|
+
export declare function createNoleIntelTool(getIntelStore: () => IntelStore | null): {
|
|
10
|
+
name: string;
|
|
11
|
+
description: string;
|
|
12
|
+
parameters: {
|
|
13
|
+
type: "object";
|
|
14
|
+
properties: {
|
|
15
|
+
action: {
|
|
16
|
+
type: string;
|
|
17
|
+
enum: string[];
|
|
18
|
+
description: string;
|
|
19
|
+
};
|
|
20
|
+
topic: {
|
|
21
|
+
type: string;
|
|
22
|
+
description: string;
|
|
23
|
+
};
|
|
24
|
+
slug: {
|
|
25
|
+
type: string;
|
|
26
|
+
description: string;
|
|
27
|
+
};
|
|
28
|
+
content: {
|
|
29
|
+
type: string;
|
|
30
|
+
description: string;
|
|
31
|
+
};
|
|
32
|
+
filename: {
|
|
33
|
+
type: string;
|
|
34
|
+
description: string;
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
required: string[];
|
|
38
|
+
};
|
|
39
|
+
execute(_toolCallId: string, params: Record<string, unknown>): Promise<{
|
|
40
|
+
content: {
|
|
41
|
+
type: string;
|
|
42
|
+
text: string;
|
|
43
|
+
}[];
|
|
44
|
+
isError: boolean;
|
|
45
|
+
} | {
|
|
46
|
+
content: {
|
|
47
|
+
type: string;
|
|
48
|
+
text: string;
|
|
49
|
+
}[];
|
|
50
|
+
isError?: undefined;
|
|
51
|
+
}>;
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=nole-intel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nole-intel.d.ts","sourceRoot":"","sources":["../../src/tools/nole-intel.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAW1D,wBAAgB,mBAAmB,CACjC,aAAa,EAAE,MAAM,UAAU,GAAG,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBA6BT,MAAM,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;;;EAmJrE"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* nole_intel — Intelligence wiki tool for Nole.
|
|
3
|
+
*
|
|
4
|
+
* SPEC-fleet-knowledge-base-v1.2 §4.4:
|
|
5
|
+
* Same pattern as jessie_wiki (read-only operations, compilation via
|
|
6
|
+
* Sam dispatch) with Nole-specific compilation rules and intel categories.
|
|
7
|
+
*/
|
|
8
|
+
const NOLE_STALENESS_DEFAULTS = {
|
|
9
|
+
'market-trend': 3,
|
|
10
|
+
'trust-sentiment': 5,
|
|
11
|
+
'prospect-profile': 7,
|
|
12
|
+
'competitive-landscape': 14,
|
|
13
|
+
'ecosystem-map': 14,
|
|
14
|
+
'weekly-intel': 8,
|
|
15
|
+
};
|
|
16
|
+
export function createNoleIntelTool(getIntelStore) {
|
|
17
|
+
return {
|
|
18
|
+
name: 'nole_intel',
|
|
19
|
+
description: 'Intelligence knowledge base — query intel, list articles, ' +
|
|
20
|
+
'check health, request compilation via Sam. ' +
|
|
21
|
+
'Actions: query, list, read, health, request_compile, save_output.',
|
|
22
|
+
parameters: {
|
|
23
|
+
type: 'object',
|
|
24
|
+
properties: {
|
|
25
|
+
action: {
|
|
26
|
+
type: 'string',
|
|
27
|
+
enum: ['query', 'list', 'read', 'health', 'request_compile', 'save_output'],
|
|
28
|
+
description: 'query: search intel for a topic. ' +
|
|
29
|
+
'list: show all articles in the index. ' +
|
|
30
|
+
'read: read a specific article by slug. ' +
|
|
31
|
+
'health: report stale articles, derived ratios, gaps. ' +
|
|
32
|
+
'request_compile: dispatch a compilation job to Sam via fleet-bus. ' +
|
|
33
|
+
'save_output: save a generated report to outputs/.',
|
|
34
|
+
},
|
|
35
|
+
topic: { type: 'string', description: 'For query/request_compile: topic area.' },
|
|
36
|
+
slug: { type: 'string', description: 'For read: article slug.' },
|
|
37
|
+
content: { type: 'string', description: 'For save_output: content to save.' },
|
|
38
|
+
filename: { type: 'string', description: 'For save_output: output filename.' },
|
|
39
|
+
},
|
|
40
|
+
required: ['action'],
|
|
41
|
+
},
|
|
42
|
+
async execute(_toolCallId, params) {
|
|
43
|
+
const store = getIntelStore();
|
|
44
|
+
if (!store) {
|
|
45
|
+
return {
|
|
46
|
+
content: [{ type: 'text', text: 'Intel store not initialized.' }],
|
|
47
|
+
isError: true,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
const action = params.action;
|
|
51
|
+
switch (action) {
|
|
52
|
+
case 'list': {
|
|
53
|
+
const articles = store.listArticles();
|
|
54
|
+
if (articles.length === 0) {
|
|
55
|
+
return {
|
|
56
|
+
content: [{
|
|
57
|
+
type: 'text',
|
|
58
|
+
text: 'Intel is empty. Use "request_compile" to dispatch a compilation job to Sam.',
|
|
59
|
+
}],
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
const listing = articles.map(a => `- **${a.title}** (${a.slug}) [${a.category}] — ${a.summary} [updated: ${a.lastUpdated}]`).join('\n');
|
|
63
|
+
return {
|
|
64
|
+
content: [{ type: 'text', text: `## Intel Articles (${articles.length})\n\n${listing}` }],
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
case 'read': {
|
|
68
|
+
const slug = params.slug;
|
|
69
|
+
if (!slug)
|
|
70
|
+
return { content: [{ type: 'text', text: 'Missing: slug' }], isError: true };
|
|
71
|
+
const articleContent = store.getArticleContent(slug);
|
|
72
|
+
if (!articleContent)
|
|
73
|
+
return { content: [{ type: 'text', text: `Not found: ${slug}` }], isError: true };
|
|
74
|
+
return { content: [{ type: 'text', text: articleContent }] };
|
|
75
|
+
}
|
|
76
|
+
case 'health': {
|
|
77
|
+
const stale = store.getStaleArticlesByCategory(NOLE_STALENESS_DEFAULTS);
|
|
78
|
+
const highDerived = store.getHighDerivedArticles(0.5);
|
|
79
|
+
const index = store.getIndex();
|
|
80
|
+
const report = [
|
|
81
|
+
'## Intel Health Report',
|
|
82
|
+
'',
|
|
83
|
+
`Total articles: ${index.totalArticles}`,
|
|
84
|
+
`Last compiled: ${index.lastCompiled}`,
|
|
85
|
+
`Last health check: ${index.lastHealthCheck ?? 'never'}`,
|
|
86
|
+
'',
|
|
87
|
+
'### Stale Articles (per category threshold)',
|
|
88
|
+
stale.length === 0
|
|
89
|
+
? 'None — all articles current.'
|
|
90
|
+
: stale.map(a => `- **${a.title}** (${a.slug}) [${a.category}] — updated ${a.lastUpdated}`).join('\n'),
|
|
91
|
+
'',
|
|
92
|
+
'### High Derived-Source Ratio (>50%)',
|
|
93
|
+
highDerived.length === 0
|
|
94
|
+
? 'None — all articles are primarily sourced from raw signals.'
|
|
95
|
+
: highDerived.map(a => `- **${a.title}** — ${Math.round(a.derivedRatio * 100)}% derived sources (compounding-error risk)`).join('\n'),
|
|
96
|
+
'',
|
|
97
|
+
'### Action Items',
|
|
98
|
+
stale.length > 0 ? '- Re-compile stale articles with recent intel data.' : '',
|
|
99
|
+
highDerived.length > 0 ? '- Review high-derived articles and anchor claims to raw sources.' : '',
|
|
100
|
+
'- Verify all claims are backed by source intel files.',
|
|
101
|
+
].filter(Boolean).join('\n');
|
|
102
|
+
store.recordHealthCheck();
|
|
103
|
+
return { content: [{ type: 'text', text: report }] };
|
|
104
|
+
}
|
|
105
|
+
case 'request_compile': {
|
|
106
|
+
const topic = params.topic || 'general';
|
|
107
|
+
return {
|
|
108
|
+
content: [{
|
|
109
|
+
type: 'text',
|
|
110
|
+
text: JSON.stringify({
|
|
111
|
+
protocol: 'Intel Compilation Request',
|
|
112
|
+
topic,
|
|
113
|
+
instructions: [
|
|
114
|
+
'Dispatch this compilation job to Sam via fleet-bus fleet_dispatch.',
|
|
115
|
+
'Sam will:',
|
|
116
|
+
' 1. Read recent memory files from Nole workspace.',
|
|
117
|
+
' 2. Query cross-agent context via fleet_memory_search if available.',
|
|
118
|
+
' 3. Read the current intel INDEX.md.',
|
|
119
|
+
' 4. Produce structured compilation output with source references.',
|
|
120
|
+
' 5. Compute SHA-256 hashes for all source files.',
|
|
121
|
+
' 6. Run sensitivity scan (REQUIRED for Nole intel).',
|
|
122
|
+
' 7. Write articles with provenance frontmatter (if scan passes).',
|
|
123
|
+
' 8. Log compilation event to decision store.',
|
|
124
|
+
'',
|
|
125
|
+
'Use fleet_dispatch with: agentId: "sam", description: "intel-compile: ' + topic + ' for nole"',
|
|
126
|
+
],
|
|
127
|
+
compilationRules: [
|
|
128
|
+
'Lead with the insight, not the chronology.',
|
|
129
|
+
'Every source must include SHA-256 hash at compilation time.',
|
|
130
|
+
'Classify each source as "raw" (memory file) or "derived" (intel article).',
|
|
131
|
+
'Run sensitivity scan before persisting — reject on match.',
|
|
132
|
+
'Flag contradictions between sources explicitly.',
|
|
133
|
+
'Distinguish between confirmed intel and inference.',
|
|
134
|
+
'Preserve the Operator voice — analytical, precise, zero speculation.',
|
|
135
|
+
'Never use expired outputs (check expires_at) as compilation sources.',
|
|
136
|
+
],
|
|
137
|
+
}, null, 2),
|
|
138
|
+
}],
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
case 'save_output': {
|
|
142
|
+
const content = params.content;
|
|
143
|
+
const filename = params.filename;
|
|
144
|
+
if (!content || !filename) {
|
|
145
|
+
return { content: [{ type: 'text', text: 'Missing: content, filename' }], isError: true };
|
|
146
|
+
}
|
|
147
|
+
const outputPath = store.saveOutput(filename, content);
|
|
148
|
+
return { content: [{ type: 'text', text: `Output saved: ${outputPath}` }] };
|
|
149
|
+
}
|
|
150
|
+
case 'query': {
|
|
151
|
+
const topic = params.topic;
|
|
152
|
+
if (!topic)
|
|
153
|
+
return { content: [{ type: 'text', text: 'Missing: topic' }], isError: true };
|
|
154
|
+
const articles = store.listArticles();
|
|
155
|
+
const matches = articles.filter(a => a.title.toLowerCase().includes(topic.toLowerCase()) ||
|
|
156
|
+
a.tags.some(t => t.toLowerCase().includes(topic.toLowerCase())) ||
|
|
157
|
+
a.summary.toLowerCase().includes(topic.toLowerCase()) ||
|
|
158
|
+
a.category.toLowerCase().includes(topic.toLowerCase()));
|
|
159
|
+
if (matches.length === 0) {
|
|
160
|
+
return {
|
|
161
|
+
content: [{ type: 'text', text: `No articles match "${topic}". Use "request_compile" to generate new articles.` }],
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
const result = matches.map(a => `- **${a.title}** (${a.slug}) [${a.category}] — ${a.summary}`).join('\n');
|
|
165
|
+
return {
|
|
166
|
+
content: [{ type: 'text', text: `## Results for "${topic}"\n\n${result}\n\nUse "read" with a slug for the full article.` }],
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
default:
|
|
170
|
+
return {
|
|
171
|
+
content: [{ type: 'text', text: `Unknown action: ${action}. Valid: query, list, read, health, request_compile, save_output.` }],
|
|
172
|
+
isError: true,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=nole-intel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nole-intel.js","sourceRoot":"","sources":["../../src/tools/nole-intel.ts"],"names":[],"mappings":"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"}
|