cordisx 0.1.0-beta.18 → 0.1.0-beta.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/dist/assets/feedback/feedback-manifest.schema.json +227 -0
  2. package/dist/assets/launcher/native-app-server-intermediary.mjs +63 -0
  3. package/dist/skills/cordisx-feedback/SKILL.md +47 -0
  4. package/dist/skills/cordisx-feedback/agents/openai.yaml +4 -0
  5. package/dist/skills/cordisx-feedback/version.json +4 -0
  6. package/dist/src/cli/feedback-command.d.ts +4 -0
  7. package/dist/src/cli/feedback-command.d.ts.map +1 -0
  8. package/dist/src/cli/feedback-command.js +57 -0
  9. package/dist/src/cli/feedback-command.js.map +1 -0
  10. package/dist/src/cli/parse.d.ts +21 -2
  11. package/dist/src/cli/parse.d.ts.map +1 -1
  12. package/dist/src/cli/parse.js +155 -0
  13. package/dist/src/cli/parse.js.map +1 -1
  14. package/dist/src/cli/run-command-dispatch.d.ts.map +1 -1
  15. package/dist/src/cli/run-command-dispatch.js +5 -0
  16. package/dist/src/cli/run-command-dispatch.js.map +1 -1
  17. package/dist/src/cli/run-support.d.ts +2 -1
  18. package/dist/src/cli/run-support.d.ts.map +1 -1
  19. package/dist/src/cli/run-support.js +11 -1
  20. package/dist/src/cli/run-support.js.map +1 -1
  21. package/dist/src/cli/supervisor-command.d.ts.map +1 -1
  22. package/dist/src/cli/supervisor-command.js +162 -62
  23. package/dist/src/cli/supervisor-command.js.map +1 -1
  24. package/dist/src/cli/supervisor-runtime.d.ts +3 -1
  25. package/dist/src/cli/supervisor-runtime.d.ts.map +1 -1
  26. package/dist/src/cli/supervisor-runtime.js +86 -11
  27. package/dist/src/cli/supervisor-runtime.js.map +1 -1
  28. package/dist/src/cli/supervisor-state.d.ts +26 -1
  29. package/dist/src/cli/supervisor-state.d.ts.map +1 -1
  30. package/dist/src/cli/supervisor-state.js +94 -16
  31. package/dist/src/cli/supervisor-state.js.map +1 -1
  32. package/dist/src/cli.js +6 -3
  33. package/dist/src/cli.js.map +1 -1
  34. package/dist/src/feedback/archive.d.ts +13 -0
  35. package/dist/src/feedback/archive.d.ts.map +1 -0
  36. package/dist/src/feedback/archive.js +348 -0
  37. package/dist/src/feedback/archive.js.map +1 -0
  38. package/dist/src/feedback/collector.d.ts +5 -0
  39. package/dist/src/feedback/collector.d.ts.map +1 -0
  40. package/dist/src/feedback/collector.js +444 -0
  41. package/dist/src/feedback/collector.js.map +1 -0
  42. package/dist/src/feedback/contracts.d.ts +100 -0
  43. package/dist/src/feedback/contracts.d.ts.map +1 -0
  44. package/dist/src/feedback/contracts.js +3 -0
  45. package/dist/src/feedback/contracts.js.map +1 -0
  46. package/dist/src/feedback/redaction.d.ts +8 -0
  47. package/dist/src/feedback/redaction.d.ts.map +1 -0
  48. package/dist/src/feedback/redaction.js +41 -0
  49. package/dist/src/feedback/redaction.js.map +1 -0
  50. package/dist/src/launcher/builtin-skill.d.ts +1 -1
  51. package/dist/src/launcher/builtin-skill.d.ts.map +1 -1
  52. package/dist/src/launcher/builtin-skill.js +2 -0
  53. package/dist/src/launcher/builtin-skill.js.map +1 -1
  54. package/dist/src/launcher/cdp-installation-bootstrap.d.ts.map +1 -1
  55. package/dist/src/launcher/cdp-installation-bootstrap.js +30 -21
  56. package/dist/src/launcher/cdp-installation-bootstrap.js.map +1 -1
  57. package/dist/src/launcher/cdp-installation-support.d.ts +5 -1
  58. package/dist/src/launcher/cdp-installation-support.d.ts.map +1 -1
  59. package/dist/src/launcher/cdp-installation-support.js +15 -10
  60. package/dist/src/launcher/cdp-installation-support.js.map +1 -1
  61. package/dist/src/launcher/cdp.d.ts +1 -1
  62. package/dist/src/launcher/cdp.d.ts.map +1 -1
  63. package/dist/src/launcher/cdp.js +41 -7
  64. package/dist/src/launcher/cdp.js.map +1 -1
  65. package/dist/src/launcher/diagnostic-redaction.d.ts +3 -0
  66. package/dist/src/launcher/diagnostic-redaction.d.ts.map +1 -0
  67. package/dist/src/launcher/diagnostic-redaction.js +18 -0
  68. package/dist/src/launcher/diagnostic-redaction.js.map +1 -0
  69. package/dist/src/launcher/host-generation-graph.d.ts +1 -0
  70. package/dist/src/launcher/host-generation-graph.d.ts.map +1 -1
  71. package/dist/src/launcher/host-generation-graph.js +5 -1
  72. package/dist/src/launcher/host-generation-graph.js.map +1 -1
  73. package/dist/src/launcher/managed-service-plugin-lifecycle.d.ts.map +1 -1
  74. package/dist/src/launcher/managed-service-plugin-lifecycle.js +2 -6
  75. package/dist/src/launcher/managed-service-plugin-lifecycle.js.map +1 -1
  76. package/dist/src/launcher/native-submission-control-server.d.ts.map +1 -1
  77. package/dist/src/launcher/native-submission-control-server.js +39 -0
  78. package/dist/src/launcher/native-submission-control-server.js.map +1 -1
  79. package/dist/src/launcher/native-submission-controller.d.ts +23 -0
  80. package/dist/src/launcher/native-submission-controller.d.ts.map +1 -1
  81. package/dist/src/launcher/native-submission-controller.js +47 -0
  82. package/dist/src/launcher/native-submission-controller.js.map +1 -1
  83. package/dist/src/launcher/production-graph-network.d.ts +22 -0
  84. package/dist/src/launcher/production-graph-network.d.ts.map +1 -0
  85. package/dist/src/launcher/production-graph-network.js +124 -0
  86. package/dist/src/launcher/production-graph-network.js.map +1 -0
  87. package/dist/src/renderer/reicon-icon-backend.d.ts +1 -1
  88. package/dist/src/renderer/reicon-icon-backend.d.ts.map +1 -1
  89. package/dist/src/renderer/reicon-icon-backend.js +3 -0
  90. package/dist/src/renderer/reicon-icon-backend.js.map +1 -1
  91. package/package.json +1 -1
