🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

@agentskit/angular

Package Overview
Dependencies
Maintainers
1
Versions
25
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@agentskit/angular - npm Package Compare versions

Comparing version
0.4.7
to
0.4.8
+31
-27
dist/fesm2022/agentskit-angular.mjs

@@ -24,20 +24,12 @@ import * as i0 from '@angular/core';

this.stream$ = this._stream$.asObservable();
this.send = (text) => {
void this.requireController().send(text);
};
this.send = (text) => this.requireController().send(text);
this.stop = () => this.requireController().stop();
this.retry = () => {
void this.requireController().retry();
};
this.retry = () => this.requireController().retry();
this.edit = (messageId, newContent, opts) => this.requireController().edit(messageId, newContent, opts);
this.regenerate = (messageId) => this.requireController().regenerate(messageId);
this.setInput = (value) => this.requireController().setInput(value);
this.clear = () => {
void this.requireController().clear();
};
this.clear = () => this.requireController().clear();
this.proposeToolCall = (proposal) => this.requireController().proposeToolCall(proposal);
this.approve = (id) => {
void this.requireController().approve(id);
};
this.deny = (id) => {
void this.requireController().deny(id);
};
this.approve = (id) => this.requireController().approve(id);
this.deny = (id, reason) => this.requireController().deny(id, reason);
}

@@ -99,4 +91,4 @@ init(config) {

* Headless Angular chat components mirroring `@agentskit/react`'s set. Each
* renders `data-ak-*` attributes only — bring your own CSS. Standalone +
* JIT-friendly (inline templates); pairs with the `AgentskitChat` service.
* renders `data-ak-*` attributes only — bring your own CSS. Standalone with
* inline templates; published as partial-Ivy (AOT/APF) via ng-packagr.
*/

@@ -167,2 +159,5 @@ class ChatContainerComponent {

}
get isBlocked() {
return this.disabled || this.chat.status === 'streaming';
}
onSubmit(e) {

@@ -179,4 +174,5 @@ e.preventDefault();

submit() {
if (this.chat.input.trim())
this.chat.send(this.chat.input);
if (this.isBlocked || !this.chat.input.trim())
return;
void this.chat.send(this.chat.input);
}

@@ -186,3 +182,2 @@ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: InputBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }

<textarea
role="textbox"
data-ak-input

@@ -192,7 +187,7 @@ rows="1"

[attr.placeholder]="placeholder"
[disabled]="disabled"
[disabled]="isBlocked"
(input)="chat.setInput($any($event.target).value)"
(keydown.enter)="onEnter($event)"
></textarea>
<button data-ak-send type="submit" [disabled]="disabled || !chat.input.trim()">Send</button>
<button data-ak-send type="submit" [disabled]="isBlocked || !chat.input.trim()">Send</button>
</form>`, isInline: true }); }

@@ -207,3 +202,2 @@ }

<textarea
role="textbox"
data-ak-input

@@ -213,7 +207,7 @@ rows="1"

[attr.placeholder]="placeholder"
[disabled]="disabled"
[disabled]="isBlocked"
(input)="chat.setInput($any($event.target).value)"
(keydown.enter)="onEnter($event)"
></textarea>
<button data-ak-send type="submit" [disabled]="disabled || !chat.input.trim()">Send</button>
<button data-ak-send type="submit" [disabled]="isBlocked || !chat.input.trim()">Send</button>
</form>`,

@@ -295,3 +289,8 @@ }]

static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.18", type: ToolCallViewComponent, isStandalone: true, selector: "ak-tool-call-view", inputs: { toolCall: "toolCall" }, ngImport: i0, template: `<div data-ak-tool-call [attr.data-ak-tool-status]="toolCall.status">
<button data-ak-tool-toggle type="button" (click)="expanded.set(!expanded())">
<button
data-ak-tool-toggle
type="button"
[attr.aria-expanded]="expanded()"
(click)="expanded.set(!expanded())"
>
{{ toolCall.name }}

@@ -315,3 +314,8 @@ </button>

