Assistant: codex Assistant-Model: gpt-5.6-luna Assistant-Session: 01a087b0-7b1e-7531-8ef3-6525ebaf7ee7
33 lines
1.9 KiB
Python
33 lines
1.9 KiB
Python
from __future__ import annotations
|
|
import json
|
|
|
|
def zone_memberships_as_of(conn,member,at,zone_type=None):
|
|
# latest membership state per zone/member before time; exchange snapshots are append evidence,
|
|
# so membership exists if it has ever been asserted by the latest applicable source. For
|
|
# deployment-derived memberships this is tied to the entity version/identity tuple.
|
|
q='SELECT zone_id,zone_type,derived,MAX(snapshot_time) mt FROM zone_members WHERE member_id=? AND snapshot_time<=?'
|
|
p=[member,at]
|
|
if zone_type:q+=' AND zone_type=?';p.append(zone_type)
|
|
q+=' GROUP BY zone_id,zone_type,derived'
|
|
return [{'zone_id':r[0],'zone_type':r[1],'derived':bool(r[2])} for r in conn.execute(q,p).fetchall()]
|
|
|
|
def zones_by_type(conn,member,at):
|
|
out={}
|
|
for x in zone_memberships_as_of(conn,member,at):out.setdefault(x['zone_type'],[]).append(x['zone_id'])
|
|
for k in out:out[k]=sorted(set(out[k]))
|
|
return out
|
|
|
|
def entity_owner_as_of(conn,ref,at):
|
|
# entities are already working-set preferred; resources may still need owner projection.
|
|
r=conn.execute('SELECT kind,json,preferred_id FROM entity_versions WHERE entity_id=? AND snapshot_time<=? ORDER BY snapshot_time DESC LIMIT 1',(ref,at)).fetchone()
|
|
if not r:r=conn.execute('SELECT kind,json,preferred_id FROM entities WHERE entity_id=?',(ref,)).fetchone()
|
|
if not r:return ref
|
|
if r['kind']=='system-node':return r['preferred_id'] or ref
|
|
try:o=json.loads(r['json'])
|
|
except:return r['preferred_id'] or ref
|
|
if r['kind'] in ('information-resource','channel') and o.get('owner'):return o['owner']
|
|
return r['preferred_id'] or ref
|
|
|
|
def active_observation_scopes(conn,population_id,edge_key,at):
|
|
rows=conn.execute('SELECT DISTINCT observation_scope FROM topology_observation_intervals WHERE population_id=? AND edge_key=? AND valid_from<=? AND (closed_at IS NULL OR closed_at>?)',(population_id,edge_key,at,at)).fetchall()
|
|
return sorted({r[0] for r in rows})
|