dsh-lark-agent 0.3.3 → 0.5.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.
Files changed (51) hide show
  1. package/README.md +10 -5
  2. package/dist/bot-service.js +4 -2
  3. package/dist/bridge.d.ts +27 -1
  4. package/dist/bridge.js +333 -66
  5. package/dist/card-actions.js +3 -1
  6. package/dist/client/AgentSettings.d.ts +12 -0
  7. package/dist/client/ConnectionCard.d.ts +5 -1
  8. package/dist/client/ManagerPanel.d.ts +3 -0
  9. package/dist/client/api.d.ts +14 -2
  10. package/dist/client/index.d.ts +1 -1
  11. package/dist/client/manager-styles.d.ts +2 -0
  12. package/dist/client/use-connection.d.ts +2 -2
  13. package/dist/client.cjs +727 -258
  14. package/dist/config.d.ts +4 -0
  15. package/dist/config.js +8 -0
  16. package/dist/dsh-runtime.d.ts +3 -0
  17. package/dist/dsh-runtime.js +46 -4
  18. package/dist/lark-cli.d.ts +20 -1
  19. package/dist/lark-cli.js +168 -2
  20. package/dist/media-input.d.ts +28 -0
  21. package/dist/media-input.js +127 -0
  22. package/dist/media-scopes.d.ts +5 -0
  23. package/dist/media-scopes.js +6 -0
  24. package/dist/message.d.ts +7 -0
  25. package/dist/message.js +27 -3
  26. package/dist/onboarding/agents.d.ts +9 -0
  27. package/dist/onboarding/agents.js +100 -0
  28. package/dist/onboarding/controller.d.ts +15 -2
  29. package/dist/onboarding/controller.js +155 -14
  30. package/dist/onboarding/host.d.ts +14 -2
  31. package/dist/onboarding/host.js +49 -32
  32. package/dist/onboarding/lark-platform.d.ts +6 -0
  33. package/dist/onboarding/lark-platform.js +15 -4
  34. package/dist/onboarding/manager.d.ts +32 -0
  35. package/dist/onboarding/manager.js +129 -0
  36. package/dist/onboarding/model-check.d.ts +5 -0
  37. package/dist/onboarding/model-check.js +51 -0
  38. package/dist/onboarding/protocol.d.ts +51 -1
  39. package/dist/onboarding/settings-store.d.ts +11 -0
  40. package/dist/onboarding/settings-store.js +67 -0
  41. package/dist/replies.d.ts +16 -0
  42. package/dist/replies.js +37 -11
  43. package/dist/session-controls.d.ts +34 -0
  44. package/dist/session-controls.js +66 -0
  45. package/dist/session-store.d.ts +7 -1
  46. package/dist/session-store.js +44 -11
  47. package/dist/topic-cards.d.ts +3 -0
  48. package/dist/topic-cards.js +8 -0
  49. package/dist/topic-store.d.ts +40 -0
  50. package/dist/topic-store.js +192 -0
  51. package/package.json +1 -1
@@ -2,6 +2,7 @@ import { createHmac, randomBytes, timingSafeEqual } from 'node:crypto';
2
2
  import { constants } from 'node:fs';
3
3
  import { chmod, lstat, mkdir, open } from 'node:fs/promises';
4
4
  import { join } from 'node:path';
5
+ import { sessionViewCommandParse } from './session-controls.js';
5
6
  const TTL_MS = 24 * 60 * 60 * 1000;
6
7
  const MAX_TOKEN_LENGTH = 3000;
7
8
  const HEX_ID = /^[a-f0-9]{12}$/;
