@intentic/extension-manifest 1.224.0 → 1.225.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 (60) hide show
  1. package/README.md +16 -16
  2. package/dist/bundle.js +2 -2
  3. package/dist/bundle.js.map +1 -1
  4. package/dist/manifest.js +5 -5
  5. package/dist/manifest.js.map +1 -1
  6. package/dist/mark.js +3 -3
  7. package/dist/mark.js.map +1 -1
  8. package/dist/permissions.js +1 -1
  9. package/dist/permissions.js.map +1 -1
  10. package/dist/points/automation-templates.d.ts +1 -1
  11. package/dist/points/automation-templates.d.ts.map +1 -1
  12. package/dist/points/automation-templates.js +6 -6
  13. package/dist/points/automation-templates.js.map +1 -1
  14. package/dist/points/bin.d.ts +1 -1
  15. package/dist/points/bin.d.ts.map +1 -1
  16. package/dist/points/bin.js +1 -1
  17. package/dist/points/bin.js.map +1 -1
  18. package/dist/points/capabilities.d.ts +1 -1
  19. package/dist/points/capabilities.d.ts.map +1 -1
  20. package/dist/points/capabilities.js +13 -13
  21. package/dist/points/capabilities.js.map +1 -1
  22. package/dist/points/commands.js +1 -1
  23. package/dist/points/commands.js.map +1 -1
  24. package/dist/points/environment.d.ts +1 -1
  25. package/dist/points/environment.d.ts.map +1 -1
  26. package/dist/points/environment.js +2 -2
  27. package/dist/points/environment.js.map +1 -1
  28. package/dist/points/files.js +2 -2
  29. package/dist/points/files.js.map +1 -1
  30. package/dist/points/index.d.ts +7 -7
  31. package/dist/points/listener.d.ts +1 -1
  32. package/dist/points/listener.d.ts.map +1 -1
  33. package/dist/points/listener.js +3 -3
  34. package/dist/points/listener.js.map +1 -1
  35. package/dist/points/processes.d.ts +1 -1
  36. package/dist/points/processes.d.ts.map +1 -1
  37. package/dist/points/processes.js +1 -1
  38. package/dist/points/processes.js.map +1 -1
  39. package/dist/points/settings.js +1 -1
  40. package/dist/points/settings.js.map +1 -1
  41. package/dist/points/viewers.d.ts +1 -1
  42. package/dist/points/viewers.d.ts.map +1 -1
  43. package/dist/points/viewers.js +3 -3
  44. package/dist/points/viewers.js.map +1 -1
  45. package/intentic-extension.schema.json +73 -73
  46. package/package.json +3 -3
  47. package/src/bundle.ts +2 -2
  48. package/src/manifest.ts +5 -5
  49. package/src/mark.ts +3 -3
  50. package/src/permissions.ts +1 -1
  51. package/src/points/automation-templates.ts +6 -6
  52. package/src/points/bin.ts +1 -1
  53. package/src/points/capabilities.ts +13 -13
  54. package/src/points/commands.ts +1 -1
  55. package/src/points/environment.ts +2 -2
  56. package/src/points/files.ts +2 -2
  57. package/src/points/listener.ts +3 -3
  58. package/src/points/processes.ts +1 -1
  59. package/src/points/settings.ts +1 -1
  60. package/src/points/viewers.ts +3 -3
package/src/bundle.ts CHANGED
@@ -30,12 +30,12 @@ export const bundleProblem = (source: string): string | undefined => {
30
30
  const specifiers = bundleSpecifiers(source);
31
31
  const relative = specifiers.filter((specifier) => specifier.startsWith(".") || specifier.startsWith("/"));
32
32
  if (relative.length > 0) {
33
- return `imports a second file (${relative.join(", ")}) — a bundle is imported from a blob URL, so nothing relative to it can resolve`;
33
+ return `imports a second file (${relative.join(", ")}): a bundle is imported from a blob URL, so nothing relative to it can resolve`;
34
34
  }
35
35
  const published = new Set<string>(HOST_PUBLISHED_SPECIFIERS);
36
36
  const unpublished = specifiers.filter((specifier) => !published.has(specifier));
37
37
  if (unpublished.length > 0) {
38
- return `imports ${unpublished.join(", ")}, which the host does not publish — bundle it in, or use one of: ${HOST_PUBLISHED_SPECIFIERS.join(", ")}`;
38
+ return `imports ${unpublished.join(", ")}, which the host does not publish, bundle it in, or use one of: ${HOST_PUBLISHED_SPECIFIERS.join(", ")}`;
39
39
  }
40
40
  return undefined;
41
41
  };
