@code-yeongyu/senpi 2026.5.13-3 → 2026.5.13-4

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## [2026.5.13-4] - 2026-05-13
4
+
5
+ ### Added
6
+
7
+ ### Fixed
8
+
9
+ ### Removed
10
+
3
11
  ## [2026.5.13-3] - 2026-05-13
4
12
 
5
13
  ### Added
@@ -1,7 +1,7 @@
1
1
  import type { ImageContent, TextContent } from "@earendil-works/pi-ai";
2
2
  import type { CustomMessage } from "../../messages.js";
3
3
  import type { ExtensionAPI } from "../types.js";
4
- export declare const SANEPI_SYSTEM_PREFIX = "[system:sanepi]";
4
+ export declare const SANEPI_SYSTEM_PREFIX = "[system:senpi]";
5
5
  export declare const SANEPI_CONVERSATION_EVENT = "sanepi:conversation";
6
6
  export type BuiltinSystemMessageRoute = "background-task.notification" | "todotools.continuation";
7
7
  export type SanepiConversationAction = "injected" | "failed";
@@ -1 +1 @@
1
- {"version":3,"file":"system-messages.d.ts","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/system-messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,eAAO,MAAM,oBAAoB,oBAAoB,CAAC;AACtD,eAAO,MAAM,yBAAyB,wBAAwB,CAAC;AAE/D,MAAM,MAAM,yBAAyB,GAAG,8BAA8B,GAAG,wBAAwB,CAAC;AAClG,MAAM,MAAM,wBAAwB,GAAG,UAAU,GAAG,QAAQ,CAAC;AAE7D,MAAM,WAAW,uBAAuB;IACvC,OAAO,EAAE,CAAC,CAAC;IACX,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,wBAAwB,CAAC;IACjC,KAAK,EAAE,yBAAyB,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE;QACb,MAAM,EAAE,OAAO,oBAAoB,CAAC;QACpC,IAAI,EAAE,gBAAgB,GAAG,cAAc,CAAC;QACxC,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;QACjC,WAAW,CAAC,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,KAAK,yBAAyB,GAAG;IAChC,SAAS,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,KAAK,2BAA2B,GAAG;IAClC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,UAAU,CAAC;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAqFF,wBAAgB,sBAAsB,CACrC,EAAE,EAAE,YAAY,EAChB,KAAK,EAAE,yBAAyB,EAChC,OAAO,EAAE,MAAM,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,EAChD,OAAO,CAAC,EAAE,yBAAyB,GACjC,IAAI,CAqBN;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAChD,EAAE,EAAE,YAAY,EAChB,KAAK,EAAE,yBAAyB,EAChC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,SAAS,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,CAAC,EACxF,OAAO,CAAC,EAAE,2BAA2B,GACnC,IAAI,CAgCN;AAED,wBAAgB,+BAA+B,CAC9C,EAAE,EAAE,YAAY,EAChB,IAAI,EAAE;IACL,KAAK,EAAE,yBAAyB,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,gBAAgB,GAAG,cAAc,CAAC;IACxC,OAAO,EAAE,MAAM,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,CAAC;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACjC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACrB,GACC,IAAI,CAiBN","sourcesContent":["import type { ImageContent, TextContent } from \"@earendil-works/pi-ai\";\nimport type { CustomMessage } from \"../../messages.js\";\nimport type { ExtensionAPI } from \"../types.js\";\n\nexport const SANEPI_SYSTEM_PREFIX = \"[system:sanepi]\";\nexport const SANEPI_CONVERSATION_EVENT = \"sanepi:conversation\";\n\nexport type BuiltinSystemMessageRoute = \"background-task.notification\" | \"todotools.continuation\";\nexport type SanepiConversationAction = \"injected\" | \"failed\";\n\nexport interface SanepiConversationEvent {\n\tversion: 1;\n\tsource: \"builtin\";\n\taction: SanepiConversationAction;\n\troute: BuiltinSystemMessageRoute;\n\tsessionId?: string;\n\ttimestamp: number;\n\tconversation: {\n\t\tprefix: typeof SANEPI_SYSTEM_PREFIX;\n\t\tkind: \"custom_message\" | \"user_message\";\n\t\tcustomType?: string;\n\t\tdeliverAs?: \"steer\" | \"followUp\";\n\t\ttriggerTurn?: boolean;\n\t};\n\ttext: string;\n\terrorMessage?: string;\n}\n\ntype BuiltinUserMessageOptions = {\n\tdeliverAs?: \"steer\" | \"followUp\";\n\tsessionId?: string;\n};\n\ntype BuiltinCustomMessageOptions = {\n\ttriggerTurn?: boolean;\n\tdeliverAs?: \"steer\" | \"followUp\" | \"nextTurn\";\n\tsessionId?: string;\n};\n\nfunction prefixText(text: string): string {\n\treturn text.startsWith(SANEPI_SYSTEM_PREFIX) ? text : `${SANEPI_SYSTEM_PREFIX}\\n${text}`;\n}\n\nfunction prefixContent(content: string | (TextContent | ImageContent)[]): string | (TextContent | ImageContent)[] {\n\tif (typeof content === \"string\") {\n\t\treturn prefixText(content);\n\t}\n\n\tconst firstTextIndex = content.findIndex((part) => part.type === \"text\");\n\tif (firstTextIndex === -1) {\n\t\treturn [{ type: \"text\", text: SANEPI_SYSTEM_PREFIX }, ...content];\n\t}\n\n\treturn content.map((part, index) => {\n\t\tif (part.type !== \"text\" || index !== firstTextIndex) {\n\t\t\treturn part;\n\t\t}\n\n\t\treturn {\n\t\t\t...part,\n\t\t\ttext: prefixText(part.text),\n\t\t};\n\t});\n}\n\nfunction extractText(content: string | (TextContent | ImageContent)[]): string {\n\tif (typeof content === \"string\") {\n\t\treturn content;\n\t}\n\n\treturn content\n\t\t.filter((part): part is TextContent => part.type === \"text\")\n\t\t.map((part) => part.text)\n\t\t.join(\"\\n\");\n}\n\nfunction emitSanepiConversationEvent(pi: ExtensionAPI, event: SanepiConversationEvent): void {\n\tpi.events.emit(SANEPI_CONVERSATION_EVENT, event);\n}\n\nfunction createBaseEvent(args: {\n\taction: SanepiConversationAction;\n\troute: BuiltinSystemMessageRoute;\n\tsessionId?: string;\n\tkind: \"custom_message\" | \"user_message\";\n\tcustomType?: string;\n\tdeliverAs?: \"steer\" | \"followUp\";\n\ttriggerTurn?: boolean;\n\ttext: string;\n\terrorMessage?: string;\n}): SanepiConversationEvent {\n\treturn {\n\t\tversion: 1,\n\t\tsource: \"builtin\",\n\t\taction: args.action,\n\t\troute: args.route,\n\t\tsessionId: args.sessionId,\n\t\ttimestamp: Date.now(),\n\t\tconversation: {\n\t\t\tprefix: SANEPI_SYSTEM_PREFIX,\n\t\t\tkind: args.kind,\n\t\t\tcustomType: args.customType,\n\t\t\tdeliverAs: args.deliverAs,\n\t\t\ttriggerTurn: args.triggerTurn,\n\t\t},\n\t\ttext: args.text,\n\t\terrorMessage: args.errorMessage,\n\t};\n}\n\nfunction hasUserMessageOptions(\n\toptions: BuiltinUserMessageOptions | undefined,\n): options is BuiltinUserMessageOptions & { deliverAs: \"steer\" | \"followUp\" } {\n\treturn options?.deliverAs !== undefined;\n}\n\nfunction hasCustomMessageOptions(\n\toptions: BuiltinCustomMessageOptions | undefined,\n): options is BuiltinCustomMessageOptions & { triggerTurn?: boolean; deliverAs?: \"steer\" | \"followUp\" | \"nextTurn\" } {\n\treturn options?.triggerTurn === true || options?.deliverAs !== undefined;\n}\n\nexport function sendBuiltinUserMessage(\n\tpi: ExtensionAPI,\n\troute: BuiltinSystemMessageRoute,\n\tcontent: string | (TextContent | ImageContent)[],\n\toptions?: BuiltinUserMessageOptions,\n): void {\n\tconst prefixedContent = prefixContent(content);\n\n\temitSanepiConversationEvent(\n\t\tpi,\n\t\tcreateBaseEvent({\n\t\t\taction: \"injected\",\n\t\t\troute,\n\t\t\tsessionId: options?.sessionId,\n\t\t\tkind: \"user_message\",\n\t\t\ttext: extractText(prefixedContent),\n\t\t\tdeliverAs: options?.deliverAs,\n\t\t}),\n\t);\n\n\tif (hasUserMessageOptions(options)) {\n\t\tpi.sendUserMessage(prefixedContent, { deliverAs: options.deliverAs });\n\t\treturn;\n\t}\n\n\tpi.sendUserMessage(prefixedContent);\n}\n\nexport function sendBuiltinCustomMessage<TDetails>(\n\tpi: ExtensionAPI,\n\troute: BuiltinSystemMessageRoute,\n\tmessage: Pick<CustomMessage<TDetails>, \"content\" | \"customType\" | \"details\" | \"display\">,\n\toptions?: BuiltinCustomMessageOptions,\n): void {\n\tconst prefixedContent = prefixContent(message.content);\n\tconst deliverAs = options?.deliverAs === \"nextTurn\" ? undefined : options?.deliverAs;\n\n\temitSanepiConversationEvent(\n\t\tpi,\n\t\tcreateBaseEvent({\n\t\t\taction: \"injected\",\n\t\t\troute,\n\t\t\tsessionId: options?.sessionId,\n\t\t\tkind: \"custom_message\",\n\t\t\tcustomType: message.customType,\n\t\t\ttext: extractText(prefixedContent),\n\t\t\tdeliverAs,\n\t\t\ttriggerTurn: options?.triggerTurn,\n\t\t}),\n\t);\n\n\tconst prefixedMessage = {\n\t\t...message,\n\t\tcontent: prefixedContent,\n\t};\n\n\tif (hasCustomMessageOptions(options)) {\n\t\tpi.sendMessage(prefixedMessage, {\n\t\t\ttriggerTurn: options.triggerTurn,\n\t\t\tdeliverAs: options.deliverAs,\n\t\t});\n\t\treturn;\n\t}\n\n\tpi.sendMessage(prefixedMessage);\n}\n\nexport function emitBuiltinSystemMessageFailure(\n\tpi: ExtensionAPI,\n\targs: {\n\t\troute: BuiltinSystemMessageRoute;\n\t\tsessionId?: string;\n\t\tkind: \"custom_message\" | \"user_message\";\n\t\tcontent: string | (TextContent | ImageContent)[];\n\t\tcustomType?: string;\n\t\tdeliverAs?: \"steer\" | \"followUp\";\n\t\ttriggerTurn?: boolean;\n\t\terrorMessage: string;\n\t},\n): void {\n\tconst prefixedContent = prefixContent(args.content);\n\n\temitSanepiConversationEvent(\n\t\tpi,\n\t\tcreateBaseEvent({\n\t\t\taction: \"failed\",\n\t\t\troute: args.route,\n\t\t\tsessionId: args.sessionId,\n\t\t\tkind: args.kind,\n\t\t\tcustomType: args.customType,\n\t\t\ttext: extractText(prefixedContent),\n\t\t\tdeliverAs: args.deliverAs,\n\t\t\ttriggerTurn: args.triggerTurn,\n\t\t\terrorMessage: args.errorMessage,\n\t\t}),\n\t);\n}\n"]}
1
+ {"version":3,"file":"system-messages.d.ts","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/system-messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,eAAO,MAAM,oBAAoB,mBAAmB,CAAC;AACrD,eAAO,MAAM,yBAAyB,wBAAwB,CAAC;AAE/D,MAAM,MAAM,yBAAyB,GAAG,8BAA8B,GAAG,wBAAwB,CAAC;AAClG,MAAM,MAAM,wBAAwB,GAAG,UAAU,GAAG,QAAQ,CAAC;AAE7D,MAAM,WAAW,uBAAuB;IACvC,OAAO,EAAE,CAAC,CAAC;IACX,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,wBAAwB,CAAC;IACjC,KAAK,EAAE,yBAAyB,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE;QACb,MAAM,EAAE,OAAO,oBAAoB,CAAC;QACpC,IAAI,EAAE,gBAAgB,GAAG,cAAc,CAAC;QACxC,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;QACjC,WAAW,CAAC,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,KAAK,yBAAyB,GAAG;IAChC,SAAS,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,KAAK,2BAA2B,GAAG;IAClC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,UAAU,CAAC;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAqFF,wBAAgB,sBAAsB,CACrC,EAAE,EAAE,YAAY,EAChB,KAAK,EAAE,yBAAyB,EAChC,OAAO,EAAE,MAAM,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,EAChD,OAAO,CAAC,EAAE,yBAAyB,GACjC,IAAI,CAqBN;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAChD,EAAE,EAAE,YAAY,EAChB,KAAK,EAAE,yBAAyB,EAChC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,SAAS,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,CAAC,EACxF,OAAO,CAAC,EAAE,2BAA2B,GACnC,IAAI,CAgCN;AAED,wBAAgB,+BAA+B,CAC9C,EAAE,EAAE,YAAY,EAChB,IAAI,EAAE;IACL,KAAK,EAAE,yBAAyB,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,gBAAgB,GAAG,cAAc,CAAC;IACxC,OAAO,EAAE,MAAM,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,CAAC;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACjC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACrB,GACC,IAAI,CAiBN","sourcesContent":["import type { ImageContent, TextContent } from \"@earendil-works/pi-ai\";\nimport type { CustomMessage } from \"../../messages.js\";\nimport type { ExtensionAPI } from \"../types.js\";\n\nexport const SANEPI_SYSTEM_PREFIX = \"[system:senpi]\";\nexport const SANEPI_CONVERSATION_EVENT = \"sanepi:conversation\";\n\nexport type BuiltinSystemMessageRoute = \"background-task.notification\" | \"todotools.continuation\";\nexport type SanepiConversationAction = \"injected\" | \"failed\";\n\nexport interface SanepiConversationEvent {\n\tversion: 1;\n\tsource: \"builtin\";\n\taction: SanepiConversationAction;\n\troute: BuiltinSystemMessageRoute;\n\tsessionId?: string;\n\ttimestamp: number;\n\tconversation: {\n\t\tprefix: typeof SANEPI_SYSTEM_PREFIX;\n\t\tkind: \"custom_message\" | \"user_message\";\n\t\tcustomType?: string;\n\t\tdeliverAs?: \"steer\" | \"followUp\";\n\t\ttriggerTurn?: boolean;\n\t};\n\ttext: string;\n\terrorMessage?: string;\n}\n\ntype BuiltinUserMessageOptions = {\n\tdeliverAs?: \"steer\" | \"followUp\";\n\tsessionId?: string;\n};\n\ntype BuiltinCustomMessageOptions = {\n\ttriggerTurn?: boolean;\n\tdeliverAs?: \"steer\" | \"followUp\" | \"nextTurn\";\n\tsessionId?: string;\n};\n\nfunction prefixText(text: string): string {\n\treturn text.startsWith(SANEPI_SYSTEM_PREFIX) ? text : `${SANEPI_SYSTEM_PREFIX}\\n${text}`;\n}\n\nfunction prefixContent(content: string | (TextContent | ImageContent)[]): string | (TextContent | ImageContent)[] {\n\tif (typeof content === \"string\") {\n\t\treturn prefixText(content);\n\t}\n\n\tconst firstTextIndex = content.findIndex((part) => part.type === \"text\");\n\tif (firstTextIndex === -1) {\n\t\treturn [{ type: \"text\", text: SANEPI_SYSTEM_PREFIX }, ...content];\n\t}\n\n\treturn content.map((part, index) => {\n\t\tif (part.type !== \"text\" || index !== firstTextIndex) {\n\t\t\treturn part;\n\t\t}\n\n\t\treturn {\n\t\t\t...part,\n\t\t\ttext: prefixText(part.text),\n\t\t};\n\t});\n}\n\nfunction extractText(content: string | (TextContent | ImageContent)[]): string {\n\tif (typeof content === \"string\") {\n\t\treturn content;\n\t}\n\n\treturn content\n\t\t.filter((part): part is TextContent => part.type === \"text\")\n\t\t.map((part) => part.text)\n\t\t.join(\"\\n\");\n}\n\nfunction emitSanepiConversationEvent(pi: ExtensionAPI, event: SanepiConversationEvent): void {\n\tpi.events.emit(SANEPI_CONVERSATION_EVENT, event);\n}\n\nfunction createBaseEvent(args: {\n\taction: SanepiConversationAction;\n\troute: BuiltinSystemMessageRoute;\n\tsessionId?: string;\n\tkind: \"custom_message\" | \"user_message\";\n\tcustomType?: string;\n\tdeliverAs?: \"steer\" | \"followUp\";\n\ttriggerTurn?: boolean;\n\ttext: string;\n\terrorMessage?: string;\n}): SanepiConversationEvent {\n\treturn {\n\t\tversion: 1,\n\t\tsource: \"builtin\",\n\t\taction: args.action,\n\t\troute: args.route,\n\t\tsessionId: args.sessionId,\n\t\ttimestamp: Date.now(),\n\t\tconversation: {\n\t\t\tprefix: SANEPI_SYSTEM_PREFIX,\n\t\t\tkind: args.kind,\n\t\t\tcustomType: args.customType,\n\t\t\tdeliverAs: args.deliverAs,\n\t\t\ttriggerTurn: args.triggerTurn,\n\t\t},\n\t\ttext: args.text,\n\t\terrorMessage: args.errorMessage,\n\t};\n}\n\nfunction hasUserMessageOptions(\n\toptions: BuiltinUserMessageOptions | undefined,\n): options is BuiltinUserMessageOptions & { deliverAs: \"steer\" | \"followUp\" } {\n\treturn options?.deliverAs !== undefined;\n}\n\nfunction hasCustomMessageOptions(\n\toptions: BuiltinCustomMessageOptions | undefined,\n): options is BuiltinCustomMessageOptions & { triggerTurn?: boolean; deliverAs?: \"steer\" | \"followUp\" | \"nextTurn\" } {\n\treturn options?.triggerTurn === true || options?.deliverAs !== undefined;\n}\n\nexport function sendBuiltinUserMessage(\n\tpi: ExtensionAPI,\n\troute: BuiltinSystemMessageRoute,\n\tcontent: string | (TextContent | ImageContent)[],\n\toptions?: BuiltinUserMessageOptions,\n): void {\n\tconst prefixedContent = prefixContent(content);\n\n\temitSanepiConversationEvent(\n\t\tpi,\n\t\tcreateBaseEvent({\n\t\t\taction: \"injected\",\n\t\t\troute,\n\t\t\tsessionId: options?.sessionId,\n\t\t\tkind: \"user_message\",\n\t\t\ttext: extractText(prefixedContent),\n\t\t\tdeliverAs: options?.deliverAs,\n\t\t}),\n\t);\n\n\tif (hasUserMessageOptions(options)) {\n\t\tpi.sendUserMessage(prefixedContent, { deliverAs: options.deliverAs });\n\t\treturn;\n\t}\n\n\tpi.sendUserMessage(prefixedContent);\n}\n\nexport function sendBuiltinCustomMessage<TDetails>(\n\tpi: ExtensionAPI,\n\troute: BuiltinSystemMessageRoute,\n\tmessage: Pick<CustomMessage<TDetails>, \"content\" | \"customType\" | \"details\" | \"display\">,\n\toptions?: BuiltinCustomMessageOptions,\n): void {\n\tconst prefixedContent = prefixContent(message.content);\n\tconst deliverAs = options?.deliverAs === \"nextTurn\" ? undefined : options?.deliverAs;\n\n\temitSanepiConversationEvent(\n\t\tpi,\n\t\tcreateBaseEvent({\n\t\t\taction: \"injected\",\n\t\t\troute,\n\t\t\tsessionId: options?.sessionId,\n\t\t\tkind: \"custom_message\",\n\t\t\tcustomType: message.customType,\n\t\t\ttext: extractText(prefixedContent),\n\t\t\tdeliverAs,\n\t\t\ttriggerTurn: options?.triggerTurn,\n\t\t}),\n\t);\n\n\tconst prefixedMessage = {\n\t\t...message,\n\t\tcontent: prefixedContent,\n\t};\n\n\tif (hasCustomMessageOptions(options)) {\n\t\tpi.sendMessage(prefixedMessage, {\n\t\t\ttriggerTurn: options.triggerTurn,\n\t\t\tdeliverAs: options.deliverAs,\n\t\t});\n\t\treturn;\n\t}\n\n\tpi.sendMessage(prefixedMessage);\n}\n\nexport function emitBuiltinSystemMessageFailure(\n\tpi: ExtensionAPI,\n\targs: {\n\t\troute: BuiltinSystemMessageRoute;\n\t\tsessionId?: string;\n\t\tkind: \"custom_message\" | \"user_message\";\n\t\tcontent: string | (TextContent | ImageContent)[];\n\t\tcustomType?: string;\n\t\tdeliverAs?: \"steer\" | \"followUp\";\n\t\ttriggerTurn?: boolean;\n\t\terrorMessage: string;\n\t},\n): void {\n\tconst prefixedContent = prefixContent(args.content);\n\n\temitSanepiConversationEvent(\n\t\tpi,\n\t\tcreateBaseEvent({\n\t\t\taction: \"failed\",\n\t\t\troute: args.route,\n\t\t\tsessionId: args.sessionId,\n\t\t\tkind: args.kind,\n\t\t\tcustomType: args.customType,\n\t\t\ttext: extractText(prefixedContent),\n\t\t\tdeliverAs: args.deliverAs,\n\t\t\ttriggerTurn: args.triggerTurn,\n\t\t\terrorMessage: args.errorMessage,\n\t\t}),\n\t);\n}\n"]}
@@ -1,4 +1,4 @@
1
- export const SANEPI_SYSTEM_PREFIX = "[system:sanepi]";
1
+ export const SANEPI_SYSTEM_PREFIX = "[system:senpi]";
2
2
  export const SANEPI_CONVERSATION_EVENT = "sanepi:conversation";
