@steerable/agent-shell 0.6.33 → 0.6.35

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.
@@ -17,6 +17,7 @@ import { TerminalManager } from '../terminal-manager.js';
17
17
  import { ToolRouter } from '../tool-router.js';
18
18
  import { McpServerRegistry, } from '../mcp-server-registry.js';
19
19
  import { ProjectRegistry } from '../project-registry.js';
20
+ import { getProductConfig } from '../product-config.js';
20
21
  import { LocalBackendRouter } from '../local-backend/router.js';
21
22
  import { WorktreeService } from '../local-backend/worktree-service.js';
22
23
  import { TaskService } from '../local-backend/task-service.js';
@@ -85,6 +86,7 @@ export async function createHostRuntime(options) {
85
86
  name: 'agent-mcp-servers',
86
87
  defaults: { mcpServers: [] },
87
88
  }));
89
+ mcpServerRegistry.seedProductServers(getProductConfig().builtinMcp);
88
90
  const projectRegistry = new ProjectRegistry(createJsonStore({
89
91
  name: 'agent-projects',
90
92
  defaults: { projects: [] },
@@ -7,7 +7,7 @@ export type HostToolFamilyId = (typeof HOST_TOOL_FAMILY_IDS)[number];
7
7
  export interface HostToolFamilySurface {
8
8
  /** 模型可见工具 + 围栏 / 服务端能力。 */
9
9
  capability: boolean;
10
- /** 用户入口:按钮、菜单、项目分组、点路径打开、附件上传、可见 PTY。 */
10
+ /** 用户入口:按钮、菜单、项目分组、点路径打开、可见 PTY。会话附件跟 capability 走。 */
11
11
  chrome: boolean;
12
12
  }
13
13
  /** 产品声明:`true` 两边开,`false` 两边关,对象可拆 chrome / capability。 */
@@ -158,9 +158,11 @@ export function isHostToolCapabilityEnabled(name, tools = resolveHostTools()) {
158
158
  export function isHostRouteAllowed(pathname, tools = resolveHostTools()) {
159
159
  if (pathname.startsWith('/host/terminal'))
160
160
  return tools.terminal.chrome;
161
- if (pathname === '/host/attachments/save' || pathname === '/host/local/open-path') {
161
+ // 会话附件:公文关 chrome(不露访达 / 完整权限)仍要上传材料。
162
+ if (pathname === '/host/attachments/save')
163
+ return tools['local-fs'].capability;
164
+ if (pathname === '/host/local/open-path')
162
165
  return tools['local-fs'].chrome;
163
- }
164
166
  if (pathname.startsWith('/host/local/'))
165
167
  return tools['local-fs'].capability;
166
168
  return true;
@@ -176,9 +178,10 @@ export function sanitizeRightPanelKind(kind, tools = resolveHostTools()) {
176
178
  export function isHostIpcAllowed(channel, tools = resolveHostTools()) {
177
179
  if (channel.startsWith('terminal:'))
178
180
  return tools.terminal.chrome;
179
- if (channel === 'local:open-path' || channel === 'attachments:save') {
181
+ if (channel === 'attachments:save')
182
+ return tools['local-fs'].capability;
183
+ if (channel === 'local:open-path')
180
184
  return tools['local-fs'].chrome;
181
- }
182
185
  if (channel.startsWith('local:'))
183
186
  return tools['local-fs'].capability;
184
187
  return true;
@@ -14,6 +14,38 @@
14
14
  * readable by both. The sidecar is the only chat path and auto-restarts, so
15
15
  * it is available both in-turn (prompt assembly) and for the management UI.
16
16
  */
17
+ /** shell 随包分发的内置技能目录。产品经 product.json `builtinSkills` 按需引入。 */
18
+ export declare const SHELL_BUILTIN_SKILLS: readonly [{
19
+ readonly dir: "00-identity";
20
+ readonly name: "identity";
21
+ }, {
22
+ readonly dir: "10-goal";
23
+ readonly name: "goal";
24
+ }, {
25
+ readonly dir: "11-loop";
26
+ readonly name: "loop";
27
+ }, {
28
+ readonly dir: "12-create-skill";
29
+ readonly name: "create-skill";
30
+ }, {
31
+ readonly dir: "70-plan-mode";
32
+ readonly name: "plan-mode";
33
+ }, {
34
+ readonly dir: "80-tool-usage";
35
+ readonly name: "tool-usage";
36
+ }, {
37
+ readonly dir: "81-anti-deferred";
38
+ readonly name: "anti-deferred-execution";
39
+ }, {
40
+ readonly dir: "82-data-grounding";
41
+ readonly name: "data-grounding";
42
+ }, {
43
+ readonly dir: "85-local-exec";
44
+ readonly name: "local-exec";
45
+ }, {
46
+ readonly dir: "86-proactive-coding";
47
+ readonly name: "proactive-coding";
48
+ }];
17
49
  /** builtin = 随应用分发; user = 设置页导入; workspace = 项目/工作区 `skills/`. */
18
50
  export type SkillOrigin = 'builtin' | 'user' | 'workspace';
19
51
  export declare function getUserSkillsDir(): string;
@@ -17,10 +17,38 @@
17
17
  import fs from 'node:fs';
18
18
  import path from 'node:path';
19
19
  import { fileURLToPath } from 'node:url';
20
+ import { isShellBuiltinSkillEnabled } from '../product-config.js';
20
21
  import { getAppRootDir, getUserDataDir } from '../runtime.js';
21
22
  import { getSidecarSupervisor, whenSidecarSupervisor } from '../sidecar/handle.js';
22
23
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
23
24
  const DEFAULT_SKILLS_DIR = path.resolve(__dirname, 'skills');
25
+ /** shell 随包分发的内置技能目录。产品经 product.json `builtinSkills` 按需引入。 */
26
+ export const SHELL_BUILTIN_SKILLS = [
27
+ { dir: '00-identity', name: 'identity' },
28
+ { dir: '10-goal', name: 'goal' },
29
+ { dir: '11-loop', name: 'loop' },
30
+ { dir: '12-create-skill', name: 'create-skill' },
31
+ { dir: '70-plan-mode', name: 'plan-mode' },
32
+ { dir: '80-tool-usage', name: 'tool-usage' },
33
+ { dir: '81-anti-deferred', name: 'anti-deferred-execution' },
34
+ { dir: '82-data-grounding', name: 'data-grounding' },
35
+ { dir: '85-local-exec', name: 'local-exec' },
36
+ { dir: '86-proactive-coding', name: 'proactive-coding' },
37
+ ];
38
+ function productWantsShellBuiltinSkills() {
39
+ return SHELL_BUILTIN_SKILLS.some((skill) => isShellBuiltinSkillEnabled(skill.dir));
40
+ }
41
+ function disabledShellBuiltinSkillNames() {
42
+ if (!productWantsShellBuiltinSkills())
43
+ return [];
44
+ const names = [];
45
+ for (const skill of SHELL_BUILTIN_SKILLS) {
46
+ if (!isShellBuiltinSkillEnabled(skill.dir)) {
47
+ names.push(skill.dir, skill.name);
48
+ }
49
+ }
50
+ return names;
51
+ }
24
52
  export function getUserSkillsDir() {
25
53
  const dir = path.join(getUserDataDir(), 'skills');
26
54
  if (!fs.existsSync(dir)) {
@@ -82,7 +110,9 @@ export function listSkillRoots(skillsDir) {
82
110
  const user = path.resolve(getUserSkillsDir());
83
111
  const pack = packSkillsDir && fs.existsSync(packSkillsDir) ? [path.resolve(packSkillsDir)] : [];
84
112
  const extras = uniqueExisting(workspaceSkillRootsProvider?.() ?? []).filter((dir) => !samePath(dir, builtin) && !samePath(dir, user) && !pack.some((p) => samePath(dir, p)));
85
- return [builtin, ...pack, ...extras, user];
113
+ return productWantsShellBuiltinSkills()
114
+ ? [builtin, ...pack, ...extras, user]
115
+ : [...pack, ...extras, user];
86
116
  }
87
117
  export function classifySkillOrigin(skillsDir) {
88
118
  const resolved = path.resolve(skillsDir);
@@ -109,10 +139,14 @@ export async function loadSkills(options = {}) {
109
139
  return [];
110
140
  }
111
141
  try {
142
+ const exclude = [
143
+ ...disabledShellBuiltinSkillNames(),
144
+ ...(options.excludeSkillNames ? Array.from(options.excludeSkillNames) : []),
145
+ ];
112
146
  return await supervisor.listSkills({
113
147
  roots: listSkillRoots(options.skillsDir),
114
148
  conditions: options.conditions ? Array.from(options.conditions) : undefined,
115
- exclude: options.excludeSkillNames ? Array.from(options.excludeSkillNames) : undefined,
149
+ exclude: exclude.length > 0 ? exclude : undefined,
116
150
  ignoreConditions: options.ignoreConditions,
117
151
  });
118
152
  }
@@ -70,6 +70,8 @@ export declare class McpServerRegistry {
70
70
  constructor(store: McpServerKvStore);
71
71
  list(): McpServerEntry[];
72
72
  get(idOrName: string): McpServerEntry | null;
73
+ /** 产品预置 MCP:缺省不引入;已有同名服务不覆盖。 */
74
+ seedProductServers(specs: CreateMcpServerInput[] | undefined): void;
73
75
  create(input: CreateMcpServerInput): McpServerEntry;
74
76
  update(id: string, updates: Partial<CreateMcpServerInput>): McpServerEntry;
75
77
  delete(id: string): boolean;
@@ -33,6 +33,14 @@ export class McpServerRegistry {
33
33
  const needle = idOrName.trim().toLowerCase();
34
34
  return (this.list().find((s) => s.id === idOrName || s.name.toLowerCase() === needle) ?? null);
35
35
  }
36
+ /** 产品预置 MCP:缺省不引入;已有同名服务不覆盖。 */
37
+ seedProductServers(specs) {
38
+ for (const spec of specs ?? []) {
39
+ if (this.get(spec.name))
40
+ continue;
41
+ this.create(spec);
42
+ }
43
+ }
36
44
  create(input) {
37
45
  const name = input.name.trim();
38
46
  const command = input.command.trim();
@@ -68,7 +68,33 @@ export interface ProductConfig {
68
68
  temperature?: number;
69
69
  maxTotalTokens?: number;
70
70
  };
71
+ /**
72
+ * shell 内置智能体。按需引入,缺省全关。
73
+ * `true` 才种子;未声明或 `false` 不写入,已有行归档。
74
+ */
75
+ builtinAgents?: Partial<Record<'local-assistant' | 'all-round-assistant', boolean>>;
76
+ /**
77
+ * shell 内置技能。按需引入,缺省全关。
78
+ * `true` 引入全部;对象里 `true` 的目录才引入。设置页入口不受影响。
79
+ */
80
+ builtinSkills?: boolean | Partial<Record<string, boolean>>;
81
+ /**
82
+ * 产品预置 MCP 服务。按需引入,缺省空。已有同名服务不覆盖。
83
+ * 设置页入口不受影响。
84
+ */
85
+ builtinMcp?: Array<{
86
+ name: string;
87
+ command: string;
88
+ args?: string[];
89
+ env?: Record<string, string>;
90
+ cwd?: string;
91
+ enabled?: boolean;
92
+ }>;
71
93
  }
94
+ /** shell 内置智能体:只有产品显式 `true` 才开。 */
95
+ export declare function isShellBuiltinAgentEnabled(id: 'local-assistant' | 'all-round-assistant', config?: ProductConfig): boolean;
96
+ /** shell 内置技能:`true` 全开;否则只有对象里显式 `true` 的目录开。 */
97
+ export declare function isShellBuiltinSkillEnabled(id: string, config?: ProductConfig): boolean;
72
98
  /**
73
99
  * 注入产品配置(产品组装根在第一个 import 时调用)。重复注入抛错
74
100
  * (组装期笔误,fail fast——与 setProductBrand 同语义)。
@@ -9,6 +9,19 @@
9
9
  *
10
10
  * 本模块只允许依赖 node 内置模块(与 brand.ts 同约束)。
11
11
  */
12
+ /** shell 内置智能体:只有产品显式 `true` 才开。 */
13
+ export function isShellBuiltinAgentEnabled(id, config = getProductConfig()) {
14
+ return config.builtinAgents?.[id] === true;
15
+ }
16
+ /** shell 内置技能:`true` 全开;否则只有对象里显式 `true` 的目录开。 */
17
+ export function isShellBuiltinSkillEnabled(id, config = getProductConfig()) {
18
+ const value = config.builtinSkills;
19
+ if (value === true)
20
+ return true;
21
+ if (!value || typeof value !== 'object')
22
+ return false;
23
+ return value[id] === true;
24
+ }
12
25
  let productConfig = null;
13
26
  /**
14
27
  * 注入产品配置(产品组装根在第一个 import 时调用)。重复注入抛错
@@ -1,5 +1,6 @@
1
1
  import { randomUUID } from 'crypto';
2
2
  import { ALL_ROUND_ASSISTANT_AGENT_ID, LOCAL_ASSISTANT_AGENT_ID, getBrand, } from '../brand.js';
3
+ import { isShellBuiltinAgentEnabled } from '../product-config.js';
3
4
  import { DEFAULT_LLM_SETTINGS, llmSettingsCarryExpiredBakedKey, llmSettingsMatchOllamaDefaults, mergeLlmSettings, } from './llm-settings.js';
4
5
  import { MESSAGE_ORDER_DESC } from './message-order.js';
5
6
  import { mergeTelemetrySettings, } from './telemetry-settings.js';
@@ -473,92 +474,108 @@ export class SqliteScopedStore {
473
474
  @sortOrder, @createdAt, @updatedAt
474
475
  )
475
476
  `);
476
- if (!hasBuiltin) {
477
- insertAgent.run({
478
- tenantId: this.scope.tenantId,
479
- userId: this.scope.userId,
480
- id: LOCAL_ASSISTANT_AGENT_ID,
481
- slug: LOCAL_ASSISTANT_AGENT_ID,
482
- name: '电脑操作员',
483
- icon: 'Cpu',
484
- color: '#4f46e5',
485
- description: '默认本地助手,可调用 shell、文件与 MCP 工具。',
486
- rolePrompt: '你是 **电脑操作员**,本地离线助手,回答时清晰、可执行。',
487
- forbiddenPrompt: null,
488
- skillIds: JSON.stringify([]),
489
- toolPolicy: JSON.stringify({ mode: 'all', tools: [] }),
490
- allowExternalSkills: 1,
491
- loadAllSkills: 0,
492
- isBuiltin: 1,
493
- isArchived: 0,
494
- // 激活包有主打种子(sortOrder 0)时让位到 1。
495
- sortOrder: hasHeroSeed ? 1 : 0,
496
- createdAt: now,
497
- updatedAt: now,
498
- });
499
- }
500
- else {
501
- this.db.prepare(`UPDATE chat_agents SET name = ?
502
- WHERE tenant_id = ? AND user_id = ? AND id = ?`)
503
- .run('电脑操作员', this.scope.tenantId, this.scope.userId, LOCAL_ASSISTANT_AGENT_ID);
504
- const local = this.db
505
- .prepare(`SELECT role_prompt FROM chat_agents
506
- WHERE tenant_id = ? AND user_id = ? AND id = ?`)
507
- .get(this.scope.tenantId, this.scope.userId, LOCAL_ASSISTANT_AGENT_ID);
508
- if (local?.role_prompt === '你是本地离线助手,回答时清晰、可执行。') {
509
- this.db
510
- .prepare(`UPDATE chat_agents SET role_prompt = ?
477
+ if (isShellBuiltinAgentEnabled(LOCAL_ASSISTANT_AGENT_ID)) {
478
+ if (!hasBuiltin) {
479
+ insertAgent.run({
480
+ tenantId: this.scope.tenantId,
481
+ userId: this.scope.userId,
482
+ id: LOCAL_ASSISTANT_AGENT_ID,
483
+ slug: LOCAL_ASSISTANT_AGENT_ID,
484
+ name: '电脑操作员',
485
+ icon: 'Cpu',
486
+ color: '#4f46e5',
487
+ description: '默认本地助手,可调用 shell、文件与 MCP 工具。',
488
+ rolePrompt: '你是 **电脑操作员**,本地离线助手,回答时清晰、可执行。',
489
+ forbiddenPrompt: null,
490
+ skillIds: JSON.stringify([]),
491
+ toolPolicy: JSON.stringify({ mode: 'all', tools: [] }),
492
+ allowExternalSkills: 1,
493
+ loadAllSkills: 0,
494
+ isBuiltin: 1,
495
+ isArchived: 0,
496
+ // 激活包有主打种子(sortOrder 0)时让位到 1。
497
+ sortOrder: hasHeroSeed ? 1 : 0,
498
+ createdAt: now,
499
+ updatedAt: now,
500
+ });
501
+ }
502
+ else {
503
+ this.db.prepare(`UPDATE chat_agents SET name = ?
504
+ WHERE tenant_id = ? AND user_id = ? AND id = ?`)
505
+ .run('电脑操作员', this.scope.tenantId, this.scope.userId, LOCAL_ASSISTANT_AGENT_ID);
506
+ const local = this.db
507
+ .prepare(`SELECT role_prompt FROM chat_agents
511
508
  WHERE tenant_id = ? AND user_id = ? AND id = ?`)
512
- .run('你是 **电脑操作员**,本地离线助手,回答时清晰、可执行。', this.scope.tenantId, this.scope.userId, LOCAL_ASSISTANT_AGENT_ID);
509
+ .get(this.scope.tenantId, this.scope.userId, LOCAL_ASSISTANT_AGENT_ID);
510
+ if (local?.role_prompt === '你是本地离线助手,回答时清晰、可执行。') {
511
+ this.db
512
+ .prepare(`UPDATE chat_agents SET role_prompt = ?
513
+ WHERE tenant_id = ? AND user_id = ? AND id = ?`)
514
+ .run('你是 **电脑操作员**,本地离线助手,回答时清晰、可执行。', this.scope.tenantId, this.scope.userId, LOCAL_ASSISTANT_AGENT_ID);
515
+ }
513
516
  }
514
517
  }
518
+ else if (hasBuiltin) {
519
+ this.db
520
+ .prepare(`UPDATE chat_agents SET is_archived = 1, updated_at = ?
521
+ WHERE tenant_id = ? AND user_id = ? AND id = ? AND is_archived = 0`)
522
+ .run(now, this.scope.tenantId, this.scope.userId, LOCAL_ASSISTANT_AGENT_ID);
523
+ }
515
524
  const hasAllRound = this.db
516
525
  .prepare(`SELECT id FROM chat_agents WHERE tenant_id = ? AND user_id = ? AND id = ?`)
517
526
  .get(this.scope.tenantId, this.scope.userId, ALL_ROUND_ASSISTANT_AGENT_ID);
518
- if (!hasAllRound) {
519
- insertAgent.run({
520
- tenantId: this.scope.tenantId,
521
- userId: this.scope.userId,
522
- id: ALL_ROUND_ASSISTANT_AGENT_ID,
523
- slug: ALL_ROUND_ASSISTANT_AGENT_ID,
524
- name: '智能助手',
525
- icon: '🔮',
526
- color: '#a855f7',
527
- description: '全能智能体,自动加载全部已安装本地技能和工具,无需限定条件。',
528
- rolePrompt: [
529
- '你是 **智能助手**,一个具备高权限且集成了全部本地技能(Skills)的行动体。',
530
- '你具备完整的本地命令执行(local_exec_shell)、文件读写能力,以及当前产品安装的全部场景工具。',
531
- '你的系统提示词中已经无条件加载了所有已安装的本地技能与工具。',
532
- '请根据用户的需求,直接、高效地调用最合适的本地工具或执行脚本来解决任务。'
533
- ].join('\n'),
534
- forbiddenPrompt: null,
535
- skillIds: JSON.stringify([]),
536
- toolPolicy: JSON.stringify({ mode: 'all', tools: [] }),
537
- allowExternalSkills: 1,
538
- // 「智能助手」的定位就是无条件加载全部技能(此前是 router 硬编码)。
539
- loadAllSkills: 1,
540
- isBuiltin: 1,
541
- isArchived: 0,
542
- sortOrder: 2,
543
- createdAt: now,
544
- updatedAt: now,
545
- });
546
- }
547
- else {
548
- const agent = this.db.prepare(`SELECT role_prompt FROM chat_agents
549
- WHERE tenant_id = ? AND user_id = ? AND id = ?`).get(this.scope.tenantId, this.scope.userId, ALL_ROUND_ASSISTANT_AGENT_ID);
550
- if (agent) {
551
- const updatedPrompt = agent.role_prompt.replace(/全能专家助手/g, '智能助手');
552
- this.db.prepare(`UPDATE chat_agents SET name = ?, role_prompt = ?
553
- WHERE tenant_id = ? AND user_id = ? AND id = ?`)
554
- .run('智能助手', updatedPrompt, this.scope.tenantId, this.scope.userId, ALL_ROUND_ASSISTANT_AGENT_ID);
527
+ if (isShellBuiltinAgentEnabled(ALL_ROUND_ASSISTANT_AGENT_ID)) {
528
+ if (!hasAllRound) {
529
+ insertAgent.run({
530
+ tenantId: this.scope.tenantId,
531
+ userId: this.scope.userId,
532
+ id: ALL_ROUND_ASSISTANT_AGENT_ID,
533
+ slug: ALL_ROUND_ASSISTANT_AGENT_ID,
534
+ name: '智能助手',
535
+ icon: '🔮',
536
+ color: '#a855f7',
537
+ description: '全能智能体,自动加载全部已安装本地技能和工具,无需限定条件。',
538
+ rolePrompt: [
539
+ '你是 **智能助手**,一个具备高权限且集成了全部本地技能(Skills)的行动体。',
540
+ '你具备完整的本地命令执行(local_exec_shell)、文件读写能力,以及当前产品安装的全部场景工具。',
541
+ '你的系统提示词中已经无条件加载了所有已安装的本地技能与工具。',
542
+ '请根据用户的需求,直接、高效地调用最合适的本地工具或执行脚本来解决任务。'
543
+ ].join('\n'),
544
+ forbiddenPrompt: null,
545
+ skillIds: JSON.stringify([]),
546
+ toolPolicy: JSON.stringify({ mode: 'all', tools: [] }),
547
+ allowExternalSkills: 1,
548
+ // 「智能助手」的定位就是无条件加载全部技能(此前是 router 硬编码)。
549
+ loadAllSkills: 1,
550
+ isBuiltin: 1,
551
+ isArchived: 0,
552
+ sortOrder: 2,
553
+ createdAt: now,
554
+ updatedAt: now,
555
+ });
555
556
  }
556
557
  else {
557
- this.db.prepare(`UPDATE chat_agents SET name = ?
558
- WHERE tenant_id = ? AND user_id = ? AND id = ?`)
559
- .run('智能助手', this.scope.tenantId, this.scope.userId, ALL_ROUND_ASSISTANT_AGENT_ID);
558
+ const agent = this.db.prepare(`SELECT role_prompt FROM chat_agents
559
+ WHERE tenant_id = ? AND user_id = ? AND id = ?`).get(this.scope.tenantId, this.scope.userId, ALL_ROUND_ASSISTANT_AGENT_ID);
560
+ if (agent) {
561
+ const updatedPrompt = agent.role_prompt.replace(/全能专家助手/g, '智能助手');
562
+ this.db.prepare(`UPDATE chat_agents SET name = ?, role_prompt = ?
563
+ WHERE tenant_id = ? AND user_id = ? AND id = ?`)
564
+ .run('智能助手', updatedPrompt, this.scope.tenantId, this.scope.userId, ALL_ROUND_ASSISTANT_AGENT_ID);
565
+ }
566
+ else {
567
+ this.db.prepare(`UPDATE chat_agents SET name = ?
568
+ WHERE tenant_id = ? AND user_id = ? AND id = ?`)
569
+ .run('智能助手', this.scope.tenantId, this.scope.userId, ALL_ROUND_ASSISTANT_AGENT_ID);
570
+ }
560
571
  }
561
572
  }
573
+ else if (hasAllRound) {
574
+ this.db
575
+ .prepare(`UPDATE chat_agents SET is_archived = 1, updated_at = ?
576
+ WHERE tenant_id = ? AND user_id = ? AND id = ? AND is_archived = 0`)
577
+ .run(now, this.scope.tenantId, this.scope.userId, ALL_ROUND_ASSISTANT_AGENT_ID);
578
+ }
562
579
  // ─── 场景包智能体种子(0.3d) ───
563
580
  // 激活包:不存在则种子;命中历史代文案(用户从未定制)则静默升级;
564
581
  // 被归档但未定制的行重新露出。未激活包:未定制的内置行归档(用户改
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@steerable/agent-shell",
3
- "version": "0.6.33",
3
+ "version": "0.6.35",
4
4
  "description": "Steerable framework — product-neutral desktop/headless agent host (Tier 5). Electron main + preload + headless HTTP server (BS) sharing one storage/sidecar/tooling core; scenario packs extend it through the @steerable/pack-sdk contract and are composed at build time by the consuming product.",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://steerableframework.com/",
@@ -53,9 +53,9 @@
53
53
  "electron-store": "^8.1.0",
54
54
  "he": "^1.2.0",
55
55
  "node-pty": "^1.1.0",
56
- "@steerable/agent-harness": "0.6.33",
57
- "@steerable/pack-sdk": "0.6.33",
58
- "@steerable/agent-protocol": "0.6.33"
56
+ "@steerable/agent-protocol": "0.6.35",
57
+ "@steerable/pack-sdk": "0.6.35",
58
+ "@steerable/agent-harness": "0.6.35"
59
59
  },
60
60
  "devDependencies": {
61
61
  "@types/better-sqlite3": "^7.6.13",