@soederpop/luca 0.1.3 → 0.2.2

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 (35) hide show
  1. package/.github/workflows/release.yaml +169 -0
  2. package/CNAME +1 -0
  3. package/README.md +3 -0
  4. package/assistants/codingAssistant/ABOUT.md +3 -0
  5. package/assistants/codingAssistant/CORE.md +22 -17
  6. package/assistants/codingAssistant/hooks.ts +19 -2
  7. package/assistants/codingAssistant/tools.ts +1 -106
  8. package/assistants/inkbot/ABOUT.md +5 -0
  9. package/assistants/inkbot/CORE.md +2 -0
  10. package/bun.lock +20 -4
  11. package/commands/release.ts +75 -181
  12. package/docs/CNAME +1 -0
  13. package/docs/ideas/assistant-factory-pattern.md +142 -0
  14. package/index.html +1430 -0
  15. package/package.json +3 -2
  16. package/src/agi/container.server.ts +10 -0
  17. package/src/agi/features/agent-memory.ts +694 -0
  18. package/src/agi/features/assistant.ts +1 -1
  19. package/src/agi/features/assistants-manager.ts +25 -0
  20. package/src/agi/features/browser-use.ts +30 -0
  21. package/src/agi/features/coding-tools.ts +175 -0
  22. package/src/agi/features/file-tools.ts +33 -26
  23. package/src/agi/features/skills-library.ts +28 -11
  24. package/src/bootstrap/generated.ts +1 -1
  25. package/src/cli/build-info.ts +2 -2
  26. package/src/clients/voicebox/index.ts +300 -0
  27. package/src/introspection/generated.agi.ts +2909 -914
  28. package/src/introspection/generated.node.ts +1641 -822
  29. package/src/introspection/generated.web.ts +1 -1
  30. package/src/node/features/content-db.ts +54 -27
  31. package/src/node/features/process-manager.ts +50 -17
  32. package/src/python/generated.ts +1 -1
  33. package/src/scaffolds/generated.ts +1 -1
  34. package/test/assistant.test.ts +14 -5
  35. package/test-integration/memory.test.ts +204 -0
