@x-otto/cli 0.0.1-alpha.50 → 0.0.1-alpha.52

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 (45) hide show
  1. package/dist/{auth-command-BYaFM76w.js → auth-command-DF_POx4L.js} +2 -2
  2. package/dist/{auth-command-BYaFM76w.js.map → auth-command-DF_POx4L.js.map} +1 -1
  3. package/dist/build-id-BmQPXMGN.js +3 -0
  4. package/dist/build-id-BmQPXMGN.js.map +1 -0
  5. package/dist/bundled-extensions/plugin-otto-wire-protocols/plugin-dist/meta.json +1 -1
  6. package/dist/{command-dispatcher-BLT8IO4K.js → command-dispatcher-FRiCoN16.js} +2 -2
  7. package/dist/{command-dispatcher-BLT8IO4K.js.map → command-dispatcher-FRiCoN16.js.map} +1 -1
  8. package/dist/{create-host-app-CbJ8ptv-.js → create-host-app-BgjEc81C.js} +2 -2
  9. package/dist/{create-host-app-CbJ8ptv-.js.map → create-host-app-BgjEc81C.js.map} +1 -1
  10. package/dist/{doctor-EndB-ycb.js → doctor-2AA2A9G7.js} +2 -2
  11. package/dist/{doctor-EndB-ycb.js.map → doctor-2AA2A9G7.js.map} +1 -1
  12. package/dist/{feedback-QcONRnO3.js → feedback-BsU8b1k9.js} +2 -2
  13. package/dist/{feedback-QcONRnO3.js.map → feedback-BsU8b1k9.js.map} +1 -1
  14. package/dist/{feedback-backend-methods-BNm38ddr.js → feedback-backend-methods-C2SzcIzm.js} +2 -2
  15. package/dist/{feedback-backend-methods-BNm38ddr.js.map → feedback-backend-methods-C2SzcIzm.js.map} +1 -1
  16. package/dist/index.js +6 -6
  17. package/dist/index.js.map +1 -1
  18. package/dist/{interactive-schedule-Bv__2Kwc.js → interactive-schedule-aQEHfUKL.js} +2 -2
  19. package/dist/{interactive-schedule-Bv__2Kwc.js.map → interactive-schedule-aQEHfUKL.js.map} +1 -1
  20. package/dist/{mcp-server-Rr__aWO7.js → mcp-server-C2bw9J2i.js} +2 -2
  21. package/dist/{mcp-server-Rr__aWO7.js.map → mcp-server-C2bw9J2i.js.map} +1 -1
  22. package/dist/{parse-cli-Db8pF_Ya.js → parse-cli-C1r2cQ0K.js} +2 -2
  23. package/dist/{parse-cli-Db8pF_Ya.js.map → parse-cli-C1r2cQ0K.js.map} +1 -1
  24. package/dist/{serve-K6BOT5K_.js → serve-DHqx-Mab.js} +2 -2
  25. package/dist/{serve-K6BOT5K_.js.map → serve-DHqx-Mab.js.map} +1 -1
  26. package/dist/{version-DrCy32wR.js → version-CdzXY8m2.js} +2 -2
  27. package/dist/{version-DrCy32wR.js.map → version-CdzXY8m2.js.map} +1 -1
  28. package/package.json +14 -14
  29. package/dist/build-id-DjE6eVpQ.js +0 -3
  30. package/dist/build-id-DjE6eVpQ.js.map +0 -1
  31. package/dist/bundled-extensions/plugin-feedback/otto-plugin.json +0 -24
  32. package/dist/bundled-extensions/plugin-feedback/panels/feedback.tsx +0 -348
  33. package/dist/bundled-extensions/plugin-feedback/panels/panel-host-globals.d.ts +0 -67
  34. package/dist/bundled-extensions/plugin-feedback/panels-dist/feedback.mjs +0 -257
  35. package/dist/bundled-extensions/plugin-feedback/plugin-dist/meta.json +0 -1
  36. package/dist/bundled-extensions/plugin-feedback/plugin-dist/plugin.cjs +0 -11304
  37. package/dist/bundled-extensions/plugin-feedback/plugin.ts +0 -198
  38. package/dist/bundled-extensions/plugin-feedback/src/coding-adapter.ts +0 -183
  39. package/dist/bundled-extensions/plugin-feedback/src/coding-lister.ts +0 -26
  40. package/dist/bundled-extensions/plugin-feedback/src/github-lister.ts +0 -230
  41. package/dist/bundled-extensions/plugin-feedback/src/issue-aggregator.ts +0 -109
  42. package/dist/bundled-extensions/plugin-feedback/src/issue-submitter.ts +0 -241
  43. package/dist/bundled-extensions/plugin-feedback/src/platform-resolver.ts +0 -76
  44. package/dist/bundled-extensions/plugin-feedback/src/pulse-survey-sink.ts +0 -114
  45. package/dist/bundled-extensions/plugin-feedback/src/resolved-sink.ts +0 -163
