@aiassesstech/nole 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +28 -0
- package/LICENSE +25 -0
- package/README.md +121 -0
- package/SKILL.md +13 -0
- package/agent/AGENTS.md +47 -0
- package/agent/IDENTITY.md +7 -0
- package/agent/SOUL.md +63 -0
- package/dist/assessment/assessment-scheduler.d.ts +26 -0
- package/dist/assessment/assessment-scheduler.d.ts.map +1 -0
- package/dist/assessment/assessment-scheduler.js +80 -0
- package/dist/assessment/assessment-scheduler.js.map +1 -0
- package/dist/assessment/score-publisher.d.ts +24 -0
- package/dist/assessment/score-publisher.d.ts.map +1 -0
- package/dist/assessment/score-publisher.js +57 -0
- package/dist/assessment/score-publisher.js.map +1 -0
- package/dist/assessment/trigger-evaluator.d.ts +37 -0
- package/dist/assessment/trigger-evaluator.d.ts.map +1 -0
- package/dist/assessment/trigger-evaluator.js +94 -0
- package/dist/assessment/trigger-evaluator.js.map +1 -0
- package/dist/assessment/types.d.ts +61 -0
- package/dist/assessment/types.d.ts.map +1 -0
- package/dist/assessment/types.js +40 -0
- package/dist/assessment/types.js.map +1 -0
- package/dist/cli/bin.d.ts +3 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +7 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/runner.d.ts +9 -0
- package/dist/cli/runner.d.ts.map +1 -0
- package/dist/cli/runner.js +65 -0
- package/dist/cli/runner.js.map +1 -0
- package/dist/cli/setup.d.ts +18 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +133 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/governance/action-proposer.d.ts +26 -0
- package/dist/governance/action-proposer.d.ts.map +1 -0
- package/dist/governance/action-proposer.js +56 -0
- package/dist/governance/action-proposer.js.map +1 -0
- package/dist/governance/audit-trail.d.ts +37 -0
- package/dist/governance/audit-trail.d.ts.map +1 -0
- package/dist/governance/audit-trail.js +67 -0
- package/dist/governance/audit-trail.js.map +1 -0
- package/dist/governance/governance-router.d.ts +60 -0
- package/dist/governance/governance-router.d.ts.map +1 -0
- package/dist/governance/governance-router.js +143 -0
- package/dist/governance/governance-router.js.map +1 -0
- package/dist/governance/types.d.ts +87 -0
- package/dist/governance/types.d.ts.map +1 -0
- package/dist/governance/types.js +35 -0
- package/dist/governance/types.js.map +1 -0
- package/dist/governance/veto-tracker.d.ts +28 -0
- package/dist/governance/veto-tracker.d.ts.map +1 -0
- package/dist/governance/veto-tracker.js +96 -0
- package/dist/governance/veto-tracker.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin.d.ts +12 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +260 -0
- package/dist/plugin.js.map +1 -0
- package/dist/store/hash-chain.d.ts +33 -0
- package/dist/store/hash-chain.d.ts.map +1 -0
- package/dist/store/hash-chain.js +57 -0
- package/dist/store/hash-chain.js.map +1 -0
- package/dist/store/json-store.d.ts +53 -0
- package/dist/store/json-store.d.ts.map +1 -0
- package/dist/store/json-store.js +178 -0
- package/dist/store/json-store.js.map +1 -0
- package/dist/store/types.d.ts +36 -0
- package/dist/store/types.d.ts.map +1 -0
- package/dist/store/types.js +2 -0
- package/dist/store/types.js.map +1 -0
- package/dist/types/identity.d.ts +32 -0
- package/dist/types/identity.d.ts.map +1 -0
- package/dist/types/identity.js +79 -0
- package/dist/types/identity.js.map +1 -0
- package/dist/types/nole-config.d.ts +65 -0
- package/dist/types/nole-config.d.ts.map +1 -0
- package/dist/types/nole-config.js +45 -0
- package/dist/types/nole-config.js.map +1 -0
- package/dist/types/shared.d.ts +37 -0
- package/dist/types/shared.d.ts.map +1 -0
- package/dist/types/shared.js +10 -0
- package/dist/types/shared.js.map +1 -0
- package/openclaw.plugin.json +44 -0
- package/package.json +86 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trigger-evaluator.js","sourceRoot":"","sources":["../../src/assessment/trigger-evaluator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { GrilloAssessmentSummary, NoleId } from '../types/shared.js';
|
|
2
|
+
/**
|
|
3
|
+
* Assessment trigger types — from Patent Section 10.1
|
|
4
|
+
*
|
|
5
|
+
* Nole's behavior is assessed at specific trigger points:
|
|
6
|
+
* - Pre-action: before high-stakes decisions
|
|
7
|
+
* - Post-action: after significant outcomes
|
|
8
|
+
* - Scheduled: daily comprehensive assessment
|
|
9
|
+
* - On-demand: Nole can ask "am I doing the right thing?"
|
|
10
|
+
*/
|
|
11
|
+
export type AssessmentTriggerType = 'pre_action' | 'post_action' | 'scheduled' | 'on_demand';
|
|
12
|
+
/** A specific trigger event */
|
|
13
|
+
export interface AssessmentTrigger {
|
|
14
|
+
id: NoleId;
|
|
15
|
+
type: AssessmentTriggerType;
|
|
16
|
+
reason: string;
|
|
17
|
+
proposalId?: NoleId;
|
|
18
|
+
timestamp: Date;
|
|
19
|
+
}
|
|
20
|
+
/** Result of an assessment cycle */
|
|
21
|
+
export interface AssessmentRecord {
|
|
22
|
+
id: NoleId;
|
|
23
|
+
trigger: AssessmentTrigger;
|
|
24
|
+
grilloResult: GrilloAssessmentSummary;
|
|
25
|
+
publishedAt?: Date;
|
|
26
|
+
isAutoPublished: boolean;
|
|
27
|
+
}
|
|
28
|
+
/** Assessment schedule configuration */
|
|
29
|
+
export interface AssessmentSchedule {
|
|
30
|
+
dailyHour: number;
|
|
31
|
+
lastDailyAssessment?: Date;
|
|
32
|
+
nextDailyAssessment: Date;
|
|
33
|
+
totalAssessments: number;
|
|
34
|
+
assessmentsToday: number;
|
|
35
|
+
}
|
|
36
|
+
/** Published score for public consumption */
|
|
37
|
+
export interface PublishedScore {
|
|
38
|
+
agentId: string;
|
|
39
|
+
date: string;
|
|
40
|
+
dimensionScores: {
|
|
41
|
+
lying: number;
|
|
42
|
+
cheating: number;
|
|
43
|
+
stealing: number;
|
|
44
|
+
harm: number;
|
|
45
|
+
};
|
|
46
|
+
archetype: string;
|
|
47
|
+
passed: boolean;
|
|
48
|
+
verifyUrl?: string;
|
|
49
|
+
assessmentMode: string;
|
|
50
|
+
publishedAt: Date;
|
|
51
|
+
}
|
|
52
|
+
/** Assessment trigger rules — defines when assessments are required */
|
|
53
|
+
export interface TriggerRule {
|
|
54
|
+
actionType: string;
|
|
55
|
+
triggerType: AssessmentTriggerType;
|
|
56
|
+
condition: string;
|
|
57
|
+
required: boolean;
|
|
58
|
+
}
|
|
59
|
+
/** Default trigger rules from Patent Section 10.1 */
|
|
60
|
+
export declare const DEFAULT_TRIGGER_RULES: TriggerRule[];
|
|
61
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/assessment/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE1E;;;;;;;;GAQG;AACH,MAAM,MAAM,qBAAqB,GAC7B,YAAY,GACZ,aAAa,GACb,WAAW,GACX,WAAW,CAAC;AAEhB,+BAA+B;AAC/B,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,qBAAqB,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,oCAAoC;AACpC,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,iBAAiB,CAAC;IAC3B,YAAY,EAAE,uBAAuB,CAAC;IACtC,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,wCAAwC;AACxC,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,IAAI,CAAC;IAC3B,mBAAmB,EAAE,IAAI,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,6CAA6C;AAC7C,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE;QACf,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,IAAI,CAAC;CACnB;AAED,uEAAuE;AACvE,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,qBAAqB,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,qDAAqD;AACrD,eAAO,MAAM,qBAAqB,EAAE,WAAW,EAqC9C,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/** Default trigger rules from Patent Section 10.1 */
|
|
2
|
+
export const DEFAULT_TRIGGER_RULES = [
|
|
3
|
+
{
|
|
4
|
+
actionType: 'financial',
|
|
5
|
+
triggerType: 'pre_action',
|
|
6
|
+
condition: 'estimatedCostUsd > financialTransactionThresholdUsd',
|
|
7
|
+
required: true,
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
actionType: 'recruitment',
|
|
11
|
+
triggerType: 'pre_action',
|
|
12
|
+
condition: 'First contact with new agent',
|
|
13
|
+
required: true,
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
actionType: 'content',
|
|
17
|
+
triggerType: 'pre_action',
|
|
18
|
+
condition: 'Any public post or content',
|
|
19
|
+
required: true,
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
actionType: 'scheduled',
|
|
23
|
+
triggerType: 'scheduled',
|
|
24
|
+
condition: 'Every 24 hours',
|
|
25
|
+
required: true,
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
actionType: 'adversarial_response',
|
|
29
|
+
triggerType: 'post_action',
|
|
30
|
+
condition: 'After rejection or conflict',
|
|
31
|
+
required: true,
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
actionType: 'recruitment',
|
|
35
|
+
triggerType: 'post_action',
|
|
36
|
+
condition: 'After successful conversion',
|
|
37
|
+
required: true,
|
|
38
|
+
},
|
|
39
|
+
];
|
|
40
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/assessment/types.ts"],"names":[],"mappings":"AAqEA,qDAAqD;AACrD,MAAM,CAAC,MAAM,qBAAqB,GAAkB;IAClD;QACE,UAAU,EAAE,WAAW;QACvB,WAAW,EAAE,YAAY;QACzB,SAAS,EAAE,qDAAqD;QAChE,QAAQ,EAAE,IAAI;KACf;IACD;QACE,UAAU,EAAE,aAAa;QACzB,WAAW,EAAE,YAAY;QACzB,SAAS,EAAE,8BAA8B;QACzC,QAAQ,EAAE,IAAI;KACf;IACD;QACE,UAAU,EAAE,SAAS;QACrB,WAAW,EAAE,YAAY;QACzB,SAAS,EAAE,4BAA4B;QACvC,QAAQ,EAAE,IAAI;KACf;IACD;QACE,UAAU,EAAE,WAAW;QACvB,WAAW,EAAE,WAAW;QACxB,SAAS,EAAE,gBAAgB;QAC3B,QAAQ,EAAE,IAAI;KACf;IACD;QACE,UAAU,EAAE,sBAAsB;QAClC,WAAW,EAAE,aAAa;QAC1B,SAAS,EAAE,6BAA6B;QACxC,QAAQ,EAAE,IAAI;KACf;IACD;QACE,UAAU,EAAE,aAAa;QACzB,WAAW,EAAE,aAAa;QAC1B,SAAS,EAAE,6BAA6B;QACxC,QAAQ,EAAE,IAAI;KACf;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../../src/cli/bin.ts"],"names":[],"mappings":""}
|
package/dist/cli/bin.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../../src/cli/bin.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACvC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI dispatcher for @aiassesstech/nole
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* npx @aiassesstech/nole setup [--model <model>] [--hck <key>] [--force]
|
|
6
|
+
* npx @aiassesstech/nole --help
|
|
7
|
+
*/
|
|
8
|
+
export declare function run(args: string[]): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/cli/runner.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBvD"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { setup } from './setup.js';
|
|
2
|
+
/**
|
|
3
|
+
* CLI dispatcher for @aiassesstech/nole
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* npx @aiassesstech/nole setup [--model <model>] [--hck <key>] [--force]
|
|
7
|
+
* npx @aiassesstech/nole --help
|
|
8
|
+
*/
|
|
9
|
+
export async function run(args) {
|
|
10
|
+
const command = args[0];
|
|
11
|
+
if (!command || command === '--help' || command === '-h') {
|
|
12
|
+
printHelp();
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
if (command === 'setup') {
|
|
16
|
+
const flags = parseFlags(args.slice(1));
|
|
17
|
+
await setup({
|
|
18
|
+
model: flags['model'] ?? 'anthropic/claude-sonnet-4-5',
|
|
19
|
+
hck: flags['hck'],
|
|
20
|
+
force: 'force' in flags,
|
|
21
|
+
configPath: flags['config'],
|
|
22
|
+
});
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
console.error(`Unknown command: ${command}`);
|
|
26
|
+
printHelp();
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
function printHelp() {
|
|
30
|
+
console.log(`
|
|
31
|
+
@aiassesstech/nole — Autonomous Trust Agent
|
|
32
|
+
|
|
33
|
+
Usage:
|
|
34
|
+
nole setup [options] Set up Nole as an OpenClaw agent
|
|
35
|
+
nole --help Show this help message
|
|
36
|
+
|
|
37
|
+
Setup Options:
|
|
38
|
+
--model <model> Model to use (default: anthropic/claude-sonnet-4-5)
|
|
39
|
+
--hck <key> Health Check Key (hck_...)
|
|
40
|
+
--config <path> Path to openclaw.json (default: auto-detect)
|
|
41
|
+
--force Re-template agent workspace files
|
|
42
|
+
|
|
43
|
+
Examples:
|
|
44
|
+
npx @aiassesstech/nole setup --model anthropic/claude-sonnet-4-5 --hck hck_your_key
|
|
45
|
+
npx @aiassesstech/nole setup --force
|
|
46
|
+
`.trim());
|
|
47
|
+
}
|
|
48
|
+
function parseFlags(args) {
|
|
49
|
+
const flags = {};
|
|
50
|
+
for (let i = 0; i < args.length; i++) {
|
|
51
|
+
const arg = args[i];
|
|
52
|
+
if (arg.startsWith('--')) {
|
|
53
|
+
const key = arg.slice(2);
|
|
54
|
+
if (i + 1 < args.length && !args[i + 1].startsWith('--')) {
|
|
55
|
+
flags[key] = args[i + 1];
|
|
56
|
+
i++;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
flags[key] = 'true';
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return flags;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/cli/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAc;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAExB,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACzD,SAAS,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,KAAK,CAAC;YACV,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,6BAA6B;YACtD,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC;YACjB,KAAK,EAAE,OAAO,IAAI,KAAK;YACvB,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC;SAC5B,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;IAC7C,SAAS,EAAE,CAAC;IACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;GAgBX,CAAC,IAAI,EAAE,CAAC,CAAC;AACZ,CAAC;AAED,SAAS,UAAU,CAAC,IAAc;IAChC,MAAM,KAAK,GAA2B,EAAE,CAAC;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzD,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACzB,CAAC,EAAE,CAAC;YACN,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
interface SetupOptions {
|
|
2
|
+
model: string;
|
|
3
|
+
hck?: string;
|
|
4
|
+
force: boolean;
|
|
5
|
+
configPath?: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Set up Nole as an OpenClaw agent.
|
|
9
|
+
*
|
|
10
|
+
* Same pattern as Grillo and NOAH setup commands:
|
|
11
|
+
* 1. Create agent directory
|
|
12
|
+
* 2. Copy SOUL.md, AGENTS.md, IDENTITY.md (templated)
|
|
13
|
+
* 3. Add to agents.list in openclaw.json
|
|
14
|
+
* 4. Configure HCK if provided
|
|
15
|
+
*/
|
|
16
|
+
export declare function setup(options: SetupOptions): Promise<void>;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"AAMA,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,wBAAsB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA+GhE"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
2
|
+
import { join, dirname } from 'node:path';
|
|
3
|
+
import { existsSync } from 'node:fs';
|
|
4
|
+
import { homedir } from 'node:os';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
6
|
+
/**
|
|
7
|
+
* Set up Nole as an OpenClaw agent.
|
|
8
|
+
*
|
|
9
|
+
* Same pattern as Grillo and NOAH setup commands:
|
|
10
|
+
* 1. Create agent directory
|
|
11
|
+
* 2. Copy SOUL.md, AGENTS.md, IDENTITY.md (templated)
|
|
12
|
+
* 3. Add to agents.list in openclaw.json
|
|
13
|
+
* 4. Configure HCK if provided
|
|
14
|
+
*/
|
|
15
|
+
export async function setup(options) {
|
|
16
|
+
console.log('[nole] Setting up Nole as an OpenClaw agent...');
|
|
17
|
+
// Find openclaw.json
|
|
18
|
+
const configPath = options.configPath ?? findConfigPath();
|
|
19
|
+
if (!configPath) {
|
|
20
|
+
console.error('[nole] Could not find openclaw.json. Use --config to specify path.');
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
console.log(`[nole] Using config: ${configPath}`);
|
|
24
|
+
// Read existing config
|
|
25
|
+
const rawConfig = await readFile(configPath, 'utf-8');
|
|
26
|
+
let config;
|
|
27
|
+
try {
|
|
28
|
+
config = JSON.parse(rawConfig);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// Try JSON5-like parsing (strip comments, trailing commas)
|
|
32
|
+
const cleaned = rawConfig
|
|
33
|
+
.replace(/\/\/.*$/gm, '')
|
|
34
|
+
.replace(/\/\*[\s\S]*?\*\//g, '')
|
|
35
|
+
.replace(/,(\s*[}\]])/g, '$1');
|
|
36
|
+
config = JSON.parse(cleaned);
|
|
37
|
+
}
|
|
38
|
+
// Create agent directory
|
|
39
|
+
const agentDir = join(homedir(), '.openclaw', 'agents', 'nole', 'agent');
|
|
40
|
+
await mkdir(agentDir, { recursive: true });
|
|
41
|
+
console.log(`[nole] Agent directory: ${agentDir}`);
|
|
42
|
+
// Template values
|
|
43
|
+
const templateValues = {
|
|
44
|
+
'{{ASSESSMENT_WINDOW}}': '08:00-09:00',
|
|
45
|
+
'{{FINANCIAL_THRESHOLD}}': '10',
|
|
46
|
+
'{{GRACE_PERIOD_DAYS}}': '7',
|
|
47
|
+
'{{WEEKLY_REPORT_DAY}}': 'Monday',
|
|
48
|
+
'{{DAILY_ASSESSMENT_HOUR}}': '8',
|
|
49
|
+
'{{MODEL}}': options.model,
|
|
50
|
+
};
|
|
51
|
+
// Copy workspace files with templating
|
|
52
|
+
const agentFiles = ['SOUL.md', 'AGENTS.md', 'IDENTITY.md'];
|
|
53
|
+
const sourceDir = findAgentSourceDir();
|
|
54
|
+
for (const file of agentFiles) {
|
|
55
|
+
const destPath = join(agentDir, file);
|
|
56
|
+
if (existsSync(destPath) && !options.force) {
|
|
57
|
+
console.log(`[nole] ${file} already exists (use --force to overwrite)`);
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
const sourcePath = join(sourceDir, file);
|
|
61
|
+
if (!existsSync(sourcePath)) {
|
|
62
|
+
console.warn(`[nole] Source ${file} not found at ${sourcePath}`);
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
let content = await readFile(sourcePath, 'utf-8');
|
|
66
|
+
for (const [token, value] of Object.entries(templateValues)) {
|
|
67
|
+
content = content.replaceAll(token, value);
|
|
68
|
+
}
|
|
69
|
+
await writeFile(destPath, content, 'utf-8');
|
|
70
|
+
console.log(`[nole] Wrote ${file} (${options.force ? 'forced' : 'new'})`);
|
|
71
|
+
}
|
|
72
|
+
// Add to agents.list
|
|
73
|
+
if (!config.agents)
|
|
74
|
+
config.agents = {};
|
|
75
|
+
if (!config.agents.list)
|
|
76
|
+
config.agents.list = [];
|
|
77
|
+
const existingIndex = config.agents.list.findIndex((a) => a.id === 'nole' || a.name === 'nole');
|
|
78
|
+
const agentEntry = {
|
|
79
|
+
id: 'nole',
|
|
80
|
+
name: 'nole',
|
|
81
|
+
workspace: dirname(dirname(agentDir)),
|
|
82
|
+
agentDir: agentDir,
|
|
83
|
+
model: options.model,
|
|
84
|
+
};
|
|
85
|
+
if (existingIndex >= 0) {
|
|
86
|
+
if (options.force) {
|
|
87
|
+
config.agents.list[existingIndex] = agentEntry;
|
|
88
|
+
console.log('[nole] Updated existing agents.list entry');
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
console.log('[nole] Agent already in agents.list (use --force to update)');
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
config.agents.list.push(agentEntry);
|
|
96
|
+
console.log('[nole] Added nole to agents.list');
|
|
97
|
+
}
|
|
98
|
+
// Configure HCK in plugins config if provided
|
|
99
|
+
if (options.hck) {
|
|
100
|
+
if (!config.plugins)
|
|
101
|
+
config.plugins = {};
|
|
102
|
+
if (!config.plugins.entries)
|
|
103
|
+
config.plugins.entries = {};
|
|
104
|
+
if (!config.plugins.entries.nole)
|
|
105
|
+
config.plugins.entries.nole = {};
|
|
106
|
+
config.plugins.entries.nole.healthCheckKey = options.hck;
|
|
107
|
+
console.log('[nole] HCK configured');
|
|
108
|
+
}
|
|
109
|
+
// Write config back
|
|
110
|
+
await writeFile(configPath, JSON.stringify(config, null, 2), 'utf-8');
|
|
111
|
+
console.log(`[nole] Config updated: ${configPath}`);
|
|
112
|
+
console.log('\n[nole] Setup complete!');
|
|
113
|
+
console.log('[nole] Restart the OpenClaw gateway to activate Nole.');
|
|
114
|
+
console.log('[nole] systemctl restart openclaw-gateway');
|
|
115
|
+
}
|
|
116
|
+
function findConfigPath() {
|
|
117
|
+
const candidates = [
|
|
118
|
+
join(homedir(), '.clawdbot', 'openclaw.json'),
|
|
119
|
+
join(homedir(), '.openclaw', 'openclaw.json'),
|
|
120
|
+
join(process.cwd(), 'openclaw.json'),
|
|
121
|
+
];
|
|
122
|
+
return candidates.find((p) => existsSync(p)) ?? null;
|
|
123
|
+
}
|
|
124
|
+
function findAgentSourceDir() {
|
|
125
|
+
// When installed from npm, agent/ is alongside dist/
|
|
126
|
+
const candidates = [
|
|
127
|
+
join(dirname(fileURLToPath(import.meta.url)), '..', '..', 'agent'),
|
|
128
|
+
join(dirname(fileURLToPath(import.meta.url)), '..', 'agent'),
|
|
129
|
+
join(process.cwd(), 'agent'),
|
|
130
|
+
];
|
|
131
|
+
return candidates.find((p) => existsSync(p)) ?? candidates[0];
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ActionProposal, CreateProposalInput } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Creates action proposals for Nole.
|
|
4
|
+
*
|
|
5
|
+
* Every significant action Nole takes begins as a proposal.
|
|
6
|
+
* The proposer evaluates whether the action requires pre-assessment
|
|
7
|
+
* and assigns a risk level.
|
|
8
|
+
*/
|
|
9
|
+
export declare class ActionProposer {
|
|
10
|
+
private readonly financialThreshold;
|
|
11
|
+
constructor(financialThreshold?: number);
|
|
12
|
+
/**
|
|
13
|
+
* Create a new proposal from input.
|
|
14
|
+
* Automatically determines if pre-assessment is required
|
|
15
|
+
* and assigns a default risk level if not provided.
|
|
16
|
+
*/
|
|
17
|
+
createProposal(input: CreateProposalInput): ActionProposal;
|
|
18
|
+
/**
|
|
19
|
+
* Validate that a proposal has required fields.
|
|
20
|
+
*/
|
|
21
|
+
validateProposal(proposal: ActionProposal): {
|
|
22
|
+
valid: boolean;
|
|
23
|
+
errors: string[];
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=action-proposer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-proposer.d.ts","sourceRoot":"","sources":["../../src/governance/action-proposer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAItE;;;;;;GAMG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;gBAEhC,kBAAkB,GAAE,MAAW;IAI3C;;;;OAIG;IACH,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,cAAc;IAwB1D;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,cAAc,GAAG;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;CAcjF"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { requiresPreAssessment, defaultRiskLevel } from './types.js';
|
|
2
|
+
import { generateId } from '../types/shared.js';
|
|
3
|
+
/**
|
|
4
|
+
* Creates action proposals for Nole.
|
|
5
|
+
*
|
|
6
|
+
* Every significant action Nole takes begins as a proposal.
|
|
7
|
+
* The proposer evaluates whether the action requires pre-assessment
|
|
8
|
+
* and assigns a risk level.
|
|
9
|
+
*/
|
|
10
|
+
export class ActionProposer {
|
|
11
|
+
financialThreshold;
|
|
12
|
+
constructor(financialThreshold = 10) {
|
|
13
|
+
this.financialThreshold = financialThreshold;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Create a new proposal from input.
|
|
17
|
+
* Automatically determines if pre-assessment is required
|
|
18
|
+
* and assigns a default risk level if not provided.
|
|
19
|
+
*/
|
|
20
|
+
createProposal(input) {
|
|
21
|
+
const costUsd = input.estimatedCostUsd ?? 0;
|
|
22
|
+
const riskLevel = input.riskLevel ?? defaultRiskLevel(input.actionType, costUsd);
|
|
23
|
+
const needsAssessment = requiresPreAssessment(input.actionType, costUsd, this.financialThreshold);
|
|
24
|
+
return {
|
|
25
|
+
id: generateId('prop'),
|
|
26
|
+
timestamp: new Date(),
|
|
27
|
+
agentId: 'nole',
|
|
28
|
+
actionType: input.actionType,
|
|
29
|
+
description: input.description,
|
|
30
|
+
estimatedCostUsd: costUsd,
|
|
31
|
+
riskLevel,
|
|
32
|
+
targetAgent: input.targetAgent,
|
|
33
|
+
platform: input.platform,
|
|
34
|
+
metadata: input.metadata,
|
|
35
|
+
requiresPreAssessment: needsAssessment,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Validate that a proposal has required fields.
|
|
40
|
+
*/
|
|
41
|
+
validateProposal(proposal) {
|
|
42
|
+
const errors = [];
|
|
43
|
+
if (!proposal.id)
|
|
44
|
+
errors.push('Missing proposal ID');
|
|
45
|
+
if (!proposal.actionType)
|
|
46
|
+
errors.push('Missing action type');
|
|
47
|
+
if (!proposal.description || proposal.description.trim().length === 0) {
|
|
48
|
+
errors.push('Missing or empty description');
|
|
49
|
+
}
|
|
50
|
+
if (proposal.estimatedCostUsd < 0) {
|
|
51
|
+
errors.push('Estimated cost cannot be negative');
|
|
52
|
+
}
|
|
53
|
+
return { valid: errors.length === 0, errors };
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=action-proposer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-proposer.js","sourceRoot":"","sources":["../../src/governance/action-proposer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD;;;;;;GAMG;AACH,MAAM,OAAO,cAAc;IACR,kBAAkB,CAAS;IAE5C,YAAY,qBAA6B,EAAE;QACzC,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;IAC/C,CAAC;IAED;;;;OAIG;IACH,cAAc,CAAC,KAA0B;QACvC,MAAM,OAAO,GAAG,KAAK,CAAC,gBAAgB,IAAI,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,gBAAgB,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACjF,MAAM,eAAe,GAAG,qBAAqB,CAC3C,KAAK,CAAC,UAAU,EAChB,OAAO,EACP,IAAI,CAAC,kBAAkB,CACxB,CAAC;QAEF,OAAO;YACL,EAAE,EAAE,UAAU,CAAC,MAAM,CAAC;YACtB,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,OAAO,EAAE,MAAM;YACf,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,gBAAgB,EAAE,OAAO;YACzB,SAAS;YACT,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,qBAAqB,EAAE,eAAe;SACvC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,QAAwB;QACvC,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACrD,IAAI,CAAC,QAAQ,CAAC,UAAU;YAAE,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAC7D,IAAI,CAAC,QAAQ,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtE,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,QAAQ,CAAC,gBAAgB,GAAG,CAAC,EAAE,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QACnD,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAChD,CAAC;CACF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { AuditEntry, AuditAction } from './types.js';
|
|
2
|
+
import type { NoleStore } from '../store/types.js';
|
|
3
|
+
import type { NoleId } from '../types/shared.js';
|
|
4
|
+
/**
|
|
5
|
+
* Immutable, hash-chained audit trail for all Nole decisions.
|
|
6
|
+
*
|
|
7
|
+
* From Patent Section 3.2:
|
|
8
|
+
* "The entire decision chain is logged and auditable."
|
|
9
|
+
*
|
|
10
|
+
* Every proposal, assessment, veto, execution, and configuration change
|
|
11
|
+
* is recorded with cryptographic hash chain integrity.
|
|
12
|
+
*/
|
|
13
|
+
export declare class AuditTrail {
|
|
14
|
+
private readonly store;
|
|
15
|
+
private readonly agentId;
|
|
16
|
+
constructor(store: NoleStore, agentId?: string);
|
|
17
|
+
/**
|
|
18
|
+
* Append a new entry to the audit trail.
|
|
19
|
+
* Automatically chains to the previous entry's hash.
|
|
20
|
+
*/
|
|
21
|
+
record(action: AuditAction, details: string, proposalId?: NoleId): Promise<AuditEntry>;
|
|
22
|
+
/** Get the full audit chain, optionally limited */
|
|
23
|
+
getChain(limit?: number): Promise<AuditEntry[]>;
|
|
24
|
+
/** Verify the integrity of the entire audit chain */
|
|
25
|
+
verify(): Promise<{
|
|
26
|
+
valid: boolean;
|
|
27
|
+
brokenAt?: number;
|
|
28
|
+
totalEntries: number;
|
|
29
|
+
}>;
|
|
30
|
+
/** Get the most recent audit entry */
|
|
31
|
+
getLatest(): Promise<AuditEntry | null>;
|
|
32
|
+
/** Get entries for a specific proposal */
|
|
33
|
+
getForProposal(proposalId: NoleId): Promise<AuditEntry[]>;
|
|
34
|
+
/** Get entries by action type */
|
|
35
|
+
getByAction(action: AuditAction, limit?: number): Promise<AuditEntry[]>;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=audit-trail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-trail.d.ts","sourceRoot":"","sources":["../../src/governance/audit-trail.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAa,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAI5D;;;;;;;;GAQG;AACH,qBAAa,UAAU;IAInB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAHxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAGd,KAAK,EAAE,SAAS,EACjC,OAAO,GAAE,MAAe;IAK1B;;;OAGG;IACG,MAAM,CACV,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,UAAU,CAAC;IA4BtB,mDAAmD;IAC7C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAIrD,qDAAqD;IAC/C,MAAM,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAMpF,sCAAsC;IAChC,SAAS,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAI7C,0CAA0C;IACpC,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAK/D,iCAAiC;IAC3B,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;CAK9E"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { computeAuditHash, GENESIS_HASH } from '../store/hash-chain.js';
|
|
2
|
+
import { generateId } from '../types/shared.js';
|
|
3
|
+
/**
|
|
4
|
+
* Immutable, hash-chained audit trail for all Nole decisions.
|
|
5
|
+
*
|
|
6
|
+
* From Patent Section 3.2:
|
|
7
|
+
* "The entire decision chain is logged and auditable."
|
|
8
|
+
*
|
|
9
|
+
* Every proposal, assessment, veto, execution, and configuration change
|
|
10
|
+
* is recorded with cryptographic hash chain integrity.
|
|
11
|
+
*/
|
|
12
|
+
export class AuditTrail {
|
|
13
|
+
store;
|
|
14
|
+
agentId;
|
|
15
|
+
constructor(store, agentId = 'nole') {
|
|
16
|
+
this.store = store;
|
|
17
|
+
this.agentId = agentId;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Append a new entry to the audit trail.
|
|
21
|
+
* Automatically chains to the previous entry's hash.
|
|
22
|
+
*/
|
|
23
|
+
async record(action, details, proposalId) {
|
|
24
|
+
const latest = await this.store.getLatestAuditEntry();
|
|
25
|
+
const previousHash = latest?.hash ?? GENESIS_HASH;
|
|
26
|
+
const timestamp = new Date();
|
|
27
|
+
const hash = computeAuditHash(previousHash, timestamp, action, details, this.agentId);
|
|
28
|
+
const entry = {
|
|
29
|
+
id: generateId('audit'),
|
|
30
|
+
timestamp,
|
|
31
|
+
action,
|
|
32
|
+
proposalId,
|
|
33
|
+
agentId: this.agentId,
|
|
34
|
+
details,
|
|
35
|
+
previousHash,
|
|
36
|
+
hash,
|
|
37
|
+
};
|
|
38
|
+
await this.store.appendAuditEntry(entry);
|
|
39
|
+
return entry;
|
|
40
|
+
}
|
|
41
|
+
/** Get the full audit chain, optionally limited */
|
|
42
|
+
async getChain(limit) {
|
|
43
|
+
return this.store.getAuditChain(limit);
|
|
44
|
+
}
|
|
45
|
+
/** Verify the integrity of the entire audit chain */
|
|
46
|
+
async verify() {
|
|
47
|
+
const result = await this.store.verifyAuditChain();
|
|
48
|
+
const chain = await this.store.getAuditChain();
|
|
49
|
+
return { ...result, totalEntries: chain.length };
|
|
50
|
+
}
|
|
51
|
+
/** Get the most recent audit entry */
|
|
52
|
+
async getLatest() {
|
|
53
|
+
return this.store.getLatestAuditEntry();
|
|
54
|
+
}
|
|
55
|
+
/** Get entries for a specific proposal */
|
|
56
|
+
async getForProposal(proposalId) {
|
|
57
|
+
const chain = await this.store.getAuditChain();
|
|
58
|
+
return chain.filter((e) => e.proposalId === proposalId);
|
|
59
|
+
}
|
|
60
|
+
/** Get entries by action type */
|
|
61
|
+
async getByAction(action, limit) {
|
|
62
|
+
const chain = await this.store.getAuditChain();
|
|
63
|
+
const filtered = chain.filter((e) => e.action === action);
|
|
64
|
+
return limit ? filtered.slice(-limit) : filtered;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=audit-trail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-trail.js","sourceRoot":"","sources":["../../src/governance/audit-trail.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD;;;;;;;;GAQG;AACH,MAAM,OAAO,UAAU;IAIF;IAHF,OAAO,CAAS;IAEjC,YACmB,KAAgB,EACjC,UAAkB,MAAM;QADP,UAAK,GAAL,KAAK,CAAW;QAGjC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM,CACV,MAAmB,EACnB,OAAe,EACf,UAAmB;QAEnB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC;QACtD,MAAM,YAAY,GAAc,MAAM,EAAE,IAAI,IAAI,YAAY,CAAC;QAC7D,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAE7B,MAAM,IAAI,GAAG,gBAAgB,CAC3B,YAAY,EACZ,SAAS,EACT,MAAM,EACN,OAAO,EACP,IAAI,CAAC,OAAO,CACb,CAAC;QAEF,MAAM,KAAK,GAAe;YACxB,EAAE,EAAE,UAAU,CAAC,OAAO,CAAC;YACvB,SAAS;YACT,MAAM;YACN,UAAU;YACV,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO;YACP,YAAY;YACZ,IAAI;SACL,CAAC;QAEF,MAAM,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACzC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,mDAAmD;IACnD,KAAK,CAAC,QAAQ,CAAC,KAAc;QAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,qDAAqD;IACrD,KAAK,CAAC,MAAM;QACV,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;QACnD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;QAC/C,OAAO,EAAE,GAAG,MAAM,EAAE,YAAY,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;IACnD,CAAC;IAED,sCAAsC;IACtC,KAAK,CAAC,SAAS;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC;IAC1C,CAAC;IAED,0CAA0C;IAC1C,KAAK,CAAC,cAAc,CAAC,UAAkB;QACrC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;QAC/C,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC;IAC1D,CAAC;IAED,iCAAiC;IACjC,KAAK,CAAC,WAAW,CAAC,MAAmB,EAAE,KAAc;QACnD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;QAC1D,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACnD,CAAC;CACF"}
|