@@ -0,0 +1,169 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+
8
+ jobs:
9
+ build-linux:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: actions/checkout@v4
13
+
14
+ - name: Setup Bun
15
+ uses: oven-sh/setup-bun@v2
16
+
17
+ - name: Install dependencies
18
+ run: bun install
19
+
20
+ - name: Pre-build steps
21
+ run: |
22
+ bash scripts/stamp-build.sh
23
+ bun run build:introspection
24
+ bun run build:scaffolds
25
+ bun run build:bootstrap
26
+ bun run build:python-bridge
27
+
28
+ - name: Build Linux binaries
29
+ run: |
30
+ mkdir -p dist/release
31
+ bun build ./src/cli/cli.ts --compile --target=bun-linux-x64 --outfile dist/release/luca-linux-x64 --external node-llama-cpp
32
+ bun build ./src/cli/cli.ts --compile --target=bun-linux-arm64 --outfile dist/release/luca-linux-arm64 --external node-llama-cpp
33
+
34
+ - name: Upload Linux artifacts
35
+ uses: actions/upload-artifact@v4
36
+ with:
37
+ name: linux-binaries
38
+ path: dist/release/luca-linux-*
39
+
40
+ build-windows:
41
+ runs-on: windows-latest
42
+ steps:
43
+ - uses: actions/checkout@v4
44
+
45
+ - name: Setup Bun
46
+ uses: oven-sh/setup-bun@v2
47
+
48
+ - name: Install dependencies
49
+ run: bun install
50
+
51
+ - name: Pre-build steps
52
+ shell: bash
53
+ run: |
54
+ bash scripts/stamp-build.sh
55
+ bun run build:introspection
56
+ bun run build:scaffolds
57
+ bun run build:bootstrap
58
+ bun run build:python-bridge
59
+
60
+ - name: Build Windows binary
61
+ shell: bash
62
+ run: |
63
+ mkdir -p dist/release
64
+ bun build ./src/cli/cli.ts --compile --target=bun-windows-x64 --outfile dist/release/luca-windows-x64.exe --external node-llama-cpp
65
+
66
+ - name: Upload Windows artifact
67
+ uses: actions/upload-artifact@v4
68
+ with:
69
+ name: windows-binaries
70
+ path: dist/release/luca-windows-x64.exe
71
+
72
+ build-macos:
73
+ runs-on: macos-latest
74
+ steps:
75
+ - uses: actions/checkout@v4
76
+
77
+ - name: Setup Bun
78
+ uses: oven-sh/setup-bun@v2
79
+
80
+ - name: Install dependencies
81
+ run: bun install
82
+
83
+ - name: Pre-build steps
84
+ run: |
85
+ bash scripts/stamp-build.sh
86
+ bun run build:introspection
87
+ bun run build:scaffolds
88
+ bun run build:bootstrap
89
+ bun run build:python-bridge
90
+
91
+ - name: Build macOS binaries
92
+ run: |
93
+ mkdir -p dist/release
94
+ bun build ./src/cli/cli.ts --compile --target=bun-darwin-x64 --outfile dist/release/luca-darwin-x64 --external node-llama-cpp
95
+ bun build ./src/cli/cli.ts --compile --target=bun-darwin-arm64 --outfile dist/release/luca-darwin-arm64 --external node-llama-cpp
96
+
97
+ - name: Import Developer ID Certificate
98
+ env:
99
+ CERTIFICATE_P12: ${{ secrets.APPLE_CERTIFICATE_P12 }}
100
+ CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
101
+ run: |
102
+ echo "$CERTIFICATE_P12" | base64 --decode > certificate.p12
103
+ security create-keychain -p "" build.keychain
104
+ security import certificate.p12 -k build.keychain \
105
+ -P "$CERTIFICATE_PASSWORD" -T /usr/bin/codesign
106
+ security list-keychains -s build.keychain
107
+ security default-keychain -s build.keychain
108
+ security unlock-keychain -p "" build.keychain
109
+ security set-key-partition-list -S apple-tool:,apple: \
110
+ -s -k "" build.keychain
111
+
112
+ - name: Sign macOS binaries
113
+ run: |
114
+ codesign --sign "Developer ID Application: Demitra Del Fiacco (77WL45HR8M)" \
115
+ --force --options runtime --timestamp dist/release/luca-darwin-x64
116
+ codesign --sign "Developer ID Application: Demitra Del Fiacco (77WL45HR8M)" \
117
+ --force --options runtime --timestamp dist/release/luca-darwin-arm64
118
+
119
+ - name: Notarize macOS binaries
120
+ env:
121
+ APPLE_ID: ${{ secrets.APPLE_ID }}
122
+ APPLE_APP_PASSWORD: ${{ secrets.APPLE_APP_PASSWORD }}
123
+ APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
124
+ run: |
125
+ zip dist/release/luca-darwin-x64.zip dist/release/luca-darwin-x64
126
+ xcrun notarytool submit dist/release/luca-darwin-x64.zip \
127
+ --apple-id "$APPLE_ID" \
128
+ --password "$APPLE_APP_PASSWORD" \
129
+ --team-id "$APPLE_TEAM_ID" \
130
+ --wait
131
+
132
+ zip dist/release/luca-darwin-arm64.zip dist/release/luca-darwin-arm64
133
+ xcrun notarytool submit dist/release/luca-darwin-arm64.zip \
134
+ --apple-id "$APPLE_ID" \
135
+ --password "$APPLE_APP_PASSWORD" \
136
+ --team-id "$APPLE_TEAM_ID" \
137
+ --wait
138
+
139
+ - name: Staple notarization
140
+ run: |
141
+ xcrun stapler staple dist/release/luca-darwin-x64 || true
142
+ xcrun stapler staple dist/release/luca-darwin-arm64 || true
143
+
144
+ - name: Upload macOS artifacts
145
+ uses: actions/upload-artifact@v4
146
+ with:
147
+ name: macos-binaries
148
+ path: dist/release/luca-darwin-*
149
+ exclude: |
150
+ dist/release/*.zip
151
+
152
+ create-release:
153
+ needs: [build-linux, build-windows, build-macos]
154
+ runs-on: ubuntu-latest
155
+ permissions:
156
+ contents: write
157
+ steps:
158
+ - name: Download all artifacts
159
+ uses: actions/download-artifact@v4
160
+ with:
161
+ merge-multiple: true
162
+ path: dist/release
163
+
164
+ - name: Create draft GitHub release
165
+ uses: softprops/action-gh-release@v2
166
+ with:
167
+ draft: true
168
+ generate_release_notes: true
169
+ files: dist/release/*
package/CNAME ADDED
@@ -0,0 +1 @@
1
+ luca-js.soederpop.com
package/README.md CHANGED
@@ -229,8 +229,11 @@ The CLI works great alongside Claude Code, Codex, and other coding assistants:
229
229
  git clone https://github.com/soederpop/luca.git
230
230
  cd luca
231
231
  bun install
232
+ bun run setup
232
233
  ```
233
234
 
235
+ `bun run setup` applies `git update-index --skip-worktree` to the build artifact stubs so local changes to generated files (from running `build:introspection`, `build:scaffolds`, etc.) are never accidentally committed.
236
+
234
237
  ### Running in dev
235
238
 
236
239
  ```sh
@@ -0,0 +1,3 @@
1
+ # Luca Coding Assistant
2
+
3
+ The Luca Coding assistant understands the Luca framework, and how to learn it.
@@ -1,25 +1,30 @@
1
- # Coding Assistant
1
+ ---
2
+ skills:
3
+ - luca-framework
4
+ ---
5
+ # Luca Coding Assistant
2
6
 
3
- You are a coding assistant whose purpose is to read and understand codebases as efficiently as possible.
7
+ You are a Luca framework coding assistant. You read, search, understand, and modify Luca project codebases.
4
8
 
5
- You are armed with the following tools:
9
+ - [Luca Github Repo](https://github.com/soederpop/luca)
6
10
 
7
- - **rg** — ripgrep for fast content search across files. Pass any arguments you'd normally pass to `rg`.
8
- - **ls** — list files and directories. Pass any arguments you'd normally pass to `ls`.
9
- - **cat** — read file contents. Pass any arguments you'd normally pass to `cat`.
10
- - **sed** — stream editor for filtering and transforming text. Pass any arguments you'd normally pass to `sed`.
11
- - **awk** — pattern scanning and text processing. Pass any arguments you'd normally pass to `awk`.
12
- - **pwd** — print the current working directory.
11
+ ## Luca First
13
12
 
14
- Each tool accepts a single string argument: everything that comes after the command name on the command line. For example, to search for "TODO" in TypeScript files, call `rg` with `"TODO" --type ts`.
13
+ This assistant lives in a Luca project. Load `luca-framework` immediately, use `luca describe` to learn framework APIs, and use `luca eval` to verify runtime behavior. Prefer `luca` over guessing from source when the question is about the framework.
15
14
 
16
15
  ## How to Work
17
16
 
18
- 1. Start by orienting yourself — use `pwd` to know where you are, then `ls` to see what's around.
19
- 2. Use `rg` liberally to find relevant code quickly. It's your most powerful tool.
20
- 3. Use `cat` to read files once you've located them.
21
- 4. Use `sed` and `awk` when you need to extract or transform specific parts of output.
22
- 5. Be efficient don't read entire large files when `rg` can pinpoint what you need.
23
- 6. Synthesize what you find into clear, concise answers.
17
+ 1. **Introspect** -- use `luca describe` for framework APIs and `luca eval` for runtime verification before guessing.
18
+ 2. **Orient** -- `ls` to see what's around, `rg` to find what you need. Start broad, narrow fast.
19
+ 3. **Read** -- `cat -n` to read files with line numbers. `sed -n "10,30p"` for specific ranges. Don't load 500 lines when you need 20.
20
+ 4. **Change** -- `editFile` for surgical edits to existing code. `writeFile` only for new files. Never rewrite what you can edit.
21
+ 5. **Verify** -- `runCommand` to build, test, type-check after changes. Don't assume your edit worked.
24
22
 
25
- You are read-only. You do not modify files. Your job is to find, read, and explain code.
23
+ ## Rules
24
+
25
+ - Read before you write. Always.
26
+ - Prefer `editFile` over `writeFile` for existing files -- it makes targeted replacements instead of overwriting.
27
+ - Use `rg` liberally. It is faster and more reliable than guessing file paths or grepping your memory.
28
+ - Keep changes minimal. Fix what was asked, don't refactor the neighborhood.
29
+ - Load `luca-framework` at the start and use the Luca CLI before inferring framework behavior from source.
30
+ - Explain what you're about to do, then do it. No essays.
@@ -1,5 +1,22 @@
1
- import type { Assistant } from "@/agi"
1
+ import type { Assistant, AGIContainer } from '@soederpop/luca/agi'
2
+
3
+ declare global {
4
+ var assistant: Assistant
5
+ var container: AGIContainer
6
+ }
2
7
 
3
8
  export function started() {
4
- assistant.use(container.feature('skillsLibrary'))
9
+ // Shell primitives: rg, ls, cat, sed, awk
10
+ assistant.use(container.feature('codingTools'))
11
+
12
+ // Write operations only -- shell tools cover read/search/list
13
+ const fileTools = container.feature('fileTools')
14
+ assistant.use(fileTools.toTools({ only: ['editFile', 'writeFile', 'deleteFile'] }))
15
+ fileTools.setupToolsConsumer(assistant)
16
+
17
+ // Process management: runCommand, spawnProcess, listProcesses, etc.
18
+ assistant.use(container.feature('processManager'))
19
+
20
+ // Skill discovery and loading
21
+ assistant.use(container.feature('skillsLibrary'))
5
22
  }
@@ -1,108 +1,3 @@
1
1
  import { z } from 'zod'
2
- import type { Assistant, AGIContainer } from '@soederpop/luca/agi'
3
2
 
4
- declare global {
5
- var assistant: Assistant
6
- var container: AGIContainer
7
- }
8
-
9
- const proc = () => container.feature('proc')
10
- const fs = () => container.feature('fs')
11
-
12
- // Patterns that enable command chaining, substitution, or injection at the shell level.
13
- const SHELL_INJECTION_PATTERNS = [
14
- /;/, // command chaining
15
- /&&/, // logical AND chaining
16
- /\|\|/, // logical OR chaining
17
- /\$\(/, // command substitution $(...)
18
- /`/, // backtick command substitution
19
- /\$\{/, // variable expansion ${...}
20
- /\n/, // newline injection
21
- ]
22
-
23
- // Additional patterns for tools that should not use piping or redirection.
24
- const PIPE_AND_REDIRECT_PATTERNS = [
25
- /\|/, // piping
26
- />\s*/, // output redirection
27
- /<\(/, // process substitution
28
- ]
29
-
30
- /**
31
- * Validates that args don't contain shell injection metacharacters.
32
- * `strict` mode also blocks pipes and redirects (for tools like ls, cat).
33
- * `permissive` mode allows | and > since they're valid in regex patterns (for rg, sed, awk).
34
- */
35
- function sanitizeArgs(args: string, command: string, mode: 'strict' | 'permissive' = 'strict'): string {
36
- const patterns = mode === 'strict'
37
- ? [...SHELL_INJECTION_PATTERNS, ...PIPE_AND_REDIRECT_PATTERNS]
38
- : SHELL_INJECTION_PATTERNS
39
-
40
- for (const pattern of patterns) {
41
- if (pattern.test(args)) {
42
- throw new Error(
43
- `Refused to execute ${command}: args contain a disallowed shell metacharacter (matched ${pattern}). ` +
44
- `Only pass flags, patterns, and file paths — no command chaining or substitution.`
45
- )
46
- }
47
- }
48
-
49
- return args
50
- }
51
-
52
- export const schemas = {
53
- rg: z.object({
54
- args: z.string().describe('Arguments to pass to ripgrep, e.g. "TODO" --type ts -n'),
55
- }).describe('Search file contents using ripgrep (rg). Fast, recursive, respects .gitignore.'),
56
-
57
- ls: z.object({
58
- args: z.string().default('.').describe('Arguments to pass to ls, e.g. -la src/'),
59
- }).describe('List files and directories.'),
60
-
61
- cat: z.object({
62
- args: z.string().describe('Arguments to pass to cat, e.g. src/index.ts'),
63
- }).describe('Read file contents.'),
64
-
65
- sed: z.object({
66
- args: z.string().describe('Arguments to pass to sed, e.g. -n "10,20p" src/index.ts'),
67
- }).describe('Stream editor for filtering and transforming text.'),
68
-
69
- awk: z.object({
70
- args: z.string().describe('Arguments to pass to awk, e.g. \'{print $1}\' file.txt'),
71
- }).describe('Pattern scanning and text processing.'),
72
-
73
- writeFile: z.object({
74
- path: z.string().describe('File path relative to the project root, e.g. src/utils/helper.ts'),
75
- content: z.string().describe('The full content to write to the file'),
76
- }).describe('Write content to a file. Creates the file if it does not exist, overwrites if it does.'),
77
-
78
- pwd: z.object({}).describe('Print the current working directory.'),
79
- }
80
-
81
- export function rg({ args }: z.infer<typeof schemas.rg>): string {
82
- return proc().exec(`rg ${sanitizeArgs(args, 'rg', 'permissive')}`)
83
- }
84
-
85
- export function ls({ args }: z.infer<typeof schemas.ls>): string {
86
- return proc().exec(`ls ${sanitizeArgs(args, 'ls')}`)
87
- }
88
-
89
- export function cat({ args }: z.infer<typeof schemas.cat>): string {
90
- return proc().exec(`cat ${sanitizeArgs(args, 'cat')}`)
91
- }
92
-
93
- export function sed({ args }: z.infer<typeof schemas.sed>): string {
94
- return proc().exec(`sed ${sanitizeArgs(args, 'sed', 'permissive')}`)
95
- }
96
-
97
- export function awk({ args }: z.infer<typeof schemas.awk>): string {
98
- return proc().exec(`awk ${sanitizeArgs(args, 'awk', 'permissive')}`)
99
- }
100
-
101
- export async function writeFile({ path, content }: z.infer<typeof schemas.writeFile>): Promise<string> {
102
- await fs().writeFileAsync(path, content)
103
- return `Wrote ${content.length} bytes to ${path}`
104
- }
105
-
106
- export function pwd(): string {
107
- return proc().exec('pwd')
108
- }
3
+ export const schemas = {}
@@ -0,0 +1,5 @@
1
+ # Luca Inkbot Assistant
2
+
3
+ The Luca Inkbot Assistant is a demo assistant that goes along with the `luca inkbot` command that is available if you check out the Luca Framework's source code from Github.
4
+
5
+ Inkbot knows how to build TUIs with Ink, and how to learn and discover all available framework APIs.
@@ -1,5 +1,7 @@
1
1
  ---