template: `<div data-ak-tool-call [attr.data-ak-tool-status]="toolCall.status">
<button data-ak-tool-toggle type="button" (click)="expanded.set(!expanded())">
<button
data-ak-tool-toggle
type="button"
[attr.aria-expanded]="expanded()"
(click)="expanded.set(!expanded())"
>
{{ toolCall.name }}

@@ -318,0 +322,0 @@ </button>

@@ -1,1 +0,1 @@

{"version":3,"file":"agentskit-angular.mjs","sources":["../../src/chat.service.ts","../../src/components.ts","../../src/agentskit-angular.ts"],"sourcesContent":["import { Injectable, OnDestroy, signal, type WritableSignal } from '@angular/core'\nimport { BehaviorSubject, type Observable } from 'rxjs'\nimport { createChatController } from '@agentskit/core'\nimport type {\n ChatConfig,\n ChatController,\n ChatReturn,\n ChatState,\n ToolCall,\n} from '@agentskit/core'\n\n/**\n * Angular service wrapping the shared `ChatController`. Exposes\n * chat state both as a Signal (template-friendly) and as a\n * BehaviorSubject (RxJS interop).\n *\n * Usage:\n * @Component({ ... })\n * export class ChatPage {\n * constructor(public chat: AgentskitChat) {\n * chat.init({ adapter })\n * }\n * }\n */\n@Injectable({ providedIn: 'root' })\nexport class AgentskitChat implements OnDestroy {\n private controller?: ChatController\n private unsubscribe?: () => void\n\n readonly state: WritableSignal<ChatState | null> = signal(null)\n private readonly _stream$ = new BehaviorSubject<ChatState | null>(null)\n readonly stream$: Observable<ChatState | null> = this._stream$.asObservable()\n\n init(config: ChatConfig): ChatReturn {\n if (this.controller) this.destroy()\n this.controller = createChatController(config)\n const push = (): void => {\n const current = this.controller?.getState() ?? null\n this.state.set(current)\n this._stream$.next(current)\n }\n push()\n this.unsubscribe = this.controller.subscribe(push)\n return this.snapshot()\n }\n\n snapshot(): ChatReturn {\n const c = this.requireController()\n return {\n ...c.getState(),\n send: c.send,\n stop: c.stop,\n retry: c.retry,\n edit: c.edit,\n regenerate: c.regenerate,\n setInput: c.setInput,\n clear: c.clear,\n proposeToolCall: c.proposeToolCall,\n approve: c.approve,\n deny: c.deny,\n }\n }\n\n send = (text: string): void => {\n void this.requireController().send(text)\n }\n\n stop = (): void => this.requireController().stop()\n retry = (): void => {\n void this.requireController().retry()\n }\n setInput = (value: string): void => this.requireController().setInput(value)\n clear = (): void => {\n void this.requireController().clear()\n }\n proposeToolCall = (proposal: Parameters<ChatReturn['proposeToolCall']>[0]): Promise<ToolCall> =>\n this.requireController().proposeToolCall(proposal)\n approve = (id: string): void => {\n void this.requireController().approve(id)\n }\n deny = (id: string): void => {\n void this.requireController().deny(id)\n }\n\n destroy(): void {\n this.unsubscribe?.()\n this.controller?.stop()\n this.unsubscribe = undefined\n this.controller = undefined\n this.state.set(null)\n this._stream$.next(null)\n }\n\n ngOnDestroy(): void {\n this.destroy()\n }\n\n private requireController(): ChatController {\n if (!this.controller) throw new Error('AgentskitChat.init(...) must be called first')\n return this.controller\n }\n}\n","import {\n Component,\n Input,\n ViewChild,\n ElementRef,\n signal,\n type AfterViewInit,\n type OnDestroy,\n} from '@angular/core'\nimport type { Message as MessageType, ChatReturn, ToolCall } from '@agentskit/core'\n\n/**\n * Headless Angular chat components mirroring `@agentskit/react`'s set. Each\n * renders `data-ak-*` attributes only — bring your own CSS. Standalone +\n * JIT-friendly (inline templates); pairs with the `AgentskitChat` service.\n */\n\n@Component({\n selector: 'ak-chat-container',\n standalone: true,\n template: `<div #scroll data-ak-chat-container data-testid=\"ak-chat-container\"><ng-content /></div>`,\n})\nexport class ChatContainerComponent implements AfterViewInit, OnDestroy {\n @ViewChild('scroll', { static: true }) scrollRef!: ElementRef<HTMLDivElement>\n private observer?: MutationObserver\n\n ngAfterViewInit(): void {\n const el = this.scrollRef?.nativeElement\n if (!el || typeof MutationObserver === 'undefined') return\n const observer = new MutationObserver(() => {\n el.scrollTop = el.scrollHeight\n })\n // Some non-browser envs (e.g. happy-dom) expose a partial MutationObserver.\n if (typeof observer.observe !== 'function') return\n this.observer = observer\n observer.observe(el, { childList: true, subtree: true, characterData: true })\n }\n\n ngOnDestroy(): void {\n if (typeof this.observer?.disconnect === 'function') this.observer.disconnect()\n }\n}\n\n@Component({\n selector: 'ak-message',\n standalone: true,\n template: `<div\n data-ak-message\n [attr.data-ak-role]=\"message.role\"\n [attr.data-ak-status]=\"message.status\"\n >\n <div data-ak-content>{{ message.content }}</div>\n </div>`,\n})\nexport class MessageComponent {\n @Input({ required: true }) message!: MessageType\n}\n\n@Component({\n selector: 'ak-input-bar',\n standalone: true,\n template: `<form data-ak-input-bar (submit)=\"onSubmit($event)\">\n <textarea\n role=\"textbox\"\n data-ak-input\n rows=\"1\"\n [value]=\"chat.input\"\n [attr.placeholder]=\"placeholder\"\n [disabled]=\"disabled\"\n (input)=\"chat.setInput($any($event.target).value)\"\n (keydown.enter)=\"onEnter($event)\"\n ></textarea>\n <button data-ak-send type=\"submit\" [disabled]=\"disabled || !chat.input.trim()\">Send</button>\n </form>`,\n})\nexport class InputBarComponent {\n @Input({ required: true }) chat!: ChatReturn\n @Input() placeholder = 'Type a message...'\n @Input() disabled = false\n\n onSubmit(e: Event): void {\n e.preventDefault()\n this.submit()\n }\n\n onEnter(e: Event): void {\n if (!(e as KeyboardEvent).shiftKey) {\n e.preventDefault()\n this.submit()\n }\n }\n\n private submit(): void {\n if (this.chat.input.trim()) this.chat.send(this.chat.input)\n }\n}\n\n@Component({\n selector: 'ak-markdown',\n standalone: true,\n template: `<div data-ak-markdown [attr.data-ak-streaming]=\"streaming ? 'true' : null\">{{ content }}</div>`,\n})\nexport class MarkdownComponent {\n @Input({ required: true }) content = ''\n @Input() streaming = false\n}\n\n@Component({\n selector: 'ak-code-block',\n standalone: true,\n template: `<div data-ak-code-block [attr.data-ak-language]=\"language\">\n <pre><code>{{ code }}</code></pre>\n @if (copyable) {\n <button data-ak-copy type=\"button\" (click)=\"copy()\">Copy</button>\n }\n </div>`,\n})\nexport class CodeBlockComponent {\n @Input({ required: true }) code = ''\n @Input() language?: string\n @Input() copyable = false\n\n copy(): void {\n void globalThis.navigator?.clipboard?.writeText(this.code)\n }\n}\n\n@Component({\n selector: 'ak-tool-call-view',\n standalone: true,\n template: `<div data-ak-tool-call [attr.data-ak-tool-status]=\"toolCall.status\">\n <button data-ak-tool-toggle type=\"button\" (click)=\"expanded.set(!expanded())\">\n {{ toolCall.name }}\n </button>\n @if (expanded()) {\n <div data-ak-tool-details>\n <pre data-ak-tool-args>{{ argsJson }}</pre>\n @if (toolCall.result) {\n <div data-ak-tool-result>{{ toolCall.result }}</div>\n }\n </div>\n }\n </div>`,\n})\nexport class ToolCallViewComponent {\n @Input({ required: true }) toolCall!: ToolCall\n readonly expanded = signal(false)\n\n get argsJson(): string {\n return JSON.stringify(this.toolCall.args, null, 2)\n }\n}\n\n@Component({\n selector: 'ak-thinking-indicator',\n standalone: true,\n template: `@if (visible) {\n <div data-ak-thinking>\n <span data-ak-thinking-dots><span>•</span><span>•</span><span>•</span></span>\n <span data-ak-thinking-label>{{ label }}</span>\n </div>\n }`,\n})\nexport class ThinkingIndicatorComponent {\n @Input({ required: true }) visible = false\n @Input() label = 'Thinking...'\n}\n\n@Component({\n selector: 'ak-tool-confirmation',\n standalone: true,\n template: `@if (toolCall.status === 'requires_confirmation') {\n <div data-ak-tool-confirmation [attr.data-ak-tool-name]=\"toolCall.name\">\n <div data-ak-tool-confirmation-header>\n <span data-ak-tool-confirmation-name>{{ toolCall.name }}</span>\n <span data-ak-tool-confirmation-status>requires confirmation</span>\n </div>\n <div data-ak-tool-confirmation-args>{{ argsJson }}</div>\n <div data-ak-tool-confirmation-actions>\n <button data-ak-tool-confirmation-approve type=\"button\" (click)=\"onApprove(toolCall.id)\">\n Approve\n </button>\n <button data-ak-tool-confirmation-deny type=\"button\" (click)=\"onDeny(toolCall.id)\">\n Deny\n </button>\n </div>\n </div>\n }`,\n})\nexport class ToolConfirmationComponent {\n @Input({ required: true }) toolCall!: ToolCall\n @Input({ required: true }) onApprove!: (toolCallId: string) => void\n @Input({ required: true }) onDeny!: (toolCallId: string, reason?: string) => void\n\n get argsJson(): string {\n return JSON.stringify(this.toolCall.args, null, 2)\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
{"version":3,"file":"agentskit-angular.mjs","sources":["../../src/chat.service.ts","../../src/components.ts","../../src/agentskit-angular.ts"],"sourcesContent":["import { Injectable, OnDestroy, signal, type WritableSignal } from '@angular/core'\nimport { BehaviorSubject, type Observable } from 'rxjs'\nimport { createChatController } from '@agentskit/core'\nimport type {\n ChatConfig,\n ChatController,\n ChatReturn,\n ChatState,\n EditOptions,\n ToolCall,\n} from '@agentskit/core'\n\n/**\n * Angular service wrapping the shared `ChatController`. Exposes\n * chat state both as a Signal (template-friendly) and as a\n * BehaviorSubject (RxJS interop).\n *\n * Usage:\n * @Component({ ... })\n * export class ChatPage {\n * constructor(public chat: AgentskitChat) {\n * chat.init({ adapter })\n * }\n * }\n */\n@Injectable({ providedIn: 'root' })\nexport class AgentskitChat implements OnDestroy {\n private controller?: ChatController\n private unsubscribe?: () => void\n\n readonly state: WritableSignal<ChatState | null> = signal(null)\n private readonly _stream$ = new BehaviorSubject<ChatState | null>(null)\n readonly stream$: Observable<ChatState | null> = this._stream$.asObservable()\n\n init(config: ChatConfig): ChatReturn {\n if (this.controller) this.destroy()\n this.controller = createChatController(config)\n const push = (): void => {\n const current = this.controller?.getState() ?? null\n this.state.set(current)\n this._stream$.next(current)\n }\n push()\n this.unsubscribe = this.controller.subscribe(push)\n return this.snapshot()\n }\n\n snapshot(): ChatReturn {\n const c = this.requireController()\n return {\n ...c.getState(),\n send: c.send,\n stop: c.stop,\n retry: c.retry,\n edit: c.edit,\n regenerate: c.regenerate,\n setInput: c.setInput,\n clear: c.clear,\n proposeToolCall: c.proposeToolCall,\n approve: c.approve,\n deny: c.deny,\n }\n }\n\n send = (text: string): Promise<void> => this.requireController().send(text)\n\n stop = (): void => this.requireController().stop()\n\n retry = (): Promise<void> => this.requireController().retry()\n\n edit = (messageId: string, newContent: string, opts?: EditOptions): Promise<void> =>\n this.requireController().edit(messageId, newContent, opts)\n\n regenerate = (messageId?: string): Promise<void> => this.requireController().regenerate(messageId)\n\n setInput = (value: string): void => this.requireController().setInput(value)\n\n clear = (): Promise<void> => this.requireController().clear()\n\n proposeToolCall = (proposal: Parameters<ChatReturn['proposeToolCall']>[0]): Promise<ToolCall> =>\n this.requireController().proposeToolCall(proposal)\n\n approve = (id: string): Promise<void> => this.requireController().approve(id)\n\n deny = (id: string, reason?: string): Promise<void> => this.requireController().deny(id, reason)\n\n destroy(): void {\n this.unsubscribe?.()\n this.controller?.stop()\n this.unsubscribe = undefined\n this.controller = undefined\n this.state.set(null)\n this._stream$.next(null)\n }\n\n ngOnDestroy(): void {\n this.destroy()\n }\n\n private requireController(): ChatController {\n if (!this.controller) throw new Error('AgentskitChat.init(...) must be called first')\n return this.controller\n }\n}\n","import {\n Component,\n Input,\n ViewChild,\n ElementRef,\n signal,\n type AfterViewInit,\n type OnDestroy,\n} from '@angular/core'\nimport type { Message as MessageType, ChatReturn, ToolCall } from '@agentskit/core'\n\n/**\n * Headless Angular chat components mirroring `@agentskit/react`'s set. Each\n * renders `data-ak-*` attributes only — bring your own CSS. Standalone with\n * inline templates; published as partial-Ivy (AOT/APF) via ng-packagr.\n */\n\n@Component({\n selector: 'ak-chat-container',\n standalone: true,\n template: `<div #scroll data-ak-chat-container data-testid=\"ak-chat-container\"><ng-content /></div>`,\n})\nexport class ChatContainerComponent implements AfterViewInit, OnDestroy {\n @ViewChild('scroll', { static: true }) scrollRef!: ElementRef<HTMLDivElement>\n private observer?: MutationObserver\n\n ngAfterViewInit(): void {\n const el = this.scrollRef?.nativeElement\n if (!el || typeof MutationObserver === 'undefined') return\n const observer = new MutationObserver(() => {\n el.scrollTop = el.scrollHeight\n })\n // Some non-browser envs (e.g. happy-dom) expose a partial MutationObserver.\n if (typeof observer.observe !== 'function') return\n this.observer = observer\n observer.observe(el, { childList: true, subtree: true, characterData: true })\n }\n\n ngOnDestroy(): void {\n if (typeof this.observer?.disconnect === 'function') this.observer.disconnect()\n }\n}\n\n@Component({\n selector: 'ak-message',\n standalone: true,\n template: `<div\n data-ak-message\n [attr.data-ak-role]=\"message.role\"\n [attr.data-ak-status]=\"message.status\"\n >\n <div data-ak-content>{{ message.content }}</div>\n </div>`,\n})\nexport class MessageComponent {\n @Input({ required: true }) message!: MessageType\n}\n\n@Component({\n selector: 'ak-input-bar',\n standalone: true,\n template: `<form data-ak-input-bar (submit)=\"onSubmit($event)\">\n <textarea\n data-ak-input\n rows=\"1\"\n [value]=\"chat.input\"\n [attr.placeholder]=\"placeholder\"\n [disabled]=\"isBlocked\"\n (input)=\"chat.setInput($any($event.target).value)\"\n (keydown.enter)=\"onEnter($event)\"\n ></textarea>\n <button data-ak-send type=\"submit\" [disabled]=\"isBlocked || !chat.input.trim()\">Send</button>\n </form>`,\n})\nexport class InputBarComponent {\n @Input({ required: true }) chat!: ChatReturn\n @Input() placeholder = 'Type a message...'\n @Input() disabled = false\n\n get isBlocked(): boolean {\n return this.disabled || this.chat.status === 'streaming'\n }\n\n onSubmit(e: Event): void {\n e.preventDefault()\n this.submit()\n }\n\n onEnter(e: Event): void {\n if (!(e as KeyboardEvent).shiftKey) {\n e.preventDefault()\n this.submit()\n }\n }\n\n private submit(): void {\n if (this.isBlocked || !this.chat.input.trim()) return\n void this.chat.send(this.chat.input)\n }\n}\n\n@Component({\n selector: 'ak-markdown',\n standalone: true,\n template: `<div data-ak-markdown [attr.data-ak-streaming]=\"streaming ? 'true' : null\">{{ content }}</div>`,\n})\nexport class MarkdownComponent {\n @Input({ required: true }) content = ''\n @Input() streaming = false\n}\n\n@Component({\n selector: 'ak-code-block',\n standalone: true,\n template: `<div data-ak-code-block [attr.data-ak-language]=\"language\">\n <pre><code>{{ code }}</code></pre>\n @if (copyable) {\n <button data-ak-copy type=\"button\" (click)=\"copy()\">Copy</button>\n }\n </div>`,\n})\nexport class CodeBlockComponent {\n @Input({ required: true }) code = ''\n @Input() language?: string\n @Input() copyable = false\n\n copy(): void {\n void globalThis.navigator?.clipboard?.writeText(this.code)\n }\n}\n\n@Component({\n selector: 'ak-tool-call-view',\n standalone: true,\n template: `<div data-ak-tool-call [attr.data-ak-tool-status]=\"toolCall.status\">\n <button\n data-ak-tool-toggle\n type=\"button\"\n [attr.aria-expanded]=\"expanded()\"\n (click)=\"expanded.set(!expanded())\"\n >\n {{ toolCall.name }}\n </button>\n @if (expanded()) {\n <div data-ak-tool-details>\n <pre data-ak-tool-args>{{ argsJson }}</pre>\n @if (toolCall.result) {\n <div data-ak-tool-result>{{ toolCall.result }}</div>\n }\n </div>\n }\n </div>`,\n})\nexport class ToolCallViewComponent {\n @Input({ required: true }) toolCall!: ToolCall\n readonly expanded = signal(false)\n\n get argsJson(): string {\n return JSON.stringify(this.toolCall.args, null, 2)\n }\n}\n\n@Component({\n selector: 'ak-thinking-indicator',\n standalone: true,\n template: `@if (visible) {\n <div data-ak-thinking>\n <span data-ak-thinking-dots><span>•</span><span>•</span><span>•</span></span>\n <span data-ak-thinking-label>{{ label }}</span>\n </div>\n }`,\n})\nexport class ThinkingIndicatorComponent {\n @Input({ required: true }) visible = false\n @Input() label = 'Thinking...'\n}\n\n@Component({\n selector: 'ak-tool-confirmation',\n standalone: true,\n template: `@if (toolCall.status === 'requires_confirmation') {\n <div data-ak-tool-confirmation [attr.data-ak-tool-name]=\"toolCall.name\">\n <div data-ak-tool-confirmation-header>\n <span data-ak-tool-confirmation-name>{{ toolCall.name }}</span>\n <span data-ak-tool-confirmation-status>requires confirmation</span>\n </div>\n <div data-ak-tool-confirmation-args>{{ argsJson }}</div>\n <div data-ak-tool-confirmation-actions>\n <button data-ak-tool-confirmation-approve type=\"button\" (click)=\"onApprove(toolCall.id)\">\n Approve\n </button>\n <button data-ak-tool-confirmation-deny type=\"button\" (click)=\"onDeny(toolCall.id)\">\n Deny\n </button>\n </div>\n </div>\n }`,\n})\nexport class ToolConfirmationComponent {\n @Input({ required: true }) toolCall!: ToolCall\n @Input({ required: true }) onApprove!: (toolCallId: string) => void\n @Input({ required: true }) onDeny!: (toolCallId: string, reason?: string) => void\n\n get argsJson(): string {\n return JSON.stringify(this.toolCall.args, null, 2)\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
# @agentskit/angular
<p align="center"><img src="https://raw.githubusercontent.com/AgentsKit-io/agentskit/main/apps/docs-next/public/brand/logo-wordmark.svg" alt="AgentsKit" width="180" /></p>
Profile: <code>concise-package</code>
<p align="center"><img alt="AgentsKit" src="https://raw.githubusercontent.com/AgentsKit-io/agentskit/main/apps/docs-next/public/brand/logo-wordmark.svg" width="180" /></p>
Angular 18+ service (Signal + RxJS) + headless chat components. Same `ChatReturn` contract every AgentsKit framework binding ships.

@@ -16,2 +18,8 @@

## Verified proof
- Package metadata and tests live under `packages/angular/`.
- Package guide: https://www.agentskit.io/docs/packages/angular
- Stability map: [docs/STABILITY.md](../../docs/STABILITY.md)
## How this fits the ecosystem

@@ -37,2 +45,3 @@

<!-- readme-command:install -->
```bash

@@ -42,6 +51,7 @@ npm install @agentskit/angular @agentskit/adapters

Peers: `@angular/core ^18 || ^19 || ^20`, `rxjs ^7`.
Peers: `@angular/core ^18 || ^19 || ^20 || ^21`, `rxjs ^7`.
## Quick example
<!-- readme-example:quickstart -->
```ts

@@ -77,13 +87,14 @@ import { Component, inject } from '@angular/core'

The headless components compile in **JIT** (inline templates). Most Angular apps
are JIT-capable in dev/test; for fully AOT-only prod builds, render via the
`AgentskitChat` service + your own templates (an `ng-packagr`/AOT build of these
components is tracked for a future release).
Published as **partial-Ivy AOT** via `ng-packagr` (APF FESM2022 + `.d.ts`, ESM-only).
Works in AOT production apps — no JIT-only caveat. The package intentionally
does not ship dual CJS; Angular Package Format is ESM.
`init(config)` wires the controller and returns a `ChatReturn` snapshot; read live
state from the `state` `Signal` (`chat.state()`) or the `stream$` `Observable`.
Async actions return the underlying controller Promises. Call `destroy()` (or rely
on `ngOnDestroy`) to unsubscribe + stop; both are idempotent and safe to re-init.
## API
- `AgentskitChat` service — DI-friendly. `init(config)` returns a `ChatReturn` snapshot and starts the session; `state: Signal<ChatState | null>` and `stream$: Observable<ChatState | null>` expose live state. Actions: `send(text)`, `setInput(v)`, `stop`, `retry`, `clear`, `approve`, `deny`, `edit`, `regenerate`, `destroy`.
- `AgentskitChat` service — DI-friendly. `init(config)` returns a `ChatReturn` snapshot and starts the session; `state: Signal<ChatState | null>` and `stream$: Observable<ChatState | null>` expose live state. Full action surface: `send(text)`, `setInput(v)`, `stop`, `retry`, `clear`, `approve`, `deny(id, reason?)`, `edit`, `regenerate`, `proposeToolCall`, `destroy`.
- Headless standalone components at parity with `@agentskit/react` (`data-ak-*` only): `ChatContainerComponent` (`<ak-chat-container>`), `MessageComponent`, `InputBarComponent`, `MarkdownComponent`, `CodeBlockComponent`, `ToolCallViewComponent`, `ThinkingIndicatorComponent`, `ToolConfirmationComponent`.

@@ -114,1 +125,11 @@

[Full documentation](https://www.agentskit.io/docs/packages/angular) · [GitHub](https://github.com/AgentsKit-io/agentskit)
## Maturity and compatibility
- Stability: **beta** — see [docs/STABILITY.md](../../docs/STABILITY.md)
- **Node.js 20+** and **TypeScript** strict mode
- Published as `@agentskit/angular`
## Contributing
See [CONTRIBUTING.md](../../CONTRIBUTING.md) and the monorepo [LICENSE](../../LICENSE).
import * as i0 from '@angular/core';
import { OnDestroy, WritableSignal, AfterViewInit, ElementRef } from '@angular/core';
import { Observable } from 'rxjs';
import { ChatState, ChatConfig, ChatReturn, ToolCall, Message } from '@agentskit/core';
import { ChatState, ChatConfig, ChatReturn, EditOptions, ToolCall, Message } from '@agentskit/core';

@@ -27,10 +27,12 @@ /**

snapshot(): ChatReturn;
send: (text: string) => void;
send: (text: string) => Promise<void>;
stop: () => void;
retry: () => void;
retry: () => Promise<void>;
edit: (messageId: string, newContent: string, opts?: EditOptions) => Promise<void>;
regenerate: (messageId?: string) => Promise<void>;
setInput: (value: string) => void;
clear: () => void;
clear: () => Promise<void>;
proposeToolCall: (proposal: Parameters<ChatReturn["proposeToolCall"]>[0]) => Promise<ToolCall>;
approve: (id: string) => void;
deny: (id: string) => void;
approve: (id: string) => Promise<void>;
deny: (id: string, reason?: string) => Promise<void>;
destroy(): void;

@@ -45,4 +47,4 @@ ngOnDestroy(): void;

* Headless Angular chat components mirroring `@agentskit/react`'s set. Each
* renders `data-ak-*` attributes only — bring your own CSS. Standalone +
* JIT-friendly (inline templates); pairs with the `AgentskitChat` service.
* renders `data-ak-*` attributes only — bring your own CSS. Standalone with
* inline templates; published as partial-Ivy (AOT/APF) via ng-packagr.
*/

@@ -66,2 +68,3 @@ declare class ChatContainerComponent implements AfterViewInit, OnDestroy {

disabled: boolean;
get isBlocked(): boolean;
onSubmit(e: Event): void;

@@ -68,0 +71,0 @@ onEnter(e: Event): void;

@@ -1,1 +0,1 @@

{"version":3,"file":"agentskit-angular.d.ts","sources":["../../src/chat.service.ts","../../src/components.ts"],"mappings":";;;;;AAWA;;;;;;;;;;;;AAYG;AACH,cACa,aAAc,YAAW,SAAS;;;oBAI7B,cAAc,CAAC,SAAS;AACxC;sBACkB,UAAU,CAAC,SAAS;AAEtC,iBAAa,UAAU,GAAG,UAAU;AAapC,gBAAY,UAAU;AAiBtB;;;AAQA;;AAIA,gCAA6B,UAAU,CAAC,UAAU,4BAA0B,OAAO,CAAC,QAAQ;AAE5F;AAGA;AAIA;AASA;AAIA;yCAxEW,aAAa;6CAAb,aAAa;AA4EzB;;AC1FD;;;;AAIG;AAEH,cAKa,sBAAuB,YAAW,aAAa,EAAE,SAAS;AAC9B,eAAY,UAAU,CAAC,cAAc;;AAG5E;AAYA;yCAhBW,sBAAsB;2CAAtB,sBAAsB;AAmBlC;AAED,cAWa,gBAAgB;aACUA,OAAW;yCADrC,gBAAgB;2CAAhB,gBAAgB;AAE5B;AAED,cAiBa,iBAAiB;UACM,UAAU;AACnC;AACA;AAET,gBAAY,KAAK;AAKjB,eAAW,KAAK;AAOhB;yCAjBW,iBAAiB;2CAAjB,iBAAiB;AAoB7B;AAED,cAKa,iBAAiB;AACD;AAClB;yCAFE,iBAAiB;2CAAjB,iBAAiB;AAG7B;AAED,cAUa,kBAAkB;AACF;;AAElB;AAET;yCALW,kBAAkB;2CAAlB,kBAAkB;AAQ9B;AAED,cAiBa,qBAAqB;cACM,QAAQ;uBAC7BC,EAAA,CAAA,cAAA;;yCAFN,qBAAqB;2CAArB,qBAAqB;AAOjC;AAED,cAUa,0BAA0B;AACV;AAClB;yCAFE,0BAA0B;2CAA1B,0BAA0B;AAGtC;AAED,cAqBa,yBAAyB;cACE,QAAQ;AACnB;AACA;;yCAHhB,yBAAyB;2CAAzB,yBAAyB;AAQrC;;;;","names":["MessageType","_angular_core"]}
{"version":3,"file":"agentskit-angular.d.ts","sources":["../../src/chat.service.ts","../../src/components.ts"],"mappings":";;;;;AAYA;;;;;;;;;;;;AAYG;AACH,cACa,aAAc,YAAW,SAAS;;;oBAI7B,cAAc,CAAC,SAAS;AACxC;sBACkB,UAAU,CAAC,SAAS;AAEtC,iBAAa,UAAU,GAAG,UAAU;AAapC,gBAAY,UAAU;4BAiBC,OAAO;;AAI9B,iBAAY,OAAO;AAEnB,yDAAsD,WAAW,KAAG,OAAO;wCAGxC,OAAO;AAE1C;AAEA,iBAAY,OAAO;AAEnB,gCAA6B,UAAU,CAAC,UAAU,4BAA0B,OAAO,CAAC,QAAQ;6BAGpE,OAAO;2CAEO,OAAO;AAE7C;AASA;AAIA;yCAzEW,aAAa;6CAAb,aAAa;AA6EzB;;AC5FD;;;;AAIG;AAEH,cAKa,sBAAuB,YAAW,aAAa,EAAE,SAAS;AAC9B,eAAY,UAAU,CAAC,cAAc;;AAG5E;AAYA;yCAhBW,sBAAsB;2CAAtB,sBAAsB;AAmBlC;AAED,cAWa,gBAAgB;aACUA,OAAW;yCADrC,gBAAgB;2CAAhB,gBAAgB;AAE5B;AAED,cAgBa,iBAAiB;UACM,UAAU;AACnC;AACA;;AAMT,gBAAY,KAAK;AAKjB,eAAW,KAAK;AAOhB;yCArBW,iBAAiB;2CAAjB,iBAAiB;AAyB7B;AAED,cAKa,iBAAiB;AACD;AAClB;yCAFE,iBAAiB;2CAAjB,iBAAiB;AAG7B;AAED,cAUa,kBAAkB;AACF;;AAElB;AAET;yCALW,kBAAkB;2CAAlB,kBAAkB;AAQ9B;AAED,cAsBa,qBAAqB;cACM,QAAQ;uBAC7BC,EAAA,CAAA,cAAA;;yCAFN,qBAAqB;2CAArB,qBAAqB;AAOjC;AAED,cAUa,0BAA0B;AACV;AAClB;yCAFE,0BAA0B;2CAA1B,0BAA0B;AAGtC;AAED,cAqBa,yBAAyB;cACE,QAAQ;AACnB;AACA;;yCAHhB,yBAAyB;2CAAzB,yBAAyB;AAQrC;;;;","names":["MessageType","_angular_core"]}
{
"name": "@agentskit/angular",
"version": "0.4.7",
"version": "0.4.8",
"description": "Angular signals service + headless chat components for AgentsKit — streaming, tools, and memory across any LLM provider.",

@@ -42,3 +42,3 @@ "keywords": [

"tslib": "^2.8.1",
"@agentskit/core": "1.12.3"
"@agentskit/core": "1.12.4"
},

@@ -66,7 +66,8 @@ "peerDependencies": {

"publishConfig": {
"access": "public"
"access": "public",
"provenance": true
},
"agentskit": {
"stability": "beta",
"stabilityNote": "AgentskitChat service (ChatReturn contract) + full headless component parity with @agentskit/react (standalone, JIT)."
"stabilityNote": "AgentskitChat service (ChatReturn contract) + full headless component parity with @agentskit/react (standalone, partial-Ivy AOT/APF)."
},

@@ -87,3 +88,3 @@ "license": "MIT",

"test": "pnpm build && vitest run",
"test:coverage": "vitest run --coverage",
"test:coverage": "pnpm build && vitest run --coverage",
"lint": "tsc --noEmit",

@@ -90,0 +91,0 @@ "dev": "tsup --watch"

# @agentskit/angular
<p align="center"><img src="https://raw.githubusercontent.com/AgentsKit-io/agentskit/main/apps/docs-next/public/brand/logo-wordmark.svg" alt="AgentsKit" width="180" /></p>
Profile: <code>concise-package</code>
<p align="center"><img alt="AgentsKit" src="https://raw.githubusercontent.com/AgentsKit-io/agentskit/main/apps/docs-next/public/brand/logo-wordmark.svg" width="180" /></p>
Angular 18+ service (Signal + RxJS) + headless chat components. Same `ChatReturn` contract every AgentsKit framework binding ships.

@@ -16,2 +18,8 @@

## Verified proof
- Package metadata and tests live under `packages/angular/`.
- Package guide: https://www.agentskit.io/docs/packages/angular
- Stability map: [docs/STABILITY.md](../../docs/STABILITY.md)
## How this fits the ecosystem

@@ -37,2 +45,3 @@

<!-- readme-command:install -->
```bash

@@ -42,6 +51,7 @@ npm install @agentskit/angular @agentskit/adapters

Peers: `@angular/core ^18 || ^19 || ^20`, `rxjs ^7`.
Peers: `@angular/core ^18 || ^19 || ^20 || ^21`, `rxjs ^7`.
## Quick example
<!-- readme-example:quickstart -->
```ts

@@ -77,13 +87,14 @@ import { Component, inject } from '@angular/core'

The headless components compile in **JIT** (inline templates). Most Angular apps
are JIT-capable in dev/test; for fully AOT-only prod builds, render via the
`AgentskitChat` service + your own templates (an `ng-packagr`/AOT build of these
components is tracked for a future release).
Published as **partial-Ivy AOT** via `ng-packagr` (APF FESM2022 + `.d.ts`, ESM-only).
Works in AOT production apps — no JIT-only caveat. The package intentionally
does not ship dual CJS; Angular Package Format is ESM.
`init(config)` wires the controller and returns a `ChatReturn` snapshot; read live
state from the `state` `Signal` (`chat.state()`) or the `stream$` `Observable`.
Async actions return the underlying controller Promises. Call `destroy()` (or rely
on `ngOnDestroy`) to unsubscribe + stop; both are idempotent and safe to re-init.
## API
- `AgentskitChat` service — DI-friendly. `init(config)` returns a `ChatReturn` snapshot and starts the session; `state: Signal<ChatState | null>` and `stream$: Observable<ChatState | null>` expose live state. Actions: `send(text)`, `setInput(v)`, `stop`, `retry`, `clear`, `approve`, `deny`, `edit`, `regenerate`, `destroy`.
- `AgentskitChat` service — DI-friendly. `init(config)` returns a `ChatReturn` snapshot and starts the session; `state: Signal<ChatState | null>` and `stream$: Observable<ChatState | null>` expose live state. Full action surface: `send(text)`, `setInput(v)`, `stop`, `retry`, `clear`, `approve`, `deny(id, reason?)`, `edit`, `regenerate`, `proposeToolCall`, `destroy`.
- Headless standalone components at parity with `@agentskit/react` (`data-ak-*` only): `ChatContainerComponent` (`<ak-chat-container>`), `MessageComponent`, `InputBarComponent`, `MarkdownComponent`, `CodeBlockComponent`, `ToolCallViewComponent`, `ThinkingIndicatorComponent`, `ToolConfirmationComponent`.

@@ -114,1 +125,11 @@

[Full documentation](https://www.agentskit.io/docs/packages/angular) · [GitHub](https://github.com/AgentsKit-io/agentskit)
## Maturity and compatibility
- Stability: **beta** — see [docs/STABILITY.md](../../docs/STABILITY.md)
- **Node.js 20+** and **TypeScript** strict mode
- Published as `@agentskit/angular`
## Contributing
See [CONTRIBUTING.md](../../CONTRIBUTING.md) and the monorepo [LICENSE](../../LICENSE).