helixmind 0.6.5 → 0.7.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.
Files changed (152) hide show
  1. package/dist/cli/agent/loop.d.ts.map +1 -1
  2. package/dist/cli/agent/loop.js +18 -11
  3. package/dist/cli/agent/loop.js.map +1 -1
  4. package/dist/cli/agent/permissions.d.ts +16 -0
  5. package/dist/cli/agent/permissions.d.ts.map +1 -1
  6. package/dist/cli/agent/permissions.js +74 -5
  7. package/dist/cli/agent/permissions.js.map +1 -1
  8. package/dist/cli/agent/sandbox.d.ts.map +1 -1
  9. package/dist/cli/agent/sandbox.js +3 -0
  10. package/dist/cli/agent/sandbox.js.map +1 -1
  11. package/dist/cli/brain/archive.d.ts.map +1 -1
  12. package/dist/cli/brain/archive.js +48 -18
  13. package/dist/cli/brain/archive.js.map +1 -1
  14. package/dist/cli/brain/control-protocol.d.ts +17 -0
  15. package/dist/cli/brain/control-protocol.d.ts.map +1 -1
  16. package/dist/cli/brain/control-protocol.js +79 -0
  17. package/dist/cli/brain/control-protocol.js.map +1 -1
  18. package/dist/cli/brain/path-guard.d.ts +2 -0
  19. package/dist/cli/brain/path-guard.d.ts.map +1 -0
  20. package/dist/cli/brain/path-guard.js +94 -0
  21. package/dist/cli/brain/path-guard.js.map +1 -0
  22. package/dist/cli/brain/relay-client.d.ts +2 -0
  23. package/dist/cli/brain/relay-client.d.ts.map +1 -1
  24. package/dist/cli/brain/relay-client.js +58 -8
  25. package/dist/cli/brain/relay-client.js.map +1 -1
  26. package/dist/cli/brain/server.d.ts.map +1 -1
  27. package/dist/cli/brain/server.js +235 -23
  28. package/dist/cli/brain/server.js.map +1 -1
  29. package/dist/cli/brain/stdout-capture.d.ts +11 -0
  30. package/dist/cli/brain/stdout-capture.d.ts.map +1 -1
  31. package/dist/cli/brain/stdout-capture.js +42 -1
  32. package/dist/cli/brain/stdout-capture.js.map +1 -1
  33. package/dist/cli/brain/web-chat-handler.d.ts.map +1 -1
  34. package/dist/cli/brain/web-chat-handler.js +7 -0
  35. package/dist/cli/brain/web-chat-handler.js.map +1 -1
  36. package/dist/cli/checkpoints/revert.d.ts +5 -0
  37. package/dist/cli/checkpoints/revert.d.ts.map +1 -1
  38. package/dist/cli/checkpoints/revert.js +100 -11
  39. package/dist/cli/checkpoints/revert.js.map +1 -1
  40. package/dist/cli/checkpoints/store.d.ts +3 -0
  41. package/dist/cli/checkpoints/store.d.ts.map +1 -1
  42. package/dist/cli/checkpoints/store.js.map +1 -1
  43. package/dist/cli/commands/chat.d.ts.map +1 -1
  44. package/dist/cli/commands/chat.js +138 -73
  45. package/dist/cli/commands/chat.js.map +1 -1
  46. package/dist/cli/core/input.d.ts +0 -1
  47. package/dist/cli/core/input.d.ts.map +1 -1
  48. package/dist/cli/core/input.js +9 -17
  49. package/dist/cli/core/input.js.map +1 -1
  50. package/dist/cli/jarvis/autonomy.d.ts +13 -1
  51. package/dist/cli/jarvis/autonomy.d.ts.map +1 -1
  52. package/dist/cli/jarvis/autonomy.js +33 -1
  53. package/dist/cli/jarvis/autonomy.js.map +1 -1
  54. package/dist/cli/jarvis/core-ethics.d.ts +15 -0
  55. package/dist/cli/jarvis/core-ethics.d.ts.map +1 -1
  56. package/dist/cli/jarvis/core-ethics.js +110 -9
  57. package/dist/cli/jarvis/core-ethics.js.map +1 -1
  58. package/dist/cli/jarvis/daemon.d.ts.map +1 -1
  59. package/dist/cli/jarvis/daemon.js +8 -0
  60. package/dist/cli/jarvis/daemon.js.map +1 -1
  61. package/dist/cli/jarvis/instance-lock.d.ts.map +1 -1
  62. package/dist/cli/jarvis/instance-lock.js +132 -27
  63. package/dist/cli/jarvis/instance-lock.js.map +1 -1
  64. package/dist/cli/jarvis/learning.d.ts +6 -0
  65. package/dist/cli/jarvis/learning.d.ts.map +1 -1
  66. package/dist/cli/jarvis/learning.js +17 -3
  67. package/dist/cli/jarvis/learning.js.map +1 -1
  68. package/dist/cli/jarvis/notifications.d.ts.map +1 -1
  69. package/dist/cli/jarvis/notifications.js +75 -10
  70. package/dist/cli/jarvis/notifications.js.map +1 -1
  71. package/dist/cli/jarvis/onboarding.d.ts.map +1 -1
  72. package/dist/cli/jarvis/onboarding.js +32 -2
  73. package/dist/cli/jarvis/onboarding.js.map +1 -1
  74. package/dist/cli/jarvis/queue.d.ts +5 -0
  75. package/dist/cli/jarvis/queue.d.ts.map +1 -1
  76. package/dist/cli/jarvis/queue.js +23 -6
  77. package/dist/cli/jarvis/queue.js.map +1 -1
  78. package/dist/cli/jarvis/scheduler.d.ts +8 -0
  79. package/dist/cli/jarvis/scheduler.d.ts.map +1 -1
  80. package/dist/cli/jarvis/scheduler.js +32 -4
  81. package/dist/cli/jarvis/scheduler.js.map +1 -1
  82. package/dist/cli/jarvis/sentiment.d.ts +11 -0
  83. package/dist/cli/jarvis/sentiment.d.ts.map +1 -1
  84. package/dist/cli/jarvis/sentiment.js +40 -6
  85. package/dist/cli/jarvis/sentiment.js.map +1 -1
  86. package/dist/cli/jarvis/skills.d.ts +35 -0
  87. package/dist/cli/jarvis/skills.d.ts.map +1 -1
  88. package/dist/cli/jarvis/skills.js +144 -0
  89. package/dist/cli/jarvis/skills.js.map +1 -1
  90. package/dist/cli/jarvis/triggers.d.ts.map +1 -1
  91. package/dist/cli/jarvis/triggers.js +65 -9
  92. package/dist/cli/jarvis/triggers.js.map +1 -1
  93. package/dist/cli/jarvis/types.d.ts +10 -0
  94. package/dist/cli/jarvis/types.d.ts.map +1 -1
  95. package/dist/cli/jarvis/world-model.d.ts +4 -0
  96. package/dist/cli/jarvis/world-model.d.ts.map +1 -1
  97. package/dist/cli/jarvis/world-model.js +23 -1
  98. package/dist/cli/jarvis/world-model.js.map +1 -1
  99. package/dist/cli/providers/anthropic.d.ts +5 -1
  100. package/dist/cli/providers/anthropic.d.ts.map +1 -1
  101. package/dist/cli/providers/anthropic.js +133 -36
  102. package/dist/cli/providers/anthropic.js.map +1 -1
  103. package/dist/cli/providers/model-limits.d.ts +8 -0
  104. package/dist/cli/providers/model-limits.d.ts.map +1 -1
  105. package/dist/cli/providers/model-limits.js +41 -0
  106. package/dist/cli/providers/model-limits.js.map +1 -1
  107. package/dist/cli/providers/ollama.d.ts +2 -0
  108. package/dist/cli/providers/ollama.d.ts.map +1 -1
  109. package/dist/cli/providers/ollama.js +8 -0
  110. package/dist/cli/providers/ollama.js.map +1 -1
  111. package/dist/cli/providers/openai.d.ts +5 -1
  112. package/dist/cli/providers/openai.d.ts.map +1 -1
  113. package/dist/cli/providers/openai.js +66 -19
  114. package/dist/cli/providers/openai.js.map +1 -1
  115. package/dist/cli/providers/rate-limiter.d.ts +58 -20
  116. package/dist/cli/providers/rate-limiter.d.ts.map +1 -1
  117. package/dist/cli/providers/rate-limiter.js +212 -96
  118. package/dist/cli/providers/rate-limiter.js.map +1 -1
  119. package/dist/cli/providers/registry.d.ts.map +1 -1
  120. package/dist/cli/providers/registry.js +20 -12
  121. package/dist/cli/providers/registry.js.map +1 -1
  122. package/dist/cli/providers/types.d.ts +16 -5
  123. package/dist/cli/providers/types.d.ts.map +1 -1
  124. package/dist/spiral/cloud/content-extractor.d.ts.map +1 -1
  125. package/dist/spiral/cloud/content-extractor.js +6 -4
  126. package/dist/spiral/cloud/content-extractor.js.map +1 -1
  127. package/dist/spiral/cloud/search-provider.d.ts.map +1 -1
  128. package/dist/spiral/cloud/search-provider.js +7 -2
  129. package/dist/spiral/cloud/search-provider.js.map +1 -1
  130. package/dist/spiral/cloud/web-enricher.d.ts.map +1 -1
  131. package/dist/spiral/cloud/web-enricher.js +10 -2
  132. package/dist/spiral/cloud/web-enricher.js.map +1 -1
  133. package/dist/spiral/compression.d.ts +5 -2
  134. package/dist/spiral/compression.d.ts.map +1 -1
  135. package/dist/spiral/compression.js +23 -6
  136. package/dist/spiral/compression.js.map +1 -1
  137. package/dist/spiral/engine.d.ts +7 -1
  138. package/dist/spiral/engine.d.ts.map +1 -1
  139. package/dist/spiral/engine.js +83 -35
  140. package/dist/spiral/engine.js.map +1 -1
  141. package/dist/storage/database.d.ts.map +1 -1
  142. package/dist/storage/database.js +41 -0
  143. package/dist/storage/database.js.map +1 -1
  144. package/dist/storage/nodes.d.ts +6 -0
  145. package/dist/storage/nodes.d.ts.map +1 -1
  146. package/dist/storage/nodes.js +9 -0
  147. package/dist/storage/nodes.js.map +1 -1
  148. package/dist/storage/vectors.d.ts +1 -0
  149. package/dist/storage/vectors.d.ts.map +1 -1
  150. package/dist/storage/vectors.js +39 -7
  151. package/dist/storage/vectors.js.map +1 -1
  152. package/package.json +3 -3
