@serviceme/devtools-protocol 0.1.5 → 0.1.7

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") {
@@ -298,20 +492,20 @@ var KNOWN_ENVIRONMENT_TOOLS = [
298
492
  "dotnet",
299
493
  "nuget"
300
494
  ];
301
- function isRecord4(value) {
495
+ function isRecord6(value) {
302
496
  return typeof value === "object" && value !== null;
303
497
  }
304
498
  function isKnownEnvironmentTool(value) {
305
499
  return KNOWN_ENVIRONMENT_TOOLS.includes(value);
306
500
  }
307
501
  function isToolCheckResult(value) {
308
- if (!isRecord4(value)) {
502
+ if (!isRecord6(value)) {
309
503
  return false;
310
504
  }
311
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");
312
506
  }
313
507
  function isEnvironmentCheckResult(value) {
314
- if (!isRecord4(value)) {
508
+ if (!isRecord6(value)) {
315
509
  return false;
316
510
  }
317
511
  return KNOWN_ENVIRONMENT_TOOLS.every(
@@ -348,6 +542,7 @@ var SERVICEME_ERROR_CODES = [
348
542
  "executor_timeout",
349
543
  "executor_error",
350
544
  "task_already_running",
545
+ "not_found",
351
546
  "internal_error"
352
547
  ];
353
548
  var RETRYABLE_ERROR_CODES = /* @__PURE__ */ new Set([
@@ -360,14 +555,14 @@ var RETRYABLE_ERROR_CODES = /* @__PURE__ */ new Set([
360
555
  "executor_timeout",
361
556
  "internal_error"
362
557
  ]);
363
- function isRecord5(value) {
558
+ function isRecord7(value) {
364
559
  return typeof value === "object" && value !== null;
365
560
  }
366
561
  function isServicemeErrorCode(value) {
367
562
  return typeof value === "string" && SERVICEME_ERROR_CODES.includes(value);
368
563
  }
369
564
  function isServicemeErrorDetails(value) {
370
- if (!isRecord5(value)) {
565
+ if (!isRecord7(value)) {
371
566
  return false;
372
567
  }
373
568
  return isServicemeErrorCode(value.code) && typeof value.message === "string" && typeof value.retryable === "boolean";
@@ -407,7 +602,7 @@ function normalizeServicemeError(error, fallbackCode = "internal_error") {
407
602
  if (isServicemeErrorDetails(error)) {
408
603
  return error;
409
604
  }
410
- if (isRecord5(error)) {
605
+ if (isRecord7(error)) {
411
606
  const code = isServicemeErrorCode(error.code) ? error.code : fallbackCode;
412
607
  const message = typeof error.message === "string" ? error.message : "Unexpected serviceme error.";
413
608
  const retryable = typeof error.retryable === "boolean" ? error.retryable : isRetryableErrorCode(code);
@@ -438,32 +633,32 @@ var SERVICEME_IMAGE_FORMATS = [
438
633
  "png",
439
634
  "webp"
440
635
  ];
441
- function isRecord6(value) {
636
+ function isRecord8(value) {
442
637
  return typeof value === "object" && value !== null;
443
638
  }
444
639
  function isServiceMeImageFormat(value) {
445
640
  return typeof value === "string" && SERVICEME_IMAGE_FORMATS.includes(value);
446
641
  }
447
642
  function isServiceMeImageCompressOptions(value) {
448
- if (!isRecord6(value)) {
643
+ if (!isRecord8(value)) {
449
644
  return false;
450
645
  }
451
646
  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");
452
647
  }
453
648
  function isServiceMeImageCompressResult(value) {
454
- if (!isRecord6(value)) {
649
+ if (!isRecord8(value)) {
455
650
  return false;
456
651
  }
457
652
  return typeof value.originalSize === "number" && typeof value.compressedSize === "number" && typeof value.compressionRatio === "number" && typeof value.outputPath === "string";
458
653
  }
459
654
  function isServiceMeImageInfo(value) {
460
- if (!isRecord6(value)) {
655
+ if (!isRecord8(value)) {
461
656
  return false;
462
657
  }
463
658
  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");
464
659
  }
465
660
  function isServiceMeImageValidationResult(value) {
466
- return isRecord6(value) && typeof value.valid === "boolean";
661
+ return isRecord8(value) && typeof value.valid === "boolean";
467
662
  }
468
663
 
469
664
  // src/json.ts
@@ -482,7 +677,7 @@ var DEFAULT_JSON_SORT_OPTIONS = {
482
677
  sortOrder: "asc",
483
678
  sortAlgo: "default"
484
679
  };
485
- function isRecord7(value) {
680
+ function isRecord9(value) {
486
681
  return typeof value === "object" && value !== null;
487
682
  }
488
683
  function isJsonSortAlgorithm(value) {
@@ -492,18 +687,18 @@ function isJsonSortOrder(value) {
492
687
  return typeof value === "string" && JSON_SORT_ORDERS.includes(value);
493
688
  }
494
689
  function isJsonSortOptions(value) {
495
- return isRecord7(value) && isJsonSortOrder(value.sortOrder) && isJsonSortAlgorithm(value.sortAlgo);
690
+ return isRecord9(value) && isJsonSortOrder(value.sortOrder) && isJsonSortAlgorithm(value.sortAlgo);
496
691
  }
497
692
  function isJsonValidationResult(value) {
498
- return isRecord7(value) && typeof value.valid === "boolean" && (value.error === void 0 || typeof value.error === "string");
693
+ return isRecord9(value) && typeof value.valid === "boolean" && (value.error === void 0 || typeof value.error === "string");
499
694
  }
500
695
  function isJsonOutputResult(value) {
501
- return isRecord7(value) && typeof value.output === "string";
696
+ return isRecord9(value) && typeof value.output === "string";
502
697
  }
503
698
 
504
699
  // src/metadata.ts
505
700
  var SERVICEME_CLI_NAME = "serviceme";
506
- var SERVICEME_CLI_VERSION = "0.1.5";
701
+ var SERVICEME_CLI_VERSION = "0.1.7";
507
702
  var SERVICEME_CLI_CAPABILITIES = {
508
703
  bridge: true,
509
704
  tasks: 1,
@@ -514,32 +709,32 @@ var SERVICEME_CLI_CAPABILITIES = {
514
709
  };
515
710
 
516
711
  // src/project.ts
517
- function isRecord8(value) {
712
+ function isRecord10(value) {
518
713
  return typeof value === "object" && value !== null;
519
714
  }
520
715
  function isServiceMeProjectScaffoldPruneResult(value) {
521
- if (!isRecord8(value)) {
716
+ if (!isRecord10(value)) {
522
717
  return false;
523
718
  }
524
719
  return typeof value.applied === "boolean" && typeof value.preset === "string" && Array.isArray(value.commands) && value.commands.every((command) => typeof command === "string");
525
720
  }
526
721
  function isServiceMeProjectGitInitResult(value) {
527
- return isRecord8(value) && typeof value.initialized === "boolean" && typeof value.command === "string";
722
+ return isRecord10(value) && typeof value.initialized === "boolean" && typeof value.command === "string";
528
723
  }
529
724
  function isServiceMeProjectMakeScriptsExecutableResult(value) {
530
- if (!isRecord8(value)) {
725
+ if (!isRecord10(value)) {
531
726
  return false;
532
727
  }
533
728
  return typeof value.processedCount === "number" && typeof value.updatedCount === "number" && typeof value.platform === "string" && Array.isArray(value.scripts) && value.scripts.every((script) => typeof script === "string");
534
729
  }
535
730
  function isServiceMeProjectInstallDepsResult(value) {
536
- return isRecord8(value) && typeof value.installed === "boolean" && typeof value.command === "string";
731
+ return isRecord10(value) && typeof value.installed === "boolean" && typeof value.command === "string";
537
732
  }
538
733
  function isServiceMeProjectExtractTemplateInput(value) {
539
- return isRecord8(value) && typeof value.extractedDirName === "string" && typeof value.projectFilePattern === "string";
734
+ return isRecord10(value) && typeof value.extractedDirName === "string" && typeof value.projectFilePattern === "string";
540
735
  }
541
736
  function isServiceMeProjectExtractTemplateResult(value) {
542
- return isRecord8(value) && typeof value.actualDirName === "string";
737
+ return isRecord10(value) && typeof value.actualDirName === "string";
543
738
  }
544
739
  // Annotate the CommonJS export names for ESM import in node:
545
740
  0 && (module.exports = {
@@ -563,6 +758,11 @@ function isServiceMeProjectExtractTemplateResult(value) {
563
758
  createServicemeError,
564
759
  getBridgeEventParamsValidator,
565
760
  getBridgeResultValidator,
761
+ isAgentMarketplaceState,
762
+ isAgentMutationRequest,
763
+ isAgentMutationResult,
764
+ isAgentPermissionSummary,
765
+ isAgentPermissionsResult,
566
766
  isAgentSessionStatus,
567
767
  isBridgeCapabilities,
568
768
  isBridgeEvent,
@@ -595,6 +795,11 @@ function isServiceMeProjectExtractTemplateResult(value) {
595
795
  isServiceMeProjectScaffoldPruneResult,
596
796
  isServicemeErrorCode,
597
797
  isServicemeErrorDetails,
798
+ isSkillMarketplaceState,
799
+ isSkillMutationRequest,
800
+ isSkillMutationResult,
801
+ isSkillPublishableResult,
802
+ isSkillReconcileResult,
598
803
  isSystemHelloResult,
599
804
  isSystemPingResult,
600
805
  isSystemShutdownResult,