@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.
@@ -80,4 +80,52 @@ export interface AgentDefinition<TParams, TContext, TResult> {
80
80
  * agente: qui si dichiara solo QUALI si vogliono, mai il loro testo. Assente o [] =
81
81
  * nessuno. */
82
82
  microPromptIds?: string[];
83
+ /** Present = the turns of this agent are answered by the host, not by the AI provider of
84
+ * Agentico (CR-003): a remote agent with its own memory, for example an opencode session on
85
+ * a server. `useAgent` then builds no prompt, needs no model and never falls back: it gives
86
+ * the executor the text of the person and shows what it reports. `buildPrompt`,
87
+ * `buildFollowUpPrompt`, `parseResponse` and `fallback` stay required by the type but are not
88
+ * called. */
89
+ executor?: AgentExecutor<TParams, TContext, TResult>;
90
+ }
91
+ /** One step of a remote agent, shown as a line of the activity log and updated by `id`
92
+ * (e.g. "wrote GLOSSARY.md"). */
93
+ export interface AgentExecutorStep {
94
+ id: string;
95
+ label: string;
96
+ status: 'running' | 'done' | 'error';
97
+ }
98
+ /** One turn given to an `AgentExecutor`. */
99
+ export interface AgentExecutorTurn<TParams, TContext> {
100
+ params: TParams;
101
+ context: TContext;
102
+ /** What the person wrote: the opening message on the first turn (possibly empty), then
103
+ * each follow-up, as typed — never a prompt built by Agentico. */
104
+ text: string;
105
+ /** true on the turn of `run()`, false on every follow-up. */
106
+ first: boolean;
107
+ /** Aborted when the person stops the turn. */
108
+ signal: AbortSignal;
109
+ /** The model the person picked among `AgentExecutor.models`, if the executor offers any. */
110
+ model?: string;
111
+ /** The reply so far, whole (not a delta): shown as it grows. */
112
+ onText(text: string): void;
113
+ /** A step of the agent: added the first time its id is seen, updated after. */
114
+ onStep(step: AgentExecutorStep): void;
115
+ }
116
+ /** The host side of a remote agent: one call per turn, resolved when its reply is complete. */
117
+ export interface AgentExecutor<TParams, TContext, TResult> {
118
+ turn(turn: AgentExecutorTurn<TParams, TContext>): Promise<{
119
+ text: string;
120
+ result?: TResult;
121
+ }>;
122
+ /** The models the person can pick in the composer, at any time: what one means is the host's
123
+ * (e.g. the model of the remote session from the next message). Absent = no picker. */
124
+ models?(params: TParams): Array<{
125
+ label: string;
126
+ value: string;
127
+ group?: string;
128
+ }>;
129
+ /** The model picked at first, e.g. the one the remote session runs with. */
130
+ defaultModel?(params: TParams): string | undefined;
83
131
  }
@@ -46,3 +46,7 @@ export declare function removeEntityChat(scopeId: string, subagentId: string, en
46
46
  * (Agentico.tsx), che le mescola across subagent (theme, redirects, html-to-liquid) in un'unica
47
47
  * lista ordinata per data. */
48
48
  export declare function listEntityChats(scopeId: string): EntityChatSnapshot[];
49
+ /** The id of the Agentico task of the chat of an entity: the same when the chat is resumed from
50
+ * the history and when a page starts it again (AgenticoContext.startSubagent), so it stays one
51
+ * task (CR-003). */
52
+ export declare const entityChatTaskId: (subagentId: string, entityId: string) => string;
@@ -157,6 +157,20 @@ export interface SubagentManifest<TParams = any, TContext = any, TResult = any>
157
157
  * orchestratorHint/humanSummary* per il vecchio meccanismo a livello di pagina, ancora usato
158
158
  * da redirects/html-to-liquid finché non vengono migrati). */
159
159
  componentContexts?: Record<string, SubagentComponentContext>;
