@vpxa/kb 0.1.23 → 0.1.25
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/README.md +3 -3
- package/package.json +9 -2
- package/packages/analyzers/dist/symbol-analyzer.js +5 -5
- package/packages/cli/dist/commands/init/adapters.js +1 -1
- package/packages/cli/dist/commands/init/constants.d.ts +4 -1
- package/packages/cli/dist/commands/init/constants.js +1 -1
- package/packages/cli/dist/commands/init/frontmatter.d.ts +54 -0
- package/packages/cli/dist/commands/init/frontmatter.js +2 -0
- package/packages/cli/dist/commands/init/index.js +4 -4
- package/packages/cli/dist/commands/init/manifest.d.ts +71 -0
- package/packages/cli/dist/commands/init/manifest.js +1 -0
- package/packages/cli/dist/commands/init/scaffold.d.ts +28 -5
- package/packages/cli/dist/commands/init/scaffold.js +1 -1
- package/packages/cli/dist/commands/init/templates.js +38 -9
- package/packages/cli/dist/commands/init/user.d.ts +1 -1
- package/packages/cli/dist/commands/init/user.js +4 -4
- package/packages/cli/dist/commands/system.js +2 -2
- package/packages/cli/dist/kb-init.js +1 -1
- package/packages/core/dist/errors.d.ts +2 -2
- package/packages/core/dist/errors.js +1 -1
- package/packages/core/dist/logger.d.ts +2 -1
- package/packages/core/dist/logger.js +1 -1
- package/packages/core/dist/types.d.ts +6 -0
- package/packages/dashboard/dist/assets/index-9ysCkze9.js +21 -0
- package/packages/dashboard/dist/assets/index-9ysCkze9.js.map +1 -0
- package/packages/dashboard/dist/assets/index-CHpVij2M.css +1 -0
- package/packages/dashboard/dist/index.html +18 -0
- package/packages/elicitation/dist/__tests__/build.test.d.ts +1 -0
- package/packages/elicitation/dist/__tests__/build.test.js +35 -0
- package/packages/elicitation/dist/__tests__/fields.test.d.ts +1 -0
- package/packages/elicitation/dist/__tests__/fields.test.js +81 -0
- package/packages/elicitation/dist/__tests__/normalize.test.d.ts +1 -0
- package/packages/elicitation/dist/__tests__/normalize.test.js +60 -0
- package/packages/elicitation/dist/build.d.ts +13 -0
- package/packages/elicitation/dist/build.js +23 -0
- package/packages/elicitation/dist/fields.d.ts +41 -0
- package/packages/elicitation/dist/fields.js +62 -0
- package/packages/elicitation/dist/index.d.ts +10 -0
- package/packages/elicitation/dist/index.js +12 -0
- package/packages/elicitation/dist/normalize.d.ts +15 -0
- package/packages/elicitation/dist/normalize.js +31 -0
- package/packages/elicitation/dist/types.d.ts +85 -0
- package/packages/elicitation/dist/types.js +8 -0
- package/packages/kb-client/dist/direct-client.d.ts +37 -0
- package/packages/kb-client/dist/direct-client.js +1 -0
- package/packages/kb-client/dist/index.d.ts +5 -0
- package/packages/kb-client/dist/index.js +1 -0
- package/packages/kb-client/dist/mcp-client.d.ts +19 -0
- package/packages/kb-client/dist/mcp-client.js +4 -0
- package/packages/kb-client/dist/parsers.d.ts +35 -0
- package/packages/kb-client/dist/parsers.js +2 -0
- package/packages/kb-client/dist/types.d.ts +62 -0
- package/packages/kb-client/dist/types.js +1 -0
- package/packages/present/dist/index.html +384 -0
- package/packages/server/dist/completions.d.ts +14 -0
- package/packages/server/dist/completions.js +1 -0
- package/packages/server/dist/config.js +1 -1
- package/packages/server/dist/dashboard-static.d.ts +27 -0
- package/packages/server/dist/dashboard-static.js +1 -0
- package/packages/server/dist/elicitor.d.ts +18 -0
- package/packages/server/dist/elicitor.js +1 -0
- package/packages/server/dist/index.js +1 -1
- package/packages/server/dist/mcp-logging.js +1 -1
- package/packages/server/dist/output-schemas.d.ts +118 -1
- package/packages/server/dist/output-schemas.js +1 -1
- package/packages/server/dist/prompts.d.ts +9 -2
- package/packages/server/dist/prompts.js +13 -6
- package/packages/server/dist/resources/curated-resources.js +1 -1
- package/packages/server/dist/resources/resource-notifier.d.ts +45 -0
- package/packages/server/dist/resources/resource-notifier.js +1 -0
- package/packages/server/dist/sampling.d.ts +41 -0
- package/packages/server/dist/sampling.js +2 -0
- package/packages/server/dist/server.d.ts +5 -2
- package/packages/server/dist/server.js +3 -1
- package/packages/server/dist/task-manager.d.ts +40 -0
- package/packages/server/dist/task-manager.js +1 -0
- package/packages/server/dist/tool-metadata.js +1 -1
- package/packages/server/dist/tool-prefix.d.ts +12 -0
- package/packages/server/dist/tool-prefix.js +1 -0
- package/packages/server/dist/tools/analyze.tools.js +4 -4
- package/packages/server/dist/tools/audit.tool.js +1 -1
- package/packages/server/dist/tools/brainstorm.tool.d.ts +7 -0
- package/packages/server/dist/tools/brainstorm.tool.js +9 -0
- package/packages/server/dist/tools/bridge.tools.js +1 -1
- package/packages/server/dist/tools/context.tools.js +9 -9
- package/packages/server/dist/tools/execution.tools.d.ts +2 -1
- package/packages/server/dist/tools/execution.tools.js +4 -3
- package/packages/server/dist/tools/forge.tools.js +10 -10
- package/packages/server/dist/tools/forget.tool.d.ts +2 -1
- package/packages/server/dist/tools/forget.tool.js +1 -1
- package/packages/server/dist/tools/graph.tool.js +2 -2
- package/packages/server/dist/tools/infra.tools.js +2 -2
- package/packages/server/dist/tools/list.tool.js +2 -2
- package/packages/server/dist/tools/lookup.tool.js +1 -1
- package/packages/server/dist/tools/manipulation.tools.js +4 -4
- package/packages/server/dist/tools/onboard.tool.js +2 -2
- package/packages/server/dist/tools/persistence.tools.js +4 -4
- package/packages/server/dist/tools/policy.tools.js +3 -2
- package/packages/server/dist/tools/present-blocks.d.ts +46 -0
- package/packages/server/dist/tools/present-blocks.js +27 -0
- package/packages/server/dist/tools/present-charts.d.ts +31 -0
- package/packages/server/dist/tools/present-charts.js +34 -0
- package/packages/server/dist/tools/present-theme.d.ts +14 -0
- package/packages/server/dist/tools/present-theme.js +395 -0
- package/packages/server/dist/tools/present-utils.d.ts +11 -0
- package/packages/server/dist/tools/present-utils.js +1 -0
- package/packages/server/dist/tools/present.tool.d.ts +7 -0
- package/packages/server/dist/tools/present.tool.js +113 -0
- package/packages/server/dist/tools/produce.tool.js +2 -2
- package/packages/server/dist/tools/read.tool.js +1 -1
- package/packages/server/dist/tools/reindex.tool.d.ts +2 -1
- package/packages/server/dist/tools/reindex.tool.js +2 -2
- package/packages/server/dist/tools/remember.tool.d.ts +2 -1
- package/packages/server/dist/tools/remember.tool.js +2 -2
- package/packages/server/dist/tools/replay.tool.js +2 -2
- package/packages/server/dist/tools/search.tool.d.ts +2 -1
- package/packages/server/dist/tools/search.tool.js +5 -4
- package/packages/server/dist/tools/status.tool.js +2 -2
- package/packages/server/dist/tools/update.tool.d.ts +2 -1
- package/packages/server/dist/tools/update.tool.js +1 -1
- package/packages/server/dist/tools/utility.tools.js +8 -8
- package/packages/store/dist/lance-store.d.ts +1 -0
- package/packages/store/dist/lance-store.js +1 -1
- package/packages/tools/dist/audit.js +1 -1
- package/packages/tools/dist/batch.js +1 -1
- package/packages/tools/dist/check.js +1 -1
- package/packages/tools/dist/checkpoint.js +1 -1
- package/packages/tools/dist/compact.js +2 -2
- package/packages/tools/dist/config-extractor.d.ts +9 -0
- package/packages/tools/dist/config-extractor.js +7 -0
- package/packages/tools/dist/dead-symbols.js +2 -2
- package/packages/tools/dist/diagram-builder.d.ts +9 -0
- package/packages/tools/dist/diagram-builder.js +9 -0
- package/packages/tools/dist/eval.js +2 -2
- package/packages/tools/dist/evidence-map.d.ts +12 -1
- package/packages/tools/dist/evidence-map.js +2 -2
- package/packages/tools/dist/file-summary.js +2 -2
- package/packages/tools/dist/find-examples.js +2 -2
- package/packages/tools/dist/forge-classify.d.ts +4 -0
- package/packages/tools/dist/forge-classify.js +1 -1
- package/packages/tools/dist/git-context.d.ts +1 -0
- package/packages/tools/dist/git-context.js +3 -3
- package/packages/tools/dist/index.d.ts +3 -2
- package/packages/tools/dist/index.js +1 -1
- package/packages/tools/dist/onboard-utils.d.ts +12 -0
- package/packages/tools/dist/onboard-utils.js +1 -0
- package/packages/tools/dist/onboard.js +2 -21
- package/packages/tools/dist/queue.js +1 -1
- package/packages/tools/dist/regex-utils.d.ts +8 -0
- package/packages/tools/dist/regex-utils.js +1 -0
- package/packages/tools/dist/rename.js +2 -2
- package/packages/tools/dist/replay.d.ts +2 -1
- package/packages/tools/dist/replay.js +4 -4
- package/packages/tools/dist/symbol.js +3 -3
- package/packages/tools/dist/synthesis-engine.d.ts +13 -0
- package/packages/tools/dist/synthesis-engine.js +6 -0
- package/packages/tools/dist/test-run.d.ts +3 -1
- package/packages/tools/dist/test-run.js +1 -1
- package/packages/tools/dist/trace.js +2 -2
- package/packages/tui/dist/App-DXY0-tlW.js +2 -0
- package/packages/tui/dist/App.d.ts +3 -3
- package/packages/tui/dist/App.js +1 -1
- package/packages/tui/dist/CuratedPanel-BIamXLNy.js +2 -0
- package/packages/tui/dist/LogPanel-D6u6o84n.js +3 -0
- package/packages/tui/dist/SearchPanel-CpJGczAc.js +2 -0
- package/packages/tui/dist/StatusPanel-BAbUxyqQ.js +2 -0
- package/packages/tui/dist/hooks/useKBClient.d.ts +9 -0
- package/packages/tui/dist/hooks/useKBClient.js +2 -0
- package/packages/tui/dist/hooks/usePolling.d.ts +8 -0
- package/packages/tui/dist/hooks/usePolling.js +2 -0
- package/packages/tui/dist/index.d.ts +6 -2
- package/packages/tui/dist/index.js +1 -1
- package/packages/tui/dist/jsx-runtime-y6Gdq5PZ.js +294 -0
- package/packages/tui/dist/panels/CuratedPanel.d.ts +1 -7
- package/packages/tui/dist/panels/CuratedPanel.js +1 -1
- package/packages/tui/dist/panels/LogPanel.js +1 -1
- package/packages/tui/dist/panels/SearchPanel.d.ts +1 -10
- package/packages/tui/dist/panels/SearchPanel.js +1 -1
- package/packages/tui/dist/panels/StatusPanel.d.ts +1 -7
- package/packages/tui/dist/panels/StatusPanel.js +1 -1
- package/packages/tui/dist/react-D__J1GQe.js +24 -0
- package/packages/tui/dist/types-VcTHNV6s.d.ts +64 -0
- package/packages/tui/dist/useKBClient-C35iA4uG.js +2 -0
- package/packages/tui/dist/usePolling-BbjnRWgx.js +2 -0
- package/scaffold/adapters/copilot.mjs +9 -81
- package/scaffold/definitions/agents.mjs +12 -0
- package/scaffold/definitions/bodies.mjs +39 -14
- package/scaffold/definitions/protocols.mjs +149 -0
- package/scaffold/definitions/tools.mjs +40 -5
- package/scaffold/general/agents/Architect-Reviewer-Alpha.agent.md +1 -1
- package/scaffold/general/agents/Architect-Reviewer-Beta.agent.md +1 -1
- package/scaffold/general/agents/Code-Reviewer-Alpha.agent.md +1 -1
- package/scaffold/general/agents/Code-Reviewer-Beta.agent.md +1 -1
- package/scaffold/general/agents/Debugger.agent.md +2 -2
- package/scaffold/general/agents/Documenter.agent.md +2 -2
- package/scaffold/general/agents/Explorer.agent.md +4 -3
- package/scaffold/general/agents/Frontend.agent.md +1 -1
- package/scaffold/general/agents/Implementer.agent.md +1 -1
- package/scaffold/general/agents/Orchestrator.agent.md +16 -1
- package/scaffold/general/agents/Planner.agent.md +11 -4
- package/scaffold/general/agents/Refactor.agent.md +1 -1
- package/scaffold/general/agents/Researcher-Alpha.agent.md +1 -1
- package/scaffold/general/agents/Researcher-Beta.agent.md +1 -1
- package/scaffold/general/agents/Researcher-Delta.agent.md +1 -1
- package/scaffold/general/agents/Researcher-Gamma.agent.md +1 -1
- package/scaffold/general/agents/Security.agent.md +10 -8
- package/scaffold/general/agents/_shared/architect-reviewer-base.md +1 -0
- package/scaffold/general/agents/_shared/code-agent-base.md +28 -0
- package/scaffold/general/agents/_shared/code-reviewer-base.md +1 -0
- package/scaffold/general/agents/_shared/forge-protocol.md +44 -0
- package/scaffold/general/agents/_shared/researcher-base.md +14 -0
- package/scaffold/general/agents/templates/adr-template.md +1 -0
- package/scaffold/general/agents/templates/execution-state.md +1 -0
- package/skills/knowledge-base/SKILL.md +19 -6
- package/skills/present/SKILL.md +153 -0
- package/packages/server/dist/tools/toolkit.tools.d.ts +0 -36
- package/packages/server/dist/tools/toolkit.tools.js +0 -20
- package/packages/tui/dist/App-DE_tdOhs.js +0 -2
- package/packages/tui/dist/CuratedPanel-sYdZAICX.js +0 -2
- package/packages/tui/dist/LogPanel-Ce3jMQbH.js +0 -3
- package/packages/tui/dist/SearchPanel-DREo6zgt.js +0 -2
- package/packages/tui/dist/StatusPanel-2ex8fLOO.js +0 -2
- package/packages/tui/dist/embedder.interface-IFCBpOlX.d.ts +0 -28
- package/packages/tui/dist/index-C8NmOF18.d.ts +0 -13
- package/packages/tui/dist/jsx-runtime-Cof-kwFn.js +0 -316
- package/packages/tui/dist/store.interface-CnY6SPOH.d.ts +0 -150
- /package/packages/tui/dist/{devtools-DUyj952l.js → devtools-DMOZMn70.js} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{getToolMeta as e}from"../tool-metadata.js";import{
|
|
2
|
-
`).replace(/\\t/g,` `)}))}]}}catch(e){return
|
|
3
|
-
`)}function
|
|
4
|
-
`)}export{
|
|
1
|
+
import{getToolMeta as e}from"../tool-metadata.js";import{GitContextOutputSchema as t}from"../output-schemas.js";import{z as n}from"zod";import{createLogger as r,serializeError as i}from"../../../core/dist/index.js";import{codemod as a,dataTransform as o,diffParse as s,gitContext as c,rename as l}from"../../../tools/dist/index.js";const u=r(`tools:manipulation`);function d(r){let a=e(`git_context`);r.registerTool(`git_context`,{title:a.title,description:`Summarize the current Git branch, working tree state, recent commits, and optional diff statistics for the repository.`,inputSchema:{cwd:n.string().optional().describe(`Repository root or working directory`),commit_count:n.number().min(1).max(50).default(5).optional().describe(`How many recent commits to include`),include_diff:n.boolean().default(!1).optional().describe(`Include diff stat for working tree changes`)},annotations:a.annotations,outputSchema:t},async({cwd:e,commit_count:t,include_diff:n})=>{try{let r=await c({cwd:e,commitCount:t,includeDiff:n});return{content:[{type:`text`,text:g(r)}],structuredContent:{gitRoot:r.gitRoot,branch:r.branch,commitCount:r.recentCommits.length,hasUncommitted:r.status.staged.length>0||r.status.modified.length>0||r.status.untracked.length>0,recentCommits:r.recentCommits.map(e=>({hash:e.hash,message:e.message,author:e.author,date:e.date}))}}}catch(e){return u.error(`Git context failed`,i(e)),{content:[{type:`text`,text:`Git context failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function f(t){let r=e(`diff_parse`);t.registerTool(`diff_parse`,{title:r.title,description:`Parse raw unified diff text into file-level and hunk-level structural changes.`,inputSchema:{diff:n.string().max(1e6).describe(`Raw unified diff text`)},annotations:r.annotations},async({diff:e})=>{try{return{content:[{type:`text`,text:_(s({diff:e.replace(/\\n/g,`
|
|
2
|
+
`).replace(/\\t/g,` `)}))}]}}catch(e){return u.error(`Diff parse failed`,i(e)),{content:[{type:`text`,text:`Diff parse failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function p(t){let r=e(`rename`);t.registerTool(`rename`,{title:r.title,description:`Rename a symbol across files using whole-word regex matching for exports, imports, and general usage references.`,inputSchema:{old_name:n.string().describe(`Existing symbol name to replace`),new_name:n.string().describe(`New symbol name to use`),root_path:n.string().describe(`Root directory to search within`),extensions:n.array(n.string()).optional().describe(`Optional file extensions to include, such as .ts,.tsx,.js,.jsx`),dry_run:n.boolean().default(!0).describe(`Preview changes without writing files`)},annotations:r.annotations},async({old_name:e,new_name:t,root_path:n,extensions:r,dry_run:a})=>{try{let i=await l({oldName:e,newName:t,rootPath:n,extensions:r,dryRun:a});return{content:[{type:`text`,text:JSON.stringify(i)}]}}catch(e){return u.error(`Rename failed`,i(e)),{content:[{type:`text`,text:`Rename failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function m(t){let r=e(`codemod`);t.registerTool(`codemod`,{title:r.title,description:`Apply regex-based codemod rules across files and return structured before/after changes for each affected line.`,inputSchema:{root_path:n.string().describe(`Root directory to transform within`),rules:n.array(n.object({description:n.string().describe(`What the codemod rule does`),pattern:n.string().describe(`Regex pattern in string form`),replacement:n.string().describe(`Replacement string with optional capture groups`)})).min(1).describe(`Codemod rules to apply`),dry_run:n.boolean().default(!0).describe(`Preview changes without writing files`)},annotations:r.annotations},async({root_path:e,rules:t,dry_run:n})=>{try{let r=await a({rootPath:e,rules:t,dryRun:n});return{content:[{type:`text`,text:JSON.stringify(r)}]}}catch(e){return u.error(`Codemod failed`,i(e)),{content:[{type:`text`,text:`Codemod failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function h(t){let r=e(`data_transform`);t.registerTool(`data_transform`,{title:r.title,description:`Apply small jq-like transforms to JSON input for filtering, projection, grouping, and path extraction.`,inputSchema:{input:n.string().max(5e5).describe(`Input JSON string`),expression:n.string().max(1e4).describe(`Transform expression to apply`)},annotations:r.annotations},async({input:e,expression:t})=>{try{return{content:[{type:`text`,text:o({input:e,expression:t}).outputString}]}}catch(e){return u.error(`Data transform failed`,i(e)),{content:[{type:`text`,text:`Data transform failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function g(e){let t=[`Git root: ${e.gitRoot}`,`Branch: ${e.branch}`,`Staged: ${e.status.staged.length}`,...e.status.staged.map(e=>` - ${e}`),`Modified: ${e.status.modified.length}`,...e.status.modified.map(e=>` - ${e}`),`Untracked: ${e.status.untracked.length}`,...e.status.untracked.map(e=>` - ${e}`),``,`Recent commits:`];if(e.recentCommits.length===0)t.push(` none`);else for(let n of e.recentCommits)t.push(` - ${n.hash} ${n.message}`),t.push(` ${n.author} @ ${n.date}`);return e.diff&&t.push(``,`Diff stat:`,e.diff),t.join(`
|
|
3
|
+
`)}function _(e){if(e.length===0)return`No diff files found.`;let t=[];for(let n of e){let e=n.oldPath?` (from ${n.oldPath})`:``;t.push(`${n.path}${e} [${n.status}] +${n.additions} -${n.deletions} (${n.hunks.length} hunks)`);for(let e of n.hunks){let n=e.header?` ${e.header}`:``;t.push(` @@ -${e.oldStart},${e.oldLines} +${e.newStart},${e.newLines} @@${n}`)}}return t.join(`
|
|
4
|
+
`)}export{m as registerCodemodTool,h as registerDataTransformTool,f as registerDiffParseTool,d as registerGitContextTool,p as registerRenameTool};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{getToolMeta as e}from"../tool-metadata.js";import{
|
|
2
|
-
`)}]}}catch(e){return
|
|
1
|
+
import{getToolMeta as e}from"../tool-metadata.js";import{createTaskRunner as t}from"../task-manager.js";import{createHash as n}from"node:crypto";import{z as r}from"zod";import{createLogger as i,serializeError as a}from"../../../core/dist/index.js";import{onboard as o}from"../../../tools/dist/index.js";const s=i(`tools`);let c=!1;async function l(e,t,r){for(let i of r.steps)if(!(i.status!==`success`||!i.output))try{let a=n(`sha256`).update(r.path).digest(`hex`).slice(0,12),o=`produced/onboard/${i.name}/${a}.md`,s=n(`sha256`).update(i.output).digest(`hex`).slice(0,16),c=new Date().toISOString(),l=i.output.length>2e3?i.output.split(/(?=^## )/m).filter(e=>e.trim().length>0):[i.output],u=l.map((e,t)=>({id:n(`sha256`).update(`${o}::${t}`).digest(`hex`).slice(0,16),content:e.trim(),sourcePath:o,contentType:`produced-knowledge`,chunkIndex:t,totalChunks:l.length,startLine:0,endLine:0,fileHash:s,indexedAt:c,origin:`produced`,tags:[`onboard`,i.name],category:`analysis`,version:1})),d=await t.embedBatch(u.map(e=>e.content));await e.upsert(u,d)}catch(e){s.warn(`Auto-persist onboard step failed`,{stepName:i.name,...a(e)})}}function u(n,i,u){let d=e(`onboard`);n.registerTool(`onboard`,{title:d.title,description:`First-time codebase onboarding: runs all analysis tools (structure, dependencies, entry-points, symbols, patterns, diagram) in one command. Results are auto-persisted to KB. Use mode=generate to also write structured output to .ai/kb/ directory.`,inputSchema:{path:r.string().describe(`Root path of the codebase to onboard`),mode:r.enum([`memory`,`generate`]).default(`memory`).describe(`Output mode: memory = KB vector store only; generate = also write to .ai/kb/ directory`),out_dir:r.string().optional().describe(`Custom output directory for generate mode (default: <path>/.ai/kb)`)},annotations:d.annotations},async({path:e,mode:n,out_dir:r},d)=>{try{if(c)return{content:[{type:`text`,text:`Onboard is already running. Please wait for it to complete before starting another.`}]};c=!0,s.info(`Starting onboard`,{path:e,mode:n});let a=await o({path:e,mode:n,outDir:r}),f=t(d).createTask(`Onboard`,a.steps.length);for(let e=0;e<a.steps.length;e++){let t=a.steps[e];f.progress(e,`${t.name}: ${t.status}`)}f.complete(`Onboard complete: ${a.steps.filter(e=>e.status===`success`).length}/${a.steps.length} steps succeeded`),l(i,u,a);let p=[`## Onboard Complete`,``,`**Path:** \`${a.path}\``,`**Mode:** ${a.mode}`,`**Duration:** ${a.totalDurationMs}ms`,``];a.outDir&&(p.push(`**Output directory:** \`${a.outDir}\``),p.push(``)),p.push(`### Analysis Results`,``);let m=[],h=[];for(let e of a.steps)e.status===`success`?m.push(`- ✓ **${e.name}** (${e.durationMs}ms) — ${e.output.length} chars`):h.push(`- ✗ **${e.name}** — ${e.error}`);p.push(...m),h.length>0&&p.push(``,`### Failed`,``,...h),p.push(``,`---`,``);for(let e of a.steps)e.status===`success`&&p.push(`### ${e.name}`,``,e.output,``,`---`,``);return p.push(`_All results auto-saved to KB.`,a.mode===`generate`?` Files written to \`${a.outDir}\`.`:``," Next: Use `search` to query the knowledge, or `remember` to add custom insights._"),{content:[{type:`text`,text:p.join(`
|
|
2
|
+
`)}]}}catch(e){return s.error(`Onboard failed`,a(e)),{content:[{type:`text`,text:`Onboard failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}finally{c=!1}})}export{u as registerOnboardTool};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{getToolMeta as e}from"../tool-metadata.js";import{z as t}from"zod";import{createLogger as n,serializeError as r}from"../../../core/dist/index.js";import{addToWorkset as i,checkpointLatest as a,checkpointList as o,checkpointLoad as s,checkpointSave as c,deleteWorkset as l,getWorkset as u,laneCreate as d,laneDiff as f,laneDiscard as p,laneList as m,laneMerge as h,laneStatus as g,listWorksets as _,queueClear as v,queueCreate as y,queueDelete as b,queueDone as x,queueFail as S,queueGet as C,queueList as w,queueNext as T,queuePush as E,removeFromWorkset as D,saveWorkset as O,stashClear as k,stashDelete as A,stashGet as j,stashList as M,stashSet as N}from"../../../tools/dist/index.js";const P=n(`tools:persistence`);function F(n){let a=e(`workset`);n.registerTool(`workset`,{title:a.title,description:`Manage named file sets (worksets). Save, load, list, add/remove files. Worksets persist across sessions in .kb-state/worksets.json.`,inputSchema:{action:t.enum([`save`,`get`,`list`,`delete`,`add`,`remove`]).describe(`Operation to perform`),name:t.string().optional().describe(`Workset name (required for all except list)`),files:t.array(t.string()).optional().describe(`File paths (required for save, add, remove)`),description:t.string().optional().describe(`Description (for save)`)},annotations:a.annotations},async({action:e,name:t,files:n,description:a})=>{try{switch(e){case`save`:{if(!t||!n)throw Error(`name and files required for save`);let e=O(t,n,{description:a});return{content:[{type:`text`,text:`Saved workset "${e.name}" with ${e.files.length} files.`}]}}case`get`:{if(!t)throw Error(`name required for get`);let e=u(t);return e?{content:[{type:`text`,text:JSON.stringify(e
|
|
2
|
-
`)}]}}case`delete`:if(!t)throw Error(`name required for delete`);return{content:[{type:`text`,text:l(t)?`Deleted workset "${t}".`:`Workset "${t}" not found.`}]};case`add`:{if(!t||!n)throw Error(`name and files required for add`);let e=i(t,n);return{content:[{type:`text`,text:`Added to workset "${e.name}": now ${e.files.length} files.`}]}}case`remove`:{if(!t||!n)throw Error(`name and files required for remove`);let e=D(t,n);return e?{content:[{type:`text`,text:`Removed from workset "${e.name}": now ${e.files.length} files.`}]}:{content:[{type:`text`,text:`Workset "${t}" not found.`}]}}}}catch(e){return P.error(`Workset operation failed`,r(e)),{content:[{type:`text`,text:`Workset operation failed
|
|
3
|
-
`)}]}}case`delete`:if(!t)throw Error(`key required for delete`);return{content:[{type:`text`,text:A(t)?`Deleted stash entry "${t}".`:`Stash entry "${t}" not found.`}]};case`clear`:{let e=k();return{content:[{type:`text`,text:`Cleared ${e} stash entr${e===1?`y`:`ies`}.`}]}}}}catch(e){return P.error(`Stash operation failed`,r(e)),{content:[{type:`text`,text:`Stash operation failed
|
|
4
|
-
`)}]}}case`latest`:{let e=a();return{content:[{type:`text`,text:e?B(e):`No checkpoints saved.`}]}}}}catch(e){return P.error(`Checkpoint failed`,r(e)),{content:[{type:`text`,text:`Checkpoint failed
|
|
1
|
+
import{getToolMeta as e}from"../tool-metadata.js";import{z as t}from"zod";import{createLogger as n,serializeError as r}from"../../../core/dist/index.js";import{addToWorkset as i,checkpointLatest as a,checkpointList as o,checkpointLoad as s,checkpointSave as c,deleteWorkset as l,getWorkset as u,laneCreate as d,laneDiff as f,laneDiscard as p,laneList as m,laneMerge as h,laneStatus as g,listWorksets as _,queueClear as v,queueCreate as y,queueDelete as b,queueDone as x,queueFail as S,queueGet as C,queueList as w,queueNext as T,queuePush as E,removeFromWorkset as D,saveWorkset as O,stashClear as k,stashDelete as A,stashGet as j,stashList as M,stashSet as N}from"../../../tools/dist/index.js";const P=n(`tools:persistence`);function F(n){let a=e(`workset`);n.registerTool(`workset`,{title:a.title,description:`Manage named file sets (worksets). Save, load, list, add/remove files. Worksets persist across sessions in .kb-state/worksets.json.`,inputSchema:{action:t.enum([`save`,`get`,`list`,`delete`,`add`,`remove`]).describe(`Operation to perform`),name:t.string().optional().describe(`Workset name (required for all except list)`),files:t.array(t.string()).optional().describe(`File paths (required for save, add, remove)`),description:t.string().optional().describe(`Description (for save)`)},annotations:a.annotations},async({action:e,name:t,files:n,description:a})=>{try{switch(e){case`save`:{if(!t||!n)throw Error(`name and files required for save`);let e=O(t,n,{description:a});return{content:[{type:`text`,text:`Saved workset "${e.name}" with ${e.files.length} files.`}]}}case`get`:{if(!t)throw Error(`name required for get`);let e=u(t);return e?{content:[{type:`text`,text:JSON.stringify(e)}]}:{content:[{type:`text`,text:`Workset "${t}" not found.`}]}}case`list`:{let e=_();return e.length===0?{content:[{type:`text`,text:`No worksets.`}]}:{content:[{type:`text`,text:e.map(e=>`- **${e.name}** (${e.files.length} files) — ${e.description??`no description`}`).join(`
|
|
2
|
+
`)}]}}case`delete`:if(!t)throw Error(`name required for delete`);return{content:[{type:`text`,text:l(t)?`Deleted workset "${t}".`:`Workset "${t}" not found.`}]};case`add`:{if(!t||!n)throw Error(`name and files required for add`);let e=i(t,n);return{content:[{type:`text`,text:`Added to workset "${e.name}": now ${e.files.length} files.`}]}}case`remove`:{if(!t||!n)throw Error(`name and files required for remove`);let e=D(t,n);return e?{content:[{type:`text`,text:`Removed from workset "${e.name}": now ${e.files.length} files.`}]}:{content:[{type:`text`,text:`Workset "${t}" not found.`}]}}}}catch(e){return P.error(`Workset operation failed`,r(e)),{content:[{type:`text`,text:`Workset operation failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function I(n){let i=e(`stash`);n.registerTool(`stash`,{title:i.title,description:`Persist and retrieve named values in .kb-state/stash.json for intermediate results between tool calls.`,inputSchema:{action:t.enum([`set`,`get`,`list`,`delete`,`clear`]).describe(`Operation to perform on the stash`),key:t.string().optional().describe(`Entry key for set/get/delete operations`),value:t.string().optional().describe(`String or JSON value for set operations`)},annotations:i.annotations},async({action:e,key:t,value:n})=>{try{switch(e){case`set`:{if(!t)throw Error(`key required for set`);let e=N(t,V(n??``));return{content:[{type:`text`,text:`Stored stash entry "${e.key}" (${e.type}) at ${e.storedAt}.`}]}}case`get`:{if(!t)throw Error(`key required for get`);let e=j(t);return{content:[{type:`text`,text:e?JSON.stringify(e):`Stash entry "${t}" not found.`}]}}case`list`:{let e=M();return{content:[{type:`text`,text:e.length===0?`Stash is empty.`:e.map(e=>`- ${e.key} (${e.type}) — ${e.storedAt}`).join(`
|
|
3
|
+
`)}]}}case`delete`:if(!t)throw Error(`key required for delete`);return{content:[{type:`text`,text:A(t)?`Deleted stash entry "${t}".`:`Stash entry "${t}" not found.`}]};case`clear`:{let e=k();return{content:[{type:`text`,text:`Cleared ${e} stash entr${e===1?`y`:`ies`}.`}]}}}}catch(e){return P.error(`Stash operation failed`,r(e)),{content:[{type:`text`,text:`Stash operation failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function L(n){let i=e(`checkpoint`);n.registerTool(`checkpoint`,{title:i.title,description:`Save and restore lightweight session checkpoints in .kb-state/checkpoints for cross-session continuity.`,inputSchema:{action:t.enum([`save`,`load`,`list`,`latest`]).describe(`Checkpoint action to perform`),label:t.string().optional().describe(`Checkpoint label for save, or checkpoint id for load`),data:t.string().max(5e5).optional().describe(`JSON object string for save actions`),notes:t.string().max(1e4).optional().describe(`Optional notes for save actions`)},annotations:i.annotations},async({action:e,label:t,data:n,notes:i})=>{try{switch(e){case`save`:if(!t)throw Error(`label required for save`);return{content:[{type:`text`,text:B(c(t,H(n),{notes:i}))}]};case`load`:{if(!t)throw Error(`label required for load`);let e=s(t);return{content:[{type:`text`,text:e?B(e):`Checkpoint "${t}" not found.`}]}}case`list`:{let e=o();return{content:[{type:`text`,text:e.length===0?`No checkpoints saved.`:e.map(e=>`- ${e.id} — ${e.label} (${e.createdAt})`).join(`
|
|
4
|
+
`)}]}}case`latest`:{let e=a();return{content:[{type:`text`,text:e?B(e):`No checkpoints saved.`}]}}}}catch(e){return P.error(`Checkpoint failed`,r(e)),{content:[{type:`text`,text:`Checkpoint failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function R(n){let i=e(`lane`);n.registerTool(`lane`,{title:i.title,description:`Manage verified lanes — isolated file copies for parallel exploration. Create a lane, make changes, diff, merge back, or discard.`,inputSchema:{action:t.enum([`create`,`list`,`status`,`diff`,`merge`,`discard`]).describe(`Lane action to perform`),name:t.string().optional().describe(`Lane name (required for create/status/diff/merge/discard)`),files:t.array(t.string()).optional().describe(`File paths to copy into the lane (required for create)`)},annotations:i.annotations},async({action:e,name:t,files:n})=>{try{switch(e){case`create`:{if(!t)throw Error(`name is required for create`);if(!n||n.length===0)throw Error(`files are required for create`);let e=d(t,n);return{content:[{type:`text`,text:JSON.stringify(e)}]}}case`list`:return{content:[{type:`text`,text:JSON.stringify(m())}]};case`status`:if(!t)throw Error(`name is required for status`);return{content:[{type:`text`,text:JSON.stringify(g(t))}]};case`diff`:if(!t)throw Error(`name is required for diff`);return{content:[{type:`text`,text:JSON.stringify(f(t))}]};case`merge`:if(!t)throw Error(`name is required for merge`);return{content:[{type:`text`,text:JSON.stringify(h(t))}]};case`discard`:if(!t)throw Error(`name is required for discard`);return{content:[{type:`text`,text:JSON.stringify({discarded:p(t)})}]}}}catch(e){return P.error(`Lane action failed`,r(e)),{content:[{type:`text`,text:`Lane action failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function z(n){let i=e(`queue`);n.registerTool(`queue`,{title:i.title,description:`Manage task queues for sequential agent operations. Push items, take next, mark done/failed, list queues.`,inputSchema:{action:t.enum([`create`,`push`,`next`,`done`,`fail`,`get`,`list`,`clear`,`delete`]).describe(`Queue action`),name:t.string().optional().describe(`Queue name (required for most actions)`),title:t.string().optional().describe(`Item title (required for push)`),id:t.string().optional().describe(`Item ID (required for done/fail)`),data:t.unknown().optional().describe(`Arbitrary data to attach to a queue item`),error:t.string().optional().describe(`Error message (required for fail)`)},annotations:i.annotations},async({action:e,name:t,title:n,id:i,data:a,error:o})=>{try{switch(e){case`create`:if(!t)throw Error(`name is required for create`);return{content:[{type:`text`,text:JSON.stringify(y(t))}]};case`push`:if(!t)throw Error(`name is required for push`);if(!n)throw Error(`title is required for push`);return{content:[{type:`text`,text:JSON.stringify(E(t,n,a))}]};case`next`:{if(!t)throw Error(`name is required for next`);let e=T(t);return{content:[{type:`text`,text:JSON.stringify(e)}]}}case`done`:if(!t)throw Error(`name is required for done`);if(!i)throw Error(`id is required for done`);return{content:[{type:`text`,text:JSON.stringify(x(t,i))}]};case`fail`:if(!t)throw Error(`name is required for fail`);if(!i)throw Error(`id is required for fail`);if(!o)throw Error(`error is required for fail`);return{content:[{type:`text`,text:JSON.stringify(S(t,i,o))}]};case`get`:if(!t)throw Error(`name is required for get`);return{content:[{type:`text`,text:JSON.stringify(C(t))}]};case`list`:return{content:[{type:`text`,text:JSON.stringify(w())}]};case`clear`:if(!t)throw Error(`name is required for clear`);return{content:[{type:`text`,text:JSON.stringify({cleared:v(t)})}]};case`delete`:if(!t)throw Error(`name is required for delete`);return{content:[{type:`text`,text:JSON.stringify({deleted:b(t)})}]}}}catch(e){return P.error(`Queue action failed`,r(e)),{content:[{type:`text`,text:`Queue action failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}function B(e){let t=[e.id,`Label: ${e.label}`,`Created: ${e.createdAt}`];if(e.notes&&t.push(`Notes: ${e.notes}`),e.files?.length){t.push(`Files: ${e.files.length}`);for(let n of e.files)t.push(` - ${n}`)}return t.push(``,`Data:`,JSON.stringify(e.data)),t.join(`
|
|
5
5
|
`)}function V(e){let t=e.trim();if(!t)return``;try{return JSON.parse(t)}catch{return e}}function H(e){let t=e?.trim();if(!t)return{};let n;try{n=JSON.parse(t)}catch{throw Error(`data must be a valid JSON object string`)}if(!n||typeof n!=`object`||Array.isArray(n))throw Error(`data must be a JSON object string`);return n}export{L as registerCheckpointTool,R as registerLaneTool,z as registerQueueTool,I as registerStashTool,F as registerWorksetTool};
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
import{getToolMeta as e}from"../tool-metadata.js";import{z as t}from"zod";import{createLogger as n,serializeError as r}from"../../../core/dist/index.js";const i=n(`tools`);function a(
|
|
2
|
-
`)}
|
|
1
|
+
import{getToolMeta as e}from"../tool-metadata.js";import{z as t}from"zod";import{createLogger as n,serializeError as r}from"../../../core/dist/index.js";const i=n(`tools`);function a(e){let t=[`## Rule: ${e.id}`,``,`- **Status**: ${e.enabled?`enabled`:`disabled`}`,`- **Description**: ${e.description??`—`}`,`- **Category**: ${e.category??`—`}`,`- **Push weight**: ${e.pushWeight??`—`}`];return e.patterns?.length&&t.push(`- **Patterns**: ${e.patterns.join(`, `)}`),e.examples?.length&&t.push(`- **Examples**: ${e.examples.join(`, `)}`),t.join(`
|
|
2
|
+
`)}function o(n,o){let s=e(`er_update_policy`);n.registerTool(`er_update_policy`,{title:s.title,description:`Manage ER push classification rules. Supports listing, updating, creating, and deleting rules that determine when knowledge should be pushed to Enterprise RAG.`,inputSchema:{action:t.enum([`list`,`get`,`update`,`create`,`delete`]).describe(`Action to perform on classification rules`),rule_id:t.string().optional().describe(`Rule ID (required for get, update, delete)`),changes:t.object({patterns:t.array(t.string()).optional(),category:t.string().optional(),pushWeight:t.number().min(0).max(1).optional(),description:t.string().optional(),examples:t.array(t.string()).optional(),enabled:t.boolean().optional()}).optional().describe(`Changes to apply (for update action)`),new_rule:t.object({id:t.string().regex(/^[a-z][a-z0-9-]*$/),patterns:t.array(t.string()).min(1),category:t.string(),pushWeight:t.number().min(0).max(1),description:t.string(),examples:t.array(t.string()).default([]),enabled:t.boolean().default(!0)}).optional().describe(`New rule definition (for create action)`)},annotations:s.annotations},async({action:e,rule_id:t,changes:n,new_rule:s})=>{try{if(e===`list`){let e=o.getRules();return{content:[{type:`text`,text:`## Classification Rules\n\n${e.map(e=>`- **${e.id}** (${e.enabled?`enabled`:`disabled`}) — ${e.description}\n Category: ${e.category} | Weight: ${e.pushWeight} | Patterns: ${e.patterns.join(`, `)}`).join(`
|
|
3
|
+
`)}\n\n---\n_${e.length} rules total. Use \`action: "update"\` to modify a rule._`}]}}if(e===`get`){if(!t)return{content:[{type:`text`,text:'`rule_id` is required for "get" action.'}],isError:!0};let e=o.getRule(t);return e?{content:[{type:`text`,text:a(e)}]}:{content:[{type:`text`,text:`Rule "${t}" not found.`}],isError:!0}}if(e===`update`){if(!t||!n)return{content:[{type:`text`,text:'`rule_id` and `changes` are required for "update" action.'}],isError:!0};let e=o.updateRule(t,n);return e?{content:[{type:`text`,text:`${a(e)}\n\n---\n_Updated. Next: Use \`action: "list"\` to verify._`}]}:{content:[{type:`text`,text:`Rule "${t}" not found.`}],isError:!0}}return e===`create`?s?{content:[{type:`text`,text:`${a(o.addRule(s))}\n\n---\n_Created. Next: Test classification with \`remember\`._`}]}:{content:[{type:`text`,text:'`new_rule` is required for "create" action.'}],isError:!0}:e===`delete`?t?o.deleteRule(t)?{content:[{type:`text`,text:`Deleted rule **${t}**.\n\n---\n_Next: Use \`action: "list"\` to verify._`}]}:{content:[{type:`text`,text:`Rule "${t}" not found.`}],isError:!0}:{content:[{type:`text`,text:'`rule_id` is required for "delete" action.'}],isError:!0}:{content:[{type:`text`,text:`Unknown action: ${e}`}],isError:!0}}catch(e){return i.error(`Policy update failed`,r(e)),{content:[{type:`text`,text:`Policy update failed: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}export{o as registerErUpdatePolicyTool};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
//#region packages/server/src/tools/present-blocks.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Present Blocks — New block-type renderers.
|
|
4
|
+
*
|
|
5
|
+
* Each function returns an HTML string that pairs with classes
|
|
6
|
+
* already defined in present-theme.ts.
|
|
7
|
+
*/
|
|
8
|
+
interface TimelineItem {
|
|
9
|
+
phase?: string;
|
|
10
|
+
title: string;
|
|
11
|
+
description?: string;
|
|
12
|
+
status?: 'done' | 'active' | 'pending' | 'error';
|
|
13
|
+
}
|
|
14
|
+
interface ChecklistItem {
|
|
15
|
+
label: string;
|
|
16
|
+
checked?: boolean;
|
|
17
|
+
note?: string;
|
|
18
|
+
}
|
|
19
|
+
interface ComparisonColumn {
|
|
20
|
+
title: string;
|
|
21
|
+
items: string[];
|
|
22
|
+
}
|
|
23
|
+
interface StatusItem {
|
|
24
|
+
label: string;
|
|
25
|
+
status: 'success' | 'warning' | 'error' | 'info' | 'pending';
|
|
26
|
+
detail?: string;
|
|
27
|
+
}
|
|
28
|
+
interface PromptValue {
|
|
29
|
+
question: string;
|
|
30
|
+
context?: string;
|
|
31
|
+
placeholder?: string;
|
|
32
|
+
}
|
|
33
|
+
interface ProgressItem {
|
|
34
|
+
label: string;
|
|
35
|
+
value: number;
|
|
36
|
+
max?: number;
|
|
37
|
+
color?: string;
|
|
38
|
+
}
|
|
39
|
+
declare function renderTimelineHtml(value: unknown): string;
|
|
40
|
+
declare function renderChecklistHtml(value: unknown): string;
|
|
41
|
+
declare function renderComparisonHtml(value: unknown): string;
|
|
42
|
+
declare function renderStatusBoardHtml(value: unknown): string;
|
|
43
|
+
declare function renderPromptHtml(value: unknown): string;
|
|
44
|
+
declare function renderProgressHtml(value: unknown): string;
|
|
45
|
+
//#endregion
|
|
46
|
+
export { ChecklistItem, ComparisonColumn, ProgressItem, PromptValue, StatusItem, TimelineItem, renderChecklistHtml, renderComparisonHtml, renderProgressHtml, renderPromptHtml, renderStatusBoardHtml, renderTimelineHtml };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import{escHtml as e}from"./present-utils.js";const t=e;function n(e){let n=e;return!n?.items||!Array.isArray(n.items)?``:`<div class="timeline">${n.items.map(e=>{let n=e.status??`pending`,r=e.phase?`<div class="timeline-phase">${t(e.phase)}</div>`:``,i=e.description?`<div class="timeline-desc">${t(e.description)}</div>`:``;return`<div class="timeline-item">
|
|
2
|
+
<div class="timeline-dot ${n}"></div>
|
|
3
|
+
${r}
|
|
4
|
+
<div class="timeline-title">${t(e.title)}</div>
|
|
5
|
+
${i}
|
|
6
|
+
</div>`}).join(``)}</div>`}function r(e){let n=e;return!n?.items||!Array.isArray(n.items)?``:`<div class="checklist">${n.items.map(e=>{let n=e.checked?`checked`:``,r=e.checked?`✓`:``,i=e.note?`<div class="checklist-note">${t(e.note)}</div>`:``;return`<div class="checklist-item ${n}">
|
|
7
|
+
<div class="checklist-check ${n}">${r}</div>
|
|
8
|
+
<div>
|
|
9
|
+
<div class="checklist-label">${t(e.label)}</div>
|
|
10
|
+
${i}
|
|
11
|
+
</div>
|
|
12
|
+
</div>`}).join(``)}</div>`}function i(e){let n=e;if(!n?.columns||!Array.isArray(n.columns)||n.columns.length===0)return``;let r=n.columns.length,i=Math.max(...n.columns.map(e=>e.items?.length??0));return`<div class="comparison-grid" style="grid-template-columns:repeat(${r},1fr)">${n.columns.map(e=>{let n=`<div class="comparison-header">${t(e.title)}</div>`,r=[];for(let n=0;n<i;n++){let i=e.items?.[n]??``;r.push(`<div class="comparison-item">${t(i)}</div>`)}return`<div class="comparison-col">${n}${r.join(``)}</div>`}).join(``)}</div>`}function a(e){let n=e;return!n?.items||!Array.isArray(n.items)?``:`<div class="status-board">${n.items.map(e=>{let n=e.detail?`<span class="status-detail">${t(e.detail)}</span>`:``;return`<div class="status-row">
|
|
13
|
+
<div class="status-indicator ${e.status??`pending`}"></div>
|
|
14
|
+
<span class="status-label">${t(e.label)}</span>
|
|
15
|
+
${n}
|
|
16
|
+
</div>`}).join(``)}</div>`}function o(e){let n=e;if(!n?.question)return``;let r=n.context?`<div class="prompt-context">${t(n.context)}</div>`:``,i=n.placeholder?`<div class="prompt-placeholder">${t(n.placeholder)}</div>`:``;return`<div class="prompt-block">
|
|
17
|
+
<div class="prompt-question">${t(n.question)}</div>
|
|
18
|
+
${r}${i}
|
|
19
|
+
</div>`}function s(e){let n=e;if(!n?.items||!Array.isArray(n.items))return``;let r=e=>e>=100?`var(--success)`:e>=60?`var(--primary)`:e>=30?`var(--warning)`:`var(--error)`;return`<div class="progress-list">${n.items.map(e=>{let n=e.max??100,i=n>0?Math.min(100,e.value/n*100):0,a=e.color??r(i);return`<div class="progress-item">
|
|
20
|
+
<div class="progress-header">
|
|
21
|
+
<span class="progress-label">${t(e.label)}</span>
|
|
22
|
+
<span class="progress-value">${e.value}/${n}</span>
|
|
23
|
+
</div>
|
|
24
|
+
<div class="progress-track">
|
|
25
|
+
<div class="progress-fill" style="width:${i.toFixed(1)}%;background:${a}"></div>
|
|
26
|
+
</div>
|
|
27
|
+
</div>`}).join(``)}</div>`}export{r as renderChecklistHtml,i as renderComparisonHtml,s as renderProgressHtml,o as renderPromptHtml,a as renderStatusBoardHtml,n as renderTimelineHtml};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
//#region packages/server/src/tools/present-charts.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Present Charts — Pure SVG chart rendering engine.
|
|
4
|
+
*
|
|
5
|
+
* Supports: line, area, bar, horizontal-bar, pie, donut, sparkline, heatmap.
|
|
6
|
+
* Uses CSS custom properties (--chart-1 … --chart-12) from present-theme.ts.
|
|
7
|
+
* Zero external dependencies.
|
|
8
|
+
*/
|
|
9
|
+
interface ChartBlock {
|
|
10
|
+
type: 'chart';
|
|
11
|
+
title?: string;
|
|
12
|
+
value: ChartValue;
|
|
13
|
+
}
|
|
14
|
+
interface ChartValue {
|
|
15
|
+
chartType: 'line' | 'area' | 'bar' | 'horizontal-bar' | 'pie' | 'donut' | 'sparkline' | 'heatmap';
|
|
16
|
+
data: Record<string, unknown>[];
|
|
17
|
+
xKey: string;
|
|
18
|
+
yKeys: string[];
|
|
19
|
+
title?: string;
|
|
20
|
+
height?: number;
|
|
21
|
+
showLegend?: boolean;
|
|
22
|
+
showGrid?: boolean;
|
|
23
|
+
config?: Record<string, unknown>;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Render a chart block as an HTML string containing an inline SVG.
|
|
27
|
+
* Returns a wrapping `<div class="chart-container">` with optional title and legend.
|
|
28
|
+
*/
|
|
29
|
+
declare function renderChartAsHtml(block: ChartBlock): string;
|
|
30
|
+
//#endregion
|
|
31
|
+
export { ChartBlock, ChartValue, renderChartAsHtml };
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import{escHtml as e}from"./present-utils.js";const t=e;function n(e){return Math.abs(e)>=1e6?`${(e/1e6).toFixed(1).replace(/\.0$/,``)}M`:Math.abs(e)>=1e3?`${(e/1e3).toFixed(1).replace(/\.0$/,``)}k`:Number.isInteger(e)?String(e):e.toFixed(1)}function r(e){return`var(--chart-${e%12+1})`}let i=0;function a(e){let n=e.value;if(!n?.data?.length||!n.chartType)return`<pre>${t(JSON.stringify(e.value,null,2))}</pre>`;i++;let r=e.title||n.title?`<div class="chart-title">${t(String(e.title||n.title))}</div>`:``,a;switch(n.chartType){case`line`:a=m(n,!1);break;case`area`:a=m(n,!0);break;case`bar`:a=h(n,!1);break;case`horizontal-bar`:a=h(n,!0);break;case`pie`:a=g(n,!1);break;case`donut`:a=g(n,!0);break;case`sparkline`:a=_(n);break;case`heatmap`:a=v(n);break;default:a=`<pre>${t(JSON.stringify(n,null,2))}</pre>`}let s=n.showLegend!==!1&&n.yKeys.length>1&&n.chartType!==`sparkline`?o(n.yKeys):``;return`<div class="chart-container">${r}${a}${s}</div>`}function o(e){return`<div class="chart-legend">${e.map((e,n)=>`<span class="chart-legend-item"><span class="chart-legend-swatch" style="background:${r(n)}"></span>${t(e)}</span>`).join(``)}</div>`}const s={top:20,right:20,bottom:35,left:55};function c(e,t){return e.map(e=>Number(e[t])||0)}function l(e,t){return e.map(e=>String(e[t]??``))}function u(e){let t=1/0,n=-1/0;for(let r of e)r<t&&(t=r),r>n&&(n=r);return t===n&&(t=t===0?0:t*.9,n=n===0?1:n*1.1),[t,n]}function d(e){return e>=0?0:e}function f(e,t,r,i=5){let a=[];for(let o=0;o<=i;o++){let c=o/i,l=s.top+r-c*r,u=e+c*(t-e);a.push(`<line class="chart-grid-line" x1="${s.left}" x2="${600-s.right}" y1="${l}" y2="${l}"/>`),a.push(`<text class="chart-axis-label" x="${s.left-8}" y="${l+4}" text-anchor="end">${n(u)}</text>`)}return a.join(``)}function p(e,n,r,i){let a=Math.floor(n/50),o=Math.max(1,Math.ceil(e.length/a));return e.map((e,n)=>n%o===0?`<text class="chart-axis-label" x="${s.left+n*i+i/2}" y="${s.top+r+18}" text-anchor="middle">${t(e.length>10?`${e.slice(0,9)}…`:e)}</text>`:``).join(``)}function m(e,t){let n=(e.height??300)-s.top-s.bottom,a=600-s.left-s.right,o=l(e.data,e.xKey),m=e.data.length;if(m===0)return``;let h=a/Math.max(m-1,1),g=1/0,_=-1/0;for(let t of e.yKeys){let[n,r]=u(c(e.data,t));n<g&&(g=n),r>_&&(_=r)}g=d(g);let v=_-g||1,y=e=>s.top+n-(e-g)/v*n,b=e=>s.left+e*h,x=``,S=[];for(let a=0;a<e.yKeys.length;a++){let o=c(e.data,e.yKeys[a]),l=r(a),u=`M${o.map((e,t)=>`${b(t).toFixed(1)},${y(e).toFixed(1)}`).join(`L`)}`;if(t){let e=`ag${i}_${a}`;x+=`<linearGradient id="${e}" x1="0" y1="0" x2="0" y2="1">
|
|
2
|
+
<stop offset="0%" stop-color="${l}" stop-opacity="0.3"/>
|
|
3
|
+
<stop offset="100%" stop-color="${l}" stop-opacity="0"/>
|
|
4
|
+
</linearGradient>`;let t=`${u}L${b(m-1).toFixed(1)},${(s.top+n).toFixed(1)}L${b(0).toFixed(1)},${(s.top+n).toFixed(1)}Z`;S.push(`<path d="${t}" fill="url(#${e})" stroke="none"/>`)}S.push(`<path d="${u}" fill="none" stroke="${l}" stroke-width="2" stroke-linejoin="round" stroke-linecap="round"/>`);for(let e=0;e<o.length;e++)S.push(`<circle cx="${b(e).toFixed(1)}" cy="${y(o[e]).toFixed(1)}" r="3" fill="${l}" stroke="var(--card)" stroke-width="1.5"/>`)}let C=e.height??300,w=e.showGrid===!1?``:f(g,_,n),T=p(o,a,n,m>1?h:a);return`<svg class="chart-svg" viewBox="0 0 600 ${C}" preserveAspectRatio="xMidYMid meet">
|
|
5
|
+
${x?`<defs>${x}</defs>`:``}
|
|
6
|
+
${w}${T}${S.join(``)}
|
|
7
|
+
</svg>`}function h(e,i){let a=(e.height??300)-s.top-s.bottom,o=600-s.left-s.right,u=l(e.data,e.xKey),d=e.data.length;if(d===0)return``;let m=e.yKeys.length,h=0;for(let t of e.yKeys)for(let n of c(e.data,t))n>h&&(h=n);h===0&&(h=1);let g=e.height??300,_=[];if(i){let i=Math.min(24,(a-(d-1)*4)/(d*m)),c=i*m+4,l=e.showGrid===!1?``:f(0,h,a),p=u.map((e,n)=>{let r=s.top+n*c+c/2,i=e.length>15?`${e.slice(0,14)}…`:e;return`<text class="chart-axis-label" x="${s.left-8}" y="${r+4}" text-anchor="end">${t(i)}</text>`}).join(``);for(let a=0;a<d;a++)for(let l=0;l<m;l++){let u=Number(e.data[a][e.yKeys[l]])||0,d=u/h*o,f=s.top+a*c+l*i;_.push(`<rect x="${s.left}" y="${f}" width="${d.toFixed(1)}" height="${i-2}" rx="3" fill="${r(l)}" opacity="0.85">
|
|
8
|
+
<title>${t(e.yKeys[l])}: ${n(u)}</title>
|
|
9
|
+
</rect>`)}return`<svg class="chart-svg" viewBox="0 0 600 ${Math.max(g,d*c+s.top+s.bottom)}" preserveAspectRatio="xMidYMid meet">
|
|
10
|
+
${l}${p}${_.join(``)}
|
|
11
|
+
</svg>`}else{let i=o/d,c=Math.min(40,(i-8)/m),l=e.showGrid===!1?``:f(0,h,a),v=p(u,o,a,i);for(let o=0;o<d;o++)for(let l=0;l<m;l++){let u=Number(e.data[o][e.yKeys[l]])||0,d=u/h*a,f=s.left+o*i+(i-c*m)/2+l*c,p=s.top+a-d;_.push(`<rect x="${f.toFixed(1)}" y="${p.toFixed(1)}" width="${(c-2).toFixed(1)}" height="${d.toFixed(1)}" rx="3" fill="${r(l)}" opacity="0.85">
|
|
12
|
+
<title>${t(e.yKeys[l])}: ${n(u)}</title>
|
|
13
|
+
</rect>`)}return`<svg class="chart-svg" viewBox="0 0 600 ${g}" preserveAspectRatio="xMidYMid meet">
|
|
14
|
+
${l}${v}${_.join(``)}
|
|
15
|
+
</svg>`}}function g(e,i){let a=e.height??300,s=a/2,c=a/2,u=a/2-10,d=i?u*.55:0,f=e.yKeys[0]||`value`,p=e.data.map(e=>Math.max(0,Number(e[f])||0)),m=l(e.data,e.xKey),h=p.reduce((e,t)=>e+t,0);if(h===0)return`<div style="color:var(--muted-foreground);text-align:center;padding:20px">No data</div>`;let g=[],_=-Math.PI/2;for(let e=0;e<p.length;e++){let i=p[e]/h;if(i===0)continue;let a=i*Math.PI*2,o=_,l=_+a,f=s+u*Math.cos(o),v=c+u*Math.sin(o),y=s+u*Math.cos(l),b=c+u*Math.sin(l),x=a>Math.PI?1:0,S;if(d>0){let e=s+d*Math.cos(o),t=c+d*Math.sin(o),n=s+d*Math.cos(l),r=c+d*Math.sin(l);S=`M${f.toFixed(2)},${v.toFixed(2)} A${u},${u} 0 ${x},1 ${y.toFixed(2)},${b.toFixed(2)} L${n.toFixed(2)},${r.toFixed(2)} A${d},${d} 0 ${x},0 ${e.toFixed(2)},${t.toFixed(2)}Z`}else S=`M${s},${c} L${f.toFixed(2)},${v.toFixed(2)} A${u},${u} 0 ${x},1 ${y.toFixed(2)},${b.toFixed(2)}Z`;g.push(`<path d="${S}" fill="${r(e)}" stroke="var(--background)" stroke-width="2" opacity="0.9">
|
|
16
|
+
<title>${t(m[e]||`Item ${e+1}`)}: ${n(p[e])} (${(i*100).toFixed(1)}%)</title>
|
|
17
|
+
</path>`),_=l}let v=i?`<text x="${s}" y="${c-6}" text-anchor="middle" fill="var(--foreground)" font-size="18" font-weight="700">${n(h)}</text>
|
|
18
|
+
<text x="${s}" y="${c+12}" text-anchor="middle" fill="var(--muted-foreground)" font-size="11">Total</text>`:``,y=o(m.filter((e,t)=>p[t]>0));return`<svg class="chart-svg" viewBox="0 0 ${a} ${a}" preserveAspectRatio="xMidYMid meet">
|
|
19
|
+
${g.join(``)}${v}
|
|
20
|
+
</svg>${y}`}function _(e){let t=e.height??40,n=e.yKeys[0]||`value`,a=c(e.data,n),o=a.length;if(o===0)return``;let[s,l]=u(a),d=l-s||1,f=200/Math.max(o-1,1),p=a.map((e,n)=>`${(n*f).toFixed(1)},${(t-4-(e-s)/d*(t-8)).toFixed(1)}`),m=`spk${i}`,h=r(0);return`<svg class="chart-svg" viewBox="0 0 200 ${t}" preserveAspectRatio="xMidYMid meet" style="max-width:200px;height:${t}px">
|
|
21
|
+
<defs>
|
|
22
|
+
<linearGradient id="${m}" x1="0" y1="0" x2="0" y2="1">
|
|
23
|
+
<stop offset="0%" stop-color="${h}" stop-opacity="0.2"/>
|
|
24
|
+
<stop offset="100%" stop-color="${h}" stop-opacity="0"/>
|
|
25
|
+
</linearGradient>
|
|
26
|
+
</defs>
|
|
27
|
+
<path d="M${p.join(`L`)}L${((o-1)*f).toFixed(1)},${t}L0,${t}Z" fill="url(#${m})" stroke="none"/>
|
|
28
|
+
<polyline points="${p.join(` `)}" fill="none" stroke="${h}" stroke-width="1.5" stroke-linejoin="round"/>
|
|
29
|
+
<circle cx="${((o-1)*f).toFixed(1)}" cy="${p[o-1].split(`,`)[1]}" r="2.5" fill="${h}"/>
|
|
30
|
+
</svg>`}function v(e){let r=l(e.data,e.xKey),i=e.data.length,a=e.yKeys.length;if(i===0||a===0)return``;let o=1/0,u=-1/0;for(let t of e.yKeys)for(let n of c(e.data,t))n<o&&(o=n),n>u&&(u=n);let d=u-o||1,f=Math.min(50,(600-s.left-s.right)/i),p=Math.min(30,200/a),m=s.left+i*f+s.right,h=s.top+a*p+s.bottom,g=[];for(let n=0;n<a;n++){let r=s.top+n*p+p/2+4,i=e.yKeys[n].length>8?`${e.yKeys[n].slice(0,7)}…`:e.yKeys[n];g.push(`<text class="chart-axis-label" x="${s.left-8}" y="${r}" text-anchor="end">${t(i)}</text>`)}let _=Math.floor((m-s.left)/40),v=Math.max(1,Math.ceil(i/_));for(let e=0;e<i;e++){if(e%v!==0)continue;let n=s.left+e*f+f/2,i=r[e].length>6?`${r[e].slice(0,5)}…`:r[e];g.push(`<text class="chart-axis-label" x="${n}" y="${h-8}" text-anchor="middle">${t(i)}</text>`)}for(let c=0;c<i;c++)for(let i=0;i<a;i++){let a=Number(e.data[c][e.yKeys[i]])||0,l=(a-o)/d,u=s.left+c*f,m=s.top+i*p;g.push(`<rect x="${u}" y="${m}" width="${f-1}" height="${p-1}" rx="2" fill="var(--primary)" opacity="${(.1+l*.8).toFixed(2)}">
|
|
31
|
+
<title>${t(r[c])} / ${t(e.yKeys[i])}: ${n(a)}</title>
|
|
32
|
+
</rect>`)}return`<svg class="chart-svg" viewBox="0 0 ${m} ${h}" preserveAspectRatio="xMidYMid meet">
|
|
33
|
+
${g.join(``)}
|
|
34
|
+
</svg>`}export{a as renderChartAsHtml};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
//#region packages/server/src/tools/present-theme.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Present Design System — CSS tokens and component styles.
|
|
4
|
+
*
|
|
5
|
+
* Based on notification-dashboard design tokens.
|
|
6
|
+
* Dark mode by default, professional clean aesthetic.
|
|
7
|
+
* Font: Plus Jakarta Sans via Google Fonts CDN.
|
|
8
|
+
*/
|
|
9
|
+
/** Google Fonts <link> tag to inject into <head>. */
|
|
10
|
+
declare const FONT_LINK = "<link href=\"https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap\" rel=\"stylesheet\">";
|
|
11
|
+
/** Returns the full design system CSS string for browser-mode HTML pages. */
|
|
12
|
+
declare function getDesignSystemCSS(): string;
|
|
13
|
+
//#endregion
|
|
14
|
+
export { FONT_LINK, getDesignSystemCSS };
|