getkova 2026.4.21 → 2026.4.22
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/dist/control-ui/apple-touch-icon.png +0 -0
- package/dist/control-ui/assets/agents-CLtFQRXd.js +918 -0
- package/dist/control-ui/assets/agents-CLtFQRXd.js.map +1 -0
- package/dist/control-ui/assets/anthropic-CFEPAL-v.js +37 -0
- package/dist/control-ui/assets/anthropic-CFEPAL-v.js.map +1 -0
- package/dist/control-ui/assets/azure-openai-responses-CxiWQLmZ.js +2 -0
- package/dist/control-ui/assets/azure-openai-responses-CxiWQLmZ.js.map +1 -0
- package/dist/control-ui/assets/briefing-DS4VWpUL.js +121 -0
- package/dist/control-ui/assets/briefing-DS4VWpUL.js.map +1 -0
- package/dist/control-ui/assets/canvas-BfC_2Nqy.js +17 -0
- package/dist/control-ui/assets/canvas-BfC_2Nqy.js.map +1 -0
- package/dist/control-ui/assets/channel-config-extras-YNNd-4PG.js +2 -0
- package/dist/control-ui/assets/channel-config-extras-YNNd-4PG.js.map +1 -0
- package/dist/control-ui/assets/channels-BKdM7i5r.js +471 -0
- package/dist/control-ui/assets/channels-BKdM7i5r.js.map +1 -0
- package/dist/control-ui/assets/cron-C11m3yJi.js +928 -0
- package/dist/control-ui/assets/cron-C11m3yJi.js.map +1 -0
- package/dist/control-ui/assets/de-rLAkQOBc.js +2 -0
- package/dist/control-ui/assets/de-rLAkQOBc.js.map +1 -0
- package/dist/control-ui/assets/debug-DFf2qCcM.js +94 -0
- package/dist/control-ui/assets/debug-DFf2qCcM.js.map +1 -0
- package/dist/control-ui/assets/dist-D8DZLmCF.js +18 -0
- package/dist/control-ui/assets/dist-D8DZLmCF.js.map +1 -0
- package/dist/control-ui/assets/employees-DV-5FV4K.js +104 -0
- package/dist/control-ui/assets/employees-DV-5FV4K.js.map +1 -0
- package/dist/control-ui/assets/es-CIeD3O54.js +2 -0
- package/dist/control-ui/assets/es-CIeD3O54.js.map +1 -0
- package/dist/control-ui/assets/event-stream-B8X6sYaV.js +2 -0
- package/dist/control-ui/assets/event-stream-B8X6sYaV.js.map +1 -0
- package/dist/control-ui/assets/format-BahKhiOC.js +2 -0
- package/dist/control-ui/assets/format-BahKhiOC.js.map +1 -0
- package/dist/control-ui/assets/github-copilot-headers-CrI0CIJ7.js +2 -0
- package/dist/control-ui/assets/github-copilot-headers-CrI0CIJ7.js.map +1 -0
- package/dist/control-ui/assets/google-BT0bmsh5.js +2 -0
- package/dist/control-ui/assets/google-BT0bmsh5.js.map +1 -0
- package/dist/control-ui/assets/google-gemini-cli-BpxbH95Q.js +3 -0
- package/dist/control-ui/assets/google-gemini-cli-BpxbH95Q.js.map +1 -0
- package/dist/control-ui/assets/google-shared-CbPHVnPr.js +12 -0
- package/dist/control-ui/assets/google-shared-CbPHVnPr.js.map +1 -0
- package/dist/control-ui/assets/google-vertex-lQwbjEII.js +2 -0
- package/dist/control-ui/assets/google-vertex-lQwbjEII.js.map +1 -0
- package/dist/control-ui/assets/hash-Bt1aVMQ3.js +2 -0
- package/dist/control-ui/assets/hash-Bt1aVMQ3.js.map +1 -0
- package/dist/control-ui/assets/inbox-C4tOnlJr.js +100 -0
- package/dist/control-ui/assets/inbox-C4tOnlJr.js.map +1 -0
- package/dist/control-ui/assets/index-DYMuTfvX.css +1 -0
- package/dist/control-ui/assets/index-XGDpaFxG.js +5482 -0
- package/dist/control-ui/assets/index-XGDpaFxG.js.map +1 -0
- package/dist/control-ui/assets/instances-Cyr-tbN6.js +57 -0
- package/dist/control-ui/assets/instances-Cyr-tbN6.js.map +1 -0
- package/dist/control-ui/assets/kova-logo.png +0 -0
- package/dist/control-ui/assets/lit-zdTgzAJI.js +3 -0
- package/dist/control-ui/assets/lit-zdTgzAJI.js.map +1 -0
- package/dist/control-ui/assets/local-storage-D3baoRWx.js +2 -0
- package/dist/control-ui/assets/local-storage-D3baoRWx.js.map +1 -0
- package/dist/control-ui/assets/logs-B7--7dYP.js +74 -0
- package/dist/control-ui/assets/logs-B7--7dYP.js.map +1 -0
- package/dist/control-ui/assets/meetings-DSqn6s7n.js +185 -0
- package/dist/control-ui/assets/meetings-DSqn6s7n.js.map +1 -0
- package/dist/control-ui/assets/mistral-CBrDC_Gv.js +8 -0
- package/dist/control-ui/assets/mistral-CBrDC_Gv.js.map +1 -0
- package/dist/control-ui/assets/nodes-Cvq_sAqT.js +430 -0
- package/dist/control-ui/assets/nodes-Cvq_sAqT.js.map +1 -0
- package/dist/control-ui/assets/openai-Cn7eGqwa.js +17 -0
- package/dist/control-ui/assets/openai-Cn7eGqwa.js.map +1 -0
- package/dist/control-ui/assets/openai-codex-responses-DuhESMYF.js +8 -0
- package/dist/control-ui/assets/openai-codex-responses-DuhESMYF.js.map +1 -0
- package/dist/control-ui/assets/openai-completions-Bv33lqKL.js +6 -0
- package/dist/control-ui/assets/openai-completions-Bv33lqKL.js.map +1 -0
- package/dist/control-ui/assets/openai-responses-BPxpapOg.js +2 -0
- package/dist/control-ui/assets/openai-responses-BPxpapOg.js.map +1 -0
- package/dist/control-ui/assets/openai-responses-shared-8nKH8ywL.js +11 -0
- package/dist/control-ui/assets/openai-responses-shared-8nKH8ywL.js.map +1 -0
- package/dist/control-ui/assets/pdf-BwYFZMZM.js +57 -0
- package/dist/control-ui/assets/pdf-BwYFZMZM.js.map +1 -0
- package/dist/control-ui/assets/pdf.worker.min-BmpgcBpm.js +2 -0
- package/dist/control-ui/assets/pdf.worker.min-BmpgcBpm.js.map +1 -0
- package/dist/control-ui/assets/pdf.worker.min-C8PGFc0r.mjs +28 -0
- package/dist/control-ui/assets/preload-helper-Chd9yIcd.js +1 -0
- package/dist/control-ui/assets/pt-BR-lSsBb08k.js +2 -0
- package/dist/control-ui/assets/pt-BR-lSsBb08k.js.map +1 -0
- package/dist/control-ui/assets/routing-DizI_FiJ.js +157 -0
- package/dist/control-ui/assets/routing-DizI_FiJ.js.map +1 -0
- package/dist/control-ui/assets/sessions-N9rgJP2R.js +236 -0
- package/dist/control-ui/assets/sessions-N9rgJP2R.js.map +1 -0
- package/dist/control-ui/assets/skills-D1vP4MkL.js +280 -0
- package/dist/control-ui/assets/skills-D1vP4MkL.js.map +1 -0
- package/dist/control-ui/assets/skills-shared-Bg0Qcnkp.js +11 -0
- package/dist/control-ui/assets/skills-shared-Bg0Qcnkp.js.map +1 -0
- package/dist/control-ui/assets/transform-messages-XKqwKV3D.js +2 -0
- package/dist/control-ui/assets/transform-messages-XKqwKV3D.js.map +1 -0
- package/dist/control-ui/assets/zh-CN-C5tPG8Eu.js +2 -0
- package/dist/control-ui/assets/zh-CN-C5tPG8Eu.js.map +1 -0
- package/dist/control-ui/assets/zh-TW-CPSoC7Wz.js +2 -0
- package/dist/control-ui/assets/zh-TW-CPSoC7Wz.js.map +1 -0
- package/dist/control-ui/favicon-32.png +0 -0
- package/dist/control-ui/favicon.ico +0 -0
- package/dist/control-ui/favicon.png +0 -0
- package/dist/control-ui/favicon.svg +22 -0
- package/dist/control-ui/index.html +73 -0
- package/dist/control-ui/openclaw-canvas-auth-sw.js +57 -0
- package/package.json +1 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e,t}from"./event-stream-B8X6sYaV.js";import{g as n}from"./index-XGDpaFxG.js";import{i as r,r as i}from"./transform-messages-XKqwKV3D.js";import{t as a}from"./openai-Cn7eGqwa.js";import{n as o,r as s,t as c}from"./openai-responses-shared-8nKH8ywL.js";var l=`v1`,u=new Set([`openai`,`openai-codex`,`opencode`,`azure-openai-responses`]);function d(e){let t=new Map;if(!e)return t;for(let n of e.split(`,`)){let e=n.trim();if(!e)continue;let[r,i]=e.split(`=`,2);!r||!i||t.set(r.trim(),i.trim())}return t}function f(e,t){return t?.azureDeploymentName?t.azureDeploymentName:d({}.AZURE_OPENAI_DEPLOYMENT_NAME_MAP).get(e.id)||e.id}var p=(e,r,i)=>{let a=new t;return(async()=>{let t=f(e,i),o={role:`assistant`,content:[],api:`azure-openai-responses`,provider:e.provider,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`stop`,timestamp:Date.now()};try{let c=v(e,i?.apiKey||n(e.provider)||``,i),l=y(e,r,i,t),u=await i?.onPayload?.(l,e);u!==void 0&&(l=u);let d=await c.responses.create(l,i?.signal?{signal:i.signal}:void 0);if(a.push({type:`start`,partial:o}),await s(d,o,a,e),i?.signal?.aborted)throw Error(`Request was aborted`);if(o.stopReason===`aborted`||o.stopReason===`error`)throw Error(`An unknown error occurred`);a.push({type:`done`,reason:o.stopReason,message:o}),a.end()}catch(e){for(let e of o.content)delete e.index;o.stopReason=i?.signal?.aborted?`aborted`:`error`,o.errorMessage=e instanceof Error?e.message:JSON.stringify(e),a.push({type:`error`,reason:o.stopReason,error:o}),a.end()}})(),a},m=(t,a,o)=>{let s=o?.apiKey||n(t.provider);if(!s)throw Error(`No API key for provider: ${t.provider}`);let c=i(t,o,s),l=e(t)?o?.reasoning:r(o?.reasoning);return p(t,a,{...c,reasoningEffort:l})};function h(e){return e.replace(/\/+$/,``)}function g(e){return`https://${e}.openai.azure.com/openai/v1`}function _(e,t){let n=t?.azureApiVersion||{}.AZURE_OPENAI_API_VERSION||l,r=t?.azureBaseUrl?.trim()||{}.AZURE_OPENAI_BASE_URL?.trim()||void 0,i=t?.azureResourceName||{}.AZURE_OPENAI_RESOURCE_NAME,a=r;if(!a&&i&&(a=g(i)),!a&&e.baseUrl&&(a=e.baseUrl),!a)throw Error(`Azure OpenAI base URL is required. Set AZURE_OPENAI_BASE_URL or AZURE_OPENAI_RESOURCE_NAME, or pass azureBaseUrl, azureResourceName, or model.baseUrl.`);return{baseUrl:h(a),apiVersion:n}}function v(e,t,n){if(!t){if(!{}.AZURE_OPENAI_API_KEY)throw Error(`Azure OpenAI API key is required. Set AZURE_OPENAI_API_KEY environment variable or pass it as an argument.`);t={}.AZURE_OPENAI_API_KEY}let r={...e.headers};n?.headers&&Object.assign(r,n.headers);let{baseUrl:i,apiVersion:o}=_(e,n);return new a({apiKey:t,apiVersion:o,dangerouslyAllowBrowser:!0,defaultHeaders:r,baseURL:i})}function y(e,t,n,r){let i={model:r,input:c(e,t,u),stream:!0,prompt_cache_key:n?.sessionId};return n?.maxTokens&&(i.max_output_tokens=n?.maxTokens),n?.temperature!==void 0&&(i.temperature=n?.temperature),t.tools&&(i.tools=o(t.tools)),e.reasoning&&(n?.reasoningEffort||n?.reasoningSummary?(i.reasoning={effort:n?.reasoningEffort||`medium`,summary:n?.reasoningSummary||`auto`},i.include=[`reasoning.encrypted_content`]):i.reasoning={effort:`none`}),i}export{p as streamAzureOpenAIResponses,m as streamSimpleAzureOpenAIResponses};
|
|
2
|
+
//# sourceMappingURL=azure-openai-responses-CxiWQLmZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"azure-openai-responses-CxiWQLmZ.js","names":[],"sources":["../../../node_modules/@mariozechner/pi-ai/dist/providers/azure-openai-responses.js"],"sourcesContent":["import { AzureOpenAI } from \"openai\";\nimport { getEnvApiKey } from \"../env-api-keys.js\";\nimport { supportsXhigh } from \"../models.js\";\nimport { AssistantMessageEventStream } from \"../utils/event-stream.js\";\nimport { convertResponsesMessages, convertResponsesTools, processResponsesStream } from \"./openai-responses-shared.js\";\nimport { buildBaseOptions, clampReasoning } from \"./simple-options.js\";\nconst DEFAULT_AZURE_API_VERSION = \"v1\";\nconst AZURE_TOOL_CALL_PROVIDERS = new Set([\"openai\", \"openai-codex\", \"opencode\", \"azure-openai-responses\"]);\nfunction parseDeploymentNameMap(value) {\n const map = new Map();\n if (!value)\n return map;\n for (const entry of value.split(\",\")) {\n const trimmed = entry.trim();\n if (!trimmed)\n continue;\n const [modelId, deploymentName] = trimmed.split(\"=\", 2);\n if (!modelId || !deploymentName)\n continue;\n map.set(modelId.trim(), deploymentName.trim());\n }\n return map;\n}\nfunction resolveDeploymentName(model, options) {\n if (options?.azureDeploymentName) {\n return options.azureDeploymentName;\n }\n const mappedDeployment = parseDeploymentNameMap(process.env.AZURE_OPENAI_DEPLOYMENT_NAME_MAP).get(model.id);\n return mappedDeployment || model.id;\n}\n/**\n * Generate function for Azure OpenAI Responses API\n */\nexport const streamAzureOpenAIResponses = (model, context, options) => {\n const stream = new AssistantMessageEventStream();\n // Start async processing\n (async () => {\n const deploymentName = resolveDeploymentName(model, options);\n const output = {\n role: \"assistant\",\n content: [],\n api: \"azure-openai-responses\",\n provider: model.provider,\n model: model.id,\n usage: {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n },\n stopReason: \"stop\",\n timestamp: Date.now(),\n };\n try {\n // Create Azure OpenAI client\n const apiKey = options?.apiKey || getEnvApiKey(model.provider) || \"\";\n const client = createClient(model, apiKey, options);\n let params = buildParams(model, context, options, deploymentName);\n const nextParams = await options?.onPayload?.(params, model);\n if (nextParams !== undefined) {\n params = nextParams;\n }\n const openaiStream = await client.responses.create(params, options?.signal ? { signal: options.signal } : undefined);\n stream.push({ type: \"start\", partial: output });\n await processResponsesStream(openaiStream, output, stream, model);\n if (options?.signal?.aborted) {\n throw new Error(\"Request was aborted\");\n }\n if (output.stopReason === \"aborted\" || output.stopReason === \"error\") {\n throw new Error(\"An unknown error occurred\");\n }\n stream.push({ type: \"done\", reason: output.stopReason, message: output });\n stream.end();\n }\n catch (error) {\n for (const block of output.content)\n delete block.index;\n output.stopReason = options?.signal?.aborted ? \"aborted\" : \"error\";\n output.errorMessage = error instanceof Error ? error.message : JSON.stringify(error);\n stream.push({ type: \"error\", reason: output.stopReason, error: output });\n stream.end();\n }\n })();\n return stream;\n};\nexport const streamSimpleAzureOpenAIResponses = (model, context, options) => {\n const apiKey = options?.apiKey || getEnvApiKey(model.provider);\n if (!apiKey) {\n throw new Error(`No API key for provider: ${model.provider}`);\n }\n const base = buildBaseOptions(model, options, apiKey);\n const reasoningEffort = supportsXhigh(model) ? options?.reasoning : clampReasoning(options?.reasoning);\n return streamAzureOpenAIResponses(model, context, {\n ...base,\n reasoningEffort,\n });\n};\nfunction normalizeAzureBaseUrl(baseUrl) {\n return baseUrl.replace(/\\/+$/, \"\");\n}\nfunction buildDefaultBaseUrl(resourceName) {\n return `https://${resourceName}.openai.azure.com/openai/v1`;\n}\nfunction resolveAzureConfig(model, options) {\n const apiVersion = options?.azureApiVersion || process.env.AZURE_OPENAI_API_VERSION || DEFAULT_AZURE_API_VERSION;\n const baseUrl = options?.azureBaseUrl?.trim() || process.env.AZURE_OPENAI_BASE_URL?.trim() || undefined;\n const resourceName = options?.azureResourceName || process.env.AZURE_OPENAI_RESOURCE_NAME;\n let resolvedBaseUrl = baseUrl;\n if (!resolvedBaseUrl && resourceName) {\n resolvedBaseUrl = buildDefaultBaseUrl(resourceName);\n }\n if (!resolvedBaseUrl && model.baseUrl) {\n resolvedBaseUrl = model.baseUrl;\n }\n if (!resolvedBaseUrl) {\n throw new Error(\"Azure OpenAI base URL is required. Set AZURE_OPENAI_BASE_URL or AZURE_OPENAI_RESOURCE_NAME, or pass azureBaseUrl, azureResourceName, or model.baseUrl.\");\n }\n return {\n baseUrl: normalizeAzureBaseUrl(resolvedBaseUrl),\n apiVersion,\n };\n}\nfunction createClient(model, apiKey, options) {\n if (!apiKey) {\n if (!process.env.AZURE_OPENAI_API_KEY) {\n throw new Error(\"Azure OpenAI API key is required. Set AZURE_OPENAI_API_KEY environment variable or pass it as an argument.\");\n }\n apiKey = process.env.AZURE_OPENAI_API_KEY;\n }\n const headers = { ...model.headers };\n if (options?.headers) {\n Object.assign(headers, options.headers);\n }\n const { baseUrl, apiVersion } = resolveAzureConfig(model, options);\n return new AzureOpenAI({\n apiKey,\n apiVersion,\n dangerouslyAllowBrowser: true,\n defaultHeaders: headers,\n baseURL: baseUrl,\n });\n}\nfunction buildParams(model, context, options, deploymentName) {\n const messages = convertResponsesMessages(model, context, AZURE_TOOL_CALL_PROVIDERS);\n const params = {\n model: deploymentName,\n input: messages,\n stream: true,\n prompt_cache_key: options?.sessionId,\n };\n if (options?.maxTokens) {\n params.max_output_tokens = options?.maxTokens;\n }\n if (options?.temperature !== undefined) {\n params.temperature = options?.temperature;\n }\n if (context.tools) {\n params.tools = convertResponsesTools(context.tools);\n }\n if (model.reasoning) {\n if (options?.reasoningEffort || options?.reasoningSummary) {\n params.reasoning = {\n effort: options?.reasoningEffort || \"medium\",\n summary: options?.reasoningSummary || \"auto\",\n };\n params.include = [\"reasoning.encrypted_content\"];\n }\n else {\n params.reasoning = { effort: \"none\" };\n }\n }\n return params;\n}\n//# sourceMappingURL=azure-openai-responses.js.map"],"x_google_ignoreList":[0],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import{i as e,n as t}from"./lit-zdTgzAJI.js";import{m as n,p as r}from"./index-XGDpaFxG.js";var i=[{id:`news`,title:`Top News`,description:`Alex finds 5 headlines relevant to your interests.`},{id:`weather`,title:`Weather`,description:`Quick forecast for ${r}.`},{id:`markets`,title:`Markets`,description:`Nifty50, Sensex, and BTC opening prices.`},{id:`tasks`,title:`Tasks Reminder`,description:`Pending items pulled from HEARTBEAT.md.`},{id:`quote`,title:`Quote of the Day`,description:`One short motivational quote to start the day.`}];function a(n){return n?e`
|
|
2
|
+
<div class="callout ${n.kind===`error`?`danger`:`success`}">${n.text}</div>
|
|
3
|
+
`:t}function o(t){let n=[`☀️ Good morning! Here's your Kova briefing for ${t.previewDate}`,``];return t.form.sections.news&&n.push(`📰 TOP NEWS`,`- Headline one`,`- Headline two`,``),t.form.sections.weather&&n.push(`🌤 WEATHER`,`${r}: 31°C, clear skies`,``),t.form.sections.markets&&n.push(`📈 MARKETS`,`Nifty50, Sensex, and BTC opening snapshot`,``),t.form.sections.tasks&&n.push(`✅ TASKS`,`- Follow up on priority items from HEARTBEAT.md`,``),t.form.sections.quote&&n.push(`💬 QUOTE`,`"Small steps still move you forward."`,``),n.push(`— Sent by your Kova team`),e`
|
|
4
|
+
<div
|
|
5
|
+
style="padding: 16px; border-radius: 16px; border: 1px solid var(--border); background: var(--surface); white-space: pre-wrap; font-size: 13px; line-height: 1.6;"
|
|
6
|
+
>
|
|
7
|
+
${n.join(`
|
|
8
|
+
`)}
|
|
9
|
+
</div>
|
|
10
|
+
`}function s(t){return e`
|
|
11
|
+
<div class="callout" style="display: grid; gap: 12px;">
|
|
12
|
+
<div>
|
|
13
|
+
Connect Telegram or WhatsApp first so Kova has somewhere to deliver your morning digest.
|
|
14
|
+
</div>
|
|
15
|
+
<div class="row" style="gap: 8px; flex-wrap: wrap;">
|
|
16
|
+
<button class="btn" @click=${()=>t.onOpenChannels()}>Open Channels</button>
|
|
17
|
+
</div>
|
|
18
|
+
</div>
|
|
19
|
+
`}function c(t){let r=t.availableChannels.length>0,c=t.connected&&!t.loading&&!t.saving&&r&&Object.values(t.form.sections).some(Boolean);return e`
|
|
20
|
+
<section class="page page--settings" style="display: grid; gap: 20px;">
|
|
21
|
+
<div class="card" style="display: grid; gap: 16px; max-width: 920px;">
|
|
22
|
+
<div class="row" style="justify-content: space-between; align-items: flex-start; gap: 16px; flex-wrap: wrap;">
|
|
23
|
+
<div style="display: grid; gap: 6px;">
|
|
24
|
+
<div class="card-title">Daily Briefing</div>
|
|
25
|
+
<div class="card-sub">
|
|
26
|
+
Your AI team delivers a morning digest to your phone every day.
|
|
27
|
+
</div>
|
|
28
|
+
</div>
|
|
29
|
+
<label class="field-inline checkbox" style="font-size: 13px; align-self: center;">
|
|
30
|
+
<input
|
|
31
|
+
type="checkbox"
|
|
32
|
+
.checked=${t.form.enabled}
|
|
33
|
+
@change=${e=>t.onEnabledChange(e.target.checked)}
|
|
34
|
+
/>
|
|
35
|
+
<span>${t.form.enabled?`Briefing enabled`:`Briefing disabled`}</span>
|
|
36
|
+
</label>
|
|
37
|
+
</div>
|
|
38
|
+
<div class="muted" style="font-size: 13px;">
|
|
39
|
+
Kova saves this as one cron job and delivers the finished digest to your connected channel.
|
|
40
|
+
</div>
|
|
41
|
+
${a(t.message)}
|
|
42
|
+
</div>
|
|
43
|
+
|
|
44
|
+
<div class="card" style="display: grid; gap: 16px; max-width: 920px;">
|
|
45
|
+
<div style="display: grid; gap: 4px;">
|
|
46
|
+
<div class="card-title">Delivery Settings</div>
|
|
47
|
+
<div class="card-sub">Choose when and where your briefing arrives.</div>
|
|
48
|
+
</div>
|
|
49
|
+
${r?e`
|
|
50
|
+
<div
|
|
51
|
+
style="display: grid; gap: 16px; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));"
|
|
52
|
+
>
|
|
53
|
+
<label class="field">
|
|
54
|
+
<span>Deliver at</span>
|
|
55
|
+
<select
|
|
56
|
+
.value=${t.form.time}
|
|
57
|
+
@change=${e=>t.onTimeChange(e.target.value)}
|
|
58
|
+
?disabled=${t.saving}
|
|
59
|
+
>
|
|
60
|
+
${Array.from({length:13},(t,n)=>{let r=300+n*30,i=Math.floor(r/60),a=r%60,o=`${String(i).padStart(2,`0`)}:${String(a).padStart(2,`0`)}`,s=i%12||12,c=i<12?`AM`:`PM`;return e`<option value=${o}>${s}:${String(a).padStart(2,`0`)} ${c}</option>`})}
|
|
61
|
+
</select>
|
|
62
|
+
</label>
|
|
63
|
+
|
|
64
|
+
<label class="field">
|
|
65
|
+
<span>Send to</span>
|
|
66
|
+
<select
|
|
67
|
+
.value=${t.form.channel}
|
|
68
|
+
@change=${e=>t.onChannelChange(e.target.value)}
|
|
69
|
+
?disabled=${t.saving}
|
|
70
|
+
>
|
|
71
|
+
${t.availableChannels.map(t=>e`<option value=${t}>${n(t)}</option>`)}
|
|
72
|
+
</select>
|
|
73
|
+
</label>
|
|
74
|
+
</div>
|
|
75
|
+
<div class="muted" style="font-size: 12px;">Times are in your local timezone: ${t.timezone}</div>
|
|
76
|
+
`:s(t)}
|
|
77
|
+
</div>
|
|
78
|
+
|
|
79
|
+
<div class="card" style="display: grid; gap: 16px; max-width: 920px;">
|
|
80
|
+
<div style="display: grid; gap: 4px;">
|
|
81
|
+
<div class="card-title">Briefing Sections</div>
|
|
82
|
+
<div class="card-sub">Pick the updates Kova should assemble each morning.</div>
|
|
83
|
+
</div>
|
|
84
|
+
<div class="chip-row">
|
|
85
|
+
${i.map(n=>e`
|
|
86
|
+
<label class="chip" style="display: grid; gap: 4px; min-width: 220px; align-items: start;">
|
|
87
|
+
<span style="display: inline-flex; align-items: center; gap: 8px;">
|
|
88
|
+
<input
|
|
89
|
+
type="checkbox"
|
|
90
|
+
.checked=${t.form.sections[n.id]}
|
|
91
|
+
@change=${e=>t.onSectionChange(n.id,e.target.checked)}
|
|
92
|
+
/>
|
|
93
|
+
<span style="color: var(--text-strong);">${n.title}</span>
|
|
94
|
+
</span>
|
|
95
|
+
<span class="muted" style="font-size: 12px; line-height: 1.45;">${n.description}</span>
|
|
96
|
+
</label>
|
|
97
|
+
`)}
|
|
98
|
+
</div>
|
|
99
|
+
</div>
|
|
100
|
+
|
|
101
|
+
<div class="card" style="display: grid; gap: 16px; max-width: 920px;">
|
|
102
|
+
<div style="display: grid; gap: 4px;">
|
|
103
|
+
<div class="card-title">Preview</div>
|
|
104
|
+
<div class="card-sub">
|
|
105
|
+
This is the style your briefing will use in ${n(t.form.channel)}.
|
|
106
|
+
</div>
|
|
107
|
+
</div>
|
|
108
|
+
${o(t)}
|
|
109
|
+
</div>
|
|
110
|
+
|
|
111
|
+
<div class="row" style="gap: 10px; flex-wrap: wrap; align-items: center;">
|
|
112
|
+
<button class="btn primary" ?disabled=${!c} @click=${()=>t.onSave()}>
|
|
113
|
+
${t.saving?`Saving...`:`Save Daily Briefing`}
|
|
114
|
+
</button>
|
|
115
|
+
<span class="muted" style="font-size: 12px;">
|
|
116
|
+
${t.form.enabled?`Kova will keep the job enabled.`:`Saving will keep the job disabled.`}
|
|
117
|
+
</span>
|
|
118
|
+
</div>
|
|
119
|
+
</section>
|
|
120
|
+
`}export{c as renderBriefing};
|
|
121
|
+
//# sourceMappingURL=briefing-DS4VWpUL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"briefing-DS4VWpUL.js","names":[],"sources":["../../../ui/src/ui/views/briefing.ts"],"sourcesContent":["import { html, nothing } from \"lit\";\nimport {\n DAILY_BRIEFING_CITY,\n formatBriefingChannelLabel,\n type BriefingChannelId,\n type BriefingFormState,\n type BriefingMessage,\n type BriefingSectionId,\n} from \"../controllers/briefing.ts\";\n\ntype BriefingViewProps = {\n connected: boolean;\n loading: boolean;\n saving: boolean;\n timezone: string;\n availableChannels: BriefingChannelId[];\n form: BriefingFormState;\n message: BriefingMessage | null;\n previewDate: string;\n onEnabledChange: (next: boolean) => void;\n onTimeChange: (next: string) => void;\n onChannelChange: (next: BriefingChannelId | \"\") => void;\n onSectionChange: (section: BriefingSectionId, next: boolean) => void;\n onSave: () => Promise<void> | void;\n onOpenChannels: () => void;\n};\n\nconst SECTION_DEFINITIONS: Array<{\n id: BriefingSectionId;\n title: string;\n description: string;\n}> = [\n {\n id: \"news\",\n title: \"Top News\",\n description: \"Alex finds 5 headlines relevant to your interests.\",\n },\n {\n id: \"weather\",\n title: \"Weather\",\n description: `Quick forecast for ${DAILY_BRIEFING_CITY}.`,\n },\n {\n id: \"markets\",\n title: \"Markets\",\n description: \"Nifty50, Sensex, and BTC opening prices.\",\n },\n {\n id: \"tasks\",\n title: \"Tasks Reminder\",\n description: \"Pending items pulled from HEARTBEAT.md.\",\n },\n {\n id: \"quote\",\n title: \"Quote of the Day\",\n description: \"One short motivational quote to start the day.\",\n },\n];\n\nfunction renderMessage(message: BriefingMessage | null) {\n if (!message) {\n return nothing;\n }\n return html`\n <div class=\"callout ${message.kind === \"error\" ? \"danger\" : \"success\"}\">${message.text}</div>\n `;\n}\n\nfunction renderPreview(props: BriefingViewProps) {\n const lines = [`☀️ Good morning! Here's your Kova briefing for ${props.previewDate}`, \"\"];\n if (props.form.sections.news) {\n lines.push(\"📰 TOP NEWS\", \"- Headline one\", \"- Headline two\", \"\");\n }\n if (props.form.sections.weather) {\n lines.push(\"🌤 WEATHER\", `${DAILY_BRIEFING_CITY}: 31°C, clear skies`, \"\");\n }\n if (props.form.sections.markets) {\n lines.push(\"📈 MARKETS\", \"Nifty50, Sensex, and BTC opening snapshot\", \"\");\n }\n if (props.form.sections.tasks) {\n lines.push(\"✅ TASKS\", \"- Follow up on priority items from HEARTBEAT.md\", \"\");\n }\n if (props.form.sections.quote) {\n lines.push(\"💬 QUOTE\", '\"Small steps still move you forward.\"', \"\");\n }\n lines.push(\"— Sent by your Kova team\");\n\n return html`\n <div\n style=\"padding: 16px; border-radius: 16px; border: 1px solid var(--border); background: var(--surface); white-space: pre-wrap; font-size: 13px; line-height: 1.6;\"\n >\n ${lines.join(\"\\n\")}\n </div>\n `;\n}\n\nfunction renderNoChannelsState(props: BriefingViewProps) {\n return html`\n <div class=\"callout\" style=\"display: grid; gap: 12px;\">\n <div>\n Connect Telegram or WhatsApp first so Kova has somewhere to deliver your morning digest.\n </div>\n <div class=\"row\" style=\"gap: 8px; flex-wrap: wrap;\">\n <button class=\"btn\" @click=${() => props.onOpenChannels()}>Open Channels</button>\n </div>\n </div>\n `;\n}\n\nexport function renderBriefing(props: BriefingViewProps) {\n const hasConnectedChannel = props.availableChannels.length > 0;\n const canSave =\n props.connected &&\n !props.loading &&\n !props.saving &&\n hasConnectedChannel &&\n Object.values(props.form.sections).some(Boolean);\n\n return html`\n <section class=\"page page--settings\" style=\"display: grid; gap: 20px;\">\n <div class=\"card\" style=\"display: grid; gap: 16px; max-width: 920px;\">\n <div class=\"row\" style=\"justify-content: space-between; align-items: flex-start; gap: 16px; flex-wrap: wrap;\">\n <div style=\"display: grid; gap: 6px;\">\n <div class=\"card-title\">Daily Briefing</div>\n <div class=\"card-sub\">\n Your AI team delivers a morning digest to your phone every day.\n </div>\n </div>\n <label class=\"field-inline checkbox\" style=\"font-size: 13px; align-self: center;\">\n <input\n type=\"checkbox\"\n .checked=${props.form.enabled}\n @change=${(event: Event) =>\n props.onEnabledChange((event.target as HTMLInputElement).checked)}\n />\n <span>${props.form.enabled ? \"Briefing enabled\" : \"Briefing disabled\"}</span>\n </label>\n </div>\n <div class=\"muted\" style=\"font-size: 13px;\">\n Kova saves this as one cron job and delivers the finished digest to your connected channel.\n </div>\n ${renderMessage(props.message)}\n </div>\n\n <div class=\"card\" style=\"display: grid; gap: 16px; max-width: 920px;\">\n <div style=\"display: grid; gap: 4px;\">\n <div class=\"card-title\">Delivery Settings</div>\n <div class=\"card-sub\">Choose when and where your briefing arrives.</div>\n </div>\n ${hasConnectedChannel\n ? html`\n <div\n style=\"display: grid; gap: 16px; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));\"\n >\n <label class=\"field\">\n <span>Deliver at</span>\n <select\n .value=${props.form.time}\n @change=${(event: Event) =>\n props.onTimeChange((event.target as HTMLSelectElement).value)}\n ?disabled=${props.saving}\n >\n ${Array.from({ length: 13 }, (_, index) => {\n const totalMinutes = (5 * 60) + index * 30;\n const hour = Math.floor(totalMinutes / 60);\n const minute = totalMinutes % 60;\n const value = `${String(hour).padStart(2, \"0\")}:${String(minute).padStart(2, \"0\")}`;\n const hour12 = hour % 12 || 12;\n const meridiem = hour < 12 ? \"AM\" : \"PM\";\n return html`<option value=${value}>${hour12}:${String(minute).padStart(2, \"0\")} ${meridiem}</option>`;\n })}\n </select>\n </label>\n\n <label class=\"field\">\n <span>Send to</span>\n <select\n .value=${props.form.channel}\n @change=${(event: Event) =>\n props.onChannelChange(\n (event.target as HTMLSelectElement).value as BriefingChannelId,\n )}\n ?disabled=${props.saving}\n >\n ${props.availableChannels.map(\n (channel) =>\n html`<option value=${channel}>${formatBriefingChannelLabel(channel)}</option>`,\n )}\n </select>\n </label>\n </div>\n <div class=\"muted\" style=\"font-size: 12px;\">Times are in your local timezone: ${props.timezone}</div>\n `\n : renderNoChannelsState(props)}\n </div>\n\n <div class=\"card\" style=\"display: grid; gap: 16px; max-width: 920px;\">\n <div style=\"display: grid; gap: 4px;\">\n <div class=\"card-title\">Briefing Sections</div>\n <div class=\"card-sub\">Pick the updates Kova should assemble each morning.</div>\n </div>\n <div class=\"chip-row\">\n ${SECTION_DEFINITIONS.map(\n (section) => html`\n <label class=\"chip\" style=\"display: grid; gap: 4px; min-width: 220px; align-items: start;\">\n <span style=\"display: inline-flex; align-items: center; gap: 8px;\">\n <input\n type=\"checkbox\"\n .checked=${props.form.sections[section.id]}\n @change=${(event: Event) =>\n props.onSectionChange(section.id, (event.target as HTMLInputElement).checked)}\n />\n <span style=\"color: var(--text-strong);\">${section.title}</span>\n </span>\n <span class=\"muted\" style=\"font-size: 12px; line-height: 1.45;\">${section.description}</span>\n </label>\n `,\n )}\n </div>\n </div>\n\n <div class=\"card\" style=\"display: grid; gap: 16px; max-width: 920px;\">\n <div style=\"display: grid; gap: 4px;\">\n <div class=\"card-title\">Preview</div>\n <div class=\"card-sub\">\n This is the style your briefing will use in ${formatBriefingChannelLabel(props.form.channel)}.\n </div>\n </div>\n ${renderPreview(props)}\n </div>\n\n <div class=\"row\" style=\"gap: 10px; flex-wrap: wrap; align-items: center;\">\n <button class=\"btn primary\" ?disabled=${!canSave} @click=${() => props.onSave()}>\n ${props.saving ? \"Saving...\" : \"Save Daily Briefing\"}\n </button>\n <span class=\"muted\" style=\"font-size: 12px;\">\n ${props.form.enabled ? \"Kova will keep the job enabled.\" : \"Saving will keep the job disabled.\"}\n </span>\n </div>\n </section>\n `;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import{i as e}from"./lit-zdTgzAJI.js";function t(t){return e`
|
|
2
|
+
<section
|
|
3
|
+
class="page page--settings"
|
|
4
|
+
style="display: grid; gap: 14px; min-height: calc(100vh - 128px); align-content: start;"
|
|
5
|
+
>
|
|
6
|
+
<section class="card" style="display: grid; gap: 12px;">
|
|
7
|
+
<div style="display: grid; gap: 6px;">
|
|
8
|
+
<div class="card-title">Canvas — Coming in Desktop App</div>
|
|
9
|
+
<div class="muted">
|
|
10
|
+
The live canvas workspace will be available in the Kova desktop app. It uses a native
|
|
11
|
+
WebView for full canvas support.
|
|
12
|
+
</div>
|
|
13
|
+
</div>
|
|
14
|
+
</section>
|
|
15
|
+
</section>
|
|
16
|
+
`}export{t as renderCanvas};
|
|
17
|
+
//# sourceMappingURL=canvas-BfC_2Nqy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas-BfC_2Nqy.js","names":[],"sources":["../../../ui/src/ui/views/canvas.ts"],"sourcesContent":["import { html } from \"lit\";\nimport type { CanvasEmployeeOption, CanvasStatus } from \"../controllers/canvas.ts\";\n\nexport type CanvasProps = {\n connected: boolean;\n loading: boolean;\n status: CanvasStatus;\n frameUrl: string | null;\n selectedAgentId: string;\n employees: CanvasEmployeeOption[];\n onAgentChange: (agentId: string) => void;\n onRefresh: () => Promise<void> | void;\n onOpenInNewTab: () => Promise<void> | void;\n};\n\nexport function renderCanvas(_props: CanvasProps) {\n return html`\n <section\n class=\"page page--settings\"\n style=\"display: grid; gap: 14px; min-height: calc(100vh - 128px); align-content: start;\"\n >\n <section class=\"card\" style=\"display: grid; gap: 12px;\">\n <div style=\"display: grid; gap: 6px;\">\n <div class=\"card-title\">Canvas — Coming in Desktop App</div>\n <div class=\"muted\">\n The live canvas workspace will be available in the Kova desktop app. It uses a native\n WebView for full canvas support.\n </div>\n </div>\n </section>\n </section>\n `;\n}\n"],"mappings":"sCAeA,SAAgB,EAAa,EAAqB,CAChD,MAAO,EAAI"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function e(e,t){if(!e)return null;let n=(e.channels??{})[t];if(n&&typeof n==`object`)return n;let r=e[t];return r&&typeof r==`object`?r:null}function t(e){if(e==null)return`n/a`;if(typeof e==`string`||typeof e==`number`||typeof e==`boolean`)return String(e);try{return JSON.stringify(e)}catch{return`n/a`}}function n(n){let r=e(n.configForm,n.channelId);return r?n.fields.flatMap(e=>e in r?[{label:e,value:t(r[e])}]:[]):[]}export{e as n,n as r,t};
|
|
2
|
+
//# sourceMappingURL=channel-config-extras-YNNd-4PG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel-config-extras-YNNd-4PG.js","names":[],"sources":["../../../ui/src/ui/views/channel-config-extras.ts"],"sourcesContent":["export function resolveChannelConfigValue(\n configForm: Record<string, unknown> | null | undefined,\n channelId: string,\n): Record<string, unknown> | null {\n if (!configForm) {\n return null;\n }\n const channels = (configForm.channels ?? {}) as Record<string, unknown>;\n const fromChannels = channels[channelId];\n if (fromChannels && typeof fromChannels === \"object\") {\n return fromChannels as Record<string, unknown>;\n }\n const fallback = configForm[channelId];\n if (fallback && typeof fallback === \"object\") {\n return fallback as Record<string, unknown>;\n }\n return null;\n}\n\nexport function formatChannelExtraValue(raw: unknown): string {\n if (raw == null) {\n return \"n/a\";\n }\n if (typeof raw === \"string\" || typeof raw === \"number\" || typeof raw === \"boolean\") {\n return String(raw);\n }\n try {\n return JSON.stringify(raw);\n } catch {\n return \"n/a\";\n }\n}\n\nexport function resolveChannelExtras(params: {\n configForm: Record<string, unknown> | null | undefined;\n channelId: string;\n fields: readonly string[];\n}): Array<{ label: string; value: string }> {\n const value = resolveChannelConfigValue(params.configForm, params.channelId);\n if (!value) {\n return [];\n }\n return params.fields.flatMap((field) => {\n if (!(field in value)) {\n return [];\n }\n return [{ label: field, value: formatChannelExtraValue(value[field]) }];\n });\n}\n"],"mappings":"AAAA,SAAgB,EACd,EACA,EACgC,CAChC,GAAI,CAAC,EACH,OAAO,KAGT,IAAM,GADY,EAAW,UAAY,EAAE,EACb,GAC9B,GAAI,GAAgB,OAAO,GAAiB,SAC1C,OAAO,EAET,IAAM,EAAW,EAAW,GAI5B,OAHI,GAAY,OAAO,GAAa,SAC3B,EAEF,KAGT,SAAgB,EAAwB,EAAsB,CAC5D,GAAI,GAAO,KACT,MAAO,MAET,GAAI,OAAO,GAAQ,UAAY,OAAO,GAAQ,UAAY,OAAO,GAAQ,UACvE,OAAO,OAAO,EAAI,CAEpB,GAAI,CACF,OAAO,KAAK,UAAU,EAAI,MACpB,CACN,MAAO,OAIX,SAAgB,EAAqB,EAIO,CAC1C,IAAM,EAAQ,EAA0B,EAAO,WAAY,EAAO,UAAU,CAI5E,OAHK,EAGE,EAAO,OAAO,QAAS,GACtB,KAAS,EAGR,CAAC,CAAE,MAAO,EAAO,MAAO,EAAwB,EAAM,GAAO,CAAE,CAAC,CAF9D,EAAE,CAGX,CAPO,EAAE"}
|