@@ -0,0 +1,227 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://cordisx.example/schemas/feedback-manifest-v1.json",
4
+ "title": "CordisX Feedback Manifest v1",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "contract",
9
+ "schemaVersion",
10
+ "bundleId",
11
+ "createdAt",
12
+ "producer",
13
+ "policy",
14
+ "target",
15
+ "selection",
16
+ "limits",
17
+ "artifacts",
18
+ "exclusions",
19
+ "missing",
20
+ "redactions",
21
+ "warnings"
22
+ ],
23
+ "properties": {
24
+ "contract": { "const": "cordisx.feedback-manifest/v1" },
25
+ "schemaVersion": { "const": 1 },
26
+ "bundleId": { "type": "string", "pattern": "^fb_[a-z0-9]{12,64}$" },
27
+ "createdAt": { "type": "string", "format": "date-time" },
28
+ "producer": {
29
+ "type": "object",
30
+ "additionalProperties": false,
31
+ "required": ["cordisxVersion", "nodeVersion", "platform", "arch"],
32
+ "properties": {
33
+ "cordisxVersion": { "type": "string", "maxLength": 64 },
34
+ "nodeVersion": { "type": "string", "maxLength": 64 },
35
+ "platform": { "type": "string", "enum": ["darwin", "linux", "win32", "other"] },
36
+ "osVersion": { "type": "string", "maxLength": 128 },
37
+ "arch": { "type": "string", "maxLength": 32 },
38
+ "hostVersion": { "type": ["string", "null"], "maxLength": 128 },
39
+ "hostBuild": { "type": ["string", "null"], "maxLength": 128 }
40
+ }
41
+ },
42
+ "policy": {
43
+ "type": "object",
44
+ "additionalProperties": false,
45
+ "required": ["version", "localOnly", "contentCollection"],
46
+ "properties": {
47
+ "version": { "type": "string", "maxLength": 64 },
48
+ "localOnly": { "const": true },
49
+ "contentCollection": { "const": "excluded" }
50
+ }
51
+ },
52
+ "target": {
53
+ "type": "object",
54
+ "additionalProperties": false,
55
+ "required": ["app", "profile", "dataMode"],
56
+ "properties": {
57
+ "app": {
58
+ "type": "object",
59
+ "additionalProperties": false,
60
+ "required": ["kind"],
61
+ "properties": {
62
+ "kind": { "enum": ["codex", "other"] },
63
+ "ref": { "type": "string", "pattern": "^app_[a-f0-9]{16,64}$" }
64
+ }
65
+ },
66
+ "profile": {
67
+ "type": "object",
68
+ "additionalProperties": false,
69
+ "required": ["kind", "ref"],
70
+ "properties": {
71
+ "kind": { "enum": ["default", "named"] },
72
+ "ref": { "type": "string", "pattern": "^profile_[a-f0-9]{16,64}$" }
73
+ }
74
+ },
75
+ "dataMode": { "enum": ["shared", "host-isolated"] }
76
+ }
77
+ },
78
+ "selection": {
79
+ "type": "object",
80
+ "additionalProperties": false,
81
+ "required": ["launchId", "from", "until", "correlationConfidence", "disposition"],
82
+ "properties": {
83
+ "launchId": { "type": ["string", "null"], "pattern": "^launch_[a-f0-9]{16,64}$" },
84
+ "from": { "type": "string", "format": "date-time" },
85
+ "until": { "type": "string", "format": "date-time" },
86
+ "correlationConfidence": { "enum": ["exact", "partial", "none"] },
87
+ "disposition": {
88
+ "enum": [
89
+ "ready",
90
+ "ready_then_cleanup_degraded",
91
+ "injection_failed",
92
+ "launch_failed",
93
+ "terminated",
94
+ "unknown"
95
+ ]
96
+ },
97
+ "cdpPort": { "type": ["integer", "null"], "minimum": 1024, "maximum": 65535 }
98
+ }
99
+ },
100
+ "limits": {
101
+ "type": "object",
102
+ "additionalProperties": false,
103
+ "required": ["lookbackSeconds", "maxBytes", "maxEvents", "collectionTimeoutMs"],
104
+ "properties": {
105
+ "lookbackSeconds": { "type": "integer", "minimum": 1, "maximum": 86400 },
106
+ "maxBytes": { "type": "integer", "minimum": 1, "maximum": 10485760 },
107
+ "maxEvents": { "type": "integer", "minimum": 1, "maximum": 10000 },
108
+ "collectionTimeoutMs": { "type": "integer", "minimum": 1, "maximum": 30000 }
109
+ }
110
+ },
111
+ "artifacts": {
112
+ "type": "array",
113
+ "maxItems": 64,
114
+ "items": { "$ref": "#/$defs/artifact" }
115
+ },
116
+ "exclusions": {
117
+ "type": "array",
118
+ "uniqueItems": true,
119
+ "items": { "$ref": "#/$defs/exclusion" }
120
+ },
121
+ "missing": {
122
+ "type": "array",
123
+ "maxItems": 128,
124
+ "items": { "$ref": "#/$defs/missing" }
125
+ },
126
+ "redactions": {
127
+ "type": "object",
128
+ "additionalProperties": false,
129
+ "required": ["total", "byCategory"],
130
+ "properties": {
131
+ "total": { "type": "integer", "minimum": 0 },
132
+ "byCategory": {
133
+ "type": "object",
134
+ "additionalProperties": { "type": "integer", "minimum": 0 },
135
+ "propertyNames": { "pattern": "^[a-z][a-z0-9._-]{0,63}$" }
136
+ }
137
+ }
138
+ },
139
+ "warnings": {
140
+ "type": "array",
141
+ "maxItems": 128,
142
+ "items": {
143
+ "type": "object",
144
+ "additionalProperties": false,
145
+ "required": ["code", "message"],
146
+ "properties": {
147
+ "code": { "type": "string", "pattern": "^[a-z][a-z0-9._-]{0,63}$" },
148
+ "message": { "type": "string", "maxLength": 500 }
149
+ }
150
+ }
151
+ },
152
+ "archive": {
153
+ "type": "object",
154
+ "additionalProperties": false,
155
+ "required": ["format", "bytes", "sha256", "verified"],
156
+ "properties": {
157
+ "format": { "const": "zip" },
158
+ "bytes": { "type": "integer", "minimum": 1, "maximum": 10485760 },
159
+ "sha256": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
160
+ "verified": { "const": true }
161
+ }
162
+ }
163
+ },
164
+ "$defs": {
165
+ "artifact": {
166
+ "type": "object",
167
+ "additionalProperties": false,
168
+ "required": [
169
+ "path",
170
+ "purpose",
171
+ "evidenceType",
172
+ "status",
173
+ "bytes",
174
+ "sha256",
175
+ "redactions"
176
+ ],
177
+ "properties": {
178
+ "path": {
179
+ "type": "string",
180
+ "pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))[A-Za-z0-9._/-]+$",
181
+ "maxLength": 240
182
+ },
183
+ "purpose": { "type": "string", "maxLength": 240 },
184
+ "evidenceType": { "enum": ["product_log", "structured_event", "environment_projection", "user_report"] },
185
+ "status": { "enum": ["present", "truncated"] },
186
+ "bytes": { "type": "integer", "minimum": 0, "maximum": 10485760 },
187
+ "sha256": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
188
+ "from": { "type": "string", "format": "date-time" },
189
+ "until": { "type": "string", "format": "date-time" },
190
+ "redactions": { "type": "integer", "minimum": 0 },
191
+ "omittedBytes": { "type": "integer", "minimum": 0 }
192
+ }
193
+ },
194
+ "exclusion": {
195
+ "type": "object",
196
+ "additionalProperties": false,
197
+ "required": ["category", "reason"],
198
+ "properties": {
199
+ "category": {
200
+ "enum": [
201
+ "conversation_content",
202
+ "prompts",
203
+ "credentials",
204
+ "cookies",
205
+ "complete_config",
206
+ "complete_urls",
207
+ "absolute_paths",
208
+ "screenshots",
209
+ "project_files",
210
+ "browser_storage"
211
+ ]
212
+ },
213
+ "reason": { "type": "string", "maxLength": 240 }
214
+ }
215
+ },
216
+ "missing": {
217
+ "type": "object",
218
+ "additionalProperties": false,
219
+ "required": ["field", "status", "reason"],
220
+ "properties": {
221
+ "field": { "type": "string", "pattern": "^[a-z][a-z0-9._-]{0,127}$" },
222
+ "status": { "enum": ["missing", "unsupported", "permission_denied", "not_applicable", "truncated"] },
223
+ "reason": { "type": "string", "maxLength": 500 }
224
+ }
225
+ }
226
+ }
227
+ }
@@ -24,6 +24,7 @@ const control = net.connect(socketPath)
24
24
  const controlCalls = new Map()
