@hiveku-apps/sync 0.5.11 → 0.5.13

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hiveku-apps/sync",
3
- "version": "0.5.11",
3
+ "version": "0.5.13",
4
4
  "description": "Sync a Hiveku account's memory/rules/skills + coder projects into a local folder, and ship projects (push/deploy/pull-env) from the terminal. Pairs with the Hiveku MCP at core.hiveku.com/mcp so Claude Code can drive Hiveku tools per-folder.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -1,9 +1,10 @@
1
1
  {
2
- "source": "locus2012/hiveku-codex-plugin main (a4c9cd6, 0.3.29), plugins/hiveku/.mcp.json: every hiveku.tools entry with approval_mode \"prompt\" (project_vcs_rollback included)",
2
+ "source": "locus2012/hiveku-codex-plugin 0.3.36 (30578b9, on main d0b9903), plugins/hiveku/.mcp.json: every hiveku.tools entry with approval_mode \"prompt\" (project_vcs_rollback included)",
3
3
  "why": "hiveku-sync writes its own [mcp_servers.hiveku] into a Codex folder. Codex then uses that entry, not the plugin's, for the server's connection and for every tool's approval mode, so these prompts must be written here too. Refresh this list whenever the Codex plugin's prompt list changes.",
4
4
  "tools": [
5
5
  "deploy_site",
6
6
  "deploy_run",
7
+ "deploy_serve_version",
7
8
  "project_files_bulk_save",
8
9
  "project_vcs_commit",
9
10
  "project_vcs_merge",
@@ -17,6 +18,7 @@
17
18
  "project_vcs_revert",
18
19
  "project_vcs_rollback",
19
20
  "project_vcs_resolve",
21
+ "project_vcs_branch_in_step",
20
22
  "project_vcs_pr_update",
21
23
  "project_vcs_queue_add",
22
24
  "project_vcs_checks_rerun",
@@ -50,6 +52,8 @@
50
52
  "site_firewall_trust_range",
51
53
  "site_firewall_remove",
52
54
  "project_indexing_set",
55
+ "project_concurrency_set",
56
+ "project_page_cache_set",
53
57
  "ppc_recent_change_override",
54
58
  "account_timezone_set",
55
59
  "account_memory_append",
@@ -64,6 +68,11 @@
64
68
  "email_campaign_schedule",
65
69
  "email_campaign_resend_non_openers",
66
70
  "email_campaign_test_send",
71
+ "workflow_email_step_test_send",
72
+ "email_send",
73
+ "email_domain_send_instructions",
74
+ "email_project_connect",
75
+ "email_suppression_import",
67
76
  "crm_envelope_send",
68
77
  "crm_estimate_send",
69
78
  "helpdesk_ticket_send_reply",
@@ -126,11 +135,13 @@
126
135
  "accounting_invoice_record_payment",
127
136
  "accounting_subscription_create",
128
137
  "crm_contact_email_send",
138
+ "crm_contact_email_send_from_domain",
129
139
  "crm_enroll_sequence",
130
140
  "crm_sequence_enroll_bulk",
131
141
  "email_sequence_enroll",
132
142
  "email_sequence_activate",
133
143
  "marketing_activate",
144
+ "crm_contact_optin_set",
134
145
  "voice_sms_send",
135
146
  "voice_sms_send_to_contact",
136
147
  "voice_sms_thread_reply",
@@ -213,6 +224,7 @@
213
224
  "seo_backlink_tracker_delete",
214
225
  "seo_backlink_opportunity_delete",
215
226
  "seo_automated_report_delete",
227
+ "seo_aeo_brand_profile_delete",
216
228
  "seo_page_schema_delete",
217
229
  "workflow_run",
218
230
  "workflow_enable",
@@ -41,7 +41,7 @@
41
41
  * The Marketing family: the Marketing parent and its topics. Peers, each with
42
42
  * its own owner key (builder src/lib/olympus/memory-types.ts
43
43
  * MARKETING_FAMILY_DEPARTMENTS). Analytics is a Marketing topic (audit
44
- * decision 6).
44
+ * decision 6); Outbound is not: it is its own agent since 2026-10-26.
45
45
  */
46
46
  export const MARKETING_FAMILY = Object.freeze([
47
47
  'marketing',
@@ -49,7 +49,6 @@ export const MARKETING_FAMILY = Object.freeze([
49
49
  'seo',
50
50
  'social',
51
51
  'ppc',
52
- 'outbound',
53
52
  'branding',
54
53
  'customer_avatar',
55
54
  'customer_journey',
@@ -64,6 +63,7 @@ export const MARKETING_FAMILY = Object.freeze([
64
63
  /** Every canonical department (memory-types.ts VALID_DEPARTMENTS). */
65
64
  export const DEPARTMENTS = Object.freeze([
66
65
  ...MARKETING_FAMILY,
66
+ 'outbound',
67
67
  'sales',
68
68
  'helpdesk',
69
69
  'production',
@@ -331,16 +331,27 @@ export function accountPlacement(domain, content) {
331
331
  // ─── Where the page shows every other row ────────────────────────────────
332
332
 
333
333
  /** The team the Memory page lists (builder tree/team-keys.ts TEAM_AGENTS). */
334
- export const TEAM_AGENTS = Object.freeze(['orchestrator', 'sales', 'helpdesk', 'marketing', 'production', 'accounting', 'coder', 'comms']);
334
+ export const TEAM_AGENTS = Object.freeze(['orchestrator', 'sales', 'helpdesk', 'marketing', 'outbound', 'production', 'accounting', 'coder', 'comms']);
335
335
  const TEAM_SET = new Set(TEAM_AGENTS);
336
336
 
337
337
  /**
338
338
  * The departments whose own notes are ONE plain domain, their own name
339
339
  * (tree-model.ts ONE_NOTES_NAME_DEPARTMENTS): their agents read that one
340
340
  * document (the sales server reads `domain = 'sales'`), so a note one of them
341
- * owns under another plain name is one its agent never reads.
341
+ * owns under another plain name is one its agent never reads. Outbound also
342
+ * keeps its `outbound_*` notes (ideal customer, reply tone, do not contact),
343
+ * which its server reads before every draft (builder memory-types.ts
344
+ * DEPARTMENT_NOTES_PREFIXES).
342
345
  */
343
- const ONE_NOTES_NAME_DEPARTMENTS = new Set(['sales', 'helpdesk', 'comms', 'production', 'accounting', 'coder']);
346
+ const ONE_NOTES_NAME_DEPARTMENTS = new Set(['sales', 'helpdesk', 'comms', 'production', 'accounting', 'coder', 'outbound']);
347
+ const DEPARTMENT_NOTES_PREFIXES = Object.freeze({ outbound: 'outbound_' });
348
+
349
+ /** Whether `domain` is a plain note `department`'s own memory lists (builder isDepartmentNotesName). */
350
+ function isDepartmentNotesName(department, domain) {
351
+ if (domain === department) return true;
352
+ const prefix = Object.prototype.hasOwnProperty.call(DEPARTMENT_NOTES_PREFIXES, department) ? DEPARTMENT_NOTES_PREFIXES[department] : undefined;
353
+ return !!prefix && domain.length > prefix.length && domain.startsWith(prefix);
354
+ }
344
355
 
345
356
  /** The page's group for each type of row (tree-model.ts KIND_GROUP). */
346
357
  const TYPE_GROUP = Object.freeze({
@@ -378,7 +389,7 @@ export function ownedPlacement(domain, owner) {
378
389
  const group = TYPE_GROUP[type];
379
390
  if (owner === null || owner === undefined || owner === '') return { where: 'shared', group };
380
391
  // The page compares the stored name exactly, as the agents' own reads do.
381
- if (type === 'memory' && ONE_NOTES_NAME_DEPARTMENTS.has(owner) && domain !== owner) return { where: 'hidden', reason: 'unlisted' };
392
+ if (type === 'memory' && ONE_NOTES_NAME_DEPARTMENTS.has(owner) && !isDepartmentNotesName(owner, domain)) return { where: 'hidden', reason: 'unlisted' };
382
393
  if (owner === 'orchestrator' && type !== 'identity') return { where: 'hidden', reason: 'unlisted' };
383
394
  if (TEAM_SET.has(owner) && owner !== 'marketing') return { where: 'agent', agent: owner, topic: null, group };
384
395
  if (isMarketingTopic(owner)) {
@@ -396,6 +407,7 @@ const AGENT_JOBS = Object.freeze({
396
407
  sales: 'Sales',
397
408
  helpdesk: 'Support',
398
409
  marketing: 'Marketing',
410
+ outbound: 'Outbound',
399
411
  production: 'Production',
400
412
  accounting: 'Accounting',
401
413
  coder: 'Website',
@@ -413,7 +425,6 @@ const TOPIC_NAMES = Object.freeze({
413
425
  branding: 'Branding',
414
426
  customer_journey: 'Customer journey',
415
427
  knowledge_base: 'Knowledge base',
416
- outbound: 'Outbound',
417
428
  workflow: 'Workflow',
418
429
  before_after_grid: 'Before and after',
419
430
  website_design: 'Website design',
@@ -431,13 +442,13 @@ export function ownerLabel(owner) {
431
442
  return AGENT_JOBS[owner] ?? owner;
432
443
  }
433
444
 
434
- /** The order the page lists the team in: shared first, then the team, the Marketing topics after Marketing. */
445
+ /** The order the page lists the team in: shared first, then the team, the Marketing topics after Marketing, then Outbound. */
435
446
  export function ownerOrder(owner) {
436
447
  if (!owner || owner === SHARED_OWNER) return 0;
437
448
  const team = ['orchestrator', 'sales', 'helpdesk'];
438
449
  if (team.includes(owner)) return 1 + team.indexOf(owner);
439
450
  if (MARKETING_SET.has(owner)) return 10 + MARKETING_FAMILY.indexOf(owner);
440
- const rest = ['production', 'accounting', 'coder', 'comms'];
451
+ const rest = ['outbound', 'production', 'accounting', 'coder', 'comms'];
441
452
  if (rest.includes(owner)) return 40 + rest.indexOf(owner);
442
453
  return 100;
443
454
  }