160
+ /** The entity a chat of this subagent belongs to, from its raw params (e.g. the project it
161
+ * designs): when set, SubagentRunner saves the chat after every turn under it (see
162
+ * entityChatStore), so it is in the history and can be resumed on that entity (CR-003).
163
+ * Absent = saved only when the host commits it (commitEntityChat), as before. */
164
+ chatEntityId?(params: Record<string, unknown>): string | undefined;
165
+ /** true = the orchestrator offers this subagent only when the conversation is scoped to it,
166
+ * i.e. a component anchored to it is on the page (CR-003): a subagent that makes sense on
167
+ * one page only (e.g. the design of the project open there). Absent = offered everywhere. */
168
+ onlyWhenAnchored?: boolean;
169
+ /** Archiving a chat of this subagent from the history (CR-003): what the host does besides
170
+ * taking it off the history, e.g. close the remote session. A rejection keeps the chat. */
171
+ onArchive?(entityId: string, params: Record<string, unknown>): Promise<void> | void;
172
+ /** The question asked before archiving, if any (e.g. "close it without a pull request?"). */
173
+ confirmArchive?(entityId: string, params: Record<string, unknown>): Promise<string | undefined> | string | undefined;
160
174
  }
161
175
  /** Coppia di messaggi per UN punto di ancoraggio componente↔subagent (vedi
162
176
  * SubagentManifest.componentContexts) — due pubblici diversi per lo stesso aggancio, mai lo
@@ -39,6 +39,8 @@ export interface AgenticoDict {
39
39
  messagePlaceholder: string;
40
40
  unsavedConversationConfirm: string;
41
41
  noSavedChats: string;
42
+ /** Archives a chat of the history (CR-003). */
43
+ archiveChat: string;
42
44
  noResults: string;
43
45
  retry: string;
44
46
  /** User message sent to the model by the retry button */
@@ -1,5 +1,5 @@
1
1
  import './i18n/types';
2
- export type { AgentDefinition, AgentTool, LatestAttachmentsRef } from './domain/agentDefinition';
2
+ export type { AgentDefinition, AgentTool, LatestAttachmentsRef, AgentExecutor, AgentExecutorTurn, AgentExecutorStep } from './domain/agentDefinition';
3
3
  export type { SubagentCommand, SubagentManifest, SubagentComponentContext } from './domain/subagentManifest';
4
4
  export { defineSubagent } from './domain/defineSubagent';
5
5
  export { registerSubagents, getSubagentRegistry, findSubagentManifest } from './domain/subagentRegistry';
@@ -14,7 +14,7 @@ export { extractJsonBlock } from './domain/extractJsonBlock';
14
14
  export type { ResultDestination, DestinationContext, ResultDestinationOutcome } from './domain/resultDestination';
15
15
  export { jsonExportDestination, JSON_EXPORT_DESTINATION_ID } from './domain/jsonExportDestination';
16
16
  export { registerDestinations, getDestinationRegistry } from './domain/destinationRegistry';
17
- export { configureEntityChatStore, saveEntityChat, getEntityChat, listEntityChats, removeEntityChat, type EntityChatSnapshot, } from './domain/entityChatStore';
17
+ export { configureEntityChatStore, saveEntityChat, getEntityChat, listEntityChats, removeEntityChat, entityChatTaskId, type EntityChatSnapshot, } from './domain/entityChatStore';
18
18
  export { agenticoTranslations, agenticoEn, agenticoIt, agenticoDe, useAgenticoI18n, type AgenticoDict } from './i18n';
19
19
  export { Agentico, AGENTICO_WIDTH } from './presentation/Agentico';
20
20
  export { AgenticoToggle } from './presentation/AgenticoToggle';
