titan-agent 5.4.0 → 5.4.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.
- package/dist/agent/agent.js +1 -1
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/agentLoop.js +77 -12
- package/dist/agent/agentLoop.js.map +1 -1
- package/dist/agent/agentWakeup.js +8 -3
- package/dist/agent/agentWakeup.js.map +1 -1
- package/dist/agent/commandPost.js +6 -1
- package/dist/agent/commandPost.js.map +1 -1
- package/dist/agent/heartbeatScheduler.js +36 -4
- package/dist/agent/heartbeatScheduler.js.map +1 -1
- package/dist/agent/toolRunner.js +30 -0
- package/dist/agent/toolRunner.js.map +1 -1
- package/dist/config/config.js +30 -8
- package/dist/config/config.js.map +1 -1
- package/dist/config/schema.js +10 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/eval/record.js +1 -1
- package/dist/eval/record.js.map +1 -1
- package/dist/gateway/server.js +26 -0
- package/dist/gateway/server.js.map +1 -1
- package/dist/mesh/transport.js +60 -8
- package/dist/mesh/transport.js.map +1 -1
- package/dist/providers/anthropic.js +3 -2
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/base.js.map +1 -1
- package/dist/providers/google.js +94 -20
- package/dist/providers/google.js.map +1 -1
- package/dist/providers/modelCapabilities.js +59 -0
- package/dist/providers/modelCapabilities.js.map +1 -0
- package/dist/providers/ollama.js +3 -2
- package/dist/providers/ollama.js.map +1 -1
- package/dist/providers/openai.js +4 -3
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/openai_compat.js +3 -2
- package/dist/providers/openai_compat.js.map +1 -1
- package/dist/providers/router.js +63 -21
- package/dist/providers/router.js.map +1 -1
- package/dist/skills/registry.js +176 -163
- package/dist/skills/registry.js.map +1 -1
- package/dist/telemetry/activityLog.js +1 -1
- package/dist/telemetry/activityLog.js.map +1 -1
- package/dist/utils/constants.js +2 -2
- package/dist/utils/constants.js.map +1 -1
- package/docs/AGENT-HIERARCHY.md +154 -0
- package/docs/superpowers/plans/2026-04-29-titan-production-fix.md +241 -0
- package/package.json +2 -2
- package/scripts/start-workers.sh +39 -0
- package/scripts/task-feeder.ts +38 -0
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
# TITAN v5.0.0 Production Fix — Implementation Plan
|
|
2
|
+
|
|
3
|
+
> **Goal:** Ship a rock-solid v5.4.2 that actually does everything the README promises. 49,000 users are waiting.
|
|
4
|
+
> **Deadline:** 8 hours from now (2026-04-29 08:00 UTC).
|
|
5
|
+
> **Constraint:** ZERO breaking changes. Every test must pass before any code goes to GitHub/npm.
|
|
6
|
+
> **Engineer Note:** This plan assumes fresh eyes. Every task includes exact file paths + commands + expected output.
|
|
7
|
+
|
|
8
|
+
**Architecture:** Fix bugs, wire missing integrations, add missing test coverage layer-by-layer. No redesigns. Only surgical fixes and integration wiring. Treat this as a stabilization release, not a feature sprint.
|
|
9
|
+
|
|
10
|
+
**Tech Stack:** Node 24+ ESM, TypeScript, React 18 (UMD), Vitest, WebRTC, Python sidecars (F5-TTS), Home Assistant MQTT, Tailwind 4, WebSocket mesh.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Current State Snapshot
|
|
15
|
+
|
|
16
|
+
- **Tests:** 6,616 passed, 3 skipped, 0 failed (with our fixes staged).
|
|
17
|
+
- **Bugs already fixed today:**
|
|
18
|
+
1. Agent loop completion logic (non-autonomous now respects pipeline minRounds + terminal-tool requirements).
|
|
19
|
+
2. Approval gates wired into toolRunner.ts execution path.
|
|
20
|
+
3. AutoPush nudge now fires for multi-step non-autonomous pipelines.
|
|
21
|
+
- **Issues found during audit:**
|
|
22
|
+
1. Titan PC service returns empty responses (gateway restart needed).
|
|
23
|
+
2. `titan.api.call` proxy bug in canvas widgets (Stock Analyzer returns "No response" per AGENTS.md).
|
|
24
|
+
3. Approval gates were code-complete but execution-dead (now fixed).
|
|
25
|
+
4. ExfilScan defaults to `tool_only` — advanced layers off by default.
|
|
26
|
+
5. Memory graph / SOMA fully wired — but lacks dedicated module tests.
|
|
27
|
+
6. Canvas widget creation pipeline works end-to-end, but no unit tests for sandbox runtime.
|
|
28
|
+
7. 247 test files total, some have pre-existing failures in mesh/channel tests.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Task Breakdown
|
|
33
|
+
|
|
34
|
+
### Phase A — Merge & Commit Today's Fixes (30 min)
|
|
35
|
+
|
|
36
|
+
#### Task 1: Create atomic commit of agent loop + approval gate + tests
|
|
37
|
+
|
|
38
|
+
**Files:**
|
|
39
|
+
- Modify: `src/agent/agentLoop.ts`
|
|
40
|
+
- Modify: `src/agent/toolRunner.ts`
|
|
41
|
+
- Modify: `tests/agent-loop.test.ts`
|
|
42
|
+
|
|
43
|
+
**Steps:**
|
|
44
|
+
- [ ] **Step 1:** Stage the three files.
|
|
45
|
+
- [ ] **Step 2:** Write commit message explaining root cause + fix.
|
|
46
|
+
- [ ] **Step 3:** Run agent-loop + agent + approval-gate + safety tests.
|
|
47
|
+
- [ ] **Step 4:** Verify zero failures.
|
|
48
|
+
- [ ] **Step 5:** Commit.
|
|
49
|
+
- [ ] **Step 6:** Push to GitHub `main` (from Titan PC so it matches the deploy target).
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
### Phase B — Resolve Titan PC Production Incident (30 min)
|
|
54
|
+
|
|
55
|
+
#### Task 2: Restart gateway, verify health, investigate why empty responses occurred
|
|
56
|
+
|
|
57
|
+
**Remote:** Titan PC (ssh titan)
|
|
58
|
+
|
|
59
|
+
**Steps:**
|
|
60
|
+
- [ ] **Step 1:** Check journalctl for recent gateway errors since last restart.
|
|
61
|
+
- [ ] **Step 2:** Look for deadlock / memory leak patterns.
|
|
62
|
+
- [ ] **Step 3:** Restart service using systemd.
|
|
63
|
+
- [ ] **Step 4:** Wait 10 seconds.
|
|
64
|
+
- [ ] **Step 5:** `curl http://localhost:48420/api/health` → expect 200.
|
|
65
|
+
- [ ] **Step 6:** `curl http://localhost:48420/` → expect HTML (not empty).
|
|
66
|
+
- [ ] **Step 7:** If still broken, check if port is bound, check if node process is spinning CPU.
|
|
67
|
+
- [ ] **Step 8:** Document root cause in HANDOFF.md.
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
### Phase C — Address Known Production Bugs (60 min)
|
|
72
|
+
|
|
73
|
+
#### Task 3: Fix `titan.api.call` proxy bug in canvas widgets
|
|
74
|
+
|
|
75
|
+
**Issue:** Stock Analyzer "Analyze" button returns "No response" (per AGENTS.md Open Items).
|
|
76
|
+
|
|
77
|
+
**Files:**
|
|
78
|
+
- Investigate: `ui/src/titan2/sandbox/SandboxRuntime.ts` (`titan.api.call` implementation)
|
|
79
|
+
- Investigate: `src/gateway/server.ts` (CORS / proxy routes)
|
|
80
|
+
- Modify: whichever layer is dropping the request
|
|
81
|
+
|
|
82
|
+
**Steps:**
|
|
83
|
+
- [ ] **Step 1:** Reproduce via curl: find the proxy endpoint and call it.
|
|
84
|
+
- [ ] **Step 2:** Check if the proxy route is registered in the gateway.
|
|
85
|
+
- [ ] **Step 3:** Check if CORS / CSP is blocking the request.
|
|
86
|
+
- [ ] **Step 4:** Fix. Test. Commit.
|
|
87
|
+
|
|
88
|
+
#### Task 4: ExfilScan default config — evaluate if `level = 'full'` should be default
|
|
89
|
+
|
|
90
|
+
**Issue:** Prompt injection detection, base64 decoding, URL scanning are OFF by default (`tool_only`).
|
|
91
|
+
|
|
92
|
+
**Decision:** If this is a safety regression for 49K users, change schema default. If intentional for performance, document clearly.
|
|
93
|
+
|
|
94
|
+
**Files:**
|
|
95
|
+
- Modify: `src/config/schema.ts` (if changing default)
|
|
96
|
+
- Modify: `src/config/README.md` or similar (if documenting)
|
|
97
|
+
|
|
98
|
+
**Steps:**
|
|
99
|
+
- [ ] **Step 1:** Measure performance difference between `tool_only` and `full` on a large output.
|
|
100
|
+
- [ ] **Step 2:** If < 5% overhead → change default to `'full'`.
|
|
101
|
+
- [ ] **Step 3:** If > 5% overhead → add WARNING log at startup about safety layers being off.
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
### Phase D — Test Coverage Gaps (90 min)
|
|
106
|
+
|
|
107
|
+
#### Task 5: Add unit test for `requiresApproval()` / `createApprovalRequest()` wired through toolRunner
|
|
108
|
+
|
|
109
|
+
**Files:**
|
|
110
|
+
- Create: `tests/approval-gates-integration.test.ts`
|
|
111
|
+
|
|
112
|
+
**Steps:**
|
|
113
|
+
- [ ] **Step 1:** Write test: mock `requiresApproval` returning `true`, verify `executeTool` returns `approvalPending: true`.
|
|
114
|
+
- [ ] **Step 2:** Write test: mock `requiresApproval` returning `false`, verify tool executes normally.
|
|
115
|
+
- [ ] **Step 3:** Run `npx vitest run tests/approval-gates-integration.test.ts` → PASS.
|
|
116
|
+
- [ ] **Step 4:** Commit.
|
|
117
|
+
|
|
118
|
+
#### Task 6: Add unit test for canvas widget creation pipeline
|
|
119
|
+
|
|
120
|
+
**Files:**
|
|
121
|
+
- Create: `tests/canvas-widget-creation.test.ts`
|
|
122
|
+
|
|
123
|
+
**Steps:**
|
|
124
|
+
- [ ] **Step 1:** Test `gallery_search` returns results for "pomodoro".
|
|
125
|
+
- [ ] **Step 2:** Test `gallery_get` replaces placeholders correctly.
|
|
126
|
+
- [ ] **Step 3:** Test `_____widget` gate auto-injection triggers when model forgets gate.
|
|
127
|
+
- [ ] **Step 4:** Run `npx vitest run tests/canvas-widget-creation.test.ts` → PASS.
|
|
128
|
+
- [ ] **Step 5:** Commit.
|
|
129
|
+
|
|
130
|
+
#### Task 7: Add unit test for SOMA drives integration
|
|
131
|
+
|
|
132
|
+
**Files:**
|
|
133
|
+
- Create: `tests/soma-drives.test.ts`
|
|
134
|
+
|
|
135
|
+
**Steps:**
|
|
136
|
+
- [ ] **Step 1:** Test that `initSoulState` / `updateSoulState` / `emitHeartbeat` exist and don't throw.
|
|
137
|
+
- [ ] **Step 2:** Test that `getInnerMonologue()` returns a string.
|
|
138
|
+
- [ ] **Step 3:** Test that `buildSelfAwarenessContext` produces context containing model info.
|
|
139
|
+
- [ ] **Step 4:** Run → PASS. Commit.
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
### Phase E — Integration Verification (90 min)
|
|
144
|
+
|
|
145
|
+
#### Task 8: Run the 11 live-eval suites against a running gateway
|
|
146
|
+
|
|
147
|
+
**Command:** `npm run test:eval`
|
|
148
|
+
|
|
149
|
+
**Steps:**
|
|
150
|
+
- [ ] **Step 1:** Start gateway locally (or on Titan PC).
|
|
151
|
+
- [ ] **Step 2:** Run each suite, verify ≥80% pass rate.
|
|
152
|
+
- [ ] **Step 3:** If any suite < 80%, debug and fix root cause.
|
|
153
|
+
- [ ] **Step 4:** Record results in HANDOFF.md.
|
|
154
|
+
|
|
155
|
+
#### Task 9: Facebook Autopilot smoke test
|
|
156
|
+
|
|
157
|
+
**Steps:**
|
|
158
|
+
- [ ] **Step 1:** Check logs for fb_post / fb_reply tool calls in last 24h.
|
|
159
|
+
- [ ] **Step 2:** If no calls, check if autopilot is enabled in config.
|
|
160
|
+
- [ ] **Step 3:** If config enabled but no calls → investigate scheduler (check if `approvalSweepInterval` or cron is firing).
|
|
161
|
+
- [ ] **Step 4:** If scheduler is dead → fix.
|
|
162
|
+
|
|
163
|
+
#### Task 10: Smart home / Home Assistant integration smoke test
|
|
164
|
+
|
|
165
|
+
**Steps:**
|
|
166
|
+
- [ ] **Step 1:** Check if `ha_control` / `ha_status` tools exist in registry.
|
|
167
|
+
- [ ] **Step 2:** Verify `ha_setup` tool has test coverage.
|
|
168
|
+
- [ ] **Step 3:** If missing or broken, fix and test.
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
### Phase F — Polish & Release (30 min)
|
|
173
|
+
|
|
174
|
+
#### Task 11: Bump version numbers
|
|
175
|
+
|
|
176
|
+
**Files:**
|
|
177
|
+
- Modify: `package.json`
|
|
178
|
+
- Modify: `src/utils/constants.ts`
|
|
179
|
+
- Modify: `README.md` version badge
|
|
180
|
+
- Modify: `CHANGELOG.md`
|
|
181
|
+
|
|
182
|
+
**Steps:**
|
|
183
|
+
- [ ] **Step 1:** Verify version is consistent across all three files.
|
|
184
|
+
- [ ] **Step 2:** Write CHANGELOG entry summarizing today's fixes.
|
|
185
|
+
- [ ] **Step 3:** Commit.
|
|
186
|
+
|
|
187
|
+
#### Task 12: Deploy to Titan PC
|
|
188
|
+
|
|
189
|
+
**Steps:**
|
|
190
|
+
- [ ] **Step 1:** `ssh titan`
|
|
191
|
+
- [ ] **Step 2:** `cd /opt/TITAN && git pull origin main`
|
|
192
|
+
- [ ] **Step 3:** `npm install && npm run build`
|
|
193
|
+
- [ ] **Step 4:** `sudo systemctl restart titan-gateway`
|
|
194
|
+
- [ ] **Step 5:** Verify `/api/health` returns 200.
|
|
195
|
+
|
|
196
|
+
#### Task 13: Publish to npm
|
|
197
|
+
|
|
198
|
+
**Steps:**
|
|
199
|
+
- [ ] **Step 1:** `npm version patch` (or minor — decide based on impact).
|
|
200
|
+
- [ ] **Step 2:** `npm publish --tag next` (per TITAN release process).
|
|
201
|
+
- [ ] **Step 3:** Verify package appears on npm registry.
|
|
202
|
+
- [ ] **Step 4:** `npm dist-tag ls titan-agent` to confirm `@next` tag.
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## Verification Checklist (Before ANY push)
|
|
207
|
+
|
|
208
|
+
- [ ] All 247 test files pass → `npx vitest run`
|
|
209
|
+
- [ ] Agent loop tests pass (39/39)
|
|
210
|
+
- [ ] Agent tests pass (38/38)
|
|
211
|
+
- [ ] Approval gate tests pass (29/29 + new integration tests)
|
|
212
|
+
- [ ] Safety suite tests pass (104/104 across 7 files)
|
|
213
|
+
- [ ] No TypeScript errors → `npx tsc --noEmit`
|
|
214
|
+
- [ ] No build errors → `npm run build`
|
|
215
|
+
- [ ] Gateway health endpoint returns 200
|
|
216
|
+
- [ ] Facebook Autopilot scheduled task is running (or intentionally disabled)
|
|
217
|
+
- [ ] Handoff document updated with today's fixes
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
## Rollback Plan
|
|
222
|
+
|
|
223
|
+
If ANY step fails catastrophically (can't fix within 15 minutes, or introduces new test failures):
|
|
224
|
+
1. `git stash` or `git reset --hard HEAD` to discard changes.
|
|
225
|
+
2. Re-run full test suite to confirm baseline is green.
|
|
226
|
+
3. Skip the broken task. Move to the next one. Document what couldn't be fixed.
|
|
227
|
+
4. Do NOT push a broken build to GitHub or npm.
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
## Communication Plan
|
|
232
|
+
|
|
233
|
+
- Tony is asleep. He will review on wake.
|
|
234
|
+
- I will update HANDOFF.md at the end of every completed phase.
|
|
235
|
+
- If a critical issue is found (e.g., Titan PC still down after restart), I will document it in HANDOFF.md and note whether it blocked the release.
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
**Plan written:** 2026-04-29 00:08 UTC
|
|
240
|
+
**Deadline:** 2026-04-29 08:08 UTC
|
|
241
|
+
**Estimated risk:** LOW — all fixes are surgical, no architecture changes.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "titan-agent",
|
|
3
|
-
"version": "5.4.
|
|
3
|
+
"version": "5.4.2",
|
|
4
4
|
"description": "TITAN — Autonomous AI agent framework with self-improvement, multi-agent orchestration, 36 LLM providers, 16 channel adapters, GPU VRAM management, mesh networking, LiveKit voice, TITAN-Soma homeostatic drives, and a React Mission Control dashboard. Open-source, TypeScript, MIT licensed.",
|
|
5
5
|
"author": "Tony Elliott (https://github.com/Djtony707)",
|
|
6
6
|
"repository": {
|
|
@@ -150,7 +150,7 @@
|
|
|
150
150
|
"ora": "^8.1.0",
|
|
151
151
|
"turndown": "^7.2.2",
|
|
152
152
|
"undici": "^7.25.0",
|
|
153
|
-
"uuid": "^
|
|
153
|
+
"uuid": "^14.0.0",
|
|
154
154
|
"ws": "^8.18.0",
|
|
155
155
|
"zod": "^3.23.8"
|
|
156
156
|
},
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
set -e
|
|
3
|
+
|
|
4
|
+
TITAN_DIR="/Users/michaelelliott/Desktop/TitanBot/TITAN-main"
|
|
5
|
+
cd "$TITAN_DIR"
|
|
6
|
+
|
|
7
|
+
# Ensure gateway is running
|
|
8
|
+
if ! curl -s http://localhost:48420/api/health > /dev/null 2>&1; then
|
|
9
|
+
echo "Starting TITAN gateway on port 48420..."
|
|
10
|
+
nohup titan gateway > /tmp/titan-gateway.log 2>&1 &
|
|
11
|
+
sleep 8
|
|
12
|
+
if curl -s http://localhost:48420/api/health > /dev/null 2>&1; then
|
|
13
|
+
echo "Gateway is UP"
|
|
14
|
+
else
|
|
15
|
+
echo "Gateway failed to start. Check /tmp/titan-gateway.log"
|
|
16
|
+
cat /tmp/titan-gateway.log | tail -20
|
|
17
|
+
exit 1
|
|
18
|
+
fi
|
|
19
|
+
fi
|
|
20
|
+
|
|
21
|
+
# Start specialist agents via titan agents --spawn
|
|
22
|
+
echo "Spawning specialist agents..."
|
|
23
|
+
|
|
24
|
+
# Note: titan agents --spawn creates autonomous agent instances
|
|
25
|
+
# that process Command Post tasks via heartbeat inbox
|
|
26
|
+
|
|
27
|
+
titan agents --spawn builder --model ollama/qwen3.5:27b 2>&1 | tail -5
|
|
28
|
+
titan agents --spawn tester --model ollama/qwen3.5:27b 2>&1 | tail -5
|
|
29
|
+
titan agents --spawn docs --model ollama/qwen3.5:27b 2>&1 | tail -5
|
|
30
|
+
titan agents --spawn reviewer --model ollama/qwen3.5:27b 2>&1 | tail -5
|
|
31
|
+
titan agents --spawn devops --model ollama/qwen3.5:27b 2>&1 | tail -5
|
|
32
|
+
|
|
33
|
+
echo ""
|
|
34
|
+
echo "Active agents:"
|
|
35
|
+
titan agents --list 2>&1 || true
|
|
36
|
+
|
|
37
|
+
echo ""
|
|
38
|
+
echo "To check gateway: curl http://localhost:48420/api/health"
|
|
39
|
+
echo "To view gateway logs: tail -f /tmp/titan-gateway.log"
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task Feeder — Populates the TITAN Command Post with work for specialist agents.
|
|
3
|
+
* Run this after starting the gateway to seed the initial task queue.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { createIssue } from '../src/agent/commandPost.js';
|
|
7
|
+
|
|
8
|
+
const TASKS = [
|
|
9
|
+
{ title: 'Fix failing unit tests (subAgent maxRounds + Ollama chatStream)', assignee: 'tester', priority: 'high' as const },
|
|
10
|
+
{ title: 'Refactor agentLoop.ts into middleware architecture', assignee: 'builder', priority: 'high' as const },
|
|
11
|
+
{ title: 'Implement artifact store for large tool outputs', assignee: 'builder', priority: 'high' as const },
|
|
12
|
+
{ title: 'Update README with verified feature counts', assignee: 'docs', priority: 'medium' as const },
|
|
13
|
+
{ title: 'Review all 8 failing test files for root causes', assignee: 'reviewer', priority: 'high' as const },
|
|
14
|
+
{ title: 'Fix Docker build and verify container starts', assignee: 'devops', priority: 'high' as const },
|
|
15
|
+
{ title: 'Add harness-level tests (resumption, compaction, approval gates)', assignee: 'tester', priority: 'high' as const },
|
|
16
|
+
{ title: 'Wire voice server into gateway proxy routes', assignee: 'builder', priority: 'medium' as const },
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
async function feedTasks() {
|
|
20
|
+
console.log('Feeding tasks to Command Post...');
|
|
21
|
+
for (const task of TASKS) {
|
|
22
|
+
try {
|
|
23
|
+
await createIssue({
|
|
24
|
+
title: task.title,
|
|
25
|
+
assigneeAgentId: task.assignee,
|
|
26
|
+
priority: task.priority,
|
|
27
|
+
status: 'queued',
|
|
28
|
+
createdBy: 'task-feeder',
|
|
29
|
+
});
|
|
30
|
+
console.log(` ✓ Created: ${task.title} → ${task.assignee}`);
|
|
31
|
+
} catch (err) {
|
|
32
|
+
console.error(` ✗ Failed: ${task.title}`, err);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
console.log('Done.');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
feedTasks();
|