@serviceme/devtools-protocol 0.1.4 → 0.1.6

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/index.js CHANGED
@@ -40,6 +40,11 @@ __export(index_exports, {
40
40
  createServicemeError: () => createServicemeError,
41
41
  getBridgeEventParamsValidator: () => getBridgeEventParamsValidator,
42
42
  getBridgeResultValidator: () => getBridgeResultValidator,
43
+ isAgentMarketplaceState: () => isAgentMarketplaceState,
44
+ isAgentMutationRequest: () => isAgentMutationRequest,
45
+ isAgentMutationResult: () => isAgentMutationResult,
46
+ isAgentPermissionSummary: () => isAgentPermissionSummary,
47
+ isAgentPermissionsResult: () => isAgentPermissionsResult,
43
48
  isAgentSessionStatus: () => isAgentSessionStatus,
44
49
  isBridgeCapabilities: () => isBridgeCapabilities,
45
50
  isBridgeEvent: () => isBridgeEvent,
@@ -72,6 +77,11 @@ __export(index_exports, {
72
77
  isServiceMeProjectScaffoldPruneResult: () => isServiceMeProjectScaffoldPruneResult,
73
78
  isServicemeErrorCode: () => isServicemeErrorCode,
74
79
  isServicemeErrorDetails: () => isServicemeErrorDetails,
80
+ isSkillMarketplaceState: () => isSkillMarketplaceState,
81
+ isSkillMutationRequest: () => isSkillMutationRequest,
82
+ isSkillMutationResult: () => isSkillMutationResult,
83
+ isSkillPublishableResult: () => isSkillPublishableResult,
84
+ isSkillReconcileResult: () => isSkillReconcileResult,
75
85
  isSystemHelloResult: () => isSystemHelloResult,
76
86
  isSystemPingResult: () => isSystemPingResult,
77
87
  isSystemShutdownResult: () => isSystemShutdownResult,
@@ -89,6 +99,90 @@ __export(index_exports, {
89
99
  });
90
100
  module.exports = __toCommonJS(index_exports);
91
101
 
102
+ // src/agent.ts
103
+ var VALID_AGENT_SCOPES = ["workspace", "user"];
104
+ var VALID_AGENT_SCOPE_STATUSES = [
105
+ "absent",
106
+ "available",
107
+ "installed",
108
+ "blocked",
109
+ "conflict"
110
+ ];
111
+ var VALID_AGENT_MUTATION_ACTIONS = [
112
+ "install",
113
+ "uninstall",
114
+ "move",
115
+ "removeExternal",
116
+ "publish",
117
+ "republish",
118
+ "submit-to-official"
119
+ ];
120
+ var VALID_AGENT_TOOL_RISK_LEVELS = [
121
+ "high",
122
+ "medium",
123
+ "low"
124
+ ];
125
+ function isRecord(value) {
126
+ return typeof value === "object" && value !== null;
127
+ }
128
+ function isStringArray(value) {
129
+ return Array.isArray(value) && value.every((item) => typeof item === "string");
130
+ }
131
+ function isAgentScope(value) {
132
+ return typeof value === "string" && VALID_AGENT_SCOPES.includes(value);
133
+ }
134
+ function isAgentScopeStatus(value) {
135
+ return typeof value === "string" && VALID_AGENT_SCOPE_STATUSES.includes(value);
136
+ }
137
+ function isAgentMutationAction(value) {
138
+ return typeof value === "string" && VALID_AGENT_MUTATION_ACTIONS.includes(value);
139
+ }
140
+ function isSafeResourceId(value) {
141
+ if (typeof value !== "string" || value.length === 0 || value.includes("\\")) {
142
+ return false;
143
+ }
144
+ const segments = value.split("/");
145
+ if (segments.some((segment) => segment.length === 0)) {
146
+ return false;
147
+ }
148
+ return segments.every(
149
+ (segment) => segment !== "." && segment !== ".." && /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(segment)
150
+ );
151
+ }
152
+ function isAgentScopeState(value) {
153
+ if (!isRecord(value)) {
154
+ return false;
155
+ }
156
+ return isAgentScope(value.scope) && isAgentScopeStatus(value.status) && (value.kind === void 0 || value.kind === "builtin" || value.kind === "external") && (value.path === void 0 || typeof value.path === "string") && typeof value.isInstalled === "boolean" && typeof value.canInstall === "boolean" && typeof value.canUninstall === "boolean" && typeof value.canRemove === "boolean" && typeof value.canMoveHere === "boolean" && (value.summary === void 0 || typeof value.summary === "string");
157
+ }
158
+ function isAgentMarketplaceEntry(value) {
159
+ if (!isRecord(value)) {
160
+ return false;
161
+ }
162
+ return typeof value.id === "string" && typeof value.displayName === "string" && typeof value.description === "string" && typeof value.version === "string" && typeof value.updatedAt === "string" && (value.categoryId === void 0 || typeof value.categoryId === "string") && typeof value.isCatalogAgent === "boolean" && typeof value.recommended === "boolean" && typeof value.installCount === "number" && (value.ownerScope === void 0 || isAgentScope(value.ownerScope)) && (value.ownerKind === void 0 || value.ownerKind === "builtin" || value.ownerKind === "external") && typeof value.hasConflict === "boolean" && isStringArray(value.tools) && (value.source === void 0 || value.source === "official" || value.source === "community" || value.source === "local") && (value.localAgentPath === void 0 || typeof value.localAgentPath === "string") && (value.canPublish === void 0 || typeof value.canPublish === "boolean") && isAgentScopeState(value.workspaceState) && isAgentScopeState(value.userState);
163
+ }
164
+ function isAgentMarketplaceState(value) {
165
+ if (!isRecord(value)) {
166
+ return false;
167
+ }
168
+ return typeof value.configPath === "string" && typeof value.userAgentsPath === "string" && Array.isArray(value.agents) && value.agents.every((entry) => isAgentMarketplaceEntry(entry)) && (value.installedAgentIds === void 0 || isStringArray(value.installedAgentIds)) && (value.workspaceOpen === void 0 || typeof value.workspaceOpen === "boolean");
169
+ }
170
+ function isAgentMutationRequest(value) {
171
+ return isRecord(value) && isSafeResourceId(value.agentId) && isAgentScope(value.targetScope) && isAgentMutationAction(value.action) && (value.confirmed === void 0 || typeof value.confirmed === "boolean");
172
+ }
173
+ function isAgentMutationResult(value) {
174
+ return isRecord(value) && isAgentMarketplaceState(value.state) && typeof value.agentId === "string" && isAgentScope(value.targetScope) && isAgentMutationAction(value.action) && typeof value.changed === "boolean" && (value.status === "success" || value.status === "blocked" || value.status === "requires_confirmation") && (value.message === void 0 || typeof value.message === "string") && (value.tools === void 0 || isStringArray(value.tools)) && (value.prUrl === void 0 || typeof value.prUrl === "string") && (value.fromVersion === void 0 || typeof value.fromVersion === "string") && (value.toVersion === void 0 || typeof value.toVersion === "string");
175
+ }
176
+ function isAgentToolPermission(value) {
177
+ return isRecord(value) && typeof value.tool === "string" && typeof value.riskLevel === "string" && VALID_AGENT_TOOL_RISK_LEVELS.includes(value.riskLevel);
178
+ }
179
+ function isAgentPermissionSummary(value) {
180
+ return isRecord(value) && typeof value.agentId === "string" && typeof value.agentName === "string" && Array.isArray(value.tools) && value.tools.every((tool) => isAgentToolPermission(tool)) && typeof value.highRiskCount === "number" && typeof value.mediumRiskCount === "number" && typeof value.lowRiskCount === "number";
181
+ }
182
+ function isAgentPermissionsResult(value) {
183
+ return isRecord(value) && typeof value.agentId === "string" && isAgentPermissionSummary(value.summary);
184
+ }
185
+
92
186
  // src/scheduled-tasks.ts
93
187
  var VALID_TASK_TYPES = [
94
188
  "command",
@@ -98,64 +192,143 @@ var VALID_TASK_TYPES = [
98
192
  ];
99
193
  var VALID_SCHEDULE_TYPES = ["cron", "interval"];
100
194
  var VALID_TERMINAL_STATUSES = ["success", "failure", "timeout", "cancelled"];
101
- function isRecord(value) {
195
+ function isRecord2(value) {
102
196
  return typeof value === "object" && value !== null;
103
197
  }
104
198
  function isScheduledTaskType(value) {
105
199
  return typeof value === "string" && VALID_TASK_TYPES.includes(value);
106
200
  }
107
201
  function isScheduledTask(value) {
108
- if (!isRecord(value)) return false;
109
- return typeof value.id === "string" && typeof value.name === "string" && typeof value.enabled === "boolean" && VALID_SCHEDULE_TYPES.includes(value.scheduleType) && typeof value.schedule === "string" && isScheduledTaskType(value.taskType) && isRecord(value.payload) && typeof value.createdAt === "string" && typeof value.updatedAt === "string";
202
+ if (!isRecord2(value)) return false;
203
+ return typeof value.id === "string" && typeof value.name === "string" && typeof value.enabled === "boolean" && VALID_SCHEDULE_TYPES.includes(value.scheduleType) && typeof value.schedule === "string" && isScheduledTaskType(value.taskType) && isRecord2(value.payload) && typeof value.createdAt === "string" && typeof value.updatedAt === "string";
110
204
  }
111
205
  function isTaskExecutionLog(value) {
112
- if (!isRecord(value)) return false;
206
+ if (!isRecord2(value)) return false;
113
207
  return typeof value.id === "string" && typeof value.taskId === "string" && typeof value.taskName === "string" && typeof value.startedAt === "string" && typeof value.finishedAt === "string" && VALID_TERMINAL_STATUSES.includes(
114
208
  value.status
115
209
  );
116
210
  }
117
211
  function isSchedulerStatus(value) {
118
- if (!isRecord(value)) return false;
212
+ if (!isRecord2(value)) return false;
119
213
  return typeof value.running === "boolean" && typeof value.tasksRegistered === "number" && typeof value.workspacePath === "string";
120
214
  }
121
215
  function isTaskExecuteResult(value) {
122
- return isRecord(value) && typeof value.executionId === "string" && value.accepted === true;
216
+ return isRecord2(value) && typeof value.executionId === "string" && value.accepted === true;
123
217
  }
124
218
  function isTaskCancelResult(value) {
125
- return isRecord(value) && typeof value.executionId === "string" && typeof value.cancelled === "boolean";
219
+ return isRecord2(value) && typeof value.executionId === "string" && typeof value.cancelled === "boolean";
126
220
  }
127
221
  function isTaskListRunningResult(value) {
128
- return isRecord(value) && Array.isArray(value.executions);
222
+ return isRecord2(value) && Array.isArray(value.executions);
129
223
  }
130
224
  function isTaskStartedEventParams(value) {
131
- return isRecord(value) && typeof value.executionId === "string" && typeof value.taskId === "string" && typeof value.startedAt === "string";
225
+ return isRecord2(value) && typeof value.executionId === "string" && typeof value.taskId === "string" && typeof value.startedAt === "string";
132
226
  }
133
227
  function isTaskOutputEventParams(value) {
134
- return isRecord(value) && typeof value.executionId === "string" && (value.stream === "stdout" || value.stream === "stderr") && typeof value.data === "string";
228
+ return isRecord2(value) && typeof value.executionId === "string" && (value.stream === "stdout" || value.stream === "stderr") && typeof value.data === "string";
135
229
  }
136
230
  function isTaskCompletedEventParams(value) {
137
- return isRecord(value) && typeof value.executionId === "string" && isTaskExecutionLog(value.log);
231
+ return isRecord2(value) && typeof value.executionId === "string" && isTaskExecutionLog(value.log);
138
232
  }
139
233
  function isTaskFailedEventParams(value) {
140
- return isRecord(value) && typeof value.executionId === "string" && (value.status === "failure" || value.status === "timeout") && (value.reason === "error" || value.reason === "timeout") && isTaskExecutionLog(value.log);
234
+ return isRecord2(value) && typeof value.executionId === "string" && (value.status === "failure" || value.status === "timeout") && (value.reason === "error" || value.reason === "timeout") && isTaskExecutionLog(value.log);
141
235
  }
142
236
  function isTaskCancelledEventParams(value) {
143
- return isRecord(value) && typeof value.executionId === "string" && isTaskExecutionLog(value.log);
237
+ return isRecord2(value) && typeof value.executionId === "string" && isTaskExecutionLog(value.log);
144
238
  }
145
239
  function isAgentSessionStatus(value) {
146
240
  return value === "idle" || value === "running" || value === "needs-input" || value === "completed" || value === "failed" || value === "aborted";
147
241
  }
148
242
 
243
+ // src/skill.ts
244
+ var VALID_SKILL_SCOPES = ["workspace", "user"];
245
+ var VALID_SKILL_SCOPE_STATUSES = [
246
+ "absent",
247
+ "available",
248
+ "installed",
249
+ "blocked",
250
+ "conflict"
251
+ ];
252
+ var VALID_SKILL_MUTATION_ACTIONS = [
253
+ "install",
254
+ "uninstall",
255
+ "move",
256
+ "removeExternal",
257
+ "publish",
258
+ "republish",
259
+ "submit-to-official"
260
+ ];
261
+ function isRecord3(value) {
262
+ return typeof value === "object" && value !== null;
263
+ }
264
+ function isSkillScope(value) {
265
+ return typeof value === "string" && VALID_SKILL_SCOPES.includes(value);
266
+ }
267
+ function isSkillScopeStatus(value) {
268
+ return typeof value === "string" && VALID_SKILL_SCOPE_STATUSES.includes(value);
269
+ }
270
+ function isSkillMutationAction(value) {
271
+ return typeof value === "string" && VALID_SKILL_MUTATION_ACTIONS.includes(value);
272
+ }
273
+ function isStringArray2(value) {
274
+ return Array.isArray(value) && value.every((item) => typeof item === "string");
275
+ }
276
+ function isSafeResourceId2(value) {
277
+ if (typeof value !== "string" || value.length === 0 || value.includes("\\")) {
278
+ return false;
279
+ }
280
+ const segments = value.split("/");
281
+ if (segments.some((segment) => segment.length === 0)) {
282
+ return false;
283
+ }
284
+ return segments.every(
285
+ (segment) => segment !== "." && segment !== ".." && /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(segment)
286
+ );
287
+ }
288
+ function isSkillScopeState(value) {
289
+ if (!isRecord3(value)) {
290
+ return false;
291
+ }
292
+ return isSkillScope(value.scope) && isSkillScopeStatus(value.status) && (value.kind === void 0 || value.kind === "builtin" || value.kind === "external") && (value.path === void 0 || typeof value.path === "string") && typeof value.isInstalled === "boolean" && typeof value.canInstall === "boolean" && typeof value.canUninstall === "boolean" && typeof value.canRemove === "boolean" && typeof value.canMoveHere === "boolean" && (value.summary === void 0 || typeof value.summary === "string");
293
+ }
294
+ function isSkillMarketplaceEntry(value) {
295
+ if (!isRecord3(value)) {
296
+ return false;
297
+ }
298
+ return typeof value.id === "string" && typeof value.displayName === "string" && typeof value.description === "string" && typeof value.version === "string" && typeof value.updatedAt === "string" && (value.categoryId === void 0 || typeof value.categoryId === "string") && (value.enabled === void 0 || typeof value.enabled === "boolean") && typeof value.isCatalogSkill === "boolean" && typeof value.recommended === "boolean" && typeof value.installCount === "number" && (value.requiresSetup === void 0 || typeof value.requiresSetup === "boolean") && (value.setupHint === void 0 || typeof value.setupHint === "string") && (value.homepage === void 0 || typeof value.homepage === "string") && (value.ownerScope === void 0 || isSkillScope(value.ownerScope)) && (value.ownerKind === void 0 || value.ownerKind === "builtin" || value.ownerKind === "external") && typeof value.hasConflict === "boolean" && (value.hasScripts === void 0 || typeof value.hasScripts === "boolean") && (value.hasHooks === void 0 || typeof value.hasHooks === "boolean") && (value.source === void 0 || value.source === "official" || value.source === "community" || value.source === "local") && (value.localSkillPath === void 0 || typeof value.localSkillPath === "string") && (value.canPublish === void 0 || typeof value.canPublish === "boolean") && isSkillScopeState(value.workspaceState) && isSkillScopeState(value.userState);
299
+ }
300
+ function isSkillMarketplaceState(value) {
301
+ if (!isRecord3(value)) {
302
+ return false;
303
+ }
304
+ return typeof value.configPath === "string" && typeof value.userSkillsPath === "string" && Array.isArray(value.skills) && value.skills.every((entry) => isSkillMarketplaceEntry(entry)) && (value.enabledSkillIds === void 0 || isStringArray2(value.enabledSkillIds)) && (value.recommendedSkillIds === void 0 || isStringArray2(value.recommendedSkillIds)) && typeof value.onboardingRequired === "boolean" && typeof value.hasPersistedSelection === "boolean" && (value.workspaceOpen === void 0 || typeof value.workspaceOpen === "boolean");
305
+ }
306
+ function isSkillMutationRequest(value) {
307
+ return isRecord3(value) && isSafeResourceId2(value.skillId) && isSkillScope(value.targetScope) && isSkillMutationAction(value.action) && (value.confirmed === void 0 || typeof value.confirmed === "boolean");
308
+ }
309
+ function isSkillMutationResult(value) {
310
+ return isRecord3(value) && isSkillMarketplaceState(value.state) && typeof value.skillId === "string" && isSkillScope(value.targetScope) && isSkillMutationAction(value.action) && typeof value.changed === "boolean" && (value.status === "success" || value.status === "blocked" || value.status === "requires_confirmation") && (value.message === void 0 || typeof value.message === "string") && (value.hasScripts === void 0 || typeof value.hasScripts === "boolean") && (value.hasHooks === void 0 || typeof value.hasHooks === "boolean") && (value.prUrl === void 0 || typeof value.prUrl === "string") && (value.fromVersion === void 0 || typeof value.fromVersion === "string") && (value.toVersion === void 0 || typeof value.toVersion === "string");
311
+ }
312
+ function isSkillReconcileResult(value) {
313
+ return isRecord3(value) && isSkillMarketplaceState(value.state) && typeof value.changed === "boolean";
314
+ }
315
+ function isPublishableSkillEntry(value) {
316
+ return isRecord3(value) && typeof value.id === "string" && typeof value.displayName === "string" && typeof value.path === "string" && (value.version === void 0 || typeof value.version === "string");
317
+ }
318
+ function isSkillPublishableResult(value) {
319
+ return isRecord3(value) && Array.isArray(value.skills) && value.skills.every((entry) => isPublishableSkillEntry(entry));
320
+ }
321
+
149
322
  // src/bridge.ts
150
323
  var SERVICEME_PROTOCOL_VERSION = 2;
151
- function isRecord2(value) {
324
+ function isRecord4(value) {
152
325
  return typeof value === "object" && value !== null;
153
326
  }
154
327
  function isValidProtocolVersion(value) {
155
328
  return typeof value === "number" && Number.isInteger(value) && value >= 1 && value <= SERVICEME_PROTOCOL_VERSION;
156
329
  }
157
330
  function isBridgeCapabilities(value) {
158
- return isRecord2(value) && value.bridge === true && value.json === 1 && value.env === 1 && (value.tasks === void 0 || value.tasks === 1);
331
+ return isRecord4(value) && value.bridge === true && value.json === 1 && value.env === 1 && (value.tasks === void 0 || value.tasks === 1) && (value.skills === void 0 || value.skills === 1) && (value.agents === void 0 || value.agents === 1);
159
332
  }
160
333
  var BRIDGE_METHODS = [
161
334
  "system.hello",
@@ -163,7 +336,14 @@ var BRIDGE_METHODS = [
163
336
  "system.shutdown",
164
337
  "task.execute",
165
338
  "task.cancel",
166
- "task.list-running"
339
+ "task.list-running",
340
+ "skill.marketplace-state",
341
+ "skill.mutate",
342
+ "skill.reconcile",
343
+ "skill.publishable",
344
+ "agent.marketplace-state",
345
+ "agent.mutate",
346
+ "agent.permissions"
167
347
  ];
168
348
  var BRIDGE_EVENTS = [
169
349
  "task.started",
@@ -173,13 +353,13 @@ var BRIDGE_EVENTS = [
173
353
  "task.cancelled"
174
354
  ];
175
355
  function isSystemHelloResult(value) {
176
- return isRecord2(value) && typeof value.cliVersion === "string" && isValidProtocolVersion(value.protocolVersion) && isBridgeCapabilities(value.capabilities) && typeof value.pid === "number";
356
+ return isRecord4(value) && typeof value.cliVersion === "string" && isValidProtocolVersion(value.protocolVersion) && isBridgeCapabilities(value.capabilities) && typeof value.pid === "number";
177
357
  }
178
358
  function isSystemPingResult(value) {
179
- return isRecord2(value) && typeof value.now === "string";
359
+ return isRecord4(value) && typeof value.now === "string";
180
360
  }
181
361
  function isSystemShutdownResult(value) {
182
- return isRecord2(value) && value.shuttingDown === true;
362
+ return isRecord4(value) && value.shuttingDown === true;
183
363
  }
184
364
  function getBridgeResultValidator(method) {
185
365
  switch (method) {
@@ -195,6 +375,20 @@ function getBridgeResultValidator(method) {
195
375
  return isTaskCancelResult;
196
376
  case "task.list-running":
197
377
  return isTaskListRunningResult;
378
+ case "skill.marketplace-state":
379
+ return isSkillMarketplaceState;
380
+ case "skill.mutate":
381
+ return isSkillMutationResult;
382
+ case "skill.reconcile":
383
+ return isSkillReconcileResult;
384
+ case "skill.publishable":
385
+ return isSkillPublishableResult;
386
+ case "agent.marketplace-state":
387
+ return isAgentMarketplaceState;
388
+ case "agent.mutate":
389
+ return isAgentMutationResult;
390
+ case "agent.permissions":
391
+ return isAgentPermissionSummary;
198
392
  default:
199
393
  return void 0;
200
394
  }
@@ -222,13 +416,13 @@ function isBridgeEventName(value) {
222
416
  return typeof value === "string" && BRIDGE_EVENTS.includes(value);
223
417
  }
224
418
  function isBridgeRequest(value) {
225
- if (!isRecord2(value)) {
419
+ if (!isRecord4(value)) {
226
420
  return false;
227
421
  }
228
422
  return isValidProtocolVersion(value.protocolVersion) && value.kind === "request" && typeof value.id === "string" && isBridgeMethod(value.method) && "params" in value;
229
423
  }
230
424
  function isBridgeResponse(value) {
231
- if (!isRecord2(value)) {
425
+ if (!isRecord4(value)) {
232
426
  return false;
233
427
  }
234
428
  if (!isValidProtocolVersion(value.protocolVersion) || value.kind !== "response" || typeof value.id !== "string" || typeof value.ok !== "boolean") {
@@ -240,7 +434,7 @@ function isBridgeResponse(value) {
240
434
  return "error" in value;
241
435
  }
242
436
  function isBridgeEvent(value) {
243
- if (!isRecord2(value)) {
437
+ if (!isRecord4(value)) {
244
438
  return false;
245
439
  }
246
440
  return isValidProtocolVersion(value.protocolVersion) && value.kind === "event" && isBridgeEventName(value.event) && "params" in value;
@@ -248,7 +442,7 @@ function isBridgeEvent(value) {
248
442
 
249
443
  // src/cli.ts
250
444
  var SERVICEME_CLI_SCHEMA_VERSION = 1;
251
- function isRecord3(value) {
445
+ function isRecord5(value) {
252
446
  return typeof value === "object" && value !== null;
253
447
  }
254
448
  function createCliSuccess(data) {
@@ -266,7 +460,7 @@ function createCliFailure(error) {
266
460
  };
267
461
  }
268
462
  function isCliEnvelope(value) {
269
- if (!isRecord3(value)) {
463
+ if (!isRecord5(value)) {
270
464
  return false;
271
465
  }
272
466
  if (value.schemaVersion !== SERVICEME_CLI_SCHEMA_VERSION || typeof value.ok !== "boolean") {
@@ -294,23 +488,24 @@ var KNOWN_ENVIRONMENT_TOOLS = [
294
488
  "pnpm",
295
489
  "nvm",
296
490
  "nrm",
491
+ "rtk",
297
492
  "dotnet",
298
493
  "nuget"
299
494
  ];
300
- function isRecord4(value) {
495
+ function isRecord6(value) {
301
496
  return typeof value === "object" && value !== null;
302
497
  }
303
498
  function isKnownEnvironmentTool(value) {
304
499
  return KNOWN_ENVIRONMENT_TOOLS.includes(value);
305
500
  }
306
501
  function isToolCheckResult(value) {
307
- if (!isRecord4(value)) {
502
+ if (!isRecord6(value)) {
308
503
  return false;
309
504
  }
310
505
  return typeof value.installed === "boolean" && (value.version === void 0 || typeof value.version === "string") && (value.path === void 0 || typeof value.path === "string") && (value.error === void 0 || typeof value.error === "string");
311
506
  }
312
507
  function isEnvironmentCheckResult(value) {
313
- if (!isRecord4(value)) {
508
+ if (!isRecord6(value)) {
314
509
  return false;
315
510
  }
316
511
  return KNOWN_ENVIRONMENT_TOOLS.every(
@@ -359,14 +554,14 @@ var RETRYABLE_ERROR_CODES = /* @__PURE__ */ new Set([
359
554
  "executor_timeout",
360
555
  "internal_error"
361
556
  ]);
362
- function isRecord5(value) {
557
+ function isRecord7(value) {
363
558
  return typeof value === "object" && value !== null;
364
559
  }
365
560
  function isServicemeErrorCode(value) {
366
561
  return typeof value === "string" && SERVICEME_ERROR_CODES.includes(value);
367
562
  }
368
563
  function isServicemeErrorDetails(value) {
369
- if (!isRecord5(value)) {
564
+ if (!isRecord7(value)) {
370
565
  return false;
371
566
  }
372
567
  return isServicemeErrorCode(value.code) && typeof value.message === "string" && typeof value.retryable === "boolean";
@@ -406,7 +601,7 @@ function normalizeServicemeError(error, fallbackCode = "internal_error") {
406
601
  if (isServicemeErrorDetails(error)) {
407
602
  return error;
408
603
  }
409
- if (isRecord5(error)) {
604
+ if (isRecord7(error)) {
410
605
  const code = isServicemeErrorCode(error.code) ? error.code : fallbackCode;
411
606
  const message = typeof error.message === "string" ? error.message : "Unexpected serviceme error.";
412
607
  const retryable = typeof error.retryable === "boolean" ? error.retryable : isRetryableErrorCode(code);
@@ -437,32 +632,32 @@ var SERVICEME_IMAGE_FORMATS = [
437
632
  "png",
438
633
  "webp"
439
634
  ];
440
- function isRecord6(value) {
635
+ function isRecord8(value) {
441
636
  return typeof value === "object" && value !== null;
442
637
  }
443
638
  function isServiceMeImageFormat(value) {
444
639
  return typeof value === "string" && SERVICEME_IMAGE_FORMATS.includes(value);
445
640
  }
446
641
  function isServiceMeImageCompressOptions(value) {
447
- if (!isRecord6(value)) {
642
+ if (!isRecord8(value)) {
448
643
  return false;
449
644
  }
450
645
  return typeof value.quality === "number" && typeof value.replaceOriginImage === "boolean" && (value.outputPath === void 0 || typeof value.outputPath === "string") && (value.format === void 0 || isServiceMeImageFormat(value.format)) && (value.sharpModulePath === void 0 || typeof value.sharpModulePath === "string") && (value.minimumCompressionRatio === void 0 || typeof value.minimumCompressionRatio === "number");
451
646
  }
452
647
  function isServiceMeImageCompressResult(value) {
453
- if (!isRecord6(value)) {
648
+ if (!isRecord8(value)) {
454
649
  return false;
455
650
  }
456
651
  return typeof value.originalSize === "number" && typeof value.compressedSize === "number" && typeof value.compressionRatio === "number" && typeof value.outputPath === "string";
457
652
  }
458
653
  function isServiceMeImageInfo(value) {
459
- if (!isRecord6(value)) {
654
+ if (!isRecord8(value)) {
460
655
  return false;
461
656
  }
462
657
  return typeof value.width === "number" && typeof value.height === "number" && typeof value.format === "string" && typeof value.size === "number" && (value.colorSpace === void 0 || typeof value.colorSpace === "string");
463
658
  }
464
659
  function isServiceMeImageValidationResult(value) {
465
- return isRecord6(value) && typeof value.valid === "boolean";
660
+ return isRecord8(value) && typeof value.valid === "boolean";
466
661
  }
467
662
 
468
663
  // src/json.ts
@@ -481,7 +676,7 @@ var DEFAULT_JSON_SORT_OPTIONS = {
481
676
  sortOrder: "asc",
482
677
  sortAlgo: "default"
483
678
  };
484
- function isRecord7(value) {
679
+ function isRecord9(value) {
485
680
  return typeof value === "object" && value !== null;
486
681
  }
487
682
  function isJsonSortAlgorithm(value) {
@@ -491,18 +686,18 @@ function isJsonSortOrder(value) {
491
686
  return typeof value === "string" && JSON_SORT_ORDERS.includes(value);
492
687
  }
493
688
  function isJsonSortOptions(value) {
494
- return isRecord7(value) && isJsonSortOrder(value.sortOrder) && isJsonSortAlgorithm(value.sortAlgo);
689
+ return isRecord9(value) && isJsonSortOrder(value.sortOrder) && isJsonSortAlgorithm(value.sortAlgo);
495
690
  }
496
691
  function isJsonValidationResult(value) {
497
- return isRecord7(value) && typeof value.valid === "boolean" && (value.error === void 0 || typeof value.error === "string");
692
+ return isRecord9(value) && typeof value.valid === "boolean" && (value.error === void 0 || typeof value.error === "string");
498
693
  }
499
694
  function isJsonOutputResult(value) {
500
- return isRecord7(value) && typeof value.output === "string";
695
+ return isRecord9(value) && typeof value.output === "string";
501
696
  }
502
697
 
503
698
  // src/metadata.ts
504
699
  var SERVICEME_CLI_NAME = "serviceme";
505
- var SERVICEME_CLI_VERSION = "0.1.4";
700
+ var SERVICEME_CLI_VERSION = "0.1.6";
506
701
  var SERVICEME_CLI_CAPABILITIES = {
507
702
  bridge: true,
508
703
  tasks: 1,
@@ -513,32 +708,32 @@ var SERVICEME_CLI_CAPABILITIES = {
513
708
  };
514
709
 
515
710
  // src/project.ts
516
- function isRecord8(value) {
711
+ function isRecord10(value) {
517
712
  return typeof value === "object" && value !== null;
518
713
  }
519
714
  function isServiceMeProjectScaffoldPruneResult(value) {
520
- if (!isRecord8(value)) {
715
+ if (!isRecord10(value)) {
521
716
  return false;
522
717
  }
523
718
  return typeof value.applied === "boolean" && typeof value.preset === "string" && Array.isArray(value.commands) && value.commands.every((command) => typeof command === "string");
524
719
  }
525
720
  function isServiceMeProjectGitInitResult(value) {
526
- return isRecord8(value) && typeof value.initialized === "boolean" && typeof value.command === "string";
721
+ return isRecord10(value) && typeof value.initialized === "boolean" && typeof value.command === "string";
527
722
  }
528
723
  function isServiceMeProjectMakeScriptsExecutableResult(value) {
529
- if (!isRecord8(value)) {
724
+ if (!isRecord10(value)) {
530
725
  return false;
531
726
  }
532
727
  return typeof value.processedCount === "number" && typeof value.updatedCount === "number" && typeof value.platform === "string" && Array.isArray(value.scripts) && value.scripts.every((script) => typeof script === "string");
533
728
  }
534
729
  function isServiceMeProjectInstallDepsResult(value) {
535
- return isRecord8(value) && typeof value.installed === "boolean" && typeof value.command === "string";
730
+ return isRecord10(value) && typeof value.installed === "boolean" && typeof value.command === "string";
536
731
  }
537
732
  function isServiceMeProjectExtractTemplateInput(value) {
538
- return isRecord8(value) && typeof value.extractedDirName === "string" && typeof value.projectFilePattern === "string";
733
+ return isRecord10(value) && typeof value.extractedDirName === "string" && typeof value.projectFilePattern === "string";
539
734
  }
540
735
  function isServiceMeProjectExtractTemplateResult(value) {
541
- return isRecord8(value) && typeof value.actualDirName === "string";
736
+ return isRecord10(value) && typeof value.actualDirName === "string";
542
737
  }
543
738
  // Annotate the CommonJS export names for ESM import in node:
544
739
  0 && (module.exports = {
@@ -562,6 +757,11 @@ function isServiceMeProjectExtractTemplateResult(value) {
562
757
  createServicemeError,
563
758
  getBridgeEventParamsValidator,
564
759
  getBridgeResultValidator,
760
+ isAgentMarketplaceState,
761
+ isAgentMutationRequest,
762
+ isAgentMutationResult,
763
+ isAgentPermissionSummary,
764
+ isAgentPermissionsResult,
565
765
  isAgentSessionStatus,
566
766
  isBridgeCapabilities,
567
767
  isBridgeEvent,
@@ -594,6 +794,11 @@ function isServiceMeProjectExtractTemplateResult(value) {
594
794
  isServiceMeProjectScaffoldPruneResult,
595
795
  isServicemeErrorCode,
596
796
  isServicemeErrorDetails,
797
+ isSkillMarketplaceState,
798
+ isSkillMutationRequest,
799
+ isSkillMutationResult,
800
+ isSkillPublishableResult,
801
+ isSkillReconcileResult,
597
802
  isSystemHelloResult,
598
803
  isSystemPingResult,
599
804
  isSystemShutdownResult,