dsh-plugin-subagent-director 0.1.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 (80) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/LICENSE +21 -0
  3. package/README.md +135 -0
  4. package/lib/bridge-contract.d.ts +41 -0
  5. package/lib/bridge-contract.d.ts.map +1 -0
  6. package/lib/bridge-contract.js +7 -0
  7. package/lib/bridge-contract.js.map +1 -0
  8. package/lib/bridge-entry.d.ts +29 -0
  9. package/lib/bridge-entry.d.ts.map +1 -0
  10. package/lib/bridge-entry.js +10 -0
  11. package/lib/bridge-entry.js.map +1 -0
  12. package/lib/client/RoleCard.d.ts +23 -0
  13. package/lib/client/RoleCard.d.ts.map +1 -0
  14. package/lib/client/RoleCard.js +72 -0
  15. package/lib/client/RoleCard.js.map +1 -0
  16. package/lib/client/SubagentModelDock.d.ts +29 -0
  17. package/lib/client/SubagentModelDock.d.ts.map +1 -0
  18. package/lib/client/SubagentModelDock.js +32 -0
  19. package/lib/client/SubagentModelDock.js.map +1 -0
  20. package/lib/client/SubagentOptionsSection.d.ts +23 -0
  21. package/lib/client/SubagentOptionsSection.d.ts.map +1 -0
  22. package/lib/client/SubagentOptionsSection.js +164 -0
  23. package/lib/client/SubagentOptionsSection.js.map +1 -0
  24. package/lib/client/index.d.ts +44 -0
  25. package/lib/client/index.d.ts.map +1 -0
  26. package/lib/client/index.js +1541 -0
  27. package/lib/client/index.js.map +1 -0
  28. package/lib/client/locales.d.ts +13 -0
  29. package/lib/client/locales.d.ts.map +1 -0
  30. package/lib/client/locales.js +107 -0
  31. package/lib/client/locales.js.map +1 -0
  32. package/lib/client/store-logic.d.ts +105 -0
  33. package/lib/client/store-logic.d.ts.map +1 -0
  34. package/lib/client/store-logic.js +143 -0
  35. package/lib/client/store-logic.js.map +1 -0
  36. package/lib/client/store.d.ts +104 -0
  37. package/lib/client/store.d.ts.map +1 -0
  38. package/lib/client/store.js +223 -0
  39. package/lib/client/store.js.map +1 -0
  40. package/lib/client/subagent-model.d.ts +47 -0
  41. package/lib/client/subagent-model.d.ts.map +1 -0
  42. package/lib/client/subagent-model.js +81 -0
  43. package/lib/client/subagent-model.js.map +1 -0
  44. package/lib/client/ui.d.ts +26 -0
  45. package/lib/client/ui.d.ts.map +1 -0
  46. package/lib/client/ui.js +102 -0
  47. package/lib/client/ui.js.map +1 -0
  48. package/lib/config.d.ts +63 -0
  49. package/lib/config.d.ts.map +1 -0
  50. package/lib/config.js +26 -0
  51. package/lib/config.js.map +1 -0
  52. package/lib/delegation-tool.d.ts +169 -0
  53. package/lib/delegation-tool.d.ts.map +1 -0
  54. package/lib/delegation-tool.js +404 -0
  55. package/lib/delegation-tool.js.map +1 -0
  56. package/lib/envelope.d.ts +97 -0
  57. package/lib/envelope.d.ts.map +1 -0
  58. package/lib/envelope.js +136 -0
  59. package/lib/envelope.js.map +1 -0
  60. package/lib/guidance.d.ts +37 -0
  61. package/lib/guidance.d.ts.map +1 -0
  62. package/lib/guidance.js +46 -0
  63. package/lib/guidance.js.map +1 -0
  64. package/lib/index.d.ts +29 -0
  65. package/lib/index.d.ts.map +1 -0
  66. package/lib/index.js +63 -0
  67. package/lib/index.js.map +1 -0
  68. package/lib/remote.d.ts +102 -0
  69. package/lib/remote.d.ts.map +1 -0
  70. package/lib/remote.js +254 -0
  71. package/lib/remote.js.map +1 -0
  72. package/lib/route-resolver.d.ts +118 -0
  73. package/lib/route-resolver.d.ts.map +1 -0
  74. package/lib/route-resolver.js +71 -0
  75. package/lib/route-resolver.js.map +1 -0
  76. package/lib/settings.d.ts +157 -0
  77. package/lib/settings.d.ts.map +1 -0
  78. package/lib/settings.js +118 -0
  79. package/lib/settings.js.map +1 -0
  80. package/package.json +110 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Bilingual dictionaries for the Subagent Director settings namespace.