3
3
  function prefixText(text) {
4
4
  return text.startsWith(SANEPI_SYSTEM_PREFIX) ? text : `${SANEPI_SYSTEM_PREFIX}\n${text}`;
@@ -1 +1 @@
1
- {"version":3,"file":"system-messages.js","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/system-messages.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ImageContent, TextContent } from \"@earendil-works/pi-ai\";\nimport type { CustomMessage } from \"../../messages.js\";\nimport type { ExtensionAPI } from \"../types.js\";\n\nexport const SANEPI_SYSTEM_PREFIX = \"[system:sanepi]\";\nexport const SANEPI_CONVERSATION_EVENT = \"sanepi:conversation\";\n\nexport type BuiltinSystemMessageRoute = \"background-task.notification\" | \"todotools.continuation\";\nexport type SanepiConversationAction = \"injected\" | \"failed\";\n\nexport interface SanepiConversationEvent {\n\tversion: 1;\n\tsource: \"builtin\";\n\taction: SanepiConversationAction;\n\troute: BuiltinSystemMessageRoute;\n\tsessionId?: string;\n\ttimestamp: number;\n\tconversation: {\n\t\tprefix: typeof SANEPI_SYSTEM_PREFIX;\n\t\tkind: \"custom_message\" | \"user_message\";\n\t\tcustomType?: string;\n\t\tdeliverAs?: \"steer\" | \"followUp\";\n\t\ttriggerTurn?: boolean;\n\t};\n\ttext: string;\n\terrorMessage?: string;\n}\n\ntype BuiltinUserMessageOptions = {\n\tdeliverAs?: \"steer\" | \"followUp\";\n\tsessionId?: string;\n};\n\ntype BuiltinCustomMessageOptions = {\n\ttriggerTurn?: boolean;\n\tdeliverAs?: \"steer\" | \"followUp\" | \"nextTurn\";\n\tsessionId?: string;\n};\n\nfunction prefixText(text: string): string {\n\treturn text.startsWith(SANEPI_SYSTEM_PREFIX) ? text : `${SANEPI_SYSTEM_PREFIX}\\n${text}`;\n}\n\nfunction prefixContent(content: string | (TextContent | ImageContent)[]): string | (TextContent | ImageContent)[] {\n\tif (typeof content === \"string\") {\n\t\treturn prefixText(content);\n\t}\n\n\tconst firstTextIndex = content.findIndex((part) => part.type === \"text\");\n\tif (firstTextIndex === -1) {\n\t\treturn [{ type: \"text\", text: SANEPI_SYSTEM_PREFIX }, ...content];\n\t}\n\n\treturn content.map((part, index) => {\n\t\tif (part.type !== \"text\" || index !== firstTextIndex) {\n\t\t\treturn part;\n\t\t}\n\n\t\treturn {\n\t\t\t...part,\n\t\t\ttext: prefixText(part.text),\n\t\t};\n\t});\n}\n\nfunction extractText(content: string | (TextContent | ImageContent)[]): string {\n\tif (typeof content === \"string\") {\n\t\treturn content;\n\t}\n\n\treturn content\n\t\t.filter((part): part is TextContent => part.type === \"text\")\n\t\t.map((part) => part.text)\n\t\t.join(\"\\n\");\n}\n\nfunction emitSanepiConversationEvent(pi: ExtensionAPI, event: SanepiConversationEvent): void {\n\tpi.events.emit(SANEPI_CONVERSATION_EVENT, event);\n}\n\nfunction createBaseEvent(args: {\n\taction: SanepiConversationAction;\n\troute: BuiltinSystemMessageRoute;\n\tsessionId?: string;\n\tkind: \"custom_message\" | \"user_message\";\n\tcustomType?: string;\n\tdeliverAs?: \"steer\" | \"followUp\";\n\ttriggerTurn?: boolean;\n\ttext: string;\n\terrorMessage?: string;\n}): SanepiConversationEvent {\n\treturn {\n\t\tversion: 1,\n\t\tsource: \"builtin\",\n\t\taction: args.action,\n\t\troute: args.route,\n\t\tsessionId: args.sessionId,\n\t\ttimestamp: Date.now(),\n\t\tconversation: {\n\t\t\tprefix: SANEPI_SYSTEM_PREFIX,\n\t\t\tkind: args.kind,\n\t\t\tcustomType: args.customType,\n\t\t\tdeliverAs: args.deliverAs,\n\t\t\ttriggerTurn: args.triggerTurn,\n\t\t},\n\t\ttext: args.text,\n\t\terrorMessage: args.errorMessage,\n\t};\n}\n\nfunction hasUserMessageOptions(\n\toptions: BuiltinUserMessageOptions | undefined,\n): options is BuiltinUserMessageOptions & { deliverAs: \"steer\" | \"followUp\" } {\n\treturn options?.deliverAs !== undefined;\n}\n\nfunction hasCustomMessageOptions(\n\toptions: BuiltinCustomMessageOptions | undefined,\n): options is BuiltinCustomMessageOptions & { triggerTurn?: boolean; deliverAs?: \"steer\" | \"followUp\" | \"nextTurn\" } {\n\treturn options?.triggerTurn === true || options?.deliverAs !== undefined;\n}\n\nexport function sendBuiltinUserMessage(\n\tpi: ExtensionAPI,\n\troute: BuiltinSystemMessageRoute,\n\tcontent: string | (TextContent | ImageContent)[],\n\toptions?: BuiltinUserMessageOptions,\n): void {\n\tconst prefixedContent = prefixContent(content);\n\n\temitSanepiConversationEvent(\n\t\tpi,\n\t\tcreateBaseEvent({\n\t\t\taction: \"injected\",\n\t\t\troute,\n\t\t\tsessionId: options?.sessionId,\n\t\t\tkind: \"user_message\",\n\t\t\ttext: extractText(prefixedContent),\n\t\t\tdeliverAs: options?.deliverAs,\n\t\t}),\n\t);\n\n\tif (hasUserMessageOptions(options)) {\n\t\tpi.sendUserMessage(prefixedContent, { deliverAs: options.deliverAs });\n\t\treturn;\n\t}\n\n\tpi.sendUserMessage(prefixedContent);\n}\n\nexport function sendBuiltinCustomMessage<TDetails>(\n\tpi: ExtensionAPI,\n\troute: BuiltinSystemMessageRoute,\n\tmessage: Pick<CustomMessage<TDetails>, \"content\" | \"customType\" | \"details\" | \"display\">,\n\toptions?: BuiltinCustomMessageOptions,\n): void {\n\tconst prefixedContent = prefixContent(message.content);\n\tconst deliverAs = options?.deliverAs === \"nextTurn\" ? undefined : options?.deliverAs;\n\n\temitSanepiConversationEvent(\n\t\tpi,\n\t\tcreateBaseEvent({\n\t\t\taction: \"injected\",\n\t\t\troute,\n\t\t\tsessionId: options?.sessionId,\n\t\t\tkind: \"custom_message\",\n\t\t\tcustomType: message.customType,\n\t\t\ttext: extractText(prefixedContent),\n\t\t\tdeliverAs,\n\t\t\ttriggerTurn: options?.triggerTurn,\n\t\t}),\n\t);\n\n\tconst prefixedMessage = {\n\t\t...message,\n\t\tcontent: prefixedContent,\n\t};\n\n\tif (hasCustomMessageOptions(options)) {\n\t\tpi.sendMessage(prefixedMessage, {\n\t\t\ttriggerTurn: options.triggerTurn,\n\t\t\tdeliverAs: options.deliverAs,\n\t\t});\n\t\treturn;\n\t}\n\n\tpi.sendMessage(prefixedMessage);\n}\n\nexport function emitBuiltinSystemMessageFailure(\n\tpi: ExtensionAPI,\n\targs: {\n\t\troute: BuiltinSystemMessageRoute;\n\t\tsessionId?: string;\n\t\tkind: \"custom_message\" | \"user_message\";\n\t\tcontent: string | (TextContent | ImageContent)[];\n\t\tcustomType?: string;\n\t\tdeliverAs?: \"steer\" | \"followUp\";\n\t\ttriggerTurn?: boolean;\n\t\terrorMessage: string;\n\t},\n): void {\n\tconst prefixedContent = prefixContent(args.content);\n\n\temitSanepiConversationEvent(\n\t\tpi,\n\t\tcreateBaseEvent({\n\t\t\taction: \"failed\",\n\t\t\troute: args.route,\n\t\t\tsessionId: args.sessionId,\n\t\t\tkind: args.kind,\n\t\t\tcustomType: args.customType,\n\t\t\ttext: extractText(prefixedContent),\n\t\t\tdeliverAs: args.deliverAs,\n\t\t\ttriggerTurn: args.triggerTurn,\n\t\t\terrorMessage: args.errorMessage,\n\t\t}),\n\t);\n}\n"]}
1
+ {"version":3,"file":"system-messages.js","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/system-messages.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ImageContent, TextContent } from \"@earendil-works/pi-ai\";\nimport type { CustomMessage } from \"../../messages.js\";\nimport type { ExtensionAPI } from \"../types.js\";\n\nexport const SANEPI_SYSTEM_PREFIX = \"[system:senpi]\";\nexport const SANEPI_CONVERSATION_EVENT = \"sanepi:conversation\";\n\nexport type BuiltinSystemMessageRoute = \"background-task.notification\" | \"todotools.continuation\";\nexport type SanepiConversationAction = \"injected\" | \"failed\";\n\nexport interface SanepiConversationEvent {\n\tversion: 1;\n\tsource: \"builtin\";\n\taction: SanepiConversationAction;\n\troute: BuiltinSystemMessageRoute;\n\tsessionId?: string;\n\ttimestamp: number;\n\tconversation: {\n\t\tprefix: typeof SANEPI_SYSTEM_PREFIX;\n\t\tkind: \"custom_message\" | \"user_message\";\n\t\tcustomType?: string;\n\t\tdeliverAs?: \"steer\" | \"followUp\";\n\t\ttriggerTurn?: boolean;\n\t};\n\ttext: string;\n\terrorMessage?: string;\n}\n\ntype BuiltinUserMessageOptions = {\n\tdeliverAs?: \"steer\" | \"followUp\";\n\tsessionId?: string;\n};\n\ntype BuiltinCustomMessageOptions = {\n\ttriggerTurn?: boolean;\n\tdeliverAs?: \"steer\" | \"followUp\" | \"nextTurn\";\n\tsessionId?: string;\n};\n\nfunction prefixText(text: string): string {\n\treturn text.startsWith(SANEPI_SYSTEM_PREFIX) ? text : `${SANEPI_SYSTEM_PREFIX}\\n${text}`;\n}\n\nfunction prefixContent(content: string | (TextContent | ImageContent)[]): string | (TextContent | ImageContent)[] {\n\tif (typeof content === \"string\") {\n\t\treturn prefixText(content);\n\t}\n\n\tconst firstTextIndex = content.findIndex((part) => part.type === \"text\");\n\tif (firstTextIndex === -1) {\n\t\treturn [{ type: \"text\", text: SANEPI_SYSTEM_PREFIX }, ...content];\n\t}\n\n\treturn content.map((part, index) => {\n\t\tif (part.type !== \"text\" || index !== firstTextIndex) {\n\t\t\treturn part;\n\t\t}\n\n\t\treturn {\n\t\t\t...part,\n\t\t\ttext: prefixText(part.text),\n\t\t};\n\t});\n}\n\nfunction extractText(content: string | (TextContent | ImageContent)[]): string {\n\tif (typeof content === \"string\") {\n\t\treturn content;\n\t}\n\n\treturn content\n\t\t.filter((part): part is TextContent => part.type === \"text\")\n\t\t.map((part) => part.text)\n\t\t.join(\"\\n\");\n}\n\nfunction emitSanepiConversationEvent(pi: ExtensionAPI, event: SanepiConversationEvent): void {\n\tpi.events.emit(SANEPI_CONVERSATION_EVENT, event);\n}\n\nfunction createBaseEvent(args: {\n\taction: SanepiConversationAction;\n\troute: BuiltinSystemMessageRoute;\n\tsessionId?: string;\n\tkind: \"custom_message\" | \"user_message\";\n\tcustomType?: string;\n\tdeliverAs?: \"steer\" | \"followUp\";\n\ttriggerTurn?: boolean;\n\ttext: string;\n\terrorMessage?: string;\n}): SanepiConversationEvent {\n\treturn {\n\t\tversion: 1,\n\t\tsource: \"builtin\",\n\t\taction: args.action,\n\t\troute: args.route,\n\t\tsessionId: args.sessionId,\n\t\ttimestamp: Date.now(),\n\t\tconversation: {\n\t\t\tprefix: SANEPI_SYSTEM_PREFIX,\n\t\t\tkind: args.kind,\n\t\t\tcustomType: args.customType,\n\t\t\tdeliverAs: args.deliverAs,\n\t\t\ttriggerTurn: args.triggerTurn,\n\t\t},\n\t\ttext: args.text,\n\t\terrorMessage: args.errorMessage,\n\t};\n}\n\nfunction hasUserMessageOptions(\n\toptions: BuiltinUserMessageOptions | undefined,\n): options is BuiltinUserMessageOptions & { deliverAs: \"steer\" | \"followUp\" } {\n\treturn options?.deliverAs !== undefined;\n}\n\nfunction hasCustomMessageOptions(\n\toptions: BuiltinCustomMessageOptions | undefined,\n): options is BuiltinCustomMessageOptions & { triggerTurn?: boolean; deliverAs?: \"steer\" | \"followUp\" | \"nextTurn\" } {\n\treturn options?.triggerTurn === true || options?.deliverAs !== undefined;\n}\n\nexport function sendBuiltinUserMessage(\n\tpi: ExtensionAPI,\n\troute: BuiltinSystemMessageRoute,\n\tcontent: string | (TextContent | ImageContent)[],\n\toptions?: BuiltinUserMessageOptions,\n): void {\n\tconst prefixedContent = prefixContent(content);\n\n\temitSanepiConversationEvent(\n\t\tpi,\n\t\tcreateBaseEvent({\n\t\t\taction: \"injected\",\n\t\t\troute,\n\t\t\tsessionId: options?.sessionId,\n\t\t\tkind: \"user_message\",\n\t\t\ttext: extractText(prefixedContent),\n\t\t\tdeliverAs: options?.deliverAs,\n\t\t}),\n\t);\n\n\tif (hasUserMessageOptions(options)) {\n\t\tpi.sendUserMessage(prefixedContent, { deliverAs: options.deliverAs });\n\t\treturn;\n\t}\n\n\tpi.sendUserMessage(prefixedContent);\n}\n\nexport function sendBuiltinCustomMessage<TDetails>(\n\tpi: ExtensionAPI,\n\troute: BuiltinSystemMessageRoute,\n\tmessage: Pick<CustomMessage<TDetails>, \"content\" | \"customType\" | \"details\" | \"display\">,\n\toptions?: BuiltinCustomMessageOptions,\n): void {\n\tconst prefixedContent = prefixContent(message.content);\n\tconst deliverAs = options?.deliverAs === \"nextTurn\" ? undefined : options?.deliverAs;\n\n\temitSanepiConversationEvent(\n\t\tpi,\n\t\tcreateBaseEvent({\n\t\t\taction: \"injected\",\n\t\t\troute,\n\t\t\tsessionId: options?.sessionId,\n\t\t\tkind: \"custom_message\",\n\t\t\tcustomType: message.customType,\n\t\t\ttext: extractText(prefixedContent),\n\t\t\tdeliverAs,\n\t\t\ttriggerTurn: options?.triggerTurn,\n\t\t}),\n\t);\n\n\tconst prefixedMessage = {\n\t\t...message,\n\t\tcontent: prefixedContent,\n\t};\n\n\tif (hasCustomMessageOptions(options)) {\n\t\tpi.sendMessage(prefixedMessage, {\n\t\t\ttriggerTurn: options.triggerTurn,\n\t\t\tdeliverAs: options.deliverAs,\n\t\t});\n\t\treturn;\n\t}\n\n\tpi.sendMessage(prefixedMessage);\n}\n\nexport function emitBuiltinSystemMessageFailure(\n\tpi: ExtensionAPI,\n\targs: {\n\t\troute: BuiltinSystemMessageRoute;\n\t\tsessionId?: string;\n\t\tkind: \"custom_message\" | \"user_message\";\n\t\tcontent: string | (TextContent | ImageContent)[];\n\t\tcustomType?: string;\n\t\tdeliverAs?: \"steer\" | \"followUp\";\n\t\ttriggerTurn?: boolean;\n\t\terrorMessage: string;\n\t},\n): void {\n\tconst prefixedContent = prefixContent(args.content);\n\n\temitSanepiConversationEvent(\n\t\tpi,\n\t\tcreateBaseEvent({\n\t\t\taction: \"failed\",\n\t\t\troute: args.route,\n\t\t\tsessionId: args.sessionId,\n\t\t\tkind: args.kind,\n\t\t\tcustomType: args.customType,\n\t\t\ttext: extractText(prefixedContent),\n\t\t\tdeliverAs: args.deliverAs,\n\t\t\ttriggerTurn: args.triggerTurn,\n\t\t\terrorMessage: args.errorMessage,\n\t\t}),\n\t);\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import type { ImageContent, TextContent } from "@earendil-works/pi-ai";
2
2
  import type { ExtensionAPI } from "../../types.js";
3
- export declare const SANEPI_SYSTEM_PREFIX = "[system:sanepi]";
3
+ export declare const SANEPI_SYSTEM_PREFIX = "[system:senpi]";
4
4
  export declare const SANEPI_CONVERSATION_EVENT = "sanepi:conversation";
5
5
  export type TodoSystemMessageRoute = "todotools.continuation";
6
6
  export type TodoConversationAction = "injected" | "failed";
@@ -1 +1 @@
1
- {"version":3,"file":"system-messages.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/system-messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,eAAO,MAAM,oBAAoB,oBAAoB,CAAC;AACtD,eAAO,MAAM,yBAAyB,wBAAwB,CAAC;AAE/D,MAAM,MAAM,sBAAsB,GAAG,wBAAwB,CAAC;AAC9D,MAAM,MAAM,sBAAsB,GAAG,UAAU,GAAG,QAAQ,CAAC;AAE3D,MAAM,WAAW,qBAAqB;IACrC,OAAO,EAAE,CAAC,CAAC;IACX,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,sBAAsB,CAAC;IAC/B,KAAK,EAAE,sBAAsB,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE;QACb,MAAM,EAAE,OAAO,oBAAoB,CAAC;QACpC,IAAI,EAAE,cAAc,CAAC;QACrB,SAAS,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;KACjC,CAAC;IACF,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,sBAAsB;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;CACjC;AA0ED,wBAAgB,mBAAmB,CAClC,EAAE,EAAE,YAAY,EAChB,KAAK,EAAE,sBAAsB,EAC7B,OAAO,EAAE,MAAM,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,EAChD,OAAO,CAAC,EAAE,sBAAsB,GAC9B,IAAI,CAoBN;AAED,wBAAgB,4BAA4B,CAC3C,EAAE,EAAE,YAAY,EAChB,IAAI,EAAE;IACL,KAAK,EAAE,sBAAsB,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,CAAC;IACjD,SAAS,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACjC,YAAY,EAAE,MAAM,CAAC;CACrB,GACC,IAAI,CAcN","sourcesContent":["import type { ImageContent, TextContent } from \"@earendil-works/pi-ai\";\nimport type { ExtensionAPI } from \"../../types.js\";\n\nexport const SANEPI_SYSTEM_PREFIX = \"[system:sanepi]\";\nexport const SANEPI_CONVERSATION_EVENT = \"sanepi:conversation\";\n\nexport type TodoSystemMessageRoute = \"todotools.continuation\";\nexport type TodoConversationAction = \"injected\" | \"failed\";\n\nexport interface TodoConversationEvent {\n\tversion: 1;\n\tsource: \"builtin\";\n\taction: TodoConversationAction;\n\troute: TodoSystemMessageRoute;\n\tsessionId?: string;\n\ttimestamp: number;\n\tconversation: {\n\t\tprefix: typeof SANEPI_SYSTEM_PREFIX;\n\t\tkind: \"user_message\";\n\t\tdeliverAs?: \"steer\" | \"followUp\";\n\t};\n\ttext: string;\n\terrorMessage?: string;\n}\n\nexport interface TodoUserMessageOptions {\n\tsessionId?: string;\n\tdeliverAs?: \"steer\" | \"followUp\";\n}\n\nfunction prefixText(text: string): string {\n\treturn text.startsWith(SANEPI_SYSTEM_PREFIX) ? text : `${SANEPI_SYSTEM_PREFIX}\\n${text}`;\n}\n\nfunction prefixContent(content: string | (TextContent | ImageContent)[]): string | (TextContent | ImageContent)[] {\n\tif (typeof content === \"string\") {\n\t\treturn prefixText(content);\n\t}\n\n\tconst firstTextIndex = content.findIndex((part) => part.type === \"text\");\n\tif (firstTextIndex === -1) {\n\t\treturn [{ type: \"text\", text: SANEPI_SYSTEM_PREFIX }, ...content];\n\t}\n\n\treturn content.map((part, index) => {\n\t\tif (part.type !== \"text\" || index !== firstTextIndex) {\n\t\t\treturn part;\n\t\t}\n\n\t\treturn {\n\t\t\t...part,\n\t\t\ttext: prefixText(part.text),\n\t\t};\n\t});\n}\n\nfunction extractText(content: string | (TextContent | ImageContent)[]): string {\n\tif (typeof content === \"string\") {\n\t\treturn content;\n\t}\n\n\treturn content\n\t\t.filter((part): part is TextContent => part.type === \"text\")\n\t\t.map((part) => part.text)\n\t\t.join(\"\\n\");\n}\n\nfunction emitTodoConversationEvent(pi: ExtensionAPI, event: TodoConversationEvent): void {\n\tpi.events.emit(SANEPI_CONVERSATION_EVENT, event);\n}\n\nfunction createBaseEvent(args: {\n\taction: TodoConversationAction;\n\troute: TodoSystemMessageRoute;\n\tsessionId?: string;\n\tdeliverAs?: \"steer\" | \"followUp\";\n\ttext: string;\n\terrorMessage?: string;\n}): TodoConversationEvent {\n\treturn {\n\t\tversion: 1,\n\t\tsource: \"builtin\",\n\t\taction: args.action,\n\t\troute: args.route,\n\t\tsessionId: args.sessionId,\n\t\ttimestamp: Date.now(),\n\t\tconversation: {\n\t\t\tprefix: SANEPI_SYSTEM_PREFIX,\n\t\t\tkind: \"user_message\",\n\t\t\tdeliverAs: args.deliverAs,\n\t\t},\n\t\ttext: args.text,\n\t\terrorMessage: args.errorMessage,\n\t};\n}\n\nfunction hasUserMessageOptions(\n\toptions: TodoUserMessageOptions | undefined,\n): options is TodoUserMessageOptions & { deliverAs: \"steer\" | \"followUp\" } {\n\treturn options?.deliverAs !== undefined;\n}\n\nexport function sendTodoUserMessage(\n\tpi: ExtensionAPI,\n\troute: TodoSystemMessageRoute,\n\tcontent: string | (TextContent | ImageContent)[],\n\toptions?: TodoUserMessageOptions,\n): void {\n\tconst prefixedContent = prefixContent(content);\n\n\temitTodoConversationEvent(\n\t\tpi,\n\t\tcreateBaseEvent({\n\t\t\taction: \"injected\",\n\t\t\troute,\n\t\t\tsessionId: options?.sessionId,\n\t\t\ttext: extractText(prefixedContent),\n\t\t\tdeliverAs: options?.deliverAs,\n\t\t}),\n\t);\n\n\tif (hasUserMessageOptions(options)) {\n\t\tpi.sendUserMessage(prefixedContent, { deliverAs: options.deliverAs });\n\t\treturn;\n\t}\n\n\tpi.sendUserMessage(prefixedContent);\n}\n\nexport function emitTodoSystemMessageFailure(\n\tpi: ExtensionAPI,\n\targs: {\n\t\troute: TodoSystemMessageRoute;\n\t\tsessionId?: string;\n\t\tcontent: string | (TextContent | ImageContent)[];\n\t\tdeliverAs?: \"steer\" | \"followUp\";\n\t\terrorMessage: string;\n\t},\n): void {\n\tconst prefixedContent = prefixContent(args.content);\n\n\temitTodoConversationEvent(\n\t\tpi,\n\t\tcreateBaseEvent({\n\t\t\taction: \"failed\",\n\t\t\troute: args.route,\n\t\t\tsessionId: args.sessionId,\n\t\t\ttext: extractText(prefixedContent),\n\t\t\tdeliverAs: args.deliverAs,\n\t\t\terrorMessage: args.errorMessage,\n\t\t}),\n\t);\n}\n"]}
1
+ {"version":3,"file":"system-messages.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/system-messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,eAAO,MAAM,oBAAoB,mBAAmB,CAAC;AACrD,eAAO,MAAM,yBAAyB,wBAAwB,CAAC;AAE/D,MAAM,MAAM,sBAAsB,GAAG,wBAAwB,CAAC;AAC9D,MAAM,MAAM,sBAAsB,GAAG,UAAU,GAAG,QAAQ,CAAC;AAE3D,MAAM,WAAW,qBAAqB;IACrC,OAAO,EAAE,CAAC,CAAC;IACX,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,sBAAsB,CAAC;IAC/B,KAAK,EAAE,sBAAsB,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE;QACb,MAAM,EAAE,OAAO,oBAAoB,CAAC;QACpC,IAAI,EAAE,cAAc,CAAC;QACrB,SAAS,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;KACjC,CAAC;IACF,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,sBAAsB;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;CACjC;AA0ED,wBAAgB,mBAAmB,CAClC,EAAE,EAAE,YAAY,EAChB,KAAK,EAAE,sBAAsB,EAC7B,OAAO,EAAE,MAAM,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,EAChD,OAAO,CAAC,EAAE,sBAAsB,GAC9B,IAAI,CAoBN;AAED,wBAAgB,4BAA4B,CAC3C,EAAE,EAAE,YAAY,EAChB,IAAI,EAAE;IACL,KAAK,EAAE,sBAAsB,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,CAAC;IACjD,SAAS,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACjC,YAAY,EAAE,MAAM,CAAC;CACrB,GACC,IAAI,CAcN","sourcesContent":["import type { ImageContent, TextContent } from \"@earendil-works/pi-ai\";\nimport type { ExtensionAPI } from \"../../types.js\";\n\nexport const SANEPI_SYSTEM_PREFIX = \"[system:senpi]\";\nexport const SANEPI_CONVERSATION_EVENT = \"sanepi:conversation\";\n\nexport type TodoSystemMessageRoute = \"todotools.continuation\";\nexport type TodoConversationAction = \"injected\" | \"failed\";\n\nexport interface TodoConversationEvent {\n\tversion: 1;\n\tsource: \"builtin\";\n\taction: TodoConversationAction;\n\troute: TodoSystemMessageRoute;\n\tsessionId?: string;\n\ttimestamp: number;\n\tconversation: {\n\t\tprefix: typeof SANEPI_SYSTEM_PREFIX;\n\t\tkind: \"user_message\";\n\t\tdeliverAs?: \"steer\" | \"followUp\";\n\t};\n\ttext: string;\n\terrorMessage?: string;\n}\n\nexport interface TodoUserMessageOptions {\n\tsessionId?: string;\n\tdeliverAs?: \"steer\" | \"followUp\";\n}\n\nfunction prefixText(text: string): string {\n\treturn text.startsWith(SANEPI_SYSTEM_PREFIX) ? text : `${SANEPI_SYSTEM_PREFIX}\\n${text}`;\n}\n\nfunction prefixContent(content: string | (TextContent | ImageContent)[]): string | (TextContent | ImageContent)[] {\n\tif (typeof content === \"string\") {\n\t\treturn prefixText(content);\n\t}\n\n\tconst firstTextIndex = content.findIndex((part) => part.type === \"text\");\n\tif (firstTextIndex === -1) {\n\t\treturn [{ type: \"text\", text: SANEPI_SYSTEM_PREFIX }, ...content];\n\t}\n\n\treturn content.map((part, index) => {\n\t\tif (part.type !== \"text\" || index !== firstTextIndex) {\n\t\t\treturn part;\n\t\t}\n\n\t\treturn {\n\t\t\t...part,\n\t\t\ttext: prefixText(part.text),\n\t\t};\n\t});\n}\n\nfunction extractText(content: string | (TextContent | ImageContent)[]): string {\n\tif (typeof content === \"string\") {\n\t\treturn content;\n\t}\n\n\treturn content\n\t\t.filter((part): part is TextContent => part.type === \"text\")\n\t\t.map((part) => part.text)\n\t\t.join(\"\\n\");\n}\n\nfunction emitTodoConversationEvent(pi: ExtensionAPI, event: TodoConversationEvent): void {\n\tpi.events.emit(SANEPI_CONVERSATION_EVENT, event);\n}\n\nfunction createBaseEvent(args: {\n\taction: TodoConversationAction;\n\troute: TodoSystemMessageRoute;\n\tsessionId?: string;\n\tdeliverAs?: \"steer\" | \"followUp\";\n\ttext: string;\n\terrorMessage?: string;\n}): TodoConversationEvent {\n\treturn {\n\t\tversion: 1,\n\t\tsource: \"builtin\",\n\t\taction: args.action,\n\t\troute: args.route,\n\t\tsessionId: args.sessionId,\n\t\ttimestamp: Date.now(),\n\t\tconversation: {\n\t\t\tprefix: SANEPI_SYSTEM_PREFIX,\n\t\t\tkind: \"user_message\",\n\t\t\tdeliverAs: args.deliverAs,\n\t\t},\n\t\ttext: args.text,\n\t\terrorMessage: args.errorMessage,\n\t};\n}\n\nfunction hasUserMessageOptions(\n\toptions: TodoUserMessageOptions | undefined,\n): options is TodoUserMessageOptions & { deliverAs: \"steer\" | \"followUp\" } {\n\treturn options?.deliverAs !== undefined;\n}\n\nexport function sendTodoUserMessage(\n\tpi: ExtensionAPI,\n\troute: TodoSystemMessageRoute,\n\tcontent: string | (TextContent | ImageContent)[],\n\toptions?: TodoUserMessageOptions,\n): void {\n\tconst prefixedContent = prefixContent(content);\n\n\temitTodoConversationEvent(\n\t\tpi,\n\t\tcreateBaseEvent({\n\t\t\taction: \"injected\",\n\t\t\troute,\n\t\t\tsessionId: options?.sessionId,\n\t\t\ttext: extractText(prefixedContent),\n\t\t\tdeliverAs: options?.deliverAs,\n\t\t}),\n\t);\n\n\tif (hasUserMessageOptions(options)) {\n\t\tpi.sendUserMessage(prefixedContent, { deliverAs: options.deliverAs });\n\t\treturn;\n\t}\n\n\tpi.sendUserMessage(prefixedContent);\n}\n\nexport function emitTodoSystemMessageFailure(\n\tpi: ExtensionAPI,\n\targs: {\n\t\troute: TodoSystemMessageRoute;\n\t\tsessionId?: string;\n\t\tcontent: string | (TextContent | ImageContent)[];\n\t\tdeliverAs?: \"steer\" | \"followUp\";\n\t\terrorMessage: string;\n\t},\n): void {\n\tconst prefixedContent = prefixContent(args.content);\n\n\temitTodoConversationEvent(\n\t\tpi,\n\t\tcreateBaseEvent({\n\t\t\taction: \"failed\",\n\t\t\troute: args.route,\n\t\t\tsessionId: args.sessionId,\n\t\t\ttext: extractText(prefixedContent),\n\t\t\tdeliverAs: args.deliverAs,\n\t\t\terrorMessage: args.errorMessage,\n\t\t}),\n\t);\n}\n"]}
@@ -1,4 +1,4 @@
1
- export const SANEPI_SYSTEM_PREFIX = "[system:sanepi]";
1
+ export const SANEPI_SYSTEM_PREFIX = "[system:senpi]";
2
2
  export const SANEPI_CONVERSATION_EVENT = "sanepi:conversation";
3
3
  function prefixText(text) {
4
4
  return text.startsWith(SANEPI_SYSTEM_PREFIX) ? text : `${SANEPI_SYSTEM_PREFIX}\n${text}`;
@@ -1 +1 @@
1
- {"version":3,"file":"system-messages.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/system-messages.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ImageContent, TextContent } from \"@earendil-works/pi-ai\";\nimport type { ExtensionAPI } from \"../../types.js\";\n\nexport const SANEPI_SYSTEM_PREFIX = \"[system:sanepi]\";\nexport const SANEPI_CONVERSATION_EVENT = \"sanepi:conversation\";\n\nexport type TodoSystemMessageRoute = \"todotools.continuation\";\nexport type TodoConversationAction = \"injected\" | \"failed\";\n\nexport interface TodoConversationEvent {\n\tversion: 1;\n\tsource: \"builtin\";\n\taction: TodoConversationAction;\n\troute: TodoSystemMessageRoute;\n\tsessionId?: string;\n\ttimestamp: number;\n\tconversation: {\n\t\tprefix: typeof SANEPI_SYSTEM_PREFIX;\n\t\tkind: \"user_message\";\n\t\tdeliverAs?: \"steer\" | \"followUp\";\n\t};\n\ttext: string;\n\terrorMessage?: string;\n}\n\nexport interface TodoUserMessageOptions {\n\tsessionId?: string;\n\tdeliverAs?: \"steer\" | \"followUp\";\n}\n\nfunction prefixText(text: string): string {\n\treturn text.startsWith(SANEPI_SYSTEM_PREFIX) ? text : `${SANEPI_SYSTEM_PREFIX}\\n${text}`;\n}\n\nfunction prefixContent(content: string | (TextContent | ImageContent)[]): string | (TextContent | ImageContent)[] {\n\tif (typeof content === \"string\") {\n\t\treturn prefixText(content);\n\t}\n\n\tconst firstTextIndex = content.findIndex((part) => part.type === \"text\");\n\tif (firstTextIndex === -1) {\n\t\treturn [{ type: \"text\", text: SANEPI_SYSTEM_PREFIX }, ...content];\n\t}\n\n\treturn content.map((part, index) => {\n\t\tif (part.type !== \"text\" || index !== firstTextIndex) {\n\t\t\treturn part;\n\t\t}\n\n\t\treturn {\n\t\t\t...part,\n\t\t\ttext: prefixText(part.text),\n\t\t};\n\t});\n}\n\nfunction extractText(content: string | (TextContent | ImageContent)[]): string {\n\tif (typeof content === \"string\") {\n\t\treturn content;\n\t}\n\n\treturn content\n\t\t.filter((part): part is TextContent => part.type === \"text\")\n\t\t.map((part) => part.text)\n\t\t.join(\"\\n\");\n}\n\nfunction emitTodoConversationEvent(pi: ExtensionAPI, event: TodoConversationEvent): void {\n\tpi.events.emit(SANEPI_CONVERSATION_EVENT, event);\n}\n\nfunction createBaseEvent(args: {\n\taction: TodoConversationAction;\n\troute: TodoSystemMessageRoute;\n\tsessionId?: string;\n\tdeliverAs?: \"steer\" | \"followUp\";\n\ttext: string;\n\terrorMessage?: string;\n}): TodoConversationEvent {\n\treturn {\n\t\tversion: 1,\n\t\tsource: \"builtin\",\n\t\taction: args.action,\n\t\troute: args.route,\n\t\tsessionId: args.sessionId,\n\t\ttimestamp: Date.now(),\n\t\tconversation: {\n\t\t\tprefix: SANEPI_SYSTEM_PREFIX,\n\t\t\tkind: \"user_message\",\n\t\t\tdeliverAs: args.deliverAs,\n\t\t},\n\t\ttext: args.text,\n\t\terrorMessage: args.errorMessage,\n\t};\n}\n\nfunction hasUserMessageOptions(\n\toptions: TodoUserMessageOptions | undefined,\n): options is TodoUserMessageOptions & { deliverAs: \"steer\" | \"followUp\" } {\n\treturn options?.deliverAs !== undefined;\n}\n\nexport function sendTodoUserMessage(\n\tpi: ExtensionAPI,\n\troute: TodoSystemMessageRoute,\n\tcontent: string | (TextContent | ImageContent)[],\n\toptions?: TodoUserMessageOptions,\n): void {\n\tconst prefixedContent = prefixContent(content);\n\n\temitTodoConversationEvent(\n\t\tpi,\n\t\tcreateBaseEvent({\n\t\t\taction: \"injected\",\n\t\t\troute,\n\t\t\tsessionId: options?.sessionId,\n\t\t\ttext: extractText(prefixedContent),\n\t\t\tdeliverAs: options?.deliverAs,\n\t\t}),\n\t);\n\n\tif (hasUserMessageOptions(options)) {\n\t\tpi.sendUserMessage(prefixedContent, { deliverAs: options.deliverAs });\n\t\treturn;\n\t}\n\n\tpi.sendUserMessage(prefixedContent);\n}\n\nexport function emitTodoSystemMessageFailure(\n\tpi: ExtensionAPI,\n\targs: {\n\t\troute: TodoSystemMessageRoute;\n\t\tsessionId?: string;\n\t\tcontent: string | (TextContent | ImageContent)[];\n\t\tdeliverAs?: \"steer\" | \"followUp\";\n\t\terrorMessage: string;\n\t},\n): void {\n\tconst prefixedContent = prefixContent(args.content);\n\n\temitTodoConversationEvent(\n\t\tpi,\n\t\tcreateBaseEvent({\n\t\t\taction: \"failed\",\n\t\t\troute: args.route,\n\t\t\tsessionId: args.sessionId,\n\t\t\ttext: extractText(prefixedContent),\n\t\t\tdeliverAs: args.deliverAs,\n\t\t\terrorMessage: args.errorMessage,\n\t\t}),\n\t);\n}\n"]}
1
+ {"version":3,"file":"system-messages.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/system-messages.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ImageContent, TextContent } from \"@earendil-works/pi-ai\";\nimport type { ExtensionAPI } from \"../../types.js\";\n\nexport const SANEPI_SYSTEM_PREFIX = \"[system:senpi]\";\nexport const SANEPI_CONVERSATION_EVENT = \"sanepi:conversation\";\n\nexport type TodoSystemMessageRoute = \"todotools.continuation\";\nexport type TodoConversationAction = \"injected\" | \"failed\";\n\nexport interface TodoConversationEvent {\n\tversion: 1;\n\tsource: \"builtin\";\n\taction: TodoConversationAction;\n\troute: TodoSystemMessageRoute;\n\tsessionId?: string;\n\ttimestamp: number;\n\tconversation: {\n\t\tprefix: typeof SANEPI_SYSTEM_PREFIX;\n\t\tkind: \"user_message\";\n\t\tdeliverAs?: \"steer\" | \"followUp\";\n\t};\n\ttext: string;\n\terrorMessage?: string;\n}\n\nexport interface TodoUserMessageOptions {\n\tsessionId?: string;\n\tdeliverAs?: \"steer\" | \"followUp\";\n}\n\nfunction prefixText(text: string): string {\n\treturn text.startsWith(SANEPI_SYSTEM_PREFIX) ? text : `${SANEPI_SYSTEM_PREFIX}\\n${text}`;\n}\n\nfunction prefixContent(content: string | (TextContent | ImageContent)[]): string | (TextContent | ImageContent)[] {\n\tif (typeof content === \"string\") {\n\t\treturn prefixText(content);\n\t}\n\n\tconst firstTextIndex = content.findIndex((part) => part.type === \"text\");\n\tif (firstTextIndex === -1) {\n\t\treturn [{ type: \"text\", text: SANEPI_SYSTEM_PREFIX }, ...content];\n\t}\n\n\treturn content.map((part, index) => {\n\t\tif (part.type !== \"text\" || index !== firstTextIndex) {\n\t\t\treturn part;\n\t\t}\n\n\t\treturn {\n\t\t\t...part,\n\t\t\ttext: prefixText(part.text),\n\t\t};\n\t});\n}\n\nfunction extractText(content: string | (TextContent | ImageContent)[]): string {\n\tif (typeof content === \"string\") {\n\t\treturn content;\n\t}\n\n\treturn content\n\t\t.filter((part): part is TextContent => part.type === \"text\")\n\t\t.map((part) => part.text)\n\t\t.join(\"\\n\");\n}\n\nfunction emitTodoConversationEvent(pi: ExtensionAPI, event: TodoConversationEvent): void {\n\tpi.events.emit(SANEPI_CONVERSATION_EVENT, event);\n}\n\nfunction createBaseEvent(args: {\n\taction: TodoConversationAction;\n\troute: TodoSystemMessageRoute;\n\tsessionId?: string;\n\tdeliverAs?: \"steer\" | \"followUp\";\n\ttext: string;\n\terrorMessage?: string;\n}): TodoConversationEvent {\n\treturn {\n\t\tversion: 1,\n\t\tsource: \"builtin\",\n\t\taction: args.action,\n\t\troute: args.route,\n\t\tsessionId: args.sessionId,\n\t\ttimestamp: Date.now(),\n\t\tconversation: {\n\t\t\tprefix: SANEPI_SYSTEM_PREFIX,\n\t\t\tkind: \"user_message\",\n\t\t\tdeliverAs: args.deliverAs,\n\t\t},\n\t\ttext: args.text,\n\t\terrorMessage: args.errorMessage,\n\t};\n}\n\nfunction hasUserMessageOptions(\n\toptions: TodoUserMessageOptions | undefined,\n): options is TodoUserMessageOptions & { deliverAs: \"steer\" | \"followUp\" } {\n\treturn options?.deliverAs !== undefined;\n}\n\nexport function sendTodoUserMessage(\n\tpi: ExtensionAPI,\n\troute: TodoSystemMessageRoute,\n\tcontent: string | (TextContent | ImageContent)[],\n\toptions?: TodoUserMessageOptions,\n): void {\n\tconst prefixedContent = prefixContent(content);\n\n\temitTodoConversationEvent(\n\t\tpi,\n\t\tcreateBaseEvent({\n\t\t\taction: \"injected\",\n\t\t\troute,\n\t\t\tsessionId: options?.sessionId,\n\t\t\ttext: extractText(prefixedContent),\n\t\t\tdeliverAs: options?.deliverAs,\n\t\t}),\n\t);\n\n\tif (hasUserMessageOptions(options)) {\n\t\tpi.sendUserMessage(prefixedContent, { deliverAs: options.deliverAs });\n\t\treturn;\n\t}\n\n\tpi.sendUserMessage(prefixedContent);\n}\n\nexport function emitTodoSystemMessageFailure(\n\tpi: ExtensionAPI,\n\targs: {\n\t\troute: TodoSystemMessageRoute;\n\t\tsessionId?: string;\n\t\tcontent: string | (TextContent | ImageContent)[];\n\t\tdeliverAs?: \"steer\" | \"followUp\";\n\t\terrorMessage: string;\n\t},\n): void {\n\tconst prefixedContent = prefixContent(args.content);\n\n\temitTodoConversationEvent(\n\t\tpi,\n\t\tcreateBaseEvent({\n\t\t\taction: \"failed\",\n\t\t\troute: args.route,\n\t\t\tsessionId: args.sessionId,\n\t\t\ttext: extractText(prefixedContent),\n\t\t\tdeliverAs: args.deliverAs,\n\t\t\terrorMessage: args.errorMessage,\n\t\t}),\n\t);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/senpi",
3
- "version": "2026.5.13-3",
3
+ "version": "2026.5.13-4",
4
4
  "description": "Coding agent CLI with read, bash, edit, write tools and session management",
5
5
  "type": "module",
6
6
  "piConfig": {
@@ -40,9 +40,9 @@
40
40
  },
41
41
  "dependencies": {
42
42
  "@anthropic-ai/sdk": "^0.91.1",
43
- "@earendil-works/pi-agent-core": "^2026.5.13-3",
44
- "@earendil-works/pi-ai": "^2026.5.13-3",
45
- "@earendil-works/pi-tui": "^2026.5.13-3",
43
+ "@earendil-works/pi-agent-core": "^2026.5.13-4",
44
+ "@earendil-works/pi-ai": "^2026.5.13-4",
45
+ "@earendil-works/pi-tui": "^2026.5.13-4",
46
46
  "@silvia-odwyer/photon-node": "^0.3.4",
47
47
  "chalk": "^5.5.0",
48
48
  "cli-highlight": "^2.1.11",