@rune-kit/rune 2.10.0 → 2.12.0

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 (240) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +65 -6
  3. package/commands/rune.md +168 -168
  4. package/compiler/__tests__/detect-invariants.test.js +136 -0
  5. package/compiler/__tests__/doctor-mesh.test.js +229 -0
  6. package/compiler/__tests__/hook-dispatch.test.js +91 -0
  7. package/compiler/__tests__/hooks-antigravity.test.js +118 -0
  8. package/compiler/__tests__/hooks-cursor.test.js +139 -0
  9. package/compiler/__tests__/hooks-install.test.js +305 -0
  10. package/compiler/__tests__/hooks-merge.test.js +204 -0
  11. package/compiler/__tests__/hooks-tiers.test.js +519 -0
  12. package/compiler/__tests__/hooks-windsurf.test.js +115 -0
  13. package/compiler/__tests__/inject-claude-md.test.js +152 -0
  14. package/compiler/__tests__/load-invariants.test.js +408 -0
  15. package/compiler/__tests__/onboard-invariants.test.js +240 -0
  16. package/compiler/adapters/hooks/antigravity.js +140 -0
  17. package/compiler/adapters/hooks/claude.js +166 -0
  18. package/compiler/adapters/hooks/cursor.js +191 -0
  19. package/compiler/adapters/hooks/index.js +82 -0
  20. package/compiler/adapters/hooks/tier-emitter.js +182 -0
  21. package/compiler/adapters/hooks/windsurf.js +202 -0
  22. package/compiler/bin/rune.js +196 -6
  23. package/compiler/commands/hook-dispatch.js +87 -0
  24. package/compiler/commands/hooks/install.js +120 -0
  25. package/compiler/commands/hooks/merge.js +211 -0
  26. package/compiler/commands/hooks/presets.js +116 -0
  27. package/compiler/commands/hooks/status.js +112 -0
  28. package/compiler/commands/hooks/tiers.js +221 -0
  29. package/compiler/commands/hooks/uninstall.js +94 -0
  30. package/compiler/doctor.js +236 -0
  31. package/contexts/dev.md +34 -34
  32. package/contexts/research.md +43 -43
  33. package/contexts/review.md +55 -55
  34. package/extensions/ai-ml/PACK.md +88 -88
  35. package/extensions/ai-ml/skills/ai-agents.md +172 -172
  36. package/extensions/ai-ml/skills/code-sandbox.md +187 -187
  37. package/extensions/ai-ml/skills/deep-research.md +146 -146
  38. package/extensions/ai-ml/skills/embedding-search.md +66 -66
  39. package/extensions/ai-ml/skills/fine-tuning-guide.md +74 -74
  40. package/extensions/ai-ml/skills/llm-architect.md +125 -125
  41. package/extensions/ai-ml/skills/llm-integration.md +64 -64
  42. package/extensions/ai-ml/skills/prompt-patterns.md +72 -72
  43. package/extensions/ai-ml/skills/rag-patterns.md +66 -66
  44. package/extensions/ai-ml/skills/web-extraction.md +114 -114
  45. package/extensions/analytics/PACK.md +92 -92
  46. package/extensions/analytics/skills/ab-testing.md +72 -72
  47. package/extensions/analytics/skills/dashboard-patterns.md +83 -83
  48. package/extensions/analytics/skills/data-validation.md +68 -68
  49. package/extensions/analytics/skills/funnel-analysis.md +81 -81
  50. package/extensions/analytics/skills/sql-patterns.md +57 -57
  51. package/extensions/analytics/skills/statistical-analysis.md +79 -79
  52. package/extensions/analytics/skills/tracking-setup.md +71 -71
  53. package/extensions/backend/PACK.md +104 -104
  54. package/extensions/backend/skills/api-patterns.md +84 -84
  55. package/extensions/backend/skills/async-pipeline.md +193 -193
  56. package/extensions/backend/skills/auth-patterns.md +97 -97
  57. package/extensions/backend/skills/background-jobs.md +133 -133
  58. package/extensions/backend/skills/caching-patterns.md +108 -108
  59. package/extensions/backend/skills/cli-generation.md +133 -133
  60. package/extensions/backend/skills/database-patterns.md +87 -87
  61. package/extensions/backend/skills/middleware-patterns.md +104 -104
  62. package/extensions/chrome-ext/PACK.md +93 -93
  63. package/extensions/chrome-ext/skills/cws-preflight.md +143 -143
  64. package/extensions/chrome-ext/skills/cws-publish.md +104 -104
  65. package/extensions/chrome-ext/skills/ext-ai-integration.md +251 -251
  66. package/extensions/chrome-ext/skills/ext-messaging.md +139 -139
  67. package/extensions/chrome-ext/skills/ext-storage.md +133 -133
  68. package/extensions/chrome-ext/skills/mv3-scaffold.md +164 -164
  69. package/extensions/content/PACK.md +96 -96
  70. package/extensions/content/skills/blog-patterns.md +88 -88
  71. package/extensions/content/skills/cms-integration.md +131 -131
  72. package/extensions/content/skills/content-scoring.md +107 -107
  73. package/extensions/content/skills/i18n.md +83 -83
  74. package/extensions/content/skills/mdx-authoring.md +137 -137
  75. package/extensions/content/skills/reference.md +1014 -1014
  76. package/extensions/content/skills/seo-patterns.md +67 -67
  77. package/extensions/content/skills/video-repurpose.md +153 -153
  78. package/extensions/devops/PACK.md +101 -101
  79. package/extensions/devops/skills/chaos-testing.md +67 -67
  80. package/extensions/devops/skills/ci-cd.md +75 -75
  81. package/extensions/devops/skills/docker.md +58 -58
  82. package/extensions/devops/skills/edge-serverless.md +163 -163
  83. package/extensions/devops/skills/infra-as-code.md +158 -158
  84. package/extensions/devops/skills/kubernetes.md +110 -110
  85. package/extensions/devops/skills/monitoring.md +57 -57
  86. package/extensions/devops/skills/server-setup.md +64 -64
  87. package/extensions/devops/skills/ssl-domain.md +42 -42
  88. package/extensions/ecommerce/PACK.md +116 -116
  89. package/extensions/ecommerce/skills/cart-system.md +79 -79
  90. package/extensions/ecommerce/skills/inventory-mgmt.md +102 -102
  91. package/extensions/ecommerce/skills/order-management.md +126 -126
  92. package/extensions/ecommerce/skills/payment-integration.md +472 -472
  93. package/extensions/ecommerce/skills/shopify-dev.md +69 -69
  94. package/extensions/ecommerce/skills/subscription-billing.md +93 -93
  95. package/extensions/ecommerce/skills/tax-compliance.md +117 -117
  96. package/extensions/gamedev/PACK.md +142 -142
  97. package/extensions/gamedev/skills/asset-pipeline.md +74 -74
  98. package/extensions/gamedev/skills/audio-system.md +129 -129
  99. package/extensions/gamedev/skills/camera-system.md +87 -87
  100. package/extensions/gamedev/skills/ecs.md +98 -98
  101. package/extensions/gamedev/skills/game-loops.md +72 -72
  102. package/extensions/gamedev/skills/input-system.md +199 -199
  103. package/extensions/gamedev/skills/multiplayer.md +180 -180
  104. package/extensions/gamedev/skills/particles.md +105 -105
  105. package/extensions/gamedev/skills/physics-engine.md +89 -89
  106. package/extensions/gamedev/skills/scene-management.md +146 -146
  107. package/extensions/gamedev/skills/threejs-patterns.md +90 -90
  108. package/extensions/gamedev/skills/webgl.md +71 -71
  109. package/extensions/mobile/PACK.md +106 -106
  110. package/extensions/mobile/skills/app-store-connect.md +152 -152
  111. package/extensions/mobile/skills/app-store-prep.md +66 -66
  112. package/extensions/mobile/skills/deep-linking.md +109 -109
  113. package/extensions/mobile/skills/flutter.md +60 -60
  114. package/extensions/mobile/skills/ios-build-pipeline.md +142 -142
  115. package/extensions/mobile/skills/native-bridge.md +66 -66
  116. package/extensions/mobile/skills/ota-updates.md +97 -97
  117. package/extensions/mobile/skills/push-notifications.md +111 -111
  118. package/extensions/mobile/skills/react-native.md +82 -82
  119. package/extensions/saas/PACK.md +116 -116
  120. package/extensions/saas/skills/billing-integration.md +200 -200
  121. package/extensions/saas/skills/feature-flags.md +130 -130
  122. package/extensions/saas/skills/multi-tenant.md +103 -103
  123. package/extensions/saas/skills/onboarding-flow.md +139 -139
  124. package/extensions/saas/skills/subscription-flow.md +95 -95
  125. package/extensions/saas/skills/team-management.md +144 -144
  126. package/extensions/security/PACK.md +99 -99
  127. package/extensions/security/skills/api-security.md +140 -140
  128. package/extensions/security/skills/compliance.md +68 -68
  129. package/extensions/security/skills/owasp-audit.md +64 -64
  130. package/extensions/security/skills/pentest-patterns.md +77 -77
  131. package/extensions/security/skills/secret-mgmt.md +65 -65
  132. package/extensions/security/skills/supply-chain.md +65 -65
  133. package/extensions/trading/PACK.md +80 -80
  134. package/extensions/trading/skills/chart-components.md +55 -55
  135. package/extensions/trading/skills/experiment-loop.md +125 -125
  136. package/extensions/trading/skills/fintech-patterns.md +47 -47
  137. package/extensions/trading/skills/indicator-library.md +58 -58
  138. package/extensions/trading/skills/quant-analysis.md +111 -111
  139. package/extensions/trading/skills/realtime-data.md +58 -58
  140. package/extensions/trading/skills/trade-logic.md +104 -104
  141. package/extensions/ui/PACK.md +130 -130
  142. package/extensions/ui/skills/a11y-audit.md +91 -91
  143. package/extensions/ui/skills/animation-patterns.md +127 -127
  144. package/extensions/ui/skills/component-patterns.md +100 -100
  145. package/extensions/ui/skills/design-decision.md +108 -108
  146. package/extensions/ui/skills/design-system.md +68 -68
  147. package/extensions/ui/skills/landing-patterns.md +155 -155
  148. package/extensions/ui/skills/palette-picker.md +173 -173
  149. package/extensions/ui/skills/react-health.md +90 -90
  150. package/extensions/ui/skills/type-system.md +125 -125
  151. package/extensions/ui/skills/web-vitals.md +153 -153
  152. package/extensions/zalo/PACK.md +145 -145
  153. package/extensions/zalo/skills/zalo-oa-mcp.md +317 -317
  154. package/extensions/zalo/skills/zalo-oa-messaging.md +429 -429
  155. package/extensions/zalo/skills/zalo-oa-setup.md +236 -236
  156. package/extensions/zalo/skills/zalo-oa-webhook.md +189 -189
  157. package/extensions/zalo/skills/zalo-personal-messaging.md +194 -194
  158. package/extensions/zalo/skills/zalo-personal-setup.md +153 -153
  159. package/extensions/zalo/skills/zalo-rate-guard.md +219 -219
  160. package/hooks/auto-format/index.cjs +48 -48
  161. package/hooks/hooks.json +111 -111
  162. package/hooks/post-session-reflect/index.cjs +189 -189
  163. package/hooks/pre-compact/index.cjs +95 -95
  164. package/hooks/run-hook.cmd +1 -1
  165. package/hooks/secrets-scan/index.cjs +100 -100
  166. package/hooks/session-start/index.cjs +71 -71
  167. package/hooks/typecheck/index.cjs +65 -65
  168. package/package.json +63 -63
  169. package/references/ui-pro-max-data/LICENSE-UI-PRO-MAX +21 -21
  170. package/references/ui-pro-max-data/charts.csv +26 -26
  171. package/references/ui-pro-max-data/colors.csv +161 -161
  172. package/references/ui-pro-max-data/styles.csv +68 -68
  173. package/references/ui-pro-max-data/typography.csv +74 -74
  174. package/references/ui-pro-max-data/ui-reasoning.csv +162 -162
  175. package/references/ui-pro-max-data/ux-guidelines.csv +99 -99
  176. package/skills/adversary/SKILL.md +283 -283
  177. package/skills/asset-creator/SKILL.md +157 -157
  178. package/skills/audit/SKILL.md +147 -2
  179. package/skills/autopsy/SKILL.md +335 -335
  180. package/skills/ba/SKILL.md +85 -1
  181. package/skills/brainstorm/SKILL.md +380 -342
  182. package/skills/browser-pilot/SKILL.md +169 -168
  183. package/skills/constraint-check/SKILL.md +165 -165
  184. package/skills/context-engine/SKILL.md +408 -404
  185. package/skills/cook/SKILL.md +917 -863
  186. package/skills/db/SKILL.md +273 -273
  187. package/skills/debug/SKILL.md +465 -465
  188. package/skills/dependency-doctor/SKILL.md +265 -235
  189. package/skills/deploy/SKILL.md +274 -231
  190. package/skills/design/DESIGN-REFERENCE.md +365 -365
  191. package/skills/design/SKILL.md +590 -589
  192. package/skills/doc-processor/SKILL.md +254 -254
  193. package/skills/docs/SKILL.md +374 -374
  194. package/skills/docs-seeker/SKILL.md +178 -177
  195. package/skills/fix/SKILL.md +332 -330
  196. package/skills/git/SKILL.md +339 -339
  197. package/skills/hallucination-guard/SKILL.md +220 -219
  198. package/skills/incident/SKILL.md +254 -253
  199. package/skills/integrity-check/SKILL.md +169 -169
  200. package/skills/journal/SKILL.md +241 -240
  201. package/skills/launch/SKILL.md +344 -344
  202. package/skills/logic-guardian/SKILL.md +269 -251
  203. package/skills/marketing/SKILL.md +351 -289
  204. package/skills/mcp-builder/SKILL.md +425 -425
  205. package/skills/neural-memory/SKILL.md +359 -362
  206. package/skills/onboard/SKILL.md +432 -403
  207. package/skills/onboard/references/invariants-template.md +76 -0
  208. package/skills/onboard/scripts/detect-invariants.js +439 -0
  209. package/skills/onboard/scripts/inject-claude-md.js +150 -0
  210. package/skills/onboard/scripts/onboard-invariants.js +194 -0
  211. package/skills/perf/SKILL.md +347 -346
  212. package/skills/plan/SKILL.md +435 -428
  213. package/skills/preflight/SKILL.md +415 -415
  214. package/skills/problem-solver/SKILL.md +380 -284
  215. package/skills/rescue/SKILL.md +474 -474
  216. package/skills/research/SKILL.md +4 -0
  217. package/skills/retro/SKILL.md +3 -1
  218. package/skills/review/SKILL.md +614 -588
  219. package/skills/review-intake/SKILL.md +249 -249
  220. package/skills/safeguard/SKILL.md +200 -200
  221. package/skills/sast/SKILL.md +190 -190
  222. package/skills/scaffold/SKILL.md +328 -287
  223. package/skills/scope-guard/SKILL.md +183 -180
  224. package/skills/scout/SKILL.md +269 -263
  225. package/skills/sentinel/SKILL.md +384 -381
  226. package/skills/sentinel-env/SKILL.md +254 -254
  227. package/skills/sequential-thinking/SKILL.md +234 -234
  228. package/skills/session-bridge/SKILL.md +595 -543
  229. package/skills/session-bridge/scripts/load-invariants.js +397 -0
  230. package/skills/skill-forge/SKILL.md +581 -581
  231. package/skills/skill-router/SKILL.md +3 -0
  232. package/skills/slides/SKILL.md +19 -0
  233. package/skills/surgeon/SKILL.md +215 -215
  234. package/skills/team/SKILL.md +557 -537
  235. package/skills/test/SKILL.md +620 -614
  236. package/skills/trend-scout/SKILL.md +145 -145
  237. package/skills/verification/SKILL.md +334 -326
  238. package/skills/video-creator/SKILL.md +201 -201
  239. package/skills/watchdog/SKILL.md +168 -168
  240. package/skills/worktree/SKILL.md +140 -140