@@ -1,257 +0,0 @@
1
- const { usePluginData } = globalThis.__ottoPanelRuntime || {};const { claim: claimPanelFocus, release: releasePanelFocus, usePanelFocusClaimed, requestClose: requestPanelClose, setHint: setPanelHint } = globalThis.__ottoPanelFocusBridge || { claim(){}, release(){}, usePanelFocusClaimed: () => true, requestClose(){}, setHint(){} };const { getTheme, getFigures } = globalThis.__ottoPanelTheme || { getTheme: () => ({ text: undefined, inactive: '#9498B8', secondary: '#C8CBDB', success: '#7EE095', error: '#FF9592', warning: '#FFC966', special: '#DD78C9', selection: '#4D7CFF', focusBorder: '#4D7CFF', panelBorder: '#9498B8' }), getFigures: () => ({ check: '✓', cross: '✗', pointer: '▶', bullet: '●' }) };const { SPACING, LAYOUT } = globalThis.__ottoPanelSpacing || { SPACING: { none: 0, tight: 1, section: 2, loose: 4 }, LAYOUT: { contentInset: 4, borderInset: 2 } };const { t: t, i18next: panelI18next } = globalThis.__ottoPanelI18n || { t: (k) => k, i18next: { language: 'en' } };const { usePanelBackend } = globalThis.__ottoPanelBackendRuntime || { usePanelBackend: () => ({ call: () => Promise.reject(new Error('otto panel: backend runtime not installed')), cancel(){}, state: undefined, status: 'disabled' }) };
2
-
3
- // ../../../../../tmp/otto-panel-shims-xkXuT3/react-shim.js
4
- var R = globalThis.React;
5
- if (!R) throw new Error("otto panel: globalThis.React \u672A\u6CE8\u5165\uFF08TUI \u987B\u5728\u52A0\u8F7D\u9762\u677F\u524D import panel-globals\uFF09");
6
- var react_shim_default = R;
7
- var useState = R.useState;
8
- var useEffect = R.useEffect;
9
- var useCallback = R.useCallback;
10
- var useMemo = R.useMemo;
11
- var useRef = R.useRef;
12
- var useContext = R.useContext;
13
- var useReducer = R.useReducer;
14
- var useLayoutEffect = R.useLayoutEffect;
15
- var createElement = R.createElement;
16
- var Fragment = R.Fragment;
17
- var memo = R.memo;
18
- var forwardRef = R.forwardRef;
19
- var createContext = R.createContext;
20
- var Children = R.Children;
21
- var cloneElement = R.cloneElement;
22
- var isValidElement = R.isValidElement;
23
-
24
- // ../../../../../tmp/otto-panel-shims-xkXuT3/ink-shim.js
25
- var I = globalThis.__ottoPanelInk;
26
- if (!I) throw new Error("otto panel: globalThis.__ottoPanelInk \u672A\u6CE8\u5165\uFF08TUI \u987B\u5728\u52A0\u8F7D\u9762\u677F\u524D import panel-globals\uFF09");
27
- var Box = I.Box;
28
- var Text = I.Text;
29
- var Newline = I.Newline;
30
- var Spacer = I.Spacer;
31
- var Static = I.Static;
32
- var Transform = I.Transform;
33
- var useApp = I.useApp;
34
- var useInput = I.useInput;
35
- var useStdin = I.useStdin;
36
- var useStdout = I.useStdout;
37
- var useStderr = I.useStderr;
38
- var useFocus = I.useFocus;
39
- var useFocusManager = I.useFocusManager;
40
- var measureElement = I.measureElement;
41
- var render = I.render;
42
-
43
- // ../../../../../tmp/otto-panel-shims-xkXuT3/tui-shim.js
44
- var T = globalThis.__ottoPanelTui;
45
- if (!T) throw new Error("otto panel: globalThis.__ottoPanelTui \u672A\u6CE8\u5165\uFF08TUI \u987B\u5728\u52A0\u8F7D\u9762\u677F\u524D import panel-globals\uFF09");
46
- var Tabs = T.Tabs;
47
- var DataList = T.DataList;
48
- var Button = T.Button;
49
- var GroupDivider = T.GroupDivider;
50
- var ScrollIndicatorAbove = T.ScrollIndicatorAbove;
51
- var ScrollIndicatorBelow = T.ScrollIndicatorBelow;
52
- var Tabable = T.Tabable;
53
- var useTabable = T.useTabable;
54
- var TabScope = T.TabScope;
55
-
56
- // extensions/plugin-feedback/panels/feedback.tsx
57
- var POLL_MS = 15e3;
58
- var sourceBadge = (source, theme) => {
59
- const label = source === "github" ? "GH" : "COD";
60
- const color = source === "github" ? theme.success : theme.warning;
61
- return /* @__PURE__ */ react_shim_default.createElement(Text, { key: "badge", color, bold: true }, "[", label, "]");
62
- };
63
- function formatDate(iso) {
64
- if (!iso) return "";
65
- try {
66
- return new Date(iso).toLocaleDateString();
67
- } catch {
68
- return iso;
69
- }
70
- }
71
- function rowId(row) {
72
- return `${row.source}:${row.platformIssueId}`;
73
- }
74
- function FeedbackPanel() {
75
- const backend = usePanelBackend();
76
- const [view, setView] = useState("list");
77
- const [selectedIndex, setSelectedIndex] = useState(0);
78
- const [filterMode, setFilterMode] = useState("all");
79
- const [listResult, setListResult] = useState(void 0);
80
- const [resolvedMarks, setResolvedMarks] = useState([]);
81
- const [platform, setPlatform] = useState("github");
82
- const [loading, setLoading] = useState(true);
83
- const [formTitle, setFormTitle] = useState("");
84
- const [formRepro, setFormRepro] = useState("");
85
- const [formExpected, setFormExpected] = useState("");
86
- const [formActual, setFormActual] = useState("");
87
- const [formFocus, setFormFocus] = useState(0);
88
- const [formMsg, setFormMsg] = useState(null);
89
- const [formMsgTone, setFormMsgTone] = useState(null);
90
- const [submitting, setSubmitting] = useState(false);
91
- const refresh = useCallback(async () => {
92
- setLoading(true);
93
- try {
94
- const [listResult2, resolvedResult, platformResult] = await Promise.all([
95
- backend.call("feedback.listIssues", { state: "all", limitPerSource: 20 }),
96
- backend.call("feedback.listResolvedMarks", {}),
97
- backend.call("feedback.resolvePlatform", {})
98
- ]);
99
- setListResult(listResult2);
100
- setResolvedMarks(resolvedResult.marks ?? []);
101
- setPlatform(platformResult.platform);
102
- } catch {
103
- } finally {
104
- setLoading(false);
105
- }
106
- }, [backend]);
107
- useEffect(() => {
108
- const timer = setInterval(refresh, POLL_MS);
109
- refresh();
110
- return () => clearInterval(timer);
111
- }, [refresh]);
112
- const allRows = useMemo(() => listResult?.items ?? [], [listResult]);
113
- const resolvedSet = useMemo(() => {
114
- const s = /* @__PURE__ */ new Set();
115
- for (const m of resolvedMarks) s.add(`${m.source}:${m.platformIssueId}`);
116
- return s;
117
- }, [resolvedMarks]);
118
- const filteredRows = useMemo(() => {
119
- return allRows.filter((row) => {
120
- const isResolved = resolvedSet.has(rowId(row));
121
- if (filterMode === "resolved") return isResolved;
122
- if (filterMode === "open") return !isResolved;
123
- return true;
124
- });
125
- }, [allRows, resolvedSet, filterMode]);
126
- useEffect(() => {
127
- setSelectedIndex((i) => filteredRows.length === 0 ? 0 : Math.min(i, filteredRows.length - 1));
128
- }, [filteredRows]);
129
- const markResolved = useCallback(async (row) => {
130
- await backend.call("feedback.markResolved", {
131
- source: row.source,
132
- platformIssueId: row.platformIssueId,
133
- url: row.url,
134
- title: row.title
135
- });
136
- refresh();
137
- }, [backend, refresh]);
138
- const unmarkResolved = useCallback(async (row) => {
139
- await backend.call("feedback.unmarkResolved", {
140
- source: row.source,
141
- platformIssueId: row.platformIssueId
142
- });
143
- refresh();
144
- }, [backend, refresh]);
145
- const submitForm = useCallback(async () => {
146
- if (submitting) return;
147
- if (!formTitle.trim()) {
148
- setFormMsg(t("feedbackPanel.formRequired"));
149
- return;
150
- }
151
- setSubmitting(true);
152
- setFormMsg(t("feedbackPanel.formSubmitting"));
153
- setFormMsgTone(null);
154
- try {
155
- const resp = await backend.call("feedback.submitIssue", {
156
- title: formTitle,
157
- reproduce: formRepro || void 0,
158
- expected: formExpected || void 0,
159
- actual: formActual || void 0
160
- });
161
- if (resp?.ok && resp.url) {
162
- setFormMsg(t("feedbackPanel.formSuccess", { url: resp.url }));
163
- setFormMsgTone("success");
164
- setView("list");
165
- } else if (resp?.error === "repo-unresolved") {
166
- setFormMsg(t("feedbackPanel.formRepoUnresolved"));
167
- setFormMsgTone("error");
168
- } else {
169
- setFormMsg(t("feedbackPanel.formNoChannel"));
170
- setFormMsgTone("error");
171
- }
172
- } catch {
173
- setFormMsg(t("feedbackPanel.formNoChannel"));
174
- setFormMsgTone("error");
175
- } finally {
176
- setSubmitting(false);
177
- }
178
- }, [backend, formTitle, formRepro, formExpected, formActual, submitting]);
179
- useInput((input, key) => {
180
- if (view === "new") {
181
- if (key.escape || input === "q") {
182
- setView("list");
183
- setFormMsg(null);
184
- return;
185
- }
186
- if (key.tab) {
187
- setFormFocus((f) => (f + 1) % 4);
188
- return;
189
- }
190
- if (key.return) {
191
- void submitForm();
192
- return;
193
- }
194
- if (key.backspace || key.delete) {
195
- if (formFocus === 0) setFormTitle((v) => v.slice(0, -1));
196
- else if (formFocus === 1) setFormRepro((v) => v.slice(0, -1));
197
- else if (formFocus === 2) setFormExpected((v) => v.slice(0, -1));
198
- else if (formFocus === 3) setFormActual((v) => v.slice(0, -1));
199
- return;
200
- }
201
- if (input && input.length === 1) {
202
- if (formFocus === 0) setFormTitle((v) => v + input);
203
- else if (formFocus === 1) setFormRepro((v) => v + input);
204
- else if (formFocus === 2) setFormExpected((v) => v + input);
205
- else if (formFocus === 3) setFormActual((v) => v + input);
206
- }
207
- return;
208
- }
209
- if (key.downArrow || input === "j") {
210
- setSelectedIndex((i) => filteredRows.length === 0 ? 0 : Math.min(i + 1, filteredRows.length - 1));
211
- }
212
- if (key.upArrow || input === "k") {
213
- setSelectedIndex((i) => Math.max(i - 1, 0));
214
- }
215
- if (input === "n") setView("new");
216
- if (input === "r") refresh();
217
- if (input === "f") setFilterMode((v) => v === "all" ? "open" : v === "open" ? "resolved" : "all");
218
- if (input === "m" && filteredRows[selectedIndex]) {
219
- const row = filteredRows[selectedIndex];
220
- const isResolved = resolvedSet.has(rowId(row));
221
- if (isResolved) unmarkResolved(row);
222
- else markResolved(row);
223
- }
224
- if (input === "x" && filteredRows[selectedIndex]) {
225
- unmarkResolved(filteredRows[selectedIndex]);
226
- }
227
- if (input === "o" && filteredRows[selectedIndex]) {
228
- void backend.call("feedback.openExternal", { url: filteredRows[selectedIndex].url });
229
- }
230
- if (input === "q" || key.escape) requestPanelClose();
231
- });
232
- const theme = getTheme();
233
- const figures = getFigures();
234
- useEffect(() => {
235
- setPanelHint([
236
- ["n", t("feedbackPanel.hintNew")],
237
- ["m", t("feedbackPanel.hintMark")],
238
- ["x", t("feedbackPanel.hintUnmark")],
239
- ["o", t("feedbackPanel.hintOpen")],
240
- ["r", t("feedbackPanel.hintRefresh")],
241
- ["f", t("feedbackPanel.hintFilter")],
242
- ["q", t("feedbackPanel.hintClose")]
243
- ]);
244
- }, []);
245
- const formRow = (label, value, focused, placeholder) => /* @__PURE__ */ react_shim_default.createElement(Box, { flexDirection: "row", gap: 1 }, /* @__PURE__ */ react_shim_default.createElement(Text, { dimColor: !focused }, focused ? figures.pointer : " ", " ", label), /* @__PURE__ */ react_shim_default.createElement(Text, { dimColor: !value && !focused }, value || placeholder), /* @__PURE__ */ react_shim_default.createElement(Text, { color: theme.selection }, value || (focused ? "_" : "")));
246
- if (view === "new") {
247
- return /* @__PURE__ */ react_shim_default.createElement(Box, { flexDirection: "column", gap: 1 }, /* @__PURE__ */ react_shim_default.createElement(Text, { bold: true }, t("feedbackPanel.newTitle")), /* @__PURE__ */ react_shim_default.createElement(Text, { dimColor: true }, t("feedbackPanel.newSubtitle", { platform })), formRow(t("feedbackPanel.formTitle"), formTitle, formFocus === 0, ""), formRow(t("feedbackPanel.formRepro"), formRepro, formFocus === 1, t("feedbackPanel.formRepro")), formRow(t("feedbackPanel.formExpected"), formExpected, formFocus === 2, t("feedbackPanel.formExpected")), formRow(t("feedbackPanel.formActual"), formActual, formFocus === 3, t("feedbackPanel.formActual")), formMsg && /* @__PURE__ */ react_shim_default.createElement(Text, { color: formMsgTone === "success" ? theme.success : theme.warning }, formMsg), /* @__PURE__ */ react_shim_default.createElement(Text, { dimColor: true }, t("feedbackPanel.formHint")));
248
- }
249
- return /* @__PURE__ */ react_shim_default.createElement(Box, { flexDirection: "column", gap: 1 }, /* @__PURE__ */ react_shim_default.createElement(Box, { justifyContent: "space-between" }, /* @__PURE__ */ react_shim_default.createElement(Text, { bold: true }, t("feedbackPanel.title")), /* @__PURE__ */ react_shim_default.createElement(Text, { dimColor: true }, t("feedbackPanel.platform", { platform }))), loading && /* @__PURE__ */ react_shim_default.createElement(Text, { dimColor: true }, t("feedbackPanel.loading")), listResult?.unavailable && Object.entries(listResult.unavailable).map(([source, reason]) => /* @__PURE__ */ react_shim_default.createElement(Box, { key: source }, /* @__PURE__ */ react_shim_default.createElement(Text, { color: theme.warning }, source, ": ", reason))), /* @__PURE__ */ react_shim_default.createElement(Box, { flexDirection: "column" }, filteredRows.length === 0 && !loading && /* @__PURE__ */ react_shim_default.createElement(Text, { dimColor: true }, t("feedbackPanel.empty")), filteredRows.map((row, i) => {
250
- const isSelected = i === selectedIndex;
251
- const isResolved = resolvedSet.has(rowId(row));
252
- return /* @__PURE__ */ react_shim_default.createElement(Box, { key: rowId(row), gap: 1 }, isSelected && /* @__PURE__ */ react_shim_default.createElement(Text, { color: theme.selection }, figures.pointer), sourceBadge(row.source, theme), /* @__PURE__ */ react_shim_default.createElement(Text, { dimColor: isResolved }, isResolved ? `${figures.check} ` : "", row.title), /* @__PURE__ */ react_shim_default.createElement(Text, { dimColor: true }, formatDate(row.updatedAt ?? row.createdAt)), /* @__PURE__ */ react_shim_default.createElement(Text, { dimColor: true }, row.state));
253
- })), /* @__PURE__ */ react_shim_default.createElement(GroupDivider, { label: t("feedbackPanel.legend") }), /* @__PURE__ */ react_shim_default.createElement(Box, { gap: 2 }, /* @__PURE__ */ react_shim_default.createElement(Text, { dimColor: true }, t("feedbackPanel.filter", { filter: filterMode })), /* @__PURE__ */ react_shim_default.createElement(Text, { dimColor: true }, t("feedbackPanel.total", { count: String(filteredRows.length) }))), /* @__PURE__ */ react_shim_default.createElement(Text, { dimColor: true }, t("feedbackPanel.resolvedNote")));
254
- }
255
- export {
256
- FeedbackPanel as default
257
- };
@@ -1 +0,0 @@
1
- {"apiVersion":1,"compilerVersion":"0.1.0-alpha.6","sourceHash":"9b098c146a255a15c3f2959595ba5729a2da6d666882a4fb8795e4abc1256b39"}