@kb-labs/marketplace-api 2.14.0 → 2.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -4,193 +4,167 @@ import { randomUUID } from 'crypto';
4
4
 
5
5
  // src/server.ts
6
6
 
7
- // src/routes/install.ts
8
- function installRoute(app) {
9
- app.post("/install", {
7
+ // src/routes/packages.ts
8
+ function registerPackagesRoutes(app) {
9
+ app.get("/packages", {
10
10
  schema: {
11
11
  tags: ["Marketplace"],
12
- summary: "Install package(s)",
13
- body: {
12
+ summary: "List installed packages",
13
+ querystring: {
14
14
  type: "object",
15
- required: ["specs"],
16
15
  properties: {
17
- specs: { type: "array", items: { type: "string" } },
18
- dev: { type: "boolean" }
16
+ kind: { type: "string", description: "Filter by entity kind (plugin, adapter, \u2026)" }
19
17
  }
20
18
  }
21
19
  }
22
20
  }, async (request, reply) => {
23
- const { specs, dev } = request.body;
24
- const service = app.marketplace;
25
- const result = await app.observability.observeOperation("marketplace.install", () => service.install(specs, { dev }));
26
- return reply.send(result);
21
+ const { kind } = request.query;
22
+ const entries = await app.observability.observeOperation(
23
+ "marketplace.list",
24
+ () => app.marketplace.list(kind ? { kind } : void 0)
25
+ );
26
+ return reply.send({ entries, total: entries.length });
27
27
  });
28
- }
29
-
30
- // src/routes/uninstall.ts
31
- function uninstallRoute(app) {
32
- app.post("/uninstall", {
28
+ app.post("/packages", {
33
29
  schema: {
34
30
  tags: ["Marketplace"],
35
- summary: "Uninstall package(s)",
31
+ summary: "Install package(s)",
36
32
  body: {
37
33
  type: "object",
38
- required: ["packageIds"],
34
+ required: ["specs"],
39
35
  properties: {
40
- packageIds: { type: "array", items: { type: "string" } }
36
+ specs: { type: "array", items: { type: "string" }, description: "Package specs (name, name@version, etc.)" },
37
+ dev: { type: "boolean", description: "Install as dev dependency" }
41
38
  }
42
39
  }
43
40
  }
44
41
  }, async (request, reply) => {
45
- const { packageIds } = request.body;
46
- const service = app.marketplace;
47
- await app.observability.observeOperation("marketplace.uninstall", () => service.uninstall(packageIds));
48
- return reply.send({ ok: true, removed: packageIds });
42
+ const { specs, dev } = request.body;
43
+ const result = await app.observability.observeOperation(
44
+ "marketplace.install",
45
+ () => app.marketplace.install(specs, { dev })
46
+ );
47
+ return reply.code(201).send(result);
49
48
  });
50
- }
51
-
52
- // src/routes/update.ts
53
- function updateRoute(app) {
54
- app.post("/update", {
49
+ app.delete("/packages", {
55
50
  schema: {
56
51
  tags: ["Marketplace"],
57
- summary: "Update installed package(s)",
52
+ summary: "Uninstall package(s)",
58
53
  body: {
59
54
  type: "object",
55
+ required: ["packageIds"],
60
56
  properties: {
61
57
  packageIds: { type: "array", items: { type: "string" } }
62
58
  }
63
59
  }
64
60
  }
65
61
  }, async (request, reply) => {
66
- const { packageIds } = request.body ?? {};
67
- const service = app.marketplace;
68
- const result = await app.observability.observeOperation("marketplace.update", () => service.update(packageIds));
69
- return reply.send(result);
62
+ const { packageIds } = request.body;
63
+ await app.observability.observeOperation(
64
+ "marketplace.uninstall",
65
+ () => app.marketplace.uninstall(packageIds)
66
+ );
67
+ return reply.code(204).send();
70
68
  });
71
- }
72
-
73
- // src/routes/list.ts
74
- function listRoute(app) {
75
- app.get("/list", {
69
+ app.patch("/packages/:id", {
76
70
  schema: {
77
71
  tags: ["Marketplace"],
78
- summary: "List installed packages",
79
- querystring: {
72
+ summary: "Update package state (enable or disable)",
73
+ params: {
80
74
  type: "object",
75
+ required: ["id"],
81
76
  properties: {
82
- kind: { type: "string" }
77
+ id: { type: "string" }
83
78
  }
84
- }
85
- }
86
- }, async (request, reply) => {
87
- const { kind } = request.query;
88
- const service = app.marketplace;
89
- const entries = await app.observability.observeOperation(
90
- "marketplace.list",
91
- () => service.list(kind ? { kind } : void 0)
92
- );
93
- return reply.send({ entries, total: entries.length });
94
- });
95
- }
96
-
97
- // src/routes/enable-disable.ts
98
- function enableDisableRoute(app) {
99
- app.post("/enable", {
100
- schema: {
101
- tags: ["Marketplace"],
102
- summary: "Enable a package",
79
+ },
103
80
  body: {
104
81
  type: "object",
105
- required: ["packageId"],
82
+ required: ["enabled"],
106
83
  properties: {
107
- packageId: { type: "string" }
84
+ enabled: { type: "boolean" }
108
85
  }
109
86
  }
110
87
  }
111
88
  }, async (request, reply) => {
112
- const { packageId } = request.body;
113
- const service = app.marketplace;
114
- await app.observability.observeOperation("marketplace.enable", () => service.enable(packageId));
115
- return reply.send({ ok: true, packageId, enabled: true });
89
+ const { id } = request.params;
90
+ const { enabled } = request.body;
91
+ const operation = enabled ? "marketplace.enable" : "marketplace.disable";
92
+ const method = enabled ? () => app.marketplace.enable(id) : () => app.marketplace.disable(id);
93
+ await app.observability.observeOperation(operation, method);
94
+ return reply.send({ id, enabled });
116
95
  });
117
- app.post("/disable", {
96
+ app.post("/packages/:id/update", {
118
97
  schema: {
119
98
  tags: ["Marketplace"],
120
- summary: "Disable a package",
121
- body: {
99
+ summary: "Update package to latest version",
100
+ params: {
122
101
  type: "object",
123
- required: ["packageId"],
102
+ required: ["id"],
124
103
  properties: {
125
- packageId: { type: "string" }
104
+ id: { type: "string" }
126
105
  }
127
106
  }
128
107
  }
129
108
  }, async (request, reply) => {
130
- const { packageId } = request.body;
131
- const service = app.marketplace;
132
- await app.observability.observeOperation("marketplace.disable", () => service.disable(packageId));
133
- return reply.send({ ok: true, packageId, enabled: false });
109
+ const { id } = request.params;
110
+ const result = await app.observability.observeOperation(
111
+ "marketplace.update",
112
+ () => app.marketplace.update([id])
113
+ );
114
+ return reply.send(result);
134
115
  });
135
- }
136
-
137
- // src/routes/link-unlink.ts
138
- function linkUnlinkRoute(app) {
139
- app.post("/link", {
116
+ app.post("/packages/:id/link", {
140
117
  schema: {
141
118
  tags: ["Marketplace"],
142
- summary: "Link a local package for development",
119
+ summary: "Link a local package path for development",
120
+ params: {
121
+ type: "object",
122
+ required: ["id"],
123
+ properties: {
124
+ id: { type: "string" }
125
+ }
126
+ },
143
127
  body: {
144
128
  type: "object",
145
129
  required: ["path"],
146
130
  properties: {
147
- path: { type: "string" }
131
+ path: { type: "string", description: "Absolute path to local package" }
148
132
  }
149
133
  }
150
134
  }
151
135
  }, async (request, reply) => {
152
136
  const { path } = request.body;
153
- const service = app.marketplace;
154
- const result = await app.observability.observeOperation("marketplace.link", () => service.link(path));
155
- return reply.send({ ok: true, ...result });
137
+ const result = await app.observability.observeOperation(
138
+ "marketplace.link",
139
+ () => app.marketplace.link(path)
140
+ );
141
+ return reply.send(result);
156
142
  });
157
- app.post("/unlink", {
143
+ app.delete("/packages/:id/link", {
158
144
  schema: {
159
145
  tags: ["Marketplace"],
160
- summary: "Unlink a package",
161
- body: {
146
+ summary: "Unlink a local package",
147
+ params: {
162
148
  type: "object",
163
- required: ["packageId"],
149
+ required: ["id"],
164
150
  properties: {
165
- packageId: { type: "string" }
151
+ id: { type: "string" }
166
152
  }
167
153
  }
168
154
  }
169
155
  }, async (request, reply) => {
170
- const { packageId } = request.body;
171
- const service = app.marketplace;
172
- await app.observability.observeOperation("marketplace.unlink", () => service.unlink(packageId));
173
- return reply.send({ ok: true, packageId });
174
- });
175
- }
176
-
177
- // src/routes/doctor.ts
178
- function doctorRoute(app) {
179
- app.get("/doctor", {
180
- schema: {
181
- tags: ["Marketplace"],
182
- summary: "Diagnose marketplace health"
183
- }
184
- }, async (_request, reply) => {
185
- const service = app.marketplace;
186
- const report = await app.observability.observeOperation("marketplace.doctor", () => service.doctor());
187
- return reply.send(report);
156
+ const { id } = request.params;
157
+ await app.observability.observeOperation(
158
+ "marketplace.unlink",
159
+ () => app.marketplace.unlink(id)
160
+ );
161
+ return reply.code(204).send();
188
162
  });
189
163
  }
190
164
 
191
- // src/routes/sync.ts
192
- function syncRoute(app) {
193
- app.post("/sync", {
165
+ // src/routes/workspace.ts
166
+ function registerWorkspaceRoutes(app) {
167
+ app.post("/workspace/sync", {
194
168
  schema: {
195
169
  tags: ["Marketplace"],
196
170
  summary: "Sync workspace \u2014 scan for plugins/adapters and populate lock",
@@ -198,30 +172,55 @@ function syncRoute(app) {
198
172
  type: "object",
199
173
  required: ["include"],
200
174
  properties: {
201
- include: { type: "array", items: { type: "string" }, description: "Glob patterns to scan (relative to workspace root)" },
202
- exclude: { type: "array", items: { type: "string" }, description: "Optional patterns to skip" },
203
- autoEnable: { type: "boolean", description: "Enable new entries (default: false, safe for prod)" }
175
+ include: {
176
+ type: "array",
177
+ items: { type: "string" },
178
+ description: "Glob patterns to scan (relative to workspace root)"
179
+ },
180
+ exclude: {
181
+ type: "array",
182
+ items: { type: "string" },
183
+ description: "Patterns to skip"
184
+ },
185
+ autoEnable: {
186
+ type: "boolean",
187
+ description: "Auto-enable newly discovered entries (default: false)"
188
+ }
204
189
  }
205
190
  }
206
191
  }
207
192
  }, async (request, reply) => {
208
193
  const body = request.body;
209
- const result = await app.observability.observeOperation("marketplace.sync", () => app.marketplace.sync(body));
194
+ const result = await app.observability.observeOperation(
195
+ "marketplace.sync",
196
+ () => app.marketplace.sync(body)
197
+ );
210
198
  return reply.send(result);
211
199
  });
212
200
  }
213
201
 
202
+ // src/routes/diagnostics.ts
203
+ function registerDiagnosticsRoutes(app) {
204
+ app.get("/diagnostics", {
205
+ schema: {
206
+ tags: ["Marketplace"],
207
+ summary: "Marketplace health and diagnostics report"
208
+ }
209
+ }, async (_request, reply) => {
210
+ const report = await app.observability.observeOperation(
211
+ "marketplace.doctor",
212
+ () => app.marketplace.doctor()
213
+ );
214
+ return reply.send(report);
215
+ });
216
+ }
217
+
214
218
  // src/routes/index.ts
215
219
  async function registerRoutes(server) {
216
220
  await server.register(async (app) => {
217
- installRoute(app);
218
- uninstallRoute(app);
219
- updateRoute(app);
220
- listRoute(app);
221
- enableDisableRoute(app);
222
- linkUnlinkRoute(app);
223
- doctorRoute(app);
224
- syncRoute(app);
221
+ registerPackagesRoutes(app);
222
+ registerWorkspaceRoutes(app);
223
+ registerDiagnosticsRoutes(app);
225
224
  }, { prefix: "/api/v1/marketplace" });
226
225
  }
227
226
  var DEFAULT_PORT = 5070;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/routes/install.ts","../src/routes/uninstall.ts","../src/routes/update.ts","../src/routes/list.ts","../src/routes/enable-disable.ts","../src/routes/link-unlink.ts","../src/routes/doctor.ts","../src/routes/sync.ts","../src/routes/index.ts","../src/server.ts"],"names":["logger"],"mappings":";;;;;;;AAGO,SAAS,aAAa,GAAA,EAA4B;AACvD,EAAA,GAAA,CAAI,KAAK,UAAA,EAAY;AAAA,IACnB,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,CAAC,aAAa,CAAA;AAAA,MACpB,OAAA,EAAS,oBAAA;AAAA,MACT,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,QAAA;AAAA,QACN,QAAA,EAAU,CAAC,OAAO,CAAA;AAAA,QAClB,UAAA,EAAY;AAAA,UACV,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,UAClD,GAAA,EAAK,EAAE,IAAA,EAAM,SAAA;AAAU;AACzB;AACF;AACF,GACF,EAAG,OAAO,OAAA,EAAS,KAAA,KAAU;AAC3B,IAAA,MAAM,EAAE,KAAA,EAAO,GAAA,EAAI,GAAI,OAAA,CAAQ,IAAA;AAC/B,IAAA,MAAM,UAAU,GAAA,CAAI,WAAA;AACpB,IAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,aAAA,CAAc,gBAAA,CAAiB,qBAAA,EAAuB,MAAM,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO,EAAE,GAAA,EAAK,CAAC,CAAA;AACpH,IAAA,OAAO,KAAA,CAAM,KAAK,MAAM,CAAA;AAAA,EAC1B,CAAC,CAAA;AACH;;;ACpBO,SAAS,eAAe,GAAA,EAA4B;AACzD,EAAA,GAAA,CAAI,KAAK,YAAA,EAAc;AAAA,IACrB,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,CAAC,aAAa,CAAA;AAAA,MACpB,OAAA,EAAS,sBAAA;AAAA,MACT,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,QAAA;AAAA,QACN,QAAA,EAAU,CAAC,YAAY,CAAA;AAAA,QACvB,UAAA,EAAY;AAAA,UACV,UAAA,EAAY,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,EAAE,IAAA,EAAM,UAAS;AAAE;AACzD;AACF;AACF,GACF,EAAG,OAAO,OAAA,EAAS,KAAA,KAAU;AAC3B,IAAA,MAAM,EAAE,UAAA,EAAW,GAAI,OAAA,CAAQ,IAAA;AAC/B,IAAA,MAAM,UAAU,GAAA,CAAI,WAAA;AACpB,IAAA,MAAM,GAAA,CAAI,cAAc,gBAAA,CAAiB,uBAAA,EAAyB,MAAM,OAAA,CAAQ,SAAA,CAAU,UAAU,CAAC,CAAA;AACrG,IAAA,OAAO,MAAM,IAAA,CAAK,EAAE,IAAI,IAAA,EAAM,OAAA,EAAS,YAAY,CAAA;AAAA,EACrD,CAAC,CAAA;AACH;;;ACnBO,SAAS,YAAY,GAAA,EAA4B;AACtD,EAAA,GAAA,CAAI,KAAK,SAAA,EAAW;AAAA,IAClB,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,CAAC,aAAa,CAAA;AAAA,MACpB,OAAA,EAAS,6BAAA;AAAA,MACT,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,UAAA,EAAY,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,EAAE,IAAA,EAAM,UAAS;AAAE;AACzD;AACF;AACF,GACF,EAAG,OAAO,OAAA,EAAS,KAAA,KAAU;AAC3B,IAAA,MAAM,EAAE,UAAA,EAAW,GAAK,OAAA,CAAQ,QAAsC,EAAC;AACvE,IAAA,MAAM,UAAU,GAAA,CAAI,WAAA;AACpB,IAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,aAAA,CAAc,gBAAA,CAAiB,sBAAsB,MAAM,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAC,CAAA;AAC9G,IAAA,OAAO,KAAA,CAAM,KAAK,MAAM,CAAA;AAAA,EAC1B,CAAC,CAAA;AACH;;;ACjBO,SAAS,UAAU,GAAA,EAA4B;AACpD,EAAA,GAAA,CAAI,IAAI,OAAA,EAAS;AAAA,IACf,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,CAAC,aAAa,CAAA;AAAA,MACpB,OAAA,EAAS,yBAAA;AAAA,MACT,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA;AAAS;AACzB;AACF;AACF,GACF,EAAG,OAAO,OAAA,EAAS,KAAA,KAAU;AAC3B,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,OAAA,CAAQ,KAAA;AACzB,IAAA,MAAM,UAAU,GAAA,CAAI,WAAA;AACpB,IAAA,MAAM,OAAA,GAAU,MAAM,GAAA,CAAI,aAAA,CAAc,gBAAA;AAAA,MACtC,kBAAA;AAAA,MACA,MAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,EAAE,IAAA,KAA6B,MAAS;AAAA,KACpE;AACA,IAAA,OAAO,MAAM,IAAA,CAAK,EAAE,SAAS,KAAA,EAAO,OAAA,CAAQ,QAAQ,CAAA;AAAA,EACtD,CAAC,CAAA;AACH;;;ACtBO,SAAS,mBAAmB,GAAA,EAA4B;AAC7D,EAAA,GAAA,CAAI,KAAK,SAAA,EAAW;AAAA,IAClB,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,CAAC,aAAa,CAAA;AAAA,MACpB,OAAA,EAAS,kBAAA;AAAA,MACT,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,QAAA;AAAA,QACN,QAAA,EAAU,CAAC,WAAW,CAAA;AAAA,QACtB,UAAA,EAAY;AAAA,UACV,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA;AAAS;AAC9B;AACF;AACF,GACF,EAAG,OAAO,OAAA,EAAS,KAAA,KAAU;AAC3B,IAAA,MAAM,EAAE,SAAA,EAAU,GAAI,OAAA,CAAQ,IAAA;AAC9B,IAAA,MAAM,UAAU,GAAA,CAAI,WAAA;AACpB,IAAA,MAAM,GAAA,CAAI,cAAc,gBAAA,CAAiB,oBAAA,EAAsB,MAAM,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAC,CAAA;AAC9F,IAAA,OAAO,KAAA,CAAM,KAAK,EAAE,EAAA,EAAI,MAAM,SAAA,EAAW,OAAA,EAAS,MAAM,CAAA;AAAA,EAC1D,CAAC,CAAA;AAED,EAAA,GAAA,CAAI,KAAK,UAAA,EAAY;AAAA,IACnB,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,CAAC,aAAa,CAAA;AAAA,MACpB,OAAA,EAAS,mBAAA;AAAA,MACT,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,QAAA;AAAA,QACN,QAAA,EAAU,CAAC,WAAW,CAAA;AAAA,QACtB,UAAA,EAAY;AAAA,UACV,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA;AAAS;AAC9B;AACF;AACF,GACF,EAAG,OAAO,OAAA,EAAS,KAAA,KAAU;AAC3B,IAAA,MAAM,EAAE,SAAA,EAAU,GAAI,OAAA,CAAQ,IAAA;AAC9B,IAAA,MAAM,UAAU,GAAA,CAAI,WAAA;AACpB,IAAA,MAAM,GAAA,CAAI,cAAc,gBAAA,CAAiB,qBAAA,EAAuB,MAAM,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAC,CAAA;AAChG,IAAA,OAAO,KAAA,CAAM,KAAK,EAAE,EAAA,EAAI,MAAM,SAAA,EAAW,OAAA,EAAS,OAAO,CAAA;AAAA,EAC3D,CAAC,CAAA;AACH;;;ACtCO,SAAS,gBAAgB,GAAA,EAA4B;AAC1D,EAAA,GAAA,CAAI,KAAK,OAAA,EAAS;AAAA,IAChB,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,CAAC,aAAa,CAAA;AAAA,MACpB,OAAA,EAAS,sCAAA;AAAA,MACT,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,QAAA;AAAA,QACN,QAAA,EAAU,CAAC,MAAM,CAAA;AAAA,QACjB,UAAA,EAAY;AAAA,UACV,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA;AAAS;AACzB;AACF;AACF,GACF,EAAG,OAAO,OAAA,EAAS,KAAA,KAAU;AAC3B,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,OAAA,CAAQ,IAAA;AACzB,IAAA,MAAM,UAAU,GAAA,CAAI,WAAA;AACpB,IAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,aAAA,CAAc,gBAAA,CAAiB,oBAAoB,MAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA;AACpG,IAAA,OAAO,MAAM,IAAA,CAAK,EAAE,IAAI,IAAA,EAAM,GAAG,QAAQ,CAAA;AAAA,EAC3C,CAAC,CAAA;AAED,EAAA,GAAA,CAAI,KAAK,SAAA,EAAW;AAAA,IAClB,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,CAAC,aAAa,CAAA;AAAA,MACpB,OAAA,EAAS,kBAAA;AAAA,MACT,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,QAAA;AAAA,QACN,QAAA,EAAU,CAAC,WAAW,CAAA;AAAA,QACtB,UAAA,EAAY;AAAA,UACV,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA;AAAS;AAC9B;AACF;AACF,GACF,EAAG,OAAO,OAAA,EAAS,KAAA,KAAU;AAC3B,IAAA,MAAM,EAAE,SAAA,EAAU,GAAI,OAAA,CAAQ,IAAA;AAC9B,IAAA,MAAM,UAAU,GAAA,CAAI,WAAA;AACpB,IAAA,MAAM,GAAA,CAAI,cAAc,gBAAA,CAAiB,oBAAA,EAAsB,MAAM,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAC,CAAA;AAC9F,IAAA,OAAO,MAAM,IAAA,CAAK,EAAE,EAAA,EAAI,IAAA,EAAM,WAAW,CAAA;AAAA,EAC3C,CAAC,CAAA;AACH;;;ACtCO,SAAS,YAAY,GAAA,EAA4B;AACtD,EAAA,GAAA,CAAI,IAAI,SAAA,EAAW;AAAA,IACjB,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,CAAC,aAAa,CAAA;AAAA,MACpB,OAAA,EAAS;AAAA;AACX,GACF,EAAG,OAAO,QAAA,EAAU,KAAA,KAAU;AAC5B,IAAA,MAAM,UAAU,GAAA,CAAI,WAAA;AACpB,IAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,aAAA,CAAc,iBAAiB,oBAAA,EAAsB,MAAM,OAAA,CAAQ,MAAA,EAAQ,CAAA;AACpG,IAAA,OAAO,KAAA,CAAM,KAAK,MAAM,CAAA;AAAA,EAC1B,CAAC,CAAA;AACH;;;ACXO,SAAS,UAAU,GAAA,EAA4B;AACpD,EAAA,GAAA,CAAI,KAAK,OAAA,EAAS;AAAA,IAChB,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,CAAC,aAAa,CAAA;AAAA,MACpB,OAAA,EAAS,mEAAA;AAAA,MACT,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,QAAA;AAAA,QACN,QAAA,EAAU,CAAC,SAAS,CAAA;AAAA,QACpB,UAAA,EAAY;AAAA,UACV,OAAA,EAAS,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS,EAAG,WAAA,EAAa,oDAAA,EAAqD;AAAA,UACvH,OAAA,EAAS,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS,EAAG,WAAA,EAAa,2BAAA,EAA4B;AAAA,UAC9F,UAAA,EAAY,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,oDAAA;AAAqD;AACnG;AACF;AACF,GACF,EAAG,OAAO,OAAA,EAAS,KAAA,KAAU;AAC3B,IAAA,MAAM,OAAO,OAAA,CAAQ,IAAA;AAKrB,IAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,aAAA,CAAc,gBAAA,CAAiB,kBAAA,EAAoB,MAAM,GAAA,CAAI,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC,CAAA;AAC5G,IAAA,OAAO,KAAA,CAAM,KAAK,MAAM,CAAA;AAAA,EAC1B,CAAC,CAAA;AACH;;;ACZA,eAAsB,eAAe,MAAA,EAAwC;AAC3E,EAAA,MAAM,MAAA,CAAO,QAAA,CAAS,OAAO,GAAA,KAAQ;AACnC,IAAA,YAAA,CAAa,GAAG,CAAA;AAChB,IAAA,cAAA,CAAe,GAAG,CAAA;AAClB,IAAA,WAAA,CAAY,GAAG,CAAA;AACf,IAAA,SAAA,CAAU,GAAG,CAAA;AACb,IAAA,kBAAA,CAAmB,GAAG,CAAA;AACtB,IAAA,eAAA,CAAgB,GAAG,CAAA;AACnB,IAAA,WAAA,CAAY,GAAG,CAAA;AACf,IAAA,SAAA,CAAU,GAAG,CAAA;AAAA,EACf,CAAA,EAAG,EAAE,MAAA,EAAQ,qBAAA,EAAuB,CAAA;AACtC;ACTA,IAAM,YAAA,GAAe,IAAA;AAErB,SAAS,oBAAA,GAAgC;AACvC,EAAA,MAAM,KAAA,GAAQ,CAAC,SAAA,KAAgD,oBAAA,EAAqB;AACpF,EAAA,OAAO;AAAA,IACL,OAAO,MAAM;AAAA,IAAC,CAAA;AAAA,IACd,OAAO,MAAM;AAAA,IAAC,CAAA;AAAA,IACd,MAAM,MAAM;AAAA,IAAC,CAAA;AAAA,IACb,MAAM,MAAM;AAAA,IAAC,CAAA;AAAA,IACb,OAAO,MAAM;AAAA,IAAC,CAAA;AAAA,IACd,OAAO,MAAM;AAAA,IAAC,CAAA;AAAA,IACd;AAAA,GACF;AACF;AASA,eAAsB,aAAa,IAAA,EAAqD;AACtF,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,IAAQ,YAAA;AAC1B,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,IAAU,oBAAA,EAAqB;AACnD,EAAA,MAAM,aAAA,GAAgB,IAAI,0BAAA,CAA2B;AAAA,IACnD,SAAA,EAAW,aAAA;AAAA,IACX,WAAA,EAAa,UAAA;AAAA,IACb,OAAA,EAAS,OAAA;AAAA,IACT,UAAA,EAAY;AAAA,GACb,CAAA;AACD,EAAA,MAAM,SAAS,OAAA,CAAQ;AAAA,IACrB,MAAA,EAAQ;AAAA;AAAA,GACT,CAAA;AAGD,EAAA,MAAM,gBAAgB,MAAA,EAAQ;AAAA,IAC5B,KAAA,EAAO,qBAAA;AAAA,IACP,OAAA,EAAS,OAAA;AAAA,IACT,WAAA,EAAa,gEAAA;AAAA,IACb,OAAA,EAAS;AAAA,MACP,EAAE,GAAA,EAAK,CAAA,iBAAA,EAAoB,IAAI,CAAA,CAAA,EAAI,aAAa,WAAA;AAAY,KAC9D;AAAA,IACA,EAAA,EAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa;AAAA,GAC9B,CAAA;AAGD,EAAA,MAAA,CAAO,QAAA,CAAS,aAAA,EAAe,IAAA,CAAK,OAAO,CAAA;AAC3C,EAAA,MAAA,CAAO,QAAA,CAAS,iBAAiB,aAAa,CAAA;AAC9C,EAAA,aAAA,CAAc,SAAS,MAAM,CAAA;AAE7B,EAAA,MAAA,CAAO,OAAA,CAAQ,WAAA,EAAa,OAAO,OAAA,EAAS,KAAA,KAAU;AACpD,IAAA,MAAM,SAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,cAAc,KAA4B,UAAA,EAAW;AACxF,IAAA,MAAM,OAAA,GAAW,OAAA,CAAQ,OAAA,CAAQ,YAAY,KAA4B,UAAA,EAAW;AAEpF,IAAA,OAAA,CAAQ,EAAA,GAAK,SAAA;AACb,IAAA,KAAA,CAAM,MAAA,CAAO,gBAAgB,SAAS,CAAA;AACtC,IAAA,KAAA,CAAM,MAAA,CAAO,cAAc,OAAO,CAAA;AAElC,IAAC,OAAA,CAAgB,QAAA,GAAW,sBAAA,CAAuB,MAAA,EAAQ;AAAA,MACzD,SAAA,EAAW,aAAA;AAAA,MACX,UAAA,EAAY,aAAA;AAAA,MACZ,KAAA,EAAO,aAAA;AAAA,MACP,OAAA,EAAS,SAAA;AAAA,MACT,SAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,KAAK,OAAA,CAAQ,GAAA;AAAA,MACb,SAAA,EAAW;AAAA,KACZ,CAAA;AACD,IAAC,OAAA,CAAgB,QAAA,CAAS,IAAA,CAAK,CAAA,OAAA,EAAK,OAAA,CAAQ,MAAA,CAAO,WAAA,EAAa,CAAA,CAAA,EAAI,OAAA,CAAQ,GAAG,CAAA,CAAE,CAAA;AAAA,EACnF,CAAC,CAAA;AAED,EAAA,MAAA,CAAO,OAAA,CAAQ,YAAA,EAAc,OAAO,OAAA,EAAS,KAAA,KAAU;AACrD,IAAA,MAAMA,UAAU,OAAA,CAAgB,QAAA;AAChC,IAAA,IAAI,CAACA,OAAAA,EAAQ;AACX,MAAA;AAAA,IACF;AAEA,IAAAA,OAAAA,CAAO,IAAA,CAAK,CAAA,OAAA,EAAK,OAAA,CAAQ,MAAA,CAAO,WAAA,EAAa,CAAA,CAAA,EAAI,OAAA,CAAQ,GAAG,CAAA,CAAA,EAAI,KAAA,CAAM,UAAU,CAAA,CAAA,EAAI;AAAA,MAClF,YAAY,KAAA,CAAM;AAAA,KACnB,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAA,MAAA,CAAO,GAAA,CAAI,WAAW,aAAa;AAAA,IACjC,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAS,aAAA;AAAA,IACT,EAAA,EAAI,KAAK,GAAA;AAAI,GACf,CAAE,CAAA;AAEF,EAAA,MAAA,CAAO,GAAA;AAAA,IAAI,QAAA;AAAA,IAAU,YACnB,0BAAA,CAA2B;AAAA,MACzB,KAAA,EAAO,IAAA;AAAA,MACP,UAAA,EAAY;AAAA,QACV,kBAAA,EAAoB;AAAA,UAClB,KAAA,EAAO;AAAA;AACT;AACF,KACD;AAAA,GACH;AAEA,EAAA,MAAA,CAAO,GAAA,CAAI,UAAA,EAAY,OAAO,QAAA,EAAU,KAAA,KAAU;AAChD,IAAA,KAAA,CAAM,MAAA,CAAO,gBAAgB,0CAA0C,CAAA;AACvE,IAAA,OAAO,aAAA,CAAc,wBAAwB,SAAS,CAAA;AAAA,EACxD,CAAC,CAAA;AAED,EAAA,MAAA,CAAO,GAAA,CAAI,yBAAA,EAA2B,YAAY,aAAA,CAAc,eAAe,CAAA;AAE/E,EAAA,MAAA,CAAO,GAAA;AAAA,IAAI,uBAAA;AAAA,IAAyB,YAClC,cAAc,WAAA,CAAY;AAAA,MACxB,MAAA,EAAQ,SAAA;AAAA,MACR,MAAA,EAAQ;AAAA,QACN;AAAA,UACE,EAAA,EAAI,qBAAA;AAAA,UACJ,MAAA,EAAQ,IAAA;AAAA,UACR,OAAA,EAAS;AAAA;AACX,OACF;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,qBAAA,EAAuB;AAAA;AACzB,KACD;AAAA,GACH;AAGA,EAAA,MAAM,cAAc,gBAAA,CAAiB,uBAAA,EAAyB,MAAM,cAAA,CAAe,MAAM,CAAC,CAAA;AAE1F,EAAA,OAAO,MAAA;AACT","file":"index.js","sourcesContent":["import '../types.js';\nimport type { FastifyInstance } from 'fastify';\n\nexport function installRoute(app: FastifyInstance): void {\n app.post('/install', {\n schema: {\n tags: ['Marketplace'],\n summary: 'Install package(s)',\n body: {\n type: 'object',\n required: ['specs'],\n properties: {\n specs: { type: 'array', items: { type: 'string' } },\n dev: { type: 'boolean' },\n },\n },\n },\n }, async (request, reply) => {\n const { specs, dev } = request.body as { specs: string[]; dev?: boolean };\n const service = app.marketplace;\n const result = await app.observability.observeOperation('marketplace.install', () => service.install(specs, { dev }));\n return reply.send(result);\n });\n}\n","import '../types.js';\nimport type { FastifyInstance } from 'fastify';\n\nexport function uninstallRoute(app: FastifyInstance): void {\n app.post('/uninstall', {\n schema: {\n tags: ['Marketplace'],\n summary: 'Uninstall package(s)',\n body: {\n type: 'object',\n required: ['packageIds'],\n properties: {\n packageIds: { type: 'array', items: { type: 'string' } },\n },\n },\n },\n }, async (request, reply) => {\n const { packageIds } = request.body as { packageIds: string[] };\n const service = app.marketplace;\n await app.observability.observeOperation('marketplace.uninstall', () => service.uninstall(packageIds));\n return reply.send({ ok: true, removed: packageIds });\n });\n}\n","import '../types.js';\nimport type { FastifyInstance } from 'fastify';\n\nexport function updateRoute(app: FastifyInstance): void {\n app.post('/update', {\n schema: {\n tags: ['Marketplace'],\n summary: 'Update installed package(s)',\n body: {\n type: 'object',\n properties: {\n packageIds: { type: 'array', items: { type: 'string' } },\n },\n },\n },\n }, async (request, reply) => {\n const { packageIds } = (request.body as { packageIds?: string[] }) ?? {};\n const service = app.marketplace;\n const result = await app.observability.observeOperation('marketplace.update', () => service.update(packageIds));\n return reply.send(result);\n });\n}\n","import '../types.js';\nimport type { FastifyInstance } from 'fastify';\nimport type { EntityKind } from '@kb-labs/core-discovery';\n\nexport function listRoute(app: FastifyInstance): void {\n app.get('/list', {\n schema: {\n tags: ['Marketplace'],\n summary: 'List installed packages',\n querystring: {\n type: 'object',\n properties: {\n kind: { type: 'string' },\n },\n },\n },\n }, async (request, reply) => {\n const { kind } = request.query as { kind?: string };\n const service = app.marketplace;\n const entries = await app.observability.observeOperation(\n 'marketplace.list',\n () => service.list(kind ? { kind: kind as EntityKind } : undefined),\n );\n return reply.send({ entries, total: entries.length });\n });\n}\n","import '../types.js';\nimport type { FastifyInstance } from 'fastify';\n\nexport function enableDisableRoute(app: FastifyInstance): void {\n app.post('/enable', {\n schema: {\n tags: ['Marketplace'],\n summary: 'Enable a package',\n body: {\n type: 'object',\n required: ['packageId'],\n properties: {\n packageId: { type: 'string' },\n },\n },\n },\n }, async (request, reply) => {\n const { packageId } = request.body as { packageId: string };\n const service = app.marketplace;\n await app.observability.observeOperation('marketplace.enable', () => service.enable(packageId));\n return reply.send({ ok: true, packageId, enabled: true });\n });\n\n app.post('/disable', {\n schema: {\n tags: ['Marketplace'],\n summary: 'Disable a package',\n body: {\n type: 'object',\n required: ['packageId'],\n properties: {\n packageId: { type: 'string' },\n },\n },\n },\n }, async (request, reply) => {\n const { packageId } = request.body as { packageId: string };\n const service = app.marketplace;\n await app.observability.observeOperation('marketplace.disable', () => service.disable(packageId));\n return reply.send({ ok: true, packageId, enabled: false });\n });\n}\n","import '../types.js';\nimport type { FastifyInstance } from 'fastify';\n\nexport function linkUnlinkRoute(app: FastifyInstance): void {\n app.post('/link', {\n schema: {\n tags: ['Marketplace'],\n summary: 'Link a local package for development',\n body: {\n type: 'object',\n required: ['path'],\n properties: {\n path: { type: 'string' },\n },\n },\n },\n }, async (request, reply) => {\n const { path } = request.body as { path: string };\n const service = app.marketplace;\n const result = await app.observability.observeOperation('marketplace.link', () => service.link(path));\n return reply.send({ ok: true, ...result });\n });\n\n app.post('/unlink', {\n schema: {\n tags: ['Marketplace'],\n summary: 'Unlink a package',\n body: {\n type: 'object',\n required: ['packageId'],\n properties: {\n packageId: { type: 'string' },\n },\n },\n },\n }, async (request, reply) => {\n const { packageId } = request.body as { packageId: string };\n const service = app.marketplace;\n await app.observability.observeOperation('marketplace.unlink', () => service.unlink(packageId));\n return reply.send({ ok: true, packageId });\n });\n}\n","import '../types.js';\nimport type { FastifyInstance } from 'fastify';\n\nexport function doctorRoute(app: FastifyInstance): void {\n app.get('/doctor', {\n schema: {\n tags: ['Marketplace'],\n summary: 'Diagnose marketplace health',\n },\n }, async (_request, reply) => {\n const service = app.marketplace;\n const report = await app.observability.observeOperation('marketplace.doctor', () => service.doctor());\n return reply.send(report);\n });\n}\n","import '../types.js';\nimport type { FastifyInstance } from 'fastify';\n\nexport function syncRoute(app: FastifyInstance): void {\n app.post('/sync', {\n schema: {\n tags: ['Marketplace'],\n summary: 'Sync workspace — scan for plugins/adapters and populate lock',\n body: {\n type: 'object',\n required: ['include'],\n properties: {\n include: { type: 'array', items: { type: 'string' }, description: 'Glob patterns to scan (relative to workspace root)' },\n exclude: { type: 'array', items: { type: 'string' }, description: 'Optional patterns to skip' },\n autoEnable: { type: 'boolean', description: 'Enable new entries (default: false, safe for prod)' },\n },\n },\n },\n }, async (request, reply) => {\n const body = request.body as {\n include: string[];\n exclude?: string[];\n autoEnable?: boolean;\n };\n const result = await app.observability.observeOperation('marketplace.sync', () => app.marketplace.sync(body));\n return reply.send(result);\n });\n}\n","/**\n * @module @kb-labs/marketplace-api/routes\n * Register all marketplace API routes.\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport { installRoute } from './install.js';\nimport { uninstallRoute } from './uninstall.js';\nimport { updateRoute } from './update.js';\nimport { listRoute } from './list.js';\nimport { enableDisableRoute } from './enable-disable.js';\nimport { linkUnlinkRoute } from './link-unlink.js';\nimport { doctorRoute } from './doctor.js';\nimport { syncRoute } from './sync.js';\n\nexport async function registerRoutes(server: FastifyInstance): Promise<void> {\n await server.register(async (app) => {\n installRoute(app);\n uninstallRoute(app);\n updateRoute(app);\n listRoute(app);\n enableDisableRoute(app);\n linkUnlinkRoute(app);\n doctorRoute(app);\n syncRoute(app);\n }, { prefix: '/api/v1/marketplace' });\n}\n","/**\n * @module @kb-labs/marketplace-api/server\n * Fastify server factory for marketplace service.\n */\n\nimport Fastify, { type FastifyInstance } from 'fastify';\nimport {\n createCorrelatedLogger,\n HttpObservabilityCollector,\n createServiceReadyResponse,\n registerOpenAPI,\n} from '@kb-labs/shared-http';\nimport type { ILogger } from '@kb-labs/core-platform';\nimport { registerRoutes } from './routes/index.js';\nimport type { MarketplaceService } from '@kb-labs/marketplace-core';\nimport { randomUUID } from 'node:crypto';\n\nconst DEFAULT_PORT = 5070;\n\nfunction createFallbackLogger(): ILogger {\n const child = (_bindings: Record<string, unknown>): ILogger => createFallbackLogger();\n return {\n trace: () => {},\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n fatal: () => {},\n child,\n };\n}\n\nexport interface CreateServerOptions {\n service: MarketplaceService;\n logger?: ILogger;\n port?: number;\n host?: string;\n}\n\nexport async function createServer(opts: CreateServerOptions): Promise<FastifyInstance> {\n const port = opts.port ?? DEFAULT_PORT;\n const logger = opts.logger ?? createFallbackLogger();\n const observability = new HttpObservabilityCollector({\n serviceId: 'marketplace',\n serviceType: 'http-api',\n version: '0.1.0',\n logsSource: 'marketplace',\n });\n const server = Fastify({\n logger: false, // using platform.logger\n });\n\n // OpenAPI docs\n await registerOpenAPI(server, {\n title: 'KB Labs Marketplace',\n version: '0.1.0',\n description: 'Unified marketplace for plugins, adapters, workflows, and more',\n servers: [\n { url: `http://localhost:${port}`, description: 'Local dev' },\n ],\n ui: process.env.NODE_ENV !== 'production',\n });\n\n // Decorate with service instance\n server.decorate('marketplace', opts.service);\n server.decorate('observability', observability);\n observability.register(server);\n\n server.addHook('onRequest', async (request, reply) => {\n const requestId = (request.headers['x-request-id'] as string | undefined) || randomUUID();\n const traceId = (request.headers['x-trace-id'] as string | undefined) || randomUUID();\n\n request.id = requestId;\n reply.header('X-Request-Id', requestId);\n reply.header('X-Trace-Id', traceId);\n\n (request as any).kbLogger = createCorrelatedLogger(logger, {\n serviceId: 'marketplace',\n logsSource: 'marketplace',\n layer: 'marketplace',\n service: 'request',\n requestId,\n traceId,\n method: request.method,\n url: request.url,\n operation: 'http.request',\n });\n (request as any).kbLogger.info(`→ ${request.method.toUpperCase()} ${request.url}`);\n });\n\n server.addHook('onResponse', async (request, reply) => {\n const logger = (request as any).kbLogger as { info: (message: string, meta?: Record<string, unknown>) => void } | undefined;\n if (!logger) {\n return;\n }\n\n logger.info(`✓ ${request.method.toUpperCase()} ${request.url} ${reply.statusCode}`, {\n statusCode: reply.statusCode,\n });\n });\n\n server.get('/health', async () => ({\n status: 'ok',\n service: 'marketplace',\n ts: Date.now(),\n }));\n\n server.get('/ready', async () =>\n createServiceReadyResponse({\n ready: true,\n components: {\n marketplaceService: {\n ready: true,\n },\n },\n })\n );\n\n server.get('/metrics', async (_request, reply) => {\n reply.header('Content-Type', 'text/plain; version=0.0.4; charset=utf-8');\n return observability.renderPrometheusMetrics('healthy');\n });\n\n server.get('/observability/describe', async () => observability.buildDescribe());\n\n server.get('/observability/health', async () =>\n observability.buildHealth({\n status: 'healthy',\n checks: [\n {\n id: 'marketplace-service',\n status: 'ok',\n message: 'Marketplace service registered',\n },\n ],\n meta: {\n serviceHealthEndpoint: '/health',\n },\n })\n );\n\n // Register routes\n await observability.observeOperation('marketplace.bootstrap', () => registerRoutes(server));\n\n return server;\n}\n"]}
1
+ {"version":3,"sources":["../src/routes/packages.ts","../src/routes/workspace.ts","../src/routes/diagnostics.ts","../src/routes/index.ts","../src/server.ts"],"names":["logger"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @module @kb-labs/marketplace-api/routes/packages\n * REST routes for marketplace packages (plugins, adapters, etc.)\n *\n * GET /packages — list installed packages\n * POST /packages — install package(s)\n * DELETE /packages — uninstall package(s)\n * PATCH /packages/:id — update state (enabled/disabled)\n * POST /packages/:id/update — update to latest version\n * POST /packages/:id/link — link local path for development\n * DELETE /packages/:id/link — unlink\n */\n\nimport '../types.js';\nimport type { FastifyInstance } from 'fastify';\nimport type { EntityKind } from '@kb-labs/core-discovery';\n\nexport function registerPackagesRoutes(app: FastifyInstance): void {\n // GET /packages — list installed packages\n app.get('/packages', {\n schema: {\n tags: ['Marketplace'],\n summary: 'List installed packages',\n querystring: {\n type: 'object',\n properties: {\n kind: { type: 'string', description: 'Filter by entity kind (plugin, adapter, …)' },\n },\n },\n },\n }, async (request, reply) => {\n const { kind } = request.query as { kind?: string };\n const entries = await app.observability.observeOperation(\n 'marketplace.list',\n () => app.marketplace.list(kind ? { kind: kind as EntityKind } : undefined),\n );\n return reply.send({ entries, total: entries.length });\n });\n\n // POST /packages — install one or more packages\n app.post('/packages', {\n schema: {\n tags: ['Marketplace'],\n summary: 'Install package(s)',\n body: {\n type: 'object',\n required: ['specs'],\n properties: {\n specs: { type: 'array', items: { type: 'string' }, description: 'Package specs (name, name@version, etc.)' },\n dev: { type: 'boolean', description: 'Install as dev dependency' },\n },\n },\n },\n }, async (request, reply) => {\n const { specs, dev } = request.body as { specs: string[]; dev?: boolean };\n const result = await app.observability.observeOperation(\n 'marketplace.install',\n () => app.marketplace.install(specs, { dev }),\n );\n return reply.code(201).send(result);\n });\n\n // DELETE /packages — uninstall one or more packages\n app.delete('/packages', {\n schema: {\n tags: ['Marketplace'],\n summary: 'Uninstall package(s)',\n body: {\n type: 'object',\n required: ['packageIds'],\n properties: {\n packageIds: { type: 'array', items: { type: 'string' } },\n },\n },\n },\n }, async (request, reply) => {\n const { packageIds } = request.body as { packageIds: string[] };\n await app.observability.observeOperation(\n 'marketplace.uninstall',\n () => app.marketplace.uninstall(packageIds),\n );\n return reply.code(204).send();\n });\n\n // PATCH /packages/:id — update package state (enable/disable)\n app.patch('/packages/:id', {\n schema: {\n tags: ['Marketplace'],\n summary: 'Update package state (enable or disable)',\n params: {\n type: 'object',\n required: ['id'],\n properties: {\n id: { type: 'string' },\n },\n },\n body: {\n type: 'object',\n required: ['enabled'],\n properties: {\n enabled: { type: 'boolean' },\n },\n },\n },\n }, async (request, reply) => {\n const { id } = request.params as { id: string };\n const { enabled } = request.body as { enabled: boolean };\n const operation = enabled ? 'marketplace.enable' : 'marketplace.disable';\n const method = enabled\n ? () => app.marketplace.enable(id)\n : () => app.marketplace.disable(id);\n await app.observability.observeOperation(operation, method);\n return reply.send({ id, enabled });\n });\n\n // POST /packages/:id/update — update package to latest version\n app.post('/packages/:id/update', {\n schema: {\n tags: ['Marketplace'],\n summary: 'Update package to latest version',\n params: {\n type: 'object',\n required: ['id'],\n properties: {\n id: { type: 'string' },\n },\n },\n },\n }, async (request, reply) => {\n const { id } = request.params as { id: string };\n const result = await app.observability.observeOperation(\n 'marketplace.update',\n () => app.marketplace.update([id]),\n );\n return reply.send(result);\n });\n\n // POST /packages/:id/link — link a local path for development\n app.post('/packages/:id/link', {\n schema: {\n tags: ['Marketplace'],\n summary: 'Link a local package path for development',\n params: {\n type: 'object',\n required: ['id'],\n properties: {\n id: { type: 'string' },\n },\n },\n body: {\n type: 'object',\n required: ['path'],\n properties: {\n path: { type: 'string', description: 'Absolute path to local package' },\n },\n },\n },\n }, async (request, reply) => {\n const { path } = request.body as { path: string };\n const result = await app.observability.observeOperation(\n 'marketplace.link',\n () => app.marketplace.link(path),\n );\n return reply.send(result);\n });\n\n // DELETE /packages/:id/link — unlink a local package\n app.delete('/packages/:id/link', {\n schema: {\n tags: ['Marketplace'],\n summary: 'Unlink a local package',\n params: {\n type: 'object',\n required: ['id'],\n properties: {\n id: { type: 'string' },\n },\n },\n },\n }, async (request, reply) => {\n const { id } = request.params as { id: string };\n await app.observability.observeOperation(\n 'marketplace.unlink',\n () => app.marketplace.unlink(id),\n );\n return reply.code(204).send();\n });\n}\n","/**\n * @module @kb-labs/marketplace-api/routes/workspace\n * Workspace-level operations (not tied to a specific package).\n *\n * POST /workspace/sync — scan workspace and populate lock\n */\n\nimport '../types.js';\nimport type { FastifyInstance } from 'fastify';\n\nexport function registerWorkspaceRoutes(app: FastifyInstance): void {\n // POST /workspace/sync — scan for plugins/adapters and populate lock\n app.post('/workspace/sync', {\n schema: {\n tags: ['Marketplace'],\n summary: 'Sync workspace — scan for plugins/adapters and populate lock',\n body: {\n type: 'object',\n required: ['include'],\n properties: {\n include: {\n type: 'array',\n items: { type: 'string' },\n description: 'Glob patterns to scan (relative to workspace root)',\n },\n exclude: {\n type: 'array',\n items: { type: 'string' },\n description: 'Patterns to skip',\n },\n autoEnable: {\n type: 'boolean',\n description: 'Auto-enable newly discovered entries (default: false)',\n },\n },\n },\n },\n }, async (request, reply) => {\n const body = request.body as {\n include: string[];\n exclude?: string[];\n autoEnable?: boolean;\n };\n const result = await app.observability.observeOperation(\n 'marketplace.sync',\n () => app.marketplace.sync(body),\n );\n return reply.send(result);\n });\n}\n","/**\n * @module @kb-labs/marketplace-api/routes/diagnostics\n * Service-level diagnostic endpoints.\n *\n * GET /diagnostics — marketplace health report\n */\n\nimport '../types.js';\nimport type { FastifyInstance } from 'fastify';\n\nexport function registerDiagnosticsRoutes(app: FastifyInstance): void {\n app.get('/diagnostics', {\n schema: {\n tags: ['Marketplace'],\n summary: 'Marketplace health and diagnostics report',\n },\n }, async (_request, reply) => {\n const report = await app.observability.observeOperation(\n 'marketplace.doctor',\n () => app.marketplace.doctor(),\n );\n return reply.send(report);\n });\n}\n","/**\n * @module @kb-labs/marketplace-api/routes\n * Register all marketplace API routes.\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport { registerPackagesRoutes } from './packages.js';\nimport { registerWorkspaceRoutes } from './workspace.js';\nimport { registerDiagnosticsRoutes } from './diagnostics.js';\n\nexport async function registerRoutes(server: FastifyInstance): Promise<void> {\n await server.register(async (app) => {\n registerPackagesRoutes(app);\n registerWorkspaceRoutes(app);\n registerDiagnosticsRoutes(app);\n }, { prefix: '/api/v1/marketplace' });\n}\n","/**\n * @module @kb-labs/marketplace-api/server\n * Fastify server factory for marketplace service.\n */\n\nimport Fastify, { type FastifyInstance } from 'fastify';\nimport {\n createCorrelatedLogger,\n HttpObservabilityCollector,\n createServiceReadyResponse,\n registerOpenAPI,\n} from '@kb-labs/shared-http';\nimport type { ILogger } from '@kb-labs/core-platform';\nimport { registerRoutes } from './routes/index.js';\nimport type { MarketplaceService } from '@kb-labs/marketplace-core';\nimport { randomUUID } from 'node:crypto';\n\nconst DEFAULT_PORT = 5070;\n\nfunction createFallbackLogger(): ILogger {\n const child = (_bindings: Record<string, unknown>): ILogger => createFallbackLogger();\n return {\n trace: () => {},\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n fatal: () => {},\n child,\n };\n}\n\nexport interface CreateServerOptions {\n service: MarketplaceService;\n logger?: ILogger;\n port?: number;\n host?: string;\n}\n\nexport async function createServer(opts: CreateServerOptions): Promise<FastifyInstance> {\n const port = opts.port ?? DEFAULT_PORT;\n const logger = opts.logger ?? createFallbackLogger();\n const observability = new HttpObservabilityCollector({\n serviceId: 'marketplace',\n serviceType: 'http-api',\n version: '0.1.0',\n logsSource: 'marketplace',\n });\n const server = Fastify({\n logger: false, // using platform.logger\n });\n\n // OpenAPI docs\n await registerOpenAPI(server, {\n title: 'KB Labs Marketplace',\n version: '0.1.0',\n description: 'Unified marketplace for plugins, adapters, workflows, and more',\n servers: [\n { url: `http://localhost:${port}`, description: 'Local dev' },\n ],\n ui: process.env.NODE_ENV !== 'production',\n });\n\n // Decorate with service instance\n server.decorate('marketplace', opts.service);\n server.decorate('observability', observability);\n observability.register(server);\n\n server.addHook('onRequest', async (request, reply) => {\n const requestId = (request.headers['x-request-id'] as string | undefined) || randomUUID();\n const traceId = (request.headers['x-trace-id'] as string | undefined) || randomUUID();\n\n request.id = requestId;\n reply.header('X-Request-Id', requestId);\n reply.header('X-Trace-Id', traceId);\n\n (request as any).kbLogger = createCorrelatedLogger(logger, {\n serviceId: 'marketplace',\n logsSource: 'marketplace',\n layer: 'marketplace',\n service: 'request',\n requestId,\n traceId,\n method: request.method,\n url: request.url,\n operation: 'http.request',\n });\n (request as any).kbLogger.info(`→ ${request.method.toUpperCase()} ${request.url}`);\n });\n\n server.addHook('onResponse', async (request, reply) => {\n const logger = (request as any).kbLogger as { info: (message: string, meta?: Record<string, unknown>) => void } | undefined;\n if (!logger) {\n return;\n }\n\n logger.info(`✓ ${request.method.toUpperCase()} ${request.url} ${reply.statusCode}`, {\n statusCode: reply.statusCode,\n });\n });\n\n server.get('/health', async () => ({\n status: 'ok',\n service: 'marketplace',\n ts: Date.now(),\n }));\n\n server.get('/ready', async () =>\n createServiceReadyResponse({\n ready: true,\n components: {\n marketplaceService: {\n ready: true,\n },\n },\n })\n );\n\n server.get('/metrics', async (_request, reply) => {\n reply.header('Content-Type', 'text/plain; version=0.0.4; charset=utf-8');\n return observability.renderPrometheusMetrics('healthy');\n });\n\n server.get('/observability/describe', async () => observability.buildDescribe());\n\n server.get('/observability/health', async () =>\n observability.buildHealth({\n status: 'healthy',\n checks: [\n {\n id: 'marketplace-service',\n status: 'ok',\n message: 'Marketplace service registered',\n },\n ],\n meta: {\n serviceHealthEndpoint: '/health',\n },\n })\n );\n\n // Register routes\n await observability.observeOperation('marketplace.bootstrap', () => registerRoutes(server));\n\n return server;\n}\n"]}
package/package.json CHANGED
@@ -5,12 +5,12 @@
5
5
  "fastify": "^5.3.3",
6
6
  "fastify-type-provider-zod": "^6.0.0",
7
7
  "zod": "^3.23.8",
8
- "@kb-labs/core-contracts": "2.14.0",
9
- "@kb-labs/core-platform": "2.14.0",
10
- "@kb-labs/core-discovery": "2.14.0",
11
- "@kb-labs/marketplace-core": "2.14.0",
12
- "@kb-labs/marketplace-contracts": "2.14.0",
13
- "@kb-labs/shared-http": "2.14.0"
8
+ "@kb-labs/core-contracts": "2.15.0",
9
+ "@kb-labs/core-discovery": "2.15.0",
10
+ "@kb-labs/core-platform": "2.15.0",
11
+ "@kb-labs/marketplace-core": "2.15.0",
12
+ "@kb-labs/shared-http": "2.15.0",
13
+ "@kb-labs/marketplace-contracts": "2.15.0"
14
14
  },
15
15
  "description": "Fastify routes for KB Labs marketplace service",
16
16
  "devDependencies": {
@@ -18,7 +18,7 @@
18
18
  "tsup": "^8.5.0",
19
19
  "typescript": "^5",
20
20
  "vitest": "^3.2.4",
21
- "@kb-labs/devkit": "2.14.0"
21
+ "@kb-labs/devkit": "2.15.0"
22
22
  },
23
23
  "engines": {
24
24
  "node": ">=20.0.0",
@@ -38,7 +38,7 @@
38
38
  "sideEffects": false,
39
39
  "type": "module",
40
40
  "types": "./dist/index.d.ts",
41
- "version": "2.14.0",
41
+ "version": "2.15.0",
42
42
  "scripts": {
43
43
  "build": "tsup",
44
44
  "clean": "rimraf dist",