@elizaos/plugin-task-coordinator 2.0.3-beta.4 → 2.0.3-beta.5

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/orchestrator-markdown.tsx"],"sourcesContent":["import { Check, Copy } from \"lucide-react\";\nimport { marked, type Token, type Tokens, type TokensList } from \"marked\";\nimport { type ReactNode, useEffect, useRef, useState } from \"react\";\nimport { sanitizeMarkdownUrl } from \"./orchestrator-markdown.helpers\";\n\n// The coding agent writes markdown prose. We parse it with `marked` — a real\n// lexer, not a hand-rolled regex — then render its token AST directly to React\n// elements. Rendering the AST (rather than marked's HTML string) means nothing\n// is ever injected via dangerouslySetInnerHTML: raw HTML that appears in the\n// stream is shown as escaped text, never executed, so there's no XSS surface\n// and no sanitizer dependency. marked is pure ESM with zero dependencies, so it\n// also sidesteps the rolldown dev-optimizer's CommonJS-interop hang that\n// react-markdown's `style-to-js` dep triggers in this app.\n\nfunction alignStyle(align: Tokens.TableCell[\"align\"]) {\n return align ? { textAlign: align } : undefined;\n}\n\nfunction renderChildren(tokens: Token[] | undefined, key: string): ReactNode {\n if (!tokens || tokens.length === 0) return null;\n return tokens.map((token, index) => renderToken(token, `${key}.${index}`));\n}\n\nfunction renderToken(token: Token, key: string): ReactNode {\n switch (token.type) {\n case \"space\":\n case \"def\":\n return null;\n case \"paragraph\":\n return (\n <p key={key} className=\"my-1 leading-relaxed first:mt-0 last:mb-0\">\n {renderChildren(token.tokens, key)}\n </p>\n );\n case \"heading\": {\n const depth = Math.min(Math.max(token.depth, 1), 4);\n const Tag = `h${depth}` as \"h1\" | \"h2\" | \"h3\" | \"h4\";\n return (\n <Tag key={key} className=\"mt-2 mb-1 font-semibold text-txt first:mt-0\">\n {renderChildren(token.tokens, key)}\n </Tag>\n );\n }\n case \"code\":\n return <CodeBlock key={key} code={token.text} lang={token.lang} />;\n case \"blockquote\":\n return (\n <blockquote\n key={key}\n className=\"my-1 border-l-2 border-border pl-3 text-muted-strong\"\n >\n {renderChildren(token.tokens, key)}\n </blockquote>\n );\n case \"list\": {\n const items = token.items.map((item, index) => {\n // Composite path key (parent path + position): stable across this\n // immutable, fully-recomputed AST render, and unique among siblings.\n const itemKey = `${key}.${index}`;\n return (\n <li key={itemKey} className=\"my-0.5 marker:text-muted\">\n {item.task ? (\n <input\n type=\"checkbox\"\n checked={Boolean(item.checked)}\n readOnly\n aria-hidden\n className=\"mr-1.5 align-middle accent-accent\"\n />\n ) : null}\n {renderChildren(item.tokens, itemKey)}\n </li>\n );\n });\n return token.ordered ? (\n <ol\n key={key}\n start={typeof token.start === \"number\" ? token.start : undefined}\n className=\"my-1 list-decimal space-y-0.5 pl-5\"\n >\n {items}\n </ol>\n ) : (\n <ul key={key} className=\"my-1 list-disc space-y-0.5 pl-5\">\n {items}\n </ul>\n );\n }\n case \"table\":\n return (\n <div key={key} className=\"my-1.5 overflow-x-auto\">\n <table className=\"w-full border-collapse text-2xs\">\n <thead>\n <tr>\n {token.header.map((cell, index) => {\n const cellKey = `${key}.h${index}`;\n return (\n <th\n key={cellKey}\n style={alignStyle(cell.align)}\n className=\"border border-border/60 bg-bg/40 px-2 py-1 text-left font-semibold text-txt\"\n >\n {renderChildren(cell.tokens, cellKey)}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {token.rows.map((row, rowIndex) => {\n const rowKey = `${key}.r${rowIndex}`;\n return (\n <tr key={rowKey}>\n {row.map((cell, cellIndex) => {\n const cellKey = `${rowKey}c${cellIndex}`;\n return (\n <td\n key={cellKey}\n style={alignStyle(cell.align)}\n className=\"border border-border/50 px-2 py-1 align-top\"\n >\n {renderChildren(cell.tokens, cellKey)}\n </td>\n );\n })}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n case \"hr\":\n return <hr key={key} className=\"my-2 border-border/50\" />;\n case \"strong\":\n return (\n <strong key={key} className=\"font-semibold text-txt\">\n {renderChildren(token.tokens, key)}\n </strong>\n );\n case \"em\":\n return (\n <em key={key} className=\"italic\">\n {renderChildren(token.tokens, key)}\n </em>\n );\n case \"del\":\n return (\n <del key={key} className=\"line-through opacity-80\">\n {renderChildren(token.tokens, key)}\n </del>\n );\n case \"codespan\":\n return (\n <code\n key={key}\n className=\"break-words rounded-sm bg-bg/70 px-1 py-px font-mono text-[0.95em] text-txt-strong\"\n >\n {token.text}\n </code>\n );\n case \"link\": {\n const href = sanitizeMarkdownUrl(token.href);\n // Only open external (http/https/mailto) links in a new tab.\n // Relative paths should navigate in the same context.\n const isExternal = href !== null && /^https?:/i.test(href);\n return (\n <a\n key={key}\n href={href ?? undefined}\n title={token.title ?? undefined}\n target={isExternal ? \"_blank\" : undefined}\n rel={isExternal ? \"noreferrer\" : undefined}\n className=\"text-txt-strong underline underline-offset-2 transition-colors hover:text-accent\"\n >\n {renderChildren(token.tokens, key)}\n </a>\n );\n }\n case \"image\": {\n const src = sanitizeMarkdownUrl(token.href);\n if (!src) return token.text;\n return (\n <img\n key={key}\n src={src}\n alt={token.text}\n title={token.title ?? undefined}\n className=\"my-1 max-w-full rounded-sm border border-border/50\"\n />\n );\n }\n case \"br\":\n return <br key={key} />;\n case \"escape\":\n return token.text;\n case \"text\":\n // A block-level text token (e.g. loose-list content) carries inline\n // tokens; an inline text leaf is just its string.\n return token.tokens && token.tokens.length > 0\n ? renderChildren(token.tokens, key)\n : token.text;\n default:\n // `html` and any other raw tokens are rendered as escaped text — never\n // injected as markup — so stray tags in the stream can't execute.\n return \"raw\" in token ? token.raw : null;\n }\n}\n\nfunction CodeBlock({ code, lang }: { code: string; lang?: string }): ReactNode {\n const [copied, setCopied] = useState(false);\n // Hold the revert timer so we can cancel it on unmount; firing setCopied\n // after unmount (within the 1200ms window) would be a stale-state update.\n const revertTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(\n () => () => {\n if (revertTimer.current) clearTimeout(revertTimer.current);\n },\n [],\n );\n\n const copy = () => {\n // Guard for non-secure-context / older webviews where clipboard is absent.\n if (typeof navigator === \"undefined\" || !navigator.clipboard?.writeText) {\n return;\n }\n navigator.clipboard.writeText(code).then(\n () => {\n setCopied(true);\n // Brief confirmation, then revert to the resting copy icon.\n if (revertTimer.current) clearTimeout(revertTimer.current);\n revertTimer.current = setTimeout(() => setCopied(false), 1200);\n },\n () => undefined,\n );\n };\n\n return (\n <div className=\"group/code relative my-1 overflow-hidden rounded-sm border border-border/50 bg-bg/80\">\n {lang ? (\n <div className=\"border-b border-border/40 px-2.5 py-0.5 font-mono text-3xs uppercase tracking-wide text-muted\">\n {lang}\n </div>\n ) : null}\n <button\n type=\"button\"\n onClick={copy}\n aria-label={copied ? \"Copied\" : \"Copy code\"}\n // Unobtrusive: faded until the block is hovered/focused, fully shown\n // once copied. Green only as the success affordance.\n className={`absolute right-1 top-1 z-10 rounded p-1 text-muted opacity-0 transition-[color,opacity] hover:bg-bg-hover/60 hover:text-txt focus-visible:opacity-100 group-hover/code:opacity-100 ${\n copied ? \"text-ok opacity-100\" : \"\"\n }`}\n >\n {copied ? (\n <Check className=\"h-3.5 w-3.5\" aria-hidden />\n ) : (\n <Copy className=\"h-3.5 w-3.5\" aria-hidden />\n )}\n </button>\n <pre className=\"max-h-72 overflow-auto px-2.5 py-1.5 font-mono text-2xs leading-relaxed text-txt\">\n <code className=\"whitespace-pre-wrap break-words\">{code}</code>\n </pre>\n </div>\n );\n}\n\nexport function MarkdownText({ text }: { text: string }): ReactNode {\n // marked.lexer runs synchronously here. It can throw — a stack overflow on\n // pathologically nested input, or a TypeError on a non-string. A throw in\n // this render would unmount the whole conversation, so degrade to plain text.\n let tokens: TokensList;\n try {\n tokens = marked.lexer(text);\n } catch {\n return (\n <div className=\"whitespace-pre-wrap break-words text-xs text-txt\">\n {text}\n </div>\n );\n }\n return (\n <div className=\"break-words text-xs text-txt\">\n {tokens.map((token, index) => renderToken(token, `t${index}`))}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/orchestrator-markdown.tsx"],"sourcesContent":["import { Check, Copy } from \"lucide-react\";\nimport { marked, type Token, type Tokens, type TokensList } from \"marked\";\nimport { type ReactNode, useEffect, useRef, useState } from \"react\";\nimport { sanitizeMarkdownUrl } from \"./orchestrator-markdown.helpers\";\n\n// The coding agent writes markdown prose. We parse it with `marked` — a real\n// lexer, not a hand-rolled regex — then render its token AST directly to React\n// elements. Rendering the AST (rather than marked's HTML string) means nothing\n// is ever injected via dangerouslySetInnerHTML: raw HTML that appears in the\n// stream is shown as escaped text, never executed, so there's no XSS surface\n// and no sanitizer dependency. marked is pure ESM with zero dependencies, so it\n// also sidesteps the rolldown dev-optimizer's CommonJS-interop hang that\n// react-markdown's `style-to-js` dep triggers in this app.\n\nfunction alignStyle(align: Tokens.TableCell[\"align\"]) {\n return align ? { textAlign: align } : undefined;\n}\n\nfunction renderChildren(tokens: Token[] | undefined, key: string): ReactNode {\n if (!tokens || tokens.length === 0) return null;\n return tokens.map((token, index) => renderToken(token, `${key}.${index}`));\n}\n\nfunction renderToken(token: Token, key: string): ReactNode {\n switch (token.type) {\n case \"space\":\n case \"def\":\n return null;\n case \"paragraph\":\n return (\n <p key={key} className=\"my-1 leading-relaxed first:mt-0 last:mb-0\">\n {renderChildren(token.tokens, key)}\n </p>\n );\n case \"heading\": {\n const depth = Math.min(Math.max(token.depth, 1), 4);\n const Tag = `h${depth}` as \"h1\" | \"h2\" | \"h3\" | \"h4\";\n return (\n <Tag key={key} className=\"mt-2 mb-1 font-semibold text-txt first:mt-0\">\n {renderChildren(token.tokens, key)}\n </Tag>\n );\n }\n case \"code\":\n return <CodeBlock key={key} code={token.text} lang={token.lang} />;\n case \"blockquote\":\n return (\n <blockquote\n key={key}\n className=\"my-1 border-l-2 border-border pl-3 text-muted-strong\"\n >\n {renderChildren(token.tokens, key)}\n </blockquote>\n );\n case \"list\": {\n const items = token.items.map((item: Tokens.ListItem, index: number) => {\n // Composite path key (parent path + position): stable across this\n // immutable, fully-recomputed AST render, and unique among siblings.\n const itemKey = `${key}.${index}`;\n return (\n <li key={itemKey} className=\"my-0.5 marker:text-muted\">\n {item.task ? (\n <input\n type=\"checkbox\"\n checked={Boolean(item.checked)}\n readOnly\n aria-hidden\n className=\"mr-1.5 align-middle accent-accent\"\n />\n ) : null}\n {renderChildren(item.tokens, itemKey)}\n </li>\n );\n });\n return token.ordered ? (\n <ol\n key={key}\n start={typeof token.start === \"number\" ? token.start : undefined}\n className=\"my-1 list-decimal space-y-0.5 pl-5\"\n >\n {items}\n </ol>\n ) : (\n <ul key={key} className=\"my-1 list-disc space-y-0.5 pl-5\">\n {items}\n </ul>\n );\n }\n case \"table\":\n return (\n <div key={key} className=\"my-1.5 overflow-x-auto\">\n <table className=\"w-full border-collapse text-2xs\">\n <thead>\n <tr>\n {token.header.map((cell: Tokens.TableCell, index: number) => {\n const cellKey = `${key}.h${index}`;\n return (\n <th\n key={cellKey}\n style={alignStyle(cell.align)}\n className=\"border border-border/60 bg-bg/40 px-2 py-1 text-left font-semibold text-txt\"\n >\n {renderChildren(cell.tokens, cellKey)}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {token.rows.map((row: Tokens.TableCell[], rowIndex: number) => {\n const rowKey = `${key}.r${rowIndex}`;\n return (\n <tr key={rowKey}>\n {row.map((cell: Tokens.TableCell, cellIndex: number) => {\n const cellKey = `${rowKey}c${cellIndex}`;\n return (\n <td\n key={cellKey}\n style={alignStyle(cell.align)}\n className=\"border border-border/50 px-2 py-1 align-top\"\n >\n {renderChildren(cell.tokens, cellKey)}\n </td>\n );\n })}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n case \"hr\":\n return <hr key={key} className=\"my-2 border-border/50\" />;\n case \"strong\":\n return (\n <strong key={key} className=\"font-semibold text-txt\">\n {renderChildren(token.tokens, key)}\n </strong>\n );\n case \"em\":\n return (\n <em key={key} className=\"italic\">\n {renderChildren(token.tokens, key)}\n </em>\n );\n case \"del\":\n return (\n <del key={key} className=\"line-through opacity-80\">\n {renderChildren(token.tokens, key)}\n </del>\n );\n case \"codespan\":\n return (\n <code\n key={key}\n className=\"break-words rounded-sm bg-bg/70 px-1 py-px font-mono text-[0.95em] text-txt-strong\"\n >\n {token.text}\n </code>\n );\n case \"link\": {\n const href = sanitizeMarkdownUrl(token.href);\n // Only open external (http/https/mailto) links in a new tab.\n // Relative paths should navigate in the same context.\n const isExternal = href !== null && /^https?:/i.test(href);\n return (\n <a\n key={key}\n href={href ?? undefined}\n title={token.title ?? undefined}\n target={isExternal ? \"_blank\" : undefined}\n rel={isExternal ? \"noreferrer\" : undefined}\n className=\"text-txt-strong underline underline-offset-2 transition-colors hover:text-accent\"\n >\n {renderChildren(token.tokens, key)}\n </a>\n );\n }\n case \"image\": {\n const src = sanitizeMarkdownUrl(token.href);\n if (!src) return token.text;\n return (\n <img\n key={key}\n src={src}\n alt={token.text}\n title={token.title ?? undefined}\n className=\"my-1 max-w-full rounded-sm border border-border/50\"\n />\n );\n }\n case \"br\":\n return <br key={key} />;\n case \"escape\":\n return token.text;\n case \"text\":\n // A block-level text token (e.g. loose-list content) carries inline\n // tokens; an inline text leaf is just its string.\n return token.tokens && token.tokens.length > 0\n ? renderChildren(token.tokens, key)\n : token.text;\n default:\n // `html` and any other raw tokens are rendered as escaped text — never\n // injected as markup — so stray tags in the stream can't execute.\n return \"raw\" in token ? token.raw : null;\n }\n}\n\nfunction CodeBlock({ code, lang }: { code: string; lang?: string }): ReactNode {\n const [copied, setCopied] = useState(false);\n // Hold the revert timer so we can cancel it on unmount; firing setCopied\n // after unmount (within the 1200ms window) would be a stale-state update.\n const revertTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(\n () => () => {\n if (revertTimer.current) clearTimeout(revertTimer.current);\n },\n [],\n );\n\n const copy = () => {\n // Guard for non-secure-context / older webviews where clipboard is absent.\n if (typeof navigator === \"undefined\" || !navigator.clipboard?.writeText) {\n return;\n }\n navigator.clipboard.writeText(code).then(\n () => {\n setCopied(true);\n // Brief confirmation, then revert to the resting copy icon.\n if (revertTimer.current) clearTimeout(revertTimer.current);\n revertTimer.current = setTimeout(() => setCopied(false), 1200);\n },\n () => undefined,\n );\n };\n\n return (\n <div className=\"group/code relative my-1 overflow-hidden rounded-sm border border-border/50 bg-bg/80\">\n {lang ? (\n <div className=\"border-b border-border/40 px-2.5 py-0.5 font-mono text-3xs uppercase tracking-wide text-muted\">\n {lang}\n </div>\n ) : null}\n <button\n type=\"button\"\n onClick={copy}\n aria-label={copied ? \"Copied\" : \"Copy code\"}\n // Unobtrusive: faded until the block is hovered/focused, fully shown\n // once copied. Green only as the success affordance.\n className={`absolute right-1 top-1 z-10 rounded p-1 text-muted opacity-0 transition-[color,opacity] hover:bg-bg-hover/60 hover:text-txt focus-visible:opacity-100 group-hover/code:opacity-100 ${\n copied ? \"text-ok opacity-100\" : \"\"\n }`}\n >\n {copied ? (\n <Check className=\"h-3.5 w-3.5\" aria-hidden />\n ) : (\n <Copy className=\"h-3.5 w-3.5\" aria-hidden />\n )}\n </button>\n <pre className=\"max-h-72 overflow-auto px-2.5 py-1.5 font-mono text-2xs leading-relaxed text-txt\">\n <code className=\"whitespace-pre-wrap break-words\">{code}</code>\n </pre>\n </div>\n );\n}\n\nexport function MarkdownText({ text }: { text: string }): ReactNode {\n // marked.lexer runs synchronously here. It can throw — a stack overflow on\n // pathologically nested input, or a TypeError on a non-string. A throw in\n // this render would unmount the whole conversation, so degrade to plain text.\n let tokens: TokensList;\n try {\n tokens = marked.lexer(text);\n } catch {\n return (\n <div className=\"whitespace-pre-wrap break-words text-xs text-txt\">\n {text}\n </div>\n );\n }\n return (\n <div className=\"break-words text-xs text-txt\">\n {tokens.map((token, index) => renderToken(token, `t${index}`))}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elizaos/plugin-task-coordinator",
3
- "version": "2.0.3-beta.4",
3
+ "version": "2.0.3-beta.5",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "exports": {
@@ -28,10 +28,10 @@
28
28
  }
29
29
  },
