@syntero/orca-cli 1.0.0 → 1.1.1

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 (111) hide show
  1. package/dist/assistant.d.ts +17 -3
  2. package/dist/assistant.d.ts.map +1 -1
  3. package/dist/assistant.js +217 -22
  4. package/dist/assistant.js.map +1 -1
  5. package/dist/auth.d.ts +97 -0
  6. package/dist/auth.d.ts.map +1 -0
  7. package/dist/auth.js +437 -0
  8. package/dist/auth.js.map +1 -0
  9. package/dist/autocomplete.d.ts +24 -0
  10. package/dist/autocomplete.d.ts.map +1 -0
  11. package/dist/autocomplete.js +43 -0
  12. package/dist/autocomplete.js.map +1 -0
  13. package/dist/components/ChatApp.d.ts +32 -0
  14. package/dist/components/ChatApp.d.ts.map +1 -0
  15. package/dist/components/ChatApp.js +470 -0
  16. package/dist/components/ChatApp.js.map +1 -0
  17. package/dist/components/CommandPalette.d.ts +15 -0
  18. package/dist/components/CommandPalette.d.ts.map +1 -0
  19. package/dist/components/CommandPalette.js +22 -0
  20. package/dist/components/CommandPalette.js.map +1 -0
  21. package/dist/components/ConfigWizard.d.ts +25 -0
  22. package/dist/components/ConfigWizard.d.ts.map +1 -0
  23. package/dist/components/ConfigWizard.js +401 -0
  24. package/dist/components/ConfigWizard.js.map +1 -0
  25. package/dist/components/InputFooter.d.ts +33 -0
  26. package/dist/components/InputFooter.d.ts.map +1 -0
  27. package/dist/components/InputFooter.js +618 -0
  28. package/dist/components/InputFooter.js.map +1 -0
  29. package/dist/components/InputModal.d.ts +25 -0
  30. package/dist/components/InputModal.d.ts.map +1 -0
  31. package/dist/components/InputModal.js +529 -0
  32. package/dist/components/InputModal.js.map +1 -0
  33. package/dist/components/ModelMenu.d.ts +24 -0
  34. package/dist/components/ModelMenu.d.ts.map +1 -0
  35. package/dist/components/ModelMenu.js +175 -0
  36. package/dist/components/ModelMenu.js.map +1 -0
  37. package/dist/components/ProviderMenu.d.ts +20 -0
  38. package/dist/components/ProviderMenu.d.ts.map +1 -0
  39. package/dist/components/ProviderMenu.js +31 -0
  40. package/dist/components/ProviderMenu.js.map +1 -0
  41. package/dist/components/SyncMenu.d.ts +23 -0
  42. package/dist/components/SyncMenu.d.ts.map +1 -0
  43. package/dist/components/SyncMenu.js +135 -0
  44. package/dist/components/SyncMenu.js.map +1 -0
  45. package/dist/components/TokenInput.d.ts +15 -0
  46. package/dist/components/TokenInput.d.ts.map +1 -0
  47. package/dist/components/TokenInput.js +103 -0
  48. package/dist/components/TokenInput.js.map +1 -0
  49. package/dist/index.js +323 -173
  50. package/dist/index.js.map +1 -1
  51. package/dist/ink-input.d.ts +14 -0
  52. package/dist/ink-input.d.ts.map +1 -0
  53. package/dist/ink-input.js +92 -0
  54. package/dist/ink-input.js.map +1 -0
  55. package/dist/models.d.ts +115 -0
  56. package/dist/models.d.ts.map +1 -0
  57. package/dist/models.js +221 -0
  58. package/dist/models.js.map +1 -0
  59. package/dist/providers.d.ts +19 -4
  60. package/dist/providers.d.ts.map +1 -1
  61. package/dist/providers.js +80 -112
  62. package/dist/providers.js.map +1 -1
  63. package/dist/settings.d.ts +15 -0
  64. package/dist/settings.d.ts.map +1 -1
  65. package/dist/settings.js +56 -21
  66. package/dist/settings.js.map +1 -1
  67. package/dist/sync/docker.d.ts +68 -0
  68. package/dist/sync/docker.d.ts.map +1 -0
  69. package/dist/sync/docker.js +234 -0
  70. package/dist/sync/docker.js.map +1 -0
  71. package/dist/sync/download.d.ts +87 -0
  72. package/dist/sync/download.d.ts.map +1 -0
  73. package/dist/sync/download.js +291 -0
  74. package/dist/sync/download.js.map +1 -0
  75. package/dist/sync/hash.d.ts +60 -0
  76. package/dist/sync/hash.d.ts.map +1 -0
  77. package/dist/sync/hash.js +92 -0
  78. package/dist/sync/hash.js.map +1 -0
  79. package/dist/sync/index.d.ts +15 -0
  80. package/dist/sync/index.d.ts.map +1 -0
  81. package/dist/sync/index.js +21 -0
  82. package/dist/sync/index.js.map +1 -0
  83. package/dist/sync/manifest.d.ts +132 -0
  84. package/dist/sync/manifest.d.ts.map +1 -0
  85. package/dist/sync/manifest.js +260 -0
  86. package/dist/sync/manifest.js.map +1 -0
  87. package/dist/sync/progress.d.ts +164 -0
  88. package/dist/sync/progress.d.ts.map +1 -0
  89. package/dist/sync/progress.js +233 -0
  90. package/dist/sync/progress.js.map +1 -0
  91. package/dist/sync/services.d.ts +70 -0
  92. package/dist/sync/services.d.ts.map +1 -0
  93. package/dist/sync/services.js +134 -0
  94. package/dist/sync/services.js.map +1 -0
  95. package/dist/sync/sync-engine.d.ts +69 -0
  96. package/dist/sync/sync-engine.d.ts.map +1 -0
  97. package/dist/sync/sync-engine.js +533 -0
  98. package/dist/sync/sync-engine.js.map +1 -0
  99. package/dist/tokens.d.ts +70 -0
  100. package/dist/tokens.d.ts.map +1 -0
  101. package/dist/tokens.js +198 -0
  102. package/dist/tokens.js.map +1 -0
  103. package/dist/tools.d.ts +60 -0
  104. package/dist/tools.d.ts.map +1 -1
  105. package/dist/tools.js +34 -0
  106. package/dist/tools.js.map +1 -1
  107. package/dist/types/sync.d.ts +284 -0
  108. package/dist/types/sync.d.ts.map +1 -0
  109. package/dist/types/sync.js +5 -0
  110. package/dist/types/sync.js.map +1 -0
  111. package/package.json +10 -2
