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.
- package/dist/cli/agent/loop.d.ts.map +1 -1
- package/dist/cli/agent/loop.js +18 -11
- package/dist/cli/agent/loop.js.map +1 -1
- package/dist/cli/agent/permissions.d.ts +16 -0
- package/dist/cli/agent/permissions.d.ts.map +1 -1
- package/dist/cli/agent/permissions.js +74 -5
- package/dist/cli/agent/permissions.js.map +1 -1
- package/dist/cli/agent/sandbox.d.ts.map +1 -1
- package/dist/cli/agent/sandbox.js +3 -0
- package/dist/cli/agent/sandbox.js.map +1 -1
- package/dist/cli/brain/archive.d.ts.map +1 -1
- package/dist/cli/brain/archive.js +48 -18
- package/dist/cli/brain/archive.js.map +1 -1
- package/dist/cli/brain/control-protocol.d.ts +17 -0
- package/dist/cli/brain/control-protocol.d.ts.map +1 -1
- package/dist/cli/brain/control-protocol.js +79 -0
- package/dist/cli/brain/control-protocol.js.map +1 -1
- package/dist/cli/brain/path-guard.d.ts +2 -0
- package/dist/cli/brain/path-guard.d.ts.map +1 -0
- package/dist/cli/brain/path-guard.js +94 -0
- package/dist/cli/brain/path-guard.js.map +1 -0
- package/dist/cli/brain/relay-client.d.ts +2 -0
- package/dist/cli/brain/relay-client.d.ts.map +1 -1
- package/dist/cli/brain/relay-client.js +58 -8
- package/dist/cli/brain/relay-client.js.map +1 -1
- package/dist/cli/brain/server.d.ts.map +1 -1
- package/dist/cli/brain/server.js +235 -23
- package/dist/cli/brain/server.js.map +1 -1
- package/dist/cli/brain/stdout-capture.d.ts +11 -0
- package/dist/cli/brain/stdout-capture.d.ts.map +1 -1
- package/dist/cli/brain/stdout-capture.js +42 -1
- package/dist/cli/brain/stdout-capture.js.map +1 -1
- package/dist/cli/brain/web-chat-handler.d.ts.map +1 -1
- package/dist/cli/brain/web-chat-handler.js +7 -0
- package/dist/cli/brain/web-chat-handler.js.map +1 -1
- package/dist/cli/checkpoints/revert.d.ts +5 -0
- package/dist/cli/checkpoints/revert.d.ts.map +1 -1
- package/dist/cli/checkpoints/revert.js +100 -11
- package/dist/cli/checkpoints/revert.js.map +1 -1
- package/dist/cli/checkpoints/store.d.ts +3 -0
- package/dist/cli/checkpoints/store.d.ts.map +1 -1
- package/dist/cli/checkpoints/store.js.map +1 -1
- package/dist/cli/commands/chat.d.ts.map +1 -1
- package/dist/cli/commands/chat.js +138 -73
- package/dist/cli/commands/chat.js.map +1 -1
- package/dist/cli/core/input.d.ts +0 -1
- package/dist/cli/core/input.d.ts.map +1 -1
- package/dist/cli/core/input.js +9 -17
- package/dist/cli/core/input.js.map +1 -1
- package/dist/cli/jarvis/autonomy.d.ts +13 -1
- package/dist/cli/jarvis/autonomy.d.ts.map +1 -1
- package/dist/cli/jarvis/autonomy.js +33 -1
- package/dist/cli/jarvis/autonomy.js.map +1 -1
- package/dist/cli/jarvis/core-ethics.d.ts +15 -0
- package/dist/cli/jarvis/core-ethics.d.ts.map +1 -1
- package/dist/cli/jarvis/core-ethics.js +110 -9
- package/dist/cli/jarvis/core-ethics.js.map +1 -1
- package/dist/cli/jarvis/daemon.d.ts.map +1 -1
- package/dist/cli/jarvis/daemon.js +8 -0
- package/dist/cli/jarvis/daemon.js.map +1 -1
- package/dist/cli/jarvis/instance-lock.d.ts.map +1 -1
- package/dist/cli/jarvis/instance-lock.js +132 -27
- package/dist/cli/jarvis/instance-lock.js.map +1 -1
- package/dist/cli/jarvis/learning.d.ts +6 -0
- package/dist/cli/jarvis/learning.d.ts.map +1 -1
- package/dist/cli/jarvis/learning.js +17 -3
- package/dist/cli/jarvis/learning.js.map +1 -1
- package/dist/cli/jarvis/notifications.d.ts.map +1 -1
- package/dist/cli/jarvis/notifications.js +75 -10
- package/dist/cli/jarvis/notifications.js.map +1 -1
- package/dist/cli/jarvis/onboarding.d.ts.map +1 -1
- package/dist/cli/jarvis/onboarding.js +32 -2
- package/dist/cli/jarvis/onboarding.js.map +1 -1
- package/dist/cli/jarvis/queue.d.ts +5 -0
- package/dist/cli/jarvis/queue.d.ts.map +1 -1
- package/dist/cli/jarvis/queue.js +23 -6
- package/dist/cli/jarvis/queue.js.map +1 -1
- package/dist/cli/jarvis/scheduler.d.ts +8 -0
- package/dist/cli/jarvis/scheduler.d.ts.map +1 -1
- package/dist/cli/jarvis/scheduler.js +32 -4
- package/dist/cli/jarvis/scheduler.js.map +1 -1
- package/dist/cli/jarvis/sentiment.d.ts +11 -0
- package/dist/cli/jarvis/sentiment.d.ts.map +1 -1
- package/dist/cli/jarvis/sentiment.js +40 -6
- package/dist/cli/jarvis/sentiment.js.map +1 -1
- package/dist/cli/jarvis/skills.d.ts +35 -0
- package/dist/cli/jarvis/skills.d.ts.map +1 -1
- package/dist/cli/jarvis/skills.js +144 -0
- package/dist/cli/jarvis/skills.js.map +1 -1
- package/dist/cli/jarvis/triggers.d.ts.map +1 -1
- package/dist/cli/jarvis/triggers.js +65 -9
- package/dist/cli/jarvis/triggers.js.map +1 -1
- package/dist/cli/jarvis/types.d.ts +10 -0
- package/dist/cli/jarvis/types.d.ts.map +1 -1
- package/dist/cli/jarvis/world-model.d.ts +4 -0
- package/dist/cli/jarvis/world-model.d.ts.map +1 -1
- package/dist/cli/jarvis/world-model.js +23 -1
- package/dist/cli/jarvis/world-model.js.map +1 -1
- package/dist/cli/providers/anthropic.d.ts +5 -1
- package/dist/cli/providers/anthropic.d.ts.map +1 -1
- package/dist/cli/providers/anthropic.js +133 -36
- package/dist/cli/providers/anthropic.js.map +1 -1
- package/dist/cli/providers/model-limits.d.ts +8 -0
- package/dist/cli/providers/model-limits.d.ts.map +1 -1
- package/dist/cli/providers/model-limits.js +41 -0
- package/dist/cli/providers/model-limits.js.map +1 -1
- package/dist/cli/providers/ollama.d.ts +2 -0
- package/dist/cli/providers/ollama.d.ts.map +1 -1
- package/dist/cli/providers/ollama.js +8 -0
- package/dist/cli/providers/ollama.js.map +1 -1
- package/dist/cli/providers/openai.d.ts +5 -1
- package/dist/cli/providers/openai.d.ts.map +1 -1
- package/dist/cli/providers/openai.js +66 -19
- package/dist/cli/providers/openai.js.map +1 -1
- package/dist/cli/providers/rate-limiter.d.ts +58 -20
- package/dist/cli/providers/rate-limiter.d.ts.map +1 -1
- package/dist/cli/providers/rate-limiter.js +212 -96
- package/dist/cli/providers/rate-limiter.js.map +1 -1
- package/dist/cli/providers/registry.d.ts.map +1 -1
- package/dist/cli/providers/registry.js +20 -12
- package/dist/cli/providers/registry.js.map +1 -1
- package/dist/cli/providers/types.d.ts +16 -5
- package/dist/cli/providers/types.d.ts.map +1 -1
- package/dist/spiral/cloud/content-extractor.d.ts.map +1 -1
- package/dist/spiral/cloud/content-extractor.js +6 -4
- package/dist/spiral/cloud/content-extractor.js.map +1 -1
- package/dist/spiral/cloud/search-provider.d.ts.map +1 -1
- package/dist/spiral/cloud/search-provider.js +7 -2
- package/dist/spiral/cloud/search-provider.js.map +1 -1
- package/dist/spiral/cloud/web-enricher.d.ts.map +1 -1
- package/dist/spiral/cloud/web-enricher.js +10 -2
- package/dist/spiral/cloud/web-enricher.js.map +1 -1
- package/dist/spiral/compression.d.ts +5 -2
- package/dist/spiral/compression.d.ts.map +1 -1
- package/dist/spiral/compression.js +23 -6
- package/dist/spiral/compression.js.map +1 -1
- package/dist/spiral/engine.d.ts +7 -1
- package/dist/spiral/engine.d.ts.map +1 -1
- package/dist/spiral/engine.js +83 -35
- package/dist/spiral/engine.js.map +1 -1
- package/dist/storage/database.d.ts.map +1 -1
- package/dist/storage/database.js +41 -0
- package/dist/storage/database.js.map +1 -1
- package/dist/storage/nodes.d.ts +6 -0
- package/dist/storage/nodes.d.ts.map +1 -1
- package/dist/storage/nodes.js +9 -0
- package/dist/storage/nodes.js.map +1 -1
- package/dist/storage/vectors.d.ts +1 -0
- package/dist/storage/vectors.d.ts.map +1 -1
- package/dist/storage/vectors.js +39 -7
- package/dist/storage/vectors.js.map +1 -1
- package/package.json +3 -3
package/dist/cli/jarvis/queue.js
CHANGED
|
@@ -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
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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
|
|
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":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAG1C,MAAM,UAAU,GAAoB,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;AAEjG,MAAM,cAAc,GAAuC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;AAE1F,MAAM,OAAO,WAAW;IACd,IAAI,CAAkB;IACtB,QAAQ,CAAS;IACjB,QAAQ,CAA6C;IACrD,eAAe,GAAkB,IAAI,CAAC;IAE9C,YAAY,WAAmB,EAAE,QAAoD;QACnF,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;QACxE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAExB,sDAAsD;QACtD,mEAAmE;QACnE,sEAAsE;QACtE,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACnC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC9B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;gBACxB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;gBAC3B,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;gBAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC5B,SAAS,GAAG,IAAI,CAAC;YACnB,CAAC;QACH,CAAC;QACD,gEAAgE;QAChE,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;YAClC,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;QACD,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAEO,IAAI;QACV,IAAI,CAAC;YACH,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC9B,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACjD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAoB,CAAC;gBAClD,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;oBACxD,OAAO,MAAM,CAAC;gBAChB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,+BAA+B;QACjC,CAAC;QACD,OAAO,EAAE,GAAG,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACtC,CAAC;IAEO,IAAI;QACV,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,CAAC;QACD,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO,CAAC,KAAa,EAAE,WAAmB,EAAE,IAK3C;QACC,MAAM,IAAI,GAAe;YACvB,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YACtB,KAAK;YACL,WAAW;YACX,MAAM,EAAE,SAAS;YACjB,QAAQ,EAAE,IAAI,EAAE,QAAQ,IAAI,QAAQ;YACpC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,OAAO,EAAE,CAAC;YACV,UAAU,EAAE,IAAI,EAAE,UAAU,IAAI,CAAC;YACjC,YAAY,EAAE,IAAI,EAAE,YAAY;YAChC,IAAI,EAAE,IAAI,EAAE,IAAI;SACjB,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC,QAAQ,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,EAAU;QAChB,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,UAAU,CAAC,EAAU,EAAE,OAGrB;QACA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI;YAAE,OAAO,SAAS,CAAC;QAE5B,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC/D,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS;YAAE,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACrE,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;YAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5D,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS;YAAE,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QAC9E,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC/D,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;YAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5D,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS;YAAE,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACxE,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS;YAAE,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QAC9E,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS;YAAE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAClE,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS;YAAE,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACxE,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAEzD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC,QAAQ,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,UAAU,CAAC,EAAU;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACxD,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC,QAAQ,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;OAQG;IACH,WAAW;QACT,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK;aAC5B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC;aACnC,MAAM,CAAC,CAAC,CAAC,EAAE;YACV,IAAI,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;YAChE,OAAO,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;gBAClC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC;gBACtD,OAAO,GAAG,EAAE,MAAM,KAAK,WAAW,CAAC;YACrC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEL,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QACpC,oEAAoE;QACpE,4DAA4D;QAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YAChC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACpF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;YAChF,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,GAAG,QAAQ,EAAE,CAAC;QACnD,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACnB,IAAI,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS;gBAAE,OAAO,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC;YAClE,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;IACzB,CAAC;IAED,WAAW,CAAC,MAAwB;QAClC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IAC1D,CAAC;IAED,WAAW;QACT,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,cAAc;QACZ,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;QACxE,MAAM,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAChD,IAAI,OAAO,GAAG,CAAC;YAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QAC7B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAChC,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;IAC5C,CAAC;IAED,mCAAmC;IAEnC,cAAc;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;IAC/B,CAAC;IAED,cAAc,CAAC,KAAwB;QACrC,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QAC9B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACjC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACpC,CAAC;aAAM,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,SAAS;QACP,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;QAClE,OAAO;YACL,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW;YAClC,aAAa,EAAE,OAAO,EAAE,EAAE,IAAI,IAAI;YAClC,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,MAAM;YAChD,cAAc,EAAE,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,MAAM;YACpD,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,MAAM;YAC9C,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM;YAClC,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;SACvE,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,mBAAmB;QACjB,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAE9C,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAE1C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAErF,MAAM,KAAK,GAAa,CAAC,sBAAsB,CAAC,CAAC;QAEjD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACzB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,cAAc,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;YAC7C,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBACpC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC;YACvD,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,aAAa,OAAO,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7E,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;YAC3C,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBACnC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,KAAK,IAAI,eAAe,EAAE,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,2CAA2C;IAC3C,aAAa;QACX,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;QACnD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;QAEjD,IAAI,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAE5D,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,OAAO,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,UAAU,CAAC,CAAC;QAClD,IAAI,OAAO,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,UAAU,CAAC,CAAC;QAClD,IAAI,SAAS,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS,OAAO,CAAC,CAAC;QACnD,IAAI,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,SAAS,CAAC,CAAC;QAC/C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,2CAA2C;IAC3C,WAAW,CAAC,OAAkD;QAC5D,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;CACF"}
|
|
@@ -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;
|
|
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
|
-
//
|
|
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
|
-
|
|
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
|
-
//
|
|
178
|
-
|
|
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":"AAAA;;;;GAIG;AACH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAG1C,MAAM,UAAU,GAAkB,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;AAE3E;;;;GAIG;AACH,SAAS,WAAW,CAAC,UAAkB,EAAE,IAAU;IACjD,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAErC,MAAM,MAAM,GAAG;QACb,IAAI,CAAC,UAAU,EAAE,EAAM,OAAO;QAC9B,IAAI,CAAC,QAAQ,EAAE,EAAQ,OAAO;QAC9B,IAAI,CAAC,OAAO,EAAE,EAAS,OAAO;QAC9B,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAI,OAAO;QAC9B,IAAI,CAAC,MAAM,EAAE,EAAU,iBAAiB;KACzC,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IAC3D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa,EAAE,KAAa;IACpD,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAE/B,
|
|
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;
|
|
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
|
-
//
|
|
103
|
-
|
|
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?.(
|
|
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":"AAAA;;;;GAIG;AACH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAK1C,MAAM,WAAW,GAAG,GAAG,CAAC;AACxB,MAAM,YAAY,GAAG,EAAE,CAAC;
|
|
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;
|
|
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.
|