@geminixiang/mikan 1.0.0-beta.55 → 1.0.0-beta.56
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 +10 -0
- package/dist/env-manifest.d.ts.map +1 -1
- package/dist/env-manifest.js +5 -0
- package/dist/env-manifest.js.map +1 -1
- package/dist/harness/presenter.d.ts.map +1 -1
- package/dist/harness/presenter.js +135 -25
- package/dist/harness/presenter.js.map +1 -1
- package/dist/harness/runner.d.ts.map +1 -1
- package/dist/harness/runner.js +9 -4
- package/dist/harness/runner.js.map +1 -1
- package/dist/harness/types.d.ts +12 -0
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/observability/index.d.ts +1 -0
- package/dist/observability/index.d.ts.map +1 -1
- package/dist/observability/index.js +13 -8
- package/dist/observability/index.js.map +1 -1
- package/dist/observability/privacy.d.ts +3 -0
- package/dist/observability/privacy.d.ts.map +1 -0
- package/dist/observability/privacy.js +12 -0
- package/dist/observability/privacy.js.map +1 -0
- package/dist/observability/sentry.d.ts.map +1 -1
- package/dist/observability/sentry.js +19 -19
- package/dist/observability/sentry.js.map +1 -1
- package/dist/observability/types.d.ts +1 -0
- package/dist/observability/types.d.ts.map +1 -1
- package/dist/observability/types.js.map +1 -1
- package/dist/runtime/conversation-runtime.js +5 -2
- package/dist/runtime/conversation-runtime.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -9,6 +9,16 @@ any release.
|
|
|
9
9
|
|
|
10
10
|
## [Unreleased]
|
|
11
11
|
|
|
12
|
+
## [1.0.0-beta.56]
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
|
|
16
|
+
- Add content-free agent diagnostics for actual model IDs, token and cost totals, first-token latency, context utilization, message and attachment counts, payload sizes, tool categories and status, and retry, compaction, and budget summaries.
|
|
17
|
+
|
|
18
|
+
### Security
|
|
19
|
+
|
|
20
|
+
- Replace raw conversation, session, message, thread, and user telemetry identifiers with stable opaque values, support deployment-specific HMACs through `TELEMETRY_HASH_KEY`, and stop sending usernames to Sentry.
|
|
21
|
+
|
|
12
22
|
## [1.0.0-beta.55]
|
|
13
23
|
|
|
14
24
|
### Added
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-manifest.d.ts","sourceRoot":"","sources":["../src/env-manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMxD;AAED,0EAA0E;AAC1E,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEhE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAG/D;AAED,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,eAAO,MAAM,YAAY,EAAE,SAAS,QAAQ,
|
|
1
|
+
{"version":3,"file":"env-manifest.d.ts","sourceRoot":"","sources":["../src/env-manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMxD;AAED,0EAA0E;AAC1E,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEhE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAG/D;AAED,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,eAAO,MAAM,YAAY,EAAE,SAAS,QAAQ,EA6K3C,CAAC;AAEF,KAAK,SAAS,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;AAEtD,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,GAAE,SAAmB,GAAG,OAAO,CAO/E;AAED,wBAAgB,kBAAkB,CAAC,GAAG,GAAE,SAAmB,GAAG,MAAM,EAAE,CAIrE;AASD,wBAAgB,kBAAkB,IAAI,MAAM,CAK3C;AAED,0EAA0E;AAC1E,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAI1C;AAED,mFAAmF;AACnF,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,EAAE,CAM7E;AAED,gFAAgF;AAChF,wBAAgB,SAAS,CAAC,GAAG,GAAE,SAAmB,GAAG,MAAM,CAuB1D"}
|
package/dist/env-manifest.js
CHANGED
|
@@ -143,6 +143,11 @@ export const ENV_MANIFEST = [
|
|
|
143
143
|
doc: "Sentry environment tag (default production)",
|
|
144
144
|
},
|
|
145
145
|
{ name: "SENTRY_ENABLED", deploy: false, doc: "Set to false to disable Sentry errors" },
|
|
146
|
+
{
|
|
147
|
+
name: "TELEMETRY_HASH_KEY",
|
|
148
|
+
secret: true,
|
|
149
|
+
doc: "Optional HMAC key for stable opaque conversation and user identifiers",
|
|
150
|
+
},
|
|
146
151
|
{ name: "OTEL_SDK_DISABLED", doc: "Set to true to disable OpenTelemetry" },
|
|
147
152
|
{ name: "OTEL_SERVICE_NAME", doc: "OTLP service name (default mikan)" },
|
|
148
153
|
{
|
package/dist/env-manifest.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-manifest.js","sourceRoot":"","sources":["../src/env-manifest.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The daemon's environment interface, declared as data — the one inventory\n * that startup validation, `mikan env`, `--help`, and the pm2 deploy\n * template check all derive from. Add a var here and every derived surface\n * picks it up; a var read anywhere else but not listed here is a bug.\n *\n * Names are the un-prefixed spelling; `readEnv` accepts a `MIKAN_`-prefixed\n * alias for each. Not covered: dynamic OAuth service keys from\n * OAUTH_SERVICES_JSON (data-driven by design) and standard proxy vars\n * (HTTPS_PROXY/HTTP_PROXY/NO_PROXY).\n */\nimport type { EnvGroup } from \"./types.js\";\n\nexport function readEnv(name: string): string | undefined {\n const raw = process.env[name]?.trim();\n if (raw) return raw;\n\n const prefixed = process.env[`MIKAN_${name}`]?.trim();\n return prefixed || undefined;\n}\n\n/** Read a standards-owned environment variable without mikan aliasing. */\nexport function readStandardEnv(name: string): string | undefined {\n return process.env[name]?.trim() || undefined;\n}\n\nexport function setEnvAliases(name: string, value: string): void {\n process.env[name] = value;\n process.env[`MIKAN_${name}`] = value;\n}\n\nexport type { EnvGroup } from \"./types.js\";\n\nexport const ENV_MANIFEST: readonly EnvGroup[] = [\n {\n key: \"slack\",\n title: \"Slack\",\n kind: \"platform\",\n vars: [\n {\n name: \"SLACK_APP_TOKEN\",\n required: true,\n secret: true,\n doc: \"Socket-mode app token (xapp-…)\",\n },\n { name: \"SLACK_BOT_TOKEN\", required: true, secret: true, doc: \"Bot token (xoxb-…)\" },\n ],\n },\n {\n key: \"telegram\",\n title: \"Telegram\",\n kind: \"platform\",\n vars: [{ name: \"TELEGRAM_BOT_TOKEN\", required: true, secret: true, doc: \"BotFather token\" }],\n },\n {\n key: \"discord\",\n title: \"Discord\",\n kind: \"platform\",\n vars: [{ name: \"DISCORD_BOT_TOKEN\", required: true, secret: true, doc: \"Bot token\" }],\n },\n {\n key: \"github\",\n title: \"GitHub\",\n kind: \"platform\",\n doc: \"Issue/PR conversations via a GitHub App (polling; optional webhook poke)\",\n vars: [\n { name: \"GITHUB_APP_ID\", required: true, doc: \"GitHub App id\" },\n { name: \"GITHUB_INSTALLATION_ID\", required: true, doc: \"App installation id\" },\n {\n name: \"GITHUB_APP_PRIVATE_KEY_PATH\",\n doc: \"Path to the App private key .pem (preferred; keep outside any repo)\",\n },\n {\n name: \"GITHUB_APP_PRIVATE_KEY\",\n secret: true,\n deploy: false,\n doc: \"App private key PEM with literal \\\\n newlines (fallback)\",\n },\n {\n name: \"GITHUB_REPOS\",\n doc: \"Comma-separated owner/repo allowlist (default: all installed)\",\n },\n { name: \"GITHUB_POLL_INTERVAL\", doc: \"Poll interval in seconds (default 60)\" },\n {\n name: \"GITHUB_WEBHOOK_SECRET\",\n secret: true,\n doc: \"Webhook secret; when set, deliveries to /github/webhook trigger an immediate poll (needs LINK_PORT)\",\n },\n ],\n anyOf: [\"GITHUB_APP_PRIVATE_KEY\", \"GITHUB_APP_PRIVATE_KEY_PATH\"],\n },\n {\n key: \"llm\",\n title: \"LLM providers\",\n kind: \"feature\",\n vars: [\n { name: \"ANTHROPIC_API_KEY\", secret: true, doc: \"Anthropic API key\" },\n { name: \"OPENAI_API_KEY\", secret: true, doc: \"OpenAI API key\" },\n ],\n },\n {\n key: \"link\",\n title: \"Link/OAuth server\",\n kind: \"feature\",\n doc: \"Credential onboarding links, session view, and the Admin portal\",\n vars: [\n { name: \"LINK_URL\", doc: \"Externally visible base URL, e.g. https://mikan.example.com\" },\n { name: \"LINK_PORT\", doc: \"Listen port (default 8181 when LINK_URL is set)\" },\n { name: \"GITHUB_OAUTH_CLIENT_ID\", doc: \"GitHub OAuth app for /login linking\" },\n { name: \"GITHUB_OAUTH_CLIENT_SECRET\", secret: true, doc: \"GitHub OAuth app secret\" },\n { name: \"GOOGLE_WORKSPACE_CLI_CLIENT_ID\", doc: \"Google Workspace OAuth client for /login\" },\n {\n name: \"GOOGLE_WORKSPACE_CLI_CLIENT_SECRET\",\n secret: true,\n doc: \"Google Workspace OAuth secret\",\n },\n { name: \"GOOGLE_CLOUD_SDK_CLIENT_ID\", doc: \"Google Cloud SDK OAuth client for /login\" },\n {\n name: \"GOOGLE_CLOUD_SDK_CLIENT_SECRET\",\n secret: true,\n doc: \"Google Cloud SDK OAuth secret\",\n },\n ],\n },\n {\n key: \"openconnector\",\n title: \"OpenConnector\",\n kind: \"feature\",\n doc: \"Host-side provisioning of conversation-scoped OpenConnector runtime tokens\",\n vars: [\n {\n name: \"OPENCONNECTOR_ENDPOINT\",\n doc: \"Deployment-owned full MCP endpoint for the reserved OpenConnector server\",\n },\n {\n name: \"OPENCONNECTOR_ADMIN_TOKEN\",\n secret: true,\n doc: \"Admin token used only to mint per-conversation runtime tokens\",\n },\n ],\n },\n {\n key: \"cloudflare\",\n title: \"Cloudflare sandbox\",\n kind: \"feature\",\n doc: \"For --sandbox=cloudflare:<id> via the bridge worker\",\n vars: [\n { name: \"CLOUDFLARE_SANDBOX_URL\", doc: \"Bridge worker URL\" },\n { name: \"CLOUDFLARE_SANDBOX_TOKEN\", secret: true, doc: \"Bridge worker auth token\" },\n ],\n },\n {\n key: \"observability\",\n title: \"Observability\",\n kind: \"feature\",\n vars: [\n { name: \"SENTRY_DSN\", secret: true, doc: \"Sentry DSN (settings.json sentry.dsn wins)\" },\n {\n name: \"SENTRY_ENVIRONMENT\",\n deploy: false,\n doc: \"Sentry environment tag (default production)\",\n },\n { name: \"SENTRY_ENABLED\", deploy: false, doc: \"Set to false to disable Sentry errors\" },\n { name: \"OTEL_SDK_DISABLED\", doc: \"Set to true to disable OpenTelemetry\" },\n { name: \"OTEL_SERVICE_NAME\", doc: \"OTLP service name (default mikan)\" },\n {\n name: \"OTEL_RESOURCE_ATTRIBUTES\",\n secret: true,\n doc: \"Comma-separated safe resource attrs\",\n },\n { name: \"OTEL_TRACES_EXPORTER\", doc: \"Trace exporter: otlp or none\" },\n { name: \"OTEL_METRICS_EXPORTER\", doc: \"Metrics exporter: otlp or none\" },\n { name: \"OTEL_EXPORTER_OTLP_ENDPOINT\", secret: true, doc: \"Base OTLP HTTP endpoint\" },\n { name: \"OTEL_EXPORTER_OTLP_TRACES_ENDPOINT\", secret: true, doc: \"OTLP traces endpoint\" },\n { name: \"OTEL_EXPORTER_OTLP_METRICS_ENDPOINT\", secret: true, doc: \"OTLP metrics endpoint\" },\n { name: \"OTEL_EXPORTER_OTLP_HEADERS\", secret: true, doc: \"Shared OTLP auth headers\" },\n { name: \"OTEL_EXPORTER_OTLP_TRACES_HEADERS\", secret: true, doc: \"OTLP trace headers\" },\n { name: \"OTEL_EXPORTER_OTLP_METRICS_HEADERS\", secret: true, doc: \"OTLP metric headers\" },\n { name: \"OTEL_EXPORTER_OTLP_PROTOCOL\", doc: \"OTLP protocol; http/protobuf supported\" },\n { name: \"OTEL_EXPORTER_OTLP_TRACES_PROTOCOL\", doc: \"Trace protocol override\" },\n { name: \"OTEL_EXPORTER_OTLP_METRICS_PROTOCOL\", doc: \"Metric protocol override\" },\n { name: \"OTEL_EXPORTER_OTLP_TIMEOUT\", doc: \"Shared OTLP timeout in milliseconds\" },\n { name: \"OTEL_EXPORTER_OTLP_TRACES_TIMEOUT\", doc: \"Trace timeout in milliseconds\" },\n { name: \"OTEL_EXPORTER_OTLP_METRICS_TIMEOUT\", doc: \"Metric timeout in milliseconds\" },\n { name: \"OTEL_METRIC_EXPORT_INTERVAL\", doc: \"Metric export interval in milliseconds\" },\n { name: \"OTEL_METRIC_EXPORT_TIMEOUT\", doc: \"Metric export timeout in milliseconds\" },\n ],\n },\n {\n key: \"runtime\",\n title: \"Runtime\",\n kind: \"feature\",\n vars: [\n { name: \"STATE_DIR\", deploy: false, doc: \"State dir override (same as --state-dir)\" },\n {\n name: \"HTTP_IDLE_TIMEOUT\",\n deploy: false,\n doc: \"Idle timeout in ms for outbound HTTP streams\",\n },\n ],\n },\n];\n\ntype EnvLookup = (name: string) => string | undefined;\n\n/** A platform group activates when all required vars (and one anyOf) are set. */\nexport function platformIsActive(key: string, env: EnvLookup = readEnv): boolean {\n const group = ENV_MANIFEST.find((candidate) => candidate.key === key);\n if (!group) throw new Error(`Unknown env-manifest group: ${key}`);\n const required = group.vars.filter((spec) => spec.required);\n if (!required.every((spec) => env(spec.name))) return false;\n if (group.anyOf && !group.anyOf.some((name) => env(name))) return false;\n return true;\n}\n\nexport function activePlatformKeys(env: EnvLookup = readEnv): string[] {\n return ENV_MANIFEST.filter(\n (group) => group.kind === \"platform\" && platformIsActive(group.key, env),\n ).map((group) => group.key);\n}\n\n/** One line per platform group: the vars an operator must set to activate it. */\nfunction platformRecipe(group: EnvGroup): string {\n const required = group.vars.filter((spec) => spec.required).map((spec) => spec.name);\n const alternative = group.anyOf ? ` + ${group.anyOf.join(\" | \")}` : \"\";\n return `${group.title}: ${required.join(\" + \")}${alternative}`;\n}\n\nexport function noPlatformsMessage(): string {\n const recipes = ENV_MANIFEST.filter((group) => group.kind === \"platform\")\n .map((group) => ` ${platformRecipe(group)}`)\n .join(\"\\n\");\n return `No platform tokens found. Set one of:\\n${recipes}`;\n}\n\n/** The `--help` environment section, derived from the platform groups. */\nexport function envSummaryLines(): string[] {\n return ENV_MANIFEST.filter((group) => group.kind === \"platform\").map(\n (group) => ` ${platformRecipe(group)}`,\n );\n}\n\n/** Every var an operator may set; `deployOnly` filters to template-listed ones. */\nexport function manifestVarNames(options?: { deployOnly?: boolean }): string[] {\n return ENV_MANIFEST.flatMap((group) =>\n group.vars\n .filter((spec) => !options?.deployOnly || spec.deploy !== false)\n .map((spec) => spec.name),\n );\n}\n\n/** `mikan env` output: every group and var with set/unset status. No values. */\nexport function envReport(env: EnvLookup = readEnv): string {\n const lines: string[] = [];\n for (const group of ENV_MANIFEST) {\n const active =\n group.kind === \"platform\"\n ? platformIsActive(group.key, env)\n ? \" — active\"\n : \" — inactive\"\n : \"\";\n lines.push(`${group.title}${active}${group.doc ? ` · ${group.doc}` : \"\"}`);\n for (const spec of group.vars) {\n const status = env(spec.name) ? \"set\" : \"unset\";\n const marks = [spec.required ? \"required\" : \"\", spec.secret ? \"secret\" : \"\"]\n .filter(Boolean)\n .join(\", \");\n lines.push(\n ` ${spec.name.padEnd(36)} ${status.padEnd(6)}${marks ? ` [${marks}]` : \"\"} ${spec.doc}`,\n );\n }\n lines.push(\"\");\n }\n lines.push(\"Each var also accepts a MIKAN_-prefixed alias (e.g. MIKAN_LINK_URL).\");\n return lines.join(\"\\n\");\n}\n"]}
|
|
1
|
+
{"version":3,"file":"env-manifest.js","sourceRoot":"","sources":["../src/env-manifest.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The daemon's environment interface, declared as data — the one inventory\n * that startup validation, `mikan env`, `--help`, and the pm2 deploy\n * template check all derive from. Add a var here and every derived surface\n * picks it up; a var read anywhere else but not listed here is a bug.\n *\n * Names are the un-prefixed spelling; `readEnv` accepts a `MIKAN_`-prefixed\n * alias for each. Not covered: dynamic OAuth service keys from\n * OAUTH_SERVICES_JSON (data-driven by design) and standard proxy vars\n * (HTTPS_PROXY/HTTP_PROXY/NO_PROXY).\n */\nimport type { EnvGroup } from \"./types.js\";\n\nexport function readEnv(name: string): string | undefined {\n const raw = process.env[name]?.trim();\n if (raw) return raw;\n\n const prefixed = process.env[`MIKAN_${name}`]?.trim();\n return prefixed || undefined;\n}\n\n/** Read a standards-owned environment variable without mikan aliasing. */\nexport function readStandardEnv(name: string): string | undefined {\n return process.env[name]?.trim() || undefined;\n}\n\nexport function setEnvAliases(name: string, value: string): void {\n process.env[name] = value;\n process.env[`MIKAN_${name}`] = value;\n}\n\nexport type { EnvGroup } from \"./types.js\";\n\nexport const ENV_MANIFEST: readonly EnvGroup[] = [\n {\n key: \"slack\",\n title: \"Slack\",\n kind: \"platform\",\n vars: [\n {\n name: \"SLACK_APP_TOKEN\",\n required: true,\n secret: true,\n doc: \"Socket-mode app token (xapp-…)\",\n },\n { name: \"SLACK_BOT_TOKEN\", required: true, secret: true, doc: \"Bot token (xoxb-…)\" },\n ],\n },\n {\n key: \"telegram\",\n title: \"Telegram\",\n kind: \"platform\",\n vars: [{ name: \"TELEGRAM_BOT_TOKEN\", required: true, secret: true, doc: \"BotFather token\" }],\n },\n {\n key: \"discord\",\n title: \"Discord\",\n kind: \"platform\",\n vars: [{ name: \"DISCORD_BOT_TOKEN\", required: true, secret: true, doc: \"Bot token\" }],\n },\n {\n key: \"github\",\n title: \"GitHub\",\n kind: \"platform\",\n doc: \"Issue/PR conversations via a GitHub App (polling; optional webhook poke)\",\n vars: [\n { name: \"GITHUB_APP_ID\", required: true, doc: \"GitHub App id\" },\n { name: \"GITHUB_INSTALLATION_ID\", required: true, doc: \"App installation id\" },\n {\n name: \"GITHUB_APP_PRIVATE_KEY_PATH\",\n doc: \"Path to the App private key .pem (preferred; keep outside any repo)\",\n },\n {\n name: \"GITHUB_APP_PRIVATE_KEY\",\n secret: true,\n deploy: false,\n doc: \"App private key PEM with literal \\\\n newlines (fallback)\",\n },\n {\n name: \"GITHUB_REPOS\",\n doc: \"Comma-separated owner/repo allowlist (default: all installed)\",\n },\n { name: \"GITHUB_POLL_INTERVAL\", doc: \"Poll interval in seconds (default 60)\" },\n {\n name: \"GITHUB_WEBHOOK_SECRET\",\n secret: true,\n doc: \"Webhook secret; when set, deliveries to /github/webhook trigger an immediate poll (needs LINK_PORT)\",\n },\n ],\n anyOf: [\"GITHUB_APP_PRIVATE_KEY\", \"GITHUB_APP_PRIVATE_KEY_PATH\"],\n },\n {\n key: \"llm\",\n title: \"LLM providers\",\n kind: \"feature\",\n vars: [\n { name: \"ANTHROPIC_API_KEY\", secret: true, doc: \"Anthropic API key\" },\n { name: \"OPENAI_API_KEY\", secret: true, doc: \"OpenAI API key\" },\n ],\n },\n {\n key: \"link\",\n title: \"Link/OAuth server\",\n kind: \"feature\",\n doc: \"Credential onboarding links, session view, and the Admin portal\",\n vars: [\n { name: \"LINK_URL\", doc: \"Externally visible base URL, e.g. https://mikan.example.com\" },\n { name: \"LINK_PORT\", doc: \"Listen port (default 8181 when LINK_URL is set)\" },\n { name: \"GITHUB_OAUTH_CLIENT_ID\", doc: \"GitHub OAuth app for /login linking\" },\n { name: \"GITHUB_OAUTH_CLIENT_SECRET\", secret: true, doc: \"GitHub OAuth app secret\" },\n { name: \"GOOGLE_WORKSPACE_CLI_CLIENT_ID\", doc: \"Google Workspace OAuth client for /login\" },\n {\n name: \"GOOGLE_WORKSPACE_CLI_CLIENT_SECRET\",\n secret: true,\n doc: \"Google Workspace OAuth secret\",\n },\n { name: \"GOOGLE_CLOUD_SDK_CLIENT_ID\", doc: \"Google Cloud SDK OAuth client for /login\" },\n {\n name: \"GOOGLE_CLOUD_SDK_CLIENT_SECRET\",\n secret: true,\n doc: \"Google Cloud SDK OAuth secret\",\n },\n ],\n },\n {\n key: \"openconnector\",\n title: \"OpenConnector\",\n kind: \"feature\",\n doc: \"Host-side provisioning of conversation-scoped OpenConnector runtime tokens\",\n vars: [\n {\n name: \"OPENCONNECTOR_ENDPOINT\",\n doc: \"Deployment-owned full MCP endpoint for the reserved OpenConnector server\",\n },\n {\n name: \"OPENCONNECTOR_ADMIN_TOKEN\",\n secret: true,\n doc: \"Admin token used only to mint per-conversation runtime tokens\",\n },\n ],\n },\n {\n key: \"cloudflare\",\n title: \"Cloudflare sandbox\",\n kind: \"feature\",\n doc: \"For --sandbox=cloudflare:<id> via the bridge worker\",\n vars: [\n { name: \"CLOUDFLARE_SANDBOX_URL\", doc: \"Bridge worker URL\" },\n { name: \"CLOUDFLARE_SANDBOX_TOKEN\", secret: true, doc: \"Bridge worker auth token\" },\n ],\n },\n {\n key: \"observability\",\n title: \"Observability\",\n kind: \"feature\",\n vars: [\n { name: \"SENTRY_DSN\", secret: true, doc: \"Sentry DSN (settings.json sentry.dsn wins)\" },\n {\n name: \"SENTRY_ENVIRONMENT\",\n deploy: false,\n doc: \"Sentry environment tag (default production)\",\n },\n { name: \"SENTRY_ENABLED\", deploy: false, doc: \"Set to false to disable Sentry errors\" },\n {\n name: \"TELEMETRY_HASH_KEY\",\n secret: true,\n doc: \"Optional HMAC key for stable opaque conversation and user identifiers\",\n },\n { name: \"OTEL_SDK_DISABLED\", doc: \"Set to true to disable OpenTelemetry\" },\n { name: \"OTEL_SERVICE_NAME\", doc: \"OTLP service name (default mikan)\" },\n {\n name: \"OTEL_RESOURCE_ATTRIBUTES\",\n secret: true,\n doc: \"Comma-separated safe resource attrs\",\n },\n { name: \"OTEL_TRACES_EXPORTER\", doc: \"Trace exporter: otlp or none\" },\n { name: \"OTEL_METRICS_EXPORTER\", doc: \"Metrics exporter: otlp or none\" },\n { name: \"OTEL_EXPORTER_OTLP_ENDPOINT\", secret: true, doc: \"Base OTLP HTTP endpoint\" },\n { name: \"OTEL_EXPORTER_OTLP_TRACES_ENDPOINT\", secret: true, doc: \"OTLP traces endpoint\" },\n { name: \"OTEL_EXPORTER_OTLP_METRICS_ENDPOINT\", secret: true, doc: \"OTLP metrics endpoint\" },\n { name: \"OTEL_EXPORTER_OTLP_HEADERS\", secret: true, doc: \"Shared OTLP auth headers\" },\n { name: \"OTEL_EXPORTER_OTLP_TRACES_HEADERS\", secret: true, doc: \"OTLP trace headers\" },\n { name: \"OTEL_EXPORTER_OTLP_METRICS_HEADERS\", secret: true, doc: \"OTLP metric headers\" },\n { name: \"OTEL_EXPORTER_OTLP_PROTOCOL\", doc: \"OTLP protocol; http/protobuf supported\" },\n { name: \"OTEL_EXPORTER_OTLP_TRACES_PROTOCOL\", doc: \"Trace protocol override\" },\n { name: \"OTEL_EXPORTER_OTLP_METRICS_PROTOCOL\", doc: \"Metric protocol override\" },\n { name: \"OTEL_EXPORTER_OTLP_TIMEOUT\", doc: \"Shared OTLP timeout in milliseconds\" },\n { name: \"OTEL_EXPORTER_OTLP_TRACES_TIMEOUT\", doc: \"Trace timeout in milliseconds\" },\n { name: \"OTEL_EXPORTER_OTLP_METRICS_TIMEOUT\", doc: \"Metric timeout in milliseconds\" },\n { name: \"OTEL_METRIC_EXPORT_INTERVAL\", doc: \"Metric export interval in milliseconds\" },\n { name: \"OTEL_METRIC_EXPORT_TIMEOUT\", doc: \"Metric export timeout in milliseconds\" },\n ],\n },\n {\n key: \"runtime\",\n title: \"Runtime\",\n kind: \"feature\",\n vars: [\n { name: \"STATE_DIR\", deploy: false, doc: \"State dir override (same as --state-dir)\" },\n {\n name: \"HTTP_IDLE_TIMEOUT\",\n deploy: false,\n doc: \"Idle timeout in ms for outbound HTTP streams\",\n },\n ],\n },\n];\n\ntype EnvLookup = (name: string) => string | undefined;\n\n/** A platform group activates when all required vars (and one anyOf) are set. */\nexport function platformIsActive(key: string, env: EnvLookup = readEnv): boolean {\n const group = ENV_MANIFEST.find((candidate) => candidate.key === key);\n if (!group) throw new Error(`Unknown env-manifest group: ${key}`);\n const required = group.vars.filter((spec) => spec.required);\n if (!required.every((spec) => env(spec.name))) return false;\n if (group.anyOf && !group.anyOf.some((name) => env(name))) return false;\n return true;\n}\n\nexport function activePlatformKeys(env: EnvLookup = readEnv): string[] {\n return ENV_MANIFEST.filter(\n (group) => group.kind === \"platform\" && platformIsActive(group.key, env),\n ).map((group) => group.key);\n}\n\n/** One line per platform group: the vars an operator must set to activate it. */\nfunction platformRecipe(group: EnvGroup): string {\n const required = group.vars.filter((spec) => spec.required).map((spec) => spec.name);\n const alternative = group.anyOf ? ` + ${group.anyOf.join(\" | \")}` : \"\";\n return `${group.title}: ${required.join(\" + \")}${alternative}`;\n}\n\nexport function noPlatformsMessage(): string {\n const recipes = ENV_MANIFEST.filter((group) => group.kind === \"platform\")\n .map((group) => ` ${platformRecipe(group)}`)\n .join(\"\\n\");\n return `No platform tokens found. Set one of:\\n${recipes}`;\n}\n\n/** The `--help` environment section, derived from the platform groups. */\nexport function envSummaryLines(): string[] {\n return ENV_MANIFEST.filter((group) => group.kind === \"platform\").map(\n (group) => ` ${platformRecipe(group)}`,\n );\n}\n\n/** Every var an operator may set; `deployOnly` filters to template-listed ones. */\nexport function manifestVarNames(options?: { deployOnly?: boolean }): string[] {\n return ENV_MANIFEST.flatMap((group) =>\n group.vars\n .filter((spec) => !options?.deployOnly || spec.deploy !== false)\n .map((spec) => spec.name),\n );\n}\n\n/** `mikan env` output: every group and var with set/unset status. No values. */\nexport function envReport(env: EnvLookup = readEnv): string {\n const lines: string[] = [];\n for (const group of ENV_MANIFEST) {\n const active =\n group.kind === \"platform\"\n ? platformIsActive(group.key, env)\n ? \" — active\"\n : \" — inactive\"\n : \"\";\n lines.push(`${group.title}${active}${group.doc ? ` · ${group.doc}` : \"\"}`);\n for (const spec of group.vars) {\n const status = env(spec.name) ? \"set\" : \"unset\";\n const marks = [spec.required ? \"required\" : \"\", spec.secret ? \"secret\" : \"\"]\n .filter(Boolean)\n .join(\", \");\n lines.push(\n ` ${spec.name.padEnd(36)} ${status.padEnd(6)}${marks ? ` [${marks}]` : \"\"} ${spec.doc}`,\n );\n }\n lines.push(\"\");\n }\n lines.push(\"Each var also accepts a MIKAN_-prefixed alias (e.g. MIKAN_LINK_URL).\");\n return lines.join(\"\\n\");\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presenter.d.ts","sourceRoot":"","sources":["../../src/harness/presenter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,GAAG,EAAE,KAAK,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,KAAK,EAEV,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAOtD,OAAO,KAAK,EAAE,qBAAqB,EAA4B,MAAM,eAAe,CAAC;AACrF,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"presenter.d.ts","sourceRoot":"","sources":["../../src/harness/presenter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,GAAG,EAAE,KAAK,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,KAAK,EAEV,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAOtD,OAAO,KAAK,EAAE,qBAAqB,EAA4B,MAAM,eAAe,CAAC;AACrF,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAgEhE,wBAAgB,cAAc,IAAI,kBAAkB,CAkCnD;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,EAAE;IACP,SAAS,EAAE,qBAAqB,CAAC;IACjC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC,GACA,eAAe,CAsEjB;AAOD,wBAAgB,yBAAyB,CAAC,kBAAkB,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEzF;AAmKD,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,qBAAqB,EAChC,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,CAAC,EAAE;IACR,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,MAAM,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GACA,OAAO,CAAC,IAAI,CAAC,CAiBf;AA4DD,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6F/E;AAubD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE;IACjD,OAAO,EAAE,iBAAiB,CAAC;IAC3B,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,WAAW,EAAE,UAAU,CAAC,OAAO,2BAA2B,CAAC,CAAC;CAC7D,GAAG,IAAI,CAmBP"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { contentText } from "@earendil-works/pi-ai";
|
|
2
2
|
import { mergeSubagentProgress, parseSubagentProgressSnapshot, renderSubagentDashboard, settleSubagentProgress, } from "./tools/subagent.js";
|
|
3
|
-
import { addLifecycleEvent, metricAttributes, recordCounter, recordDistribution, recordGauge, reportUserFacingError, startOperationSpan, } from "../observability/index.js";
|
|
3
|
+
import { addLifecycleEvent, metricAttributes, recordCounter, recordDistribution, recordGauge, reportUserFacingError, startOperationSpan, telemetryIdentifier, updateActiveSpanAttribution, } from "../observability/index.js";
|
|
4
4
|
import { appendTriggerAttribution } from "./prompt.js";
|
|
5
5
|
import * as log from "../log.js";
|
|
6
6
|
const operationSpans = new WeakMap();
|
|
@@ -22,8 +22,8 @@ function endOutstandingOperationSpans(runState) {
|
|
|
22
22
|
if (!spans)
|
|
23
23
|
return;
|
|
24
24
|
const aborted = operationError("AbortError");
|
|
25
|
-
for (const
|
|
26
|
-
span.end({ error: aborted });
|
|
25
|
+
for (const entry of spans.llm)
|
|
26
|
+
entry.span.end({ error: aborted });
|
|
27
27
|
for (const span of spans.tools.values())
|
|
28
28
|
span.end({ error: aborted });
|
|
29
29
|
operationSpans.delete(runState);
|
|
@@ -53,6 +53,18 @@ export function createRunState() {
|
|
|
53
53
|
toolProgressTimer: undefined,
|
|
54
54
|
totalUsage: createEmptyUsageTotals(),
|
|
55
55
|
llmCallCount: 0,
|
|
56
|
+
toolCallCount: 0,
|
|
57
|
+
toolErrorCount: 0,
|
|
58
|
+
toolInputCharacters: 0,
|
|
59
|
+
toolOutputCharacters: 0,
|
|
60
|
+
assistantMessageCount: 0,
|
|
61
|
+
outputCharacters: 0,
|
|
62
|
+
reasoningTokens: 0,
|
|
63
|
+
retryCount: 0,
|
|
64
|
+
compactionCount: 0,
|
|
65
|
+
budgetExceeded: false,
|
|
66
|
+
firstTokenLatencyMs: undefined,
|
|
67
|
+
responseModel: undefined,
|
|
56
68
|
stopReason: "stop",
|
|
57
69
|
errorMessage: undefined,
|
|
58
70
|
reportedLlmError: false,
|
|
@@ -82,6 +94,18 @@ export function activateRunPresentation(runState, context) {
|
|
|
82
94
|
runState.toolProgressTimer = undefined;
|
|
83
95
|
runState.totalUsage = createEmptyUsageTotals();
|
|
84
96
|
runState.llmCallCount = 0;
|
|
97
|
+
runState.toolCallCount = 0;
|
|
98
|
+
runState.toolErrorCount = 0;
|
|
99
|
+
runState.toolInputCharacters = 0;
|
|
100
|
+
runState.toolOutputCharacters = 0;
|
|
101
|
+
runState.assistantMessageCount = 0;
|
|
102
|
+
runState.outputCharacters = 0;
|
|
103
|
+
runState.reasoningTokens = 0;
|
|
104
|
+
runState.retryCount = 0;
|
|
105
|
+
runState.compactionCount = 0;
|
|
106
|
+
runState.budgetExceeded = false;
|
|
107
|
+
runState.firstTokenLatencyMs = undefined;
|
|
108
|
+
runState.responseModel = undefined;
|
|
85
109
|
runState.stopReason = "stop";
|
|
86
110
|
runState.errorMessage = undefined;
|
|
87
111
|
runState.reportedLlmError = false;
|
|
@@ -320,7 +344,7 @@ async function publishFinalResponse(responder, runState, finalText, options) {
|
|
|
320
344
|
}
|
|
321
345
|
}
|
|
322
346
|
export async function reportUsageSummary(ctx) {
|
|
323
|
-
const { session, runState, responder, platform, model,
|
|
347
|
+
const { session, runState, responder, platform, model, sessionConversation, sessionUuid, waitForQueue, } = ctx;
|
|
324
348
|
const lastAssistantMessage = session.messages.findLast((message) => message.role === "assistant" && message.stopReason !== "aborted");
|
|
325
349
|
const contextTokens = lastAssistantMessage
|
|
326
350
|
? lastAssistantMessage.usage.input +
|
|
@@ -330,11 +354,13 @@ export async function reportUsageSummary(ctx) {
|
|
|
330
354
|
: 0;
|
|
331
355
|
const contextWindow = model.contextWindow || 200000;
|
|
332
356
|
const { totalUsage } = runState;
|
|
357
|
+
const channelId = telemetryIdentifier("conv", sessionConversation);
|
|
358
|
+
const sessionId = telemetryIdentifier("session_file", sessionUuid);
|
|
333
359
|
const runMetricAttributes = metricAttributes({
|
|
334
360
|
provider: model.provider,
|
|
335
|
-
model:
|
|
336
|
-
channel_id:
|
|
337
|
-
session_id:
|
|
361
|
+
model: model.id,
|
|
362
|
+
channel_id: channelId,
|
|
363
|
+
session_id: sessionId,
|
|
338
364
|
stop_reason: runState.stopReason,
|
|
339
365
|
llm_calls: runState.llmCallCount,
|
|
340
366
|
});
|
|
@@ -353,10 +379,35 @@ export async function reportUsageSummary(ctx) {
|
|
|
353
379
|
recordDistribution("agent.run.cost", totalUsage.cost.total, {
|
|
354
380
|
attributes: runMetricAttributes,
|
|
355
381
|
});
|
|
356
|
-
|
|
382
|
+
const contextUtilization = contextTokens / contextWindow;
|
|
383
|
+
recordGauge("agent.context.utilization", contextUtilization, {
|
|
357
384
|
unit: "ratio",
|
|
358
385
|
attributes: runMetricAttributes,
|
|
359
386
|
});
|
|
387
|
+
updateActiveSpanAttribution({
|
|
388
|
+
"gen_ai.request.model": model.id,
|
|
389
|
+
"gen_ai.response.model": runState.responseModel ?? model.id,
|
|
390
|
+
"gen_ai.usage.input_tokens": totalUsage.input + totalUsage.cacheRead + totalUsage.cacheWrite,
|
|
391
|
+
"gen_ai.usage.input_tokens.cached": totalUsage.cacheRead,
|
|
392
|
+
"gen_ai.usage.input_tokens.cache_write": totalUsage.cacheWrite,
|
|
393
|
+
"gen_ai.usage.output_tokens": totalUsage.output,
|
|
394
|
+
"gen_ai.usage.output_tokens.reasoning": runState.reasoningTokens,
|
|
395
|
+
"mikan.usage.cost_usd": totalUsage.cost.total,
|
|
396
|
+
"mikan.context.utilization": contextUtilization,
|
|
397
|
+
"mikan.llm.call_count": runState.llmCallCount,
|
|
398
|
+
"mikan.tool.call_count": runState.toolCallCount,
|
|
399
|
+
"mikan.tool.error_count": runState.toolErrorCount,
|
|
400
|
+
"mikan.tool.input.characters": runState.toolInputCharacters,
|
|
401
|
+
"mikan.tool.output.characters": runState.toolOutputCharacters,
|
|
402
|
+
"mikan.output.message_count": runState.assistantMessageCount,
|
|
403
|
+
"mikan.output.characters": runState.outputCharacters,
|
|
404
|
+
"mikan.retry.count": runState.retryCount,
|
|
405
|
+
"mikan.compaction.count": runState.compactionCount,
|
|
406
|
+
"mikan.budget.exceeded": runState.budgetExceeded,
|
|
407
|
+
...(runState.firstTokenLatencyMs === undefined
|
|
408
|
+
? {}
|
|
409
|
+
: { "mikan.response.first_token_ms": runState.firstTokenLatencyMs }),
|
|
410
|
+
});
|
|
360
411
|
const summary = log.logUsageSummary(runState.logCtx, runState.totalUsage, contextTokens, contextWindow);
|
|
361
412
|
if (platform.diagnostics?.showUsageSummary === true) {
|
|
362
413
|
runState.queue.enqueue(() => responder.respondDiagnostic(summary, { style: "muted" }), "usage summary");
|
|
@@ -380,10 +431,35 @@ function extractToolResultText(result) {
|
|
|
380
431
|
return result;
|
|
381
432
|
return toolResultContentText(result) ?? JSON.stringify(result);
|
|
382
433
|
}
|
|
434
|
+
function serializedLength(value) {
|
|
435
|
+
if (typeof value === "string")
|
|
436
|
+
return value.length;
|
|
437
|
+
try {
|
|
438
|
+
return JSON.stringify(value)?.length ?? 0;
|
|
439
|
+
}
|
|
440
|
+
catch {
|
|
441
|
+
return 0;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
function toolCategory(name) {
|
|
445
|
+
if (["read", "write", "edit", "bash"].includes(name))
|
|
446
|
+
return "sandbox";
|
|
447
|
+
if (name === "subagent")
|
|
448
|
+
return "agent";
|
|
449
|
+
if (name.startsWith("mcp__"))
|
|
450
|
+
return "mcp";
|
|
451
|
+
if (name.startsWith("github_"))
|
|
452
|
+
return "github";
|
|
453
|
+
if (name === "slack_blockkit")
|
|
454
|
+
return "platform";
|
|
455
|
+
return "function";
|
|
456
|
+
}
|
|
383
457
|
function handleToolStart(event, context) {
|
|
384
458
|
const { runState, responder, logCtx, queue, baseAttrs } = context;
|
|
385
459
|
const args = (event.args ?? {});
|
|
386
460
|
const label = args.label || event.toolName;
|
|
461
|
+
runState.toolCallCount += 1;
|
|
462
|
+
runState.toolInputCharacters += serializedLength(event.args);
|
|
387
463
|
runState.pendingTools.set(event.toolCallId, {
|
|
388
464
|
toolName: event.toolName,
|
|
389
465
|
args: event.args,
|
|
@@ -402,6 +478,9 @@ function handleToolStart(event, context) {
|
|
|
402
478
|
spansFor(runState).tools.set(event.toolCallId, startOperationSpan(`execute_tool ${event.toolName}`, metricAttributes({
|
|
403
479
|
"gen_ai.operation.name": "execute_tool",
|
|
404
480
|
"gen_ai.tool.name": event.toolName,
|
|
481
|
+
"gen_ai.tool.type": "function",
|
|
482
|
+
"mikan.tool.category": toolCategory(event.toolName),
|
|
483
|
+
"mikan.tool.input.characters": serializedLength(event.args),
|
|
405
484
|
"openinference.span.kind": "TOOL",
|
|
406
485
|
...baseAttrs,
|
|
407
486
|
})));
|
|
@@ -437,6 +516,10 @@ function recordToolMetrics(event, durationMs, context) {
|
|
|
437
516
|
function handleToolEnd(event, context) {
|
|
438
517
|
const { runState, responder, logCtx } = context;
|
|
439
518
|
const resultStr = extractToolResultText(event.result);
|
|
519
|
+
const outputCharacters = serializedLength(event.result);
|
|
520
|
+
runState.toolOutputCharacters += outputCharacters;
|
|
521
|
+
if (event.isError)
|
|
522
|
+
runState.toolErrorCount += 1;
|
|
440
523
|
const pending = runState.pendingTools.get(event.toolCallId);
|
|
441
524
|
const progress = runState.toolProgress.get(event.toolCallId);
|
|
442
525
|
if (progress)
|
|
@@ -456,6 +539,9 @@ function handleToolEnd(event, context) {
|
|
|
456
539
|
toolSpan?.end({
|
|
457
540
|
attributes: metricAttributes({
|
|
458
541
|
"gen_ai.tool.name": event.toolName,
|
|
542
|
+
"gen_ai.tool.type": "function",
|
|
543
|
+
"mikan.tool.category": toolCategory(event.toolName),
|
|
544
|
+
"mikan.tool.output.characters": outputCharacters,
|
|
459
545
|
"openinference.span.kind": "TOOL",
|
|
460
546
|
duration_ms: durationMs,
|
|
461
547
|
...context.baseAttrs,
|
|
@@ -476,15 +562,18 @@ function handleMessageStart(event, context) {
|
|
|
476
562
|
if (event.message.role !== "assistant")
|
|
477
563
|
return;
|
|
478
564
|
context.runState.llmCallCount += 1;
|
|
479
|
-
spansFor(context.runState).llm.push(
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
565
|
+
spansFor(context.runState).llm.push({
|
|
566
|
+
span: startOperationSpan(`chat ${context.model.id}`, metricAttributes({
|
|
567
|
+
"gen_ai.operation.name": "chat",
|
|
568
|
+
"gen_ai.provider.name": context.model.provider,
|
|
569
|
+
"gen_ai.request.model": context.model.id,
|
|
570
|
+
"openinference.span.kind": "LLM",
|
|
571
|
+
"llm.provider": context.model.provider,
|
|
572
|
+
"llm.model_name": context.model.id,
|
|
573
|
+
...context.baseAttrs,
|
|
574
|
+
})),
|
|
575
|
+
startedAt: Date.now(),
|
|
576
|
+
});
|
|
488
577
|
addLifecycleEvent("agent.llm.call.started", {
|
|
489
578
|
call_index: context.runState.llmCallCount,
|
|
490
579
|
provider: context.model.provider,
|
|
@@ -497,6 +586,11 @@ function handleMessageUpdate(event, context) {
|
|
|
497
586
|
const update = event.assistantMessageEvent;
|
|
498
587
|
if (update.type !== "text_delta" || !update.delta)
|
|
499
588
|
return;
|
|
589
|
+
const llmEntry = spansFor(context.runState).llm[0];
|
|
590
|
+
if (llmEntry && llmEntry.firstTokenAt === undefined) {
|
|
591
|
+
llmEntry.firstTokenAt = Date.now();
|
|
592
|
+
context.runState.firstTokenLatencyMs ??= llmEntry.firstTokenAt - llmEntry.startedAt;
|
|
593
|
+
}
|
|
500
594
|
if (context.responder.appendResponseDelta && !context.runState.suppressResponseDeltas) {
|
|
501
595
|
context.queue.enqueue(async () => {
|
|
502
596
|
await context.responder.appendResponseDelta?.(update.delta);
|
|
@@ -516,6 +610,8 @@ function recordAssistantUsage(message, context) {
|
|
|
516
610
|
totalUsage.cost.cacheRead += message.usage.cost.cacheRead;
|
|
517
611
|
totalUsage.cost.cacheWrite += message.usage.cost.cacheWrite;
|
|
518
612
|
totalUsage.cost.total += message.usage.cost.total;
|
|
613
|
+
context.runState.reasoningTokens += message.usage.reasoning ?? 0;
|
|
614
|
+
context.runState.responseModel = message.responseModel ?? message.model;
|
|
519
615
|
const attributes = metricAttributes({
|
|
520
616
|
provider: context.model.provider,
|
|
521
617
|
model: context.agentConfig.model,
|
|
@@ -587,27 +683,36 @@ function handleMessageEnd(event, context) {
|
|
|
587
683
|
if (event.message.role !== "assistant")
|
|
588
684
|
return;
|
|
589
685
|
const message = event.message;
|
|
686
|
+
context.runState.assistantMessageCount += 1;
|
|
687
|
+
context.runState.outputCharacters += message.content.reduce((total, part) => total + (part.type === "text" ? part.text.length : 0), 0);
|
|
590
688
|
if (message.stopReason) {
|
|
591
689
|
context.runState.stopReason = message.stopReason;
|
|
592
690
|
// The settling message clears any stale error left by a recovered retry.
|
|
593
691
|
context.runState.errorMessage = message.errorMessage;
|
|
594
692
|
}
|
|
595
693
|
recordAssistantUsage(message, context);
|
|
596
|
-
const
|
|
694
|
+
const llmEntry = spansFor(context.runState).llm.shift();
|
|
597
695
|
const inputTokens = message.usage
|
|
598
696
|
? message.usage.input + message.usage.cacheRead + message.usage.cacheWrite
|
|
599
697
|
: undefined;
|
|
600
|
-
|
|
698
|
+
llmEntry?.span.end({
|
|
601
699
|
attributes: metricAttributes({
|
|
602
700
|
"gen_ai.provider.name": context.model.provider,
|
|
603
|
-
"gen_ai.request.model": context.
|
|
701
|
+
"gen_ai.request.model": context.model.id,
|
|
702
|
+
"gen_ai.response.model": message.responseModel ?? message.model,
|
|
604
703
|
"gen_ai.usage.input_tokens": inputTokens,
|
|
605
704
|
"gen_ai.usage.output_tokens": message.usage?.output,
|
|
606
|
-
"gen_ai.usage.
|
|
607
|
-
"gen_ai.usage.cache_write
|
|
705
|
+
"gen_ai.usage.input_tokens.cached": message.usage?.cacheRead,
|
|
706
|
+
"gen_ai.usage.input_tokens.cache_write": message.usage?.cacheWrite,
|
|
707
|
+
"gen_ai.usage.output_tokens.reasoning": message.usage?.reasoning,
|
|
708
|
+
"mikan.usage.cost_usd": message.usage?.cost.total,
|
|
709
|
+
"mikan.response.first_token_ms": llmEntry?.firstTokenAt === undefined
|
|
710
|
+
? undefined
|
|
711
|
+
: llmEntry.firstTokenAt - llmEntry.startedAt,
|
|
712
|
+
"mikan.output.characters": message.content.reduce((total, part) => total + (part.type === "text" ? part.text.length : 0), 0),
|
|
608
713
|
"openinference.span.kind": "LLM",
|
|
609
714
|
"llm.provider": context.model.provider,
|
|
610
|
-
"llm.model_name": context.
|
|
715
|
+
"llm.model_name": context.model.id,
|
|
611
716
|
"llm.token_count.prompt": inputTokens,
|
|
612
717
|
"llm.token_count.completion": message.usage?.output,
|
|
613
718
|
"llm.token_count.total": inputTokens !== undefined && message.usage ? inputTokens + message.usage.output : undefined,
|
|
@@ -622,6 +727,7 @@ function handleMessageEnd(event, context) {
|
|
|
622
727
|
}
|
|
623
728
|
function handleLifecycleEvent(event, context) {
|
|
624
729
|
if (event.type === "compaction_start") {
|
|
730
|
+
context.runState.compactionCount += 1;
|
|
625
731
|
const text = "_Compacting context..._";
|
|
626
732
|
log.logInfo(`Auto-compaction started (reason: ${event.reason})`);
|
|
627
733
|
context.queue.enqueue(() => context.responder.respond(text), "compaction start");
|
|
@@ -637,11 +743,13 @@ function handleLifecycleEvent(event, context) {
|
|
|
637
743
|
return;
|
|
638
744
|
}
|
|
639
745
|
if (event.type === "auto_retry_start") {
|
|
746
|
+
context.runState.retryCount += 1;
|
|
640
747
|
log.logWarning(`Retrying (${event.attempt}/${event.maxAttempts})`, event.errorMessage);
|
|
641
748
|
const text = `_Retrying (${event.attempt}/${event.maxAttempts})..._`;
|
|
642
749
|
context.queue.enqueue(() => context.responder.respond(text), "retry");
|
|
643
750
|
return;
|
|
644
751
|
}
|
|
752
|
+
context.runState.budgetExceeded = true;
|
|
645
753
|
log.logWarning("Run stopped by budget circuit breaker", `${event.reason} (tokens=${event.tokens}, cost=${event.costUsd.toFixed(2)}, calls=${event.llmCalls}, ${event.durationMs}ms)`);
|
|
646
754
|
const text = `_Stopped: run budget exceeded (${event.reason})_`;
|
|
647
755
|
context.queue.enqueue(() => context.responder.respondDiagnostic(text, { style: "error" }), "budget exceeded");
|
|
@@ -687,8 +795,10 @@ export function attachSessionEventHandlers(params) {
|
|
|
687
795
|
logCtx: runState.logCtx,
|
|
688
796
|
queue: runState.queue,
|
|
689
797
|
baseAttrs: {
|
|
690
|
-
channel_id: runState.logCtx.conversationId,
|
|
691
|
-
session_id: runState.logCtx.sessionId
|
|
798
|
+
channel_id: telemetryIdentifier("conv", runState.logCtx.conversationId),
|
|
799
|
+
session_id: runState.logCtx.sessionId
|
|
800
|
+
? telemetryIdentifier("session_file", runState.logCtx.sessionId)
|
|
801
|
+
: undefined,
|
|
692
802
|
},
|
|
693
803
|
model,
|
|
694
804
|
agentConfig,
|