25
25
  const privateCalls = new Map()
26
26
  const desktopCalls = new Map()
27
+ const resumeCalls = new Map()
27
28
  const firstTurns = new Map()
28
29
  const privatePrefix = `cordisx-private-${nonce}-`
29
30
  let sequence = 0
@@ -57,6 +58,7 @@ function stop(reason = 'transport-closed') {
57
58
  rejectAll(controlCalls)
58
59
  rejectAll(privateCalls)
59
60
  desktopCalls.clear()
61
+ resumeCalls.clear()
60
62
  firstTurns.clear()
61
63
  control.destroy()
62
64
  process.stdin.destroy()
@@ -97,6 +99,14 @@ function settle(calls, message, isControl) {
97
99
  return true
98
100
  }
99
101
 
102
+ function missingManagedProvider(message) {
103
+ if (message?.error?.code !== -32600 || typeof message.error.message !== 'string') return undefined
104
+ const match = /^failed to load configuration: Model provider `([^`\0\r\n]{1,128})` not found$/u.exec(
105
+ message.error.message,
106
+ )
107
+ return match?.[1]
108
+ }
109
+
100
110
  // Only framed messages are buffered. Many small lines in one chunk do not count as one large request.
101
111
  function readLines(stream, receive, maxLineBytes = maxNativeLineBytes) {
102
112
  let buffer = ''
@@ -172,6 +182,10 @@ async function forward(line) {
172
182
  return
173
183
  }
174
184
  if (typeof message?.id === 'string' && message.id.startsWith(privatePrefix)) throw new Error('Reserved request id')
185
+ if (
186
+ message?.method === 'thread/resume' && typeof params?.threadId === 'string'
187
+ && ['string', 'number'].includes(typeof message.id) && resumeCalls.size < 64
188
+ ) resumeCalls.set(message.id, params)
175
189
  await write(child.stdin, line)
176
190
  return
177
191
  }
@@ -227,6 +241,46 @@ async function forward(line) {
227
241
  }
228
242
  }
229
243
 
244
+ // A restarted app-server no longer knows a launch-scoped managed provider that a persisted thread still names.
245
+ async function recoverResume(id, params, providerId, failureLine) {
246
+ try {
247
+ const read = await nativeCall('thread/read', { threadId: params.threadId, includeTurns: false })
248
+ const persistedProviderId = read?.thread?.modelProvider
249
+ const model = read?.thread?.model
250
+ if (
251
+ persistedProviderId !== providerId || providerId === 'openai'
252
+ || typeof model !== 'string' || model === ''
253
+ ) throw new Error('Native thread is not managed')
254
+ const prepared = await controlCall('resume', { threadId: params.threadId, providerId, model })
255
+ const overrides = object(prepared?.configOverrides)
256
+ if (prepared?.kind !== 'resume' || !validToken(prepared.resumeToken) || overrides === undefined) {
257
+ throw new Error('Managed resume rejected')
258
+ }
259
+ let result
260
+ try {
261
+ result = await nativeCall('thread/resume', { ...params, config: { ...object(params.config), ...overrides } })
262
+ if (result?.thread?.id !== params.threadId) throw new Error('Managed resume returned another thread')
263
+ } catch (error) {
264
+ await controlCall('resume-complete', {
265
+ threadId: params.threadId,
266
+ resumeToken: prepared.resumeToken,
267
+ succeeded: false,
268
+ }).catch(() => undefined)
269
+ throw error
270
+ }
271
+ const completed = await controlCall('resume-complete', {
272
+ threadId: params.threadId,
273
+ resumeToken: prepared.resumeToken,
274
+ succeeded: true,
275
+ })
276
+ if (completed !== true) throw new Error('Managed resume completion rejected')
277
+ await write(process.stdout, { id, result })
278
+ } catch {
279
+ // The original native failure stays authoritative whenever the Host cannot vouch for the provider.
280
+ await write(process.stdout, failureLine)
281
+ }
282
+ }
283
+
230
284
  readLines(process.stdin, line => {
231
285
  inputQueue = inputQueue.then(async () => {
232
286
  await ready
@@ -248,6 +302,15 @@ readLines(child.stdout, line => {
248
302
  if (settle(privateCalls, message, false)) return
249
303
  // Late private responses must never escape into the Desktop's request table.
250
304
  if (typeof message?.id === 'string' && message.id.startsWith(privatePrefix)) return
305
+ const resumeParams = message.method === undefined ? resumeCalls.get(message?.id) : undefined
306
+ if (resumeParams !== undefined) {
307
+ resumeCalls.delete(message.id)
308
+ const providerId = missingManagedProvider(message)
309
+ if (providerId !== undefined) {
310
+ void recoverResume(message.id, resumeParams, providerId, line).catch(stop)
311
+ return
312
+ }
313
+ }
251
314
  const operation = desktopCalls.get(message?.id)
252
315
  if (!operation || message.method !== undefined) {
253
316
  void write(process.stdout, line).catch(stop)
@@ -0,0 +1,47 @@
1
+ ---
2
+ name: cordisx-feedback
3
+ description: Collect a private, bounded CordisX diagnostic bundle when the user wants to report, package, or investigate a CordisX problem, startup failure, injection issue, cleanup warning, or suspicious log sequence. Use this Skill when the user asks to prepare feedback or logs for maintainers, including when they only describe a screenshot. It creates local diagnostics for review; it never uploads or sends them without separate explicit authorization.
4
+ ---
5
+
6
+ # CordisX Feedback
7
+
8
+ Use `cordisx feedback` to prepare a local diagnostic bundle without collecting
9
+ conversation content, credentials, complete configuration, or unrelated files.
10
+
11
+ Reuse supplied context and ask only for a short user description, approximate
12
+ time, or app/profile when the CLI cannot resolve them. A screenshot
13
+ transcription is a `user_report`, never a product log.
14
+
15
+ ## Collect
16
+
17
+ Check that the installed CLI supports `cordisx feedback`, then normally run:
18
+
19
+ ```bash
20
+ cordisx feedback collect --recent --json
21
+ ```
22
+
23
+ Add a bounded app/profile, time, or `--description-file` only when needed. Do
24
+ not run `cordisx config`, scan HOME or a project, or use unbounded `cordisx
25
+ logs`; the CLI owns selection, redaction, validation, and limits.
26
+
27
+ ## Preview
28
+
29
+ Read the manifest summary and explain included and excluded categories, missing
30
+ or truncated sources, selected time window and correlation confidence,
31
+ redactions, final size, and local staging directory. A transient target-list
32
+ fetch failure followed by ready and injected is not an injection failure;
33
+ describe later cleanup degradation separately.
34
+
35
+ ## Export
36
+
37
+ Only after the user asks for an archive, run:
38
+
39
+ ```bash
40
+ cordisx feedback export <bundle-directory> --json
41
+ ```
42
+
43
+ Show the local archive and verification result. Do not upload, message, create
44
+ an issue, or contact a maintainer without separately explicit authorization.
45
+
46
+ On failure, report the CLI's safe error. Do not substitute raw file collection,
47
+ delete locks, restart CordisX, change config, or request broader access.
@@ -0,0 +1,4 @@
1
+ interface:
2
+ display_name: "CordisX Feedback"
3
+ short_description: "Collect private local CordisX diagnostics"
4
+ default_prompt: "Use $cordisx-feedback to collect and review a local, privacy-filtered CordisX feedback bundle."
@@ -0,0 +1,4 @@
1
+ {
2
+ "version": "2026-09-21.1",
3
+ "source": "https://github.com/cordisx/cordisx/tree/main/skills/cordisx-feedback"
4
+ }
@@ -0,0 +1,4 @@
1
+ import { type CordisXFeedbackInvocation } from './parse.js';
2
+ import { type CordisXCliRuntime } from './run-support.js';
3
+ export declare function runFeedbackCommand(invocation: CordisXFeedbackInvocation, runtime: CordisXCliRuntime): Promise<void>;
4
+ //# sourceMappingURL=feedback-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback-command.d.ts","sourceRoot":"","sources":["../../../src/cli/feedback-command.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,yBAAyB,EAAE,MAAM,YAAY,CAAA;AAC3D,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAuBzD,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,yBAAyB,EACrC,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,IAAI,CAAC,CAkCf"}
@@ -0,0 +1,57 @@
1
+ import path from 'node:path';
2
+ import { exportFeedbackBundle, inspectFeedbackArchive, inspectFeedbackBundle } from '../feedback/archive.js';
3
+ import { collectFeedback } from '../feedback/collector.js';
4
+ const FEEDBACK_HELP = `Usage:
5
+ cordisx feedback collect [app] [profile] [--recent] [--since 15m | --from ISO --until ISO] [--description-file path] [--output directory] [--max-bytes bytes] [--json]
6
+ cordisx feedback inspect <bundle-directory> [--json]
7
+ cordisx feedback export <bundle-directory> [--output archive.zip] [--format zip] [--json]`;
8
+ function summary(manifest) {
9
+ return {
10
+ launches: manifest.selection.launchId === null ? 0 : 1,
11
+ includedArtifacts: manifest.artifacts.length,
12
+ excludedCategories: manifest.exclusions.length,
13
+ missingSources: manifest.missing.length,
14
+ redactions: manifest.redactions.total,
15
+ bytes: manifest.artifacts.reduce((sum, artifact) => sum + artifact.bytes, 0),
16
+ };
17
+ }
18
+ function output(runtime, json, value) {
19
+ const source = JSON.stringify(value);
20
+ (runtime.stdout ?? console.log)(json ? source : typeof value === 'string' ? value : source);
21
+ }
22
+ export async function runFeedbackCommand(invocation, runtime) {
23
+ if (invocation.feedbackAction === 'help') {
24
+ output(runtime, false, FEEDBACK_HELP);
25
+ return;
26
+ }
27
+ if (invocation.feedbackAction === 'collect') {
28
+ output(runtime, invocation.json, await collectFeedback(invocation, runtime));
29
+ return;
30
+ }
31
+ const bundlePath = path.resolve(invocation.input);
32
+ const manifest = path.extname(bundlePath) === '.zip'
33
+ ? await inspectFeedbackArchive(bundlePath)
34
+ : await inspectFeedbackBundle(bundlePath);
35
+ if (invocation.feedbackAction === 'inspect') {
36
+ output(runtime, invocation.json, {
37
+ status: 'inspected',
38
+ bundlePath,
39
+ manifestPath: path.join(bundlePath, 'manifest.json'),
40
+ bundleId: manifest.bundleId,
41
+ summary: summary(manifest),
42
+ });
43
+ return;
44
+ }
45
+ const archivePath = invocation.output === undefined ? `${bundlePath}.zip` : path.resolve(invocation.output);
46
+ const archive = await exportFeedbackBundle(bundlePath, archivePath);
47
+ output(runtime, invocation.json, {
48
+ status: 'exported',
49
+ bundlePath,
50
+ manifestPath: path.join(bundlePath, 'manifest.json'),
51
+ bundleId: manifest.bundleId,
52
+ archivePath,
53
+ summary: summary(manifest),
54
+ archive,
55
+ });
56
+ }
57
+ //# sourceMappingURL=feedback-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback-command.js","sourceRoot":"","sources":["../../../src/cli/feedback-command.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { type CordisXManagementInvocation } from './management-parse.js';
2
2
  export { CordisXCliParseError, type CordisXCliParseErrorCode } from './parse-error.js';
3
- export type CordisXCliAction = 'help' | 'launch' | 'run' | 'start' | 'status' | 'logs' | 'stop' | 'restart' | 'setup' | 'config' | 'doctor' | 'dev' | 'management';
3
+ export type CordisXCliAction = 'help' | 'launch' | 'run' | 'start' | 'status' | 'logs' | 'stop' | 'restart' | 'setup' | 'config' | 'doctor' | 'dev' | 'feedback' | 'management';
4
4
  export type CordisXDataMode = 'shared' | 'host-isolated';
5
5
  export interface CordisXLauncherOptions {
6
6
  readonly attach: boolean;
@@ -39,6 +39,7 @@ export interface CordisXManagedInvocation {
39
39
  readonly options: CordisXLauncherOptions;
40
40
  readonly hostArgs: readonly string[];
41
41
  readonly follow?: true;
42
+ readonly recoverStartup?: true;
42
43
  }
43
44
  export interface CordisXSetupInvocation {
44
45
  readonly action: 'setup';
@@ -57,7 +58,25 @@ export interface CordisXDevInvocation {
57
58
  readonly options: CordisXLauncherOptions;
58
59
  readonly hostArgs: readonly string[];
59
60
  }
60
- export type CordisXCliInvocation = CordisXHelpInvocation | CordisXLaunchInvocation | CordisXRunInvocation | CordisXManagedInvocation | CordisXSetupInvocation | CordisXConfigInvocation | CordisXDoctorInvocation | CordisXDevInvocation | CordisXManagementInvocation;
61
+ export type FeedbackAction = 'collect' | 'inspect' | 'export' | 'help';
62
+ export interface CordisXFeedbackInvocation {
63
+ readonly action: 'feedback';
64
+ readonly feedbackAction: FeedbackAction;
65
+ readonly app?: string;
66
+ readonly profile?: string;
67
+ readonly since?: string;
68
+ readonly from?: string;
69
+ readonly until?: string;
70
+ readonly launch?: string;
71
+ readonly descriptionFile?: string;
72
+ readonly output?: string;
73
+ readonly maxBytes?: number;
74
+ readonly format?: 'zip';
75
+ readonly recent?: true;
76
+ readonly json: boolean;
77
+ readonly input?: string;
78
+ }
79
+ export type CordisXCliInvocation = CordisXHelpInvocation | CordisXLaunchInvocation | CordisXRunInvocation | CordisXManagedInvocation | CordisXSetupInvocation | CordisXConfigInvocation | CordisXDoctorInvocation | CordisXDevInvocation | CordisXFeedbackInvocation | CordisXManagementInvocation;
61
80
  /**
62
81
  * Parse arguments following the `cordisx` executable name.
63
82
  *
@@ -1 +1 @@
1
- {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../../src/cli/parse.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../../src/cli/parse.ts"],"names":[],"mappings":"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"}