@@ -23,3 +23,4 @@ export { useAgent, type AgentActivityEntry, type AgentConversation, type UseAgen
23
23
  export { useAgenticoPageContext } from './presentation/useAgenticoPageContext';
24
24
  export { useSubagentComponentContext } from './presentation/useSubagentComponentContext';
25
25
  export { registerSubagentReports, getSubagentReport, type EditableReportModule, type SubagentReportModule, type SubagentSelection, } from './presentation/reports/subagentReportRegistry';
26
+ export { registerSubagentControls, getSubagentControls, type SubagentControls, type SubagentControlsProps, type UseSubagentControls } from './presentation/subagentControls';
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import type { AIModelDescriptor, DataProviderAdapter, StorageProviderAdapter } from '@llmnative/react';
2
+ import type { AIModelDescriptor, ChatbotAction, DataProviderAdapter, StorageProviderAdapter } from '@llmnative/react';
3
3
  import type { AgentActivityEntry, AgentConversation } from './useAgent';
4
4
  import type { ResultDestination } from '../domain/resultDestination';
5
5
  import type { SubagentUsageCard } from '../domain/subagentUsageCard';
@@ -94,6 +94,11 @@ export interface AgenticoTask<TResult = unknown> {
94
94
  * top=vecchio/bottom=nuovo (bug segnalato). Assente = comportamento invariato, sempre in
95
95
  * fondo (equivalente a passare la lunghezza corrente del log). */
96
96
  panelExtraAnchorIndex?: number;
97
+ /** What the host shows at the bottom of the panel, above the composer, while the task is open
98
+ * (see registerSubagentControls, CR-003). */
99
+ panelActions?: React.ReactNode;
100
+ /** Buttons of the host in the composer (see registerSubagentControls, CR-003). */
101
+ composerActions?: ChatbotAction[];
97
102
  /** Chiamato quando questo task viene sostituito da uno nuovo (vedi openTask) o quando
98
103
  * l'utente lo interrompe — SEMPRE definito da chi possiede il task
99
104
  * (OrchestratorRunner/SubagentRunner), mai un fallback generico su closeTask: quel
@@ -296,6 +301,22 @@ interface AgenticoContextValue {
296
301
  * indietro", niente eccezione per un task ancora in corso (deliberatamente semplice,
297
302
  * raffinabile in seguito). No-op se non c'è alcun task. */
298
303
  dismissForeignTask: () => void;
304
+ /** Starts a subagent from a page, without the orchestrator (CR-003): it replaces the current
305
+ * task. `taskId` keeps one task per entity (start it again = the same task); `openingMessage`
306
+ * is shown as the first message of the person and given to the first turn. */
307
+ startSubagent: (subagentId: string, params: Record<string, unknown>, options?: {
308
+ taskId?: string;
309
+ openingMessage?: string;
310
+ }) => void;
311
+ /** Present = a startSubagent() is pending, read by Agentico.tsx to mount its SubagentRunner. */
312
+ pendingStart: {
313
+ subagentId: string;
314
+ params: Record<string, unknown>;
315
+ taskId?: string;
316
+ openingMessage?: string;
317
+ } | null;
318
+ /** Changes at every startSubagent() — React `key` of that SubagentRunner. */
319
+ startRunId: string | null;
299
320
  }
300
321
  export declare function AgenticoProvider({ children, scope }: {
301
322
  children: React.ReactNode;
@@ -2,20 +2,7 @@ import type { AIConversationTurn } from '@llmnative/react';
2
2
  import { type AgentActivityEntry } from './useAgent';
3
3
  import type { SubagentManifest } from '../domain/subagentManifest';
4
4
  import type { ResultDestination } from '../domain/resultDestination';
5
- /** Monta il vero subagent (useAgent(manifest.definition)) e lo esegue una volta al mount con i
6
- * parametri già raccolti dall'orchestratore Agentico — nessun passo utente aggiuntivo, la
7
- * conversazione di raccolta parametri è già avvenuta a monte (vedi Agentico.tsx). Si registra
8
- * nel pannello Agentico con id stabile via useRef + cleanup closeTask allo smontaggio, con il
9
- * transcript dell'orchestratore (`precedingActivity`) prepeso al proprio log — l'utente vede
10
- * UNA chat continua, mai due task distinti da switchare (vedi OrchestratorRunner).
11
- *
12
- * Con `resumeSeed` valorizzato, il primo giro chiama `agent.resume(...)` invece di
13
- * `agent.run(...)` — riprende una chat già salvata (vedi entityChatStore/
14
- * AgenticoContext.resumeEntityChat) invece di avviarne una nuova. Tutto il resto (consegna del
15
- * risultato ai componentAnchors, ResultDestinationPicker di riserva, registrazione del task) è
16
- * IDENTICO a un run normale — un follow-up dopo un resume produce un risultato esattamente come
17
- * un follow-up dopo un run, nessuna duplicazione di logica per il caso "ripreso". */
18
- export declare function SubagentRunner({ manifest, params, extraDestinations, precedingActivity, taskId: taskIdProp, resumeSeed, model, }: {
5
+ export declare function SubagentRunner({ manifest, params, extraDestinations, precedingActivity, taskId: taskIdProp, resumeSeed, model, openingMessage, }: {
19
6
  manifest: SubagentManifest<any, any, any>;
20
7
  params: Record<string, unknown>;
21
8
  /** Destinazioni scoped alla pagina che ha avviato questo run (es. "Applica a questo Site
@@ -45,4 +32,7 @@ export declare function SubagentRunner({ manifest, params, extraDestinations, pr
45
32
  * OrchestratorRunner — vedi il commento lì). Non passato per un `resumeSeed` — lì non c'è una
46
33
  * scelta "di questo giro" da propagare, si continua semplicemente la chat salvata così com'era. */
47
34
  model?: string;
35
+ /** The first message of the person, when a page starts the subagent directly
36
+ * (AgenticoContext.startSubagent, CR-003): shown in the log and given to the first turn. */
37
+ openingMessage?: string;
48
38
  }): null;
@@ -0,0 +1,28 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { ChatbotAction } from '@llmnative/react';
3
+ /** What the controls of a subagent receive (CR-003). */
4
+ export interface SubagentControlsProps {
5
+ /** The raw params the subagent was started with. */
6
+ params: Record<string, unknown>;
7
+ /** The id of the task in the Agentico panel. */
8
+ taskId: string;
9
+ /** A turn is running: actions that would interrupt it should wait. */
10
+ running: boolean;
11
+ /** Ends the task (stops a running turn and closes it). */
12
+ close: () => void;
13
+ }
14
+ /** The controls of a task: actions of the prompt, and what the host shows above it (a modal, a message). */
15
+ export interface SubagentControls {
16
+ /** Buttons of the composer, next to the attachments (`ChatbotAction` with `onClick`). */
17
+ actions?: ChatbotAction[];
18
+ /** Shown above the composer while the task is open. */
19
+ content?: ReactNode;
20
+ }
21
+ /**
22
+ * A React hook of the host: called by the runner of each task of its subagent, on every render.
23
+ * Its `actions` and `content` must keep their identity while nothing changes (`useMemo`): a new
24
+ * one registers the task again, and a new one at every render would never stop.
25
+ */
26
+ export type UseSubagentControls = (props: SubagentControlsProps) => SubagentControls;
27
+ export declare function registerSubagentControls(controls: Record<string, UseSubagentControls>): void;
28
+ export declare function getSubagentControls(subagentId: string): UseSubagentControls | undefined;
@@ -54,6 +54,15 @@ export interface UseAgentResult<TParams, TResult> extends AgentControlState {
54
54
  /** true dopo che run() ha eseguito almeno un turno con AI abilitata — solo allora la
55
55
  * conversazione ha una history su cui sendMessage() può continuare. */
56
56
  canContinue: boolean;
57
+ /** true when the turns go to `AgentDefinition.executor` (CR-003): no attachments, no
58
+ * deterministic fallback; the models are the executor's (`remoteModels`), not the catalog. */
59
+ remote: boolean;
60
+ /** The models a remote executor offers (`AgentExecutor.models`); `selectedModel` is one of them. */
61
+ remoteModels: Array<{
62
+ label: string;
63
+ value: string;
64
+ group?: string;
65
+ }>;
57
66
  /** Log delle tool call della sessione corrente, più recenti in fondo — azzerato a ogni
58
67
  * run(), accumulato attraverso i sendMessage() successivi. */
59
68
  activity: AgentActivityEntry[];
@@ -134,7 +143,7 @@ export interface UseAgentResult<TParams, TResult> extends AgentControlState {
134
143
  /** Solo la fetta di UseAgentResult che serve a un consumer del pannello globale (Agentico.tsx)
135
144
  * per continuare una conversazione già avviata da run() — TParams non compare in nessuno dei
136
145
  * membri qui sotto, quindi `never` è innocuo. */
137
- export type AgentConversation<TResult> = Pick<UseAgentResult<never, TResult>, 'canContinue' | 'running' | 'error' | 'activity' | 'sendMessage' | 'stop' | 'runFallback' | 'snapshot'>;
146
+ export type AgentConversation<TResult> = Pick<UseAgentResult<never, TResult>, 'canContinue' | 'remote' | 'remoteModels' | 'running' | 'error' | 'activity' | 'sendMessage' | 'stop' | 'runFallback' | 'snapshot'>;
138
147
  export declare function useAgent<TParams, TContext, TResult>(definition: AgentDefinition<TParams, TContext, TResult>, options?: {
139
148
  defaultEnabled?: boolean;
140
149
  }): UseAgentResult<TParams, TResult>;
package/llms.txt CHANGED
@@ -1,35 +1,39 @@
1
- # @llmnative/agentico
2
-
3
- > Agentic chat orchestrator for @llmnative/react apps. A persistent panel: the orchestrator
4
- > collects parameters in conversation and hands the work to host-registered subagents. Every
5
- > subagent has a deterministic fallback. Agentico knows nothing concrete about the host.
6
-
7
- ## Host responsibilities (startup)
8
-
9
- - `registerSubagents(manifests)` — SubagentManifest: id, label, icon, description, indexPath, commands (name, summary, Zod inputSchema, describeOutput), definition (AgentDefinition), toParams, destinationIds, optional crossAgentToolIds, withCollected, manualEntry, componentContexts.
10
- - `registerDestinations({ id: ResultDestination })` — apply(result, { scopeId, dataProvider, storageProvider, proxyFetch }, meta).
11
- - `registerSubagentReports({ subagentId: SubagentReportModule })`.
12
- - `registerCrossAgentTools((ctx) => AgentTool[])` — ctx: attachmentsRef, collected (per-conversation scratchpad), proxyFetch.
13
- - `configureAgenticoPrompts(partial)` — model-facing pack; `agenticoPromptsEn` (default) / `agenticoPromptsIt`.
14
- - `configureEntityChatStore({ storageKey })`.
15
- - i18n: merge `agenticoTranslations.<locale>` into `<App i18n={{ translations }}>`; override any `agentico.*` key.
16
-
17
- ## Mount
18
-
19
- ```tsx
20
- <AgenticoProvider scope={{ id, dataProvider, storageProvider } | null}>
21
- <AgenticoToggle />
22
- <Agentico />
23
- </AgenticoProvider>
24
- ```
25
-
26
- ## Hooks
27
-
28
- - `useAgentico()` — panel state, `startOrchestrator(goal, opts)`, `commitEntityChat(subagentId, entityId, taskId, scopeId, params, title)`, `scope`.
29
- - `useAgenticoPageContext(text, card?)` — what the user is looking at.
30
- - `useSubagentComponentContext(subagentId, componentKey)` — anchor a component to a subagent.
31
- - `useAgent(definition)` — run an AgentDefinition directly.
32
-
33
- ## AgentDefinition
34
-
35
- buildContext (always runs) · buildPrompt · buildFollowUpPrompt · parseResponse (null → fallback) · fallback (required) · describeFallback? · getTools? · microPromptIds?
1
+ # @llmnative/agentico
2
+
3
+ > Agentic chat orchestrator for @llmnative/react apps. A persistent panel: the orchestrator
4
+ > collects parameters in conversation and hands the work to host-registered subagents. Every
5
+ > subagent has a deterministic fallback. Agentico knows nothing concrete about the host.
6
+
7
+ ## Host responsibilities (startup)
8
+
9
+ - `registerSubagents(manifests)` — SubagentManifest: id, label, icon, description, indexPath, commands (name, summary, Zod inputSchema, describeOutput), definition (AgentDefinition), toParams, destinationIds, optional crossAgentToolIds, withCollected, manualEntry, componentContexts, chatEntityId (chat saved at every turn under that entity), onlyWhenAnchored (offered by the orchestrator only when scoped to it).
10
+ - `registerDestinations({ id: ResultDestination })` — apply(result, { scopeId, dataProvider, storageProvider, proxyFetch }, meta).
11
+ - `registerSubagentReports({ subagentId: SubagentReportModule })`.
12
+ - `registerSubagentControls({ subagentId: useControls })` — a hook of the host per task (props: params, taskId, running, close) returning `{ actions?: ChatbotAction[] (with onClick), content?: ReactNode }`, memoized: actions in the prompt, content above it.
13
+ - `SubagentManifest.onArchive(entityId, params)` / `confirmArchive(entityId, params)` — archiving a chat from the history (hover icon).
14
+ - `registerCrossAgentTools((ctx) => AgentTool[])` — ctx: attachmentsRef, collected (per-conversation scratchpad), proxyFetch.
15
+ - `configureAgenticoPrompts(partial)` — model-facing pack; `agenticoPromptsEn` (default) / `agenticoPromptsIt`.
16
+ - `configureEntityChatStore({ storageKey })`.
17
+ - i18n: merge `agenticoTranslations.<locale>` into `<App i18n={{ translations }}>`; override any `agentico.*` key.
18
+
19
+ ## Mount
20
+
21
+ ```tsx
22
+ <AgenticoProvider scope={{ id, dataProvider, storageProvider } | null}>
23
+ <AgenticoToggle />
24
+ <Agentico />
25
+ </AgenticoProvider>
26
+ ```
27
+
28
+ ## Hooks
29
+
30
+ - `useAgentico()` — panel state, `startOrchestrator(goal, opts)`, `startSubagent(subagentId, params, { taskId?, openingMessage? })` (use `entityChatTaskId(subagentId, entityId)` as taskId), `resumeEntityChat`, `commitEntityChat(subagentId, entityId, taskId, scopeId, params, title)`, `scope`.
31
+ - `useAgenticoPageContext(text, card?)` — what the user is looking at.
32
+ - `useSubagentComponentContext(subagentId, componentKey)` — anchor a component to a subagent.
33
+ - `useAgent(definition)` — run an AgentDefinition directly.
34
+
35
+ ## AgentDefinition
36
+
37
+ buildContext (always runs) · buildPrompt · buildFollowUpPrompt · parseResponse (null → fallback) · fallback (required) · describeFallback? · getTools? · microPromptIds? · executor?
38
+
39
+ `executor.turn({ params, context, text, first, signal, model?, onText(whole reply so far), onStep({ id, label, status }) }) → { text, result? }`; `executor.models(params)` / `defaultModel(params)` put the models of the executor in the composer: the turns go to the host instead of the AI provider; `text` is what the person typed (opening message on the first turn). The conversation is `remote: true`: no attachments, no fallback; the picker shows `remoteModels`.
package/package.json CHANGED
@@ -1,79 +1,79 @@
1
- {
2
- "name": "@llmnative/agentico",
3
- "version": "0.1.0",
4
- "description": "Agentic chat orchestrator for @llmnative/react apps: a persistent panel that talks with the user and hands the work to host-registered subagents.",
5
- "main": "dist/index.js",
6
- "module": "dist/index.mjs",
7
- "types": "dist/types/index.d.ts",
8
- "exports": {
9
- ".": {
10
- "types": "./dist/types/index.d.ts",
11
- "import": "./dist/index.mjs",
12
- "require": "./dist/index.js"
13
- }
14
- },
15
- "files": [
16
- "dist",
17
- "llms.txt"
18
- ],
19
- "sideEffects": false,
20
- "scripts": {
21
- "build": "vite build && tsc -p tsconfig.build.json",
22
- "typecheck": "tsc --noEmit",
23
- "test": "vitest run",
24
- "test:watch": "vitest",
25
- "prepublishOnly": "npm run build",
26
- "release:check": "node scripts/release/check-release.mjs"
27
- },
28
- "repository": {
29
- "type": "git",
30
- "url": "git+https://github.com/sherpadvisorylab/llmnative-agentico.git"
31
- },
32
- "bugs": {
33
- "url": "https://github.com/sherpadvisorylab/llmnative-agentico/issues"
34
- },
35
- "homepage": "https://github.com/sherpadvisorylab/llmnative-agentico#readme",
36
- "keywords": [
37
- "llmnative",
38
- "agent",
39
- "orchestrator",
40
- "subagent",
41
- "ai",
42
- "react"
43
- ],
44
- "author": "wolfgan",
45
- "license": "Apache-2.0",
46
- "engines": {
47
- "node": ">=24.18.0 <25"
48
- },
49
- "packageManager": "npm@11.11.0",
50
- "peerDependencies": {
51
- "@llmnative/react": "^1.20.0",
52
- "react": "^19.2.0",
53
- "react-dom": "^19.2.0",
54
- "zod": "^3.24.1"
55
- },
56
- "dependencies": {
57
- "zod-to-json-schema": "^3.24.1"
58
- },
59
- "devDependencies": {
60
- "@llmnative/react": "^1.20.0",
61
- "@phosphor-icons/react": "^2.1.10",
62
- "@testing-library/jest-dom": "^7.0.1",
63
- "@testing-library/react": "^16.3.3",
64
- "@types/react": "^19.3.0",
65
- "@types/react-dom": "^19.3.0",
66
- "happy-dom": "^20.14.5",
67
- "lucide-react": "^1.52.0",
68
- "react": "^19.3.0",
69
- "react-dom": "^19.3.0",
70
- "react-router-dom": "^7.18.4",
71
- "typescript": "^7.0.2",
72
- "vite": "^8.3.2",
73
- "vitest": "^5.0.3",
74
- "zod": "^3.24.1"
75
- },
76
- "publishConfig": {
77
- "access": "public"
78
- }
79
- }
1
+ {
2
+ "name": "@llmnative/agentico",
3
+ "version": "0.2.0",
4
+ "description": "Agentic chat orchestrator for @llmnative/react apps: a persistent panel that talks with the user and hands the work to host-registered subagents.",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.mjs",
7
+ "types": "dist/types/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/types/index.d.ts",
11
+ "import": "./dist/index.mjs",
12
+ "require": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "llms.txt"
18
+ ],
19
+ "sideEffects": false,
20
+ "scripts": {
21
+ "build": "vite build && tsc -p tsconfig.build.json",
22
+ "typecheck": "tsc --noEmit",
23
+ "test": "vitest run",
24
+ "test:watch": "vitest",
25
+ "prepublishOnly": "npm run build",
26
+ "release:check": "node scripts/release/check-release.mjs"
27
+ },
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "git+https://github.com/sherpadvisorylab/llmnative-agentico.git"
31
+ },
32
+ "bugs": {
33
+ "url": "https://github.com/sherpadvisorylab/llmnative-agentico/issues"
34
+ },
35
+ "homepage": "https://github.com/sherpadvisorylab/llmnative-agentico#readme",
36
+ "keywords": [
37
+ "llmnative",
38
+ "agent",
39
+ "orchestrator",
40
+ "subagent",
41
+ "ai",
42
+ "react"
43
+ ],
44
+ "author": "wolfgan",
45
+ "license": "Apache-2.0",
46
+ "engines": {
47
+ "node": ">=24.18.0 <25"
48
+ },
49
+ "packageManager": "npm@11.11.0",
50
+ "peerDependencies": {
51
+ "@llmnative/react": "^1.31.0",
52
+ "react": "^19.2.0",
53
+ "react-dom": "^19.2.0",
54
+ "zod": "^3.24.1"
55
+ },
56
+ "dependencies": {
57
+ "zod-to-json-schema": "^3.24.1"
58
+ },
59
+ "devDependencies": {
60
+ "@llmnative/react": "^1.31.0",
61
+ "@phosphor-icons/react": "^2.1.10",
62
+ "@testing-library/jest-dom": "^7.0.1",
63
+ "@testing-library/react": "^16.3.3",
64
+ "@types/react": "^19.3.0",
65
+ "@types/react-dom": "^19.3.0",
66
+ "happy-dom": "^20.14.5",
67
+ "lucide-react": "^1.52.0",
68
+ "react": "^19.3.0",
69
+ "react-dom": "^19.3.0",
70
+ "react-router-dom": "^7.18.4",
71
+ "typescript": "^7.0.2",
72
+ "vite": "^8.3.2",
73
+ "vitest": "^5.0.3",
74
+ "zod": "^3.24.1"
75
+ },
76
+ "publishConfig": {
77
+ "access": "public"
78
+ }
79
+ }