File size: 2,689 Bytes
119e586
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
var LispMachine = {
  env: {},

  safeOps: {
    '+': function(args) { return args.reduce(function(a, b) { return a + b; }, 0); },
    '-': function(args) { return args.slice(1).reduce(function(a, b) { return a - b; }, args[0]); },
    '*': function(args) { return args.reduce(function(a, b) { return a * b; }, 1); },
    '/': function(args) { return args.slice(1).reduce(function(a, b) { return a / b; }, args[0]); },
    'quote': function(args) { return args[0]; },
    'list': function(args) { return args; },
    'car': function(args) { return Array.isArray(args[0]) ? args[0][0] : null; },
    'cdr': function(args) { return Array.isArray(args[0]) ? args[0].slice(1) : []; },
    'cons': function(args) {
      if (Array.isArray(args[1])) return [args[0]].concat(args[1]);
      return [args[0], args[1]];
    },
    'agent-status': function() {
      return 'ENKI: active (sim) — tension proposer\nSENTINEL: active (sim) — claim auditor\nAll local, no remote.';
    },
    'trust-score': function() {
      var events = WozVault.readAuditLog();
      var seals = events.filter(function(e) { return e.type && e.type.indexOf('SEAL') >= 0; });
      var score = Math.min(1, seals.length * 0.1 + 0.5);
      return 'trust: ' + Math.round(score * 100) + '%\nevents: ' + events.length + '\nseals: ' + seals.length;
    },
    'draw-agent': function() {
      return [
        '      .---.',
        '     /     \\      [LISP AGENT: AWAKE]',
        '    | () () |     [TRUST: VERIFIED]',
        '     \\  ^  /      [ADA CONTRACT: ALLOWED]',
        '      |||||       [WOZ VAULT: ONLINE]'
      ].join('\n');
    },
    'woz-vault-count': function() {
      return WozVault.readAuditLog().length;
    },
    'seal-state': function() {
      var events = WozVault.readAuditLog();
      var seals = events.filter(function(e) { return e.type && e.type.indexOf('SEAL') >= 0; });
      return 'sealed_events: ' + seals.length + '\nlast_seal: ' + (seals.length > 0 ? (seals[seals.length - 1].seal || 'none').slice(0, 16) + '...' : 'none');
    }
  },

  eval: function(expr) {
    if (expr === null || expr === undefined) return null;
    if (typeof expr === 'number') return expr;
    if (typeof expr === 'string') {
      if (this.env.hasOwnProperty(expr)) return this.env[expr];
      return expr;
    }
    if (Array.isArray(expr)) {
      if (expr.length === 0) return [];
      var op = expr[0];
      var args = expr.slice(1).map(this.eval.bind(this));

      if (typeof op === 'string' && this.safeOps[op]) {
        return this.safeOps[op](args);
      }
      return [op].concat(args);
    }
    return expr;
  }
};