package/src/manifest.ts CHANGED
@@ -20,7 +20,7 @@ export const ExtensionManifestSchema = z.object({
20
20
  publisher: z.string().regex(/^[a-z0-9][a-z0-9-]*$/),
21
21
  name: z.string().regex(/^[a-z0-9][a-z0-9-]*$/),
22
22
  // The extension's own semver, display/identity only; the installed code identity is the pinned commit sha.
23
- version: z.string().min(1).describe("Your own semver — display and identity only. The installed code's identity is the pinned commit sha."),
23
+ version: z.string().min(1).describe("Your own semver, display and identity only. The installed code's identity is the pinned commit sha."),
24
24
  /* The section this extension sits under in the Sandbox hub's Extensions tab, a grouping by what it is FOR,
25
25
  * declared because it cannot be derived. Nine of the first-party extensions contribute a rail tile, so a
26
26
  * grouping read off `contributes` puts more than half the list in one section and says nothing about any of
@@ -32,7 +32,7 @@ export const ExtensionManifestSchema = z.object({
32
32
  .min(1)
33
33
  .optional()
34
34
  .describe(
35
- "Which section of the Extensions tab this sits under — a grouping by what it is FOR, which cannot be derived from what it contributes. A section this app has never heard of lands in “Other” rather than failing to install.",
35
+ "Which section of the Extensions tab this sits under: a grouping by what it is FOR, which cannot be derived from what it contributes. A section this app has never heard of lands in 'Other' rather than failing to install.",
36
36
  ),
37
37
  /* What the extension is drawn as wherever it is LISTED rather than used, the Extensions tab, a registry
38
38
  * being browsed, the gallery. Deliberately here and not on a view: `Activation.icon` is the glyph of one
@@ -83,17 +83,17 @@ export const ExtensionManifestSchema = z.object({
83
83
  sandbox: z
84
84
  .array(z.string())
85
85
  .optional()
86
- .describe("Daemon routes your UI half may call. Your own backend namespace needs no entry — its backend is your own code."),
86
+ .describe("Daemon routes your UI half may call. Your own backend namespace needs no entry: its backend is your own code."),
87
87
  daemon: z
88
88
  .array(z.string())
89
89
  .optional()
90
90
  .describe(
91
- "Daemon routes your SERVER half may call. Separate from `sandbox` because the two halves run as different principals — the UI as the owner's session, the backend as a minted per-extension token — so a grant to one must never quietly widen the other.",
91
+ "Daemon routes your SERVER half may call. Separate from `sandbox` because the two halves run as different principals: the UI as the owner's session, the backend as a minted per-extension token, so a grant to one must never quietly widen the other.",
92
92
  ),
93
93
  })
94
94
  .optional()
95
95
  .describe(
96
- 'How far this extension may reach into the daemon, as "<METHOD> <path-glob>" entries where `*` matches one path segment — e.g. "GET /panels", "POST /panels/*/start". The install dialog shows these, the host refuses anything undeclared, and the usage ledger records which were actually earned.',
96
+ 'How far this extension may reach into the daemon, as "<METHOD> <path-glob>" entries where `*` matches one path segment: e.g. "GET /panels", "POST /panels/*/start". The install dialog shows these, the host refuses anything undeclared, and the usage ledger records which were actually earned.',
97
97
  ),
98
98
  contributes: contributesSchema.optional(),
99
99
  });
