@pencil-agent/nano-pencil 1.11.28 → 1.11.29

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.
@@ -8,7 +8,7 @@
8
8
  * For non-NanoPencil hosts, import from the package root (index.ts) instead.
9
9
  */
10
10
  import { writeFileSync } from "node:fs";
11
- import { basename, join } from "node:path";
11
+ import { basename, join, resolve } from "node:path";
12
12
  import { Type } from "@sinclair/typebox";
13
13
  import { SessionManager } from "@pencil-agent/nano-pencil";
14
14
  import { NanoMemEngine } from "./engine.js";
@@ -555,9 +555,12 @@ export default function nanomemExtension(pi) {
555
555
  ctx.ui.notify(`NanoMem: ${s.totalSessions} sessions | ${s.knowledge} knowledge | ${s.lessons} lessons | ${s.events} events | ${s.preferences} prefs | ${s.work} work | ${s.episodes} episodes`, "info");
556
556
  },
557
557
  });
558
- pi.registerCommand("mem-insights", {
559
- description: "Generate NanoMem full insights HTML report (uses LLM when available)",
560
- handler: async (args, ctx) => {
558
+ const runMemInsights = async (args, ctx) => {
559
+ ctx.ui.setStatus("nanomem", "Generating insights...");
560
+ const requestedPath = args?.trim() || "./nanomem-insights.html";
561
+ const outputPath = resolve(process.cwd(), requestedPath);
562
+ ctx.ui.notify(`NanoMem: generating insights report -> ${outputPath}`, "info");
563
+ try {
561
564
  const llmCtx = ctx;
562
565
  if (llmCtx.completeSimple) {
563
566
  engine.setLlmFn(async (systemPrompt, userMessage) => {
@@ -565,9 +568,18 @@ export default function nanomemExtension(pi) {
565
568
  return out ?? "";
566
569
  });
567
570
  }
568
- const outputPath = args?.trim() || "./nanomem-insights.html";
569
- ctx.ui.notify("NanoMem: Generating full insights report...", "info");
570
- const enhanced = await engine.generateEnhancedInsights();
571
+ let enhanced;
572
+ try {
573
+ enhanced = await engine.generateEnhancedInsights();
574
+ }
575
+ catch {
576
+ enhanced = {
577
+ report: await engine.generateFullInsights(),
578
+ persona: undefined,
579
+ humanInsights: [],
580
+ rootCauses: [],
581
+ };
582
+ }
571
583
  const html = renderFullInsightsHtml({
572
584
  ...enhanced.report,
573
585
  persona: enhanced.persona,
@@ -575,8 +587,20 @@ export default function nanomemExtension(pi) {
575
587
  rootCauses: enhanced.rootCauses,
576
588
  }, engine.cfg.locale);
577
589
  writeFileSync(outputPath, html, "utf-8");
578
- ctx.ui.notify(`NanoMem: Insights report written to ${outputPath}`, "info");
579
- },
590
+ ctx.ui.notify(`NanoMem: insights report written to ${outputPath}`, "info");
591
+ }
592
+ catch (error) {
593
+ const message = error instanceof Error ? error.message : String(error);
594
+ ctx.ui.notify(`NanoMem: failed to generate insights report: ${message}`, "error");
595
+ throw error;
596
+ }
597
+ finally {
598
+ ctx.ui.setStatus("nanomem", "");
599
+ }
600
+ };
601
+ pi.registerCommand("mem-insights", {
602
+ description: "Generate NanoMem full insights HTML report (uses LLM when available)",
603
+ handler: runMemInsights,
580
604
  });
581
605
  pi.registerCommand("mem-align", {
582
606
  description: "Show which stable memories and current states are shaping the agent",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pencil-agent/nano-pencil",
3
- "version": "1.11.28",
3
+ "version": "1.11.29",
4
4
  "description": "CLI writing agent with read, bash, edit, write tools and session management. Based on pi; supports DashScope Coding Plan. Soul enabled by default for AI personality evolution.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -28,6 +28,7 @@
28
28
  "copy:extensions": "node -e \"\nconst fs=require('fs');\nconst p=require('path');\nfunction c(s,d){\n if(fs.existsSync(d))fs.rmSync(d,{recursive:true,force:true});\n if(!fs.existsSync(d))fs.mkdirSync(d,{recursive:true});\n fs.readdirSync(s).forEach(f=>{\n const sp=p.join(s,f),dp=p.join(d,f);\n fs.statSync(sp).isDirectory()?c(sp,dp):fs.copyFileSync(sp,dp)\n })\n}\n// Copy defaults extensions\n\nc('extensions/defaults/security-audit','dist/extensions/defaults/security-audit');\nc('extensions/defaults/soul','dist/extensions/defaults/soul');\nc('extensions/defaults/presence','dist/extensions/defaults/presence');\nc('extensions/defaults/interview','dist/extensions/defaults/interview');\nc('extensions/defaults/loop','dist/extensions/defaults/loop');\nc('extensions/defaults/team','dist/extensions/defaults/team');\nc('extensions/defaults/mcp','dist/extensions/defaults/mcp');\n// Copy optional extensions\nc('extensions/optional/simplify','dist/extensions/optional/simplify');\nc('extensions/optional/export-html','dist/extensions/optional/export-html');\nconsole.log('Extensions copied to dist/');\n\"",
29
29
  "bundle:packages": "node scripts/bundle-deps.js",
30
30
  "watch": "tsc --watch",
31
+ "test:presence": "node --test --import tsx test/presence-opening.test.ts",
31
32
  "start": "npx cross-env NODE_ENV=production node --no-deprecation dist/cli.js",
32
33
  "prepublishOnly": "npm run build",
33
34
  "changelog": "node scripts/generate-changelog.js",