@bobfrankston/gcal 0.1.57 → 0.1.59
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/glib/aihelper.d.ts.map +1 -1
- package/glib/aihelper.js +51 -18
- package/glib/aihelper.js.map +1 -1
- package/glib/aihelper.ts +52 -20
- package/package.json +1 -1
package/glib/aihelper.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aihelper.d.ts","sourceRoot":"","sources":["aihelper.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"aihelper.d.ts","sourceRoot":"","sources":["aihelper.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAkFH,MAAM,WAAW,cAAc;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AA6BD,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CA4DnF;AAED,MAAM,WAAW,aAAa;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC,CAAO,2BAA2B;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAwBD,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAkDjF;AAED,0DAA0D;AAC1D,wBAAgB,aAAa,IAAI,MAAM,CAMtC"}
|
package/glib/aihelper.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import fs from 'fs';
|
|
7
7
|
import path from 'path';
|
|
8
|
+
import { createInterface } from 'readline/promises';
|
|
8
9
|
import clipboardy from 'clipboardy';
|
|
9
10
|
// Load keys from shared gcards location
|
|
10
11
|
function loadKeysEnv() {
|
|
@@ -30,6 +31,52 @@ function loadKeysEnv() {
|
|
|
30
31
|
}
|
|
31
32
|
}
|
|
32
33
|
loadKeysEnv();
|
|
34
|
+
function keysEnvPath() {
|
|
35
|
+
const home = process.env.HOME || process.env.USERPROFILE || '';
|
|
36
|
+
const appData = process.env.APPDATA || path.join(home, '.config');
|
|
37
|
+
return path.join(appData, 'gcards', 'keys.env');
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Return ANTHROPIC_API_KEY, prompting the user (if interactive) and
|
|
41
|
+
* persisting to keys.env when it isn't already set. Returns empty string
|
|
42
|
+
* if the user declines or stdin is non-interactive.
|
|
43
|
+
*/
|
|
44
|
+
async function ensureAnthropicKey() {
|
|
45
|
+
const existing = process.env.ANTHROPIC_API_KEY;
|
|
46
|
+
if (existing)
|
|
47
|
+
return existing;
|
|
48
|
+
const keysPath = keysEnvPath();
|
|
49
|
+
if (!process.stdin.isTTY) {
|
|
50
|
+
console.error(`\nANTHROPIC_API_KEY not set.`);
|
|
51
|
+
console.error(`Add it to: ${keysPath}`);
|
|
52
|
+
console.error(`Format: ANTHROPIC_API_KEY=sk-ant-...\n`);
|
|
53
|
+
return '';
|
|
54
|
+
}
|
|
55
|
+
console.log(`\nANTHROPIC_API_KEY not set. Will save to ${keysPath}.`);
|
|
56
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
57
|
+
const key = (await rl.question('Paste key (blank to abort): ')).trim();
|
|
58
|
+
rl.close();
|
|
59
|
+
if (!key)
|
|
60
|
+
return '';
|
|
61
|
+
if (!key.startsWith('sk-ant-')) {
|
|
62
|
+
console.error('Does not look like an Anthropic key (expected sk-ant-...).');
|
|
63
|
+
return '';
|
|
64
|
+
}
|
|
65
|
+
fs.mkdirSync(path.dirname(keysPath), { recursive: true });
|
|
66
|
+
let content = fs.existsSync(keysPath) ? fs.readFileSync(keysPath, 'utf-8') : '';
|
|
67
|
+
if (/^ANTHROPIC_API_KEY=/m.test(content)) {
|
|
68
|
+
content = content.replace(/^ANTHROPIC_API_KEY=.*$/m, `ANTHROPIC_API_KEY=${key}`);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
if (content && !content.endsWith('\n'))
|
|
72
|
+
content += '\n';
|
|
73
|
+
content += `ANTHROPIC_API_KEY=${key}\n`;
|
|
74
|
+
}
|
|
75
|
+
fs.writeFileSync(keysPath, content);
|
|
76
|
+
process.env.ANTHROPIC_API_KEY = key;
|
|
77
|
+
console.log(`Saved.`);
|
|
78
|
+
return key;
|
|
79
|
+
}
|
|
33
80
|
const EVENT_EXTRACTION_PROMPT = `Extract calendar event details from the user's text and return ONLY valid JSON.
|
|
34
81
|
|
|
35
82
|
Today's date is {{TODAY}}. The user's local timezone is {{TIMEZONE}}.
|
|
@@ -57,16 +104,9 @@ Rules:
|
|
|
57
104
|
- description: include extra details if any, omit if none
|
|
58
105
|
- Return ONLY the JSON array, no markdown, no explanation`;
|
|
59
106
|
export async function extractEventsFromText(text) {
|
|
60
|
-
const apiKey =
|
|
61
|
-
if (!apiKey)
|
|
62
|
-
const home = process.env.HOME || process.env.USERPROFILE || '';
|
|
63
|
-
const appData = process.env.APPDATA || path.join(home, '.config');
|
|
64
|
-
const keysPath = path.join(appData, 'gcards', 'keys.env');
|
|
65
|
-
console.error(`\nANTHROPIC_API_KEY not set.`);
|
|
66
|
-
console.error(`Add it to: ${keysPath}`);
|
|
67
|
-
console.error(`Format: ANTHROPIC_API_KEY=sk-ant-...\n`);
|
|
107
|
+
const apiKey = await ensureAnthropicKey();
|
|
108
|
+
if (!apiKey)
|
|
68
109
|
return [];
|
|
69
|
-
}
|
|
70
110
|
const today = new Date().toISOString().split('T')[0];
|
|
71
111
|
const dayName = new Date().toLocaleDateString('en-US', { weekday: 'long' });
|
|
72
112
|
const localTz = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
@@ -143,16 +183,9 @@ Rules:
|
|
|
143
183
|
- Google Tasks ignores time-of-day, so do not include hours/minutes.
|
|
144
184
|
- Return ONLY the JSON array, no markdown, no explanation`;
|
|
145
185
|
export async function extractTasksFromText(text) {
|
|
146
|
-
const apiKey =
|
|
147
|
-
if (!apiKey)
|
|
148
|
-
const home = process.env.HOME || process.env.USERPROFILE || '';
|
|
149
|
-
const appData = process.env.APPDATA || path.join(home, '.config');
|
|
150
|
-
const keysPath = path.join(appData, 'gcards', 'keys.env');
|
|
151
|
-
console.error(`\nANTHROPIC_API_KEY not set.`);
|
|
152
|
-
console.error(`Add it to: ${keysPath}`);
|
|
153
|
-
console.error(`Format: ANTHROPIC_API_KEY=sk-ant-...\n`);
|
|
186
|
+
const apiKey = await ensureAnthropicKey();
|
|
187
|
+
if (!apiKey)
|
|
154
188
|
return [];
|
|
155
|
-
}
|
|
156
189
|
const today = new Date().toISOString().split('T')[0];
|
|
157
190
|
const dayName = new Date().toLocaleDateString('en-US', { weekday: 'long' });
|
|
158
191
|
const systemPrompt = TASK_EXTRACTION_PROMPT
|
package/glib/aihelper.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aihelper.js","sourceRoot":"","sources":["aihelper.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,wCAAwC;AACxC,SAAS,WAAW;IAChB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;IAC/D,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAElE,MAAM,SAAS,GAAG;QACd,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC;KACnC,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC1B,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC9C,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;gBACtD,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAClC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;gBACxE,CAAC;YACL,CAAC;YACD,MAAM;QACV,CAAC;IACL,CAAC;AACL,CAAC;AAED,WAAW,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"aihelper.js","sourceRoot":"","sources":["aihelper.ts"],"names":[],"mappings":"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"}
|
package/glib/aihelper.ts
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
import fs from 'fs';
|
|
8
8
|
import path from 'path';
|
|
9
|
+
import { createInterface } from 'readline/promises';
|
|
9
10
|
import clipboardy from 'clipboardy';
|
|
10
11
|
|
|
11
12
|
// Load keys from shared gcards location
|
|
@@ -36,6 +37,53 @@ function loadKeysEnv(): void {
|
|
|
36
37
|
|
|
37
38
|
loadKeysEnv();
|
|
38
39
|
|
|
40
|
+
function keysEnvPath(): string {
|
|
41
|
+
const home = process.env.HOME || process.env.USERPROFILE || '';
|
|
42
|
+
const appData = process.env.APPDATA || path.join(home, '.config');
|
|
43
|
+
return path.join(appData, 'gcards', 'keys.env');
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Return ANTHROPIC_API_KEY, prompting the user (if interactive) and
|
|
48
|
+
* persisting to keys.env when it isn't already set. Returns empty string
|
|
49
|
+
* if the user declines or stdin is non-interactive.
|
|
50
|
+
*/
|
|
51
|
+
async function ensureAnthropicKey(): Promise<string> {
|
|
52
|
+
const existing = process.env.ANTHROPIC_API_KEY;
|
|
53
|
+
if (existing) return existing;
|
|
54
|
+
|
|
55
|
+
const keysPath = keysEnvPath();
|
|
56
|
+
if (!process.stdin.isTTY) {
|
|
57
|
+
console.error(`\nANTHROPIC_API_KEY not set.`);
|
|
58
|
+
console.error(`Add it to: ${keysPath}`);
|
|
59
|
+
console.error(`Format: ANTHROPIC_API_KEY=sk-ant-...\n`);
|
|
60
|
+
return '';
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
console.log(`\nANTHROPIC_API_KEY not set. Will save to ${keysPath}.`);
|
|
64
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
65
|
+
const key = (await rl.question('Paste key (blank to abort): ')).trim();
|
|
66
|
+
rl.close();
|
|
67
|
+
if (!key) return '';
|
|
68
|
+
if (!key.startsWith('sk-ant-')) {
|
|
69
|
+
console.error('Does not look like an Anthropic key (expected sk-ant-...).');
|
|
70
|
+
return '';
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
fs.mkdirSync(path.dirname(keysPath), { recursive: true });
|
|
74
|
+
let content = fs.existsSync(keysPath) ? fs.readFileSync(keysPath, 'utf-8') : '';
|
|
75
|
+
if (/^ANTHROPIC_API_KEY=/m.test(content)) {
|
|
76
|
+
content = content.replace(/^ANTHROPIC_API_KEY=.*$/m, `ANTHROPIC_API_KEY=${key}`);
|
|
77
|
+
} else {
|
|
78
|
+
if (content && !content.endsWith('\n')) content += '\n';
|
|
79
|
+
content += `ANTHROPIC_API_KEY=${key}\n`;
|
|
80
|
+
}
|
|
81
|
+
fs.writeFileSync(keysPath, content);
|
|
82
|
+
process.env.ANTHROPIC_API_KEY = key;
|
|
83
|
+
console.log(`Saved.`);
|
|
84
|
+
return key;
|
|
85
|
+
}
|
|
86
|
+
|
|
39
87
|
export interface ExtractedEvent {
|
|
40
88
|
summary: string;
|
|
41
89
|
startDateTime: string;
|
|
@@ -73,16 +121,8 @@ Rules:
|
|
|
73
121
|
- Return ONLY the JSON array, no markdown, no explanation`;
|
|
74
122
|
|
|
75
123
|
export async function extractEventsFromText(text: string): Promise<ExtractedEvent[]> {
|
|
76
|
-
const apiKey =
|
|
77
|
-
if (!apiKey)
|
|
78
|
-
const home = process.env.HOME || process.env.USERPROFILE || '';
|
|
79
|
-
const appData = process.env.APPDATA || path.join(home, '.config');
|
|
80
|
-
const keysPath = path.join(appData, 'gcards', 'keys.env');
|
|
81
|
-
console.error(`\nANTHROPIC_API_KEY not set.`);
|
|
82
|
-
console.error(`Add it to: ${keysPath}`);
|
|
83
|
-
console.error(`Format: ANTHROPIC_API_KEY=sk-ant-...\n`);
|
|
84
|
-
return [];
|
|
85
|
-
}
|
|
124
|
+
const apiKey = await ensureAnthropicKey();
|
|
125
|
+
if (!apiKey) return [];
|
|
86
126
|
|
|
87
127
|
const today = new Date().toISOString().split('T')[0];
|
|
88
128
|
const dayName = new Date().toLocaleDateString('en-US', { weekday: 'long' });
|
|
@@ -171,16 +211,8 @@ Rules:
|
|
|
171
211
|
- Return ONLY the JSON array, no markdown, no explanation`;
|
|
172
212
|
|
|
173
213
|
export async function extractTasksFromText(text: string): Promise<ExtractedTask[]> {
|
|
174
|
-
const apiKey =
|
|
175
|
-
if (!apiKey)
|
|
176
|
-
const home = process.env.HOME || process.env.USERPROFILE || '';
|
|
177
|
-
const appData = process.env.APPDATA || path.join(home, '.config');
|
|
178
|
-
const keysPath = path.join(appData, 'gcards', 'keys.env');
|
|
179
|
-
console.error(`\nANTHROPIC_API_KEY not set.`);
|
|
180
|
-
console.error(`Add it to: ${keysPath}`);
|
|
181
|
-
console.error(`Format: ANTHROPIC_API_KEY=sk-ant-...\n`);
|
|
182
|
-
return [];
|
|
183
|
-
}
|
|
214
|
+
const apiKey = await ensureAnthropicKey();
|
|
215
|
+
if (!apiKey) return [];
|
|
184
216
|
|
|
185
217
|
const today = new Date().toISOString().split('T')[0];
|
|
186
218
|
const dayName = new Date().toLocaleDateString('en-US', { weekday: 'long' });
|