3
+ * The key union (SubagentDirectorKey) is the compile-time contract: both
4
+ * locales must carry every key, so a one-sided edit is a type error before it
5
+ * ever reaches the runtime's bilingual balance check.
6
+ */
7
+ /** Keys for the settings.subagentDirector namespace (bilingual, enforced). */
8
+ export type SubagentDirectorKey = 'nav' | 'sectionIntro' | 'defaultsHeading' | 'defaultsHint' | 'defaultProvider' | 'defaultModel' | 'defaultReasoningEffort' | 'restoreDefaults' | 'provider' | 'model' | 'reasoningEffort' | 'persona' | 'rolesHeading' | 'rolesHint' | 'addRole' | 'emptyRoles' | 'roleId' | 'roleDisplayName' | 'roleDescription' | 'rolePersona' | 'setDefaultRole' | 'defaultRoleBadge' | 'deleteRole' | 'confirmDeleteRole' | 'removeRoleDone' | 'addedRole' | 'roleUpdated' | 'conflict' | 'rejected' | 'fatal' | 'loadError' | 'readonly' | 'save' | 'cancel' | 'fallbackOnInvalid' | 'roleIdPlaceholder' | 'displayNamePlaceholder' | 'descriptionPlaceholder' | 'personaPlaceholder' | 'modelOptional' | 'providerMissing' | 'restoreDone' | 'invalidRoleId' | 'bridgeUnavailable' | 'modelRanOn' | 'modelNotRecorded' | 'modelRanOnTitle';
9
+ /** English dictionary ($subagentDirector). */
10
+ export declare const en: Record<SubagentDirectorKey, string>;
11
+ /** Chinese dictionary. */
12
+ export declare const zh: Record<SubagentDirectorKey, string>;
13
+ //# sourceMappingURL=locales.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../../src/client/locales.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,8EAA8E;AAC9E,MAAM,MAAM,mBAAmB,GAC3B,KAAK,GACL,cAAc,GACd,iBAAiB,GACjB,cAAc,GACd,iBAAiB,GACjB,cAAc,GACd,wBAAwB,GACxB,iBAAiB,GACjB,UAAU,GACV,OAAO,GACP,iBAAiB,GACjB,SAAS,GACT,cAAc,GACd,WAAW,GACX,SAAS,GACT,YAAY,GACZ,QAAQ,GACR,iBAAiB,GACjB,iBAAiB,GACjB,aAAa,GACb,gBAAgB,GAChB,kBAAkB,GAClB,YAAY,GACZ,mBAAmB,GACnB,gBAAgB,GAChB,WAAW,GACX,aAAa,GACb,UAAU,GACV,UAAU,GACV,OAAO,GACP,WAAW,GACX,UAAU,GACV,MAAM,GACN,QAAQ,GACR,mBAAmB,GACnB,mBAAmB,GACnB,wBAAwB,GACxB,wBAAwB,GACxB,oBAAoB,GACpB,eAAe,GACf,iBAAiB,GACjB,aAAa,GACb,eAAe,GACf,mBAAmB,GACnB,YAAY,GACZ,kBAAkB,GAClB,iBAAiB,CAAC;AAEtB,8CAA8C;AAC9C,eAAO,MAAM,EAAE,EAAE,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAgDlD,CAAC;AAEF,0BAA0B;AAC1B,eAAO,MAAM,EAAE,EAAE,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAgDlD,CAAC"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Bilingual dictionaries for the Subagent Director settings namespace.
3
+ * The key union (SubagentDirectorKey) is the compile-time contract: both
4
+ * locales must carry every key, so a one-sided edit is a type error before it
5
+ * ever reaches the runtime's bilingual balance check.
6
+ */
7
+ /** English dictionary ($subagentDirector). */
8
+ export const en = {
9
+ "nav": "Subagent Director",
10
+ "sectionIntro": "Choose the LLM provider and model each subagent uses, and define role templates that bind a model and persona to a delegation.",
11
+ "defaultsHeading": "Default model",
12
+ "defaultsHint": "Used when a call or role does not name a provider/model.",
13
+ "defaultProvider": "Provider",
14
+ "defaultModel": "Model",
15
+ "defaultReasoningEffort": "Reasoning effort",
16
+ "restoreDefaults": "Restore defaults",
17
+ "provider": "Provider",
18
+ "model": "Model",
19
+ "reasoningEffort": "Reasoning effort",
20
+ "persona": "Persona",
21
+ "rolesHeading": "Role templates",
22
+ "rolesHint": "A role binds delegation guidance, a persona, and optionally a provider/model to a subagent.",
23
+ "addRole": "Add role",
24
+ "emptyRoles": "No role templates yet. Add one to start planning subagent responsibilities.",
25
+ "roleId": "Role id",
26
+ "roleDisplayName": "Display name",
27
+ "roleDescription": "Delegation guidance",
28
+ "rolePersona": "Persona",
29
+ "setDefaultRole": "Set as default",
30
+ "defaultRoleBadge": "Default",
31
+ "deleteRole": "Delete",
32
+ "confirmDeleteRole": "Delete role “{id}”? Roles referenced by defaultRole will fall back to the plugin default.",
33
+ "removeRoleDone": "Role removed",
34
+ "addedRole": "Role added",
35
+ "roleUpdated": "Role updated",
36
+ "conflict": "The settings changed on the server. Reloading your edits — please review and retry.",
37
+ "rejected": "The change was rejected by the settings provider.",
38
+ "fatal": "Could not save: {message}",
39
+ "loadError": "Could not load preference settings.",
40
+ "readonly": "Settings are read-only in this deployment.",
41
+ "save": "Save",
42
+ "cancel": "Cancel",
43
+ "fallbackOnInvalid": "Fall back to the parent agent when a role-bound model is invalid",
44
+ "roleIdPlaceholder": "e.g. code-reviewer",
45
+ "displayNamePlaceholder": "e.g. Code Reviewer",
46
+ "descriptionPlaceholder": "When to delegate to this role and what it should do…",
47
+ "personaPlaceholder": "Optional behavior/identity text injected into the subagent…",
48
+ "modelOptional": "Save the card to apply changes",
49
+ "providerMissing": "No provider selected",
50
+ "restoreDone": "Defaults restored",
51
+ "invalidRoleId": "Role id must be kebab-case (lowercase letters, digits, single hyphens).",
52
+ "bridgeUnavailable": "The Subagent Director settings bridge is not available on this server. Please update/restart the web application so it installs the /subagent-director channel.",
53
+ "modelRanOn": "Subagent ran on",
54
+ "modelNotRecorded": "Subagent model not recorded yet",
55
+ "modelRanOnTitle": "Model route: {model}"
56
+ };
57
+ /** Chinese dictionary. */
58
+ export const zh = {
59
+ "nav": "子代理导演",
60
+ "sectionIntro": "为每个子代理选择 LLM 供应商与模型,并以角色模板把模型与 persona 绑定到每次委派。",
61
+ "defaultsHeading": "默认模型",
62
+ "defaultsHint": "当某次调用或角色未指定供应商/模型时使用。",
63
+ "defaultProvider": "供应商",
64
+ "defaultModel": "模型",
65
+ "defaultReasoningEffort": "推理强度",
66
+ "restoreDefaults": "恢复默认",
67
+ "provider": "供应商",
68
+ "model": "模型",
69
+ "reasoningEffort": "推理强度",
70
+ "persona": "人设",
71
+ "rolesHeading": "角色模板",
72
+ "rolesHint": "角色把委派指引、persona 与可选的供应商/模型绑定到子代理。",
73
+ "addRole": "添加角色",
74
+ "emptyRoles": "还没有角色模板。添加一个以开始规划子代理职责。",
75
+ "roleId": "角色 id",
76
+ "roleDisplayName": "显示名称",
77
+ "roleDescription": "委派指引",
78
+ "rolePersona": "人设",
79
+ "setDefaultRole": "设为默认",
80
+ "defaultRoleBadge": "默认",
81
+ "deleteRole": "删除",
82
+ "confirmDeleteRole": "删除角色“{id}”?若 defaultRole 引用了它,将回退到插件默认值。",
83
+ "removeRoleDone": "角色已删除",
84
+ "addedRole": "角色已添加",
85
+ "roleUpdated": "角色已更新",
86
+ "conflict": "服务端设置已变更。已重新加载你的编辑——请复核并重试。",
87
+ "rejected": "更改被设置提供方拒绝。",
88
+ "fatal": "无法保存:{message}",
89
+ "loadError": "无法加载偏好设置。",
90
+ "readonly": "当前部署中设置为只读。",
91
+ "save": "保存",
92
+ "cancel": "取消",
93
+ "fallbackOnInvalid": "当角色绑定的模型无效时回退到父代理",
94
+ "roleIdPlaceholder": "例如 code-reviewer",
95
+ "displayNamePlaceholder": "例如 代码审查员",
96
+ "descriptionPlaceholder": "何时委派给此角色、让其做什么……",
97
+ "personaPlaceholder": "注入子代理的可选行为/身份文案……",
98
+ "modelOptional": "保存卡片以应用更改",
99
+ "providerMissing": "未选择供应商",
100
+ "restoreDone": "已恢复默认",
101
+ "invalidRoleId": "角色 id 必须为 kebab-case(小写字母、数字、单个连字符)。",
102
+ "bridgeUnavailable": "此服务器尚未提供 Subagent Director 设置桥接通道(/subagent-director)。请重启 Web 应用以安装该通道后再试。",
103
+ "modelRanOn": "子代理实际运行于",
104
+ "modelNotRecorded": "尚未记录到子代理模型",
105
+ "modelRanOnTitle": "模型路由:{model}"
106
+ };
107
+ //# sourceMappingURL=locales.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locales.js","sourceRoot":"","sources":["../../src/client/locales.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Pure settings-write logic for the Subagent Director client (no React, no wire
3
+ * calls). Everything here is a function of its inputs so the revision state
4
+ * machine, path-op construction, and conflict handling are unit-testable in a
5
+ * plain node environment without a running host.
6
+ *
7
+ * The persisted section shape mirrors the Host schema (see src/settings.ts):
8
+ * {
9
+ * defaultProvider?, defaultModel?, defaultReasoningEffort?,
10
+ * defaultRole?, fallbackOnInvalid?,
11
+ * roles?: { [id]: { displayName, description, persona?, provider?,
12
+ * model?, reasoningEffort?, toolFilter? } }
13
+ * }
14
+ */
15
+ import type { SettingsPathOpView } from '@deepseek-ai/dsh-host-apiproxy/api';
16
+ /** One role as the user edits it in a card (empty string = "clear the field"). */
17
+ export interface RoleDraft {
18
+ displayName: string;
19
+ description: string;
20
+ persona?: string;
21
+ provider?: string;
22
+ model?: string;
23
+ reasoningEffort?: string;
24
+ }
25
+ /** A persisted role template. */
26
+ export interface StoredRole {
27
+ displayName: string;
28
+ description: string;
29
+ persona?: string;
30
+ provider?: string;
31
+ model?: string;
32
+ reasoningEffort?: string;
33
+ }
34
+ /** The persisted user-layer section (fields optional). */
35
+ export interface StoredSection {
36
+ defaultProvider?: string;
37
+ defaultModel?: string;
38
+ defaultReasoningEffort?: string;
39
+ defaultRole?: string;
40
+ fallbackOnInvalid?: boolean;
41
+ roles?: Record<string, StoredRole>;
42
+ }
43
+ /** Path of the roles map from the section root. */
44
+ export declare const ROLES_PATH: readonly ['roles'];
45
+ /** Normalize an optional string: blank/whitespace becomes undefined (removed). */
46
+ export declare function optional(value: string | undefined): string | undefined;
47
+ /** Blank/whitespace-only check used to decide "clear to undefined". */
48
+ export declare function isBlank(value: string | undefined | null): boolean;
49
+ /** Kebab-case role ids (mirrors the Host validator in src/settings.ts). */
50
+ export declare const KEBAB_CASE: RegExp;
51
+ /** Generate a kebab-case id from a display name; falls back to a prefix + counter. */
52
+ export declare function roleIdFromName(name: string, existing: ReadonlySet<string>, prefix?: string): string;
53
+ /**
54
+ * Build the path ops that create or fully replace one role. A single set at the
55
+ * role's root writes every field at once (mutate resolves against the stored
56
+ * section, so intermediate objects materialize).
57
+ */
58
+ export declare function addRoleOps(id: string, role: RoleDraft | StoredRole): SettingsPathOpView[];
59
+ /**
60
+ * Diff one role between its stored value and the edited draft. Only changed
61
+ * fields become ops; clearing a field becomes an unset that restores the
62
+ * composition base / removes the user override.
63
+ */
64
+ export declare function updateRoleOps(id: string, before: StoredRole | undefined, draft: RoleDraft): SettingsPathOpView[];
65
+ /**
66
+ * Ops to remove one role. When it was the defaultRole, the reference is cleared
67
+ * too so a stale default never points at a removed role.
68
+ */
69
+ export declare function removeRoleOps(id: string, current: Pick<StoredSection, 'defaultRole'>): SettingsPathOpView[];
70
+ /** Ops to promote one role to the default. */
71
+ export declare function setDefaultRoleOps(id: string): SettingsPathOpView[];
72
+ /** Ops for the default-model row: each cleared field is unset, changed fields set. */
73
+ export interface DefaultModelEdits {
74
+ provider?: string;
75
+ model?: string;
76
+ reasoningEffort?: string;
77
+ }
78
+ export declare function defaultModelOps(before: StoredSection, edits: DefaultModelEdits): SettingsPathOpView[];
79
+ /** Ops to clear every default-model field and the defaultRole back to composition defaults. */
80
+ export declare function restoreDefaultsOps(current: StoredSection): SettingsPathOpView[];
81
+ /** Whether a section's defaultRole references a role that currently exists. */
82
+ export declare function defaultRoleValid(section: StoredSection): boolean;
83
+ /** Classification of a settings.mutate failure for the UI's conflict handling. */
84
+ export type MutationErrorKind = 'conflict' | 'rejected' | 'fatal';
85
+ /** Map an RPC error code to a UI outcome; unknown/undefined errors are fatal. */
86
+ export declare function classifyMutateError(code: string | undefined, _message?: string): MutationErrorKind;
87
+ /**
88
+ * The revision state machine: after a successful mutate the server returns the
89
+ * next revision; after a conflict the editor must re-read (drop pending edits)
90
+ * and start from the freshly described revision. Collapses cleanly to a pure
91
+ * function for testing.
92
+ */
93
+ export interface RevisionState {
94
+ /** Revision the next write must carry as expectedRevision. */
95
+ revision: number;
96
+ /** True once a conflict was observed, so the store knows to reload. */
97
+ conflicted: boolean;
98
+ }
99
+ /** Advance after a successful write. */
100
+ export declare function advanceRevision(state: RevisionState, serverRevision: number): RevisionState;
101
+ /** Mark a conflict: keep the stale revision (the editor must reload). */
102
+ export declare function markConflict(state: RevisionState): RevisionState;
103
+ /** Rebase after a reload picked up the fresh namespace. */
104
+ export declare function adoptRevision(_state: RevisionState, freshRevision: number): RevisionState;
105
+ //# sourceMappingURL=store-logic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-logic.d.ts","sourceRoot":"","sources":["../../src/client/store-logic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,143 @@
1
+ /** Path of the roles map from the section root. */
2
+ export const ROLES_PATH = ['roles'];
3
+ /** Normalize an optional string: blank/whitespace becomes undefined (removed). */
4
+ export function optional(value) {
5
+ if (value === undefined)
6
+ return undefined;
7
+ const trimmed = value.trim();
8
+ return trimmed.length === 0 ? undefined : trimmed;
9
+ }
10
+ /** Blank/whitespace-only check used to decide "clear to undefined". */
11
+ export function isBlank(value) {
12
+ return value === undefined || value === null || value.trim().length === 0;
13
+ }
14
+ /** Kebab-case role ids (mirrors the Host validator in src/settings.ts). */
15
+ export const KEBAB_CASE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
16
+ /** Generate a kebab-case id from a display name; falls back to a prefix + counter. */
17
+ export function roleIdFromName(name, existing, prefix = 'role') {
18
+ const base = name
19
+ .trim()
20
+ .toLowerCase()
21
+ .replace(/[^a-z0-9]+/g, '-')
22
+ .replace(/^-+|-+$/g, '');
23
+ const candidate = base.length > 0 ? base : prefix;
24
+ if (!existing.has(candidate))
25
+ return candidate;
26
+ for (let i = 2; i < 1000; i++) {
27
+ if (!existing.has(candidate + '-' + i))
28
+ return candidate + '-' + i;
29
+ }
30
+ return candidate + '-' + Date.now().toString(36);
31
+ }
32
+ /**
33
+ * Build the path ops that create or fully replace one role. A single set at the
34
+ * role's root writes every field at once (mutate resolves against the stored
35
+ * section, so intermediate objects materialize).
36
+ */
37
+ export function addRoleOps(id, role) {
38
+ return [
39
+ {
40
+ op: 'set',
41
+ path: [ROLES_PATH[0], id],
42
+ value: {
43
+ displayName: role.displayName,
44
+ description: role.description,
45
+ ...optional(role.persona) !== undefined ? { persona: optional(role.persona) } : {},
46
+ ...optional(role.provider) !== undefined ? { provider: optional(role.provider) } : {},
47
+ ...optional(role.model) !== undefined ? { model: optional(role.model) } : {},
48
+ ...optional(role.reasoningEffort) !== undefined ? { reasoningEffort: optional(role.reasoningEffort) } : {}
49
+ }
50
+ }
51
+ ];
52
+ }
53
+ /** Field-by-field set-edits when a value changed from the stored role; unset when cleared. */
54
+ function fieldEdit(path, stored, next) {
55
+ const store = typeof stored === 'string' ? stored : undefined;
56
+ const normalized = optional(next);
57
+ if (normalized === store)
58
+ return undefined;
59
+ if (normalized === undefined)
60
+ return { op: 'unset', path: [...path] };
61
+ return { op: 'set', path: [...path], value: normalized };
62
+ }
63
+ /**
64
+ * Diff one role between its stored value and the edited draft. Only changed
65
+ * fields become ops; clearing a field becomes an unset that restores the
66
+ * composition base / removes the user override.
67
+ */
68
+ export function updateRoleOps(id, before, draft) {
69
+ const b = before ?? {};
70
+ const ops = [];
71
+ const push = (op) => { if (op)
72
+ ops.push(op); };
73
+ const base = [ROLES_PATH[0], id];
74
+ push(fieldEdit([...base, 'displayName'], b.displayName, draft.displayName));
75
+ push(fieldEdit([...base, 'description'], b.description, draft.description));
76
+ push(fieldEdit([...base, 'persona'], b.persona, draft.persona));
77
+ push(fieldEdit([...base, 'provider'], b.provider, draft.provider));
78
+ push(fieldEdit([...base, 'model'], b.model, draft.model));
79
+ push(fieldEdit([...base, 'reasoningEffort'], b.reasoningEffort, draft.reasoningEffort));
80
+ return ops;
81
+ }
82
+ /**
83
+ * Ops to remove one role. When it was the defaultRole, the reference is cleared
84
+ * too so a stale default never points at a removed role.
85
+ */
86
+ export function removeRoleOps(id, current) {
87
+ const ops = [{ op: 'unset', path: [ROLES_PATH[0], id] }];
88
+ if (current.defaultRole === id)
89
+ ops.push({ op: 'unset', path: ['defaultRole'] });
90
+ return ops;
91
+ }
92
+ /** Ops to promote one role to the default. */
93
+ export function setDefaultRoleOps(id) {
94
+ return [{ op: 'set', path: ['defaultRole'], value: id }];
95
+ }
96
+ export function defaultModelOps(before, edits) {
97
+ const ops = [];
98
+ const push = (op) => { if (op)
99
+ ops.push(op); };
100
+ push(fieldEdit(['defaultProvider'], before.defaultProvider, edits.provider));
101
+ push(fieldEdit(['defaultModel'], before.defaultModel, edits.model));
102
+ push(fieldEdit(['defaultReasoningEffort'], before.defaultReasoningEffort, edits.reasoningEffort));
103
+ return ops;
104
+ }
105
+ /** Ops to clear every default-model field and the defaultRole back to composition defaults. */
106
+ export function restoreDefaultsOps(current) {
107
+ const ops = [];
108
+ if (current.defaultProvider !== undefined)
109
+ ops.push({ op: 'unset', path: ['defaultProvider'] });
110
+ if (current.defaultModel !== undefined)
111
+ ops.push({ op: 'unset', path: ['defaultModel'] });
112
+ if (current.defaultReasoningEffort !== undefined)
113
+ ops.push({ op: 'unset', path: ['defaultReasoningEffort'] });
114
+ if (current.defaultRole !== undefined)
115
+ ops.push({ op: 'unset', path: ['defaultRole'] });
116
+ return ops;
117
+ }
118
+ /** Whether a section's defaultRole references a role that currently exists. */
119
+ export function defaultRoleValid(section) {
120
+ const role = section.defaultRole;
121
+ return role === undefined || (section.roles?.[role] !== undefined);
122
+ }
123
+ /** Map an RPC error code to a UI outcome; unknown/undefined errors are fatal. */
124
+ export function classifyMutateError(code, _message) {
125
+ if (code === 'settings-conflict')
126
+ return 'conflict';
127
+ if (code === 'settings-rejected' || code === 'schema-validation')
128
+ return 'rejected';
129
+ return 'fatal';
130
+ }
131
+ /** Advance after a successful write. */
132
+ export function advanceRevision(state, serverRevision) {
133
+ return { revision: serverRevision, conflicted: false };
134
+ }
135
+ /** Mark a conflict: keep the stale revision (the editor must reload). */
136
+ export function markConflict(state) {
137
+ return { revision: state.revision, conflicted: true };
138
+ }
139
+ /** Rebase after a reload picked up the fresh namespace. */
140
+ export function adoptRevision(_state, freshRevision) {
141
+ return { revision: freshRevision, conflicted: false };
142
+ }
143
+ //# sourceMappingURL=store-logic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-logic.js","sourceRoot":"","sources":["../../src/client/store-logic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Subagent Director settings page store: one snapshot joining the configurable
3
+ * provider directory (llm.providers), the model catalog (llm.models), and the
4
+ * plugin's own settings namespace. The settings namespace is read/written
5
+ * through the plugin's self-published `/subagent-director` RPC channel (see
6
+ * ../remote.ts) because the Host apiproxy's exposedNamespaces() allowlist
7
+ * answers `settings-not-exposed` for namespaces outside the model-provider
8
+ * plane; llm.providers/llm.models still ride `connection.api.llm`. The host
9
+ * stays the single fact source: every write travels as path ops through the
10
+ * bridge's settingsMutate endpoint with an expectedRevision optimistic lock,
11
+ * and pushed invalidations (settings/document-updated, llm/adapters-updated,
12
+ * connection/reset) refresh the page.
13
+ */
14
+ import type { ClientConnectionRpc, ConfigurableProviderView, IApiClient, ModelProviderGroup, SettingsNamespaceView } from '@deepseek-ai/dsh-client-connection/client';
15
+ import type { SubagentDirectorKey } from './locales.js';
16
+ import { type SnapshotStore } from '@deepseek-ai/dsh-client-runtime/client';
17
+ import { type DefaultModelEdits, type MutationErrorKind, type RoleDraft, type StoredRole, type StoredSection } from './store-logic.js';
18
+ /** The settings namespace this page reads and writes. */
19
+ export declare const SUBAGENT_DIRECTOR_NS = "subagent-director";
20
+ /** Page snapshot rendered by the section component. */
21
+ export interface SubagentOptionsState {
22
+ status: 'idle' | 'loading' | 'ready' | 'error';
23
+ /** Whole-load failure text; write failures stay in the calling card. */
24
+ error: string | null;
25
+ /** Whether the settings provider accepts writes. */
26
+ writable: boolean;
27
+ /** Namespace view (redacted). */
28
+ namespace: SettingsNamespaceView | undefined;
29
+ /** The plugin's own user-layer section, cast to its known shape. */
30
+ section: StoredSection | undefined;
31
+ /** Current expectedRevision for the next mutate. */
32
+ revision: number;
33
+ /** Configurable provider directory. */
34
+ providers: readonly ConfigurableProviderView[];
35
+ /** Model catalog groups (provider → models → reasoning efforts). */
36
+ models: readonly ModelProviderGroup[];
37
+ /** The plugin name surfaced to the section. */
38
+ loading: boolean;
39
+ }
40
+ /** Initial empty snapshot. */
41
+ export declare function initialSubagentOptionsState(): SubagentOptionsState;
42
+ /** Human text for a rejected wire call. */
43
+ export declare function messageOf(error: unknown): string;
44
+ /**
45
+ * Raised when the /subagent-director bridge channel is not reachable on the
46
+ * current transport (a Host that predates the bridge answers nothing). The
47
+ * store surfaces this as the localized `bridgeUnavailable` copy instead of a
48
+ * raw transport string.
49
+ */
50
+ export declare class BridgeUnavailableError extends Error {
51
+ constructor();
52
+ }
53
+ /** Whether a thrown value means the bridge channel could not be called at all. */
54
+ export declare function isBridgeUnavailable(error: unknown): boolean;
55
+ /** Wire faces the settings page needs: the bridge RPC caller, the llm face, and copy. */
56
+ export interface StoreWire {
57
+ /** Generic RPC caller for the self-published /subagent-director channel. */
58
+ rpc: ClientConnectionRpc;
59
+ /** llm catalog/adapters face (still connection.api.llm). */
60
+ llm: IApiClient['llm'];
61
+ /** Section copy binder (for the localized bridge-unavailable message). */
62
+ t: (key: SubagentDirectorKey) => string;
63
+ }
64
+ /** The settings page controller (one per settings surface). */
65
+ export declare class SubagentOptionsStore {
66
+ readonly store: SnapshotStore<SubagentOptionsState>;
67
+ private readonly wire;
68
+ private generation;
69
+ constructor(wire: StoreWire);
70
+ /**
71
+ * Call one bridge endpoint over the generic RPC channel. Returns the RpcResult
72
+ * (ok or error branch). A transport-level rejection — the Host has no
73
+ * /subagent-director channel — is folded into BridgeUnavailableError so the
74
+ * caller can show the localized message.
75
+ */
76
+ private callBridge;
77
+ /** Refresh the whole page snapshot: provider directory + model catalog + own namespace. */
78
+ load(): Promise<void>;
79
+ /** Human text for a bridge RPC error branch. */
80
+ private errorMessage;
81
+ /**
82
+ * Run one mutate and update the snapshot's revision. Returns a failure
83
+ * message (localized by the caller) or undefined on success. A
84
+ * settings-conflict re-reads the namespace and returns the conflict kind so
85
+ * the UI can show the "please review and retry" message.
86
+ */
87
+ private mutate;
88
+ private reloadNamespace;
89
+ /** Error code of a bridge RPC error branch, when present. */
90
+ private errorCode;
91
+ addRole(id: string, draft: RoleDraft): Promise<string | undefined>;
92
+ updateRole(id: string, before: StoredRole | undefined, draft: RoleDraft): Promise<string | undefined>;
93
+ removeRole(id: string): Promise<string | undefined>;
94
+ setDefaultRole(id: string): Promise<string | undefined>;
95
+ setDefaultModel(edits: DefaultModelEdits): Promise<string | undefined>;
96
+ restoreDefaults(): Promise<string | undefined>;
97
+ }
98
+ /** Outcome of one write so the UI can pick the right message. */
99
+ export interface MutationOutcome {
100
+ ok: boolean;
101
+ kind: MutationErrorKind;
102
+ message: string | undefined;
103
+ }
104
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/client/store.ts"],"names":[],"mappings":"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"}