packetdial: add gated call-queue + time-frame edit wrappers (live-verified)

Added write wrappers, each tested create→update→delete on the arizonacomputerguru test
domain (sanctioned, non-production):
- call queues: create-callqueue, update-callqueue, delete-callqueue + add-agent /
  update-agent / remove-agent
- time frames: create-timeframe, update-timeframe, delete-timeframe (body-discriminated —
  same path, server selects the op from the body; wrappers pass --body verbatim)

All behind --confirm (gate verified: DRY RUN refuses without it). SKILL.md documents the
bodies + the days-of-week-needs-array gotcha + names ACG as the test bed; capability map
+ api.md history updated. No production objects touched; no test leftovers.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-22 07:44:30 -07:00
parent 25b2ff45bf
commit f42f9c2419
4 changed files with 139 additions and 2 deletions

View File

@@ -116,6 +116,19 @@ def main(argv=None) -> int:
sp = sub.add_parser("create-phone"); sp.add_argument("domain"); sp.add_argument("--body", required=True); sp.add_argument("--confirm", action="store_true")
sp = sub.add_parser("create-did"); sp.add_argument("domain"); sp.add_argument("--body", required=True); sp.add_argument("--confirm", action="store_true")
# call queue edits (gated)
sp = sub.add_parser("create-callqueue"); sp.add_argument("domain"); sp.add_argument("--body", required=True); sp.add_argument("--confirm", action="store_true")
sp = sub.add_parser("update-callqueue"); sp.add_argument("domain"); sp.add_argument("callqueue"); sp.add_argument("--body", required=True); sp.add_argument("--confirm", action="store_true")
sp = sub.add_parser("delete-callqueue"); sp.add_argument("domain"); sp.add_argument("callqueue"); sp.add_argument("--confirm", action="store_true")
sp = sub.add_parser("add-agent"); sp.add_argument("domain"); sp.add_argument("callqueue"); sp.add_argument("--body", required=True); sp.add_argument("--confirm", action="store_true")
sp = sub.add_parser("update-agent"); sp.add_argument("domain"); sp.add_argument("callqueue"); sp.add_argument("agent_id"); sp.add_argument("--body", required=True); sp.add_argument("--confirm", action="store_true")
sp = sub.add_parser("remove-agent"); sp.add_argument("domain"); sp.add_argument("callqueue"); sp.add_argument("agent_id"); sp.add_argument("--confirm", action="store_true")
# timeframe edits (gated) — body-discriminated variants, pass --body verbatim
sp = sub.add_parser("create-timeframe"); sp.add_argument("domain"); sp.add_argument("--body", required=True); sp.add_argument("--confirm", action="store_true")
sp = sub.add_parser("update-timeframe"); sp.add_argument("domain"); sp.add_argument("tf_id"); sp.add_argument("--body", required=True); sp.add_argument("--confirm", action="store_true")
sp = sub.add_parser("delete-timeframe"); sp.add_argument("domain"); sp.add_argument("tf_id"); sp.add_argument("--body"); sp.add_argument("--confirm", action="store_true")
# --- raw escape hatch ---
sp = sub.add_parser("raw", help="raw request against any v2 path")
sp.add_argument("method", choices=["GET", "POST", "PUT", "PATCH", "DELETE"])
@@ -190,6 +203,42 @@ def main(argv=None) -> int:
_require_confirm(args, "create phone number", f"{args.domain}: {json.dumps(body)}")
_emit(client.create_phonenumber(args.domain, body))
elif args.cmd == "create-callqueue":
body = _parse_body(args.body)
_require_confirm(args, "create call queue", f"{args.domain}: {json.dumps(body)}")
_emit(client.create_callqueue(args.domain, body))
elif args.cmd == "update-callqueue":
body = _parse_body(args.body)
_require_confirm(args, "update call queue", f"{args.domain}/{args.callqueue}: {json.dumps(body)}")
_emit(client.update_callqueue(args.domain, args.callqueue, body))
elif args.cmd == "delete-callqueue":
_require_confirm(args, "DELETE call queue", f"{args.domain}/{args.callqueue}")
_emit(client.delete_callqueue(args.domain, args.callqueue))
elif args.cmd == "add-agent":
body = _parse_body(args.body)
_require_confirm(args, "add queue agent", f"{args.domain}/{args.callqueue}: {json.dumps(body)}")
_emit(client.add_callqueue_agent(args.domain, args.callqueue, body))
elif args.cmd == "update-agent":
body = _parse_body(args.body)
_require_confirm(args, "update queue agent", f"{args.domain}/{args.callqueue}/{args.agent_id}: {json.dumps(body)}")
_emit(client.update_callqueue_agent(args.domain, args.callqueue, args.agent_id, body))
elif args.cmd == "remove-agent":
_require_confirm(args, "remove queue agent", f"{args.domain}/{args.callqueue}/{args.agent_id}")
_emit(client.remove_callqueue_agent(args.domain, args.callqueue, args.agent_id))
elif args.cmd == "create-timeframe":
body = _parse_body(args.body)
_require_confirm(args, "create timeframe", f"{args.domain}: {json.dumps(body)}")
_emit(client.create_timeframe(args.domain, body))
elif args.cmd == "update-timeframe":
body = _parse_body(args.body)
_require_confirm(args, "update timeframe", f"{args.domain}/{args.tf_id}: {json.dumps(body)}")
_emit(client.update_timeframe(args.domain, args.tf_id, body))
elif args.cmd == "delete-timeframe":
body = _parse_body(args.body) if args.body else None
_require_confirm(args, "DELETE timeframe", f"{args.domain}/{args.tf_id}" + (f" {json.dumps(body)}" if body else ""))
_emit(client.delete_timeframe(args.domain, args.tf_id, body))
elif args.cmd == "raw":
body = _parse_body(args.body)
if args.method != "GET":