@llmnative/agentico 0.1.0 → 0.2.0

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 CHANGED
@@ -1,78 +1,82 @@
1
- # @llmnative/agentico
2
-
3
- Agentic chat orchestrator for [`@llmnative/react`](https://www.npmjs.com/package/@llmnative/react) apps.
4
-
5
- Agentico is a persistent side panel: the user says what they want, the orchestrator collects the
6
- parameters in conversation and hands the work to a **subagent** registered by the host app. Every
7
- subagent also has a deterministic fallback, so the app keeps working without AI.
8
-
9
- Agentico only orchestrates. The host provides everything concrete: subagents, result
10
- destinations, reports, cross-agent tools, model-facing prompts, user-facing strings and the
11
- current scope (tenant, company, workspace…).
12
-
13
- ## Install
14
-
15
- ```bash
16
- npm install @llmnative/agentico @llmnative/react zod
17
- ```
18
-
19
- Requires Node.js 24 LTS, React 19 and `@llmnative/react` ≥ 1.20.
20
-
21
- ## Setup (once, at startup)
22
-
23
- ```tsx
24
- import { App, locales } from '@llmnative/react';
25
- import {
26
- Agentico, AgenticoProvider, AgenticoToggle,
27
- agenticoPromptsIt, agenticoTranslations, configureAgenticoPrompts,
28
- registerCrossAgentTools, registerDestinations, registerSubagents,
29
- } from '@llmnative/agentico';
30
-
31
- registerSubagents([themeSubagent, importSubagent]); // what the orchestrator can hand off to
32
- registerDestinations({ [themeLibrary.id]: themeLibrary }); // where results can be saved
33
- registerCrossAgentTools(({ collected, attachmentsRef, proxyFetch }) => [readSitemapTool(proxyFetch, collected)]);
34
- configureAgenticoPrompts({ // optional: language and host rules for the model
35
- ...agenticoPromptsIt,
36
- responseRules: [...agenticoPromptsIt.responseRules, 'A rule only this app needs.'],
37
- });
38
-
39
- <App
40
- i18n={{ locale: 'it', translations: { it: { ...locales.it, ...agenticoTranslations.it } } }}
41
- /* … */
42
- >
43
- <AgenticoProvider scope={currentCompany && { id: currentCompany.id, dataProvider, storageProvider }}>
44
- <AgenticoToggle /> {/* in the header */}
45
- <Agentico /> {/* the panel */}
46
- </AgenticoProvider>
47
- </App>
48
- ```
49
-
50
- ## Concepts
51
-
52
- | Concept | API |
53
- |---|---|
54
- | **Subagent** — a capability with commands (Zod input), an `AgentDefinition` (prompt, parse, deterministic fallback, tools) and its index route | `defineSubagent`, `registerSubagents`, `SubagentManifest` |
55
- | **Orchestrator** — reads the CLI catalog of the registered subagents, collects parameters, invokes a `<subagent>_<command>` handoff tool | built in |
56
- | **Cross-agent tools** — data-collection tools the orchestrator may call (read a sitemap, a CSV…); complete outputs go to a per-conversation `collected` scratchpad, merged into the handoff by `SubagentManifest.withCollected` | `registerCrossAgentTools` |
57
- | **Result destinations** — where a result can be saved, in the current scope | `registerDestinations`, `ResultDestination` |
58
- | **Reports** — custom result views per subagent | `registerSubagentReports` |
59
- | **Scope** — the host's current tenant/company: id + data and storage providers | `<AgenticoProvider scope>` |
60
- | **Page context** — what the user is looking at, for the orchestrator prompt | `useAgenticoPageContext`, `useSubagentComponentContext` |
61
- | **Saved chats** — one chat per saved entity, resumable | `configureEntityChatStore`, `getEntityChat`, `listEntityChats` |
62
- | **Prompts** — model-facing text (en default, it included) | `configureAgenticoPrompts`, `agenticoPromptsEn`, `agenticoPromptsIt` |
63
- | **Strings** — user-facing text, namespace `agentico` of the framework i18n (en/it/de) | `agenticoTranslations`, `I18nDict.agentico` |
64
-
65
- ## Development
66
-
67
- ```bash
68
- npm run typecheck
69
- npm test
70
- npm run build
71
- ```
72
-
73
- Changes and releases follow `docs/directives/maintainers/llm-rule-change-release.md` (CR + GitHub
74
- issue + version + npm), tracked in `.notes/`.
75
-
76
- ## License
77
-
78
- Apache-2.0
1
+ # @llmnative/agentico
2
+
3
+ Agentic chat orchestrator for [`@llmnative/react`](https://www.npmjs.com/package/@llmnative/react) apps.
4
+
5
+ Agentico is a persistent side panel: the user says what they want, the orchestrator collects the
6
+ parameters in conversation and hands the work to a **subagent** registered by the host app. Every
7
+ subagent also has a deterministic fallback, so the app keeps working without AI.
8
+
9
+ Agentico only orchestrates. The host provides everything concrete: subagents, result
10
+ destinations, reports, cross-agent tools, model-facing prompts, user-facing strings and the
11
+ current scope (tenant, company, workspace…).
12
+
13
+ ## Install
14
+
15
+ ```bash
16
+ npm install @llmnative/agentico @llmnative/react zod
17
+ ```
18
+
19
+ Requires Node.js 24 LTS, React 19 and `@llmnative/react` ≥ 1.20.
20
+
21
+ ## Setup (once, at startup)
22
+
23
+ ```tsx
24
+ import { App, locales } from '@llmnative/react';
25
+ import {
26
+ Agentico, AgenticoProvider, AgenticoToggle,
27
+ agenticoPromptsIt, agenticoTranslations, configureAgenticoPrompts,
28
+ registerCrossAgentTools, registerDestinations, registerSubagents,
29
+ } from '@llmnative/agentico';
30
+
31
+ registerSubagents([themeSubagent, importSubagent]); // what the orchestrator can hand off to
32
+ registerDestinations({ [themeLibrary.id]: themeLibrary }); // where results can be saved
33
+ registerCrossAgentTools(({ collected, attachmentsRef, proxyFetch }) => [readSitemapTool(proxyFetch, collected)]);
34
+ configureAgenticoPrompts({ // optional: language and host rules for the model
35
+ ...agenticoPromptsIt,
36
+ responseRules: [...agenticoPromptsIt.responseRules, 'A rule only this app needs.'],
37
+ });
38
+
39
+ <App
40
+ i18n={{ locale: 'it', translations: { it: { ...locales.it, ...agenticoTranslations.it } } }}
41
+ /* … */
42
+ >
43
+ <AgenticoProvider scope={currentCompany && { id: currentCompany.id, dataProvider, storageProvider }}>
44
+ <AgenticoToggle /> {/* in the header */}
45
+ <Agentico /> {/* the panel */}
46
+ </AgenticoProvider>
47
+ </App>
48
+ ```
49
+
50
+ ## Concepts
51
+
52
+ | Concept | API |
53
+ |---|---|
54
+ | **Subagent** — a capability with commands (Zod input), an `AgentDefinition` (prompt, parse, deterministic fallback, tools) and its index route | `defineSubagent`, `registerSubagents`, `SubagentManifest` |
55
+ | **Orchestrator** — reads the CLI catalog of the registered subagents, collects parameters, invokes a `<subagent>_<command>` handoff tool | built in |
56
+ | **Cross-agent tools** — data-collection tools the orchestrator may call (read a sitemap, a CSV…); complete outputs go to a per-conversation `collected` scratchpad, merged into the handoff by `SubagentManifest.withCollected` | `registerCrossAgentTools` |
57
+ | **Result destinations** — where a result can be saved, in the current scope | `registerDestinations`, `ResultDestination` |
58
+ | **Reports** — custom result views per subagent | `registerSubagentReports` |
59
+ | **Scope** — the host's current tenant/company: id + data and storage providers | `<AgenticoProvider scope>` |
60
+ | **Page context** — what the user is looking at, for the orchestrator prompt | `useAgenticoPageContext`, `useSubagentComponentContext` |
61
+ | **Saved chats** — one chat per saved entity, resumable | `configureEntityChatStore`, `getEntityChat`, `listEntityChats` |
62
+ | **Remote subagents** — turns answered by the host (a remote agent with its own memory, e.g. an opencode session), streamed with its steps; its own models in the composer, no fallback | `AgentDefinition.executor` (`AgentExecutor`, `models`, `defaultModel`) |
63
+ | **Direct start** — a page starts a subagent without the orchestrator; with `chatEntityId` its chat is saved at every turn under that entity and resumed from the history; `onlyWhenAnchored` keeps it off the other pages | `useAgentico().startSubagent`, `entityChatTaskId`, `SubagentManifest.chatEntityId`, `SubagentManifest.onlyWhenAnchored` |
64
+ | **Controls** — the actions of the prompt of a subagent (e.g. "Finish") and what the host shows above it, from a hook of the host | `registerSubagentControls` |
65
+ | **History** — chats per entity, the open one marked, archived on hover (with the host deciding what archiving does) | `SubagentManifest.onArchive`, `confirmArchive` |
66
+ | **Prompts** — model-facing text (en default, it included) | `configureAgenticoPrompts`, `agenticoPromptsEn`, `agenticoPromptsIt` |
67
+ | **Strings** — user-facing text, namespace `agentico` of the framework i18n (en/it/de) | `agenticoTranslations`, `I18nDict.agentico` |
68
+
69
+ ## Development
70
+
71
+ ```bash
72
+ npm run typecheck
73
+ npm test
74
+ npm run build
75
+ ```
76
+
77
+ Changes and releases follow `docs/directives/maintainers/llm-rule-change-release.md` (CR + GitHub
78
+ issue + version + npm), tracked in `.notes/`.
79
+
80
+ ## License
81
+
82
+ Apache-2.0
package/dist/index.js CHANGED
@@ -4,15 +4,15 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.
4
4
  `)}function M(e){return[`NAME`,` ${e.id} — ${e.label}`,``,`DESCRIPTION`,j(e.description,2),``,...e.commands.map(t=>A(e.id,t))].join(`
5
5
  `)}function N(e){return e.length===0?D().noToolsAvailable:e.map(e=>`${e.id} [${e.commands.map(e=>e.name).join(`|`)}] — ${e.label}: ${e.commands.map(e=>e.summary).join(` / `)}`).join(`
6
6
  `)}var P={id:`closing-summary`,get text(){return D().closingSummary}},F={[P.id]:P};function I(e,t){if(!t||t.length===0)return e;let n=t.map(e=>F[e]?.text).filter(e=>!!e);return n.length===0?e:`${e}\n\n${n.join(`
7
- `)}`}function L(e){if(e instanceof Error)return e.message;if(typeof e==`object`&&e){let t=e;if(typeof t.error==`string`)return t.error;if(t.error&&typeof t.error==`object`){let e=t.error;if(typeof e.message==`string`)return e.message}if(typeof t.message==`string`)return t.message;if(typeof t.status==`number`)return`HTTP ${t.status}`;try{return JSON.stringify(e)}catch{}}return String(e)}function R(e){let t=e.match(/```(?:json)?\s*\n?([\s\S]*?)```/i);if(t)return t[1].trim();let n=e.replace(/^```json\s*/i,``).replace(/^```\s*/i,``).replace(/```\s*$/,``).trim();return z(n)??n}function z(e){let t=e.search(/[{[]/);if(t===-1)return null;let n=e[t],r=n===`{`?`}`:`]`,i=0,a=!1,o=!1;for(let s=t;s<e.length;s++){let c=e[s];if(a){o?o=!1:c===`\\`?o=!0:c===`"`&&(a=!1);continue}if(c===`"`){a=!0;continue}if(c===n)i++;else if(c===r&&(i--,i===0))return e.slice(t,s+1)}return null}var B=`json-export`,V={id:B,label:`Export as JSON`,async apply(e){let t=new Blob([JSON.stringify(e,null,2)],{type:`application/json`}),n=URL.createObjectURL(t);try{let e=document.createElement(`a`);e.href=n,e.download=`tool-result-${Date.now()}.json`,e.click()}finally{URL.revokeObjectURL(n)}}},H={};function U(e){H=e}function W(){return{[V.id]:V,...H}}var G=`llmnative.agentico.entityChat`;function ee(e){G=e.storageKey}function te(e){if(!e||typeof e!=`object`)return null;let t=e;if(typeof t.entityId!=`string`)return null;let n=t.scopeId??t.tenantId;if(typeof n!=`string`)return null;let{tenantId:r,...i}=t;return{...i,scopeId:n}}function K(){try{let e=localStorage.getItem(G);if(!e)return[];let t=JSON.parse(e);return Array.isArray(t)?t.map(te).filter(e=>e!==null):[]}catch{return[]}}function ne(e){try{localStorage.setItem(G,JSON.stringify(e))}catch{}}var q=(e,t,n)=>`${e}:${t}:${n}`;function re(e,t,n){let r=q(e,t,n);return K().find(e=>q(e.scopeId,e.subagentId,e.entityId)===r)??null}function ie(e){let t=q(e.scopeId,e.subagentId,e.entityId),n=K().filter(e=>q(e.scopeId,e.subagentId,e.entityId)!==t);n.push({...e,savedAt:Date.now()}),ne(n)}function ae(e,t,n){let r=q(e,t,n);ne(K().filter(e=>q(e.scopeId,e.subagentId,e.entityId)!==r))}function J(e){return K().filter(t=>t.scopeId===e).sort((e,t)=>t.savedAt-e.savedAt)}var oe={modelLabel:`Modell`,modelsLoading:`Wird geladen…`,noModelsAvailable:`Keine Modelle verfügbar`,noProviderConnected:`Kein AI-Provider verbunden`,selectModelPlaceholder:`Modell wählen…`,orchestratorStarterHint:`Sag Agentico, was du erreichen willst — es wählt das passende Werkzeug und fragt nach den nötigen Angaben.`,orchestratorStarterPlaceholder:`Beschreibe, was du tun möchtest…`,destinationPickerTitle:`Ergebnis speichern in…`,destinationApplying:`Wird gespeichert…`,destinationNoScope:`Kein Ziel ausgewählt — vor dem Speichern eines auswählen.`,unknownDestination:`Unbekanntes Ziel: {id}`,exportJson:`Als JSON exportieren`,orchestratorUnavailable:`AI nicht verfügbar — öffne das benötigte Werkzeug direkt auf seiner Seite.`,orchestratorContinueWithoutAi:`Weiter ohne AI.`,orchestratorPreparing:`{label} wird vorbereitet…`,orchestratorCollecting:`Parameter für {label} werden gesammelt…`,thinking:`Denke nach…`,stopped:`Vom Benutzer abgebrochen.`,toolRequest:`Werkzeugausführung angefordert`,modelRequestError:`Fehler bei der Anfrage an das Modell`,noProviderResponse:`Keine Antwort vom AI-Provider.`,noActiveSession:`Keine aktive Sitzung — zuerst run() aufrufen.`,requestInProgress:`Eine andere Anfrage läuft bereits.`,invalidResponse:`Ungültige AI-Antwort.`,responseReceived:`Antwort erhalten`,noProviderAvailable:`Kein AI-Provider verfügbar.`,tooManyToolTurns:`Zu viele aufeinanderfolgende Werkzeugaufrufe — das bisher gesammelte deterministische Ergebnis wird verwendet.`,aiDisabledFallback:`AI deaktiviert — das deterministische Ergebnis wird verwendet.`,continueWithoutAiFallback:`Weiter ohne AI — das deterministische Ergebnis wird verwendet.`,newInstance:`Neue Instanz von "{label}"`,chatHistory:`Chatverlauf`,newChat:`Neuer Chat`,searchChats:`Chats durchsuchen…`,messagePlaceholder:`Nachricht schreiben…`,unsavedConversationConfirm:`Diese Unterhaltung wurde nicht gespeichert und geht verloren. Fortfahren?`,noSavedChats:`Noch keine gespeicherten Chats.`,noResults:`Keine Ergebnisse.`,retry:`Erneut versuchen`,retryMessage:`Erneut versuchen.`,continueWithoutAi:`Ohne AI fortfahren`,resumeWithAi:`Mit AI fortsetzen`,openPanel:`Agentenbereich öffnen`,closePanel:`Agentenbereich schließen`},Y={modelLabel:`Model`,modelsLoading:`Loading…`,noModelsAvailable:`No models available`,noProviderConnected:`No AI provider connected`,selectModelPlaceholder:`Choose a model…`,orchestratorStarterHint:`Tell Agentico what you want to do — it will pick the right tool and ask for what it needs.`,orchestratorStarterPlaceholder:`Describe what you want to do…`,destinationPickerTitle:`Save result to…`,destinationApplying:`Saving…`,destinationNoScope:`Nothing selected to save into — select one before saving.`,unknownDestination:`Unknown destination: {id}`,exportJson:`Export as JSON`,orchestratorUnavailable:`AI not available — open the tool you need directly from its page.`,orchestratorContinueWithoutAi:`Continuing without AI.`,orchestratorPreparing:`Preparing {label}…`,orchestratorCollecting:`Collecting the parameters for {label}…`,thinking:`Thinking…`,stopped:`Stopped by the user.`,toolRequest:`Requested to run some tools`,modelRequestError:`Error in the request to the model`,noProviderResponse:`No response from the AI provider.`,noActiveSession:`No active session — call run() first.`,requestInProgress:`Another request is already running.`,invalidResponse:`Invalid AI response.`,responseReceived:`Response received`,noProviderAvailable:`No AI provider available.`,tooManyToolTurns:`Too many consecutive tool-calling turns — using the deterministic result collected so far.`,aiDisabledFallback:`AI disabled — using the deterministic result.`,continueWithoutAiFallback:`Continuing without AI — using the deterministic result.`,newInstance:`New "{label}" instance`,chatHistory:`Chat history`,newChat:`New chat`,searchChats:`Search chats…`,messagePlaceholder:`Write a message…`,unsavedConversationConfirm:`This conversation has not been saved and will be lost. Continue?`,noSavedChats:`No saved chats yet.`,noResults:`No results.`,retry:`Retry`,retryMessage:`Retry.`,continueWithoutAi:`Continue without AI`,resumeWithAi:`Resume with AI`,openPanel:`Open agent panel`,closePanel:`Close agent panel`},se={modelLabel:`Modello`,modelsLoading:`Caricamento…`,noModelsAvailable:`Nessun modello disponibile`,noProviderConnected:`Nessun provider AI connesso`,selectModelPlaceholder:`Scegli un modello…`,orchestratorStarterHint:`Dì ad Agentico cosa vuoi fare — sceglierà lo strumento giusto e ti chiederà cosa serve.`,orchestratorStarterPlaceholder:`Descrivi cosa vuoi fare…`,destinationPickerTitle:`Salva risultato in…`,destinationApplying:`Salvataggio…`,destinationNoScope:`Nessuna destinazione selezionata — selezionane una prima di salvare.`,unknownDestination:`Destinazione sconosciuta: {id}`,exportJson:`Esporta come JSON`,orchestratorUnavailable:`AI non disponibile — apri il tool che ti serve direttamente dalla sua pagina.`,orchestratorContinueWithoutAi:`Continuo senza AI.`,orchestratorPreparing:`Preparo {label}…`,orchestratorCollecting:`Sto raccogliendo i parametri per {label}…`,thinking:`Sto pensando…`,stopped:`Interrotto dall'utente.`,toolRequest:`Richiesta di eseguire dei tool`,modelRequestError:`Errore nella richiesta al modello`,noProviderResponse:`Nessuna risposta dal provider AI.`,noActiveSession:`Nessuna sessione attiva — chiama prima run().`,requestInProgress:`Un'altra richiesta è già in corso.`,invalidResponse:`Risposta AI non valida.`,responseReceived:`Risposta ricevuta`,noProviderAvailable:`Nessun provider AI disponibile.`,tooManyToolTurns:`Troppi turni di tool-calling consecutivi — uso il risultato deterministico raccolto finora.`,aiDisabledFallback:`AI disabilitata — uso il risultato deterministico.`,continueWithoutAiFallback:`Continuo senza AI — uso il risultato deterministico.`,newInstance:`Nuova istanza di "{label}"`,chatHistory:`Storico chat`,newChat:`Nuova chat`,searchChats:`Cerca nelle chat…`,messagePlaceholder:`Scrivi un messaggio…`,unsavedConversationConfirm:`Questa conversazione non è stata salvata e andrà persa. Continuare?`,noSavedChats:`Nessuna chat salvata ancora.`,noResults:`Nessun risultato.`,retry:`Riprova`,retryMessage:`Riprova.`,continueWithoutAi:`Continua senza AI`,resumeWithAi:`Riprendi con AI`,openPanel:`Apri pannello agente`,closePanel:`Chiudi pannello agente`},ce={en:{agentico:Y},it:{agentico:se},de:{agentico:oe}};function X(){let{dict:e}=(0,l.useI18n)(),t=e.agentico;return t?{...Y,...t}:Y}var Z=`agentico-orchestrator`,le=(0,u.createContext)(null);function ue({children:e,scope:t=null}){let[n,r]=(0,u.useState)(null),i=(0,u.useRef)(null);(0,u.useEffect)(()=>{i.current=n},[n]);let[a,o]=(0,u.useState)(!1),s=(0,u.useCallback)(e=>{let t=i.current;t&&t.id!==e.id&&t.onDismiss();let n=t&&t.id===e.id&&t.savedToDisk&&e.savedToDisk===void 0?{...e,savedToDisk:!0}:e;r(n)},[]),c=(0,u.useCallback)(e=>{r(t=>t&&t.id===e?null:t)},[]),l=(0,u.useCallback)(()=>o(e=>!e),[]),f=(0,u.useCallback)(()=>o(!0),[]),[p,m]=(0,u.useState)(null),[h,_]=(0,u.useState)(void 0),[v,y]=(0,u.useState)(void 0),[b,x]=(0,u.useState)(void 0),[S,C]=(0,u.useState)(null),[w,T]=(0,u.useState)(null),[E,O]=(0,u.useState)(void 0),[k,A]=(0,u.useState)([]),j=(0,u.useCallback)((e,t,n=null)=>{A(r=>{let i=r.filter(t=>t.id!==e);return t?[...i,{id:e,text:t,card:n}]:i})},[]),M=k.length>0?k[k.length-1]:null,[N,P]=(0,u.useState)([]),F=(0,u.useCallback)((e,t)=>{P(n=>{let r=n.filter(t=>t.id!==e);return t?[...r,{id:e,...t}]:r})},[]),I=(0,u.useMemo)(()=>N.map(e=>({subagentId:e.subagentId,componentKey:e.componentKey,onResult:e.onResult,pinnedEntityId:e.pinnedEntityId})),[N]),L=(0,u.useMemo)(()=>{let e=new Map;for(let t of N)e.set(t.subagentId,{subagentId:t.subagentId,componentKey:t.componentKey,onResult:t.onResult,contextInfo:t.contextInfo});return[...e.values()]},[N]),R=(0,u.useMemo)(()=>L.map(e=>{let t=g(e.subagentId)?.componentContexts?.[e.componentKey];if(!t)return null;let n=e.contextInfo?`${t.agenticoHint}\n${e.contextInfo}`:t.agenticoHint;return{subagentId:e.subagentId,agenticoHint:n,userMessage:t.userMessage}}).filter(e=>e!==null),[L]),z=(0,u.useMemo)(()=>R.map(e=>e.userMessage),[R]),B=(0,u.useMemo)(()=>{if(R.length===0)return null;if(R.length===1)return R[0].agenticoHint;let e=R.map((e,t)=>`${t+1}. ${e.agenticoHint}`).join(`
8
- `);return`${D().multipleCandidates}\n\n${e}`},[R])??M?.text??null,V=R.length>0?null:M?.card??null,H=(0,u.useMemo)(()=>[...new Set(I.map(e=>e.subagentId))],[I]),U=H.length===1?H[0]:H.length===0?M?.card?.subagentId??null:null,W=(0,u.useCallback)((e,t)=>{f();let n=i.current;if(n?.id===`agentico-orchestrator`)return;let r=U&&n?.id.startsWith(`subagent-${U}-`)?n:void 0;T(r?{taskId:r.id,activity:[...r.precedingActivity??[],...r.agent.activity]}:null),m(e),_(t?.extraDestinations),y(t?.attachments),x(t?.model),O(t?.scopedSubagentId),C(crypto.randomUUID())},[f,U]),G=(0,u.useCallback)((e,t,n,a,o,s)=>{if(!n||!a)return;let c=i.current;if(!c||c.id!==n)return;let l=c.agent.snapshot();l&&(ie({scopeId:a,subagentId:e,entityId:t,params:o,title:s,history:l.history,activity:[...c.precedingActivity??[],...l.activity]}),r(e=>e&&e.id===n?{...e,savedToDisk:!0}:e))},[]),[ee,te]=(0,u.useState)(null),[K,ne]=(0,u.useState)(null),q=(0,u.useCallback)((e,t,n)=>{f(),te({subagentId:e,entityId:t,snapshot:n}),ne(crypto.randomUUID())},[f]),[re,ae]=(0,u.useState)(null),[J,oe]=(0,u.useState)(null),Y=(0,u.useCallback)((e,t)=>{f(),c(Z),ae({subagentId:e,extraDestinations:t}),oe(crypto.randomUUID())},[f,c]),[se,ce]=(0,u.useState)(null),[X,ue]=(0,u.useState)(null),Q=(0,u.useCallback)((e,t,n)=>{ae(null),ce({subagentId:e,params:t,extraDestinations:n}),ue(crypto.randomUUID())},[]),$=(0,u.useCallback)(()=>{let e=i.current;e&&e.onDismiss()},[]),de=(0,u.useMemo)(()=>({scope:t,task:n,isOpen:a,openTask:s,closeTask:c,toggleOpen:l,pendingGoal:p,startOrchestrator:W,pageContext:B,pageContextCard:V,setPageContext:j,scopedSubagentId:U,pendingScopedSubagentId:E,componentAnchors:I,anchoredUserMessages:z,registerComponentAnchor:F,openPanel:f,pendingExtraDestinations:h,pendingAttachments:v,pendingModel:b,orchestratorRunId:S,pendingCarryOver:w,commitEntityChat:G,resumeEntityChat:q,pendingResume:ee,resumeRunId:K,dismissForeignTask:$,pendingManualEntry:re,manualEntryRunId:J,startManualEntry:Y,pendingResumeWithAI:se,resumeWithAIRunId:X,resumeWithAI:Q}),[t,n,a,s,c,l,p,W,B,V,j,U,E,I,z,F,f,h,v,b,S,w,G,q,ee,K,$,re,J,Y,se,X,Q]);return(0,d.jsx)(le.Provider,{value:de,children:e})}function Q(){let e=(0,u.useContext)(le);if(!e)throw Error(`useAgentico must be used inside AgenticoProvider`);return e}function $(e){let t=e.search(/[{[]/);if(t===-1)return[{type:`text`,content:e}];let n=e[t],r=n===`{`?`}`:`]`,i=0,a=!1,o=!1,s=-1;for(let c=t;c<e.length;c++){let t=e[c];if(a){o?o=!1:t===`\\`?o=!0:t===`"`&&(a=!1);continue}if(t===`"`){a=!0;continue}if(t===n)i++;else if(t===r&&(i--,i===0)){s=c;break}}let c=s===-1?null:e.slice(t,s+1);if(!c||c.length<60)return[{type:`text`,content:e}];try{JSON.parse(c)}catch{return[{type:`text`,content:e}]}let l=[];t>0&&l.push({type:`text`,content:e.slice(0,t)}),l.push({type:`code`,content:c,language:`json`});let u=e.slice(s+1);return u.trim()&&l.push(...$(u)),l}function de(e){let t=[],n=/```(\w+)?\n?([\s\S]*?)```/g,r=0,i;for(;i=n.exec(e);)i.index>r&&t.push(...$(e.slice(r,i.index))),t.push({type:`code`,content:i[2].replace(/\n$/,``),language:i[1]}),r=n.lastIndex;return r<e.length&&t.push(...$(e.slice(r))),t}function fe({content:e,language:t}){let[n,r]=(0,u.useState)(!1);return(0,d.jsxs)(`div`,{className:`relative cursor-pointer rounded-md ${n?`max-h-80 overflow-y-auto`:`max-h-28 overflow-hidden`}`,onClick:()=>r(e=>!e),title:n?`Clic per comprimere`:`Clic per espandere`,children:[(0,d.jsx)(l.Code,{language:t,showCopy:n,background:`transparent`,className:`!text-[11px]`,children:e}),!n&&(0,d.jsx)(`div`,{className:`pointer-events-none absolute inset-x-0 bottom-0 h-6 bg-gradient-to-t from-muted/30 to-transparent`})]})}function pe(e){let t=[],n=/\*\*(.+?)\*\*|`([^`]+)`|\[([^\]]+)\]\(([^)]+)\)/g,r=0,i;for(;i=n.exec(e);)i.index>r&&t.push({type:`text`,content:e.slice(r,i.index)}),i[1]===void 0?i[2]===void 0?i[3]!==void 0&&t.push({type:`link`,content:i[3],href:i[4]}):t.push({type:`code`,content:i[2]}):t.push({type:`bold`,content:i[1]}),r=n.lastIndex;return r<e.length&&t.push({type:`text`,content:e.slice(r)}),t}function me({text:e}){return(0,d.jsx)(d.Fragment,{children:pe(e).map((e,t)=>e.type===`bold`?(0,d.jsx)(`strong`,{className:`font-semibold text-foreground`,children:e.content},t):e.type===`code`?(0,d.jsx)(`code`,{className:`rounded bg-muted px-1 py-0.5 font-mono text-[11px] break-words`,children:e.content},t):e.type===`link`?(0,d.jsx)(`a`,{href:e.href,target:`_blank`,rel:`noreferrer`,className:`text-primary underline underline-offset-2`,children:e.content},t):(0,d.jsx)(u.default.Fragment,{children:e.content},t))})}function he({text:e}){let t=de(e);return(0,d.jsx)(d.Fragment,{children:t.map((e,t)=>e.type===`code`?(0,d.jsx)(fe,{content:e.content,language:e.language},t):e.content.trim()&&(0,d.jsx)(`p`,{className:`whitespace-pre-wrap break-words`,children:(0,d.jsx)(me,{text:e.content})},t))})}function ge({status:e}){return e===`running`?(0,d.jsx)(`span`,{className:`inline-block h-3 w-3 shrink-0 animate-spin rounded-full border-2 border-current border-t-transparent`}):e===`done`?(0,d.jsx)(l.Icon,{name:`check`,size:12,className:`shrink-0 text-green-600`}):e===`stopped`?(0,d.jsx)(l.Icon,{name:`circle-slash`,size:12,className:`shrink-0 text-muted-foreground`}):(0,d.jsx)(l.Icon,{name:`x`,size:12,className:`shrink-0 text-destructive`})}function _e(e,t){return e.status===`running`?t.thinking:e.status===`error`?t.modelRequestError:e.status===`stopped`?t.stopped:e.detail?t.responseReceived:e.toolNames&&e.toolNames.length>0?e.toolNames.join(` · `):t.toolRequest}var ve=96;function ye({entry:e}){let t=(0,u.useRef)(null),[n,r]=(0,u.useState)(!1),[i,a]=(0,u.useState)(!1);(0,u.useLayoutEffect)(()=>{let e=t.current;e&&a(e.scrollHeight>97)},[e.detail,e.attachmentNames]);let o=i&&!n;return(0,d.jsx)(`li`,{className:`sticky top-0 z-10 flex justify-end border-b border-border/40 bg-background py-1.5`,children:(0,d.jsxs)(`div`,{className:`max-w-[85%] rounded-lg bg-primary/10 text-xs text-foreground`,children:[(0,d.jsxs)(`div`,{ref:t,className:`space-y-1 px-2.5 pt-1.5 ${o?`overflow-hidden`:``}`,style:o?{maxHeight:ve}:void 0,children:[e.attachmentNames&&e.attachmentNames.length>0&&(0,d.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:e.attachmentNames.map((e,t)=>(0,d.jsxs)(`span`,{className:`inline-flex items-center gap-1 rounded-md bg-primary/15 px-1.5 py-0.5 text-[11px] text-foreground`,children:[(0,d.jsx)(l.Icon,{name:`paperclip`,size:10,className:`shrink-0`}),(0,d.jsx)(`span`,{className:`max-w-[160px] truncate`,children:e})]},t))}),(0,d.jsx)(he,{text:e.detail??``})]}),i&&(0,d.jsxs)(`button`,{type:`button`,onClick:()=>r(e=>!e),className:`relative flex w-full items-center justify-center rounded-b-lg py-1 text-muted-foreground hover:bg-primary/15`,title:n?`Comprimi`:`Espandi`,children:[o&&(0,d.jsx)(`div`,{className:`pointer-events-none absolute inset-x-0 -top-4 h-4 bg-gradient-to-t from-primary/10 to-transparent`}),(0,d.jsx)(l.Icon,{name:n?`chevron-up`:`chevron-down`,size:12})]})]})})}function be({entry:e}){let t=X();if(e.kind===`user`)return(0,d.jsx)(ye,{entry:e});let n=e.kind===`thinking`&&e.detail?de(e.detail):[],r=n.filter(e=>e.type===`code`),i=n.filter(e=>e.type===`text`&&e.content.trim()),a=e.kind===`thinking`?_e(e,t):e.label;return(0,d.jsxs)(`li`,{className:`text-xs text-muted-foreground`,children:[(0,d.jsxs)(`div`,{className:`flex items-start gap-1.5`,children:[(0,d.jsx)(`span`,{className:`pt-px`,children:(0,d.jsx)(ge,{status:e.status})}),(0,d.jsx)(`span`,{className:`min-w-0 flex-1 whitespace-pre-wrap break-words`,children:a})]}),r.length>0&&(0,d.jsx)(`div`,{className:`mt-1 ml-[18px] space-y-1`,children:r.map((e,t)=>(0,d.jsx)(fe,{content:e.content,language:e.language},t))}),i.length>0&&(0,d.jsx)(`div`,{className:`mt-1 ml-[18px] space-y-2`,children:i.map((e,t)=>(0,d.jsx)(`p`,{className:`whitespace-pre-wrap leading-relaxed text-muted-foreground`,children:(0,d.jsx)(me,{text:e.content.trim()})},t))})]})}function xe({activity:e}){return e.length===0?null:(0,d.jsx)(`ul`,{className:`space-y-0.5`,children:e.map(e=>(0,d.jsx)(be,{entry:e},e.id))})}function Se({className:e=``}){let{isOpen:t,toggleOpen:n,task:r}=Q(),i=X(),a=r?.agent.running??!1;return(0,d.jsx)(l.ActionButton,{icon:`bot`,ariaLabel:t?i.closePanel:i.openPanel,title:t?i.closePanel:i.openPanel,onClick:n,iconClassName:a?`animate-pulse`:void 0,className:`!h-9 !w-9 !p-0 rounded-md ${t?`bg-primary/10 text-primary hover:bg-primary/15`:`bg-transparent text-muted-foreground hover:bg-accent hover:text-foreground`} ${e}`})}var Ce=`llmnative-cms.selectedAIModel`;function we(){try{return localStorage.getItem(Ce)??``}catch{return``}}function Te(e){try{e?localStorage.setItem(Ce,e):localStorage.removeItem(Ce)}catch{}}function Ee(){let e=(0,l.useAIProviderRegistry)()?.registry??{},t=Object.keys(e).length>0,[n,r]=(0,u.useState)({}),[i,a]=(0,u.useState)(!1),[o,s]=(0,u.useState)(we);return(0,u.useEffect)(()=>{if(!t){r({});return}let n=!1;return a(!0),(0,l.getAIModelCatalog)(e).then(e=>{if(n)return;r(e.modelsByProvider);let t=Object.values(e.modelsByProvider).flat();s(e=>t.some(t=>t.id===e)?e:(Te(``),``))}).catch(e=>{console.error(`useAIModelCatalog: getAIModelCatalog failed`,e),n||r({})}).finally(()=>{n||a(!1)}),()=>{n=!0}},[t,JSON.stringify(Object.keys(e).sort())]),{hasProviders:t,modelsByProvider:n,modelsLoading:i,selectedModel:o,setSelectedModel:e=>{Te(e),s(e)}}}var De=20,Oe=26e4;function ke(e){return e.filter(e=>!l.PromptUtils.isTextAttachment(e.mimeType)||e.base64.length<=Oe)}function Ae(e,t={}){let{defaultEnabled:n=!1}=t,[r,i]=(0,u.useState)(n),{hasProviders:a,modelsByProvider:o,modelsLoading:s,selectedModel:c,setSelectedModel:d}=Ee(),[f,p]=(0,u.useState)(!1),[m,h]=(0,u.useState)(null),[g,_]=(0,u.useState)(!1),[v,y]=(0,u.useState)([]),x=X(),S=(0,u.useRef)(x);S.current=x;let C=(0,u.useRef)(null),w=(0,u.useRef)(!1),T=(0,u.useRef)(null),E=()=>{T.current?.abort()},O=(0,l.useAIProviderRegistry)()?.registry??{},k=r&&c?(0,l.parseAIModelRef)(c):null,A=k?O[k.provider]:null,j=async(t,n,r)=>{let i=C.current;if(!i)return h(S.current.noActiveSession),null;let a=r?(0,l.parseAIModelRef)(r):k,o=a?O[a.provider]:null;if(!o||!a)return h(S.current.noProviderAvailable),null;n?.length&&(i.attachmentsRef.current=[...i.attachmentsRef.current??[],...n]);let s=(n??[]).filter(e=>l.PromptUtils.isTextAttachment(e.mimeType)).map(e=>e.base64.length<=Oe?`\n\n[File allegato: ${e.name}]\n${l.PromptUtils.decodeBase64Text(e.base64)}`:`\n\n[File allegato: ${e.name} — troppo grande per essere incollato qui. Usa uno dei tool di lettura file disponibili (es. list_csv_columns/extract_csv_column) per leggerne il contenuto prima di chiedere altro all'utente.]`).join(``),c=ke(n??[]),u=i.tools.map(e=>({name:e.name,description:e.description,inputSchema:b(e.inputSchema)})),d=new Map(i.tools.map(e=>[e.name,e])),f=new AbortController;T.current=f;let p=(e,t,n,r)=>y(i=>i.map(i=>i.id===e?{...i,status:t,...n===void 0?{}:{detail:n},...r===void 0?{}:{toolNames:r}}:i));try{let n=i.history,r=t;for(let t=0;t<De;t++){let l=crypto.randomUUID();y(e=>[...e,{id:l,kind:`thinking`,label:S.current.thinking,status:`running`}]);let m;try{m=await o.complete({prompt:r,model:a.model,history:n,tools:u.length?u:void 0,signal:f.signal,attachments:t===0?c:void 0,logId:i.logId})}catch(t){return i.history=[...n,...r?[{role:`user`,content:r+s}]:[]],f.signal.aborted?(p(l,`stopped`),e.fallback(i.params,i.context)):(p(l,`error`),h(L(t)),null)}if(i.history=[...n,...r?[{role:`user`,content:r+s}]:[]],!m)return f.signal.aborted?(p(l,`stopped`),e.fallback(i.params,i.context)):(p(l,`error`),h(S.current.noProviderResponse),null);if(m.type===`text`)return p(l,`done`,m.text),i.history=[...n,...r?[{role:`user`,content:r+s}]:[],{role:`assistant`,content:m.text}],e.parseResponse(m.text,i.params,i.context)||(console.error(`[useAgent] parseResponse ha restituito null — la risposta del modello non è nel formato atteso da questo subagent. Uso il fallback deterministico.`,{responseLength:m.text.length,responsePreview:m.text.length>2e3?`${m.text.slice(0,1e3)}\n…[troncato qui nel log, ${m.text.length} caratteri totali]…\n${m.text.slice(-1e3)}`:m.text,params:i.params}),h(S.current.invalidResponse),e.fallback(i.params,i.context));let g=m.toolCalls.map(e=>{let t=d.get(e.name);return t?.describeIntent??t?.describeInvocation?.(e.input)??`Chiamata: ${e.name}`});p(l,`done`,m.text||void 0,m.text?void 0:g);let _=await Promise.all(m.toolCalls.map(async e=>{let t=d.get(e.name),n=t?.describeInvocation?.(e.input)??`Chiamata: ${e.name}`;if(y(t=>[...t,{id:e.id,kind:`tool`,label:n,status:`running`}]),!t)return p(e.id,`error`),{toolCallId:e.id,name:e.name,output:`Tool sconosciuto: ${e.name}`,isError:!0};try{let n=await t.execute(e.input);return p(e.id,`done`),{toolCallId:e.id,name:e.name,output:n}}catch(t){return p(e.id,`error`),{toolCallId:e.id,name:e.name,output:L(t),isError:!0}}}));n=[...n,...r?[{role:`user`,content:r+s}]:[],{role:`assistant`,content:m.text,toolCalls:m.toolCalls},{role:`tool_result`,results:_}],r=``}let l=crypto.randomUUID();y(e=>[...e,{id:l,kind:`thinking`,label:S.current.thinking,status:`running`}]);let m;try{m=await o.complete({prompt:I(D().stopCallingTools,e.microPromptIds),model:a.model,history:n,signal:f.signal,logId:i.logId})}catch{m=null}if(m?.type===`text`){p(l,`done`,m.text),i.history=[...n,{role:`assistant`,content:m.text}];let t=e.parseResponse(m.text,i.params,i.context);if(t)return t}else p(l,f.signal.aborted?`stopped`:`error`),i.history=n;return f.signal.aborted||h(S.current.tooManyToolTurns),e.fallback(i.params,i.context)}finally{T.current=null}};return{enabled:r,setEnabled:i,hasProviders:a,selectedModel:c,setSelectedModel:d,modelsByProvider:o,modelsLoading:s,running:f,error:m,canContinue:g,activity:v,run:async(t,n)=>{if(w.current)return h(S.current.requestInProgress),null;w.current=!0,h(null),y(n?.openingMessage?[{id:crypto.randomUUID(),kind:`user`,label:`Tu`,status:`done`,detail:n.openingMessage,...n.attachments?.length?{attachmentNames:n.attachments.map(e=>e.name)}:{}}]:[]),p(!0);try{let i=await e.buildContext(t),a={current:void 0},o=e.getTools?.(t,i,a)??[];C.current={params:t,context:i,tools:o,history:[],logId:crypto.randomUUID(),attachmentsRef:a};let s=n?.model||void 0,c=s?!!O[(0,l.parseAIModelRef)(s)?.provider??``]:!!A;if(!r||!c){_(!1);let n=e.fallback(t,i);return y(t=>[...t,{id:crypto.randomUUID(),kind:`tool`,status:`done`,label:e.describeFallback?.(n)??S.current.aiDisabledFallback}]),n}_(!0);let u=n?.attachments?.length?await Promise.all(n.attachments.map(e=>l.PromptUtils.fileToAttachment(e))):void 0,d=I(e.buildPrompt(t,i),e.microPromptIds);return await j(d,u,s)}catch(e){return h(L(e)),null}finally{w.current=!1,p(!1)}},resume:async(t,n)=>{if(w.current){h(S.current.requestInProgress);return}w.current=!0,h(null),y(n.activity),p(!0);try{let i=await e.buildContext(t),a={current:void 0},o=e.getTools?.(t,i,a)??[];C.current={params:t,context:i,tools:o,history:n.history,logId:crypto.randomUUID(),attachmentsRef:a},_(r&&!!A)}catch(e){h(L(e))}finally{w.current=!1,p(!1)}},sendMessage:async(t,n)=>{if(w.current)return h(S.current.requestInProgress),null;if(h(null),!t.trim())return h(`Messaggio vuoto.`),null;let r=C.current;if(!r)return h(S.current.noActiveSession),null;w.current=!0,p(!0),y(e=>[...e,{id:crypto.randomUUID(),kind:`user`,label:`Tu`,status:`done`,detail:t,...n?.attachments?.length?{attachmentNames:n.attachments.map(e=>e.name)}:{}}]);try{let i=n?.attachments?.length?await Promise.all(n.attachments.map(e=>l.PromptUtils.fileToAttachment(e))):void 0,a=I(e.buildFollowUpPrompt(t,r.params,r.context),e.microPromptIds);return await j(a,i,n?.model||void 0)}catch(e){return h(L(e)),null}finally{w.current=!1,p(!1)}},stop:E,runFallback:()=>{let t=C.current;if(!t)return null;h(null);let n=e.fallback(t.params,t.context);return y(t=>[...t,{id:crypto.randomUUID(),kind:`tool`,status:`done`,label:e.describeFallback?.(n)??S.current.continueWithoutAiFallback}]),n},snapshot:()=>C.current?{history:C.current.history,activity:v}:null}}function je(){let e=D();return[e.responseRulesHeading,...e.responseRules.map(e=>`- ${e}`)].join(`
9
- `)}function Me(e,t,n){let r=D(),i=n?`\n${r.pageContextHeading}\n${r.pageContextIntro}\n${n}\n`:``;return`${r.orchestratorIntro}
7
+ `)}`}function L(e){if(e instanceof Error)return e.message;if(typeof e==`object`&&e){let t=e;if(typeof t.error==`string`)return t.error;if(t.error&&typeof t.error==`object`){let e=t.error;if(typeof e.message==`string`)return e.message}if(typeof t.message==`string`)return t.message;if(typeof t.status==`number`)return`HTTP ${t.status}`;try{return JSON.stringify(e)}catch{}}return String(e)}function R(e){let t=e.match(/```(?:json)?\s*\n?([\s\S]*?)```/i);if(t)return t[1].trim();let n=e.replace(/^```json\s*/i,``).replace(/^```\s*/i,``).replace(/```\s*$/,``).trim();return z(n)??n}function z(e){let t=e.search(/[{[]/);if(t===-1)return null;let n=e[t],r=n===`{`?`}`:`]`,i=0,a=!1,o=!1;for(let s=t;s<e.length;s++){let c=e[s];if(a){o?o=!1:c===`\\`?o=!0:c===`"`&&(a=!1);continue}if(c===`"`){a=!0;continue}if(c===n)i++;else if(c===r&&(i--,i===0))return e.slice(t,s+1)}return null}var B=`json-export`,V={id:B,label:`Export as JSON`,async apply(e){let t=new Blob([JSON.stringify(e,null,2)],{type:`application/json`}),n=URL.createObjectURL(t);try{let e=document.createElement(`a`);e.href=n,e.download=`tool-result-${Date.now()}.json`,e.click()}finally{URL.revokeObjectURL(n)}}},H={};function U(e){H=e}function W(){return{[V.id]:V,...H}}var G=`llmnative.agentico.entityChat`;function K(e){G=e.storageKey}function ee(e){if(!e||typeof e!=`object`)return null;let t=e;if(typeof t.entityId!=`string`)return null;let n=t.scopeId??t.tenantId;if(typeof n!=`string`)return null;let{tenantId:r,...i}=t;return{...i,scopeId:n}}function q(){try{let e=localStorage.getItem(G);if(!e)return[];let t=JSON.parse(e);return Array.isArray(t)?t.map(ee).filter(e=>e!==null):[]}catch{return[]}}function te(e){try{localStorage.setItem(G,JSON.stringify(e))}catch{}}var J=(e,t,n)=>`${e}:${t}:${n}`;function ne(e,t,n){let r=J(e,t,n);return q().find(e=>J(e.scopeId,e.subagentId,e.entityId)===r)??null}function re(e){let t=J(e.scopeId,e.subagentId,e.entityId),n=q().filter(e=>J(e.scopeId,e.subagentId,e.entityId)!==t);n.push({...e,savedAt:Date.now()}),te(n)}function ie(e,t,n){let r=J(e,t,n);te(q().filter(e=>J(e.scopeId,e.subagentId,e.entityId)!==r))}function ae(e){return q().filter(t=>t.scopeId===e).sort((e,t)=>t.savedAt-e.savedAt)}var Y=(e,t)=>`entitychat-${e}-${t}`,oe={modelLabel:`Modell`,modelsLoading:`Wird geladen…`,noModelsAvailable:`Keine Modelle verfügbar`,noProviderConnected:`Kein AI-Provider verbunden`,selectModelPlaceholder:`Modell wählen…`,orchestratorStarterHint:`Sag Agentico, was du erreichen willst — es wählt das passende Werkzeug und fragt nach den nötigen Angaben.`,orchestratorStarterPlaceholder:`Beschreibe, was du tun möchtest…`,destinationPickerTitle:`Ergebnis speichern in…`,destinationApplying:`Wird gespeichert…`,destinationNoScope:`Kein Ziel ausgewählt — vor dem Speichern eines auswählen.`,unknownDestination:`Unbekanntes Ziel: {id}`,exportJson:`Als JSON exportieren`,orchestratorUnavailable:`AI nicht verfügbar — öffne das benötigte Werkzeug direkt auf seiner Seite.`,orchestratorContinueWithoutAi:`Weiter ohne AI.`,orchestratorPreparing:`{label} wird vorbereitet…`,orchestratorCollecting:`Parameter für {label} werden gesammelt…`,thinking:`Denke nach…`,stopped:`Vom Benutzer abgebrochen.`,toolRequest:`Werkzeugausführung angefordert`,modelRequestError:`Fehler bei der Anfrage an das Modell`,noProviderResponse:`Keine Antwort vom AI-Provider.`,noActiveSession:`Keine aktive Sitzung — zuerst run() aufrufen.`,requestInProgress:`Eine andere Anfrage läuft bereits.`,invalidResponse:`Ungültige AI-Antwort.`,responseReceived:`Antwort erhalten`,noProviderAvailable:`Kein AI-Provider verfügbar.`,tooManyToolTurns:`Zu viele aufeinanderfolgende Werkzeugaufrufe — das bisher gesammelte deterministische Ergebnis wird verwendet.`,aiDisabledFallback:`AI deaktiviert — das deterministische Ergebnis wird verwendet.`,continueWithoutAiFallback:`Weiter ohne AI — das deterministische Ergebnis wird verwendet.`,newInstance:`Neue Instanz von "{label}"`,chatHistory:`Chatverlauf`,newChat:`Neuer Chat`,searchChats:`Chats durchsuchen…`,messagePlaceholder:`Nachricht schreiben…`,unsavedConversationConfirm:`Diese Unterhaltung wurde nicht gespeichert und geht verloren. Fortfahren?`,noSavedChats:`Noch keine gespeicherten Chats.`,archiveChat:`Archivieren`,noResults:`Keine Ergebnisse.`,retry:`Erneut versuchen`,retryMessage:`Erneut versuchen.`,continueWithoutAi:`Ohne AI fortfahren`,resumeWithAi:`Mit AI fortsetzen`,openPanel:`Agentenbereich öffnen`,closePanel:`Agentenbereich schließen`},X={modelLabel:`Model`,modelsLoading:`Loading…`,noModelsAvailable:`No models available`,noProviderConnected:`No AI provider connected`,selectModelPlaceholder:`Choose a model…`,orchestratorStarterHint:`Tell Agentico what you want to do — it will pick the right tool and ask for what it needs.`,orchestratorStarterPlaceholder:`Describe what you want to do…`,destinationPickerTitle:`Save result to…`,destinationApplying:`Saving…`,destinationNoScope:`Nothing selected to save into — select one before saving.`,unknownDestination:`Unknown destination: {id}`,exportJson:`Export as JSON`,orchestratorUnavailable:`AI not available — open the tool you need directly from its page.`,orchestratorContinueWithoutAi:`Continuing without AI.`,orchestratorPreparing:`Preparing {label}…`,orchestratorCollecting:`Collecting the parameters for {label}…`,thinking:`Thinking…`,stopped:`Stopped by the user.`,toolRequest:`Requested to run some tools`,modelRequestError:`Error in the request to the model`,noProviderResponse:`No response from the AI provider.`,noActiveSession:`No active session — call run() first.`,requestInProgress:`Another request is already running.`,invalidResponse:`Invalid AI response.`,responseReceived:`Response received`,noProviderAvailable:`No AI provider available.`,tooManyToolTurns:`Too many consecutive tool-calling turns — using the deterministic result collected so far.`,aiDisabledFallback:`AI disabled — using the deterministic result.`,continueWithoutAiFallback:`Continuing without AI — using the deterministic result.`,newInstance:`New "{label}" instance`,chatHistory:`Chat history`,newChat:`New chat`,searchChats:`Search chats…`,messagePlaceholder:`Write a message…`,unsavedConversationConfirm:`This conversation has not been saved and will be lost. Continue?`,noSavedChats:`No saved chats yet.`,archiveChat:`Archive`,noResults:`No results.`,retry:`Retry`,retryMessage:`Retry.`,continueWithoutAi:`Continue without AI`,resumeWithAi:`Resume with AI`,openPanel:`Open agent panel`,closePanel:`Close agent panel`},se={modelLabel:`Modello`,modelsLoading:`Caricamento…`,noModelsAvailable:`Nessun modello disponibile`,noProviderConnected:`Nessun provider AI connesso`,selectModelPlaceholder:`Scegli un modello…`,orchestratorStarterHint:`Dì ad Agentico cosa vuoi fare — sceglierà lo strumento giusto e ti chiederà cosa serve.`,orchestratorStarterPlaceholder:`Descrivi cosa vuoi fare…`,destinationPickerTitle:`Salva risultato in…`,destinationApplying:`Salvataggio…`,destinationNoScope:`Nessuna destinazione selezionata — selezionane una prima di salvare.`,unknownDestination:`Destinazione sconosciuta: {id}`,exportJson:`Esporta come JSON`,orchestratorUnavailable:`AI non disponibile — apri il tool che ti serve direttamente dalla sua pagina.`,orchestratorContinueWithoutAi:`Continuo senza AI.`,orchestratorPreparing:`Preparo {label}…`,orchestratorCollecting:`Sto raccogliendo i parametri per {label}…`,thinking:`Sto pensando…`,stopped:`Interrotto dall'utente.`,toolRequest:`Richiesta di eseguire dei tool`,modelRequestError:`Errore nella richiesta al modello`,noProviderResponse:`Nessuna risposta dal provider AI.`,noActiveSession:`Nessuna sessione attiva — chiama prima run().`,requestInProgress:`Un'altra richiesta è già in corso.`,invalidResponse:`Risposta AI non valida.`,responseReceived:`Risposta ricevuta`,noProviderAvailable:`Nessun provider AI disponibile.`,tooManyToolTurns:`Troppi turni di tool-calling consecutivi — uso il risultato deterministico raccolto finora.`,aiDisabledFallback:`AI disabilitata — uso il risultato deterministico.`,continueWithoutAiFallback:`Continuo senza AI — uso il risultato deterministico.`,newInstance:`Nuova istanza di "{label}"`,chatHistory:`Storico chat`,newChat:`Nuova chat`,searchChats:`Cerca nelle chat…`,messagePlaceholder:`Scrivi un messaggio…`,unsavedConversationConfirm:`Questa conversazione non è stata salvata e andrà persa. Continuare?`,noSavedChats:`Nessuna chat salvata ancora.`,archiveChat:`Archivia`,noResults:`Nessun risultato.`,retry:`Riprova`,retryMessage:`Riprova.`,continueWithoutAi:`Continua senza AI`,resumeWithAi:`Riprendi con AI`,openPanel:`Apri pannello agente`,closePanel:`Chiudi pannello agente`},ce={en:{agentico:X},it:{agentico:se},de:{agentico:oe}};function Z(){let{dict:e}=(0,l.useI18n)(),t=e.agentico;return t?{...X,...t}:X}var Q=`agentico-orchestrator`,le=(0,u.createContext)(null);function ue({children:e,scope:t=null}){let[n,r]=(0,u.useState)(null),i=(0,u.useRef)(null);(0,u.useEffect)(()=>{i.current=n},[n]);let[a,o]=(0,u.useState)(!1),s=(0,u.useCallback)(e=>{let t=i.current;t&&t.id!==e.id&&t.onDismiss();let n=t&&t.id===e.id&&t.savedToDisk&&e.savedToDisk===void 0?{...e,savedToDisk:!0}:e;r(n)},[]),c=(0,u.useCallback)(e=>{r(t=>t&&t.id===e?null:t)},[]),l=(0,u.useCallback)(()=>o(e=>!e),[]),f=(0,u.useCallback)(()=>o(!0),[]),[p,m]=(0,u.useState)(null),[h,_]=(0,u.useState)(void 0),[v,y]=(0,u.useState)(void 0),[b,x]=(0,u.useState)(void 0),[S,C]=(0,u.useState)(null),[w,T]=(0,u.useState)(null),[E,O]=(0,u.useState)(void 0),[k,A]=(0,u.useState)([]),j=(0,u.useCallback)((e,t,n=null)=>{A(r=>{let i=r.filter(t=>t.id!==e);return t?[...i,{id:e,text:t,card:n}]:i})},[]),M=k.length>0?k[k.length-1]:null,[N,P]=(0,u.useState)([]),F=(0,u.useCallback)((e,t)=>{P(n=>{let r=n.filter(t=>t.id!==e);return t?[...r,{id:e,...t}]:r})},[]),I=(0,u.useMemo)(()=>N.map(e=>({subagentId:e.subagentId,componentKey:e.componentKey,onResult:e.onResult,pinnedEntityId:e.pinnedEntityId})),[N]),L=(0,u.useMemo)(()=>{let e=new Map;for(let t of N)e.set(t.subagentId,{subagentId:t.subagentId,componentKey:t.componentKey,onResult:t.onResult,contextInfo:t.contextInfo});return[...e.values()]},[N]),R=(0,u.useMemo)(()=>L.map(e=>{let t=g(e.subagentId)?.componentContexts?.[e.componentKey];if(!t)return null;let n=e.contextInfo?`${t.agenticoHint}\n${e.contextInfo}`:t.agenticoHint;return{subagentId:e.subagentId,agenticoHint:n,userMessage:t.userMessage}}).filter(e=>e!==null),[L]),z=(0,u.useMemo)(()=>R.map(e=>e.userMessage),[R]),B=(0,u.useMemo)(()=>{if(R.length===0)return null;if(R.length===1)return R[0].agenticoHint;let e=R.map((e,t)=>`${t+1}. ${e.agenticoHint}`).join(`
8
+ `);return`${D().multipleCandidates}\n\n${e}`},[R])??M?.text??null,V=R.length>0?null:M?.card??null,H=(0,u.useMemo)(()=>[...new Set(I.map(e=>e.subagentId))],[I]),U=H.length===1?H[0]:H.length===0?M?.card?.subagentId??null:null,W=(0,u.useCallback)((e,t)=>{f();let n=i.current;if(n?.id===`agentico-orchestrator`)return;let r=U&&n?.id.startsWith(`subagent-${U}-`)?n:void 0;T(r?{taskId:r.id,activity:[...r.precedingActivity??[],...r.agent.activity]}:null),m(e),_(t?.extraDestinations),y(t?.attachments),x(t?.model),O(t?.scopedSubagentId),C(crypto.randomUUID())},[f,U]),G=(0,u.useCallback)((e,t,n,a,o,s)=>{if(!n||!a)return;let c=i.current;if(!c||c.id!==n)return;let l=c.agent.snapshot();l&&(re({scopeId:a,subagentId:e,entityId:t,params:o,title:s,history:l.history,activity:[...c.precedingActivity??[],...l.activity]}),r(e=>e&&e.id===n?{...e,savedToDisk:!0}:e))},[]),[K,ee]=(0,u.useState)(null),[q,te]=(0,u.useState)(null),J=(0,u.useCallback)((e,t,n)=>{f(),ee({subagentId:e,entityId:t,snapshot:n}),te(crypto.randomUUID())},[f]),[ne,ie]=(0,u.useState)(null),[ae,Y]=(0,u.useState)(null),oe=(0,u.useCallback)((e,t)=>{f(),c(Q),ie({subagentId:e,extraDestinations:t}),Y(crypto.randomUUID())},[f,c]),[X,se]=(0,u.useState)(null),[ce,Z]=(0,u.useState)(null),ue=(0,u.useCallback)((e,t,n)=>{ie(null),se({subagentId:e,params:t,extraDestinations:n}),Z(crypto.randomUUID())},[]),[$,de]=(0,u.useState)(null),[fe,pe]=(0,u.useState)(null),me=(0,u.useCallback)((e,t,n)=>{f(),de({subagentId:e,params:t,...n}),pe(crypto.randomUUID())},[f]),he=(0,u.useCallback)(()=>{let e=i.current;e&&e.onDismiss()},[]),ge=(0,u.useMemo)(()=>({scope:t,task:n,isOpen:a,openTask:s,closeTask:c,toggleOpen:l,pendingGoal:p,startOrchestrator:W,pageContext:B,pageContextCard:V,setPageContext:j,scopedSubagentId:U,pendingScopedSubagentId:E,componentAnchors:I,anchoredUserMessages:z,registerComponentAnchor:F,openPanel:f,pendingExtraDestinations:h,pendingAttachments:v,pendingModel:b,orchestratorRunId:S,pendingCarryOver:w,commitEntityChat:G,resumeEntityChat:J,pendingResume:K,resumeRunId:q,dismissForeignTask:he,pendingManualEntry:ne,manualEntryRunId:ae,startManualEntry:oe,pendingResumeWithAI:X,resumeWithAIRunId:ce,resumeWithAI:ue,startSubagent:me,pendingStart:$,startRunId:fe}),[t,n,a,s,c,l,p,W,B,V,j,U,E,I,z,F,f,h,v,b,S,w,G,J,K,q,he,ne,ae,oe,X,ce,ue,me,$,fe]);return(0,d.jsx)(le.Provider,{value:ge,children:e})}function $(){let e=(0,u.useContext)(le);if(!e)throw Error(`useAgentico must be used inside AgenticoProvider`);return e}function de(e){let t=e.search(/[{[]/);if(t===-1)return[{type:`text`,content:e}];let n=e[t],r=n===`{`?`}`:`]`,i=0,a=!1,o=!1,s=-1;for(let c=t;c<e.length;c++){let t=e[c];if(a){o?o=!1:t===`\\`?o=!0:t===`"`&&(a=!1);continue}if(t===`"`){a=!0;continue}if(t===n)i++;else if(t===r&&(i--,i===0)){s=c;break}}let c=s===-1?null:e.slice(t,s+1);if(!c||c.length<60)return[{type:`text`,content:e}];try{JSON.parse(c)}catch{return[{type:`text`,content:e}]}let l=[];t>0&&l.push({type:`text`,content:e.slice(0,t)}),l.push({type:`code`,content:c,language:`json`});let u=e.slice(s+1);return u.trim()&&l.push(...de(u)),l}function fe(e){let t=[],n=/```(\w+)?\n?([\s\S]*?)```/g,r=0,i;for(;i=n.exec(e);)i.index>r&&t.push(...de(e.slice(r,i.index))),t.push({type:`code`,content:i[2].replace(/\n$/,``),language:i[1]}),r=n.lastIndex;return r<e.length&&t.push(...de(e.slice(r))),t}function pe({content:e,language:t}){let[n,r]=(0,u.useState)(!1);return(0,d.jsxs)(`div`,{className:`relative cursor-pointer rounded-md ${n?`max-h-80 overflow-y-auto`:`max-h-28 overflow-hidden`}`,onClick:()=>r(e=>!e),title:n?`Clic per comprimere`:`Clic per espandere`,children:[(0,d.jsx)(l.Code,{language:t,showCopy:n,background:`transparent`,className:`!text-[11px]`,children:e}),!n&&(0,d.jsx)(`div`,{className:`pointer-events-none absolute inset-x-0 bottom-0 h-6 bg-gradient-to-t from-muted/30 to-transparent`})]})}function me(e){let t=[],n=/\*\*(.+?)\*\*|`([^`]+)`|\[([^\]]+)\]\(([^)]+)\)/g,r=0,i;for(;i=n.exec(e);)i.index>r&&t.push({type:`text`,content:e.slice(r,i.index)}),i[1]===void 0?i[2]===void 0?i[3]!==void 0&&t.push({type:`link`,content:i[3],href:i[4]}):t.push({type:`code`,content:i[2]}):t.push({type:`bold`,content:i[1]}),r=n.lastIndex;return r<e.length&&t.push({type:`text`,content:e.slice(r)}),t}function he({text:e}){return(0,d.jsx)(d.Fragment,{children:me(e).map((e,t)=>e.type===`bold`?(0,d.jsx)(`strong`,{className:`font-semibold text-foreground`,children:e.content},t):e.type===`code`?(0,d.jsx)(`code`,{className:`rounded bg-muted px-1 py-0.5 font-mono text-[11px] break-words`,children:e.content},t):e.type===`link`?(0,d.jsx)(`a`,{href:e.href,target:`_blank`,rel:`noreferrer`,className:`text-primary underline underline-offset-2`,children:e.content},t):(0,d.jsx)(u.default.Fragment,{children:e.content},t))})}function ge({text:e}){let t=fe(e);return(0,d.jsx)(d.Fragment,{children:t.map((e,t)=>e.type===`code`?(0,d.jsx)(pe,{content:e.content,language:e.language},t):e.content.trim()&&(0,d.jsx)(`p`,{className:`whitespace-pre-wrap break-words`,children:(0,d.jsx)(he,{text:e.content})},t))})}function _e({status:e}){return e===`running`?(0,d.jsx)(`span`,{className:`inline-block h-3 w-3 shrink-0 animate-spin rounded-full border-2 border-current border-t-transparent`}):e===`done`?(0,d.jsx)(l.Icon,{name:`check`,size:12,className:`shrink-0 text-green-600`}):e===`stopped`?(0,d.jsx)(l.Icon,{name:`circle-slash`,size:12,className:`shrink-0 text-muted-foreground`}):(0,d.jsx)(l.Icon,{name:`x`,size:12,className:`shrink-0 text-destructive`})}function ve(e,t){return e.status===`running`?t.thinking:e.status===`error`?t.modelRequestError:e.status===`stopped`?t.stopped:e.detail?t.responseReceived:e.toolNames&&e.toolNames.length>0?e.toolNames.join(` · `):t.toolRequest}var ye=96;function be({entry:e}){let t=(0,u.useRef)(null),[n,r]=(0,u.useState)(!1),[i,a]=(0,u.useState)(!1);(0,u.useLayoutEffect)(()=>{let e=t.current;e&&a(e.scrollHeight>97)},[e.detail,e.attachmentNames]);let o=i&&!n;return(0,d.jsx)(`li`,{className:`sticky top-0 z-10 flex justify-end border-b border-border/40 bg-background py-1.5`,children:(0,d.jsxs)(`div`,{className:`max-w-[85%] rounded-lg bg-primary/10 text-xs text-foreground`,children:[(0,d.jsxs)(`div`,{ref:t,className:`space-y-1 px-2.5 pt-1.5 ${o?`overflow-hidden`:``}`,style:o?{maxHeight:ye}:void 0,children:[e.attachmentNames&&e.attachmentNames.length>0&&(0,d.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:e.attachmentNames.map((e,t)=>(0,d.jsxs)(`span`,{className:`inline-flex items-center gap-1 rounded-md bg-primary/15 px-1.5 py-0.5 text-[11px] text-foreground`,children:[(0,d.jsx)(l.Icon,{name:`paperclip`,size:10,className:`shrink-0`}),(0,d.jsx)(`span`,{className:`max-w-[160px] truncate`,children:e})]},t))}),(0,d.jsx)(ge,{text:e.detail??``})]}),i&&(0,d.jsxs)(`button`,{type:`button`,onClick:()=>r(e=>!e),className:`relative flex w-full items-center justify-center rounded-b-lg py-1 text-muted-foreground hover:bg-primary/15`,title:n?`Comprimi`:`Espandi`,children:[o&&(0,d.jsx)(`div`,{className:`pointer-events-none absolute inset-x-0 -top-4 h-4 bg-gradient-to-t from-primary/10 to-transparent`}),(0,d.jsx)(l.Icon,{name:n?`chevron-up`:`chevron-down`,size:12})]})]})})}function xe({entry:e}){let t=Z();if(e.kind===`user`)return(0,d.jsx)(be,{entry:e});let n=e.kind===`thinking`&&e.detail?fe(e.detail):[],r=n.filter(e=>e.type===`code`),i=n.filter(e=>e.type===`text`&&e.content.trim()),a=e.kind===`thinking`?ve(e,t):e.label;return(0,d.jsxs)(`li`,{className:`text-xs text-muted-foreground`,children:[(0,d.jsxs)(`div`,{className:`flex items-start gap-1.5`,children:[(0,d.jsx)(`span`,{className:`pt-px`,children:(0,d.jsx)(_e,{status:e.status})}),(0,d.jsx)(`span`,{className:`min-w-0 flex-1 whitespace-pre-wrap break-words`,children:a})]}),r.length>0&&(0,d.jsx)(`div`,{className:`mt-1 ml-[18px] space-y-1`,children:r.map((e,t)=>(0,d.jsx)(pe,{content:e.content,language:e.language},t))}),i.length>0&&(0,d.jsx)(`div`,{className:`mt-1 ml-[18px] space-y-2`,children:i.map((e,t)=>(0,d.jsx)(`p`,{className:`whitespace-pre-wrap leading-relaxed text-muted-foreground`,children:(0,d.jsx)(he,{text:e.content.trim()})},t))})]})}function Se({activity:e}){return e.length===0?null:(0,d.jsx)(`ul`,{className:`space-y-0.5`,children:e.map(e=>(0,d.jsx)(xe,{entry:e},e.id))})}function Ce({className:e=``}){let{isOpen:t,toggleOpen:n,task:r}=$(),i=Z(),a=r?.agent.running??!1;return(0,d.jsx)(l.ActionButton,{icon:`bot`,ariaLabel:t?i.closePanel:i.openPanel,title:t?i.closePanel:i.openPanel,onClick:n,iconClassName:a?`animate-pulse`:void 0,className:`!h-9 !w-9 !p-0 rounded-md ${t?`bg-primary/10 text-primary hover:bg-primary/15`:`bg-transparent text-muted-foreground hover:bg-accent hover:text-foreground`} ${e}`})}var we=`llmnative-cms.selectedAIModel`;function Te(){try{return localStorage.getItem(we)??``}catch{return``}}function Ee(e){try{e?localStorage.setItem(we,e):localStorage.removeItem(we)}catch{}}function De(){let e=(0,l.useAIProviderRegistry)()?.registry??{},t=Object.keys(e).length>0,[n,r]=(0,u.useState)({}),[i,a]=(0,u.useState)(!1),[o,s]=(0,u.useState)(Te);return(0,u.useEffect)(()=>{if(!t){r({});return}let n=!1;return a(!0),(0,l.getAIModelCatalog)(e).then(e=>{if(n)return;r(e.modelsByProvider);let t=Object.values(e.modelsByProvider).flat();s(e=>t.some(t=>t.id===e)?e:(Ee(``),``))}).catch(e=>{console.error(`useAIModelCatalog: getAIModelCatalog failed`,e),n||r({})}).finally(()=>{n||a(!1)}),()=>{n=!0}},[t,JSON.stringify(Object.keys(e).sort())]),{hasProviders:t,modelsByProvider:n,modelsLoading:i,selectedModel:o,setSelectedModel:e=>{Ee(e),s(e)}}}var Oe=20,ke=26e4;function Ae(e){return e.filter(e=>!l.PromptUtils.isTextAttachment(e.mimeType)||e.base64.length<=ke)}function je(e,t={}){let{defaultEnabled:n=!1}=t,[r,i]=(0,u.useState)(n),{hasProviders:a,modelsByProvider:o,modelsLoading:s,selectedModel:c,setSelectedModel:d}=De(),[f,p]=(0,u.useState)(!1),[m,h]=(0,u.useState)(null),[g,_]=(0,u.useState)(!1),[v,y]=(0,u.useState)([]),x=Z(),S=(0,u.useRef)(x);S.current=x;let C=(0,u.useRef)(null),w=(0,u.useRef)(!1),T=(0,u.useRef)(null),E=()=>{T.current?.abort()},O=(0,l.useAIProviderRegistry)()?.registry??{},k=r&&c?(0,l.parseAIModelRef)(c):null,A=k?O[k.provider]:null,j=e.executor,M=!!j,[N,P]=(0,u.useState)([]),[F,R]=(0,u.useState)(``),z=(0,u.useRef)(``),B=e=>{z.current=e,R(e)},V=e=>{P(j?.models?.(e)??[]),B(j?.defaultModel?.(e)??``)},H=async(e,t,n)=>{let r=C.current;if(!r||!j)return h(S.current.noActiveSession),null;let i=new AbortController;T.current=i;let a=crypto.randomUUID();y(e=>[...e,{id:a,kind:`thinking`,label:S.current.thinking,status:`running`}]);let o=(e,t)=>y(n=>n.map(n=>n.id===a?{...n,status:e,...t===void 0?{}:{detail:t}}:n)),s=e=>{let t=`step-${a}-${e.id}`;y(n=>{if(n.some(e=>e.id===t))return n.map(n=>n.id===t?{...n,label:e.label,status:e.status}:n);let r=n.findIndex(e=>e.id===a),i={id:t,kind:`tool`,label:e.label,status:e.status};return r<0?[...n,i]:[...n.slice(0,r),i,...n.slice(r)]})};try{let a=await j.turn({params:r.params,context:r.context,text:e,first:t,signal:i.signal,...n||z.current?{model:n||z.current}:{},onText:e=>o(`running`,e),onStep:s});return o(`done`,a.text),r.history=[...r.history,...e?[{role:`user`,content:e}]:[],{role:`assistant`,content:a.text}],a.result??null}catch(t){return r.history=[...r.history,...e?[{role:`user`,content:e}]:[]],i.signal.aborted?(o(`stopped`),null):(o(`error`),h(L(t)),null)}finally{T.current=null}},U=async(t,n,r)=>{let i=C.current;if(!i)return h(S.current.noActiveSession),null;let a=r?(0,l.parseAIModelRef)(r):k,o=a?O[a.provider]:null;if(!o||!a)return h(S.current.noProviderAvailable),null;n?.length&&(i.attachmentsRef.current=[...i.attachmentsRef.current??[],...n]);let s=(n??[]).filter(e=>l.PromptUtils.isTextAttachment(e.mimeType)).map(e=>e.base64.length<=ke?`\n\n[File allegato: ${e.name}]\n${l.PromptUtils.decodeBase64Text(e.base64)}`:`\n\n[File allegato: ${e.name} — troppo grande per essere incollato qui. Usa uno dei tool di lettura file disponibili (es. list_csv_columns/extract_csv_column) per leggerne il contenuto prima di chiedere altro all'utente.]`).join(``),c=Ae(n??[]),u=i.tools.map(e=>({name:e.name,description:e.description,inputSchema:b(e.inputSchema)})),d=new Map(i.tools.map(e=>[e.name,e])),f=new AbortController;T.current=f;let p=(e,t,n,r)=>y(i=>i.map(i=>i.id===e?{...i,status:t,...n===void 0?{}:{detail:n},...r===void 0?{}:{toolNames:r}}:i));try{let n=i.history,r=t;for(let t=0;t<Oe;t++){let l=crypto.randomUUID();y(e=>[...e,{id:l,kind:`thinking`,label:S.current.thinking,status:`running`}]);let m;try{m=await o.complete({prompt:r,model:a.model,history:n,tools:u.length?u:void 0,signal:f.signal,attachments:t===0?c:void 0,logId:i.logId})}catch(t){return i.history=[...n,...r?[{role:`user`,content:r+s}]:[]],f.signal.aborted?(p(l,`stopped`),e.fallback(i.params,i.context)):(p(l,`error`),h(L(t)),null)}if(i.history=[...n,...r?[{role:`user`,content:r+s}]:[]],!m)return f.signal.aborted?(p(l,`stopped`),e.fallback(i.params,i.context)):(p(l,`error`),h(S.current.noProviderResponse),null);if(m.type===`text`)return p(l,`done`,m.text),i.history=[...n,...r?[{role:`user`,content:r+s}]:[],{role:`assistant`,content:m.text}],e.parseResponse(m.text,i.params,i.context)||(console.error(`[useAgent] parseResponse ha restituito null — la risposta del modello non è nel formato atteso da questo subagent. Uso il fallback deterministico.`,{responseLength:m.text.length,responsePreview:m.text.length>2e3?`${m.text.slice(0,1e3)}\n…[troncato qui nel log, ${m.text.length} caratteri totali]…\n${m.text.slice(-1e3)}`:m.text,params:i.params}),h(S.current.invalidResponse),e.fallback(i.params,i.context));let g=m.toolCalls.map(e=>{let t=d.get(e.name);return t?.describeIntent??t?.describeInvocation?.(e.input)??`Chiamata: ${e.name}`});p(l,`done`,m.text||void 0,m.text?void 0:g);let _=await Promise.all(m.toolCalls.map(async e=>{let t=d.get(e.name),n=t?.describeInvocation?.(e.input)??`Chiamata: ${e.name}`;if(y(t=>[...t,{id:e.id,kind:`tool`,label:n,status:`running`}]),!t)return p(e.id,`error`),{toolCallId:e.id,name:e.name,output:`Tool sconosciuto: ${e.name}`,isError:!0};try{let n=await t.execute(e.input);return p(e.id,`done`),{toolCallId:e.id,name:e.name,output:n}}catch(t){return p(e.id,`error`),{toolCallId:e.id,name:e.name,output:L(t),isError:!0}}}));n=[...n,...r?[{role:`user`,content:r+s}]:[],{role:`assistant`,content:m.text,toolCalls:m.toolCalls},{role:`tool_result`,results:_}],r=``}let l=crypto.randomUUID();y(e=>[...e,{id:l,kind:`thinking`,label:S.current.thinking,status:`running`}]);let m;try{m=await o.complete({prompt:I(D().stopCallingTools,e.microPromptIds),model:a.model,history:n,signal:f.signal,logId:i.logId})}catch{m=null}if(m?.type===`text`){p(l,`done`,m.text),i.history=[...n,{role:`assistant`,content:m.text}];let t=e.parseResponse(m.text,i.params,i.context);if(t)return t}else p(l,f.signal.aborted?`stopped`:`error`),i.history=n;return f.signal.aborted||h(S.current.tooManyToolTurns),e.fallback(i.params,i.context)}finally{T.current=null}};return{enabled:r,setEnabled:i,hasProviders:a,selectedModel:M?F:c,setSelectedModel:M?B:d,modelsByProvider:o,modelsLoading:s,running:f,error:m,canContinue:g,remote:M,remoteModels:N,activity:v,run:async(t,n)=>{if(w.current)return h(S.current.requestInProgress),null;w.current=!0,h(null),y(n?.openingMessage?[{id:crypto.randomUUID(),kind:`user`,label:`Tu`,status:`done`,detail:n.openingMessage,...n.attachments?.length?{attachmentNames:n.attachments.map(e=>e.name)}:{}}]:[]),p(!0);try{let i=await e.buildContext(t),a={current:void 0},o=e.getTools?.(t,i,a)??[];if(C.current={params:t,context:i,tools:o,history:[],logId:crypto.randomUUID(),attachmentsRef:a},M)return _(!0),V(t),await H(n?.openingMessage??``,!0);let s=n?.model||void 0,c=s?!!O[(0,l.parseAIModelRef)(s)?.provider??``]:!!A;if(!r||!c){_(!1);let n=e.fallback(t,i);return y(t=>[...t,{id:crypto.randomUUID(),kind:`tool`,status:`done`,label:e.describeFallback?.(n)??S.current.aiDisabledFallback}]),n}_(!0);let u=n?.attachments?.length?await Promise.all(n.attachments.map(e=>l.PromptUtils.fileToAttachment(e))):void 0,d=I(e.buildPrompt(t,i),e.microPromptIds);return await U(d,u,s)}catch(e){return h(L(e)),null}finally{w.current=!1,p(!1)}},resume:async(t,n)=>{if(w.current){h(S.current.requestInProgress);return}w.current=!0,h(null),y(n.activity),p(!0);try{let i=await e.buildContext(t),a={current:void 0},o=e.getTools?.(t,i,a)??[];C.current={params:t,context:i,tools:o,history:n.history,logId:crypto.randomUUID(),attachmentsRef:a},M&&V(t),_(M||r&&!!A)}catch(e){h(L(e))}finally{w.current=!1,p(!1)}},sendMessage:async(t,n)=>{if(w.current)return h(S.current.requestInProgress),null;if(h(null),!t.trim())return h(`Messaggio vuoto.`),null;let r=C.current;if(!r)return h(S.current.noActiveSession),null;w.current=!0,p(!0),y(e=>[...e,{id:crypto.randomUUID(),kind:`user`,label:`Tu`,status:`done`,detail:t,...n?.attachments?.length?{attachmentNames:n.attachments.map(e=>e.name)}:{}}]);try{if(M)return await H(t,!1,n?.model||void 0);let i=n?.attachments?.length?await Promise.all(n.attachments.map(e=>l.PromptUtils.fileToAttachment(e))):void 0,a=I(e.buildFollowUpPrompt(t,r.params,r.context),e.microPromptIds);return await U(a,i,n?.model||void 0)}catch(e){return h(L(e)),null}finally{w.current=!1,p(!1)}},stop:E,runFallback:()=>{let t=C.current;if(!t)return null;h(null);let n=e.fallback(t.params,t.context);return y(t=>[...t,{id:crypto.randomUUID(),kind:`tool`,status:`done`,label:e.describeFallback?.(n)??S.current.continueWithoutAiFallback}]),n},snapshot:()=>C.current?{history:C.current.history,activity:v}:null}}function Me(){let e=D();return[e.responseRulesHeading,...e.responseRules.map(e=>`- ${e}`)].join(`
9
+ `)}function Ne(e,t,n){let r=D(),i=n?`\n${r.pageContextHeading}\n${r.pageContextIntro}\n${n}\n`:``;return`${r.orchestratorIntro}
10
10
 
11
11
  ${r.toolsHeading}
12
12
  ${t}
13
13
  ${i}
14
- ${je()}
14
+ ${Me()}
15
15
 
16
16
  ${r.userRequestHeading}
17
- ${e}`}function Ne(e,t){return t?{kind:`handoff`,...t}:{kind:`chat`,message:e}}function Pe(e){return{buildContext(){return{cliCatalog:N(h()),handoff:{current:null},collected:{}}},buildPrompt({userGoal:e,pageContext:t},{cliCatalog:n}){return Me(e,n,t)},buildFollowUpPrompt(e,t,{cliCatalog:n}){return`${e}\n\n${je()}\n\n${D().toolsHeading}\n${n}`},parseResponse(e,t,n){let r=n.handoff.current;return n.handoff.current=null,Ne(e,r)},fallback(){return{kind:`chat`,message:e.unavailable}},describeFallback(t){return t.kind===`chat`?t.message:e.continueWithoutAi},getTools(t,n,r){let i=y({attachmentsRef:r,collected:n.collected,proxyFetch:l.proxyFetch}),a=t.scopedSubagentId?g(t.scopedSubagentId):null,o=a?i.filter(e=>(a.crossAgentToolIds??[]).includes(e.name)):i,s=h().flatMap(t=>t.commands.map(r=>({name:`${t.id}_${r.name}`,description:`${t.label}: ${r.summary}`,inputSchema:r.inputSchema,describeInvocation:()=>(0,l.interpolate)(e.preparing,{label:t.label}),describeIntent:(0,l.interpolate)(e.collecting,{label:t.label}),async execute(e){let i=t.withCollected?t.withCollected({...e},n.collected):e;return n.handoff.current={subagentId:t.id,command:r.name,params:i},{status:`queued`,note:(0,l.interpolate)(D().handoffQueued,{label:t.label})}}})));return[...o,...s]}}}function Fe(e,t){return e.deriveHistoryTitle?.(t)??e.label}function Ie({manifest:e,result:t,meta:n,taskId:r,initiallyApplied:i,onApplied:a,extraDestinations:o}){let s=X(),c=Q(),f=c.scope,p=(0,l.useProxy)(),[m,h]=(0,u.useState)(null),[g,_]=(0,u.useState)(new Set(i??[])),[v,y]=(0,u.useState)(null),b=W(),x=new Map;e.destinationIds.forEach(e=>{let t=b[e];t&&x.set(e,t)}),(o??[]).forEach(e=>x.set(e.id,e)),x.set(V.id,V);let S=Array.from(x.values()),C=async i=>{h(i),y(null);try{let o=x.get(i);if(!o)throw Error((0,l.interpolate)(s.unknownDestination,{id:i}));if(i!==`json-export`&&!f)throw Error(s.destinationNoScope);let u=await o.apply(t,{scopeId:f?.id??``,dataProvider:f?.dataProvider,storageProvider:f?.storageProvider??null,proxyFetch:p},n);_(e=>new Set(e).add(i)),a?.(i),u?.id&&c.commitEntityChat(e.id,u.id,r,f?.id,n,Fe(e,n))}catch(e){y(e instanceof Error?e.message:String(e))}finally{h(null)}};return(0,d.jsxs)(`div`,{className:`space-y-2`,children:[(0,d.jsx)(`p`,{className:`text-xs font-medium text-muted-foreground`,children:s.destinationPickerTitle}),(0,d.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:S.map(e=>(0,d.jsx)(`button`,{type:`button`,disabled:m!==null,onClick:()=>void C(e.id),className:`cursor-pointer rounded-md border border-input bg-background px-2.5 py-1.5 text-xs font-medium transition-colors hover:bg-accent hover:text-accent-foreground disabled:cursor-not-allowed disabled:opacity-60`,children:m===e.id?s.destinationApplying:`${g.has(e.id)?`✓ `:``}${e.id===`json-export`?s.exportJson:e.label}`},e.id))}),v&&(0,d.jsx)(`p`,{className:`text-xs text-destructive`,children:v})]})}var Le={};function Re(e){Object.assign(Le,e)}function ze(e){return Le[e]}function Be({result:e}){let[t,n]=(0,u.useState)(!1);return(0,d.jsxs)(`div`,{className:`relative cursor-pointer rounded-md border border-border/60 ${t?`max-h-80 overflow-y-auto`:`max-h-28 overflow-hidden`}`,onClick:()=>n(e=>!e),title:t?`Clic per comprimere`:`Clic per espandere`,children:[(0,d.jsx)(l.Code,{language:`json`,showCopy:t,background:`transparent`,className:`!text-[11px]`,children:JSON.stringify(e,null,2)}),!t&&(0,d.jsx)(`div`,{className:`pointer-events-none absolute inset-x-0 bottom-0 h-6 bg-gradient-to-t from-muted/30 to-transparent`})]})}function Ve(e,t,n){return e.length===0?null:{id:`live-component`,label:`Applica al componente aperto`,async apply(r){e.forEach(e=>e.onResult?.(r,t,n))}}}function He({manifest:e,params:t,extraDestinations:n,precedingActivity:r,taskId:i,resumeSeed:a,model:o}){let s=Ae(e.definition,{defaultEnabled:!0}),c=Q(),f=c.scope,p=(0,l.useProxy)(),m=(0,u.useRef)(i??`subagent-${e.id}-${crypto.randomUUID()}`).current,[h,g]=(0,u.useState)(null),[_,v]=(0,u.useState)([]),[y,b]=(0,u.useState)(null),x=ze(e.id),S=x?.kind===`selection`?x:null,[C,w]=(0,u.useState)(null),T=(0,u.useRef)(!1),E=(0,u.useRef)(0),D=(0,u.useRef)(null);h&&h!==D.current&&(D.current=h,E.current=(r?.length??0)+s.activity.length);let O=(0,u.useRef)(!1),k=!s.hasProviders||s.selectedModel!==``;(0,u.useEffect)(()=>{!T.current&&k&&(T.current=!0,a?s.resume(e.toParams(t),a):(o&&s.setSelectedModel(o),s.run(e.toParams(t),{model:o}).then(e=>{e&&g(e)})))},[k]),(0,u.useEffect)(()=>{if(!h||!f)return;let n=e.autoApplyDestinationIds??[],r=c.componentAnchors.find(t=>t.subagentId===e.id&&t.pinnedEntityId)?.pinnedEntityId,i=W();n.forEach(n=>{let a=i[n];a&&(b(null),a.apply(h,{scopeId:f.id,dataProvider:f.dataProvider,storageProvider:f.storageProvider,proxyFetch:p},{...t,pinnedEntityId:r}).then(n=>{n?.id&&c.commitEntityChat(e.id,n.id,m,f.id,t,Fe(e,t))}).catch(e=>b(e instanceof Error?e.message:String(e))))})},[h,s.activity,f]),(0,u.useEffect)(()=>{h&&S&&w(S.defaultSelection(h))},[h,S]);let A=(e,t)=>{w(n=>n&&{...n,[e]:t})},j=e=>g(e),M=(0,u.useMemo)(()=>h&&S&&C?S.applySelection(h,C):h,[h,S,C]),N=(0,u.useMemo)(()=>c.componentAnchors.filter(t=>t.subagentId===e.id&&t.onResult),[c.componentAnchors,e.id]),P=(0,u.useMemo)(()=>Ve(N,t,m),[N,t,m]),F=(0,u.useMemo)(()=>P?[P,...n??[]]:n,[P,n]),I=e=>{v(t=>t.includes(e)?t:[...t,e])};return(0,u.useEffect)(()=>{O.current||c.openTask({id:m,title:Fe(e,t),icon:e.icon,agent:s,onApplied:e=>g(e),precedingActivity:r,panelExtraAnchorIndex:E.current,onDismiss:()=>{O.current=!0,s.running&&s.stop(),c.closeTask(m)},panelExtra:h?(0,d.jsxs)(d.Fragment,{children:[S&&C?(0,d.jsx)(S.Report,{result:h,selection:C,onChange:A}):x?.kind===`editable`?(0,d.jsx)(x.Report,{result:h,onResultChange:j}):(0,d.jsx)(Be,{result:M}),y&&(0,d.jsxs)(`p`,{className:`text-xs text-destructive`,children:[`Salvataggio automatico non riuscito: `,y]}),(0,d.jsx)(Ie,{manifest:e,result:M,meta:t,taskId:m,initiallyApplied:_,onApplied:I,extraDestinations:F})]}):void 0})},[s.activity,s.running,s.error,s.canContinue,s.selectedModel,s.modelsByProvider,s.hasProviders,c.openTask,c.componentAnchors,m,e,t,h,M,C,_,n,r,y]),(0,u.useEffect)(()=>()=>{c.closeTask(m)},[c.closeTask,m]),null}function Ue({userGoal:e}){let t=X(),n=Ae((0,u.useMemo)(()=>Pe({unavailable:t.orchestratorUnavailable,continueWithoutAi:t.orchestratorContinueWithoutAi,preparing:t.orchestratorPreparing,collecting:t.orchestratorCollecting}),[]),{defaultEnabled:!0}),r=Q(),[i,a]=(0,u.useState)(null),o=(0,u.useRef)(!1),s=!n.hasProviders||n.selectedModel!==``,c=(0,u.useRef)(r.pendingExtraDestinations),l=(0,u.useRef)(r.pendingAttachments),f=(0,u.useRef)(r.pendingModel),p=(0,u.useRef)(r.pendingScopedSubagentId??r.scopedSubagentId??void 0),m=(0,u.useRef)(r.pendingCarryOver),h=(0,u.useRef)(!1),_=e=>{e&&typeof e==`object`&&e.kind===`handoff`&&(a(e),r.closeTask(Z))};(0,u.useEffect)(()=>{!o.current&&s&&(o.current=!0,f.current&&n.setSelectedModel(f.current),n.run({userGoal:e,pageContext:r.pageContext,scopedSubagentId:p.current??null},{attachments:l.current,model:f.current,openingMessage:e}).then(e=>{e&&_(e)}))},[s]),(0,u.useEffect)(()=>{h.current||r.openTask({id:Z,title:`Agentico`,icon:`bot`,agent:n,onApplied:_,scopedSubagentId:p.current,precedingActivity:m.current?.activity,onDismiss:()=>{h.current=!0,n.running&&n.stop(),r.closeTask(Z)}})},[n.activity,n.running,n.error,n.canContinue,n.selectedModel,n.modelsByProvider,n.hasProviders,r.openTask]),(0,u.useEffect)(()=>()=>{r.closeTask(Z)},[r.closeTask]);let v=(0,u.useMemo)(()=>[...m.current?.activity??[],...n.activity],[n.activity]);if(!i)return null;let y=g(i.subagentId);return y?(0,d.jsx)(He,{manifest:y,params:i.params,extraDestinations:c.current,model:f.current||void 0,taskId:m.current?.taskId,precedingActivity:v}):null}function We({manifest:e,extraDestinations:t}){let n=Ae(e.definition,{defaultEnabled:!1}),r=X(),i=Q(),a=(0,u.useRef)(`manual-${e.id}-${crypto.randomUUID()}`).current,[o,s]=(0,u.useState)(null),[c,f]=(0,u.useState)([]),p=ze(e.id),m=p?.kind===`selection`?p:null,[h,g]=(0,u.useState)(null),[_,v]=(0,u.useState)(null),y=(0,u.useRef)(!1),b=t=>{if(!e.manualEntry)return;let r;try{r=e.manualEntry.fromRawText(t)}catch(e){console.error(`[ManualEntryRunner] manualEntry.fromRawText ha rifiutato il testo:`,e);return}v(r),f([]),n.run(r,{openingMessage:t}).then(e=>{e&&s(e)})};(0,u.useEffect)(()=>{o&&m&&g(m.defaultSelection(o))},[o,m]);let x=(e,t)=>{g(n=>n&&{...n,[e]:t})},S=e=>s(e),C=(0,u.useMemo)(()=>o&&m&&h?m.applySelection(o,h):o,[o,m,h]),w=e=>{f(t=>t.includes(e)?t:[...t,e])},T=(0,u.useMemo)(()=>i.componentAnchors.filter(t=>t.subagentId===e.id&&t.onResult),[i.componentAnchors,e.id]),E=(0,u.useMemo)(()=>_?Ve(T,_,a):null,[T,_,a]),D=(0,u.useMemo)(()=>E?[E,...t??[]]:t,[E,t]);return(0,u.useEffect)(()=>{y.current||i.openTask({id:a,title:e.label,icon:e.icon,agent:n,onApplied:e=>s(e),manualEntry:e.manualEntry?{prompt:e.manualEntry.prompt,onSubmit:b}:void 0,onDismiss:()=>{y.current=!0,n.running&&n.stop(),i.closeTask(a)},panelExtra:o?(0,d.jsxs)(`div`,{className:`space-y-2`,children:[m&&h?(0,d.jsx)(m.Report,{result:o,selection:h,onChange:x}):p?.kind===`editable`?(0,d.jsx)(p.Report,{result:o,onResultChange:S}):(0,d.jsx)(Be,{result:C}),(0,d.jsx)(Ie,{manifest:e,result:C,meta:_??{},taskId:a,initiallyApplied:c,onApplied:w,extraDestinations:D}),n.hasProviders&&(0,d.jsx)(l.ActionButton,{label:r.resumeWithAi,variant:`outline-secondary`,className:`text-xs`,onClick:()=>{_&&i.resumeWithAI(e.id,_,t)}})]}):void 0})},[n.activity,n.running,n.error,n.hasProviders,i.componentAnchors,o,C,h,c,_]),(0,u.useEffect)(()=>()=>{i.closeTask(a)},[]),null}var Ge=420;function Ke(e){return Object.values(e).flat().map(e=>({label:e.model,value:e.id,pricing:e.pricing??null,group:e.providerLabel??e.provider}))}function qe({task:e}){let t=X(),[n,r]=(0,u.useState)(``),{agent:i,onApplied:a,manualEntry:o}=e,s=i.running,c=e=>{if(r(``),o){o.onSubmit(e.text);return}i.sendMessage(e.text,{attachments:e.files,model:e.model}).then(e=>{e&&a(e)})},f=!o&&i.hasProviders&&!i.selectedModel;return(0,d.jsx)(l.Chatbot,{value:n,onChange:r,placeholder:o?.prompt??t.messagePlaceholder,running:s,onStop:i.stop,disabled:!n.trim()||f,onSubmit:c,attachments:!o,models:o?[]:Ke(i.modelsByProvider),selectedModel:o?``:i.selectedModel,onModelChange:i.setSelectedModel,modelPlaceholder:t.selectModelPlaceholder,minHeight:44,maxHeight:220})}function Je(){let{startOrchestrator:e}=Q(),t=X(),[n,r]=(0,u.useState)(``),{hasProviders:i,modelsByProvider:a,selectedModel:o,setSelectedModel:s}=Ee(),c=t=>{t.text.trim()&&(e(t.text.trim(),{attachments:t.files.length>0?t.files:void 0,model:t.model||void 0}),r(``))},f=i&&!o;return(0,d.jsx)(l.Chatbot,{value:n,onChange:r,placeholder:t.orchestratorStarterPlaceholder,disabled:!n.trim()||f,onSubmit:c,attachments:!0,models:Ke(a),selectedModel:o,onModelChange:s,modelPlaceholder:t.selectModelPlaceholder,minHeight:44,maxHeight:220})}function Ye({card:e}){let t=X();return e.humanSummaryOnly?(0,d.jsxs)(`div`,{className:`space-y-2 rounded-lg border border-border/60 p-3`,children:[(0,d.jsxs)(`p`,{className:`text-xs font-medium text-foreground`,children:[`"`,e.label,`"`]}),(0,d.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:e.humanSummary})]}):(0,d.jsxs)(`div`,{className:`space-y-2 rounded-lg border border-border/60 p-3`,children:[(0,d.jsx)(`p`,{className:`text-xs font-medium text-foreground`,children:(0,l.interpolate)(t.newInstance,{label:e.label})}),(0,d.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:e.humanSummary}),e.fields.length>0&&(0,d.jsx)(`ul`,{className:`space-y-1`,children:e.fields.map(e=>(0,d.jsxs)(`li`,{className:`flex items-start gap-1.5 text-xs`,children:[(0,d.jsx)(l.Badge,{variant:e.required?`primary`:`secondary`,className:`mt-px shrink-0`,children:e.required?`richiesto`:`opzionale`}),(0,d.jsxs)(`span`,{className:`min-w-0`,children:[(0,d.jsx)(`span`,{className:`font-mono text-foreground`,children:e.key}),e.humanDescription?(0,d.jsxs)(`span`,{className:`text-muted-foreground`,children:[` — `,e.humanDescription]}):null]})]},e.key))}),e.example&&(0,d.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Esempio: `,(0,d.jsx)(`span`,{className:`font-mono`,children:e.example})]})]})}function Xe({messages:e}){return(0,d.jsx)(`div`,{className:`space-y-2 rounded-lg border border-border/60 p-3`,children:e.map((e,t)=>(0,d.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:e},t))})}function Ze({scopeId:e,open:t,onOpenChange:n,onSelect:r,onNewChat:i}){let a=X(),[o,s]=(0,u.useState)(``),c=(0,u.useMemo)(()=>t?J(e):[],[e,t]),f=(0,u.useMemo)(()=>{let e=o.trim().toLowerCase();return e?c.filter(t=>{let n=g(t.subagentId)?.label??t.subagentId;return t.title.toLowerCase().includes(e)||n.toLowerCase().includes(e)}):c},[c,o]);return(0,d.jsx)(l.Dropdown,{trigger:{icon:`history`,title:a.chatHistory},triggerClassName:`!h-9 !w-9 !p-0 rounded-md bg-transparent text-muted-foreground hover:bg-accent hover:text-foreground`,open:t,onOpenChange:n,position:`end`,strategy:`absolute`,menuClassName:`w-[380px] max-h-[70vh] overflow-y-auto`,header:(0,d.jsxs)(`div`,{className:`flex items-center gap-2 px-1 pb-1.5`,children:[(0,d.jsx)(l.Icon,{name:`search`,size:14,className:`shrink-0 text-muted-foreground`}),(0,d.jsx)(`input`,{autoFocus:!0,value:o,onChange:e=>s(e.target.value),placeholder:a.searchChats,className:`min-w-0 flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground`}),(0,d.jsx)(l.ActionButton,{icon:`square-pen`,ariaLabel:a.newChat,title:a.newChat,variant:`link`,className:`shrink-0`,onClick:i})]}),children:f.length===0?(0,d.jsx)(`p`,{className:`px-2 py-3 text-center text-xs text-muted-foreground`,children:c.length===0?a.noSavedChats:a.noResults}):f.map(e=>{let t=g(e.subagentId);return(0,d.jsx)(l.DropdownItem,{icon:t?.icon??`bot`,onClick:()=>r(e.subagentId,e.entityId,e),children:(0,d.jsxs)(`span`,{className:`flex min-w-0 flex-1 items-center justify-between gap-2`,children:[(0,d.jsxs)(`span`,{className:`min-w-0 truncate`,children:[(0,d.jsx)(`span`,{className:`text-muted-foreground`,children:t?.label??e.subagentId}),` · `,e.title||e.entityId]}),(0,d.jsx)(`span`,{className:`shrink-0 text-xs text-muted-foreground`,children:new Date(e.savedAt).toLocaleString()})]})},`${e.subagentId}:${e.entityId}`)})})}function Qe(){let{task:e,isOpen:t,pendingGoal:n,orchestratorRunId:r,pageContext:i,pageContextCard:a,anchoredUserMessages:o,pendingResume:s,resumeRunId:c,dismissForeignTask:f,resumeEntityChat:p,pendingManualEntry:m,manualEntryRunId:h,startManualEntry:_,pendingExtraDestinations:v,pendingResumeWithAI:y,resumeWithAIRunId:b,scope:x}=Q(),S=X(),C=(0,u.useRef)(null),[w,T]=(0,u.useState)(!1),E=()=>{(!e||e.agent.running||e.savedToDisk||window.confirm(S.unsavedConversationConfirm))&&(f(),T(!1))},D=e?[...e.precedingActivity??[],...e.agent.activity]:[],O=D.length,k=Math.max(0,Math.min(e?.panelExtraAnchorIndex??O,O)),A=D.slice(0,k),j=D.slice(k),M=!!(e&&!e.agent.running&&e.agent.error),N=e?.id===`agentico-orchestrator`&&e.scopedSubagentId?g(e.scopedSubagentId):void 0,P=N?.manualEntry?N:null,F=(0,u.useRef)(!0);(0,u.useEffect)(()=>{let e=C.current;if(!e)return;let t=()=>{F.current=e.scrollHeight-e.scrollTop-e.clientHeight<80};return e.addEventListener(`scroll`,t),()=>e.removeEventListener(`scroll`,t)},[e?.id]),(0,u.useEffect)(()=>{let e=C.current;e&&(F.current=!0,e.scrollTop=e.scrollHeight)},[e?.id]),(0,u.useEffect)(()=>{let e=C.current;e&&F.current&&(e.scrollTop=e.scrollHeight)},[O,M]);let I=n?(0,d.jsx)(Ue,{userGoal:n},r):null,L=s?g(s.subagentId):void 0,R=s&&L?(0,d.jsx)(He,{manifest:L,params:s.snapshot.params,taskId:`entitychat-${s.subagentId}-${s.entityId}`,resumeSeed:{history:s.snapshot.history,activity:s.snapshot.activity}},c):null,z=m?g(m.subagentId):void 0,B=m&&z?(0,d.jsx)(We,{manifest:z,extraDestinations:m.extraDestinations},h):null,V=y?g(y.subagentId):void 0,H=y&&V?(0,d.jsx)(He,{manifest:V,params:y.params,extraDestinations:y.extraDestinations},b):null;return t?(0,d.jsxs)(d.Fragment,{children:[I,R,B,H,(0,d.jsxs)(`div`,{style:{width:420},className:`relative flex h-full shrink-0 flex-col border-l border-border bg-background`,children:[(0,d.jsxs)(`div`,{className:`flex min-h-[60px] items-center gap-1 border-b border-border/60 px-4 py-3`,children:[(0,d.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-lg font-semibold leading-tight`,children:e?e.title:`Agentico`}),x&&(0,d.jsx)(Ze,{scopeId:x.id,open:w,onOpenChange:T,onNewChat:E,onSelect:(e,t,n)=>p(e,t,n)}),(0,d.jsx)(Se,{})]}),(0,d.jsx)(`div`,{ref:C,className:`flex-1 overflow-y-auto px-3 pb-2`,children:(0,d.jsx)(`div`,{className:`pt-2`,children:e?(0,d.jsxs)(d.Fragment,{children:[e.manualEntry&&D.length===0&&(0,d.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:e.manualEntry.prompt}),(0,d.jsx)(xe,{activity:A}),e.panelExtra&&(0,d.jsx)(`div`,{className:`mt-3`,children:e.panelExtra}),j.length>0&&(0,d.jsx)(xe,{activity:j}),!e.agent.running&&e.agent.error&&(0,d.jsxs)(`div`,{className:`mt-2 flex items-center gap-2`,children:[(0,d.jsx)(`p`,{className:`flex-1 text-xs text-destructive`,children:e.agent.error}),(0,d.jsx)(l.ActionButton,{label:S.retry,variant:`secondary`,className:`shrink-0`,onClick:()=>{e.agent.sendMessage(S.retryMessage).then(t=>{t&&e.onApplied(t)})}}),(0,d.jsx)(l.ActionButton,{label:S.continueWithoutAi,variant:`secondary`,className:`shrink-0`,onClick:()=>{if(P){_(P.id,v);return}let t=e.agent.runFallback();t&&e.onApplied(t)}})]})]}):o.length>0?(0,d.jsx)(Xe,{messages:o}):a?(0,d.jsx)(Ye,{card:a}):(0,d.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:i??S.orchestratorStarterHint})})}),(0,d.jsx)(`div`,{className:`border-t border-border/60 px-4 py-3`,children:e?(0,d.jsx)(qe,{task:e},e.id):(0,d.jsx)(Je,{})})]})]}):(0,d.jsxs)(d.Fragment,{children:[I,R,B,H]})}function $e(e,t){let{setPageContext:n}=Q(),r=(0,u.useRef)(crypto.randomUUID()).current;(0,u.useEffect)(()=>(n(r,e,t??null),()=>n(r,null)),[e,t])}function et(e,t,n,r,i=!0,a){let{registerComponentAnchor:o}=Q(),s=(0,u.useRef)(crypto.randomUUID()).current,c=(0,u.useRef)(n);c.current=n,(0,u.useEffect)(()=>{if(i)return o(s,{subagentId:e,componentKey:t,contextInfo:r,pinnedEntityId:a,onResult:(e,t,n)=>c.current?.(e,t,n)}),()=>o(s,null)},[e,t,r,i,a])}exports.AGENTICO_WIDTH=Ge,exports.Agentico=Qe,exports.AgenticoProvider=ue,exports.AgenticoToggle=Se,exports.JSON_EXPORT_DESTINATION_ID=B,exports.MICRO_PROMPT_REGISTRY=F,exports.ORCHESTRATOR_TASK_ID=Z,exports.SUMMARY_MICRO_PROMPT=P,exports.agenticoDe=oe,exports.agenticoEn=Y,exports.agenticoIt=se,exports.agenticoPromptsEn=C,exports.agenticoPromptsIt=w,exports.agenticoTranslations=ce,exports.applyMicroPrompts=I,exports.configureAgenticoPrompts=E,exports.configureEntityChatStore=ee,exports.createCrossAgentTools=y,exports.defineSubagent=f,exports.extractErrorMessage=L,exports.extractJsonBlock=R,exports.findSubagentManifest=g,exports.getAgenticoPrompts=D,exports.getDestinationRegistry=W,exports.getEntityChat=re,exports.getSubagentRegistry=h,exports.getSubagentReport=ze,exports.jsonExportDestination=V,exports.listEntityChats=J,exports.registerCrossAgentTools=v,exports.registerDestinations=U,exports.registerSubagentReports=Re,exports.registerSubagents=m,exports.removeEntityChat=ae,exports.renderRegistryCli=N,exports.renderSubagentCli=M,exports.resetAgenticoPrompts=O,exports.saveEntityChat=ie,exports.toJsonSchema=b,exports.toMcpTool=x,exports.useAgent=Ae,exports.useAgentico=Q,exports.useAgenticoI18n=X,exports.useAgenticoPageContext=$e,exports.useSubagentComponentContext=et;
17
+ ${e}`}function Pe(e,t){return t?{kind:`handoff`,...t}:{kind:`chat`,message:e}}function Fe(e){return h().filter(t=>!t.onlyWhenAnchored||e===t.id)}function Ie(e){return{buildContext(e){return{cliCatalog:N(Fe(e.scopedSubagentId)),handoff:{current:null},collected:{}}},buildPrompt({userGoal:e,pageContext:t},{cliCatalog:n}){return Ne(e,n,t)},buildFollowUpPrompt(e,t,{cliCatalog:n}){return`${e}\n\n${Me()}\n\n${D().toolsHeading}\n${n}`},parseResponse(e,t,n){let r=n.handoff.current;return n.handoff.current=null,Pe(e,r)},fallback(){return{kind:`chat`,message:e.unavailable}},describeFallback(t){return t.kind===`chat`?t.message:e.continueWithoutAi},getTools(t,n,r){let i=y({attachmentsRef:r,collected:n.collected,proxyFetch:l.proxyFetch}),a=t.scopedSubagentId?g(t.scopedSubagentId):null,o=a?i.filter(e=>(a.crossAgentToolIds??[]).includes(e.name)):i,s=Fe(t.scopedSubagentId).flatMap(t=>t.commands.map(r=>({name:`${t.id}_${r.name}`,description:`${t.label}: ${r.summary}`,inputSchema:r.inputSchema,describeInvocation:()=>(0,l.interpolate)(e.preparing,{label:t.label}),describeIntent:(0,l.interpolate)(e.collecting,{label:t.label}),async execute(e){let i=t.withCollected?t.withCollected({...e},n.collected):e;return n.handoff.current={subagentId:t.id,command:r.name,params:i},{status:`queued`,note:(0,l.interpolate)(D().handoffQueued,{label:t.label})}}})));return[...o,...s]}}}function Le(e,t){return e.deriveHistoryTitle?.(t)??e.label}function Re({manifest:e,result:t,meta:n,taskId:r,initiallyApplied:i,onApplied:a,extraDestinations:o}){let s=Z(),c=$(),f=c.scope,p=(0,l.useProxy)(),[m,h]=(0,u.useState)(null),[g,_]=(0,u.useState)(new Set(i??[])),[v,y]=(0,u.useState)(null),b=W(),x=new Map;e.destinationIds.forEach(e=>{let t=b[e];t&&x.set(e,t)}),(o??[]).forEach(e=>x.set(e.id,e)),x.set(V.id,V);let S=Array.from(x.values()),C=async i=>{h(i),y(null);try{let o=x.get(i);if(!o)throw Error((0,l.interpolate)(s.unknownDestination,{id:i}));if(i!==`json-export`&&!f)throw Error(s.destinationNoScope);let u=await o.apply(t,{scopeId:f?.id??``,dataProvider:f?.dataProvider,storageProvider:f?.storageProvider??null,proxyFetch:p},n);_(e=>new Set(e).add(i)),a?.(i),u?.id&&c.commitEntityChat(e.id,u.id,r,f?.id,n,Le(e,n))}catch(e){y(e instanceof Error?e.message:String(e))}finally{h(null)}};return(0,d.jsxs)(`div`,{className:`space-y-2`,children:[(0,d.jsx)(`p`,{className:`text-xs font-medium text-muted-foreground`,children:s.destinationPickerTitle}),(0,d.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:S.map(e=>(0,d.jsx)(`button`,{type:`button`,disabled:m!==null,onClick:()=>void C(e.id),className:`cursor-pointer rounded-md border border-input bg-background px-2.5 py-1.5 text-xs font-medium transition-colors hover:bg-accent hover:text-accent-foreground disabled:cursor-not-allowed disabled:opacity-60`,children:m===e.id?s.destinationApplying:`${g.has(e.id)?`✓ `:``}${e.id===`json-export`?s.exportJson:e.label}`},e.id))}),v&&(0,d.jsx)(`p`,{className:`text-xs text-destructive`,children:v})]})}var ze={};function Be(e){Object.assign(ze,e)}function Ve(e){return ze[e]}function He({result:e}){let[t,n]=(0,u.useState)(!1);return(0,d.jsxs)(`div`,{className:`relative cursor-pointer rounded-md border border-border/60 ${t?`max-h-80 overflow-y-auto`:`max-h-28 overflow-hidden`}`,onClick:()=>n(e=>!e),title:t?`Clic per comprimere`:`Clic per espandere`,children:[(0,d.jsx)(l.Code,{language:`json`,showCopy:t,background:`transparent`,className:`!text-[11px]`,children:JSON.stringify(e,null,2)}),!t&&(0,d.jsx)(`div`,{className:`pointer-events-none absolute inset-x-0 bottom-0 h-6 bg-gradient-to-t from-muted/30 to-transparent`})]})}function Ue(e,t,n){return e.length===0?null:{id:`live-component`,label:`Applica al componente aperto`,async apply(r){e.forEach(e=>e.onResult?.(r,t,n))}}}var We={};function Ge(e){Object.assign(We,e)}function Ke(e){return We[e]}var qe=()=>({});function Je({manifest:e,params:t,extraDestinations:n,precedingActivity:r,taskId:i,resumeSeed:a,model:o,openingMessage:s}){let c=je(e.definition,{defaultEnabled:!0}),f=$(),p=f.scope,m=(0,l.useProxy)(),h=(0,u.useRef)(i??`subagent-${e.id}-${crypto.randomUUID()}`).current,[g,_]=(0,u.useState)(null),[v,y]=(0,u.useState)([]),[b,x]=(0,u.useState)(null),S=Ve(e.id),C=S?.kind===`selection`?S:null,[w,T]=(0,u.useState)(null),E=(0,u.useRef)(!1),D=(0,u.useRef)(0),O=(0,u.useRef)(null);g&&g!==O.current&&(O.current=g,D.current=(r?.length??0)+c.activity.length);let k=(0,u.useRef)(!1),A=c.remote||!c.hasProviders||c.selectedModel!==``;(0,u.useEffect)(()=>{!E.current&&A&&(E.current=!0,a?c.resume(e.toParams(t),a):(o&&c.setSelectedModel(o),c.run(e.toParams(t),{model:o,openingMessage:s}).then(e=>{e&&_(e)})))},[A]),(0,u.useEffect)(()=>{if(!g||!p)return;let n=e.autoApplyDestinationIds??[],r=f.componentAnchors.find(t=>t.subagentId===e.id&&t.pinnedEntityId)?.pinnedEntityId,i=W();n.forEach(n=>{let a=i[n];a&&(x(null),a.apply(g,{scopeId:p.id,dataProvider:p.dataProvider,storageProvider:p.storageProvider,proxyFetch:m},{...t,pinnedEntityId:r}).then(n=>{n?.id&&f.commitEntityChat(e.id,n.id,h,p.id,t,Le(e,t))}).catch(e=>x(e instanceof Error?e.message:String(e))))})},[g,c.activity,p]),(0,u.useEffect)(()=>{g&&C&&T(C.defaultSelection(g))},[g,C]);let j=(e,t)=>{T(n=>n&&{...n,[e]:t})},M=e=>_(e),N=(0,u.useMemo)(()=>g&&C&&w?C.applySelection(g,w):g,[g,C,w]),P=(0,u.useMemo)(()=>f.componentAnchors.filter(t=>t.subagentId===e.id&&t.onResult),[f.componentAnchors,e.id]),F=(0,u.useMemo)(()=>Ue(P,t,h),[P,t,h]),I=(0,u.useMemo)(()=>F?[F,...n??[]]:n,[F,n]),L=e.chatEntityId?.(t),R=(0,u.useRef)(!1);(0,u.useEffect)(()=>{let n=R.current&&!c.running;if(R.current=c.running,!n||!L||!p)return;let i=c.snapshot();i&&re({scopeId:p.id,subagentId:e.id,entityId:L,params:t,title:Le(e,t),history:i.history,activity:[...r??[],...i.activity]})},[c.running]);let z=()=>{k.current=!0,c.running&&c.stop(),f.closeTask(h)},B=(0,u.useRef)(Ke(e.id)??qe).current,V=B({params:t,taskId:h,running:c.running,close:z}),H=e=>{y(t=>t.includes(e)?t:[...t,e])};return(0,u.useEffect)(()=>{k.current||f.openTask({id:h,title:Le(e,t),icon:e.icon,agent:c,onApplied:e=>_(e),precedingActivity:r,panelExtraAnchorIndex:D.current,onDismiss:z,...L?{savedToDisk:!0}:{},panelActions:V.content,composerActions:V.actions,panelExtra:g?(0,d.jsxs)(d.Fragment,{children:[C&&w?(0,d.jsx)(C.Report,{result:g,selection:w,onChange:j}):S?.kind===`editable`?(0,d.jsx)(S.Report,{result:g,onResultChange:M}):(0,d.jsx)(He,{result:N}),b&&(0,d.jsxs)(`p`,{className:`text-xs text-destructive`,children:[`Salvataggio automatico non riuscito: `,b]}),(0,d.jsx)(Re,{manifest:e,result:N,meta:t,taskId:h,initiallyApplied:v,onApplied:H,extraDestinations:I})]}):void 0})},[c.activity,c.running,c.error,c.canContinue,c.selectedModel,c.modelsByProvider,c.hasProviders,c.remoteModels,f.openTask,f.componentAnchors,h,e,t,g,N,w,v,n,r,b,V.content,V.actions]),(0,u.useEffect)(()=>()=>{f.closeTask(h)},[f.closeTask,h]),null}function Ye({userGoal:e}){let t=Z(),n=je((0,u.useMemo)(()=>Ie({unavailable:t.orchestratorUnavailable,continueWithoutAi:t.orchestratorContinueWithoutAi,preparing:t.orchestratorPreparing,collecting:t.orchestratorCollecting}),[]),{defaultEnabled:!0}),r=$(),[i,a]=(0,u.useState)(null),o=(0,u.useRef)(!1),s=!n.hasProviders||n.selectedModel!==``,c=(0,u.useRef)(r.pendingExtraDestinations),l=(0,u.useRef)(r.pendingAttachments),f=(0,u.useRef)(r.pendingModel),p=(0,u.useRef)(r.pendingScopedSubagentId??r.scopedSubagentId??void 0),m=(0,u.useRef)(r.pendingCarryOver),h=(0,u.useRef)(!1),_=e=>{e&&typeof e==`object`&&e.kind===`handoff`&&(a(e),r.closeTask(Q))};(0,u.useEffect)(()=>{!o.current&&s&&(o.current=!0,f.current&&n.setSelectedModel(f.current),n.run({userGoal:e,pageContext:r.pageContext,scopedSubagentId:p.current??null},{attachments:l.current,model:f.current,openingMessage:e}).then(e=>{e&&_(e)}))},[s]),(0,u.useEffect)(()=>{h.current||r.openTask({id:Q,title:`Agentico`,icon:`bot`,agent:n,onApplied:_,scopedSubagentId:p.current,precedingActivity:m.current?.activity,onDismiss:()=>{h.current=!0,n.running&&n.stop(),r.closeTask(Q)}})},[n.activity,n.running,n.error,n.canContinue,n.selectedModel,n.modelsByProvider,n.hasProviders,r.openTask]),(0,u.useEffect)(()=>()=>{r.closeTask(Q)},[r.closeTask]);let v=(0,u.useMemo)(()=>[...m.current?.activity??[],...n.activity],[n.activity]);if(!i)return null;let y=g(i.subagentId);return y?(0,d.jsx)(Je,{manifest:y,params:i.params,extraDestinations:c.current,model:f.current||void 0,taskId:m.current?.taskId,precedingActivity:v}):null}function Xe({manifest:e,extraDestinations:t}){let n=je(e.definition,{defaultEnabled:!1}),r=Z(),i=$(),a=(0,u.useRef)(`manual-${e.id}-${crypto.randomUUID()}`).current,[o,s]=(0,u.useState)(null),[c,f]=(0,u.useState)([]),p=Ve(e.id),m=p?.kind===`selection`?p:null,[h,g]=(0,u.useState)(null),[_,v]=(0,u.useState)(null),y=(0,u.useRef)(!1),b=t=>{if(!e.manualEntry)return;let r;try{r=e.manualEntry.fromRawText(t)}catch(e){console.error(`[ManualEntryRunner] manualEntry.fromRawText ha rifiutato il testo:`,e);return}v(r),f([]),n.run(r,{openingMessage:t}).then(e=>{e&&s(e)})};(0,u.useEffect)(()=>{o&&m&&g(m.defaultSelection(o))},[o,m]);let x=(e,t)=>{g(n=>n&&{...n,[e]:t})},S=e=>s(e),C=(0,u.useMemo)(()=>o&&m&&h?m.applySelection(o,h):o,[o,m,h]),w=e=>{f(t=>t.includes(e)?t:[...t,e])},T=(0,u.useMemo)(()=>i.componentAnchors.filter(t=>t.subagentId===e.id&&t.onResult),[i.componentAnchors,e.id]),E=(0,u.useMemo)(()=>_?Ue(T,_,a):null,[T,_,a]),D=(0,u.useMemo)(()=>E?[E,...t??[]]:t,[E,t]);return(0,u.useEffect)(()=>{y.current||i.openTask({id:a,title:e.label,icon:e.icon,agent:n,onApplied:e=>s(e),manualEntry:e.manualEntry?{prompt:e.manualEntry.prompt,onSubmit:b}:void 0,onDismiss:()=>{y.current=!0,n.running&&n.stop(),i.closeTask(a)},panelExtra:o?(0,d.jsxs)(`div`,{className:`space-y-2`,children:[m&&h?(0,d.jsx)(m.Report,{result:o,selection:h,onChange:x}):p?.kind===`editable`?(0,d.jsx)(p.Report,{result:o,onResultChange:S}):(0,d.jsx)(He,{result:C}),(0,d.jsx)(Re,{manifest:e,result:C,meta:_??{},taskId:a,initiallyApplied:c,onApplied:w,extraDestinations:D}),n.hasProviders&&(0,d.jsx)(l.ActionButton,{label:r.resumeWithAi,variant:`outline-secondary`,className:`text-xs`,onClick:()=>{_&&i.resumeWithAI(e.id,_,t)}})]}):void 0})},[n.activity,n.running,n.error,n.hasProviders,i.componentAnchors,o,C,h,c,_]),(0,u.useEffect)(()=>()=>{i.closeTask(a)},[]),null}var Ze=420;function Qe(e){return Object.values(e).flat().map(e=>({label:e.model,value:e.id,pricing:e.pricing??null,group:e.providerLabel??e.provider}))}function $e({task:e}){let t=Z(),[n,r]=(0,u.useState)(``),{agent:i,onApplied:a,manualEntry:o}=e,s=i.running,c=e=>{if(r(``),o){o.onSubmit(e.text);return}i.sendMessage(e.text,{attachments:e.files,model:e.model}).then(e=>{e&&a(e)})},f=!!o||i.remote&&i.remoteModels.length===0,p=!f&&!i.remote&&i.hasProviders&&!i.selectedModel,m=f?[]:i.remote?i.remoteModels:Qe(i.modelsByProvider);return(0,d.jsx)(l.Chatbot,{value:n,onChange:r,placeholder:o?.prompt??t.messagePlaceholder,running:s,onStop:i.stop,disabled:!n.trim()||p,onSubmit:c,attachments:!o&&!i.remote,models:m,selectedModel:f?``:i.selectedModel,actions:e.composerActions,onModelChange:i.setSelectedModel,modelPlaceholder:t.selectModelPlaceholder,minHeight:44,maxHeight:220})}function et(){let{startOrchestrator:e}=$(),t=Z(),[n,r]=(0,u.useState)(``),{hasProviders:i,modelsByProvider:a,selectedModel:o,setSelectedModel:s}=De(),c=t=>{t.text.trim()&&(e(t.text.trim(),{attachments:t.files.length>0?t.files:void 0,model:t.model||void 0}),r(``))},f=i&&!o;return(0,d.jsx)(l.Chatbot,{value:n,onChange:r,placeholder:t.orchestratorStarterPlaceholder,disabled:!n.trim()||f,onSubmit:c,attachments:!0,models:Qe(a),selectedModel:o,onModelChange:s,modelPlaceholder:t.selectModelPlaceholder,minHeight:44,maxHeight:220})}function tt(e,t,n=Date.now()){let r=Math.round((e-n)/1e3),i=new Intl.RelativeTimeFormat(t,{numeric:`auto`,style:`short`});for(let[e,t]of[[`day`,86400],[`hour`,3600],[`minute`,60]])if(Math.abs(r)>=t)return i.format(Math.round(r/t),e);return i.format(0,`minute`)}function nt({card:e}){let t=Z();return e.humanSummaryOnly?(0,d.jsxs)(`div`,{className:`space-y-2 rounded-lg border border-border/60 p-3`,children:[(0,d.jsxs)(`p`,{className:`text-xs font-medium text-foreground`,children:[`"`,e.label,`"`]}),(0,d.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:e.humanSummary})]}):(0,d.jsxs)(`div`,{className:`space-y-2 rounded-lg border border-border/60 p-3`,children:[(0,d.jsx)(`p`,{className:`text-xs font-medium text-foreground`,children:(0,l.interpolate)(t.newInstance,{label:e.label})}),(0,d.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:e.humanSummary}),e.fields.length>0&&(0,d.jsx)(`ul`,{className:`space-y-1`,children:e.fields.map(e=>(0,d.jsxs)(`li`,{className:`flex items-start gap-1.5 text-xs`,children:[(0,d.jsx)(l.Badge,{variant:e.required?`primary`:`secondary`,className:`mt-px shrink-0`,children:e.required?`richiesto`:`opzionale`}),(0,d.jsxs)(`span`,{className:`min-w-0`,children:[(0,d.jsx)(`span`,{className:`font-mono text-foreground`,children:e.key}),e.humanDescription?(0,d.jsxs)(`span`,{className:`text-muted-foreground`,children:[` — `,e.humanDescription]}):null]})]},e.key))}),e.example&&(0,d.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Esempio: `,(0,d.jsx)(`span`,{className:`font-mono`,children:e.example})]})]})}function rt({messages:e}){return(0,d.jsx)(`div`,{className:`space-y-2 rounded-lg border border-border/60 p-3`,children:e.map((e,t)=>(0,d.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:e},t))})}function it({scopeId:e,currentTaskId:t,open:n,onOpenChange:r,onSelect:i,onNewChat:a,onArchivedCurrent:o}){let s=Z(),{locale:c}=(0,l.useI18n)(),[f,p]=(0,u.useState)(``),[m,h]=(0,u.useState)(0),_=(0,u.useMemo)(()=>n?ae(e):[],[e,n,m]),v=async n=>{let r=g(n.subagentId),i=await r?.confirmArchive?.(n.entityId,n.params);if(!i||window.confirm(i)){try{await r?.onArchive?.(n.entityId,n.params)}catch{return}ie(e,n.subagentId,n.entityId),t===Y(n.subagentId,n.entityId)&&o(),h(e=>e+1)}},y=(0,u.useMemo)(()=>{let e=f.trim().toLowerCase();return e?_.filter(t=>{let n=g(t.subagentId)?.label??t.subagentId;return t.title.toLowerCase().includes(e)||n.toLowerCase().includes(e)}):_},[_,f]);return(0,d.jsx)(l.Dropdown,{trigger:{icon:`history`,title:s.chatHistory},triggerClassName:`!h-9 !w-9 !p-0 rounded-md bg-transparent text-muted-foreground hover:bg-accent hover:text-foreground`,open:n,onOpenChange:r,position:`end`,strategy:`absolute`,menuClassName:`w-[380px] max-h-[70vh] overflow-y-auto`,header:(0,d.jsxs)(`div`,{className:`flex items-center gap-2 px-1 pb-1.5`,children:[(0,d.jsx)(l.Icon,{name:`search`,size:14,className:`shrink-0 text-muted-foreground`}),(0,d.jsx)(`input`,{autoFocus:!0,value:f,onChange:e=>p(e.target.value),placeholder:s.searchChats,className:`min-w-0 flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground`}),(0,d.jsx)(l.ActionButton,{icon:`square-pen`,ariaLabel:s.newChat,title:s.newChat,variant:`link`,className:`shrink-0`,onClick:a})]}),children:y.length===0?(0,d.jsx)(`p`,{className:`px-2 py-3 text-center text-xs text-muted-foreground`,children:_.length===0?s.noSavedChats:s.noResults}):y.map(e=>{let n=g(e.subagentId),r=t===Y(e.subagentId,e.entityId);return(0,d.jsx)(l.DropdownItem,{icon:r?`check`:n?.icon??`bot`,className:r?`bg-accent font-medium`:void 0,actions:[{icon:`archive`,label:s.archiveChat,onClick:()=>void v(e)}],onClick:()=>i(e.subagentId,e.entityId,e),children:(0,d.jsxs)(`span`,{className:`flex min-w-0 flex-1 items-center justify-between gap-2`,children:[(0,d.jsxs)(`span`,{className:`min-w-0 truncate`,children:[(0,d.jsx)(`span`,{className:`text-muted-foreground`,children:n?.label??e.subagentId}),` · `,e.title||e.entityId]}),(0,d.jsx)(`span`,{className:`shrink-0 text-xs text-muted-foreground`,title:new Date(e.savedAt).toLocaleString(c),children:tt(e.savedAt,c)})]})},`${e.subagentId}:${e.entityId}`)})})}function at(){let{task:e,isOpen:t,pendingGoal:n,orchestratorRunId:r,pageContext:i,pageContextCard:a,anchoredUserMessages:o,pendingResume:s,resumeRunId:c,dismissForeignTask:f,resumeEntityChat:p,pendingManualEntry:m,manualEntryRunId:h,startManualEntry:_,pendingExtraDestinations:v,pendingResumeWithAI:y,resumeWithAIRunId:b,pendingStart:x,startRunId:S,scope:C}=$(),w=Z(),T=(0,u.useRef)(null),[E,D]=(0,u.useState)(!1),O=()=>{(!e||e.agent.running||e.savedToDisk||window.confirm(w.unsavedConversationConfirm))&&(f(),D(!1))},k=e?[...e.precedingActivity??[],...e.agent.activity]:[],A=k.length,j=Math.max(0,Math.min(e?.panelExtraAnchorIndex??A,A)),M=k.slice(0,j),N=k.slice(j),P=!!(e&&!e.agent.running&&e.agent.error),F=e?.id===`agentico-orchestrator`&&e.scopedSubagentId?g(e.scopedSubagentId):void 0,I=F?.manualEntry?F:null,L=(0,u.useRef)(!0);(0,u.useEffect)(()=>{let e=T.current;if(!e)return;let t=()=>{L.current=e.scrollHeight-e.scrollTop-e.clientHeight<80};return e.addEventListener(`scroll`,t),()=>e.removeEventListener(`scroll`,t)},[e?.id]),(0,u.useEffect)(()=>{let e=T.current;e&&(L.current=!0,e.scrollTop=e.scrollHeight)},[e?.id]);let R=k.at(-1)?.detail?.length??0;(0,u.useEffect)(()=>{let e=T.current;e&&L.current&&(e.scrollTop=e.scrollHeight)},[A,P,R]);let z=(0,u.useRef)(null);(0,u.useEffect)(()=>{let e=T.current,t=z.current;if(!e||!t||typeof ResizeObserver>`u`)return;let n=new ResizeObserver(()=>{L.current&&(e.scrollTop=e.scrollHeight)});return n.observe(t),()=>n.disconnect()},[e?.id,t]);let B=n?(0,d.jsx)(Ye,{userGoal:n},r):null,V=s?g(s.subagentId):void 0,H=s&&V?(0,d.jsx)(Je,{manifest:V,params:s.snapshot.params,taskId:Y(s.subagentId,s.entityId),resumeSeed:{history:s.snapshot.history,activity:s.snapshot.activity}},c):null,U=m?g(m.subagentId):void 0,W=m&&U?(0,d.jsx)(Xe,{manifest:U,extraDestinations:m.extraDestinations},h):null,G=y?g(y.subagentId):void 0,K=y&&G?(0,d.jsx)(Je,{manifest:G,params:y.params,extraDestinations:y.extraDestinations},b):null,ee=x?g(x.subagentId):void 0,q=x&&ee?(0,d.jsx)(Je,{manifest:ee,params:x.params,taskId:x.taskId,openingMessage:x.openingMessage},S):null;return t?(0,d.jsxs)(d.Fragment,{children:[B,H,W,K,q,(0,d.jsxs)(`div`,{style:{width:420},className:`relative flex h-full shrink-0 flex-col border-l border-border bg-background`,children:[(0,d.jsxs)(`div`,{className:`flex min-h-[60px] items-center gap-1 border-b border-border/60 px-4 py-3`,children:[(0,d.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-lg font-semibold leading-tight`,children:e?e.title:`Agentico`}),C&&(0,d.jsx)(it,{scopeId:C.id,currentTaskId:e?.id??null,open:E,onOpenChange:D,onNewChat:O,onSelect:(e,t,n)=>p(e,t,n),onArchivedCurrent:f}),(0,d.jsx)(Ce,{})]}),(0,d.jsx)(`div`,{ref:T,className:`flex-1 overflow-y-auto px-3 pb-2`,children:(0,d.jsx)(`div`,{ref:z,className:`pt-2`,children:e?(0,d.jsxs)(d.Fragment,{children:[e.manualEntry&&k.length===0&&(0,d.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:e.manualEntry.prompt}),(0,d.jsx)(Se,{activity:M}),e.panelExtra&&(0,d.jsx)(`div`,{className:`mt-3`,children:e.panelExtra}),N.length>0&&(0,d.jsx)(Se,{activity:N}),!e.agent.running&&e.agent.error&&(0,d.jsxs)(`div`,{className:`mt-2 flex items-center gap-2`,children:[(0,d.jsx)(`p`,{className:`flex-1 text-xs text-destructive`,children:e.agent.error}),(0,d.jsx)(l.ActionButton,{label:w.retry,variant:`secondary`,className:`shrink-0`,onClick:()=>{e.agent.sendMessage(w.retryMessage).then(t=>{t&&e.onApplied(t)})}}),!e.agent.remote&&(0,d.jsx)(l.ActionButton,{label:w.continueWithoutAi,variant:`secondary`,className:`shrink-0`,onClick:()=>{if(I){_(I.id,v);return}let t=e.agent.runFallback();t&&e.onApplied(t)}})]})]}):o.length>0?(0,d.jsx)(rt,{messages:o}):a?(0,d.jsx)(nt,{card:a}):(0,d.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:i??w.orchestratorStarterHint})})}),(0,d.jsxs)(`div`,{className:`border-t border-border/60 px-4 py-3`,children:[e?.panelActions&&(0,d.jsx)(`div`,{className:`mb-2`,children:e.panelActions}),e?(0,d.jsx)($e,{task:e},e.id):(0,d.jsx)(et,{})]})]})]}):(0,d.jsxs)(d.Fragment,{children:[B,H,W,K,q]})}function ot(e,t){let{setPageContext:n}=$(),r=(0,u.useRef)(crypto.randomUUID()).current;(0,u.useEffect)(()=>(n(r,e,t??null),()=>n(r,null)),[e,t])}function st(e,t,n,r,i=!0,a){let{registerComponentAnchor:o}=$(),s=(0,u.useRef)(crypto.randomUUID()).current,c=(0,u.useRef)(n);c.current=n,(0,u.useEffect)(()=>{if(i)return o(s,{subagentId:e,componentKey:t,contextInfo:r,pinnedEntityId:a,onResult:(e,t,n)=>c.current?.(e,t,n)}),()=>o(s,null)},[e,t,r,i,a])}exports.AGENTICO_WIDTH=Ze,exports.Agentico=at,exports.AgenticoProvider=ue,exports.AgenticoToggle=Ce,exports.JSON_EXPORT_DESTINATION_ID=B,exports.MICRO_PROMPT_REGISTRY=F,exports.ORCHESTRATOR_TASK_ID=Q,exports.SUMMARY_MICRO_PROMPT=P,exports.agenticoDe=oe,exports.agenticoEn=X,exports.agenticoIt=se,exports.agenticoPromptsEn=C,exports.agenticoPromptsIt=w,exports.agenticoTranslations=ce,exports.applyMicroPrompts=I,exports.configureAgenticoPrompts=E,exports.configureEntityChatStore=K,exports.createCrossAgentTools=y,exports.defineSubagent=f,exports.entityChatTaskId=Y,exports.extractErrorMessage=L,exports.extractJsonBlock=R,exports.findSubagentManifest=g,exports.getAgenticoPrompts=D,exports.getDestinationRegistry=W,exports.getEntityChat=ne,exports.getSubagentControls=Ke,exports.getSubagentRegistry=h,exports.getSubagentReport=Ve,exports.jsonExportDestination=V,exports.listEntityChats=ae,exports.registerCrossAgentTools=v,exports.registerDestinations=U,exports.registerSubagentControls=Ge,exports.registerSubagentReports=Be,exports.registerSubagents=m,exports.removeEntityChat=ie,exports.renderRegistryCli=N,exports.renderSubagentCli=M,exports.resetAgenticoPrompts=O,exports.saveEntityChat=re,exports.toJsonSchema=b,exports.toMcpTool=x,exports.useAgent=je,exports.useAgentico=$,exports.useAgenticoI18n=Z,exports.useAgenticoPageContext=ot,exports.useSubagentComponentContext=st;
18
18
  //# sourceMappingURL=index.js.map