@@ -12,10 +12,14 @@ export class JarvisQueue {
12
12
  this.onChange = onChange;
13
13
  this.data = this.load();
14
14
  // Crash recovery: reset stale state from previous run
15
+ // FIX: JARVIS-LOW-1 — also clear startedAt/completedAt so the task
16
+ // appears truly pending in UI and metrics, not "started N hours ago".
15
17
  let needsSave = false;
16
18
  for (const task of this.data.tasks) {
17
19
  if (task.status === 'running') {
18
20
  task.status = 'pending';
21
+ task.startedAt = undefined;
22
+ task.completedAt = undefined;
19
23
  task.updatedAt = Date.now();
20
24
  needsSave = true;
21
25
  }
@@ -117,6 +121,11 @@ export class JarvisQueue {
117
121
  /**
118
122
  * Returns the next task to execute: highest priority pending task
119
123
  * whose dependencies (if any) are all completed.
124
+ *
125
+ * FIX: JARVIS-MEDIUM-1 — effective priority now includes an age boost
126
+ * (one step every 10 minutes, capped at +2). Without this, a steady
127
+ * stream of `high` tasks would starve `medium`/`low` indefinitely.
128
+ * Ties continue to break by createdAt (FIFO within a priority band).
120
129
  */
121
130
  getNextTask() {
122
131
  const pending = this.data.tasks
@@ -129,13 +138,21 @@ export class JarvisQueue {
129
138
  return dep?.status === 'completed';
130
139
  });
131
140
  });
132
- pending.sort((a, b) => {
133
- if (PRIORITY_ORDER[a.priority] !== PRIORITY_ORDER[b.priority]) {
134
- return PRIORITY_ORDER[a.priority] - PRIORITY_ORDER[b.priority];
135
- }
136
- return a.createdAt - b.createdAt;
141
+ const now = Date.now();
142
+ const AGE_BOOST_MS = 10 * 60 * 1000;
143
+ // Higher score = picked first. Base score: high=3, medium=2, low=1.
144
+ // Age boost: one point per 10 minutes waited, capped at +2.
145
+ const scored = pending.map(task => {
146
+ const baseScore = task.priority === 'high' ? 3 : task.priority === 'medium' ? 2 : 1;
147
+ const ageBoost = Math.min(2, Math.floor((now - task.createdAt) / AGE_BOOST_MS));
148
+ return { task, effective: baseScore + ageBoost };
149
+ });
150
+ scored.sort((a, b) => {
151
+ if (a.effective !== b.effective)
152
+ return b.effective - a.effective;
153
+ return a.task.createdAt - b.task.createdAt;
137
154
  });
138
- return pending[0];
155
+ return scored[0]?.task;
139
156
  }
140
157
  getByStatus(status) {
141
158
  return this.data.tasks.filter(t => t.status === status);
@@ -1 +1 @@
1
- {"version":3,"file":"queue.js","sourceRoot":"","sources":["../../../src/cli/jarvis/queue.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"queue.js","sourceRoot":"","sources":["../../../src/cli/jarvis/queue.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,12 @@
1
1
  import type { ScheduleEntry, ScheduleType, JarvisTaskPriority } from './types.js';
2
+ /**
3
+ * FIX: JARVIS-HIGH-5 — compute the next time `cron` will match, starting from `from`.
4
+ * Returns the Unix-epoch ms of the next match, or undefined if nothing matches within
5
+ * the look-ahead window (capped at ~1 year so a malformed cron cannot pin the CPU).
6
+ *
7
+ * Resolution is one minute — seconds are ignored, matching cron semantics.
8
+ */
9
+ export declare function computeNextCronFire(cron: string, from: number): number | undefined;
2
10
  export declare class JarvisScheduler {
3
11
  private data;
4
12
  private filePath;
@@ -1 +1 @@
1
- {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../../src/cli/jarvis/scheduler.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAiB,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAoDjG,qBAAa,eAAe;IAC1B,OAAO,CAAC,IAAI,CAAgB;IAC5B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,CAAmD;gBAExD,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,KAAK,IAAI;IAM5F,OAAO,CAAC,IAAI;IAWZ,OAAO,CAAC,IAAI;IAMZ,WAAW,CACT,IAAI,EAAE,YAAY,EAClB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,EACvB,QAAQ,GAAE,kBAA6B,GACtC,aAAa;IAkBhB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAQnC;;;OAGG;IACH,IAAI,IAAI,aAAa,EAAE;IAqDvB,aAAa,IAAI,aAAa,EAAE;IAIhC,UAAU,IAAI,aAAa,GAAG,SAAS;IAMvC,WAAW,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,KAAK,IAAI,GAAG,IAAI;IAI5E,OAAO,CAAC,iBAAiB;CAgB1B"}
1
+ {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../../src/cli/jarvis/scheduler.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAiB,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAsDjG;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAelF;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,IAAI,CAAgB;IAC5B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,CAAmD;gBAExD,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,KAAK,IAAI;IAM5F,OAAO,CAAC,IAAI;IAWZ,OAAO,CAAC,IAAI;IAMZ,WAAW,CACT,IAAI,EAAE,YAAY,EAClB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,EACvB,QAAQ,GAAE,kBAA6B,GACtC,aAAa;IAkBhB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAQnC;;;OAGG;IACH,IAAI,IAAI,aAAa,EAAE;IAqDvB,aAAa,IAAI,aAAa,EAAE;IAIhC,UAAU,IAAI,aAAa,GAAG,SAAS;IAMvC,WAAW,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,KAAK,IAAI,GAAG,IAAI;IAI5E,OAAO,CAAC,iBAAiB;CAkB1B"}
@@ -31,10 +31,13 @@ function matchesCron(expression, date) {
31
31
  function matchesCronField(field, value) {
32
32
  if (field === '*')
33
33
  return true;
34
- // Step: */5 means every 5th
34
+ // FIX: JARVIS-HIGH-5 hardened step parsing. Rejects NaN / non-positive
35
+ // steps rather than falling through to the exact-number branch.
35
36
  if (field.startsWith('*/')) {
36
37
  const step = parseInt(field.slice(2), 10);
37
- return !isNaN(step) && step > 0 && value % step === 0;
38
+ if (!Number.isInteger(step) || step <= 0)
39
+ return false;
40
+ return value % step === 0;
38
41
  }
39
42
  // Comma-separated: 1,3,5
40
43
  if (field.includes(',')) {
@@ -49,6 +52,29 @@ function matchesCronField(field, value) {
49
52
  const num = parseInt(field, 10);
50
53
  return !isNaN(num) && value === num;
51
54
  }
55
+ /**
56
+ * FIX: JARVIS-HIGH-5 — compute the next time `cron` will match, starting from `from`.
57
+ * Returns the Unix-epoch ms of the next match, or undefined if nothing matches within
58
+ * the look-ahead window (capped at ~1 year so a malformed cron cannot pin the CPU).
59
+ *
60
+ * Resolution is one minute — seconds are ignored, matching cron semantics.
61
+ */
62
+ export function computeNextCronFire(cron, from) {
63
+ const parts = cron.trim().split(/\s+/);
64
+ if (parts.length !== 5)
65
+ return undefined;
66
+ const MAX_MINUTES_AHEAD = 366 * 24 * 60; // ~1 year
67
+ // Start from the next whole minute to avoid matching the current minute twice.
68
+ const start = new Date(from);
69
+ start.setSeconds(0, 0);
70
+ start.setMinutes(start.getMinutes() + 1);
71
+ for (let i = 0; i < MAX_MINUTES_AHEAD; i++) {
72
+ const candidate = new Date(start.getTime() + i * 60_000);
73
+ if (matchesCron(cron, candidate))
74
+ return candidate.getTime();
75
+ }
76
+ return undefined;
77
+ }
52
78
  export class JarvisScheduler {
53
79
  data;
54
80
  filePath;
@@ -174,8 +200,10 @@ export class JarvisScheduler {
174
200
  return !isNaN(ts) && ts > now ? ts : undefined;
175
201
  }
176
202
  case 'cron':
177
- // Approximate: next minute
178
- return now + 60_000;
203
+ // FIX: JARVIS-HIGH-5 — real next-fire computation replaces the
204
+ // "add 60s" approximation that caused mis-fires for any cron
205
+ // expression more specific than `* * * * *`.
206
+ return computeNextCronFire(expression, now);
179
207
  }
180
208
  }
181
209
  }
@@ -1 +1 @@
1
- {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../../src/cli/jarvis/scheduler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../../src/cli/jarvis/scheduler.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ export declare class SentimentAnalyzer {
3
3
  private filePath;
4
4
  private data;
5
5
  private onShift?;
6
+ private lastConfirmedSentiment;
6
7
  constructor(projectRoot: string, opts?: {
7
8
  onShift?: (from: UserSentiment, to: UserSentiment, frustrationLevel: number) => void;
8
9
  });
@@ -12,8 +13,18 @@ export declare class SentimentAnalyzer {
12
13
  detectSentiment(message: string): SentimentReading;
13
14
  /**
14
15
  * Record a reading and check for sentiment shifts.
16
+ *
17
+ * FIX: JARVIS-MEDIUM-4 — only fire onShift (which drives trait updates)
18
+ * when the new sentiment is *confirmed* by a rolling window: at least
19
+ * CONFIRM_WINDOW_REQUIRED of the last CONFIRM_WINDOW_SIZE readings must
20
+ * share the new sentiment. This prevents a single frustrated swear-word
21
+ * from durably shifting Jarvis' perception of the user's mood.
22
+ * analyzeMood() still returns the raw latest reading for UI display.
15
23
  */
16
24
  recordReading(reading: SentimentReading): void;
25
+ /** FIX: JARVIS-MEDIUM-4 — expose confirmed sentiment for callers that
26
+ * need the stable signal (e.g. trait adjustment) vs the latest reading. */
27
+ getConfirmedSentiment(): UserSentiment;
17
28
  /**
18
29
  * Analyze mood trend from recent readings.
19
30
  */
@@ -1 +1 @@
1
- {"version":3,"file":"sentiment.d.ts","sourceRoot":"","sources":["../../../src/cli/jarvis/sentiment.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,aAAa,EAAE,gBAAgB,EAAE,YAAY,EAC9C,MAAM,YAAY,CAAC;AAgEpB,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,IAAI,CAAgB;IAC5B,OAAO,CAAC,OAAO,CAAC,CAA6E;gBAG3F,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,KAAK,IAAI,CAAC;KACtF;IASH;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB;IAuBlD;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAqB9C;;OAEG;IACH,WAAW,IAAI,YAAY;IAgD3B;;OAEG;IACH,mBAAmB,IAAI,MAAM;IAe7B,OAAO,CAAC,YAAY;IA0BpB,OAAO,CAAC,IAAI;IAeZ,OAAO,CAAC,IAAI;CAOb"}
1
+ {"version":3,"file":"sentiment.d.ts","sourceRoot":"","sources":["../../../src/cli/jarvis/sentiment.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,aAAa,EAAE,gBAAgB,EAAE,YAAY,EAC9C,MAAM,YAAY,CAAC;AAqEpB,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,IAAI,CAAgB;IAC5B,OAAO,CAAC,OAAO,CAAC,CAA6E;IAI7F,OAAO,CAAC,sBAAsB,CAA4B;gBAGxD,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,KAAK,IAAI,CAAC;KACtF;IASH;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB;IAuBlD;;;;;;;;;OASG;IACH,aAAa,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAiC9C;+EAC2E;IAC3E,qBAAqB,IAAI,aAAa;IAItC;;OAEG;IACH,WAAW,IAAI,YAAY;IAgD3B;;OAEG;IACH,mBAAmB,IAAI,MAAM;IAe7B,OAAO,CAAC,YAAY;IA0BpB,OAAO,CAAC,IAAI;IAeZ,OAAO,CAAC,IAAI;CAOb"}
@@ -7,6 +7,11 @@ import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
7
7
  import { join, dirname } from 'node:path';
8
8
  const MAX_HISTORY = 200;
9
9
  const TREND_WINDOW = 10;
10
+ // FIX: JARVIS-MEDIUM-4 — single readings are too reactive for trait updates.
11
+ // We require CONFIRM_WINDOW_REQUIRED of the last CONFIRM_WINDOW_SIZE readings
12
+ // to agree before flipping the "confirmed" sentiment state.
13
+ const CONFIRM_WINDOW_SIZE = 5;
14
+ const CONFIRM_WINDOW_REQUIRED = 3;
10
15
  const PATTERNS = [
11
16
  {
12
17
  sentiment: 'frustrated',
@@ -58,6 +63,10 @@ export class SentimentAnalyzer {
58
63
  filePath;
59
64
  data;
60
65
  onShift;
66
+ // FIX: JARVIS-MEDIUM-4 — track the last confirmed sentiment separately
67
+ // from the raw rolling buffer. analyzeMood().current still reports the
68
+ // latest reading for UI, but trait adjustments should key off this.
69
+ lastConfirmedSentiment = 'neutral';
61
70
  constructor(projectRoot, opts) {
62
71
  this.filePath = join(projectRoot, '.helixmind', 'jarvis', 'sentiment.json');
63
72
  this.onShift = opts?.onShift;
@@ -89,23 +98,48 @@ export class SentimentAnalyzer {
89
98
  }
90
99
  /**
91
100
  * Record a reading and check for sentiment shifts.
101
+ *
102
+ * FIX: JARVIS-MEDIUM-4 — only fire onShift (which drives trait updates)
103
+ * when the new sentiment is *confirmed* by a rolling window: at least
104
+ * CONFIRM_WINDOW_REQUIRED of the last CONFIRM_WINDOW_SIZE readings must
105
+ * share the new sentiment. This prevents a single frustrated swear-word
106
+ * from durably shifting Jarvis' perception of the user's mood.
107
+ * analyzeMood() still returns the raw latest reading for UI display.
92
108
  */
93
109
  recordReading(reading) {
94
- const previous = this.data.history.length > 0
95
- ? this.data.history[this.data.history.length - 1]
96
- : null;
97
110
  this.data.history.push(reading);
98
111
  // Prune to max history
99
112
  if (this.data.history.length > MAX_HISTORY) {
100
113
  this.data.history = this.data.history.slice(-MAX_HISTORY);
101
114
  }
102
- // Check for sentiment shift
103
- if (previous && previous.sentiment !== reading.sentiment && reading.sentiment !== 'neutral') {
115
+ // Confirmation check over the rolling window.
116
+ const window = this.data.history.slice(-CONFIRM_WINDOW_SIZE);
117
+ const counts = new Map();
118
+ for (const r of window) {
119
+ counts.set(r.sentiment, (counts.get(r.sentiment) || 0) + 1);
120
+ }
121
+ let confirmedCandidate = this.lastConfirmedSentiment;
122
+ for (const [s, c] of counts) {
123
+ if (s === 'neutral')
124
+ continue;
125
+ if (c >= CONFIRM_WINDOW_REQUIRED) {
126
+ confirmedCandidate = s;
127
+ break;
128
+ }
129
+ }
130
+ if (confirmedCandidate !== this.lastConfirmedSentiment) {
131
+ const from = this.lastConfirmedSentiment;
132
+ this.lastConfirmedSentiment = confirmedCandidate;
104
133
  const mood = this.analyzeMood();
105
- this.onShift?.(previous.sentiment, reading.sentiment, mood.frustrationLevel);
134
+ this.onShift?.(from, confirmedCandidate, mood.frustrationLevel);
106
135
  }
107
136
  this.save();
108
137
  }
138
+ /** FIX: JARVIS-MEDIUM-4 — expose confirmed sentiment for callers that
139
+ * need the stable signal (e.g. trait adjustment) vs the latest reading. */
140
+ getConfirmedSentiment() {
141
+ return this.lastConfirmedSentiment;
142
+ }
109
143
  /**
110
144
  * Analyze mood trend from recent readings.
111
145
  */
@@ -1 +1 @@
1
- {"version":3,"file":"sentiment.js","sourceRoot":"","sources":["../../../src/cli/jarvis/sentiment.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sentiment.js","sourceRoot":"","sources":["../../../src/cli/jarvis/sentiment.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,13 @@
1
1
  import type { SkillManifest, SkillEntry, SkillContext, SkillToolDef, SkillToolHandler, SkillOrigin } from './types.js';
2
+ export interface SkillStaticCheckResult {
3
+ safe: boolean;
4
+ reasons: string[];
5
+ }
6
+ /**
7
+ * FIX: JARVIS-HIGH-1 — scans the generated JS entry point for dangerous
8
+ * patterns and for writes outside the skill directory.
9
+ */
10
+ export declare function staticallyValidateSkillCode(code: string, skillDir: string): SkillStaticCheckResult;
2
11
  export declare class SkillManager {
3
12
  private registry;
4
13
  private registryPath;
@@ -28,6 +37,12 @@ export declare class SkillManager {
28
37
  }>;
29
38
  /**
30
39
  * Activate a skill — load its code and register tools.
40
+ *
41
+ * FIX: JARVIS-HIGH-1 — LLM-generated skills (origin='jarvis_created')
42
+ * cannot be dynamically imported until the user has approved them.
43
+ * Until approved, activateSkill() returns { success: false } and emits
44
+ * a 'skill_pending_review' event via onChange so the UI can prompt the
45
+ * user. Built-in skills (origin='builtin') skip the gate.
31
46
  */
32
47
  activateSkill(name: string, ctx: SkillContext): Promise<{
33
48
  success: boolean;
@@ -37,6 +52,26 @@ export declare class SkillManager {
37
52
  * Deactivate a skill — unregister tools and call deactivate().
38
53
  */
39
54
  deactivateSkill(name: string): Promise<void>;
55
+ /**
56
+ * Run the static safety check against a skill's current on-disk code.
57
+ * Used by the UI "approve" flow to show what the user is about to trust.
58
+ */
59
+ reviewSkill(name: string): {
60
+ ok: boolean;
61
+ reasons: string[];
62
+ codePath?: string;
63
+ };
64
+ /**
65
+ * Mark a skill as user-approved. Runs the static check first and refuses
66
+ * if the code contains any dangerous patterns — user cannot approve code
67
+ * that imports child_process, uses eval(), etc.
68
+ */
69
+ approveSkill(name: string): {
70
+ success: boolean;
71
+ error?: string;
72
+ };
73
+ /** Revoke approval — user-facing undo. */
74
+ revokeSkillApproval(name: string): boolean;
40
75
  /**
41
76
  * Create a new skill from manifest + code.
42
77
  * Used when Jarvis builds a new skill after proposal approval.
@@ -1 +1 @@
1
- {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../../src/cli/jarvis/skills.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,aAAa,EAAE,UAAU,EAAqB,YAAY,EAC1D,YAAY,EAAE,gBAAgB,EAAe,WAAW,EAEzD,MAAM,YAAY,CAAC;AAIpB,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,cAAc,CAAuE;IAC7F,OAAO,CAAC,YAAY,CAA+F;IACnH,OAAO,CAAC,QAAQ,CAAC,CAA6C;gBAElD,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,KAAK,IAAI;IAStF,OAAO,CAAC,IAAI;IAWZ,OAAO,CAAC,IAAI;IAQZ;;;OAGG;IACH,cAAc,IAAI,aAAa,EAAE;IA0BjC;;;OAGG;IACH,YAAY,IAAI,IAAI;IA2BpB;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IA4C/E;;OAEG;IACG,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAsDnG;;OAEG;IACG,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBlD;;;OAGG;IACG,WAAW,CACf,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,WAA8B,GACrC,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IA2C/D,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAI9C,UAAU,IAAI,UAAU,EAAE;IAI1B,eAAe,IAAI,UAAU,EAAE;IAI/B,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG;QAAE,GAAG,EAAE,YAAY,CAAC;QAAC,OAAO,EAAE,gBAAgB,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;IAI/G,gBAAgB,IAAI,GAAG,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,YAAY,CAAC;QAAC,OAAO,EAAE,gBAAgB,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAIpG;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,GAAE,MAAU,GAAG,IAAI;IAqB7E;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IASpC;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAgBlC;;OAEG;IACH,eAAe,IAAI,MAAM,GAAG,IAAI;IA0BhC;;OAEG;IACH,aAAa,IAAI,MAAM;IAOvB;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI;CAGvE"}
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../../src/cli/jarvis/skills.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,60 @@ import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync } from
9
9
  import { join, dirname } from 'node:path';
10
10
  import { execSync } from 'node:child_process';
11
11
  const EMPTY_REGISTRY = { version: 1, skills: [] };
12
+ /**
13
+ * FIX: JARVIS-HIGH-1 — Static code review for LLM-generated skills.
14
+ * These patterns are hard-blocks before a skill can ever be approved.
15
+ * Even "approved" skills should not contain these — if the user approves
16
+ * anyway, they must deliberately edit the file.
17
+ *
18
+ * This is explicitly NOT a general sandboxing solution — once the code
19
+ * is imported, Node can do anything. The guard exists to stop the most
20
+ * obvious prompt-injection-to-RCE paths (spawn a shell, eval() a string,
21
+ * scribble outside the skills directory).
22
+ */
23
+ const DANGEROUS_CODE_PATTERNS = [
24
+ { pattern: /require\(\s*['"]child_process['"]\s*\)/, reason: 'imports child_process (spawn/exec)' },
25
+ { pattern: /from\s+['"]child_process['"]/, reason: 'imports child_process (spawn/exec)' },
26
+ { pattern: /require\(\s*['"]node:child_process['"]\s*\)/, reason: 'imports node:child_process' },
27
+ { pattern: /from\s+['"]node:child_process['"]/, reason: 'imports node:child_process' },
28
+ { pattern: /\beval\s*\(/, reason: 'uses eval()' },
29
+ { pattern: /\bnew\s+Function\s*\(/, reason: 'uses new Function()' },
30
+ { pattern: /require\(\s*['"]vm['"]\s*\)/, reason: 'imports vm module' },
31
+ { pattern: /from\s+['"]vm['"]/, reason: 'imports vm module' },
32
+ { pattern: /require\(\s*['"]node:vm['"]\s*\)/, reason: 'imports node:vm' },
33
+ { pattern: /from\s+['"]node:vm['"]/, reason: 'imports node:vm' },
34
+ // Arbitrary dlopen / native bindings
35
+ { pattern: /process\.dlopen\s*\(/, reason: 'calls process.dlopen' },
36
+ ];
37
+ /**
38
+ * FIX: JARVIS-HIGH-1 — scans the generated JS entry point for dangerous
39
+ * patterns and for writes outside the skill directory.
40
+ */
41
+ export function staticallyValidateSkillCode(code, skillDir) {
42
+ const reasons = [];
43
+ for (const { pattern, reason } of DANGEROUS_CODE_PATTERNS) {
44
+ if (pattern.test(code))
45
+ reasons.push(reason);
46
+ }
47
+ // Additionally block any require('fs')/fs-extra write path that targets
48
+ // a location outside .helixmind/jarvis/skills/. We can't fully parse
49
+ // arbitrary JS, but writeFileSync/appendFileSync with literal strings
50
+ // is the common vector — check those.
51
+ const writeCallPattern = /\b(writeFileSync|appendFileSync|writeFile|appendFile|createWriteStream|mkdirSync)\s*\(\s*(['"`])([^'"`]+)\2/g;
52
+ const skillDirNorm = skillDir.replace(/\\/g, '/').toLowerCase();
53
+ let m;
54
+ while ((m = writeCallPattern.exec(code)) !== null) {
55
+ const target = m[3].replace(/\\/g, '/').toLowerCase();
56
+ // Allow relative paths — they resolve against process.cwd() at
57
+ // runtime which is project-root. The sandbox will catch those.
58
+ // Only flag absolute-looking paths that don't land in the skills dir.
59
+ const looksAbsolute = /^[a-z]:\//.test(target) || target.startsWith('/');
60
+ if (looksAbsolute && !target.includes('.helixmind/jarvis/skills/') && !target.startsWith(skillDirNorm)) {
61
+ reasons.push(`writes outside skills dir: ${m[3]}`);
62
+ }
63
+ }
64
+ return { safe: reasons.length === 0, reasons };
65
+ }
12
66
  export class SkillManager {
13
67
  registry;
14
68
  registryPath;
@@ -144,11 +198,27 @@ export class SkillManager {
144
198
  }
145
199
  /**
146
200
  * Activate a skill — load its code and register tools.
201
+ *
202
+ * FIX: JARVIS-HIGH-1 — LLM-generated skills (origin='jarvis_created')
203
+ * cannot be dynamically imported until the user has approved them.
204
+ * Until approved, activateSkill() returns { success: false } and emits
205
+ * a 'skill_pending_review' event via onChange so the UI can prompt the
206
+ * user. Built-in skills (origin='builtin') skip the gate.
147
207
  */
148
208
  async activateSkill(name, ctx) {
149
209
  const entry = this.getSkill(name);
150
210
  if (!entry)
151
211
  return { success: false, error: `Skill "${name}" not found` };
212
+ // FIX: JARVIS-HIGH-1 — approval gate for jarvis-created skills.
213
+ const origin = entry.manifest.origin;
214
+ const requiresApproval = origin === 'jarvis_created' || origin === 'user';
215
+ if (requiresApproval && !entry.approved) {
216
+ const reason = `Skill "${name}" requires user approval before activation (origin: ${origin}).`;
217
+ entry.errors.push(reason);
218
+ this.save();
219
+ this.onChange?.('skill_pending_review', entry);
220
+ return { success: false, error: reason };
221
+ }
152
222
  // Install first if needed
153
223
  if (entry.status === 'available') {
154
224
  const installResult = await this.installSkill(name);
@@ -159,6 +229,29 @@ export class SkillManager {
159
229
  if (!existsSync(entryPoint)) {
160
230
  return { success: false, error: `Entry point not found: ${entry.manifest.main}` };
161
231
  }
232
+ // FIX: JARVIS-HIGH-1 — defense-in-depth: even an approved skill is
233
+ // re-scanned at load time. If the on-disk code has been swapped to
234
+ // something dangerous between approval and activation, we refuse.
235
+ if (requiresApproval) {
236
+ try {
237
+ const code = readFileSync(entryPoint, 'utf-8');
238
+ const skillDir = join(this.skillsDir, name);
239
+ const check = staticallyValidateSkillCode(code, skillDir);
240
+ if (!check.safe) {
241
+ const reason = `Skill "${name}" rejected by static check: ${check.reasons.join(', ')}`;
242
+ entry.status = 'error';
243
+ entry.errors.push(reason);
244
+ entry.approved = false; // revoke stale approval
245
+ entry.approvedAt = undefined;
246
+ this.save();
247
+ this.onChange?.('skill_rejected', entry);
248
+ return { success: false, error: reason };
249
+ }
250
+ }
251
+ catch (err) {
252
+ return { success: false, error: `Could not read skill code: ${err instanceof Error ? err.message : String(err)}` };
253
+ }
254
+ }
162
255
  try {
163
256
  // Dynamic import of the skill module
164
257
  const mod = await import(`file://${entryPoint.replace(/\\/g, '/')}`);
@@ -219,6 +312,57 @@ export class SkillManager {
219
312
  this.onChange?.('skill_deactivated', entry);
220
313
  }
221
314
  }
315
+ // ─── Approval (FIX: JARVIS-HIGH-1) ───────────────────────────────────
316
+ /**
317
+ * Run the static safety check against a skill's current on-disk code.
318
+ * Used by the UI "approve" flow to show what the user is about to trust.
319
+ */
320
+ reviewSkill(name) {
321
+ const entry = this.getSkill(name);
322
+ if (!entry)
323
+ return { ok: false, reasons: [`Skill "${name}" not found`] };
324
+ const codePath = join(this.skillsDir, name, entry.manifest.main);
325
+ if (!existsSync(codePath))
326
+ return { ok: false, reasons: [`Entry point missing: ${entry.manifest.main}`] };
327
+ try {
328
+ const code = readFileSync(codePath, 'utf-8');
329
+ const check = staticallyValidateSkillCode(code, join(this.skillsDir, name));
330
+ return { ok: check.safe, reasons: check.reasons, codePath };
331
+ }
332
+ catch (err) {
333
+ return { ok: false, reasons: [err instanceof Error ? err.message : String(err)], codePath };
334
+ }
335
+ }
336
+ /**
337
+ * Mark a skill as user-approved. Runs the static check first and refuses
338
+ * if the code contains any dangerous patterns — user cannot approve code
339
+ * that imports child_process, uses eval(), etc.
340
+ */
341
+ approveSkill(name) {
342
+ const review = this.reviewSkill(name);
343
+ if (!review.ok) {
344
+ return { success: false, error: `Cannot approve: ${review.reasons.join(', ')}` };
345
+ }
346
+ const entry = this.getSkill(name);
347
+ if (!entry)
348
+ return { success: false, error: `Skill "${name}" not found` };
349
+ entry.approved = true;
350
+ entry.approvedAt = Date.now();
351
+ this.save();
352
+ this.onChange?.('skill_approved', entry);
353
+ return { success: true };
354
+ }
355
+ /** Revoke approval — user-facing undo. */
356
+ revokeSkillApproval(name) {
357
+ const entry = this.getSkill(name);
358
+ if (!entry)
359
+ return false;
360
+ entry.approved = false;
361
+ entry.approvedAt = undefined;
362
+ this.save();
363
+ this.onChange?.('skill_approval_revoked', entry);
364
+ return true;
365
+ }
222
366
  // ─── Create (Jarvis Self-Building) ───────────────────────────────────
223
367
  /**
224
368
  * Create a new skill from manifest + code.