@ai-ecoverse/slicc-spectrum 1.58.2 → 1.59.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.
@@ -3,6 +3,7 @@ import type { SliccDock } from '../components/dock.js';
3
3
  import type { SliccModel } from '../model/types.js';
4
4
  import { ThemedElement } from './base.js';
5
5
  import { Dips } from './dips.js';
6
+ import { Panels } from './panel-command.js';
6
7
  import { type DocumentKind, type ScreenClass, type Surface } from './panels.js';
7
8
  import { TerminalPanels } from './terminals.js';
8
9
  export declare function changeCount(count: number): string;
@@ -33,6 +34,7 @@ export declare class SliccApp extends ThemedElement {
33
34
  layoutKey: string;
34
35
  readonly dips: Dips;
35
36
  readonly terminalPanels: TerminalPanels;
37
+ readonly panels: Panels;
36
38
  constructor();
37
39
  static styles: import("lit").CSSResult[];
38
40
  get dock(): SliccDock;
@@ -20,6 +20,11 @@ export declare class ModelElement extends LitElement {
20
20
  export declare function changesOf(model: SliccModel): ChangesPort;
21
21
  export type Color = 'light' | 'dark';
22
22
  export declare function resolveColor(scheme: ColorScheme, prefersDark: boolean): Color;
23
+ export interface DocumentHold {
24
+ paint(color: Color): void;
25
+ release(): void;
26
+ }
27
+ export declare function holdDocument(doc: Document): DocumentHold;
23
28
  export declare class ThemedElement extends ModelElement {
24
29
  #private;
25
30
  get color(): Color;
@@ -24,5 +24,6 @@ export declare class SliccChat extends ThemedElement {
24
24
  disconnectedCallback(): void;
25
25
  protected firstUpdated(): void;
26
26
  focus(): void;
27
+ get busyReason(): string | null;
27
28
  render(): TemplateResult;
28
29
  }
@@ -0,0 +1,71 @@
1
+ import type { SliccDock } from '../components/dock.js';
2
+ import type { Agent, SliccModel, Sprinkle } from '../model/types.js';
3
+ import { type Direction, type ScreenClass, type Side, type Surface } from './panels.js';
4
+ export type PanelKind = 'surface' | 'chat' | 'terminal' | 'sprinkle' | 'file' | 'diff';
5
+ export interface PanelInfo {
6
+ id: string;
7
+ title: string;
8
+ kind: PanelKind;
9
+ side: Side;
10
+ agent: string | null;
11
+ open: boolean;
12
+ visible: boolean;
13
+ active: boolean;
14
+ busy: string | null;
15
+ }
16
+ export type PanelPlace = Side | {
17
+ direction: Direction;
18
+ ref: string;
19
+ };
20
+ export interface PanelResult {
21
+ code: 0 | 1 | 2 | 5;
22
+ message: string;
23
+ }
24
+ export interface PanelOpenOptions {
25
+ place?: PanelPlace;
26
+ section?: string;
27
+ }
28
+ export interface PanelsHost {
29
+ dock(): SliccDock;
30
+ screen(): ScreenClass;
31
+ model(): SliccModel | null | undefined;
32
+ surfaces(): readonly Surface[];
33
+ sprinkles(): readonly Sprinkle[];
34
+ open(id: string, focus: boolean, section?: string): void;
35
+ reset(): void;
36
+ typing(): boolean;
37
+ }
38
+ export interface PanelCaller {
39
+ agentId: string | null;
40
+ cone?: string | null;
41
+ readOnly?: boolean;
42
+ }
43
+ export interface PanelOutput {
44
+ stdout: string;
45
+ stderr: string;
46
+ code: number;
47
+ }
48
+ export declare class Panels {
49
+ #private;
50
+ constructor(host: PanelsHost);
51
+ quietly<T>(run: () => T): T;
52
+ closed(id: string): void;
53
+ closedAgo(id: string): number | null;
54
+ recentClose(): {
55
+ id: string;
56
+ ago: number;
57
+ } | null;
58
+ typing(): boolean;
59
+ agents(): readonly Agent[];
60
+ active(): string | null;
61
+ list(): PanelInfo[];
62
+ find(id: string): PanelInfo | undefined;
63
+ open(id: string, options?: PanelOpenOptions): PanelResult;
64
+ focus(id: string, options?: PanelOpenOptions): PanelResult;
65
+ close(id: string): PanelResult;
66
+ move(id: string, place: PanelPlace): PanelResult;
67
+ reset(): PanelResult;
68
+ }
69
+ export declare function panelCommand(app: {
70
+ panels: Panels;
71
+ }, argv: readonly string[], caller: PanelCaller): PanelOutput;
@@ -32,7 +32,8 @@ export declare function screenClass(width: number): ScreenClass;
32
32
  export declare function surface(id: string, items?: readonly Surface[]): Surface | undefined;
33
33
  export declare function create(tag: string, model: SliccModel, params?: PanelParams): HTMLElement;
34
34
  export declare function placement(dock: SliccDock, side: Side, screen: ScreenClass): Placement;
35
- export declare function openSurface(dock: SliccDock, item: Surface, screen: ScreenClass): void;
35
+ export declare function destination(dock: SliccDock, id: string, side: Side, screen: ScreenClass): Placement;
36
+ export declare function openSurface(dock: SliccDock, item: Surface, screen: ScreenClass, focus?: boolean): void;
36
37
  export declare function chatId(agentId: string): string;
37
38
  export declare function chatAgent(id: string | null | undefined): string | null;
38
39
  export declare function chats(dock: SliccDock): string[];
@@ -40,7 +41,7 @@ export declare function openChat(dock: SliccDock, agent: {
40
41
  id: string;
41
42
  name: string;
42
43
  }, screen: ScreenClass, focus?: boolean, reveal?: boolean): string;
43
- export declare function openDocument(dock: SliccDock, kind: DocumentKind, path: string, screen: ScreenClass): string;
44
+ export declare function openDocument(dock: SliccDock, kind: DocumentKind, path: string, screen: ScreenClass, focus?: boolean): string;
44
45
  export declare function terminalPanel(terminal: string): string;
45
46
  export declare function terminalOf(id: string | null | undefined): string | null;
46
47
  export declare function terminalPanels(dock: SliccDock): string[];
@@ -53,4 +54,4 @@ export declare function defaultLayout(dock: SliccDock, screen: ScreenClass, agen
53
54
  export declare function shown(dock: SliccDock, id: string): boolean;
54
55
  export declare function sprinkleSurface(sprinkle: Sprinkle): Surface;
55
56
  export declare function dropPlacement(panel: string | null, position: string): Placement | null;
56
- export declare function openSprinkle(dock: SliccDock, sprinkle: Sprinkle, screen: ScreenClass, place?: Placement | null): string;
57
+ export declare function openSprinkle(dock: SliccDock, sprinkle: Sprinkle, screen: ScreenClass, place?: Placement | null, focus?: boolean): string;
@@ -31,5 +31,6 @@ export declare class SliccSettings extends ModelElement {
31
31
  protected subscribe(model: SliccModel): Array<() => void>;
32
32
  focus(): void;
33
33
  connect(id: string, secret?: string): Promise<void>;
34
+ get busyReason(): string | null;
34
35
  render(): TemplateResult;
35
36
  }
@@ -38,6 +38,7 @@ export declare class SliccUpdates extends ModelElement {
38
38
  busy: ReadonlyMap<string, PackageAction>;
39
39
  problems: Failures;
40
40
  constructor();
41
+ get busyReason(): string | null;
41
42
  static styles: import("lit").CSSResult[];
42
43
  protected subscribe(model: SliccModel): Array<() => void>;
43
44
  focus(): void;
@@ -1,9 +1,10 @@
1
1
  import { Emitter } from '../model/emitter.js';
2
2
  import type { Account, ModelOption, Settings, SettingsEvents, SettingsPort } from '../model/types.js';
3
3
  import type { Clock } from './clock.js';
4
+ export declare const dummySettingsKey = "slicc-ui.settings";
4
5
  export declare class DummySettings extends Emitter<SettingsEvents> implements SettingsPort {
5
6
  #private;
6
- constructor(defaults: Settings, models: readonly ModelOption[], accounts: readonly Account[], storage: Storage | null, clock: Clock);
7
+ constructor(defaults: Settings, models: readonly ModelOption[], accounts: readonly Account[], storage: Storage | null, clock: Clock, keys?: readonly string[]);
7
8
  get(): Settings;
8
9
  update(patch: Partial<Settings>): void;
9
10
  models(): readonly ModelOption[];
@@ -13,5 +13,6 @@ export interface KernelModel extends SliccModel {
13
13
  files: KernelFiles;
14
14
  terminals: KernelTerminals;
15
15
  }
16
+ export declare const settingsKey = "slicc-agent.settings";
16
17
  export declare function idleModel(storage?: Storage | null): Omit<SliccModel, 'files' | 'terminals'>;
17
18
  export declare function createKernelModel({ kernel, root, files, terminals, storage, }: KernelModelOptions): KernelModel;
@@ -2,6 +2,6 @@ export type { KernelFilesOptions } from './kernel/files.js';
2
2
  export { KernelFiles } from './kernel/files.js';
3
3
  export { IdleAgent, IdleBrowser, IdleMemory, IdleMonitor, IdleSprinkles, IdleTray, } from './kernel/idle.js';
4
4
  export type { KernelModel, KernelModelOptions } from './kernel/index.js';
5
- export { createKernelModel, idleModel } from './kernel/index.js';
5
+ export { createKernelModel, idleModel, settingsKey } from './kernel/index.js';
6
6
  export type { KernelTerminalsOptions } from './kernel/terminals.js';
7
7
  export { KernelTerminals } from './kernel/terminals.js';
@@ -521,7 +521,7 @@ export type TrayRole = 'none' | 'leader' | 'follower';
521
521
  export interface Follower {
522
522
  id: string;
523
523
  name: string;
524
- device: 'browser' | 'phone' | 'extension';
524
+ device: 'browser' | 'phone' | 'extension' | 'cli';
525
525
  since: number;
526
526
  }
527
527
  export interface TrayBudget {
@@ -21,6 +21,8 @@ export type { ConfirmOptions, ConfirmVariant, PromptOptions } from './app/confir
21
21
  export { confirm, prompt } from './app/confirm.js';
22
22
  export type { GrammarKind } from './app/grammars.js';
23
23
  export { grammarBase, setGrammarBase } from './app/grammars.js';
24
+ export type { PanelCaller, PanelInfo, PanelKind, PanelOpenOptions, PanelOutput, PanelPlace, PanelResult, PanelsHost, } from './app/panel-command.js';
25
+ export { Panels, panelCommand } from './app/panel-command.js';
24
26
  export type { Placement, Surface } from './app/panels.js';
25
27
  export { surfaces } from './app/panels.js';
26
28
  export type { CodeColor, DiffStyle } from './components/code-view.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-ecoverse/slicc-spectrum",
3
- "version": "1.58.2",
3
+ "version": "1.59.0",
4
4
  "description": "Web components for SLICC on Spectrum Web Components: the terminal, the app shell and its surfaces",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -72,8 +72,8 @@
72
72
  "devDependencies": {
73
73
  "@adobe/spectrum-wc": "2.0.0-beta.4",
74
74
  "@adobe/spectrum-wc-icons": "2.0.0-beta.4",
75
- "@ai-ecoverse/slicc-kernel": "1.61.0",
76
- "@ai-ecoverse/slicc-shared-web": "1.12.3",
75
+ "@ai-ecoverse/slicc-kernel": "1.64.0",
76
+ "@ai-ecoverse/slicc-shared-web": "1.13.0",
77
77
  "@ai-ecoverse/wasm-bash": "5.3.0-17",
78
78
  "@ai-ecoverse/wasm-coreutils": "9.7.0-3",
79
79
  "@biomejs/biome": "2.5.15",
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/dummy/clock.ts", "../src/dummy/settings.ts"],
4
- "sourcesContent": ["export interface Clock {\n delay: number;\n sleep(ticks?: number): Promise<void>;\n}\n\nexport function clock(delay: number): Clock {\n return {\n delay,\n sleep: (ticks = 1) => new Promise((resolve) => setTimeout(resolve, delay * ticks)),\n };\n}\n", "import { Emitter } from '../model/emitter.ts';\nimport type {\n Account,\n AccountStatus,\n ModelOption,\n Settings,\n SettingsEvents,\n SettingsPort,\n} from '../model/types.ts';\nimport type { Clock } from './clock.ts';\n\nconst key = 'slicc-ui.settings';\n\nexport class DummySettings extends Emitter<SettingsEvents> implements SettingsPort {\n #settings: Settings;\n #accounts: Account[];\n #models: readonly ModelOption[];\n #storage: Storage | null;\n #clock: Clock;\n #signIns = new Map<string, { before: AccountStatus; stop: () => void }>();\n\n constructor(\n defaults: Settings,\n models: readonly ModelOption[],\n accounts: readonly Account[],\n storage: Storage | null,\n clock: Clock\n ) {\n super();\n this.#storage = storage;\n this.#clock = clock;\n this.#models = models;\n this.#accounts = accounts.map((account) => ({ ...account }));\n this.#settings = { ...defaults, ...this.#load() };\n }\n\n #load(): Partial<Settings> {\n try {\n return JSON.parse(this.#storage?.getItem(key) ?? '{}');\n } catch {\n return {};\n }\n }\n\n get(): Settings {\n return { ...this.#settings };\n }\n\n update(patch: Partial<Settings>): void {\n this.#settings = { ...this.#settings, ...patch };\n this.#storage?.setItem(key, JSON.stringify(this.#settings));\n this.emit('settings', this.get());\n }\n\n models(): readonly ModelOption[] {\n return this.#models;\n }\n\n accounts(): readonly Account[] {\n return this.#accounts.map((account) => ({ ...account }));\n }\n\n #set(id: string, patch: Partial<Account>): void {\n this.#accounts = this.#accounts.map((account) =>\n account.id === id ? { ...account, ...patch } : account\n );\n this.emit('accounts', this.accounts());\n }\n\n async connect(id: string, secret?: string): Promise<void> {\n const account = this.#accounts.find((candidate) => candidate.id === id);\n if (account && account.auth !== 'api-key' && !(await this.#signIn(account))) return;\n if (account?.auth === 'api-key' || !account) await this.#clock.sleep(10);\n if (account?.auth === 'api-key' && !secret)\n throw new Error(\n `${account.provider} needs ${account.secret === 'token' ? 'a token' : 'an API key'}`\n );\n const identity =\n account?.group === 'mcp'\n ? account.identity\n : account?.auth === 'api-key'\n ? 'API key'\n : account?.identity || `${id}-user@example.com`;\n this.#set(id, { status: 'connected', identity });\n }\n\n #signIn(account: Account): Promise<boolean> {\n const before = this.#signIns.get(account.id)?.before ?? account.status;\n this.#signIns.get(account.id)?.stop();\n this.#set(account.id, { status: 'signing-in' });\n return new Promise((resolve) => {\n const stop = () => {\n this.#signIns.delete(account.id);\n this.#set(account.id, { status: before });\n resolve(false);\n };\n this.#signIns.set(account.id, { before, stop });\n void this.#clock.sleep(100).then(() => {\n if (this.#signIns.get(account.id)?.stop !== stop) return;\n this.#signIns.delete(account.id);\n resolve(true);\n });\n });\n }\n\n cancel(id: string): void {\n this.#signIns.get(id)?.stop();\n }\n\n disconnect(id: string): void {\n this.#set(id, { status: 'disconnected' });\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["clock"]
7
- }