aiden-runtime 3.16.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 (159) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +465 -0
  3. package/config/devos.config.json +186 -0
  4. package/config/hardware.json +9 -0
  5. package/config/model-selection.json +7 -0
  6. package/config/setup-complete.json +20 -0
  7. package/dist/api/routes/computerUse.js +112 -0
  8. package/dist/api/server.js +6870 -0
  9. package/dist/bin/npx-init.js +71 -0
  10. package/dist/coordination/commandGate.js +115 -0
  11. package/dist/coordination/livePulse.js +127 -0
  12. package/dist/core/agentLoop.js +2718 -0
  13. package/dist/core/agentShield.js +231 -0
  14. package/dist/core/aidenIdentity.js +215 -0
  15. package/dist/core/aidenPersonality.js +166 -0
  16. package/dist/core/aidenSdk.js +374 -0
  17. package/dist/core/asyncTasks.js +82 -0
  18. package/dist/core/auditTrail.js +61 -0
  19. package/dist/core/auxiliaryClient.js +114 -0
  20. package/dist/core/bgLLM.js +108 -0
  21. package/dist/core/bm25.js +68 -0
  22. package/dist/core/callbackSystem.js +64 -0
  23. package/dist/core/channels/adapter.js +6 -0
  24. package/dist/core/channels/discord.js +173 -0
  25. package/dist/core/channels/email.js +253 -0
  26. package/dist/core/channels/imessage.js +164 -0
  27. package/dist/core/channels/manager.js +96 -0
  28. package/dist/core/channels/signal.js +140 -0
  29. package/dist/core/channels/slack.js +139 -0
  30. package/dist/core/channels/twilio.js +144 -0
  31. package/dist/core/channels/webhook.js +186 -0
  32. package/dist/core/channels/whatsapp.js +185 -0
  33. package/dist/core/clarifyBus.js +75 -0
  34. package/dist/core/codeInterpreter.js +82 -0
  35. package/dist/core/computerControl.js +439 -0
  36. package/dist/core/conversationMemory.js +334 -0
  37. package/dist/core/costTracker.js +221 -0
  38. package/dist/core/cronManager.js +217 -0
  39. package/dist/core/deepKB.js +77 -0
  40. package/dist/core/doctor.js +279 -0
  41. package/dist/core/dreamEngine.js +334 -0
  42. package/dist/core/entityGraph.js +169 -0
  43. package/dist/core/eventBus.js +16 -0
  44. package/dist/core/evolutionAnalyzer.js +153 -0
  45. package/dist/core/executionLoop.js +309 -0
  46. package/dist/core/executor.js +224 -0
  47. package/dist/core/failureAnalyzer.js +166 -0
  48. package/dist/core/fastPathExpansion.js +82 -0
  49. package/dist/core/faultEngine.js +106 -0
  50. package/dist/core/featureGates.js +70 -0
  51. package/dist/core/fileIngestion.js +113 -0
  52. package/dist/core/gateway.js +97 -0
  53. package/dist/core/goalTracker.js +75 -0
  54. package/dist/core/growthEngine.js +168 -0
  55. package/dist/core/hardwareDetector.js +98 -0
  56. package/dist/core/hooks.js +45 -0
  57. package/dist/core/httpKeepalive.js +46 -0
  58. package/dist/core/hybridSearch.js +101 -0
  59. package/dist/core/importers.js +164 -0
  60. package/dist/core/instinctSystem.js +223 -0
  61. package/dist/core/knowledgeBase.js +351 -0
  62. package/dist/core/learningMemory.js +121 -0
  63. package/dist/core/lessonsBrowser.js +125 -0
  64. package/dist/core/licenseManager.js +399 -0
  65. package/dist/core/logBuffer.js +85 -0
  66. package/dist/core/machineId.js +87 -0
  67. package/dist/core/mcpClient.js +442 -0
  68. package/dist/core/memoryDistiller.js +165 -0
  69. package/dist/core/memoryExtractor.js +212 -0
  70. package/dist/core/memoryIds.js +213 -0
  71. package/dist/core/memoryPreamble.js +113 -0
  72. package/dist/core/memoryQuery.js +136 -0
  73. package/dist/core/memoryRecall.js +140 -0
  74. package/dist/core/memoryStrategy.js +201 -0
  75. package/dist/core/messageValidator.js +85 -0
  76. package/dist/core/modelDiscovery.js +108 -0
  77. package/dist/core/modelRouter.js +118 -0
  78. package/dist/core/morningBriefing.js +203 -0
  79. package/dist/core/multiGoalValidator.js +51 -0
  80. package/dist/core/parallelExecutor.js +43 -0
  81. package/dist/core/passiveSkillObserver.js +204 -0
  82. package/dist/core/paths.js +57 -0
  83. package/dist/core/patternDetector.js +83 -0
  84. package/dist/core/planResponseRepair.js +64 -0
  85. package/dist/core/planTool.js +111 -0
  86. package/dist/core/playwrightBridge.js +356 -0
  87. package/dist/core/pluginSystem.js +121 -0
  88. package/dist/core/privateMode.js +85 -0
  89. package/dist/core/reactLoop.js +156 -0
  90. package/dist/core/recipeEngine.js +166 -0
  91. package/dist/core/responseCache.js +128 -0
  92. package/dist/core/runSandbox.js +132 -0
  93. package/dist/core/sandboxRunner.js +200 -0
  94. package/dist/core/scheduler.js +543 -0
  95. package/dist/core/secretScanner.js +49 -0
  96. package/dist/core/semanticMemory.js +223 -0
  97. package/dist/core/sessionMemory.js +259 -0
  98. package/dist/core/sessionRouter.js +91 -0
  99. package/dist/core/sessionSearch.js +163 -0
  100. package/dist/core/setupWizard.js +225 -0
  101. package/dist/core/skillImporter.js +303 -0
  102. package/dist/core/skillLibrary.js +144 -0
  103. package/dist/core/skillLoader.js +471 -0
  104. package/dist/core/skillTeacher.js +352 -0
  105. package/dist/core/skillValidator.js +210 -0
  106. package/dist/core/skillWriter.js +384 -0
  107. package/dist/core/slashAsTool.js +226 -0
  108. package/dist/core/spawnManager.js +197 -0
  109. package/dist/core/statusVerbs.js +43 -0
  110. package/dist/core/swarmManager.js +109 -0
  111. package/dist/core/taskQueue.js +119 -0
  112. package/dist/core/taskRecovery.js +128 -0
  113. package/dist/core/taskState.js +168 -0
  114. package/dist/core/telegramBot.js +152 -0
  115. package/dist/core/todoManager.js +70 -0
  116. package/dist/core/toolNameRepair.js +71 -0
  117. package/dist/core/toolRegistry.js +2730 -0
  118. package/dist/core/tools/calendarTool.js +98 -0
  119. package/dist/core/tools/companyFilingsTool.js +98 -0
  120. package/dist/core/tools/gmailTool.js +87 -0
  121. package/dist/core/tools/marketDataTool.js +135 -0
  122. package/dist/core/tools/socialResearchTool.js +121 -0
  123. package/dist/core/truthCheck.js +57 -0
  124. package/dist/core/updateChecker.js +74 -0
  125. package/dist/core/userCognitionProfile.js +238 -0
  126. package/dist/core/userProfile.js +341 -0
  127. package/dist/core/version.js +5 -0
  128. package/dist/core/visionAnalyze.js +161 -0
  129. package/dist/core/voice/audio.js +187 -0
  130. package/dist/core/voice/stt.js +226 -0
  131. package/dist/core/voice/tts.js +310 -0
  132. package/dist/core/voiceInput.js +118 -0
  133. package/dist/core/voiceOutput.js +130 -0
  134. package/dist/core/webSearch.js +326 -0
  135. package/dist/core/workflowTracker.js +72 -0
  136. package/dist/core/workspaceMemory.js +54 -0
  137. package/dist/core/youtubeTranscript.js +224 -0
  138. package/dist/integrations/computerUse/apiRegistry.js +113 -0
  139. package/dist/integrations/computerUse/screenAgent.js +203 -0
  140. package/dist/integrations/computerUse/visionLoop.js +296 -0
  141. package/dist/memory/memoryLayers.js +143 -0
  142. package/dist/providers/boa.js +93 -0
  143. package/dist/providers/cerebras.js +70 -0
  144. package/dist/providers/custom.js +89 -0
  145. package/dist/providers/gemini.js +82 -0
  146. package/dist/providers/groq.js +92 -0
  147. package/dist/providers/index.js +149 -0
  148. package/dist/providers/nvidia.js +70 -0
  149. package/dist/providers/ollama.js +99 -0
  150. package/dist/providers/openrouter.js +74 -0
  151. package/dist/providers/router.js +497 -0
  152. package/dist/providers/types.js +6 -0
  153. package/dist/security/browserVault.js +129 -0
  154. package/dist/security/dataGuard.js +89 -0
  155. package/dist/tools/eonetTool.js +72 -0
  156. package/dist/types/computerUse.js +2 -0
  157. package/dist/types/executor.js +2 -0
  158. package/dist-bundle/cli.js +357859 -0
  159. package/package.json +256 -0
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ // ============================================================
3
+ // DevOS — Autonomous AI Execution System
4
+ // Copyright (c) 2026 Shiva Deore. All rights reserved.
5
+ // ============================================================
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.parseICalDate = parseICalDate;
8
+ exports.getCalendarEvents = getCalendarEvents;
9
+ // ── iCal date parser ───────────────────────────────────────────
10
+ // Handles: 20260415T093000Z (UTC)
11
+ // 20260415T093000 (local, treated as UTC for simplicity)
12
+ // 20260415 (all-day)
13
+ function parseICalDate(dateStr) {
14
+ // Strip VALUE=DATE: prefix or TZID=...: prefix that may appear
15
+ const raw = dateStr.split(':').pop() ?? dateStr;
16
+ const cleaned = raw.replace(/[^0-9TZ]/g, '');
17
+ if (cleaned.length >= 15) {
18
+ const year = cleaned.substring(0, 4);
19
+ const month = cleaned.substring(4, 6);
20
+ const day = cleaned.substring(6, 8);
21
+ const hour = cleaned.substring(9, 11);
22
+ const min = cleaned.substring(11, 13);
23
+ const sec = cleaned.substring(13, 15);
24
+ const tz = cleaned.endsWith('Z') ? 'Z' : 'Z'; // treat all as UTC
25
+ return new Date(`${year}-${month}-${day}T${hour}:${min}:${sec}${tz}`);
26
+ }
27
+ if (cleaned.length >= 8) {
28
+ const year = cleaned.substring(0, 4);
29
+ const month = cleaned.substring(4, 6);
30
+ const day = cleaned.substring(6, 8);
31
+ return new Date(`${year}-${month}-${day}`);
32
+ }
33
+ return new Date(dateStr);
34
+ }
35
+ // ── iCal event parser ──────────────────────────────────────────
36
+ function unescape(value) {
37
+ return value
38
+ .replace(/\\n/g, ' ')
39
+ .replace(/\\,/g, ',')
40
+ .replace(/\\;/g, ';')
41
+ .replace(/\\\\/g, '\\');
42
+ }
43
+ // ── Public API ─────────────────────────────────────────────────
44
+ async function getCalendarEvents(icalUrl, daysAhead = 7) {
45
+ const controller = new AbortController();
46
+ const timer = setTimeout(() => controller.abort(), 15000);
47
+ let icalText;
48
+ try {
49
+ const resp = await fetch(icalUrl, { signal: controller.signal });
50
+ if (!resp.ok)
51
+ throw new Error(`HTTP ${resp.status}`);
52
+ icalText = await resp.text();
53
+ }
54
+ finally {
55
+ clearTimeout(timer);
56
+ }
57
+ const events = [];
58
+ const now = new Date();
59
+ const cutoff = new Date(now.getTime() + daysAhead * 24 * 60 * 60 * 1000);
60
+ // Split on VEVENT blocks
61
+ const blocks = icalText.split('BEGIN:VEVENT');
62
+ for (const block of blocks.slice(1)) {
63
+ const body = block.split('END:VEVENT')[0];
64
+ // Handle property folding (lines starting with whitespace are continuations)
65
+ const unfolded = body.replace(/\r?\n[ \t]/g, '');
66
+ const get = (key) => {
67
+ const m = unfolded.match(new RegExp(`${key}[^:]*:([^\r\n]*)`, 'i'));
68
+ return m ? unescape(m[1].trim()) : undefined;
69
+ };
70
+ const summary = get('SUMMARY');
71
+ const dtstart = get('DTSTART');
72
+ const dtend = get('DTEND');
73
+ const location = get('LOCATION');
74
+ const description = get('DESCRIPTION');
75
+ if (!summary || !dtstart)
76
+ continue;
77
+ try {
78
+ const start = parseICalDate(dtstart);
79
+ const end = dtend ? parseICalDate(dtend) : start;
80
+ // Only include upcoming events within the window
81
+ if (start >= now && start <= cutoff) {
82
+ events.push({
83
+ title: summary,
84
+ start,
85
+ end,
86
+ ...(location ? { location } : {}),
87
+ ...(description ? { description } : {}),
88
+ });
89
+ }
90
+ }
91
+ catch {
92
+ // skip malformed entries
93
+ }
94
+ }
95
+ events.sort((a, b) => a.start.getTime() - b.start.getTime());
96
+ console.log(`[Calendar] Fetched ${events.length} upcoming events (next ${daysAhead} days)`);
97
+ return events;
98
+ }
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ // ============================================================
3
+ // DevOS — Autonomous AI Execution System
4
+ // Copyright (c) 2026 Shiva Deore. All rights reserved.
5
+ // ============================================================
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.getCompanyInfo = getCompanyInfo;
8
+ // ── Fetch helper ──────────────────────────────────────────────
9
+ async function fetchJson(url, timeoutMs = 15000) {
10
+ const res = await fetch(url, {
11
+ headers: {
12
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36',
13
+ 'Accept': 'application/json',
14
+ },
15
+ signal: AbortSignal.timeout(timeoutMs),
16
+ });
17
+ if (!res.ok)
18
+ throw new Error(`HTTP ${res.status} for ${url}`);
19
+ return res.json();
20
+ }
21
+ // ── Symbol normalisation (mirrors marketDataTool) ─────────────
22
+ function normaliseSymbol(raw) {
23
+ const upper = raw.trim().toUpperCase();
24
+ if (upper.includes('.'))
25
+ return upper;
26
+ const NSE_HINTS = ['RELIANCE', 'TCS', 'INFY', 'WIPRO', 'HDFCBANK', 'ICICIBANK',
27
+ 'SBIN', 'BAJFINANCE', 'MARUTI', 'TATAMOTORS', 'TATASTEEL', 'ADANIENT',
28
+ 'ADANIPORTS', 'HINDUNILVR', 'NESTLEIND', 'LT', 'ITC', 'SUNPHARMA',
29
+ 'POWERGRID', 'NTPC', 'COALINDIA', 'ONGC', 'JSWSTEEL', 'AXISBANK',
30
+ 'KOTAKBANK', 'ULTRACEMCO', 'GRASIM', 'DRREDDY', 'CIPLA', 'TECHM',
31
+ 'HCLTECH', 'APOLLOHOSP', 'TITAN', 'BPCL', 'IOC', 'BHARTIARTL'];
32
+ if (NSE_HINTS.includes(upper))
33
+ return `${upper}.NS`;
34
+ const US_HINTS = ['AAPL', 'MSFT', 'GOOGL', 'GOOG', 'AMZN', 'TSLA', 'META',
35
+ 'NVDA', 'AMD', 'NFLX', 'INTC', 'QCOM', 'AVGO', 'CRM', 'ORCL', 'IBM'];
36
+ if (US_HINTS.includes(upper))
37
+ return upper;
38
+ return `${upper}.NS`;
39
+ }
40
+ // ── Safe number extractor ─────────────────────────────────────
41
+ function safeNum(obj, key) {
42
+ const v = obj?.[key]?.raw ?? obj?.[key];
43
+ return typeof v === 'number' && isFinite(v) ? v : undefined;
44
+ }
45
+ // ── Main export ───────────────────────────────────────────────
46
+ async function getCompanyInfo(symbol) {
47
+ const sym = normaliseSymbol(symbol);
48
+ const modules = ['assetProfile', 'defaultKeyStatistics', 'financialData'].join(',');
49
+ const url = `https://query1.finance.yahoo.com/v10/finance/quoteSummary/${encodeURIComponent(sym)}?modules=${modules}`;
50
+ let data;
51
+ try {
52
+ data = await fetchJson(url);
53
+ }
54
+ catch (e1) {
55
+ // Try query2 fallback
56
+ try {
57
+ const url2 = `https://query2.finance.yahoo.com/v10/finance/quoteSummary/${encodeURIComponent(sym)}?modules=${modules}`;
58
+ data = await fetchJson(url2);
59
+ }
60
+ catch (e2) {
61
+ throw new Error(`Unable to fetch company info for "${symbol}": ${e2.message}`);
62
+ }
63
+ }
64
+ const summary = data?.quoteSummary?.result?.[0];
65
+ if (!summary) {
66
+ const err = data?.quoteSummary?.error?.description ?? 'No data returned';
67
+ throw new Error(`Yahoo Finance quoteSummary error for "${sym}": ${err}`);
68
+ }
69
+ const profile = summary.assetProfile ?? {};
70
+ const keyStats = summary.defaultKeyStatistics ?? {};
71
+ const finData = summary.financialData ?? {};
72
+ // Description: cap at 600 chars for planner context efficiency
73
+ const rawDesc = (profile.longBusinessSummary ?? '');
74
+ const description = rawDesc.slice(0, 600) + (rawDesc.length > 600 ? '…' : '');
75
+ return {
76
+ symbol,
77
+ name: finData.targetHighPrice?.fmt ? sym : (keyStats.sharesOutstanding?.fmt ? sym : sym),
78
+ sector: profile.sector ?? 'Unknown',
79
+ industry: profile.industry ?? 'Unknown',
80
+ description: description || 'No description available.',
81
+ country: profile.country,
82
+ website: profile.website,
83
+ employees: safeNum(profile, 'fullTimeEmployees') ?? profile.fullTimeEmployees,
84
+ // Key statistics
85
+ marketCap: safeNum(keyStats, 'enterpriseValue') ?? safeNum(keyStats, 'marketCap'),
86
+ peRatio: safeNum(keyStats, 'trailingPE') ?? safeNum(keyStats, 'forwardPE'),
87
+ eps: safeNum(keyStats, 'trailingEps'),
88
+ beta: safeNum(keyStats, 'beta'),
89
+ bookValue: safeNum(keyStats, 'bookValue'),
90
+ // Financial data (TTM)
91
+ revenue: safeNum(finData, 'totalRevenue'),
92
+ grossProfit: safeNum(finData, 'grossProfits'),
93
+ ebitda: safeNum(finData, 'ebitda'),
94
+ profitMargin: safeNum(finData, 'profitMargins'),
95
+ revenueGrowth: safeNum(finData, 'revenueGrowth'),
96
+ source: 'Yahoo Finance (quoteSummary)',
97
+ };
98
+ }
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ // ============================================================
3
+ // DevOS — Autonomous AI Execution System
4
+ // Copyright (c) 2026 Shiva Deore. All rights reserved.
5
+ // ============================================================
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.readGmail = readGmail;
8
+ exports.sendGmail = sendGmail;
9
+ // ── Gmail reader (IMAP App Password) ─────────────────────────
10
+ // Returns messages if imap-simple is installed, otherwise returns
11
+ // an empty array and logs a hint.
12
+ async function readGmail(config, count = 10, folder = 'INBOX') {
13
+ try {
14
+ // Lazy-load imap-simple so its absence doesn't crash startup
15
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
16
+ const imapSimple = require('imap-simple');
17
+ const connection = await imapSimple.connect({
18
+ imap: {
19
+ user: config.email,
20
+ password: config.appPassword,
21
+ host: 'imap.gmail.com',
22
+ port: 993,
23
+ tls: true,
24
+ authTimeout: 10000,
25
+ },
26
+ });
27
+ await connection.openBox(folder);
28
+ const searchCriteria = ['UNSEEN'];
29
+ const fetchOptions = {
30
+ bodies: ['HEADER.FIELDS (FROM SUBJECT DATE)'],
31
+ markSeen: false,
32
+ };
33
+ const messages = await connection.search(searchCriteria, fetchOptions);
34
+ connection.end();
35
+ const results = messages.slice(0, count).map((msg) => {
36
+ const header = msg.parts.find((p) => p.which.startsWith('HEADER'));
37
+ const h = header?.body || {};
38
+ return {
39
+ from: Array.isArray(h.from) ? h.from[0] : (h.from || ''),
40
+ subject: Array.isArray(h.subject) ? h.subject[0] : (h.subject || '(no subject)'),
41
+ date: Array.isArray(h.date) ? h.date[0] : (h.date || ''),
42
+ snippet: '',
43
+ };
44
+ });
45
+ console.log(`[Gmail] Fetched ${results.length} messages from ${folder}`);
46
+ return results;
47
+ }
48
+ catch (err) {
49
+ if (err?.code === 'MODULE_NOT_FOUND') {
50
+ console.log('[Gmail] imap-simple not installed — run: npm install imap-simple');
51
+ }
52
+ else {
53
+ console.error('[Gmail] IMAP connection failed:', String(err).slice(0, 120));
54
+ }
55
+ return [];
56
+ }
57
+ }
58
+ // ── Gmail sender (nodemailer + App Password) ──────────────────
59
+ async function sendGmail(config, to, subject, body) {
60
+ try {
61
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
62
+ const nodemailer = require('nodemailer');
63
+ const transporter = nodemailer.createTransport({
64
+ service: 'gmail',
65
+ auth: {
66
+ user: config.email,
67
+ pass: config.appPassword,
68
+ },
69
+ });
70
+ await transporter.sendMail({
71
+ from: config.email,
72
+ to,
73
+ subject,
74
+ text: body,
75
+ });
76
+ console.log(`[Gmail] Sent email to ${to}: ${subject}`);
77
+ return { success: true };
78
+ }
79
+ catch (err) {
80
+ if (err?.code === 'MODULE_NOT_FOUND') {
81
+ console.log('[Gmail] nodemailer not installed — run: npm install nodemailer');
82
+ return { success: false, error: 'nodemailer not installed' };
83
+ }
84
+ console.error('[Gmail] Send failed:', String(err).slice(0, 120));
85
+ return { success: false, error: String(err).slice(0, 200) };
86
+ }
87
+ }
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+ // ============================================================
3
+ // DevOS — Autonomous AI Execution System
4
+ // Copyright (c) 2026 Shiva Deore. All rights reserved.
5
+ // ============================================================
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.getMarketData = getMarketData;
8
+ // ── Symbol normalisation ───────────────────────────────────────
9
+ // If the symbol has no exchange suffix, try to infer one.
10
+ function normaliseSymbol(raw) {
11
+ const upper = raw.trim().toUpperCase();
12
+ // Already has a suffix — use as-is
13
+ if (upper.includes('.'))
14
+ return upper;
15
+ // Common NSE-listed large-caps — tag with .NS
16
+ const NSE_HINTS = ['RELIANCE', 'TCS', 'INFY', 'WIPRO', 'HDFCBANK', 'ICICIBANK',
17
+ 'SBIN', 'BAJFINANCE', 'MARUTI', 'TATAMOTORS', 'TATASTEEL', 'ADANIENT',
18
+ 'ADANIPORTS', 'HINDUNILVR', 'NESTLEIND', 'LT', 'ITC', 'SUNPHARMA',
19
+ 'POWERGRID', 'NTPC', 'COALINDIA', 'ONGC', 'JSWSTEEL', 'AXISBANK',
20
+ 'KOTAKBANK', 'ULTRACEMCO', 'GRASIM', 'DRREDDY', 'CIPLA', 'TECHM',
21
+ 'HCLTECH', 'APOLLOHOSP', 'TITAN', 'BPCL', 'IOC', 'BHARTIARTL'];
22
+ if (NSE_HINTS.includes(upper))
23
+ return `${upper}.NS`;
24
+ // Known US symbols (short, no digits)
25
+ const US_HINTS = ['AAPL', 'MSFT', 'GOOGL', 'GOOG', 'AMZN', 'TSLA', 'META',
26
+ 'NVDA', 'AMD', 'NFLX', 'INTC', 'QCOM', 'AVGO', 'CRM', 'ORCL',
27
+ 'IBM', 'ADBE', 'PYPL', 'SQ', 'UBER', 'LYFT', 'SNAP', 'TWTR',
28
+ 'SPY', 'QQQ', 'IWM', 'DIA', 'GLD', 'SLV', 'USO', 'BTC-USD', 'ETH-USD'];
29
+ if (US_HINTS.includes(upper))
30
+ return upper;
31
+ // Default: assume NSE
32
+ return `${upper}.NS`;
33
+ }
34
+ // ── Fetch helper with timeout ─────────────────────────────────
35
+ async function fetchJson(url, timeoutMs = 12000) {
36
+ const res = await fetch(url, {
37
+ headers: {
38
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36',
39
+ 'Accept': 'application/json',
40
+ },
41
+ signal: AbortSignal.timeout(timeoutMs),
42
+ });
43
+ if (!res.ok)
44
+ throw new Error(`HTTP ${res.status} for ${url}`);
45
+ return res.json();
46
+ }
47
+ // ── Main export ───────────────────────────────────────────────
48
+ async function getMarketData(symbol) {
49
+ const sym = normaliseSymbol(symbol);
50
+ // Method 1: Yahoo Finance v8 chart API (most reliable)
51
+ try {
52
+ const url = `https://query1.finance.yahoo.com/v8/finance/chart/${encodeURIComponent(sym)}?interval=1d&range=1d`;
53
+ const data = await fetchJson(url);
54
+ const result = data?.chart?.result?.[0];
55
+ if (!result)
56
+ throw new Error('No result in chart response');
57
+ const meta = result.meta;
58
+ const price = meta.regularMarketPrice ?? meta.chartPreviousClose ?? 0;
59
+ const prevClose = meta.previousClose ?? meta.chartPreviousClose ?? price;
60
+ const change = parseFloat((price - prevClose).toFixed(4));
61
+ const changePct = prevClose !== 0 ? parseFloat(((change / prevClose) * 100).toFixed(4)) : 0;
62
+ return {
63
+ symbol: sym,
64
+ price,
65
+ change,
66
+ changePercent: changePct,
67
+ volume: meta.regularMarketVolume ?? 0,
68
+ marketCap: meta.marketCap,
69
+ high52w: meta.fiftyTwoWeekHigh,
70
+ low52w: meta.fiftyTwoWeekLow,
71
+ dayHigh: meta.regularMarketDayHigh,
72
+ dayLow: meta.regularMarketDayLow,
73
+ currency: meta.currency ?? 'USD',
74
+ shortName: meta.shortName ?? meta.longName,
75
+ source: 'Yahoo Finance (chart)',
76
+ };
77
+ }
78
+ catch (e1) {
79
+ console.warn(`[getMarketData] Chart API failed for ${sym}: ${e1.message}`);
80
+ }
81
+ // Method 2: Yahoo Finance v7 quote API fallback
82
+ try {
83
+ const url = `https://query1.finance.yahoo.com/v7/finance/quote?symbols=${encodeURIComponent(sym)}`;
84
+ const data = await fetchJson(url);
85
+ const quote = data?.quoteResponse?.result?.[0];
86
+ if (!quote)
87
+ throw new Error('No quote result');
88
+ const price = quote.regularMarketPrice ?? 0;
89
+ const prevClose = quote.regularMarketPreviousClose ?? price;
90
+ const change = parseFloat((price - prevClose).toFixed(4));
91
+ const changePct = prevClose !== 0 ? parseFloat(((change / prevClose) * 100).toFixed(4)) : 0;
92
+ return {
93
+ symbol: sym,
94
+ price,
95
+ change,
96
+ changePercent: changePct,
97
+ volume: quote.regularMarketVolume ?? 0,
98
+ marketCap: quote.marketCap,
99
+ high52w: quote.fiftyTwoWeekHigh,
100
+ low52w: quote.fiftyTwoWeekLow,
101
+ dayHigh: quote.regularMarketDayHigh,
102
+ dayLow: quote.regularMarketDayLow,
103
+ currency: quote.currency ?? 'USD',
104
+ shortName: quote.shortName ?? quote.longName,
105
+ source: 'Yahoo Finance (quote)',
106
+ };
107
+ }
108
+ catch (e2) {
109
+ console.warn(`[getMarketData] Quote API failed for ${sym}: ${e2.message}`);
110
+ }
111
+ // Method 3: Yahoo Finance v6 insights fallback
112
+ try {
113
+ const url = `https://query2.finance.yahoo.com/v8/finance/chart/${encodeURIComponent(sym)}`;
114
+ const data = await fetchJson(url, 8000);
115
+ const meta = data?.chart?.result?.[0]?.meta;
116
+ if (!meta)
117
+ throw new Error('No meta in query2 response');
118
+ const price = meta.regularMarketPrice ?? 0;
119
+ const change = meta.regularMarketChange ?? 0;
120
+ return {
121
+ symbol: sym,
122
+ price,
123
+ change,
124
+ changePercent: meta.regularMarketChangePercent ?? 0,
125
+ volume: meta.regularMarketVolume ?? 0,
126
+ currency: meta.currency ?? 'USD',
127
+ shortName: meta.shortName,
128
+ source: 'Yahoo Finance (query2)',
129
+ };
130
+ }
131
+ catch (e3) {
132
+ console.warn(`[getMarketData] query2 also failed for ${sym}: ${e3.message}`);
133
+ throw new Error(`Unable to fetch market data for "${symbol}" (tried 3 sources). The market may be closed or the symbol invalid.`);
134
+ }
135
+ }
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.socialResearch = socialResearch;
37
+ const https = __importStar(require("https"));
38
+ async function fetchJson(url) {
39
+ return new Promise((resolve, reject) => {
40
+ https.get(url, { headers: { 'User-Agent': 'DevOS/2.0' } }, (res) => {
41
+ let data = '';
42
+ res.on('data', chunk => data += chunk);
43
+ res.on('end', () => {
44
+ try {
45
+ resolve(JSON.parse(data));
46
+ }
47
+ catch {
48
+ reject(new Error('JSON parse failed'));
49
+ }
50
+ });
51
+ }).on('error', reject);
52
+ });
53
+ }
54
+ function recencyWeight(dateStr) {
55
+ const age = Date.now() - new Date(dateStr).getTime();
56
+ const days = age / (1000 * 60 * 60 * 24);
57
+ if (days <= 7)
58
+ return 1.0;
59
+ if (days <= 30)
60
+ return 0.7;
61
+ return 0.3;
62
+ }
63
+ async function socialResearch(topic) {
64
+ const posts = [];
65
+ const thirtyDaysAgo = Math.floor((Date.now() - 30 * 24 * 60 * 60 * 1000) / 1000);
66
+ // Reddit
67
+ try {
68
+ const redditData = await fetchJson(`https://www.reddit.com/search.json?q=${encodeURIComponent(topic)}&sort=new&limit=5&t=month`);
69
+ for (const child of redditData?.data?.children || []) {
70
+ const p = child.data;
71
+ const date = new Date(p.created_utc * 1000).toISOString();
72
+ posts.push({
73
+ title: p.title,
74
+ url: `https://reddit.com${p.permalink}`,
75
+ score: p.score,
76
+ source: 'reddit',
77
+ date,
78
+ recencyWeight: recencyWeight(date),
79
+ });
80
+ }
81
+ }
82
+ catch { }
83
+ // HackerNews
84
+ try {
85
+ const hnData = await fetchJson(`https://hn.algolia.com/api/v1/search?query=${encodeURIComponent(topic)}&tags=story&numericFilters=created_at_i>${thirtyDaysAgo}&hitsPerPage=5`);
86
+ for (const hit of hnData?.hits || []) {
87
+ const date = hit.created_at;
88
+ posts.push({
89
+ title: hit.title,
90
+ url: hit.url || `https://news.ycombinator.com/item?id=${hit.objectID}`,
91
+ score: hit.points || 0,
92
+ source: 'hackernews',
93
+ date,
94
+ recencyWeight: recencyWeight(date),
95
+ });
96
+ }
97
+ }
98
+ catch { }
99
+ // Sort by recency weight * score
100
+ posts.sort((a, b) => (b.recencyWeight * b.score) - (a.recencyWeight * a.score));
101
+ // Sentiment (simple keyword scoring)
102
+ const allText = posts.map(p => p.title.toLowerCase()).join(' ');
103
+ const positive = ['great', 'good', 'excellent', 'love', 'best', 'amazing', 'useful', 'helpful'].filter(w => allText.includes(w)).length;
104
+ const negative = ['bad', 'terrible', 'broken', 'hate', 'worst', 'useless', 'failed', 'disappointed'].filter(w => allText.includes(w)).length;
105
+ const sentiment = positive > negative + 1 ? 'positive'
106
+ : negative > positive + 1 ? 'negative'
107
+ : (positive > 0 || negative > 0) ? 'mixed'
108
+ : 'neutral';
109
+ const recencyScore = posts.length > 0
110
+ ? posts.reduce((s, p) => s + p.recencyWeight, 0) / posts.length
111
+ : 0;
112
+ const trends = [...new Set(posts.flatMap(p => p.title.split(' ').filter(w => w.length > 5).map(w => w.toLowerCase())))].slice(0, 5);
113
+ return {
114
+ topic,
115
+ summary: `Found ${posts.length} recent discussions. Sentiment: ${sentiment}. Top source: ${posts[0]?.source || 'none'}.`,
116
+ sentiment,
117
+ topPosts: posts.slice(0, 8),
118
+ trends,
119
+ recencyScore,
120
+ };
121
+ }
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ // ============================================================
3
+ // DevOS — Autonomous AI Execution System
4
+ // Copyright (c) 2026 Shiva Deore. All rights reserved.
5
+ // ============================================================
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.truthCheck = exports.truthChecker = void 0;
8
+ // ── TruthChecker (graph-level) ────────────────────────────────
9
+ class TruthChecker {
10
+ /**
11
+ * Verify that all completed nodes in a TaskGraph satisfy their
12
+ * postconditions. For computer-use actions the postcondition is
13
+ * always trivially pass (the caller already checked visually).
14
+ */
15
+ verify(graph, _workspacePath) {
16
+ const failures = [];
17
+ try {
18
+ for (const [id, node] of graph.nodes) {
19
+ if (node.status !== 'done')
20
+ continue;
21
+ // Nodes that use 'notify' action type are fire-and-forget → always pass
22
+ if (node.action?.type === 'notify')
23
+ continue;
24
+ // A result with status 'completed' or 'success' passes
25
+ const resultStatus = node.result?.status ?? '';
26
+ if (!['completed', 'success', 'done'].includes(resultStatus)) {
27
+ failures.push(`Node ${id} (${node.description}): result status "${resultStatus}" not verified`);
28
+ }
29
+ }
30
+ }
31
+ catch {
32
+ // Non-fatal — corrupted graph shape
33
+ return { passed: true, failures: [] };
34
+ }
35
+ return { passed: failures.length === 0, failures };
36
+ }
37
+ }
38
+ // ── TruthCheck (action-level) ─────────────────────────────────
39
+ class TruthCheck {
40
+ /**
41
+ * Verify that a single computer-use action produced a real effect.
42
+ * This is intentionally permissive for most action types — the real
43
+ * verification happens via screenshot diffing in the VisionLoop's
44
+ * checkGoalComplete() step.
45
+ *
46
+ * Returns false only for known no-op situations (e.g. screenshot
47
+ * with no savePath — the action itself is always considered a success).
48
+ */
49
+ async verifyAction(actionType, context) {
50
+ // All action types are considered verified at this level.
51
+ // Deep verification (pixel diff, DOM check) is handled by VisionLoop.
52
+ return true;
53
+ }
54
+ }
55
+ // ── Exports ───────────────────────────────────────────────────
56
+ exports.truthChecker = new TruthChecker();
57
+ exports.truthCheck = new TruthCheck();
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ // ============================================================
3
+ // core/updateChecker.ts — Check for Aiden updates via license server
4
+ // ============================================================
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.checkForUpdate = checkForUpdate;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ function readCurrentVersion() {
43
+ try {
44
+ const pkgPath = path.join(process.cwd(), 'package.json');
45
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
46
+ return pkg.version || '0.0.0';
47
+ }
48
+ catch {
49
+ return '0.0.0';
50
+ }
51
+ }
52
+ async function checkForUpdate() {
53
+ const currentVersion = readCurrentVersion();
54
+ try {
55
+ const controller = new AbortController();
56
+ const timeout = setTimeout(() => controller.abort(), 8000);
57
+ const res = await fetch(`https://api.taracod.com/update/check?version=${encodeURIComponent(currentVersion)}`, { signal: controller.signal });
58
+ clearTimeout(timeout);
59
+ if (!res.ok)
60
+ throw new Error(`HTTP ${res.status}`);
61
+ const data = await res.json();
62
+ return {
63
+ available: !!data.updateAvailable,
64
+ currentVersion: data.currentVersion || currentVersion,
65
+ latestVersion: data.latestVersion,
66
+ downloadUrl: data.downloadUrl,
67
+ releaseNotes: data.releaseNotes,
68
+ publishedAt: data.publishedAt,
69
+ };
70
+ }
71
+ catch {
72
+ return { available: false, currentVersion };
73
+ }
74
+ }