@elizaos/skills 2.0.0-alpha.43 → 2.0.0-alpha.430
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/README.md +4 -0
- package/dist/formatter.d.ts.map +1 -1
- package/dist/formatter.js +3 -3
- package/dist/frontmatter.d.ts +13 -1
- package/dist/frontmatter.d.ts.map +1 -1
- package/dist/frontmatter.js +51 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +10 -3
- package/dist/resolver.d.ts +17 -0
- package/dist/resolver.d.ts.map +1 -1
- package/dist/resolver.js +54 -1
- package/dist/types.d.ts +38 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +7 -6
- package/skills/apple-reminders/SKILL.md +1 -1
- package/skills/blucli/SKILL.md +1 -1
- package/skills/bluebubbles/SKILL.md +1 -1
- package/skills/camsnap/SKILL.md +1 -1
- package/skills/canvas/SKILL.md +6 -6
- package/skills/coding-agent/SKILL.md +2 -2
- package/skills/eliza-app-development/SKILL.md +62 -0
- package/skills/eliza-app-development/references/repo-map.md +70 -0
- package/skills/eliza-app-development/references/runtime-and-cloud.md +61 -0
- package/skills/eliza-cloud/SKILL.md +39 -0
- package/skills/eliza-cloud/references/apps-and-containers.md +73 -0
- package/skills/eliza-cloud/references/cloud-backend-and-monetization.md +99 -0
- package/skills/elizaos/SKILL.md +27 -0
- package/skills/elizaos/references/core-abstractions.md +101 -0
- package/skills/elizaos/references/plugin-development.md +74 -0
- package/skills/github/SKILL.md +1 -1
- package/skills/imsg/SKILL.md +1 -1
- package/skills/nano-banana-pro/SKILL.md +1 -1
- package/skills/nano-pdf/SKILL.md +1 -1
- package/skills/notion/SKILL.md +1 -1
- package/skills/obsidian/SKILL.md +1 -1
- package/skills/ordercli/SKILL.md +1 -1
- package/skills/skill-creator/SKILL.md +1 -1
- package/skills/slack/SKILL.md +1 -1
- package/skills/spotify-player/SKILL.md +1 -1
- package/skills/tmux/SKILL.md +1 -1
- package/skills/trello/SKILL.md +1 -1
- package/skills/wacli/SKILL.md +1 -1
- package/skills/weather/SKILL.md +1 -1
- package/skills/yara-authoring/SKILL.md +111 -0
- package/skills/bear-notes/SKILL.md +0 -107
- package/skills/bird/SKILL.md +0 -224
- package/skills/blogwatcher/SKILL.md +0 -69
- package/skills/clawhub/SKILL.md +0 -77
- package/skills/eightctl/SKILL.md +0 -50
- package/skills/food-order/SKILL.md +0 -48
- package/skills/gemini/SKILL.md +0 -43
- package/skills/gifgrep/SKILL.md +0 -79
- package/skills/gog/SKILL.md +0 -116
- package/skills/goplaces/SKILL.md +0 -52
- package/skills/himalaya/SKILL.md +0 -257
- package/skills/himalaya/references/configuration.md +0 -184
- package/skills/himalaya/references/message-composition.md +0 -199
- package/skills/local-places/SERVER_README.md +0 -101
- package/skills/local-places/SKILL.md +0 -102
- package/skills/local-places/pyproject.toml +0 -21
- package/skills/local-places/src/local_places/__init__.py +0 -2
- package/skills/local-places/src/local_places/google_places.py +0 -314
- package/skills/local-places/src/local_places/main.py +0 -65
- package/skills/local-places/src/local_places/schemas.py +0 -107
- package/skills/mcporter/SKILL.md +0 -61
- package/skills/model-usage/SKILL.md +0 -69
- package/skills/model-usage/references/codexbar-cli.md +0 -33
- package/skills/model-usage/scripts/model_usage.py +0 -310
- package/skills/openai-image-gen/SKILL.md +0 -89
- package/skills/openai-image-gen/scripts/gen.py +0 -240
- package/skills/openai-whisper/SKILL.md +0 -38
- package/skills/openai-whisper-api/SKILL.md +0 -52
- package/skills/openai-whisper-api/scripts/transcribe.sh +0 -85
- package/skills/openhue/SKILL.md +0 -51
- package/skills/oracle/SKILL.md +0 -125
- package/skills/peekaboo/SKILL.md +0 -190
- package/skills/sag/SKILL.md +0 -87
- package/skills/session-logs/SKILL.md +0 -115
- package/skills/sharp-edges/.claude-plugin/plugin.json +0 -10
- package/skills/sharp-edges/README.md +0 -48
- package/skills/sharp-edges/SKILL.md +0 -292
- package/skills/sharp-edges/skills/sharp-edges/SKILL.md +0 -292
- package/skills/sharp-edges/skills/sharp-edges/references/auth-patterns.md +0 -252
- package/skills/sharp-edges/skills/sharp-edges/references/case-studies.md +0 -274
- package/skills/sharp-edges/skills/sharp-edges/references/config-patterns.md +0 -333
- package/skills/sharp-edges/skills/sharp-edges/references/crypto-apis.md +0 -190
- package/skills/sharp-edges/skills/sharp-edges/references/lang-c.md +0 -205
- package/skills/sharp-edges/skills/sharp-edges/references/lang-csharp.md +0 -285
- package/skills/sharp-edges/skills/sharp-edges/references/lang-go.md +0 -270
- package/skills/sharp-edges/skills/sharp-edges/references/lang-java.md +0 -263
- package/skills/sharp-edges/skills/sharp-edges/references/lang-javascript.md +0 -269
- package/skills/sharp-edges/skills/sharp-edges/references/lang-kotlin.md +0 -265
- package/skills/sharp-edges/skills/sharp-edges/references/lang-php.md +0 -245
- package/skills/sharp-edges/skills/sharp-edges/references/lang-python.md +0 -274
- package/skills/sharp-edges/skills/sharp-edges/references/lang-ruby.md +0 -273
- package/skills/sharp-edges/skills/sharp-edges/references/lang-rust.md +0 -272
- package/skills/sharp-edges/skills/sharp-edges/references/lang-swift.md +0 -287
- package/skills/sharp-edges/skills/sharp-edges/references/language-specific.md +0 -588
- package/skills/sherpa-onnx-tts/SKILL.md +0 -103
- package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +0 -178
- package/skills/songsee/SKILL.md +0 -49
- package/skills/sonoscli/SKILL.md +0 -46
- package/skills/spec-to-code-compliance/.claude-plugin/plugin.json +0 -10
- package/skills/spec-to-code-compliance/README.md +0 -67
- package/skills/spec-to-code-compliance/SKILL.md +0 -349
- package/skills/spec-to-code-compliance/commands/spec-compliance.md +0 -22
- package/skills/spec-to-code-compliance/skills/spec-to-code-compliance/SKILL.md +0 -349
- package/skills/spec-to-code-compliance/skills/spec-to-code-compliance/resources/COMPLETENESS_CHECKLIST.md +0 -69
- package/skills/spec-to-code-compliance/skills/spec-to-code-compliance/resources/IR_EXAMPLES.md +0 -417
- package/skills/spec-to-code-compliance/skills/spec-to-code-compliance/resources/OUTPUT_REQUIREMENTS.md +0 -105
- package/skills/static-analysis/.claude-plugin/plugin.json +0 -8
- package/skills/static-analysis/README.md +0 -59
- package/skills/static-analysis/SKILL.md +0 -91
- package/skills/static-analysis/skills/codeql/SKILL.md +0 -315
- package/skills/static-analysis/skills/sarif-parsing/SKILL.md +0 -479
- package/skills/static-analysis/skills/sarif-parsing/resources/jq-queries.md +0 -162
- package/skills/static-analysis/skills/sarif-parsing/resources/sarif_helpers.py +0 -331
- package/skills/static-analysis/skills/semgrep/SKILL.md +0 -337
- package/skills/summarize/SKILL.md +0 -87
- package/skills/testing-handbook-skills/.claude-plugin/plugin.json +0 -8
- package/skills/testing-handbook-skills/README.md +0 -241
- package/skills/testing-handbook-skills/SKILL.md +0 -104
- package/skills/testing-handbook-skills/scripts/pyproject.toml +0 -8
- package/skills/testing-handbook-skills/scripts/validate-skills.py +0 -657
- package/skills/testing-handbook-skills/skills/address-sanitizer/SKILL.md +0 -341
- package/skills/testing-handbook-skills/skills/aflpp/SKILL.md +0 -640
- package/skills/testing-handbook-skills/skills/atheris/SKILL.md +0 -515
- package/skills/testing-handbook-skills/skills/cargo-fuzz/SKILL.md +0 -454
- package/skills/testing-handbook-skills/skills/codeql/SKILL.md +0 -549
- package/skills/testing-handbook-skills/skills/constant-time-testing/SKILL.md +0 -507
- package/skills/testing-handbook-skills/skills/coverage-analysis/SKILL.md +0 -607
- package/skills/testing-handbook-skills/skills/fuzzing-dictionary/SKILL.md +0 -297
- package/skills/testing-handbook-skills/skills/fuzzing-obstacles/SKILL.md +0 -426
- package/skills/testing-handbook-skills/skills/harness-writing/SKILL.md +0 -614
- package/skills/testing-handbook-skills/skills/libafl/SKILL.md +0 -625
- package/skills/testing-handbook-skills/skills/libfuzzer/SKILL.md +0 -795
- package/skills/testing-handbook-skills/skills/ossfuzz/SKILL.md +0 -426
- package/skills/testing-handbook-skills/skills/ruzzy/SKILL.md +0 -443
- package/skills/testing-handbook-skills/skills/semgrep/SKILL.md +0 -601
- package/skills/testing-handbook-skills/skills/testing-handbook-generator/SKILL.md +0 -372
- package/skills/testing-handbook-skills/skills/testing-handbook-generator/agent-prompt.md +0 -280
- package/skills/testing-handbook-skills/skills/testing-handbook-generator/discovery.md +0 -452
- package/skills/testing-handbook-skills/skills/testing-handbook-generator/templates/domain-skill.md +0 -504
- package/skills/testing-handbook-skills/skills/testing-handbook-generator/templates/fuzzer-skill.md +0 -454
- package/skills/testing-handbook-skills/skills/testing-handbook-generator/templates/technique-skill.md +0 -527
- package/skills/testing-handbook-skills/skills/testing-handbook-generator/templates/tool-skill.md +0 -366
- package/skills/testing-handbook-skills/skills/testing-handbook-generator/testing.md +0 -482
- package/skills/testing-handbook-skills/skills/wycheproof/SKILL.md +0 -533
- package/skills/video-frames/SKILL.md +0 -46
- package/skills/video-frames/scripts/frame.sh +0 -81
- package/skills/voice-call/SKILL.md +0 -45
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
# Himalaya Configuration Reference
|
|
2
|
-
|
|
3
|
-
Configuration file location: `~/.config/himalaya/config.toml`
|
|
4
|
-
|
|
5
|
-
## Minimal IMAP + SMTP Setup
|
|
6
|
-
|
|
7
|
-
```toml
|
|
8
|
-
[accounts.default]
|
|
9
|
-
email = "user@example.com"
|
|
10
|
-
display-name = "Your Name"
|
|
11
|
-
default = true
|
|
12
|
-
|
|
13
|
-
# IMAP backend for reading emails
|
|
14
|
-
backend.type = "imap"
|
|
15
|
-
backend.host = "imap.example.com"
|
|
16
|
-
backend.port = 993
|
|
17
|
-
backend.encryption.type = "tls"
|
|
18
|
-
backend.login = "user@example.com"
|
|
19
|
-
backend.auth.type = "password"
|
|
20
|
-
backend.auth.raw = "your-password"
|
|
21
|
-
|
|
22
|
-
# SMTP backend for sending emails
|
|
23
|
-
message.send.backend.type = "smtp"
|
|
24
|
-
message.send.backend.host = "smtp.example.com"
|
|
25
|
-
message.send.backend.port = 587
|
|
26
|
-
message.send.backend.encryption.type = "start-tls"
|
|
27
|
-
message.send.backend.login = "user@example.com"
|
|
28
|
-
message.send.backend.auth.type = "password"
|
|
29
|
-
message.send.backend.auth.raw = "your-password"
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
## Password Options
|
|
33
|
-
|
|
34
|
-
### Raw password (testing only, not recommended)
|
|
35
|
-
|
|
36
|
-
```toml
|
|
37
|
-
backend.auth.raw = "your-password"
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
### Password from command (recommended)
|
|
41
|
-
|
|
42
|
-
```toml
|
|
43
|
-
backend.auth.cmd = "pass show email/imap"
|
|
44
|
-
# backend.auth.cmd = "security find-generic-password -a user@example.com -s imap -w"
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
### System keyring (requires keyring feature)
|
|
48
|
-
|
|
49
|
-
```toml
|
|
50
|
-
backend.auth.keyring = "imap-example"
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
Then run `himalaya account configure <account>` to store the password.
|
|
54
|
-
|
|
55
|
-
## Gmail Configuration
|
|
56
|
-
|
|
57
|
-
```toml
|
|
58
|
-
[accounts.gmail]
|
|
59
|
-
email = "you@gmail.com"
|
|
60
|
-
display-name = "Your Name"
|
|
61
|
-
default = true
|
|
62
|
-
|
|
63
|
-
backend.type = "imap"
|
|
64
|
-
backend.host = "imap.gmail.com"
|
|
65
|
-
backend.port = 993
|
|
66
|
-
backend.encryption.type = "tls"
|
|
67
|
-
backend.login = "you@gmail.com"
|
|
68
|
-
backend.auth.type = "password"
|
|
69
|
-
backend.auth.cmd = "pass show google/app-password"
|
|
70
|
-
|
|
71
|
-
message.send.backend.type = "smtp"
|
|
72
|
-
message.send.backend.host = "smtp.gmail.com"
|
|
73
|
-
message.send.backend.port = 587
|
|
74
|
-
message.send.backend.encryption.type = "start-tls"
|
|
75
|
-
message.send.backend.login = "you@gmail.com"
|
|
76
|
-
message.send.backend.auth.type = "password"
|
|
77
|
-
message.send.backend.auth.cmd = "pass show google/app-password"
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
**Note:** Gmail requires an App Password if 2FA is enabled.
|
|
81
|
-
|
|
82
|
-
## iCloud Configuration
|
|
83
|
-
|
|
84
|
-
```toml
|
|
85
|
-
[accounts.icloud]
|
|
86
|
-
email = "you@icloud.com"
|
|
87
|
-
display-name = "Your Name"
|
|
88
|
-
|
|
89
|
-
backend.type = "imap"
|
|
90
|
-
backend.host = "imap.mail.me.com"
|
|
91
|
-
backend.port = 993
|
|
92
|
-
backend.encryption.type = "tls"
|
|
93
|
-
backend.login = "you@icloud.com"
|
|
94
|
-
backend.auth.type = "password"
|
|
95
|
-
backend.auth.cmd = "pass show icloud/app-password"
|
|
96
|
-
|
|
97
|
-
message.send.backend.type = "smtp"
|
|
98
|
-
message.send.backend.host = "smtp.mail.me.com"
|
|
99
|
-
message.send.backend.port = 587
|
|
100
|
-
message.send.backend.encryption.type = "start-tls"
|
|
101
|
-
message.send.backend.login = "you@icloud.com"
|
|
102
|
-
message.send.backend.auth.type = "password"
|
|
103
|
-
message.send.backend.auth.cmd = "pass show icloud/app-password"
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
**Note:** Generate an app-specific password at appleid.apple.com
|
|
107
|
-
|
|
108
|
-
## Folder Aliases
|
|
109
|
-
|
|
110
|
-
Map custom folder names:
|
|
111
|
-
|
|
112
|
-
```toml
|
|
113
|
-
[accounts.default.folder.alias]
|
|
114
|
-
inbox = "INBOX"
|
|
115
|
-
sent = "Sent"
|
|
116
|
-
drafts = "Drafts"
|
|
117
|
-
trash = "Trash"
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
## Multiple Accounts
|
|
121
|
-
|
|
122
|
-
```toml
|
|
123
|
-
[accounts.personal]
|
|
124
|
-
email = "personal@example.com"
|
|
125
|
-
default = true
|
|
126
|
-
# ... backend config ...
|
|
127
|
-
|
|
128
|
-
[accounts.work]
|
|
129
|
-
email = "work@company.com"
|
|
130
|
-
# ... backend config ...
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
Switch accounts with `--account`:
|
|
134
|
-
|
|
135
|
-
```bash
|
|
136
|
-
himalaya --account work envelope list
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
## Notmuch Backend (local mail)
|
|
140
|
-
|
|
141
|
-
```toml
|
|
142
|
-
[accounts.local]
|
|
143
|
-
email = "user@example.com"
|
|
144
|
-
|
|
145
|
-
backend.type = "notmuch"
|
|
146
|
-
backend.db-path = "~/.mail/.notmuch"
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
## OAuth2 Authentication (for providers that support it)
|
|
150
|
-
|
|
151
|
-
```toml
|
|
152
|
-
backend.auth.type = "oauth2"
|
|
153
|
-
backend.auth.client-id = "your-client-id"
|
|
154
|
-
backend.auth.client-secret.cmd = "pass show oauth/client-secret"
|
|
155
|
-
backend.auth.access-token.cmd = "pass show oauth/access-token"
|
|
156
|
-
backend.auth.refresh-token.cmd = "pass show oauth/refresh-token"
|
|
157
|
-
backend.auth.auth-url = "https://provider.com/oauth/authorize"
|
|
158
|
-
backend.auth.token-url = "https://provider.com/oauth/token"
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
## Additional Options
|
|
162
|
-
|
|
163
|
-
### Signature
|
|
164
|
-
|
|
165
|
-
```toml
|
|
166
|
-
[accounts.default]
|
|
167
|
-
signature = "Best regards,\nYour Name"
|
|
168
|
-
signature-delim = "-- \n"
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
### Downloads directory
|
|
172
|
-
|
|
173
|
-
```toml
|
|
174
|
-
[accounts.default]
|
|
175
|
-
downloads-dir = "~/Downloads/himalaya"
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
### Editor for composing
|
|
179
|
-
|
|
180
|
-
Set via environment variable:
|
|
181
|
-
|
|
182
|
-
```bash
|
|
183
|
-
export EDITOR="vim"
|
|
184
|
-
```
|
|
@@ -1,199 +0,0 @@
|
|
|
1
|
-
# Message Composition with MML (MIME Meta Language)
|
|
2
|
-
|
|
3
|
-
Himalaya uses MML for composing emails. MML is a simple XML-based syntax that compiles to MIME messages.
|
|
4
|
-
|
|
5
|
-
## Basic Message Structure
|
|
6
|
-
|
|
7
|
-
An email message is a list of **headers** followed by a **body**, separated by a blank line:
|
|
8
|
-
|
|
9
|
-
```
|
|
10
|
-
From: sender@example.com
|
|
11
|
-
To: recipient@example.com
|
|
12
|
-
Subject: Hello World
|
|
13
|
-
|
|
14
|
-
This is the message body.
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
## Headers
|
|
18
|
-
|
|
19
|
-
Common headers:
|
|
20
|
-
|
|
21
|
-
- `From`: Sender address
|
|
22
|
-
- `To`: Primary recipient(s)
|
|
23
|
-
- `Cc`: Carbon copy recipients
|
|
24
|
-
- `Bcc`: Blind carbon copy recipients
|
|
25
|
-
- `Subject`: Message subject
|
|
26
|
-
- `Reply-To`: Address for replies (if different from From)
|
|
27
|
-
- `In-Reply-To`: Message ID being replied to
|
|
28
|
-
|
|
29
|
-
### Address Formats
|
|
30
|
-
|
|
31
|
-
```
|
|
32
|
-
To: user@example.com
|
|
33
|
-
To: John Doe <john@example.com>
|
|
34
|
-
To: "John Doe" <john@example.com>
|
|
35
|
-
To: user1@example.com, user2@example.com, "Jane" <jane@example.com>
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
## Plain Text Body
|
|
39
|
-
|
|
40
|
-
Simple plain text email:
|
|
41
|
-
|
|
42
|
-
```
|
|
43
|
-
From: alice@localhost
|
|
44
|
-
To: bob@localhost
|
|
45
|
-
Subject: Plain Text Example
|
|
46
|
-
|
|
47
|
-
Hello, this is a plain text email.
|
|
48
|
-
No special formatting needed.
|
|
49
|
-
|
|
50
|
-
Best,
|
|
51
|
-
Alice
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
## MML for Rich Emails
|
|
55
|
-
|
|
56
|
-
### Multipart Messages
|
|
57
|
-
|
|
58
|
-
Alternative text/html parts:
|
|
59
|
-
|
|
60
|
-
```
|
|
61
|
-
From: alice@localhost
|
|
62
|
-
To: bob@localhost
|
|
63
|
-
Subject: Multipart Example
|
|
64
|
-
|
|
65
|
-
<#multipart type=alternative>
|
|
66
|
-
This is the plain text version.
|
|
67
|
-
<#part type=text/html>
|
|
68
|
-
<html><body><h1>This is the HTML version</h1></body></html>
|
|
69
|
-
<#/multipart>
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
### Attachments
|
|
73
|
-
|
|
74
|
-
Attach a file:
|
|
75
|
-
|
|
76
|
-
```
|
|
77
|
-
From: alice@localhost
|
|
78
|
-
To: bob@localhost
|
|
79
|
-
Subject: With Attachment
|
|
80
|
-
|
|
81
|
-
Here is the document you requested.
|
|
82
|
-
|
|
83
|
-
<#part filename=/path/to/document.pdf><#/part>
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
Attachment with custom name:
|
|
87
|
-
|
|
88
|
-
```
|
|
89
|
-
<#part filename=/path/to/file.pdf name=report.pdf><#/part>
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
Multiple attachments:
|
|
93
|
-
|
|
94
|
-
```
|
|
95
|
-
<#part filename=/path/to/doc1.pdf><#/part>
|
|
96
|
-
<#part filename=/path/to/doc2.pdf><#/part>
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
### Inline Images
|
|
100
|
-
|
|
101
|
-
Embed an image inline:
|
|
102
|
-
|
|
103
|
-
```
|
|
104
|
-
From: alice@localhost
|
|
105
|
-
To: bob@localhost
|
|
106
|
-
Subject: Inline Image
|
|
107
|
-
|
|
108
|
-
<#multipart type=related>
|
|
109
|
-
<#part type=text/html>
|
|
110
|
-
<html><body>
|
|
111
|
-
<p>Check out this image:</p>
|
|
112
|
-
<img src="cid:image1">
|
|
113
|
-
</body></html>
|
|
114
|
-
<#part disposition=inline id=image1 filename=/path/to/image.png><#/part>
|
|
115
|
-
<#/multipart>
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
### Mixed Content (Text + Attachments)
|
|
119
|
-
|
|
120
|
-
```
|
|
121
|
-
From: alice@localhost
|
|
122
|
-
To: bob@localhost
|
|
123
|
-
Subject: Mixed Content
|
|
124
|
-
|
|
125
|
-
<#multipart type=mixed>
|
|
126
|
-
<#part type=text/plain>
|
|
127
|
-
Please find the attached files.
|
|
128
|
-
|
|
129
|
-
Best,
|
|
130
|
-
Alice
|
|
131
|
-
<#part filename=/path/to/file1.pdf><#/part>
|
|
132
|
-
<#part filename=/path/to/file2.zip><#/part>
|
|
133
|
-
<#/multipart>
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
## MML Tag Reference
|
|
137
|
-
|
|
138
|
-
### `<#multipart>`
|
|
139
|
-
|
|
140
|
-
Groups multiple parts together.
|
|
141
|
-
|
|
142
|
-
- `type=alternative`: Different representations of same content
|
|
143
|
-
- `type=mixed`: Independent parts (text + attachments)
|
|
144
|
-
- `type=related`: Parts that reference each other (HTML + images)
|
|
145
|
-
|
|
146
|
-
### `<#part>`
|
|
147
|
-
|
|
148
|
-
Defines a message part.
|
|
149
|
-
|
|
150
|
-
- `type=<mime-type>`: Content type (e.g., `text/html`, `application/pdf`)
|
|
151
|
-
- `filename=<path>`: File to attach
|
|
152
|
-
- `name=<name>`: Display name for attachment
|
|
153
|
-
- `disposition=inline`: Display inline instead of as attachment
|
|
154
|
-
- `id=<cid>`: Content ID for referencing in HTML
|
|
155
|
-
|
|
156
|
-
## Composing from CLI
|
|
157
|
-
|
|
158
|
-
### Interactive compose
|
|
159
|
-
|
|
160
|
-
Opens your `$EDITOR`:
|
|
161
|
-
|
|
162
|
-
```bash
|
|
163
|
-
himalaya message write
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
### Reply (opens editor with quoted message)
|
|
167
|
-
|
|
168
|
-
```bash
|
|
169
|
-
himalaya message reply 42
|
|
170
|
-
himalaya message reply 42 --all # reply-all
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
### Forward
|
|
174
|
-
|
|
175
|
-
```bash
|
|
176
|
-
himalaya message forward 42
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
### Send from stdin
|
|
180
|
-
|
|
181
|
-
```bash
|
|
182
|
-
cat message.txt | himalaya template send
|
|
183
|
-
```
|
|
184
|
-
|
|
185
|
-
### Prefill headers from CLI
|
|
186
|
-
|
|
187
|
-
```bash
|
|
188
|
-
himalaya message write \
|
|
189
|
-
-H "To:recipient@example.com" \
|
|
190
|
-
-H "Subject:Quick Message" \
|
|
191
|
-
"Message body here"
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
## Tips
|
|
195
|
-
|
|
196
|
-
- The editor opens with a template; fill in headers and body.
|
|
197
|
-
- Save and exit the editor to send; exit without saving to cancel.
|
|
198
|
-
- MML parts are compiled to proper MIME when sending.
|
|
199
|
-
- Use `himalaya message export --full` to inspect the raw MIME structure of received emails.
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
# Local Places
|
|
2
|
-
|
|
3
|
-
This repo is a fusion of two pieces:
|
|
4
|
-
|
|
5
|
-
- A FastAPI server that exposes endpoints for searching and resolving places via the Google Maps Places API.
|
|
6
|
-
- A companion agent skill that explains how to use the API and can call it to find places efficiently.
|
|
7
|
-
|
|
8
|
-
Together, the skill and server let an agent turn natural-language place queries into structured results quickly.
|
|
9
|
-
|
|
10
|
-
## Run locally
|
|
11
|
-
|
|
12
|
-
```bash
|
|
13
|
-
# copy skill definition into the relevant folder (where the agent looks for it)
|
|
14
|
-
# then run the server
|
|
15
|
-
|
|
16
|
-
uv venv
|
|
17
|
-
uv pip install -e ".[dev]"
|
|
18
|
-
uv run --env-file .env uvicorn local_places.main:app --host 0.0.0.0 --reload
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
Open the API docs at http://127.0.0.1:8000/docs.
|
|
22
|
-
|
|
23
|
-
## Places API
|
|
24
|
-
|
|
25
|
-
Set the Google Places API key before running:
|
|
26
|
-
|
|
27
|
-
```bash
|
|
28
|
-
export GOOGLE_PLACES_API_KEY="your-key"
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
Endpoints:
|
|
32
|
-
|
|
33
|
-
- `POST /places/search` (free-text query + filters)
|
|
34
|
-
- `GET /places/{place_id}` (place details)
|
|
35
|
-
- `POST /locations/resolve` (resolve a user-provided location string)
|
|
36
|
-
|
|
37
|
-
Example search request:
|
|
38
|
-
|
|
39
|
-
```json
|
|
40
|
-
{
|
|
41
|
-
"query": "italian restaurant",
|
|
42
|
-
"filters": {
|
|
43
|
-
"types": ["restaurant"],
|
|
44
|
-
"open_now": true,
|
|
45
|
-
"min_rating": 4.0,
|
|
46
|
-
"price_levels": [1, 2]
|
|
47
|
-
},
|
|
48
|
-
"limit": 10
|
|
49
|
-
}
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
Notes:
|
|
53
|
-
|
|
54
|
-
- `filters.types` supports a single type (mapped to Google `includedType`).
|
|
55
|
-
|
|
56
|
-
Example search request (curl):
|
|
57
|
-
|
|
58
|
-
```bash
|
|
59
|
-
curl -X POST http://127.0.0.1:8000/places/search \
|
|
60
|
-
-H "Content-Type: application/json" \
|
|
61
|
-
-d '{
|
|
62
|
-
"query": "italian restaurant",
|
|
63
|
-
"location_bias": {
|
|
64
|
-
"lat": 40.8065,
|
|
65
|
-
"lng": -73.9719,
|
|
66
|
-
"radius_m": 3000
|
|
67
|
-
},
|
|
68
|
-
"filters": {
|
|
69
|
-
"types": ["restaurant"],
|
|
70
|
-
"open_now": true,
|
|
71
|
-
"min_rating": 4.0,
|
|
72
|
-
"price_levels": [1, 2, 3]
|
|
73
|
-
},
|
|
74
|
-
"limit": 10
|
|
75
|
-
}'
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
Example resolve request (curl):
|
|
79
|
-
|
|
80
|
-
```bash
|
|
81
|
-
curl -X POST http://127.0.0.1:8000/locations/resolve \
|
|
82
|
-
-H "Content-Type: application/json" \
|
|
83
|
-
-d '{
|
|
84
|
-
"location_text": "Riverside Park, New York",
|
|
85
|
-
"limit": 5
|
|
86
|
-
}'
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
## Test
|
|
90
|
-
|
|
91
|
-
```bash
|
|
92
|
-
uv run pytest
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
## OpenAPI
|
|
96
|
-
|
|
97
|
-
Generate the OpenAPI schema:
|
|
98
|
-
|
|
99
|
-
```bash
|
|
100
|
-
uv run python scripts/generate_openapi.py
|
|
101
|
-
```
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: local-places
|
|
3
|
-
description: Search for places (restaurants, cafes, etc.) via Google Places API proxy on localhost.
|
|
4
|
-
homepage: https://github.com/Hyaxia/local_places
|
|
5
|
-
metadata:
|
|
6
|
-
{
|
|
7
|
-
"otto":
|
|
8
|
-
{
|
|
9
|
-
"emoji": "📍",
|
|
10
|
-
"requires": { "bins": ["uv"], "env": ["GOOGLE_PLACES_API_KEY"] },
|
|
11
|
-
"primaryEnv": "GOOGLE_PLACES_API_KEY",
|
|
12
|
-
},
|
|
13
|
-
}
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
# 📍 Local Places
|
|
17
|
-
|
|
18
|
-
_Find places, Go fast_
|
|
19
|
-
|
|
20
|
-
Search for nearby places using a local Google Places API proxy. Two-step flow: resolve location first, then search.
|
|
21
|
-
|
|
22
|
-
## Setup
|
|
23
|
-
|
|
24
|
-
```bash
|
|
25
|
-
cd {baseDir}
|
|
26
|
-
echo "GOOGLE_PLACES_API_KEY=your-key" > .env
|
|
27
|
-
uv venv && uv pip install -e ".[dev]"
|
|
28
|
-
uv run --env-file .env uvicorn local_places.main:app --host 127.0.0.1 --port 8000
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
Requires `GOOGLE_PLACES_API_KEY` in `.env` or environment.
|
|
32
|
-
|
|
33
|
-
## Quick Start
|
|
34
|
-
|
|
35
|
-
1. **Check server:** `curl http://127.0.0.1:8000/ping`
|
|
36
|
-
|
|
37
|
-
2. **Resolve location:**
|
|
38
|
-
|
|
39
|
-
```bash
|
|
40
|
-
curl -X POST http://127.0.0.1:8000/locations/resolve \
|
|
41
|
-
-H "Content-Type: application/json" \
|
|
42
|
-
-d '{"location_text": "Soho, London", "limit": 5}'
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
3. **Search places:**
|
|
46
|
-
|
|
47
|
-
```bash
|
|
48
|
-
curl -X POST http://127.0.0.1:8000/places/search \
|
|
49
|
-
-H "Content-Type: application/json" \
|
|
50
|
-
-d '{
|
|
51
|
-
"query": "coffee shop",
|
|
52
|
-
"location_bias": {"lat": 51.5137, "lng": -0.1366, "radius_m": 1000},
|
|
53
|
-
"filters": {"open_now": true, "min_rating": 4.0},
|
|
54
|
-
"limit": 10
|
|
55
|
-
}'
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
4. **Get details:**
|
|
59
|
-
|
|
60
|
-
```bash
|
|
61
|
-
curl http://127.0.0.1:8000/places/{place_id}
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
## Conversation Flow
|
|
65
|
-
|
|
66
|
-
1. If user says "near me" or gives vague location → resolve it first
|
|
67
|
-
2. If multiple results → show numbered list, ask user to pick
|
|
68
|
-
3. Ask for preferences: type, open now, rating, price level
|
|
69
|
-
4. Search with `location_bias` from chosen location
|
|
70
|
-
5. Present results with name, rating, address, open status
|
|
71
|
-
6. Offer to fetch details or refine search
|
|
72
|
-
|
|
73
|
-
## Filter Constraints
|
|
74
|
-
|
|
75
|
-
- `filters.types`: exactly ONE type (e.g., "restaurant", "cafe", "gym")
|
|
76
|
-
- `filters.price_levels`: integers 0-4 (0=free, 4=very expensive)
|
|
77
|
-
- `filters.min_rating`: 0-5 in 0.5 increments
|
|
78
|
-
- `filters.open_now`: boolean
|
|
79
|
-
- `limit`: 1-20 for search, 1-10 for resolve
|
|
80
|
-
- `location_bias.radius_m`: must be > 0
|
|
81
|
-
|
|
82
|
-
## Response Format
|
|
83
|
-
|
|
84
|
-
```json
|
|
85
|
-
{
|
|
86
|
-
"results": [
|
|
87
|
-
{
|
|
88
|
-
"place_id": "ChIJ...",
|
|
89
|
-
"name": "Coffee Shop",
|
|
90
|
-
"address": "123 Main St",
|
|
91
|
-
"location": { "lat": 51.5, "lng": -0.1 },
|
|
92
|
-
"rating": 4.6,
|
|
93
|
-
"price_level": 2,
|
|
94
|
-
"types": ["cafe", "food"],
|
|
95
|
-
"open_now": true
|
|
96
|
-
}
|
|
97
|
-
],
|
|
98
|
-
"next_page_token": "..."
|
|
99
|
-
}
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
Use `next_page_token` as `page_token` in next request for more results.
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
[project]
|
|
2
|
-
name = "my-api"
|
|
3
|
-
version = "0.1.0"
|
|
4
|
-
description = "FastAPI server"
|
|
5
|
-
readme = "README.md"
|
|
6
|
-
requires-python = ">=3.11"
|
|
7
|
-
dependencies = ["fastapi>=0.110.0", "httpx>=0.27.0", "uvicorn[standard]>=0.29.0"]
|
|
8
|
-
|
|
9
|
-
[project.optional-dependencies]
|
|
10
|
-
dev = ["pytest>=8.0.0"]
|
|
11
|
-
|
|
12
|
-
[build-system]
|
|
13
|
-
requires = ["hatchling"]
|
|
14
|
-
build-backend = "hatchling.build"
|
|
15
|
-
|
|
16
|
-
[tool.hatch.build.targets.wheel]
|
|
17
|
-
packages = ["src/local_places"]
|
|
18
|
-
|
|
19
|
-
[tool.pytest.ini_options]
|
|
20
|
-
addopts = "-q"
|
|
21
|
-
testpaths = ["tests"]
|