2
2
  maxTokens: 4096
3
+ local: true
4
+ model: mlx-qwopus3.5-27b-v3-vision
3
5
  skills:
4
6
  - luca-framework
5
7
  ---
package/bun.lock CHANGED
@@ -10,7 +10,7 @@
10
10
  "@supabase/supabase-js": "^2.95.3",
11
11
  "@types/marked": "^6.0.0",
12
12
  "@types/marked-terminal": "^6.1.1",
13
- "axios": "^1.3.5",
13
+ "axios": "1.13.6",
14
14
  "cacache": "^17.0.7",
15
15
  "chalk": "^5.2.0",
16
16
  "child-process-promise": "^2.2.1",
@@ -531,7 +531,7 @@
531
531
 
532
532
  "autoprefixer": ["autoprefixer@10.4.21", "", { "dependencies": { "browserslist": "^4.24.4", "caniuse-lite": "^1.0.30001702", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ=="],
533
533
 
534
- "axios": ["axios@1.9.0", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg=="],
534
+ "axios": ["axios@1.13.6", "", { "dependencies": { "follow-redirects": "^1.15.11", "form-data": "^4.0.5", "proxy-from-env": "^1.1.0" } }, "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ=="],
535
535
 
536
536
  "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="],
537
537
 
@@ -911,11 +911,11 @@
911
911
 
912
912
  "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="],
913
913
 
914
- "follow-redirects": ["follow-redirects@1.15.9", "", {}, "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="],
914
+ "follow-redirects": ["follow-redirects@1.15.11", "", {}, "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ=="],
915
915
 
916
916
  "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="],
917
917
 
918
- "form-data": ["form-data@4.0.3", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA=="],
918
+ "form-data": ["form-data@4.0.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="],
919
919
 
920
920
  "formdata-polyfill": ["formdata-polyfill@4.0.10", "", { "dependencies": { "fetch-blob": "^3.1.2" } }, "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g=="],
921
921
 
@@ -1877,6 +1877,8 @@
1877
1877
 
1878
1878
  "@modelcontextprotocol/sdk/zod": ["zod@3.25.57", "", {}, "sha512-6tgzLuwVST5oLUxXTmBqoinKMd3JeesgbgseXeFasKKj8Q1FCZrHnbqJOyiEvr4cVAlbug+CgIsmJ8cl/pU5FA=="],
1879
1879
 
1880
+ "@soederpop/luca/axios": ["axios@1.9.0", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg=="],
1881
+
1880
1882
  "@soederpop/luca/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="],
1881
1883
 
1882
1884
  "@soederpop/luca/contentbase": ["contentbase@0.1.8", "", { "dependencies": { "@soederpop/luca": ">=0.0.16", "gray-matter": "^4.0.3", "js-yaml": "^4.1.0", "mdast-util-mdxjs-esm": "^2.0.1", "mdast-util-to-markdown": "^2.1.2", "mdast-util-to-string": "^4.0.0", "picomatch": "^4.0.3", "rehype-stringify": "^10.0.1", "remark-gfm": "^4.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.2", "remark-stringify": "^11.0.0", "unified": "^11.0.5", "unist-util-find-after": "^5.0.0", "unist-util-find-all-after": "^5.0.0", "unist-util-find-all-before": "^5.0.0", "unist-util-find-before": "^4.0.0", "unist-util-select": "^5.1.0", "unist-util-visit": "^5.0.0", "zod": "^4.3.6" }, "bin": { "cnotes": "src/cli/index.ts", "contentbase": "src/cli/index.ts" } }, "sha512-FcivPrOkmowDea2FobSCHPmNdudQz90ZF5xwp2aDF5ajRXu1lujvzOXEvmwAZ9AcJC37BQHVNR0Ifa1guZaODw=="],
@@ -2065,6 +2067,8 @@
2065
2067
 
2066
2068
  "jest-matcher-utils/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
2067
2069
 
2070
+ "jsdom/form-data": ["form-data@4.0.3", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA=="],
2071
+
2068
2072
  "longest-line/strip-ansi": ["strip-ansi@3.0.1", "", { "dependencies": { "ansi-regex": "^2.0.0" } }, "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg=="],
2069
2073
 
2070
2074
  "marked-terminal/ansi-escapes": ["ansi-escapes@7.0.0", "", { "dependencies": { "environment": "^1.0.0" } }, "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw=="],
@@ -2333,6 +2337,10 @@
2333
2337
 
2334
2338
  "@modelcontextprotocol/sdk/express/type-is": ["type-is@2.0.1", "", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw=="],
2335
2339
 
2340
+ "@soederpop/luca/axios/follow-redirects": ["follow-redirects@1.15.9", "", {}, "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="],
2341
+
2342
+ "@soederpop/luca/axios/form-data": ["form-data@4.0.3", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA=="],
2343
+
2336
2344
  "@soederpop/luca/contentbase/mdast-util-to-markdown": ["mdast-util-to-markdown@2.1.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA=="],
2337
2345
 
2338
2346
  "@soederpop/luca/contentbase/mdast-util-to-string": ["mdast-util-to-string@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0" } }, "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg=="],
@@ -2517,6 +2525,8 @@
2517
2525
 
2518
2526
  "jest-matcher-utils/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
2519
2527
 
2528
+ "jsdom/form-data/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="],
2529
+
2520
2530
  "longest-line/strip-ansi/ansi-regex": ["ansi-regex@2.1.1", "", {}, "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="],
2521
2531
 
2522
2532
  "mdast-util-from-markdown/micromark-util-decode-string/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="],
@@ -2631,6 +2641,8 @@
2631
2641
 
2632
2642
  "@modelcontextprotocol/sdk/express/type-is/media-typer": ["media-typer@1.1.0", "", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="],
2633
2643
 
2644
+ "@soederpop/luca/axios/form-data/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="],
2645
+
2634
2646
  "@soederpop/luca/contentbase/mdast-util-to-markdown/@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="],