package/src/mark.ts CHANGED
@@ -50,7 +50,7 @@ export const MARK_FIELDS = {
50
50
  .max(ART_MAX_BYTES)
51
51
  .optional()
52
52
  .describe(
53
- "This extension's own mark, as a complete SVG document inline — the tier an author controls fully. Give it a viewBox and let it fill its own square edge to edge; it is drawn as the tile, not as a glyph on a plate. Kept as readable SVG text (not base64) so a registry reviewer can see what they are publishing, drawn inert so it cannot script the page, and capped at 4 KB. Anything that does not parse as SVG falls back to `logo`, then `icon`, then initials.",
53
+ "This extension's own mark, as a complete SVG document inline: the tier an author controls fully. Give it a viewBox and let it fill its own square edge to edge; it is drawn as the tile, not as a glyph on a plate. Kept as readable SVG text (not base64) so a registry reviewer can see what they are publishing, drawn inert so it cannot script the page, and capped at 4 KB. Anything that does not parse as SVG falls back to `logo`, then `icon`, then initials.",
54
54
  ),
55
55
  // A simple-icons slug (https://cdn.simpleicons.org/<slug>). A "/<hex>" suffix forces a colour for marks
56
56
  // that vanish against the surface they land on (github's near-black).
@@ -58,13 +58,13 @@ export const MARK_FIELDS = {
58
58
  .string()
59
59
  .optional()
60
60
  .describe(
61
- 'A simple-icons slug, fetched from a CDN — right for standing in for somebody else\'s product. Add a "/<hex>" suffix to force a colour for a mark that vanishes against the surface it lands on. Unreachable in an offline sandbox, so it falls back to `icon`, then to initials.',
61
+ 'A simple-icons slug, fetched from a CDN: right for standing in for somebody else\'s product. Add a "/<hex>" suffix to force a colour for a mark that vanishes against the surface it lands on. Unreachable in an offline sandbox, so it falls back to `icon`, then to initials.',
62
62
  ),
63
63
  // A name from the host's icon set (@intentic/ui IconName), drawn when no simple-icons slug fits.
64
64
  icon: z
65
65
  .string()
66
66
  .optional()
67
67
  .describe(
68
- "A name from the host's own icon set, drawn when no simple-icons slug fits. It ships in the image, follows the theme and costs no request — what actually carries a first-party extension. An unknown name falls back to initials rather than to a hole.",
68
+ "A name from the host's own icon set, drawn when no simple-icons slug fits. It ships in the image, follows the theme and costs no request: what actually carries a first-party extension. An unknown name falls back to initials rather than to a hole.",
69
69
  ),
70
70
  };
@@ -15,7 +15,7 @@ interface CompiledRoute {
15
15
  const compile = (entry: string): CompiledRoute => {
16
16
  const spaceIndex = entry.indexOf(" ");
17
17
  if (spaceIndex < 0) {
18
- throw new Error(`invalid sandbox permission "${entry}" — expected "<METHOD> <path-glob>", e.g. "GET /panels"`);
18
+ throw new Error(`invalid sandbox permission "${entry}": expected "<METHOD> <path-glob>", e.g. "GET /panels"`);
19
19
  }
20
20
  const method = entry.slice(0, spaceIndex).trim().toUpperCase();
21
21
  const glob = entry.slice(spaceIndex + 1).trim();
@@ -19,7 +19,7 @@ export const AutomationTemplateContributionSchema = z.object({
19
19
  id: z
20
20
  .string()
21
21
  .regex(/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/)
22
- .describe('Prefills the automation name, and is what "does one of these exist already" is asked by — so spell it as an id, not as prose.'),
22
+ .describe('Prefills the automation name, and is what "does one of these exist already" is asked by, so spell it as an id, not as prose.'),
23
23
  title: z.string().min(1),
24
24
  logo: z.string().min(1).optional().describe("A simple-icons slug for the card."),
25
25
  icon: z.string().min(1).optional().describe("A name from the host's icon set, drawn when no simple-icons slug fits."),
@@ -29,7 +29,7 @@ export const AutomationTemplateContributionSchema = z.object({
29
29
  .array(z.string().min(1))
30
30
  .optional()
31
31
  .describe(
32
- "Capability providers that make this template work — any one connected is enough (fixing CI rides github or gitlab). Omitted ⇒ nothing to connect, so it is always offered.",
32
+ "Capability providers that make this template work: any one connected is enough (fixing CI rides github or gitlab). Omitted ⇒ nothing to connect, so it is always offered.",
33
33
  ),
34
34
  // Shaped loosely here and parsed strictly at the merge: the manifest package cannot see the trigger union
35
35
  // (the dependency runs the other way), so the daemon is where a declaration meets the real schema.
@@ -48,7 +48,7 @@ export const AutomationTemplateContributionSchema = z.object({
48
48
  .string()
49
49
  .min(1)
50
50
  .optional()
51
- .describe("A condition that must hold before the turn runs — what makes a template safe to leave switched on."),
51
+ .describe("A condition that must hold before the turn runs: what makes a template safe to leave switched on."),
52
52
  holdForSeconds: z.number().int().positive().optional().describe("Wait this long and coalesce repeats, rather than firing on every event."),
53
53
  prompt: z.string().min(1).describe("The turn this starts. You own the trigger's payload vocabulary, so you own the prompt that reads it."),
54
54
  note: z.string().min(1).optional(),
@@ -63,7 +63,7 @@ export const AutomationTemplateContributionSchema = z.object({
63
63
  .enum(["create", "configure"])
64
64
  .optional()
65
65
  .describe(
66
- "Absent ⇒ it waits in the gallery, where you go once you know what you want. `create` puts a card on the page that makes it, switched off, in one click. `configure` puts one there that opens the dialog prefilled, for a template that cannot work unconfigured. Both are for what a user would never think to go looking for — mark everything as offered and you have rebuilt the gallery with extra steps.",
66
+ "Absent ⇒ it waits in the gallery, where you go once you know what you want. `create` puts a card on the page that makes it, switched off, in one click. `configure` puts one there that opens the dialog prefilled, for a template that cannot work unconfigured. Both are for what a user would never think to go looking for: mark everything as offered and you have rebuilt the gallery with extra steps.",
67
67
  ),
68
68
  // Whether what this makes watches THIS codebase (the chores shelf) rather than the outside world. Declared
69
69
  // rather than read off the trigger: a nightly dependency sweep and a nightly Stripe poll are both schedules.
@@ -71,7 +71,7 @@ export const AutomationTemplateContributionSchema = z.object({
71
71
  .boolean()
72
72
  .optional()
73
73
  .describe(
74
- "Whether what this makes watches THIS codebase rather than the outside world. Declared rather than read off the trigger — a nightly dependency sweep and a nightly Stripe poll are both schedules.",
74
+ "Whether what this makes watches THIS codebase rather than the outside world. Declared rather than read off the trigger: a nightly dependency sweep and a nightly Stripe poll are both schedules.",
75
75
  ),
76
76
  });
77
77
  export type AutomationTemplateContribution = z.infer<typeof AutomationTemplateContributionSchema>;
@@ -79,6 +79,6 @@ export type AutomationTemplateContribution = z.infer<typeof AutomationTemplateCo
79
79
  export const automationTemplatesPoint = {
80
80
  name: "automationTemplates",
81
81
  description:
82
- "Starting points this pack offers in the automation composer — a trigger, a prompt written for that trigger's payload, and whatever guard makes it safe to leave on. Declared by whoever knows the service rather than by the composer, so they appear when your pack is installed and disappear with it. Pure prefill: creating one makes an ordinary automation.",
82
+ "Starting points this pack offers in the automation composer, a trigger, a prompt written for that trigger's payload, and whatever guard makes it safe to leave on. Declared by whoever knows the service rather than by the composer, so they appear when your pack is installed and disappear with it. Pure prefill: creating one makes an ordinary automation.",
83
83
  schema: z.array(AutomationTemplateContributionSchema),
84
84
  } as const satisfies ContributionPoint;
package/src/points/bin.ts CHANGED
@@ -7,7 +7,7 @@ import type { ContributionPoint } from "../contribution-point.js";
7
7
  export const binPoint = {
8
8
  name: "bin",
9
9
  description:
10
- "A checkout-relative directory of executables the daemon puts on the agent's PATH every turn — how you ship the agent a command-line tool. The files are the approved code themselves: they ride the pinned checkout, and the daemon only adds the directory to PATH.",
10
+ "A checkout-relative directory of executables the daemon puts on the agent's PATH every turn, how you ship the agent a command-line tool. The files are the approved code themselves: they ride the pinned checkout, and the daemon only adds the directory to PATH.",
11
11
  schema: z
12
12
  .string()
13
13
  .min(1)
@@ -32,7 +32,7 @@ export const CapabilityFieldSchema = z.object({
32
32
  .string()
33
33
  .optional()
34
34
  .describe(
35
- "A line under this control, for what the label alone cannot say — a host requirement, when a value takes effect. The card's own `hint` speaks for the whole card; this one is bound to the field it qualifies.",
35
+ "A line under this control, for what the label alone cannot say: a host requirement, when a value takes effect. The card's own `hint` speaks for the whole card; this one is bound to the field it qualifies.",
36
36
  ),
37
37
  /* This field's value only takes effect after the sandbox is REBUILT, it rides the environment overlay
38
38
  * rather than something the daemon can act on now. Rendered as a chip beside the label.
@@ -45,7 +45,7 @@ export const CapabilityFieldSchema = z.object({
45
45
  .boolean()
46
46
  .optional()
47
47
  .describe(
48
- "This value only takes effect after the sandbox is rebuilt, because it rides the image overlay. Shown as a chip beside the label — two switches side by side, identical in every visible way, can otherwise cost five seconds or five minutes with no way to tell which.",
48
+ "This value only takes effect after the sandbox is rebuilt, because it rides the image overlay. Shown as a chip beside the label: two switches side by side, identical in every visible way, can otherwise cost five seconds or five minutes with no way to tell which.",
49
49
  ),
50
50
  default: z.string().optional(),
51
51
  options: z
@@ -64,7 +64,7 @@ export const CapabilityFieldSchema = z.object({
64
64
  .refine(isWhenExpression, { message: "not a valid `when` condition" })
65
65
  .optional()
66
66
  .describe(
67
- "Only show this field while a condition over the answers already given holds — `auth == 'key'`, `provider in ['ipsec', 'fortinet']`, `!advanced`. Supports `&&`, `||`, `!`, comparisons and `in`.",
67
+ "Only show this field while a condition over the answers already given holds: `auth == 'key'`, `provider in ['ipsec', 'fortinet']`, `!advanced`. Supports `&&`, `||`, `!`, comparisons and `in`.",
68
68
  ),
69
69
  // A fixed value baked into the config rather than asked for, how a card pins a discriminator
70
70
  // (platform="reddit", provider="stripe"). Rendered as nothing; sent as itself.
@@ -72,7 +72,7 @@ export const CapabilityFieldSchema = z.object({
72
72
  .string()
73
73
  .optional()
74
74
  .describe(
75
- 'A fixed value baked into the config rather than asked for — how a card pins its discriminator (platform="reddit", provider="stripe"). Renders as nothing.',
75
+ 'A fixed value baked into the config rather than asked for: how a card pins its discriminator (platform="reddit", provider="stripe"). Renders as nothing.',
76
76
  ),
77
77
  /* This field holds a TOTP seed, the base32 key (or otpauth:// URI) a service shows when enrolling an
78
78
  * authenticator app. Declare it WITH `secret: true`: the seed is a durable second factor, so it is never
@@ -83,7 +83,7 @@ export const CapabilityFieldSchema = z.object({
83
83
  .boolean()
84
84
  .optional()
85
85
  .describe(
86
- "This field holds a TOTP seed — the base32 key or otpauth:// URI a service shows when enrolling an authenticator app. Declare it with `secret: true`. Unlike an ordinary secret it never enters the agent's environment: the daemon mints the six-digit codes on demand and only those cross.",
86
+ "This field holds a TOTP seed, the base32 key or otpauth:// URI a service shows when enrolling an authenticator app. Declare it with `secret: true`. Unlike an ordinary secret it never enters the agent's environment: the daemon mints the six-digit codes on demand and only those cross.",
87
87
  ),
88
88
  });
89
89
  export type CapabilityField = z.infer<typeof CapabilityFieldSchema>;
@@ -118,7 +118,7 @@ const CatalogSchema = z.object({
118
118
  .string()
119
119
  .min(1)
120
120
  .describe(
121
- "ONE LINE — aim for 60 characters or fewer. The grid clamps it at two lines in a narrow pane, so a paragraph here is a paragraph the reader gets truncated. Everything longer belongs in `hint`.",
121
+ "ONE LINE: aim for 60 characters or fewer. The grid clamps it at two lines in a narrow pane, so a paragraph here is a paragraph the reader gets truncated. Everything longer belongs in `hint`.",
122
122
  ),
123
123
  category: z.string().min(1),
124
124
  // The paragraph. Shown under the add-form, and searched from the catalog, so the words that identify this
@@ -127,7 +127,7 @@ const CatalogSchema = z.object({
127
127
  .string()
128
128
  .optional()
129
129
  .describe(
130
- 'The paragraph, shown under the add form and searched from the catalog — so the words that identify this card to someone hunting for it ("webauthn", "socket mode") belong here even when the tile cannot show them.',
130
+ 'The paragraph, shown under the add form and searched from the catalog, so the words that identify this card to someone hunting for it ("webauthn", "socket mode") belong here even when the tile cannot show them.',
131
131
  ),
132
132
  // The credential-creation walkthrough the install dialog renders (the platform catalog's guide shape).
133
133
  guide: z
@@ -177,7 +177,7 @@ export const CapabilityContributionSchema = z
177
177
  env: z
178
178
  .record(z.string().regex(/^[A-Z][A-Z0-9_]*$/), z.string())
179
179
  .describe(
180
- "The environment the agent's shell gets, as value templates over the fields — `${field}` substitutes, `${field:uri}` percent-encodes. Each name is suffixed per instance.",
180
+ "The environment the agent's shell gets, as value templates over the fields: `${field}` substitutes, `${field:uri}` percent-encodes. Each name is suffixed per instance.",
181
181
  ),
182
182
  skill: z
183
183
  .string()
@@ -211,19 +211,19 @@ export const CapabilityContributionSchema = z
211
211
  .url()
212
212
  .optional()
213
213
  .describe(
214
- "What the sign-in window opens; the profile it persists IS the credential. Optional so one card can be the generic one that asks for the URL on its form instead — but a card must either pin this or declare a field that supplies it, or the window opens on nothing.",
214
+ "What the sign-in window opens; the profile it persists IS the credential. Optional so one card can be the generic one that asks for the URL on its form instead, but a card must either pin this or declare a field that supplies it, or the window opens on nothing.",
215
215
  ),
216
216
  homeUrl: z
217
217
  .url()
218
218
  .optional()
219
219
  .describe(
220
- "Where that same profile opens once it HAS a session — the owner's own hands on the connected browser. Separate from loginUrl because for some platforms the login lives on another site entirely (YouTube signs in at accounts.google.com).",
220
+ "Where that same profile opens once it HAS a session: the owner's own hands on the connected browser. Separate from loginUrl because for some platforms the login lives on another site entirely (YouTube signs in at accounts.google.com).",
221
221
  ),
222
222
  skill: z
223
223
  .string()
224
224
  .min(1)
225
225
  .describe(
226
- "Checkout-relative SKILL.md teaching the agent this site's actions — rendered once per site, all its connected accounts on one roster (`${accounts}`), the core tool note at `${tools}`.",
226
+ "Checkout-relative SKILL.md teaching the agent this site's actions: rendered once per site, all its connected accounts on one roster (`${accounts}`), the core tool note at `${tools}`.",
227
227
  ),
228
228
  }),
229
229
  // An operating system a connected computer can run, the skill pack that teaches the agent THAT machine's
@@ -249,7 +249,7 @@ export const CapabilityContributionSchema = z
249
249
  if (Object.values(spec.env).some((template) => template.includes(`\${${field.key}}`) || template.includes(`\${${field.key}:uri}`))) {
250
250
  ctx.addIssue({
251
251
  code: "custom",
252
- message: `env must not reference the totp field "${field.key}" — the daemon mints codes from it instead`,
252
+ message: `env must not reference the totp field "${field.key}", the daemon mints codes from it instead`,
253
253
  });
254
254
  }
255
255
  }
@@ -275,6 +275,6 @@ export const contributionDiscriminator = (kind: string): string | undefined => D
275
275
  export const capabilitiesPoint = {
276
276
  name: "capabilities",
277
277
  description:
278
- 'Capability cards this pack adds to the "+" grid — a connected CLI tool, a site the agent acts on as the owner through the shared browser, an operating system pack, or a preset over a core kind. The card and its form are data here; the machinery that acts on them is core, which is why a card may only name one of these four kinds.',
278
+ 'Capability cards this pack adds to the "+" grid: a connected CLI tool, a site the agent acts on as the owner through the shared browser, an operating system pack, or a preset over a core kind. The card and its form are data here; the machinery that acts on them is core, which is why a card may only name one of these four kinds.',
279
279
  schema: z.array(CapabilityContributionSchema),
280
280
  } as const satisfies ContributionPoint;
@@ -31,7 +31,7 @@ export const CommandContributionSchema = z.object({
31
31
  .refine(isWhenExpression, { message: "not a valid `when` condition" })
32
32
  .optional()
33
33
  .describe(
34
- "When the shortcut applies, as a condition over the shell's context keys — `tabSurface == 'chat'`, `!editableTarget`. Without one the chord is claimed everywhere, including inside a terminal where a bare key belongs to the program running in it. The command palette ignores this: a command is always runnable by name.",
34
+ "When the shortcut applies, as a condition over the shell's context keys, `tabSurface == 'chat'`, `!editableTarget`. Without one the chord is claimed everywhere, including inside a terminal where a bare key belongs to the program running in it. The command palette ignores this: a command is always runnable by name.",
35
35
  ),
36
36
  });
37
37
  export type CommandContribution = z.infer<typeof CommandContributionSchema>;
@@ -11,7 +11,7 @@ export const EnvironmentContributionSchema = z.object({
11
11
  .min(1)
12
12
  .refine((value) => !value.split("/").includes(".."), { message: "fragment must stay inside the checkout" })
13
13
  .describe(
14
- "Checkout-relative path to a file holding ONLY RUN and ENV instructions. FROM and privileged directives are rejected — those stay daemon-owned.",
14
+ "Checkout-relative path to a file holding ONLY RUN and ENV instructions. FROM and privileged directives are rejected: those stay daemon-owned.",
15
15
  ),
16
16
  });
17
17
  export type EnvironmentContribution = z.infer<typeof EnvironmentContributionSchema>;
@@ -19,6 +19,6 @@ export type EnvironmentContribution = z.infer<typeof EnvironmentContributionSche
19
19
  export const environmentPoint = {
20
20
  name: "environment",
21
21
  description:
22
- "A Dockerfile fragment baked into the sandbox image so your tools are actually installed at runtime — a whisper binary, a psql client. The owner approves the composed overlay and rebuilds out of band, so this does not take effect immediately.",
22
+ "A Dockerfile fragment baked into the sandbox image so your tools are actually installed at runtime: a whisper binary, a psql client. The owner approves the composed overlay and rebuilds out of band, so this does not take effect immediately.",
23
23
  schema: EnvironmentContributionSchema,
24
24
  } as const satisfies ContributionPoint;
@@ -27,7 +27,7 @@ export const FileContributionSchema = z.object({
27
27
  message: "path must be workspace-root-relative and stay inside the workspace",
28
28
  })
29
29
  .describe(
30
- "Workspace-root-relative, forward-slash, matched by prefix — so one entry covers an exact file (`.intentic/config/automations.json`), a directory (`.intentic/config/drafts/`, with the trailing slash so it cannot match a sibling file) or a name family (`.intentic/environment.`). Not a glob.",
30
+ "Workspace-root-relative, forward-slash, matched by prefix, so one entry covers an exact file (`.intentic/config/automations.json`), a directory (`.intentic/config/drafts/`, with the trailing slash so it cannot match a sibling file) or a name family (`.intentic/environment.`). Not a glob.",
31
31
  ),
32
32
  /* The browser query keys those contents feed, the first element of the extension's own
33
33
  * `api.sandbox.key(...)` keys, which is what makes them match (the sandbox id is a SUFFIX). Empty is not
@@ -41,7 +41,7 @@ export const FileContributionSchema = z.object({
41
41
  .array(z.string().min(1))
42
42
  .min(1)
43
43
  .describe(
44
- "The query keys this path makes stale — the first element of your own api.sandbox.key(...) keys. Keep both this and the path as narrow as the view actually needs: a broad prefix costs every connected browser a refetch on every matching write.",
44
+ "The query keys this path makes stale, the first element of your own api.sandbox.key(...) keys. Keep both this and the path as narrow as the view actually needs: a broad prefix costs every connected browser a refetch on every matching write.",
45
45
  ),
46
46
  });
47
47
  export type FileContribution = z.infer<typeof FileContributionSchema>;
@@ -54,12 +54,12 @@ export const ListenerContributionSchema = z.object({
54
54
  .describe(
55
55
  "Only for a source whose message events distinguish being addressed. Absent ⇒ the editor offers no mention-only filter, rather than inventing semantics you did not promise.",
56
56
  ),
57
- channel: TriggerFieldContributionSchema.describe("The primary narrowing filter — a channel, a room, a repo."),
57
+ channel: TriggerFieldContributionSchema.describe("The primary narrowing filter, a channel, a room, a repo."),
58
58
  // A SECOND narrowing axis, for a source whose events carry one, a pipeline's git ref, so a trigger can
59
59
  // say "the branch that ships" rather than "every agent's every failure". Absent ⇒ the editor offers
60
60
  // only the channel filter.
61
61
  branchField: TriggerFieldContributionSchema.optional().describe(
62
- 'A second narrowing axis, for a source whose events carry one — a pipeline\'s git ref, so a trigger can say "the branch that ships" rather than "every agent\'s every failure".',
62
+ 'A second narrowing axis, for a source whose events carry one: a pipeline\'s git ref, so a trigger can say "the branch that ships" rather than "every agent\'s every failure".',
63
63
  ),
64
64
  // The provider owns the payload vocabulary, so it also owns the first prompt that explains that payload.
65
65
  starterPrompt: z
@@ -76,6 +76,6 @@ export type ListenerContribution = z.infer<typeof ListenerContributionSchema>;
76
76
  export const listenerPoint = {
77
77
  name: "listener",
78
78
  description:
79
- "A realtime event source this extension supplies, so automations can trigger on it. One declaration feeds both halves: the daemon accepts these event types and serves this provider's control surface, and the automation editor derives its source picker, filters and starter prompt from it — so a newly installed listener is configurable without a matching app release.",
79
+ "A realtime event source this extension supplies, so automations can trigger on it. One declaration feeds both halves: the daemon accepts these event types and serves this provider's control surface, and the automation editor derives its source picker, filters and starter prompt from it, so a newly installed listener is configurable without a matching app release.",
80
80
  schema: ListenerContributionSchema,
81
81
  } as const satisfies ContributionPoint;
@@ -15,6 +15,6 @@ export type ProcessContribution = z.infer<typeof ProcessContributionSchema>;
15
15
  export const processesPoint = {
16
16
  name: "processes",
17
17
  description:
18
- "Long-lived background processes the daemon runs for this extension — a gateway holding a connection the daemon must not, a dev server. Managed the same way panel dev servers are, and startable and stoppable from the Extensions tab.",
18
+ "Long-lived background processes the daemon runs for this extension: a gateway holding a connection the daemon must not, a dev server. Managed the same way panel dev servers are, and startable and stoppable from the Extensions tab.",
19
19
  schema: z.array(ProcessContributionSchema),
20
20
  } as const satisfies ContributionPoint;
@@ -12,7 +12,7 @@ export const SettingContributionSchema = z.object({
12
12
  secret: z
13
13
  .boolean()
14
14
  .optional()
15
- .describe("Mask the value in the UI and strip it from reads — a set secret round-trips as “still set”, never as its value."),
15
+ .describe("Mask the value in the UI and strip it from reads: a set secret round-trips as 'still set', never as its value."),
16
16
  env: z
17
17
  .string()
18
18
  .regex(/^[A-Z][A-Z0-9_]*$/)
@@ -10,7 +10,7 @@ export const ViewerContributionSchema = z.object({
10
10
  extensions: z
11
11
  .array(z.string().regex(/^[a-z0-9]+$/))
12
12
  .min(1)
13
- .describe('Bare file extensions, no dot — e.g. ["docx", "xlsx"].'),
13
+ .describe('Bare file extensions, no dot: e.g. ["docx", "xlsx"].'),
14
14
  /* `fetch` is how much of the file the host puts in the extension's hands, and it is a real choice:
15
15
  * text, decoded utf8 (`text` prop). For a format that IS text: svg, a subtitle track, a notebook.
16
16
  * blob, the whole file in memory (`blob` prop). For a format that must be parsed end to end before any of
@@ -23,7 +23,7 @@ export const ViewerContributionSchema = z.object({
23
23
  fetch: z
24
24
  .enum(["text", "blob", "url"])
25
25
  .describe(
26
- "How much of the file the host hands you. `text` for a format that is text (svg, a subtitle track). `blob` for one that must be parsed end to end before any of it shows (a .docx, a spreadsheet) — bounded by the daemon's raw-read cap. `url` for anything range-read rather than parsed (audio, video): your component gets a streaming URL to point an element at, never the bytes.",
26
+ "How much of the file the host hands you. `text` for a format that is text (svg, a subtitle track). `blob` for one that must be parsed end to end before any of it shows (a .docx, a spreadsheet), bounded by the daemon's raw-read cap. `url` for anything range-read rather than parsed (audio, video): your component gets a streaming URL to point an element at, never the bytes.",
27
27
  ),
28
28
  });
29
29
  export type ViewerContribution = z.infer<typeof ViewerContributionSchema>;
@@ -31,6 +31,6 @@ export type ViewerContribution = z.infer<typeof ViewerContributionSchema>;
31
31
  export const viewersPoint = {
32
32
  name: "viewers",
33
33
  description:
34
- "File formats this extension can render. The host resolves an opened file to your viewer by its extension, fetches the content, and renders your component with it — you keep none of the fetch lifecycle and none of the daemon credentials.",
34
+ "File formats this extension can render. The host resolves an opened file to your viewer by its extension, fetches the content, and renders your component with it: you keep none of the fetch lifecycle and none of the daemon credentials.",
35
35
  schema: z.array(ViewerContributionSchema),
36
36
  } as const satisfies ContributionPoint;