From 1cd00e893b5bae97b16bb09b5f5b7494b622de5d Mon Sep 17 00:00:00 2001 From: Kenan Millet Date: Fri, 26 Jun 2026 16:19:45 -0400 Subject: [PATCH 1/3] =?UTF-8?q?Sequence:=20flatten=20exports=20=E2=80=94?= =?UTF-8?q?=20remove=20API=20sub-object,=20export=20directly=20on=20global?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sequence/0.2.0/Sequence.js | 69 +++++++++++++++++++------------------- Sequence/Sequence.js | 69 +++++++++++++++++++------------------- 2 files changed, 68 insertions(+), 70 deletions(-) diff --git a/Sequence/0.2.0/Sequence.js b/Sequence/0.2.0/Sequence.js index effa2f3efa..27e06dd524 100644 --- a/Sequence/0.2.0/Sequence.js +++ b/Sequence/0.2.0/Sequence.js @@ -5395,42 +5395,41 @@ if (opacityReg) opacityReg.set(obj, 0.5);` return { checkInstall, registerEventHandlers, - API: { - // Extension registration - registerAttribute, - registerPlaybackConstant, - registerEasing, - generateExtensionHandout, - - // Registry introspection — returns struct or null - getAttribute: getAttrReg, - getFunction: (qualName) => { - const parts = qualName.split('.'); - const ns = parts.length > 1 ? parts.slice(0, -1).join('.') : 'core'; - const name = parts[parts.length - 1]; - return FN_REGISTRY[`${ns}/${name}`] || null; - }, - getConstant: (qualName) => { - const parts = qualName.split('.'); - const ns = parts.length > 1 ? parts.slice(0, -1).join('.') : 'core'; - const name = parts[parts.length - 1]; - return CONST_REGISTRY[`${ns}/${name}`] || null; - }, - getEasing, - - // Playback control — for scripts that trigger playback programmatically - loadRecording, - startPlayback, - stopPlayback, - pausePlayback, - resumePlayback, - startRecording, - stopRecording, - saveRecording, - - // Notify Sequence that a virtual attribute changed (for recording) - notifyChange, + + // Extension registration + registerAttribute, + registerPlaybackConstant, + registerEasing, + generateExtensionHandout, + + // Registry introspection — returns struct or null + getAttribute: getAttrReg, + getFunction: (qualName) => { + const parts = qualName.split('.'); + const ns = parts.length > 1 ? parts.slice(0, -1).join('.') : 'core'; + const name = parts[parts.length - 1]; + return FN_REGISTRY[`${ns}/${name}`] || null; + }, + getConstant: (qualName) => { + const parts = qualName.split('.'); + const ns = parts.length > 1 ? parts.slice(0, -1).join('.') : 'core'; + const name = parts[parts.length - 1]; + return CONST_REGISTRY[`${ns}/${name}`] || null; }, + getEasing, + + // Playback control — for scripts that trigger playback programmatically + loadRecording, + startPlayback, + stopPlayback, + pausePlayback, + resumePlayback, + startRecording, + stopRecording, + saveRecording, + + // Notify Sequence that a virtual attribute changed (for recording) + notifyChange, }; })(); diff --git a/Sequence/Sequence.js b/Sequence/Sequence.js index effa2f3efa..27e06dd524 100644 --- a/Sequence/Sequence.js +++ b/Sequence/Sequence.js @@ -5395,42 +5395,41 @@ if (opacityReg) opacityReg.set(obj, 0.5);` return { checkInstall, registerEventHandlers, - API: { - // Extension registration - registerAttribute, - registerPlaybackConstant, - registerEasing, - generateExtensionHandout, - - // Registry introspection — returns struct or null - getAttribute: getAttrReg, - getFunction: (qualName) => { - const parts = qualName.split('.'); - const ns = parts.length > 1 ? parts.slice(0, -1).join('.') : 'core'; - const name = parts[parts.length - 1]; - return FN_REGISTRY[`${ns}/${name}`] || null; - }, - getConstant: (qualName) => { - const parts = qualName.split('.'); - const ns = parts.length > 1 ? parts.slice(0, -1).join('.') : 'core'; - const name = parts[parts.length - 1]; - return CONST_REGISTRY[`${ns}/${name}`] || null; - }, - getEasing, - - // Playback control — for scripts that trigger playback programmatically - loadRecording, - startPlayback, - stopPlayback, - pausePlayback, - resumePlayback, - startRecording, - stopRecording, - saveRecording, - - // Notify Sequence that a virtual attribute changed (for recording) - notifyChange, + + // Extension registration + registerAttribute, + registerPlaybackConstant, + registerEasing, + generateExtensionHandout, + + // Registry introspection — returns struct or null + getAttribute: getAttrReg, + getFunction: (qualName) => { + const parts = qualName.split('.'); + const ns = parts.length > 1 ? parts.slice(0, -1).join('.') : 'core'; + const name = parts[parts.length - 1]; + return FN_REGISTRY[`${ns}/${name}`] || null; + }, + getConstant: (qualName) => { + const parts = qualName.split('.'); + const ns = parts.length > 1 ? parts.slice(0, -1).join('.') : 'core'; + const name = parts[parts.length - 1]; + return CONST_REGISTRY[`${ns}/${name}`] || null; }, + getEasing, + + // Playback control — for scripts that trigger playback programmatically + loadRecording, + startPlayback, + stopPlayback, + pausePlayback, + resumePlayback, + startRecording, + stopRecording, + saveRecording, + + // Notify Sequence that a virtual attribute changed (for recording) + notifyChange, }; })(); From b105ddf10b707e99daa09181b6c6876d3749b095 Mon Sep 17 00:00:00 2001 From: Kenan Millet Date: Fri, 26 Jun 2026 16:23:48 -0400 Subject: [PATCH 2/3] Sequence: remove Object.assign/delete API shim (no longer needed) --- Sequence/0.2.0/Sequence.js | 2 -- Sequence/Sequence.js | 2 -- 2 files changed, 4 deletions(-) diff --git a/Sequence/0.2.0/Sequence.js b/Sequence/0.2.0/Sequence.js index 27e06dd524..94bed8cf21 100644 --- a/Sequence/0.2.0/Sequence.js +++ b/Sequence/0.2.0/Sequence.js @@ -5437,6 +5437,4 @@ on('ready', () => { 'use strict'; Sequence.checkInstall(); Sequence.registerEventHandlers(); - Object.assign(Sequence, Sequence.API); - delete Sequence.API; }); \ No newline at end of file diff --git a/Sequence/Sequence.js b/Sequence/Sequence.js index 27e06dd524..94bed8cf21 100644 --- a/Sequence/Sequence.js +++ b/Sequence/Sequence.js @@ -5437,6 +5437,4 @@ on('ready', () => { 'use strict'; Sequence.checkInstall(); Sequence.registerEventHandlers(); - Object.assign(Sequence, Sequence.API); - delete Sequence.API; }); \ No newline at end of file From c281906d0ded16c24698a4907e67d7baf6ea4d5e Mon Sep 17 00:00:00 2001 From: Kenan Millet Date: Sat, 27 Jun 2026 09:06:46 -0400 Subject: [PATCH 3/3] Sequence: treat msg.playerid='API' as GM for API-originated commands --- Sequence/0.2.0/Sequence.js | 2 +- Sequence/Sequence.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Sequence/0.2.0/Sequence.js b/Sequence/0.2.0/Sequence.js index 94bed8cf21..af8e099486 100644 --- a/Sequence/0.2.0/Sequence.js +++ b/Sequence/0.2.0/Sequence.js @@ -3260,7 +3260,7 @@ var Sequence = Sequence || (() => { const handleInput = (msg) => { if (msg.type !== 'api') return; if (msg.content.split(' ')[0] !== CMD_TOKEN) return; - if (!playerIsGM(msg.playerid)) { + if (!playerIsGM(msg.playerid) && msg.playerid !== 'API') { replyError(msg, 'Only the GM can use Sequence commands.'); return; } diff --git a/Sequence/Sequence.js b/Sequence/Sequence.js index 94bed8cf21..af8e099486 100644 --- a/Sequence/Sequence.js +++ b/Sequence/Sequence.js @@ -3260,7 +3260,7 @@ var Sequence = Sequence || (() => { const handleInput = (msg) => { if (msg.type !== 'api') return; if (msg.content.split(' ')[0] !== CMD_TOKEN) return; - if (!playerIsGM(msg.playerid)) { + if (!playerIsGM(msg.playerid) && msg.playerid !== 'API') { replyError(msg, 'Only the GM can use Sequence commands.'); return; }