@soederpop/luca 0.0.6 → 0.0.8

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 (208) hide show
  1. package/CLAUDE.md +10 -1
  2. package/RUNME.md +56 -0
  3. package/bun.lock +1 -1
  4. package/commands/build-bootstrap.ts +78 -0
  5. package/commands/build-scaffolds.ts +24 -2
  6. package/commands/try-all-challenges.ts +543 -0
  7. package/commands/try-challenge.ts +100 -0
  8. package/docs/README.md +52 -80
  9. package/docs/TABLE-OF-CONTENTS.md +82 -51
  10. package/docs/apis/clients/elevenlabs.md +232 -8
  11. package/docs/apis/clients/graph.md +59 -8
  12. package/docs/apis/clients/openai.md +362 -2
  13. package/docs/apis/clients/rest.md +122 -2
  14. package/docs/apis/clients/websocket.md +71 -17
  15. package/docs/apis/features/agi/assistant.md +9 -3
  16. package/docs/apis/features/agi/assistants-manager.md +2 -2
  17. package/docs/apis/features/agi/claude-code.md +153 -14
  18. package/docs/apis/features/agi/conversation-history.md +15 -3
  19. package/docs/apis/features/agi/conversation.md +133 -20
  20. package/docs/apis/features/agi/openai-codex.md +90 -12
  21. package/docs/apis/features/agi/skills-library.md +23 -5
  22. package/docs/apis/features/node/container-link.md +59 -0
  23. package/docs/apis/features/node/content-db.md +1 -1
  24. package/docs/apis/features/node/disk-cache.md +1 -1
  25. package/docs/apis/features/node/dns.md +1 -0
  26. package/docs/apis/features/node/docker.md +2 -1
  27. package/docs/apis/features/node/esbuild.md +4 -3
  28. package/docs/apis/features/node/file-manager.md +13 -4
  29. package/docs/apis/features/node/fs.md +726 -171
  30. package/docs/apis/features/node/git.md +1 -0
  31. package/docs/apis/features/node/google-auth.md +23 -4
  32. package/docs/apis/features/node/google-calendar.md +14 -2
  33. package/docs/apis/features/node/google-docs.md +15 -2
  34. package/docs/apis/features/node/google-drive.md +21 -3
  35. package/docs/apis/features/node/google-sheets.md +14 -2
  36. package/docs/apis/features/node/grep.md +2 -0
  37. package/docs/apis/features/node/helpers.md +29 -0
  38. package/docs/apis/features/node/ink.md +2 -2
  39. package/docs/apis/features/node/networking.md +39 -4
  40. package/docs/apis/features/node/os.md +28 -0
  41. package/docs/apis/features/node/postgres.md +26 -4
  42. package/docs/apis/features/node/proc.md +37 -28
  43. package/docs/apis/features/node/process-manager.md +33 -5
  44. package/docs/apis/features/node/repl.md +1 -1
  45. package/docs/apis/features/node/runpod.md +1 -0
  46. package/docs/apis/features/node/secure-shell.md +7 -0
  47. package/docs/apis/features/node/semantic-search.md +12 -5
  48. package/docs/apis/features/node/sqlite.md +26 -4
  49. package/docs/apis/features/node/telegram.md +30 -5
  50. package/docs/apis/features/node/tts.md +17 -2
  51. package/docs/apis/features/node/ui.md +1 -1
  52. package/docs/apis/features/node/vault.md +4 -9
  53. package/docs/apis/features/node/vm.md +3 -12
  54. package/docs/apis/features/node/window-manager.md +128 -20
  55. package/docs/apis/features/web/asset-loader.md +13 -1
  56. package/docs/apis/features/web/container-link.md +59 -0
  57. package/docs/apis/features/web/esbuild.md +4 -3
  58. package/docs/apis/features/web/helpers.md +29 -0
  59. package/docs/apis/features/web/network.md +16 -2
  60. package/docs/apis/features/web/speech.md +16 -2
  61. package/docs/apis/features/web/vault.md +4 -9
  62. package/docs/apis/features/web/vm.md +3 -12
  63. package/docs/apis/features/web/voice.md +18 -1
  64. package/docs/apis/servers/express.md +18 -2
  65. package/docs/apis/servers/mcp.md +29 -4
  66. package/docs/apis/servers/websocket.md +34 -6
  67. package/docs/bootstrap/CLAUDE.md +100 -0
  68. package/docs/bootstrap/SKILL.md +222 -0
  69. package/docs/bootstrap/templates/about-command.ts +41 -0
  70. package/docs/bootstrap/templates/docs-models.ts +22 -0
  71. package/docs/bootstrap/templates/docs-readme.md +43 -0
  72. package/docs/bootstrap/templates/example-feature.ts +53 -0
  73. package/docs/bootstrap/templates/health-endpoint.ts +15 -0
  74. package/docs/bootstrap/templates/luca-cli.ts +25 -0
  75. package/docs/bootstrap/templates/runme.md +54 -0
  76. package/docs/challenges/caching-proxy.md +16 -0
  77. package/docs/challenges/content-db-round-trip.md +14 -0
  78. package/docs/challenges/custom-command.md +9 -0
  79. package/docs/challenges/file-watcher-pipeline.md +11 -0
  80. package/docs/challenges/grep-audit-report.md +15 -0
  81. package/docs/challenges/multi-feature-dashboard.md +14 -0
  82. package/docs/challenges/process-orchestrator.md +17 -0
  83. package/docs/challenges/rest-api-server-with-client.md +12 -0
  84. package/docs/challenges/script-runner-with-vm.md +11 -0
  85. package/docs/challenges/simple-rest-api.md +15 -0
  86. package/docs/challenges/websocket-serve-and-client.md +11 -0
  87. package/docs/challenges/yaml-config-system.md +14 -0
  88. package/docs/command-system-overhaul.md +94 -0
  89. package/docs/examples/assistant/CORE.md +18 -0
  90. package/docs/examples/assistant/hooks.ts +3 -0
  91. package/docs/examples/assistant/tools.ts +10 -0
  92. package/docs/examples/window-manager-layouts.md +180 -0
  93. package/docs/in-memory-fs.md +4 -0
  94. package/docs/models.ts +13 -10
  95. package/docs/philosophy.md +4 -3
  96. package/docs/reports/console-hmr-design.md +170 -0
  97. package/docs/reports/helper-semantic-search.md +72 -0
  98. package/docs/scaffolds/client.md +29 -20
  99. package/docs/scaffolds/command.md +64 -50
  100. package/docs/scaffolds/endpoint.md +31 -36
  101. package/docs/scaffolds/feature.md +28 -18
  102. package/docs/scaffolds/selector.md +91 -0
  103. package/docs/scaffolds/server.md +18 -9
  104. package/docs/selectors.md +115 -0
  105. package/docs/sessions/custom-command/attempt-log-2.md +195 -0
  106. package/docs/sessions/file-watcher-pipeline/attempt-log-1.md +728 -0
  107. package/docs/sessions/file-watcher-pipeline/attempt-log-2.md +555 -0
  108. package/docs/sessions/grep-audit-report/attempt-log-1.md +289 -0
  109. package/docs/sessions/multi-feature-dashboard/attempt-log-2.md +679 -0
  110. package/docs/sessions/rest-api-server-with-client/attempt-log-1.md +1 -0
  111. package/docs/sessions/rest-api-server-with-client/attempt-log-3.md +920 -0
  112. package/docs/sessions/simple-rest-api/attempt-log-1.md +593 -0
  113. package/docs/sessions/websocket-serve-and-client/attempt-log-2.md +995 -0
  114. package/docs/tutorials/00-bootstrap.md +148 -0
  115. package/docs/tutorials/07-endpoints.md +7 -7
  116. package/docs/tutorials/08-commands.md +153 -72
  117. package/luca.cli.ts +3 -0
  118. package/package.json +6 -5
  119. package/public/index.html +1430 -0
  120. package/scripts/examples/using-ollama.ts +2 -1
  121. package/scripts/update-introspection-data.ts +2 -2
  122. package/src/agi/endpoints/experts.ts +1 -1
  123. package/src/agi/features/assistant.ts +7 -0
  124. package/src/agi/features/assistants-manager.ts +5 -5
  125. package/src/agi/features/claude-code.ts +263 -3
  126. package/src/agi/features/conversation-history.ts +7 -1
  127. package/src/agi/features/conversation.ts +26 -3
  128. package/src/agi/features/openai-codex.ts +26 -2
  129. package/src/agi/features/openapi.ts +6 -1
  130. package/src/agi/features/skills-library.ts +9 -1
  131. package/src/bootstrap/generated.ts +595 -0
  132. package/src/cli/cli.ts +64 -21
  133. package/src/client.ts +23 -357
  134. package/src/clients/civitai/index.ts +1 -1
  135. package/src/clients/client-template.ts +1 -1
  136. package/src/clients/comfyui/index.ts +13 -2
  137. package/src/clients/elevenlabs/index.ts +2 -1
  138. package/src/clients/graph.ts +87 -0
  139. package/src/clients/openai/index.ts +10 -1
  140. package/src/clients/rest.ts +207 -0
  141. package/src/clients/websocket.ts +176 -0
  142. package/src/command.ts +281 -34
  143. package/src/commands/bootstrap.ts +185 -0
  144. package/src/commands/chat.ts +5 -4
  145. package/src/commands/describe.ts +341 -4
  146. package/src/commands/help.ts +35 -9
  147. package/src/commands/index.ts +3 -0
  148. package/src/commands/introspect.ts +92 -2
  149. package/src/commands/prompt.ts +5 -6
  150. package/src/commands/run.ts +75 -10
  151. package/src/commands/save-api-docs.ts +49 -0
  152. package/src/commands/scaffold.ts +169 -23
  153. package/src/commands/select.ts +94 -0
  154. package/src/commands/serve.ts +10 -1
  155. package/src/container.ts +15 -0
  156. package/src/endpoint.ts +19 -0
  157. package/src/graft.ts +181 -0
  158. package/src/introspection/generated.agi.ts +12458 -8968
  159. package/src/introspection/generated.node.ts +10573 -7145
  160. package/src/introspection/generated.web.ts +1 -1
  161. package/src/introspection/index.ts +26 -0
  162. package/src/node/container.ts +6 -7
  163. package/src/node/features/content-db.ts +49 -2
  164. package/src/node/features/disk-cache.ts +16 -9
  165. package/src/node/features/dns.ts +16 -3
  166. package/src/node/features/docker.ts +16 -4
  167. package/src/node/features/esbuild.ts +22 -2
  168. package/src/node/features/file-manager.ts +184 -29
  169. package/src/node/features/fs.ts +704 -248
  170. package/src/node/features/git.ts +21 -8
  171. package/src/node/features/grep.ts +23 -3
  172. package/src/node/features/helpers.ts +372 -43
  173. package/src/node/features/networking.ts +39 -4
  174. package/src/node/features/opener.ts +28 -15
  175. package/src/node/features/os.ts +76 -0
  176. package/src/node/features/port-exposer.ts +11 -1
  177. package/src/node/features/postgres.ts +17 -1
  178. package/src/node/features/proc.ts +4 -1
  179. package/src/node/features/python.ts +63 -14
  180. package/src/node/features/repl.ts +11 -7
  181. package/src/node/features/runpod.ts +16 -3
  182. package/src/node/features/secure-shell.ts +27 -2
  183. package/src/node/features/semantic-search.ts +12 -1
  184. package/src/node/features/ui.ts +5 -69
  185. package/src/node/features/vm.ts +17 -0
  186. package/src/node/features/window-manager.ts +68 -20
  187. package/src/node.ts +5 -0
  188. package/src/scaffolds/generated.ts +492 -290
  189. package/src/scaffolds/template.ts +9 -0
  190. package/src/schemas/base.ts +46 -5
  191. package/src/selector.ts +282 -0
  192. package/src/server.ts +11 -0
  193. package/src/servers/express.ts +27 -12
  194. package/src/servers/socket.ts +45 -11
  195. package/src/web/clients/socket.ts +4 -1
  196. package/src/web/container.ts +2 -1
  197. package/src/web/features/network.ts +7 -1
  198. package/src/web/features/voice-recognition.ts +16 -1
  199. package/test/clients-servers.test.ts +2 -1
  200. package/test/command.test.ts +267 -0
  201. package/test/vm-context.test.ts +146 -0
  202. package/test-integration/assistants-manager.test.ts +10 -20
  203. package/docs/apis/features/node/launcher-app-command-listener.md +0 -145
  204. package/docs/examples/launcher-app-command-listener.md +0 -120
  205. package/docs/tasks/web-container-helper-discovery.md +0 -71
  206. package/docs/todos.md +0 -1
  207. package/scripts/test-command-listener.ts +0 -123
  208. package/src/node/features/launcher-app-command-listener.ts +0 -389