@@ -31,7 +32,8 @@ function binding(value) {
31
32
  || (value.chatType !== 'p2p' && value.chatType !== 'group')
32
33
  || !(value.threadId === '' || validId(value.threadId, 'om') || validId(value.threadId, 'omt'))
33
34
  || !(validId(value.sourceMessageId, 'om') || (typeof value.sourceMessageId === 'string' && /^menu:[a-zA-Z0-9_-]{1,128}$/.test(value.sourceMessageId)))
34
- || typeof value.command !== 'string' || /[\u0000-\u001f\u007f]/.test(value.command) || !COMMAND.test(value.command)
35
+ || typeof value.command !== 'string' || /[\u0000-\u001f\u007f]/.test(value.command)
36
+ || !(COMMAND.test(value.command) || value.command === '/sessions search' || sessionViewCommandParse(value.command))
35
37
  || !(value.expectedSessionId === undefined || value.expectedSessionId === null
36
38
  || (typeof value.expectedSessionId === 'string' && value.expectedSessionId.length === 12 && HEX_ID.test(value.expectedSessionId)))
37
39
  || !(value.expectedModelRevision === undefined || value.expectedModelRevision === null
@@ -0,0 +1,12 @@
1
+ import type { AgentCatalog, AgentSettings as Settings, ConnectionSnapshot } from '../onboarding/protocol.js';
2
+ import type { MediaInputKind } from '../media-scopes.js';
3
+ export declare function AgentSettings({ snapshot, catalog, pending, save, authorize, cancelAuthorization, recheck, now }: {
4
+ snapshot: ConnectionSnapshot;
5
+ catalog?: AgentCatalog;
6
+ pending: boolean;
7
+ authorize(kind: MediaInputKind): void;
8
+ cancelAuthorization(): void;
9
+ recheck(): void;
10
+ now: number;
11
+ save(settings: Settings): Promise<ConnectionSnapshot | undefined>;
12
+ }): import("react/jsx-runtime").JSX.Element;
@@ -1,3 +1,4 @@
1
+ import type { AgentCatalog, ConnectionSnapshot } from '../onboarding/protocol.js';
1
2
  import type { ConnectionApi } from './api.js';
2
3
  /** `app` is the desktop App; `openPlugins` switches to its plugin list and reports whether it could. */
3
4
  export interface ConnectionCardProps {
@@ -6,6 +7,9 @@ export interface ConnectionCardProps {
6
7
  app: boolean;
7
8
  openPlugins?: () => boolean;
8
9
  };
10
+ embedded?: boolean;
11
+ catalog?: AgentCatalog;
12
+ onSnapshot?: (snapshot: ConnectionSnapshot) => void;
9
13
  }
10
14
  /** The host is authoritative for every transition, including readiness and identity. */
11
- export declare function ConnectionCard({ api, host }: ConnectionCardProps): import("react/jsx-runtime").JSX.Element;
15
+ export declare function ConnectionCard({ api, host, embedded, catalog, onSnapshot }: ConnectionCardProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import { type ConnectionCardProps } from './ConnectionCard.js';
2
+ /** A dedicated management page, backed by the same owner-only connection API on both hosts. */
3
+ export declare function ManagerPanel({ api, host }: ConnectionCardProps): import("react/jsx-runtime").JSX.Element;
@@ -1,4 +1,4 @@
1
- import type { ConnectionEndpoint, ConnectionProfile, ConnectionSnapshot } from '../onboarding/protocol.js';
1
+ import type { AgentCatalog, ConnectionEndpoint, ConnectionList, ConnectionProfile, ConnectionSnapshot } from '../onboarding/protocol.js';
2
2
  /** Browser transport supplied by either generation of the DSH host. */
3
3
  export interface ConnectionRpc {
4
4
  call(channel: string, endpoint: string, payload: unknown, signal?: AbortSignal): Promise<unknown>;
@@ -7,6 +7,8 @@ export interface ConnectionRpc {
7
7
  export declare function officialUrl(value: unknown): string;
8
8
  /** Validate host data before rendering it or making its URLs actionable. */
9
9
  export declare function parseSnapshot(value: unknown): ConnectionSnapshot;
10
+ export declare function parseConnectionList(value: unknown): ConnectionList;
11
+ export declare function parseAgentCatalog(value: unknown): AgentCatalog;
10
12
  /** A vetted, user-facing service error; raw transport errors are never displayed. */
11
13
  export declare class ConnectionUiError extends Error {
12
14
  }
@@ -14,8 +16,18 @@ export declare class ConnectionUiError extends Error {
14
16
  export declare class ConnectionApi {
15
17
  private readonly rpc;
16
18
  private readonly modern;
17
- constructor(rpc: ConnectionRpc, modern?: boolean);
19
+ private readonly id?;
20
+ constructor(rpc: ConnectionRpc, modern?: boolean, id?: string | undefined);
21
+ forConnection(id: string): ConnectionApi;
18
22
  private request;
19
23
  snapshot(endpoint: Exclude<ConnectionEndpoint, 'profiles'>, payload: unknown, signal: AbortSignal): Promise<ConnectionSnapshot>;
20
24
  profiles(signal: AbortSignal): Promise<ConnectionProfile[]>;
25
+ connections(signal: AbortSignal): Promise<ConnectionList>;
26
+ addConnection(signal: AbortSignal): Promise<ConnectionList & {
27
+ selectedId: string;
28
+ }>;
29
+ removeConnection(id: string, signal: AbortSignal): Promise<ConnectionList & {
30
+ selectedId: string;
31
+ }>;
32
+ agentCatalog(signal: AbortSignal): Promise<AgentCatalog>;
21
33
  }
@@ -1,6 +1,6 @@
1
1
  import type { ComponentType } from 'react';
2
2
  import { type ConnectionRpc } from './api.js';
3
- import { type ConnectionCardProps } from './ConnectionCard.js';
3
+ import type { ConnectionCardProps } from './ConnectionCard.js';
4
4
  /** Minimal public services shared by the Web and official desktop hosts. */
5
5
  export interface ClientContext {
6
6
  effect(factory: () => void | (() => void), label?: string): unknown;
@@ -0,0 +1,2 @@
1
+ /** Geometry and controls belong only to the plugin's management body. */
2
+ export declare const managerCss = "\n.dsh-lark-settings.lark-manager{container:lark-manager / inline-size;max-width:1160px;width:100%;min-width:0;padding:8px 0 24px;--lark-ink:#16263f;--lark-muted:#68788f;--lark-blue:#2965e8;--lark-soft:#f6f8fc}\n.lark-manager-header{display:flex;justify-content:space-between;align-items:center;gap:24px;margin-bottom:26px}.lark-eyebrow{color:var(--lark-blue);font:600 10px/1.5 ui-monospace,SFMono-Regular,monospace;letter-spacing:.16em;margin-bottom:5px}.lark-manager-header h2{font:650 26px/1.4 \"Avenir Next\",\"PingFang SC\",sans-serif;letter-spacing:-.7px;margin:0}.lark-manager-header p{font-size:13px;color:var(--lark-muted);margin:5px 0 0}.lark-manager-tools{display:flex;gap:9px;align-items:center;flex-shrink:0}\n.lark-manager-layout{display:grid;grid-template-columns:252px minmax(0,1fr);gap:28px;align-items:start}.lark-robot-sidebar{min-width:0;background:var(--lark-soft);border:1px solid var(--lark-line);border-radius:14px;padding:17px 12px}.lark-robot-count{display:flex;justify-content:space-between;align-items:center;gap:8px;padding:0 5px 15px}.lark-robot-count strong{font-size:13px;font-weight:600}.lark-robot-count>span{font-size:11px;color:var(--lark-muted);font-variant-numeric:tabular-nums}\n.lark-manager input,.lark-manager select{font:inherit;color:var(--lark-ink);background:var(--lark-surface);border:1px solid var(--lark-line);border-radius:8px;min-height:39px;padding:8px 11px;max-width:100%;width:100%}.lark-manager input:disabled,.lark-manager select:disabled{opacity:.75;cursor:not-allowed}.lark-manager select:focus-visible{outline:3px solid #a1b8ff;outline-offset:3px}.lark-manager .lark-robot-search{font-size:12px;min-height:35px;margin-bottom:13px}.lark-robot-list{display:flex;flex-direction:column;gap:8px}.lark-robot-item{width:100%;display:flex;align-items:flex-start;gap:10px;border:1px solid transparent;border-radius:10px;background:transparent;color:var(--lark-ink);text-align:left;padding:13px 10px;position:relative;transition:background .15s}.lark-robot-item:hover{background:var(--lark-surface)}.lark-robot-item.selected{background:var(--lark-surface);border-color:#c9d9fc;box-shadow:0 2px 6px #16377906}.lark-robot-item.selected:before{content:\"\";position:absolute;left:-13px;top:18px;bottom:18px;width:3px;border-radius:2px;background:var(--lark-blue)}.lark-robot-icon{width:34px;height:34px;display:grid;place-items:center;flex-shrink:0;background:var(--lark-soft);border:1px solid var(--lark-line);border-radius:9px}.lark-robot-icon img{width:25px;height:25px;object-fit:contain}.lark-robot-description{min-width:0;display:flex;flex-direction:column;gap:5px;flex:1}.lark-robot-description>strong{font-size:13px;font-weight:600;overflow-wrap:anywhere;line-height:1.5}.lark-robot-description>small{font-size:10px;color:var(--lark-muted);overflow-wrap:anywhere}.lark-robot-chevron{color:var(--lark-muted);align-self:center;font-size:20px}.lark-robot-item.selected .lark-robot-chevron{color:var(--lark-blue)}.lark-robot-phase{display:flex;align-items:center;gap:5px;color:var(--lark-muted);font-size:10px;line-height:1.5}.lark-robot-phase>i{width:5px;height:5px;border-radius:50%;background:currentColor}.lark-robot-phase.connected{color:#13886f}.lark-robot-phase.error,.lark-robot-phase.action_required{color:#a26714}.lark-robot-note{margin:22px 5px 0;border-top:1px solid var(--lark-line);padding-top:16px;color:var(--lark-muted)}.lark-robot-note strong{font-size:11px;font-weight:600}.lark-robot-note p{font-size:11px;line-height:1.8;margin:6px 0 0}.lark-list-empty{font-size:12px;padding:14px 5px;color:var(--lark-muted)}\n.lark-robot-detail{min-width:0}.dsh-lark-settings.lark-detail-card{max-width:none;padding:0;margin:0;--lark-blue:#2965e8;--lark-soft:#f6f8fc}.lark-detail-card .lark-card-header{padding:20px 25px}.lark-detail-card .lark-card-header h2{font-size:17px}.lark-detail-card .lark-body{padding:24px 26px}.lark-detail-card .lark-connected-row{margin-top:20px;padding:14px 0}.lark-detail-card .lark-connected-row+.lark-connected-row{border-top:0;margin-top:0}.lark-detail-card .lark-connected-row p{line-height:1.8;max-width:340px}.lark-connection-summary{display:flex;align-items:center;gap:12px;border-radius:9px;background:#f0faf6;border:1px solid #d5eee3;padding:13px 15px}.lark-connection-dot{width:8px;height:8px;background:#13886f;border-radius:50%;flex-shrink:0;box-shadow:0 0 0 4px #13886f10}.lark-connection-summary strong{font-size:13px;font-weight:600}.lark-connection-summary p{font-size:12px;color:var(--lark-muted);margin:3px 0 0}.lark-connection-summary.paused{background:var(--lark-soft);border-color:var(--lark-line)}.lark-connection-summary.paused .lark-connection-dot{background:var(--lark-muted);box-shadow:none}\n.lark-agent-settings{border-top:1px solid var(--lark-line);margin-top:25px;padding-top:22px}.lark-section-heading{display:flex;align-items:baseline;justify-content:space-between;gap:12px;margin-bottom:19px}.lark-body .lark-section-heading h3{font-size:14px;font-weight:650;margin:0;letter-spacing:0}.lark-section-heading>span{font-size:11px;color:var(--lark-muted)}.lark-field{margin-bottom:19px}.lark-field>label{display:block;font-size:12px;font-weight:550;margin-bottom:7px}.lark-field>p,.lark-model-summary>p,.lark-field-help{font-size:11px;color:var(--lark-muted);line-height:1.8;margin:6px 0 0;overflow-wrap:anywhere}.lark-manager input.lark-path-input{font-family:ui-monospace,SFMono-Regular,\"PingFang SC\",monospace;font-size:12px}.lark-field>p.lark-workspace-path{font-family:ui-monospace,SFMono-Regular,\"PingFang SC\",monospace;font-size:10px}.lark-model-summary{padding:13px 15px;background:var(--lark-soft);border-radius:9px}.lark-model-summary>span{font-size:12px}.lark-model-summary>strong{float:right;max-width:65%;font-size:12px;font-weight:550;overflow-wrap:anywhere}.lark-model-summary>p{clear:both;padding-top:4px}.lark-input-heading{margin-top:24px;margin-bottom:5px}.lark-input-option{display:flex;align-items:center;justify-content:space-between;gap:18px;padding:15px 0;border-bottom:1px solid var(--lark-line);cursor:pointer}.lark-input-option>span{min-width:0}.lark-input-option strong{display:block;font-size:12px;font-weight:550}.lark-input-option small{display:block;font-size:11px;color:var(--lark-muted);line-height:1.8;margin-top:4px}.lark-manager .lark-input-option input{width:17px;height:17px;min-height:0;padding:0;flex-shrink:0;accent-color:var(--lark-blue)}.lark-settings-save{display:flex;justify-content:space-between;align-items:center;gap:12px;margin-top:22px}.lark-settings-save>span{font-size:11px;color:var(--lark-muted)}\n.lark-connection-details{font-size:12px;color:var(--lark-muted);margin-top:14px}.lark-connection-details>summary{padding:8px 0}.lark-detail-card .lark-connection-details .lark-connected-row{margin-top:10px}.lark-detail-card .lark-recheck{margin-top:10px}.lark-manager>.lark-disconnect{margin:0 0 20px}\n.lark-manager .lark-text-button{color:var(--lark-blue)}.lark-manager input::placeholder{color:var(--lark-muted);opacity:1}.lark-manager{color-scheme:light}\n.lark-input-capability{padding:14px 0;border-bottom:1px solid var(--lark-line)}.lark-input-capability .lark-input-option{padding:0;border:0;align-items:flex-start}.lark-input-option strong{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.lark-input-option em{font-style:normal;font-size:10px;font-weight:450;color:var(--lark-muted);background:var(--lark-soft);padding:2px 6px;border-radius:4px}.lark-input-option input{margin-top:3px}.lark-input-requirements{display:grid;gap:4px;font-size:11px;line-height:1.8;color:var(--lark-muted);margin-top:10px;overflow-wrap:anywhere}.lark-input-footer{margin-top:14px}.lark-input-authorization{border:1px solid var(--lark-line);background:var(--lark-soft);border-radius:9px;padding:15px;margin-top:16px}.lark-input-authorization>strong{font-size:13px}.lark-input-authorization .lark-qr{margin-top:14px}.lark-input-authorization .lark-actions{margin-top:14px}\n@media(prefers-color-scheme:dark){.lark-manager,.lark-detail-card{color-scheme:dark}}\n@media(prefers-color-scheme:dark){.dsh-lark-settings.lark-manager,.dsh-lark-settings.lark-detail-card{--lark-ink:#e0e7f1;--lark-muted:#96a6bd;--lark-soft:#283448;--lark-blue:#7ba0ff}.lark-robot-item.selected{border-color:#465e8d}.lark-connection-summary{background:#213b35;border-color:#36574d}.lark-connection-summary.paused{background:var(--lark-soft);border-color:var(--lark-line)}.lark-robot-phase.connected{color:#78c5b0}.lark-robot-phase.error,.lark-robot-phase.action_required{color:#e4bd7c}.lark-manager .lark-primary{background:#4268df}.lark-connection-dot{background:#78c5b0}}\n.lark-manager-header>div:first-child,.lark-card-header>div{min-width:0}.lark-manager-tools{flex-wrap:wrap}.lark-detail-card{container:lark-detail / inline-size}.lark-detail-card .lark-card-header>div{flex:1}.lark-detail-card .lark-card-header h2{overflow-wrap:anywhere}.lark-detail-card .lark-card-header p{display:block}.lark-detail-card .lark-status{flex-shrink:0}.lark-detail-card .lark-steps{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px}.lark-detail-card .lark-steps li{min-width:0;white-space:normal}.lark-detail-card .lark-steps li+li:before{display:none}.lark-detail-card .lark-steps li>span{flex-shrink:0}.lark-detail-card .lark-connected-row{flex-wrap:wrap}.lark-detail-card .lark-qr-layout{flex-wrap:wrap}.lark-detail-card .lark-qr-layout>div{min-width:0}.lark-detail-card .lark-loading-row h3{overflow-wrap:anywhere}\n@container lark-manager (max-width:900px){.lark-manager-layout{grid-template-columns:205px minmax(0,1fr);gap:18px}.lark-manager-header{gap:15px}.lark-manager-header h2{font-size:23px}.lark-detail-card .lark-body{padding:21px}.lark-section-heading{flex-wrap:wrap;gap:4px}.lark-robot-count{flex-wrap:wrap;gap:4px}.lark-robot-item{padding:11px 6px;gap:8px}}\n@container lark-manager (max-width:720px){.lark-manager-header{align-items:flex-start;flex-direction:column;gap:16px;margin-bottom:20px}.lark-manager-tools{width:100%;justify-content:flex-start}.lark-manager-layout{display:flex;flex-direction:column;gap:18px}.lark-robot-sidebar,.lark-robot-detail{width:100%}.lark-robot-sidebar{padding:12px}.lark-robot-count{padding-bottom:10px}.lark-robot-list{flex-direction:row;overflow-x:auto;gap:8px;padding-bottom:3px}.lark-robot-item{min-width:180px;max-width:230px;flex:0 0 auto;padding:11px}.lark-robot-item.selected:before{display:none}.lark-robot-note{display:none}.lark-manager .lark-robot-search{margin-bottom:10px}.lark-detail-card .lark-card-header{padding:17px}.lark-detail-card .lark-body{padding:20px 17px}.lark-model-summary>strong{max-width:60%}}\n@container lark-detail (max-width:420px){.lark-detail-card .lark-card-header{display:grid;grid-template-columns:37px minmax(0,1fr);gap:4px 10px}.lark-detail-card .lark-plugin-icon{width:37px;height:37px;grid-row:1 / 3}.lark-detail-card .lark-status{grid-column:2;margin-left:0}.lark-detail-card .lark-card-header h2{font-size:16px}.lark-detail-card .lark-card-header p{font-size:11px}.lark-detail-card .lark-steps li{flex-direction:column;text-align:center;gap:5px;font-size:11px}.lark-detail-card .lark-body h3{font-size:18px}.lark-detail-card .lark-section-heading h3{font-size:14px}.lark-detail-card .lark-section-heading{flex-wrap:wrap;gap:4px}.lark-detail-card .lark-pairing{flex-direction:column;align-items:flex-start}.lark-detail-card .lark-qr-layout{flex-direction:column;align-items:center}.lark-detail-card .lark-model-summary>strong{float:none;display:block;max-width:none;margin-top:4px}.lark-detail-card .lark-settings-save{flex-wrap:wrap}}\n";
@@ -8,7 +8,7 @@ export declare function useConnection(api: ConnectionApi): {
8
8
  pending: ConnectionEndpoint | null;
9
9
  profiles: ConnectionProfile[] | null;
10
10
  refresh: () => void;
11
- mutate: (endpoint: Mutation | "profiles", payload?: unknown) => Promise<void>;
12
- loadProfiles: () => Promise<void>;
11
+ mutate: (endpoint: Mutation | "profiles", payload?: unknown) => Promise<ConnectionSnapshot | undefined>;
12
+ loadProfiles: () => Promise<ConnectionSnapshot | undefined>;
13
13
  };
14
14
  export {};