@steipete/summarize 0.7.1 → 0.8.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 (151) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/README.md +53 -2
  3. package/dist/cli.js +3 -0
  4. package/dist/esm/cache.js +353 -0
  5. package/dist/esm/cache.js.map +1 -0
  6. package/dist/esm/config.js +78 -1
  7. package/dist/esm/config.js.map +1 -1
  8. package/dist/esm/content/asset.js +11 -17
  9. package/dist/esm/content/asset.js.map +1 -1
  10. package/dist/esm/daemon/auto-mode.js +8 -0
  11. package/dist/esm/daemon/auto-mode.js.map +1 -0
  12. package/dist/esm/daemon/cli.js +284 -0
  13. package/dist/esm/daemon/cli.js.map +1 -0
  14. package/dist/esm/daemon/config.js +82 -0
  15. package/dist/esm/daemon/config.js.map +1 -0
  16. package/dist/esm/daemon/constants.js +8 -0
  17. package/dist/esm/daemon/constants.js.map +1 -0
  18. package/dist/esm/daemon/env-merge.js +4 -0
  19. package/dist/esm/daemon/env-merge.js.map +1 -0
  20. package/dist/esm/daemon/env-snapshot.js +43 -0
  21. package/dist/esm/daemon/env-snapshot.js.map +1 -0
  22. package/dist/esm/daemon/flow-context.js +265 -0
  23. package/dist/esm/daemon/flow-context.js.map +1 -0
  24. package/dist/esm/daemon/launchd.js +149 -0
  25. package/dist/esm/daemon/launchd.js.map +1 -0
  26. package/dist/esm/daemon/meta.js +35 -0
  27. package/dist/esm/daemon/meta.js.map +1 -0
  28. package/dist/esm/daemon/models.js +175 -0
  29. package/dist/esm/daemon/models.js.map +1 -0
  30. package/dist/esm/daemon/request-settings.js +91 -0
  31. package/dist/esm/daemon/request-settings.js.map +1 -0
  32. package/dist/esm/daemon/schtasks.js +108 -0
  33. package/dist/esm/daemon/schtasks.js.map +1 -0
  34. package/dist/esm/daemon/server.js +399 -0
  35. package/dist/esm/daemon/server.js.map +1 -0
  36. package/dist/esm/daemon/summarize-progress.js +57 -0
  37. package/dist/esm/daemon/summarize-progress.js.map +1 -0
  38. package/dist/esm/daemon/summarize.js +263 -0
  39. package/dist/esm/daemon/summarize.js.map +1 -0
  40. package/dist/esm/daemon/systemd.js +117 -0
  41. package/dist/esm/daemon/systemd.js.map +1 -0
  42. package/dist/esm/flags.js +3 -1
  43. package/dist/esm/flags.js.map +1 -1
  44. package/dist/esm/llm/generate-text.js +445 -154
  45. package/dist/esm/llm/generate-text.js.map +1 -1
  46. package/dist/esm/llm/html-to-markdown.js +4 -1
  47. package/dist/esm/llm/html-to-markdown.js.map +1 -1
  48. package/dist/esm/llm/prompt.js +14 -0
  49. package/dist/esm/llm/prompt.js.map +1 -0
  50. package/dist/esm/llm/transcript-to-markdown.js +57 -0
  51. package/dist/esm/llm/transcript-to-markdown.js.map +1 -0
  52. package/dist/esm/model-spec.js +2 -2
  53. package/dist/esm/model-spec.js.map +1 -1
  54. package/dist/esm/run/attachments.js +10 -42
  55. package/dist/esm/run/attachments.js.map +1 -1
  56. package/dist/esm/run/cache-state.js +48 -0
  57. package/dist/esm/run/cache-state.js.map +1 -0
  58. package/dist/esm/run/cli-preflight.js +15 -1
  59. package/dist/esm/run/cli-preflight.js.map +1 -1
  60. package/dist/esm/run/cookies/twitter.js +224 -0
  61. package/dist/esm/run/cookies/twitter.js.map +1 -0
  62. package/dist/esm/run/fetch-with-timeout.js +1 -1
  63. package/dist/esm/run/fetch-with-timeout.js.map +1 -1
  64. package/dist/esm/run/finish-line.js +46 -17
  65. package/dist/esm/run/finish-line.js.map +1 -1
  66. package/dist/esm/run/flows/asset/input.js +2 -4
  67. package/dist/esm/run/flows/asset/input.js.map +1 -1
  68. package/dist/esm/run/flows/asset/preprocess.js +52 -72
  69. package/dist/esm/run/flows/asset/preprocess.js.map +1 -1
  70. package/dist/esm/run/flows/asset/summary.js +127 -47
  71. package/dist/esm/run/flows/asset/summary.js.map +1 -1
  72. package/dist/esm/run/flows/url/extract.js +6 -1
  73. package/dist/esm/run/flows/url/extract.js.map +1 -1
  74. package/dist/esm/run/flows/url/flow.js +166 -85
  75. package/dist/esm/run/flows/url/flow.js.map +1 -1
  76. package/dist/esm/run/flows/url/markdown.js +88 -46
  77. package/dist/esm/run/flows/url/markdown.js.map +1 -1
  78. package/dist/esm/run/flows/url/summary.js +263 -185
  79. package/dist/esm/run/flows/url/summary.js.map +1 -1
  80. package/dist/esm/run/help.js +33 -2
  81. package/dist/esm/run/help.js.map +1 -1
  82. package/dist/esm/run/run-env.js +36 -2
  83. package/dist/esm/run/run-env.js.map +1 -1
  84. package/dist/esm/run/runner.js +362 -227
  85. package/dist/esm/run/runner.js.map +1 -1
  86. package/dist/esm/run/summary-engine.js +21 -6
  87. package/dist/esm/run/summary-engine.js.map +1 -1
  88. package/dist/esm/run/summary-llm.js +4 -1
  89. package/dist/esm/run/summary-llm.js.map +1 -1
  90. package/dist/esm/tty/format.js +9 -0
  91. package/dist/esm/tty/format.js.map +1 -1
  92. package/dist/esm/version.js +1 -1
  93. package/dist/types/cache.d.ts +70 -0
  94. package/dist/types/config.d.ts +46 -0
  95. package/dist/types/content/asset.d.ts +4 -3
  96. package/dist/types/daemon/auto-mode.d.ts +8 -0
  97. package/dist/types/daemon/cli.d.ts +9 -0
  98. package/dist/types/daemon/config.d.ts +19 -0
  99. package/dist/types/daemon/constants.d.ts +7 -0
  100. package/dist/types/daemon/env-merge.d.ts +5 -0
  101. package/dist/types/daemon/env-snapshot.d.ts +4 -0
  102. package/dist/types/daemon/flow-context.d.ts +28 -0
  103. package/dist/types/daemon/launchd.d.ts +29 -0
  104. package/dist/types/daemon/meta.d.ts +12 -0
  105. package/dist/types/daemon/models.d.ts +27 -0
  106. package/dist/types/daemon/request-settings.d.ts +27 -0
  107. package/dist/types/daemon/schtasks.d.ts +16 -0
  108. package/dist/types/daemon/server.d.ts +12 -0
  109. package/dist/types/daemon/summarize-progress.d.ts +2 -0
  110. package/dist/types/daemon/summarize.d.ts +59 -0
  111. package/dist/types/daemon/systemd.d.ts +16 -0
  112. package/dist/types/flags.d.ts +1 -1
  113. package/dist/types/llm/generate-text.d.ts +11 -5
  114. package/dist/types/llm/html-to-markdown.d.ts +4 -1
  115. package/dist/types/llm/prompt.d.ts +9 -0
  116. package/dist/types/llm/transcript-to-markdown.d.ts +34 -0
  117. package/dist/types/run/attachments.d.ts +4 -10
  118. package/dist/types/run/cache-state.d.ts +12 -0
  119. package/dist/types/run/cli-preflight.d.ts +1 -0
  120. package/dist/types/run/cookies/twitter.d.ts +17 -0
  121. package/dist/types/run/finish-line.d.ts +31 -1
  122. package/dist/types/run/flows/asset/preprocess.d.ts +5 -2
  123. package/dist/types/run/flows/asset/summary.d.ts +11 -0
  124. package/dist/types/run/flows/url/markdown.d.ts +3 -0
  125. package/dist/types/run/flows/url/summary.d.ts +6 -3
  126. package/dist/types/run/flows/url/types.d.ts +52 -18
  127. package/dist/types/run/help.d.ts +1 -0
  128. package/dist/types/run/run-env.d.ts +6 -0
  129. package/dist/types/run/summary-engine.d.ts +8 -2
  130. package/dist/types/run/summary-llm.d.ts +6 -3
  131. package/dist/types/tty/format.d.ts +1 -0
  132. package/dist/types/version.d.ts +1 -1
  133. package/docs/README.md +5 -0
  134. package/docs/cache.md +72 -0
  135. package/docs/chrome-extension.md +180 -0
  136. package/docs/cli.md +6 -0
  137. package/docs/config.md +65 -1
  138. package/docs/extract-only.md +6 -0
  139. package/docs/firecrawl.md +6 -0
  140. package/docs/language.md +6 -0
  141. package/docs/llm.md +20 -0
  142. package/docs/manual-tests.md +6 -0
  143. package/docs/model-auto.md +6 -0
  144. package/docs/openai.md +6 -0
  145. package/docs/site/index.html +11 -1
  146. package/docs/smoketest.md +6 -0
  147. package/docs/website.md +6 -0
  148. package/docs/youtube.md +9 -2
  149. package/package.json +7 -10
  150. package/dist/cli.cjs +0 -80566
  151. package/dist/cli.cjs.map +0 -7
