@silo-code/sdk 0.41.0 → 0.43.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.
- package/dist/AgentIconGlyph.d.ts +30 -0
- package/dist/AgentIconGlyph.d.ts.map +1 -0
- package/dist/AgentIconGlyph.js +28 -0
- package/dist/AgentIconGlyph.js.map +1 -0
- package/dist/MenuButton.d.ts +20 -4
- package/dist/MenuButton.d.ts.map +1 -1
- package/dist/MenuButton.js +15 -4
- package/dist/MenuButton.js.map +1 -1
- package/dist/agents-service.d.ts +70 -1
- package/dist/agents-service.d.ts.map +1 -1
- package/dist/domain-types.d.ts +25 -0
- package/dist/domain-types.d.ts.map +1 -1
- package/dist/extension-storage.d.ts +53 -2
- package/dist/extension-storage.d.ts.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/menu-button-classes.d.ts +15 -3
- package/dist/menu-button-classes.d.ts.map +1 -1
- package/dist/menu-button-classes.js +10 -6
- package/dist/menu-button-classes.js.map +1 -1
- package/dist/permissions.d.ts +24 -0
- package/dist/permissions.d.ts.map +1 -1
- package/dist/permissions.js +30 -0
- package/dist/permissions.js.map +1 -1
- package/dist/terminal-service.d.ts +8 -1
- package/dist/terminal-service.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/AgentIconGlyph.tsx +56 -0
- package/src/MenuButton.tsx +25 -4
- package/src/agents-service.ts +73 -1
- package/src/domain-types.ts +25 -0
- package/src/extension-storage.ts +53 -2
- package/src/index.ts +13 -4
- package/src/menu-button-classes.test.ts +13 -0
- package/src/menu-button-classes.ts +23 -6
- package/src/permissions.ts +31 -0
- package/src/terminal-service.ts +8 -1
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { AgentIcon, AgentIconMode } from "./agents-service.js";
|
|
2
|
+
/**
|
|
3
|
+
* Renders a Catalog Agent's brand mark from its {@link AgentIcon} data (get one
|
|
4
|
+
* from {@link AgentsService.catalog}). Data-driven on purpose — it takes the
|
|
5
|
+
* icon, not an agent id, so it has no dependency on the sealed catalog and one
|
|
6
|
+
* renderer serves the host `+` menu, `silo.agents`, and third-party extensions.
|
|
7
|
+
*
|
|
8
|
+
* Returns `null` when `mode` is `"none"` or `icon` is absent — callers that
|
|
9
|
+
* gate tab chrome on "is there an icon" should check the return value, not
|
|
10
|
+
* construct the element unconditionally.
|
|
11
|
+
*
|
|
12
|
+
* `"color"` tints the glyph with the brand's own hex (picking
|
|
13
|
+
* {@link AgentIcon.hexLight} / {@link AgentIcon.hexDark} by `colorScheme`, since
|
|
14
|
+
* one hex can't contrast against both a light and a dark tab strip);
|
|
15
|
+
* `"monotone"` leaves `color` unset so it inherits `currentColor` from an
|
|
16
|
+
* ancestor. A duotone source (OpenCode's frame + panel) layers a second
|
|
17
|
+
* 40%-opacity path rather than flattening to one fill.
|
|
18
|
+
*
|
|
19
|
+
* @category Consumer Services
|
|
20
|
+
* @public
|
|
21
|
+
*/
|
|
22
|
+
export declare function AgentIconGlyph({ icon, mode, colorScheme, className, }: {
|
|
23
|
+
icon: AgentIcon | undefined;
|
|
24
|
+
mode: AgentIconMode;
|
|
25
|
+
/** The host's active light/dark base — selects `hexLight` / `hexDark` in
|
|
26
|
+
* `"color"` mode. */
|
|
27
|
+
colorScheme: "dark" | "light";
|
|
28
|
+
className?: string;
|
|
29
|
+
}): import("react").JSX.Element | null;
|
|
30
|
+
//# sourceMappingURL=AgentIconGlyph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentIconGlyph.d.ts","sourceRoot":"","sources":["../src/AgentIconGlyph.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EACJ,IAAI,EACJ,WAAW,EACX,SAAS,GACV,EAAE;IACD,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC;IAC5B,IAAI,EAAE,aAAa,CAAC;IACpB;0BACsB;IACtB,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,sCAqBA"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Renders a Catalog Agent's brand mark from its {@link AgentIcon} data (get one
|
|
4
|
+
* from {@link AgentsService.catalog}). Data-driven on purpose — it takes the
|
|
5
|
+
* icon, not an agent id, so it has no dependency on the sealed catalog and one
|
|
6
|
+
* renderer serves the host `+` menu, `silo.agents`, and third-party extensions.
|
|
7
|
+
*
|
|
8
|
+
* Returns `null` when `mode` is `"none"` or `icon` is absent — callers that
|
|
9
|
+
* gate tab chrome on "is there an icon" should check the return value, not
|
|
10
|
+
* construct the element unconditionally.
|
|
11
|
+
*
|
|
12
|
+
* `"color"` tints the glyph with the brand's own hex (picking
|
|
13
|
+
* {@link AgentIcon.hexLight} / {@link AgentIcon.hexDark} by `colorScheme`, since
|
|
14
|
+
* one hex can't contrast against both a light and a dark tab strip);
|
|
15
|
+
* `"monotone"` leaves `color` unset so it inherits `currentColor` from an
|
|
16
|
+
* ancestor. A duotone source (OpenCode's frame + panel) layers a second
|
|
17
|
+
* 40%-opacity path rather than flattening to one fill.
|
|
18
|
+
*
|
|
19
|
+
* @category Consumer Services
|
|
20
|
+
* @public
|
|
21
|
+
*/
|
|
22
|
+
export function AgentIconGlyph({ icon, mode, colorScheme, className, }) {
|
|
23
|
+
if (mode === "none" || !icon)
|
|
24
|
+
return null;
|
|
25
|
+
const hex = colorScheme === "light" ? icon.hexLight : icon.hexDark;
|
|
26
|
+
return (_jsxs("svg", { viewBox: "0 0 24 24", className: className, style: mode === "color" ? { color: `#${hex}` } : undefined, "aria-hidden": "true", children: [_jsx("path", { d: icon.path, fill: "currentColor", fillRule: icon.fillRule }), icon.accentPath && (_jsx("path", { d: icon.accentPath, fill: "currentColor", fillRule: icon.accentFillRule, opacity: 0.4 }))] }));
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=AgentIconGlyph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentIconGlyph.js","sourceRoot":"","sources":["../src/AgentIconGlyph.tsx"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,cAAc,CAAC,EAC7B,IAAI,EACJ,IAAI,EACJ,WAAW,EACX,SAAS,GAQV;IACC,IAAI,IAAI,KAAK,MAAM,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAC1C,MAAM,GAAG,GAAG,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;IACnE,OAAO,CACL,eACE,OAAO,EAAC,WAAW,EACnB,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,iBAC9C,MAAM,aAElB,eAAM,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAC,cAAc,EAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,GAAI,EAClE,IAAI,CAAC,UAAU,IAAI,CAClB,eACE,CAAC,EAAE,IAAI,CAAC,UAAU,EAClB,IAAI,EAAC,cAAc,EACnB,QAAQ,EAAE,IAAI,CAAC,cAAc,EAC7B,OAAO,EAAE,GAAG,GACZ,CACH,IACG,CACP,CAAC;AACJ,CAAC"}
|
package/dist/MenuButton.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ButtonHTMLAttributes, ReactNode } from "react";
|
|
2
|
-
import { type MenuButtonSize } from "./menu-button-classes.js";
|
|
3
|
-
export type { MenuButtonSize };
|
|
2
|
+
import { type MenuButtonSize, type MenuButtonVariant } from "./menu-button-classes.js";
|
|
3
|
+
export type { MenuButtonSize, MenuButtonVariant };
|
|
4
4
|
/**
|
|
5
5
|
* A **labelled** button that opens a menu — the counterpart to
|
|
6
6
|
* {@link IconButton} for the cases where a bare `⋮` doesn't tell anyone what
|
|
@@ -17,7 +17,9 @@ export type { MenuButtonSize };
|
|
|
17
17
|
* lines up under the button.
|
|
18
18
|
*
|
|
19
19
|
* Styled purely via host-provided `.silo-menu-button*` classes — no stylesheet
|
|
20
|
-
* import is needed in the extension.
|
|
20
|
+
* import is needed in the extension. `variant="field"` gives it `Input` /
|
|
21
|
+
* `Select` chrome (border, full width, trailing chevron) for use as a value
|
|
22
|
+
* picker in a form, where a rich menu (icons, checks) beats a native `<select>`.
|
|
21
23
|
*
|
|
22
24
|
* @example
|
|
23
25
|
* ```tsx
|
|
@@ -36,16 +38,30 @@ export type { MenuButtonSize };
|
|
|
36
38
|
*
|
|
37
39
|
* // compact — e.g. in a card footer or a ListRow's trailing slot
|
|
38
40
|
* <MenuButton size="sm" label="More" onClick={openMenu} />
|
|
41
|
+
*
|
|
42
|
+
* // as a form field — a value picker inside a `Section`
|
|
43
|
+
* <MenuButton
|
|
44
|
+
* variant="field"
|
|
45
|
+
* label={agent?.displayName ?? "Auto-detect"}
|
|
46
|
+
* onClick={(e) => ctx.ui.showMenu({ anchor: e.currentTarget, items })}
|
|
47
|
+
* >
|
|
48
|
+
* <AgentIconGlyph icon={agent?.icon} mode="color" colorScheme={scheme} />
|
|
49
|
+
* </MenuButton>
|
|
39
50
|
* ```
|
|
40
51
|
*
|
|
41
52
|
* @category Consumer Services
|
|
42
53
|
* @public
|
|
43
54
|
*/
|
|
44
|
-
export declare function MenuButton({ label, size, className, type, children, ...rest }: {
|
|
55
|
+
export declare function MenuButton({ label, size, variant, className, type, children, ...rest }: {
|
|
45
56
|
/** The visible label — the whole point of reaching for this over `IconButton`. */
|
|
46
57
|
label: ReactNode;
|
|
47
58
|
/** `sm` for compact contexts (card footers, list rows). */
|
|
48
59
|
size?: MenuButtonSize;
|
|
60
|
+
/**
|
|
61
|
+
* `"bare"` (default) is a borderless label + chevron for toolbars and rows;
|
|
62
|
+
* `"field"` wears `Input` / `Select` chrome so it lines up as a form field.
|
|
63
|
+
*/
|
|
64
|
+
variant?: MenuButtonVariant;
|
|
49
65
|
/** Optional leading content, e.g. an icon before the label. */
|
|
50
66
|
children?: ReactNode;
|
|
51
67
|
} & Omit<ButtonHTMLAttributes<HTMLButtonElement>, "children">): import("react").JSX.Element;
|
package/dist/MenuButton.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MenuButton.d.ts","sourceRoot":"","sources":["../src/MenuButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC7D,OAAO,
|
|
1
|
+
{"version":3,"file":"MenuButton.d.ts","sourceRoot":"","sources":["../src/MenuButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC7D,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACvB,MAAM,uBAAuB,CAAC;AAE/B,YAAY,EAAE,cAAc,EAAE,iBAAiB,EAAE,CAAC;AAElD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,IAAe,EACf,OAAgB,EAChB,SAAS,EACT,IAAe,EACf,QAAQ,EACR,GAAG,IAAI,EACR,EAAE;IACD,kFAAkF;IAClF,KAAK,EAAE,SAAS,CAAC;IACjB,2DAA2D;IAC3D,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB;;;OAGG;IACH,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,GAAG,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,UAAU,CAAC,+BA6B5D"}
|
package/dist/MenuButton.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { menuButtonClass } from "./menu-button-classes.js";
|
|
2
|
+
import { menuButtonClass, } from "./menu-button-classes.js";
|
|
3
3
|
/**
|
|
4
4
|
* A **labelled** button that opens a menu — the counterpart to
|
|
5
5
|
* {@link IconButton} for the cases where a bare `⋮` doesn't tell anyone what
|
|
@@ -16,7 +16,9 @@ import { menuButtonClass } from "./menu-button-classes.js";
|
|
|
16
16
|
* lines up under the button.
|
|
17
17
|
*
|
|
18
18
|
* Styled purely via host-provided `.silo-menu-button*` classes — no stylesheet
|
|
19
|
-
* import is needed in the extension.
|
|
19
|
+
* import is needed in the extension. `variant="field"` gives it `Input` /
|
|
20
|
+
* `Select` chrome (border, full width, trailing chevron) for use as a value
|
|
21
|
+
* picker in a form, where a rich menu (icons, checks) beats a native `<select>`.
|
|
20
22
|
*
|
|
21
23
|
* @example
|
|
22
24
|
* ```tsx
|
|
@@ -35,13 +37,22 @@ import { menuButtonClass } from "./menu-button-classes.js";
|
|
|
35
37
|
*
|
|
36
38
|
* // compact — e.g. in a card footer or a ListRow's trailing slot
|
|
37
39
|
* <MenuButton size="sm" label="More" onClick={openMenu} />
|
|
40
|
+
*
|
|
41
|
+
* // as a form field — a value picker inside a `Section`
|
|
42
|
+
* <MenuButton
|
|
43
|
+
* variant="field"
|
|
44
|
+
* label={agent?.displayName ?? "Auto-detect"}
|
|
45
|
+
* onClick={(e) => ctx.ui.showMenu({ anchor: e.currentTarget, items })}
|
|
46
|
+
* >
|
|
47
|
+
* <AgentIconGlyph icon={agent?.icon} mode="color" colorScheme={scheme} />
|
|
48
|
+
* </MenuButton>
|
|
38
49
|
* ```
|
|
39
50
|
*
|
|
40
51
|
* @category Consumer Services
|
|
41
52
|
* @public
|
|
42
53
|
*/
|
|
43
|
-
export function MenuButton({ label, size = "normal", className, type = "button", children, ...rest }) {
|
|
44
|
-
const classes = menuButtonClass(size);
|
|
54
|
+
export function MenuButton({ label, size = "normal", variant = "bare", className, type = "button", children, ...rest }) {
|
|
55
|
+
const classes = menuButtonClass(size, variant);
|
|
45
56
|
return (_jsxs("button", { type: type, className: className ? `${classes} ${className}` : classes, "aria-haspopup": "menu", ...rest, children: [children, _jsx("span", { className: "silo-menu-button-label", children: label }), _jsx("svg", { className: "silo-menu-button-chevron", viewBox: "0 0 16 16", "aria-hidden": "true", children: _jsx("path", { d: "M4 6l4 4 4-4", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) })] }));
|
|
46
57
|
}
|
|
47
58
|
//# sourceMappingURL=MenuButton.js.map
|
package/dist/MenuButton.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MenuButton.js","sourceRoot":"","sources":["../src/MenuButton.tsx"],"names":[],"mappings":";AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"MenuButton.js","sourceRoot":"","sources":["../src/MenuButton.tsx"],"names":[],"mappings":";AACA,OAAO,EACL,eAAe,GAGhB,MAAM,uBAAuB,CAAC;AAI/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,MAAM,UAAU,UAAU,CAAC,EACzB,KAAK,EACL,IAAI,GAAG,QAAQ,EACf,OAAO,GAAG,MAAM,EAChB,SAAS,EACT,IAAI,GAAG,QAAQ,EACf,QAAQ,EACR,GAAG,IAAI,EAaoD;IAC3D,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/C,OAAO,CACL,kBACE,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,mBAG5C,MAAM,KAChB,IAAI,aAEP,QAAQ,EACT,eAAM,SAAS,EAAC,wBAAwB,YAAE,KAAK,GAAQ,EACvD,cACE,SAAS,EAAC,0BAA0B,EACpC,OAAO,EAAC,WAAW,iBACP,MAAM,YAElB,eACE,CAAC,EAAC,cAAc,EAChB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,WAAW,EAAC,KAAK,EACjB,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,GACtB,GACE,IACC,CACV,CAAC;AACJ,CAAC"}
|
package/dist/agents-service.d.ts
CHANGED
|
@@ -36,7 +36,15 @@ export interface AgentInfo {
|
|
|
36
36
|
readonly terminalId: string;
|
|
37
37
|
/** The workspace this terminal belongs to. */
|
|
38
38
|
readonly workspaceId: string;
|
|
39
|
-
/**
|
|
39
|
+
/**
|
|
40
|
+
* The terminal's kind at registration time.
|
|
41
|
+
*
|
|
42
|
+
* @deprecated Always `"shell"` after RFC 0033 — the deprecated `"claude"` /
|
|
43
|
+
* `"pi"` kinds are normalized away at load and nothing creates them, so a
|
|
44
|
+
* consumer branching on this is reading a constant. Use
|
|
45
|
+
* {@link AgentInfo.agentId} for which agent is running, and
|
|
46
|
+
* {@link AgentInfo.isAgent} for whether one is.
|
|
47
|
+
*/
|
|
40
48
|
readonly kind: TerminalKind;
|
|
41
49
|
/**
|
|
42
50
|
* Whether this terminal currently hosts an agent — true if it was created
|
|
@@ -104,6 +112,54 @@ export interface AgentInfo {
|
|
|
104
112
|
*/
|
|
105
113
|
readonly agentId?: string;
|
|
106
114
|
}
|
|
115
|
+
/**
|
|
116
|
+
* A Catalog Agent's brand mark — SVG path data plus the two theme-dependent
|
|
117
|
+
* hexes. Consumed by {@link AgentIconGlyph}; a single hex cannot have enough
|
|
118
|
+
* contrast against both a light and a dark tab strip, so `"color"` mode picks
|
|
119
|
+
* `hexLight` / `hexDark` by the host's active base.
|
|
120
|
+
*
|
|
121
|
+
* @category Consumer Services
|
|
122
|
+
* @public
|
|
123
|
+
*/
|
|
124
|
+
export interface AgentIcon {
|
|
125
|
+
/** Display name, for the glyph's accessible label. */
|
|
126
|
+
title: string;
|
|
127
|
+
/** The brand's color against a light background, no leading `#`. */
|
|
128
|
+
hexLight: string;
|
|
129
|
+
/** The brand's color against a dark background, no leading `#`. */
|
|
130
|
+
hexDark: string;
|
|
131
|
+
/** SVG path data, `viewBox="0 0 24 24"`. */
|
|
132
|
+
path: string;
|
|
133
|
+
/** Set when the source path assumes `fill-rule: evenodd`; omit for the SVG
|
|
134
|
+
* default (`nonzero`). */
|
|
135
|
+
fillRule?: "evenodd";
|
|
136
|
+
/** A second path (same viewBox) layered on {@link AgentIcon.path} at 40%
|
|
137
|
+
* opacity, for a genuinely duotone mark (OpenCode's frame + inner panel). */
|
|
138
|
+
accentPath?: string;
|
|
139
|
+
/** `fill-rule` for {@link AgentIcon.accentPath}, independent of `fillRule`. */
|
|
140
|
+
accentFillRule?: "evenodd";
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* How {@link AgentIconGlyph} renders: `"none"` draws nothing, `"color"` tints
|
|
144
|
+
* with the brand hex, `"monotone"` inherits `currentColor`.
|
|
145
|
+
*
|
|
146
|
+
* @category Consumer Services
|
|
147
|
+
* @public
|
|
148
|
+
*/
|
|
149
|
+
export type AgentIconMode = "none" | "color" | "monotone";
|
|
150
|
+
/**
|
|
151
|
+
* One Catalog Agent as an extension may read it through
|
|
152
|
+
* {@link AgentsService.catalog}. Read-only — detection stays sealed (ADR 0028)
|
|
153
|
+
* and there is no way to register into the catalog.
|
|
154
|
+
*
|
|
155
|
+
* @category Consumer Services
|
|
156
|
+
* @public
|
|
157
|
+
*/
|
|
158
|
+
export interface CatalogAgentSummary {
|
|
159
|
+
readonly id: string;
|
|
160
|
+
readonly displayName: string;
|
|
161
|
+
readonly icon?: AgentIcon;
|
|
162
|
+
}
|
|
107
163
|
/**
|
|
108
164
|
* Host-computed coding-agent observability — exposed as
|
|
109
165
|
* {@link ExtensionContext.agents}. Detection (what OSC/output signals mean
|
|
@@ -170,5 +226,18 @@ export interface AgentsService {
|
|
|
170
226
|
* ```
|
|
171
227
|
*/
|
|
172
228
|
acknowledge(terminalId: string): void;
|
|
229
|
+
/**
|
|
230
|
+
* Every coding agent Silo knows about, as read-only
|
|
231
|
+
* {@link CatalogAgentSummary} records. Detection stays sealed (ADR 0028) —
|
|
232
|
+
* there is no way to register into this list.
|
|
233
|
+
*
|
|
234
|
+
* The returned array is **memoized and deeply frozen**: it is read inside
|
|
235
|
+
* tab-icon rendering (`ctx.terminals.bindIcon`), so a fresh allocation per
|
|
236
|
+
* call would be a per-render cost and a mutable one a correctness hazard.
|
|
237
|
+
*
|
|
238
|
+
* @category Consumer Services
|
|
239
|
+
* @public
|
|
240
|
+
*/
|
|
241
|
+
catalog(): readonly CatalogAgentSummary[];
|
|
173
242
|
}
|
|
174
243
|
//# sourceMappingURL=agents-service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents-service.d.ts","sourceRoot":"","sources":["../src/agents-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAQnD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAE3E;;;;;;;;;;GAUG;AACH,MAAM,WAAW,SAAS;IACxB,oDAAoD;IACpD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,8CAA8C;IAC9C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B
|
|
1
|
+
{"version":3,"file":"agents-service.d.ts","sourceRoot":"","sources":["../src/agents-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAQnD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAE3E;;;;;;;;;;GAUG;AACH,MAAM,WAAW,SAAS;IACxB,oDAAoD;IACpD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,8CAA8C;IAC9C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B;;;;;;;;OAQG;IACH,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,mCAAmC;IACnC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC;;;;;;OAMG;IACH,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,kFAAkF;IAClF,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,wFAAwF;IACxF,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;;;;OAOG;IACH,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB;;;;;;;;OAQG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;;;OAOG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC;;;;;;;OAOG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,SAAS;IACxB,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb;+BAC2B;IAC3B,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB;kFAC8E;IAC9E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+EAA+E;IAC/E,cAAc,CAAC,EAAE,SAAS,CAAC;CAC5B;AAED;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;AAE1D;;;;;;;GAOG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,SAAS,EAAE,CAAC;IAC7D,8EAA8E;IAC9E,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;IAC3D;;;;OAIG;IACH,SAAS,CACP,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,IAAI,EACtC,OAAO,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,GACpC,UAAU,CAAC;IACd;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC;;;;;;;;;;;OAWG;IACH,OAAO,IAAI,SAAS,mBAAmB,EAAE,CAAC;CAC3C"}
|
package/dist/domain-types.d.ts
CHANGED
|
@@ -10,6 +10,17 @@
|
|
|
10
10
|
/**
|
|
11
11
|
* The kind of a terminal session.
|
|
12
12
|
*
|
|
13
|
+
* @remarks
|
|
14
|
+
* The `"claude"` and `"pi"` values are **deprecated** (RFC 0033). Nothing in
|
|
15
|
+
* Silo creates a terminal with those kinds any more, and a persisted record
|
|
16
|
+
* carrying one is normalized to `"shell"` at load. Use an **Agent Profile** to
|
|
17
|
+
* start an agent in a terminal — it is the launch-time vocabulary for "which
|
|
18
|
+
* agent"; `TerminalKind` is neither the launch nor the identity vocabulary.
|
|
19
|
+
* `ctx.terminals.create({ kind: "claude" | "pi" })` still works (it creates a
|
|
20
|
+
* `"shell"` terminal and launches a matching profile if one exists), and the
|
|
21
|
+
* type keeps both values so third-party code compiles — removal is gated on a
|
|
22
|
+
* later engine bump.
|
|
23
|
+
*
|
|
13
24
|
* @category Core Types
|
|
14
25
|
* @public
|
|
15
26
|
*/
|
|
@@ -48,6 +59,20 @@ export interface TerminalRecord {
|
|
|
48
59
|
cwd?: string;
|
|
49
60
|
/** ISO timestamp of the last output we observed; used to pick a workspace's "primary" terminal. */
|
|
50
61
|
lastActiveAt?: string;
|
|
62
|
+
/**
|
|
63
|
+
* The id of the Agent Profile this terminal was launched from (RFC 0033),
|
|
64
|
+
* when Silo launched it with one. A terminal created any other way — "New
|
|
65
|
+
* Terminal", the watermark, `core.newTerminal`, `ctx.terminals.create` — has
|
|
66
|
+
* no `profileId`; Silo never guesses one for a hand-typed agent.
|
|
67
|
+
*
|
|
68
|
+
* Written at launch and maintained by the host: renaming a profile's id
|
|
69
|
+
* rewrites this, deleting the profile clears it. It is written and kept
|
|
70
|
+
* current in phase 1 but not yet read — its first consumer is resume
|
|
71
|
+
* composition (RFC 0033 phase 4).
|
|
72
|
+
*
|
|
73
|
+
* @public
|
|
74
|
+
*/
|
|
75
|
+
profileId?: string;
|
|
51
76
|
}
|
|
52
77
|
/**
|
|
53
78
|
* The two modes of the one editor surface: a read-write text editor, or a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domain-types.d.ts","sourceRoot":"","sources":["../src/domain-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH
|
|
1
|
+
{"version":3,"file":"domain-types.d.ts","sourceRoot":"","sources":["../src/domain-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,8 +34,9 @@ export interface ExtensionStorage {
|
|
|
34
34
|
subscribe(listener: () => void): Disposable;
|
|
35
35
|
}
|
|
36
36
|
/**
|
|
37
|
-
* The
|
|
38
|
-
* {@link ExtensionContext.storage}
|
|
37
|
+
* The persisted-storage scopes available to an extension, exposed as
|
|
38
|
+
* {@link ExtensionContext.storage}: two key/value bags for settings-sized
|
|
39
|
+
* state, and the two matching **directories** for real data files.
|
|
39
40
|
*
|
|
40
41
|
* @category Consumer Services
|
|
41
42
|
* @public
|
|
@@ -52,5 +53,55 @@ export interface ExtensionStorageScopes {
|
|
|
52
53
|
* toggles). The bag is swapped when the active workspace changes.
|
|
53
54
|
*/
|
|
54
55
|
readonly workspace: ExtensionStorage;
|
|
56
|
+
/**
|
|
57
|
+
* An absolute path to a **directory of your own**, shared across every
|
|
58
|
+
* workspace — the filesystem counterpart to {@link ExtensionStorageScopes.global}.
|
|
59
|
+
* Use it for real data files (a `.jsonl` log, a cache, an export) rather than
|
|
60
|
+
* inventing a path under the user's home directory.
|
|
61
|
+
*
|
|
62
|
+
* The directory is created on first call and lives under Silo's user-config
|
|
63
|
+
* root, namespaced by your extension id:
|
|
64
|
+
* `~/.config/silo/extension-storage/<your-id>/global`. The path is stable
|
|
65
|
+
* across calls, activations, and restarts.
|
|
66
|
+
*
|
|
67
|
+
* **No filesystem permission is needed inside it.** Paths beneath this
|
|
68
|
+
* directory are readable and writable through {@link ExtensionContext.files}
|
|
69
|
+
* without declaring `fs:read` or `fs:write` — your own storage is inside your
|
|
70
|
+
* sandbox, the same way the open workspace folder is. The lift stops at
|
|
71
|
+
* `ctx.files`: running a process with a working directory in here still needs
|
|
72
|
+
* the `process` permission (passing the path to a command as an *argument*
|
|
73
|
+
* needs nothing extra).
|
|
74
|
+
*
|
|
75
|
+
* Relative paths passed to `ctx.files` still resolve against the **workspace**,
|
|
76
|
+
* not this directory — always join onto the absolute path you get back.
|
|
77
|
+
*
|
|
78
|
+
* ```ts
|
|
79
|
+
* const dir = await ctx.storage.globalDir();
|
|
80
|
+
* await ctx.files.writeText(`${dir}/tasks.jsonl`, body);
|
|
81
|
+
* ```
|
|
82
|
+
*
|
|
83
|
+
* Uninstalling your extension does **not** delete this directory unless the
|
|
84
|
+
* user opts in; the data survives a reinstall.
|
|
85
|
+
*/
|
|
86
|
+
globalDir(): Promise<string>;
|
|
87
|
+
/**
|
|
88
|
+
* An absolute path to a directory of your own scoped to the **active
|
|
89
|
+
* workspace** — the filesystem counterpart to
|
|
90
|
+
* {@link ExtensionStorageScopes.workspace}. Created on first call, at
|
|
91
|
+
* `~/.config/silo/extension-storage/<your-id>/workspaces/<workspaceId>`.
|
|
92
|
+
*
|
|
93
|
+
* Everything {@link ExtensionStorageScopes.globalDir} says about permissions
|
|
94
|
+
* and relative paths applies here too. Call it again after the active
|
|
95
|
+
* workspace changes — the path changes with it, so don't cache it across a
|
|
96
|
+
* workspace switch.
|
|
97
|
+
*
|
|
98
|
+
* The directory follows the workspace's **identity**, not its folder path:
|
|
99
|
+
* deleting a workspace and re-adding the same folder gives you a new, empty
|
|
100
|
+
* directory (the same rule {@link ExtensionStorageScopes.workspace} follows).
|
|
101
|
+
* Deleting a workspace leaves the directory on disk.
|
|
102
|
+
*
|
|
103
|
+
* Rejects with `NoWorkspaceError` when no workspace is open.
|
|
104
|
+
*/
|
|
105
|
+
workspaceDir(): Promise<string>;
|
|
55
106
|
}
|
|
56
107
|
//# sourceMappingURL=extension-storage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension-storage.d.ts","sourceRoot":"","sources":["../src/extension-storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,gBAAgB;IAC/B,8DAA8D;IAC9D,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;IACnC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;IACpC,kDAAkD;IAClD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACvC,gDAAgD;IAChD,IAAI,IAAI,MAAM,EAAE,CAAC;IACjB;;;;;;;;OAQG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,UAAU,CAAC;CAC7C;AAED
|
|
1
|
+
{"version":3,"file":"extension-storage.d.ts","sourceRoot":"","sources":["../src/extension-storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,gBAAgB;IAC/B,8DAA8D;IAC9D,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;IACnC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;IACpC,kDAAkD;IAClD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACvC,gDAAgD;IAChD,IAAI,IAAI,MAAM,EAAE,CAAC;IACjB;;;;;;;;OAQG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,UAAU,CAAC;CAC7C;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC;;;;OAIG;IACH,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACH,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7B;;;;;;;;;;;;;;;;;OAiBG;IACH,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACjC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -22,7 +22,7 @@ export type { EditorService, EditorSaveHandlers, OpenFileOptions, EditorViewInfo
|
|
|
22
22
|
export type { LayoutService, LayoutState, SidePanelColumnState, SideLocation, SheetOptions, } from "./layout-service.js";
|
|
23
23
|
export type { ProcessService, ProcessSession, ProcessSpawnOptions, ProcessExecOptions, ProcessExecResult, } from "./process-service.js";
|
|
24
24
|
export type { ProcessesService, ProcessInfo, ProcessStats, ProcessTreeNode, } from "./processes-service.js";
|
|
25
|
-
export type { AgentsService, AgentInfo, AgentActivity } from "./agents-service.js";
|
|
25
|
+
export type { AgentsService, AgentInfo, AgentActivity, AgentIcon, AgentIconMode, CatalogAgentSummary, } from "./agents-service.js";
|
|
26
26
|
export type { TerminalService, CreateTerminalInput, TerminalKind, TerminalRecord, TerminalTabDecoration, TerminalTabDecorationProvider, OscEvent, } from "./terminal-service.js";
|
|
27
27
|
export type { TabAdornmentColor, TabIconAdornment, TabHighlightAdornment, TabIndicatorAdornment, TabIndicatorFlash, TabActivityAdornment, TabActivityFlash, TabIconContribution, TabHighlightContribution, TabIndicatorContribution, TabActivityContribution, TabIconBinder, TabHighlightBinder, TabIndicatorBinder, TabActivityBinder, TabAdornmentMethods, } from "./tab-adornment.js";
|
|
28
28
|
export type { Activity, ActivitySize } from "./activity.js";
|
|
@@ -33,7 +33,7 @@ export type { ToolbarSurface, ToolbarItemContext, ToolbarItemFields, ToolbarComm
|
|
|
33
33
|
export type { FileService, FileMeta, FileChangeKind, FileChangeEvent, } from "./file-service.js";
|
|
34
34
|
export type { SearchService, SearchOptions, SearchMatch, SearchFileResult, SearchResponse, } from "./search-service.js";
|
|
35
35
|
export type { Permission } from "./permissions.js";
|
|
36
|
-
export { PathDeniedError } from "./permissions.js";
|
|
36
|
+
export { PathDeniedError, NoWorkspaceError } from "./permissions.js";
|
|
37
37
|
export type { ThemeService, ThemeState, ThemePreset, ResolvedTheme, ThemeBase, ThemeVars, CustomTheme, ThemeExport, } from "./theme-service.js";
|
|
38
38
|
export type { ExtensionStorage, ExtensionStorageScopes, } from "./extension-storage.js";
|
|
39
39
|
export type { DndService, DndItem, DndMime, DragInit, DndMode, DropContext, DropTargetHandlers, } from "./dnd-service.js";
|
|
@@ -53,7 +53,7 @@ export type { ButtonVariant, ButtonSize } from "./Button.js";
|
|
|
53
53
|
export { IconButton } from "./IconButton.js";
|
|
54
54
|
export type { IconButtonSize, IconButtonVariant } from "./IconButton.js";
|
|
55
55
|
export { MenuButton } from "./MenuButton.js";
|
|
56
|
-
export type { MenuButtonSize } from "./MenuButton.js";
|
|
56
|
+
export type { MenuButtonSize, MenuButtonVariant } from "./MenuButton.js";
|
|
57
57
|
export { Input } from "./Input.js";
|
|
58
58
|
export { Textarea } from "./Textarea.js";
|
|
59
59
|
export { SearchInput } from "./SearchInput.js";
|
|
@@ -73,6 +73,7 @@ export type { ListRowProps, ListRowTruncate } from "./List.js";
|
|
|
73
73
|
export { AddRow } from "./AddRow.js";
|
|
74
74
|
export { Badge } from "./Badge.js";
|
|
75
75
|
export type { BadgeSize, BadgeTone } from "./Badge.js";
|
|
76
|
+
export { AgentIconGlyph } from "./AgentIconGlyph.js";
|
|
76
77
|
export { EmptyState } from "./EmptyState.js";
|
|
77
78
|
export type { EmptyStateTone } from "./EmptyState.js";
|
|
78
79
|
export { Callout } from "./Callout.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,YAAY,EACV,UAAU,EACV,YAAY,EACZ,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,MAAM,EACN,eAAe,EACf,QAAQ,EACR,OAAO,EACP,MAAM,EACN,oBAAoB,EACpB,WAAW,EACX,WAAW,EACX,uBAAuB,EACvB,UAAU,EACV,cAAc,EACd,SAAS,EACT,aAAa,EACb,kBAAkB,EAClB,aAAa,EACb,UAAU,EACV,YAAY,EACZ,gBAAgB,EAChB,SAAS,EACT,iBAAiB,EACjB,eAAe,GAChB,MAAM,SAAS,CAAC;AAKjB,YAAY,EACV,SAAS,EACT,UAAU,EACV,YAAY,EACZ,aAAa,GACd,MAAM,gBAAgB,CAAC;AAGxB,YAAY,EACV,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,EACrB,wBAAwB,EACxB,cAAc,EACd,sBAAsB,EACtB,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,YAAY,EACZ,WAAW,EACX,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,YAAY,EACZ,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,aAAa,EACb,WAAW,EACX,oBAAoB,EACpB,YAAY,EACZ,YAAY,GACb,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
*/
|
|
18
18
|
export { activityFromAgent } from "./activity.js";
|
|
19
19
|
export { ActivityGlyph } from "./ActivityGlyph.js";
|
|
20
|
-
export { PathDeniedError } from "./permissions.js";
|
|
20
|
+
export { PathDeniedError, NoWorkspaceError } from "./permissions.js";
|
|
21
21
|
export { DND_MIME } from "./dnd-service.js";
|
|
22
22
|
// Server-side HTTP client — bypasses CORS, readable response headers.
|
|
23
23
|
export { NetworkError } from "./network-service.js";
|
|
@@ -48,6 +48,7 @@ export { Tabs, TabPanel } from "./Tabs.js";
|
|
|
48
48
|
export { List, ListRow } from "./List.js";
|
|
49
49
|
export { AddRow } from "./AddRow.js";
|
|
50
50
|
export { Badge } from "./Badge.js";
|
|
51
|
+
export { AgentIconGlyph } from "./AgentIconGlyph.js";
|
|
51
52
|
export { EmptyState } from "./EmptyState.js";
|
|
52
53
|
export { Callout } from "./Callout.js";
|
|
53
54
|
export { Section } from "./Section.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AA6HH,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAiChD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AA6BlE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAyBzC,sEAAsE;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAkCjD,8EAA8E;AAC9E,8EAA8E;AAC9E,6DAA6D;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B,yEAAyE;AACzE,iFAAiF;AACjF,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,4EAA4E;AAC5E,qDAAqD;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,4DAA4D;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAExC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEvC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,wEAAwE;AACxE,iFAAiF;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,8EAA8E;AAC9E,4EAA4E;AAC5E,8EAA8E;AAC9E,8EAA8E;AAC9E,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAUvE,6EAA6E;AAC7E,wEAAwE;AACxE,+CAA+C;AAC/C,OAAO,EACL,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,0BAA0B,CAAC"}
|
|
@@ -6,10 +6,22 @@
|
|
|
6
6
|
*/
|
|
7
7
|
export type MenuButtonSize = "normal" | "sm";
|
|
8
8
|
/**
|
|
9
|
-
*
|
|
10
|
-
* `
|
|
9
|
+
* {@link MenuButton} chrome:
|
|
10
|
+
* - `"bare"` (default) — a borderless label + chevron, for toolbars and list
|
|
11
|
+
* rows where the trigger sits among other inline controls.
|
|
12
|
+
* - `"field"` — input chrome (border, input background, full width, chevron
|
|
13
|
+
* pushed to the trailing edge) so it lines up with `Input` / `Select` as a
|
|
14
|
+
* form field. Reach for it when the menu is a value picker in a form.
|
|
11
15
|
*
|
|
12
16
|
* @internal
|
|
13
17
|
*/
|
|
14
|
-
export
|
|
18
|
+
export type MenuButtonVariant = "bare" | "field";
|
|
19
|
+
/**
|
|
20
|
+
* Resolve the host `.silo-menu-button*` class string for a MenuButton's `size`
|
|
21
|
+
* and `variant`. `sm` and `field` each compose onto the base class, matching
|
|
22
|
+
* how `.silo-button-sm` / `.silo-button-primary` work.
|
|
23
|
+
*
|
|
24
|
+
* @internal
|
|
25
|
+
*/
|
|
26
|
+
export declare function menuButtonClass(size?: MenuButtonSize, variant?: MenuButtonVariant): string;
|
|
15
27
|
//# sourceMappingURL=menu-button-classes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu-button-classes.d.ts","sourceRoot":"","sources":["../src/menu-button-classes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,IAAI,CAAC;AAE7C
|
|
1
|
+
{"version":3,"file":"menu-button-classes.d.ts","sourceRoot":"","sources":["../src/menu-button-classes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,IAAI,CAAC;AAE7C;;;;;;;;;GASG;AACH,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,OAAO,CAAC;AAEjD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,IAAI,GAAE,cAAyB,EAC/B,OAAO,GAAE,iBAA0B,GAClC,MAAM,CAKR"}
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Resolve the host `.silo-menu-button*` class string for a MenuButton's `size
|
|
3
|
-
* `sm`
|
|
2
|
+
* Resolve the host `.silo-menu-button*` class string for a MenuButton's `size`
|
|
3
|
+
* and `variant`. `sm` and `field` each compose onto the base class, matching
|
|
4
|
+
* how `.silo-button-sm` / `.silo-button-primary` work.
|
|
4
5
|
*
|
|
5
6
|
* @internal
|
|
6
7
|
*/
|
|
7
|
-
export function menuButtonClass(size = "normal") {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
export function menuButtonClass(size = "normal", variant = "bare") {
|
|
9
|
+
const classes = ["silo-menu-button"];
|
|
10
|
+
if (size === "sm")
|
|
11
|
+
classes.push("silo-menu-button-sm");
|
|
12
|
+
if (variant === "field")
|
|
13
|
+
classes.push("silo-menu-button-field");
|
|
14
|
+
return classes.join(" ");
|
|
11
15
|
}
|
|
12
16
|
//# sourceMappingURL=menu-button-classes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu-button-classes.js","sourceRoot":"","sources":["../src/menu-button-classes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"menu-button-classes.js","sourceRoot":"","sources":["../src/menu-button-classes.ts"],"names":[],"mappings":"AAoBA;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAuB,QAAQ,EAC/B,UAA6B,MAAM;IAEnC,MAAM,OAAO,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACrC,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACvD,IAAI,OAAO,KAAK,OAAO;QAAE,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAChE,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC"}
|
package/dist/permissions.d.ts
CHANGED
|
@@ -43,4 +43,28 @@ export declare class PathDeniedError extends Error {
|
|
|
43
43
|
readonly path: string;
|
|
44
44
|
constructor(path: string, message?: string);
|
|
45
45
|
}
|
|
46
|
+
/**
|
|
47
|
+
* Thrown when an API that needs the **active workspace** is called while no
|
|
48
|
+
* workspace is open — today, {@link ExtensionStorageScopes.workspaceDir}.
|
|
49
|
+
*
|
|
50
|
+
* It is deliberately not a {@link PathDeniedError}: nothing was denied, there
|
|
51
|
+
* is simply nothing to scope to yet. Catch it to fall back to
|
|
52
|
+
* {@link ExtensionStorageScopes.globalDir | globalDir} or to defer the work
|
|
53
|
+
* until a workspace opens:
|
|
54
|
+
*
|
|
55
|
+
* ```ts
|
|
56
|
+
* try {
|
|
57
|
+
* const dir = await ctx.storage.workspaceDir();
|
|
58
|
+
* } catch (err) {
|
|
59
|
+
* if (err instanceof NoWorkspaceError) return; // nothing to persist yet
|
|
60
|
+
* throw err;
|
|
61
|
+
* }
|
|
62
|
+
* ```
|
|
63
|
+
*
|
|
64
|
+
* @category Core Types
|
|
65
|
+
* @public
|
|
66
|
+
*/
|
|
67
|
+
export declare class NoWorkspaceError extends Error {
|
|
68
|
+
constructor(message?: string);
|
|
69
|
+
}
|
|
46
70
|
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,MAAM,UAAU,GAClB,SAAS,GACT,UAAU,GACV,SAAS,GACT,SAAS,GACT,SAAS,CAAC;AAEd;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IACxC,8DAA8D;IAC9D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;CAS3C"}
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,MAAM,UAAU,GAClB,SAAS,GACT,UAAU,GACV,SAAS,GACT,SAAS,GACT,SAAS,CAAC;AAEd;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IACxC,8DAA8D;IAC9D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;CAS3C;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,CAAC,EAAE,MAAM;CAO7B"}
|
package/dist/permissions.js
CHANGED
|
@@ -37,4 +37,34 @@ export class PathDeniedError extends Error {
|
|
|
37
37
|
Object.setPrototypeOf(this, PathDeniedError.prototype);
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* Thrown when an API that needs the **active workspace** is called while no
|
|
42
|
+
* workspace is open — today, {@link ExtensionStorageScopes.workspaceDir}.
|
|
43
|
+
*
|
|
44
|
+
* It is deliberately not a {@link PathDeniedError}: nothing was denied, there
|
|
45
|
+
* is simply nothing to scope to yet. Catch it to fall back to
|
|
46
|
+
* {@link ExtensionStorageScopes.globalDir | globalDir} or to defer the work
|
|
47
|
+
* until a workspace opens:
|
|
48
|
+
*
|
|
49
|
+
* ```ts
|
|
50
|
+
* try {
|
|
51
|
+
* const dir = await ctx.storage.workspaceDir();
|
|
52
|
+
* } catch (err) {
|
|
53
|
+
* if (err instanceof NoWorkspaceError) return; // nothing to persist yet
|
|
54
|
+
* throw err;
|
|
55
|
+
* }
|
|
56
|
+
* ```
|
|
57
|
+
*
|
|
58
|
+
* @category Core Types
|
|
59
|
+
* @public
|
|
60
|
+
*/
|
|
61
|
+
export class NoWorkspaceError extends Error {
|
|
62
|
+
constructor(message) {
|
|
63
|
+
super(message ?? "No workspace is open");
|
|
64
|
+
this.name = "NoWorkspaceError";
|
|
65
|
+
// Same prototype-chain restoration as PathDeniedError — `instanceof` has to
|
|
66
|
+
// survive the down-leveled build and the host↔extension boundary.
|
|
67
|
+
Object.setPrototypeOf(this, NoWorkspaceError.prototype);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
40
70
|
//# sourceMappingURL=permissions.js.map
|
package/dist/permissions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,6EAA6E;AAC7E,8EAA8E;AAC9E,qEAAqE;AA+BrE;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAIxC,YAAY,IAAY,EAAE,OAAgB;QACxC,KAAK,CAAC,OAAO,IAAI,kCAAkC,IAAI,EAAE,CAAC,CAAC;QAJ7D,8DAA8D;QACrD;;;;;WAAa;QAIpB,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,4EAA4E;QAC5E,4EAA4E;QAC5E,yCAAyC;QACzC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,6EAA6E;AAC7E,8EAA8E;AAC9E,qEAAqE;AA+BrE;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAIxC,YAAY,IAAY,EAAE,OAAgB;QACxC,KAAK,CAAC,OAAO,IAAI,kCAAkC,IAAI,EAAE,CAAC,CAAC;QAJ7D,8DAA8D;QACrD;;;;;WAAa;QAIpB,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,4EAA4E;QAC5E,4EAA4E;QAC5E,yCAAyC;QACzC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC,YAAY,OAAgB;QAC1B,KAAK,CAAC,OAAO,IAAI,sBAAsB,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,4EAA4E;QAC5E,kEAAkE;QAClE,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC1D,CAAC;CACF"}
|
|
@@ -54,7 +54,14 @@ export interface TerminalTabDecorationProvider {
|
|
|
54
54
|
* @public
|
|
55
55
|
*/
|
|
56
56
|
export interface CreateTerminalInput {
|
|
57
|
-
/**
|
|
57
|
+
/**
|
|
58
|
+
* Terminal kind. Defaults to `"shell"`.
|
|
59
|
+
*
|
|
60
|
+
* @deprecated Pass `"shell"` (or omit). The `"claude"` / `"pi"` values are
|
|
61
|
+
* kept for compatibility (RFC 0033): they create a `"shell"` terminal and, if
|
|
62
|
+
* a matching Agent Profile exists, launch it — otherwise the bare command is
|
|
63
|
+
* typed. Start agents via an Agent Profile instead.
|
|
64
|
+
*/
|
|
58
65
|
kind?: TerminalKind;
|
|
59
66
|
/** Working directory; falls back to the workspace folder when absent. */
|
|
60
67
|
cwd?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-service.d.ts","sourceRoot":"","sources":["../src/terminal-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,KAAK,EACV,mBAAmB,EACnB,wBAAwB,EACzB,MAAM,iBAAiB,CAAC;AAEzB;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,QAAQ;IACvB,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,OAAO,EAAE,MAAM,CAAC;CACjB;AAGD,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEnE;;;;;;;GAOG;AACH,MAAM,MAAM,qBAAqB,GAAG,wBAAwB,CAAC;AAE7D;;;;;;GAMG;AACH,MAAM,WAAW,6BAA6B;IAC5C,oEAAoE;IACpE,EAAE,EAAE,MAAM,CAAC;IACX;;;OAGG;IACH,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,qBAAqB,GAAG,IAAI,CAAC;CAC3D;AAED;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC
|
|
1
|
+
{"version":3,"file":"terminal-service.d.ts","sourceRoot":"","sources":["../src/terminal-service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { AgentIcon, AgentIconMode } from "./agents-service";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Renders a Catalog Agent's brand mark from its {@link AgentIcon} data (get one
|
|
5
|
+
* from {@link AgentsService.catalog}). Data-driven on purpose — it takes the
|
|
6
|
+
* icon, not an agent id, so it has no dependency on the sealed catalog and one
|
|
7
|
+
* renderer serves the host `+` menu, `silo.agents`, and third-party extensions.
|
|
8
|
+
*
|
|
9
|
+
* Returns `null` when `mode` is `"none"` or `icon` is absent — callers that
|
|
10
|
+
* gate tab chrome on "is there an icon" should check the return value, not
|
|
11
|
+
* construct the element unconditionally.
|
|
12
|
+
*
|
|
13
|
+
* `"color"` tints the glyph with the brand's own hex (picking
|
|
14
|
+
* {@link AgentIcon.hexLight} / {@link AgentIcon.hexDark} by `colorScheme`, since
|
|
15
|
+
* one hex can't contrast against both a light and a dark tab strip);
|
|
16
|
+
* `"monotone"` leaves `color` unset so it inherits `currentColor` from an
|
|
17
|
+
* ancestor. A duotone source (OpenCode's frame + panel) layers a second
|
|
18
|
+
* 40%-opacity path rather than flattening to one fill.
|
|
19
|
+
*
|
|
20
|
+
* @category Consumer Services
|
|
21
|
+
* @public
|
|
22
|
+
*/
|
|
23
|
+
export function AgentIconGlyph({
|
|
24
|
+
icon,
|
|
25
|
+
mode,
|
|
26
|
+
colorScheme,
|
|
27
|
+
className,
|
|
28
|
+
}: {
|
|
29
|
+
icon: AgentIcon | undefined;
|
|
30
|
+
mode: AgentIconMode;
|
|
31
|
+
/** The host's active light/dark base — selects `hexLight` / `hexDark` in
|
|
32
|
+
* `"color"` mode. */
|
|
33
|
+
colorScheme: "dark" | "light";
|
|
34
|
+
className?: string;
|
|
35
|
+
}) {
|
|
36
|
+
if (mode === "none" || !icon) return null;
|
|
37
|
+
const hex = colorScheme === "light" ? icon.hexLight : icon.hexDark;
|
|
38
|
+
return (
|
|
39
|
+
<svg
|
|
40
|
+
viewBox="0 0 24 24"
|
|
41
|
+
className={className}
|
|
42
|
+
style={mode === "color" ? { color: `#${hex}` } : undefined}
|
|
43
|
+
aria-hidden="true"
|
|
44
|
+
>
|
|
45
|
+
<path d={icon.path} fill="currentColor" fillRule={icon.fillRule} />
|
|
46
|
+
{icon.accentPath && (
|
|
47
|
+
<path
|
|
48
|
+
d={icon.accentPath}
|
|
49
|
+
fill="currentColor"
|
|
50
|
+
fillRule={icon.accentFillRule}
|
|
51
|
+
opacity={0.4}
|
|
52
|
+
/>
|
|
53
|
+
)}
|
|
54
|
+
</svg>
|
|
55
|
+
);
|
|
56
|
+
}
|
package/src/MenuButton.tsx
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import type { ButtonHTMLAttributes, ReactNode } from "react";
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
menuButtonClass,
|
|
4
|
+
type MenuButtonSize,
|
|
5
|
+
type MenuButtonVariant,
|
|
6
|
+
} from "./menu-button-classes";
|
|
3
7
|
|
|
4
|
-
export type { MenuButtonSize };
|
|
8
|
+
export type { MenuButtonSize, MenuButtonVariant };
|
|
5
9
|
|
|
6
10
|
/**
|
|
7
11
|
* A **labelled** button that opens a menu — the counterpart to
|
|
@@ -19,7 +23,9 @@ export type { MenuButtonSize };
|
|
|
19
23
|
* lines up under the button.
|
|
20
24
|
*
|
|
21
25
|
* Styled purely via host-provided `.silo-menu-button*` classes — no stylesheet
|
|
22
|
-
* import is needed in the extension.
|
|
26
|
+
* import is needed in the extension. `variant="field"` gives it `Input` /
|
|
27
|
+
* `Select` chrome (border, full width, trailing chevron) for use as a value
|
|
28
|
+
* picker in a form, where a rich menu (icons, checks) beats a native `<select>`.
|
|
23
29
|
*
|
|
24
30
|
* @example
|
|
25
31
|
* ```tsx
|
|
@@ -38,6 +44,15 @@ export type { MenuButtonSize };
|
|
|
38
44
|
*
|
|
39
45
|
* // compact — e.g. in a card footer or a ListRow's trailing slot
|
|
40
46
|
* <MenuButton size="sm" label="More" onClick={openMenu} />
|
|
47
|
+
*
|
|
48
|
+
* // as a form field — a value picker inside a `Section`
|
|
49
|
+
* <MenuButton
|
|
50
|
+
* variant="field"
|
|
51
|
+
* label={agent?.displayName ?? "Auto-detect"}
|
|
52
|
+
* onClick={(e) => ctx.ui.showMenu({ anchor: e.currentTarget, items })}
|
|
53
|
+
* >
|
|
54
|
+
* <AgentIconGlyph icon={agent?.icon} mode="color" colorScheme={scheme} />
|
|
55
|
+
* </MenuButton>
|
|
41
56
|
* ```
|
|
42
57
|
*
|
|
43
58
|
* @category Consumer Services
|
|
@@ -46,6 +61,7 @@ export type { MenuButtonSize };
|
|
|
46
61
|
export function MenuButton({
|
|
47
62
|
label,
|
|
48
63
|
size = "normal",
|
|
64
|
+
variant = "bare",
|
|
49
65
|
className,
|
|
50
66
|
type = "button",
|
|
51
67
|
children,
|
|
@@ -55,10 +71,15 @@ export function MenuButton({
|
|
|
55
71
|
label: ReactNode;
|
|
56
72
|
/** `sm` for compact contexts (card footers, list rows). */
|
|
57
73
|
size?: MenuButtonSize;
|
|
74
|
+
/**
|
|
75
|
+
* `"bare"` (default) is a borderless label + chevron for toolbars and rows;
|
|
76
|
+
* `"field"` wears `Input` / `Select` chrome so it lines up as a form field.
|
|
77
|
+
*/
|
|
78
|
+
variant?: MenuButtonVariant;
|
|
58
79
|
/** Optional leading content, e.g. an icon before the label. */
|
|
59
80
|
children?: ReactNode;
|
|
60
81
|
} & Omit<ButtonHTMLAttributes<HTMLButtonElement>, "children">) {
|
|
61
|
-
const classes = menuButtonClass(size);
|
|
82
|
+
const classes = menuButtonClass(size, variant);
|
|
62
83
|
return (
|
|
63
84
|
<button
|
|
64
85
|
type={type}
|
package/src/agents-service.ts
CHANGED
|
@@ -44,7 +44,15 @@ export interface AgentInfo {
|
|
|
44
44
|
readonly terminalId: string;
|
|
45
45
|
/** The workspace this terminal belongs to. */
|
|
46
46
|
readonly workspaceId: string;
|
|
47
|
-
/**
|
|
47
|
+
/**
|
|
48
|
+
* The terminal's kind at registration time.
|
|
49
|
+
*
|
|
50
|
+
* @deprecated Always `"shell"` after RFC 0033 — the deprecated `"claude"` /
|
|
51
|
+
* `"pi"` kinds are normalized away at load and nothing creates them, so a
|
|
52
|
+
* consumer branching on this is reading a constant. Use
|
|
53
|
+
* {@link AgentInfo.agentId} for which agent is running, and
|
|
54
|
+
* {@link AgentInfo.isAgent} for whether one is.
|
|
55
|
+
*/
|
|
48
56
|
readonly kind: TerminalKind;
|
|
49
57
|
/**
|
|
50
58
|
* Whether this terminal currently hosts an agent — true if it was created
|
|
@@ -113,6 +121,57 @@ export interface AgentInfo {
|
|
|
113
121
|
readonly agentId?: string;
|
|
114
122
|
}
|
|
115
123
|
|
|
124
|
+
/**
|
|
125
|
+
* A Catalog Agent's brand mark — SVG path data plus the two theme-dependent
|
|
126
|
+
* hexes. Consumed by {@link AgentIconGlyph}; a single hex cannot have enough
|
|
127
|
+
* contrast against both a light and a dark tab strip, so `"color"` mode picks
|
|
128
|
+
* `hexLight` / `hexDark` by the host's active base.
|
|
129
|
+
*
|
|
130
|
+
* @category Consumer Services
|
|
131
|
+
* @public
|
|
132
|
+
*/
|
|
133
|
+
export interface AgentIcon {
|
|
134
|
+
/** Display name, for the glyph's accessible label. */
|
|
135
|
+
title: string;
|
|
136
|
+
/** The brand's color against a light background, no leading `#`. */
|
|
137
|
+
hexLight: string;
|
|
138
|
+
/** The brand's color against a dark background, no leading `#`. */
|
|
139
|
+
hexDark: string;
|
|
140
|
+
/** SVG path data, `viewBox="0 0 24 24"`. */
|
|
141
|
+
path: string;
|
|
142
|
+
/** Set when the source path assumes `fill-rule: evenodd`; omit for the SVG
|
|
143
|
+
* default (`nonzero`). */
|
|
144
|
+
fillRule?: "evenodd";
|
|
145
|
+
/** A second path (same viewBox) layered on {@link AgentIcon.path} at 40%
|
|
146
|
+
* opacity, for a genuinely duotone mark (OpenCode's frame + inner panel). */
|
|
147
|
+
accentPath?: string;
|
|
148
|
+
/** `fill-rule` for {@link AgentIcon.accentPath}, independent of `fillRule`. */
|
|
149
|
+
accentFillRule?: "evenodd";
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* How {@link AgentIconGlyph} renders: `"none"` draws nothing, `"color"` tints
|
|
154
|
+
* with the brand hex, `"monotone"` inherits `currentColor`.
|
|
155
|
+
*
|
|
156
|
+
* @category Consumer Services
|
|
157
|
+
* @public
|
|
158
|
+
*/
|
|
159
|
+
export type AgentIconMode = "none" | "color" | "monotone";
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* One Catalog Agent as an extension may read it through
|
|
163
|
+
* {@link AgentsService.catalog}. Read-only — detection stays sealed (ADR 0028)
|
|
164
|
+
* and there is no way to register into the catalog.
|
|
165
|
+
*
|
|
166
|
+
* @category Consumer Services
|
|
167
|
+
* @public
|
|
168
|
+
*/
|
|
169
|
+
export interface CatalogAgentSummary {
|
|
170
|
+
readonly id: string;
|
|
171
|
+
readonly displayName: string;
|
|
172
|
+
readonly icon?: AgentIcon;
|
|
173
|
+
}
|
|
174
|
+
|
|
116
175
|
/**
|
|
117
176
|
* Host-computed coding-agent observability — exposed as
|
|
118
177
|
* {@link ExtensionContext.agents}. Detection (what OSC/output signals mean
|
|
@@ -178,4 +237,17 @@ export interface AgentsService {
|
|
|
178
237
|
* ```
|
|
179
238
|
*/
|
|
180
239
|
acknowledge(terminalId: string): void;
|
|
240
|
+
/**
|
|
241
|
+
* Every coding agent Silo knows about, as read-only
|
|
242
|
+
* {@link CatalogAgentSummary} records. Detection stays sealed (ADR 0028) —
|
|
243
|
+
* there is no way to register into this list.
|
|
244
|
+
*
|
|
245
|
+
* The returned array is **memoized and deeply frozen**: it is read inside
|
|
246
|
+
* tab-icon rendering (`ctx.terminals.bindIcon`), so a fresh allocation per
|
|
247
|
+
* call would be a per-render cost and a mutable one a correctness hazard.
|
|
248
|
+
*
|
|
249
|
+
* @category Consumer Services
|
|
250
|
+
* @public
|
|
251
|
+
*/
|
|
252
|
+
catalog(): readonly CatalogAgentSummary[];
|
|
181
253
|
}
|
package/src/domain-types.ts
CHANGED
|
@@ -11,6 +11,17 @@
|
|
|
11
11
|
/**
|
|
12
12
|
* The kind of a terminal session.
|
|
13
13
|
*
|
|
14
|
+
* @remarks
|
|
15
|
+
* The `"claude"` and `"pi"` values are **deprecated** (RFC 0033). Nothing in
|
|
16
|
+
* Silo creates a terminal with those kinds any more, and a persisted record
|
|
17
|
+
* carrying one is normalized to `"shell"` at load. Use an **Agent Profile** to
|
|
18
|
+
* start an agent in a terminal — it is the launch-time vocabulary for "which
|
|
19
|
+
* agent"; `TerminalKind` is neither the launch nor the identity vocabulary.
|
|
20
|
+
* `ctx.terminals.create({ kind: "claude" | "pi" })` still works (it creates a
|
|
21
|
+
* `"shell"` terminal and launches a matching profile if one exists), and the
|
|
22
|
+
* type keeps both values so third-party code compiles — removal is gated on a
|
|
23
|
+
* later engine bump.
|
|
24
|
+
*
|
|
14
25
|
* @category Core Types
|
|
15
26
|
* @public
|
|
16
27
|
*/
|
|
@@ -50,6 +61,20 @@ export interface TerminalRecord {
|
|
|
50
61
|
cwd?: string;
|
|
51
62
|
/** ISO timestamp of the last output we observed; used to pick a workspace's "primary" terminal. */
|
|
52
63
|
lastActiveAt?: string;
|
|
64
|
+
/**
|
|
65
|
+
* The id of the Agent Profile this terminal was launched from (RFC 0033),
|
|
66
|
+
* when Silo launched it with one. A terminal created any other way — "New
|
|
67
|
+
* Terminal", the watermark, `core.newTerminal`, `ctx.terminals.create` — has
|
|
68
|
+
* no `profileId`; Silo never guesses one for a hand-typed agent.
|
|
69
|
+
*
|
|
70
|
+
* Written at launch and maintained by the host: renaming a profile's id
|
|
71
|
+
* rewrites this, deleting the profile clears it. It is written and kept
|
|
72
|
+
* current in phase 1 but not yet read — its first consumer is resume
|
|
73
|
+
* composition (RFC 0033 phase 4).
|
|
74
|
+
*
|
|
75
|
+
* @public
|
|
76
|
+
*/
|
|
77
|
+
profileId?: string;
|
|
53
78
|
}
|
|
54
79
|
|
|
55
80
|
/**
|
package/src/extension-storage.ts
CHANGED
|
@@ -36,8 +36,9 @@ export interface ExtensionStorage {
|
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
/**
|
|
39
|
-
* The
|
|
40
|
-
* {@link ExtensionContext.storage}
|
|
39
|
+
* The persisted-storage scopes available to an extension, exposed as
|
|
40
|
+
* {@link ExtensionContext.storage}: two key/value bags for settings-sized
|
|
41
|
+
* state, and the two matching **directories** for real data files.
|
|
41
42
|
*
|
|
42
43
|
* @category Consumer Services
|
|
43
44
|
* @public
|
|
@@ -54,4 +55,54 @@ export interface ExtensionStorageScopes {
|
|
|
54
55
|
* toggles). The bag is swapped when the active workspace changes.
|
|
55
56
|
*/
|
|
56
57
|
readonly workspace: ExtensionStorage;
|
|
58
|
+
/**
|
|
59
|
+
* An absolute path to a **directory of your own**, shared across every
|
|
60
|
+
* workspace — the filesystem counterpart to {@link ExtensionStorageScopes.global}.
|
|
61
|
+
* Use it for real data files (a `.jsonl` log, a cache, an export) rather than
|
|
62
|
+
* inventing a path under the user's home directory.
|
|
63
|
+
*
|
|
64
|
+
* The directory is created on first call and lives under Silo's user-config
|
|
65
|
+
* root, namespaced by your extension id:
|
|
66
|
+
* `~/.config/silo/extension-storage/<your-id>/global`. The path is stable
|
|
67
|
+
* across calls, activations, and restarts.
|
|
68
|
+
*
|
|
69
|
+
* **No filesystem permission is needed inside it.** Paths beneath this
|
|
70
|
+
* directory are readable and writable through {@link ExtensionContext.files}
|
|
71
|
+
* without declaring `fs:read` or `fs:write` — your own storage is inside your
|
|
72
|
+
* sandbox, the same way the open workspace folder is. The lift stops at
|
|
73
|
+
* `ctx.files`: running a process with a working directory in here still needs
|
|
74
|
+
* the `process` permission (passing the path to a command as an *argument*
|
|
75
|
+
* needs nothing extra).
|
|
76
|
+
*
|
|
77
|
+
* Relative paths passed to `ctx.files` still resolve against the **workspace**,
|
|
78
|
+
* not this directory — always join onto the absolute path you get back.
|
|
79
|
+
*
|
|
80
|
+
* ```ts
|
|
81
|
+
* const dir = await ctx.storage.globalDir();
|
|
82
|
+
* await ctx.files.writeText(`${dir}/tasks.jsonl`, body);
|
|
83
|
+
* ```
|
|
84
|
+
*
|
|
85
|
+
* Uninstalling your extension does **not** delete this directory unless the
|
|
86
|
+
* user opts in; the data survives a reinstall.
|
|
87
|
+
*/
|
|
88
|
+
globalDir(): Promise<string>;
|
|
89
|
+
/**
|
|
90
|
+
* An absolute path to a directory of your own scoped to the **active
|
|
91
|
+
* workspace** — the filesystem counterpart to
|
|
92
|
+
* {@link ExtensionStorageScopes.workspace}. Created on first call, at
|
|
93
|
+
* `~/.config/silo/extension-storage/<your-id>/workspaces/<workspaceId>`.
|
|
94
|
+
*
|
|
95
|
+
* Everything {@link ExtensionStorageScopes.globalDir} says about permissions
|
|
96
|
+
* and relative paths applies here too. Call it again after the active
|
|
97
|
+
* workspace changes — the path changes with it, so don't cache it across a
|
|
98
|
+
* workspace switch.
|
|
99
|
+
*
|
|
100
|
+
* The directory follows the workspace's **identity**, not its folder path:
|
|
101
|
+
* deleting a workspace and re-adding the same folder gives you a new, empty
|
|
102
|
+
* directory (the same rule {@link ExtensionStorageScopes.workspace} follows).
|
|
103
|
+
* Deleting a workspace leaves the directory on disk.
|
|
104
|
+
*
|
|
105
|
+
* Rejects with `NoWorkspaceError` when no workspace is open.
|
|
106
|
+
*/
|
|
107
|
+
workspaceDir(): Promise<string>;
|
|
57
108
|
}
|
package/src/index.ts
CHANGED
|
@@ -103,7 +103,14 @@ export type {
|
|
|
103
103
|
ProcessStats,
|
|
104
104
|
ProcessTreeNode,
|
|
105
105
|
} from "./processes-service";
|
|
106
|
-
export type {
|
|
106
|
+
export type {
|
|
107
|
+
AgentsService,
|
|
108
|
+
AgentInfo,
|
|
109
|
+
AgentActivity,
|
|
110
|
+
AgentIcon,
|
|
111
|
+
AgentIconMode,
|
|
112
|
+
CatalogAgentSummary,
|
|
113
|
+
} from "./agents-service";
|
|
107
114
|
export type {
|
|
108
115
|
TerminalService,
|
|
109
116
|
CreateTerminalInput,
|
|
@@ -163,9 +170,10 @@ export type {
|
|
|
163
170
|
} from "./search-service";
|
|
164
171
|
// The permission surface: the capability vocabulary an extension declares, and
|
|
165
172
|
// the error the host throws when an extension reaches outside the workspace
|
|
166
|
-
// without the matching grant. `PathDeniedError`
|
|
173
|
+
// without the matching grant. `PathDeniedError` and `NoWorkspaceError` are
|
|
174
|
+
// classes (runtime values).
|
|
167
175
|
export type { Permission } from "./permissions";
|
|
168
|
-
export { PathDeniedError } from "./permissions";
|
|
176
|
+
export { PathDeniedError, NoWorkspaceError } from "./permissions";
|
|
169
177
|
// The theme domain: the consumer service + its state/resolve shapes, the
|
|
170
178
|
// `ThemePreset` contribution type (registered via ctx.registerThemePreset), and
|
|
171
179
|
// the underlying theme types (re-exported from ./domain-types via theme-service).
|
|
@@ -270,7 +278,7 @@ export type { ButtonVariant, ButtonSize } from "./Button";
|
|
|
270
278
|
export { IconButton } from "./IconButton";
|
|
271
279
|
export type { IconButtonSize, IconButtonVariant } from "./IconButton";
|
|
272
280
|
export { MenuButton } from "./MenuButton";
|
|
273
|
-
export type { MenuButtonSize } from "./MenuButton";
|
|
281
|
+
export type { MenuButtonSize, MenuButtonVariant } from "./MenuButton";
|
|
274
282
|
export { Input } from "./Input";
|
|
275
283
|
export { Textarea } from "./Textarea";
|
|
276
284
|
export { SearchInput } from "./SearchInput";
|
|
@@ -292,6 +300,7 @@ export type { ListRowProps, ListRowTruncate } from "./List";
|
|
|
292
300
|
export { AddRow } from "./AddRow";
|
|
293
301
|
export { Badge } from "./Badge";
|
|
294
302
|
export type { BadgeSize, BadgeTone } from "./Badge";
|
|
303
|
+
export { AgentIconGlyph } from "./AgentIconGlyph";
|
|
295
304
|
export { EmptyState } from "./EmptyState";
|
|
296
305
|
export type { EmptyStateTone } from "./EmptyState";
|
|
297
306
|
export { Callout } from "./Callout";
|
|
@@ -7,9 +7,22 @@ describe("menuButtonClass", () => {
|
|
|
7
7
|
it("defaults to the base class", () => {
|
|
8
8
|
expect(menuButtonClass()).toBe("silo-menu-button");
|
|
9
9
|
expect(menuButtonClass("normal")).toBe("silo-menu-button");
|
|
10
|
+
expect(menuButtonClass("normal", "bare")).toBe("silo-menu-button");
|
|
10
11
|
});
|
|
11
12
|
|
|
12
13
|
it("composes the compact modifier onto the base, like .silo-button-sm", () => {
|
|
13
14
|
expect(menuButtonClass("sm")).toBe("silo-menu-button silo-menu-button-sm");
|
|
14
15
|
});
|
|
16
|
+
|
|
17
|
+
it("composes the field variant onto the base", () => {
|
|
18
|
+
expect(menuButtonClass("normal", "field")).toBe(
|
|
19
|
+
"silo-menu-button silo-menu-button-field",
|
|
20
|
+
);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it("composes size and variant together", () => {
|
|
24
|
+
expect(menuButtonClass("sm", "field")).toBe(
|
|
25
|
+
"silo-menu-button silo-menu-button-sm silo-menu-button-field",
|
|
26
|
+
);
|
|
27
|
+
});
|
|
15
28
|
});
|
|
@@ -7,13 +7,30 @@
|
|
|
7
7
|
export type MenuButtonSize = "normal" | "sm";
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
|
-
*
|
|
11
|
-
* `
|
|
10
|
+
* {@link MenuButton} chrome:
|
|
11
|
+
* - `"bare"` (default) — a borderless label + chevron, for toolbars and list
|
|
12
|
+
* rows where the trigger sits among other inline controls.
|
|
13
|
+
* - `"field"` — input chrome (border, input background, full width, chevron
|
|
14
|
+
* pushed to the trailing edge) so it lines up with `Input` / `Select` as a
|
|
15
|
+
* form field. Reach for it when the menu is a value picker in a form.
|
|
12
16
|
*
|
|
13
17
|
* @internal
|
|
14
18
|
*/
|
|
15
|
-
export
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
+
export type MenuButtonVariant = "bare" | "field";
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Resolve the host `.silo-menu-button*` class string for a MenuButton's `size`
|
|
23
|
+
* and `variant`. `sm` and `field` each compose onto the base class, matching
|
|
24
|
+
* how `.silo-button-sm` / `.silo-button-primary` work.
|
|
25
|
+
*
|
|
26
|
+
* @internal
|
|
27
|
+
*/
|
|
28
|
+
export function menuButtonClass(
|
|
29
|
+
size: MenuButtonSize = "normal",
|
|
30
|
+
variant: MenuButtonVariant = "bare",
|
|
31
|
+
): string {
|
|
32
|
+
const classes = ["silo-menu-button"];
|
|
33
|
+
if (size === "sm") classes.push("silo-menu-button-sm");
|
|
34
|
+
if (variant === "field") classes.push("silo-menu-button-field");
|
|
35
|
+
return classes.join(" ");
|
|
19
36
|
}
|
package/src/permissions.ts
CHANGED
|
@@ -63,3 +63,34 @@ export class PathDeniedError extends Error {
|
|
|
63
63
|
Object.setPrototypeOf(this, PathDeniedError.prototype);
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Thrown when an API that needs the **active workspace** is called while no
|
|
69
|
+
* workspace is open — today, {@link ExtensionStorageScopes.workspaceDir}.
|
|
70
|
+
*
|
|
71
|
+
* It is deliberately not a {@link PathDeniedError}: nothing was denied, there
|
|
72
|
+
* is simply nothing to scope to yet. Catch it to fall back to
|
|
73
|
+
* {@link ExtensionStorageScopes.globalDir | globalDir} or to defer the work
|
|
74
|
+
* until a workspace opens:
|
|
75
|
+
*
|
|
76
|
+
* ```ts
|
|
77
|
+
* try {
|
|
78
|
+
* const dir = await ctx.storage.workspaceDir();
|
|
79
|
+
* } catch (err) {
|
|
80
|
+
* if (err instanceof NoWorkspaceError) return; // nothing to persist yet
|
|
81
|
+
* throw err;
|
|
82
|
+
* }
|
|
83
|
+
* ```
|
|
84
|
+
*
|
|
85
|
+
* @category Core Types
|
|
86
|
+
* @public
|
|
87
|
+
*/
|
|
88
|
+
export class NoWorkspaceError extends Error {
|
|
89
|
+
constructor(message?: string) {
|
|
90
|
+
super(message ?? "No workspace is open");
|
|
91
|
+
this.name = "NoWorkspaceError";
|
|
92
|
+
// Same prototype-chain restoration as PathDeniedError — `instanceof` has to
|
|
93
|
+
// survive the down-leveled build and the host↔extension boundary.
|
|
94
|
+
Object.setPrototypeOf(this, NoWorkspaceError.prototype);
|
|
95
|
+
}
|
|
96
|
+
}
|
package/src/terminal-service.ts
CHANGED
|
@@ -63,7 +63,14 @@ export interface TerminalTabDecorationProvider {
|
|
|
63
63
|
* @public
|
|
64
64
|
*/
|
|
65
65
|
export interface CreateTerminalInput {
|
|
66
|
-
/**
|
|
66
|
+
/**
|
|
67
|
+
* Terminal kind. Defaults to `"shell"`.
|
|
68
|
+
*
|
|
69
|
+
* @deprecated Pass `"shell"` (or omit). The `"claude"` / `"pi"` values are
|
|
70
|
+
* kept for compatibility (RFC 0033): they create a `"shell"` terminal and, if
|
|
71
|
+
* a matching Agent Profile exists, launch it — otherwise the bare command is
|
|
72
|
+
* typed. Start agents via an Agent Profile instead.
|
|
73
|
+
*/
|
|
67
74
|
kind?: TerminalKind;
|
|
68
75
|
/** Working directory; falls back to the workspace folder when absent. */
|
|
69
76
|
cwd?: string;
|