30
30
  "dependencies": {
31
- "@elizaos/core": "2.0.3-beta.4",
32
- "@elizaos/plugin-commands": "2.0.3-beta.4",
33
- "@elizaos/shared": "2.0.3-beta.4",
34
- "@elizaos/ui": "2.0.3-beta.4",
31
+ "@elizaos/core": "2.0.3-beta.5",
32
+ "@elizaos/plugin-commands": "2.0.3-beta.5",
33
+ "@elizaos/shared": "2.0.3-beta.5",
34
+ "@elizaos/ui": "2.0.3-beta.5",
35
35
  "@xterm/addon-fit": "^0.10.0",
36
36
  "@xterm/xterm": "^5.5.0",
37
37
  "lucide-react": "^1.0.0",
@@ -50,8 +50,8 @@
50
50
  "types": "./dist/index.d.ts",
51
51
  "scripts": {
52
52
  "build": "bun run build:js && bun run build:views && bun run build:types",
53
- "typecheck": "tsc --noEmit -p tsconfig.build.json",
54
- "clean": "rm -rf dist",
53
+ "typecheck": "tsgo --noEmit -p tsconfig.build.json",
54
+ "clean": "node ../../packages/scripts/rm-path-recursive.mjs dist",
55
55
  "build:js": "tsup --config ../tsup.plugin-packages.shared.ts",
56
56
  "build:views": "bunx --bun vite build --config vite.config.views.ts",
57
57
  "build:types": "tsc --noCheck -p tsconfig.build.json",
@@ -67,5 +67,5 @@
67
67
  "tsup": "^8.5.1",
68
68
  "vite": "^8.0.0"
69
69
  },
70
- "gitHead": "f76f55793a0fb8d6b869dd8ddce03970de061e34"
70
+ "gitHead": "ff6157011c9459670021cc28a6797592a78b8817"
71
71
  }