@stjbrown/agent-knowledge 0.1.0-beta.1 → 0.1.0-beta.10
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/NOTICE +5 -4
- package/OBSERVABILITY.md +163 -0
- package/README.md +74 -8
- package/dist/chunk-JZ3GYPHM.js +3993 -0
- package/dist/chunk-JZ3GYPHM.js.map +1 -0
- package/dist/{chunk-J4MELCGD.js → chunk-X6R3XLAQ.js} +19 -6
- package/dist/chunk-X6R3XLAQ.js.map +1 -0
- package/dist/headless.js +2 -2
- package/dist/index.js +2 -2
- package/dist/main.js +7 -18
- package/dist/main.js.map +1 -1
- package/dist/tui-74FJW5Y4.js +1519 -0
- package/dist/tui-74FJW5Y4.js.map +1 -0
- package/package.json +27 -15
- package/skills/kb/SKILL.md +5 -0
- package/skills/kb/example-bundle/spec/types.md +3 -2
- package/skills/kb-ingest/SKILL.md +27 -6
- package/skills/kb-init/SKILL.md +23 -5
- package/skills/kb-lint/SKILL.md +6 -1
- package/dist/chunk-3XSOMUQQ.js +0 -131
- package/dist/chunk-3XSOMUQQ.js.map +0 -1
- package/dist/chunk-J4MELCGD.js.map +0 -1
- package/dist/chunk-YIAVFL7A.js +0 -1732
- package/dist/chunk-YIAVFL7A.js.map +0 -1
- package/dist/tui-VZVO7UHV.js +0 -521
- package/dist/tui-VZVO7UHV.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/headless/run.ts"],"sourcesContent":["import type { AgentControllerEvent } from \"@mastra/core/agent-controller\";\nimport { bootJanet } from \"../agent/controller.js\";\nimport { messageText } from \"./format.js\";\n\nexport interface HeadlessOptions {\n /** The directive/message to send to Janet. */\n message: string;\n dir?: string;\n bundle?: string;\n /** Model id to switch to before the turn (from --model / JANET_MODEL). */\n modelId?: string;\n /** Resume an existing thread. */\n threadId?: string;\n /** Allow workspace edits. Defaults to read-only. */\n allowEdits?: boolean;\n /** Allow shell execution. Defaults to false and should be an explicit user opt-in. */\n allowExec?: boolean;\n}\n\nexport interface HeadlessResult {\n exitCode: number;\n /** Final assistant text (also streamed to stdout as it arrives). */\n text: string;\n}\n\n/**\n * Headless one-shot: boot a fail-closed session, stream assistant text to\n * stdout, and resolve on `agent_end`. Pattern adapted from mastracode's\n * `sdk/src/headless/`.\n */\nexport async function runHeadless(opts: HeadlessOptions): Promise<HeadlessResult> {\n const { controller, session, herdrDetach } = await bootJanet({\n dir: opts.dir,\n bundle: opts.bundle,\n interactive: false,\n threadId: opts.threadId,\n allowHeadlessEdits: opts.allowEdits,\n allowHeadlessExec: opts.allowExec,\n });\n // Expose the active thread id so a supervisor (e.g. Herdr) can reattach with\n // `janet --thread <id>` after a restart.\n const activeThreadId = session.thread.getId();\n if (activeThreadId && process.env[\"JANET_PRINT_THREAD\"]) {\n process.stderr.write(`janet:thread ${activeThreadId}\\n`);\n }\n\n if (opts.modelId) {\n await session.model.switch({ modelId: opts.modelId });\n }\n if (!session.model.hasSelection()) {\n process.stderr.write(\n \"No model selected. Pass --model 'provider/model' or set JANET_MODEL, \" +\n \"or run `janet` once to onboard. Checked: JANET_MODEL, and any persisted selection.\\n\",\n );\n herdrDetach();\n await controller.destroy();\n return { exitCode: 2, text: \"\" };\n }\n\n let finalText = \"\";\n let lastStreamed = \"\";\n let currentMessageId = \"\";\n let exitCode = 0;\n\n const debug = !!process.env[\"JANET_DEBUG\"];\n await new Promise<void>((resolve) => {\n // Headless one-shots cannot answer questions: skills that would normally\n // ask the user (e.g. kb-init's domain questions) must proceed on their own.\n const nonInteractiveNote =\n \"\\n\\n(Non-interactive run: you cannot ask the user questions. Make reasonable \" +\n \"assumptions from the workspace contents, state them briefly, and complete the \" +\n \"task end-to-end in this single turn.)\";\n\n const unsubscribe = session.subscribe((event: AgentControllerEvent) => {\n if (debug) {\n const extra =\n event.type === \"tool_start\"\n ? ` ${event.toolName} ${JSON.stringify(event.args).slice(0, 100)}`\n : event.type === \"tool_end\"\n ? ` isError=${event.isError} ${String(event.result).slice(0, 80)}`\n : event.type === \"message_end\" && event.message.role === \"assistant\"\n ? ` toolCalls=${JSON.stringify(event.message.content.filter((c) => c.type === \"tool_call\").map((c) => (c as { name: string }).name))}`\n : event.type === \"agent_end\"\n ? ` reason=${event.reason}`\n : event.type === \"error\"\n ? ` ${event.errorType} ${String(event.error?.message ?? \"\").slice(0, 120)}`\n : \"\";\n process.stderr.write(`[dbg] ${event.type}${extra}\\n`);\n }\n switch (event.type) {\n case \"message_update\":\n case \"message_end\": {\n if (event.message.role !== \"assistant\") break;\n // Only reset the streamed-prefix tracker when a genuinely NEW message\n // starts (the same message keeps growing across tool calls).\n if (event.message.id !== currentMessageId) {\n currentMessageId = event.message.id;\n if (lastStreamed.length > 0) process.stdout.write(\"\\n\");\n lastStreamed = \"\";\n }\n const text = messageText(event.message);\n if (text.length > lastStreamed.length && text.startsWith(lastStreamed)) {\n process.stdout.write(text.slice(lastStreamed.length));\n lastStreamed = text;\n }\n if (event.type === \"message_end\" && text.length > 0) {\n finalText = text;\n }\n break;\n }\n case \"tool_approval_required\":\n // Explicit permission rules should normally resolve without a prompt.\n // If an unknown gate still reaches us, fail closed instead of hanging.\n void session.respondToToolApproval({ decision: \"decline\", toolCallId: event.toolCallId });\n break;\n case \"tool_suspended\": {\n // Headless can't prompt the user. For ask_user, tell Janet to proceed\n // with sensible defaults so the run completes; for a decision-style\n // suspension, approve. Prevents the turn hanging forever.\n const payload = event.suspendPayload as { options?: { label: string }[] } | undefined;\n const resumeData = event.toolName === \"ask_user\"\n ? payload?.options?.length\n ? payload.options[0]!.label\n : \"Proceed with reasonable defaults — this is a non-interactive run.\"\n : { action: \"denied\" };\n void session.respondToToolSuspension({ toolCallId: event.toolCallId, resumeData });\n break;\n }\n case \"error\": {\n const err = event.error as Error & { statusCode?: number; responseBody?: string };\n const detail = [\n err?.message,\n err?.statusCode ? `HTTP ${err.statusCode}` : \"\",\n err?.responseBody?.slice(0, 400) ?? \"\",\n ]\n .filter(Boolean)\n .join(\" — \");\n process.stderr.write(`\\nJanet hit a snag: ${detail || \"unknown error\"}\\n`);\n exitCode = 1;\n break;\n }\n case \"agent_end\":\n if (event.reason === \"error\" || event.reason === \"aborted\") exitCode = 1;\n unsubscribe();\n resolve();\n break;\n }\n });\n\n void session.sendMessage({ content: opts.message + nonInteractiveNote }).catch((err: Error) => {\n process.stderr.write(`\\nJanet hit a snag: ${err.message}\\n`);\n exitCode = 1;\n unsubscribe();\n resolve();\n });\n });\n\n process.stdout.write(\"\\n\");\n herdrDetach();\n await controller.destroy();\n return { exitCode, text: finalText };\n}\n"],"mappings":"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","names":[]}
|