@stackmemoryai/stackmemory 1.2.7 → 1.2.9

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 (27) hide show
  1. package/README.md +3 -3
  2. package/dist/src/cli/commands/daemon.js +306 -2
  3. package/dist/src/cli/commands/desires.js +117 -0
  4. package/dist/src/cli/commands/digest.js +73 -0
  5. package/dist/src/cli/commands/setup.js +369 -39
  6. package/dist/src/cli/commands/team.js +168 -0
  7. package/dist/src/cli/index.js +6 -0
  8. package/dist/src/core/digest/chronological-digest.js +143 -0
  9. package/dist/src/core/digest/index.js +1 -0
  10. package/dist/src/integrations/mcp/server.js +622 -251
  11. package/dist/src/integrations/mcp/tool-definitions.js +607 -50
  12. package/dist/src/utils/hook-installer.js +35 -0
  13. package/package.json +2 -2
  14. package/scripts/install-claude-hooks-auto.js +35 -0
  15. package/templates/claude-hooks/daemon-auto-start.js +125 -0
  16. package/templates/claude-hooks/desire-path-trace.js +118 -0
  17. package/templates/claude-hooks/session-rescue.sh +3 -0
  18. package/templates/claude-hooks/team-subagent-stop.js +77 -0
  19. package/templates/claude-hooks/team-task-complete.js +83 -0
  20. package/templates/claude-hooks/team-teammate-idle.js +96 -0
  21. /package/templates/claude-hooks/{auto-background-hook.js → archive/auto-background-hook.js} +0 -0
  22. /package/templates/claude-hooks/{hook-config.json → archive/hook-config.json} +0 -0
  23. /package/templates/claude-hooks/{hooks.json → archive/hooks.json} +0 -0
  24. /package/templates/claude-hooks/{on-compact-detected → archive/on-compact-detected} +0 -0
  25. /package/templates/claude-hooks/{on-exit → archive/on-exit} +0 -0
  26. /package/templates/claude-hooks/{post-edit-sweep.js → archive/post-edit-sweep.js} +0 -0
  27. /package/templates/claude-hooks/{pre-tool-use → archive/pre-tool-use} +0 -0
@@ -12,10 +12,19 @@ class MCPToolDefinitions {
12
12
  ...this.getTaskTools(),
13
13
  ...this.getLinearTools(),
14
14
  ...this.getTraceTools(),
15
+ ...this.getTraceExtensionTools(),
16
+ ...this.getPlanningTools(),
17
+ ...this.getPendingTools(),
18
+ ...this.getSmartContextTools(),
15
19
  ...this.getDiscoveryTools(),
16
20
  ...this.getEditTools(),
21
+ ...this.getDiffMemTools(),
22
+ ...this.getGreptileTools(),
23
+ ...this.getProviderTools(),
17
24
  ...this.getTeamTools(),
18
- ...this.getCordTools()
25
+ ...this.getCordTools(),
26
+ ...this.getDigestTools(),
27
+ ...this.getDesirePathTools()
19
28
  ];
20
29
  }