@@ -0,0 +1,175 @@
1
+ import { getModels } from '@mariozechner/pi-ai';
2
+ import { resolveEnvState } from '../run/run-env.js';
3
+ function uniqById(options) {
4
+ const seen = new Set();
5
+ const out = [];
6
+ for (const opt of options) {
7
+ const id = opt.id.trim();
8
+ if (!id)
9
+ continue;
10
+ if (seen.has(id))
11
+ continue;
12
+ seen.add(id);
13
+ out.push({ id, label: opt.label.trim() || id });
14
+ }
15
+ return out;
16
+ }
17
+ function isProbablyOpenRouterBaseUrl(baseUrl) {
18
+ return /openrouter\.ai/i.test(baseUrl);
19
+ }
20
+ function isProbablyZaiBaseUrl(baseUrl) {
21
+ return /api\.z\.ai/i.test(baseUrl);
22
+ }
23
+ function describeBaseUrlHost(baseUrl) {
24
+ try {
25
+ const url = new URL(baseUrl);
26
+ const host = url.host.trim();
27
+ return host.length > 0 ? host : null;
28
+ }
29
+ catch {
30
+ return null;
31
+ }
32
+ }
33
+ function pushPiAiModels({ options, provider, prefix, labelPrefix, }) {
34
+ const models = getModels(provider)
35
+ .slice()
36
+ .sort((a, b) => (a.name || a.id).localeCompare(b.name || b.id));
37
+ for (const m of models) {
38
+ const id = `${prefix}${m.id}`;
39
+ const label = `${labelPrefix}${m.name || m.id}`;
40
+ options.push({ id, label });
41
+ }
42
+ }
43
+ async function discoverOpenAiCompatibleModelIds({ baseUrl, apiKey, fetchImpl, timeoutMs, }) {
44
+ const base = baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`;
45
+ const modelsUrl = new URL('models', base).toString();
46
+ const controller = new AbortController();
47
+ const timeout = setTimeout(() => controller.abort(), timeoutMs);
48
+ try {
49
+ const res = await fetchImpl(modelsUrl, {
50
+ method: 'GET',
51
+ headers: apiKey ? { authorization: `Bearer ${apiKey}` } : undefined,
52
+ signal: controller.signal,
53
+ });
54
+ if (!res.ok)
55
+ return [];
56
+ const json = (await res.json());
57
+ if (!json || typeof json !== 'object')
58
+ return [];
59
+ const obj = json;
60
+ const data = obj.data;
61
+ if (Array.isArray(data)) {
62
+ const ids = data
63
+ .map((item) => (item && typeof item === 'object' ? item.id : null))
64
+ .filter((id) => typeof id === 'string' && id.trim().length > 0)
65
+ .map((id) => id.trim());
66
+ return Array.from(new Set(ids)).sort((a, b) => a.localeCompare(b));
67
+ }
68
+ const models = obj.models;
69
+ if (Array.isArray(models)) {
70
+ const ids = models
71
+ .filter((id) => typeof id === 'string' && id.trim().length > 0)
72
+ .map((id) => id.trim());
73
+ return Array.from(new Set(ids)).sort((a, b) => a.localeCompare(b));
74
+ }
75
+ return [];
76
+ }
77
+ catch {
78
+ return [];
79
+ }
80
+ finally {
81
+ clearTimeout(timeout);
82
+ }
83
+ }
84
+ export async function buildModelPickerOptions({ env, envForRun, configForCli, fetchImpl, }) {
85
+ const envState = resolveEnvState({ env, envForRun, configForCli });
86
+ const providers = {
87
+ xai: Boolean(envState.xaiApiKey),
88
+ openai: Boolean(envState.apiKey),
89
+ google: envState.googleConfigured,
90
+ anthropic: envState.anthropicConfigured,
91
+ openrouter: envState.openrouterConfigured,
92
+ zai: Boolean(envState.zaiApiKey),
93
+ };
94
+ const options = [{ id: 'auto', label: 'Auto' }];
95
+ if (providers.openrouter) {
96
+ options.push({ id: 'free', label: 'Free (OpenRouter)' });
97
+ pushPiAiModels({
98
+ options,
99
+ provider: 'openrouter',
100
+ prefix: 'openrouter/',
101
+ labelPrefix: 'OpenRouter: ',
102
+ });
103
+ }
104
+ if (providers.openai) {
105
+ pushPiAiModels({
106
+ options,
107
+ provider: 'openai',
108
+ prefix: 'openai/',
109
+ labelPrefix: 'OpenAI: ',
110
+ });
111
+ }
112
+ if (providers.anthropic) {
113
+ pushPiAiModels({
114
+ options,
115
+ provider: 'anthropic',
116
+ prefix: 'anthropic/',
117
+ labelPrefix: 'Anthropic: ',
118
+ });
119
+ }
120
+ if (providers.google) {
121
+ pushPiAiModels({
122
+ options,
123
+ provider: 'google',
124
+ prefix: 'google/',
125
+ labelPrefix: 'Google: ',
126
+ });
127
+ }
128
+ if (providers.xai) {
129
+ pushPiAiModels({
130
+ options,
131
+ provider: 'xai',
132
+ prefix: 'xai/',
133
+ labelPrefix: 'xAI: ',
134
+ });
135
+ }
136
+ if (providers.zai) {
137
+ pushPiAiModels({
138
+ options,
139
+ provider: 'zai',
140
+ prefix: 'zai/',
141
+ labelPrefix: 'Z.AI: ',
142
+ });
143
+ }
144
+ const openaiBaseUrl = (() => {
145
+ return envState.providerBaseUrls.openai;
146
+ })();
147
+ let localModelsSource = null;
148
+ if (openaiBaseUrl &&
149
+ !isProbablyOpenRouterBaseUrl(openaiBaseUrl) &&
150
+ !isProbablyZaiBaseUrl(openaiBaseUrl)) {
151
+ const baseUrlHost = describeBaseUrlHost(openaiBaseUrl);
152
+ if (baseUrlHost) {
153
+ const discovered = await discoverOpenAiCompatibleModelIds({
154
+ baseUrl: openaiBaseUrl,
155
+ apiKey: envState.apiKey,
156
+ fetchImpl,
157
+ timeoutMs: 900,
158
+ });
159
+ if (discovered.length > 0) {
160
+ localModelsSource = { kind: 'openai-compatible', baseUrlHost };
161
+ for (const id of discovered) {
162
+ options.push({ id: `openai/${id}`, label: `Local (${baseUrlHost}): ${id}` });
163
+ }
164
+ }
165
+ }
166
+ }
167
+ return {
168
+ ok: true,
169
+ options: uniqById(options),
170
+ providers,
171
+ openaiBaseUrl,
172
+ localModelsSource,
173
+ };
174
+ }
175
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../../src/daemon/models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAE/C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAOnD,SAAS,QAAQ,CAAC,OAA4B;IAC5C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,MAAM,GAAG,GAAwB,EAAE,CAAA;IACnC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAA;QACxB,IAAI,CAAC,EAAE;YAAE,SAAQ;QACjB,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,SAAQ;QAC1B,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACZ,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAA;IACjD,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,SAAS,2BAA2B,CAAC,OAAe;IAClD,OAAO,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AACxC,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAe;IAC3C,OAAO,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AACpC,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAe;IAC1C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAA;QAC5B,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;QAC5B,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,EACtB,OAAO,EACP,QAAQ,EACR,MAAM,EACN,WAAW,GAMZ;IACC,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC;SAC/B,KAAK,EAAE;SACP,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACjE,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,GAAG,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,CAAA;QAC7B,MAAM,KAAK,GAAG,GAAG,WAAW,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,EAAE,CAAA;QAC/C,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;IAC7B,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gCAAgC,CAAC,EAC9C,OAAO,EACP,MAAM,EACN,SAAS,EACT,SAAS,GAMV;IACC,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAA;IAC5D,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAA;IAEpD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IACxC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAA;IAC/D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,SAAS,EAAE;YACrC,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS;YACnE,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAA;QACF,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,EAAE,CAAA;QACtB,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAY,CAAA;QAC1C,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAA;QAEhD,MAAM,GAAG,GAAG,IAA+B,CAAA;QAC3C,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAA;QACrB,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,IAAI;iBACb,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAE,IAAyB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;iBACxF,MAAM,CAAC,CAAC,EAAE,EAAgB,EAAE,CAAC,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;iBAC5E,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAA;YACzB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;QACpE,CAAC;QAED,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAA;QACzB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,MAAM;iBACf,MAAM,CAAC,CAAC,EAAE,EAAgB,EAAE,CAAC,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;iBAC5E,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAA;YACzB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;QACpE,CAAC;QAED,OAAO,EAAE,CAAA;IACX,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,OAAO,CAAC,CAAA;IACvB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,EAC5C,GAAG,EACH,SAAS,EACT,YAAY,EACZ,SAAS,GAMV;IAcC,MAAM,QAAQ,GAAG,eAAe,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAA;IAElE,MAAM,SAAS,GAAG;QAChB,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;QAChC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;QAChC,MAAM,EAAE,QAAQ,CAAC,gBAAgB;QACjC,SAAS,EAAE,QAAQ,CAAC,mBAAmB;QACvC,UAAU,EAAE,QAAQ,CAAC,oBAAoB;QACzC,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;KACjC,CAAA;IAED,MAAM,OAAO,GAAwB,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;IAEpE,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAA;QACxD,cAAc,CAAC;YACb,OAAO;YACP,QAAQ,EAAE,YAAY;YACtB,MAAM,EAAE,aAAa;YACrB,WAAW,EAAE,cAAc;SAC5B,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;QACrB,cAAc,CAAC;YACb,OAAO;YACP,QAAQ,EAAE,QAAQ;YAClB,MAAM,EAAE,SAAS;YACjB,WAAW,EAAE,UAAU;SACxB,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;QACxB,cAAc,CAAC;YACb,OAAO;YACP,QAAQ,EAAE,WAAW;YACrB,MAAM,EAAE,YAAY;YACpB,WAAW,EAAE,aAAa;SAC3B,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;QACrB,cAAc,CAAC;YACb,OAAO;YACP,QAAQ,EAAE,QAAQ;YAClB,MAAM,EAAE,SAAS;YACjB,WAAW,EAAE,UAAU;SACxB,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,SAAS,CAAC,GAAG,EAAE,CAAC;QAClB,cAAc,CAAC;YACb,OAAO;YACP,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,MAAM;YACd,WAAW,EAAE,OAAO;SACrB,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,SAAS,CAAC,GAAG,EAAE,CAAC;QAClB,cAAc,CAAC;YACb,OAAO;YACP,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,MAAM;YACd,WAAW,EAAE,QAAQ;SACtB,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE;QAC1B,OAAO,QAAQ,CAAC,gBAAgB,CAAC,MAAM,CAAA;IACzC,CAAC,CAAC,EAAE,CAAA;IAEJ,IAAI,iBAAiB,GAA8D,IAAI,CAAA;IAEvF,IACE,aAAa;QACb,CAAC,2BAA2B,CAAC,aAAa,CAAC;QAC3C,CAAC,oBAAoB,CAAC,aAAa,CAAC,EACpC,CAAC;QACD,MAAM,WAAW,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAA;QACtD,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,UAAU,GAAG,MAAM,gCAAgC,CAAC;gBACxD,OAAO,EAAE,aAAa;gBACtB,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,SAAS;gBACT,SAAS,EAAE,GAAG;aACf,CAAC,CAAA;YACF,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,iBAAiB,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,WAAW,EAAE,CAAA;gBAC9D,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;oBAC5B,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,WAAW,MAAM,EAAE,EAAE,EAAE,CAAC,CAAA;gBAC9E,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,EAAE,EAAE,IAAI;QACR,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC;QAC1B,SAAS;QACT,aAAa;QACb,iBAAiB;KAClB,CAAA;AACH,CAAC"}
@@ -0,0 +1,91 @@
1
+ import { parseDurationMs, parseFirecrawlMode, parseLengthArg, parseMarkdownMode, parseMaxOutputTokensArg, parsePreprocessMode, parseRetriesArg, parseYoutubeMode, } from '../flags.js';
2
+ import { resolveOutputLanguage } from '../language.js';
3
+ export function resolveDaemonSummaryLength(raw) {
4
+ const value = typeof raw === 'string' ? raw.trim() : '';
5
+ const lengthArg = parseLengthArg(value || 'xl');
6
+ const summaryLength = lengthArg.kind === 'preset' ? lengthArg.preset : { maxCharacters: lengthArg.maxCharacters };
7
+ return { lengthArg, summaryLength };
8
+ }
9
+ export function resolveDaemonOutputLanguage({ raw, fallback, }) {
10
+ const value = typeof raw === 'string' ? raw.trim() : '';
11
+ if (!value)
12
+ return fallback;
13
+ return resolveOutputLanguage(value);
14
+ }
15
+ export function resolveDaemonYoutubeMode(raw) {
16
+ if (typeof raw !== 'string')
17
+ return null;
18
+ try {
19
+ return parseYoutubeMode(raw);
20
+ }
21
+ catch {
22
+ return null;
23
+ }
24
+ }
25
+ export function resolveDaemonFirecrawlMode(raw) {
26
+ if (typeof raw !== 'string')
27
+ return null;
28
+ try {
29
+ return parseFirecrawlMode(raw);
30
+ }
31
+ catch {
32
+ return null;
33
+ }
34
+ }
35
+ export function resolveDaemonMarkdownMode(raw) {
36
+ if (typeof raw !== 'string')
37
+ return null;
38
+ try {
39
+ return parseMarkdownMode(raw);
40
+ }
41
+ catch {
42
+ return null;
43
+ }
44
+ }
45
+ export function resolveDaemonPreprocessMode(raw) {
46
+ if (typeof raw !== 'string')
47
+ return null;
48
+ try {
49
+ return parsePreprocessMode(raw);
50
+ }
51
+ catch {
52
+ return null;
53
+ }
54
+ }
55
+ export function resolveDaemonTimeoutMs(raw) {
56
+ if (typeof raw === 'number' && Number.isFinite(raw) && raw > 0)
57
+ return Math.floor(raw);
58
+ if (typeof raw !== 'string')
59
+ return null;
60
+ try {
61
+ return parseDurationMs(raw);
62
+ }
63
+ catch {
64
+ return null;
65
+ }
66
+ }
67
+ export function resolveDaemonRetries(raw) {
68
+ if (typeof raw === 'number' && Number.isFinite(raw) && Number.isInteger(raw))
69
+ return raw;
70
+ if (typeof raw !== 'string')
71
+ return null;
72
+ try {
73
+ return parseRetriesArg(raw);
74
+ }
75
+ catch {
76
+ return null;
77
+ }
78
+ }
79
+ export function resolveDaemonMaxOutputTokens(raw) {
80
+ if (typeof raw === 'number' && Number.isFinite(raw) && raw > 0)
81
+ return Math.floor(raw);
82
+ if (typeof raw !== 'string')
83
+ return null;
84
+ try {
85
+ return parseMaxOutputTokensArg(raw);
86
+ }
87
+ catch {
88
+ return null;
89
+ }
90
+ }
91
+ //# sourceMappingURL=request-settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-settings.js","sourceRoot":"","sources":["../../../src/daemon/request-settings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,108 @@
1
+ import { execFile } from 'node:child_process';
2
+ import fs from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { promisify } from 'node:util';
5
+ import { DAEMON_WINDOWS_TASK_NAME } from './constants.js';
6
+ const execFileAsync = promisify(execFile);
7
+ function resolveHomeDir(env) {
8
+ const home = env.USERPROFILE?.trim() || env.HOME?.trim();
9
+ if (!home)
10
+ throw new Error('Missing HOME');
11
+ return home;
12
+ }
13
+ function resolveTaskScriptPath(env) {
14
+ const home = resolveHomeDir(env);
15
+ return path.join(home, '.summarize', 'daemon.cmd');
16
+ }
17
+ function quoteCmdArg(value) {
18
+ if (!/[ \t"]/g.test(value))
19
+ return value;
20
+ return `"${value.replace(/"/g, '\\"')}"`;
21
+ }
22
+ function buildTaskScript({ programArguments, workingDirectory, }) {
23
+ const lines = ['@echo off'];
24
+ if (workingDirectory) {
25
+ lines.push(`cd /d ${quoteCmdArg(workingDirectory)}`);
26
+ }
27
+ const command = programArguments.map(quoteCmdArg).join(' ');
28
+ lines.push(command);
29
+ return `${lines.join('\r\n')}\r\n`;
30
+ }
31
+ async function execSchtasks(args) {
32
+ try {
33
+ const { stdout, stderr } = await execFileAsync('schtasks', args, {
34
+ encoding: 'utf8',
35
+ windowsHide: true,
36
+ });
37
+ return { stdout: String(stdout ?? ''), stderr: String(stderr ?? ''), code: 0 };
38
+ }
39
+ catch (error) {
40
+ const e = error;
41
+ return {
42
+ stdout: typeof e.stdout === 'string' ? e.stdout : '',
43
+ stderr: typeof e.stderr === 'string' ? e.stderr : typeof e.message === 'string' ? e.message : '',
44
+ code: typeof e.code === 'number' ? e.code : 1,
45
+ };
46
+ }
47
+ }
48
+ async function assertSchtasksAvailable() {
49
+ const res = await execSchtasks(['/Query']);
50
+ if (res.code === 0)
51
+ return;
52
+ const detail = res.stderr || res.stdout;
53
+ throw new Error(`schtasks unavailable: ${detail || 'unknown error'}`.trim());
54
+ }
55
+ export async function installScheduledTask({ env, stdout, programArguments, workingDirectory, }) {
56
+ await assertSchtasksAvailable();
57
+ const scriptPath = resolveTaskScriptPath(env);
58
+ await fs.mkdir(path.dirname(scriptPath), { recursive: true });
59
+ const script = buildTaskScript({ programArguments, workingDirectory });
60
+ await fs.writeFile(scriptPath, script, 'utf8');
61
+ const quotedScript = quoteCmdArg(scriptPath);
62
+ const create = await execSchtasks([
63
+ '/Create',
64
+ '/F',
65
+ '/SC',
66
+ 'ONLOGON',
67
+ '/RL',
68
+ 'LIMITED',
69
+ '/TN',
70
+ DAEMON_WINDOWS_TASK_NAME,
71
+ '/TR',
72
+ quotedScript,
73
+ ]);
74
+ if (create.code !== 0) {
75
+ throw new Error(`schtasks create failed: ${create.stderr || create.stdout}`.trim());
76
+ }
77
+ await execSchtasks(['/Run', '/TN', DAEMON_WINDOWS_TASK_NAME]);
78
+ stdout.write(`Installed Scheduled Task: ${DAEMON_WINDOWS_TASK_NAME}\n`);
79
+ stdout.write(`Task script: ${scriptPath}\n`);
80
+ return { scriptPath };
81
+ }
82
+ export async function uninstallScheduledTask({ env, stdout, }) {
83
+ await assertSchtasksAvailable();
84
+ await execSchtasks(['/Delete', '/F', '/TN', DAEMON_WINDOWS_TASK_NAME]);
85
+ const scriptPath = resolveTaskScriptPath(env);
86
+ try {
87
+ await fs.unlink(scriptPath);
88
+ stdout.write(`Removed task script: ${scriptPath}\n`);
89
+ }
90
+ catch {
91
+ stdout.write(`Task script not found at ${scriptPath}\n`);
92
+ }
93
+ }
94
+ export async function restartScheduledTask({ stdout, }) {
95
+ await assertSchtasksAvailable();
96
+ await execSchtasks(['/End', '/TN', DAEMON_WINDOWS_TASK_NAME]);
97
+ const res = await execSchtasks(['/Run', '/TN', DAEMON_WINDOWS_TASK_NAME]);
98
+ if (res.code !== 0) {
99
+ throw new Error(`schtasks run failed: ${res.stderr || res.stdout}`.trim());
100
+ }
101
+ stdout.write(`Restarted Scheduled Task: ${DAEMON_WINDOWS_TASK_NAME}\n`);
102
+ }
103
+ export async function isScheduledTaskInstalled() {
104
+ await assertSchtasksAvailable();
105
+ const res = await execSchtasks(['/Query', '/TN', DAEMON_WINDOWS_TASK_NAME]);
106
+ return res.code === 0;
107
+ }
108
+ //# sourceMappingURL=schtasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schtasks.js","sourceRoot":"","sources":["../../../src/daemon/schtasks.ts"],"names":[],"mappings":"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"}