All checks were successful
Co-authored-by: Jeffrey Smith <jasafpro@gmail.com> Co-committed-by: Jeffrey Smith <jasafpro@gmail.com>
89 lines
2.7 KiB
Plaintext
89 lines
2.7 KiB
Plaintext
# Workflow Chat — Starlark Backend (v0.1.0)
|
|
#
|
|
# Library package that creates scoped chat conversations when
|
|
# workflow stages require team collaboration.
|
|
#
|
|
# Usage: wire into stage_config as an on_advance hook:
|
|
# {"on_advance": {"package_id": "workflow-chat", "entry_point": "on_advance"}}
|
|
#
|
|
# Expected stage_data keys:
|
|
# title — conversation title (optional, defaults to "Workflow Discussion")
|
|
# team_members — list of {id, display_name} dicts
|
|
# creator_id — user ID of the workflow initiator
|
|
# creator_display_name — display name of the workflow initiator
|
|
#
|
|
# Modules: db, json, realtime (via chat-core dependency)
|
|
|
|
chat = lib.require("chat-core")
|
|
|
|
|
|
def _str(v):
|
|
if v == None:
|
|
return ""
|
|
return str(v)
|
|
|
|
|
|
def on_advance(ctx):
|
|
"""Hook called when a workflow advances to a team-audience stage.
|
|
|
|
Creates a group conversation with all team members and sends
|
|
a system message linking back to the workflow instance.
|
|
|
|
Args:
|
|
ctx: dict with {instance_id, previous_stage, current_stage, stage_data}
|
|
|
|
Returns:
|
|
dict with {stage_data} containing enriched data with conversation_id,
|
|
or None if no team members are present.
|
|
"""
|
|
data = ctx.get("stage_data", {})
|
|
if type(data) == "string":
|
|
data = json.decode(data) if data else {}
|
|
|
|
instance_id = _str(ctx.get("instance_id", ""))
|
|
members = data.get("team_members", [])
|
|
creator_id = _str(data.get("creator_id", ""))
|
|
creator_name = _str(data.get("creator_display_name", ""))
|
|
title = _str(data.get("title", "")) or "Workflow Discussion"
|
|
|
|
# Skip if no team members to add
|
|
if not members:
|
|
return None
|
|
|
|
# Check if conversation already exists for this instance (idempotency)
|
|
existing_cid = _str(data.get("conversation_id", ""))
|
|
if existing_cid:
|
|
return None
|
|
|
|
# Build participants list
|
|
participants = []
|
|
for m in members:
|
|
mid = _str(m.get("id", ""))
|
|
if mid and mid != creator_id:
|
|
participants.append({
|
|
"id": mid,
|
|
"display_name": _str(m.get("display_name", "")),
|
|
})
|
|
|
|
# Create conversation scoped to this workflow instance
|
|
conv = chat.create(
|
|
title=title + " [" + instance_id[:8] + "]",
|
|
type="group",
|
|
participants=participants,
|
|
creator_id=creator_id,
|
|
creator_display_name=creator_name,
|
|
)
|
|
|
|
cid = _str(conv.get("id", ""))
|
|
|
|
# Send system message linking to the workflow
|
|
chat.send(cid, creator_id, "Conversation created for workflow instance " + instance_id, "system")
|
|
|
|
# Return enriched stage_data with conversation_id
|
|
enriched = {}
|
|
for k in data:
|
|
enriched[k] = data[k]
|
|
enriched["conversation_id"] = cid
|
|
|
|
return {"stage_data": enriched}
|