clementine-agent 1.0.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 (190) hide show
  1. package/.env.example +44 -0
  2. package/LICENSE +21 -0
  3. package/README.md +795 -0
  4. package/dist/agent/agent-manager.d.ts +69 -0
  5. package/dist/agent/agent-manager.js +441 -0
  6. package/dist/agent/assistant.d.ts +225 -0
  7. package/dist/agent/assistant.js +3888 -0
  8. package/dist/agent/auto-update.d.ts +32 -0
  9. package/dist/agent/auto-update.js +186 -0
  10. package/dist/agent/daily-planner.d.ts +24 -0
  11. package/dist/agent/daily-planner.js +379 -0
  12. package/dist/agent/execution-advisor.d.ts +10 -0
  13. package/dist/agent/execution-advisor.js +272 -0
  14. package/dist/agent/hooks.d.ts +45 -0
  15. package/dist/agent/hooks.js +564 -0
  16. package/dist/agent/insight-engine.d.ts +66 -0
  17. package/dist/agent/insight-engine.js +225 -0
  18. package/dist/agent/intent-classifier.d.ts +48 -0
  19. package/dist/agent/intent-classifier.js +214 -0
  20. package/dist/agent/link-extractor.d.ts +19 -0
  21. package/dist/agent/link-extractor.js +90 -0
  22. package/dist/agent/mcp-bridge.d.ts +62 -0
  23. package/dist/agent/mcp-bridge.js +435 -0
  24. package/dist/agent/metacognition.d.ts +66 -0
  25. package/dist/agent/metacognition.js +221 -0
  26. package/dist/agent/orchestrator.d.ts +81 -0
  27. package/dist/agent/orchestrator.js +790 -0
  28. package/dist/agent/profiles.d.ts +22 -0
  29. package/dist/agent/profiles.js +91 -0
  30. package/dist/agent/prompt-cache.d.ts +24 -0
  31. package/dist/agent/prompt-cache.js +68 -0
  32. package/dist/agent/prompt-evolver.d.ts +28 -0
  33. package/dist/agent/prompt-evolver.js +279 -0
  34. package/dist/agent/role-scaffolds.d.ts +28 -0
  35. package/dist/agent/role-scaffolds.js +433 -0
  36. package/dist/agent/safe-restart.d.ts +41 -0
  37. package/dist/agent/safe-restart.js +150 -0
  38. package/dist/agent/self-improve.d.ts +66 -0
  39. package/dist/agent/self-improve.js +1706 -0
  40. package/dist/agent/session-event-log.d.ts +114 -0
  41. package/dist/agent/session-event-log.js +233 -0
  42. package/dist/agent/skill-extractor.d.ts +72 -0
  43. package/dist/agent/skill-extractor.js +435 -0
  44. package/dist/agent/source-mods.d.ts +61 -0
  45. package/dist/agent/source-mods.js +230 -0
  46. package/dist/agent/source-preflight.d.ts +25 -0
  47. package/dist/agent/source-preflight.js +100 -0
  48. package/dist/agent/stall-guard.d.ts +62 -0
  49. package/dist/agent/stall-guard.js +109 -0
  50. package/dist/agent/strategic-planner.d.ts +60 -0
  51. package/dist/agent/strategic-planner.js +352 -0
  52. package/dist/agent/team-bus.d.ts +89 -0
  53. package/dist/agent/team-bus.js +556 -0
  54. package/dist/agent/team-router.d.ts +26 -0
  55. package/dist/agent/team-router.js +37 -0
  56. package/dist/agent/tool-loop-detector.d.ts +59 -0
  57. package/dist/agent/tool-loop-detector.js +242 -0
  58. package/dist/agent/workflow-runner.d.ts +36 -0
  59. package/dist/agent/workflow-runner.js +317 -0
  60. package/dist/agent/workflow-variables.d.ts +16 -0
  61. package/dist/agent/workflow-variables.js +62 -0
  62. package/dist/channels/discord-agent-bot.d.ts +101 -0
  63. package/dist/channels/discord-agent-bot.js +881 -0
  64. package/dist/channels/discord-bot-manager.d.ts +80 -0
  65. package/dist/channels/discord-bot-manager.js +262 -0
  66. package/dist/channels/discord-utils.d.ts +51 -0
  67. package/dist/channels/discord-utils.js +293 -0
  68. package/dist/channels/discord.d.ts +12 -0
  69. package/dist/channels/discord.js +1832 -0
  70. package/dist/channels/slack-agent-bot.d.ts +73 -0
  71. package/dist/channels/slack-agent-bot.js +320 -0
  72. package/dist/channels/slack-bot-manager.d.ts +66 -0
  73. package/dist/channels/slack-bot-manager.js +236 -0
  74. package/dist/channels/slack-utils.d.ts +39 -0
  75. package/dist/channels/slack-utils.js +189 -0
  76. package/dist/channels/slack.d.ts +11 -0
  77. package/dist/channels/slack.js +196 -0
  78. package/dist/channels/telegram.d.ts +10 -0
  79. package/dist/channels/telegram.js +235 -0
  80. package/dist/channels/webhook.d.ts +9 -0
  81. package/dist/channels/webhook.js +78 -0
  82. package/dist/channels/whatsapp.d.ts +11 -0
  83. package/dist/channels/whatsapp.js +181 -0
  84. package/dist/cli/chat.d.ts +14 -0
  85. package/dist/cli/chat.js +220 -0
  86. package/dist/cli/cron.d.ts +17 -0
  87. package/dist/cli/cron.js +552 -0
  88. package/dist/cli/dashboard.d.ts +15 -0
  89. package/dist/cli/dashboard.js +17677 -0
  90. package/dist/cli/index.d.ts +3 -0
  91. package/dist/cli/index.js +2474 -0
  92. package/dist/cli/routes/delegations.d.ts +19 -0
  93. package/dist/cli/routes/delegations.js +154 -0
  94. package/dist/cli/routes/digest.d.ts +17 -0
  95. package/dist/cli/routes/digest.js +375 -0
  96. package/dist/cli/routes/goals.d.ts +14 -0
  97. package/dist/cli/routes/goals.js +258 -0
  98. package/dist/cli/routes/workflows.d.ts +18 -0
  99. package/dist/cli/routes/workflows.js +97 -0
  100. package/dist/cli/setup.d.ts +8 -0
  101. package/dist/cli/setup.js +619 -0
  102. package/dist/cli/tunnel.d.ts +35 -0
  103. package/dist/cli/tunnel.js +141 -0
  104. package/dist/config.d.ts +145 -0
  105. package/dist/config.js +278 -0
  106. package/dist/events/bus.d.ts +43 -0
  107. package/dist/events/bus.js +136 -0
  108. package/dist/gateway/cron-scheduler.d.ts +166 -0
  109. package/dist/gateway/cron-scheduler.js +1767 -0
  110. package/dist/gateway/delivery-queue.d.ts +30 -0
  111. package/dist/gateway/delivery-queue.js +110 -0
  112. package/dist/gateway/heartbeat-scheduler.d.ts +99 -0
  113. package/dist/gateway/heartbeat-scheduler.js +1298 -0
  114. package/dist/gateway/heartbeat.d.ts +3 -0
  115. package/dist/gateway/heartbeat.js +3 -0
  116. package/dist/gateway/lanes.d.ts +24 -0
  117. package/dist/gateway/lanes.js +76 -0
  118. package/dist/gateway/notifications.d.ts +29 -0
  119. package/dist/gateway/notifications.js +75 -0
  120. package/dist/gateway/router.d.ts +210 -0
  121. package/dist/gateway/router.js +1330 -0
  122. package/dist/index.d.ts +12 -0
  123. package/dist/index.js +1015 -0
  124. package/dist/memory/chunker.d.ts +28 -0
  125. package/dist/memory/chunker.js +226 -0
  126. package/dist/memory/consolidation.d.ts +44 -0
  127. package/dist/memory/consolidation.js +171 -0
  128. package/dist/memory/context-assembler.d.ts +50 -0
  129. package/dist/memory/context-assembler.js +149 -0
  130. package/dist/memory/embeddings.d.ts +38 -0
  131. package/dist/memory/embeddings.js +180 -0
  132. package/dist/memory/graph-store.d.ts +66 -0
  133. package/dist/memory/graph-store.js +613 -0
  134. package/dist/memory/mmr.d.ts +21 -0
  135. package/dist/memory/mmr.js +75 -0
  136. package/dist/memory/search.d.ts +26 -0
  137. package/dist/memory/search.js +67 -0
  138. package/dist/memory/store.d.ts +530 -0
  139. package/dist/memory/store.js +2022 -0
  140. package/dist/security/integrity.d.ts +24 -0
  141. package/dist/security/integrity.js +58 -0
  142. package/dist/security/patterns.d.ts +34 -0
  143. package/dist/security/patterns.js +110 -0
  144. package/dist/security/scanner.d.ts +32 -0
  145. package/dist/security/scanner.js +263 -0
  146. package/dist/tools/admin-tools.d.ts +12 -0
  147. package/dist/tools/admin-tools.js +1278 -0
  148. package/dist/tools/external-tools.d.ts +11 -0
  149. package/dist/tools/external-tools.js +1327 -0
  150. package/dist/tools/goal-tools.d.ts +9 -0
  151. package/dist/tools/goal-tools.js +159 -0
  152. package/dist/tools/mcp-server.d.ts +13 -0
  153. package/dist/tools/mcp-server.js +141 -0
  154. package/dist/tools/memory-tools.d.ts +10 -0
  155. package/dist/tools/memory-tools.js +568 -0
  156. package/dist/tools/session-tools.d.ts +6 -0
  157. package/dist/tools/session-tools.js +146 -0
  158. package/dist/tools/shared.d.ts +216 -0
  159. package/dist/tools/shared.js +340 -0
  160. package/dist/tools/team-tools.d.ts +6 -0
  161. package/dist/tools/team-tools.js +447 -0
  162. package/dist/tools/tool-meta.d.ts +34 -0
  163. package/dist/tools/tool-meta.js +133 -0
  164. package/dist/tools/vault-tools.d.ts +8 -0
  165. package/dist/tools/vault-tools.js +457 -0
  166. package/dist/types.d.ts +716 -0
  167. package/dist/types.js +16 -0
  168. package/dist/vault-migrations/0001-add-execution-framework.d.ts +10 -0
  169. package/dist/vault-migrations/0001-add-execution-framework.js +47 -0
  170. package/dist/vault-migrations/0002-add-agentic-communication.d.ts +12 -0
  171. package/dist/vault-migrations/0002-add-agentic-communication.js +79 -0
  172. package/dist/vault-migrations/0003-update-execution-pipeline-narration.d.ts +11 -0
  173. package/dist/vault-migrations/0003-update-execution-pipeline-narration.js +73 -0
  174. package/dist/vault-migrations/helpers.d.ts +14 -0
  175. package/dist/vault-migrations/helpers.js +44 -0
  176. package/dist/vault-migrations/runner.d.ts +14 -0
  177. package/dist/vault-migrations/runner.js +139 -0
  178. package/dist/vault-migrations/types.d.ts +42 -0
  179. package/dist/vault-migrations/types.js +9 -0
  180. package/install.sh +320 -0
  181. package/package.json +84 -0
  182. package/scripts/postinstall.js +125 -0
  183. package/vault/00-System/AGENTS.md +66 -0
  184. package/vault/00-System/CRON.md +71 -0
  185. package/vault/00-System/HEARTBEAT.md +58 -0
  186. package/vault/00-System/MEMORY.md +16 -0
  187. package/vault/00-System/SOUL.md +96 -0
  188. package/vault/05-Tasks/TASKS.md +19 -0
  189. package/vault/06-Templates/_Daily-Template.md +28 -0
  190. package/vault/06-Templates/_People-Template.md +22 -0
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Clementine TypeScript — Delivery retry queue.
3
+ *
4
+ * File-backed queue for messages that failed to deliver.
5
+ * Retries up to 3 times on a 5-minute interval, then logs as permanently failed.
6
+ */
7
+ import type { NotificationContext } from '../types.js';
8
+ type SendFn = (text: string, context?: NotificationContext) => Promise<{
9
+ delivered: boolean;
10
+ }>;
11
+ export declare class DeliveryQueue {
12
+ private queue;
13
+ private timer;
14
+ private sendFn;
15
+ constructor();
16
+ /** Register the send function (from NotificationDispatcher). */
17
+ setSender(fn: SendFn): void;
18
+ /** Start the retry drain loop. */
19
+ start(): void;
20
+ stop(): void;
21
+ /** Enqueue a failed message for retry. */
22
+ enqueue(text: string, context?: NotificationContext): void;
23
+ /** Drain the queue: retry each message, remove successes and expired items. */
24
+ private drain;
25
+ get size(): number;
26
+ private load;
27
+ private save;
28
+ }
29
+ export {};
30
+ //# sourceMappingURL=delivery-queue.d.ts.map
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Clementine TypeScript — Delivery retry queue.
3
+ *
4
+ * File-backed queue for messages that failed to deliver.
5
+ * Retries up to 3 times on a 5-minute interval, then logs as permanently failed.
6
+ */
7
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
8
+ import path from 'node:path';
9
+ import pino from 'pino';
10
+ import { BASE_DIR } from '../config.js';
11
+ import { logToDailyNote } from './cron-scheduler.js';
12
+ const logger = pino({ name: 'clementine.delivery-queue' });
13
+ const QUEUE_FILE = path.join(BASE_DIR, 'delivery-queue.json');
14
+ const MAX_ATTEMPTS = 3;
15
+ const RETRY_INTERVAL_MS = 5 * 60 * 1000; // 5 minutes
16
+ export class DeliveryQueue {
17
+ queue = [];
18
+ timer = null;
19
+ sendFn = null;
20
+ constructor() {
21
+ this.load();
22
+ }
23
+ /** Register the send function (from NotificationDispatcher). */
24
+ setSender(fn) {
25
+ this.sendFn = fn;
26
+ }
27
+ /** Start the retry drain loop. */
28
+ start() {
29
+ if (this.timer)
30
+ return;
31
+ this.timer = setInterval(() => this.drain(), RETRY_INTERVAL_MS);
32
+ // Also do an immediate drain if there are queued items from a previous run
33
+ if (this.queue.length > 0) {
34
+ setTimeout(() => this.drain(), 10_000); // brief delay to let channels connect
35
+ }
36
+ }
37
+ stop() {
38
+ if (this.timer) {
39
+ clearInterval(this.timer);
40
+ this.timer = null;
41
+ }
42
+ }
43
+ /** Enqueue a failed message for retry. */
44
+ enqueue(text, context) {
45
+ const now = new Date().toISOString();
46
+ this.queue.push({
47
+ text,
48
+ context,
49
+ attempts: 1, // already tried once (the initial send that failed)
50
+ firstAttempt: now,
51
+ lastAttempt: now,
52
+ });
53
+ this.save();
54
+ logger.info({ queueSize: this.queue.length }, 'Message queued for retry');
55
+ }
56
+ /** Drain the queue: retry each message, remove successes and expired items. */
57
+ async drain() {
58
+ if (this.queue.length === 0 || !this.sendFn)
59
+ return;
60
+ logger.debug({ queueSize: this.queue.length }, 'Draining delivery queue');
61
+ const remaining = [];
62
+ for (const msg of this.queue) {
63
+ msg.attempts++;
64
+ msg.lastAttempt = new Date().toISOString();
65
+ try {
66
+ const result = await this.sendFn(msg.text, msg.context);
67
+ if (result.delivered) {
68
+ logger.info({ attempts: msg.attempts }, 'Queued message delivered on retry');
69
+ continue; // success — don't keep in queue
70
+ }
71
+ }
72
+ catch (err) {
73
+ logger.debug({ err }, 'Retry delivery attempt failed');
74
+ }
75
+ if (msg.attempts >= MAX_ATTEMPTS) {
76
+ // Permanently failed — log to daily note so the user can find it
77
+ const preview = msg.text.slice(0, 100).replace(/\n/g, ' ');
78
+ logToDailyNote(`**[Delivery permanently failed]** (${msg.attempts} attempts): ${preview}`);
79
+ logger.warn({ attempts: msg.attempts, preview }, 'Message permanently failed delivery — logged to daily note');
80
+ continue; // drop from queue
81
+ }
82
+ remaining.push(msg);
83
+ }
84
+ this.queue = remaining;
85
+ this.save();
86
+ }
87
+ get size() {
88
+ return this.queue.length;
89
+ }
90
+ load() {
91
+ if (!existsSync(QUEUE_FILE))
92
+ return;
93
+ try {
94
+ this.queue = JSON.parse(readFileSync(QUEUE_FILE, 'utf-8'));
95
+ }
96
+ catch {
97
+ logger.warn('Failed to parse delivery queue file — starting fresh');
98
+ this.queue = [];
99
+ }
100
+ }
101
+ save() {
102
+ try {
103
+ writeFileSync(QUEUE_FILE, JSON.stringify(this.queue, null, 2));
104
+ }
105
+ catch (err) {
106
+ logger.debug({ err }, 'Failed to persist delivery queue');
107
+ }
108
+ }
109
+ }
110
+ //# sourceMappingURL=delivery-queue.js.map
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Clementine TypeScript — Heartbeat scheduler.
3
+ *
4
+ * HeartbeatScheduler: periodic general check-ins using setInterval.
5
+ * Channel-agnostic — sends notifications via the NotificationDispatcher.
6
+ */
7
+ import type { HeartbeatWorkItem } from '../types.js';
8
+ import type { CronScheduler } from './cron-scheduler.js';
9
+ import type { NotificationDispatcher } from './notifications.js';
10
+ import type { Gateway } from './router.js';
11
+ export declare class HeartbeatScheduler {
12
+ private readonly stateFile;
13
+ private gateway;
14
+ private dispatcher;
15
+ private lastState;
16
+ private timer;
17
+ private running;
18
+ private lastSelfImproveDate;
19
+ private lastConsolidationDate;
20
+ private lastAgentSiRuns;
21
+ private cronScheduler;
22
+ private runLog;
23
+ /** Wire up the cron scheduler so daily plan suggestions can be applied. */
24
+ setCronScheduler(cs: CronScheduler): void;
25
+ private getLastAgentSiRun;
26
+ private setLastAgentSiRun;
27
+ constructor(gateway: Gateway, dispatcher: NotificationDispatcher);
28
+ start(): void;
29
+ stop(): void;
30
+ runManual(): Promise<string>;
31
+ private heartbeatTick;
32
+ /**
33
+ * Proactive insight check — gather signals, evaluate urgency, send if warranted.
34
+ * Runs as a lightweight Haiku call, separate from the main heartbeat LLM invocation.
35
+ */
36
+ private runInsightCheck;
37
+ /** Called when user replies to a proactive message — resets cooldown. */
38
+ recordInsightAcknowledged(): void;
39
+ private readHeartbeatConfig;
40
+ private loadState;
41
+ private saveState;
42
+ private computeStateFingerprint;
43
+ private computeChangesSummary;
44
+ /**
45
+ * Summarise recent chat/cron activity from transcripts so the heartbeat
46
+ * agent knows what happened since the last beat.
47
+ */
48
+ private getRecentActivitySummary;
49
+ /**
50
+ * Load active goal summaries for injection into heartbeat prompts.
51
+ * Returns null if no active goals exist.
52
+ */
53
+ static loadGoalSummary(): string | null;
54
+ /**
55
+ * Enrich top active goals with relevant memory snippets.
56
+ * Searches FTS5 memory for each goal's title+description to surface
57
+ * recent conversations and facts the heartbeat agent can act on.
58
+ */
59
+ private enrichGoalsWithMemory;
60
+ /**
61
+ * Proactively advance goals by writing trigger files for the cron scheduler
62
+ * to pick up. Scores ALL active goals — not just stale ones — so high-priority
63
+ * goals with pending nextActions get worked on even if recently updated.
64
+ *
65
+ * Conservative: max 2 triggers per tick, skips if triggers are already pending.
66
+ */
67
+ private advanceGoals;
68
+ /**
69
+ * Process pending inbox items. For each .md file in INBOX_DIR:
70
+ * - Routes to the gateway as a cron-style task for the agent to triage
71
+ * - The agent determines the intent (task, reference, reminder) and acts
72
+ * - Processed files are moved to a _processed subfolder
73
+ *
74
+ * Conservative: processes at most 3 items per heartbeat tick.
75
+ */
76
+ private processInbox;
77
+ static getTimeContext(hour: number): string;
78
+ private static shouldSuppressMessage;
79
+ private pruneReportedTopics;
80
+ private buildDedupContext;
81
+ private static extractReportedTopics;
82
+ private static stripTopicTags;
83
+ static loadWorkQueue(): HeartbeatWorkItem[];
84
+ private static saveWorkQueue;
85
+ private claimNextItem;
86
+ private completeItem;
87
+ private failItem;
88
+ static enqueueWork(opts: {
89
+ description: string;
90
+ prompt: string;
91
+ source: string;
92
+ priority?: 'high' | 'normal';
93
+ maxTurns?: number;
94
+ tier?: number;
95
+ agentSlug?: string;
96
+ }): string;
97
+ private shouldInvokeAgent;
98
+ }
99
+ //# sourceMappingURL=heartbeat-scheduler.d.ts.map