@@ -1,120 +0,0 @@
1
- ---
2
- title: "Launcher App Command Listener"
3
- tags: [launcherAppCommandListener, ipc, macos, voice, commands]
4
- lastTested: null
5
- lastTestPassed: null
6
- ---
7
-
8
- # launcherAppCommandListener
9
-
10
- IPC transport for receiving commands from the LucaVoiceLauncher macOS app. Listens on a Unix domain socket using NDJSON and wraps incoming commands in a `CommandHandle` for structured acknowledgement, progress, and completion.
11
-
12
- ## Overview
13
-
14
- Use the `launcherAppCommandListener` feature when you need to receive and process commands from the native macOS launcher app (voice commands, hotkeys, or text input). It provides the server side of the IPC protocol: listen for the app to connect, receive command events, and respond with acknowledgements, progress updates, and results.
15
-
16
- Requires the LucaVoiceLauncher native macOS app to be running.
17
-
18
- ## Enabling the Feature
19
-
20
- ```ts
21
- const listener = container.feature('launcherAppCommandListener', {
22
- autoListen: false
23
- })
24
- console.log('Command Listener feature created')
25
- console.log('Listening:', listener.isListening)
26
- console.log('Client connected:', listener.isClientConnected)
27
- ```
28
-
29
- ## API Documentation
30
-
31
- ```ts
32
- const info = await container.features.describe('launcherAppCommandListener')
33
- console.log(info)
34
- ```
35
-
36
- ## Listening for Commands
37
-
38
- Start the IPC server and handle incoming commands with the `CommandHandle` API.
39
-
40
- ```ts skip
41
- const listener = container.feature('launcherAppCommandListener', {
42
- autoListen: true
43
- })
44
-
45
- listener.on('command', async (cmd) => {
46
- console.log('Received command:', cmd.text)
47
-
48
- cmd.ack('Working on it!')
49
- // ... process the command ...
50
- cmd.progress(0.5, 'Halfway there')
51
- // ... finish processing ...
52
- cmd.finish({ result: { action: 'completed' }, speech: 'All done!' })
53
- })
54
- ```
55
-
56
- Each incoming command is wrapped in a `CommandHandle` that provides `ack()`, `progress()`, `finish()`, and `fail()` methods. The native app displays acknowledgements and speaks the `speech` text.
57
-
58
- ## Command Handle Lifecycle
59
-
60
- The `CommandHandle` follows a structured lifecycle: acknowledge, optionally report progress, then finish or fail.
61
-
62
- ```ts skip
63
- listener.on('command', async (cmd) => {
64
- // Silent acknowledge
65
- cmd.ack()
66
-
67
- try {
68
- // Report progress (0-1 scale)
69
- cmd.progress(0.25, 'Starting...')
70
- cmd.progress(0.75, 'Almost done...')
71
-
72
- // Finish with result and optional speech
73
- cmd.finish({
74
- result: { data: 'some result' },
75
- speech: 'Task completed successfully'
76
- })
77
- } catch (err) {
78
- // Report failure with optional speech
79
- cmd.fail({
80
- error: err.message,
81
- speech: 'Sorry, that failed.'
82
- })
83
- }
84
- })
85
- ```
86
-
87
- The native app uses the `speech` field for text-to-speech feedback to the user.
88
-
89
- ## Connection Events
90
-
91
- Monitor the IPC connection state.
92
-
93
- ```ts skip
94
- listener.on('listening', () => {
95
- console.log('IPC server listening on:', listener.state.socketPath)
96
- })
97
- listener.on('clientConnected', () => {
98
- console.log('Launcher app connected')
99
- })
100
- listener.on('clientDisconnected', () => {
101
- console.log('Launcher app disconnected')
102
- })
103
- ```
104
-
105
- The `clientConnected` and `clientDisconnected` events fire as the native app connects and disconnects from the socket.
106
-
107
- ## Sending Messages
108
-
109
- Send arbitrary NDJSON messages back to the connected app.
110
-
111
- ```ts skip
112
- listener.send({ status: 'ready', message: 'Luca is online' })
113
- listener.send({ notification: 'Task queue empty' })
114
- ```
115
-
116
- Use `send()` for custom protocol messages beyond the standard command lifecycle.
117
-
118
- ## Summary
119
-
120
- The `launcherAppCommandListener` feature provides the IPC server for the LucaVoiceLauncher app. It receives voice, hotkey, and text commands, wrapping each in a `CommandHandle` with structured lifecycle methods (ack, progress, finish, fail). Key methods: `listen()`, `stop()`, `send()`. Key events: `command`, `clientConnected`, `clientDisconnected`.
@@ -1,71 +0,0 @@
1
- ---
2
- repeatable: false
3
- ---
4
-
5
- # Implement Helper Discovery for WebContainer
6
-
7
- The NodeContainer has a `helpers` feature (`src/node/features/helpers.ts`) that provides unified discovery across all registries. The WebContainer has no equivalent. Implement helper discovery for the web container.
8
-
9
- ## Context
10
-
11
- The node `Helpers` feature provides:
12
- - `container.helpers.discover('features')` — scan conventional folders and register what it finds
13
- - `container.helpers.discoverAll()` — discover across all registry types
14
- - `container.helpers.available` — unified view of all registries
15
- - `container.helpers.lookup(type, name)` and `container.helpers.describe(type, name)`
16
-
17
- The web container has `features` and `clients` registries (Client is attached via `extension.ts`, which calls `container.use(Client)` and triggers `registerHelperType('clients', 'client')`). It has `RestClient` and `SocketClient` available. No servers, commands, or endpoints registries.
18
-
19
- ## What to Build
20
-
21
- ### 1. Create `src/web/features/helpers.ts`
22
-
23
- Port the node `Helpers` feature to work in the browser environment. Key differences from the node version:
24
-
25
- - **No filesystem scanning** — the browser can't scan directories. Instead, discovery should work via explicit registration or a manifest/config object that lists available helpers and their import paths.
26
- - **Registry scope** — cover `features` and `clients` (both already attached). The `registryMap` should reflect what the web container actually has.
27
- - **No dynamic `import()` from disk** — helper modules need to be bundled or loaded via URL. Consider accepting a map of `{ name: () => import('./my-feature.js') }` lazy loaders.
28
- - **Keep the same public API surface** — `discover()`, `discoverAll()`, `available`, `lookup()`, `describe()` should all work identically from the consumer's perspective.
29
-
30
- ### 2. Register it in `src/web/extension.ts`
31
-
32
- Add the helpers feature to the web extension so it's available as `container.feature('helpers')` / `container.helpers`.
33
-
34
- ### 3. Approach for Browser Discovery
35
-
36
- Since there's no filesystem to scan, discovery needs a different mechanism. Recommended approach:
37
-
38
- ```typescript
39
- // Option A: Manifest-based discovery
40
- const helpers = container.feature('helpers', {
41
- enable: true,
42
- manifest: {
43
- features: {
44
- myFeature: () => import('./features/my-feature.js'),
45
- }
46
- }
47
- })
48
- await helpers.discoverAll()
49
- ```
50
-
51
- This keeps the same `discover()` / `discoverAll()` API but replaces folder scanning with a lazy-import manifest. The manifest can be generated at build time by a bundler plugin or written by hand.
52
-
53
- ### 4. Shared Base
54
-
55
- Look at whether a base `Helpers` class can be extracted to `src/features/helpers.ts` (universal, not node or web specific) with the shared API surface (`available`, `lookup`, `describe`, state/events schemas). Then `src/node/features/helpers.ts` and `src/web/features/helpers.ts` extend it with their environment-specific discovery strategies (filesystem vs manifest).
56
-
57
- ## Files to Touch
58
-
59
- - `src/features/helpers.ts` — new, shared base class with common API
60
- - `src/web/features/helpers.ts` — new, web-specific discovery via manifest
61
- - `src/node/features/helpers.ts` — refactor to extend shared base
62
- - `src/web/extension.ts` — register the web helpers feature
63
- - `src/schemas/base.ts` — only if new shared schemas are needed
64
-
65
- ## Acceptance Criteria
66
-
67
- - `container.helpers.available` works in both node and web containers
68
- - `container.helpers.discover('features')` works in web via manifest config
69
- - `container.helpers.lookup()` and `container.helpers.describe()` work in web
70
- - Node behavior is unchanged (existing tests still pass)
71
- - The shared base class eliminates duplicated logic between node and web
package/docs/todos.md DELETED
@@ -1 +0,0 @@
1
- - make container.start() meaningful. i like the idea of container.use() accepting in addition to the current shape, an async function and container.start() basically running all of those functions.
@@ -1,123 +0,0 @@
1
- import { NodeContainer } from '../src/node/container'
2
-
3
- const container = new NodeContainer({ cwd: process.cwd() })
4
- const listener = container.feature('launcherAppCommandListener', {
5
- autoListen: true,
6
- })
7
-
8
- const windowManager = container.feature('windowManager')
9
-
10
- console.log('Listening on:', listener.state.get('socketPath'))
11
- console.log('Waiting for native app to connect...\n')
12
-
13
- listener.enable()
14
-
15
- listener.on('clientConnected', () => {
16
- console.log('[connected] Native app connected')
17
- })
18
-
19
- listener.on('clientDisconnected', () => {
20
- console.log('[disconnected] Native app disconnected')
21
- })
22
-
23
- listener.on('command', async (cmd) => {
24
- console.log(`[command] "${cmd.text}" (source: ${cmd.source}, id: ${cmd.id})`)
25
-
26
- const normalizedText = String(cmd.text).toLowerCase()
27
-
28
- if (normalizedText.includes('terminal')) {
29
- await container.sleep(1000)
30
- cmd.ack('Sheeeeeeeit. I got you fam!')
31
- await container.sleep(1000)
32
- console.log('Spawning terminal')
33
- const result = await windowManager.spawnTTY({
34
- command: '/Users/jon/.bun/bin/bun',
35
- args: ['run', '/Users/jon/@luca/src/cli/cli.ts', 'console'],
36
- cwd: '/Users/jon/@soederpop',
37
- title: 'The Console',
38
- cols: 120,
39
- rows: 40,
40
- width: 1000,
41
- height: 700,
42
- })
43
-
44
- await container.sleep(4000)
45
-
46
- cmd.finish({ result: { action: 'completed', text: cmd.text }, speech: 'Check that shit out playboy. Fuckin terminal output.' })
47
-
48
- return
49
- } else if (normalizedText.includes('code')) {
50
- await container.sleep(1000)
51
- cmd.ack('Real talk, I feel for the homies we told to learn to code. Now that claude is on this shit?? I mean.')
52
- await container.sleep(1000)
53
- console.log('Spawning terminal')
54
- const result = await windowManager.spawnTTY({
55
- command: '/Users/jon/.bun/bin/claude',
56
- cwd: '/Users/jon/@soederpop',
57
- title: 'Claude',
58
- cols: 120,
59
- rows: 80,
60
- width: 1000,
61
- height: 700,
62
- })
63
-
64
- await container.sleep(4000)
65
-
66
- cmd.finish({ result: { action: 'completed', text: cmd.text }, speech: 'Good luck with claude bro.' })
67
-
68
- return
69
- } else if (normalizedText.includes('web') || normalizedText.includes('browser')) {
70
- cmd.ack('Yo.... Fuckin check this out, twin.')
71
- await container.sleep(1000)
72
- const result = await windowManager.spawn({
73
- url: 'https://google.com',
74
- width: 1000,
75
- height: 700,
76
- })
77
-
78
- console.log('Web browser spawned', result)
79
-
80
- await container.sleep(3000)
81
- cmd.finish({ result: { action: 'completed', text: cmd.text }, speech: 'Motherfucker I can even launch web browsers' })
82
- return
83
- } else if (normalizedText.includes('write')) {
84
- await container.sleep(1000)
85
- cmd.ack('Aight. Sheeeit. We got a real fuckin earnest hemmingway up in here.')
86
- const result = await windowManager.spawn({
87
- url: 'http://localhost:3080',
88
- width: 1200,
89
- height: 900,
90
- })
91
-
92
- await container.sleep(4000)
93
- cmd.finish({ result: { action: 'completed', text: cmd.text }, speech: 'Let the boy COOK' })
94
- return
95
- } else if (normalizedText.includes('track')) {
96
- await container.sleep(1000)
97
- cmd.ack('Better believe it. Aint nobody hiding from your boy.')
98
-
99
- container.proc.spawnAndCapture('luca', ['serve', '--force', '--port', '3969', '--no-open'], {
100
- cwd: '/Users/jon/@soederpop/playground/enemy-tracker'
101
- })
102
-
103
- await container.sleep(4000)
104
-
105
- const result = await windowManager.spawn({
106
- url: 'http://localhost:3969',
107
- width: 1400,
108
- height: 1000,
109
- })
110
-
111
- cmd.finish({ result: { action: 'completed', text: cmd.text }, speech: 'Get em dawg. Me and the homies are ready.' })
112
-
113
- return
114
- }
115
-
116
- await container.sleep(4000)
117
- cmd.ack('Look unc. I dont know the fuck you talmbout.')
118
- cmd.finish({ result: { action: 'unknown' }})
119
- })
120
-
121
- listener.on('message', (msg) => {
122
- console.log('[message]', JSON.stringify(msg))
123
- })