@@ -0,0 +1,175 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useEffect } from 'react';
3
+ import { Box, Text, useInput } from 'ink';
4
+ import { Provider } from '../settings.js';
5
+ import { isAuthenticated, getSelectedCloudProvider } from '../auth.js';
6
+ import { ModelRegistry } from '../models.js';
7
+ const PROVIDERS = [
8
+ { name: Provider.ANTHROPIC, displayName: 'Anthropic (Claude)' },
9
+ { name: Provider.OPENAI, displayName: 'OpenAI (GPT)' },
10
+ { name: Provider.AZURE, displayName: 'Azure OpenAI' },
11
+ ];
12
+ /**
13
+ * ModelMenu - Two-step inline model selection menu.
14
+ *
15
+ * Step 1: Select provider (Anthropic, OpenAI, Azure)
16
+ * Step 2: Select model for that provider
17
+ *
18
+ * For Azure: Step 2 shows a text input for deployment name.
19
+ */
20
+ export function ModelMenu({ isOpen, settings, onSelect, onCancel, }) {
21
+ // Current step in the flow
22
+ const [step, setStep] = useState('provider');
23
+ // Provider selection state
24
+ const [providerIndex, setProviderIndex] = useState(0);
25
+ const [selectedProvider, setSelectedProvider] = useState('');
26
+ // Model selection state
27
+ const [models, setModels] = useState([]);
28
+ const [modelIndex, setModelIndex] = useState(0);
29
+ const [loading, setLoading] = useState(false);
30
+ // Reset state when menu opens
31
+ useEffect(() => {
32
+ if (isOpen) {
33
+ setStep('provider');
34
+ setModels([]);
35
+ setModelIndex(0);
36
+ setLoading(false);
37
+ // Determine the active provider (cloud or local)
38
+ let activeProvider = settings.provider;
39
+ if (isAuthenticated()) {
40
+ const cloudProvider = getSelectedCloudProvider();
41
+ if (cloudProvider) {
42
+ activeProvider = cloudProvider.toLowerCase();
43
+ }
44
+ }
45
+ // Set initial provider index to current provider
46
+ const idx = PROVIDERS.findIndex(p => p.name === activeProvider);
47
+ setProviderIndex(idx >= 0 ? idx : 0);
48
+ setSelectedProvider('');
49
+ }
50
+ }, [isOpen, settings.provider]);
51
+ // Load models when entering model step
52
+ useEffect(() => {
53
+ if (!isOpen || step !== 'model' || !selectedProvider)
54
+ return;
55
+ const loadModels = async () => {
56
+ setLoading(true);
57
+ let modelList = [];
58
+ // Get models from ModelRegistry for all providers
59
+ const registryModels = ModelRegistry.getModelsForProvider(selectedProvider);
60
+ if (selectedProvider === Provider.ANTHROPIC) {
61
+ const currentModel = settings.anthropic.model;
62
+ modelList = registryModels.map((model) => ({
63
+ id: model.id,
64
+ description: `${model.displayName} - ${model.description}`,
65
+ isCurrent: model.id === currentModel,
66
+ }));
67
+ }
68
+ else if (selectedProvider === Provider.OPENAI) {
69
+ // Model comes from local settings only (not from cloud credentials)
70
+ const currentModel = settings.openai.model;
71
+ // Use models from ModelRegistry (fixed list of 2 models)
72
+ modelList = registryModels.map((model) => ({
73
+ id: model.id,
74
+ description: `${model.displayName} - ${model.description}`,
75
+ isCurrent: model.id === currentModel,
76
+ }));
77
+ }
78
+ else if (selectedProvider === Provider.AZURE) {
79
+ // Azure now has fixed models in the registry (azure-large, azure-small)
80
+ const currentDeployment = settings.azure.deployment || '';
81
+ modelList = registryModels.map((model) => ({
82
+ id: model.id,
83
+ description: `${model.displayName} - ${model.description}`,
84
+ isCurrent: model.id === currentDeployment,
85
+ }));
86
+ }
87
+ setModels(modelList);
88
+ // Set initial selection to current model
89
+ const currentIdx = modelList.findIndex(m => m.isCurrent);
90
+ setModelIndex(currentIdx >= 0 ? currentIdx : 0);
91
+ setLoading(false);
92
+ };
93
+ loadModels();
94
+ }, [isOpen, step, selectedProvider, settings]);
95
+ // Handle keyboard input
96
+ useInput((input, key) => {
97
+ if (!isOpen)
98
+ return;
99
+ // Escape to cancel at any step
100
+ if (key.escape) {
101
+ onCancel();
102
+ return;
103
+ }
104
+ if (step === 'provider') {
105
+ // Provider menu navigation
106
+ if (key.upArrow) {
107
+ setProviderIndex(prev => (prev > 0 ? prev - 1 : PROVIDERS.length - 1));
108
+ }
109
+ else if (key.downArrow) {
110
+ setProviderIndex(prev => (prev < PROVIDERS.length - 1 ? prev + 1 : 0));
111
+ }
112
+ else if (key.return) {
113
+ const provider = PROVIDERS[providerIndex].name;
114
+ setSelectedProvider(provider);
115
+ setStep('model');
116
+ }
117
+ }
118
+ else if (step === 'model') {
119
+ // Model menu navigation for all providers (Anthropic/OpenAI/Azure)
120
+ // Azure now uses fixed models from registry instead of text input
121
+ if (key.upArrow && !loading) {
122
+ setModelIndex(prev => (prev > 0 ? prev - 1 : models.length - 1));
123
+ }
124
+ else if (key.downArrow && !loading) {
125
+ setModelIndex(prev => (prev < models.length - 1 ? prev + 1 : 0));
126
+ }
127
+ else if (key.return && !loading && models.length > 0) {
128
+ onSelect(selectedProvider, models[modelIndex].id);
129
+ }
130
+ }
131
+ }, { isActive: isOpen });
132
+ if (!isOpen) {
133
+ return null;
134
+ }
135
+ // Determine current provider for highlighting
136
+ let currentProvider = settings.provider;
137
+ if (isAuthenticated()) {
138
+ const cloudProvider = getSelectedCloudProvider();
139
+ if (cloudProvider) {
140
+ currentProvider = cloudProvider.toLowerCase();
141
+ }
142
+ }
143
+ // Render Step 1: Provider Selection
144
+ if (step === 'provider') {
145
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: "magenta", paddingX: 1, marginTop: 0, children: [_jsx(Box, { marginBottom: 0, children: _jsx(Text, { bold: true, children: "Select Model" }) }), _jsx(Box, { marginBottom: 0, children: _jsx(Text, { bold: true, color: "cyan", children: "Step 1: Select Provider" }) }), PROVIDERS.map((provider, index) => {
146
+ const isSelected = index === providerIndex;
147
+ const isCurrent = provider.name === currentProvider;
148
+ return (_jsx(Box, { children: isSelected ? (_jsxs(Text, { inverse: true, bold: true, children: [' > ', provider.displayName, isCurrent ? ' (current)' : ''] })) : (_jsxs(Text, { children: [_jsxs(Text, { children: [' ', provider.displayName] }), isCurrent && _jsx(Text, { color: "green", children: " (current)" })] })) }, provider.name));
149
+ }), _jsx(Box, { marginTop: 0, children: _jsxs(Text, { dimColor: true, children: [' ', "Use arrows to navigate, Enter to select, Esc to cancel"] }) })] }));
150
+ }
151
+ // Render Step 2: Model Selection
152
+ // Note: Azure now uses the same model selection UI as other providers
153
+ // Loading state
154
+ if (loading) {
155
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: "magenta", paddingX: 1, marginTop: 0, children: [_jsx(Box, { marginBottom: 0, children: _jsx(Text, { bold: true, children: "Select Model" }) }), _jsx(Box, { marginBottom: 0, children: _jsxs(Text, { bold: true, color: "cyan", children: ["Step 2: Select Model (", selectedProvider.charAt(0).toUpperCase() + selectedProvider.slice(1), ")"] }) }), _jsx(Text, { dimColor: true, children: "Loading available models..." })] }));
156
+ }
157
+ // No models available
158
+ if (models.length === 0) {
159
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: "magenta", paddingX: 1, marginTop: 0, children: [_jsx(Box, { marginBottom: 0, children: _jsx(Text, { bold: true, children: "Select Model" }) }), _jsx(Box, { marginBottom: 0, children: _jsxs(Text, { bold: true, color: "cyan", children: ["Step 2: Select Model (", selectedProvider.charAt(0).toUpperCase() + selectedProvider.slice(1), ")"] }) }), _jsx(Text, { color: "yellow", children: "No models available for this provider." }), _jsx(Box, { marginTop: 0, children: _jsxs(Text, { dimColor: true, children: [' ', "Esc to cancel"] }) })] }));
160
+ }
161
+ // Calculate longest model ID for alignment
162
+ const maxIdLength = Math.max(...models.map(m => m.id.length));
163
+ // Render model selection menu
164
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: "magenta", paddingX: 1, marginTop: 0, children: [_jsx(Box, { marginBottom: 0, children: _jsx(Text, { bold: true, children: "Select Model" }) }), _jsx(Box, { marginBottom: 0, children: _jsxs(Text, { bold: true, color: "cyan", children: ["Step 2: Select Model (", selectedProvider.charAt(0).toUpperCase() + selectedProvider.slice(1), ")"] }) }), models.map((model, index) => {
165
+ const isSelected = index === modelIndex;
166
+ const paddedId = model.id.padEnd(maxIdLength + 2);
167
+ // Truncate description if too long
168
+ const maxDescLen = 40;
169
+ const shortDesc = model.description.length > maxDescLen
170
+ ? model.description.slice(0, maxDescLen - 3) + '...'
171
+ : model.description;
172
+ return (_jsx(Box, { children: isSelected ? (_jsxs(Text, { inverse: true, bold: true, children: [' > ', paddedId, model.isCurrent ? '(current)' : ''] })) : (_jsxs(Text, { children: [_jsxs(Text, { color: "cyan", children: [' ', model.id] }), _jsxs(Text, { dimColor: true, children: [' '.repeat(maxIdLength - model.id.length + 2), model.isCurrent ? (_jsx(Text, { color: "green", children: "(current)" })) : shortDesc && !shortDesc.startsWith('OpenAI') ? (shortDesc) : ''] })] })) }, model.id));
173
+ }), _jsx(Box, { marginTop: 0, children: _jsxs(Text, { dimColor: true, children: [' ', "Use arrows to navigate, Enter to select, Esc to cancel"] }) })] }));
174
+ }
175
+ //# sourceMappingURL=ModelMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModelMenu.js","sourceRoot":"","sources":["../../src/components/ModelMenu.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import React from 'react';
2
+ export interface ProviderInfo {
3
+ name: string;
4
+ displayName: string;
5
+ isActive: boolean;
6
+ isConfigured: boolean;
7
+ model?: string;
8
+ }
9
+ interface ProviderMenuProps {
10
+ providers: ProviderInfo[];
11
+ selectedIndex: number;
12
+ isOpen: boolean;
13
+ }
14
+ /**
15
+ * Inline provider selection menu component that displays below the input box.
16
+ * Shows available providers with the selected item highlighted.
17
+ */
18
+ export declare function ProviderMenu({ providers, selectedIndex, isOpen, }: ProviderMenuProps): React.ReactElement | null;
19
+ export {};
20
+ //# sourceMappingURL=ProviderMenu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProviderMenu.d.ts","sourceRoot":"","sources":["../../src/components/ProviderMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,iBAAiB;IACzB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,EAC3B,SAAS,EACT,aAAa,EACb,MAAM,GACP,EAAE,iBAAiB,GAAG,KAAK,CAAC,YAAY,GAAG,IAAI,CAuE/C"}
@@ -0,0 +1,31 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ /**
4
+ * Inline provider selection menu component that displays below the input box.
5
+ * Shows available providers with the selected item highlighted.
6
+ */
7
+ export function ProviderMenu({ providers, selectedIndex, isOpen, }) {
8
+ if (!isOpen || providers.length === 0) {
9
+ return null;
10
+ }
11
+ // Calculate the longest provider name for alignment
12
+ const maxNameLength = Math.max(...providers.map((p) => p.displayName.length));
13
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: "magenta", paddingX: 1, marginTop: 0, children: [_jsx(Box, { marginBottom: 0, children: _jsx(Text, { bold: true, children: "Select provider:" }) }), providers.map((provider, index) => {
14
+ const isSelected = index === selectedIndex;
15
+ const paddedName = provider.displayName.padEnd(maxNameLength + 2);
16
+ // Build status indicators
17
+ const statusParts = [];
18
+ if (provider.isActive) {
19
+ statusParts.push('active');
20
+ }
21
+ if (!provider.isConfigured) {
22
+ statusParts.push('not configured');
23
+ }
24
+ else if (provider.model) {
25
+ statusParts.push(provider.model);
26
+ }
27
+ const status = statusParts.length > 0 ? `(${statusParts.join(', ')})` : '';
28
+ return (_jsx(Box, { children: isSelected ? (_jsxs(Text, { inverse: true, bold: true, children: [' > ', paddedName, status] })) : (_jsxs(Text, { children: [_jsxs(Text, { color: provider.isConfigured ? 'cyan' : 'gray', children: [' ', provider.displayName] }), _jsxs(Text, { dimColor: true, children: [' '.repeat(maxNameLength - provider.displayName.length + 2), provider.isActive ? (_jsx(Text, { color: "green", children: status })) : (status)] })] })) }, provider.name));
29
+ }), _jsx(Box, { marginTop: 0, children: _jsxs(Text, { dimColor: true, children: [' ', "Use arrows to navigate, Enter to select, Esc to cancel"] }) })] }));
30
+ }
31
+ //# sourceMappingURL=ProviderMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProviderMenu.js","sourceRoot":"","sources":["../../src/components/ProviderMenu.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAgBhC;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,EAC3B,SAAS,EACT,aAAa,EACb,MAAM,GACY;IAClB,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,oDAAoD;IACpD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;IAE9E,OAAO,CACL,MAAC,GAAG,IACF,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAC,SAAS,EACrB,QAAQ,EAAE,CAAC,EACX,SAAS,EAAE,CAAC,aAGZ,KAAC,GAAG,IAAC,YAAY,EAAE,CAAC,YAClB,KAAC,IAAI,IAAC,IAAI,uCAAwB,GAC9B,EAGL,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;gBACjC,MAAM,UAAU,GAAG,KAAK,KAAK,aAAa,CAAC;gBAC3C,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;gBAElE,0BAA0B;gBAC1B,MAAM,WAAW,GAAa,EAAE,CAAC;gBACjC,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;oBACtB,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC7B,CAAC;gBACD,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;oBAC3B,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBACrC,CAAC;qBAAM,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;oBAC1B,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACnC,CAAC;gBACD,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAE3E,OAAO,CACL,KAAC,GAAG,cACD,UAAU,CAAC,CAAC,CAAC,CACZ,MAAC,IAAI,IAAC,OAAO,QAAC,IAAI,mBACf,KAAK,EAAE,UAAU,EAAE,MAAM,IACrB,CACR,CAAC,CAAC,CAAC,CACF,MAAC,IAAI,eACH,MAAC,IAAI,IAAC,KAAK,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,aACjD,KAAK,EAAE,QAAQ,CAAC,WAAW,IACvB,EACP,MAAC,IAAI,IAAC,QAAQ,mBACX,GAAG,CAAC,MAAM,CAAC,aAAa,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,EAC3D,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CACnB,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,YAAE,MAAM,GAAQ,CACpC,CAAC,CAAC,CAAC,CACF,MAAM,CACP,IACI,IACF,CACR,IAnBO,QAAQ,CAAC,IAAI,CAoBjB,CACP,CAAC;YACJ,CAAC,CAAC,EAGF,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,MAAC,IAAI,IAAC,QAAQ,mBACX,GAAG,8DACC,GACH,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,23 @@
1
+ import React from 'react';
2
+ /**
3
+ * Result of a sync menu selection.
4
+ */
5
+ export interface SyncMenuResult {
6
+ action: 'sync' | 'preview' | 'status' | 'resume' | 'cancel';
7
+ force?: boolean;
8
+ }
9
+ interface SyncMenuProps {
10
+ isOpen: boolean;
11
+ onSelect: (result: SyncMenuResult) => void;
12
+ onCancel: () => void;
13
+ }
14
+ /**
15
+ * SyncMenu - Menu-based interface for library sync operations.
16
+ *
17
+ * Provides a two-step menu:
18
+ * 1. Main menu: Choose sync action (sync all, preview, status, resume, cancel)
19
+ * 2. Sync options (only for "Sync All"): Choose sync mode (normal, force, back)
20
+ */
21
+ export declare function SyncMenu({ isOpen, onSelect, onCancel, }: SyncMenuProps): React.ReactElement | null;
22
+ export {};
23
+ //# sourceMappingURL=SyncMenu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SyncMenu.d.ts","sourceRoot":"","sources":["../../src/components/SyncMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAmBnD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC5D,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,UAAU,aAAa;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;IAC3C,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AA6BD;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,EACvB,MAAM,EACN,QAAQ,EACR,QAAQ,GACT,EAAE,aAAa,GAAG,KAAK,CAAC,YAAY,GAAG,IAAI,CA2M3C"}
@@ -0,0 +1,135 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useEffect } from 'react';
3
+ import { Box, Text, useInput } from 'ink';
4
+ import { hasResumableSync } from '../sync/index.js';
5
+ const MAIN_MENU_ITEMS = [
6
+ { id: 'sync-all', label: 'Sync All', description: 'Full library sync' },
7
+ { id: 'preview', label: 'Preview Changes', description: 'Show what would change (dry run)' },
8
+ { id: 'status', label: 'Show Sync Status', description: 'Current sync state and stats' },
9
+ { id: 'resume', label: 'Resume Interrupted Sync', showWhen: () => hasResumableSync() },
10
+ { id: 'cancel', label: 'Cancel' },
11
+ ];
12
+ const SYNC_OPTIONS = [
13
+ { id: 'normal', label: 'Normal Sync', description: 'Standard sync with warnings if applicable' },
14
+ { id: 'force', label: 'Force Sync', description: 'Skip warnings, overwrite everything' },
15
+ { id: 'back', label: 'Back', description: 'Return to main menu' },
16
+ ];
17
+ /**
18
+ * SyncMenu - Menu-based interface for library sync operations.
19
+ *
20
+ * Provides a two-step menu:
21
+ * 1. Main menu: Choose sync action (sync all, preview, status, resume, cancel)
22
+ * 2. Sync options (only for "Sync All"): Choose sync mode (normal, force, back)
23
+ */
24
+ export function SyncMenu({ isOpen, onSelect, onCancel, }) {
25
+ // Current step in the flow
26
+ const [step, setStep] = useState('main');
27
+ // Selection indices
28
+ const [mainIndex, setMainIndex] = useState(0);
29
+ const [optionIndex, setOptionIndex] = useState(0);
30
+ // Filtered main menu items (respects showWhen)
31
+ const [visibleMenuItems, setVisibleMenuItems] = useState([]);
32
+ // Reset state when menu opens
33
+ useEffect(() => {
34
+ if (isOpen) {
35
+ setStep('main');
36
+ setMainIndex(0);
37
+ setOptionIndex(0);
38
+ // Build visible menu items
39
+ const visible = MAIN_MENU_ITEMS.filter(item => !item.showWhen || item.showWhen());
40
+ setVisibleMenuItems(visible);
41
+ }
42
+ }, [isOpen]);
43
+ // Handle keyboard input
44
+ useInput((input, key) => {
45
+ if (!isOpen)
46
+ return;
47
+ // Escape to cancel at any step
48
+ if (key.escape) {
49
+ if (step === 'sync-options') {
50
+ // Go back to main menu instead of closing
51
+ setStep('main');
52
+ return;
53
+ }
54
+ onCancel();
55
+ return;
56
+ }
57
+ if (step === 'main') {
58
+ // Main menu navigation
59
+ if (key.upArrow) {
60
+ setMainIndex(prev => (prev > 0 ? prev - 1 : visibleMenuItems.length - 1));
61
+ }
62
+ else if (key.downArrow) {
63
+ setMainIndex(prev => (prev < visibleMenuItems.length - 1 ? prev + 1 : 0));
64
+ }
65
+ else if (key.return) {
66
+ const selected = visibleMenuItems[mainIndex];
67
+ if (!selected)
68
+ return;
69
+ switch (selected.id) {
70
+ case 'sync-all':
71
+ // Show sync options sub-menu
72
+ setStep('sync-options');
73
+ setOptionIndex(0);
74
+ break;
75
+ case 'preview':
76
+ onSelect({ action: 'preview' });
77
+ break;
78
+ case 'status':
79
+ onSelect({ action: 'status' });
80
+ break;
81
+ case 'resume':
82
+ onSelect({ action: 'resume' });
83
+ break;
84
+ case 'cancel':
85
+ onCancel();
86
+ break;
87
+ }
88
+ }
89
+ }
90
+ else if (step === 'sync-options') {
91
+ // Sync options navigation
92
+ if (key.upArrow) {
93
+ setOptionIndex(prev => (prev > 0 ? prev - 1 : SYNC_OPTIONS.length - 1));
94
+ }
95
+ else if (key.downArrow) {
96
+ setOptionIndex(prev => (prev < SYNC_OPTIONS.length - 1 ? prev + 1 : 0));
97
+ }
98
+ else if (key.return) {
99
+ const selected = SYNC_OPTIONS[optionIndex];
100
+ if (!selected)
101
+ return;
102
+ switch (selected.id) {
103
+ case 'normal':
104
+ onSelect({ action: 'sync', force: false });
105
+ break;
106
+ case 'force':
107
+ onSelect({ action: 'sync', force: true });
108
+ break;
109
+ case 'back':
110
+ setStep('main');
111
+ break;
112
+ }
113
+ }
114
+ }
115
+ }, { isActive: isOpen });
116
+ if (!isOpen) {
117
+ return null;
118
+ }
119
+ // Render main menu
120
+ if (step === 'main') {
121
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: "magenta", paddingX: 1, marginTop: 0, children: [_jsx(Box, { marginBottom: 0, children: _jsx(Text, { bold: true, children: "Sync Library" }) }), visibleMenuItems.map((item, index) => {
122
+ const isSelected = index === mainIndex;
123
+ return (_jsx(Box, { children: isSelected ? (_jsxs(Text, { inverse: true, bold: true, children: [' > ', item.label] })) : (_jsxs(Text, { children: [' ', item.label, item.description && (_jsxs(Text, { dimColor: true, children: [" - ", item.description] }))] })) }, item.id));
124
+ }), _jsx(Box, { marginTop: 0, children: _jsxs(Text, { dimColor: true, children: [' ', "Use arrows to navigate, Enter to select, Esc to cancel"] }) })] }));
125
+ }
126
+ // Render sync options sub-menu
127
+ if (step === 'sync-options') {
128
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: "magenta", paddingX: 1, marginTop: 0, children: [_jsx(Box, { marginBottom: 0, children: _jsx(Text, { bold: true, children: "Sync Library" }) }), _jsx(Box, { marginBottom: 0, children: _jsx(Text, { bold: true, color: "cyan", children: "Sync Options" }) }), SYNC_OPTIONS.map((item, index) => {
129
+ const isSelected = index === optionIndex;
130
+ return (_jsx(Box, { children: isSelected ? (_jsxs(Text, { inverse: true, bold: true, children: [' > ', item.label] })) : (_jsxs(Text, { children: [' ', item.label, item.description && (_jsxs(Text, { dimColor: true, children: [" - ", item.description] }))] })) }, item.id));
131
+ }), _jsx(Box, { marginTop: 0, children: _jsxs(Text, { dimColor: true, children: [' ', "Use arrows to navigate, Enter to select, Esc to go back"] }) })] }));
132
+ }
133
+ return null;
134
+ }
135
+ //# sourceMappingURL=SyncMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SyncMenu.js","sourceRoot":"","sources":["../../src/components/SyncMenu.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ interface TokenInputProps {
3
+ isOpen: boolean;
4
+ onSubmit: (token: string) => void;
5
+ onCancel: () => void;
6
+ }
7
+ /**
8
+ * TokenInput - Simple inline input for pasting CLI tokens.
9
+ *
10
+ * Shows a text input (not masked) for pasting tokens from the web UI.
11
+ * Enter to submit, Escape to cancel.
12
+ */
13
+ export declare function TokenInput({ isOpen, onSubmit, onCancel, }: TokenInputProps): React.ReactElement | null;
14
+ export {};
15
+ //# sourceMappingURL=TokenInput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TokenInput.d.ts","sourceRoot":"","sources":["../../src/components/TokenInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAGnD,UAAU,eAAe;IACvB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,QAAQ,EACR,QAAQ,GACT,EAAE,eAAe,GAAG,KAAK,CAAC,YAAY,GAAG,IAAI,CAiJ7C"}
@@ -0,0 +1,103 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useEffect } from 'react';
3
+ import { Box, Text, useInput } from 'ink';
4
+ /**
5
+ * TokenInput - Simple inline input for pasting CLI tokens.
6
+ *
7
+ * Shows a text input (not masked) for pasting tokens from the web UI.
8
+ * Enter to submit, Escape to cancel.
9
+ */
10
+ export function TokenInput({ isOpen, onSubmit, onCancel, }) {
11
+ const [inputValue, setInputValue] = useState('');
12
+ const [cursorPos, setCursorPos] = useState(0);
13
+ // Reset state when component opens
14
+ useEffect(() => {
15
+ if (isOpen) {
16
+ setInputValue('');
17
+ setCursorPos(0);
18
+ }
19
+ }, [isOpen]);
20
+ // Handle keyboard input
21
+ useInput((input, key) => {
22
+ if (!isOpen)
23
+ return;
24
+ // Escape to cancel
25
+ if (key.escape) {
26
+ onCancel();
27
+ return;
28
+ }
29
+ // Enter to submit
30
+ if (key.return) {
31
+ const trimmedValue = inputValue.trim();
32
+ if (trimmedValue.length > 0) {
33
+ onSubmit(trimmedValue);
34
+ }
35
+ return;
36
+ }
37
+ // Alt+Backspace: delete word before cursor
38
+ if (key.meta && (key.backspace || key.delete)) {
39
+ if (cursorPos > 0) {
40
+ let pos = cursorPos;
41
+ // Skip any whitespace immediately before cursor
42
+ while (pos > 0 && /\s/.test(inputValue[pos - 1])) {
43
+ pos--;
44
+ }
45
+ // Delete back to the previous whitespace or start of line
46
+ while (pos > 0 && !/\s/.test(inputValue[pos - 1])) {
47
+ pos--;
48
+ }
49
+ setInputValue(prev => prev.slice(0, pos) + prev.slice(cursorPos));
50
+ setCursorPos(pos);
51
+ }
52
+ return;
53
+ }
54
+ // Backspace/Delete
55
+ if (key.backspace || key.delete) {
56
+ if (cursorPos > 0) {
57
+ setInputValue(prev => prev.slice(0, cursorPos - 1) + prev.slice(cursorPos));
58
+ setCursorPos(prev => prev - 1);
59
+ }
60
+ return;
61
+ }
62
+ // Arrow Left
63
+ if (key.leftArrow) {
64
+ setCursorPos(prev => Math.max(0, prev - 1));
65
+ return;
66
+ }
67
+ // Arrow Right
68
+ if (key.rightArrow) {
69
+ setCursorPos(prev => Math.min(inputValue.length, prev + 1));
70
+ return;
71
+ }
72
+ // Ctrl+A - Home
73
+ if (input === 'a' && key.ctrl) {
74
+ setCursorPos(0);
75
+ return;
76
+ }
77
+ // Ctrl+E - End
78
+ if (input === 'e' && key.ctrl) {
79
+ setCursorPos(inputValue.length);
80
+ return;
81
+ }
82
+ // Ctrl+U - Clear line
83
+ if (input === 'u' && key.ctrl) {
84
+ setInputValue('');
85
+ setCursorPos(0);
86
+ return;
87
+ }
88
+ // Regular character input (including multi-character paste)
89
+ if (input && !key.ctrl && !key.meta) {
90
+ setInputValue(prev => prev.slice(0, cursorPos) + input + prev.slice(cursorPos));
91
+ setCursorPos(prev => prev + input.length);
92
+ }
93
+ }, { isActive: isOpen });
94
+ if (!isOpen) {
95
+ return null;
96
+ }
97
+ // Render input with cursor
98
+ const beforeCursor = inputValue.slice(0, cursorPos);
99
+ const cursorChar = inputValue[cursorPos] || ' ';
100
+ const afterCursor = inputValue.slice(cursorPos + 1);
101
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: "magenta", paddingX: 1, marginTop: 0, children: [_jsx(Box, { marginBottom: 0, children: _jsx(Text, { bold: true, children: "Enter CLI Token" }) }), _jsx(Box, { marginBottom: 0, children: _jsx(Text, { dimColor: true, children: "Paste your CLI token from the web UI:" }) }), _jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: '> ' }), _jsx(Text, { children: beforeCursor }), _jsx(Text, { inverse: true, children: cursorChar }), _jsx(Text, { children: afterCursor })] }), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { dimColor: true, children: [' ', "Enter to submit, Ctrl+U to clear, Esc to cancel"] }) })] }));
102
+ }
103
+ //# sourceMappingURL=TokenInput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TokenInput.js","sourceRoot":"","sources":["../../src/components/TokenInput.tsx"],"names":[],"mappings":"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"}