create-walle 0.7.0 → 0.8.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.
@@ -30,9 +30,9 @@ async function main() {
30
30
  try {
31
31
  const { events } = await getCalendarEvents({ days_ahead: 0 });
32
32
  const todayEvents = events.filter(e => {
33
- if (e.allDay) return true;
34
33
  const eDate = new Date(e.start);
35
- return !isNaN(eDate) && eDate.toISOString().slice(0, 10) === todayStr;
34
+ if (isNaN(eDate)) return false;
35
+ return eDate.toISOString().slice(0, 10) === todayStr;
36
36
  });
37
37
  const seen = new Set();
38
38
  const deduped = todayEvents.filter(e => {
@@ -654,6 +654,19 @@ const LOCAL_TOOL_DEFINITIONS = [
654
654
  required: ['url'],
655
655
  },
656
656
  },
657
+ {
658
+ name: 'ingest_folder',
659
+ description: 'Read all text files in a folder and store them in Wall-E brain as memories. Supports .md, .txt, .json, .py, .js, .csv, and many more text formats. Files are deduplicated by path. Use when the user asks to "read a folder", "ingest files", "import documents", "load my notes", or "scan a directory into brain".',
660
+ input_schema: {
661
+ type: 'object',
662
+ properties: {
663
+ folder: { type: 'string', description: 'Path to folder (e.g., "~/Documents/notes")' },
664
+ pattern: { type: 'string', description: 'Glob pattern to filter files (default: "*" = all text files)' },
665
+ recursive: { type: 'boolean', description: 'Recurse into subdirectories (default: true)' },
666
+ },
667
+ required: ['folder'],
668
+ },
669
+ },
657
670
  ];
658
671
 
659
672
  // ── Tool executor dispatch ──
@@ -679,10 +692,25 @@ async function executeLocalTool(name, input) {
679
692
  case 'mail_send': return sendMail(input);
680
693
  case 'system_info': return getSystemInfo();
681
694
  case 'web_fetch': return webFetch(input.url, input);
695
+ case 'ingest_folder': return ingestFolder(input);
682
696
  default: return null; // not a local tool
683
697
  }
684
698
  }
685
699
 
700
+ async function ingestFolder(input) {
701
+ const { execFileSync } = require('child_process');
702
+ const scriptPath = path.join(__dirname, '..', 'skills', '_bundled', 'file-ingest', 'run.js');
703
+ const config = JSON.stringify({ folder: input.folder, pattern: input.pattern, recursive: input.recursive });
704
+ try {
705
+ const result = execFileSync(process.execPath, [scriptPath, config], {
706
+ encoding: 'utf8', timeout: 60000, env: { ...process.env, SKILL_CONFIG: config },
707
+ });
708
+ return result;
709
+ } catch (e) {
710
+ return 'Error: ' + (e.stderr || e.message);
711
+ }
712
+ }
713
+
686
714
  module.exports = {
687
715
  executeLocalTool,
688
716
  LOCAL_TOOL_DEFINITIONS,