21
30
  /**
@@ -437,98 +446,238 @@ class MCPToolDefinitions {
437
446
  }
438
447
  }
439
448
  }
449
+ }
450
+ ];
451
+ }
452
+ /**
453
+ * Trace extension tools (statistics, flush, compress)
454
+ */
455
+ getTraceExtensionTools() {
456
+ return [
457
+ {
458
+ name: "get_trace_statistics",
459
+ description: "Get statistics about detected traces",
460
+ inputSchema: { type: "object", properties: {} }
461
+ },
462
+ {
463
+ name: "flush_traces",
464
+ description: "Flush any pending trace and finalize detection",
465
+ inputSchema: { type: "object", properties: {} }
440
466
  },
441
467
  {
442
- name: "start_browser_debug",
443
- description: "Start browser debugging session",
468
+ name: "compress_old_traces",
469
+ description: "Compress traces older than specified hours",
444
470
  inputSchema: {
445
471
  type: "object",
446
472
  properties: {
447
- url: {
473
+ ageHours: {
474
+ type: "number",
475
+ description: "Age threshold in hours (default: 24)"
476
+ }
477
+ }
478
+ }
479
+ }
480
+ ];
481
+ }
482
+ /**
483
+ * Planning and orchestration tools
484
+ */
485
+ getPlanningTools() {
486
+ return [
487
+ {
488
+ name: "plan_only",
489
+ description: "Generate an implementation plan (Claude) and return JSON only",
490
+ inputSchema: {
491
+ type: "object",
492
+ properties: {
493
+ task: { type: "string", description: "Task description" },
494
+ plannerModel: {
448
495
  type: "string",
449
- description: "URL to navigate to"
496
+ description: "Claude model for planning (optional)"
497
+ }
498
+ },
499
+ required: ["task"]
500
+ }
501
+ },
502
+ {
503
+ name: "call_codex",
504
+ description: "Invoke Codex via codex-sm with a prompt and args; dry-run by default",
505
+ inputSchema: {
506
+ type: "object",
507
+ properties: {
508
+ prompt: { type: "string", description: "Prompt for Codex" },
509
+ args: {
510
+ type: "array",
511
+ items: { type: "string" },
512
+ description: "Additional CLI args for codex-sm"
450
513
  },
451
- headless: {
514
+ execute: {
452
515
  type: "boolean",
453
516
  default: false,
454
- description: "Run browser in headless mode"
517
+ description: "Actually run codex-sm (otherwise dry-run)"
518
+ }
519
+ },
520
+ required: ["prompt"]
521
+ }
522
+ },
523
+ {
524
+ name: "call_claude",
525
+ description: "Invoke Claude with a prompt (Anthropic SDK)",
526
+ inputSchema: {
527
+ type: "object",
528
+ properties: {
529
+ prompt: { type: "string", description: "Prompt for Claude" },
530
+ model: { type: "string", description: "Claude model (optional)" },
531
+ system: { type: "string", description: "System prompt (optional)" }
532
+ },
533
+ required: ["prompt"]
534
+ }
535
+ },
536
+ {
537
+ name: "plan_gate",
538
+ description: "Phase 1: Generate a plan and return an approvalId for later execution",
539
+ inputSchema: {
540
+ type: "object",
541
+ properties: {
542
+ task: { type: "string", description: "Task description" },
543
+ plannerModel: {
544
+ type: "string",
545
+ description: "Claude model (optional)"
546
+ }
547
+ },
548
+ required: ["task"]
549
+ }
550
+ },
551
+ {
552
+ name: "approve_plan",
553
+ description: "Phase 2: Execute a previously generated plan by approvalId",
554
+ inputSchema: {
555
+ type: "object",
556
+ properties: {
557
+ approvalId: { type: "string", description: "Id from plan_gate" },
558
+ implementer: {
559
+ type: "string",
560
+ enum: ["codex", "claude"],
561
+ default: "codex",
562
+ description: "Which agent implements code"
563
+ },
564
+ maxIters: { type: "number", default: 2 },
565
+ recordFrame: { type: "boolean", default: true },
566
+ execute: { type: "boolean", default: true }
567
+ },
568
+ required: ["approvalId"]
569
+ }
570
+ }
571
+ ];
572
+ }
573
+ /**
574
+ * Pending approval management tools
575
+ */
576
+ getPendingTools() {
577
+ return [
578
+ {
579
+ name: "pending_list",
580
+ description: "List pending approval-gated plans (supports filters)",
581
+ inputSchema: {
582
+ type: "object",
583
+ properties: {
584
+ taskContains: {
585
+ type: "string",
586
+ description: "Filter tasks containing this substring"
455
587
  },
456
- width: {
588
+ olderThanMs: {
457
589
  type: "number",
458
- default: 1280,
459
- description: "Browser width"
590
+ description: "Only items older than this age (ms)"
460
591
  },
461
- height: {
592
+ newerThanMs: {
462
593
  type: "number",
463
- default: 720,
464
- description: "Browser height"
594
+ description: "Only items newer than this age (ms)"
465
595
  },
466
- capture_screenshots: {
467
- type: "boolean",
468
- default: true,
469
- description: "Enable screenshot capture"
470
- }
471
- },
472
- required: ["url"]
596
+ sort: {
597
+ type: "string",
598
+ enum: ["asc", "desc"],
599
+ description: "Sort by createdAt"
600
+ },
601
+ limit: { type: "number", description: "Max items to return" }
602
+ }
473
603
  }
474
604
  },
475
605
  {
476
- name: "take_screenshot",
477
- description: "Take screenshot in browser session",
606
+ name: "pending_clear",
607
+ description: "Clear pending approval-gated plans (by id, all, or olderThanMs)",
478
608
  inputSchema: {
479
609
  type: "object",
480
610
  properties: {
481
- session_id: {
482
- type: "string",
483
- description: "Browser session ID"
484
- },
485
- selector: {
611
+ approvalId: {
486
612
  type: "string",
487
- description: "CSS selector to screenshot"
613
+ description: "Clear a single approval by id"
488
614
  },
489
- full_page: {
615
+ all: {
490
616
  type: "boolean",
491
617
  default: false,
492
- description: "Capture full page"
618
+ description: "Clear all pending approvals"
619
+ },
620
+ olderThanMs: {
621
+ type: "number",
622
+ description: "Clear approvals older than this age (ms)"
493
623
  }
494
- },
495
- required: ["session_id"]
624
+ }
496
625
  }
497
626
  },
498
627
  {
499
- name: "execute_script",
500
- description: "Execute JavaScript in browser session",
628
+ name: "pending_show",
629
+ description: "Show a pending plan by approvalId",
501
630
  inputSchema: {
502
631
  type: "object",
503
632
  properties: {
504
- session_id: {
633
+ approvalId: {
505
634
  type: "string",
506
- description: "Browser session ID"
507
- },
508
- script: {
635
+ description: "Approval id from plan_gate"
636
+ }
637
+ },
638
+ required: ["approvalId"]
639
+ }
640
+ }
641
+ ];
642
+ }
643
+ /**
644
+ * Smart context and summary tools
645
+ */
646
+ getSmartContextTools() {
647
+ return [
648
+ {
649
+ name: "smart_context",
650
+ description: "LLM-driven context retrieval - intelligently selects relevant frames based on query",
651
+ inputSchema: {
652
+ type: "object",
653
+ properties: {
654
+ query: {
509
655
  type: "string",
510
- description: "JavaScript code to execute"
656
+ description: "Natural language query describing what context you need"
511
657
  },
512
- args: {
513
- type: "array",
514
- description: "Arguments to pass to script"
658
+ tokenBudget: {
659
+ type: "number",
660
+ description: "Maximum tokens to use for context (default: 4000)"
661
+ },
662
+ forceRefresh: {
663
+ type: "boolean",
664
+ description: "Force refresh of cached summaries"
515
665
  }
516
666
  },
517
- required: ["session_id", "script"]
667
+ required: ["query"]
518
668
  }
519
669
  },
520
670
  {
521
- name: "stop_browser_debug",
522
- description: "Stop browser debugging session",
671
+ name: "get_summary",
672
+ description: "Get compressed summary of project memory for analysis",
523
673
  inputSchema: {
524
674
  type: "object",
525
675
  properties: {
526
- session_id: {
527
- type: "string",
528
- description: "Browser session ID to stop"
676
+ forceRefresh: {
677
+ type: "boolean",
678
+ description: "Force refresh of cached summary"
529
679
  }
530
- },
531
- required: ["session_id"]
680
+ }
532
681
  }
533
682
  }
534
683
  ];
@@ -674,6 +823,396 @@ class MCPToolDefinitions {
674
823
  }
675
824
  ];
676
825
  }
826
+ /**
827
+ * DiffMem user memory management tools
828
+ */
829
+ getDiffMemTools() {
830
+ return [
831
+ {
832
+ name: "diffmem_get_user_context",
833
+ description: "Fetch user knowledge and preferences from memory. Use to personalize responses.",
834
+ inputSchema: {
835
+ type: "object",
836
+ properties: {
837
+ categories: {
838
+ type: "array",
839
+ items: {
840
+ type: "string",
841
+ enum: [
842
+ "preference",
843
+ "expertise",
844
+ "project_knowledge",
845
+ "pattern",
846
+ "correction"
847
+ ]
848
+ },
849
+ description: "Filter by memory categories"
850
+ },
851
+ limit: {
852
+ type: "number",
853
+ default: 10,
854
+ description: "Maximum memories to return"
855
+ }
856
+ }
857
+ }
858
+ },
859
+ {
860
+ name: "diffmem_store_learning",
861
+ description: "Store a new insight about the user (preference, expertise, pattern, or correction)",
862
+ inputSchema: {
863
+ type: "object",
864
+ properties: {
865
+ content: { type: "string", description: "The insight to store" },
866
+ category: {
867
+ type: "string",
868
+ enum: [
869
+ "preference",
870
+ "expertise",
871
+ "project_knowledge",
872
+ "pattern",
873
+ "correction"
874
+ ],
875
+ description: "Category of the insight"
876
+ },
877
+ confidence: {
878
+ type: "number",
879
+ minimum: 0,
880
+ maximum: 1,
881
+ default: 0.7,
882
+ description: "Confidence level (0-1)"
883
+ },
884
+ context: {
885
+ type: "object",
886
+ description: "Additional context for the insight"
887
+ }
888
+ },
889
+ required: ["content", "category"]
890
+ }
891
+ },
892
+ {
893
+ name: "diffmem_search",
894
+ description: "Semantic search across user memories. Find relevant past insights and preferences.",
895
+ inputSchema: {
896
+ type: "object",
897
+ properties: {
898
+ query: { type: "string", description: "Search query" },
899
+ timeRange: {
900
+ type: "string",
901
+ enum: ["day", "week", "month", "all"],
902
+ default: "all",
903
+ description: "Time range filter"
904
+ },
905
+ minConfidence: {
906
+ type: "number",
907
+ minimum: 0,
908
+ maximum: 1,
909
+ default: 0.5,
910
+ description: "Minimum confidence threshold"
911
+ },
912
+ limit: {
913
+ type: "number",
914
+ default: 10,
915
+ description: "Maximum results"
916
+ }
917
+ },
918
+ required: ["query"]
919
+ }
920
+ },
921
+ {
922
+ name: "diffmem_status",
923
+ description: "Check DiffMem connection status and memory statistics",
924
+ inputSchema: { type: "object", properties: {} }
925
+ }
926
+ ];
927
+ }
928
+ /**
929
+ * Greptile code review tools
930
+ */
931
+ getGreptileTools() {
932
+ return [
933
+ {
934
+ name: "greptile_pr_comments",
935
+ description: "Get PR review comments from Greptile. Returns unaddressed comments with suggestedCode.",
936
+ inputSchema: {
937
+ type: "object",
938
+ properties: {
939
+ name: {
940
+ type: "string",
941
+ description: 'Repository full name (e.g., "owner/repo")'
942
+ },
943
+ remote: {
944
+ type: "string",
945
+ enum: ["github", "gitlab", "azure", "bitbucket"],
946
+ description: "Remote provider"
947
+ },
948
+ defaultBranch: {
949
+ type: "string",
950
+ description: 'Default branch (e.g., "main")'
951
+ },
952
+ prNumber: { type: "number", description: "Pull request number" },
953
+ greptileGenerated: {
954
+ type: "boolean",
955
+ description: "Filter for only Greptile review comments"
956
+ },
957
+ addressed: {
958
+ type: "boolean",
959
+ description: "Filter by comment addressed status"
960
+ }
961
+ },
962
+ required: ["name", "remote", "defaultBranch", "prNumber"]
963
+ }
964
+ },
965
+ {
966
+ name: "greptile_pr_details",
967
+ description: "Get detailed PR information including metadata, statistics, and review analysis.",
968
+ inputSchema: {
969
+ type: "object",
970
+ properties: {
971
+ name: { type: "string", description: "Repository full name" },
972
+ remote: {
973
+ type: "string",
974
+ enum: ["github", "gitlab", "azure", "bitbucket"],
975
+ description: "Remote provider"
976
+ },
977
+ defaultBranch: { type: "string", description: "Default branch" },
978
+ prNumber: { type: "number", description: "Pull request number" }
979
+ },
980
+ required: ["name", "remote", "defaultBranch", "prNumber"]
981
+ }
982
+ },
983
+ {
984
+ name: "greptile_list_prs",
985
+ description: "List pull requests. Filter by repository, branch, author, or state.",
986
+ inputSchema: {
987
+ type: "object",
988
+ properties: {
989
+ name: { type: "string", description: "Repository full name" },
990
+ remote: {
991
+ type: "string",
992
+ enum: ["github", "gitlab", "azure", "bitbucket"],
993
+ description: "Remote provider"
994
+ },
995
+ defaultBranch: { type: "string", description: "Default branch" },
996
+ sourceBranch: {
997
+ type: "string",
998
+ description: "Filter by source branch name"
999
+ },
1000
+ authorLogin: {
1001
+ type: "string",
1002
+ description: "Filter by PR author username"
1003
+ },
1004
+ state: {
1005
+ type: "string",
1006
+ enum: ["open", "closed", "merged"],
1007
+ description: "Filter by PR state"
1008
+ },
1009
+ limit: { type: "number", description: "Max results (default 20)" }
1010
+ }
1011
+ }
1012
+ },
1013
+ {
1014
+ name: "greptile_trigger_review",
1015
+ description: "Trigger a Greptile code review for a pull request.",
1016
+ inputSchema: {
1017
+ type: "object",
1018
+ properties: {
1019
+ name: { type: "string", description: "Repository full name" },
1020
+ remote: {
1021
+ type: "string",
1022
+ enum: ["github", "gitlab", "azure", "bitbucket"],
1023
+ description: "Remote provider"
1024
+ },
1025
+ defaultBranch: { type: "string", description: "Default branch" },
1026
+ prNumber: { type: "number", description: "Pull request number" },
1027
+ branch: { type: "string", description: "Current working branch" }
1028
+ },
1029
+ required: ["name", "remote", "prNumber"]
1030
+ }
1031
+ },
1032
+ {
1033
+ name: "greptile_search_patterns",
1034
+ description: "Search custom coding patterns and instructions in Greptile.",
1035
+ inputSchema: {
1036
+ type: "object",
1037
+ properties: {
1038
+ query: {
1039
+ type: "string",
1040
+ description: "Search query for pattern content"
1041
+ },
1042
+ limit: { type: "number", description: "Max results (default 10)" }
1043
+ },
1044
+ required: ["query"]
1045
+ }
1046
+ },
1047
+ {
1048
+ name: "greptile_create_pattern",
1049
+ description: "Create a new custom coding pattern or instruction in Greptile.",
1050
+ inputSchema: {
1051
+ type: "object",
1052
+ properties: {
1053
+ body: { type: "string", description: "Pattern content" },
1054
+ type: {
1055
+ type: "string",
1056
+ enum: ["CUSTOM_INSTRUCTION", "PATTERN"],
1057
+ description: "Context type"
1058
+ },
1059
+ scopes: {
1060
+ type: "object",
1061
+ description: "Boolean expression defining where this pattern applies"
1062
+ }
1063
+ },
1064
+ required: ["body"]
1065
+ }
1066
+ },
1067
+ {
1068
+ name: "greptile_status",
1069
+ description: "Check Greptile integration connection status.",
1070
+ inputSchema: { type: "object", properties: {} }
1071
+ }
1072
+ ];
1073
+ }
1074
+ /**
1075
+ * Multi-provider routing tools
1076
+ */
1077
+ getProviderTools() {
1078
+ return [
1079
+ {
1080
+ name: "delegate_to_model",
1081
+ description: "Route a prompt to a specific provider/model. Uses smart cost-based routing by default.",
1082
+ inputSchema: {
1083
+ type: "object",
1084
+ properties: {
1085
+ prompt: { type: "string", description: "The prompt to send" },
1086
+ provider: {
1087
+ type: "string",
1088
+ enum: [
1089
+ "anthropic",
1090
+ "cerebras",
1091
+ "deepinfra",
1092
+ "openai",
1093
+ "openrouter"
1094
+ ],
1095
+ description: "Override provider"
1096
+ },
1097
+ model: { type: "string", description: "Override model name" },
1098
+ taskType: {
1099
+ type: "string",
1100
+ enum: ["linting", "context", "code", "testing", "review", "plan"],
1101
+ description: "Task type for auto-routing"
1102
+ },
1103
+ maxTokens: { type: "number", description: "Max tokens" },
1104
+ temperature: { type: "number" },
1105
+ system: { type: "string", description: "System prompt" }
1106
+ },
1107
+ required: ["prompt"]
1108
+ }
1109
+ },
1110
+ {
1111
+ name: "batch_submit",
1112
+ description: "Submit prompts to Anthropic Batch API (50% discount, async)",
1113
+ inputSchema: {
1114
+ type: "object",
1115
+ properties: {
1116
+ prompts: {
1117
+ type: "array",
1118
+ items: {
1119
+ type: "object",
1120
+ properties: {
1121
+ id: { type: "string" },
1122
+ prompt: { type: "string" },
1123
+ model: { type: "string" },
1124
+ maxTokens: { type: "number" },
1125
+ system: { type: "string" }
1126
+ },
1127
+ required: ["id", "prompt"]
1128
+ },
1129
+ description: "Array of prompts to batch"
1130
+ },
1131
+ description: {
1132
+ type: "string",
1133
+ description: "Batch job description"
1134
+ }
1135
+ },
1136
+ required: ["prompts"]
1137
+ }
1138
+ },
1139
+ {
1140
+ name: "batch_check",
1141
+ description: "Check status or retrieve results for a batch job",
1142
+ inputSchema: {
1143
+ type: "object",
1144
+ properties: {
1145
+ batchId: { type: "string", description: "Batch job ID" },
1146
+ retrieve: {
1147
+ type: "boolean",
1148
+ default: false,
1149
+ description: "Retrieve results if complete"
1150
+ }
1151
+ },
1152
+ required: ["batchId"]
1153
+ }
1154
+ }
1155
+ ];
1156
+ }
1157
+ /**
1158
+ * Chronological digest tools
1159
+ */
1160
+ getDigestTools() {
1161
+ return [
1162
+ {
1163
+ name: "sm_digest",
1164
+ description: "Generate a chronological activity digest for a time period",
1165
+ inputSchema: {
1166
+ type: "object",
1167
+ properties: {
1168
+ period: {
1169
+ type: "string",
1170
+ enum: ["today", "yesterday", "week"],
1171
+ description: "Time period for the digest"
1172
+ }
1173
+ },
1174
+ required: ["period"]
1175
+ }
1176
+ }
1177
+ ];
1178
+ }
1179
+ /**
1180
+ * Desire path analysis tools
1181
+ */
1182
+ getDesirePathTools() {
1183
+ return [
1184
+ {
1185
+ name: "sm_desire_paths",
1186
+ description: 'Analyze failed tool calls (desire paths) \u2014 what agents want but cannot get. Use mode "summary" for aggregated counts or "list" for recent failures.',
1187
+ inputSchema: {
1188
+ type: "object",
1189
+ properties: {
1190
+ mode: {
1191
+ type: "string",
1192
+ enum: ["summary", "list"],
1193
+ description: "Output mode: summary (aggregated) or list (recent)",
1194
+ default: "summary"
1195
+ },
1196
+ limit: {
1197
+ type: "number",
1198
+ default: 20,
1199
+ description: "Max entries to return (list mode only)"
1200
+ },
1201
+ category: {
1202
+ type: "string",
1203
+ enum: ["unknown_tool", "handler_error", "invalid_params"],
1204
+ description: "Filter by failure category"
1205
+ },
1206
+ days: {
1207
+ type: "number",
1208
+ default: 7,
1209
+ description: "Look back N days"
1210
+ }
1211
+ }
1212
+ }
1213
+ }
1214
+ ];
1215
+ }
677
1216
  /**
678
1217
  * Multi-agent team collaboration tools
679
1218
  */
@@ -901,14 +1440,32 @@ class MCPToolDefinitions {
901
1440
  return this.getLinearTools();
902
1441
  case "trace":
903
1442
  return this.getTraceTools();
1443
+ case "trace_extension":
1444
+ return this.getTraceExtensionTools();
1445
+ case "planning":
1446
+ return this.getPlanningTools();
1447
+ case "pending":
1448
+ return this.getPendingTools();
1449
+ case "smart_context":
1450
+ return this.getSmartContextTools();
904
1451
  case "discovery":
905
1452
  return this.getDiscoveryTools();
906
1453
  case "edit":
907
1454
  return this.getEditTools();
1455
+ case "diffmem":
1456
+ return this.getDiffMemTools();
1457
+ case "greptile":
1458
+ return this.getGreptileTools();
1459
+ case "provider":
1460
+ return this.getProviderTools();
908
1461
  case "team":
909
1462
  return this.getTeamTools();
910
1463
  case "cord":
911
1464
  return this.getCordTools();
1465
+ case "digest":
1466
+ return this.getDigestTools();
1467
+ case "desire_paths":
1468
+ return this.getDesirePathTools();
912
1469
  default:
913
1470
  return [];
914
1471
  }