@@ -1,153 +1,153 @@
1
- ---
2
- name: zalo-personal-setup
3
- pack: "@rune/zalo"
4
- description: Personal Zalo account automation setup via zca-js — QR login, credential persistence, WebSocket listener, session management. UNOFFICIAL — risk-gated.
5
- model: sonnet
6
- tools: "Read, Glob, Grep, Bash, Write, Edit"
7
- ---
8
-
9
- # zalo-personal-setup
10
-
11
- ## Purpose
12
-
13
- Bootstrap a personal Zalo account automation using zca-js — the community-maintained reverse-engineered client. Handles first-time QR login, credential persistence, WebSocket listener setup, and session restore on subsequent runs.
14
-
15
- <HARD-GATE>
16
- This skill uses UNOFFICIAL reverse-engineered APIs via zca-js.
17
- BEFORE proceeding, acknowledge ALL risks:
18
- 1. ToS VIOLATION — Zalo can ban your account without warning
19
- 2. SINGLE SESSION — cannot use Zalo mobile/web simultaneously
20
- 3. API INSTABILITY — Zalo can break internal APIs anytime
21
- 4. NO SUPPORT — Zalo will not help with issues from unofficial usage
22
- 5. NOT FOR PRODUCTION — personal projects and prototypes ONLY
23
-
24
- If building for business/production → use Track A (zalo-oa-setup) instead.
25
- </HARD-GATE>
26
-
27
- ## Step 1 — Install Dependency
28
-
29
- ```bash
30
- npm install zca-js
31
- # zca-js: https://github.com/RFS-ADRENO/zca-js (359★, 202 forks)
32
- ```
33
-
34
- Minimum Node.js: 18+. TypeScript users add `@types/node` if not already present.
35
-
36
- ## Step 2 — QR Login (First Run)
37
-
38
- ```typescript
39
- import { Zalo } from 'zca-js'
40
-
41
- const zalo = new Zalo()
42
-
43
- // First-time login: QR code
44
- const api = await zalo.loginQR()
45
- // Terminal displays QR → scan with Zalo mobile app
46
- // Returns API instance with full access
47
-
48
- // Save credentials for next time
49
- const credentials = {
50
- imei: api.getImei(), // generated device ID
51
- cookie: api.getCookie(), // session cookies
52
- userAgent: api.getUserAgent() // browser fingerprint
53
- }
54
- await saveCredentials(credentials)
55
- ```
56
-
57
- QR code expires in ~60 seconds — scan quickly. After scan, zca-js completes handshake and returns a live API instance.
58
-
59
- ## Step 3 — Credential Persistence
60
-
61
- ```typescript
62
- import { readFile, writeFile, chmod } from 'fs/promises'
63
- import { join } from 'path'
64
- import { homedir } from 'os'
65
-
66
- const CRED_PATH = join(homedir(), '.zalo-personal', 'credentials.json')
67
-
68
- async function saveCredentials(creds: ZaloCredentials): Promise<void> {
69
- await writeFile(CRED_PATH, JSON.stringify(creds, null, 2))
70
- await chmod(CRED_PATH, 0o600) // owner-only read/write
71
- }
72
-
73
- async function loadCredentials(): Promise<ZaloCredentials | null> {
74
- try {
75
- return JSON.parse(await readFile(CRED_PATH, 'utf-8'))
76
- } catch { return null }
77
- }
78
- ```
79
-
80
- Store at `~/.zalo-personal/credentials.json` — outside the project repo. Never commit credentials to git. Add `.zalo-personal/` to `.gitignore`.
81
-
82
- ## Step 4 — Session Restore (Subsequent Runs)
83
-
84
- ```typescript
85
- const creds = await loadCredentials()
86
-
87
- const api = creds
88
- ? await zalo.login({
89
- imei: creds.imei,
90
- cookie: creds.cookie,
91
- userAgent: creds.userAgent
92
- })
93
- : await zalo.loginQR() // fall back to QR if no saved creds
94
-
95
- // Always re-persist after login — cookies may have refreshed
96
- await saveCredentials({
97
- imei: api.getImei(),
98
- cookie: api.getCookie(),
99
- userAgent: api.getUserAgent()
100
- })
101
- ```
102
-
103
- ## Step 5 — WebSocket Listener
104
-
105
- ```typescript
106
- const listener = api.listener
107
- await listener.start({ retryOnClose: true })
108
-
109
- listener.on('message', (msg) => {
110
- // Handle incoming DMs
111
- console.log(`[DM] ${msg.data.content}`)
112
- })
113
-
114
- listener.on('group_message', (msg) => {
115
- // Group messages arrive on separate event
116
- console.log(`[Group] ${msg.data.content}`)
117
- })
118
-
119
- // keepAlive is automatic via zca-js — no manual ping needed
120
- ```
121
-
122
- `retryOnClose: true` enables automatic reconnect using the retry schedule provided by Zalo's server.
123
-
124
- ## Session Management Notes
125
-
126
- | Concept | Detail |
127
- |---------|--------|
128
- | IMEI | Deterministic UUID from userAgent — acts as device fingerprint. Must stay consistent across restarts. |
129
- | Cookies | Auto-refreshed on keepAlive. Always re-persist after each session start. |
130
- | DuplicateConnection (3000) | Another session opened — this one closes. Cannot run bot + Zalo mobile simultaneously. |
131
- | Reconnect | Handled by zca-js via server retry schedule. No manual logic needed. |
132
-
133
- ## Anti-Detection Baseline
134
-
135
- - Use consistent `userAgent` across sessions — don't randomize on each run
136
- - Don't send messages too fast (see `zalo-rate-guard` for throttle patterns)
137
- - Avoid running during unusual hours (3–6 AM local time)
138
- - Keep sessions long-lived — frequent login/logout is suspicious
139
- - Never change profile info programmatically
140
-
141
- ## Sharp Edges
142
-
143
- - Cookie refresh happens on keepAlive — **MUST** persist updated cookies after every session start, not just first login
144
- - IMEI must stay consistent — changing it looks like a new device to Zalo's backend
145
- - If Zalo mobile is active on same account, bot receives `DuplicateConnection` kick immediately
146
- - zca-js depends on Zalo's internal undocumented API — breaks without warning on Zalo updates
147
- - No official rate limits documented — err heavily on the side of caution
148
-
149
- ## Mesh Links
150
-
151
- - `zalo-oa-setup` — Track A (official OA API) if this use case grows to production
152
- - `zalo-rate-guard` — rate limiting and message throttle for personal bots
153
- - `zalo-personal-messaging` — send/reply DMs and group messages once session is live
1
+ ---
2
+ name: zalo-personal-setup
3
+ pack: "@rune/zalo"
4
+ description: Personal Zalo account automation setup via zca-js — QR login, credential persistence, WebSocket listener, session management. UNOFFICIAL — risk-gated.
5
+ model: sonnet
6
+ tools: "Read, Glob, Grep, Bash, Write, Edit"
7
+ ---
8
+
9
+ # zalo-personal-setup
10
+
11
+ ## Purpose
12
+
13
+ Bootstrap a personal Zalo account automation using zca-js — the community-maintained reverse-engineered client. Handles first-time QR login, credential persistence, WebSocket listener setup, and session restore on subsequent runs.
14
+
15
+ <HARD-GATE>
16
+ This skill uses UNOFFICIAL reverse-engineered APIs via zca-js.
17
+ BEFORE proceeding, acknowledge ALL risks:
18
+ 1. ToS VIOLATION — Zalo can ban your account without warning
19
+ 2. SINGLE SESSION — cannot use Zalo mobile/web simultaneously
20
+ 3. API INSTABILITY — Zalo can break internal APIs anytime
21
+ 4. NO SUPPORT — Zalo will not help with issues from unofficial usage
22
+ 5. NOT FOR PRODUCTION — personal projects and prototypes ONLY
23
+
24
+ If building for business/production → use Track A (zalo-oa-setup) instead.
25
+ </HARD-GATE>
26
+
27
+ ## Step 1 — Install Dependency
28
+
29
+ ```bash
30
+ npm install zca-js
31
+ # zca-js: https://github.com/RFS-ADRENO/zca-js (359★, 202 forks)
32
+ ```
33
+
34
+ Minimum Node.js: 18+. TypeScript users add `@types/node` if not already present.
35
+
36
+ ## Step 2 — QR Login (First Run)
37
+
38
+ ```typescript
39
+ import { Zalo } from 'zca-js'
40
+
41
+ const zalo = new Zalo()
42
+
43
+ // First-time login: QR code
44
+ const api = await zalo.loginQR()
45
+ // Terminal displays QR → scan with Zalo mobile app
46
+ // Returns API instance with full access
47
+
48
+ // Save credentials for next time
49
+ const credentials = {
50
+ imei: api.getImei(), // generated device ID
51
+ cookie: api.getCookie(), // session cookies
52
+ userAgent: api.getUserAgent() // browser fingerprint
53
+ }
54
+ await saveCredentials(credentials)
55
+ ```
56
+
57
+ QR code expires in ~60 seconds — scan quickly. After scan, zca-js completes handshake and returns a live API instance.
58
+
59
+ ## Step 3 — Credential Persistence
60
+
61
+ ```typescript
62
+ import { readFile, writeFile, chmod } from 'fs/promises'
63
+ import { join } from 'path'
64
+ import { homedir } from 'os'
65
+
66
+ const CRED_PATH = join(homedir(), '.zalo-personal', 'credentials.json')
67
+
68
+ async function saveCredentials(creds: ZaloCredentials): Promise<void> {
69
+ await writeFile(CRED_PATH, JSON.stringify(creds, null, 2))
70
+ await chmod(CRED_PATH, 0o600) // owner-only read/write
71
+ }
72
+
73
+ async function loadCredentials(): Promise<ZaloCredentials | null> {
74
+ try {
75
+ return JSON.parse(await readFile(CRED_PATH, 'utf-8'))
76
+ } catch { return null }
77
+ }
78
+ ```
79
+
80
+ Store at `~/.zalo-personal/credentials.json` — outside the project repo. Never commit credentials to git. Add `.zalo-personal/` to `.gitignore`.
81
+
82
+ ## Step 4 — Session Restore (Subsequent Runs)
83
+
84
+ ```typescript
85
+ const creds = await loadCredentials()
86
+
87
+ const api = creds
88
+ ? await zalo.login({
89
+ imei: creds.imei,
90
+ cookie: creds.cookie,
91
+ userAgent: creds.userAgent
92
+ })
93
+ : await zalo.loginQR() // fall back to QR if no saved creds
94
+
95
+ // Always re-persist after login — cookies may have refreshed
96
+ await saveCredentials({
97
+ imei: api.getImei(),
98
+ cookie: api.getCookie(),
99
+ userAgent: api.getUserAgent()
100
+ })
101
+ ```
102
+
103
+ ## Step 5 — WebSocket Listener
104
+
105
+ ```typescript
106
+ const listener = api.listener
107
+ await listener.start({ retryOnClose: true })
108
+
109
+ listener.on('message', (msg) => {
110
+ // Handle incoming DMs
111
+ console.log(`[DM] ${msg.data.content}`)
112
+ })
113
+
114
+ listener.on('group_message', (msg) => {
115
+ // Group messages arrive on separate event
116
+ console.log(`[Group] ${msg.data.content}`)
117
+ })
118
+
119
+ // keepAlive is automatic via zca-js — no manual ping needed
120
+ ```
121
+
122
+ `retryOnClose: true` enables automatic reconnect using the retry schedule provided by Zalo's server.
123
+
124
+ ## Session Management Notes
125
+
126
+ | Concept | Detail |
127
+ |---------|--------|
128
+ | IMEI | Deterministic UUID from userAgent — acts as device fingerprint. Must stay consistent across restarts. |
129
+ | Cookies | Auto-refreshed on keepAlive. Always re-persist after each session start. |
130
+ | DuplicateConnection (3000) | Another session opened — this one closes. Cannot run bot + Zalo mobile simultaneously. |
131
+ | Reconnect | Handled by zca-js via server retry schedule. No manual logic needed. |
132
+
133
+ ## Anti-Detection Baseline
134
+
135
+ - Use consistent `userAgent` across sessions — don't randomize on each run
136
+ - Don't send messages too fast (see `zalo-rate-guard` for throttle patterns)
137
+ - Avoid running during unusual hours (3–6 AM local time)
138
+ - Keep sessions long-lived — frequent login/logout is suspicious
139
+ - Never change profile info programmatically
140
+
141
+ ## Sharp Edges
142
+
143
+ - Cookie refresh happens on keepAlive — **MUST** persist updated cookies after every session start, not just first login
144
+ - IMEI must stay consistent — changing it looks like a new device to Zalo's backend
145
+ - If Zalo mobile is active on same account, bot receives `DuplicateConnection` kick immediately
146
+ - zca-js depends on Zalo's internal undocumented API — breaks without warning on Zalo updates
147
+ - No official rate limits documented — err heavily on the side of caution
148
+
149
+ ## Mesh Links
150
+
151
+ - `zalo-oa-setup` — Track A (official OA API) if this use case grows to production
152
+ - `zalo-rate-guard` — rate limiting and message throttle for personal bots
153
+ - `zalo-personal-messaging` — send/reply DMs and group messages once session is live