2635
2647
 
2636
2648
  "@soederpop/luca/contentbase/mdast-util-to-markdown/@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="],
@@ -2733,6 +2745,8 @@
2733
2745
 
2734
2746
  "inquirer/ora/cli-cursor/restore-cursor": ["restore-cursor@3.1.0", "", { "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA=="],
2735
2747
 
2748
+ "jsdom/form-data/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="],
2749
+
2736
2750
  "mdast-util-gfm-table/mdast-util-from-markdown/micromark/micromark-util-encode": ["micromark-util-encode@1.1.0", "", {}, "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw=="],
2737
2751
 
2738
2752
  "mdast-util-gfm-table/mdast-util-from-markdown/micromark/micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@1.2.0", "", { "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-encode": "^1.0.0", "micromark-util-symbol": "^1.0.0" } }, "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A=="],
@@ -2783,6 +2797,8 @@
2783
2797
 
2784
2798
  "yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
2785
2799
 
2800
+ "@soederpop/luca/axios/form-data/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="],
2801
+
2786
2802
  "@soederpop/luca/contentbase/mdast-util-to-markdown/mdast-util-phrasing/unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="],
2787
2803
 
2788
2804
  "@soederpop/luca/contentbase/mdast-util-to-markdown/micromark-util-decode-string/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="],